diff --git a/CMakeLists.txt b/CMakeLists.txt index 9361c1eba..5a9b2f097 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,7 @@ function(trusted_firmware_build) ${TFM_REGRESSION_ARG} ${TFM_PROFILE_ARG} -DTFM_TEST_REPO_PATH=${ZEPHYR_TFM_MODULE_DIR}/tf-m-tests + -DMCUBOOT_PATH=${ZEPHYR_TFM_MODULE_DIR}/../tfm-mcuboot -DTFM_TOOLCHAIN_PATH=${TFM_TOOLCHAIN_PATH} -DTFM_TOOLCHAIN_PREFIX=${TFM_TOOLCHAIN_PREFIX} BUILD_ALWAYS True diff --git a/README.rst b/README.rst index de31d848e..3349fb83c 100644 --- a/README.rst +++ b/README.rst @@ -24,14 +24,10 @@ TF-M Tests: commit: ccda809801e529250b47c9ac470cf94daef1bb1b license: Apache 2.0 -mcuboot: - repo: https://github.com/JuulLabs-OSS/mcuboot.git - tag: v1.6.0 - commit: 50d24a57516f558dac72bef634723b60c5cfb46b - license: Apache 2.0 - psa-arch-tests: repo: https://github.com/ARM-software/psa-arch-tests tag: v20.03_API1.0 commit: 3d986e72d9e084bb45763849699718f474fb10ba license: Apache 2.0 + +See also west.yml for more dependencies. diff --git a/init-git.sh b/init-git.sh index 1c56a865c..abb88d7a7 100755 --- a/init-git.sh +++ b/init-git.sh @@ -2,7 +2,6 @@ TFM_GIT_SHA=TF-Mv1.2.0 TFM_TESTS_GIT_SHA=TF-Mv1.2.0 -MCUBOOT_GIT_SHA=v1.6.0 PSA_ARCH_TESTS_GIT_SHA=v20.03_API1.0 if [ ! -d trusted-firmware-m/.git ]; then @@ -13,14 +12,6 @@ if [ ! -d trusted-firmware-m/.git ]; then cd .. fi -if [ ! -d mcuboot/.git ]; then - git clone https://github.com/JuulLabs-OSS/mcuboot.git -b v1.4.0 -b ${MCUBOOT_GIT_SHA} --bare mcuboot/.git - cd mcuboot - git init - git checkout -f - cd .. -fi - if [ ! -d tf-m-tests/.git ]; then git clone https://git.trustedfirmware.org/TF-M/tf-m-tests.git -b ${TFM_TESTS_GIT_SHA} --bare tf-m-tests/.git cd tf-m-tests diff --git a/mcuboot/.gitignore b/mcuboot/.gitignore deleted file mode 100644 index 4169afcd1..000000000 --- a/mcuboot/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -outdir/ -.*.swp -target.sh -*.pyc -tags -rusty-tags.* - -# mynewt -/repos/ -/project.state -/bin/ -/targets/ -**/build/**/* - -#Eclipse project files -.cproject -.project - -# Compiled python modules. -*.pyc - -# Setuptools distribution folder. -/scripts/dist/ - -# Python egg metadata, regenerated from source files by setuptools. -/scripts/*.egg-info -/scripts/*.egg diff --git a/mcuboot/.gitmodules b/mcuboot/.gitmodules deleted file mode 100644 index 2135412c4..000000000 --- a/mcuboot/.gitmodules +++ /dev/null @@ -1,21 +0,0 @@ -[submodule "sim/mbedtls"] - path = ext/mbedtls - url = https://github.com/ARMmbed/mbedtls -[submodule "boot/cypress/libs/pdl/psoc6pdl"] - path = boot/cypress/libs/pdl/psoc6pdl - url = https://github.com/cypresssemiconductorco/psoc6pdl.git -[submodule "boot/cypress/libs/retarget-io"] - path = boot/cypress/libs/retarget-io - url = https://github.com/cypresssemiconductorco/retarget-io.git -[submodule "boot/cypress/libs/core-lib"] - path = boot/cypress/libs/core-lib - url = https://github.com/cypresssemiconductorco/core-lib.git -[submodule "boot/cypress/libs/psoc6hal"] - path = boot/cypress/libs/psoc6hal - url = https://github.com/cypresssemiconductorco/psoc6hal.git -[submodule "boot/cypress/libs/cy-mbedtls-acceleration"] - path = boot/cypress/libs/cy-mbedtls-acceleration - url = https://github.com/cypresssemiconductorco/cy-mbedtls-acceleration.git -[submodule "boot/boot_serial/src/cddl_gen"] - path = ext/cddl_gen - url = https://github.com/oyvindronningstad/cddl_gen.git diff --git a/mcuboot/.travis.yml b/mcuboot/.travis.yml deleted file mode 100644 index 41812da52..000000000 --- a/mcuboot/.travis.yml +++ /dev/null @@ -1,76 +0,0 @@ -# Travis configuration. Build the simulator and run its tests. - -addons: - apt: - packages: - - "python3-pip" - -language: rust - -cache: - directories: - - $HOME/TOOLCHAIN - - cargo - -matrix: - include: - # Runs each value defined in $SINGLE_FEATURES by itself in the order - # the were defined. - - os: linux - env: SINGLE_FEATURES="sig-ecdsa sig-ed25519 enc-kw bootstrap" TEST=sim - - os: linux - env: SINGLE_FEATURES="none sig-rsa sig-rsa3072 overwrite-only validate-primary-slot swap-move" TEST=sim - - os: linux - env: SINGLE_FEATURES="enc-rsa enc-ec256 enc-x25519" TEST=sim - - # Values defined in $MULTI_FEATURES consist of any number of features - # to be enabled at the same time. The list of multi-values should be - # separated by ',' and each list of values is run sequentially in the - # defined order. - - os: linux - env: MULTI_FEATURES="sig-rsa overwrite-only large-write,sig-ecdsa overwrite-only large-write,multiimage overwrite-only large-write" TEST=sim - - os: linux - env: MULTI_FEATURES="sig-rsa validate-primary-slot,sig-ecdsa validate-primary-slot,sig-rsa multiimage validate-primary-slot" TEST=sim - - os: linux - env: MULTI_FEATURES="enc-kw overwrite-only large-write,enc-rsa overwrite-only large-write" TEST=sim - - os: linux - env: MULTI_FEATURES="sig-rsa enc-rsa validate-primary-slot,swap-move enc-rsa sig-rsa validate-primary-slot" TEST=sim - - os: linux - env: MULTI_FEATURES="sig-rsa enc-kw validate-primary-slot bootstrap,sig-ed25519 enc-x25519 validate-primary-slot" TEST=sim - - os: linux - env: MULTI_FEATURES="sig-ecdsa enc-kw validate-primary-slot" TEST=sim - - os: linux - env: MULTI_FEATURES="sig-rsa validate-primary-slot overwrite-only large-write,sig-ecdsa enc-ec256 validate-primary-slot" TEST=sim - - os: linux - env: MULTI_FEATURES="sig-rsa validate-primary-slot overwrite-only downgrade-prevention" TEST=sim - - - os: linux - language: go - env: TEST=mynewt - go: - - "1.12" - - - os: linux - language: python - env: TEST=imgtool - -before_install: - - | - if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then - ./ci/check-signed-off-by.sh - if [ $? -ne 0 ]; then - exit 1 - fi - fi - -install: - - ./ci/${TEST}_install.sh - -script: - - ./ci/${TEST}_run.sh - -notifications: - slack: - rooms: - - secure: "Tg9ZvJfb6e4QSEsxUvwW2MIqbuNRxD4nAOkgs8eopj/fRtqN6Zk06NVSeMmYcZunDFJXUSzYANBsF98OtaaUlm4WVt2T0ZFBJZrOYfIv18/zXCjYa04sDxur57F1ZYTYKyRpdUkfzPd/rGE4jKLQNcia+r/BTQbJkcZbXeg5/6cUeMP1so8/o0oMhSQP+GH0fLbyLzx3VPE8zu6+j2fCFC7R3idxtfO9VtsKlubfi3HgPgXTs+DEAAA8aoOku2esjFSFXTtdUFGz90YzyShZvtMcRg3Grp9+PZAsJwWk4eKSonKCO0DScfPUlMZbJcV7VsmyTxYKLLsGRZae6ZBH+XLfx5XeqgtgCor3FYx2dUXYfV9y8VvERDdossB0gZ/V2OUGePctDefiORytV6dMa7X3AfSdosgs/tjG4kbf+PMaVULzwF6dd3CdsxdClSl68UQPWA6wC2TEyo1EQea8jgZU6heLustZaQZhBkFkr/6j75XeGBjPw2fgVRkgg/OnTOYmo7N8181wOU+xORIEO1BtYmgRpc0cgpm4H9457diSHG1D2SoNy4tiQPCW2enN00QNGK5pZSL/FGA/ReUcALgAW0QcOljjU2bUSGPxo/VAi5ZyljWgVAGQ5qHJ4jgdfPf7VJUzCVH64G1S5+0gZPpO6vvvPdZtqeXrfBZMOBw=" - on_success: always diff --git a/mcuboot/LICENSE b/mcuboot/LICENSE deleted file mode 100644 index d89a331b6..000000000 --- a/mcuboot/LICENSE +++ /dev/null @@ -1,206 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - 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 product bundles tinycrypt, which is available under the "3-clause BSD" -license. For details, and bundled files see: - * ext/tinycrypt/LICENSE - * ext/tinycrypt diff --git a/mcuboot/NOTICE b/mcuboot/NOTICE deleted file mode 100644 index 0b3435b61..000000000 --- a/mcuboot/NOTICE +++ /dev/null @@ -1,11 +0,0 @@ -Apache Mynewt -Copyright 2015-2017 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - -Portions of this software were developed at -Runtime Inc, copyright 2015. - -Portions of this software were developed at -Arm Limited, copyright 2019-2020. diff --git a/mcuboot/README.md b/mcuboot/README.md deleted file mode 100644 index af977dd60..000000000 --- a/mcuboot/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# [mcuboot](http://mcuboot.com/) - -[![Coverity Scan Build Status](https://scan.coverity.com/projects/12307/badge.svg)][coverity] -[![Build/Test](https://img.shields.io/travis/JuulLabs-OSS/mcuboot/master.svg?label=travis-ci)][travis] - -[coverity]: https://scan.coverity.com/projects/mcuboot -[travis]: https://travis-ci.org/JuulLabs-OSS/mcuboot - -This is mcuboot version 1.6.0 - -MCUboot is a secure bootloader for 32-bit MCUs. The goal of MCUboot is to -define a common infrastructure for the bootloader, system flash layout on -microcontroller systems, and to provide a secure bootloader that enables -simple software upgrades. - -MCUboot is operating system and hardware independent and relies on -hardware porting layers from the operating. Currently, mcuboot works -with both the Apache Mynewt and Zephyr operating systems, but more -ports are planned in the future. RIOT is currently supported as a boot -target with a complete port planned. - -## Using MCUboot - -Instructions for different operating systems can be found here: -- [Zephyr](docs/readme-zephyr.md) -- [Mynewt](docs/readme-mynewt.md) -- [RIOT](docs/readme-riot.md) -- [Simulator](sim/README.rst) - -## Roadmap - -The issues being planned and worked on are tracked using GitHub issues. To -participate please visit: - -[MCUBoot GitHub Issues](https://github.com/JuulLabs-OSS/mcuboot/issues) - -~~Issues were previously tracked on [MCUboot JIRA](https://runtimeco.atlassian.net/projects/MCUB/summary) -, but it is now deprecated.~~ - -## Browsing - -Information and documentation on the bootloader are stored within the source. - -~~It was previously also documented on confluence: -[MCUBoot Confluence](https://runtimeco.atlassian.net/wiki/discover/all-updates) -however, it is now deprecated and not currently maintained~~ - -For more information in the source, here are some pointers: - -- [boot/bootutil](boot/bootutil): The core of the bootloader itself. -- [boot/boot\_serial](boot/boot_serial): Support for serial upgrade within the bootloader itself. -- [boot/zephyr](boot/zephyr): Port of the bootloader to Zephyr -- [boot/mynewt](boot/mynewt): Mynewt bootloader app -- [imgtool](scripts/imgtool.py): A tool to securely sign firmware images for booting by mcuboot. -- [sim](sim): A bootloader simulator for testing and regression - -## Joining - -Developers welcome! - -* Our developer mailing list: - https://groups.io/g/mcuboot -* Our Slack channel: https://mcuboot.slack.com/
- Get your invite [here!](https://join.slack.com/t/mcuboot/shared_invite/MjE2NDcwMTQ2MTYyLTE1MDA4MTIzNTAtYzgyZTU0NjFkMg) -* Our IRC channel: http://irc.freenode.net, #mcuboot diff --git a/mcuboot/boot/boot_serial/include/boot_serial/boot_serial.h b/mcuboot/boot/boot_serial/include/boot_serial/boot_serial.h deleted file mode 100644 index 3393213a6..000000000 --- a/mcuboot/boot/boot_serial/include/boot_serial/boot_serial.h +++ /dev/null @@ -1,50 +0,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 __BOOT_SERIAL_H__ -#define __BOOT_SERIAL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Function pointers to read/write data from uart. - * read returns the number of bytes read, str points to buffer to fill, - * cnt is the number of bytes to fill within buffer, *newline will be - * set if newline is the last character. - * write takes as it's arguments pointer to data to write, and the count - * of bytes. - */ -struct boot_uart_funcs { - int (*read)(char *str, int cnt, int *newline); - void (*write)(const char *ptr, int cnt); -}; - -/** - * Start processing newtmgr commands for uploading image0 over serial. - * Assumes serial port is open and waits for download command. - */ -void boot_serial_start(const struct boot_uart_funcs *f); - -#ifdef __cplusplus -} -#endif - -#endif /* __BOOT_SERIAL_H__ */ diff --git a/mcuboot/boot/boot_serial/pkg.yml b/mcuboot/boot/boot_serial/pkg.yml deleted file mode 100644 index f1431c70a..000000000 --- a/mcuboot/boot/boot_serial/pkg.yml +++ /dev/null @@ -1,38 +0,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. -# - -pkg.name: boot/boot_serial -pkg.description: The boot_serial library is used when downloading image over serial port. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - boot - - bootloader - -pkg.deps: - - "@apache-mynewt-core/hw/hal" - - "@apache-mynewt-core/kernel/os" - - "@apache-mynewt-core/encoding/tinycbor" - - "@apache-mynewt-core/encoding/base64" - - "@mcuboot/boot/mynewt/flash_map_backend" - - "@mcuboot/boot/mynewt/boot_uart" - - "@apache-mynewt-core/util/crc" - -pkg.req_apis: - - bootloader diff --git a/mcuboot/boot/boot_serial/src/boot_serial.c b/mcuboot/boot/boot_serial/src/boot_serial.c deleted file mode 100644 index 3fded8677..000000000 --- a/mcuboot/boot/boot_serial/src/boot_serial.c +++ /dev/null @@ -1,624 +0,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. - */ -#include -#include -#include -#include -#include - -#include "sysflash/sysflash.h" - -#include "bootutil/bootutil_log.h" - -#ifdef __ZEPHYR__ -#include -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#include -#include -#include -#endif /* __ZEPHYR__ */ - -#include -#include -#include -#include - -#include - -#include "boot_serial/boot_serial.h" -#include "boot_serial_priv.h" - -#ifdef CONFIG_BOOT_ERASE_PROGRESSIVELY -#include "bootutil_priv.h" -#endif - -#include "serial_recovery_cbor.h" - -MCUBOOT_LOG_MODULE_DECLARE(mcuboot); - -#define BOOT_SERIAL_INPUT_MAX 512 -#define BOOT_SERIAL_OUT_MAX 128 - -#ifdef __ZEPHYR__ -/* base64 lib encodes data to null-terminated string */ -#define BASE64_ENCODE_SIZE(in_size) ((((((in_size) - 1) / 3) * 4) + 4) + 1) - -#define CRC16_INITIAL_CRC 0 /* what to seed crc16 with */ -#define CRC_CITT_POLYMINAL 0x1021 - -#define ntohs(x) sys_be16_to_cpu(x) -#define htons(x) sys_cpu_to_be16(x) -#endif - -#ifndef BOOT_IMAGE_NUMBER -#define BOOT_IMAGE_NUMBER MCUBOOT_IMAGE_NUMBER -#endif - -#if (BOOT_IMAGE_NUMBER > 1) -#define IMAGES_ITER(x) for ((x) = 0; (x) < BOOT_IMAGE_NUMBER; ++(x)) -#else -#define IMAGES_ITER(x) -#endif - -static char in_buf[BOOT_SERIAL_INPUT_MAX + 1]; -static char dec_buf[BOOT_SERIAL_INPUT_MAX + 1]; -const struct boot_uart_funcs *boot_uf; -static uint32_t curr_off; -static uint32_t img_size; -static struct nmgr_hdr *bs_hdr; - -static char bs_obuf[BOOT_SERIAL_OUT_MAX]; - -static int bs_cbor_writer(struct cbor_encoder_writer *, const char *data, - int len); -static void boot_serial_output(void); - -static struct cbor_encoder_writer bs_writer = { - .write = bs_cbor_writer -}; -static CborEncoder bs_root; -static CborEncoder bs_rsp; - -int -bs_cbor_writer(struct cbor_encoder_writer *cew, const char *data, int len) -{ - if (cew->bytes_written + len > sizeof(bs_obuf)) { - return CborErrorOutOfMemory; - } - - memcpy(&bs_obuf[cew->bytes_written], data, len); - cew->bytes_written += len; - - return 0; -} - -/* - * Convert version into string without use of snprintf(). - */ -static int -u32toa(char *tgt, uint32_t val) -{ - char *dst; - uint32_t d = 1; - uint32_t dgt; - int n = 0; - - dst = tgt; - while (val / d >= 10) { - d *= 10; - } - while (d) { - dgt = val / d; - val %= d; - d /= 10; - if (n || dgt > 0 || d == 0) { - *dst++ = dgt + '0'; - ++n; - } - } - *dst = '\0'; - - return dst - tgt; -} - -/* - * dst has to be able to fit "255.255.65535.4294967295" (25 characters). - */ -static void -bs_list_img_ver(char *dst, int maxlen, struct image_version *ver) -{ - int off; - - off = u32toa(dst, ver->iv_major); - dst[off++] = '.'; - off += u32toa(dst + off, ver->iv_minor); - dst[off++] = '.'; - off += u32toa(dst + off, ver->iv_revision); - dst[off++] = '.'; - off += u32toa(dst + off, ver->iv_build_num); -} - -/* - * List images. - */ -static void -bs_list(char *buf, int len) -{ - CborEncoder images; - CborEncoder image; - struct image_header hdr; - uint8_t tmpbuf[64]; - int slot, area_id; - const struct flash_area *fap; - uint8_t image_index; - - cbor_encoder_create_map(&bs_root, &bs_rsp, CborIndefiniteLength); - cbor_encode_text_stringz(&bs_rsp, "images"); - cbor_encoder_create_array(&bs_rsp, &images, CborIndefiniteLength); - image_index = 0; - IMAGES_ITER(image_index) { - for (slot = 0; slot < 2; slot++) { - area_id = flash_area_id_from_multi_image_slot(image_index, slot); - if (flash_area_open(area_id, &fap)) { - continue; - } - - flash_area_read(fap, 0, &hdr, sizeof(hdr)); - - if (hdr.ih_magic != IMAGE_MAGIC || - bootutil_img_validate(NULL, 0, &hdr, fap, tmpbuf, sizeof(tmpbuf), - NULL, 0, NULL)) { - flash_area_close(fap); - continue; - } - flash_area_close(fap); - - cbor_encoder_create_map(&images, &image, CborIndefiniteLength); - -#if (BOOT_IMAGE_NUMBER > 1) - cbor_encode_text_stringz(&image, "image"); - cbor_encode_int(&image, image_index); -#endif - - cbor_encode_text_stringz(&image, "slot"); - cbor_encode_int(&image, slot); - cbor_encode_text_stringz(&image, "version"); - - bs_list_img_ver((char *)tmpbuf, sizeof(tmpbuf), &hdr.ih_ver); - cbor_encode_text_stringz(&image, (char *)tmpbuf); - cbor_encoder_close_container(&images, &image); - } - } - cbor_encoder_close_container(&bs_rsp, &images); - cbor_encoder_close_container(&bs_root, &bs_rsp); - boot_serial_output(); -} - -/* - * Image upload request. - */ -static void -bs_upload(char *buf, int len) -{ - const uint8_t *img_data = NULL; - long long int off = UINT_MAX; - size_t img_blen = 0; - uint8_t rem_bytes; - long long int data_len = UINT_MAX; - int img_num; - size_t slen; - const struct flash_area *fap = NULL; - int rc; -#ifdef CONFIG_BOOT_ERASE_PROGRESSIVELY - static off_t off_last = -1; - struct flash_sector sector; -#endif - - img_num = 0; - - /* - * Expected data format. - * { - * "image": - * "data": - * "len": - * "off": - * } - */ - - Upload_t upload; - if (!cbor_decode_Upload((const uint8_t *)buf, len, &upload)) { - goto out_invalid_data; - } - - for (int i = 0; i < upload._Upload_members_count; i++) { - _Member_t *member = &upload._Upload_members[i]; - switch(member->_Member_choice) { - case _Member_image: - img_num = member->_Member_image; - break; - case _Member_data: - img_data = member->_Member_data.value; - slen = member->_Member_data.len; - img_blen = slen; - break; - case _Member_len: - data_len = member->_Member_len; - break; - case _Member_off: - off = member->_Member_off; - break; - case _Member_sha: - default: - /* Nothing to do. */ - break; - } - } - - if (off == UINT_MAX || img_data == NULL) { - /* - * Offset must be set in every block. - */ - goto out_invalid_data; - } - - rc = flash_area_open(flash_area_id_from_multi_image_slot(img_num, 0), &fap); - if (rc) { - rc = MGMT_ERR_EINVAL; - goto out; - } - - if (off == 0) { - curr_off = 0; - if (data_len > fap->fa_size) { - goto out_invalid_data; - } -#ifndef CONFIG_BOOT_ERASE_PROGRESSIVELY - rc = flash_area_erase(fap, 0, fap->fa_size); - if (rc) { - goto out_invalid_data; - } -#endif - img_size = data_len; - } - if (off != curr_off) { - rc = 0; - goto out; - } - if (curr_off + img_blen < img_size) { - rem_bytes = img_blen % flash_area_align(fap); - if (rem_bytes) { - img_blen -= rem_bytes; - } - } - -#ifdef CONFIG_BOOT_ERASE_PROGRESSIVELY - rc = flash_area_sector_from_off(curr_off + img_blen, §or); - if (rc) { - BOOT_LOG_ERR("Unable to determine flash sector size"); - goto out; - } - if (off_last != sector.fs_off) { - off_last = sector.fs_off; - BOOT_LOG_INF("Erasing sector at offset 0x%x", sector.fs_off); - rc = flash_area_erase(fap, sector.fs_off, sector.fs_size); - if (rc) { - BOOT_LOG_ERR("Error %d while erasing sector", rc); - goto out; - } - } -#endif - - BOOT_LOG_INF("Writing at 0x%x until 0x%x", curr_off, curr_off + img_blen); - rc = flash_area_write(fap, curr_off, img_data, img_blen); - if (rc == 0) { - curr_off += img_blen; -#ifdef CONFIG_BOOT_ERASE_PROGRESSIVELY - if (curr_off == img_size) { - /* get the last sector offset */ - rc = flash_area_sector_from_off(boot_status_off(fap), §or); - if (rc) { - BOOT_LOG_ERR("Unable to determine flash sector of" - "the image trailer"); - goto out; - } - /* Assure that sector for image trailer was erased. */ - /* Check whether it was erased during previous upload. */ - if (off_last < sector.fs_off) { - BOOT_LOG_INF("Erasing sector at offset 0x%x", sector.fs_off); - rc = flash_area_erase(fap, sector.fs_off, sector.fs_size); - if (rc) { - BOOT_LOG_ERR("Error %d while erasing sector", rc); - goto out; - } - } - } -#endif - } else { - out_invalid_data: - rc = MGMT_ERR_EINVAL; - } - -out: - BOOT_LOG_INF("RX: 0x%x", rc); - cbor_encoder_create_map(&bs_root, &bs_rsp, CborIndefiniteLength); - cbor_encode_text_stringz(&bs_rsp, "rc"); - cbor_encode_int(&bs_rsp, rc); - if (rc == 0) { - cbor_encode_text_stringz(&bs_rsp, "off"); - cbor_encode_uint(&bs_rsp, curr_off); - } - cbor_encoder_close_container(&bs_root, &bs_rsp); - - boot_serial_output(); - flash_area_close(fap); -} - -/* - * Console echo control/image erase. Send empty response, don't do anything. - */ -static void -bs_empty_rsp(char *buf, int len) -{ - cbor_encoder_create_map(&bs_root, &bs_rsp, CborIndefiniteLength); - cbor_encode_text_stringz(&bs_rsp, "rc"); - cbor_encode_int(&bs_rsp, 0); - cbor_encoder_close_container(&bs_root, &bs_rsp); - boot_serial_output(); -} - -/* - * Reset, and (presumably) boot to newly uploaded image. Flush console - * before restarting. - */ -static void -bs_reset(char *buf, int len) -{ - bs_empty_rsp(buf, len); - -#ifdef __ZEPHYR__ - k_sleep(K_MSEC(250)); - sys_reboot(SYS_REBOOT_COLD); -#else - os_cputime_delay_usecs(250000); - hal_system_reset(); -#endif -} - -/* - * Parse incoming line of input from console. - * Expect newtmgr protocol with serial transport. - */ -void -boot_serial_input(char *buf, int len) -{ - struct nmgr_hdr *hdr; - - hdr = (struct nmgr_hdr *)buf; - if (len < sizeof(*hdr) || - (hdr->nh_op != NMGR_OP_READ && hdr->nh_op != NMGR_OP_WRITE) || - (ntohs(hdr->nh_len) < len - sizeof(*hdr))) { - return; - } - bs_hdr = hdr; - hdr->nh_group = ntohs(hdr->nh_group); - - buf += sizeof(*hdr); - len -= sizeof(*hdr); - - bs_writer.bytes_written = 0; - cbor_encoder_init(&bs_root, &bs_writer, 0); - - /* - * Limited support for commands. - */ - if (hdr->nh_group == MGMT_GROUP_ID_IMAGE) { - switch (hdr->nh_id) { - case IMGMGR_NMGR_ID_STATE: - bs_list(buf, len); - break; - case IMGMGR_NMGR_ID_UPLOAD: - bs_upload(buf, len); - break; - default: - bs_empty_rsp(buf, len); - break; - } - } else if (hdr->nh_group == MGMT_GROUP_ID_DEFAULT) { - switch (hdr->nh_id) { - case NMGR_ID_CONS_ECHO_CTRL: - bs_empty_rsp(buf, len); - break; - case NMGR_ID_RESET: - bs_reset(buf, len); - break; - default: - break; - } - } -} - -static void -boot_serial_output(void) -{ - char *data; - int len; - uint16_t crc; - uint16_t totlen; - char pkt_start[2] = { SHELL_NLIP_PKT_START1, SHELL_NLIP_PKT_START2 }; - char buf[BOOT_SERIAL_OUT_MAX]; - char encoded_buf[BASE64_ENCODE_SIZE(BOOT_SERIAL_OUT_MAX)]; - - data = bs_obuf; - len = bs_writer.bytes_written; - - bs_hdr->nh_op++; - bs_hdr->nh_flags = 0; - bs_hdr->nh_len = htons(len); - bs_hdr->nh_group = htons(bs_hdr->nh_group); - -#ifdef __ZEPHYR__ - crc = crc16((u8_t *)bs_hdr, sizeof(*bs_hdr), CRC_CITT_POLYMINAL, - CRC16_INITIAL_CRC, false); - crc = crc16(data, len, CRC_CITT_POLYMINAL, crc, true); -#else - crc = crc16_ccitt(CRC16_INITIAL_CRC, bs_hdr, sizeof(*bs_hdr)); - crc = crc16_ccitt(crc, data, len); -#endif - crc = htons(crc); - - boot_uf->write(pkt_start, sizeof(pkt_start)); - - totlen = len + sizeof(*bs_hdr) + sizeof(crc); - totlen = htons(totlen); - - memcpy(buf, &totlen, sizeof(totlen)); - totlen = sizeof(totlen); - memcpy(&buf[totlen], bs_hdr, sizeof(*bs_hdr)); - totlen += sizeof(*bs_hdr); - memcpy(&buf[totlen], data, len); - totlen += len; - memcpy(&buf[totlen], &crc, sizeof(crc)); - totlen += sizeof(crc); -#ifdef __ZEPHYR__ - size_t enc_len; - base64_encode(encoded_buf, sizeof(encoded_buf), &enc_len, buf, totlen); - totlen = enc_len; -#else - totlen = base64_encode(buf, totlen, encoded_buf, 1); -#endif - boot_uf->write(encoded_buf, totlen); - boot_uf->write("\n\r", 2); - BOOT_LOG_INF("TX"); -} - -/* - * Returns 1 if full packet has been received. - */ -static int -boot_serial_in_dec(char *in, int inlen, char *out, int *out_off, int maxout) -{ - int rc; - uint16_t crc; - uint16_t len; - -#ifdef __ZEPHYR__ - int err; - err = base64_decode( &out[*out_off], maxout - *out_off, &rc, in, inlen - 2); - if (err) { - return -1; - } -#else - if (*out_off + base64_decode_len(in) >= maxout) { - return -1; - } - rc = base64_decode(in, &out[*out_off]); - if (rc < 0) { - return -1; - } -#endif - - *out_off += rc; - if (*out_off <= sizeof(uint16_t)) { - return 0; - } - - len = ntohs(*(uint16_t *)out); - if (len != *out_off - sizeof(uint16_t)) { - return 0; - } - - if (len > *out_off - sizeof(uint16_t)) { - len = *out_off - sizeof(uint16_t); - } - - out += sizeof(uint16_t); -#ifdef __ZEPHYR__ - crc = crc16(out, len, CRC_CITT_POLYMINAL, CRC16_INITIAL_CRC, true); -#else - crc = crc16_ccitt(CRC16_INITIAL_CRC, out, len); -#endif - if (crc || len <= sizeof(crc)) { - return 0; - } - *out_off -= sizeof(crc); - out[*out_off] = '\0'; - - return 1; -} - -/* - * Task which waits reading console, expecting to get image over - * serial port. - */ -void -boot_serial_start(const struct boot_uart_funcs *f) -{ - int rc; - int off; - int dec_off = 0; - int full_line; - int max_input; - - boot_uf = f; - max_input = sizeof(in_buf); - - off = 0; - while (1) { - rc = f->read(in_buf + off, sizeof(in_buf) - off, &full_line); - if (rc <= 0 && !full_line) { - continue; - } - off += rc; - if (!full_line) { - if (off == max_input) { - /* - * Full line, no newline yet. Reset the input buffer. - */ - off = 0; - } - continue; - } - if (in_buf[0] == SHELL_NLIP_PKT_START1 && - in_buf[1] == SHELL_NLIP_PKT_START2) { - dec_off = 0; - rc = boot_serial_in_dec(&in_buf[2], off - 2, dec_buf, &dec_off, max_input); - } else if (in_buf[0] == SHELL_NLIP_DATA_START1 && - in_buf[1] == SHELL_NLIP_DATA_START2) { - rc = boot_serial_in_dec(&in_buf[2], off - 2, dec_buf, &dec_off, max_input); - } - - /* serve errors: out of decode memory, or bad encoding */ - if (rc == 1) { - boot_serial_input(&dec_buf[2], dec_off - 2); - } - off = 0; - } -} diff --git a/mcuboot/boot/boot_serial/src/boot_serial_priv.h b/mcuboot/boot/boot_serial/src/boot_serial_priv.h deleted file mode 100644 index 9275f3f57..000000000 --- a/mcuboot/boot/boot_serial/src/boot_serial_priv.h +++ /dev/null @@ -1,72 +0,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 __BOOTUTIL_SERIAL_PRIV_H__ -#define __BOOTUTIL_SERIAL_PRIV_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * From shell.h - */ -#define SHELL_NLIP_PKT_START1 6 -#define SHELL_NLIP_PKT_START2 9 - -#define SHELL_NLIP_DATA_START1 4 -#define SHELL_NLIP_DATA_START2 20 - -/* - * From newtmgr.h - */ -#define MGMT_ERR_EINVAL 3 - -#define NMGR_OP_READ 0 -#define NMGR_OP_WRITE 2 - -#define MGMT_GROUP_ID_DEFAULT 0 -#define MGMT_GROUP_ID_IMAGE 1 - -#define NMGR_ID_CONS_ECHO_CTRL 1 -#define NMGR_ID_RESET 5 - -struct nmgr_hdr { - uint8_t nh_op; /* NMGR_OP_XXX */ - uint8_t nh_flags; - uint16_t nh_len; /* length of the payload */ - uint16_t nh_group; /* NMGR_GROUP_XXX */ - uint8_t nh_seq; /* sequence number */ - uint8_t nh_id; /* message ID within group */ -}; - -/* - * From imgmgr.h - */ -#define IMGMGR_NMGR_ID_STATE 0 -#define IMGMGR_NMGR_ID_UPLOAD 1 - -void boot_serial_input(char *buf, int len); -extern const struct boot_uart_funcs *boot_uf; - -#ifdef __cplusplus -} -#endif - -#endif /* __BOOTUTIL_SERIAL_PRIV_H__ */ diff --git a/mcuboot/boot/boot_serial/src/cbor_decode.c b/mcuboot/boot/boot_serial/src/cbor_decode.c deleted file mode 100644 index 9d27bbb5f..000000000 --- a/mcuboot/boot/boot_serial/src/cbor_decode.c +++ /dev/null @@ -1,417 +0,0 @@ -/* - * This file has been copied from the cddl_gen submodule. - * Commit 9d911cf0c7c9f13b5a9fdd5ed6c1012df21e5576 - */ - -/* - * Copyright (c) 2020 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include -#include -#include -#include "cbor_decode.h" - -/** Enumeration representing the major types available in CBOR. - * - * The major type is represented in the 3 first bits of the header byte. - */ -typedef enum -{ - CBOR_MAJOR_TYPE_PINT = 0, ///! Positive Integer - CBOR_MAJOR_TYPE_NINT = 1, ///! Negative Integer - CBOR_MAJOR_TYPE_BSTR = 2, ///! Byte String - CBOR_MAJOR_TYPE_TSTR = 3, ///! Text String - CBOR_MAJOR_TYPE_LIST = 4, ///! List - CBOR_MAJOR_TYPE_MAP = 5, ///! Map - CBOR_MAJOR_TYPE_TAG = 6, ///! Semantic Tag - CBOR_MAJOR_TYPE_PRIM = 7, ///! Primitive Type -} cbor_major_type_t; - -/** Return value length from additional value. - */ -static uint32_t additional_len(uint8_t additional) -{ - if (24 <= additional && additional <= 27) { - /* 24 => 1 - * 25 => 2 - * 26 => 4 - * 27 => 8 - */ - return 1 << (additional - 24); - } - return 0; -} - -/** Extract the major type, i.e. the first 3 bits of the header byte. */ -#define MAJOR_TYPE(header_byte) (((header_byte) >> 5) & 0x7) - -/** Extract the additional info, i.e. the last 5 bits of the header byte. */ -#define ADDITIONAL(header_byte) ((header_byte) & 0x1F) - -/** Shorthand macro to check if a result is within min/max constraints. - */ -#define PTR_VALUE_IN_RANGE(type, p_res, p_min, p_max) \ - (((p_min == NULL) || (*(type *)p_res >= *(type *)p_min)) \ - && ((p_max == NULL) || (*(type *)p_res <= *(type *)p_max))) - -#define FAIL() \ -do {\ - cbor_decode_trace(); \ - return false; \ -} while(0) - -#define FAIL_AND_DECR_IF(expr) \ -do {\ - if (expr) { \ - (p_state->p_payload)--; \ - FAIL(); \ - } \ -} while(0) - -#define VALUE_IN_HEADER 23 /**! For values below this, the value is encoded - directly in the header. */ - -#define BOOL_TO_PRIM 20 ///! In CBOR, false/true have the values 20/21 - -/** Get a single value. - * - * @details @p pp_payload must point to the header byte. This function will - * retrieve the value (either from within the additional info, or from - * the subsequent bytes) and return it in the result. The result can - * have arbitrary length. - * - * The function will also validate - * - Min/max constraints on the value. - * - That @p pp_payload doesn't overrun past @p p_payload_end. - * - That @p p_elem_count has not been exhausted. - * - * @p pp_payload and @p p_elem_count are updated if the function - * succeeds. If not, they are left unchanged. - * - * CBOR values are always big-endian, so this function converts from - * big to little-endian if necessary (@ref CONFIG_BIG_ENDIAN). - */ -static bool value_extract(cbor_decode_state_t * p_state, - void * const p_result, size_t result_len) -{ - cbor_decode_trace(); - cbor_decode_assert(result_len != 0, "0-length result not supported.\n"); - - FAIL_AND_DECR_IF(p_state->elem_count == 0); - FAIL_AND_DECR_IF(p_state->p_payload >= p_state->p_payload_end); - - uint8_t *p_u8_result = (uint8_t *)p_result; - uint8_t additional = ADDITIONAL(*p_state->p_payload); - - (p_state->p_payload)++; - - memset(p_result, 0, result_len); - if (additional <= VALUE_IN_HEADER) { -#ifdef CONFIG_BIG_ENDIAN - p_u8_result[result_len - 1] = additional; -#else - p_u8_result[0] = additional; -#endif /* CONFIG_BIG_ENDIAN */ - } else { - uint32_t len = additional_len(additional); - - FAIL_AND_DECR_IF(len > result_len); - FAIL_AND_DECR_IF((p_state->p_payload + len) - > p_state->p_payload_end); - -#ifdef CONFIG_BIG_ENDIAN - memcpy(&p_u8_result[result_len - len], p_state->p_payload, len); -#else - for (uint32_t i = 0; i < len; i++) { - p_u8_result[i] = (p_state->p_payload)[len - i - 1]; - } -#endif /* CONFIG_BIG_ENDIAN */ - - (p_state->p_payload) += len; - } - - (p_state->elem_count)--; - return true; -} - - -static bool int32_decode(cbor_decode_state_t * p_state, - int32_t *p_result, void *p_min_value, void *p_max_value) -{ - uint8_t major_type = MAJOR_TYPE(*p_state->p_payload); - - if (!value_extract(p_state, p_result, 4)) { - FAIL(); - } - if (*p_result < 0) { - /* Value is too large to fit in a signed integer. */ - FAIL(); - } - - if (major_type == CBOR_MAJOR_TYPE_NINT) { - // Convert from CBOR's representation. - *p_result = 1 - *p_result; - } - if (!PTR_VALUE_IN_RANGE(int32_t, p_result, p_min_value, p_max_value)) { - FAIL(); - } - cbor_decode_print("val: %d\r\n", *p_result); - return true; -} - - -bool intx32_decode(cbor_decode_state_t * p_state, - int32_t *p_result, void *p_min_value, void *p_max_value) -{ - uint8_t major_type = MAJOR_TYPE(*p_state->p_payload); - - if (major_type != CBOR_MAJOR_TYPE_PINT - && major_type != CBOR_MAJOR_TYPE_NINT) { - /* Value to be read doesn't have the right type. */ - FAIL(); - } - - if (!int32_decode(p_state, - p_result, p_min_value, - p_max_value)){ - FAIL(); - } - return true; -} - - -static bool uint32_decode(cbor_decode_state_t * p_state, - void *p_result, void *p_min_value, void *p_max_value) -{ - if (!value_extract(p_state, p_result, 4)) { - FAIL(); - } - - if (!PTR_VALUE_IN_RANGE(uint32_t, p_result, p_min_value, p_max_value)) { - FAIL(); - } - cbor_decode_print("val: %u\r\n", *(uint32_t *)p_result); - return true; -} - - -bool uintx32_decode(cbor_decode_state_t * p_state, - uint32_t *p_result, void *p_min_value, void *p_max_value) -{ - uint8_t major_type = MAJOR_TYPE(*p_state->p_payload); - - if (major_type != CBOR_MAJOR_TYPE_PINT) { - /* Value to be read doesn't have the right type. */ - FAIL(); - } - if (!uint32_decode(p_state, p_result, p_min_value, p_max_value)){ - FAIL(); - } - return true; -} - - -static bool size_decode(cbor_decode_state_t * p_state, - size_t *p_result, size_t *p_min_value, size_t *p_max_value) -{ - _Static_assert((sizeof(size_t) == sizeof(uint32_t)), - "This code needs size_t to be 4 bytes long."); - return uint32_decode(p_state, - p_result, p_min_value, p_max_value); -} - - -bool strx_start_decode(cbor_decode_state_t * p_state, - cbor_string_type_t *p_result, void *p_min_len, void *p_max_len) -{ - uint8_t major_type = MAJOR_TYPE(*p_state->p_payload); - cbor_string_type_t *p_str_result = (cbor_string_type_t *)p_result; - - if (major_type != CBOR_MAJOR_TYPE_BSTR - && major_type != CBOR_MAJOR_TYPE_TSTR) { - /* Value to be read doesn't have the right type. */ - FAIL(); - } - if (!size_decode(p_state, - &p_str_result->len, (size_t *)p_min_len, - (size_t *)p_max_len)) { - FAIL(); - } - p_str_result->value = p_state->p_payload; - return true; -} - - -bool strx_decode(cbor_decode_state_t * p_state, - cbor_string_type_t *p_result, void *p_min_len, void *p_max_len) -{ - if (!strx_start_decode(p_state, p_result, - p_min_len, p_max_len)) { - return false; - } - (p_state->p_payload) += p_result->len; - return true; -} - - -bool list_start_decode(cbor_decode_state_t * p_state, - size_t *p_result, size_t min_num, size_t max_num) -{ - uint8_t major_type = MAJOR_TYPE(*p_state->p_payload); - - *p_result = p_state->elem_count; - - if (major_type != CBOR_MAJOR_TYPE_LIST - && major_type != CBOR_MAJOR_TYPE_MAP) { - FAIL(); - } - if (!uint32_decode(p_state, - p_result, &min_num, &max_num)) { - FAIL(); - } - size_t tmp = *p_result; - *p_result = p_state->elem_count; - p_state->elem_count = major_type == CBOR_MAJOR_TYPE_MAP ? tmp * 2 : tmp; - return true; -} - - -bool primx_decode(cbor_decode_state_t * p_state, - uint8_t *p_result, void *p_min_result, void *p_max_result) -{ - uint8_t major_type = MAJOR_TYPE(*p_state->p_payload); - uint32_t val; - - if (major_type != CBOR_MAJOR_TYPE_PRIM) { - /* Value to be read doesn't have the right type. */ - FAIL(); - } - if (!uint32_decode(p_state, - &val, p_min_result, p_max_result)) { - FAIL(); - } - if (p_result != NULL) { - *p_result = val; - } - return true; -} - - -bool boolx_decode(cbor_decode_state_t * p_state, - bool *p_result, void *p_min_result, void *p_max_result) -{ - uint8_t min_result = *(uint8_t *)p_min_result + BOOL_TO_PRIM; - uint8_t max_result = *(uint8_t *)p_max_result + BOOL_TO_PRIM; - - if (!primx_decode(p_state, - (uint8_t *)p_result, &min_result, &max_result)) { - FAIL(); - } - (*p_result) -= BOOL_TO_PRIM; - return true; -} - - -bool double_decode(cbor_decode_state_t * p_state, - double *p_result, void *p_min_result, void *p_max_result) -{ - uint8_t major_type = MAJOR_TYPE(*p_state->p_payload); - - if (major_type != CBOR_MAJOR_TYPE_PRIM) { - /* Value to be read doesn't have the right type. */ - FAIL(); - } - if (!value_extract(p_state, p_result, - sizeof(*p_result))) { - FAIL(); - } - - if (!PTR_VALUE_IN_RANGE(double, p_result, p_min_result, p_max_result)) { - FAIL(); - } - return true; -} - - -bool any_decode(cbor_decode_state_t * p_state, - void *p_result, void *p_min_result, void *p_max_result) -{ - cbor_decode_assert(p_result == NULL, - "'any' type cannot be returned, only skipped.\n"); - - uint8_t major_type = MAJOR_TYPE(*p_state->p_payload); - uint32_t value; - size_t num_decode; - void *p_null_result = NULL; - size_t temp_elem_count; - - if (!value_extract(p_state, &value, sizeof(value))) { - /* Can happen because of p_elem_count (or p_payload_end) */ - FAIL(); - } - - switch (major_type) { - case CBOR_MAJOR_TYPE_BSTR: - case CBOR_MAJOR_TYPE_TSTR: - (p_state->p_payload) += value; - break; - case CBOR_MAJOR_TYPE_MAP: - value *= 2; /* Because all members have a key. */ - /* Fallthrough */ - case CBOR_MAJOR_TYPE_LIST: - temp_elem_count = p_state->elem_count; - p_state->elem_count = value; - if (!multi_decode(value, value, &num_decode, any_decode, - p_state, - &p_null_result, NULL, NULL, 0)) { - p_state->elem_count = temp_elem_count; - FAIL(); - } - p_state->elem_count = temp_elem_count; - break; - default: - /* Do nothing */ - break; - } - - return true; -} - - -bool multi_decode(size_t min_decode, - size_t max_decode, - size_t *p_num_decode, - decoder_t decoder, - cbor_decode_state_t * p_state, - void *p_result, - void *p_min_result, - void *p_max_result, - size_t result_len) -{ - for (size_t i = 0; i < max_decode; i++) { - uint8_t const *p_payload_bak = p_state->p_payload; - size_t elem_count_bak = p_state->elem_count; - - if (!decoder(p_state, - (uint8_t *)p_result + i*result_len, - p_min_result, - p_max_result)) { - *p_num_decode = i; - p_state->p_payload = p_payload_bak; - p_state->elem_count = elem_count_bak; - if (i < min_decode) { - FAIL(); - } else { - cbor_decode_print("Found %zu elements.\n", i); - } - return true; - } - } - cbor_decode_print("Found %zu elements.\n", max_decode); - *p_num_decode = max_decode; - return true; -} diff --git a/mcuboot/boot/boot_serial/src/cbor_decode.h b/mcuboot/boot/boot_serial/src/cbor_decode.h deleted file mode 100644 index cd466cd46..000000000 --- a/mcuboot/boot/boot_serial/src/cbor_decode.h +++ /dev/null @@ -1,269 +0,0 @@ -/* - * This file has been copied from the cddl_gen submodule. - * Commit 9d911cf0c7c9f13b5a9fdd5ed6c1012df21e5576 - */ - -/* - * Copyright (c) 2020 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef CDDL_CBOR_H__ -#define CDDL_CBOR_H__ -#include -#include -#include - -/** The cbor_decode library provides functions for decoding CBOR data elements. - * - * This library is primarily meant to be called from code generated by - * $CDDL_GEN_BASE/scripts/cddl_gen.py - * - * Some details to notice about this library: - * - Integers are all 32 bits (uint32_t and size_t). This means that CBOR's - * 64 bit values are not supported. This applies to integer types, as well as - * lengths for other types. - * - Strings are kept in the container type cbor_string_type_t, which is a - * pointer and a length. - * - When a function returns false, it only means that decoding that particular - * value failed. If a value is allowed to take multiple different values, - * another decoding function can be called if the first fails. All functions - * are designed to reset pp_payload and p_elem_count to their original values - * if they return false. - * - There is some type casting going on under the hood to make the code - * generator friendly. See especially the decoder_t type which is compatible - * with all functions except multi_decode, but the compiler doesn't "know" - * this because they are defined with different pointer types. It also means - * any usage of multi_decode must be made with care for function types. - * - This library has no function for semantic tags. - * - This library doesn't distinguish lists from maps. - * - * - * CBOR's format is described well on Wikipedia - * - https://en.wikipedia.org/wiki/CBOR - * but here's a synopsis: - * - * Encoded CBOR data elements look like this. - * - * | Header | Value | Payload | - * | 1 byte | 0, 1, 2, 4, or 8 bytes | 0 - 2^64-1 bytes/elements | - * | 3 bits | 5 bits | - * | Major | Additional| - * | Type | info | - * - * The available major types can be seen in @ref cbor_major_type_t. - * - * PINT, NINT, TAG, and PRIM elements have no payload, only Value. - * PINT: Interpret the Value as a positive integer. - * NINT: Interpret the Value as a positive integer, then multiply by -1 and - * subtract 1. - * TAG: The Value says something about the next non-tag element. - * See https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - * PRIM: Different Values mean different things: - * 20: "false" - * 21: "true" - * 22: "null" - * 23: "undefined" - * >256: Interpret as IEEE 754 float with given precision - * - * For BSTR, TSTR, LIST, and MAP, the Value describes the length of the payload. - * For BSTR and TSTR, the length is in bytes, for LIST, the length is in number - * of elements, and for MAP, the length is in number of key/value element pairs. - * - * For LIST and MAP, sub elements are regular CBOR elements with their own - * Header, Value and Payload. LISTs and MAPs can be recursively encoded. - * - * For all types, Values 0-23 are encoded directly in the "Additional info", - * meaning that the "Value" field is 0 bytes long. If "Additional info" is 24, - * 25, 26, or 27, the "Value" field is 1, 2, 4, or 8 bytes long, respectively. - * - * The additional info means slightly different things for different major - * types. - */ - - -/** Convenience type that allows pointing to strings directly inside the payload - * without the need to copy out. - */ -typedef struct -{ - const uint8_t *value; - size_t len; -} cbor_string_type_t; - -#ifdef CDDL_CBOR_VERBOSE -#include -#define cbor_decode_trace() (printk("p_state->p_payload: 0x%x, "\ - "*p_state->p_payload: 0x%x, p_state->elem_count: 0x%zx, %s:%d\n",\ - (uint32_t)p_state->p_payload, *p_state->p_payload, p_state->elem_count,\ - __FILE__, __LINE__)) -#define cbor_decode_assert(expr, ...) \ -do { \ - if (!(expr)) { \ - printk("ASSERTION \n \"" #expr \ - "\"\nfailed at %s:%d with message:\n ", \ - __FILE__, __LINE__); \ - printk(__VA_ARGS__);\ - return false; \ - } \ -} while(0) -#define cbor_decode_print(...) printk(__VA_ARGS__) -#else -#define cbor_decode_trace() -#define cbor_decode_assert(...) -#define cbor_decode_print(...) -#endif - -typedef struct { - uint8_t const *p_payload; - uint8_t const *p_payload_end; - size_t elem_count; -} cbor_decode_state_t; - -/** Function pointer type used with multi_decode. - * - * This type is compatible with all decoding functions here and in the generated - * code, except for multi_decode. - */ -typedef bool(decoder_t)(cbor_decode_state_t *, void *, void *, void *); - -/** Decode a PINT/NINT into a int32_t. - * - * @param[inout] pp_payload The current place in the payload. Will be - * updated if the element is correctly decoded. - * @param[in] p_payload_end The end of the payload. This will be checked - * against pp_payload before decoding. - * @param[inout] p_elem_count The current element is part of a LIST or a MAP, - * and this keeps count of how many elements are - * expected. This will be checked before decoding - * decremented if the element is correctly decoded. - * @param[out] p_result Where to place the decoded value. - * @param[in] p_min_value The minimum acceptable value. This is checked - * after decoding, and if the decoded value is - * outside the range, the decoding will fail. - * A NULL value here means there is no restriction. - * @param[in] p_max_value The maximum acceptable value. This is checked - * after decoding, and if the decoded value is - * outside the range, the decoding will fail. - * A NULL value here means there is no restriction. - * - * @retval true If the value was decoded correctly. - * @retval false If the value has the wrong type, the payload overflowed, the - * element count was exhausted, the value was not within the - * acceptable range, or the value was larger than can fit in the - * result variable. - */ -bool intx32_decode(cbor_decode_state_t * p_state, int32_t *p_result, void *p_min_value, void *p_max_value); - -/** Decode a PINT into a uint32_t. - * - * @details See @ref intx32_decode for information about parameters and return - * values. - */ -bool uintx32_decode(cbor_decode_state_t * p_state, uint32_t *p_result, void *p_min_value, void *p_max_value); - -/** Decode a BSTR or TSTR, but leave pp_payload pointing at the payload. - * - * @details See @ref intx32_decode for information about parameters and return - * values. For strings, the value refers to the length of the string. - */ -bool strx_start_decode(cbor_decode_state_t * p_state, cbor_string_type_t *p_result, void *p_min_len, void *p_max_len); - -/** Decode a BSTR or TSTR, and move pp_payload to after the payload. - * - * @details See @ref intx32_decode for information about parameters and return - * values. For strings, the value refers to the length of the string. - */ -bool strx_decode(cbor_decode_state_t * p_state, cbor_string_type_t *p_result, void *p_min_len, void *p_max_len); - -/** Decode a LIST or MAP, but leave pp_payload pointing at the payload. - * - * @details See @ref intx32_decode for information about parameters and return - * values. For lists and maps, the value refers to the number of - * elements. - */ -bool list_start_decode(cbor_decode_state_t * p_state, size_t *p_result, size_t min_num, size_t max_num); - -/** Decode a primitive value. - * - * @details See @ref intx32_decode for information about parameters and return - * values. - */ -bool primx_decode(cbor_decode_state_t * p_state, uint8_t *p_result, void *p_min_result, void *p_max_result); - -/** Decode a boolean primitive value. - * - * @details See @ref intx32_decode for information about parameters and return - * values. The result is translated internally from the primitive - * values for true/false (20/21) to 0/1. - */ -bool boolx_decode(cbor_decode_state_t * p_state, bool *p_result, void *p_min_result, void *p_max_result); - -/** Decode a float - * - * @warning This function has not been tested, and likely doesn't work. - * - * @details See @ref intx32_decode for information about parameters and return - * values. - */ -bool float_decode(cbor_decode_state_t * p_state, double *p_result, void *p_min_result, void *p_max_result); - -/** Skip a single element, regardless of type and value. - * - * @details See @ref intx32_decode for information about parameters and return - * values. @p p_result, @p p_min_result, and @p p_max_result must be - * NULL. - */ -bool any_decode(cbor_decode_state_t * p_state, void *p_result, void *p_min_result, void *p_max_result); - -/** Decode 0 or more elements with the same type and constraints. - * - * @details This must not necessarily decode all elements in a list. E.g. if - * the list contains 3 INTS between 0 and 100 followed by 0 to 2 BSTRs - * with length 8, that could be done with: - * - * @code{c} - * size_t elem_count = 5; - * uint32_t int_min = 0; - * uint32_t int_max = 100; - * size_t bstr_size = 8; - * uint32_t ints[3]; - * cbor_string_type_t bstrs[2]; - * - * list_start_decode(pp_payload, p_payload_end, &parent_elem_count, - * &elem_count, NULL, NULL); - * multi_decode(3, 3, &num_decode, uintx32_decode, pp_payload, - * p_payload_end, ints, &int_min, &int_max, 4); - * multi_decode(0, 2, &num_decode, strx_decode, pp_payload, - * p_payload_end, bstrs, &bstr_size, &bstr_size, - * sizeof(cbor_string_type_t)); - * @endcode - * - * See @ref intx32_decode for information about the undocumented - * parameters. - * - * @param[in] min_decode The minimum acceptable number of elements. - * @param[in] max_decode The maximum acceptable number of elements. - * @param[out] p_num_decode The actual number of elements. - * @param[in] decoder The decoder function to call under the hood. This - * function will be called with the provided arguments - * repeatedly until the function fails (returns false) - * or until it has been called @p max_decode times. - * p_result is moved @p result_len bytes for each call - * to @p decoder, i.e. @p p_result refers to an array - * of result variables. - * @param[out] p_result Where to place the decoded values. Must be an array - * of length at least @p max_decode. - * @param[in] result_len The length of the result variables. Must be the - * length expected by the @p decoder. - * - * @retval true If at least @p min_decode variables were correctly decoded. - * @retval false If @p decoder failed before having decoded @p min_decode - * values. - */ -bool multi_decode(size_t min_decode, size_t max_decode, size_t *p_num_decode, - decoder_t decoder, cbor_decode_state_t * p_state, void *p_result, void *p_min_result, void *p_max_result, - size_t result_len); - -#endif diff --git a/mcuboot/boot/boot_serial/src/regenerate_serial_recovery_cbor.sh b/mcuboot/boot/boot_serial/src/regenerate_serial_recovery_cbor.sh deleted file mode 100755 index 79cb6e9d6..000000000 --- a/mcuboot/boot/boot_serial/src/regenerate_serial_recovery_cbor.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -if [ "$1" == "--help" ] || [ "$1" == "" ]; then - echo "Regenerate serial_recovery_cbor.c|h if the cddl_gen submodule is updated." - echo "Usage: $0 " - echo " e.g. $0 \"2020 Nordic Semiconductor ASA\"" - exit -1 -fi - -add_copy_notice() { -echo "$(printf '/* - * This file has been %s from the cddl_gen submodule. - * Commit %s - */ - -' "$2" "$(git -C ../../../ext/cddl_gen rev-parse HEAD)"; cat $1;)" > $1 -} - -echo "Copying cbor_decode.c|h" -copy_with_copy_notice() { - cp $1 $2 - add_copy_notice $2 "copied" -} - -copy_with_copy_notice ../../../ext/cddl_gen/src/cbor_decode.c cbor_decode.c -copy_with_copy_notice ../../../ext/cddl_gen/include/cbor_decode.h cbor_decode.h cbor_decode.h - -echo "Generating serial_recovery_cbor.c|h" -python3 ../../../ext/cddl_gen/scripts/cddl_gen.py -i serial_recovery.cddl -t Upload --oc serial_recovery_cbor.c --oh serial_recovery_cbor.h --time-header - -add_copyright() { -echo "$(printf '/* - * Copyright (c) %s - * - * SPDX-License-Identifier: Apache-2.0 - */ - -' "$2"; cat $1;)" > $1 -} - -add_copyright serial_recovery_cbor.c "$1" -add_copyright serial_recovery_cbor.h "$1" -add_copy_notice serial_recovery_cbor.c "generated" -add_copy_notice serial_recovery_cbor.h "generated" diff --git a/mcuboot/boot/boot_serial/src/serial_recovery.cddl b/mcuboot/boot/boot_serial/src/serial_recovery.cddl deleted file mode 100644 index d45db0850..000000000 --- a/mcuboot/boot/boot_serial/src/serial_recovery.cddl +++ /dev/null @@ -1,15 +0,0 @@ -; -; Copyright (c) 2020 Nordic Semiconductor ASA -; -; SPDX-License-Identifier: Apache-2.0 -; - -Member = ("image" => int) / - ("data" => bstr) / - ("len" => int) / - ("off" => int) / - ("sha" => bstr) - -Upload = { - 1**5members: Member -} diff --git a/mcuboot/boot/boot_serial/src/serial_recovery_cbor.c b/mcuboot/boot/boot_serial/src/serial_recovery_cbor.c deleted file mode 100644 index 45634ef3e..000000000 --- a/mcuboot/boot/boot_serial/src/serial_recovery_cbor.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * This file has been generated from the cddl_gen submodule. - * Commit 9d911cf0c7c9f13b5a9fdd5ed6c1012df21e5576 - */ - -/* - * Copyright (c) 2020 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/* Generated with cddl_gen.py (https://github.com/oyvindronningstad/cddl_gen) - * at: 2020-05-13 12:19:04 - */ - -#include -#include -#include -#include -#include "cbor_decode.h" -#include "serial_recovery_cbor.h" - - -static bool decode_Member( - cbor_decode_state_t *p_state, void * p_result, void * p_min_value, - void * p_max_value) -{ - cbor_decode_print("decode_Member\n"); - uint8_t const * p_payload_bak; - size_t elem_count_bak; - _Member_t* p_type_result = (_Member_t*)p_result; - - bool result = (((p_payload_bak = p_state->p_payload) && ((elem_count_bak = p_state->elem_count) || 1) && ((((strx_decode(p_state, &((*p_type_result)._Member_image_key), NULL, NULL))&& !memcmp("image", (*p_type_result)._Member_image_key.value, (*p_type_result)._Member_image_key.len) - && (intx32_decode(p_state, &((*p_type_result)._Member_image), NULL, NULL))) && (((*p_type_result)._Member_choice = _Member_image) || 1)) - || ((p_state->p_payload = p_payload_bak) && ((p_state->elem_count = elem_count_bak) || 1) && (((strx_decode(p_state, &((*p_type_result)._Member_data_key), NULL, NULL))&& !memcmp("data", (*p_type_result)._Member_data_key.value, (*p_type_result)._Member_data_key.len) - && (strx_decode(p_state, &((*p_type_result)._Member_data), NULL, NULL))) && (((*p_type_result)._Member_choice = _Member_data) || 1))) - || ((p_state->p_payload = p_payload_bak) && ((p_state->elem_count = elem_count_bak) || 1) && (((strx_decode(p_state, &((*p_type_result)._Member_len_key), NULL, NULL))&& !memcmp("len", (*p_type_result)._Member_len_key.value, (*p_type_result)._Member_len_key.len) - && (intx32_decode(p_state, &((*p_type_result)._Member_len), NULL, NULL))) && (((*p_type_result)._Member_choice = _Member_len) || 1))) - || ((p_state->p_payload = p_payload_bak) && ((p_state->elem_count = elem_count_bak) || 1) && (((strx_decode(p_state, &((*p_type_result)._Member_off_key), NULL, NULL))&& !memcmp("off", (*p_type_result)._Member_off_key.value, (*p_type_result)._Member_off_key.len) - && (intx32_decode(p_state, &((*p_type_result)._Member_off), NULL, NULL))) && (((*p_type_result)._Member_choice = _Member_off) || 1))) - || ((p_state->p_payload = p_payload_bak) && ((p_state->elem_count = elem_count_bak) || 1) && (((strx_decode(p_state, &((*p_type_result)._Member_sha_key), NULL, NULL))&& !memcmp("sha", (*p_type_result)._Member_sha_key.value, (*p_type_result)._Member_sha_key.len) - && (strx_decode(p_state, &((*p_type_result)._Member_sha), NULL, NULL))) && (((*p_type_result)._Member_choice = _Member_sha) || 1)))))); - - if (!result) - { - cbor_decode_trace(); - } - - return result; -} - -static bool decode_Upload( - cbor_decode_state_t *p_state, void * p_result, void * p_min_value, - void * p_max_value) -{ - cbor_decode_print("decode_Upload\n"); - size_t temp_elem_counts[2]; - size_t *p_temp_elem_count = temp_elem_counts; - Upload_t* p_type_result = (Upload_t*)p_result; - - bool result = (((list_start_decode(p_state, &(*(p_temp_elem_count++)), 1, 5)) - && multi_decode(1, 5, &(*p_type_result)._Upload_members_count, (void*)decode_Member, p_state, &((*p_type_result)._Upload_members), NULL, NULL, sizeof(_Member_t)) - && ((p_state->elem_count = *(--p_temp_elem_count)) || 1))); - - if (!result) - { - cbor_decode_trace(); - } - - p_state->elem_count = temp_elem_counts[0]; - return result; -} - - -bool cbor_decode_Upload(const uint8_t * p_payload, size_t payload_len, Upload_t * p_result) -{ - cbor_decode_state_t state = { - .p_payload = p_payload, - .p_payload_end = p_payload + payload_len, - .elem_count = 1 - }; - - return decode_Upload(&state, p_result, NULL, NULL); -} diff --git a/mcuboot/boot/boot_serial/src/serial_recovery_cbor.h b/mcuboot/boot/boot_serial/src/serial_recovery_cbor.h deleted file mode 100644 index aa14f5c7f..000000000 --- a/mcuboot/boot/boot_serial/src/serial_recovery_cbor.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file has been generated from the cddl_gen submodule. - * Commit 9d911cf0c7c9f13b5a9fdd5ed6c1012df21e5576 - */ - -/* - * Copyright (c) 2020 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/* Generated with cddl_gen.py (https://github.com/oyvindronningstad/cddl_gen) - * at: 2020-05-13 12:19:04 - */ - -#ifndef SERIAL_RECOVERY_CBOR_H__ -#define SERIAL_RECOVERY_CBOR_H__ - -#include -#include -#include -#include -#include "cbor_decode.h" - - -typedef struct { - union { - struct { - cbor_string_type_t _Member_image_key; - int32_t _Member_image; - }; - struct { - cbor_string_type_t _Member_data_key; - cbor_string_type_t _Member_data; - }; - struct { - cbor_string_type_t _Member_len_key; - int32_t _Member_len; - }; - struct { - cbor_string_type_t _Member_off_key; - int32_t _Member_off; - }; - struct { - cbor_string_type_t _Member_sha_key; - cbor_string_type_t _Member_sha; - }; - }; - enum { - _Member_image, - _Member_data, - _Member_len, - _Member_off, - _Member_sha, - } _Member_choice; -} _Member_t; - -typedef struct { - _Member_t _Upload_members[5]; - size_t _Upload_members_count; -} Upload_t; - -bool cbor_decode_Upload(const uint8_t * p_payload, size_t payload_len, Upload_t * p_result); - -#endif // SERIAL_RECOVERY_CBOR_H__ diff --git a/mcuboot/boot/boot_serial/syscfg.yml b/mcuboot/boot/boot_serial/syscfg.yml deleted file mode 100644 index 655644286..000000000 --- a/mcuboot/boot/boot_serial/syscfg.yml +++ /dev/null @@ -1,92 +0,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. -# - -syscfg.defs: - BOOT_SERIAL_DETECT_PIN: - description: > - Start the serial boot loader if this pin is asserted at boot time. - value: '-1' - restrictions: - - '(BOOT_SERIAL_DETECT_PIN != -1) || - (BOOT_SERIAL_DETECT_TIMEOUT != 0) || - (BOOT_SERIAL_NVREG_INDEX != -1)' - - BOOT_SERIAL_DETECT_PIN_CFG: - description: > - GPIO configuration for the serial boot loader detect pin. - value: 'HAL_GPIO_PULL_UP' - - BOOT_SERIAL_DETECT_PIN_VAL: - description: > - The value the detect pin must be set to for the serial boot loader - to start. - value: 0 - - BOOT_SERIAL_DETECT_TIMEOUT: - description: > - The duration, in milliseconds, to listen on the UART for the - management string (BOOT_SERIAL_DETECT_STRING). If the management - string is detected during this period, the serial boot loader is - started. If the period expires without the management string being - received, the boot loader runs in the normal (non-serial) mode. - Specify 0 to disable listening on the UART for the management - string. - value: 0 - restrictions: - - '(BOOT_SERIAL_DETECT_PIN != -1) || - (BOOT_SERIAL_DETECT_TIMEOUT != 0) || - (BOOT_SERIAL_NVREG_INDEX != -1)' - - BOOT_SERIAL_DETECT_STRING: - description: > - The string to listen for on the UART. If this management string is - detected during the timeout period, the serial boot loader is - started. If the period expires without this string being received, - the boot loader runs in the normal (non-serial) mode. This setting - has no effect if BOOT_SERIAL_DETECT_TIMEOUT is set to 0. - value: '"nmgr"' - - BOOT_SERIAL_REPORT_PIN: - description: > - The GPIO to toggle while the serial boot loader is running. Set to - -1 to disable reporting. - value: 'LED_BLINK_PIN' - - BOOT_SERIAL_REPORT_FREQ: - description: > - The toggle rate, in Hz, of the serial boot loader report pin. - value: 4 - - BOOT_SERIAL_NVREG_MAGIC: - description: > - Magic number, to be saved in a retained (reset-surviving) register. - If the value in the register matches, the serial bootloader will - load. Value must not be 0. - value: 0xB7 - restrictions: - - '(BOOT_SERIAL_NVREG_MAGIC != 0)' - - BOOT_SERIAL_NVREG_INDEX: - description: > - Index of retained register to use (using hal_nvreg_read) for reading - magic value. - value: -1 - restrictions: - - '(BOOT_SERIAL_DETECT_PIN != -1) || - (BOOT_SERIAL_DETECT_TIMEOUT != 0) || - (BOOT_SERIAL_NVREG_INDEX != -1)' diff --git a/mcuboot/boot/boot_serial/test/pkg.yml b/mcuboot/boot/boot_serial/test/pkg.yml deleted file mode 100644 index 5f5572800..000000000 --- a/mcuboot/boot/boot_serial/test/pkg.yml +++ /dev/null @@ -1,35 +0,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. -# -pkg.name: boot/boot_serial/test -pkg.type: unittest -pkg.description: "Boot serial unit tests." -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - -pkg.deps: - - "@mcuboot/boot/boot_serial" - - "@mcuboot/boot/bootutil" - - "@apache-mynewt-core/sys/log/stub" - - "@apache-mynewt-core/test/testutil" - -pkg.deps.SELFTEST: - - "@apache-mynewt-core/sys/console/stub" - -pkg.cflags: - - '-DMCUBOOT_MYNEWT=1' diff --git a/mcuboot/boot/boot_serial/test/src/boot_test.c b/mcuboot/boot/boot_serial/test/src/boot_test.c deleted file mode 100644 index e8deb7eed..000000000 --- a/mcuboot/boot/boot_serial/test/src/boot_test.c +++ /dev/null @@ -1,85 +0,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. - */ -#include -#include -#include -#include -#include -#include -#include "syscfg/syscfg.h" -#include "sysflash/sysflash.h" -#include "os/endian.h" -#include "base64/base64.h" -#include "crc/crc16.h" -#include "testutil/testutil.h" -#include "hal/hal_flash.h" -#include "flash_map_backend/flash_map_backend.h" - -#include "boot_serial/boot_serial.h" -#include "boot_serial_priv.h" - -TEST_CASE_DECL(boot_serial_setup) -TEST_CASE_DECL(boot_serial_empty_msg) -TEST_CASE_DECL(boot_serial_empty_img_msg) -TEST_CASE_DECL(boot_serial_img_msg) -TEST_CASE_DECL(boot_serial_upload_bigger_image) - -static void -test_uart_write(const char *str, int len) -{ -} - -static const struct boot_uart_funcs test_uart = { - .write = test_uart_write -}; - -void -tx_msg(void *src, int len) -{ - boot_serial_input(src, len); -} - -TEST_SUITE(boot_serial_suite) -{ - boot_serial_setup(); - boot_serial_empty_msg(); - boot_serial_empty_img_msg(); - boot_serial_img_msg(); - boot_serial_upload_bigger_image(); -} - -int -boot_serial_test(void) -{ - boot_uf = &test_uart; - boot_serial_suite(); - return tu_any_failed; -} - -#if MYNEWT_VAL(SELFTEST) -int -main(void) -{ - sysinit(); - - boot_serial_test(); - - return tu_any_failed; -} -#endif diff --git a/mcuboot/boot/boot_serial/test/src/boot_test.h b/mcuboot/boot/boot_serial/test/src/boot_test.h deleted file mode 100644 index 2139d9f47..000000000 --- a/mcuboot/boot/boot_serial/test/src/boot_test.h +++ /dev/null @@ -1,50 +0,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 _BOOT_TEST_H -#define _BOOT_TEST_H - -#include -#include -#include -#include -#include -#include -#include "syscfg/syscfg.h" -#include "sysflash/sysflash.h" -#include "os/endian.h" -#include "base64/base64.h" -#include "crc/crc16.h" -#include "testutil/testutil.h" -#include "hal/hal_flash.h" -#include "flash_map_backend/flash_map_backend.h" -#include "bootutil/bootutil.h" - -#include "boot_serial_priv.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void tx_msg(void *src, int len); - -#ifdef __cplusplus -} -#endif - -#endif /* _BOOT_TEST_H */ diff --git a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_empty_img_msg.c b/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_empty_img_msg.c deleted file mode 100644 index a5e7174b5..000000000 --- a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_empty_img_msg.c +++ /dev/null @@ -1,35 +0,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. - */ -#include "boot_test.h" - -TEST_CASE(boot_serial_empty_img_msg) -{ - char buf[sizeof(struct nmgr_hdr) + 32]; - struct nmgr_hdr *hdr; - - hdr = (struct nmgr_hdr *)buf; - memset(hdr, 0, sizeof(*hdr)); - hdr->nh_op = NMGR_OP_WRITE; - hdr->nh_group = htons(MGMT_GROUP_ID_IMAGE); - hdr->nh_id = IMGMGR_NMGR_ID_UPLOAD; - hdr->nh_len = htons(2); - strcpy((char *)(hdr + 1), "{}"); - - tx_msg(buf, sizeof(*hdr) + 2); -} diff --git a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_empty_msg.c b/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_empty_msg.c deleted file mode 100644 index 12b645764..000000000 --- a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_empty_msg.c +++ /dev/null @@ -1,37 +0,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. - */ -#include "boot_test.h" - -TEST_CASE(boot_serial_empty_msg) -{ - char buf[4]; - struct nmgr_hdr hdr; - - tx_msg(buf, 0); - - strcpy(buf, "--"); - tx_msg(buf, 2); - - memset(&hdr, 0, sizeof(hdr)); - tx_msg(&hdr, sizeof(hdr)); - - hdr.nh_op = NMGR_OP_WRITE; - - tx_msg(&hdr, sizeof(hdr)); -} diff --git a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_img_msg.c b/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_img_msg.c deleted file mode 100644 index 7aa9590ac..000000000 --- a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_img_msg.c +++ /dev/null @@ -1,70 +0,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. - */ - -#include "boot_test.h" - -TEST_CASE(boot_serial_img_msg) -{ - char img[16]; - char enc_img[BASE64_ENCODE_SIZE(sizeof(img)) + 1]; - char buf[sizeof(struct nmgr_hdr) + sizeof(enc_img) + 32]; - int len; - int rc; - struct nmgr_hdr *hdr; - const struct flash_area *fap; - - /* 00000000 a3 64 64 61 74 61 58 10 |.ddataX.| - * 00000008 a5 a5 a5 a5 a5 a5 a5 a5 |........| - * 00000010 a5 a5 a5 a5 a5 a5 a5 a5 |........| - * 00000018 63 6c 65 6e 1a 00 01 14 |clen....| - * 00000020 e8 63 6f 66 66 00 |.coff.| - */ - static const uint8_t payload[] = { - 0xa3, 0x64, 0x64, 0x61, 0x74, 0x61, 0x58, 0x10, - /* 16 bytes of image data starts here. */ - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, - 0x63, 0x6c, 0x65, 0x6e, 0x1a, 0x00, 0x01, 0x14, - 0xe8, 0x63, 0x6f, 0x66, 0x66, 0x00, - }; - - memset(img, 0xa5, sizeof(img)); - - hdr = (struct nmgr_hdr *)buf; - memset(hdr, 0, sizeof(*hdr)); - hdr->nh_op = NMGR_OP_WRITE; - hdr->nh_group = htons(MGMT_GROUP_ID_IMAGE); - hdr->nh_id = IMGMGR_NMGR_ID_UPLOAD; - - memcpy(hdr + 1, payload, sizeof payload); - hdr->nh_len = htons(sizeof payload); - - len = sizeof(*hdr) + sizeof payload; - tx_msg(buf, len); - - /* - * Validate contents inside the primary slot - */ - rc = flash_area_open(FLASH_AREA_IMAGE_PRIMARY(0), &fap); - assert(rc == 0); - - rc = flash_area_read(fap, 0, enc_img, sizeof(img)); - assert(rc == 0); - assert(!memcmp(enc_img, img, sizeof(img))); -} diff --git a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_setup.c b/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_setup.c deleted file mode 100644 index 791e84561..000000000 --- a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_setup.c +++ /dev/null @@ -1,24 +0,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. - */ -#include "boot_test.h" - -TEST_CASE(boot_serial_setup) -{ - -} diff --git a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_upload_bigger_image.c b/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_upload_bigger_image.c deleted file mode 100644 index 53a7199cf..000000000 --- a/mcuboot/boot/boot_serial/test/src/testcases/boot_serial_upload_bigger_image.c +++ /dev/null @@ -1,117 +0,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. - */ - -#include -#include - -#include "boot_test.h" - -TEST_CASE(boot_serial_upload_bigger_image) -{ - char img[256]; - char enc_img[64]; - char buf[sizeof(struct nmgr_hdr) + 128]; - int len; - int off; - int rc; - struct nmgr_hdr *hdr; - const struct flash_area *fap; - int i; - - const int payload_off = sizeof *hdr; - const int img_data_off = payload_off + 8; - - /* 00000000 a3 64 64 61 74 61 58 20 |.ddataX.| - * 00000008 00 00 00 00 00 00 00 00 |........| - * 00000010 00 00 00 00 00 00 00 00 |........| - * 00000018 00 00 00 00 00 00 00 00 |........| - * 00000020 00 00 00 00 00 00 00 00 |........| - * 00000028 63 6c 65 6e 1a 00 01 14 |clen....| - * 00000030 e8 63 6f 66 66 00 |.coff.| - */ - static const uint8_t payload_first[] = { - 0xa3, 0x64, 0x64, 0x61, 0x74, 0x61, 0x58, 0x20, - /* 32 bytes of image data starts here. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x6c, 0x65, 0x6e, 0x1a, 0x00, 0x01, 0x14, - 0xe8, 0x63, 0x6f, 0x66, 0x66, 0x00, - }; - - /* 00000000 a3 64 64 61 74 61 58 20 |.ddataX.| - * 00000008 00 00 00 00 00 00 00 00 |........| - * 00000010 00 00 00 00 00 00 00 00 |........| - * 00000018 00 00 00 00 00 00 00 00 |........| - * 00000020 00 00 00 00 00 00 00 00 |........| - * 00000028 63 6f 66 66 00 00 |coff..| - */ - static const uint8_t payload_next[] = { - 0xa2, 0x64, 0x64, 0x61, 0x74, 0x61, 0x58, 0x20, - /* 32 bytes of image data starts here. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x6f, 0x66, 0x66, - /* 2 bytes of offset value starts here. */ - 0x00, 0x00 - }; - - for (i = 0; i < sizeof(img); i++) { - img[i] = i; - } - - for (off = 0; off < sizeof(img); off += 32) { - hdr = (struct nmgr_hdr *)buf; - memset(hdr, 0, sizeof(*hdr)); - hdr->nh_op = NMGR_OP_WRITE; - hdr->nh_group = htons(MGMT_GROUP_ID_IMAGE); - hdr->nh_id = IMGMGR_NMGR_ID_UPLOAD; - - if (off) { - memcpy(buf + payload_off, payload_next, sizeof payload_next); - len = sizeof payload_next; - buf[payload_off + len - 2] = Value8Bit; - buf[payload_off + len - 1] = off; - } else { - memcpy(buf + payload_off, payload_first, sizeof payload_first); - len = sizeof payload_first; - } - memcpy(buf + img_data_off, img + off, 32); - hdr->nh_len = htons(len); - - len = sizeof(*hdr) + len; - - tx_msg(buf, len); - } - - /* - * Validate contents inside the primary slot - */ - rc = flash_area_open(FLASH_AREA_IMAGE_PRIMARY(0), &fap); - assert(rc == 0); - - for (off = 0; off < sizeof(img); off += sizeof(enc_img)) { - rc = flash_area_read(fap, off, enc_img, sizeof(enc_img)); - assert(rc == 0); - assert(!memcmp(enc_img, &img[off], sizeof(enc_img))); - } -} diff --git a/mcuboot/boot/boot_serial/test/syscfg.yml b/mcuboot/boot/boot_serial/test/syscfg.yml deleted file mode 100644 index ff841d626..000000000 --- a/mcuboot/boot/boot_serial/test/syscfg.yml +++ /dev/null @@ -1,23 +0,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. -# - -# Package: boot/boot_serial/test - -syscfg.vals: - # This is here to work around the $notnull syscfg restriction. - BOOT_SERIAL_DETECT_PIN: 0 diff --git a/mcuboot/boot/bootutil/include/bootutil/bench.h b/mcuboot/boot/bootutil/include/bootutil/bench.h deleted file mode 100644 index 1e7195cc2..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/bench.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2019 Linaro Limited - * - * 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. - */ - -#ifndef H_BOOTUTIL_BENCH_H__ -#define H_BOOTUTIL_BENCH_H__ - -#include "ignore.h" - -#ifdef MCUBOOT_USE_BENCH - -/* The platform-specific benchmark code should define a - * `bench_state_t` type that holds the information needed for the - * benchmark. This is generally something small, such as an integer - * holding the state. This should also define plat_bench_start and - * plat_bench_end, which likely have to be macros so that log messages - * come from the right place in the code. */ -#include - -/* - * These are simple barrier-type benchmarks. If a platform has - * benchmarks that are enabled, calling `boot_bench_start()` before a - * block of code and `boot_bench_stop()` after that block of code will - * present this information in some manner (usually through logging). - * The details of what is measured and how it is printed are specific - * to the platform and the implementation. A pointer to the - * platform-specific state should be passed in. - */ -#define boot_bench_start(_state) do { \ - plat_bench_start(_state); \ -} while (0) - -#define boot_bench_stop(_state) do { \ - plat_bench_stop(_state); \ -} while (0) - -#else /* not MCUBOOT_USE_BENCH */ - -/* The type needs to take space. As long as it remains unused, the C - * compiler should eliminate this value entirely. */ -typedef int bench_state_t; - -/* Without benchmarking enabled, these are just empty. */ -#define boot_bench_start(_state) do { \ - IGNORE(_state); \ -} while(0) - -#define boot_bench_stop(_state) do { \ - IGNORE(_state); \ -} while(0) - -#endif /* not MCUBOOT_USE_BENCH */ - -#endif /* not H_BOOTUTIL_BENCH_H__ */ diff --git a/mcuboot/boot/bootutil/include/bootutil/boot_record.h b/mcuboot/boot/bootutil/include/bootutil/boot_record.h deleted file mode 100644 index a2932eaf4..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/boot_record.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2018-2020 Arm Limited - * - * 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. - */ - -#ifndef __BOOT_RECORD_H__ -#define __BOOT_RECORD_H__ - -#include -#include "bootutil/image.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Add an image's all boot status information to the shared memory area - * between the bootloader and runtime SW. - * - * @param[in] sw_module Identifier of the SW component. - * @param[in] hdr Pointer to the image header stored in RAM. - * @param[in] fap Pointer to the flash area where image is stored. - * - * @return 0 on success; nonzero on failure. - */ -int boot_save_boot_status(uint8_t sw_module, - const struct image_header *hdr, - const struct flash_area *fap); - -/** - * Add application specific data to the shared memory area between the - * bootloader and runtime SW. - * - * @param[in] hdr Pointer to the image header stored in RAM. - * @param[in] fap Pointer to the flash area where image is stored. - * - * @return 0 on success; nonzero on failure. - */ -int boot_save_shared_data(const struct image_header *hdr, - const struct flash_area *fap); - -#ifdef __cplusplus -} -#endif - -#endif /* __BOOT_RECORD_H__ */ diff --git a/mcuboot/boot/bootutil/include/bootutil/boot_status.h b/mcuboot/boot/bootutil/include/bootutil/boot_status.h deleted file mode 100644 index 0364870cb..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/boot_status.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2018-2020 Arm Limited - * Copyright (c) 2020 Linaro Limited - * - * 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. - */ - -#ifndef __BOOT_STATUS_H__ -#define __BOOT_STATUS_H__ - -#include -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * The shared data between boot loader and runtime SW is TLV encoded. The - * shared data is stored in a well known location in memory and this is a - * contract between boot loader and runtime SW. - * - * The structure of shared data must be the following: - * - At the beginning there must be a header: struct shared_data_tlv_header - * This contains a magic number and a size field which covers the entire - * size of the shared data area including this header. - * - After the header there come the entries which are composed from an entry - * header structure: struct shared_data_tlv_entry and the data. In the entry - * header is a type field (tly_type) which identify the consumer of the - * entry in the runtime SW and specify the subtype of that data item. There - * is a size field (tlv_len) which covers the size of the the data. After - * this structure comes the actual data. - * - * - Arbitrary number and size of data entry can be in the shared memory area. - * - * This table gives of overview about the tlv_type field in the entry header. - * The tlv_type always composed from a major and minor number. Major number - * identifies the addressee in runtime SW, who should process the data entry. - * Minor number used to encode more info about the data entry. The actual - * definition of minor number could change per major number. - * - * In case of boot status data, which can be processed by an attestation - * service the minor number is split further to two part: sw_module and claim. - * The sw_module identifies the SW component in the system which the data item - * belongs to and the claim part identifies the exact type of the data. - * - * |---------------------------------------| - * | tlv_type (16) | - * |---------------------------------------| - * | tlv_major(4)| tlv_minor(12) | - * |---------------------------------------| - * | MAJOR_IAS | sw_module(6) | claim(6) | - * |---------------------------------------| - */ - -/* General macros to handle TLV type */ -#define MAJOR_MASK 0xF /* 4 bit */ -#define MAJOR_POS 12 /* 12 bit */ -#define MINOR_MASK 0xFFF /* 12 bit */ - -#define SET_TLV_TYPE(major, minor) \ - (((uint16_t)((major) & MAJOR_MASK) << MAJOR_POS) \ - | ((minor) & MINOR_MASK)) -#define GET_MAJOR(tlv_type) ((uint16_t)(tlv_type) >> MAJOR_POS) -#define GET_MINOR(tlv_type) ((tlv_type) & MINOR_MASK) - -/* Magic value which marks the beginning of shared data area in memory */ -#define SHARED_DATA_TLV_INFO_MAGIC 0x2016 - -/* Initial attestation specific macros */ - -/** - * Major numbers (4 bit) to identify the - * consumer of shared data in runtime SW. - */ -#define TLV_MAJOR_IAS 0x1 - -/* Initial attestation: Claim per SW components / SW modules */ -/* Bits: 0-2 */ -#define SW_VERSION 0x00 -#define SW_SIGNER_ID 0x01 -/* Reserved 0x02 */ -#define SW_TYPE 0x03 -/* Bits: 3-5 */ -#define SW_MEASURE_VALUE 0x08 -#define SW_MEASURE_TYPE 0x09 -#define SW_BOOT_RECORD 0x3F - -#define MODULE_POS 6 /* 6 bit */ -#define CLAIM_MASK 0x3F /* 6 bit */ -#define MEASUREMENT_CLAIM_POS 3 /* 3 bit */ - -#define GET_IAS_MODULE(tlv_type) ((uint16_t)GET_MINOR(tlv_type) >> MODULE_POS) -#define GET_IAS_CLAIM(tlv_type) (GET_MINOR(tlv_type) & CLAIM_MASK) -#define SET_IAS_MINOR(sw_module, claim) \ - (((uint16_t)(sw_module) << MODULE_POS) | (claim)) - -/** - * Shared data TLV header. All fields in little endian. - * - * ----------------------------------- - * | tlv_magic(16) | tlv_tot_len(16) | - * ----------------------------------- - */ -struct shared_data_tlv_header { - uint16_t tlv_magic; - uint16_t tlv_tot_len; /* size of whole TLV area (including this header) */ -}; - -#define SHARED_DATA_HEADER_SIZE sizeof(struct shared_data_tlv_header) - -/** - * Shared data TLV entry header format. All fields in little endian. - * - * ------------------------------- - * | tlv_type(16) | tlv_len(16) | - * ------------------------------- - * | Raw data | - * ------------------------------- - */ -struct shared_data_tlv_entry { - uint16_t tlv_type; - uint16_t tlv_len; /* TLV data length (not including this header). */ -}; - -#define SHARED_DATA_ENTRY_HEADER_SIZE sizeof(struct shared_data_tlv_entry) -#define SHARED_DATA_ENTRY_SIZE(size) (size + SHARED_DATA_ENTRY_HEADER_SIZE) - -/* Structure to store the boot data for the runtime SW. */ -struct shared_boot_data { - struct shared_data_tlv_header header; - uint8_t data[]; -}; - -#ifdef __cplusplus -} -#endif - -#endif /* __BOOT_STATUS_H__ */ diff --git a/mcuboot/boot/bootutil/include/bootutil/bootutil.h b/mcuboot/boot/bootutil/include/bootutil/bootutil.h deleted file mode 100644 index 11c54c8ad..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/bootutil.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2017-2019 Linaro LTD - * Copyright (c) 2016-2019 JUUL Labs - * Copyright (c) 2019 Arm Limited - * - * Original license: - * - * 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 H_BOOTUTIL_ -#define H_BOOTUTIL_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** Attempt to boot the contents of the primary slot. */ -#define BOOT_SWAP_TYPE_NONE 1 - -/** - * Swap to the secondary slot. - * Absent a confirm command, revert back on next boot. - */ -#define BOOT_SWAP_TYPE_TEST 2 - -/** - * Swap to the secondary slot, - * and permanently switch to booting its contents. - */ -#define BOOT_SWAP_TYPE_PERM 3 - -/** Swap back to alternate slot. A confirm changes this state to NONE. */ -#define BOOT_SWAP_TYPE_REVERT 4 - -/** Swap failed because image to be run is not valid */ -#define BOOT_SWAP_TYPE_FAIL 5 - -/** Swapping encountered an unrecoverable error */ -#define BOOT_SWAP_TYPE_PANIC 0xff - -#define BOOT_MAX_ALIGN 8 - -struct image_header; -/** - * A response object provided by the boot loader code; indicates where to jump - * to execute the main image. - */ -struct boot_rsp { - /** A pointer to the header of the image to be executed. */ - const struct image_header *br_hdr; - - /** - * The flash offset of the image to execute. Indicates the position of - * the image header within its flash device. - */ - uint8_t br_flash_dev_id; - uint32_t br_image_off; -}; - -/* This is not actually used by mcuboot's code but can be used by apps - * when attempting to read/write a trailer. - */ -struct image_trailer { - uint8_t swap_type; - uint8_t pad1[BOOT_MAX_ALIGN - 1]; - uint8_t copy_done; - uint8_t pad2[BOOT_MAX_ALIGN - 1]; - uint8_t image_ok; - uint8_t pad3[BOOT_MAX_ALIGN - 1]; - uint8_t magic[16]; -}; - -/* you must have pre-allocated all the entries within this structure */ -int boot_go(struct boot_rsp *rsp); - -struct boot_loader_state; -int context_boot_go(struct boot_loader_state *state, struct boot_rsp *rsp); - -int boot_swap_type_multi(int image_index); -int boot_swap_type(void); - -int boot_set_pending(int permanent); -int boot_set_confirmed(void); - -#define SPLIT_GO_OK (0) -#define SPLIT_GO_NON_MATCHING (-1) -#define SPLIT_GO_ERR (-2) -int -split_go(int loader_slot, int split_slot, void **entry); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/bootutil/include/bootutil/bootutil_log.h b/mcuboot/boot/bootutil/include/bootutil/bootutil_log.h deleted file mode 100644 index 0ce8a533e..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/bootutil_log.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2017 Linaro Limited - * - * 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. - */ - -#ifndef H_BOOTUTIL_LOG_H_ -#define H_BOOTUTIL_LOG_H_ - -#include "ignore.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -#ifdef MCUBOOT_HAVE_LOGGING - -#define BOOT_LOG_ERR(...) MCUBOOT_LOG_ERR(__VA_ARGS__) -#define BOOT_LOG_WRN(...) MCUBOOT_LOG_WRN(__VA_ARGS__) -#define BOOT_LOG_INF(...) MCUBOOT_LOG_INF(__VA_ARGS__) -#define BOOT_LOG_DBG(...) MCUBOOT_LOG_DBG(__VA_ARGS__) -#define BOOT_LOG_SIM(...) MCUBOOT_LOG_SIM(__VA_ARGS__) - -#else - -#define BOOT_LOG_ERR(...) IGNORE(__VA_ARGS__) -#define BOOT_LOG_WRN(...) IGNORE(__VA_ARGS__) -#define BOOT_LOG_INF(...) IGNORE(__VA_ARGS__) -#define BOOT_LOG_DBG(...) IGNORE(__VA_ARGS__) -#define BOOT_LOG_SIM(...) IGNORE(__VA_ARGS__) - -#endif /* MCUBOOT_HAVE_LOGGING */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/bootutil/include/bootutil/bootutil_test.h b/mcuboot/boot/bootutil/include/bootutil/bootutil_test.h deleted file mode 100644 index f48bf0195..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/bootutil_test.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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 H_BOOTUTIL_TEST_ -#define H_BOOTUTIL_TEST_ - -#ifdef __cplusplus -extern "C" { -#endif - -int boot_test_all(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/bootutil/include/bootutil/caps.h b/mcuboot/boot/bootutil/include/bootutil/caps.h deleted file mode 100644 index 6f3806ea5..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/caps.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2017 Linaro Limited - * - * 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. - */ - -#ifndef H_BOOTUTIL_CAPS_H_ -#define H_BOOTUTIL_CAPS_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * The bootloader can be compile with different capabilities selected - * at compile time. This function provides runtime access to these - * capabilities. This is intended primarily for testing, although - * these will possibly be available at runtime to the application - * running within the bootloader. - */ -uint32_t bootutil_get_caps(void); - -#define BOOTUTIL_CAP_RSA2048 (1<<0) -#define BOOTUTIL_CAP_ECDSA_P224 (1<<1) -#define BOOTUTIL_CAP_ECDSA_P256 (1<<2) -#define BOOTUTIL_CAP_SWAP_USING_SCRATCH (1<<3) -#define BOOTUTIL_CAP_OVERWRITE_UPGRADE (1<<4) -#define BOOTUTIL_CAP_ENC_RSA (1<<5) -#define BOOTUTIL_CAP_ENC_KW (1<<6) -#define BOOTUTIL_CAP_VALIDATE_PRIMARY_SLOT (1<<7) -#define BOOTUTIL_CAP_RSA3072 (1<<8) -#define BOOTUTIL_CAP_ED25519 (1<<9) -#define BOOTUTIL_CAP_ENC_EC256 (1<<10) -#define BOOTUTIL_CAP_SWAP_USING_MOVE (1<<11) -#define BOOTUTIL_CAP_DOWNGRADE_PREVENTION (1<<12) -#define BOOTUTIL_CAP_ENC_X25519 (1<<13) - -/* - * Query the number of images this bootloader is configured for. This - * is also primarily used for testing. - */ -uint32_t bootutil_get_num_images(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/bootutil/include/bootutil/enc_key.h b/mcuboot/boot/bootutil/include/bootutil/enc_key.h deleted file mode 100644 index fbe90c31d..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/enc_key.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2018-2019 JUUL Labs - * Copyright (c) 2019 Arm Limited - * - * Original license: - * - * 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 BOOTUTIL_ENC_KEY_H -#define BOOTUTIL_ENC_KEY_H - -#include -#include -#include -#include "mcuboot_config/mcuboot_config.h" -#include "bootutil/image.h" - -#if defined(MCUBOOT_USE_MBED_TLS) -#include "mbedtls/aes.h" -#else -#include "tinycrypt/aes.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#define BOOT_ENC_KEY_SIZE 16 -#define BOOT_ENC_KEY_SIZE_BITS (BOOT_ENC_KEY_SIZE * 8) - -#define TLV_ENC_RSA_SZ 256 -#define TLV_ENC_KW_SZ 24 -#define TLV_ENC_EC256_SZ (65 + 32 + 16) -#define TLV_ENC_X25519_SZ (32 + 32 + 16) - -#if defined(MCUBOOT_ENCRYPT_RSA) -#define BOOT_ENC_TLV_SIZE TLV_ENC_RSA_SZ -#elif defined(MCUBOOT_ENCRYPT_EC256) -#define BOOT_ENC_TLV_SIZE TLV_ENC_EC256_SZ -#elif defined(MCUBOOT_ENCRYPT_X25519) -#define BOOT_ENC_TLV_SIZE TLV_ENC_X25519_SZ -#else -#define BOOT_ENC_TLV_SIZE TLV_ENC_KW_SZ -#endif - -#define BOOT_ENC_TLV_ALIGN_SIZE \ - ((((BOOT_ENC_TLV_SIZE - 1) / BOOT_MAX_ALIGN) + 1) * BOOT_MAX_ALIGN) - -struct enc_key_data { - uint8_t valid; -#if defined(MCUBOOT_USE_MBED_TLS) - mbedtls_aes_context aes; -#else - struct tc_aes_key_sched_struct aes; -#endif -}; - -extern const struct bootutil_key bootutil_enc_key; -struct boot_status; - -int boot_enc_set_key(struct enc_key_data *enc_state, uint8_t slot, - const struct boot_status *bs); -int boot_enc_load(struct enc_key_data *enc_state, int image_index, - const struct image_header *hdr, const struct flash_area *fap, - struct boot_status *bs); -int boot_enc_decrypt(const uint8_t *buf, uint8_t *enckey); -bool boot_enc_valid(struct enc_key_data *enc_state, int image_index, - const struct flash_area *fap); -void boot_encrypt(struct enc_key_data *enc_state, int image_index, - const struct flash_area *fap, uint32_t off, uint32_t sz, - uint32_t blk_off, uint8_t *buf); -void boot_enc_zeroize(struct enc_key_data *enc_state); - -#ifdef __cplusplus -} -#endif - -#endif /* BOOTUTIL_ENC_KEY_H */ diff --git a/mcuboot/boot/bootutil/include/bootutil/ignore.h b/mcuboot/boot/bootutil/include/bootutil/ignore.h deleted file mode 100644 index 1684c056c..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/ignore.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2017 Nordic Semiconductor ASA - * - * Original license: - * - * 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 H_IGNORE_ -#define H_IGNORE_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * These macros prevent the "set but not used" warnings for log writes below - * the log level. - */ - -#define IGN_1(X) ((void)(X)) -#define IGN_2(X, ...) ((void)(X));IGN_1(__VA_ARGS__) -#define IGN_3(X, ...) ((void)(X));IGN_2(__VA_ARGS__) -#define IGN_4(X, ...) ((void)(X));IGN_3(__VA_ARGS__) -#define IGN_5(X, ...) ((void)(X));IGN_4(__VA_ARGS__) -#define IGN_6(X, ...) ((void)(X));IGN_5(__VA_ARGS__) -#define IGN_7(X, ...) ((void)(X));IGN_6(__VA_ARGS__) -#define IGN_8(X, ...) ((void)(X));IGN_7(__VA_ARGS__) -#define IGN_9(X, ...) ((void)(X));IGN_8(__VA_ARGS__) -#define IGN_10(X, ...) ((void)(X));IGN_9(__VA_ARGS__) -#define IGN_11(X, ...) ((void)(X));IGN_10(__VA_ARGS__) -#define IGN_12(X, ...) ((void)(X));IGN_11(__VA_ARGS__) -#define IGN_13(X, ...) ((void)(X));IGN_12(__VA_ARGS__) -#define IGN_14(X, ...) ((void)(X));IGN_13(__VA_ARGS__) -#define IGN_15(X, ...) ((void)(X));IGN_14(__VA_ARGS__) -#define IGN_16(X, ...) ((void)(X));IGN_15(__VA_ARGS__) -#define IGN_17(X, ...) ((void)(X));IGN_16(__VA_ARGS__) -#define IGN_18(X, ...) ((void)(X));IGN_17(__VA_ARGS__) -#define IGN_19(X, ...) ((void)(X));IGN_18(__VA_ARGS__) -#define IGN_20(X, ...) ((void)(X));IGN_19(__VA_ARGS__) - -#define GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, NAME, ...) NAME -#define IGNORE(...) \ - GET_MACRO(__VA_ARGS__, IGN_20, IGN_19, IGN_18, IGN_17, IGN_16, IGN_15, \ - IGN_14, IGN_13, IGN_12, IGN_11, IGN_10, IGN_9, IGN_8, IGN_7, \ - IGN_6, IGN_5, IGN_4, IGN_3, IGN_2, IGN_1)(__VA_ARGS__) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/bootutil/include/bootutil/image.h b/mcuboot/boot/bootutil/include/bootutil/image.h deleted file mode 100644 index 5e5a73c7d..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/image.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2016-2019 Linaro LTD - * Copyright (c) 2016-2019 JUUL Labs - * Copyright (c) 2019-2020 Arm Limited - * - * Original license: - * - * 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 H_IMAGE_ -#define H_IMAGE_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct flash_area; - -#define IMAGE_MAGIC 0x96f3b83d -#define IMAGE_MAGIC_V1 0x96f3b83c -#define IMAGE_MAGIC_NONE 0xffffffff -#define IMAGE_TLV_INFO_MAGIC 0x6907 -#define IMAGE_TLV_PROT_INFO_MAGIC 0x6908 - -#define IMAGE_HEADER_SIZE 32 - -/* - * Image header flags. - */ -#define IMAGE_F_PIC 0x00000001 /* Not supported. */ -#define IMAGE_F_NON_BOOTABLE 0x00000010 /* Split image app. */ -#define IMAGE_F_ENCRYPTED 0x00000004 /* Encrypted. */ -/* - * Indicates that this image should be loaded into RAM instead of run - * directly from flash. The address to load should be in the - * ih_load_addr field of the header. - */ -#define IMAGE_F_RAM_LOAD 0x00000020 - -/* - * ECSDA224 is with NIST P-224 - * ECSDA256 is with NIST P-256 - */ - -/* - * Image trailer TLV types. - * - * Signature is generated by computing signature over the image hash. - * Currently the only image hash type is SHA256. - * - * Signature comes in the form of 2 TLVs. - * 1st on identifies the public key which should be used to verify it. - * 2nd one is the actual signature. - */ -#define IMAGE_TLV_KEYHASH 0x01 /* hash of the public key */ -#define IMAGE_TLV_PUBKEY 0x02 /* public key */ -#define IMAGE_TLV_SHA256 0x10 /* SHA256 of image hdr and body */ -#define IMAGE_TLV_RSA2048_PSS 0x20 /* RSA2048 of hash output */ -#define IMAGE_TLV_ECDSA224 0x21 /* ECDSA of hash output */ -#define IMAGE_TLV_ECDSA256 0x22 /* ECDSA of hash output */ -#define IMAGE_TLV_RSA3072_PSS 0x23 /* RSA3072 of hash output */ -#define IMAGE_TLV_ED25519 0x24 /* ed25519 of hash output */ -#define IMAGE_TLV_ENC_RSA2048 0x30 /* Key encrypted with RSA-OAEP-2048 */ -#define IMAGE_TLV_ENC_KW128 0x31 /* Key encrypted with AES-KW-128 */ -#define IMAGE_TLV_ENC_EC256 0x32 /* Key encrypted with ECIES-EC256 */ -#define IMAGE_TLV_ENC_X25519 0x33 /* Key encrypted with ECIES-X25519 */ -#define IMAGE_TLV_DEPENDENCY 0x40 /* Image depends on other image */ -#define IMAGE_TLV_SEC_CNT 0x50 /* security counter */ -#define IMAGE_TLV_BOOT_RECORD 0x60 /* measured boot record */ -#define IMAGE_TLV_ANY 0xffff /* Used to iterate over all TLV */ - -struct image_version { - uint8_t iv_major; - uint8_t iv_minor; - uint16_t iv_revision; - uint32_t iv_build_num; -}; - -struct image_dependency { - uint8_t image_id; /* Image index (from 0) */ - uint8_t _pad1; - uint16_t _pad2; - struct image_version image_min_version; /* Indicates at minimum which - * version of firmware must be - * available to satisfy compliance - */ -}; - -/** Image header. All fields are in little endian byte order. */ -struct image_header { - uint32_t ih_magic; - uint32_t ih_load_addr; - uint16_t ih_hdr_size; /* Size of image header (bytes). */ - uint16_t ih_protect_tlv_size; /* Size of protected TLV area (bytes). */ - uint32_t ih_img_size; /* Does not include header. */ - uint32_t ih_flags; /* IMAGE_F_[...]. */ - struct image_version ih_ver; - uint32_t _pad1; -}; - -/** Image TLV header. All fields in little endian. */ -struct image_tlv_info { - uint16_t it_magic; - uint16_t it_tlv_tot; /* size of TLV area (including tlv_info header) */ -}; - -/** Image trailer TLV format. All fields in little endian. */ -struct image_tlv { - uint16_t it_type; /* IMAGE_TLV_[...]. */ - uint16_t it_len; /* Data length (not including TLV header). */ -}; - -#define IS_ENCRYPTED(hdr) ((hdr)->ih_flags & IMAGE_F_ENCRYPTED) -#define MUST_DECRYPT(fap, idx, hdr) \ - ((fap)->fa_id == FLASH_AREA_IMAGE_SECONDARY(idx) && IS_ENCRYPTED(hdr)) - -_Static_assert(sizeof(struct image_header) == IMAGE_HEADER_SIZE, - "struct image_header not required size"); - -struct enc_key_data; -int bootutil_img_validate(struct enc_key_data *enc_state, int image_index, - struct image_header *hdr, - const struct flash_area *fap, - uint8_t *tmp_buf, uint32_t tmp_buf_sz, - uint8_t *seed, int seed_len, uint8_t *out_hash); - -struct image_tlv_iter { - const struct image_header *hdr; - const struct flash_area *fap; - uint16_t type; - bool prot; - uint32_t prot_end; - uint32_t tlv_off; - uint32_t tlv_end; -}; - -int bootutil_tlv_iter_begin(struct image_tlv_iter *it, - const struct image_header *hdr, - const struct flash_area *fap, uint16_t type, - bool prot); -int bootutil_tlv_iter_next(struct image_tlv_iter *it, uint32_t *off, - uint16_t *len, uint16_t *type); - -int32_t bootutil_get_img_security_cnt(struct image_header *hdr, - const struct flash_area *fap, - uint32_t *security_cnt); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/bootutil/include/bootutil/security_cnt.h b/mcuboot/boot/bootutil/include/bootutil/security_cnt.h deleted file mode 100644 index f9791cf09..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/security_cnt.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2019-2020, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef __SECURITY_CNT_H__ -#define __SECURITY_CNT_H__ - -/** - * @file security_cnt.h - * - * @note The interface must be implemented in a fail-safe way that is - * resistant to asynchronous power failures or it can use hardware - * counters that have this capability, if supported by the platform. - * When a counter incrementation was interrupted it must be able to - * continue the incrementation process or recover the previous consistent - * status of the counters. If the counters have reached a stable status - * (every counter incrementation operation has finished), from that point - * their value cannot decrease due to any kind of power failure. - * - * @note A security counter might be implemented using non-volatile OTP memory - * (i.e. fuses) in which case it is the responsibility of the platform - * code to map each possible security counter values onto the fuse bits - * as the direct usage of counter values can be costly / impractical. - */ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Initialises the security counters. - * - * @return 0 on success; nonzero on failure. - */ -int32_t boot_nv_security_counter_init(void); - -/** - * Reads the stored value of a given image's security counter. - * - * @param image_id Index of the image (from 0). - * @param security_cnt Pointer to store the security counter value. - * - * @return 0 on success; nonzero on failure. - */ -int32_t boot_nv_security_counter_get(uint32_t image_id, uint32_t *security_cnt); - -/** - * Updates the stored value of a given image's security counter with a new - * security counter value if the new one is greater. - * - * @param image_id Index of the image (from 0). - * @param img_security_cnt New security counter value. The new value must be - * between 0 and UINT32_MAX and it must be greater than - * or equal to the current security counter value. - * - * @return 0 on success; nonzero on failure. - */ -int32_t boot_nv_security_counter_update(uint32_t image_id, - uint32_t img_security_cnt); - -#ifdef __cplusplus -} -#endif - -#endif /* __SECURITY_CNT_H__ */ diff --git a/mcuboot/boot/bootutil/include/bootutil/sha256.h b/mcuboot/boot/bootutil/include/bootutil/sha256.h deleted file mode 100644 index f34d2b7a3..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/sha256.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2017-2019 Linaro LTD - * Copyright (c) 2017-2019 JUUL Labs - */ - -/* - * This module provides a thin abstraction over some of the crypto - * primitives to make it easier to swap out the used crypto library. - * - * At this point, there are two choices: MCUBOOT_USE_MBED_TLS, or - * MCUBOOT_USE_TINYCRYPT. It is a compile error there is not exactly - * one of these defined. - */ - -#ifndef __BOOTUTIL_CRYPTO_H_ -#define __BOOTUTIL_CRYPTO_H_ - -#include "mcuboot_config/mcuboot_config.h" - -#if (defined(MCUBOOT_USE_MBED_TLS) + \ - defined(MCUBOOT_USE_TINYCRYPT) + \ - defined(MCUBOOT_USE_CC310)) != 1 - #error "One crypto backend must be defined either CC310, MBED_TLS or TINYCRYPT" -#endif - -#ifdef MCUBOOT_USE_MBED_TLS - #include -#endif /* MCUBOOT_USE_MBED_TLS */ - -#ifdef MCUBOOT_USE_TINYCRYPT - #include -#endif /* MCUBOOT_USE_TINYCRYPT */ - -#ifdef MCUBOOT_USE_CC310 - #include -#endif /* MCUBOOT_USE_CC310 */ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef MCUBOOT_USE_MBED_TLS -typedef mbedtls_sha256_context bootutil_sha256_context; - -static inline void bootutil_sha256_init(bootutil_sha256_context *ctx) -{ - mbedtls_sha256_init(ctx); - (void)mbedtls_sha256_starts_ret(ctx, 0); -} - -static inline void bootutil_sha256_update(bootutil_sha256_context *ctx, - const void *data, - uint32_t data_len) -{ - (void)mbedtls_sha256_update_ret(ctx, data, data_len); -} - -static inline void bootutil_sha256_finish(bootutil_sha256_context *ctx, - uint8_t *output) -{ - (void)mbedtls_sha256_finish_ret(ctx, output); -} -#endif /* MCUBOOT_USE_MBED_TLS */ - -#ifdef MCUBOOT_USE_TINYCRYPT -typedef struct tc_sha256_state_struct bootutil_sha256_context; -static inline void bootutil_sha256_init(bootutil_sha256_context *ctx) -{ - tc_sha256_init(ctx); -} - -static inline void bootutil_sha256_update(bootutil_sha256_context *ctx, - const void *data, - uint32_t data_len) -{ - tc_sha256_update(ctx, data, data_len); -} - -static inline void bootutil_sha256_finish(bootutil_sha256_context *ctx, - uint8_t *output) -{ - tc_sha256_final(output, ctx); -} -#endif /* MCUBOOT_USE_TINYCRYPT */ - -#ifdef MCUBOOT_USE_CC310 -static inline void bootutil_sha256_init(bootutil_sha256_context *ctx) -{ - cc310_sha256_init(ctx); -} - -static inline void bootutil_sha256_update(bootutil_sha256_context *ctx, - const void *data, - uint32_t data_len) -{ - cc310_sha256_update(ctx, data, data_len); -} - -static inline void bootutil_sha256_finish(bootutil_sha256_context *ctx, - uint8_t *output) -{ - cc310_sha256_finalize(ctx, output); -} -#endif /* MCUBOOT_USE_CC310 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __BOOTUTIL_SIGN_KEY_H_ */ diff --git a/mcuboot/boot/bootutil/include/bootutil/sign_key.h b/mcuboot/boot/bootutil/include/bootutil/sign_key.h deleted file mode 100644 index 584a90a9e..000000000 --- a/mcuboot/boot/bootutil/include/bootutil/sign_key.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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 __BOOTUTIL_SIGN_KEY_H_ -#define __BOOTUTIL_SIGN_KEY_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef MCUBOOT_HW_KEY -struct bootutil_key { - const uint8_t *key; - const unsigned int *len; -}; - -extern const struct bootutil_key bootutil_keys[]; -#else -struct bootutil_key { - uint8_t *key; - unsigned int *len; -}; - -extern struct bootutil_key bootutil_keys[]; - -/** - * Retrieve the hash of the corresponding public key for image authentication. - * - * @param[in] image_index Index of the image to be authenticated. - * @param[out] public_key_hash Buffer to store the key-hash in. - * @param[in,out] key_hash_size As input the size of the buffer. As output - * the actual key-hash length. - * - * @return 0 on success; nonzero on failure. - */ -int boot_retrieve_public_key_hash(uint8_t image_index, - uint8_t *public_key_hash, - size_t *key_hash_size); -#endif /* !MCUBOOT_HW_KEY */ - -extern const int bootutil_key_cnt; - -#ifdef __cplusplus -} -#endif - -#endif /* __BOOTUTIL_SIGN_KEY_H_ */ diff --git a/mcuboot/boot/bootutil/pkg.yml b/mcuboot/boot/bootutil/pkg.yml deleted file mode 100644 index 531d6a268..000000000 --- a/mcuboot/boot/bootutil/pkg.yml +++ /dev/null @@ -1,61 +0,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. -# - -pkg.name: boot/bootutil -pkg.description: The bootutil library performs most of the functions of a boot loader. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - boot - - bootloader - -pkg.apis: - - bootloader - -pkg.cflags: - - "-DMCUBOOT_MYNEWT=1" - -pkg.cflags.BOOTUTIL_USE_MBED_TLS: - - '-DMBEDTLS_USER_CONFIG_FILE="mbedtls/config_mynewt.h"' - -pkg.deps: - - "@mcuboot/boot/mynewt/mcuboot_config" - - "@apache-mynewt-core/hw/hal" - - "@apache-mynewt-core/kernel/os" - - "@apache-mynewt-core/sys/defs" - - "@mcuboot/boot/mynewt/flash_map_backend" - -pkg.deps.BOOTUTIL_USE_MBED_TLS: - - "@apache-mynewt-core/crypto/mbedtls" - -pkg.deps.BOOTUTIL_USE_TINYCRYPT: - - "@mcuboot/ext/tinycrypt/lib" - - "@mcuboot/ext/mbedtls-asn1" - -pkg.deps.BOOTUTIL_SIGN_ED25519: - - "@mcuboot/ext/tinycrypt/lib" - - "@mcuboot/ext/tinycrypt-sha512/lib" - - "@mcuboot/ext/mbedtls-asn1" - - "@mcuboot/ext/fiat" - -pkg.deps.BOOTUTIL_ENCRYPT_X25519: - - "@mcuboot/ext/tinycrypt/lib" - - "@mcuboot/ext/tinycrypt-sha512/lib" - - "@mcuboot/ext/mbedtls-asn1" - - "@mcuboot/ext/fiat" diff --git a/mcuboot/boot/bootutil/src/boot_record.c b/mcuboot/boot/bootutil/src/boot_record.c deleted file mode 100644 index 04949728e..000000000 --- a/mcuboot/boot/bootutil/src/boot_record.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (c) 2018-2020 Arm Limited - * Copyright (c) 2020 Linaro Limited - * - * 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 -#include -#include -#include -#include -#include - -#include "mcuboot_config/mcuboot_config.h" - -#if defined(MCUBOOT_MEASURED_BOOT) || defined(MCUBOOT_DATA_SHARING) -#include "bootutil/boot_record.h" -#include "bootutil/boot_status.h" -#include "bootutil_priv.h" -#include "bootutil/image.h" -#include "flash_map_backend/flash_map_backend.h" - -/* Error codes for using the shared memory area. */ -#define SHARED_MEMORY_OK (0) -#define SHARED_MEMORY_OVERFLOW (1) -#define SHARED_MEMORY_OVERWRITE (2) -#define SHARED_MEMORY_GEN_ERROR (3) - -/** - * @var shared_memory_init_done - * - * @brief Indicates whether shared memory area was already initialized. - * - */ -static bool shared_memory_init_done; - -/** - * @brief Add a data item to the shared data area between bootloader and - * runtime SW - * - * @param[in] major_type TLV major type, identify consumer - * @param[in] minor_type TLV minor type, identify TLV type - * @param[in] size length of added data - * @param[in] data pointer to data - * - * @return 0 on success; nonzero on failure. - */ -static int -boot_add_data_to_shared_area(uint8_t major_type, - uint16_t minor_type, - size_t size, - const uint8_t *data) -{ - struct shared_data_tlv_entry tlv_entry = {0}; - struct shared_boot_data *boot_data; - uint16_t boot_data_size; - uintptr_t tlv_end, offset; - - boot_data = (struct shared_boot_data *)MCUBOOT_SHARED_DATA_BASE; - - /* Check whether first time to call this function. If does then initialise - * shared data area. - */ - if (!shared_memory_init_done) { - memset((void *)MCUBOOT_SHARED_DATA_BASE, 0, MCUBOOT_SHARED_DATA_SIZE); - boot_data->header.tlv_magic = SHARED_DATA_TLV_INFO_MAGIC; - boot_data->header.tlv_tot_len = SHARED_DATA_HEADER_SIZE; - shared_memory_init_done = true; - } - - /* Check whether TLV entry is already added. - * Get the boundaries of TLV section - */ - tlv_end = MCUBOOT_SHARED_DATA_BASE + boot_data->header.tlv_tot_len; - offset = MCUBOOT_SHARED_DATA_BASE + SHARED_DATA_HEADER_SIZE; - - /* Iterates over the TLV section looks for the same entry if found then - * returns with error: SHARED_MEMORY_OVERWRITE - */ - while (offset < tlv_end) { - /* Create local copy to avoid unaligned access */ - memcpy(&tlv_entry, (const void *)offset, SHARED_DATA_ENTRY_HEADER_SIZE); - if (GET_MAJOR(tlv_entry.tlv_type) == major_type && - GET_MINOR(tlv_entry.tlv_type) == minor_type) { - return SHARED_MEMORY_OVERWRITE; - } - - offset += SHARED_DATA_ENTRY_SIZE(tlv_entry.tlv_len); - } - - /* Add TLV entry */ - tlv_entry.tlv_type = SET_TLV_TYPE(major_type, minor_type); - tlv_entry.tlv_len = size; - - if (!boot_u16_safe_add(&boot_data_size, boot_data->header.tlv_tot_len, - SHARED_DATA_ENTRY_SIZE(size))) { - return SHARED_MEMORY_GEN_ERROR; - } - - /* Verify overflow of shared area */ - if (boot_data_size > MCUBOOT_SHARED_DATA_SIZE) { - return SHARED_MEMORY_OVERFLOW; - } - - offset = tlv_end; - memcpy((void *)offset, &tlv_entry, SHARED_DATA_ENTRY_HEADER_SIZE); - - offset += SHARED_DATA_ENTRY_HEADER_SIZE; - memcpy((void *)offset, data, size); - - boot_data->header.tlv_tot_len += SHARED_DATA_ENTRY_SIZE(size); - - return SHARED_MEMORY_OK; -} -#endif /* MCUBOOT_MEASURED_BOOT OR MCUBOOT_DATA_SHARING */ - -#ifdef MCUBOOT_MEASURED_BOOT -/* See in boot_record.h */ -int -boot_save_boot_status(uint8_t sw_module, - const struct image_header *hdr, - const struct flash_area *fap) -{ - - struct image_tlv_iter it; - uint32_t offset; - uint16_t len; - uint16_t type; - uint16_t ias_minor; - size_t record_len = 0; - uint8_t image_hash[32]; /* SHA256 - 32 Bytes */ - uint8_t buf[MAX_BOOT_RECORD_SZ]; - bool boot_record_found = false; - bool hash_found = false; - int rc; - - /* Manifest data is concatenated to the end of the image. - * It is encoded in TLV format. - */ - - rc = bootutil_tlv_iter_begin(&it, hdr, fap, IMAGE_TLV_ANY, false); - if (rc) { - return -1; - } - - /* Traverse through the TLV area to find the boot record - * and image hash TLVs. - */ - while (true) { - rc = bootutil_tlv_iter_next(&it, &offset, &len, &type); - if (rc < 0) { - return -1; - } else if (rc > 0) { - break; - } - - if (type == IMAGE_TLV_BOOT_RECORD) { - if (len > sizeof(buf)) { - return -1; - } - rc = flash_area_read(fap, offset, buf, len); - if (rc) { - return -1; - } - - record_len = len; - boot_record_found = true; - - } else if (type == IMAGE_TLV_SHA256) { - /* Get the image's hash value from the manifest section. */ - if (len > sizeof(image_hash)) { - return -1; - } - rc = flash_area_read(fap, offset, image_hash, len); - if (rc) { - return -1; - } - - hash_found = true; - - /* The boot record TLV is part of the protected TLV area which is - * located before the other parts of the TLV area (including the - * image hash) so at this point it is okay to break the loop - * as the boot record TLV should have already been found. - */ - break; - } - } - - - if (!boot_record_found || !hash_found) { - return -1; - } - - /* Update the measurement value (hash of the image) data item in the - * boot record. It is always the last item in the structure to make - * it easy to calculate its position. - * The image hash is computed over the image header, the image itself and - * the protected TLV area (which should already include the image hash as - * part of the boot record TLV). For this reason this field has been - * filled with zeros during the image signing process. - */ - offset = record_len - sizeof(image_hash); - /* The size of 'buf' has already been checked when - * the BOOT_RECORD TLV was read, it won't overflow. - */ - memcpy(buf + offset, image_hash, sizeof(image_hash)); - - /* Add the CBOR encoded boot record to the shared data area. */ - ias_minor = SET_IAS_MINOR(sw_module, SW_BOOT_RECORD); - rc = boot_add_data_to_shared_area(TLV_MAJOR_IAS, - ias_minor, - record_len, - buf); - if (rc != SHARED_MEMORY_OK) { - return rc; - } - - return 0; -} -#endif /* MCUBOOT_MEASURED_BOOT */ diff --git a/mcuboot/boot/bootutil/src/bootutil_misc.c b/mcuboot/boot/bootutil/src/bootutil_misc.c deleted file mode 100644 index c9562db12..000000000 --- a/mcuboot/boot/bootutil/src/bootutil_misc.c +++ /dev/null @@ -1,774 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2017-2019 Linaro LTD - * Copyright (c) 2016-2019 JUUL Labs - * Copyright (c) 2019 Arm Limited - * - * Original license: - * - * 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. - */ - -#include -#include -#include -#include - -#include "sysflash/sysflash.h" -#include "flash_map_backend/flash_map_backend.h" - -#include "bootutil/image.h" -#include "bootutil/bootutil.h" -#include "bootutil_priv.h" -#include "bootutil/bootutil_log.h" -#ifdef MCUBOOT_ENC_IMAGES -#include "bootutil/enc_key.h" -#endif - -MCUBOOT_LOG_MODULE_DECLARE(mcuboot); - -/* Currently only used by imgmgr */ -int boot_current_slot; - -const uint32_t boot_img_magic[] = { - 0xf395c277, - 0x7fefd260, - 0x0f505235, - 0x8079b62c, -}; - -#define BOOT_MAGIC_ARR_SZ \ - (sizeof boot_img_magic / sizeof boot_img_magic[0]) - -struct boot_swap_table { - uint8_t magic_primary_slot; - uint8_t magic_secondary_slot; - uint8_t image_ok_primary_slot; - uint8_t image_ok_secondary_slot; - uint8_t copy_done_primary_slot; - - uint8_t swap_type; -}; - -/** - * This set of tables maps image trailer contents to swap operation type. - * When searching for a match, these tables must be iterated sequentially. - * - * NOTE: the table order is very important. The settings in the secondary - * slot always are priority to the primary slot and should be located - * earlier in the table. - * - * The table lists only states where there is action needs to be taken by - * the bootloader, as in starting/finishing a swap operation. - */ -static const struct boot_swap_table boot_swap_tables[] = { - { - .magic_primary_slot = BOOT_MAGIC_ANY, - .magic_secondary_slot = BOOT_MAGIC_GOOD, - .image_ok_primary_slot = BOOT_FLAG_ANY, - .image_ok_secondary_slot = BOOT_FLAG_UNSET, - .copy_done_primary_slot = BOOT_FLAG_ANY, - .swap_type = BOOT_SWAP_TYPE_TEST, - }, - { - .magic_primary_slot = BOOT_MAGIC_ANY, - .magic_secondary_slot = BOOT_MAGIC_GOOD, - .image_ok_primary_slot = BOOT_FLAG_ANY, - .image_ok_secondary_slot = BOOT_FLAG_SET, - .copy_done_primary_slot = BOOT_FLAG_ANY, - .swap_type = BOOT_SWAP_TYPE_PERM, - }, - { - .magic_primary_slot = BOOT_MAGIC_GOOD, - .magic_secondary_slot = BOOT_MAGIC_UNSET, - .image_ok_primary_slot = BOOT_FLAG_UNSET, - .image_ok_secondary_slot = BOOT_FLAG_ANY, - .copy_done_primary_slot = BOOT_FLAG_SET, - .swap_type = BOOT_SWAP_TYPE_REVERT, - }, -}; - -#define BOOT_SWAP_TABLES_COUNT \ - (sizeof boot_swap_tables / sizeof boot_swap_tables[0]) - -static int -boot_magic_decode(const uint32_t *magic) -{ - if (memcmp(magic, boot_img_magic, BOOT_MAGIC_SZ) == 0) { - return BOOT_MAGIC_GOOD; - } - return BOOT_MAGIC_BAD; -} - -static int -boot_flag_decode(uint8_t flag) -{ - if (flag != BOOT_FLAG_SET) { - return BOOT_FLAG_BAD; - } - return BOOT_FLAG_SET; -} - -/** - * Determines if a status source table is satisfied by the specified magic - * code. - * - * @param tbl_val A magic field from a status source table. - * @param val The magic value in a trailer, encoded as a - * BOOT_MAGIC_[...]. - * - * @return 1 if the two values are compatible; - * 0 otherwise. - */ -int -boot_magic_compatible_check(uint8_t tbl_val, uint8_t val) -{ - switch (tbl_val) { - case BOOT_MAGIC_ANY: - return 1; - - case BOOT_MAGIC_NOTGOOD: - return val != BOOT_MAGIC_GOOD; - - default: - return tbl_val == val; - } -} - -uint32_t -boot_status_sz(uint32_t min_write_sz) -{ - return /* state for all sectors */ - BOOT_STATUS_MAX_ENTRIES * BOOT_STATUS_STATE_COUNT * min_write_sz; -} - -uint32_t -boot_trailer_sz(uint32_t min_write_sz) -{ - return /* state for all sectors */ - boot_status_sz(min_write_sz) + -#ifdef MCUBOOT_ENC_IMAGES - /* encryption keys */ -# if MCUBOOT_SWAP_SAVE_ENCTLV - BOOT_ENC_TLV_ALIGN_SIZE * 2 + -# else - BOOT_ENC_KEY_SIZE * 2 + -# endif -#endif - /* swap_type + copy_done + image_ok + swap_size */ - BOOT_MAX_ALIGN * 4 + - BOOT_MAGIC_SZ; -} - -int -boot_status_entries(int image_index, const struct flash_area *fap) -{ -#if MCUBOOT_SWAP_USING_SCRATCH - if (fap->fa_id == FLASH_AREA_IMAGE_SCRATCH) { - return BOOT_STATUS_STATE_COUNT; - } else -#endif - if (fap->fa_id == FLASH_AREA_IMAGE_PRIMARY(image_index) || - fap->fa_id == FLASH_AREA_IMAGE_SECONDARY(image_index)) { - return BOOT_STATUS_STATE_COUNT * BOOT_STATUS_MAX_ENTRIES; - } - return -1; -} - -uint32_t -boot_status_off(const struct flash_area *fap) -{ - uint32_t off_from_end; - uint8_t elem_sz; - - elem_sz = flash_area_align(fap); - - off_from_end = boot_trailer_sz(elem_sz); - - assert(off_from_end <= fap->fa_size); - return fap->fa_size - off_from_end; -} - -static inline uint32_t -boot_magic_off(const struct flash_area *fap) -{ - return fap->fa_size - BOOT_MAGIC_SZ; -} - -static inline uint32_t -boot_image_ok_off(const struct flash_area *fap) -{ - return boot_magic_off(fap) - BOOT_MAX_ALIGN; -} - -static inline uint32_t -boot_copy_done_off(const struct flash_area *fap) -{ - return boot_image_ok_off(fap) - BOOT_MAX_ALIGN; -} - -uint32_t -boot_swap_info_off(const struct flash_area *fap) -{ - return boot_copy_done_off(fap) - BOOT_MAX_ALIGN; -} - -static inline uint32_t -boot_swap_size_off(const struct flash_area *fap) -{ - return boot_swap_info_off(fap) - BOOT_MAX_ALIGN; -} - -#ifdef MCUBOOT_ENC_IMAGES -static inline uint32_t -boot_enc_key_off(const struct flash_area *fap, uint8_t slot) -{ -#if MCUBOOT_SWAP_SAVE_ENCTLV - return boot_swap_size_off(fap) - ((slot + 1) * - ((((BOOT_ENC_TLV_SIZE - 1) / BOOT_MAX_ALIGN) + 1) * BOOT_MAX_ALIGN)); -#else - return boot_swap_size_off(fap) - ((slot + 1) * BOOT_ENC_KEY_SIZE); -#endif -} -#endif - -int -boot_read_swap_state(const struct flash_area *fap, - struct boot_swap_state *state) -{ - uint32_t magic[BOOT_MAGIC_ARR_SZ]; - uint32_t off; - uint8_t swap_info; - int rc; - - off = boot_magic_off(fap); - rc = flash_area_read_is_empty(fap, off, magic, BOOT_MAGIC_SZ); - if (rc < 0) { - return BOOT_EFLASH; - } - if (rc == 1) { - state->magic = BOOT_MAGIC_UNSET; - } else { - state->magic = boot_magic_decode(magic); - } - - off = boot_swap_info_off(fap); - rc = flash_area_read_is_empty(fap, off, &swap_info, sizeof swap_info); - if (rc < 0) { - return BOOT_EFLASH; - } - - /* Extract the swap type and image number */ - state->swap_type = BOOT_GET_SWAP_TYPE(swap_info); - state->image_num = BOOT_GET_IMAGE_NUM(swap_info); - - if (rc == 1 || state->swap_type > BOOT_SWAP_TYPE_REVERT) { - state->swap_type = BOOT_SWAP_TYPE_NONE; - state->image_num = 0; - } - - off = boot_copy_done_off(fap); - rc = flash_area_read_is_empty(fap, off, &state->copy_done, - sizeof state->copy_done); - if (rc < 0) { - return BOOT_EFLASH; - } - if (rc == 1) { - state->copy_done = BOOT_FLAG_UNSET; - } else { - state->copy_done = boot_flag_decode(state->copy_done); - } - - off = boot_image_ok_off(fap); - rc = flash_area_read_is_empty(fap, off, &state->image_ok, - sizeof state->image_ok); - if (rc < 0) { - return BOOT_EFLASH; - } - if (rc == 1) { - state->image_ok = BOOT_FLAG_UNSET; - } else { - state->image_ok = boot_flag_decode(state->image_ok); - } - - return 0; -} - -/** - * Reads the image trailer from the scratch area. - */ -int -boot_read_swap_state_by_id(int flash_area_id, struct boot_swap_state *state) -{ - const struct flash_area *fap; - int rc; - - rc = flash_area_open(flash_area_id, &fap); - if (rc != 0) { - return BOOT_EFLASH; - } - - rc = boot_read_swap_state(fap, state); - flash_area_close(fap); - return rc; -} - -/** - * This functions tries to locate the status area after an aborted swap, - * by looking for the magic in the possible locations. - * - * If the magic is successfully found, a flash_area * is returned and it - * is the responsibility of the called to close it. - * - * @returns 0 on success, -1 on errors - */ -static int -boot_find_status(int image_index, const struct flash_area **fap) -{ - uint32_t magic[BOOT_MAGIC_ARR_SZ]; - uint32_t off; - uint8_t areas[2] = { -#if MCUBOOT_SWAP_USING_SCRATCH - FLASH_AREA_IMAGE_SCRATCH, -#endif - FLASH_AREA_IMAGE_PRIMARY(image_index), - }; - unsigned int i; - int rc; - - /* - * In the middle a swap, tries to locate the area that is currently - * storing a valid magic, first on the primary slot, then on scratch. - * Both "slots" can end up being temporary storage for a swap and it - * is assumed that if magic is valid then other metadata is too, - * because magic is always written in the last step. - */ - - for (i = 0; i < sizeof(areas) / sizeof(areas[0]); i++) { - rc = flash_area_open(areas[i], fap); - if (rc != 0) { - return rc; - } - - off = boot_magic_off(*fap); - rc = flash_area_read(*fap, off, magic, BOOT_MAGIC_SZ); - if (rc != 0) { - flash_area_close(*fap); - return rc; - } - - if (memcmp(magic, boot_img_magic, BOOT_MAGIC_SZ) == 0) { - return 0; - } - - flash_area_close(*fap); - } - - /* If we got here, no magic was found */ - return -1; -} - -int -boot_read_swap_size(int image_index, uint32_t *swap_size) -{ - uint32_t off; - const struct flash_area *fap; - int rc; - - rc = boot_find_status(image_index, &fap); - if (rc == 0) { - off = boot_swap_size_off(fap); - rc = flash_area_read(fap, off, swap_size, sizeof *swap_size); - flash_area_close(fap); - } - - return rc; -} - -#ifdef MCUBOOT_ENC_IMAGES -int -boot_read_enc_key(int image_index, uint8_t slot, struct boot_status *bs) -{ - uint32_t off; - const struct flash_area *fap; -#if MCUBOOT_SWAP_SAVE_ENCTLV - int i; -#endif - int rc; - - rc = boot_find_status(image_index, &fap); - if (rc == 0) { - off = boot_enc_key_off(fap, slot); -#if MCUBOOT_SWAP_SAVE_ENCTLV - rc = flash_area_read(fap, off, bs->enctlv[slot], BOOT_ENC_TLV_ALIGN_SIZE); - if (rc == 0) { - for (i = 0; i < BOOT_ENC_TLV_ALIGN_SIZE; i++) { - if (bs->enctlv[slot][i] != 0xff) { - break; - } - } - /* Only try to decrypt non-erased TLV metadata */ - if (i != BOOT_ENC_TLV_ALIGN_SIZE) { - rc = boot_enc_decrypt(bs->enctlv[slot], bs->enckey[slot]); - } - } -#else - rc = flash_area_read(fap, off, bs->enckey[slot], BOOT_ENC_KEY_SIZE); -#endif - flash_area_close(fap); - } - - return rc; -} -#endif - -int -boot_write_magic(const struct flash_area *fap) -{ - uint32_t off; - int rc; - - off = boot_magic_off(fap); - - BOOT_LOG_DBG("writing magic; fa_id=%d off=0x%lx (0x%lx)", - fap->fa_id, (unsigned long)off, - (unsigned long)(fap->fa_off + off)); - rc = flash_area_write(fap, off, boot_img_magic, BOOT_MAGIC_SZ); - if (rc != 0) { - return BOOT_EFLASH; - } - - return 0; -} - -/** - * Write trailer data; status bytes, swap_size, etc - * - * @returns 0 on success, != 0 on error. - */ -static int -boot_write_trailer(const struct flash_area *fap, uint32_t off, - const uint8_t *inbuf, uint8_t inlen) -{ - uint8_t buf[BOOT_MAX_ALIGN]; - uint8_t align; - uint8_t erased_val; - int rc; - - align = flash_area_align(fap); - if (inlen > BOOT_MAX_ALIGN || align > BOOT_MAX_ALIGN) { - return -1; - } - erased_val = flash_area_erased_val(fap); - if (align < inlen) { - align = inlen; - } - memcpy(buf, inbuf, inlen); - memset(&buf[inlen], erased_val, align - inlen); - - rc = flash_area_write(fap, off, buf, align); - if (rc != 0) { - return BOOT_EFLASH; - } - - return 0; -} - -static int -boot_write_trailer_flag(const struct flash_area *fap, uint32_t off, - uint8_t flag_val) -{ - const uint8_t buf[1] = { flag_val }; - return boot_write_trailer(fap, off, buf, 1); -} - -int -boot_write_copy_done(const struct flash_area *fap) -{ - uint32_t off; - - off = boot_copy_done_off(fap); - BOOT_LOG_DBG("writing copy_done; fa_id=%d off=0x%lx (0x%lx)", - fap->fa_id, (unsigned long)off, - (unsigned long)(fap->fa_off + off)); - return boot_write_trailer_flag(fap, off, BOOT_FLAG_SET); -} - -int -boot_write_image_ok(const struct flash_area *fap) -{ - uint32_t off; - - off = boot_image_ok_off(fap); - BOOT_LOG_DBG("writing image_ok; fa_id=%d off=0x%lx (0x%lx)", - fap->fa_id, (unsigned long)off, - (unsigned long)(fap->fa_off + off)); - return boot_write_trailer_flag(fap, off, BOOT_FLAG_SET); -} - -/** - * Writes the specified value to the `swap-type` field of an image trailer. - * This value is persisted so that the boot loader knows what swap operation to - * resume in case of an unexpected reset. - */ -int -boot_write_swap_info(const struct flash_area *fap, uint8_t swap_type, - uint8_t image_num) -{ - uint32_t off; - uint8_t swap_info; - - BOOT_SET_SWAP_INFO(swap_info, image_num, swap_type); - off = boot_swap_info_off(fap); - BOOT_LOG_DBG("writing swap_info; fa_id=%d off=0x%lx (0x%lx), swap_type=0x%x" - " image_num=0x%x", - fap->fa_id, (unsigned long)off, - (unsigned long)(fap->fa_off + off), swap_type, image_num); - return boot_write_trailer(fap, off, (const uint8_t *) &swap_info, 1); -} - -int -boot_write_swap_size(const struct flash_area *fap, uint32_t swap_size) -{ - uint32_t off; - - off = boot_swap_size_off(fap); - BOOT_LOG_DBG("writing swap_size; fa_id=%d off=0x%lx (0x%lx)", - fap->fa_id, (unsigned long)off, - (unsigned long)fap->fa_off + off); - return boot_write_trailer(fap, off, (const uint8_t *) &swap_size, 4); -} - -#ifdef MCUBOOT_ENC_IMAGES -int -boot_write_enc_key(const struct flash_area *fap, uint8_t slot, - const struct boot_status *bs) -{ - uint32_t off; - int rc; - - off = boot_enc_key_off(fap, slot); - BOOT_LOG_DBG("writing enc_key; fa_id=%d off=0x%lx (0x%lx)", - fap->fa_id, (unsigned long)off, - (unsigned long)fap->fa_off + off); -#if MCUBOOT_SWAP_SAVE_ENCTLV - rc = flash_area_write(fap, off, bs->enctlv[slot], BOOT_ENC_TLV_ALIGN_SIZE); -#else - rc = flash_area_write(fap, off, bs->enckey[slot], BOOT_ENC_KEY_SIZE); -#endif - if (rc != 0) { - return BOOT_EFLASH; - } - - return 0; -} -#endif - -int -boot_swap_type_multi(int image_index) -{ - const struct boot_swap_table *table; - struct boot_swap_state primary_slot; - struct boot_swap_state secondary_slot; - int rc; - size_t i; - - rc = boot_read_swap_state_by_id(FLASH_AREA_IMAGE_PRIMARY(image_index), - &primary_slot); - if (rc) { - return BOOT_SWAP_TYPE_PANIC; - } - - rc = boot_read_swap_state_by_id(FLASH_AREA_IMAGE_SECONDARY(image_index), - &secondary_slot); - if (rc) { - return BOOT_SWAP_TYPE_PANIC; - } - - for (i = 0; i < BOOT_SWAP_TABLES_COUNT; i++) { - table = boot_swap_tables + i; - - if (boot_magic_compatible_check(table->magic_primary_slot, - primary_slot.magic) && - boot_magic_compatible_check(table->magic_secondary_slot, - secondary_slot.magic) && - (table->image_ok_primary_slot == BOOT_FLAG_ANY || - table->image_ok_primary_slot == primary_slot.image_ok) && - (table->image_ok_secondary_slot == BOOT_FLAG_ANY || - table->image_ok_secondary_slot == secondary_slot.image_ok) && - (table->copy_done_primary_slot == BOOT_FLAG_ANY || - table->copy_done_primary_slot == primary_slot.copy_done)) { - BOOT_LOG_INF("Swap type: %s", - table->swap_type == BOOT_SWAP_TYPE_TEST ? "test" : - table->swap_type == BOOT_SWAP_TYPE_PERM ? "perm" : - table->swap_type == BOOT_SWAP_TYPE_REVERT ? "revert" : - "BUG; can't happen"); - if (table->swap_type != BOOT_SWAP_TYPE_TEST && - table->swap_type != BOOT_SWAP_TYPE_PERM && - table->swap_type != BOOT_SWAP_TYPE_REVERT) { - return BOOT_SWAP_TYPE_PANIC; - } - return table->swap_type; - } - } - - BOOT_LOG_INF("Swap type: none"); - return BOOT_SWAP_TYPE_NONE; -} - -/* - * This function is not used by the bootloader itself, but its required API - * by external tooling like mcumgr. - */ -int -boot_swap_type(void) -{ - return boot_swap_type_multi(0); -} - -/** - * Marks the image in the secondary slot as pending. On the next reboot, - * the system will perform a one-time boot of the the secondary slot image. - * - * @param permanent Whether the image should be used permanently or - * only tested once: - * 0=run image once, then confirm or revert. - * 1=run image forever. - * - * @return 0 on success; nonzero on failure. - */ -int -boot_set_pending(int permanent) -{ - const struct flash_area *fap; - struct boot_swap_state state_secondary_slot; - uint8_t swap_type; - int rc; - - rc = boot_read_swap_state_by_id(FLASH_AREA_IMAGE_SECONDARY(0), - &state_secondary_slot); - if (rc != 0) { - return rc; - } - - switch (state_secondary_slot.magic) { - case BOOT_MAGIC_GOOD: - /* Swap already scheduled. */ - return 0; - - case BOOT_MAGIC_UNSET: - rc = flash_area_open(FLASH_AREA_IMAGE_SECONDARY(0), &fap); - if (rc != 0) { - rc = BOOT_EFLASH; - } else { - rc = boot_write_magic(fap); - } - - if (rc == 0 && permanent) { - rc = boot_write_image_ok(fap); - } - - if (rc == 0) { - if (permanent) { - swap_type = BOOT_SWAP_TYPE_PERM; - } else { - swap_type = BOOT_SWAP_TYPE_TEST; - } - rc = boot_write_swap_info(fap, swap_type, 0); - } - - flash_area_close(fap); - return rc; - - case BOOT_MAGIC_BAD: - /* The image slot is corrupt. There is no way to recover, so erase the - * slot to allow future upgrades. - */ - rc = flash_area_open(FLASH_AREA_IMAGE_SECONDARY(0), &fap); - if (rc != 0) { - return BOOT_EFLASH; - } - - flash_area_erase(fap, 0, fap->fa_size); - flash_area_close(fap); - return BOOT_EBADIMAGE; - - default: - assert(0); - return BOOT_EBADIMAGE; - } -} - -/** - * Marks the image in the primary slot as confirmed. The system will continue - * booting into the image in the primary slot until told to boot from a - * different slot. - * - * @return 0 on success; nonzero on failure. - */ -int -boot_set_confirmed(void) -{ - const struct flash_area *fap; - struct boot_swap_state state_primary_slot; - int rc; - - rc = boot_read_swap_state_by_id(FLASH_AREA_IMAGE_PRIMARY(0), - &state_primary_slot); - if (rc != 0) { - return rc; - } - - switch (state_primary_slot.magic) { - case BOOT_MAGIC_GOOD: - /* Confirm needed; proceed. */ - break; - - case BOOT_MAGIC_UNSET: - /* Already confirmed. */ - return 0; - - case BOOT_MAGIC_BAD: - /* Unexpected state. */ - return BOOT_EBADVECT; - } - - rc = flash_area_open(FLASH_AREA_IMAGE_PRIMARY(0), &fap); - if (rc) { - rc = BOOT_EFLASH; - goto done; - } - - if (state_primary_slot.copy_done == BOOT_FLAG_UNSET) { - /* Swap never completed. This is unexpected. */ - rc = BOOT_EBADVECT; - goto done; - } - - if (state_primary_slot.image_ok != BOOT_FLAG_UNSET) { - /* Already confirmed. */ - goto done; - } - - rc = boot_write_image_ok(fap); - -done: - flash_area_close(fap); - return rc; -} diff --git a/mcuboot/boot/bootutil/src/bootutil_priv.h b/mcuboot/boot/bootutil/src/bootutil_priv.h deleted file mode 100644 index cd33f76f5..000000000 --- a/mcuboot/boot/bootutil/src/bootutil_priv.h +++ /dev/null @@ -1,421 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2017-2020 Linaro LTD - * Copyright (c) 2017-2019 JUUL Labs - * Copyright (c) 2019 Arm Limited - * - * Original license: - * - * 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 H_BOOTUTIL_PRIV_ -#define H_BOOTUTIL_PRIV_ - -#include "sysflash/sysflash.h" - -#include - -#include "bootutil/bootutil.h" -#include "bootutil/image.h" -#include "mcuboot_config/mcuboot_config.h" - -#ifdef MCUBOOT_ENC_IMAGES -#include "bootutil/enc_key.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef MCUBOOT_HAVE_ASSERT_H -#include "mcuboot_config/mcuboot_assert.h" -#else -#define ASSERT assert -#endif - -struct flash_area; - -#define BOOT_EFLASH 1 -#define BOOT_EFILE 2 -#define BOOT_EBADIMAGE 3 -#define BOOT_EBADVECT 4 -#define BOOT_EBADSTATUS 5 -#define BOOT_ENOMEM 6 -#define BOOT_EBADARGS 7 -#define BOOT_EBADVERSION 8 - -#define BOOT_TMPBUF_SZ 256 - -/** Number of image slots in flash; currently limited to two. */ -#define BOOT_NUM_SLOTS 2 - -#if defined(MCUBOOT_OVERWRITE_ONLY) && defined(MCUBOOT_SWAP_USING_MOVE) -#error "Please enable only one of MCUBOOT_OVERWRITE_ONLY or MCUBOOT_SWAP_USING_MOVE" -#endif - -#if !defined(MCUBOOT_OVERWRITE_ONLY) && !defined(MCUBOOT_SWAP_USING_MOVE) -#define MCUBOOT_SWAP_USING_SCRATCH 1 -#endif - -#define BOOT_STATUS_OP_MOVE 1 -#define BOOT_STATUS_OP_SWAP 2 - -/* - * Maintain state of copy progress. - */ -struct boot_status { - uint32_t idx; /* Which area we're operating on */ - uint8_t state; /* Which part of the swapping process are we at */ - uint8_t op; /* What operation are we performing? */ - uint8_t use_scratch; /* Are status bytes ever written to scratch? */ - uint8_t swap_type; /* The type of swap in effect */ - uint32_t swap_size; /* Total size of swapped image */ -#ifdef MCUBOOT_ENC_IMAGES - uint8_t enckey[BOOT_NUM_SLOTS][BOOT_ENC_KEY_SIZE]; -#if MCUBOOT_SWAP_SAVE_ENCTLV - uint8_t enctlv[BOOT_NUM_SLOTS][BOOT_ENC_TLV_ALIGN_SIZE]; -#endif -#endif - int source; /* Which slot contains swap status metadata */ -}; - -#define BOOT_MAGIC_GOOD 1 -#define BOOT_MAGIC_BAD 2 -#define BOOT_MAGIC_UNSET 3 -#define BOOT_MAGIC_ANY 4 /* NOTE: control only, not dependent on sector */ -#define BOOT_MAGIC_NOTGOOD 5 /* NOTE: control only, not dependent on sector */ - -/* - * NOTE: leave BOOT_FLAG_SET equal to one, this is written to flash! - */ -#define BOOT_FLAG_SET 1 -#define BOOT_FLAG_BAD 2 -#define BOOT_FLAG_UNSET 3 -#define BOOT_FLAG_ANY 4 /* NOTE: control only, not dependent on sector */ - -#define BOOT_STATUS_IDX_0 1 - -#define BOOT_STATUS_STATE_0 1 -#define BOOT_STATUS_STATE_1 2 -#define BOOT_STATUS_STATE_2 3 - -/** - * End-of-image slot structure. - * - * 0 1 2 3 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * ~ ~ - * ~ Swap status (BOOT_MAX_IMG_SECTORS * min-write-size * 3) ~ - * ~ ~ - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Encryption key 0 (16 octets) [*] | - * | | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Encryption key 1 (16 octets) [*] | - * | | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Swap size (4 octets) | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Swap info | 0xff padding (7 octets) | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Copy done | 0xff padding (7 octets) | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Image OK | 0xff padding (7 octets) | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | MAGIC (16 octets) | - * | | - * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * - * [*]: Only present if the encryption option is enabled - * (`MCUBOOT_ENC_IMAGES`). - */ - -extern const uint32_t boot_img_magic[4]; - -struct boot_swap_state { - uint8_t magic; /* One of the BOOT_MAGIC_[...] values. */ - uint8_t swap_type; /* One of the BOOT_SWAP_TYPE_[...] values. */ - uint8_t copy_done; /* One of the BOOT_FLAG_[...] values. */ - uint8_t image_ok; /* One of the BOOT_FLAG_[...] values. */ - uint8_t image_num; /* Boot status belongs to this image */ -}; - -#ifdef MCUBOOT_IMAGE_NUMBER -#define BOOT_IMAGE_NUMBER MCUBOOT_IMAGE_NUMBER -#else -#define BOOT_IMAGE_NUMBER 1 -#endif - -_Static_assert(BOOT_IMAGE_NUMBER > 0, "Invalid value for BOOT_IMAGE_NUMBER"); - -#define BOOT_MAX_IMG_SECTORS MCUBOOT_MAX_IMG_SECTORS - -/* - * Extract the swap type and image number from image trailers's swap_info - * filed. - */ -#define BOOT_GET_SWAP_TYPE(swap_info) ((swap_info) & 0x0F) -#define BOOT_GET_IMAGE_NUM(swap_info) ((swap_info) >> 4) - -/* Construct the swap_info field from swap type and image number */ -#define BOOT_SET_SWAP_INFO(swap_info, image, type) { \ - assert((image) < 0xF); \ - assert((type) < 0xF); \ - (swap_info) = (image) << 4 \ - | (type); \ - } - -/* - * The current flashmap API does not check the amount of space allocated when - * loading sector data from the flash device, allowing for smaller counts here - * would most surely incur in overruns. - * - * TODO: make flashmap API receive the current sector array size. - */ -#if BOOT_MAX_IMG_SECTORS < 32 -#error "Too few sectors, please increase BOOT_MAX_IMG_SECTORS to at least 32" -#endif - -#if MCUBOOT_SWAP_USING_MOVE -#define BOOT_STATUS_MOVE_STATE_COUNT 1 -#define BOOT_STATUS_SWAP_STATE_COUNT 2 -#define BOOT_STATUS_STATE_COUNT (BOOT_STATUS_MOVE_STATE_COUNT + BOOT_STATUS_SWAP_STATE_COUNT) -#else -#define BOOT_STATUS_STATE_COUNT 3 -#endif - -/** Maximum number of image sectors supported by the bootloader. */ -#define BOOT_STATUS_MAX_ENTRIES BOOT_MAX_IMG_SECTORS - -#define BOOT_PRIMARY_SLOT 0 -#define BOOT_SECONDARY_SLOT 1 - -#define BOOT_STATUS_SOURCE_NONE 0 -#define BOOT_STATUS_SOURCE_SCRATCH 1 -#define BOOT_STATUS_SOURCE_PRIMARY_SLOT 2 - -#define BOOT_MAGIC_SZ (sizeof boot_img_magic) - -/** - * Compatibility shim for flash sector type. - * - * This can be deleted when flash_area_to_sectors() is removed. - */ -#ifdef MCUBOOT_USE_FLASH_AREA_GET_SECTORS -typedef struct flash_sector boot_sector_t; -#else -typedef struct flash_area boot_sector_t; -#endif - -/** Private state maintained during boot. */ -struct boot_loader_state { - struct { - struct image_header hdr; - const struct flash_area *area; - boot_sector_t *sectors; - size_t num_sectors; - } imgs[BOOT_IMAGE_NUMBER][BOOT_NUM_SLOTS]; - -#if MCUBOOT_SWAP_USING_SCRATCH - struct { - const struct flash_area *area; - boot_sector_t *sectors; - size_t num_sectors; - } scratch; -#endif - - uint8_t swap_type[BOOT_IMAGE_NUMBER]; - uint32_t write_sz; - -#if defined(MCUBOOT_ENC_IMAGES) - struct enc_key_data enc[BOOT_IMAGE_NUMBER][BOOT_NUM_SLOTS]; -#endif - -#if (BOOT_IMAGE_NUMBER > 1) - uint8_t curr_img_idx; -#endif -}; - -int bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, - size_t slen, uint8_t key_id); - -int boot_magic_compatible_check(uint8_t tbl_val, uint8_t val); -uint32_t boot_status_sz(uint32_t min_write_sz); -uint32_t boot_trailer_sz(uint32_t min_write_sz); -int boot_status_entries(int image_index, const struct flash_area *fap); -uint32_t boot_status_off(const struct flash_area *fap); -uint32_t boot_swap_info_off(const struct flash_area *fap); -int boot_read_swap_state(const struct flash_area *fap, - struct boot_swap_state *state); -int boot_read_swap_state_by_id(int flash_area_id, - struct boot_swap_state *state); -int boot_write_magic(const struct flash_area *fap); -int boot_write_status(const struct boot_loader_state *state, struct boot_status *bs); -int boot_write_copy_done(const struct flash_area *fap); -int boot_write_image_ok(const struct flash_area *fap); -int boot_write_swap_info(const struct flash_area *fap, uint8_t swap_type, - uint8_t image_num); -int boot_write_swap_size(const struct flash_area *fap, uint32_t swap_size); -int boot_read_swap_size(int image_index, uint32_t *swap_size); -int boot_slots_compatible(struct boot_loader_state *state); -uint32_t boot_status_internal_off(const struct boot_status *bs, int elem_sz); -int boot_read_image_header(struct boot_loader_state *state, int slot, - struct image_header *out_hdr, struct boot_status *bs); -int boot_copy_region(struct boot_loader_state *state, - const struct flash_area *fap_src, - const struct flash_area *fap_dst, - uint32_t off_src, uint32_t off_dst, uint32_t sz); -int boot_erase_region(const struct flash_area *fap, uint32_t off, uint32_t sz); -bool boot_status_is_reset(const struct boot_status *bs); - -#ifdef MCUBOOT_ENC_IMAGES -int boot_write_enc_key(const struct flash_area *fap, uint8_t slot, - const struct boot_status *bs); -int boot_read_enc_key(int image_index, uint8_t slot, struct boot_status *bs); -#endif - -/** - * Safe (non-overflowing) uint32_t addition. Returns true, and stores - * the result in *dest if it can be done without overflow. Otherwise, - * returns false. - */ -static inline bool boot_u32_safe_add(uint32_t *dest, uint32_t a, uint32_t b) -{ - /* - * "a + b <= UINT32_MAX", subtract 'b' from both sides to avoid - * the overflow. - */ - if (a > UINT32_MAX - b) { - return false; - } else { - *dest = a + b; - return true; - } -} - -/** - * Safe (non-overflowing) uint16_t addition. Returns true, and stores - * the result in *dest if it can be done without overflow. Otherwise, - * returns false. - */ -static inline bool boot_u16_safe_add(uint16_t *dest, uint16_t a, uint16_t b) -{ - uint32_t tmp = a + b; - if (tmp > UINT16_MAX) { - return false; - } else { - *dest = tmp; - return true; - } -} - -/* - * Accessors for the contents of struct boot_loader_state. - */ - -/* These are macros so they can be used as lvalues. */ -#if (BOOT_IMAGE_NUMBER > 1) -#define BOOT_CURR_IMG(state) ((state)->curr_img_idx) -#else -#define BOOT_CURR_IMG(state) 0 -#endif -#ifdef MCUBOOT_ENC_IMAGES -#define BOOT_CURR_ENC(state) ((state)->enc[BOOT_CURR_IMG(state)]) -#else -#define BOOT_CURR_ENC(state) NULL -#endif -#define BOOT_IMG(state, slot) ((state)->imgs[BOOT_CURR_IMG(state)][(slot)]) -#define BOOT_IMG_AREA(state, slot) (BOOT_IMG(state, slot).area) -#define BOOT_WRITE_SZ(state) ((state)->write_sz) -#define BOOT_SWAP_TYPE(state) ((state)->swap_type[BOOT_CURR_IMG(state)]) -#define BOOT_TLV_OFF(hdr) ((hdr)->ih_hdr_size + (hdr)->ih_img_size) - -#define BOOT_IS_UPGRADE(swap_type) \ - (((swap_type) == BOOT_SWAP_TYPE_TEST) || \ - ((swap_type) == BOOT_SWAP_TYPE_REVERT) || \ - ((swap_type) == BOOT_SWAP_TYPE_PERM)) - -static inline struct image_header* -boot_img_hdr(struct boot_loader_state *state, size_t slot) -{ - return &BOOT_IMG(state, slot).hdr; -} - -static inline size_t -boot_img_num_sectors(const struct boot_loader_state *state, size_t slot) -{ - return BOOT_IMG(state, slot).num_sectors; -} - -/* - * Offset of the slot from the beginning of the flash device. - */ -static inline uint32_t -boot_img_slot_off(struct boot_loader_state *state, size_t slot) -{ - return BOOT_IMG(state, slot).area->fa_off; -} - -#ifndef MCUBOOT_USE_FLASH_AREA_GET_SECTORS - -static inline size_t -boot_img_sector_size(const struct boot_loader_state *state, - size_t slot, size_t sector) -{ - return BOOT_IMG(state, slot).sectors[sector].fa_size; -} - -/* - * Offset of the sector from the beginning of the image, NOT the flash - * device. - */ -static inline uint32_t -boot_img_sector_off(const struct boot_loader_state *state, size_t slot, - size_t sector) -{ - return BOOT_IMG(state, slot).sectors[sector].fa_off - - BOOT_IMG(state, slot).sectors[0].fa_off; -} - -#else /* defined(MCUBOOT_USE_FLASH_AREA_GET_SECTORS) */ - -static inline size_t -boot_img_sector_size(const struct boot_loader_state *state, - size_t slot, size_t sector) -{ - return BOOT_IMG(state, slot).sectors[sector].fs_size; -} - -static inline uint32_t -boot_img_sector_off(const struct boot_loader_state *state, size_t slot, - size_t sector) -{ - return BOOT_IMG(state, slot).sectors[sector].fs_off - - BOOT_IMG(state, slot).sectors[0].fs_off; -} - -#endif /* !defined(MCUBOOT_USE_FLASH_AREA_GET_SECTORS) */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/bootutil/src/caps.c b/mcuboot/boot/bootutil/src/caps.c deleted file mode 100644 index 56b57915a..000000000 --- a/mcuboot/boot/bootutil/src/caps.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2017 Linaro Limited - * - * 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 -#include "mcuboot_config/mcuboot_config.h" - -uint32_t bootutil_get_caps(void) -{ - uint32_t res = 0; - -#if defined(MCUBOOT_SIGN_RSA) -#if MCUBOOT_SIGN_RSA_LEN == 2048 - res |= BOOTUTIL_CAP_RSA2048; -#endif -#if MCUBOOT_SIGN_RSA_LEN == 3072 - res |= BOOTUTIL_CAP_RSA3072; -#endif -#endif -#if defined(MCUBOOT_SIGN_EC) - res |= BOOTUTIL_CAP_ECDSA_P224; -#endif -#if defined(MCUBOOT_SIGN_EC256) - res |= BOOTUTIL_CAP_ECDSA_P256; -#endif -#if defined(MCUBOOT_SIGN_ED25519) - res |= BOOTUTIL_CAP_ED25519; -#endif -#if defined(MCUBOOT_OVERWRITE_ONLY) - res |= BOOTUTIL_CAP_OVERWRITE_UPGRADE; -#elif defined(MCUBOOT_SWAP_USING_MOVE) - res |= BOOTUTIL_CAP_SWAP_USING_MOVE; -#else - res |= BOOTUTIL_CAP_SWAP_USING_SCRATCH; -#endif -#if defined(MCUBOOT_ENCRYPT_RSA) - res |= BOOTUTIL_CAP_ENC_RSA; -#endif -#if defined(MCUBOOT_ENCRYPT_KW) - res |= BOOTUTIL_CAP_ENC_KW; -#endif -#if defined(MCUBOOT_ENCRYPT_EC256) - res |= BOOTUTIL_CAP_ENC_EC256; -#endif -#if defined(MCUBOOT_ENCRYPT_X25519) - res |= BOOTUTIL_CAP_ENC_X25519; -#endif -#if defined(MCUBOOT_VALIDATE_PRIMARY_SLOT) - res |= BOOTUTIL_CAP_VALIDATE_PRIMARY_SLOT; -#endif -#if defined(MCUBOOT_DOWNGRADE_PREVENTION) - res |= BOOTUTIL_CAP_DOWNGRADE_PREVENTION; -#endif - - return res; -} - -uint32_t bootutil_get_num_images(void) -{ -#if defined(MCUBOOT_IMAGE_NUMBER) - return MCUBOOT_IMAGE_NUMBER; -#else - return 1; -#endif -} diff --git a/mcuboot/boot/bootutil/src/encrypted.c b/mcuboot/boot/bootutil/src/encrypted.c deleted file mode 100644 index 6104397de..000000000 --- a/mcuboot/boot/bootutil/src/encrypted.c +++ /dev/null @@ -1,799 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2018-2019 JUUL Labs - * Copyright (c) 2019 Arm Limited - */ - -#include "mcuboot_config/mcuboot_config.h" - -#if defined(MCUBOOT_ENC_IMAGES) -#include -#include -#include -#include -#include - -#include "hal/hal_flash.h" - -#if defined(MCUBOOT_ENCRYPT_RSA) -#include "mbedtls/rsa.h" -#include "mbedtls/rsa_internal.h" -#include "mbedtls/asn1.h" -#endif - -#if defined(MCUBOOT_ENCRYPT_KW) -# if defined(MCUBOOT_USE_MBED_TLS) -# include "mbedtls/nist_kw.h" -# include "mbedtls/aes.h" -# else -# include "tinycrypt/aes.h" -# endif -#endif - -#if defined(MCUBOOT_ENCRYPT_EC256) -#include "tinycrypt/ecc.h" -#include "tinycrypt/ecc_dh.h" -#endif - -#if defined(MCUBOOT_ENCRYPT_EC256) || defined(MCUBOOT_ENCRYPT_X25519) -#include "tinycrypt/utils.h" -#include "tinycrypt/constants.h" -#include "tinycrypt/ctr_mode.h" -#include "tinycrypt/hmac.h" -#include "mbedtls/oid.h" -#include "mbedtls/asn1.h" -#endif - -#include "bootutil/image.h" -#include "bootutil/enc_key.h" -#include "bootutil/sign_key.h" - -#include "bootutil_priv.h" - -#if defined(MCUBOOT_ENCRYPT_KW) -#if defined(MCUBOOT_USE_MBED_TLS) -static int -key_unwrap(const uint8_t *wrapped, uint8_t *enckey) -{ - mbedtls_nist_kw_context kw; - int rc; - size_t olen; - - mbedtls_nist_kw_init(&kw); - - rc = mbedtls_nist_kw_setkey(&kw, MBEDTLS_CIPHER_ID_AES, - bootutil_enc_key.key, *bootutil_enc_key.len * 8, 0); - if (rc) { - goto done; - } - - rc = mbedtls_nist_kw_unwrap(&kw, MBEDTLS_KW_MODE_KW, wrapped, TLV_ENC_KW_SZ, - enckey, &olen, BOOT_ENC_KEY_SIZE); - -done: - mbedtls_nist_kw_free(&kw); - return rc; -} -#else /* !MCUBOOT_USE_MBED_TLS */ -/* - * Implements AES key unwrapping following RFC-3394 section 2.2.2, using - * tinycrypt for AES-128 decryption. - */ -static int -key_unwrap(const uint8_t *wrapped, uint8_t *enckey) -{ - struct tc_aes_key_sched_struct aes; - uint8_t A[8]; - uint8_t B[16]; - int8_t i, j, k; - - if (tc_aes128_set_decrypt_key(&aes, bootutil_enc_key.key) == 0) { - return -1; - } - - for (k = 0; k < 8; k++) { - A[k] = wrapped[k]; - enckey[k] = wrapped[8 + k]; - enckey[8 + k] = wrapped[16 + k]; - } - - for (j = 5; j >= 0; j--) { - for (i = 2; i > 0; i--) { - for (k = 0; k < 8; k++) { - B[k] = A[k]; - B[8 + k] = enckey[((i-1) * 8) + k]; - } - B[7] ^= 2 * j + i; - if (tc_aes_decrypt((uint8_t *)&B, (uint8_t *)&B, &aes) == 0) { - return -1; - } - for (k = 0; k < 8; k++) { - A[k] = B[k]; - enckey[((i-1) * 8) + k] = B[8 + k]; - } - } - } - - for (i = 0, k = 0; i < 8; i++) { - k |= A[i] ^ 0xa6; - } - if (k) { - return -1; - } - return 0; -} -#endif /* MCUBOOT_USE_MBED_TLS */ -#endif /* MCUBOOT_ENCRYPT_KW */ - -#if defined(MCUBOOT_ENCRYPT_RSA) -static int -parse_rsa_enckey(mbedtls_rsa_context *ctx, uint8_t **p, uint8_t *end) -{ - size_t len; - - if (mbedtls_asn1_get_tag(p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE) != 0) { - return -1; - } - - if (*p + len != end) { - return -2; - } - - /* Non-optional fields. */ - if ( /* version */ - mbedtls_asn1_get_int(p, end, &ctx->ver) != 0 || - /* public modulus */ - mbedtls_asn1_get_mpi(p, end, &ctx->N) != 0 || - /* public exponent */ - mbedtls_asn1_get_mpi(p, end, &ctx->E) != 0 || - /* private exponent */ - mbedtls_asn1_get_mpi(p, end, &ctx->D) != 0 || - /* primes */ - mbedtls_asn1_get_mpi(p, end, &ctx->P) != 0 || - mbedtls_asn1_get_mpi(p, end, &ctx->Q) != 0) { - - return -3; - } - -#if !defined(MBEDTLS_RSA_NO_CRT) - /* - * DP/DQ/QP are only used inside mbedTLS if it was built with the - * Chinese Remainder Theorem enabled (default). In case it is disabled - * we parse, or if not available, we calculate those values. - */ - if (*p < end) { - if ( /* d mod (p-1) and d mod (q-1) */ - mbedtls_asn1_get_mpi(p, end, &ctx->DP) != 0 || - mbedtls_asn1_get_mpi(p, end, &ctx->DQ) != 0 || - /* q ^ (-1) mod p */ - mbedtls_asn1_get_mpi(p, end, &ctx->QP) != 0) { - - return -4; - } - } else { - if (mbedtls_rsa_deduce_crt(&ctx->P, &ctx->Q, &ctx->D, - &ctx->DP, &ctx->DQ, &ctx->QP) != 0) { - return -5; - } - } -#endif - - ctx->len = mbedtls_mpi_size(&ctx->N); - - if (mbedtls_rsa_check_privkey(ctx) != 0) { - return -6; - } - - return 0; -} -#endif - -#if defined(MCUBOOT_ENCRYPT_EC256) -static const uint8_t ec_pubkey_oid[] = MBEDTLS_OID_EC_ALG_UNRESTRICTED; -static const uint8_t ec_secp256r1_oid[] = MBEDTLS_OID_EC_GRP_SECP256R1; - -#define SHARED_KEY_LEN NUM_ECC_BYTES -#define PRIV_KEY_LEN NUM_ECC_BYTES - -/* - * Parses the output of `imgtool keygen`, which produces a PKCS#8 elliptic - * curve keypair. See RFC5208 and RFC5915. - */ -static int -parse_ec256_enckey(uint8_t **p, uint8_t *end, uint8_t *pk) -{ - int rc; - size_t len; - int version; - mbedtls_asn1_buf alg; - mbedtls_asn1_buf param; - - if ((rc = mbedtls_asn1_get_tag(p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { - return -1; - } - - if (*p + len != end) { - return -2; - } - - version = 0; - if (mbedtls_asn1_get_int(p, end, &version) || version != 0) { - return -3; - } - - if ((rc = mbedtls_asn1_get_alg(p, end, &alg, ¶m)) != 0) { - return -5; - } - - if (alg.len != sizeof(ec_pubkey_oid) - 1 || - memcmp(alg.p, ec_pubkey_oid, sizeof(ec_pubkey_oid) - 1)) { - return -6; - } - if (param.len != sizeof(ec_secp256r1_oid) - 1 || - memcmp(param.p, ec_secp256r1_oid, sizeof(ec_secp256r1_oid) - 1)) { - return -7; - } - - if ((rc = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_OCTET_STRING)) != 0) { - return -8; - } - - /* RFC5915 - ECPrivateKey */ - - if ((rc = mbedtls_asn1_get_tag(p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { - return -9; - } - - version = 0; - if (mbedtls_asn1_get_int(p, end, &version) || version != 1) { - return -10; - } - - /* privateKey */ - - if ((rc = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_OCTET_STRING)) != 0) { - return -11; - } - - if (len != NUM_ECC_BYTES) { - return -12; - } - - memcpy(pk, *p, len); - - /* publicKey usually follows but is not parsed here */ - - return 0; -} -#endif /* defined(MCUBOOT_ENCRYPT_EC256) */ - -#if defined(MCUBOOT_ENCRYPT_X25519) -#define X25519_OID "\x6e" -static const uint8_t ec_pubkey_oid[] = MBEDTLS_OID_ISO_IDENTIFIED_ORG \ - MBEDTLS_OID_ORG_GOV X25519_OID; - -extern int X25519(uint8_t out_shared_key[32], const uint8_t private_key[32], - const uint8_t peer_public_value[32]); - -#define SHARED_KEY_LEN 32 -#define PRIV_KEY_LEN 32 - -static int -parse_x25519_enckey(uint8_t **p, uint8_t *end, uint8_t *pk) -{ - size_t len; - int version; - mbedtls_asn1_buf alg; - mbedtls_asn1_buf param; - - if (mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | - MBEDTLS_ASN1_SEQUENCE) != 0) { - return -1; - } - - if (*p + len != end) { - return -2; - } - - version = 0; - if (mbedtls_asn1_get_int(p, end, &version) || version != 0) { - return -3; - } - - if (mbedtls_asn1_get_alg(p, end, &alg, ¶m) != 0) { - return -4; - } - - if (alg.len != sizeof(ec_pubkey_oid) - 1 || - memcmp(alg.p, ec_pubkey_oid, sizeof(ec_pubkey_oid) - 1)) { - return -5; - } - - if (mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_OCTET_STRING) != 0) { - return -6; - } - - if (mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_OCTET_STRING) != 0) { - return -7; - } - - if (len != PRIV_KEY_LEN) { - return -8; - } - - memcpy(pk, *p, PRIV_KEY_LEN); - return 0; -} -#endif /* defined(MCUBOOT_ENCRYPT_X25519) */ - -#if defined(MCUBOOT_ENCRYPT_EC256) || defined(MCUBOOT_ENCRYPT_X25519) -/* - * HKDF as described by RFC5869. - * - * @param ikm The input data to be derived. - * @param ikm_len Length of the input data. - * @param info An information tag. - * @param info_len Length of the information tag. - * @param okm Output of the KDF computation. - * @param okm_len On input the requested length; on output the generated length - */ -static int -hkdf(uint8_t *ikm, uint16_t ikm_len, uint8_t *info, uint16_t info_len, - uint8_t *okm, uint16_t *okm_len) -{ - struct tc_hmac_state_struct hmac; - uint8_t salt[TC_SHA256_DIGEST_SIZE]; - uint8_t prk[TC_SHA256_DIGEST_SIZE]; - uint8_t T[TC_SHA256_DIGEST_SIZE]; - uint16_t off; - uint16_t len; - uint8_t counter; - bool first; - int rc; - - /* - * Extract - */ - - if (ikm == NULL || okm == NULL || ikm_len == 0) { - return -1; - } - - memset(salt, 0, TC_SHA256_DIGEST_SIZE); - rc = tc_hmac_set_key(&hmac, salt, TC_SHA256_DIGEST_SIZE); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - rc = tc_hmac_init(&hmac); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - rc = tc_hmac_update(&hmac, ikm, ikm_len); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - rc = tc_hmac_final(prk, TC_SHA256_DIGEST_SIZE, &hmac); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - /* - * Expand - */ - - len = *okm_len; - counter = 1; - first = true; - for (off = 0; len > 0; off += TC_SHA256_DIGEST_SIZE, ++counter) { - rc = tc_hmac_set_key(&hmac, prk, TC_SHA256_DIGEST_SIZE); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - rc = tc_hmac_init(&hmac); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - if (first) { - first = false; - } else { - rc = tc_hmac_update(&hmac, T, TC_SHA256_DIGEST_SIZE); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - } - - rc = tc_hmac_update(&hmac, info, info_len); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - rc = tc_hmac_update(&hmac, &counter, 1); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - rc = tc_hmac_final(T, TC_SHA256_DIGEST_SIZE, &hmac); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - if (len > TC_SHA256_DIGEST_SIZE) { - memcpy(&okm[off], T, TC_SHA256_DIGEST_SIZE); - len -= TC_SHA256_DIGEST_SIZE; - } else { - memcpy(&okm[off], T, len); - len = 0; - } - } - - return 0; -} -#endif - -int -boot_enc_set_key(struct enc_key_data *enc_state, uint8_t slot, - const struct boot_status *bs) -{ - int rc; - -#if defined(MCUBOOT_USE_MBED_TLS) - mbedtls_aes_init(&enc_state[slot].aes); - rc = mbedtls_aes_setkey_enc(&enc_state[slot].aes, bs->enckey[slot], - BOOT_ENC_KEY_SIZE_BITS); - if (rc) { - mbedtls_aes_free(&enc_state[slot].aes); - return -1; - } -#else - (void)rc; - - /* set_encrypt and set_decrypt do the same thing in tinycrypt */ - tc_aes128_set_encrypt_key(&enc_state[slot].aes, bs->enckey[slot]); -#endif - - enc_state[slot].valid = 1; - - return 0; -} - -#define EXPECTED_ENC_LEN BOOT_ENC_TLV_SIZE - -#if defined(MCUBOOT_ENCRYPT_RSA) -# define EXPECTED_ENC_TLV IMAGE_TLV_ENC_RSA2048 -#elif defined(MCUBOOT_ENCRYPT_KW) -# define EXPECTED_ENC_TLV IMAGE_TLV_ENC_KW128 -#elif defined(MCUBOOT_ENCRYPT_EC256) -# define EXPECTED_ENC_TLV IMAGE_TLV_ENC_EC256 -# define EC_PUBK_INDEX (1) -# define EC_TAG_INDEX (65) -# define EC_CIPHERKEY_INDEX (65 + 32) -_Static_assert(EC_CIPHERKEY_INDEX + 16 == EXPECTED_ENC_LEN, - "Please fix ECIES-P256 component indexes"); -#elif defined(MCUBOOT_ENCRYPT_X25519) -# define EXPECTED_ENC_TLV IMAGE_TLV_ENC_X25519 -# define EC_PUBK_INDEX (0) -# define EC_TAG_INDEX (32) -# define EC_CIPHERKEY_INDEX (32 + 32) -_Static_assert(EC_CIPHERKEY_INDEX + 16 == EXPECTED_ENC_LEN, - "Please fix ECIES-X25519 component indexes"); -#endif - -/* - * Decrypt an encryption key TLV. - * - * @param buf An encryption TLV read from flash (build time fixed length) - * @param enckey An AES-128 key sized buffer to store to plain key. - */ -int -boot_enc_decrypt(const uint8_t *buf, uint8_t *enckey) -{ -#if defined(MCUBOOT_ENCRYPT_RSA) - mbedtls_rsa_context rsa; - uint8_t *cp; - uint8_t *cpend; - size_t olen; -#endif -#if defined(MCUBOOT_ENCRYPT_EC256) || defined(MCUBOOT_ENCRYPT_X25519) - struct tc_hmac_state_struct hmac; - struct tc_aes_key_sched_struct aes; - uint8_t tag[TC_SHA256_DIGEST_SIZE]; - uint8_t shared[SHARED_KEY_LEN]; - uint8_t derived_key[TC_AES_KEY_SIZE + TC_SHA256_DIGEST_SIZE]; - uint8_t *cp; - uint8_t *cpend; - uint8_t pk[PRIV_KEY_LEN]; - uint8_t counter[TC_AES_BLOCK_SIZE]; - uint16_t len; -#endif - int rc = -1; - -#if defined(MCUBOOT_ENCRYPT_RSA) - - mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256); - - cp = (uint8_t *)bootutil_enc_key.key; - cpend = cp + *bootutil_enc_key.len; - - rc = parse_rsa_enckey(&rsa, &cp, cpend); - if (rc) { - mbedtls_rsa_free(&rsa); - return rc; - } - - rc = mbedtls_rsa_rsaes_oaep_decrypt(&rsa, NULL, NULL, MBEDTLS_RSA_PRIVATE, - NULL, 0, &olen, buf, enckey, BOOT_ENC_KEY_SIZE); - mbedtls_rsa_free(&rsa); - -#endif /* defined(MCUBOOT_ENCRYPT_RSA) */ - -#if defined(MCUBOOT_ENCRYPT_KW) - - assert(*bootutil_enc_key.len == 16); - rc = key_unwrap(buf, enckey); - -#endif /* defined(MCUBOOT_ENCRYPT_KW) */ - -#if defined(MCUBOOT_ENCRYPT_EC256) - - cp = (uint8_t *)bootutil_enc_key.key; - cpend = cp + *bootutil_enc_key.len; - - /* - * Load the stored EC256 decryption private key - */ - - rc = parse_ec256_enckey(&cp, cpend, pk); - if (rc) { - return rc; - } - - /* is EC point uncompressed? */ - if (buf[0] != 0x04) { - return -1; - } - - /* - * First "element" in the TLV is the curve point (public key) - */ - rc = uECC_valid_public_key(&buf[EC_PUBK_INDEX], uECC_secp256r1()); - if (rc != 0) { - return -1; - } - - rc = uECC_shared_secret(&buf[EC_PUBK_INDEX], pk, shared, uECC_secp256r1()); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - -#endif /* defined(MCUBOOT_ENCRYPT_EC256) */ - -#if defined(MCUBOOT_ENCRYPT_X25519) - - cp = (uint8_t *)bootutil_enc_key.key; - cpend = cp + *bootutil_enc_key.len; - - /* - * Load the stored X25519 decryption private key - */ - - rc = parse_x25519_enckey(&cp, cpend, pk); - if (rc) { - return rc; - } - - /* - * First "element" in the TLV is the curve point (public key) - */ - - rc = X25519(shared, pk, &buf[EC_PUBK_INDEX]); - if (!rc) { - return -1; - } - -#endif /* defined(MCUBOOT_ENCRYPT_X25519) */ - -#if defined(MCUBOOT_ENCRYPT_EC256) || defined(MCUBOOT_ENCRYPT_X25519) - - /* - * Expand shared secret to create keys for AES-128-CTR + HMAC-SHA256 - */ - - len = TC_AES_KEY_SIZE + TC_SHA256_DIGEST_SIZE; - rc = hkdf(shared, SHARED_KEY_LEN, (uint8_t *)"MCUBoot_ECIES_v1", 16, - derived_key, &len); - if (rc != 0 || len != (TC_AES_KEY_SIZE + TC_SHA256_DIGEST_SIZE)) { - return -1; - } - - /* - * HMAC the key and check that our received MAC matches the generated tag - */ - - rc = tc_hmac_set_key(&hmac, &derived_key[16], 32); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - rc = tc_hmac_init(&hmac); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - rc = tc_hmac_update(&hmac, &buf[EC_CIPHERKEY_INDEX], 16); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - /* Assumes the tag bufer is at least sizeof(hmac_tag_size(state)) bytes */ - rc = tc_hmac_final(tag, TC_SHA256_DIGEST_SIZE, &hmac); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - if (_compare(tag, &buf[EC_TAG_INDEX], 32) != 0) { - return -1; - } - - /* - * Finally decrypt the received ciphered key - */ - - rc = tc_aes128_set_decrypt_key(&aes, derived_key); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - memset(counter, 0, TC_AES_BLOCK_SIZE); - rc = tc_ctr_mode(enckey, TC_AES_KEY_SIZE, &buf[EC_CIPHERKEY_INDEX], - TC_AES_KEY_SIZE, counter, &aes); - if (rc != TC_CRYPTO_SUCCESS) { - return -1; - } - - rc = 0; - -#endif /* defined(MCUBOOT_ENCRYPT_EC256) || defined(MCUBOOT_ENCRYPT_X25519) */ - - return rc; -} - -/* - * Load encryption key. - */ -int -boot_enc_load(struct enc_key_data *enc_state, int image_index, - const struct image_header *hdr, const struct flash_area *fap, - struct boot_status *bs) -{ - uint32_t off; - uint16_t len; - struct image_tlv_iter it; -#if MCUBOOT_SWAP_SAVE_ENCTLV - uint8_t *buf; -#else - uint8_t buf[EXPECTED_ENC_LEN]; -#endif - uint8_t slot; - int rc; - - rc = flash_area_id_to_multi_image_slot(image_index, fap->fa_id); - if (rc < 0) { - return rc; - } - slot = rc; - - /* Already loaded... */ - if (enc_state[slot].valid) { - return 1; - } - - rc = bootutil_tlv_iter_begin(&it, hdr, fap, EXPECTED_ENC_TLV, false); - if (rc) { - return -1; - } - - rc = bootutil_tlv_iter_next(&it, &off, &len, NULL); - if (rc != 0) { - return rc; - } - - if (len != EXPECTED_ENC_LEN) { - return -1; - } - -#if MCUBOOT_SWAP_SAVE_ENCTLV - buf = bs->enctlv[slot]; - memset(buf, 0xff, BOOT_ENC_TLV_ALIGN_SIZE); -#endif - - rc = flash_area_read(fap, off, buf, EXPECTED_ENC_LEN); - if (rc) { - return -1; - } - - return boot_enc_decrypt(buf, bs->enckey[slot]); -} - -bool -boot_enc_valid(struct enc_key_data *enc_state, int image_index, - const struct flash_area *fap) -{ - int rc; - - rc = flash_area_id_to_multi_image_slot(image_index, fap->fa_id); - if (rc < 0) { - /* can't get proper slot number - skip encryption, */ - /* postpone the error for a upper layer */ - return false; - } - - return enc_state[rc].valid; -} - -void -boot_encrypt(struct enc_key_data *enc_state, int image_index, - const struct flash_area *fap, uint32_t off, uint32_t sz, - uint32_t blk_off, uint8_t *buf) -{ - struct enc_key_data *enc; - uint32_t i, j; - uint8_t u8; - uint8_t nonce[16]; - uint8_t blk[16]; - int rc; - - memset(nonce, 0, 12); - off >>= 4; - nonce[12] = (uint8_t)(off >> 24); - nonce[13] = (uint8_t)(off >> 16); - nonce[14] = (uint8_t)(off >> 8); - nonce[15] = (uint8_t)off; - - rc = flash_area_id_to_multi_image_slot(image_index, fap->fa_id); - if (rc < 0) { - assert(0); - return; - } - - enc = &enc_state[rc]; - assert(enc->valid == 1); - for (i = 0; i < sz; i++) { - if (i == 0 || blk_off == 0) { -#if defined(MCUBOOT_USE_MBED_TLS) - mbedtls_aes_crypt_ecb(&enc->aes, MBEDTLS_AES_ENCRYPT, nonce, blk); -#else - tc_aes_encrypt(blk, nonce, &enc->aes); -#endif - - for (j = 16; j > 0; --j) { - if (++nonce[j - 1] != 0) { - break; - } - } - } - - u8 = *buf; - *buf++ = u8 ^ blk[blk_off]; - blk_off = (blk_off + 1) & 0x0f; - } -} - -/** - * Clears encrypted state after use. - */ -void -boot_enc_zeroize(struct enc_key_data *enc_state) -{ - memset(enc_state, 0, sizeof(struct enc_key_data) * BOOT_NUM_SLOTS); -} - -#endif /* MCUBOOT_ENC_IMAGES */ diff --git a/mcuboot/boot/bootutil/src/image_ec.c b/mcuboot/boot/bootutil/src/image_ec.c deleted file mode 100644 index a127b74bf..000000000 --- a/mcuboot/boot/bootutil/src/image_ec.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2016-2018 JUUL Labs - * - * Original license: - * - * 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. - */ - -#include - -#include "mcuboot_config/mcuboot_config.h" - -#ifdef MCUBOOT_SIGN_EC -#include "bootutil/sign_key.h" - -#include "mbedtls/ecdsa.h" -#include "mbedtls/oid.h" -#include "mbedtls/asn1.h" - -#include "bootutil_priv.h" - -/* - * Declaring these like this adds NULL termination. - */ -static const uint8_t ec_pubkey_oid[] = MBEDTLS_OID_EC_ALG_UNRESTRICTED; -static const uint8_t ec_secp224r1_oid[] = MBEDTLS_OID_EC_GRP_SECP224R1; - -/* - * Parse the public key used for signing. - */ -static int -bootutil_parse_eckey(mbedtls_ecdsa_context *ctx, uint8_t **p, uint8_t *end) -{ - size_t len; - mbedtls_asn1_buf alg; - mbedtls_asn1_buf param; - - if (mbedtls_asn1_get_tag(p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { - return -1; - } - end = *p + len; - - if (mbedtls_asn1_get_alg(p, end, &alg, ¶m)) { - return -2; - } - if (alg.len != sizeof(ec_pubkey_oid) - 1 || - memcmp(alg.p, ec_pubkey_oid, sizeof(ec_pubkey_oid) - 1)) { - return -3; - } - if (param.len != sizeof(ec_secp224r1_oid) - 1|| - memcmp(param.p, ec_secp224r1_oid, sizeof(ec_secp224r1_oid) - 1)) { - return -4; - } - - if (mbedtls_ecp_group_load(&ctx->grp, MBEDTLS_ECP_DP_SECP224R1)) { - return -5; - } - - if (mbedtls_asn1_get_bitstring_null(p, end, &len)) { - return -6; - } - if (*p + len != end) { - return -7; - } - - if (mbedtls_ecp_point_read_binary(&ctx->grp, &ctx->Q, *p, end - *p)) { - return -8; - } - - if (mbedtls_ecp_check_pubkey(&ctx->grp, &ctx->Q)) { - return -9; - } - return 0; -} - -static int -bootutil_cmp_sig(mbedtls_ecdsa_context *ctx, uint8_t *hash, uint32_t hlen, - uint8_t *sig, size_t slen) -{ - return mbedtls_ecdsa_read_signature(ctx, hash, hlen, sig, slen); -} - -int -bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, size_t slen, - uint8_t key_id) -{ - int rc; - uint8_t *cp; - uint8_t *end; - mbedtls_ecdsa_context ctx; - - mbedtls_ecdsa_init(&ctx); - - cp = (uint8_t *)bootutil_keys[key_id].key; - end = cp + *bootutil_keys[key_id].len; - - rc = bootutil_parse_eckey(&ctx, &cp, end); - if (rc) { - return -1; - } - - while (sig[slen - 1] == '\0') { - slen--; - } - rc = bootutil_cmp_sig(&ctx, hash, hlen, sig, slen); - mbedtls_ecdsa_free(&ctx); - - return rc; -} -#endif /* MCUBOOT_SIGN_EC */ diff --git a/mcuboot/boot/bootutil/src/image_ec256.c b/mcuboot/boot/bootutil/src/image_ec256.c deleted file mode 100644 index 84ece6a64..000000000 --- a/mcuboot/boot/bootutil/src/image_ec256.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2016-2019 JUUL Labs - * Copyright (c) 2017 Linaro LTD - * - * Original license: - * - * 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. - */ - -#include - -#include "mcuboot_config/mcuboot_config.h" - -#ifdef MCUBOOT_SIGN_EC256 -#include "bootutil/sign_key.h" - -#include "mbedtls/oid.h" -#include "mbedtls/asn1.h" - -#ifdef MCUBOOT_USE_TINYCRYPT -#include "tinycrypt/ecc_dsa.h" -#endif -#ifdef MCUBOOT_USE_CC310 -#include "cc310_glue.h" -#define NUM_ECC_BYTES (4*8) -#endif -#include "bootutil_priv.h" - -/* - * Declaring these like this adds NULL termination. - */ -static const uint8_t ec_pubkey_oid[] = MBEDTLS_OID_EC_ALG_UNRESTRICTED; -static const uint8_t ec_secp256r1_oid[] = MBEDTLS_OID_EC_GRP_SECP256R1; - -/* - * Parse the public key used for signing. - */ -static int -bootutil_import_key(uint8_t **cp, uint8_t *end) -{ - size_t len; - mbedtls_asn1_buf alg; - mbedtls_asn1_buf param; - - if (mbedtls_asn1_get_tag(cp, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { - return -1; - } - end = *cp + len; - - /* ECParameters (RFC5480) */ - if (mbedtls_asn1_get_alg(cp, end, &alg, ¶m)) { - return -2; - } - /* id-ecPublicKey (RFC5480) */ - if (alg.len != sizeof(ec_pubkey_oid) - 1 || - memcmp(alg.p, ec_pubkey_oid, sizeof(ec_pubkey_oid) - 1)) { - return -3; - } - /* namedCurve (RFC5480) */ - if (param.len != sizeof(ec_secp256r1_oid) - 1 || - memcmp(param.p, ec_secp256r1_oid, sizeof(ec_secp256r1_oid) - 1)) { - return -4; - } - /* ECPoint (RFC5480) */ - if (mbedtls_asn1_get_bitstring_null(cp, end, &len)) { - return -6; - } - if (*cp + len != end) { - return -7; - } - - if (len != 2 * NUM_ECC_BYTES + 1) { - return -8; - } - /* Is uncompressed? */ - if (*cp[0] != 0x04) { - return -9; - } - - (*cp)++; - return 0; -} - -/* - * cp points to ASN1 string containing an integer. - * Verify the tag, and that the length is 32 bytes. - */ -static int -bootutil_read_bigint(uint8_t i[NUM_ECC_BYTES], uint8_t **cp, uint8_t *end) -{ - size_t len; - - if (mbedtls_asn1_get_tag(cp, end, &len, MBEDTLS_ASN1_INTEGER)) { - return -3; - } - - if (len >= NUM_ECC_BYTES) { - memcpy(i, *cp + len - NUM_ECC_BYTES, NUM_ECC_BYTES); - } else { - memset(i, 0, NUM_ECC_BYTES - len); - memcpy(i + NUM_ECC_BYTES - len, *cp, len); - } - *cp += len; - return 0; -} - -/* - * Read in signature. Signature has r and s encoded as integers. - */ -static int -bootutil_decode_sig(uint8_t signature[NUM_ECC_BYTES * 2], uint8_t *cp, uint8_t *end) -{ - int rc; - size_t len; - - rc = mbedtls_asn1_get_tag(&cp, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE); - if (rc) { - return -1; - } - if (cp + len > end) { - return -2; - } - - rc = bootutil_read_bigint(signature, &cp, end); - if (rc) { - return -3; - } - rc = bootutil_read_bigint(signature + NUM_ECC_BYTES, &cp, end); - if (rc) { - return -4; - } - return 0; -} - -#ifdef MCUBOOT_USE_TINYCRYPT -int -bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, size_t slen, - uint8_t key_id) -{ - int rc; - uint8_t *pubkey; - uint8_t *end; - - uint8_t signature[2 * NUM_ECC_BYTES]; - - pubkey = (uint8_t *)bootutil_keys[key_id].key; - end = pubkey + *bootutil_keys[key_id].len; - - rc = bootutil_import_key(&pubkey, end); - if (rc) { - return -1; - } - - rc = bootutil_decode_sig(signature, sig, sig + slen); - if (rc) { - return -1; - } - - /* - * This is simplified, as the hash length is also 32 bytes. - */ - if (hlen != NUM_ECC_BYTES) { - return -1; - } - - rc = uECC_verify(pubkey, hash, NUM_ECC_BYTES, signature, uECC_secp256r1()); - if (rc == 1) { - return 0; - } else { - return -2; - } -} -#endif /* MCUBOOT_USE_TINYCRYPT */ -#ifdef MCUBOOT_USE_CC310 -int -bootutil_verify_sig(uint8_t *hash, - uint32_t hlen, - uint8_t *sig, - size_t slen, - uint8_t key_id) -{ - int rc; - uint8_t *pubkey; - uint8_t *end; - uint8_t signature[2 * NUM_ECC_BYTES]; - - pubkey = (uint8_t *)bootutil_keys[key_id].key; - end = pubkey + *bootutil_keys[key_id].len; - - rc = bootutil_import_key(&pubkey, end); - if (rc) { - return -1; - } - - /* Decode signature */ - rc = bootutil_decode_sig(signature, sig, sig + slen); - if (rc) { - return -1; - } - - /* - * This is simplified, as the hash length is also 32 bytes. - */ - if (hlen != NUM_ECC_BYTES) { - return -1; - } - - /* Initialize and verify in one go */ - rc = cc310_ecdsa_verify_secp256r1(hash, pubkey, signature, hlen); - - if (rc != 0) { - return -2; - } - - return rc; -} -#endif /* MCUBOOT_USE_CC310 */ -#endif /* MCUBOOT_SIGN_EC256 */ diff --git a/mcuboot/boot/bootutil/src/image_ed25519.c b/mcuboot/boot/bootutil/src/image_ed25519.c deleted file mode 100644 index 940c18dfc..000000000 --- a/mcuboot/boot/bootutil/src/image_ed25519.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2019 JUUL Labs - */ - -#include - -#include "mcuboot_config/mcuboot_config.h" - -#ifdef MCUBOOT_SIGN_ED25519 -#include "bootutil/sign_key.h" - -#include "mbedtls/oid.h" -#include "mbedtls/asn1.h" - -#include "bootutil_priv.h" - -static const uint8_t ed25519_pubkey_oid[] = MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x65\x70"; -#define NUM_ED25519_BYTES 32 - -extern int ED25519_verify(const uint8_t *message, size_t message_len, - const uint8_t signature[64], - const uint8_t public_key[32]); - -/* - * Parse the public key used for signing. - */ -static int -bootutil_import_key(uint8_t **cp, uint8_t *end) -{ - size_t len; - mbedtls_asn1_buf alg; - mbedtls_asn1_buf param; - - if (mbedtls_asn1_get_tag(cp, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { - return -1; - } - end = *cp + len; - - if (mbedtls_asn1_get_alg(cp, end, &alg, ¶m)) { - return -2; - } - - if (alg.len != sizeof(ed25519_pubkey_oid) - 1 || - memcmp(alg.p, ed25519_pubkey_oid, sizeof(ed25519_pubkey_oid) - 1)) { - return -3; - } - - if (mbedtls_asn1_get_bitstring_null(cp, end, &len)) { - return -4; - } - if (*cp + len != end) { - return -5; - } - - if (len != NUM_ED25519_BYTES) { - return -6; - } - - return 0; -} - -int -bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, size_t slen, - uint8_t key_id) -{ - int rc; - uint8_t *pubkey; - uint8_t *end; - - if (hlen != 32 || slen != 64) { - return -1; - } - - pubkey = (uint8_t *)bootutil_keys[key_id].key; - end = pubkey + *bootutil_keys[key_id].len; - - rc = bootutil_import_key(&pubkey, end); - if (rc) { - return -1; - } - - rc = ED25519_verify(hash, 32, sig, pubkey); - if (rc == 0) { - return -2; - } - - return 0; -} - -#endif /* MCUBOOT_SIGN_ED25519 */ diff --git a/mcuboot/boot/bootutil/src/image_rsa.c b/mcuboot/boot/bootutil/src/image_rsa.c deleted file mode 100644 index e36b8ba43..000000000 --- a/mcuboot/boot/bootutil/src/image_rsa.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2017-2018 Linaro LTD - * Copyright (c) 2017-2019 JUUL Labs - * - * Original license: - * - * 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. - */ - -#include - -#include "mcuboot_config/mcuboot_config.h" - -#ifdef MCUBOOT_SIGN_RSA -#include "bootutil/sign_key.h" -#include "bootutil/sha256.h" - -#include "mbedtls/rsa.h" -#include "mbedtls/asn1.h" -#include "mbedtls/version.h" - -#include "bootutil_priv.h" - -/* - * Constants for this particular constrained implementation of - * RSA-PSS. In particular, we support RSA 2048, with a SHA256 hash, - * and a 32-byte salt. A signature with different parameters will be - * rejected as invalid. - */ - -/* The size, in octets, of the message. */ -#define PSS_EMLEN (MCUBOOT_SIGN_RSA_LEN / 8) - -/* The size of the hash function. For SHA256, this is 32 bytes. */ -#define PSS_HLEN 32 - -/* Size of the salt, should be fixed. */ -#define PSS_SLEN 32 - -/* The length of the mask: emLen - hLen - 1. */ -#define PSS_MASK_LEN (PSS_EMLEN - PSS_HLEN - 1) - -#define PSS_HASH_OFFSET PSS_MASK_LEN - -/* For the mask itself, how many bytes should be all zeros. */ -#define PSS_MASK_ZERO_COUNT (PSS_MASK_LEN - PSS_SLEN - 1) -#define PSS_MASK_ONE_POS PSS_MASK_ZERO_COUNT - -/* Where the salt starts. */ -#define PSS_MASK_SALT_POS (PSS_MASK_ONE_POS + 1) - -static const uint8_t pss_zeros[8] = {0}; - -/* - * Parse the public key used for signing. Simple RSA format. - */ -static int -bootutil_parse_rsakey(mbedtls_rsa_context *ctx, uint8_t **p, uint8_t *end) -{ - int rc; - size_t len; - - if ((rc = mbedtls_asn1_get_tag(p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { - return -1; - } - - if (*p + len != end) { - return -2; - } - - if ((rc = mbedtls_asn1_get_mpi(p, end, &ctx->N)) != 0 || - (rc = mbedtls_asn1_get_mpi(p, end, &ctx->E)) != 0) { - return -3; - } - - ctx->len = mbedtls_mpi_size(&ctx->N); - - if (*p != end) { - return -4; - } - - /* The mbedtls version is more than 2.6.1 */ -#if MBEDTLS_VERSION_NUMBER > 0x02060100 - rc = mbedtls_rsa_import(ctx, &ctx->N, NULL, NULL, NULL, &ctx->E); - if (rc != 0) { - return -5; - } -#endif - - rc = mbedtls_rsa_check_pubkey(ctx); - if (rc != 0) { - return -6; - } - - ctx->len = mbedtls_mpi_size(&ctx->N); - - return 0; -} - -/* - * Compute the RSA-PSS mask-generation function, MGF1. Assumptions - * are that the mask length will be less than 256 * PSS_HLEN, and - * therefore we never need to increment anything other than the low - * byte of the counter. - * - * This is described in PKCS#1, B.2.1. - */ -static void -pss_mgf1(uint8_t *mask, const uint8_t *hash) -{ - bootutil_sha256_context ctx; - uint8_t counter[4] = { 0, 0, 0, 0 }; - uint8_t htmp[PSS_HLEN]; - int count = PSS_MASK_LEN; - int bytes; - - while (count > 0) { - bootutil_sha256_init(&ctx); - bootutil_sha256_update(&ctx, hash, PSS_HLEN); - bootutil_sha256_update(&ctx, counter, 4); - bootutil_sha256_finish(&ctx, htmp); - - counter[3]++; - - bytes = PSS_HLEN; - if (bytes > count) - bytes = count; - - memcpy(mask, htmp, bytes); - mask += bytes; - count -= bytes; - } -} - -/* - * Validate an RSA signature, using RSA-PSS, as described in PKCS #1 - * v2.2, section 9.1.2, with many parameters required to have fixed - * values. - */ -static int -bootutil_cmp_rsasig(mbedtls_rsa_context *ctx, uint8_t *hash, uint32_t hlen, - uint8_t *sig) -{ - bootutil_sha256_context shactx; - uint8_t em[MBEDTLS_MPI_MAX_SIZE]; - uint8_t db_mask[PSS_MASK_LEN]; - uint8_t h2[PSS_HLEN]; - int i; - - if (ctx->len != PSS_EMLEN || PSS_EMLEN > MBEDTLS_MPI_MAX_SIZE) { - return -1; - } - - if (hlen != PSS_HLEN) { - return -1; - } - - if (mbedtls_rsa_public(ctx, sig, em)) { - return -1; - } - - /* - * PKCS #1 v2.2, 9.1.2 EMSA-PSS-Verify - * - * emBits is 2048 - * emLen = ceil(emBits/8) = 256 - * - * The salt length is not known at the beginning. - */ - - /* Step 1. The message is constrained by the address space of a - * 32-bit processor, which is far less than the 2^61-1 limit of - * SHA-256. - */ - - /* Step 2. mHash is passed in as 'hash', with hLen the hlen - * argument. */ - - /* Step 3. if emLen < hLen + sLen + 2, inconsistent and stop. - * The salt length is not known at this point. - */ - - /* Step 4. If the rightmost octet of EM does have the value - * 0xbc, output inconsistent and stop. - */ - if (em[PSS_EMLEN - 1] != 0xbc) { - return -1; - } - - /* Step 5. Let maskedDB be the leftmost emLen - hLen - 1 octets - * of EM, and H be the next hLen octets. - * - * maskedDB is then the first 256 - 32 - 1 = 0-222 - * H is 32 bytes 223-254 - */ - - /* Step 6. If the leftmost 8emLen - emBits bits of the leftmost - * octet in maskedDB are not all equal to zero, output - * inconsistent and stop. - * - * 8emLen - emBits is zero, so there is nothing to test here. - */ - - /* Step 7. let dbMask = MGF(H, emLen - hLen - 1). */ - pss_mgf1(db_mask, &em[PSS_HASH_OFFSET]); - - /* Step 8. let DB = maskedDB xor dbMask. - * To avoid needing an additional buffer, store the 'db' in the - * same buffer as db_mask. From now, to the end of this function, - * db_mask refers to the unmasked 'db'. */ - for (i = 0; i < PSS_MASK_LEN; i++) { - db_mask[i] ^= em[i]; - } - - /* Step 9. Set the leftmost 8emLen - emBits bits of the leftmost - * octet in DB to zero. - * pycrypto seems to always make the emBits 2047, so we need to - * clear the top bit. */ - db_mask[0] &= 0x7F; - - /* Step 10. If the emLen - hLen - sLen - 2 leftmost octets of DB - * are not zero or if the octet at position emLen - hLen - sLen - - * 1 (the leftmost position is "position 1") does not have - * hexadecimal value 0x01, output "inconsistent" and stop. */ - for (i = 0; i < PSS_MASK_ZERO_COUNT; i++) { - if (db_mask[i] != 0) { - return -1; - } - } - - if (db_mask[PSS_MASK_ONE_POS] != 1) { - return -1; - } - - /* Step 11. Let salt be the last sLen octets of DB */ - - /* Step 12. Let M' = 0x00 00 00 00 00 00 00 00 || mHash || salt; */ - - /* Step 13. Let H' = Hash(M') */ - bootutil_sha256_init(&shactx); - bootutil_sha256_update(&shactx, pss_zeros, 8); - bootutil_sha256_update(&shactx, hash, PSS_HLEN); - bootutil_sha256_update(&shactx, &db_mask[PSS_MASK_SALT_POS], PSS_SLEN); - bootutil_sha256_finish(&shactx, h2); - - /* Step 14. If H = H', output "consistent". Otherwise, output - * "inconsistent". */ - if (memcmp(h2, &em[PSS_HASH_OFFSET], PSS_HLEN) != 0) { - return -1; - } - - return 0; -} - -int -bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, size_t slen, - uint8_t key_id) -{ - mbedtls_rsa_context ctx; - int rc; - uint8_t *cp; - uint8_t *end; - - mbedtls_rsa_init(&ctx, 0, 0); - - cp = (uint8_t *)bootutil_keys[key_id].key; - end = cp + *bootutil_keys[key_id].len; - - rc = bootutil_parse_rsakey(&ctx, &cp, end); - if (rc || slen != ctx.len) { - mbedtls_rsa_free(&ctx); - return rc; - } - rc = bootutil_cmp_rsasig(&ctx, hash, hlen, sig); - mbedtls_rsa_free(&ctx); - - return rc; -} -#endif /* MCUBOOT_SIGN_RSA */ diff --git a/mcuboot/boot/bootutil/src/image_validate.c b/mcuboot/boot/bootutil/src/image_validate.c deleted file mode 100644 index 7071d7d88..000000000 --- a/mcuboot/boot/bootutil/src/image_validate.c +++ /dev/null @@ -1,482 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2017-2019 Linaro LTD - * Copyright (c) 2016-2019 JUUL Labs - * Copyright (c) 2019-2020 Arm Limited - * - * Original license: - * - * 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. - */ - -#include -#include -#include -#include - -#include - -#include "bootutil/image.h" -#include "bootutil/sha256.h" -#include "bootutil/sign_key.h" -#include "bootutil/security_cnt.h" - -#include "mcuboot_config/mcuboot_config.h" - -#ifdef MCUBOOT_ENC_IMAGES -#include "bootutil/enc_key.h" -#endif -#if defined(MCUBOOT_SIGN_RSA) -#include "mbedtls/rsa.h" -#endif -#if defined(MCUBOOT_SIGN_EC) || defined(MCUBOOT_SIGN_EC256) -#include "mbedtls/ecdsa.h" -#endif -#if defined(MCUBOOT_ENC_IMAGES) || defined(MCUBOOT_SIGN_RSA) || \ - defined(MCUBOOT_SIGN_EC) || defined(MCUBOOT_SIGN_EC256) -#include "mbedtls/asn1.h" -#endif - -#include "bootutil_priv.h" - -/* - * Compute SHA256 over the image. - */ -static int -bootutil_img_hash(struct enc_key_data *enc_state, int image_index, - struct image_header *hdr, const struct flash_area *fap, - uint8_t *tmp_buf, uint32_t tmp_buf_sz, uint8_t *hash_result, - uint8_t *seed, int seed_len) -{ - bootutil_sha256_context sha256_ctx; - uint32_t blk_sz; - uint32_t size; - uint16_t hdr_size; - uint32_t off; - int rc; - uint32_t blk_off; - uint32_t tlv_off; - -#if (BOOT_IMAGE_NUMBER == 1) || !defined(MCUBOOT_ENC_IMAGES) - (void)enc_state; - (void)image_index; - (void)hdr_size; - (void)blk_off; - (void)tlv_off; -#endif - -#ifdef MCUBOOT_ENC_IMAGES - /* Encrypted images only exist in the secondary slot */ - if (MUST_DECRYPT(fap, image_index, hdr) && - !boot_enc_valid(enc_state, image_index, fap)) { - return -1; - } -#endif - - bootutil_sha256_init(&sha256_ctx); - - /* in some cases (split image) the hash is seeded with data from - * the loader image */ - if (seed && (seed_len > 0)) { - bootutil_sha256_update(&sha256_ctx, seed, seed_len); - } - - /* Hash is computed over image header and image itself. */ - size = hdr_size = hdr->ih_hdr_size; - size += hdr->ih_img_size; - tlv_off = size; - - /* If protected TLVs are present they are also hashed. */ - size += hdr->ih_protect_tlv_size; - - for (off = 0; off < size; off += blk_sz) { - blk_sz = size - off; - if (blk_sz > tmp_buf_sz) { - blk_sz = tmp_buf_sz; - } -#ifdef MCUBOOT_ENC_IMAGES - /* The only data that is encrypted in an image is the payload; - * both header and TLVs (when protected) are not. - */ - if ((off < hdr_size) && ((off + blk_sz) > hdr_size)) { - /* read only the header */ - blk_sz = hdr_size - off; - } - if ((off < tlv_off) && ((off + blk_sz) > tlv_off)) { - /* read only up to the end of the image payload */ - blk_sz = tlv_off - off; - } -#endif - rc = flash_area_read(fap, off, tmp_buf, blk_sz); - if (rc) { - return rc; - } -#ifdef MCUBOOT_ENC_IMAGES - if (MUST_DECRYPT(fap, image_index, hdr)) { - /* Only payload is encrypted (area between header and TLVs) */ - if (off >= hdr_size && off < tlv_off) { - blk_off = (off - hdr_size) & 0xf; - boot_encrypt(enc_state, image_index, fap, off - hdr_size, - blk_sz, blk_off, tmp_buf); - } - } -#endif - bootutil_sha256_update(&sha256_ctx, tmp_buf, blk_sz); - } - bootutil_sha256_finish(&sha256_ctx, hash_result); - - return 0; -} - -/* - * Currently, we only support being able to verify one type of - * signature, because there is a single verification function that we - * call. List the type of TLV we are expecting. If we aren't - * configured for any signature, don't define this macro. - */ -#if (defined(MCUBOOT_SIGN_RSA) + \ - defined(MCUBOOT_SIGN_EC) + \ - defined(MCUBOOT_SIGN_EC256) + \ - defined(MCUBOOT_SIGN_ED25519)) > 1 -#error "Only a single signature type is supported!" -#endif - -#if defined(MCUBOOT_SIGN_RSA) -# if MCUBOOT_SIGN_RSA_LEN == 2048 -# define EXPECTED_SIG_TLV IMAGE_TLV_RSA2048_PSS -# elif MCUBOOT_SIGN_RSA_LEN == 3072 -# define EXPECTED_SIG_TLV IMAGE_TLV_RSA3072_PSS -# else -# error "Unsupported RSA signature length" -# endif -# define SIG_BUF_SIZE (MCUBOOT_SIGN_RSA_LEN / 8) -# define EXPECTED_SIG_LEN(x) ((x) == SIG_BUF_SIZE) /* 2048 bits */ -#elif defined(MCUBOOT_SIGN_EC) -# define EXPECTED_SIG_TLV IMAGE_TLV_ECDSA224 -# define SIG_BUF_SIZE 128 -# define EXPECTED_SIG_LEN(x) (1) /* always true, ASN.1 will validate */ -#elif defined(MCUBOOT_SIGN_EC256) -# define EXPECTED_SIG_TLV IMAGE_TLV_ECDSA256 -# define SIG_BUF_SIZE 128 -# define EXPECTED_SIG_LEN(x) (1) /* always true, ASN.1 will validate */ -#elif defined(MCUBOOT_SIGN_ED25519) -# define EXPECTED_SIG_TLV IMAGE_TLV_ED25519 -# define SIG_BUF_SIZE 64 -# define EXPECTED_SIG_LEN(x) ((x) == SIG_BUF_SIZE) -#else -# define SIG_BUF_SIZE 32 /* no signing, sha256 digest only */ -#endif - -#ifdef EXPECTED_SIG_TLV -#if !defined(MCUBOOT_HW_KEY) -static int -bootutil_find_key(uint8_t *keyhash, uint8_t keyhash_len) -{ - bootutil_sha256_context sha256_ctx; - int i; - const struct bootutil_key *key; - uint8_t hash[32]; - - if (keyhash_len > 32) { - return -1; - } - - for (i = 0; i < bootutil_key_cnt; i++) { - key = &bootutil_keys[i]; - bootutil_sha256_init(&sha256_ctx); - bootutil_sha256_update(&sha256_ctx, key->key, *key->len); - bootutil_sha256_finish(&sha256_ctx, hash); - if (!memcmp(hash, keyhash, keyhash_len)) { - return i; - } - } - return -1; -} -#else -extern unsigned int pub_key_len; -static int -bootutil_find_key(uint8_t image_index, uint8_t *key, uint16_t key_len) -{ - bootutil_sha256_context sha256_ctx; - uint8_t hash[32]; - uint8_t key_hash[32]; - size_t key_hash_size = sizeof(key_hash); - int rc; - - bootutil_sha256_init(&sha256_ctx); - bootutil_sha256_update(&sha256_ctx, key, key_len); - bootutil_sha256_finish(&sha256_ctx, hash); - - rc = boot_retrieve_public_key_hash(image_index, key_hash, &key_hash_size); - if (rc) { - return rc; - } - - if (!memcmp(hash, key_hash, key_hash_size)) { - bootutil_keys[0].key = key; - pub_key_len = key_len; - return 0; - } - return -1; -} -#endif /* !MCUBOOT_HW_KEY */ -#endif - -#ifdef MCUBOOT_HW_ROLLBACK_PROT -/** - * Reads the value of an image's security counter. - * - * @param hdr Pointer to the image header structure. - * @param fap Pointer to a description structure of the image's - * flash area. - * @param security_cnt Pointer to store the security counter value. - * - * @return 0 on success; nonzero on failure. - */ -int32_t -bootutil_get_img_security_cnt(struct image_header *hdr, - const struct flash_area *fap, - uint32_t *img_security_cnt) -{ - struct image_tlv_iter it; - uint32_t off; - uint16_t len; - int32_t rc; - - if ((hdr == NULL) || - (fap == NULL) || - (img_security_cnt == NULL)) { - /* Invalid parameter. */ - return BOOT_EBADARGS; - } - - /* The security counter TLV is in the protected part of the TLV area. */ - if (hdr->ih_protect_tlv_size == 0) { - return BOOT_EBADIMAGE; - } - - rc = bootutil_tlv_iter_begin(&it, hdr, fap, IMAGE_TLV_SEC_CNT, true); - if (rc) { - return rc; - } - - /* Traverse through the protected TLV area to find - * the security counter TLV. - */ - - rc = bootutil_tlv_iter_next(&it, &off, &len, NULL); - if (rc != 0) { - /* Security counter TLV has not been found. */ - return -1; - } - - if (len != sizeof(*img_security_cnt)) { - /* Security counter is not valid. */ - return BOOT_EBADIMAGE; - } - - rc = flash_area_read(fap, off, img_security_cnt, len); - if (rc != 0) { - return BOOT_EFLASH; - } - - return 0; -} -#endif /* MCUBOOT_HW_ROLLBACK_PROT */ - -/* - * Verify the integrity of the image. - * Return non-zero if image could not be validated/does not validate. - */ -int -bootutil_img_validate(struct enc_key_data *enc_state, int image_index, - struct image_header *hdr, const struct flash_area *fap, - uint8_t *tmp_buf, uint32_t tmp_buf_sz, uint8_t *seed, - int seed_len, uint8_t *out_hash) -{ - uint32_t off; - uint16_t len; - uint16_t type; - int sha256_valid = 0; -#ifdef EXPECTED_SIG_TLV - int valid_signature = 0; - int key_id = -1; -#ifdef MCUBOOT_HW_KEY - /* Few extra bytes for encoding and for public exponent. */ - uint8_t key_buf[SIG_BUF_SIZE + 24]; -#endif -#endif /* EXPECTED_SIG_TLV */ - struct image_tlv_iter it; - uint8_t buf[SIG_BUF_SIZE]; - uint8_t hash[32]; - int rc; -#ifdef MCUBOOT_HW_ROLLBACK_PROT - uint32_t security_cnt = UINT32_MAX; - uint32_t img_security_cnt = 0; - int32_t security_counter_valid = 0; -#endif - - rc = bootutil_img_hash(enc_state, image_index, hdr, fap, tmp_buf, - tmp_buf_sz, hash, seed, seed_len); - if (rc) { - return rc; - } - - if (out_hash) { - memcpy(out_hash, hash, 32); - } - - rc = bootutil_tlv_iter_begin(&it, hdr, fap, IMAGE_TLV_ANY, false); - if (rc) { - return rc; - } - - /* - * Traverse through all of the TLVs, performing any checks we know - * and are able to do. - */ - while (true) { - rc = bootutil_tlv_iter_next(&it, &off, &len, &type); - if (rc < 0) { - return -1; - } else if (rc > 0) { - break; - } - - if (type == IMAGE_TLV_SHA256) { - /* - * Verify the SHA256 image hash. This must always be - * present. - */ - if (len != sizeof(hash)) { - return -1; - } - rc = flash_area_read(fap, off, buf, sizeof hash); - if (rc) { - return rc; - } - if (memcmp(hash, buf, sizeof(hash))) { - return -1; - } - - sha256_valid = 1; -#ifdef EXPECTED_SIG_TLV -#ifndef MCUBOOT_HW_KEY - } else if (type == IMAGE_TLV_KEYHASH) { - /* - * Determine which key we should be checking. - */ - if (len > 32) { - return -1; - } - rc = flash_area_read(fap, off, buf, len); - if (rc) { - return rc; - } - key_id = bootutil_find_key(buf, len); - /* - * The key may not be found, which is acceptable. There - * can be multiple signatures, each preceded by a key. - */ -#else - } else if (type == IMAGE_TLV_PUBKEY) { - /* - * Determine which key we should be checking. - */ - if (len > sizeof(key_buf)) { - return -1; - } - rc = flash_area_read(fap, off, key_buf, len); - if (rc) { - return rc; - } - key_id = bootutil_find_key(image_index, key_buf, len); - /* - * The key may not be found, which is acceptable. There - * can be multiple signatures, each preceded by a key. - */ -#endif /* !MCUBOOT_HW_KEY */ - } else if (type == EXPECTED_SIG_TLV) { - /* Ignore this signature if it is out of bounds. */ - if (key_id < 0 || key_id >= bootutil_key_cnt) { - key_id = -1; - continue; - } - if (!EXPECTED_SIG_LEN(len) || len > sizeof(buf)) { - return -1; - } - rc = flash_area_read(fap, off, buf, len); - if (rc) { - return -1; - } - rc = bootutil_verify_sig(hash, sizeof(hash), buf, len, key_id); - if (rc == 0) { - valid_signature = 1; - } - key_id = -1; -#endif /* EXPECTED_SIG_TLV */ -#ifdef MCUBOOT_HW_ROLLBACK_PROT - } else if (type == IMAGE_TLV_SEC_CNT) { - /* - * Verify the image's security counter. - * This must always be present. - */ - if (len != sizeof(img_security_cnt)) { - /* Security counter is not valid. */ - return -1; - } - - rc = flash_area_read(fap, off, &img_security_cnt, len); - if (rc) { - return rc; - } - - rc = boot_nv_security_counter_get(image_index, &security_cnt); - if (rc) { - return rc; - } - - /* Compare the new image's security counter value against the - * stored security counter value. - */ - if (img_security_cnt < security_cnt) { - /* The image's security counter is not accepted. */ - return -1; - } - - /* The image's security counter has been successfully verified. */ - security_counter_valid = 1; -#endif /* MCUBOOT_HW_ROLLBACK_PROT */ - } - } - - if (!sha256_valid) { - return -1; -#ifdef EXPECTED_SIG_TLV - } else if (!valid_signature) { - return -1; -#endif -#ifdef MCUBOOT_HW_ROLLBACK_PROT - } else if (!security_counter_valid) { - return -1; -#endif - } - - return 0; -} diff --git a/mcuboot/boot/bootutil/src/loader.c b/mcuboot/boot/bootutil/src/loader.c deleted file mode 100644 index b5cbe2833..000000000 --- a/mcuboot/boot/bootutil/src/loader.c +++ /dev/null @@ -1,1918 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2016-2020 Linaro LTD - * Copyright (c) 2016-2019 JUUL Labs - * Copyright (c) 2019-2020 Arm Limited - * - * Original license: - * - * 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. - */ - -/** - * This file provides an interface to the boot loader. Functions defined in - * this file should only be called while the boot loader is running. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "bootutil/bootutil.h" -#include "bootutil/image.h" -#include "bootutil_priv.h" -#include "swap_priv.h" -#include "bootutil/bootutil_log.h" -#include "bootutil/security_cnt.h" -#include "bootutil/boot_record.h" - -#ifdef MCUBOOT_ENC_IMAGES -#include "bootutil/enc_key.h" -#endif - -#include "mcuboot_config/mcuboot_config.h" - -MCUBOOT_LOG_MODULE_DECLARE(mcuboot); - -static struct boot_loader_state boot_data; - -#if (BOOT_IMAGE_NUMBER > 1) -#define IMAGES_ITER(x) for ((x) = 0; (x) < BOOT_IMAGE_NUMBER; ++(x)) -#else -#define IMAGES_ITER(x) -#endif - -/* - * This macro allows some control on the allocation of local variables. - * When running natively on a target, we don't want to allocated huge - * variables on the stack, so make them global instead. For the simulator - * we want to run as many threads as there are tests, and it's safer - * to just make those variables stack allocated. - */ -#if !defined(__BOOTSIM__) -#define TARGET_STATIC static -#else -#define TARGET_STATIC -#endif - -/* - * Compute the total size of the given image. Includes the size of - * the TLVs. - */ -#if !defined(MCUBOOT_OVERWRITE_ONLY) || defined(MCUBOOT_OVERWRITE_ONLY_FAST) -static int -boot_read_image_size(struct boot_loader_state *state, int slot, uint32_t *size) -{ - const struct flash_area *fap; - struct image_tlv_info info; - uint32_t off; - uint32_t protect_tlv_size; - int area_id; - int rc; - -#if (BOOT_IMAGE_NUMBER == 1) - (void)state; -#endif - - area_id = flash_area_id_from_multi_image_slot(BOOT_CURR_IMG(state), slot); - rc = flash_area_open(area_id, &fap); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - off = BOOT_TLV_OFF(boot_img_hdr(state, slot)); - - if (flash_area_read(fap, off, &info, sizeof(info))) { - rc = BOOT_EFLASH; - goto done; - } - - protect_tlv_size = boot_img_hdr(state, slot)->ih_protect_tlv_size; - if (info.it_magic == IMAGE_TLV_PROT_INFO_MAGIC) { - if (protect_tlv_size != info.it_tlv_tot) { - rc = BOOT_EBADIMAGE; - goto done; - } - - if (flash_area_read(fap, off + info.it_tlv_tot, &info, sizeof(info))) { - rc = BOOT_EFLASH; - goto done; - } - } else if (protect_tlv_size != 0) { - rc = BOOT_EBADIMAGE; - goto done; - } - - if (info.it_magic != IMAGE_TLV_INFO_MAGIC) { - rc = BOOT_EBADIMAGE; - goto done; - } - - *size = off + protect_tlv_size + info.it_tlv_tot; - rc = 0; - -done: - flash_area_close(fap); - return rc; -} -#endif /* !MCUBOOT_OVERWRITE_ONLY */ - -static int -boot_read_image_headers(struct boot_loader_state *state, bool require_all, - struct boot_status *bs) -{ - int rc; - int i; - - for (i = 0; i < BOOT_NUM_SLOTS; i++) { - rc = boot_read_image_header(state, i, boot_img_hdr(state, i), bs); - if (rc != 0) { - /* If `require_all` is set, fail on any single fail, otherwise - * if at least the first slot's header was read successfully, - * then the boot loader can attempt a boot. - * - * Failure to read any headers is a fatal error. - */ - if (i > 0 && !require_all) { - return 0; - } else { - return rc; - } - } - } - - return 0; -} - -static uint32_t -boot_write_sz(struct boot_loader_state *state) -{ - uint32_t elem_sz; -#if MCUBOOT_SWAP_USING_SCRATCH - uint32_t align; -#endif - - /* Figure out what size to write update status update as. The size depends - * on what the minimum write size is for scratch area, active image slot. - * We need to use the bigger of those 2 values. - */ - elem_sz = flash_area_align(BOOT_IMG_AREA(state, BOOT_PRIMARY_SLOT)); -#if MCUBOOT_SWAP_USING_SCRATCH - align = flash_area_align(BOOT_SCRATCH_AREA(state)); - if (align > elem_sz) { - elem_sz = align; - } -#endif - - return elem_sz; -} - -#ifndef MCUBOOT_USE_FLASH_AREA_GET_SECTORS -static int -boot_initialize_area(struct boot_loader_state *state, int flash_area) -{ - int num_sectors = BOOT_MAX_IMG_SECTORS; - int rc; - - if (flash_area == FLASH_AREA_IMAGE_PRIMARY(BOOT_CURR_IMG(state))) { - rc = flash_area_to_sectors(flash_area, &num_sectors, - BOOT_IMG(state, BOOT_PRIMARY_SLOT).sectors); - BOOT_IMG(state, BOOT_PRIMARY_SLOT).num_sectors = (size_t)num_sectors; - - } else if (flash_area == FLASH_AREA_IMAGE_SECONDARY(BOOT_CURR_IMG(state))) { - rc = flash_area_to_sectors(flash_area, &num_sectors, - BOOT_IMG(state, BOOT_SECONDARY_SLOT).sectors); - BOOT_IMG(state, BOOT_SECONDARY_SLOT).num_sectors = (size_t)num_sectors; - -#if MCUBOOT_SWAP_USING_SCRATCH - } else if (flash_area == FLASH_AREA_IMAGE_SCRATCH) { - rc = flash_area_to_sectors(flash_area, &num_sectors, - state->scratch.sectors); - state->scratch.num_sectors = (size_t)num_sectors; -#endif - - } else { - return BOOT_EFLASH; - } - - return rc; -} -#else /* defined(MCUBOOT_USE_FLASH_AREA_GET_SECTORS) */ -static int -boot_initialize_area(struct boot_loader_state *state, int flash_area) -{ - uint32_t num_sectors; - struct flash_sector *out_sectors; - size_t *out_num_sectors; - int rc; - - num_sectors = BOOT_MAX_IMG_SECTORS; - - if (flash_area == FLASH_AREA_IMAGE_PRIMARY(BOOT_CURR_IMG(state))) { - out_sectors = BOOT_IMG(state, BOOT_PRIMARY_SLOT).sectors; - out_num_sectors = &BOOT_IMG(state, BOOT_PRIMARY_SLOT).num_sectors; - } else if (flash_area == FLASH_AREA_IMAGE_SECONDARY(BOOT_CURR_IMG(state))) { - out_sectors = BOOT_IMG(state, BOOT_SECONDARY_SLOT).sectors; - out_num_sectors = &BOOT_IMG(state, BOOT_SECONDARY_SLOT).num_sectors; -#if MCUBOOT_SWAP_USING_SCRATCH - } else if (flash_area == FLASH_AREA_IMAGE_SCRATCH) { - out_sectors = state->scratch.sectors; - out_num_sectors = &state->scratch.num_sectors; -#endif - } else { - return BOOT_EFLASH; - } - - rc = flash_area_get_sectors(flash_area, &num_sectors, out_sectors); - if (rc != 0) { - return rc; - } - *out_num_sectors = num_sectors; - return 0; -} -#endif /* !defined(MCUBOOT_USE_FLASH_AREA_GET_SECTORS) */ - -/** - * Determines the sector layout of both image slots and the scratch area. - * This information is necessary for calculating the number of bytes to erase - * and copy during an image swap. The information collected during this - * function is used to populate the state. - */ -static int -boot_read_sectors(struct boot_loader_state *state) -{ - uint8_t image_index; - int rc; - - image_index = BOOT_CURR_IMG(state); - - rc = boot_initialize_area(state, FLASH_AREA_IMAGE_PRIMARY(image_index)); - if (rc != 0) { - return BOOT_EFLASH; - } - - rc = boot_initialize_area(state, FLASH_AREA_IMAGE_SECONDARY(image_index)); - if (rc != 0) { - return BOOT_EFLASH; - } - -#if MCUBOOT_SWAP_USING_SCRATCH - rc = boot_initialize_area(state, FLASH_AREA_IMAGE_SCRATCH); - if (rc != 0) { - return BOOT_EFLASH; - } -#endif - - BOOT_WRITE_SZ(state) = boot_write_sz(state); - - return 0; -} - -void -boot_status_reset(struct boot_status *bs) -{ -#ifdef MCUBOOT_ENC_IMAGES - memset(&bs->enckey, 0xff, BOOT_NUM_SLOTS * BOOT_ENC_KEY_SIZE); -#if MCUBOOT_SWAP_SAVE_ENCTLV - memset(&bs->enctlv, 0xff, BOOT_NUM_SLOTS * BOOT_ENC_TLV_ALIGN_SIZE); -#endif -#endif /* MCUBOOT_ENC_IMAGES */ - - bs->use_scratch = 0; - bs->swap_size = 0; - bs->source = 0; - - bs->op = BOOT_STATUS_OP_MOVE; - bs->idx = BOOT_STATUS_IDX_0; - bs->state = BOOT_STATUS_STATE_0; - bs->swap_type = BOOT_SWAP_TYPE_NONE; -} - -bool -boot_status_is_reset(const struct boot_status *bs) -{ - return (bs->op == BOOT_STATUS_OP_MOVE && - bs->idx == BOOT_STATUS_IDX_0 && - bs->state == BOOT_STATUS_STATE_0); -} - -/** - * Writes the supplied boot status to the flash file system. The boot status - * contains the current state of an in-progress image copy operation. - * - * @param bs The boot status to write. - * - * @return 0 on success; nonzero on failure. - */ -int -boot_write_status(const struct boot_loader_state *state, struct boot_status *bs) -{ - const struct flash_area *fap; - uint32_t off; - int area_id; - int rc; - uint8_t buf[BOOT_MAX_ALIGN]; - uint8_t align; - uint8_t erased_val; - - /* NOTE: The first sector copied (that is the last sector on slot) contains - * the trailer. Since in the last step the primary slot is erased, the - * first two status writes go to the scratch which will be copied to - * the primary slot! - */ - -#if MCUBOOT_SWAP_USING_SCRATCH - if (bs->use_scratch) { - /* Write to scratch. */ - area_id = FLASH_AREA_IMAGE_SCRATCH; - } else { -#endif - /* Write to the primary slot. */ - area_id = FLASH_AREA_IMAGE_PRIMARY(BOOT_CURR_IMG(state)); -#if MCUBOOT_SWAP_USING_SCRATCH - } -#endif - - rc = flash_area_open(area_id, &fap); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - off = boot_status_off(fap) + - boot_status_internal_off(bs, BOOT_WRITE_SZ(state)); - align = flash_area_align(fap); - erased_val = flash_area_erased_val(fap); - memset(buf, erased_val, BOOT_MAX_ALIGN); - buf[0] = bs->state; - - rc = flash_area_write(fap, off, buf, align); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - rc = 0; - -done: - flash_area_close(fap); - return rc; -} - -/* - * Validate image hash/signature and optionally the security counter in a slot. - */ -static int -boot_image_check(struct boot_loader_state *state, struct image_header *hdr, - const struct flash_area *fap, struct boot_status *bs) -{ - TARGET_STATIC uint8_t tmpbuf[BOOT_TMPBUF_SZ]; - uint8_t image_index; - int rc; - -#if (BOOT_IMAGE_NUMBER == 1) - (void)state; -#endif - - (void)bs; - (void)rc; - - image_index = BOOT_CURR_IMG(state); - -#ifdef MCUBOOT_ENC_IMAGES - if (MUST_DECRYPT(fap, image_index, hdr)) { - rc = boot_enc_load(BOOT_CURR_ENC(state), image_index, hdr, fap, bs); - if (rc < 0) { - return BOOT_EBADIMAGE; - } - if (rc == 0 && boot_enc_set_key(BOOT_CURR_ENC(state), 1, bs)) { - return BOOT_EBADIMAGE; - } - } -#endif - - if (bootutil_img_validate(BOOT_CURR_ENC(state), image_index, hdr, fap, tmpbuf, - BOOT_TMPBUF_SZ, NULL, 0, NULL)) { - return BOOT_EBADIMAGE; - } - - return 0; -} - -static int -split_image_check(struct image_header *app_hdr, - const struct flash_area *app_fap, - struct image_header *loader_hdr, - const struct flash_area *loader_fap) -{ - static void *tmpbuf; - uint8_t loader_hash[32]; - - if (!tmpbuf) { - tmpbuf = malloc(BOOT_TMPBUF_SZ); - if (!tmpbuf) { - return BOOT_ENOMEM; - } - } - - if (bootutil_img_validate(NULL, 0, loader_hdr, loader_fap, tmpbuf, - BOOT_TMPBUF_SZ, NULL, 0, loader_hash)) { - return BOOT_EBADIMAGE; - } - - if (bootutil_img_validate(NULL, 0, app_hdr, app_fap, tmpbuf, - BOOT_TMPBUF_SZ, loader_hash, 32, NULL)) { - return BOOT_EBADIMAGE; - } - - return 0; -} - -/* - * Check that this is a valid header. Valid means that the magic is - * correct, and that the sizes/offsets are "sane". Sane means that - * there is no overflow on the arithmetic, and that the result fits - * within the flash area we are in. - */ -static bool -boot_is_header_valid(const struct image_header *hdr, const struct flash_area *fap) -{ - uint32_t size; - - if (hdr->ih_magic != IMAGE_MAGIC) { - return false; - } - - if (!boot_u32_safe_add(&size, hdr->ih_img_size, hdr->ih_hdr_size)) { - return false; - } - - if (size >= fap->fa_size) { - return false; - } - - return true; -} - -/* - * Check that a memory area consists of a given value. - */ -static inline bool -boot_data_is_set_to(uint8_t val, void *data, size_t len) -{ - uint8_t i; - uint8_t *p = (uint8_t *)data; - for (i = 0; i < len; i++) { - if (val != p[i]) { - return false; - } - } - return true; -} - -static int -boot_check_header_erased(struct boot_loader_state *state, int slot) -{ - const struct flash_area *fap; - struct image_header *hdr; - uint8_t erased_val; - int area_id; - int rc; - - area_id = flash_area_id_from_multi_image_slot(BOOT_CURR_IMG(state), slot); - rc = flash_area_open(area_id, &fap); - if (rc != 0) { - return -1; - } - - erased_val = flash_area_erased_val(fap); - flash_area_close(fap); - - hdr = boot_img_hdr(state, slot); - if (!boot_data_is_set_to(erased_val, &hdr->ih_magic, sizeof(hdr->ih_magic))) { - return -1; - } - - return 0; -} - -#if (BOOT_IMAGE_NUMBER > 1) || \ - (defined(MCUBOOT_OVERWRITE_ONLY) && defined(MCUBOOT_DOWNGRADE_PREVENTION)) -/** - * Check if the version of the image is not older than required. - * - * @param req Required minimal image version. - * @param ver Version of the image to be checked. - * - * @return 0 if the version is sufficient, nonzero otherwise. - */ -static int -boot_is_version_sufficient(struct image_version *req, - struct image_version *ver) -{ - if (ver->iv_major > req->iv_major) { - return 0; - } - if (ver->iv_major < req->iv_major) { - return BOOT_EBADVERSION; - } - /* The major version numbers are equal. */ - if (ver->iv_minor > req->iv_minor) { - return 0; - } - if (ver->iv_minor < req->iv_minor) { - return BOOT_EBADVERSION; - } - /* The minor version numbers are equal. */ - if (ver->iv_revision < req->iv_revision) { - return BOOT_EBADVERSION; - } - - return 0; -} -#endif - -/* - * Check that there is a valid image in a slot - * - * @returns - * 0 if image was successfully validated - * 1 if no bootloable image was found - * -1 on any errors - */ -static int -boot_validate_slot(struct boot_loader_state *state, int slot, - struct boot_status *bs) -{ - const struct flash_area *fap; - struct image_header *hdr; - int area_id; - int rc; - - area_id = flash_area_id_from_multi_image_slot(BOOT_CURR_IMG(state), slot); - rc = flash_area_open(area_id, &fap); - if (rc != 0) { - return -1; - } - - hdr = boot_img_hdr(state, slot); - if (boot_check_header_erased(state, slot) == 0 || - (hdr->ih_flags & IMAGE_F_NON_BOOTABLE)) { - /* No bootable image in slot; continue booting from the primary slot. */ - rc = 1; - goto out; - } - -#if defined(MCUBOOT_OVERWRITE_ONLY) && defined(MCUBOOT_DOWNGRADE_PREVENTION) - if (slot != BOOT_PRIMARY_SLOT) { - /* Check if version of secondary slot is sufficient */ - rc = boot_is_version_sufficient( - &boot_img_hdr(state, BOOT_PRIMARY_SLOT)->ih_ver, - &boot_img_hdr(state, BOOT_SECONDARY_SLOT)->ih_ver); - if (rc != 0 && boot_check_header_erased(state, BOOT_PRIMARY_SLOT)) { - BOOT_LOG_ERR("insufficient version in secondary slot"); - flash_area_erase(fap, 0, fap->fa_size); - /* Image in the secondary slot does not satisfy version requirement. - * Erase the image and continue booting from the primary slot. - */ - rc = 1; - goto out; - } - } -#endif - - if (!boot_is_header_valid(hdr, fap) || boot_image_check(state, hdr, fap, bs)) { - if (slot != BOOT_PRIMARY_SLOT) { - flash_area_erase(fap, 0, fap->fa_size); - /* Image in the secondary slot is invalid. Erase the image and - * continue booting from the primary slot. - */ - } -#if !defined(__BOOTSIM__) - BOOT_LOG_ERR("Image in the %s slot is not valid!", - (slot == BOOT_PRIMARY_SLOT) ? "primary" : "secondary"); -#endif - rc = 1; - goto out; - } - - /* Image in the secondary slot is valid. */ - rc = 0; - -out: - flash_area_close(fap); - return rc; -} - -/** - * Determines which swap operation to perform, if any. If it is determined - * that a swap operation is required, the image in the secondary slot is checked - * for validity. If the image in the secondary slot is invalid, it is erased, - * and a swap type of "none" is indicated. - * - * @return The type of swap to perform (BOOT_SWAP_TYPE...) - */ -static int -boot_validated_swap_type(struct boot_loader_state *state, - struct boot_status *bs) -{ - int swap_type; - int rc; - - swap_type = boot_swap_type_multi(BOOT_CURR_IMG(state)); - if (BOOT_IS_UPGRADE(swap_type)) { - /* Boot loader wants to switch to the secondary slot. - * Ensure image is valid. - */ - rc = boot_validate_slot(state, BOOT_SECONDARY_SLOT, bs); - if (rc == 1) { - swap_type = BOOT_SWAP_TYPE_NONE; - } else if (rc != 0) { - swap_type = BOOT_SWAP_TYPE_FAIL; - } - } - - return swap_type; -} - -#ifdef MCUBOOT_HW_ROLLBACK_PROT -/** - * Updates the stored security counter value with the image's security counter - * value which resides in the given slot, only if it's greater than the stored - * value. - * - * @param image_index Index of the image to determine which security - * counter to update. - * @param slot Slot number of the image. - * @param hdr Pointer to the image header structure of the image - * that is currently stored in the given slot. - * - * @return 0 on success; nonzero on failure. - */ -static int -boot_update_security_counter(uint8_t image_index, int slot, - struct image_header *hdr) -{ - const struct flash_area *fap = NULL; - uint32_t img_security_cnt; - int rc; - - rc = flash_area_open(flash_area_id_from_multi_image_slot(image_index, slot), - &fap); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - rc = bootutil_get_img_security_cnt(hdr, fap, &img_security_cnt); - if (rc != 0) { - goto done; - } - - rc = boot_nv_security_counter_update(image_index, img_security_cnt); - if (rc != 0) { - goto done; - } - -done: - flash_area_close(fap); - return rc; -} -#endif /* MCUBOOT_HW_ROLLBACK_PROT */ - -/** - * Erases a region of flash. - * - * @param flash_area The flash_area containing the region to erase. - * @param off The offset within the flash area to start the - * erase. - * @param sz The number of bytes to erase. - * - * @return 0 on success; nonzero on failure. - */ -int -boot_erase_region(const struct flash_area *fap, uint32_t off, uint32_t sz) -{ - return flash_area_erase(fap, off, sz); -} - -/** - * Copies the contents of one flash region to another. You must erase the - * destination region prior to calling this function. - * - * @param flash_area_id_src The ID of the source flash area. - * @param flash_area_id_dst The ID of the destination flash area. - * @param off_src The offset within the source flash area to - * copy from. - * @param off_dst The offset within the destination flash area to - * copy to. - * @param sz The number of bytes to copy. - * - * @return 0 on success; nonzero on failure. - */ -int -boot_copy_region(struct boot_loader_state *state, - const struct flash_area *fap_src, - const struct flash_area *fap_dst, - uint32_t off_src, uint32_t off_dst, uint32_t sz) -{ - uint32_t bytes_copied; - int chunk_sz; - int rc; -#ifdef MCUBOOT_ENC_IMAGES - uint32_t off; - uint32_t tlv_off; - size_t blk_off; - struct image_header *hdr; - uint16_t idx; - uint32_t blk_sz; - uint8_t image_index; -#endif - - TARGET_STATIC uint8_t buf[1024]; - -#if !defined(MCUBOOT_ENC_IMAGES) - (void)state; -#endif - - bytes_copied = 0; - while (bytes_copied < sz) { - if (sz - bytes_copied > sizeof buf) { - chunk_sz = sizeof buf; - } else { - chunk_sz = sz - bytes_copied; - } - - rc = flash_area_read(fap_src, off_src + bytes_copied, buf, chunk_sz); - if (rc != 0) { - return BOOT_EFLASH; - } - -#ifdef MCUBOOT_ENC_IMAGES - image_index = BOOT_CURR_IMG(state); - if ((fap_src->fa_id == FLASH_AREA_IMAGE_SECONDARY(image_index) || - fap_dst->fa_id == FLASH_AREA_IMAGE_SECONDARY(image_index)) && - !(fap_src->fa_id == FLASH_AREA_IMAGE_SECONDARY(image_index) && - fap_dst->fa_id == FLASH_AREA_IMAGE_SECONDARY(image_index))) { - /* assume the secondary slot as src, needs decryption */ - hdr = boot_img_hdr(state, BOOT_SECONDARY_SLOT); -#if !defined(MCUBOOT_SWAP_USING_MOVE) - off = off_src; - if (fap_dst->fa_id == FLASH_AREA_IMAGE_SECONDARY(image_index)) { - /* might need encryption (metadata from the primary slot) */ - hdr = boot_img_hdr(state, BOOT_PRIMARY_SLOT); - off = off_dst; - } -#else - off = off_dst; - if (fap_dst->fa_id == FLASH_AREA_IMAGE_SECONDARY(image_index)) { - hdr = boot_img_hdr(state, BOOT_PRIMARY_SLOT); - } -#endif - if (IS_ENCRYPTED(hdr)) { - blk_sz = chunk_sz; - idx = 0; - if (off + bytes_copied < hdr->ih_hdr_size) { - /* do not decrypt header */ - blk_off = 0; - blk_sz = chunk_sz - hdr->ih_hdr_size; - idx = hdr->ih_hdr_size; - } else { - blk_off = ((off + bytes_copied) - hdr->ih_hdr_size) & 0xf; - } - tlv_off = BOOT_TLV_OFF(hdr); - if (off + bytes_copied + chunk_sz > tlv_off) { - /* do not decrypt TLVs */ - if (off + bytes_copied >= tlv_off) { - blk_sz = 0; - } else { - blk_sz = tlv_off - (off + bytes_copied); - } - } - boot_encrypt(BOOT_CURR_ENC(state), image_index, fap_src, - (off + bytes_copied + idx) - hdr->ih_hdr_size, blk_sz, - blk_off, &buf[idx]); - } - } -#endif - - rc = flash_area_write(fap_dst, off_dst + bytes_copied, buf, chunk_sz); - if (rc != 0) { - return BOOT_EFLASH; - } - - bytes_copied += chunk_sz; - - MCUBOOT_WATCHDOG_FEED(); - } - - return 0; -} - -/** - * Overwrite primary slot with the image contained in the secondary slot. - * If a prior copy operation was interrupted by a system reset, this function - * redos the copy. - * - * @param bs The current boot status. This function reads - * this struct to determine if it is resuming - * an interrupted swap operation. This - * function writes the updated status to this - * function on return. - * - * @return 0 on success; nonzero on failure. - */ -#if defined(MCUBOOT_OVERWRITE_ONLY) || defined(MCUBOOT_BOOTSTRAP) -static int -boot_copy_image(struct boot_loader_state *state, struct boot_status *bs) -{ - size_t sect_count; - size_t sect; - int rc; - size_t size; - size_t this_size; - size_t last_sector; - const struct flash_area *fap_primary_slot; - const struct flash_area *fap_secondary_slot; - uint8_t image_index; - - (void)bs; - -#if defined(MCUBOOT_OVERWRITE_ONLY_FAST) - uint32_t src_size = 0; - rc = boot_read_image_size(state, BOOT_SECONDARY_SLOT, &src_size); - assert(rc == 0); -#endif - - BOOT_LOG_INF("Image upgrade secondary slot -> primary slot"); - BOOT_LOG_INF("Erasing the primary slot"); - - image_index = BOOT_CURR_IMG(state); - - rc = flash_area_open(FLASH_AREA_IMAGE_PRIMARY(image_index), - &fap_primary_slot); - assert (rc == 0); - - rc = flash_area_open(FLASH_AREA_IMAGE_SECONDARY(image_index), - &fap_secondary_slot); - assert (rc == 0); - - sect_count = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT); - for (sect = 0, size = 0; sect < sect_count; sect++) { - this_size = boot_img_sector_size(state, BOOT_PRIMARY_SLOT, sect); - rc = boot_erase_region(fap_primary_slot, size, this_size); - assert(rc == 0); - - size += this_size; - -#if defined(MCUBOOT_OVERWRITE_ONLY_FAST) - if (size >= src_size) { - break; - } -#endif - } - -#ifdef MCUBOOT_ENC_IMAGES - if (IS_ENCRYPTED(boot_img_hdr(state, BOOT_SECONDARY_SLOT))) { - rc = boot_enc_load(BOOT_CURR_ENC(state), image_index, - boot_img_hdr(state, BOOT_SECONDARY_SLOT), - fap_secondary_slot, bs); - - if (rc < 0) { - return BOOT_EBADIMAGE; - } - if (rc == 0 && boot_enc_set_key(BOOT_CURR_ENC(state), 1, bs)) { - return BOOT_EBADIMAGE; - } - } -#endif - - BOOT_LOG_INF("Copying the secondary slot to the primary slot: 0x%zx bytes", - size); - rc = boot_copy_region(state, fap_secondary_slot, fap_primary_slot, 0, 0, size); - -#ifdef MCUBOOT_HW_ROLLBACK_PROT - /* Update the stored security counter with the new image's security counter - * value. Both slots hold the new image at this point, but the secondary - * slot's image header must be passed since the image headers in the - * boot_data structure have not been updated yet. - */ - rc = boot_update_security_counter(BOOT_CURR_IMG(state), BOOT_PRIMARY_SLOT, - boot_img_hdr(state, BOOT_SECONDARY_SLOT)); - if (rc != 0) { - BOOT_LOG_ERR("Security counter update failed after image upgrade."); - return rc; - } -#endif /* MCUBOOT_HW_ROLLBACK_PROT */ - - /* - * Erases header and trailer. The trailer is erased because when a new - * image is written without a trailer as is the case when using newt, the - * trailer that was left might trigger a new upgrade. - */ - BOOT_LOG_DBG("erasing secondary header"); - rc = boot_erase_region(fap_secondary_slot, - boot_img_sector_off(state, BOOT_SECONDARY_SLOT, 0), - boot_img_sector_size(state, BOOT_SECONDARY_SLOT, 0)); - assert(rc == 0); - last_sector = boot_img_num_sectors(state, BOOT_SECONDARY_SLOT) - 1; - BOOT_LOG_DBG("erasing secondary trailer"); - rc = boot_erase_region(fap_secondary_slot, - boot_img_sector_off(state, BOOT_SECONDARY_SLOT, - last_sector), - boot_img_sector_size(state, BOOT_SECONDARY_SLOT, - last_sector)); - assert(rc == 0); - - flash_area_close(fap_primary_slot); - flash_area_close(fap_secondary_slot); - - /* TODO: Perhaps verify the primary slot's signature again? */ - - return 0; -} -#endif - -#if !defined(MCUBOOT_OVERWRITE_ONLY) -/** - * Swaps the two images in flash. If a prior copy operation was interrupted - * by a system reset, this function completes that operation. - * - * @param bs The current boot status. This function reads - * this struct to determine if it is resuming - * an interrupted swap operation. This - * function writes the updated status to this - * function on return. - * - * @return 0 on success; nonzero on failure. - */ -static int -boot_swap_image(struct boot_loader_state *state, struct boot_status *bs) -{ - struct image_header *hdr; -#ifdef MCUBOOT_ENC_IMAGES - const struct flash_area *fap; - uint8_t slot; - uint8_t i; -#endif - uint32_t size; - uint32_t copy_size; - uint8_t image_index; - int rc; - - /* FIXME: just do this if asked by user? */ - - size = copy_size = 0; - image_index = BOOT_CURR_IMG(state); - - if (boot_status_is_reset(bs)) { - /* - * No swap ever happened, so need to find the largest image which - * will be used to determine the amount of sectors to swap. - */ - hdr = boot_img_hdr(state, BOOT_PRIMARY_SLOT); - if (hdr->ih_magic == IMAGE_MAGIC) { - rc = boot_read_image_size(state, BOOT_PRIMARY_SLOT, ©_size); - assert(rc == 0); - } - -#ifdef MCUBOOT_ENC_IMAGES - if (IS_ENCRYPTED(hdr)) { - fap = BOOT_IMG_AREA(state, BOOT_PRIMARY_SLOT); - rc = boot_enc_load(BOOT_CURR_ENC(state), image_index, hdr, fap, bs); - assert(rc >= 0); - - if (rc == 0) { - rc = boot_enc_set_key(BOOT_CURR_ENC(state), 0, bs); - assert(rc == 0); - } else { - rc = 0; - } - } else { - memset(bs->enckey[0], 0xff, BOOT_ENC_KEY_SIZE); - } -#endif - - hdr = boot_img_hdr(state, BOOT_SECONDARY_SLOT); - if (hdr->ih_magic == IMAGE_MAGIC) { - rc = boot_read_image_size(state, BOOT_SECONDARY_SLOT, &size); - assert(rc == 0); - } - -#ifdef MCUBOOT_ENC_IMAGES - hdr = boot_img_hdr(state, BOOT_SECONDARY_SLOT); - if (IS_ENCRYPTED(hdr)) { - fap = BOOT_IMG_AREA(state, BOOT_SECONDARY_SLOT); - rc = boot_enc_load(BOOT_CURR_ENC(state), image_index, hdr, fap, bs); - assert(rc >= 0); - - if (rc == 0) { - rc = boot_enc_set_key(BOOT_CURR_ENC(state), 1, bs); - assert(rc == 0); - } else { - rc = 0; - } - } else { - memset(bs->enckey[1], 0xff, BOOT_ENC_KEY_SIZE); - } -#endif - - if (size > copy_size) { - copy_size = size; - } - - bs->swap_size = copy_size; - } else { - /* - * If a swap was under way, the swap_size should already be present - * in the trailer... - */ - rc = boot_read_swap_size(image_index, &bs->swap_size); - assert(rc == 0); - - copy_size = bs->swap_size; - -#ifdef MCUBOOT_ENC_IMAGES - for (slot = 0; slot < BOOT_NUM_SLOTS; slot++) { - rc = boot_read_enc_key(image_index, slot, bs); - assert(rc == 0); - - for (i = 0; i < BOOT_ENC_KEY_SIZE; i++) { - if (bs->enckey[slot][i] != 0xff) { - break; - } - } - - if (i != BOOT_ENC_KEY_SIZE) { - boot_enc_set_key(BOOT_CURR_ENC(state), slot, bs); - } - } -#endif - } - - swap_run(state, bs, copy_size); - -#ifdef MCUBOOT_VALIDATE_PRIMARY_SLOT - extern int boot_status_fails; - if (boot_status_fails > 0) { - BOOT_LOG_WRN("%d status write fails performing the swap", - boot_status_fails); - } -#endif - - return 0; -} -#endif - -#if (BOOT_IMAGE_NUMBER > 1) -/** - * Check the image dependency whether it is satisfied and modify - * the swap type if necessary. - * - * @param dep Image dependency which has to be verified. - * - * @return 0 on success; nonzero on failure. - */ -static int -boot_verify_slot_dependency(struct boot_loader_state *state, - struct image_dependency *dep) -{ - struct image_version *dep_version; - size_t dep_slot; - int rc; - uint8_t swap_type; - - /* Determine the source of the image which is the subject of - * the dependency and get it's version. */ - swap_type = state->swap_type[dep->image_id]; - dep_slot = BOOT_IS_UPGRADE(swap_type) ? BOOT_SECONDARY_SLOT - : BOOT_PRIMARY_SLOT; - dep_version = &state->imgs[dep->image_id][dep_slot].hdr.ih_ver; - - rc = boot_is_version_sufficient(&dep->image_min_version, dep_version); - if (rc != 0) { - /* Dependency not satisfied. - * Modify the swap type to decrease the version number of the image - * (which will be located in the primary slot after the boot process), - * consequently the number of unsatisfied dependencies will be - * decreased or remain the same. - */ - switch (BOOT_SWAP_TYPE(state)) { - case BOOT_SWAP_TYPE_TEST: - case BOOT_SWAP_TYPE_PERM: - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_NONE; - break; - case BOOT_SWAP_TYPE_NONE: - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_REVERT; - break; - default: - break; - } - } - - return rc; -} - -/** - * Read all dependency TLVs of an image from the flash and verify - * one after another to see if they are all satisfied. - * - * @param slot Image slot number. - * - * @return 0 on success; nonzero on failure. - */ -static int -boot_verify_slot_dependencies(struct boot_loader_state *state, uint32_t slot) -{ - const struct flash_area *fap; - struct image_tlv_iter it; - struct image_dependency dep; - uint32_t off; - uint16_t len; - int area_id; - int rc; - - area_id = flash_area_id_from_multi_image_slot(BOOT_CURR_IMG(state), slot); - rc = flash_area_open(area_id, &fap); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - rc = bootutil_tlv_iter_begin(&it, boot_img_hdr(state, slot), fap, - IMAGE_TLV_DEPENDENCY, true); - if (rc != 0) { - goto done; - } - - while (true) { - rc = bootutil_tlv_iter_next(&it, &off, &len, NULL); - if (rc < 0) { - return -1; - } else if (rc > 0) { - rc = 0; - break; - } - - if (len != sizeof(dep)) { - rc = BOOT_EBADIMAGE; - goto done; - } - - rc = flash_area_read(fap, off, &dep, len); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - if (dep.image_id >= BOOT_IMAGE_NUMBER) { - rc = BOOT_EBADARGS; - goto done; - } - - /* Verify dependency and modify the swap type if not satisfied. */ - rc = boot_verify_slot_dependency(state, &dep); - if (rc != 0) { - /* Dependency not satisfied. */ - goto done; - } - } - -done: - flash_area_close(fap); - return rc; -} - -/** - * Iterate over all the images and verify whether the image dependencies in the - * TLV area are all satisfied and update the related swap type if necessary. - */ -static int -boot_verify_dependencies(struct boot_loader_state *state) -{ - int rc = -1; - uint8_t slot; - - BOOT_CURR_IMG(state) = 0; - while (BOOT_CURR_IMG(state) < BOOT_IMAGE_NUMBER) { - if (BOOT_SWAP_TYPE(state) != BOOT_SWAP_TYPE_NONE && - BOOT_SWAP_TYPE(state) != BOOT_SWAP_TYPE_FAIL) { - slot = BOOT_SECONDARY_SLOT; - } else { - slot = BOOT_PRIMARY_SLOT; - } - - rc = boot_verify_slot_dependencies(state, slot); - if (rc == 0) { - /* All dependencies've been satisfied, continue with next image. */ - BOOT_CURR_IMG(state)++; - } else if (rc == BOOT_EBADVERSION) { - /* Cannot upgrade due to non-met dependencies, so disable all - * image upgrades. - */ - for (int idx = 0; idx < BOOT_IMAGE_NUMBER; idx++) { - BOOT_CURR_IMG(state) = idx; - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_NONE; - } - break; - } else { - /* Other error happened, images are inconsistent */ - return rc; - } - } - return rc; -} -#endif /* (BOOT_IMAGE_NUMBER > 1) */ - -/** - * Performs a clean (not aborted) image update. - * - * @param bs The current boot status. - * - * @return 0 on success; nonzero on failure. - */ -static int -boot_perform_update(struct boot_loader_state *state, struct boot_status *bs) -{ - int rc; -#ifndef MCUBOOT_OVERWRITE_ONLY - uint8_t swap_type; -#endif - - /* At this point there are no aborted swaps. */ -#if defined(MCUBOOT_OVERWRITE_ONLY) - rc = boot_copy_image(state, bs); -#elif defined(MCUBOOT_BOOTSTRAP) - /* Check if the image update was triggered by a bad image in the - * primary slot (the validity of the image in the secondary slot had - * already been checked). - */ - if (boot_check_header_erased(state, BOOT_PRIMARY_SLOT) == 0 || - boot_validate_slot(state, BOOT_PRIMARY_SLOT, bs) != 0) { - rc = boot_copy_image(state, bs); - } else { - rc = boot_swap_image(state, bs); - } -#else - rc = boot_swap_image(state, bs); -#endif - assert(rc == 0); - -#ifndef MCUBOOT_OVERWRITE_ONLY - /* The following state needs image_ok be explicitly set after the - * swap was finished to avoid a new revert. - */ - swap_type = BOOT_SWAP_TYPE(state); - if (swap_type == BOOT_SWAP_TYPE_REVERT || - swap_type == BOOT_SWAP_TYPE_PERM) { - rc = swap_set_image_ok(BOOT_CURR_IMG(state)); - if (rc != 0) { - BOOT_SWAP_TYPE(state) = swap_type = BOOT_SWAP_TYPE_PANIC; - } - } - -#ifdef MCUBOOT_HW_ROLLBACK_PROT - if (swap_type == BOOT_SWAP_TYPE_PERM) { - /* Update the stored security counter with the new image's security - * counter value. The primary slot holds the new image at this point, - * but the secondary slot's image header must be passed since image - * headers in the boot_data structure have not been updated yet. - * - * In case of a permanent image swap mcuboot will never attempt to - * revert the images on the next reboot. Therefore, the security - * counter must be increased right after the image upgrade. - */ - rc = boot_update_security_counter( - BOOT_CURR_IMG(state), - BOOT_PRIMARY_SLOT, - boot_img_hdr(state, BOOT_SECONDARY_SLOT)); - if (rc != 0) { - BOOT_LOG_ERR("Security counter update failed after " - "image upgrade."); - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_PANIC; - } - } -#endif /* MCUBOOT_HW_ROLLBACK_PROT */ - - if (BOOT_IS_UPGRADE(swap_type)) { - rc = swap_set_copy_done(BOOT_CURR_IMG(state)); - if (rc != 0) { - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_PANIC; - } - } -#endif /* !MCUBOOT_OVERWRITE_ONLY */ - - return rc; -} - -/** - * Completes a previously aborted image swap. - * - * @param bs The current boot status. - * - * @return 0 on success; nonzero on failure. - */ -#if !defined(MCUBOOT_OVERWRITE_ONLY) -static int -boot_complete_partial_swap(struct boot_loader_state *state, - struct boot_status *bs) -{ - int rc; - - /* Determine the type of swap operation being resumed from the - * `swap-type` trailer field. - */ - rc = boot_swap_image(state, bs); - assert(rc == 0); - - BOOT_SWAP_TYPE(state) = bs->swap_type; - - /* The following states need image_ok be explicitly set after the - * swap was finished to avoid a new revert. - */ - if (bs->swap_type == BOOT_SWAP_TYPE_REVERT || - bs->swap_type == BOOT_SWAP_TYPE_PERM) { - rc = swap_set_image_ok(BOOT_CURR_IMG(state)); - if (rc != 0) { - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_PANIC; - } - } - - if (BOOT_IS_UPGRADE(bs->swap_type)) { - rc = swap_set_copy_done(BOOT_CURR_IMG(state)); - if (rc != 0) { - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_PANIC; - } - } - - if (BOOT_SWAP_TYPE(state) == BOOT_SWAP_TYPE_PANIC) { - BOOT_LOG_ERR("panic!"); - assert(0); - - /* Loop forever... */ - while (1) {} - } - - return rc; -} -#endif /* !MCUBOOT_OVERWRITE_ONLY */ - -#if (BOOT_IMAGE_NUMBER > 1) -/** - * Review the validity of previously determined swap types of other images. - * - * @param aborted_swap The current image upgrade is a - * partial/aborted swap. - */ -static void -boot_review_image_swap_types(struct boot_loader_state *state, - bool aborted_swap) -{ - /* In that case if we rebooted in the middle of an image upgrade process, we - * must review the validity of swap types, that were previously determined - * for other images. The image_ok flag had not been set before the reboot - * for any of the updated images (only the copy_done flag) and thus falsely - * the REVERT swap type has been determined for the previous images that had - * been updated before the reboot. - * - * There are two separate scenarios that we have to deal with: - * - * 1. The reboot has happened during swapping an image: - * The current image upgrade has been determined as a - * partial/aborted swap. - * 2. The reboot has happened between two separate image upgrades: - * In this scenario we must check the swap type of the current image. - * In those cases if it is NONE or REVERT we cannot certainly determine - * the fact of a reboot. In a consistent state images must move in the - * same direction or stay in place, e.g. in practice REVERT and TEST - * swap types cannot be present at the same time. If the swap type of - * the current image is either TEST, PERM or FAIL we must review the - * already determined swap types of other images and set each false - * REVERT swap types to NONE (these images had been successfully - * updated before the system rebooted between two separate image - * upgrades). - */ - - if (BOOT_CURR_IMG(state) == 0) { - /* Nothing to do */ - return; - } - - if (!aborted_swap) { - if ((BOOT_SWAP_TYPE(state) == BOOT_SWAP_TYPE_NONE) || - (BOOT_SWAP_TYPE(state) == BOOT_SWAP_TYPE_REVERT)) { - /* Nothing to do */ - return; - } - } - - for (uint8_t i = 0; i < BOOT_CURR_IMG(state); i++) { - if (state->swap_type[i] == BOOT_SWAP_TYPE_REVERT) { - state->swap_type[i] = BOOT_SWAP_TYPE_NONE; - } - } -} -#endif - -/** - * Prepare image to be updated if required. - * - * Prepare image to be updated if required with completing an image swap - * operation if one was aborted and/or determining the type of the - * swap operation. In case of any error set the swap type to NONE. - * - * @param state TODO - * @param bs Pointer where the read and possibly updated - * boot status can be written to. - */ -static void -boot_prepare_image_for_update(struct boot_loader_state *state, - struct boot_status *bs) -{ - int rc; - - /* Determine the sector layout of the image slots and scratch area. */ - rc = boot_read_sectors(state); - if (rc != 0) { - BOOT_LOG_WRN("Failed reading sectors; BOOT_MAX_IMG_SECTORS=%d" - " - too small?", BOOT_MAX_IMG_SECTORS); - /* Unable to determine sector layout, continue with next image - * if there is one. - */ - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_NONE; - return; - } - - /* Attempt to read an image header from each slot. */ - rc = boot_read_image_headers(state, false, NULL); - if (rc != 0) { - /* Continue with next image if there is one. */ - BOOT_LOG_WRN("Failed reading image headers; Image=%u", - BOOT_CURR_IMG(state)); - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_NONE; - return; - } - - /* If the current image's slots aren't compatible, no swap is possible. - * Just boot into primary slot. - */ - if (boot_slots_compatible(state)) { - boot_status_reset(bs); - -#ifndef MCUBOOT_OVERWRITE_ONLY - rc = swap_read_status(state, bs); - if (rc != 0) { - BOOT_LOG_WRN("Failed reading boot status; Image=%u", - BOOT_CURR_IMG(state)); - /* Continue with next image if there is one. */ - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_NONE; - return; - } -#endif - -#ifdef MCUBOOT_SWAP_USING_MOVE - /* - * Must re-read image headers because the boot status might - * have been updated in the previous function call. - */ - rc = boot_read_image_headers(state, !boot_status_is_reset(bs), bs); - if (rc != 0) { - /* Continue with next image if there is one. */ - BOOT_LOG_WRN("Failed reading image headers; Image=%u", - BOOT_CURR_IMG(state)); - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_NONE; - return; - } -#endif - - /* Determine if we rebooted in the middle of an image swap - * operation. If a partial swap was detected, complete it. - */ - if (!boot_status_is_reset(bs)) { - -#if (BOOT_IMAGE_NUMBER > 1) - boot_review_image_swap_types(state, true); -#endif - -#ifdef MCUBOOT_OVERWRITE_ONLY - /* Should never arrive here, overwrite-only mode has - * no swap state. - */ - assert(0); -#else - /* Determine the type of swap operation being resumed from the - * `swap-type` trailer field. - */ - rc = boot_complete_partial_swap(state, bs); - assert(rc == 0); -#endif - /* Attempt to read an image header from each slot. Ensure that - * image headers in slots are aligned with headers in boot_data. - */ - rc = boot_read_image_headers(state, false, bs); - assert(rc == 0); - - /* Swap has finished set to NONE */ - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_NONE; - } else { - /* There was no partial swap, determine swap type. */ - if (bs->swap_type == BOOT_SWAP_TYPE_NONE) { - BOOT_SWAP_TYPE(state) = boot_validated_swap_type(state, bs); - } else if (boot_validate_slot(state, BOOT_SECONDARY_SLOT, bs) != 0) { - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_FAIL; - } else { - BOOT_SWAP_TYPE(state) = bs->swap_type; - } - -#if (BOOT_IMAGE_NUMBER > 1) - boot_review_image_swap_types(state, false); -#endif - -#ifdef MCUBOOT_BOOTSTRAP - if (BOOT_SWAP_TYPE(state) == BOOT_SWAP_TYPE_NONE) { - /* Header checks are done first because they are - * inexpensive. Since overwrite-only copies starting from - * offset 0, if interrupted, it might leave a valid header - * magic, so also run validation on the primary slot to be - * sure it's not OK. - */ - if (boot_check_header_erased(state, BOOT_PRIMARY_SLOT) == 0 || - boot_validate_slot(state, BOOT_PRIMARY_SLOT, bs) != 0) { - if (boot_img_hdr(state, - BOOT_SECONDARY_SLOT)->ih_magic == IMAGE_MAGIC && - boot_validate_slot(state, BOOT_SECONDARY_SLOT, bs) == 0) { - /* Set swap type to REVERT to overwrite the primary - * slot with the image contained in secondary slot - * and to trigger the explicit setting of the - * image_ok flag. - */ - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_REVERT; - } - } - } -#endif - } - } else { - /* In that case if slots are not compatible. */ - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_NONE; - } -} - -int -context_boot_go(struct boot_loader_state *state, struct boot_rsp *rsp) -{ - size_t slot; - struct boot_status bs; - int rc = -1; - int fa_id; - int image_index; - bool has_upgrade; - - /* The array of slot sectors are defined here (as opposed to file scope) so - * that they don't get allocated for non-boot-loader apps. This is - * necessary because the gcc option "-fdata-sections" doesn't seem to have - * any effect in older gcc versions (e.g., 4.8.4). - */ - TARGET_STATIC boot_sector_t primary_slot_sectors[BOOT_IMAGE_NUMBER][BOOT_MAX_IMG_SECTORS]; - TARGET_STATIC boot_sector_t secondary_slot_sectors[BOOT_IMAGE_NUMBER][BOOT_MAX_IMG_SECTORS]; -#if MCUBOOT_SWAP_USING_SCRATCH - TARGET_STATIC boot_sector_t scratch_sectors[BOOT_MAX_IMG_SECTORS]; -#endif - - memset(state, 0, sizeof(struct boot_loader_state)); - has_upgrade = false; - -#if (BOOT_IMAGE_NUMBER == 1) - (void)has_upgrade; -#endif - - /* Iterate over all the images. By the end of the loop the swap type has - * to be determined for each image and all aborted swaps have to be - * completed. - */ - IMAGES_ITER(BOOT_CURR_IMG(state)) { - -#if defined(MCUBOOT_ENC_IMAGES) && (BOOT_IMAGE_NUMBER > 1) - /* The keys used for encryption may no longer be valid (could belong to - * another images). Therefore, mark them as invalid to force their reload - * by boot_enc_load(). - */ - boot_enc_zeroize(BOOT_CURR_ENC(state)); -#endif - - image_index = BOOT_CURR_IMG(state); - - BOOT_IMG(state, BOOT_PRIMARY_SLOT).sectors = - primary_slot_sectors[image_index]; - BOOT_IMG(state, BOOT_SECONDARY_SLOT).sectors = - secondary_slot_sectors[image_index]; -#if MCUBOOT_SWAP_USING_SCRATCH - state->scratch.sectors = scratch_sectors; -#endif - - /* Open primary and secondary image areas for the duration - * of this call. - */ - for (slot = 0; slot < BOOT_NUM_SLOTS; slot++) { - fa_id = flash_area_id_from_multi_image_slot(image_index, slot); - rc = flash_area_open(fa_id, &BOOT_IMG_AREA(state, slot)); - assert(rc == 0); - } -#if MCUBOOT_SWAP_USING_SCRATCH - rc = flash_area_open(FLASH_AREA_IMAGE_SCRATCH, - &BOOT_SCRATCH_AREA(state)); - assert(rc == 0); -#endif - - /* Determine swap type and complete swap if it has been aborted. */ - boot_prepare_image_for_update(state, &bs); - - if (BOOT_IS_UPGRADE(BOOT_SWAP_TYPE(state))) { - has_upgrade = true; - } - } - -#if (BOOT_IMAGE_NUMBER > 1) - if (has_upgrade) { - /* Iterate over all the images and verify whether the image dependencies - * are all satisfied and update swap type if necessary. - */ - rc = boot_verify_dependencies(state); - if (rc == BOOT_EBADVERSION) { - /* - * It was impossible to upgrade because the expected dependency version - * was not available. Here we already changed the swap_type so that - * instead of asserting the bootloader, we continue and no upgrade is - * performed. - */ - rc = 0; - } - } -#endif - - /* Iterate over all the images. At this point there are no aborted swaps - * and the swap types are determined for each image. By the end of the loop - * all required update operations will have been finished. - */ - IMAGES_ITER(BOOT_CURR_IMG(state)) { - -#if (BOOT_IMAGE_NUMBER > 1) -#ifdef MCUBOOT_ENC_IMAGES - /* The keys used for encryption may no longer be valid (could belong to - * another images). Therefore, mark them as invalid to force their reload - * by boot_enc_load(). - */ - boot_enc_zeroize(BOOT_CURR_ENC(state)); -#endif /* MCUBOOT_ENC_IMAGES */ - - /* Indicate that swap is not aborted */ - boot_status_reset(&bs); -#endif /* (BOOT_IMAGE_NUMBER > 1) */ - - /* Set the previously determined swap type */ - bs.swap_type = BOOT_SWAP_TYPE(state); - - switch (BOOT_SWAP_TYPE(state)) { - case BOOT_SWAP_TYPE_NONE: - break; - - case BOOT_SWAP_TYPE_TEST: /* fallthrough */ - case BOOT_SWAP_TYPE_PERM: /* fallthrough */ - case BOOT_SWAP_TYPE_REVERT: - rc = boot_perform_update(state, &bs); - assert(rc == 0); - break; - - case BOOT_SWAP_TYPE_FAIL: - /* The image in secondary slot was invalid and is now erased. Ensure - * we don't try to boot into it again on the next reboot. Do this by - * pretending we just reverted back to primary slot. - */ -#ifndef MCUBOOT_OVERWRITE_ONLY - /* image_ok needs to be explicitly set to avoid a new revert. */ - rc = swap_set_image_ok(BOOT_CURR_IMG(state)); - if (rc != 0) { - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_PANIC; - } -#endif /* !MCUBOOT_OVERWRITE_ONLY */ - break; - - default: - BOOT_SWAP_TYPE(state) = BOOT_SWAP_TYPE_PANIC; - } - - if (BOOT_SWAP_TYPE(state) == BOOT_SWAP_TYPE_PANIC) { - BOOT_LOG_ERR("panic!"); - assert(0); - - /* Loop forever... */ - while (1) {} - } - } - - /* Iterate over all the images. At this point all required update operations - * have finished. By the end of the loop each image in the primary slot will - * have been re-validated. - */ - IMAGES_ITER(BOOT_CURR_IMG(state)) { - if (BOOT_SWAP_TYPE(state) != BOOT_SWAP_TYPE_NONE) { - /* Attempt to read an image header from each slot. Ensure that image - * headers in slots are aligned with headers in boot_data. - */ - rc = boot_read_image_headers(state, false, &bs); - if (rc != 0) { - goto out; - } - /* Since headers were reloaded, it can be assumed we just performed - * a swap or overwrite. Now the header info that should be used to - * provide the data for the bootstrap, which previously was at - * secondary slot, was updated to primary slot. - */ - } - -#ifdef MCUBOOT_VALIDATE_PRIMARY_SLOT - rc = boot_validate_slot(state, BOOT_PRIMARY_SLOT, NULL); - if (rc != 0) { - rc = BOOT_EBADIMAGE; - goto out; - } -#else - /* Even if we're not re-validating the primary slot, we could be booting - * onto an empty flash chip. At least do a basic sanity check that - * the magic number on the image is OK. - */ - if (BOOT_IMG(state, BOOT_PRIMARY_SLOT).hdr.ih_magic != IMAGE_MAGIC) { - BOOT_LOG_ERR("bad image magic 0x%lx; Image=%u", (unsigned long) - &boot_img_hdr(state,BOOT_PRIMARY_SLOT)->ih_magic, - BOOT_CURR_IMG(state)); - rc = BOOT_EBADIMAGE; - goto out; - } -#endif /* MCUBOOT_VALIDATE_PRIMARY_SLOT */ - -#ifdef MCUBOOT_HW_ROLLBACK_PROT - /* Update the stored security counter with the active image's security - * counter value. It will only be updated if the new security counter is - * greater than the stored value. - * - * In case of a successful image swapping when the swap type is TEST the - * security counter can be increased only after a reset, when the swap - * type is NONE and the image has marked itself "OK" (the image_ok flag - * has been set). This way a "revert" can be performed when it's - * necessary. - */ - if (BOOT_SWAP_TYPE(state) == BOOT_SWAP_TYPE_NONE) { - rc = boot_update_security_counter( - BOOT_CURR_IMG(state), - BOOT_PRIMARY_SLOT, - boot_img_hdr(state, BOOT_PRIMARY_SLOT)); - if (rc != 0) { - BOOT_LOG_ERR("Security counter update failed after image " - "validation."); - goto out; - } - } -#endif /* MCUBOOT_HW_ROLLBACK_PROT */ - -#ifdef MCUBOOT_MEASURED_BOOT - rc = boot_save_boot_status(BOOT_CURR_IMG(state), - boot_img_hdr(state, BOOT_PRIMARY_SLOT), - BOOT_IMG_AREA(state, BOOT_PRIMARY_SLOT)); - if (rc != 0) { - BOOT_LOG_ERR("Failed to add Image %u data to shared memory area", - BOOT_CURR_IMG(state)); - } -#endif /* MCUBOOT_MEASURED_BOOT */ - -#ifdef MCUBOOT_DATA_SHARING - rc = boot_save_shared_data(boot_img_hdr(state, BOOT_PRIMARY_SLOT), - BOOT_IMG_AREA(state, BOOT_PRIMARY_SLOT)); - if (rc != 0) { - BOOT_LOG_ERR("Failed to add data to shared memory area."); - } -#endif /* MCUBOOT_DATA_SHARING */ - } - -#if (BOOT_IMAGE_NUMBER > 1) - /* Always boot from the primary slot of Image 0. */ - BOOT_CURR_IMG(state) = 0; -#endif - - /* - * Since the boot_status struct stores plaintext encryption keys, reset - * them here to avoid the possibility of jumping into an image that could - * easily recover them. - */ - memset(&bs, 0, sizeof(struct boot_status)); - - rsp->br_flash_dev_id = BOOT_IMG_AREA(state, BOOT_PRIMARY_SLOT)->fa_device_id; - rsp->br_image_off = boot_img_slot_off(state, BOOT_PRIMARY_SLOT); - rsp->br_hdr = boot_img_hdr(state, BOOT_PRIMARY_SLOT); - -out: - IMAGES_ITER(BOOT_CURR_IMG(state)) { -#if MCUBOOT_SWAP_USING_SCRATCH - flash_area_close(BOOT_SCRATCH_AREA(state)); -#endif - for (slot = 0; slot < BOOT_NUM_SLOTS; slot++) { - flash_area_close(BOOT_IMG_AREA(state, BOOT_NUM_SLOTS - 1 - slot)); - } - } - return rc; -} - -/** - * Prepares the booting process. This function moves images around in flash as - * appropriate, and tells you what address to boot from. - * - * @param rsp On success, indicates how booting should occur. - * - * @return 0 on success; nonzero on failure. - */ -int -boot_go(struct boot_rsp *rsp) -{ - return context_boot_go(&boot_data, rsp); -} - -int -split_go(int loader_slot, int split_slot, void **entry) -{ - boot_sector_t *sectors; - uintptr_t entry_val; - int loader_flash_id; - int split_flash_id; - int rc; - - sectors = malloc(BOOT_MAX_IMG_SECTORS * 2 * sizeof *sectors); - if (sectors == NULL) { - return SPLIT_GO_ERR; - } - BOOT_IMG(&boot_data, loader_slot).sectors = sectors + 0; - BOOT_IMG(&boot_data, split_slot).sectors = sectors + BOOT_MAX_IMG_SECTORS; - - loader_flash_id = flash_area_id_from_image_slot(loader_slot); - rc = flash_area_open(loader_flash_id, - &BOOT_IMG_AREA(&boot_data, loader_slot)); - assert(rc == 0); - split_flash_id = flash_area_id_from_image_slot(split_slot); - rc = flash_area_open(split_flash_id, - &BOOT_IMG_AREA(&boot_data, split_slot)); - assert(rc == 0); - - /* Determine the sector layout of the image slots and scratch area. */ - rc = boot_read_sectors(&boot_data); - if (rc != 0) { - rc = SPLIT_GO_ERR; - goto done; - } - - rc = boot_read_image_headers(&boot_data, true, NULL); - if (rc != 0) { - goto done; - } - - /* Don't check the bootable image flag because we could really call a - * bootable or non-bootable image. Just validate that the image check - * passes which is distinct from the normal check. - */ - rc = split_image_check(boot_img_hdr(&boot_data, split_slot), - BOOT_IMG_AREA(&boot_data, split_slot), - boot_img_hdr(&boot_data, loader_slot), - BOOT_IMG_AREA(&boot_data, loader_slot)); - if (rc != 0) { - rc = SPLIT_GO_NON_MATCHING; - goto done; - } - - entry_val = boot_img_slot_off(&boot_data, split_slot) + - boot_img_hdr(&boot_data, split_slot)->ih_hdr_size; - *entry = (void *) entry_val; - rc = SPLIT_GO_OK; - -done: - flash_area_close(BOOT_IMG_AREA(&boot_data, split_slot)); - flash_area_close(BOOT_IMG_AREA(&boot_data, loader_slot)); - free(sectors); - return rc; -} diff --git a/mcuboot/boot/bootutil/src/swap_misc.c b/mcuboot/boot/bootutil/src/swap_misc.c deleted file mode 100644 index 4c19d56ba..000000000 --- a/mcuboot/boot/bootutil/src/swap_misc.c +++ /dev/null @@ -1,230 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2019 JUUL Labs - * - * 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 -#include -#include -#include -#include -#include -#include "bootutil/bootutil.h" -#include "bootutil_priv.h" -#include "swap_priv.h" -#include "bootutil/bootutil_log.h" - -#include "mcuboot_config/mcuboot_config.h" - -MCUBOOT_LOG_MODULE_DECLARE(mcuboot); - -#if defined(MCUBOOT_SWAP_USING_SCRATCH) || defined(MCUBOOT_SWAP_USING_MOVE) - -int -swap_erase_trailer_sectors(const struct boot_loader_state *state, - const struct flash_area *fap) -{ - uint8_t slot; - uint32_t sector; - uint32_t trailer_sz; - uint32_t total_sz; - uint32_t off; - uint32_t sz; - int fa_id_primary; - int fa_id_secondary; - uint8_t image_index; - int rc; - - BOOT_LOG_DBG("erasing trailer; fa_id=%d", fap->fa_id); - - image_index = BOOT_CURR_IMG(state); - fa_id_primary = flash_area_id_from_multi_image_slot(image_index, - BOOT_PRIMARY_SLOT); - fa_id_secondary = flash_area_id_from_multi_image_slot(image_index, - BOOT_SECONDARY_SLOT); - - if (fap->fa_id == fa_id_primary) { - slot = BOOT_PRIMARY_SLOT; - } else if (fap->fa_id == fa_id_secondary) { - slot = BOOT_SECONDARY_SLOT; - } else { - return BOOT_EFLASH; - } - - /* delete starting from last sector and moving to beginning */ - sector = boot_img_num_sectors(state, slot) - 1; - trailer_sz = boot_trailer_sz(BOOT_WRITE_SZ(state)); - total_sz = 0; - do { - sz = boot_img_sector_size(state, slot, sector); - off = boot_img_sector_off(state, slot, sector); - rc = boot_erase_region(fap, off, sz); - assert(rc == 0); - - sector--; - total_sz += sz; - } while (total_sz < trailer_sz); - - return rc; -} - -int -swap_status_init(const struct boot_loader_state *state, - const struct flash_area *fap, - const struct boot_status *bs) -{ - struct boot_swap_state swap_state; - uint8_t image_index; - int rc; - -#if (BOOT_IMAGE_NUMBER == 1) - (void)state; -#endif - - image_index = BOOT_CURR_IMG(state); - - BOOT_LOG_DBG("initializing status; fa_id=%d", fap->fa_id); - - rc = boot_read_swap_state_by_id(FLASH_AREA_IMAGE_SECONDARY(image_index), - &swap_state); - assert(rc == 0); - - if (bs->swap_type != BOOT_SWAP_TYPE_NONE) { - rc = boot_write_swap_info(fap, bs->swap_type, image_index); - assert(rc == 0); - } - - if (swap_state.image_ok == BOOT_FLAG_SET) { - rc = boot_write_image_ok(fap); - assert(rc == 0); - } - - rc = boot_write_swap_size(fap, bs->swap_size); - assert(rc == 0); - -#ifdef MCUBOOT_ENC_IMAGES - rc = boot_write_enc_key(fap, 0, bs); - assert(rc == 0); - - rc = boot_write_enc_key(fap, 1, bs); - assert(rc == 0); -#endif - - rc = boot_write_magic(fap); - assert(rc == 0); - - return 0; -} - -int -swap_read_status(struct boot_loader_state *state, struct boot_status *bs) -{ - const struct flash_area *fap; - uint32_t off; - uint8_t swap_info; - int area_id; - int rc; - - bs->source = swap_status_source(state); - switch (bs->source) { - case BOOT_STATUS_SOURCE_NONE: - return 0; - -#if MCUBOOT_SWAP_USING_SCRATCH - case BOOT_STATUS_SOURCE_SCRATCH: - area_id = FLASH_AREA_IMAGE_SCRATCH; - break; -#endif - - case BOOT_STATUS_SOURCE_PRIMARY_SLOT: - area_id = FLASH_AREA_IMAGE_PRIMARY(BOOT_CURR_IMG(state)); - break; - - default: - assert(0); - return BOOT_EBADARGS; - } - - rc = flash_area_open(area_id, &fap); - if (rc != 0) { - return BOOT_EFLASH; - } - - rc = swap_read_status_bytes(fap, state, bs); - if (rc == 0) { - off = boot_swap_info_off(fap); - rc = flash_area_read_is_empty(fap, off, &swap_info, sizeof swap_info); - if (rc == 1) { - BOOT_SET_SWAP_INFO(swap_info, 0, BOOT_SWAP_TYPE_NONE); - rc = 0; - } - - /* Extract the swap type info */ - bs->swap_type = BOOT_GET_SWAP_TYPE(swap_info); - } - - flash_area_close(fap); - - return rc; -} - -int -swap_set_copy_done(uint8_t image_index) -{ - const struct flash_area *fap; - int rc; - - rc = flash_area_open(FLASH_AREA_IMAGE_PRIMARY(image_index), - &fap); - if (rc != 0) { - return BOOT_EFLASH; - } - - rc = boot_write_copy_done(fap); - flash_area_close(fap); - return rc; -} - -int -swap_set_image_ok(uint8_t image_index) -{ - const struct flash_area *fap; - struct boot_swap_state state; - int rc; - - rc = flash_area_open(FLASH_AREA_IMAGE_PRIMARY(image_index), - &fap); - if (rc != 0) { - return BOOT_EFLASH; - } - - rc = boot_read_swap_state(fap, &state); - if (rc != 0) { - rc = BOOT_EFLASH; - goto out; - } - - if (state.image_ok == BOOT_FLAG_UNSET) { - rc = boot_write_image_ok(fap); - } - -out: - flash_area_close(fap); - return rc; -} - - -#endif /* defined(MCUBOOT_SWAP_USING_SCRATCH) || defined(MCUBOOT_SWAP_USING_MOVE) */ diff --git a/mcuboot/boot/bootutil/src/swap_move.c b/mcuboot/boot/bootutil/src/swap_move.c deleted file mode 100644 index b2a0cb719..000000000 --- a/mcuboot/boot/bootutil/src/swap_move.c +++ /dev/null @@ -1,503 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2019 JUUL Labs - * - * 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 -#include -#include -#include -#include -#include -#include "bootutil/bootutil.h" -#include "bootutil_priv.h" -#include "swap_priv.h" -#include "bootutil/bootutil_log.h" - -#include "mcuboot_config/mcuboot_config.h" - -MCUBOOT_LOG_MODULE_DECLARE(mcuboot); - -#ifdef MCUBOOT_SWAP_USING_MOVE - -#if defined(MCUBOOT_VALIDATE_PRIMARY_SLOT) -/* - * FIXME: this might have to be updated for threaded sim - */ -int boot_status_fails = 0; -#define BOOT_STATUS_ASSERT(x) \ - do { \ - if (!(x)) { \ - boot_status_fails++; \ - } \ - } while (0) -#else -#define BOOT_STATUS_ASSERT(x) ASSERT(x) -#endif - -static uint32_t g_last_idx = UINT32_MAX; - -int -boot_read_image_header(struct boot_loader_state *state, int slot, - struct image_header *out_hdr, struct boot_status *bs) -{ - const struct flash_area *fap; - uint32_t off; - uint32_t sz; - int area_id; - int rc; - -#if (BOOT_IMAGE_NUMBER == 1) - (void)state; -#endif - - off = 0; - if (bs) { - sz = boot_img_sector_size(state, BOOT_PRIMARY_SLOT, 0); - if (bs->op == BOOT_STATUS_OP_MOVE) { - if (slot == 0 && bs->idx > g_last_idx) { - /* second sector */ - off = sz; - } - } else if (bs->op == BOOT_STATUS_OP_SWAP) { - if (bs->idx > 1 && bs->idx <= g_last_idx) { - if (slot == 0) { - slot = 1; - } else { - slot = 0; - } - } else if (bs->idx == 1) { - if (slot == 0) { - off = sz; - } - if (slot == 1 && bs->state == 2) { - slot = 0; - } - } - } - } - - area_id = flash_area_id_from_multi_image_slot(BOOT_CURR_IMG(state), slot); - rc = flash_area_open(area_id, &fap); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - rc = flash_area_read(fap, off, out_hdr, sizeof *out_hdr); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - /* We only know where the headers are located when bs is valid */ - if (bs != NULL && out_hdr->ih_magic != IMAGE_MAGIC) { - rc = -1; - goto done; - } - - rc = 0; - -done: - flash_area_close(fap); - return rc; -} - -int -swap_read_status_bytes(const struct flash_area *fap, - struct boot_loader_state *state, struct boot_status *bs) -{ - uint32_t off; - uint8_t status; - int max_entries; - int found_idx; - uint8_t write_sz; - int move_entries; - int rc; - int last_rc; - int erased_sections; - int i; - - max_entries = boot_status_entries(BOOT_CURR_IMG(state), fap); - if (max_entries < 0) { - return BOOT_EBADARGS; - } - - erased_sections = 0; - found_idx = -1; - /* skip erased sectors at the end */ - last_rc = 1; - write_sz = BOOT_WRITE_SZ(state); - off = boot_status_off(fap); - for (i = max_entries; i > 0; i--) { - rc = flash_area_read_is_empty(fap, off + (i - 1) * write_sz, &status, 1); - if (rc < 0) { - return BOOT_EFLASH; - } - - if (rc == 1) { - if (rc != last_rc) { - erased_sections++; - } - } else { - if (found_idx == -1) { - found_idx = i; - } - } - last_rc = rc; - } - - if (erased_sections > 1) { - /* This means there was an error writing status on the last - * swap. Tell user and move on to validation! - */ -#if !defined(__BOOTSIM__) - BOOT_LOG_ERR("Detected inconsistent status!"); -#endif - -#if !defined(MCUBOOT_VALIDATE_PRIMARY_SLOT) - /* With validation of the primary slot disabled, there is no way - * to be sure the swapped primary slot is OK, so abort! - */ - assert(0); -#endif - } - - move_entries = BOOT_MAX_IMG_SECTORS * BOOT_STATUS_MOVE_STATE_COUNT; - if (found_idx == -1) { - /* no swap status found; nothing to do */ - } else if (found_idx < move_entries) { - bs->op = BOOT_STATUS_OP_MOVE; - bs->idx = (found_idx / BOOT_STATUS_MOVE_STATE_COUNT) + BOOT_STATUS_IDX_0; - bs->state = (found_idx % BOOT_STATUS_MOVE_STATE_COUNT) + BOOT_STATUS_STATE_0;; - } else { - bs->op = BOOT_STATUS_OP_SWAP; - bs->idx = ((found_idx - move_entries) / BOOT_STATUS_SWAP_STATE_COUNT) + BOOT_STATUS_IDX_0; - bs->state = ((found_idx - move_entries) % BOOT_STATUS_SWAP_STATE_COUNT) + BOOT_STATUS_STATE_0; - } - - return 0; -} - -uint32_t -boot_status_internal_off(const struct boot_status *bs, int elem_sz) -{ - uint32_t off; - int idx_sz; - - idx_sz = elem_sz * ((bs->op == BOOT_STATUS_OP_MOVE) ? - BOOT_STATUS_MOVE_STATE_COUNT : BOOT_STATUS_SWAP_STATE_COUNT); - - off = ((bs->op == BOOT_STATUS_OP_MOVE) ? - 0 : (BOOT_MAX_IMG_SECTORS * BOOT_STATUS_MOVE_STATE_COUNT * elem_sz)) + - (bs->idx - BOOT_STATUS_IDX_0) * idx_sz + - (bs->state - BOOT_STATUS_STATE_0) * elem_sz; - - return off; -} - -int -boot_slots_compatible(struct boot_loader_state *state) -{ - size_t num_sectors; - size_t i; - - num_sectors = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT); - if (num_sectors != boot_img_num_sectors(state, BOOT_SECONDARY_SLOT)) { - BOOT_LOG_WRN("Cannot upgrade: slots don't have same amount of sectors"); - return 0; - } - - if (num_sectors > BOOT_MAX_IMG_SECTORS) { - BOOT_LOG_WRN("Cannot upgrade: more sectors than allowed"); - return 0; - } - - for (i = 0; i < num_sectors; i++) { - if (boot_img_sector_size(state, BOOT_PRIMARY_SLOT, i) != - boot_img_sector_size(state, BOOT_SECONDARY_SLOT, i)) { - BOOT_LOG_WRN("Cannot upgrade: not same sector layout"); - return 0; - } - } - - return 1; -} - -#define BOOT_LOG_SWAP_STATE(area, state) \ - BOOT_LOG_INF("%s: magic=%s, swap_type=0x%x, copy_done=0x%x, " \ - "image_ok=0x%x", \ - (area), \ - ((state)->magic == BOOT_MAGIC_GOOD ? "good" : \ - (state)->magic == BOOT_MAGIC_UNSET ? "unset" : \ - "bad"), \ - (state)->swap_type, \ - (state)->copy_done, \ - (state)->image_ok) - -int -swap_status_source(struct boot_loader_state *state) -{ - struct boot_swap_state state_primary_slot; - int rc; - uint8_t source; - uint8_t image_index; - -#if (BOOT_IMAGE_NUMBER == 1) - (void)state; -#endif - - image_index = BOOT_CURR_IMG(state); - - rc = boot_read_swap_state_by_id(FLASH_AREA_IMAGE_PRIMARY(image_index), - &state_primary_slot); - assert(rc == 0); - - BOOT_LOG_SWAP_STATE("Primary image", &state_primary_slot); - - if (state_primary_slot.magic == BOOT_MAGIC_GOOD && - state_primary_slot.copy_done == BOOT_FLAG_UNSET) { - - source = BOOT_STATUS_SOURCE_PRIMARY_SLOT; - - BOOT_LOG_INF("Boot source: primary slot"); - return source; - } - - BOOT_LOG_INF("Boot source: none"); - return BOOT_STATUS_SOURCE_NONE; -} - -/* - * "Moves" the sector located at idx - 1 to idx. - */ -static void -boot_move_sector_up(int idx, uint32_t sz, struct boot_loader_state *state, - struct boot_status *bs, const struct flash_area *fap_pri, - const struct flash_area *fap_sec) -{ - uint32_t new_off; - uint32_t old_off; - int rc; - - /* - * FIXME: assuming sectors of size == sz, a single off variable - * would be enough - */ - - /* Calculate offset from start of image area. */ - new_off = boot_img_sector_off(state, BOOT_PRIMARY_SLOT, idx); - old_off = boot_img_sector_off(state, BOOT_PRIMARY_SLOT, idx - 1); - - if (bs->idx == BOOT_STATUS_IDX_0) { - if (bs->source != BOOT_STATUS_SOURCE_PRIMARY_SLOT) { - rc = swap_erase_trailer_sectors(state, fap_pri); - assert(rc == 0); - - rc = swap_status_init(state, fap_pri, bs); - assert(rc == 0); - } - - rc = swap_erase_trailer_sectors(state, fap_sec); - assert(rc == 0); - } - - rc = boot_erase_region(fap_pri, new_off, sz); - assert(rc == 0); - - rc = boot_copy_region(state, fap_pri, fap_pri, old_off, new_off, sz); - assert(rc == 0); - - rc = boot_write_status(state, bs); - - bs->idx++; - BOOT_STATUS_ASSERT(rc == 0); -} - -static void -boot_swap_sectors(int idx, uint32_t sz, struct boot_loader_state *state, - struct boot_status *bs, const struct flash_area *fap_pri, - const struct flash_area *fap_sec) -{ - uint32_t pri_off; - uint32_t pri_up_off; - uint32_t sec_off; - int rc; - - pri_up_off = boot_img_sector_off(state, BOOT_PRIMARY_SLOT, idx); - pri_off = boot_img_sector_off(state, BOOT_PRIMARY_SLOT, idx - 1); - sec_off = boot_img_sector_off(state, BOOT_SECONDARY_SLOT, idx - 1); - - if (bs->state == BOOT_STATUS_STATE_0) { - rc = boot_erase_region(fap_pri, pri_off, sz); - assert(rc == 0); - - rc = boot_copy_region(state, fap_sec, fap_pri, sec_off, pri_off, sz); - assert(rc == 0); - - rc = boot_write_status(state, bs); - bs->state = BOOT_STATUS_STATE_1; - BOOT_STATUS_ASSERT(rc == 0); - } - - if (bs->state == BOOT_STATUS_STATE_1) { - rc = boot_erase_region(fap_sec, sec_off, sz); - assert(rc == 0); - - rc = boot_copy_region(state, fap_pri, fap_sec, pri_up_off, sec_off, sz); - assert(rc == 0); - - rc = boot_write_status(state, bs); - bs->idx++; - bs->state = BOOT_STATUS_STATE_0; - BOOT_STATUS_ASSERT(rc == 0); - } -} - -/* - * When starting a revert the swap status exists in the primary slot, and - * the status in the secondary slot is erased. To start the swap, the status - * area in the primary slot must be re-initialized; if during the small - * window of time between re-initializing it and writing the first metadata - * a reset happens, the swap process is broken and cannot be resumed. - * - * This function handles the issue by making the revert look like a permanent - * upgrade (by initializing the secondary slot). - */ -void -fixup_revert(const struct boot_loader_state *state, struct boot_status *bs, - const struct flash_area *fap_sec, uint8_t sec_id) -{ - struct boot_swap_state swap_state; - int rc; - -#if (BOOT_IMAGE_NUMBER == 1) - (void)state; -#endif - - /* No fixup required */ - if (bs->swap_type != BOOT_SWAP_TYPE_REVERT || - bs->op != BOOT_STATUS_OP_MOVE || - bs->idx != BOOT_STATUS_IDX_0) { - return; - } - - rc = boot_read_swap_state_by_id(sec_id, &swap_state); - assert(rc == 0); - - BOOT_LOG_SWAP_STATE("Secondary image", &swap_state); - - if (swap_state.magic == BOOT_MAGIC_UNSET) { - rc = swap_erase_trailer_sectors(state, fap_sec); - assert(rc == 0); - - rc = boot_write_image_ok(fap_sec); - assert(rc == 0); - - rc = boot_write_swap_size(fap_sec, bs->swap_size); - assert(rc == 0); - - rc = boot_write_magic(fap_sec); - assert(rc == 0); - } -} - -void -swap_run(struct boot_loader_state *state, struct boot_status *bs, - uint32_t copy_size) -{ - uint32_t sz; - uint32_t sector_sz; - uint32_t idx; - uint32_t trailer_sz; - uint32_t first_trailer_idx; - uint8_t image_index; - const struct flash_area *fap_pri; - const struct flash_area *fap_sec; - int rc; - - sz = 0; - g_last_idx = 0; - - sector_sz = boot_img_sector_size(state, BOOT_PRIMARY_SLOT, 0); - while (1) { - sz += sector_sz; - /* Skip to next sector because all sectors will be moved up. */ - g_last_idx++; - if (sz >= copy_size) { - break; - } - } - - /* - * When starting a new swap upgrade, check that there is enough space. - */ - if (boot_status_is_reset(bs)) { - sz = 0; - trailer_sz = boot_trailer_sz(BOOT_WRITE_SZ(state)); - first_trailer_idx = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT) - 1; - - while (1) { - sz += sector_sz; - if (sz >= trailer_sz) { - break; - } - first_trailer_idx--; - } - - if (g_last_idx >= first_trailer_idx) { - BOOT_LOG_WRN("Not enough free space to run swap upgrade"); - bs->swap_type = BOOT_SWAP_TYPE_NONE; - return; - } - } - - image_index = BOOT_CURR_IMG(state); - - rc = flash_area_open(FLASH_AREA_IMAGE_PRIMARY(image_index), &fap_pri); - assert (rc == 0); - - rc = flash_area_open(FLASH_AREA_IMAGE_SECONDARY(image_index), &fap_sec); - assert (rc == 0); - - fixup_revert(state, bs, fap_sec, FLASH_AREA_IMAGE_SECONDARY(image_index)); - - if (bs->op == BOOT_STATUS_OP_MOVE) { - idx = g_last_idx; - while (idx > 0) { - if (idx <= (g_last_idx - bs->idx + 1)) { - boot_move_sector_up(idx, sector_sz, state, bs, fap_pri, fap_sec); - } - idx--; - } - bs->idx = BOOT_STATUS_IDX_0; - } - - bs->op = BOOT_STATUS_OP_SWAP; - - idx = 1; - while (idx <= g_last_idx) { - if (idx >= bs->idx) { - boot_swap_sectors(idx, sector_sz, state, bs, fap_pri, fap_sec); - } - idx++; - } - - flash_area_close(fap_pri); - flash_area_close(fap_sec); -} - -#endif diff --git a/mcuboot/boot/bootutil/src/swap_priv.h b/mcuboot/boot/bootutil/src/swap_priv.h deleted file mode 100644 index 9cf577773..000000000 --- a/mcuboot/boot/bootutil/src/swap_priv.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2019 JUUL Labs - * - * 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. - */ - -#ifndef H_SWAP_PRIV_ -#define H_SWAP_PRIV_ - -#include "mcuboot_config/mcuboot_config.h" - -#if defined(MCUBOOT_SWAP_USING_SCRATCH) || defined(MCUBOOT_SWAP_USING_MOVE) - -/** - * Calculates the amount of space required to store the trailer, and erases - * all sectors required for this storage in the given flash_area. - */ -int swap_erase_trailer_sectors(const struct boot_loader_state *state, - const struct flash_area *fap); - -/** - * Initialize the given flash_area with the metadata required to start a new - * swap upgrade. - */ -int swap_status_init(const struct boot_loader_state *state, - const struct flash_area *fap, - const struct boot_status *bs); - -/** - * Tries to locate an interrupted swap status (metadata). If not metadata - * was found returns BOOT_STATUS_SOURCE_NONE. - * - * Must return one of: - * - BOOT_STATUS_SOURCE_NONE - * - BOOT_STATUS_SOURCE_SCRATCH - * - BOOT_STATUS_SOURCE_PRIMARY_SLOT - */ -int swap_status_source(struct boot_loader_state *state); - -/** - * Reads the boot status from the flash. The boot status contains - * the current state of an interrupted image copy operation. If the boot - * status is not present, or it indicates that previous copy finished, - * there is no operation in progress. - */ -int swap_read_status(struct boot_loader_state *state, struct boot_status *bs); - -/** - * Iterate over the swap status bytes in the given flash_area and populate - * the given boot_status with the calculated index where a swap upgrade was - * interrupted. - */ -int swap_read_status_bytes(const struct flash_area *fap, - struct boot_loader_state *state, - struct boot_status *bs); - -/** - * Marks the image in the primary slot as fully copied. - */ -int swap_set_copy_done(uint8_t image_index); - -/** - * Marks a reverted image in the primary slot as confirmed. This is necessary to - * ensure the status bytes from the image revert operation don't get processed - * on a subsequent boot. - * - * NOTE: image_ok is tested before writing because if there's a valid permanent - * image installed on the primary slot and the new image to be upgrade to has a - * bad sig, image_ok would be overwritten. - */ -int swap_set_image_ok(uint8_t image_index); - -/** - * Start a new or resume an interrupted swap according to the parameters - * found in the given boot_status. - */ -void swap_run(struct boot_loader_state *state, - struct boot_status *bs, - uint32_t copy_size); - -#if MCUBOOT_SWAP_USING_SCRATCH -#define BOOT_SCRATCH_AREA(state) ((state)->scratch.area) - -static inline size_t boot_scratch_area_size(const struct boot_loader_state *state) -{ - return BOOT_SCRATCH_AREA(state)->fa_size; -} -#endif - -#endif /* defined(MCUBOOT_SWAP_USING_SCRATCH) || defined(MCUBOOT_SWAP_USING_MOVE) */ - -#endif /* H_SWAP_PRIV_ */ diff --git a/mcuboot/boot/bootutil/src/swap_scratch.c b/mcuboot/boot/bootutil/src/swap_scratch.c deleted file mode 100644 index 3266dc4ef..000000000 --- a/mcuboot/boot/bootutil/src/swap_scratch.c +++ /dev/null @@ -1,726 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2019 JUUL Labs - * - * 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 -#include -#include -#include -#include -#include -#include "bootutil/bootutil.h" -#include "bootutil_priv.h" -#include "swap_priv.h" -#include "bootutil/bootutil_log.h" - -#include "mcuboot_config/mcuboot_config.h" - -MCUBOOT_LOG_MODULE_DECLARE(mcuboot); - -#if !defined(MCUBOOT_SWAP_USING_MOVE) - -#if defined(MCUBOOT_VALIDATE_PRIMARY_SLOT) -/* - * FIXME: this might have to be updated for threaded sim - */ -int boot_status_fails = 0; -#define BOOT_STATUS_ASSERT(x) \ - do { \ - if (!(x)) { \ - boot_status_fails++; \ - } \ - } while (0) -#else -#define BOOT_STATUS_ASSERT(x) ASSERT(x) -#endif - -int -boot_read_image_header(struct boot_loader_state *state, int slot, - struct image_header *out_hdr, struct boot_status *bs) -{ - const struct flash_area *fap; - int area_id; - int rc; - - (void)bs; - -#if (BOOT_IMAGE_NUMBER == 1) - (void)state; -#endif - - area_id = flash_area_id_from_multi_image_slot(BOOT_CURR_IMG(state), slot); - rc = flash_area_open(area_id, &fap); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - rc = flash_area_read(fap, 0, out_hdr, sizeof *out_hdr); - if (rc != 0) { - rc = BOOT_EFLASH; - goto done; - } - - rc = 0; - -done: - flash_area_close(fap); - return rc; -} - -/** - * Reads the status of a partially-completed swap, if any. This is necessary - * to recover in case the boot lodaer was reset in the middle of a swap - * operation. - */ -int -swap_read_status_bytes(const struct flash_area *fap, - struct boot_loader_state *state, struct boot_status *bs) -{ - uint32_t off; - uint8_t status; - int max_entries; - int found; - int found_idx; - int invalid; - int rc; - int i; - - off = boot_status_off(fap); - max_entries = boot_status_entries(BOOT_CURR_IMG(state), fap); - if (max_entries < 0) { - return BOOT_EBADARGS; - } - - found = 0; - found_idx = 0; - invalid = 0; - for (i = 0; i < max_entries; i++) { - rc = flash_area_read_is_empty(fap, off + i * BOOT_WRITE_SZ(state), - &status, 1); - if (rc < 0) { - return BOOT_EFLASH; - } - - if (rc == 1) { - if (found && !found_idx) { - found_idx = i; - } - } else if (!found) { - found = 1; - } else if (found_idx) { - invalid = 1; - break; - } - } - - if (invalid) { - /* This means there was an error writing status on the last - * swap. Tell user and move on to validation! - */ -#if !defined(__BOOTSIM__) - BOOT_LOG_ERR("Detected inconsistent status!"); -#endif - -#if !defined(MCUBOOT_VALIDATE_PRIMARY_SLOT) - /* With validation of the primary slot disabled, there is no way - * to be sure the swapped primary slot is OK, so abort! - */ - assert(0); -#endif - } - - if (found) { - if (!found_idx) { - found_idx = i; - } - bs->idx = (found_idx / BOOT_STATUS_STATE_COUNT) + 1; - bs->state = (found_idx % BOOT_STATUS_STATE_COUNT) + 1; - } - - return 0; -} - -uint32_t -boot_status_internal_off(const struct boot_status *bs, int elem_sz) -{ - int idx_sz; - - idx_sz = elem_sz * BOOT_STATUS_STATE_COUNT; - - return (bs->idx - BOOT_STATUS_IDX_0) * idx_sz + - (bs->state - BOOT_STATUS_STATE_0) * elem_sz; -} - -/* - * Slots are compatible when all sectors that store up to to size of the image - * round up to sector size, in both slot's are able to fit in the scratch - * area, and have sizes that are a multiple of each other (powers of two - * presumably!). - */ -int -boot_slots_compatible(struct boot_loader_state *state) -{ - size_t num_sectors_primary; - size_t num_sectors_secondary; - size_t sz0, sz1; - size_t primary_slot_sz, secondary_slot_sz; -#ifndef MCUBOOT_OVERWRITE_ONLY - size_t scratch_sz; -#endif - size_t i, j; - int8_t smaller; - - num_sectors_primary = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT); - num_sectors_secondary = boot_img_num_sectors(state, BOOT_SECONDARY_SLOT); - if ((num_sectors_primary > BOOT_MAX_IMG_SECTORS) || - (num_sectors_secondary > BOOT_MAX_IMG_SECTORS)) { - BOOT_LOG_WRN("Cannot upgrade: more sectors than allowed"); - return 0; - } - -#ifndef MCUBOOT_OVERWRITE_ONLY - scratch_sz = boot_scratch_area_size(state); -#endif - - /* - * The following loop scans all sectors in a linear fashion, assuring that - * for each possible sector in each slot, it is able to fit in the other - * slot's sector or sectors. Slot's should be compatible as long as any - * number of a slot's sectors are able to fit into another, which only - * excludes cases where sector sizes are not a multiple of each other. - */ - i = sz0 = primary_slot_sz = 0; - j = sz1 = secondary_slot_sz = 0; - smaller = 0; - while (i < num_sectors_primary || j < num_sectors_secondary) { - if (sz0 == sz1) { - sz0 += boot_img_sector_size(state, BOOT_PRIMARY_SLOT, i); - sz1 += boot_img_sector_size(state, BOOT_SECONDARY_SLOT, j); - i++; - j++; - } else if (sz0 < sz1) { - sz0 += boot_img_sector_size(state, BOOT_PRIMARY_SLOT, i); - /* Guarantee that multiple sectors of the secondary slot - * fit into the primary slot. - */ - if (smaller == 2) { - BOOT_LOG_WRN("Cannot upgrade: slots have non-compatible sectors"); - return 0; - } - smaller = 1; - i++; - } else { - sz1 += boot_img_sector_size(state, BOOT_SECONDARY_SLOT, j); - /* Guarantee that multiple sectors of the primary slot - * fit into the secondary slot. - */ - if (smaller == 1) { - BOOT_LOG_WRN("Cannot upgrade: slots have non-compatible sectors"); - return 0; - } - smaller = 2; - j++; - } -#ifndef MCUBOOT_OVERWRITE_ONLY - if (sz0 == sz1) { - primary_slot_sz += sz0; - secondary_slot_sz += sz1; - /* Scratch has to fit each swap operation to the size of the larger - * sector among the primary slot and the secondary slot. - */ - if (sz0 > scratch_sz || sz1 > scratch_sz) { - BOOT_LOG_WRN("Cannot upgrade: not all sectors fit inside scratch"); - return 0; - } - smaller = sz0 = sz1 = 0; - } -#endif - } - - if ((i != num_sectors_primary) || - (j != num_sectors_secondary) || - (primary_slot_sz != secondary_slot_sz)) { - BOOT_LOG_WRN("Cannot upgrade: slots are not compatible"); - return 0; - } - - return 1; -} - -#define BOOT_LOG_SWAP_STATE(area, state) \ - BOOT_LOG_INF("%s: magic=%s, swap_type=0x%x, copy_done=0x%x, " \ - "image_ok=0x%x", \ - (area), \ - ((state)->magic == BOOT_MAGIC_GOOD ? "good" : \ - (state)->magic == BOOT_MAGIC_UNSET ? "unset" : \ - "bad"), \ - (state)->swap_type, \ - (state)->copy_done, \ - (state)->image_ok) - -struct boot_status_table { - uint8_t bst_magic_primary_slot; - uint8_t bst_magic_scratch; - uint8_t bst_copy_done_primary_slot; - uint8_t bst_status_source; -}; - -/** - * This set of tables maps swap state contents to boot status location. - * When searching for a match, these tables must be iterated in order. - */ -static const struct boot_status_table boot_status_tables[] = { - { - /* | primary slot | scratch | - * ----------+--------------+--------------| - * magic | Good | Any | - * copy-done | Set | N/A | - * ----------+--------------+--------------' - * source: none | - * ----------------------------------------' - */ - .bst_magic_primary_slot = BOOT_MAGIC_GOOD, - .bst_magic_scratch = BOOT_MAGIC_NOTGOOD, - .bst_copy_done_primary_slot = BOOT_FLAG_SET, - .bst_status_source = BOOT_STATUS_SOURCE_NONE, - }, - - { - /* | primary slot | scratch | - * ----------+--------------+--------------| - * magic | Good | Any | - * copy-done | Unset | N/A | - * ----------+--------------+--------------' - * source: primary slot | - * ----------------------------------------' - */ - .bst_magic_primary_slot = BOOT_MAGIC_GOOD, - .bst_magic_scratch = BOOT_MAGIC_NOTGOOD, - .bst_copy_done_primary_slot = BOOT_FLAG_UNSET, - .bst_status_source = BOOT_STATUS_SOURCE_PRIMARY_SLOT, - }, - - { - /* | primary slot | scratch | - * ----------+--------------+--------------| - * magic | Any | Good | - * copy-done | Any | N/A | - * ----------+--------------+--------------' - * source: scratch | - * ----------------------------------------' - */ - .bst_magic_primary_slot = BOOT_MAGIC_ANY, - .bst_magic_scratch = BOOT_MAGIC_GOOD, - .bst_copy_done_primary_slot = BOOT_FLAG_ANY, - .bst_status_source = BOOT_STATUS_SOURCE_SCRATCH, - }, - { - /* | primary slot | scratch | - * ----------+--------------+--------------| - * magic | Unset | Any | - * copy-done | Unset | N/A | - * ----------+--------------+--------------| - * source: varies | - * ----------------------------------------+--------------------------+ - * This represents one of two cases: | - * o No swaps ever (no status to read, so no harm in checking). | - * o Mid-revert; status in primary slot. | - * -------------------------------------------------------------------' - */ - .bst_magic_primary_slot = BOOT_MAGIC_UNSET, - .bst_magic_scratch = BOOT_MAGIC_ANY, - .bst_copy_done_primary_slot = BOOT_FLAG_UNSET, - .bst_status_source = BOOT_STATUS_SOURCE_PRIMARY_SLOT, - }, -}; - -#define BOOT_STATUS_TABLES_COUNT \ - (sizeof boot_status_tables / sizeof boot_status_tables[0]) - -/** - * Determines where in flash the most recent boot status is stored. The boot - * status is necessary for completing a swap that was interrupted by a boot - * loader reset. - * - * @return A BOOT_STATUS_SOURCE_[...] code indicating where status should - * be read from. - */ -int -swap_status_source(struct boot_loader_state *state) -{ - const struct boot_status_table *table; - struct boot_swap_state state_scratch; - struct boot_swap_state state_primary_slot; - int rc; - size_t i; - uint8_t source; - uint8_t image_index; - -#if (BOOT_IMAGE_NUMBER == 1) - (void)state; -#endif - - image_index = BOOT_CURR_IMG(state); - rc = boot_read_swap_state_by_id(FLASH_AREA_IMAGE_PRIMARY(image_index), - &state_primary_slot); - assert(rc == 0); - - rc = boot_read_swap_state_by_id(FLASH_AREA_IMAGE_SCRATCH, &state_scratch); - assert(rc == 0); - - BOOT_LOG_SWAP_STATE("Primary image", &state_primary_slot); - BOOT_LOG_SWAP_STATE("Scratch", &state_scratch); - - for (i = 0; i < BOOT_STATUS_TABLES_COUNT; i++) { - table = &boot_status_tables[i]; - - if (boot_magic_compatible_check(table->bst_magic_primary_slot, - state_primary_slot.magic) && - boot_magic_compatible_check(table->bst_magic_scratch, - state_scratch.magic) && - (table->bst_copy_done_primary_slot == BOOT_FLAG_ANY || - table->bst_copy_done_primary_slot == state_primary_slot.copy_done)) - { - source = table->bst_status_source; - -#if (BOOT_IMAGE_NUMBER > 1) - /* In case of multi-image boot it can happen that if boot status - * info is found on scratch area then it does not belong to the - * currently examined image. - */ - if (source == BOOT_STATUS_SOURCE_SCRATCH && - state_scratch.image_num != BOOT_CURR_IMG(state)) { - source = BOOT_STATUS_SOURCE_NONE; - } -#endif - - BOOT_LOG_INF("Boot source: %s", - source == BOOT_STATUS_SOURCE_NONE ? "none" : - source == BOOT_STATUS_SOURCE_SCRATCH ? "scratch" : - source == BOOT_STATUS_SOURCE_PRIMARY_SLOT ? - "primary slot" : "BUG; can't happen"); - return source; - } - } - - BOOT_LOG_INF("Boot source: none"); - return BOOT_STATUS_SOURCE_NONE; -} - -#ifndef MCUBOOT_OVERWRITE_ONLY -/** - * Calculates the number of sectors the scratch area can contain. A "last" - * source sector is specified because images are copied backwards in flash - * (final index to index number 0). - * - * @param last_sector_idx The index of the last source sector - * (inclusive). - * @param out_first_sector_idx The index of the first source sector - * (inclusive) gets written here. - * - * @return The number of bytes comprised by the - * [first-sector, last-sector] range. - */ -static uint32_t -boot_copy_sz(const struct boot_loader_state *state, int last_sector_idx, - int *out_first_sector_idx) -{ - size_t scratch_sz; - uint32_t new_sz; - uint32_t sz; - int i; - - sz = 0; - - scratch_sz = boot_scratch_area_size(state); - for (i = last_sector_idx; i >= 0; i--) { - new_sz = sz + boot_img_sector_size(state, BOOT_PRIMARY_SLOT, i); - /* - * The secondary slot is not being checked here, because - * `boot_slots_compatible` already provides assurance that the copy size - * will be compatible with the primary slot and scratch. - */ - if (new_sz > scratch_sz) { - break; - } - sz = new_sz; - } - - /* i currently refers to a sector that doesn't fit or it is -1 because all - * sectors have been processed. In both cases, exclude sector i. - */ - *out_first_sector_idx = i + 1; - return sz; -} - -/** - * Swaps the contents of two flash regions within the two image slots. - * - * @param idx The index of the first sector in the range of - * sectors being swapped. - * @param sz The number of bytes to swap. - * @param bs The current boot status. This struct gets - * updated according to the outcome. - * - * @return 0 on success; nonzero on failure. - */ -static void -boot_swap_sectors(int idx, uint32_t sz, struct boot_loader_state *state, - struct boot_status *bs) -{ - const struct flash_area *fap_primary_slot; - const struct flash_area *fap_secondary_slot; - const struct flash_area *fap_scratch; - uint32_t copy_sz; - uint32_t trailer_sz; - uint32_t img_off; - uint32_t scratch_trailer_off; - struct boot_swap_state swap_state; - size_t last_sector; - bool erase_scratch; - uint8_t image_index; - int rc; - - /* Calculate offset from start of image area. */ - img_off = boot_img_sector_off(state, BOOT_PRIMARY_SLOT, idx); - - copy_sz = sz; - trailer_sz = boot_trailer_sz(BOOT_WRITE_SZ(state)); - - /* sz in this function is always sized on a multiple of the sector size. - * The check against the start offset of the last sector - * is to determine if we're swapping the last sector. The last sector - * needs special handling because it's where the trailer lives. If we're - * copying it, we need to use scratch to write the trailer temporarily. - * - * NOTE: `use_scratch` is a temporary flag (never written to flash) which - * controls if special handling is needed (swapping last sector). - */ - last_sector = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT) - 1; - if ((img_off + sz) > - boot_img_sector_off(state, BOOT_PRIMARY_SLOT, last_sector)) { - copy_sz -= trailer_sz; - } - - bs->use_scratch = (bs->idx == BOOT_STATUS_IDX_0 && copy_sz != sz); - - image_index = BOOT_CURR_IMG(state); - - rc = flash_area_open(FLASH_AREA_IMAGE_PRIMARY(image_index), - &fap_primary_slot); - assert (rc == 0); - - rc = flash_area_open(FLASH_AREA_IMAGE_SECONDARY(image_index), - &fap_secondary_slot); - assert (rc == 0); - - rc = flash_area_open(FLASH_AREA_IMAGE_SCRATCH, &fap_scratch); - assert (rc == 0); - - if (bs->state == BOOT_STATUS_STATE_0) { - BOOT_LOG_DBG("erasing scratch area"); - rc = boot_erase_region(fap_scratch, 0, fap_scratch->fa_size); - assert(rc == 0); - - if (bs->idx == BOOT_STATUS_IDX_0) { - /* Write a trailer to the scratch area, even if we don't need the - * scratch area for status. We need a temporary place to store the - * `swap-type` while we erase the primary trailer. - */ - rc = swap_status_init(state, fap_scratch, bs); - assert(rc == 0); - - if (!bs->use_scratch) { - /* Prepare the primary status area... here it is known that the - * last sector is not being used by the image data so it's safe - * to erase. - */ - rc = swap_erase_trailer_sectors(state, fap_primary_slot); - assert(rc == 0); - - rc = swap_status_init(state, fap_primary_slot, bs); - assert(rc == 0); - - /* Erase the temporary trailer from the scratch area. */ - rc = boot_erase_region(fap_scratch, 0, fap_scratch->fa_size); - assert(rc == 0); - } - } - - rc = boot_copy_region(state, fap_secondary_slot, fap_scratch, - img_off, 0, copy_sz); - assert(rc == 0); - - rc = boot_write_status(state, bs); - bs->state = BOOT_STATUS_STATE_1; - BOOT_STATUS_ASSERT(rc == 0); - } - - if (bs->state == BOOT_STATUS_STATE_1) { - rc = boot_erase_region(fap_secondary_slot, img_off, sz); - assert(rc == 0); - - rc = boot_copy_region(state, fap_primary_slot, fap_secondary_slot, - img_off, img_off, copy_sz); - assert(rc == 0); - - if (bs->idx == BOOT_STATUS_IDX_0 && !bs->use_scratch) { - /* If not all sectors of the slot are being swapped, - * guarantee here that only the primary slot will have the state. - */ - rc = swap_erase_trailer_sectors(state, fap_secondary_slot); - assert(rc == 0); - } - - rc = boot_write_status(state, bs); - bs->state = BOOT_STATUS_STATE_2; - BOOT_STATUS_ASSERT(rc == 0); - } - - if (bs->state == BOOT_STATUS_STATE_2) { - rc = boot_erase_region(fap_primary_slot, img_off, sz); - assert(rc == 0); - - /* NOTE: If this is the final sector, we exclude the image trailer from - * this copy (copy_sz was truncated earlier). - */ - rc = boot_copy_region(state, fap_scratch, fap_primary_slot, - 0, img_off, copy_sz); - assert(rc == 0); - - if (bs->use_scratch) { - scratch_trailer_off = boot_status_off(fap_scratch); - - /* copy current status that is being maintained in scratch */ - rc = boot_copy_region(state, fap_scratch, fap_primary_slot, - scratch_trailer_off, img_off + copy_sz, - (BOOT_STATUS_STATE_COUNT - 1) * BOOT_WRITE_SZ(state)); - BOOT_STATUS_ASSERT(rc == 0); - - rc = boot_read_swap_state_by_id(FLASH_AREA_IMAGE_SCRATCH, - &swap_state); - assert(rc == 0); - - if (swap_state.image_ok == BOOT_FLAG_SET) { - rc = boot_write_image_ok(fap_primary_slot); - assert(rc == 0); - } - - if (swap_state.swap_type != BOOT_SWAP_TYPE_NONE) { - rc = boot_write_swap_info(fap_primary_slot, - swap_state.swap_type, image_index); - assert(rc == 0); - } - - rc = boot_write_swap_size(fap_primary_slot, bs->swap_size); - assert(rc == 0); - -#ifdef MCUBOOT_ENC_IMAGES - rc = boot_write_enc_key(fap_primary_slot, 0, bs); - assert(rc == 0); - - rc = boot_write_enc_key(fap_primary_slot, 1, bs); - assert(rc == 0); -#endif - rc = boot_write_magic(fap_primary_slot); - assert(rc == 0); - } - - /* If we wrote a trailer to the scratch area, erase it after we persist - * a trailer to the primary slot. We do this to prevent mcuboot from - * reading a stale status from the scratch area in case of immediate - * reset. - */ - erase_scratch = bs->use_scratch; - bs->use_scratch = 0; - - rc = boot_write_status(state, bs); - bs->idx++; - bs->state = BOOT_STATUS_STATE_0; - BOOT_STATUS_ASSERT(rc == 0); - - if (erase_scratch) { - rc = boot_erase_region(fap_scratch, 0, sz); - assert(rc == 0); - } - } - - flash_area_close(fap_primary_slot); - flash_area_close(fap_secondary_slot); - flash_area_close(fap_scratch); -} - -void -swap_run(struct boot_loader_state *state, struct boot_status *bs, - uint32_t copy_size) -{ - uint32_t sz; - int first_sector_idx; - int last_sector_idx; - uint32_t swap_idx; - int last_idx_secondary_slot; - uint32_t primary_slot_size; - uint32_t secondary_slot_size; - primary_slot_size = 0; - secondary_slot_size = 0; - last_sector_idx = 0; - last_idx_secondary_slot = 0; - - /* - * Knowing the size of the largest image between both slots, here we - * find what is the last sector in the primary slot that needs swapping. - * Since we already know that both slots are compatible, the secondary - * slot's last sector is not really required after this check is finished. - */ - while (1) { - if ((primary_slot_size < copy_size) || - (primary_slot_size < secondary_slot_size)) { - primary_slot_size += boot_img_sector_size(state, - BOOT_PRIMARY_SLOT, - last_sector_idx); - } - if ((secondary_slot_size < copy_size) || - (secondary_slot_size < primary_slot_size)) { - secondary_slot_size += boot_img_sector_size(state, - BOOT_SECONDARY_SLOT, - last_idx_secondary_slot); - } - if (primary_slot_size >= copy_size && - secondary_slot_size >= copy_size && - primary_slot_size == secondary_slot_size) { - break; - } - last_sector_idx++; - last_idx_secondary_slot++; - } - - swap_idx = 0; - while (last_sector_idx >= 0) { - sz = boot_copy_sz(state, last_sector_idx, &first_sector_idx); - if (swap_idx >= (bs->idx - BOOT_STATUS_IDX_0)) { - boot_swap_sectors(first_sector_idx, sz, state, bs); - } - - last_sector_idx = first_sector_idx - 1; - swap_idx++; - } - -} -#endif - -#endif diff --git a/mcuboot/boot/bootutil/src/tlv.c b/mcuboot/boot/bootutil/src/tlv.c deleted file mode 100644 index 514121b2a..000000000 --- a/mcuboot/boot/bootutil/src/tlv.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright (c) 2019 JUUL Labs - * - * 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 - -#include "bootutil/bootutil.h" -#include "bootutil/image.h" -#include "bootutil_priv.h" - -/* - * Initialize a TLV iterator. - * - * @param it An iterator struct - * @param hdr image_header of the slot's image - * @param fap flash_area of the slot which is storing the image - * @param type Type of TLV to look for - * @param prot true if TLV has to be stored in the protected area, false otherwise - * - * @returns 0 if the TLV iterator was successfully started - * -1 on errors - */ -int -bootutil_tlv_iter_begin(struct image_tlv_iter *it, const struct image_header *hdr, - const struct flash_area *fap, uint16_t type, bool prot) -{ - uint32_t off_; - struct image_tlv_info info; - - if (it == NULL || hdr == NULL || fap == NULL) { - return -1; - } - - off_ = BOOT_TLV_OFF(hdr); - if (flash_area_read(fap, off_, &info, sizeof(info))) { - return -1; - } - - if (info.it_magic == IMAGE_TLV_PROT_INFO_MAGIC) { - if (hdr->ih_protect_tlv_size != info.it_tlv_tot) { - return -1; - } - - if (flash_area_read(fap, off_ + info.it_tlv_tot, &info, sizeof(info))) { - return -1; - } - } else if (hdr->ih_protect_tlv_size != 0) { - return -1; - } - - if (info.it_magic != IMAGE_TLV_INFO_MAGIC) { - return -1; - } - - it->hdr = hdr; - it->fap = fap; - it->type = type; - it->prot = prot; - it->prot_end = off_ + it->hdr->ih_protect_tlv_size; - it->tlv_end = off_ + it->hdr->ih_protect_tlv_size + info.it_tlv_tot; - // position on first TLV - it->tlv_off = off_ + sizeof(info); - return 0; -} - -/* - * Find next TLV - * - * @param it The image TLV iterator struct - * @param off The offset of the TLV's payload in flash - * @param len The length of the TLV's payload - * @param type If not NULL returns the type of TLV found - * - * @returns 0 if a TLV with with matching type was found - * 1 if no more TLVs with matching type are available - * -1 on errors - */ -int -bootutil_tlv_iter_next(struct image_tlv_iter *it, uint32_t *off, uint16_t *len, - uint16_t *type) -{ - struct image_tlv tlv; - int rc; - - if (it == NULL || it->hdr == NULL || it->fap == NULL) { - return -1; - } - - while (it->tlv_off < it->tlv_end) { - if (it->hdr->ih_protect_tlv_size > 0 && it->tlv_off == it->prot_end) { - it->tlv_off += sizeof(struct image_tlv_info); - } - - rc = flash_area_read(it->fap, it->tlv_off, &tlv, sizeof tlv); - if (rc) { - return -1; - } - - /* No more TLVs in the protected area */ - if (it->prot && it->tlv_off >= it->prot_end) { - return 1; - } - - if (it->type == IMAGE_TLV_ANY || tlv.it_type == it->type) { - if (type != NULL) { - *type = tlv.it_type; - } - *off = it->tlv_off + sizeof(tlv); - *len = tlv.it_len; - it->tlv_off += sizeof(tlv) + tlv.it_len; - return 0; - } - - it->tlv_off += sizeof(tlv) + tlv.it_len; - } - - return 1; -} diff --git a/mcuboot/boot/cypress/.gitignore b/mcuboot/boot/cypress/.gitignore deleted file mode 100644 index 9a2c99f50..000000000 --- a/mcuboot/boot/cypress/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -outdir/ -.*.swp -target.sh -*.pyc -tags -rusty-tags.* - -# mynewt -/repos/ -/project.state -/bin/ -/targets/ -**/build/**/* - -#Eclipse project files -.cproject -.project - -# Compiled python modules. -*.pyc - -# Setuptools distribution folder. -/scripts/dist/ - -# Python egg metadata, regenerated from source files by setuptools. -/scripts/*.egg-info -/scripts/*.egg - -# Build dirs -*out/*/* -*out/obj/* - -# Build files -*.o -*.d -*.map -*.elf -*.bin -*.hex -*.log -*.lst \ No newline at end of file diff --git a/mcuboot/boot/cypress/BlinkyApp/BlinkyApp.mk b/mcuboot/boot/cypress/BlinkyApp/BlinkyApp.mk deleted file mode 100644 index 8c3dbfa7e..000000000 --- a/mcuboot/boot/cypress/BlinkyApp/BlinkyApp.mk +++ /dev/null @@ -1,109 +0,0 @@ -################################################################################ -# \file BlinkyApp.mk -# \version 1.0 -# -# \brief -# Makefile to describe demo application BlinkyApp for Cypress MCUBoot based applications. -# -################################################################################ -# \copyright -# Copyright 2018-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. -################################################################################ - -# Cypress' MCUBoot Application supports GCC ARM only at this moment -# Set defaults to: -# - compiler GCC -# - build configuration to Debug -# - image type to BOOT -COMPILER ?= GCC_ARM -IMG_TYPE ?= BOOT - -# image type can be BOOT or UPGRADE -IMG_TYPES = BOOT UPGRADE - -ifneq ($(COMPILER), GCC_ARM) -$(error Only GCC ARM is supported at this moment) -endif - -CUR_APP_PATH = $(CURDIR)/$(APP_NAME) - -include $(CUR_APP_PATH)/platforms.mk -include $(CUR_APP_PATH)/libs.mk -include $(CUR_APP_PATH)/toolchains.mk - -# Application-specific DEFINES -ifeq ($(IMG_TYPE), BOOT) - DEFINES_APP := -DBOOT_IMG -else - DEFINES_APP := -DUPGRADE_IMG -endif - -# Define start of application, RAM start and size, slot size -ifeq ($(PLATFORM), PSOC_062_2M) - DEFINES_APP += -DRAM_START=0x08000000 - DEFINES_APP += -DRAM_SIZE=0x20000 - DEFINES_APP += -DUSER_APP_START=0x10018000 - SLOT_SIZE ?= 0x10000 -endif - -# Collect Test Application sources -SOURCES_APP_SRC := $(wildcard $(CUR_APP_PATH)/*.c) -# Collect all the sources -SOURCES_APP += $(SOURCES_APP_SRC) - -# Collect includes for BlinkyApp -INCLUDE_DIRS_APP := $(addprefix -I, $(CURDIR)) -INCLUDE_DIRS_APP += $(addprefix -I, $(CUR_APP_PATH)) - -# Overwite path to linker script if custom is required, otherwise default from BSP is used -ifeq ($(COMPILER), GCC_ARM) -LINKER_SCRIPT := $(subst /cygdrive/c,c:,$(CUR_APP_PATH)/linker/$(APP_NAME).ld) -else -$(error Only GCC ARM is supported at this moment) -endif - -ASM_FILES_APP := - -# We still need this for MCUBoot apps signing -IMGTOOL_PATH ?= ../../scripts/imgtool.py - -SIGN_ARGS := sign --header-size 1024 --pad-header --align 8 -v "2.0" -S $(SLOT_SIZE) -M 512 --overwrite-only -R 0 -k keys/$(SIGN_KEY_FILE).pem - -# Output folder -OUT := $(APP_NAME)/out -# Output folder to contain build artifacts -OUT_TARGET := $(OUT)/$(PLATFORM) - -OUT_CFG := $(OUT_TARGET)/$(BUILDCFG) - -# Set build directory for BOOT and UPGRADE images -ifeq ($(IMG_TYPE), UPGRADE) - SIGN_ARGS += --pad - UPGRADE_SUFFIX :=_upgrade - OUT_CFG := $(OUT_CFG)/upgrade -else - OUT_CFG := $(OUT_CFG)/boot -endif - -pre_build: - $(info [PRE_BUILD] - Generating linker script for application $(CUR_APP_PATH)/linker/$(APP_NAME).ld) - @$(CC) -E -x c $(CFLAGS) $(INCLUDE_DIRS) $(CUR_APP_PATH)/linker/$(APP_NAME)_template.ld | grep -v '^#' >$(CUR_APP_PATH)/linker/$(APP_NAME).ld - -# Post build action to execute after main build job -post_build: $(OUT_CFG)/$(APP_NAME).hex - $(info [POST_BUILD] - Executing post build script for $(APP_NAME)) - mv -f $(OUT_CFG)/$(APP_NAME).hex $(OUT_CFG)/$(APP_NAME)_unsigned.hex - $(PYTHON_PATH) $(IMGTOOL_PATH) $(SIGN_ARGS) $(OUT_CFG)/$(APP_NAME)_unsigned.hex $(OUT_CFG)/$(APP_NAME)$(UPGRADE_SUFFIX).hex diff --git a/mcuboot/boot/cypress/BlinkyApp/BlinkyApp_CM4_Debug.launch b/mcuboot/boot/cypress/BlinkyApp/BlinkyApp_CM4_Debug.launch deleted file mode 100644 index 34a173b72..000000000 --- a/mcuboot/boot/cypress/BlinkyApp/BlinkyApp_CM4_Debug.launch +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcuboot/boot/cypress/BlinkyApp/Readme.md b/mcuboot/boot/cypress/BlinkyApp/Readme.md deleted file mode 100644 index 762207734..000000000 --- a/mcuboot/boot/cypress/BlinkyApp/Readme.md +++ /dev/null @@ -1,124 +0,0 @@ -### Blinking LED test application for MCUBoot Bootloader. - -**Description:** - -Implements simple Blinky LED CM4 application to demonstrate MCUBoot Application operation in terms of BOOT and UPGRADE process. - -It is started by MCUBoot Application which is running on CM0p. - -Functionality: - -* Blinks RED led with 2 different rates, depending on type of image - BOOT or UPGRADE. -* Prints debug info and version of itself to terminal at 115200 baud. -* Can be built for BOOT slot or UPGRADE slot of bootloader. - -**Currently supported platforms:** - -* PSOC_062_2M - -**Pre-build action:** - -Pre-build action is implemented for defining start address and size of flash, as well as RAM start address and size for BlinkyApp. -These values are set by specifing following macros: `-DUSER_APP_SIZE`, `-DUSER_APP_START`, `-DRAM_SIZE`, `-DRAM_START` in makefile. - -Pre-build action calls GCC preprocessor which intantiates defines for particular values in `BlinkyApp_template.ld`. - -Default values set for currently supported targets: -* PSOC_062_2M in `BlinkyApp.mk` to `-DUSER_APP_START=0x10018000` - -**Building an application:** - -Root directory for build is **boot/cypress.** - -The following command will build regular HEX file of a BlinkyApp for BOOT slot: - - make app APP_NAME=BlinkyApp PLATFORM=PSOC_062_2M IMG_TYPE=BOOT - -This have following defaults suggested: - - BUILDCFG=Debug - IMG_TYPE=BOOT - -To build UPGRADE image use following command: - - make app APP_NAME=BlinkyApp PLATFORM=PSOC_062_2M IMG_TYPE=UPGRADE HEADER_OFFSET=0x10000 - - Note: HEADER_OFFSET=%SLOT_SIZE% - -Example command-line for single-image: - - make app APP_NAME=BlinkyApp PLATFORM=PSOC_062_2M IMG_TYPE=BOOT - -**Building Multi-Image** - -`BlinkyApp` can be built to use in multi-image bootloader configuration. - -To get appropriate artifacts to use with multi image MCUBootApp, makefile flag `HEADER_OFFSET=` can be used. - -Example usage: - -Considering default config: - -* first image BOOT (PRIMARY) slot start `0x10018000` -* slot size `0x10000` -* second image BOOT (PRIMARY) slot start `0x10038000` - -To get appropriate artifact for second image PRIMARY slot run this command: - - make app APP_NAME=BlinkyApp PLATFORM=PSOC_062_2M IMG_TYPE=BOOT HEADER_OFFSET=0x20000 - -*Note:* only 2 images are supported at the moment. - -**Post-Build:** - -Post build action is executed at compile time for `BlinkyApp`. In case of build for `PSOC_062_2M` platform it calls `imgtool` from `MCUBoot` scripts and adds signature to compiled image. - -Flags passed to `imgtool` for signature are defined in `SIGN_ARGS` variable in BlinkyApp.mk. - -**How to program an application:** - -Use any preferred tool for programming hex files. - -Hex file names to use for programming: - -`BlinkyApp` always produce build artifacts in 2 separate folders - `boot` and `upgrade`. - -`BlinkyApp` built to run with `MCUBootApp` produces files with name BlinkyApp.hex in `boot` directory and `BlinkyApp_upgrade.hex` in `upgrade` folder. These files are ready to be flashed to the board. - -`BlinkyApp_unsigned.hex` hex file is also preserved in both cases for possible troubleshooting. - -Files to use for programming are: - -`BOOT` - boot/BlinkyApp.hex -`UPGRADE` - upgrade/BlinkyApp_upgrade.hex - -**Flags:** -- `BUILDCFG` - configuration **Release** or **Debug** -- `MAKEINFO` - 0 (default) - less build info, 1 - verbose output of compilation. -- `HEADER_OFFSET` - 0 (default) - no offset of output hex file, 0x%VALUE% - offset for output hex file. Value 0x10000 is slot size MCUBoot Bootloader in this example. -- `IMG_TYPE` - `BOOT` (default) - build image for BOOT slot of MCUBoot Bootloader, `UPGRADE` - build image for UPGRADE slot of MCUBoot Bootloader. - -**NOTE**: In case of `UPGRADE` image `HEADER_OFFSET` should be set to MCUBoot Bootloader slot size. - -**Example terminal output:** - -When user application programmed in BOOT slot: - - =========================== - [BlinkyApp] BlinkyApp v1.0 [CM4] - =========================== - [BlinkyApp] GPIO initialized - [BlinkyApp] UART initialized - [BlinkyApp] Retarget I/O set to 115200 baudrate - [BlinkyApp] Red led blinks with 1 sec period - -When user application programmed in UPRADE slot and upgrade procedure was successful: - - =========================== - [BlinkyApp] BlinkyApp v2.0 [+] - =========================== - - [BlinkyApp] GPIO initialized - [BlinkyApp] UART initialized - [BlinkyApp] Retarget I/O set to 115200 baudrate - [BlinkyApp] Red led blinks with 0.25 sec period diff --git a/mcuboot/boot/cypress/BlinkyApp/libs.mk b/mcuboot/boot/cypress/BlinkyApp/libs.mk deleted file mode 100644 index 0fbcf75b5..000000000 --- a/mcuboot/boot/cypress/BlinkyApp/libs.mk +++ /dev/null @@ -1,89 +0,0 @@ -################################################################################ -# \file libs.mk -# \version 1.0 -# -# \brief -# Makefile to describe libraries needed for Cypress MCUBoot based applications. -# -################################################################################ -# \copyright -# Copyright 2018-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. -################################################################################ - -################################################################################ -# PDL library -################################################################################ -PDL_VERSION = 121 -# -CUR_LIBS_PATH = $(CURDIR)/libs - -# Collect source files for PDL -SOURCES_PDL := $(wildcard $(CUR_LIBS_PATH)/pdl/psoc6pdl/drivers/source/*.c) - -# Collect source files for Retarget-io -SOURCES_RETARGET_IO := $(wildcard $(CUR_LIBS_PATH)/retarget-io/*.c) - -# Collect source files for HAL -SOURCES_HAL := $(wildcard $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/source/*.c) -SOURCES_HAL += $(wildcard $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/source/triggers/*.c) -SOURCES_HAL += $(wildcard $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/source/pin_packages/*.c) - -# PDL related include directories -INCLUDE_DIRS_PDL := $(CUR_LIBS_PATH)/pdl/psoc6pdl/drivers/include -INCLUDE_DIRS_PDL += $(CUR_LIBS_PATH)/pdl/psoc6pdl/devices/include/ip -INCLUDE_DIRS_PDL += $(CUR_LIBS_PATH)/pdl/psoc6pdl/devices/include -INCLUDE_DIRS_PDL += $(CUR_LIBS_PATH)/pdl/psoc6pdl/cmsis/include - -# Retarget-io related include directories -INCLUDE_DIRS_RETARGET_IO := $(CUR_LIBS_PATH)/retarget-io - -# core-libs related include directories -INCLUDE_DIRS_CORE_LIB := $(CUR_LIBS_PATH)/core-lib/include - -# Collect dirrectories containing headers for PSOC6 HAL -INCLUDE_DIRS_HAL := $(CUR_LIBS_PATH)/psoc6hal/include -INCLUDE_DIRS_HAL += $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/include -INCLUDE_DIRS_HAL += $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/include/pin_packages -INCLUDE_DIRS_HAL += $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/include/triggers - -# Collected source files for libraries -SOURCES_LIBS := $(SOURCES_PDL) -SOURCES_LIBS += $(SOURCES_PLATFORM) -SOURCES_LIBS += $(SOURCES_RETARGET_IO) -SOURCES_LIBS += $(SOURCES_HAL) - -# Collected include directories for libraries -INCLUDE_DIRS_LIBS := $(addprefix -I,$(INCLUDE_DIRS_PDL)) -INCLUDE_DIRS_LIBS += $(addprefix -I,$(INCLUDE_DIRS_PLATFORM)) -INCLUDE_DIRS_LIBS += $(addprefix -I,$(INCLUDE_DIRS_RETARGET_IO)) -INCLUDE_DIRS_LIBS += $(addprefix -I,$(INCLUDE_DIRS_CORE_LIB)) -INCLUDE_DIRS_LIBS += $(addprefix -I,$(INCLUDE_DIRS_HAL)) - -ASM_FILES_PDL := -ifeq ($(COMPILER), GCC_ARM) -ASM_FILES_PDL += $(CUR_LIBS_PATH)/pdl/psoc6pdl/drivers/source/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.S -else -$(error Only GCC ARM is supported at this moment) -endif - -ASM_FILES_LIBS := $(ASM_FILES_PDL) -ASM_FILES_LIBS += $(ASM_FILES_PLATFORM) - -# Add define for PDL version -DEFINES_PDL += -DPDL_VERSION=$(PDL_VERSION) - -DEFINES_LIBS := $(DEFINES_PLATFORM) -DEFINES_LIBS += $(DEFINES_PDL) diff --git a/mcuboot/boot/cypress/BlinkyApp/linker/BlinkyApp_template.ld b/mcuboot/boot/cypress/BlinkyApp/linker/BlinkyApp_template.ld deleted file mode 100644 index 81fbc224e..000000000 --- a/mcuboot/boot/cypress/BlinkyApp/linker/BlinkyApp_template.ld +++ /dev/null @@ -1,425 +0,0 @@ -/***************************************************************************//** -* \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. -*******************************************************************************/ -#include - -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; - -/* The size of the MCU boot header area at the start of FLASH */ -BOOT_HEADER_SIZE = 0x400; - -/* 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 = RAM_START, LENGTH = RAM_SIZE - flash (rx) : ORIGIN = USER_APP_START, LENGTH = USER_APP_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) + BOOT_HEADER_SIZE : - { - . = ALIGN(4); - __Vectors = . ; - KEEP(*(.vectors)) - . = ALIGN(4); - __Vectors_End = .; - __Vectors_Size = __Vectors_End - __Vectors; - __end__ = .; - - . = ALIGN(4); - *(.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(4); - __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(4); - __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(4); - /* preinit data */ - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP(*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - - . = ALIGN(4); - /* init data */ - PROVIDE_HIDDEN (__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE_HIDDEN (__init_array_end = .); - - . = ALIGN(4); - /* finit data */ - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP(*(SORT(.fini_array.*))) - KEEP(*(.fini_array)) - PROVIDE_HIDDEN (__fini_array_end = .); - - KEEP(*(.jcr*)) - . = ALIGN(4); - - KEEP(*(.cy_ramfunc*)) - . = ALIGN(4); - - __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(4); - __bss_start__ = .; - *(.bss*) - *(COMMON) - . = ALIGN(4); - __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 : - { - KEEP(*(.cy_em_eeprom)) - } > em_eeprom - - - /* Supervisory Flash: User data */ - .cy_sflash_user_data : - { - KEEP(*(.cy_sflash_user_data)) - } > sflash_user_data - - - /* Supervisory Flash: Normal Access Restrictions (NAR) */ - .cy_sflash_nar : - { - KEEP(*(.cy_sflash_nar)) - } > sflash_nar - - - /* Supervisory Flash: Public Key */ - .cy_sflash_public_key : - { - KEEP(*(.cy_sflash_public_key)) - } > sflash_public_key - - - /* Supervisory Flash: Table of Content # 2 */ - .cy_toc_part2 : - { - KEEP(*(.cy_toc_part2)) - } > sflash_toc_2 - - - /* 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/mcuboot/boot/cypress/BlinkyApp/main.c b/mcuboot/boot/cypress/BlinkyApp/main.c deleted file mode 100644 index 936511d53..000000000 --- a/mcuboot/boot/cypress/BlinkyApp/main.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * 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. - */ - /*******************************************************************************/ - -#include "system_psoc6.h" -#include "cy_pdl.h" -#include "cyhal.h" -#include "cy_retarget_io.h" - -/* Define pins for UART debug output */ - -#define CY_DEBUG_UART_TX (P5_1) -#define CY_DEBUG_UART_RX (P5_0) - -#if defined(PSOC_062_2M) -#warning "Check if User LED is correct for your target board." -#define LED_PORT GPIO_PRT13 -#define LED_PIN 7U -#endif - -#define LED_NUM 5U -#define LED_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF -#define LED_INIT_DRIVESTATE 1 - -const cy_stc_gpio_pin_config_t LED_config = -{ - .outVal = 1, - .driveMode = CY_GPIO_DM_STRONG_IN_OFF, - .hsiom = HSIOM_SEL_GPIO, - .intEdge = CY_GPIO_INTR_DISABLE, - .intMask = 0UL, - .vtrip = CY_GPIO_VTRIP_CMOS, - .slewRate = CY_GPIO_SLEW_FAST, - .driveSel = CY_GPIO_DRIVE_FULL, - .vregEn = 0UL, - .ibufMode = 0UL, - .vtripSel = 0UL, - .vrefSel = 0UL, - .vohSel = 0UL, -}; - -#ifdef BOOT_IMG - #define BLINK_PERIOD (1000u) - #define GREETING_MESSAGE_VER "[BlinkyApp] BlinkyApp v1.0 [CM4]\r\n" - #define GREETING_MESSAGE_INFO "[BlinkyApp] Red led blinks with 1 sec period\r\n" -#elif UPGRADE_IMG - #define BLINK_PERIOD (250u) - #define GREETING_MESSAGE_VER "[BlinkyApp] BlinkyApp v2.0 [+]\r\n" - #define GREETING_MESSAGE_INFO "[BlinkyApp] Red led blinks with 0.25 sec period\r\n" -#else - #error "[BlinkyApp] Please specify type of image: -DBOOT_IMG or -DUPGRADE_IMG\r\n" -#endif - -void check_result(int res) -{ - if (res != CY_RSLT_SUCCESS) - { - CY_ASSERT(0); - } -} - -void test_app_init_hardware(void) -{ - /* enable interrupts */ - __enable_irq(); - - /* Disabling watchdog so it will not interrupt normal flow later */ - Cy_GPIO_Pin_Init(LED_PORT, LED_PIN, &LED_config); - /* Initialize retarget-io to use the debug UART port */ - check_result(cy_retarget_io_init(CY_DEBUG_UART_TX, CY_DEBUG_UART_RX, - CY_RETARGET_IO_BAUDRATE)); - - printf("\n===========================\r\n"); - printf(GREETING_MESSAGE_VER); - printf("===========================\r\n"); - - printf("[BlinkyApp] GPIO initialized \r\n"); - printf("[BlinkyApp] UART initialized \r\n"); - printf("[BlinkyApp] Retarget I/O set to 115200 baudrate \r\n"); - -} - -int main(void) -{ - uint32_t blinky_period = BLINK_PERIOD; - - test_app_init_hardware(); - - printf(GREETING_MESSAGE_INFO); - - for (;;) - { - /* Toggle the user LED periodically */ - Cy_SysLib_Delay(blinky_period/2); - - /* Invert the USER LED state */ - Cy_GPIO_Inv(LED_PORT, LED_PIN); - } - return 0; -} diff --git a/mcuboot/boot/cypress/BlinkyApp/main.h b/mcuboot/boot/cypress/BlinkyApp/main.h deleted file mode 100644 index 4fafb4eec..000000000 --- a/mcuboot/boot/cypress/BlinkyApp/main.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -\copyright -* Copyright 2017-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. -*******************************************************************************/ - -#ifndef USER_APP_START -#define USER_APP_START 0x10000000 -#endif - -#ifndef USER_APP_SIZE -#define USER_APP_SIZE 0x10000 -#endif \ No newline at end of file diff --git a/mcuboot/boot/cypress/BlinkyApp/platforms.mk b/mcuboot/boot/cypress/BlinkyApp/platforms.mk deleted file mode 100644 index 2f4faf98e..000000000 --- a/mcuboot/boot/cypress/BlinkyApp/platforms.mk +++ /dev/null @@ -1,109 +0,0 @@ -################################################################################ -# \file targets.mk -# \version 1.0 -# -# \brief -# Makefile to describe supported boards and platforms for Cypress MCUBoot based applications. -# -################################################################################ -# \copyright -# Copyright 2018-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. -################################################################################ - -# Target PLATFORM BlinkyApp is built for. PSOC_064_2M is set as default -# Supported: -# - PSOC_064_2M -# - PSOC_064_1M -# - PSOC_064_512K -# - PSOC_062_2M - -# default TARGET -PLATFORM ?= PSOC_064_2M -# -SB_PLATFORMS := PSOC_064_2M PSOC_064_1M PSOC_064_512K -PLATFORMS := PSOC_062_2M $(SB_PLATFORMS) - -# For which core this application is built -CORE := CM4 - -# Set paths for related folders -CUR_LIBS_PATH := $(CURDIR)/libs -PLATFORMS_PATH := $(CURDIR)/platforms -PLATFORM_PATH := $(PLATFORMS_PATH)/$(PLATFORM) - -# Target dependent definitions -ifeq ($(PLATFORM), PSOC_064_2M) -DEVICE ?= CYB0644ABZI-S2D44 -PLATFORM_SUFFIX := 02 -else ifeq ($(PLATFORM), PSOC_064_1M) -DEVICE ?= CYB06447BZI-BLD53 -PLATFORM_SUFFIX := 01 -else ifeq ($(PLATFORM), PSOC_064_512K) -DEVICE ?= CYB06445LQI-S3D42 -PLATFORM_SUFFIX := 03 -else ifeq ($(PLATFORM), PSOC_062_2M) -DEVICE ?= CY8C624ABZI-D44 -PLATFORM_SUFFIX := 02 -endif - -# Check if path to cysecuretools is set in case Secure Boot target -ifneq ($(filter $(PLATFORM), $(SB_PLATFORMS)),) -ifeq ($(CY_SEC_TOOLS_PATH), ) -$(error Variable CY_SEC_TOOLS_PATH - path to cysecuretools package not set. \ - Use `python -m pip show cysecuretools` to determine intallation folder.` \ - Then set it in Makefile to continue work.) -endif -endif - -# Collect C source files for PLATFORM -SOURCES_PLATFORM += $(wildcard $(PLATFORMS_PATH)/*.c) -SOURCES_PLATFORM += $(wildcard $(PLATFORM_PATH)/$(CORE)/*.c) -# Exclude system file for cm4 -SOURCES_PLATFORM := $(filter-out %/system_psoc6_cm0plus.c, $(SOURCES_PLATFORM)) - -# Collect dirrectories containing headers for PLATFORM -INCLUDE_DIRS_PLATFORM := $(PLATFORMS_PATH) -INCLUDE_DIRS_PLATFORM += $(PLATFORM_PATH)/$(CORE) - -# Collect Assembler files for PLATFORM -STARTUP_FILE := $(PLATFORM_PATH)/$(CORE)/$(COMPILER)/startup_psoc6_$(PLATFORM_SUFFIX)_cm4 - -ifeq ($(COMPILER), GCC_ARM) - ASM_FILES_PLATFORM := $(STARTUP_FILE).S -else -$(error Only GCC ARM is supported at this moment) -endif - -# Add device name from PLATFORM makefile to defines -DEFINES += $(DEVICE) - -# Get defines from PLATFORM makefile and convert it to regular -DMY_NAME style -ifneq ($(DEFINES),) - DEFINES_PLATFORM :=$(addprefix -D, $(subst -,_,$(DEFINES))) -endif - -DEFINES_PLATFORM += $(addprefix -D, $(PLATFORM)) - -ifneq ($(COMPILER), GCC_ARM) -$(error Only GCC ARM is supported at this moment) -endif -ifeq ($(MAKEINFO) , 1) -$(info ==============================================================================) -$(info = PLATFORM files =) -$(info ==============================================================================) -$(info $(SOURCES_PLATFORM)) -$(info $(ASM_FILES_PLATFORM)) -endif diff --git a/mcuboot/boot/cypress/BlinkyApp/toolchains.mk b/mcuboot/boot/cypress/BlinkyApp/toolchains.mk deleted file mode 100644 index 38684363f..000000000 --- a/mcuboot/boot/cypress/BlinkyApp/toolchains.mk +++ /dev/null @@ -1,128 +0,0 @@ -################################################################################ -# \file toolchains.mk -# \version 1.0 -# -# \brief -# Makefile to describe supported toolchains for Cypress MCUBoot based applications. -# -################################################################################ -# \copyright -# Copyright 2018-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. -################################################################################ - -# Compilers -GCC_ARM := 1 -IAR := 2 -ARM := 3 -OTHER := 4 - -ifeq ($(MAKEINFO), 1) -$(info $(COMPILER)) -endif -# Detect host OS to make resolving compiler pathes easier -UNAME_S := $(shell uname -s) -ifeq ($(UNAME_S), Darwin) - HOST_OS = osx -else - ifeq ($(UNAME_S), Linux) - HOST_OS = linux - else - HOST_OS = win - endif -endif - -# Path to the compiler installation -# NOTE: Absolute pathes for now for the sake of development -ifeq ($(HOST_OS), win) - ifeq ($(COMPILER), GCC_ARM) - TOOLCHAIN_PATH ?= c:/Users/$(USERNAME)/ModusToolbox_1.0/tools/gcc-7.2.1-1.0 - MY_TOOLCHAIN_PATH:=$(subst \,/,$(TOOLCHAIN_PATH)) - TOOLCHAIN_PATH := $(MY_TOOLCHAIN_PATH) - GCC_PATH := $(TOOLCHAIN_PATH) - # executables - CC := "$(GCC_PATH)/bin/arm-none-eabi-gcc" - LD := $(CC) - - else ifeq ($(COMPILER), IAR) - IAR_PATH := C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0/arm - # executables - CC := "$(IAR_PATH)/bin/iccarm.exe" - AS := "$(IAR_PATH)/bin/iasmarm.exe" - LD := "$(IAR_PATH)/bin/ilinkarm.exe" - endif - -else ifeq ($(HOST_OS), osx) - TOOLCHAIN_PATH ?= /opt/gcc-arm-none-eabi - GCC_PATH := $(TOOLCHAIN_PATH) - - CC := "$(GCC_PATH)/bin/arm-none-eabi-gcc" - LD := $(CC) - -else ifeq ($(HOST_OS), linux) - TOOLCHAIN_PATH ?= /usr/bin/gcc-arm-none-eabi/bin/arm-none-eabi-gcc - GCC_PATH := $(TOOLCHAIN_PATH) - # executables - CC := "$(GCC_PATH)/bin/arm-none-eabi-gcc" - LD := $(CC) -endif - -PDL_ELFTOOL := "hal/tools/$(HOST_OS)/elf/cymcuelftool" - -OBJDUMP := "$(GCC_PATH)/bin/arm-none-eabi-objdump" -OBJCOPY := "$(GCC_PATH)/bin/arm-none-eabi-objcopy" - -# Set flags for toolchain executables -ifeq ($(COMPILER), GCC_ARM) - # set build-in compiler flags - CFLAGS_COMMON := -mcpu=cortex-m4 -mthumb -mfloat-abi=soft -fno-stack-protector -ffunction-sections -fdata-sections -ffat-lto-objects -fstrict-aliasing -g -Wall -Wextra - ifeq ($(BUILDCFG), Debug) - CFLAGS_COMMON += -Og -g3 - else ifeq ($(BUILDCFG), Release) - CFLAGS_COMMON += -Os -g - else - $(error BUILDCFG : '$(BUILDCFG)' is not supported) - endif - # add defines and includes - CFLAGS := $(CFLAGS_COMMON) $(INCLUDES) - CC_DEPEND = -MD -MP -MF - - LDFLAGS_COMMON := -mcpu=cortex-m4 -mthumb -specs=nano.specs -ffunction-sections -fdata-sections -Wl,--gc-sections -L "$(GCC_PATH)/lib/gcc/arm-none-eabi/7.2.1/thumb/v6-m" -ffat-lto-objects -g --enable-objc-gc - ifeq ($(BUILDCFG), Debug) - LDFLAGS_COMMON += -Og - else ifeq ($(BUILDCFG), Release) - LDFLAGS_COMMON += -Os - else - $(error BUILDCFG : '$(BUILDCFG)' is not supported) - endif - LDFLAGS_NANO := -L "$(GCC_PATH)/arm-none-eabi/lib/thumb/v6-m" - LDFLAGS := $(LDFLAGS_COMMON) $(LDFLAGS_NANO) - -else ifeq ($(COMPILER), IAR) - - CFLAGS := --debug --endian=little --cpu=Cortex-M4 -e --fpu=None --dlib_config "$(IAR_PATH)\INC\c\DLib_Config_Normal.h" - CFLAGS += -Ohz --silent - CFLAGS += $(INCLUDES) - CC_DEPEND = --dependencies - - AS_FLAGS := -s+ "-M<>" -w+ -r --cpu Cortex-M4 --fpu None -S - - LINKER_SCRIPT := $(CHIP_SERIES).icf - - #options to extend stack analize: --log call_graph --log_file $(OUT)/stack_usage_$(SUFFIX).txt - LDFLAGS_STACK_USAGE := --stack_usage_control $(STACK_CONTROL_FILE) --diag_suppress=Ls015 --diag_suppress=Ls016 - LDFLAGS_COMMON := --vfe --text_out locale --silent --inline --merge_duplicate_sections - LDFLAGS := $(LDFLAGS_COMMON) $(LDFLAGS_STACK_USAGE) --config $(LINKER_SCRIPT) --map $(OUT_TARGET)/$(APP_NAME).map --entry Cy_FB_ResetHandler --no_exceptions -endif diff --git a/mcuboot/boot/cypress/MCUBootApp/MCUBootApp.ld b/mcuboot/boot/cypress/MCUBootApp/MCUBootApp.ld deleted file mode 100644 index 832017bda..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/MCUBootApp.ld +++ /dev/null @@ -1,408 +0,0 @@ -/***************************************************************************//** -* \file cy8c6xxa_cm0plus.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 CM0+ SRAM */ -STACK_SIZE = 0x1000; - -/* 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 CM0+ 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 the CM4 core in 'xx_cm4_dual.ld', - * where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.ld'. - */ - ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x20000 - flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x18000 - - /* 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 -{ - .cy_app_header : - { - KEEP(*(.cy_app_header)) - } > flash - - /* Cortex-M0+ application flash area */ - .text : - { - . = ALIGN(4); - __Vectors = . ; - KEEP(*(.vectors)) - . = ALIGN(4); - __Vectors_End = .; - __Vectors_Size = __Vectors_End - __Vectors; - __end__ = .; - - . = ALIGN(4); - *(.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_cm0plus.S */ - .copy.table : - { - . = ALIGN(4); - __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_cm0plus.S */ - .zero.table : - { - . = ALIGN(4); - __zero_table_start__ = .; - LONG (__bss_start__) - LONG (__bss_end__ - __bss_start__) - __zero_table_end__ = .; - } > flash - - __etext = . ; - - /* 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 - STACK_SIZE ; - PROVIDE(__stack = __StackTop); - - .stackSpace (NOLOAD) : ALIGN(8) - { - . = . + STACK_SIZE ; - } > ram - - .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(4); - /* preinit data */ - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP(*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - - . = ALIGN(4); - /* init data */ - PROVIDE_HIDDEN (__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE_HIDDEN (__init_array_end = .); - - . = ALIGN(4); - /* finit data */ - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP(*(SORT(.fini_array.*))) - KEEP(*(.fini_array)) - PROVIDE_HIDDEN (__fini_array_end = .); - - KEEP(*(.jcr*)) - . = ALIGN(4); - - KEEP(*(.cy_ramfunc*)) - . = ALIGN(4); - - __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(4); - __bss_start__ = .; - *(.bss*) - *(COMMON) - . = ALIGN(4); - __bss_end__ = .; - } > ram - - .heap (NOLOAD): - { - __HeapBase = .; - __end__ = .; - end = __end__; - KEEP(*(.heap*)) - . = ORIGIN(ram) + LENGTH(ram); - __HeapLimit = .; - } > ram - - - /* Emulated EEPROM Flash area */ - .cy_em_eeprom : - { - KEEP(*(.cy_em_eeprom)) - } > em_eeprom - - - /* Supervisory Flash: User data */ - .cy_sflash_user_data : - { - KEEP(*(.cy_sflash_user_data)) - } > sflash_user_data - - - /* Supervisory Flash: Normal Access Restrictions (NAR) */ - .cy_sflash_nar : - { - KEEP(*(.cy_sflash_nar)) - } > sflash_nar - - - /* Supervisory Flash: Public Key */ - .cy_sflash_public_key : - { - KEEP(*(.cy_sflash_public_key)) - } > sflash_public_key - - - /* Supervisory Flash: Table of Content # 2 */ - .cy_toc_part2 : - { - KEEP(*(.cy_toc_part2)) - } > sflash_toc_2 - - - /* 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/mcuboot/boot/cypress/MCUBootApp/MCUBootApp.mk b/mcuboot/boot/cypress/MCUBootApp/MCUBootApp.mk deleted file mode 100644 index 14cccf6ac..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/MCUBootApp.mk +++ /dev/null @@ -1,88 +0,0 @@ -################################################################################ -# \file MCUBootApp.mk -# \version 1.0 -# -# \brief -# Makefile for Cypress MCUBoot-based application. -# -################################################################################ -# \copyright -# Copyright 2018-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. -################################################################################ - -# Cypress' MCUBoot Application supports GCC ARM only at this moment -# Set default compiler to GCC if not specified from command line -COMPILER ?= GCC_ARM - -USE_CRYPTO_HW ?= 1 -MCUBOOT_IMAGE_NUMBER ?= 1 - -ifneq ($(COMPILER), GCC_ARM) -$(error Only GCC ARM is supported at this moment) -endif - -CUR_APP_PATH = $(CURDIR)/$(APP_NAME) - -include $(CUR_APP_PATH)/platforms.mk -include $(CUR_APP_PATH)/libs.mk -include $(CUR_APP_PATH)/toolchains.mk - -# Application-specific DEFINES -DEFINES_APP := -DMBEDTLS_CONFIG_FILE="\"mcuboot_crypto_config.h\"" -DEFINES_APP += -DECC256_KEY_FILE="\"keys/$(SIGN_KEY_FILE).pub\"" -DEFINES_APP += -DCORE=$(CORE) -DEFINES_APP += -DMCUBOOT_IMAGE_NUMBER=$(MCUBOOT_IMAGE_NUMBER) - -ifeq ($(USE_CRYPTO_HW), 1) -DEFINES_APP += -DMBEDTLS_USER_CONFIG_FILE="\"mcuboot_crypto_acc_config.h\"" -endif -# Collect MCUBoot sourses -SOURCES_MCUBOOT := $(wildcard $(CURDIR)/../bootutil/src/*.c) -# Collect MCUBoot Application sources -SOURCES_APP_SRC := $(wildcard $(CUR_APP_PATH)/*.c) -# Collect Flash Layer port sources -SOURCES_FLASH_PORT := $(wildcard $(CURDIR)/cy_flash_pal/*.c) -# Collect all the sources -SOURCES_APP := $(SOURCES_MCUBOOT) -SOURCES_APP += $(SOURCES_APP_SRC) -SOURCES_APP += $(SOURCES_FLASH_PORT) - -INCLUDE_DIRS_MCUBOOT := $(addprefix -I, $(CURDIR)/../bootutil/include) -INCLUDE_DIRS_MCUBOOT += $(addprefix -I, $(CURDIR)/../bootutil/src) -INCLUDE_DIRS_MCUBOOT += $(addprefix -I, $(CURDIR)/..) - -INCLUDE_DIRS_APP := $(addprefix -I, $(CURDIR)) -INCLUDE_DIRS_APP += $(addprefix -I, $(CURDIR)/cy_flash_pal/include) -INCLUDE_DIRS_APP += $(addprefix -I, $(CURDIR)/cy_flash_pal/include/flash_map_backend) -INCLUDE_DIRS_APP += $(addprefix -I, $(CUR_APP_PATH)) -INCLUDE_DIRS_APP += $(addprefix -I, $(CUR_APP_PATH)/config) -INCLUDE_DIRS_APP += $(addprefix -I, $(CUR_APP_PATH)/os) - -ASM_FILES_APP := - -# Output folder -OUT := $(APP_NAME)/out -# Output folder to contain build artifacts -OUT_TARGET := $(OUT)/$(PLATFORM) - -OUT_CFG := $(OUT_TARGET)/$(BUILDCFG) - -# Overwite path to linker script if custom is required -ifeq ($(COMPILER), GCC_ARM) -LINKER_SCRIPT := $(subst /cygdrive/c,c:,$(CUR_APP_PATH)/$(APP_NAME).ld) -else -$(error Only GCC ARM is supported at this moment) -endif \ No newline at end of file diff --git a/mcuboot/boot/cypress/MCUBootApp/MCUBootApp_CM0P_Debug.launch b/mcuboot/boot/cypress/MCUBootApp/MCUBootApp_CM0P_Debug.launch deleted file mode 100644 index c23487b32..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/MCUBootApp_CM0P_Debug.launch +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcuboot/boot/cypress/MCUBootApp/README.md b/mcuboot/boot/cypress/MCUBootApp/README.md deleted file mode 100644 index 9db4b4bb5..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/README.md +++ /dev/null @@ -1,185 +0,0 @@ -### Port of MCUBoot library to be used with Cypress targets - -**Solution Description** - -Given solution demonstrates operation of MCUBoot on Cypress' PSoC6 device. - -There are two applications implemented: -* MCUBootApp - PSoC6 MCUBoot-based bootloading application; -* BlinkyApp - simple PSoC6 blinking LED application which is a target of BOOT/UPGRADE; - -The demonstration device is CY8CPROTO-062-4343W board which is PSoC6 device with 2M of Flash available. - -The default flash map implemented is the following: - -* [0x10000000, 0x10018000] - MCUBootApp (bootloader) area; -* [0x10018000, 0x10028000] - primary slot for BlinkyApp; -* [0x10028000, 0x10038000] - secondary slot for BlinkyApp; -* [0x10038000, 0x10039000] - scratch area; - -Size of slots `0x10000` - 64kb - -**Important**: make sure primary, secondary slot and bootloader app sizes are appropriate and correspond to flash area size defined in Applications' linker files. - -MCUBootApp checks image integrity with SHA256, image authenticity with EC256 digital signature verification and uses completely SW implementation of cryptographic functions based on mbedTLS Library. - -**Hardware cryptography acceleration:** - -Cypress PSOC6 MCU family supports hardware acceleration of cryptography based on mbedTLS Library via shim layer. Implementation of this layer is supplied as separate submodule `cy-mbedtls-acceleration`. HW acceleration of cryptography shortens boot time more then 4 times, comparing to software implementation (observation results). - -To enable hardware acceleration in `MCUBootApp` pass flag `USE_CRYPTO_HW=1` to `make` while build. - -Hardware acceleration of cryptography is enabled for PSOC6 devices by default. - -**How to modify Flash map:** - -__Option 1.__ - -Navigate to `sysflash.h` and modify the flash area(s) / slots sizes to meet your needs. - -__Option 2.__ - -Navigate to `sysflash.h`, uncomment `CY_FLASH_MAP_EXT_DESC` definition. -Now define and initialize `struct flash_area *boot_area_descs[]` with flash memory addresses and sizes you need at the beginning of application, so flash APIs from `cy_flash_map.c` will use it. - -__Note:__ for both options make sure you have updated `MCUBOOT_MAX_IMG_SECTORS` appropriatery with sector size assumed to be 512. - -**How to override the flash map values during build process:** - -Navigate to MCUBootApp.mk, find section `DEFINES_APP +=` -Update this line and or add similar for flash map parameters to override. - -The possible list could be: - -* MCUBOOT_MAX_IMG_SECTORS -* CY_FLASH_MAP_EXT_DESC -* CY_BOOT_SCRATCH_SIZE -* CY_BOOT_BOOTLOADER_SIZE -* CY_BOOT_PRIMARY_1_SIZE -* CY_BOOT_SECONDARY_1_SIZE -* CY_BOOT_PRIMARY_2_SIZE -* CY_BOOT_SECONDARY_2_SIZE - -As an example in a makefile it should look like following: - -`DEFINES_APP +=-DCY_FLASH_MAP_EXT_DESC` - -`DEFINES_APP +=-DMCUBOOT_MAX_IMG_SECTORS=512` - -`DEFINES_APP +=-DCY_BOOT_PRIMARY_1_SIZE=0x15000` - -**Multi-Image Operation** - -Multi-image operation considers upgrading and verification of more then one image on the device. - -To enable multi-image operation define `MCUBOOT_IMAGE_NUMBER` in `MCUBootApp/mcuboot_config.h` file should be set to 2 (only dual-image is supported at the moment). This could also be done on build time by passing `MCUBOOT_IMAGE_NUMBER=2` as parameter to `make`. - -Default value of `MCUBOOT_IMAGE_NUMBER` is 1, which corresponds to single image configuratios. - -In multi-image operation (two images are considered for simplicity) MCUBoot Bootloader application operates as following: - -* Verifies Primary_1 and Primary_2 images; -* Verifies Secondary_1 and Secondary_2 images; -* Upgrades Secondary to Primary if valid images found; -* Boots image from Primary_1 slot only; -* Boots Primary_1 only if both - Primary_1 and Primary_2 are present and valid; - -This ensures two dependent applications can be accepted by device only in case both images are valid. - -**Default Flash map for Multi-Image operation:** - -`0x10000000 - 0x10018000` - MCUBoot Bootloader - -`0x10018000 - 0x10028000` - Primary_1 (BOOT) slot of Bootloader - -`0x10028000 - 0x10038000` - Secondary_1 (UPGRADE) slot of Bootloader - -`0x10038000 - 0x10048000` - Primary_2 (BOOT) slot of Bootloader - -`0x10048000 - 0x10058000` - Secondary_2 (UPGRADE) slot of Bootloader - -`0x10058000 - 0x10058100` - Scratch of Bootloader - -Size of slots `0x10000` - 64kb - -**Downloading Solution's Assets** - -There is a set assets required: - -* MCUBooot Library (root repository) -* PSoC6 HAL Library -* PSoC6 Peripheral Drivers Library (PDL) -* mbedTLS Cryptographic Library - -To get submodules - run the following command: - - git submodule update --init --recursive - -**Building Solution** - -This folder contains make files infrastructure for building MCUBoot Bootloader. Same approach used in sample BlinkyLedApp application. Example command are provided below for couple different build configurations. - -* Build MCUBootApp in `Debug` for signle image use case. - - make app APP_NAME=MCUBootApp PLATFORM=PSOC_062_2M BUILDCFG=Debug MCUBOOT_IMAGE_NUMBER=1 - -* Build MCUBootApp in `Release` for multi image use case. - - make app APP_NAME=MCUBootApp PLATFORM=PSOC_062_2M BUILDCFG=Release MCUBOOT_IMAGE_NUMBER=2 - -Root directory for build is **boot/cypress.** - -**Programming solution** - -There are couple ways of programming hex of MCUBootApp and BlinkyApp. Following instructions assume one of Cypress development kits, for example `CY8CPROTO_062_4343W`. - -1. Direct usage of OpenOCD. -OpenOCD package is supplied with ModuToolbox IDE and can be found in installation folder under `./tools_2.1/openocd`. -Open terminal application - and execute following command after substitution `PATH_TO_APPLICATION.hex` and `OPENOCD` paths. - -Connect a board to your computer. Switch Kitprog3 to DAP-BULK mode by pressing `SW3 MODE` button until `LED2 STATUS` constantly shines. - - export OPENOCD=/Applications/ModusToolbox/tools_2.1/openocd - - ${OPENOCD}/bin/openocd -s ${OPENOCD}/scripts \ - -f ${OPENOCD}/scripts/interface/kitprog3.cfg \ - -f ${OPENOCD}/scripts/target/psoc6_2m.cfg \ - -c "init; reset init; program PATH_TO_APPLICATION.hex" \ - -c "resume; reset; exit" - -2. Using GUI tool `Cypress Programmer` - follow [link](https://www.cypress.com/products/psoc-programming-solutions) to download. - Connect board to your computer. Switch Kitprog3 to DAP-BULK mode by pressing `SW3 MODE` button until `LED2 STATUS` constantly shines. Open `Cypress Programmer` and click `Connect`, then choose hex file: `MCUBootApp.hex` or `BlinkyApp.hex` and click `Program`. Check log to ensure programming success. Reset board. - -3. Using `DAPLINK`. - Connect board to your computer. Switch embeded Kitprog3 to `DAPLINK` mode by pressing `SW3 MODE` button until `LED2 STATUS` blinks fast and mass storage device appeared in OS. Drag and drop `hex` files you wish to program to `DAPLINK` drive in your OS. - - - -**Currently supported platforms:** - -* PSOC_062_2M - -**Build environment troubleshooting:** - -Regular shell/terminal combination on Linux and MacOS. - -On Windows: - -* Cygwin -* Msys2 - -Also IDE may be used: -* Eclipse / ModusToolbox ("makefile project from existing source") - -*Make* - make sure it is added to system's `PATH` variable and correct path is first in the list; - -*Python/Python3* - make sure you have correct path referenced in `PATH`; - -*Msys2* - to use systems PATH navigate to msys2 folder, open `msys2_shell.cmd`, uncomment set `MSYS2_PATH_TYPE=inherit`, restart MSYS2 shell. - -*Cygwin* - add following to build command `CURDIR=pwd | cygpath --mixed -f -` so that build command looks like that: - - make app APP_NAME=MCUBootApp PLATFORM=PSOC_062_2M CURDIR=`pwd | cygpath --mixed -f -` - -This will iherit system's PATH so should find `python3.7` installed in regular way as well as imgtool and its dependencies. - diff --git a/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_config/mcuboot_assert.h b/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_config/mcuboot_assert.h deleted file mode 100644 index 5c07711fc..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_config/mcuboot_assert.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * mcuboot_assert.h - * - * Cypress-specific assert() macro redefinition - * - */ - -#ifndef MCUBOOT_ASSERT_H -#define MCUBOOT_ASSERT_H - -//#include "cy_bootloader_services.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/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_config/mcuboot_config.h b/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_config/mcuboot_config.h deleted file mode 100644 index eb539a5b6..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_config/mcuboot_config.h +++ /dev/null @@ -1,148 +0,0 @@ -/* 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 2560 -#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. - */ - -/* Uncomment to enable the overwrite-only code path. */ -#define MCUBOOT_OVERWRITE_ONLY - -#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 */ -#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/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_config/mcuboot_logging.h b/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_config/mcuboot_logging.h deleted file mode 100644 index 3a8eafea9..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_config/mcuboot_logging.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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 - -#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 - -#endif /* MCUBOOT_LOGGING_H */ diff --git a/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_crypto_acc_config.h b/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_crypto_acc_config.h deleted file mode 100644 index 2bf440a54..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_crypto_acc_config.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_crypto_config.h b/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_crypto_config.h deleted file mode 100644 index 6bc5145ec..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/config/mcuboot_crypto_config.h +++ /dev/null @@ -1,3601 +0,0 @@ -/** - * \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 ``. - * - * 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 /**< 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 ``. - * - * 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/mcuboot/boot/cypress/MCUBootApp/cy_retarget_io_pdl.c b/mcuboot/boot/cypress/MCUBootApp/cy_retarget_io_pdl.c deleted file mode 100644 index 2561ee5d2..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/cy_retarget_io_pdl.c +++ /dev/null @@ -1,244 +0,0 @@ -/***************************************************************************//** -* \file cy_retarget_io.c -* -* \brief -* Provides APIs for retargeting stdio to UART hardware contained on the Cypress -* kits. -* -******************************************************************************** -* \copyright -* Copyright 2018-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. -*******************************************************************************/ - -#include "cy_retarget_io_pdl.h" - -#include "cycfg_peripherals.h" - -#include "cy_sysint.h" -#include "cy_scb_uart.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -/* Tracks the previous character sent to output stream */ -#ifdef CY_RETARGET_IO_CONVERT_LF_TO_CRLF -static char cy_retarget_io_stdout_prev_char = 0; -#endif /* CY_RETARGET_IO_CONVERT_LF_TO_CRLF */ - -cy_stc_scb_uart_context_t CYBSP_UART_context; - -static uint8_t cy_retarget_io_getchar(void); -static void cy_retarget_io_putchar(char c); - -#if defined(__ARMCC_VERSION) /* ARM-MDK */ - /*************************************************************************** - * Function Name: fputc - ***************************************************************************/ - __attribute__((weak)) int fputc(int ch, FILE *f) - { - (void)f; - #ifdef CY_RETARGET_IO_CONVERT_LF_TO_CRLF - if ((char)ch == '\n' && cy_retarget_io_stdout_prev_char != '\r') - { - cy_retarget_io_putchar('\r'); - } - - cy_retarget_io_stdout_prev_char = (char)ch; - #endif /* CY_RETARGET_IO_CONVERT_LF_TO_CRLF */ - cy_retarget_io_putchar(ch); - return (ch); - } -#elif defined (__ICCARM__) /* IAR */ - #include - - /*************************************************************************** - * Function Name: __write - ***************************************************************************/ - __weak size_t __write(int handle, const unsigned char * buffer, size_t size) - { - size_t nChars = 0; - /* This template only writes to "standard out", for all other file - * handles it returns failure. */ - if (handle != _LLIO_STDOUT) - { - return (_LLIO_ERROR); - } - if (buffer != NULL) - { - for (/* Empty */; nChars < size; ++nChars) - { - #ifdef CY_RETARGET_IO_CONVERT_LF_TO_CRLF - if (*buffer == '\n' && cy_retarget_io_stdout_prev_char != '\r') - { - cy_retarget_io_putchar('\r'); - } - - cy_retarget_io_stdout_prev_char = *buffer; - #endif /* CY_RETARGET_IO_CONVERT_LF_TO_CRLF */ - cy_retarget_io_putchar(*buffer); - ++buffer; - } - } - return (nChars); - } -#else /* (__GNUC__) GCC */ - /* Add an explicit reference to the floating point printf library to allow - the usage of floating point conversion specifier. */ - __asm (".global _printf_float"); - /*************************************************************************** - * Function Name: _write - ***************************************************************************/ - __attribute__((weak)) int _write (int fd, const char *ptr, int len) - { - int nChars = 0; - (void)fd; - if (ptr != NULL) - { - for (/* Empty */; nChars < len; ++nChars) - { - #ifdef CY_RETARGET_IO_CONVERT_LF_TO_CRLF - if (*ptr == '\n' && cy_retarget_io_stdout_prev_char != '\r') - { - cy_retarget_io_putchar('\r'); - } - - cy_retarget_io_stdout_prev_char = *ptr; - #endif /* CY_RETARGET_IO_CONVERT_LF_TO_CRLF */ - cy_retarget_io_putchar((uint32_t)*ptr); - ++ptr; - } - } - return (nChars); - } -#endif - - -#if defined(__ARMCC_VERSION) /* ARM-MDK */ - /*************************************************************************** - * Function Name: fgetc - ***************************************************************************/ - __attribute__((weak)) int fgetc(FILE *f) - { - (void)f; - return (cy_retarget_io_getchar()); - } -#elif defined (__ICCARM__) /* IAR */ - __weak size_t __read(int handle, unsigned char * buffer, size_t size) - { - /* This template only reads from "standard in", for all other file - handles it returns failure. */ - if ((handle != _LLIO_STDIN) || (buffer == NULL)) - { - return (_LLIO_ERROR); - } - else - { - *buffer = cy_retarget_io_getchar(); - return (1); - } - } -#else /* (__GNUC__) GCC */ - /* Add an explicit reference to the floating point scanf library to allow - the usage of floating point conversion specifier. */ - __asm (".global _scanf_float"); - __attribute__((weak)) int _read (int fd, char *ptr, int len) - { - int nChars = 0; - (void)fd; - if (ptr != NULL) - { - for(/* Empty */;nChars < len;++ptr) - { - *ptr = (char)cy_retarget_io_getchar(); - ++nChars; - if((*ptr == '\n') || (*ptr == '\r')) - { - break; - } - } - } - return (nChars); - } -#endif - -static uint8_t cy_retarget_io_getchar(void) -{ - uint32_t read_value = Cy_SCB_UART_Get(CYBSP_UART_HW); - while (read_value == CY_SCB_UART_RX_NO_DATA) - { - read_value = Cy_SCB_UART_Get(CYBSP_UART_HW); - } - - return (uint8_t)read_value; -} - -static void cy_retarget_io_putchar(char c) -{ - uint32_t count = 0; - while (count == 0) - { - count = Cy_SCB_UART_Put(CYBSP_UART_HW, c); - } -} - -static cy_rslt_t cy_retarget_io_pdl_setbaud(CySCB_Type *base, uint32_t baudrate) -{ - cy_rslt_t status; - - uint8_t oversample_value = 8u; - uint8_t frac_bits = 0u; - uint32_t divider; - - Cy_SCB_UART_Disable(base, NULL); - - Cy_SysClk_PeriphDisableDivider(CY_SYSCLK_DIV_16_BIT, 0); - - divider = ((Cy_SysClk_ClkPeriGetFrequency() * (1 << frac_bits)) + ((baudrate * oversample_value) / 2)) / (baudrate * oversample_value) - 1; - - status = (cy_rslt_t) Cy_SysClk_PeriphSetDivider(CY_SYSCLK_DIV_16_BIT, 0u, divider); - - Cy_SysClk_PeriphEnableDivider(CY_SYSCLK_DIV_16_BIT, 0u); - - Cy_SCB_UART_Enable(base); - - return status; -} - -cy_rslt_t cy_retarget_io_pdl_init(uint32_t baudrate) -{ - cy_rslt_t result; - - /* Configure and enable UART */ - (void)Cy_SCB_UART_Init(CYBSP_UART_HW, &CYBSP_UART_config, &CYBSP_UART_context); - - cy_retarget_io_pdl_setbaud(CYBSP_UART_HW, baudrate); - - Cy_SCB_UART_Enable(CYBSP_UART_HW); - - result = CY_RSLT_SUCCESS; - - return result; -} - -void cy_retarget_io_pdl_deinit() -{ - Cy_SCB_UART_DeInit(CYBSP_UART_HW); -} - -#if defined(__cplusplus) -} -#endif diff --git a/mcuboot/boot/cypress/MCUBootApp/cy_retarget_io_pdl.h b/mcuboot/boot/cypress/MCUBootApp/cy_retarget_io_pdl.h deleted file mode 100644 index a12da2253..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/cy_retarget_io_pdl.h +++ /dev/null @@ -1,60 +0,0 @@ -/***************************************************************************//** -* \file cy_retarget_io.h -* -* \brief -* Provides APIs for transmitting messages to or from the board via standard -* printf/scanf functions. Messages are transmitted over a UART connection which -* is generally connected to a host machine. Transmission is done at 115200 baud -* using the tx and rx pins provided by the user of this library. The UART -* instance is made available via cy_retarget_io_uart_obj in case any changes -* to the default configuration are desired. -* NOTE: If the application is built using newlib-nano, by default, floating -* point format strings (%f) are not supported. To enable this support you must -* add '-u _printf_float' to the linker command line. -* -******************************************************************************** -* \copyright -* Copyright 2018-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. -*******************************************************************************/ - -#pragma once - -#include -#include "cy_result.h" -#include "cy_pdl.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -/** UART baud rate */ -#define CY_RETARGET_IO_BAUDRATE (115200) - -/** Defining this macro enables conversion of line feed (LF) into carriage - * return followed by line feed (CR & LF) on the output direction (STDOUT). You - * can define this macro through the DEFINES variable in the application - * Makefile. - */ -#define CY_RETARGET_IO_CONVERT_LF_TO_CRLF - -cy_rslt_t cy_retarget_io_pdl_init(uint32_t baudrate); - -void cy_retarget_io_pdl_deinit(void); - -#if defined(__cplusplus) -} -#endif - diff --git a/mcuboot/boot/cypress/MCUBootApp/cy_security_cnt.c b/mcuboot/boot/cypress/MCUBootApp/cy_security_cnt.c deleted file mode 100644 index 9ccb3bea5..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/cy_security_cnt.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2020 Arm Limited. - * - * 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 "bootutil/security_cnt.h" -#include - -int32_t -boot_nv_security_counter_init(void) -{ - /* Do nothing. */ - return 0; -} - -int32_t -boot_nv_security_counter_get(uint32_t image_id, uint32_t *security_cnt) -{ - (void)image_id; - *security_cnt = 30; - - return 0; -} - -int32_t -boot_nv_security_counter_update(uint32_t image_id, uint32_t img_security_cnt) -{ - (void)image_id; - (void)img_security_cnt; - - /* Do nothing. */ - return 0; -} diff --git a/mcuboot/boot/cypress/MCUBootApp/image_ec256_mbedtls.c b/mcuboot/boot/cypress/MCUBootApp/image_ec256_mbedtls.c deleted file mode 100644 index 40531652b..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/image_ec256_mbedtls.c +++ /dev/null @@ -1,166 +0,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. - */ - -/******************************************************************************* -* \copyright -* -* (c) 2019, Cypress Semiconductor Corporation -* or a subsidiary of Cypress Semiconductor Corporation. All rights -* reserved. -* -* This software is a port of the open source MCUBoot project. -* -* This file was modified to fit PSoC6-based MCUBoot applications. -* -* Portions of this software, including source code, documentation and related -* materials ("Software"), are owned by Cypress Semiconductor -* Corporation or one of its subsidiaries ("Cypress") and is protected by -* and subject to worldwide patent protection (United States and foreign), -* United States copyright laws and international treaty provisions. -* Therefore, you may use this Software only as provided in the license -* agreement accompanying the software package from which you -* obtained this Software ("EULA"). -* -* If no EULA applies, Cypress hereby grants you a personal, non- -* exclusive, non-transferable license to copy, modify, and compile the -* Software source code solely for use in connection with Cypress's -* integrated circuit products. Any reproduction, modification, translation, -* compilation, or representation of this Software except as specified -* above is prohibited without the express written permission of Cypress. -* -* Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO -* WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING, -* BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -* PARTICULAR PURPOSE. Cypress reserves the right to make -* changes to the Software without notice. Cypress does not assume any -* liability arising out of the application or use of the Software or any -* product or circuit described in the Software. Cypress does not -* authorize its products for use in any products where a malfunction or -* failure of the Cypress product may reasonably be expected to result in -* significant property damage, injury or death ("High Risk Product"). By -* including Cypress's product in a High Risk Product, the manufacturer -* of such system or application assumes all risk of such use and in doing -* so agrees to indemnify Cypress against all liability. -* -********************************************************************************/ - -#include "mcuboot_config/mcuboot_config.h" - -#ifdef MCUBOOT_SIGN_EC256 - -#include "bootutil/sign_key.h" - -#ifdef MCUBOOT_USE_MBED_TLS - -#include "mbedtls/oid.h" -#include "mbedtls/asn1.h" -#include "mbedtls/ecdsa.h" - -#include "bootutil_priv.h" - -#include - -/* - * Declaring these like this adds NULL termination. - */ -static const uint8_t ec_pubkey_oid[] = MBEDTLS_OID_EC_ALG_UNRESTRICTED; -static const uint8_t ec_secp256r1_oid[] = MBEDTLS_OID_EC_GRP_SECP256R1; - -/* - * Parse the public key used for signing. - */ -static int -bootutil_parse_eckey(mbedtls_ecdsa_context *ctx, uint8_t **p, uint8_t *end) -{ - size_t len; - mbedtls_asn1_buf alg; - mbedtls_asn1_buf param; - - if (mbedtls_asn1_get_tag(p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) { - return -1; - } - end = *p + len; - - if (mbedtls_asn1_get_alg(p, end, &alg, ¶m)) { - return -2; - } - if (alg.len != sizeof(ec_pubkey_oid) - 1 || - memcmp(alg.p, ec_pubkey_oid, sizeof(ec_pubkey_oid) - 1)) { - return -3; - } - if (param.len != sizeof(ec_secp256r1_oid) - 1|| - memcmp(param.p, ec_secp256r1_oid, sizeof(ec_secp256r1_oid) - 1)) { - return -4; - } - - if (mbedtls_ecp_group_load(&ctx->grp, MBEDTLS_ECP_DP_SECP256R1)) { - return -5; - } - - if (mbedtls_asn1_get_bitstring_null(p, end, &len)) { - return -6; - } - if (*p + len != end) { - return -7; - } - - if (mbedtls_ecp_point_read_binary(&ctx->grp, &ctx->Q, *p, end - *p)) { - return -8; - } - - if (mbedtls_ecp_check_pubkey(&ctx->grp, &ctx->Q)) { - return -9; - } - return 0; -} - -int -bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, size_t slen, uint8_t key_id) -{ - int rc; - uint8_t *cp; - uint8_t *end; - mbedtls_ecdsa_context ctx; - - mbedtls_ecdsa_init(&ctx); - - cp = (uint8_t *)bootutil_keys[key_id].key; - end = cp + *bootutil_keys[key_id].len; - - rc = bootutil_parse_eckey(&ctx, &cp, end); - if (rc) { - return -1; - } - - while (sig[slen - 1] == '\0') { - slen--; - } - - rc = mbedtls_ecdsa_read_signature(&ctx, hash, hlen, sig, slen); - - mbedtls_ecdsa_free(&ctx); - - return rc; -} - -#endif /* MCUBOOT_USE_MBED_TLS */ - -#endif /* MCUBOOT_SIGN_EC256 */ diff --git a/mcuboot/boot/cypress/MCUBootApp/keys.c b/mcuboot/boot/cypress/MCUBootApp/keys.c deleted file mode 100644 index a09528c7f..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/keys.c +++ /dev/null @@ -1,176 +0,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. - */ - /******************************************************************************* -* -* This software is a port of the open source MCUBoot project. -* -* This file was modified to fit PSoC6-based MCUBoot applications. -* -* Portions of this software, including source code, documentation and related -* materials ("Software"), are owned by Cypress Semiconductor -* Corporation or one of its subsidiaries ("Cypress") and is protected by -* and subject to worldwide patent protection (United States and foreign), -* United States copyright laws and international treaty provisions. -* Therefore, you may use this Software only as provided in the license -* agreement accompanying the software package from which you -* obtained this Software ("EULA"). -* -* If no EULA applies, Cypress hereby grants you a personal, non- -* exclusive, non-transferable license to copy, modify, and compile the -* Software source code solely for use in connection with Cypress's -* integrated circuit products. Any reproduction, modification, translation, -* compilation, or representation of this Software except as specified -* above is prohibited without the express written permission of Cypress. -* -* Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO -* WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING, -* BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -* PARTICULAR PURPOSE. Cypress reserves the right to make -* changes to the Software without notice. Cypress does not assume any -* liability arising out of the application or use of the Software or any -* product or circuit described in the Software. Cypress does not -* authorize its products for use in any products where a malfunction or -* failure of the Cypress product may reasonably be expected to result in -* significant property damage, injury or death ("High Risk Product"). By -* including Cypress's product in a High Risk Product, the manufacturer -* of such system or application assumes all risk of such use and in doing -* so agrees to indemnify Cypress against all liability. -* -********************************************************************************/ -#include -#include - -#if !defined(MCUBOOT_HW_KEY) -#if defined(MCUBOOT_SIGN_RSA) -const unsigned char rsa_pub_key[] = { - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd1, 0x06, 0x08, - 0x1a, 0x18, 0x44, 0x2c, 0x18, 0xe8, 0xfb, 0xfd, 0xf7, 0x0d, 0xa3, 0x4f, - 0x1f, 0xbb, 0xee, 0x5e, 0xf9, 0xaa, 0xd2, 0x4b, 0x18, 0xd3, 0x5a, 0xe9, - 0x6d, 0x18, 0x80, 0x19, 0xf9, 0xf0, 0x9c, 0x34, 0x1b, 0xcb, 0xf3, 0xbc, - 0x74, 0xdb, 0x42, 0xe7, 0x8c, 0x7f, 0x10, 0x53, 0x7e, 0x43, 0x5e, 0x0d, - 0x57, 0x2c, 0x44, 0xd1, 0x67, 0x08, 0x0f, 0x0d, 0xbb, 0x5c, 0xee, 0xec, - 0xb3, 0x99, 0xdf, 0xe0, 0x4d, 0x84, 0x0b, 0xaa, 0x77, 0x41, 0x60, 0xed, - 0x15, 0x28, 0x49, 0xa7, 0x01, 0xb4, 0x3c, 0x10, 0xe6, 0x69, 0x8c, 0x2f, - 0x5f, 0xac, 0x41, 0x4d, 0x9e, 0x5c, 0x14, 0xdf, 0xf2, 0xf8, 0xcf, 0x3d, - 0x1e, 0x6f, 0xe7, 0x5b, 0xba, 0xb4, 0xa9, 0xc8, 0x88, 0x7e, 0x47, 0x3c, - 0x94, 0xc3, 0x77, 0x67, 0x54, 0x4b, 0xaa, 0x8d, 0x38, 0x35, 0xca, 0x62, - 0x61, 0x7e, 0xb7, 0xe1, 0x15, 0xdb, 0x77, 0x73, 0xd4, 0xbe, 0x7b, 0x72, - 0x21, 0x89, 0x69, 0x24, 0xfb, 0xf8, 0x65, 0x6e, 0x64, 0x3e, 0xc8, 0x0e, - 0xd7, 0x85, 0xd5, 0x5c, 0x4a, 0xe4, 0x53, 0x0d, 0x2f, 0xff, 0xb7, 0xfd, - 0xf3, 0x13, 0x39, 0x83, 0x3f, 0xa3, 0xae, 0xd2, 0x0f, 0xa7, 0x6a, 0x9d, - 0xf9, 0xfe, 0xb8, 0xce, 0xfa, 0x2a, 0xbe, 0xaf, 0xb8, 0xe0, 0xfa, 0x82, - 0x37, 0x54, 0xf4, 0x3e, 0xe1, 0x2b, 0xd0, 0xd3, 0x08, 0x58, 0x18, 0xf6, - 0x5e, 0x4c, 0xc8, 0x88, 0x81, 0x31, 0xad, 0x5f, 0xb0, 0x82, 0x17, 0xf2, - 0x8a, 0x69, 0x27, 0x23, 0xf3, 0xab, 0x87, 0x3e, 0x93, 0x1a, 0x1d, 0xfe, - 0xe8, 0xf8, 0x1a, 0x24, 0x66, 0x59, 0xf8, 0x1c, 0xab, 0xdc, 0xce, 0x68, - 0x1b, 0x66, 0x64, 0x35, 0xec, 0xfa, 0x0d, 0x11, 0x9d, 0xaf, 0x5c, 0x3a, - 0xa7, 0xd1, 0x67, 0xc6, 0x47, 0xef, 0xb1, 0x4b, 0x2c, 0x62, 0xe1, 0xd1, - 0xc9, 0x02, 0x03, 0x01, 0x00, 0x01 -}; -const unsigned int rsa_pub_key_len = 270; -#elif defined(MCUBOOT_SIGN_EC) -/* Format of PEM : - * -----BEGIN PUBLIC KEY----- - * base64encode(DER) - * -----END PUBLIC KEY----- */ -#if defined(ECC224_KEY_FILE) -#include ECC224_KEY_FILE -#else -#warning "Used default ECC224 ecdsa_pub_key" -/* It is OEM_PUB_KEY at this moment for debug purposes */ -/* Autogenerated by imgtool.py, do not edit. */ -const unsigned char ecdsa_pub_key[] = { - 0x30, 0x4e, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, - 0x81, 0x04, 0x00, 0x21, 0x03, 0x3a, 0x00, 0x04, - 0xa5, 0x8b, 0x18, 0xa4, 0x60, 0x37, 0xf7, 0x0d, - 0x2b, 0x06, 0xba, 0x4b, 0x4c, 0xd7, 0x8d, 0xec, - 0x2a, 0x32, 0x5a, 0x0e, 0x52, 0xf4, 0x1b, 0x7c, - 0x99, 0xec, 0x68, 0x5d, 0x05, 0xc3, 0x6b, 0x7b, - 0x40, 0x9c, 0xaa, 0xac, 0x90, 0xf4, 0xfc, 0xbe, - 0x98, 0xe5, 0x3e, 0x86, 0x3d, 0x37, 0xbf, 0x45, - 0x78, 0x92, 0x27, 0xca, 0x69, 0xe6, 0xf2, 0xc5, -}; -const unsigned int ecdsa_pub_key_len = 80; -#endif -#elif defined(MCUBOOT_SIGN_EC256) -/* Format of PEM : - * -----BEGIN PUBLIC KEY----- - * base64encode(DER) - * -----END PUBLIC KEY----- */ -#if defined(ECC256_KEY_FILE) -#include ECC256_KEY_FILE -#else -#warning "Used default ECC256 ecdsa_pub_key" -/* It is OEM_PUB_KEY at this moment for debug purposes */ -const unsigned char ecdsa_pub_key[] = { - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, - 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04, 0xbd, 0x59, 0x9d, 0x15, 0xe0, - 0xff, 0x66, 0x12, 0x37, 0x28, 0xdf, 0x50, 0x38, - 0xb1, 0x9a, 0x73, 0x9b, 0xbd, 0xd1, 0xb3, 0x8a, - 0x6f, 0xd2, 0x70, 0xed, 0x7f, 0xdb, 0x57, 0x53, - 0xde, 0x9e, 0x77, 0x0f, 0x9c, 0x17, 0x22, 0x69, - 0xa6, 0x75, 0x48, 0x1f, 0xa4, 0xbc, 0x49, 0xe2, - 0x01, 0xe0, 0x5e, 0x3d, 0xec, 0xa8, 0xc1, 0xca, - 0xc5, 0x5c, 0xa2, 0xc6, 0xfd, 0xb0, 0x24, 0xb1, - 0x0a, 0x46, 0xf5, -}; -const unsigned int ecdsa_pub_key_len = 91; -#endif -#else -#warning "No public key available for given signing algorithm." -#endif - -#if defined(MCUBOOT_SIGN_RSA) || \ - defined(MCUBOOT_SIGN_EC) || \ - defined(MCUBOOT_SIGN_EC256) -const struct bootutil_key bootutil_keys[] = { -#if defined(MCUBOOT_SIGN_RSA) - { - .key = rsa_pub_key, - .len = &rsa_pub_key_len, - }, -#elif defined(MCUBOOT_SIGN_EC) || \ - defined(MCUBOOT_SIGN_EC256) - { - .key = ecdsa_pub_key, - .len = &ecdsa_pub_key_len, - }, -#else - { - .key = NULL, - .len = 0x00, - }, -#endif -}; -const int bootutil_key_cnt = 1; -#endif -#else -unsigned int pub_key_len; -struct bootutil_key bootutil_keys[1] = { - { - .key = 0, - .len = &pub_key_len, - } -}; -const int bootutil_key_cnt = 1; -#endif /* !MCUBOOT_HW_KEY */ diff --git a/mcuboot/boot/cypress/MCUBootApp/libs.mk b/mcuboot/boot/cypress/MCUBootApp/libs.mk deleted file mode 100644 index 227cda611..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/libs.mk +++ /dev/null @@ -1,112 +0,0 @@ -################################################################################ -# \file libs.mk -# \version 1.0 -# -# \brief -# Makefile to describe libraries needed for Cypress MCUBoot based applications. -# -################################################################################ -# \copyright -# Copyright 2018-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. -################################################################################ - -################################################################################ -# PDL library -################################################################################ -PDL_VERSION = 121 - -CUR_LIBS_PATH = $(CURDIR)/libs -MBEDTLS_PATH = $(CURDIR)/../../ext - -# Collect source files for PDL -SOURCES_PDL := $(wildcard $(CUR_LIBS_PATH)/pdl/psoc6pdl/drivers/source/*.c) - -# PDL related include directories -INCLUDE_DIRS_PDL := $(CUR_LIBS_PATH)/pdl/psoc6pdl/drivers/include -INCLUDE_DIRS_PDL += $(CUR_LIBS_PATH)/pdl/psoc6pdl/devices/include/ip -INCLUDE_DIRS_PDL += $(CUR_LIBS_PATH)/pdl/psoc6pdl/devices/include -INCLUDE_DIRS_PDL += $(CUR_LIBS_PATH)/pdl/psoc6pdl/cmsis/include - -# core-libs related include directories -INCLUDE_DIRS_CORE_LIB := $(CUR_LIBS_PATH)/core-lib/include - -SOURCES_HAL += $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/source/cyhal_crypto_common.c -SOURCES_HAL += $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/source/cyhal_hwmgr.c - -# Collected source files for libraries -SOURCES_LIBS := $(SOURCES_PDL) -SOURCES_LIBS += $(SOURCES_PLATFORM) -SOURCES_LIBS += $(SOURCES_HAL) - -# needed for Crypto HW Acceleration and headers inclusion, do not use for peripherals -# peripherals should be accessed -INCLUDE_DIRS_HAL := $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/include -INCLUDE_DIRS_HAL += $(CUR_LIBS_PATH)/psoc6hal/include -INCLUDE_DIRS_HAL += $(CUR_LIBS_PATH)/psoc6hal/COMPONENT_PSOC6HAL/include/pin_packages - -# Collected include directories for libraries -INCLUDE_DIRS_LIBS := $(addprefix -I,$(INCLUDE_DIRS_PDL)) -INCLUDE_DIRS_LIBS += $(addprefix -I,$(INCLUDE_DIRS_PLATFORM)) -INCLUDE_DIRS_LIBS += $(addprefix -I,$(INCLUDE_DIRS_CORE_LIB)) -INCLUDE_DIRS_LIBS += $(addprefix -I,$(INCLUDE_DIRS_HAL)) - -################################################################################ -# mbedTLS settings -################################################################################ -# MbedTLS related include directories -INCLUDE_DIRS_MBEDTLS += $(MBEDTLS_PATH)/mbedtls/include -INCLUDE_DIRS_MBEDTLS += $(MBEDTLS_PATH)/mbedtls/include/mbedtls -INCLUDE_DIRS_MBEDTLS += $(MBEDTLS_PATH)/mbedtls/crypto/include -INCLUDE_DIRS_MBEDTLS += $(MBEDTLS_PATH)/mbedtls/crypto/include/mbedtls -# -INCLUDE_DIRS_LIBS += $(addprefix -I,$(INCLUDE_DIRS_MBEDTLS)) -# Collect source files for MbedTLS -SOURCES_MBEDTLS := $(wildcard $(MBEDTLS_PATH)/mbedtls/library/*.c) -SOURCES_MBEDTLS += $(wildcard $(MBEDTLS_PATH)/mbedtls/crypto/library/*.c) -# Collected source files for libraries -SOURCES_LIBS += $(SOURCES_MBEDTLS) -## mbedTLS settings - -################################################################################ -# mbedTLS acceleration settings -################################################################################ -ifeq ($(USE_CRYPTO_HW), 1) -# cy-mbedtls-acceleration related include directories -INCLUDE_DIRS_MBEDTLS_MXCRYPTO := $(CUR_LIBS_PATH)/cy-mbedtls-acceleration/mbedtls_MXCRYPTO -# Collect source files for MbedTLS acceleration -SOURCES_MBEDTLS_MXCRYPTO := $(wildcard $(CUR_LIBS_PATH)/cy-mbedtls-acceleration/mbedtls_MXCRYPTO/*.c) -# -INCLUDE_DIRS_LIBS += $(addprefix -I,$(INCLUDE_DIRS_MBEDTLS_MXCRYPTO)) -# Collected source files for libraries -SOURCES_LIBS += $(SOURCES_MBEDTLS_MXCRYPTO) -endif -## mbedTLS acceleration settings - -ASM_FILES_PDL := -ifeq ($(COMPILER), GCC_ARM) -ASM_FILES_PDL += $(CUR_LIBS_PATH)/pdl/psoc6pdl/drivers/source/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.S -else -$(error Only GCC ARM is supported at this moment) -endif - -ASM_FILES_LIBS := $(ASM_FILES_PDL) -ASM_FILES_LIBS += $(ASM_FILES_PLATFORM) - -# Add define for PDL version -DEFINES_PDL += -DPDL_VERSION=$(PDL_VERSION) - -DEFINES_LIBS := $(DEFINES_PLATFORM) -DEFINES_LIBS += $(DEFINES_PDL) diff --git a/mcuboot/boot/cypress/MCUBootApp/main.c b/mcuboot/boot/cypress/MCUBootApp/main.c deleted file mode 100644 index e908d07c8..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/main.c +++ /dev/null @@ -1,78 +0,0 @@ -/***************************************************************************//** -* \file main.c -* \version 1.0 -******************************************************************************** -* \copyright -* 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. -*******************************************************************************/ -/* Cypress pdl headers */ -#include "cy_pdl.h" -#include "cy_retarget_io_pdl.h" -#include "cy_result.h" - -#include "sysflash/sysflash.h" -#include "flash_map_backend/flash_map_backend.h" - -#include "bootutil/image.h" -#include "bootutil/bootutil.h" -#include "bootutil/sign_key.h" - -#include "bootutil/bootutil_log.h" - -/* Define pins for UART debug output */ -#define CYBSP_UART_ENABLED 1U -#define CYBSP_UART_HW SCB5 -#define CYBSP_UART_IRQ scb_5_interrupt_IRQn - -static void do_boot(struct boot_rsp *rsp) -{ - uint32_t app_addr = 0; - - app_addr = (rsp->br_image_off + rsp->br_hdr->ih_hdr_size); - - BOOT_LOG_INF("Starting User Application on CM4 (wait)..."); - Cy_SysLib_Delay(100); - - Cy_SysEnableCM4(app_addr); - - while (1) - { - __WFI() ; - } -} - -int main(void) -{ - struct boot_rsp rsp ; - - init_cycfg_clocks(); - init_cycfg_peripherals(); - init_cycfg_pins(); - /* enable interrupts */ - __enable_irq(); - - /* Initialize retarget-io to use the debug UART port (CYBSP_UART_HW) */ - cy_retarget_io_pdl_init(115200u); - - BOOT_LOG_INF("MCUBoot Bootloader Started"); - - if (boot_go(&rsp) == 0) { - BOOT_LOG_INF("User Application validated successfully"); - do_boot(&rsp); - } else - BOOT_LOG_INF("MCUBoot Bootloader found none of bootable images") ; - - return 0; -} diff --git a/mcuboot/boot/cypress/MCUBootApp/os/os.h b/mcuboot/boot/cypress/MCUBootApp/os/os.h deleted file mode 100644 index 8d581ca69..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/os/os.h +++ /dev/null @@ -1,18 +0,0 @@ -/***************************************************************************//** -* \file os.h -* \version 1.0 -* -* \brief -* Objective: -* Heap init prototype -* -******************************************************************************** -* \copyright -* Copyright 2017-2018, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - - -void os_heap_init(void); diff --git a/mcuboot/boot/cypress/MCUBootApp/os/os_heap.h b/mcuboot/boot/cypress/MCUBootApp/os/os_heap.h deleted file mode 100644 index 0ea954c3e..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/os/os_heap.h +++ /dev/null @@ -1,37 +0,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 H_OS_HEAP_ -#define H_OS_HEAP_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -void *os_malloc(size_t size); -void os_free(void *mem); -void *os_realloc(void *ptr, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/cypress/MCUBootApp/os/os_malloc.h b/mcuboot/boot/cypress/MCUBootApp/os/os_malloc.h deleted file mode 100644 index 249b12c11..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/os/os_malloc.h +++ /dev/null @@ -1,42 +0,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 H_OS_MALLOC_ -#define H_OS_MALLOC_ - -#include "os/os_heap.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#undef malloc -#define malloc os_malloc - -#undef free -#define free os_free - -#undef realloc -#define realloc os_realloc - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/cypress/MCUBootApp/platforms.mk b/mcuboot/boot/cypress/MCUBootApp/platforms.mk deleted file mode 100644 index d4a70c57b..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/platforms.mk +++ /dev/null @@ -1,82 +0,0 @@ -################################################################################ -# \file targets.mk -# \version 1.0 -# -# \brief -# Makefile to describe supported boards and platforms for Cypress MCUBoot based applications. -# -################################################################################ -# \copyright -# Copyright 2018-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. -################################################################################ - -# Target platform MCUBootApp is built for. PSOC_062_2M is set by default# Supported: -# - PSOC_062_2M - -# default PLATFORM -PLATFORM ?= PSOC_062_2M -# -PLATFORMS := PSOC_062_2M - -# For which core this application is built -CORE := CM0P - -# Set paths for related folders -PLATFORM_PATH := $(CURDIR)/platforms - -# MCU device selection, based on target device. -# Default chips are used for supported platforms -# This can be redefined in case of other chip usage -ifeq ($(PLATFORM), PSOC_062_2M) -DEVICE ?= CY8C624ABZI-D44 -PLATFORM_SUFFIX := 02 -endif - -# Collect C source files for PLATFORM -SOURCES_PLATFORM += $(wildcard $(PLATFORM_PATH)/*.c) -SOURCES_PLATFORM := $(filter-out %/system_psoc6_cm4.c, $(SOURCES_PLATFORM)) - -# Collect dirrectories containing headers for PLATFORM -INCLUDE_DIRS_PLATFORM := $(PLATFORM_PATH) -# Collect Assembler files for PLATFORM -# Include _01_, _02_ or _03_ PLATFORM_SUFFIX depending on device family. -STARTUP_FILE := $(PLATFORM_PATH)/$(PLATFORM)/$(CORE)/$(COMPILER)/startup_psoc6_$(PLATFORM_SUFFIX)_cm0plus - -ifeq ($(COMPILER), GCC_ARM) - ASM_FILES_PLATFORM := $(STARTUP_FILE).S -else -$(error Only GCC ARM is supported at this moment) -endif - -# Add device name to defines -DEFINES += $(DEVICE) -DEFINES += $(PLATFORM) - -# Convert defines it to regular -DMY_NAME style -ifneq ($(DEFINES),) - DEFINES_PLATFORM :=$(addprefix -D, $(subst -,_,$(DEFINES))) -endif - -ifeq ($(COMPILER), GCC_ARM) -LINKER_SCRIPT ?= $(PLATFORM_PATH)/$(PLATFORM)/$(CORE)/$(COMPILER)/*_cm0plus.ld -else -$(error Only GCC ARM is supported at this moment) -endif - -ifeq ($(MAKEINFO) , 1) -$(info $(SOURCES_PLATFORM)) -$(info $(ASM_FILES_PLATFORM)) -endif diff --git a/mcuboot/boot/cypress/MCUBootApp/sysflash/sysflash.h b/mcuboot/boot/cypress/MCUBootApp/sysflash/sysflash.h deleted file mode 100644 index 2a905eecb..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/sysflash/sysflash.h +++ /dev/null @@ -1,75 +0,0 @@ -/* Manual version of auto-generated version. */ - -#ifndef __SYSFLASH_H__ -#define __SYSFLASH_H__ - -#define FLASH_DEVICE_INTERNAL_FLASH (0x7F) - -#define FLASH_AREA_BOOTLOADER 0 -#define FLASH_AREA_IMAGE_0 1 -#define FLASH_AREA_IMAGE_1 2 -#define FLASH_AREA_IMAGE_SCRATCH 3 -#define FLASH_AREA_IMAGE_2 5 -#define FLASH_AREA_IMAGE_3 6 - -#define CY_FLASH_ALIGN (CY_FLASH_SIZEOF_ROW) -#define CY_FLASH_DEVICE_BASE (CY_FLASH_BASE) - -#ifndef CY_BOOT_SCRATCH_SIZE -#define CY_BOOT_SCRATCH_SIZE (0x1000) -#endif - -#ifndef CY_BOOT_BOOTLOADER_SIZE -#define CY_BOOT_BOOTLOADER_SIZE (0x18000) -#endif - -#ifndef CY_BOOT_PRIMARY_1_SIZE -#define CY_BOOT_PRIMARY_1_SIZE (0x10000) -#endif - -#ifndef CY_BOOT_SECONDARY_1_SIZE -#define CY_BOOT_SECONDARY_1_SIZE (0x10000) -#endif - -#if (MCUBOOT_IMAGE_NUMBER == 2) /* if dual-image */ -#ifndef CY_BOOT_PRIMARY_2_SIZE -#define CY_BOOT_PRIMARY_2_SIZE (0x10000) -#endif - -#ifndef CY_BOOT_SECONDARY_2_SIZE -#define CY_BOOT_SECONDARY_2_SIZE (0x10000) -#endif -#endif - -#if (MCUBOOT_IMAGE_NUMBER == 1) -#define FLASH_AREA_IMAGE_PRIMARY(x) (((x) == 0) ? \ - FLASH_AREA_IMAGE_0 : \ - FLASH_AREA_IMAGE_0) -#define FLASH_AREA_IMAGE_SECONDARY(x) (((x) == 0) ? \ - FLASH_AREA_IMAGE_1 : \ - FLASH_AREA_IMAGE_1) - -#elif (MCUBOOT_IMAGE_NUMBER == 2) - -#define FLASH_AREA_IMAGE_PRIMARY(x) (((x) == 0) ? \ - FLASH_AREA_IMAGE_0 : \ - ((x) == 1) ? \ - FLASH_AREA_IMAGE_2 : \ - 255) -#define FLASH_AREA_IMAGE_SECONDARY(x) (((x) == 0) ? \ - FLASH_AREA_IMAGE_1 : \ - ((x) == 1) ? \ - FLASH_AREA_IMAGE_3 : \ - 255) - -#else -#warning "Image slot and flash area mapping is not defined" -#endif -#define CY_IMG_HDR_SIZE 0x400 - -#ifndef CY_FLASH_MAP_EXT_DESC -/* Uncomment in case you want to use separately defined table of flash area descriptors */ -/* #define CY_FLASH_MAP_EXT_DESC */ -#endif - -#endif /* __SYSFLASH_H__ */ diff --git a/mcuboot/boot/cypress/MCUBootApp/toolchains.mk b/mcuboot/boot/cypress/MCUBootApp/toolchains.mk deleted file mode 100644 index d250931fa..000000000 --- a/mcuboot/boot/cypress/MCUBootApp/toolchains.mk +++ /dev/null @@ -1,141 +0,0 @@ -################################################################################ -# \file toolchains.mk -# \version 1.0 -# -# \brief -# Makefile to describe supported toolchains for Cypress MCUBoot based applications. -# -################################################################################ -# \copyright -# Copyright 2018-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. -################################################################################ - -# Compilers -GCC_ARM := 1 -IAR := 2 -ARM := 3 -OTHER := 4 - -ifeq ($(MAKEINFO), 1) -$(info $(COMPILER)) -endif -# Detect host OS to make resolving compiler pathes easier -UNAME_S := $(shell uname -s) -ifeq ($(UNAME_S), Darwin) - HOST_OS = osx -else - ifeq ($(UNAME_S), Linux) - HOST_OS = linux - else - HOST_OS = win - endif -endif - -# Path to the compiler installation -# NOTE: Absolute pathes for now for the sake of development -ifeq ($(HOST_OS), win) - ifeq ($(COMPILER), GCC_ARM) - TOOLCHAIN_PATH ?= c:/Users/$(USERNAME)/ModusToolbox_1.0/tools/gcc-7.2.1-1.0 - MY_TOOLCHAIN_PATH:=$(subst \,/,$(TOOLCHAIN_PATH)) - TOOLCHAIN_PATH := $(MY_TOOLCHAIN_PATH) - GCC_PATH := $(TOOLCHAIN_PATH) - # executables - CC := "$(GCC_PATH)/bin/arm-none-eabi-gcc" - LD := $(CC) - - else ifeq ($(COMPILER), IAR) - IAR_PATH := C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0/arm - # executables - CC := "$(IAR_PATH)/bin/iccarm.exe" - AS := "$(IAR_PATH)/bin/iasmarm.exe" - LD := "$(IAR_PATH)/bin/ilinkarm.exe" - endif - -else ifeq ($(HOST_OS), osx) - TOOLCHAIN_PATH ?= /opt/gcc-arm-none-eabi - GCC_PATH := $(TOOLCHAIN_PATH) - - CC := "$(GCC_PATH)/bin/arm-none-eabi-gcc" - LD := $(CC) - -else ifeq ($(HOST_OS), linux) - TOOLCHAIN_PATH ?= /usr/bin/gcc-arm-none-eabi/bin/arm-none-eabi-gcc - GCC_PATH := $(TOOLCHAIN_PATH) - # executables - CC := "$(GCC_PATH)/bin/arm-none-eabi-gcc" - LD := $(CC) -endif - -PDL_ELFTOOL := "hal/tools/$(HOST_OS)/elf/cymcuelftool" - -# Set executable names for compilers -ifeq ($(COMPILER), GCC_ARM) - CC := "$(GCC_PATH)/bin/arm-none-eabi-gcc" - LD := $(CC) -else - CC := "$(IAR_PATH)/bin/iccarm.exe" - AS := "$(IAR_PATH)/bin/iasmarm.exe" - LD := "$(IAR_PATH)/bin/ilinkarm.exe" -endif - -OBJDUMP := "$(GCC_PATH)/bin/arm-none-eabi-objdump" -OBJCOPY := "$(GCC_PATH)/bin/arm-none-eabi-objcopy" - -# Set flags for toolchain executables - -ifeq ($(COMPILER), GCC_ARM) - # set build-in compiler flags - CFLAGS_COMMON := -mcpu=cortex-m0plus -mthumb -mfloat-abi=soft -fno-stack-protector -ffunction-sections -fdata-sections -ffat-lto-objects -fstrict-aliasing -g -Wall -Wextra - ifeq ($(BUILDCFG), Debug) - CFLAGS_COMMON += -Og -g3 - else ifeq ($(BUILDCFG), Release) - CFLAGS_COMMON += -Os -g - else -$(error BUILDCFG : '$(BUILDCFG)' is not supported) - endif - # add defines and includes - CFLAGS := $(CFLAGS_COMMON) $(INCLUDES) - CC_DEPEND = -MD -MP -MF - - LDFLAGS_COMMON := -mcpu=cortex-m0plus -mthumb -specs=nano.specs -ffunction-sections -fdata-sections -Wl,--gc-sections -L "$(GCC_PATH)/lib/gcc/arm-none-eabi/7.2.1/thumb/v6-m" -ffat-lto-objects -g --enable-objc-gc - ifeq ($(BUILDCFG), Debug) - LDFLAGS_COMMON += -Og - else ifeq ($(BUILDCFG), Release) - LDFLAGS_COMMON += -Os - else -$(error BUILDCFG : '$(BUILDCFG)' is not supported) - endif - LDFLAGS_NANO := -L "$(GCC_PATH)/arm-none-eabi/lib/thumb/v6-m" - # TODO: check .map name - LDFLAGS := $(LDFLAGS_COMMON) $(LDFLAGS_NANO) - -else ifeq ($(COMPILER), IAR) - - CFLAGS := --debug --endian=little --cpu=Cortex-M0+ -e --fpu=None --dlib_config "$(IAR_PATH)\INC\c\DLib_Config_Normal.h" - CFLAGS += -Ohz --silent -# CFLAGS += $(DEFINES) $(INCLUDES) - CFLAGS += $(INCLUDES) - CC_DEPEND = --dependencies - - AS_FLAGS := -s+ "-M<>" -w+ -r --cpu Cortex-M0+ --fpu None -S - - LINKER_SCRIPT := $(CHIP_SERIES).icf - - #options to extend stack analize: --log call_graph --log_file $(OUT)/stack_usage_$(SUFFIX).txt - LDFLAGS_STACK_USAGE := --stack_usage_control $(STACK_CONTROL_FILE) --diag_suppress=Ls015 --diag_suppress=Ls016 - LDFLAGS_COMMON := --vfe --text_out locale --silent --inline --merge_duplicate_sections - LDFLAGS := $(LDFLAGS_COMMON) $(LDFLAGS_STACK_USAGE) --config $(LINKER_SCRIPT) --map $(OUT_APP)/$(APP_NAME).map --entry Cy_FB_ResetHandler --no_exceptions -endif diff --git a/mcuboot/boot/cypress/Makefile b/mcuboot/boot/cypress/Makefile deleted file mode 100644 index b91f279d7..000000000 --- a/mcuboot/boot/cypress/Makefile +++ /dev/null @@ -1,209 +0,0 @@ -################################################################################ -# \file Makefile -# \version 1.0 -# -# \brief -# Main Makefile for building MCUBoot application for Cypress target. -# -################################################################################ -# \copyright -# Copyright 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. -################################################################################ - -# minimum Python 3.7 is required -# Python path definition -ifeq ($(OS),Windows_NT) -PYTHON_PATH?=python -else -PYTHON_PATH?=python3 -endif - -################################################################################ -# Main settings -################################################################################ - -# Defines whether or not show verbose build output -MAKEINFO ?= 1 -# Application name by default -APP_NAME ?= MCUBootApp -# Weather or now execute post build script after build - set to 0 for CI -POST_BUILD ?= 1 - -SIGN_KEY_FILE ?= cypress-test-ec-p256 - -# set this variable to a path, where cysecuretools python package is installed -# use command `python -m pip show cysecuretools` to find out this path -# or rely on scripts that automates this action, bit not work for virtual envs -CY_SEC_TOOLS_PATH ?= $(shell $(PYTHON_PATH) $(CURDIR)/scripts/find_cysectools.py) - -BUILDCFG ?= Debug - -# Set of supported applications -APPS := MCUBootApp BlinkyApp - -HEADER_OFFSET ?= 0 - -ifneq ($(filter $(APP_NAME), $(APPS)),) -include ./$(APP_NAME)/$(APP_NAME).mk -else -$(error Not supported application: '$(APP_NAME)') -endif - -ASM_FILES := $(ASM_FILES_APP) -ASM_FILES += $(ASM_FILES_LIBS) - -C_FILES := $(SOURCES_APP) -C_FILES += $(SOURCES_LIBS) - -INCLUDE_DIRS := $(INCLUDE_DIRS_APP) -INCLUDE_DIRS += $(INCLUDE_DIRS_MCUBOOT) -INCLUDE_DIRS += $(INCLUDE_DIRS_LIBS) - -#INCLUDE_FILES := $(INCLUDE_FILES_APP) - -#INCLUDES := $(addprefix -include , $(INCLUDE_FILES)) - -O_FILES := $(notdir $(C_FILES:.c=.o)) $(addsuffix .o, $(notdir $(basename $(ASM_FILES)))) - -DEFINES := $(DEFINES_APP) -DEFINES += $(DEFINES_LIBS) -AS_FLAGS += $(DEFINES) - -ifeq ($(MAKEINFO), 1) -$(info ==============================================================================) -$(info = Directories to look for header files: =) -$(info ==============================================================================) -$(info $(INCLUDE_DIRS)) - -$(info ==============================================================================) -$(info = Collected Defines string: =) -$(info ==============================================================================) -$(info $(DEFINES)) -endif - -# updating CFLAGS at this point as DEFINES are completed -CFLAGS += $(DEFINES) - -VPATH = $(dir $(C_FILES) $(ASM_FILES)) - -# -# STDE: For cygwin, adjust paths for compiler -# -MY_FILES := $(subst /cygdrive/c,c:,$(C_FILES)) -#$(info MY_FILES $(MY_FILES)) -C_FILES=$(MY_FILES) - -MY_DIRS := $(subst /cygdrive/c,c:,$(INCLUDE_DIRS)) -#$(info MY_DIRS $(MY_DIRS)) -INCLUDE_DIRS=$(MY_DIRS) - -MY_ASM_FILES := $(subst /cygdrive/c,c:,$(ASM_FILES)) -#$(info MY_ASM_FILES $(MY_ASM_FILES)) -ASM_FILES=$(MY_ASM_FILES) - -MY_LDFLAGS := $(subst /cygdrive/c,c:,$(LDFLAGS)) -#$(info MY_LDFLAGS $(MY_LDFLAGS)) -LDFLAGS=$(MY_LDFLAGS) - -# Default name pattern for output files -# may be modified in %Application%.mk file -OUT_FILE_NAME ?= $(OUT_APP)/$(APP_NAME) - -OUT_OBJ := $(OUT_CFG)/obj -OUT_APP := $(OUT_CFG) - -.PHONY: all app build clean pre_build post_build - -all: clean app - -app: - @`mkdir -p ./$(OUT)` - @`mkdir -p ./$(OUT_TARGET)` - @`mkdir -p ./$(OUT_CFG)` - @`mkdir -p ./$(OUT_OBJ)` - $(MAKE) pre_build - $(MAKE) build -j8 - $(MAKE) post_build - -build: $(OUT_APP)/$(APP_NAME).hex - $(GCC_PATH)/bin/arm-none-eabi-objdump $(OUT_APP)/$(APP_NAME).hex -s > $(OUT_APP)/$(APP_NAME).lst - $(GCC_PATH)/bin/arm-none-eabi-objdump -h $(OUT_APP)/$(APP_NAME).elf - $(GCC_PATH)/bin/arm-none-eabi-size --format=SysV $(OUT_APP)/$(APP_NAME).elf - -$(OUT_APP)/$(APP_NAME).hex: $(OUT_APP)/$(APP_NAME).elf - $(GCC_PATH)/bin/arm-none-eabi-objcopy --change-addresses=$(HEADER_OFFSET) -O ihex $(OUT_APP)/$(APP_NAME).elf $(OUT_APP)/$(APP_NAME).hex - -$(OUT_APP)/$(APP_NAME).elf: $(addprefix $(OUT_OBJ)/, $(O_FILES)) - @echo "LD $@" -ifeq ($(MAKEINFO), 1) - @echo $(LD) $(O_FILES) $(CC_DEPEND) $(@:.o=.d) -o $@ $(LDFLAGS) -T $(LINKER_SCRIPT) -Wl,-Map,$(OUT_FILE_NAME).map -endif - @$(LD) $(addprefix $(OUT_OBJ)/, $(O_FILES)) $(CC_DEPEND) $(@:.o=.d) -o $@ $(LDFLAGS) -T $(LINKER_SCRIPT) -Wl,-Map,$(OUT_FILE_NAME).map - - -$(OUT_OBJ)/%.o: %.c - @echo "CC $<" -ifeq ($(MAKEINFO), 1) - @echo $(CC) $(CFLAGS) $(INCLUDE_DIRS) $(CC_DEPEND) $(@:.o=.d) -c $< -o $@ -endif - @$(CC) $(CFLAGS) $(INCLUDE_DIRS) $(CC_DEPEND) $(@:.o=.d) -c $< -o $@ -ifeq ($(MAKEINFO), 1) - @echo -endif - -$(OUT_OBJ)/%.o: %.S - @echo "AS $<" -ifeq ($(COMPILER), GCC_ARM) -ifeq ($(MAKEINFO), 1) - @echo @$(CC) $(CFLAGS) $(INCLUDE_DIRS) $(CC_DEPEND) $(@:.o=.d) -c $< -o $@ -endif - @$(CC) $(CFLAGS) $(INCLUDE_DIRS) $(CC_DEPEND) $(@:.o=.d) -c $< -o $@ -else - @echo $(AS) $< -o $@ $(AS_FLAGS) - @$(AS) $< -o $@ $(AS_FLAGS) -endif -ifeq ($(MAKEINFO), 1) - @echo -endif - -clean: - @echo "Cleanup out directory..." - rm -rf $(OUT_TARGET)/$(BUILDCFG) - -clean_boot: - @echo "Cleanup out BOOT directory of $(APP_NAME)..." - rm -rf $(OUT_TARGET)/$(BUILDCFG)/boot - -clean_upgrade: - @echo "Cleanup out UPGRADE directory of $(APP_NAME)..." - rm -rf $(OUT_TARGET)/$(BUILDCFG)/upgrade - -run_cppcheck: - @echo "Performing static code analysis with Cppcheck tool..." - ../../scripts/cpp_check.sh ../../scripts/cpp_check.dat - -gen_key_ecc256: - @echo Generate ECC256 keys: $(SIGN_KEY_FILE).pem and $(SIGN_KEY_FILE).pub - ../../scripts/imgtool.py keygen -k keys/$(SIGN_KEY_FILE).pem -t ecdsa-p256 - ../../scripts/imgtool.py getpub -k keys/$(SIGN_KEY_FILE).pem > keys/$(SIGN_KEY_FILE).pub - -ifeq ($(MAKEINFO) , 1) -$(info ASM_FILES: $(ASM_FILES)) -$(info C_FILES: $(C_FILES)) -$(info INCLUDE_DIRS: $(INCLUDE_DIRS)) -$(info DEFINES: $(DEFINES)) -$(info CC: $(CC)) -endif diff --git a/mcuboot/boot/cypress/README.md b/mcuboot/boot/cypress/README.md deleted file mode 100644 index 1d876056d..000000000 --- a/mcuboot/boot/cypress/README.md +++ /dev/null @@ -1,70 +0,0 @@ -### Port of MCUBoot library to be used with Cypress targets - -**Solution Description** - -Given solution demonstrates operation of MCUBoot on Cypress' PSoC6 device. - -There are four applications implemented: -* MCUBootApp - PSoC6 MCUBoot-based bootloading application; -* BlinkyApp - simple PSoC6 blinking LED application which is a target of BOOT/UPGRADE; - -The default flash map for MCUBootApp implemented is next: - -* [0x10000000, 0x10018000] - MCUBootApp (bootloader) area; -* [0x10018000, 0x10028000] - primary slot for BlinkyApp; -* [0x10028000, 0x10038000] - secondary slot for BlinkyApp; -* [0x10038000, 0x10039000] - scratch area; - -The flash map is defined through sysflash.h and cy_flash_map.c. - -MCUBootApp checks image integrity with SHA256, image authenticity with EC256 digital signature verification and uses completely SW implementation of cryptographic functions based on mbedTLS Library. - -**Downloading Solution's Assets** - -There is a set assets required: - -* MCUBooot Library (root repository) -* PSoC6 Peripheral Drivers Library (PDL) -* mbedTLS Cryptographic Library - -Those are represented as submodules. - -To retrieve source code with subsequent submodules pull: - - git clone --recursive https://github.com/JuulLabs-OSS/mcuboot.git - -Submodules can also be updated and initialized separately: - - cd mcuboot - git submodule update --init --recursive - - - -**Building Solution** - -Root directory for build is **boot/cypress.** - -This folder contains make files infrastructure for building both MCUBoot Bootloader and sample BlinkyApp application used for Bootloader demo functionality. - -Instructions on how to build and upload MCUBootApp bootloader application and sample user applocation are located in `Readme.md` files in corresponding folders. - -**Currently supported platforms:** - -* PSOC_062_2M - for MCUBoot, BlinkyApp; - -**Build environment troubleshooting:** - -Following CLI / IDE are supported for project build: - -* Cygwin on Windows systems -* unix style shells on *nix systems -* Eclipse / ModusToolbox ("makefile project from existing source") - -*Make* - make sure it is added to system's `PATH` variable and correct path is first in the list; - -*Python/Python3* - make sure you have correct path referenced in `PATH`; - -*Msys2* - to use systems PATH navigate to msys2 folder, open `msys2_shell.cmd`, uncomment set `MSYS2_PATH_TYPE=inherit`, restart MSYS2 shell. - -This will inherit system's PATH so should find `python3.7` installed in regular way as well as imgtool and its dependencies. - diff --git a/mcuboot/boot/cypress/cy_flash_pal/cy_flash_map.c b/mcuboot/boot/cypress/cy_flash_pal/cy_flash_map.c deleted file mode 100644 index 2b51795ea..000000000 --- a/mcuboot/boot/cypress/cy_flash_pal/cy_flash_map.c +++ /dev/null @@ -1,486 +0,0 @@ -/* - * Copyright (c) 2018 Nordic Semiconductor ASA - * 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. - */ - /*******************************************************************************/ - -#ifdef MCUBOOT_HAVE_ASSERT_H -#include "mcuboot_config/mcuboot_assert.h" -#else -#include -#endif - -#include -#include -#include - -#include "flash_map_backend/flash_map_backend.h" -#include -#include "cy_flash_psoc6.h" - -#include "bootutil/bootutil_log.h" - -#include "cy_pdl.h" - -/* - * For now, we only support one flash device. - * - * Pick a random device ID for it that's unlikely to collide with - * anything "real". - */ -#define FLASH_DEVICE_ID 111 -#define FLASH_MAP_ENTRY_MAGIC 0xd00dbeef - -#define FLASH_AREA_IMAGE_SECTOR_SIZE FLASH_AREA_IMAGE_SCRATCH_SIZE - -#ifndef CY_BOOTLOADER_START_ADDRESS -#define CY_BOOTLOADER_START_ADDRESS (0x10000000) -#endif - -#ifndef CY_BOOT_INTERNAL_FLASH_ERASE_VALUE -/* This is the value of internal flash bytes after an erase */ -#define CY_BOOT_INTERNAL_FLASH_ERASE_VALUE (0x00) -#endif - -#ifndef CY_BOOT_EXTERNAL_FLASH_ERASE_VALUE -/* This is the value of external flash bytes after an erase */ -#define CY_BOOT_EXTERNAL_FLASH_ERASE_VALUE (0xff) -#endif - -#ifdef CY_FLASH_MAP_EXT_DESC -/* Nothing to be there when external FlashMap Descriptors are used */ -#else -static struct flash_area bootloader = -{ - .fa_id = FLASH_AREA_BOOTLOADER, - .fa_device_id = FLASH_DEVICE_INTERNAL_FLASH, - .fa_off = CY_BOOTLOADER_START_ADDRESS, - .fa_size = CY_BOOT_BOOTLOADER_SIZE -}; - -static struct flash_area primary_1 = -{ - .fa_id = FLASH_AREA_IMAGE_PRIMARY(0), - .fa_device_id = FLASH_DEVICE_INTERNAL_FLASH, - .fa_off = CY_FLASH_BASE + CY_BOOT_BOOTLOADER_SIZE, - .fa_size = CY_BOOT_PRIMARY_1_SIZE -}; - -static struct flash_area secondary_1 = -{ - .fa_id = FLASH_AREA_IMAGE_SECONDARY(0), - .fa_device_id = FLASH_DEVICE_INTERNAL_FLASH, - .fa_off = CY_FLASH_BASE +\ - CY_BOOT_BOOTLOADER_SIZE +\ - CY_BOOT_PRIMARY_1_SIZE, - .fa_size = CY_BOOT_SECONDARY_1_SIZE -}; - -#if (MCUBOOT_IMAGE_NUMBER == 2) /* if dual-image */ -static struct flash_area primary_2 = -{ - .fa_id = FLASH_AREA_IMAGE_PRIMARY(1), - .fa_device_id = FLASH_DEVICE_INTERNAL_FLASH, - .fa_off = CY_FLASH_BASE +\ - CY_BOOT_BOOTLOADER_SIZE +\ - CY_BOOT_PRIMARY_1_SIZE +\ - CY_BOOT_SECONDARY_1_SIZE, - .fa_size = CY_BOOT_PRIMARY_2_SIZE -}; - -static struct flash_area secondary_2 = -{ - .fa_id = FLASH_AREA_IMAGE_SECONDARY(1), - /* TODO: it is for external flash memory - .fa_device_id = FLASH_DEVICE_EXTERNAL_FLASH(CY_BOOT_EXTERNAL_DEVICE_INDEX), */ - .fa_device_id = FLASH_DEVICE_INTERNAL_FLASH, - .fa_off = CY_FLASH_BASE +\ - CY_BOOT_BOOTLOADER_SIZE +\ - CY_BOOT_PRIMARY_1_SIZE +\ - CY_BOOT_SECONDARY_1_SIZE +\ - CY_BOOT_PRIMARY_2_SIZE, - .fa_size = CY_BOOT_SECONDARY_2_SIZE -}; -#endif -static struct flash_area scratch = -{ - .fa_id = FLASH_AREA_IMAGE_SCRATCH, - .fa_device_id = FLASH_DEVICE_INTERNAL_FLASH, -#if (MCUBOOT_IMAGE_NUMBER == 1) /* if single-image */ - .fa_off = CY_FLASH_BASE +\ - CY_BOOT_BOOTLOADER_SIZE +\ - CY_BOOT_PRIMARY_1_SIZE +\ - CY_BOOT_SECONDARY_1_SIZE, -#elif (MCUBOOT_IMAGE_NUMBER == 2) /* if dual-image */ - .fa_off = CY_FLASH_BASE +\ - CY_BOOT_BOOTLOADER_SIZE +\ - CY_BOOT_PRIMARY_1_SIZE +\ - CY_BOOT_SECONDARY_1_SIZE +\ - CY_BOOT_PRIMARY_2_SIZE +\ - CY_BOOT_SECONDARY_2_SIZE, -#endif - .fa_size = CY_BOOT_SCRATCH_SIZE -}; -#endif - -#ifdef CY_FLASH_MAP_EXT_DESC -/* Use external Flash Map Descriptors */ -extern struct flash_area *boot_area_descs[]; -#else -struct flash_area *boot_area_descs[] = -{ - &bootloader, - &primary_1, - &secondary_1, -#if (MCUBOOT_IMAGE_NUMBER == 2) /* if dual-image */ - &primary_2, - &secondary_2, -#endif - &scratch, - NULL -}; -#endif - -/* Returns device flash start based on supported fa_id */ -int flash_device_base(uint8_t fd_id, uintptr_t *ret) -{ - if (fd_id != FLASH_DEVICE_INTERNAL_FLASH) { - BOOT_LOG_ERR("invalid flash ID %d; expected %d", - fd_id, FLASH_DEVICE_INTERNAL_FLASH); - return -1; - } - *ret = CY_FLASH_BASE; - return 0; -} - -/* Opens the area for use. id is one of the `fa_id`s */ -int flash_area_open(uint8_t id, const struct flash_area **fa) -{ - int ret = -1; - uint32_t i = 0; - - while(NULL != boot_area_descs[i]) - { - if(id == boot_area_descs[i]->fa_id) - { - *fa = boot_area_descs[i]; - ret = 0; - break; - } - i++; - } - - - return ret; -} - -void flash_area_close(const struct flash_area *fa) -{ - (void)fa;/* Nothing to do there */ -} - -/* Reads `len` bytes of flash memory at `off` to the buffer at `dst` */ -int flash_area_read(const struct flash_area *fa, uint32_t off, void *dst, - uint32_t len) -{ - int rc = 0; - size_t addr; - - if (fa->fa_device_id == FLASH_DEVICE_INTERNAL_FLASH) - { - assert(off < fa->fa_off); - assert(off + len < fa->fa_off); - - addr = fa->fa_off + off; - - rc = psoc6_flash_read(addr, dst, len); - } -#ifdef CY_USE_EXTERNAL_FLASH - else if ((fa->fa_device_id & FLASH_DEVICE_EXTERNAL_FLAG) == FLASH_DEVICE_EXTERNAL_FLAG) - { - // TODO: implement/split into psoc6_smif_read() - } -#endif - else - { - /* incorrect/non-existing flash device id */ - rc = -1; - } - - if (rc != 0) { - BOOT_LOG_ERR("Flash area read error, rc = %d", (int)rc); - } - - return rc; -} - -/* Writes `len` bytes of flash memory at `off` from the buffer at `src` */ -int flash_area_write(const struct flash_area *fa, uint32_t off, - const void *src, uint32_t len) -{ - int rc = 0; - size_t addr; - - if (fa->fa_device_id == FLASH_DEVICE_INTERNAL_FLASH) - { - assert(off < fa->fa_off); - assert(off + len < fa->fa_off); - - addr = fa->fa_off + off; - rc = psoc6_flash_write(addr, src, len); - } -#ifdef CY_USE_EXTERNAL_FLASH - else if ((fa->fa_device_id & FLASH_DEVICE_EXTERNAL_FLAG) == FLASH_DEVICE_EXTERNAL_FLAG) - { - // TODO: implement/split into psoc6_smif_write() - } -#endif - else - { - /* incorrect/non-existing flash device id */ - rc = -1; - } - - return rc; -} - -/* Erases `len` bytes of flash memory at `off` */ -int flash_area_erase(const struct flash_area *fa, uint32_t off, uint32_t len) -{ - int rc = 0; - size_t addr; - - if (fa->fa_device_id == FLASH_DEVICE_INTERNAL_FLASH) - { - assert(off < fa->fa_off); - assert(off + len < fa->fa_off); - - addr = fa->fa_off + off; - rc = psoc6_flash_erase(addr, len); - } -#ifdef CY_USE_EXTERNAL_FLASH - else if ((fa->fa_device_id & FLASH_DEVICE_EXTERNAL_FLAG) == FLASH_DEVICE_EXTERNAL_FLAG) - { - // TODO: implement/split into psoc6_smif_erase() - } -#endif - else - { - /* incorrect/non-existing flash device id */ - rc = -1; - } - return rc; -} - -/* Returns this `flash_area`s alignment */ -size_t flash_area_align(const struct flash_area *fa) -{ - uint8_t ret = -1; - if (fa->fa_device_id == FLASH_DEVICE_INTERNAL_FLASH) - { - ret = CY_FLASH_ALIGN; - } -#ifdef CY_USE_EXTERNAL_FLASH - else if ((fa->fa_device_id & FLASH_DEVICE_EXTERNAL_FLAG) == FLASH_DEVICE_EXTERNAL_FLAG) - { - // TODO: implement for SMIF WR/ERASE size - } -#endif - else - { - /* incorrect/non-existing flash device id */ - ret = -1; - } - return ret; -} - -#ifdef MCUBOOT_USE_FLASH_AREA_GET_SECTORS -/* Initializes an array of flash_area elements for the slot's sectors */ -int flash_area_to_sectors(int idx, int *cnt, struct flash_area *fa) -{ - int rc = 0; - - if (fa->fa_device_id == FLASH_DEVICE_INTERNAL_FLASH) - { - // TODO: - (void)idx; - (void)cnt; - rc = 0; - } -#ifdef CY_USE_EXTERNAL_FLASH - else if ((fa->fa_device_id & FLASH_DEVICE_EXTERNAL_FLAG) == FLASH_DEVICE_EXTERNAL_FLAG) - { - // TODO: implement/split into psoc6_smif_erase() - } -#endif - else - { - /* incorrect/non-existing flash device id */ - rc = -1; - } - - return rc; -} -#endif - -/* - * This depends on the mappings defined in sysflash.h. - * MCUBoot uses continuous numbering for the primary slot, the secondary slot, - * and the scratch while zephyr might number it differently. - */ -int flash_area_id_from_multi_image_slot(int image_index, int slot) -{ - switch (slot) { - case 0: return FLASH_AREA_IMAGE_PRIMARY(image_index); - case 1: return FLASH_AREA_IMAGE_SECONDARY(image_index); - case 2: return FLASH_AREA_IMAGE_SCRATCH; - } - - return -1; /* flash_area_open will fail on that */ -} - -int flash_area_id_from_image_slot(int slot) -{ - return flash_area_id_from_multi_image_slot(0, slot); -} - -int flash_area_id_to_multi_image_slot(int image_index, int area_id) -{ - if (area_id == FLASH_AREA_IMAGE_PRIMARY(image_index)) { - return 0; - } - if (area_id == FLASH_AREA_IMAGE_SECONDARY(image_index)) { - return 1; - } - - return -1; -} - -int flash_area_id_to_image_slot(int area_id) -{ - return flash_area_id_to_multi_image_slot(0, area_id); -} - -uint8_t flash_area_erased_val(const struct flash_area *fap) -{ - int ret = 0; - - if (fap->fa_device_id == FLASH_DEVICE_INTERNAL_FLASH) - { - ret = CY_BOOT_INTERNAL_FLASH_ERASE_VALUE ; - } -#ifdef CY_USE_EXTERNAL_FLASH - else if ((fap->fa_device_id & FLASH_DEVICE_EXTERNAL_FLAG) == FLASH_DEVICE_EXTERNAL_FLAG) - { - ret = CY_BOOT_EXTERNAL_FLASH_ERASE_VALUE ; - } -#endif - else - { - assert(false) ; - } - - return ret ; -} - -int flash_area_read_is_empty(const struct flash_area *fa, uint32_t off, - void *dst, uint32_t len) -{ - uint8_t i = 0; - uint8_t *mem_dest; - int rc; - - mem_dest = (uint8_t *)dst; - rc = flash_area_read(fa, off, dst, len); - if (rc) { - return -1; - } - - for (i = 0; i < len; i++) { - if (mem_dest[i] != flash_area_erased_val(fa)) { - return 0; - } - } - return 1; -} - -int flash_area_get_sectors(int idx, uint32_t *cnt, struct flash_sector *ret) -{ - int rc = 0; - uint32_t i = 0; - struct flash_area *fa; - size_t sector_size = 0; - size_t sectors_n = 0; - uint32_t addr = 0; - - while(NULL != boot_area_descs[i]) - { - if(idx == boot_area_descs[i]->fa_id) - { - fa = boot_area_descs[i]; - break; - } - i++; - } - - - if(NULL != boot_area_descs[i]) - { - if(fa->fa_device_id == FLASH_DEVICE_INTERNAL_FLASH) - { - sector_size = CY_FLASH_SIZEOF_ROW; - } -#ifdef CY_USE_EXTERNAL_FLASH - else if((fa->fa_device_id & FLASH_DEVICE_EXTERNAL_FLAG) == FLASH_DEVICE_EXTERNAL_FLAG) - { - // TODO: implement for SMIF - } -#endif - else - { - rc = -1; - } - - if(0 == rc) - { - sectors_n = (fa->fa_size + (sector_size - 1)) / sector_size; - assert(sectors_n <= *cnt); - - addr = fa->fa_off; - for(i = 0; i < sectors_n; i++) - { - ret[i].fs_size = sector_size ; - ret[i].fs_off = addr ; - addr += sector_size ; - } - - *cnt = sectors_n; - } - } - else - { - rc = -1; - } - - return rc; -} diff --git a/mcuboot/boot/cypress/cy_flash_pal/cy_flash_psoc6.c b/mcuboot/boot/cypress/cy_flash_pal/cy_flash_psoc6.c deleted file mode 100644 index 35dc30ff4..000000000 --- a/mcuboot/boot/cypress/cy_flash_pal/cy_flash_psoc6.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (c) 2020 Cypress Semiconductors - * - * 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. - */ - /*******************************************************************************/ - -#include "string.h" -#include "stdlib.h" -#include "stdbool.h" - -#ifdef MCUBOOT_HAVE_ASSERT_H -#include "mcuboot_config/mcuboot_assert.h" -#else -#include -#endif - -#include "cy_device_headers.h" -#include "cy_flash_psoc6.h" - -#include "cy_flash.h" -#include "cy_syspm.h" - -#define PSOC6_WR_SUCCESS 0 -#define PSOC6_WR_ERROR_INVALID_PARAMETER 1 -#define PSOC6_WR_ERROR_FLASH_WRITE 2 - -#define PSOC6_FLASH_ERASE_BLOCK_SIZE CY_FLASH_SIZEOF_ROW /* PSoC6 Flash erases by Row */ - -int psoc6_flash_read(off_t addr, void *data, size_t len) -{ - /* flash read by simple memory copying */ - memcpy((void *)data, (const void*)addr, (size_t)len); - - return 0; -} - -int psoc6_flash_write(off_t addr, - const void *data, size_t len) -{ - int rc; - - rc = psoc6_flash_write_hal((uint8_t *)data, addr, len); - - return rc; -} - -int psoc6_flash_erase(off_t addr, size_t size) -{ - int rc = 0; - - uint32_t addrStart, addrEnd, address; - uint32_t remStart, remEnd; - uint32_t rowIdxStart, rowIdxEnd, rowNum; - uint8_t buff[CY_FLASH_SIZEOF_ROW]; - - addrStart = addr; - addrEnd = addrStart + size; - - /* find if area bounds are aligned to rows */ - remStart = addrStart%CY_FLASH_SIZEOF_ROW; - remEnd = addrEnd%CY_FLASH_SIZEOF_ROW; - - /* find which row numbers are affected for full Erase */ - rowIdxStart = addrStart/CY_FLASH_SIZEOF_ROW; - rowIdxEnd = addrEnd/CY_FLASH_SIZEOF_ROW; - - if(remStart != 0) - {/* first row is fragmented, move to next */ - rowIdxStart++; - } - - /* total number of rows for full erase */ - rowNum = rowIdxEnd - rowIdxStart; - address = rowIdxStart*CY_FLASH_SIZEOF_ROW; - - while(rowNum>0) - { - rc = Cy_Flash_EraseRow(address); - assert(rc == 0); - address += CY_FLASH_SIZEOF_ROW; - rowNum--; - } - - /* if Start of erase area is unaligned */ - if(remStart != 0) - { - /* first row is fragmented, shift left by one*/ - rowIdxStart--; - - /* find start address of fragmented row */ - address = rowIdxStart*CY_FLASH_SIZEOF_ROW; - - /* store fragmented row contents first */ - memcpy((void *)buff, (const void*)address, remStart); - - /* erase fragmented row */ - rc = Cy_Flash_EraseRow(address); - assert(rc == 0); - - /* write stored back */ - rc = psoc6_flash_write_hal(buff, address, remStart); - assert(rc == 0); - } - /* if End of erase area is unaligned */ - if(remEnd != 0) - { - /* find start address of fragmented row */ - address = rowIdxEnd*CY_FLASH_SIZEOF_ROW; - - /* store fragmented row contents first */ - memcpy((void *)buff, (const void*)addrEnd, CY_FLASH_SIZEOF_ROW-remEnd); - - /* erase fragmented row */ - rc = Cy_Flash_EraseRow(address); - assert(rc == 0); - - /* write stored back */ - rc = psoc6_flash_write_hal(buff, addrEnd, CY_FLASH_SIZEOF_ROW-remEnd); - assert(rc == 0); - } - return rc; -} - -/******************************************************************************* -* Function Name: psoc6_flash_write_hal -****************************************************************************//** -* -* This function writes the data to the PSOC6's Flash. It will check the -* appropriate alignment of a start address and also perform an address range -* check based on the length before performing the write operation. -* This function performs memory compare and writes only row where there are new -* data to write. -* -* \param addr: Pointer to the buffer containing the data to be stored. -* \param data: Pointer to the array or variable in the flash. -* \param len: The length of the data in bytes. -* -* \return -* PSOC6_WR_SUCCESS A successful write -* PSOC6_WR_ERROR_INVALID_PARAMETER At least one of the input parameters is invalid -* PSOC6_WR__ERROR_FLASH_WRITE Error in flash Write -* -*******************************************************************************/ -int psoc6_flash_write_hal(uint8_t data[], - uint32_t address, - uint32_t len) -{ - int retCode; - cy_en_flashdrv_status_t rc = CY_FLASH_DRV_SUCCESS; - - uint32_t writeBuffer[CY_FLASH_SIZEOF_ROW / sizeof(uint32_t)]; - uint32_t rowId; - uint32_t dstIndex; - uint32_t srcIndex = 0u; - uint32_t eeOffset; - uint32_t byteOffset; - uint32_t rowsNotEqual; - uint8_t *writeBufferPointer; - - eeOffset = (uint32_t)address; - writeBufferPointer = (uint8_t*)writeBuffer; - - bool cond1; - - /* Make sure, that varFlash[] points to Flash */ - cond1 = ((eeOffset >= CY_FLASH_BASE) && - ((eeOffset + len) <= (CY_FLASH_BASE + CY_FLASH_SIZE))); - - if(cond1) - { - eeOffset -= CY_FLASH_BASE; - rowId = eeOffset / CY_FLASH_SIZEOF_ROW; - byteOffset = CY_FLASH_SIZEOF_ROW * rowId; - - while((srcIndex < len) && (rc == CY_FLASH_DRV_SUCCESS)) - { - rowsNotEqual = 0u; - /* Copy data to the write buffer either from the source buffer or from the flash */ - for(dstIndex = 0u; dstIndex < CY_FLASH_SIZEOF_ROW; dstIndex++) - { - if((byteOffset >= eeOffset) && (srcIndex < len)) - { - writeBufferPointer[dstIndex] = data[srcIndex]; - /* Detect that row programming is required */ - if((rowsNotEqual == 0u) && (CY_GET_REG8(CY_FLASH_BASE + byteOffset) != data[srcIndex])) - { - rowsNotEqual = 1u; - } - srcIndex++; - } - else - { - writeBufferPointer[dstIndex] = CY_GET_REG8(CY_FLASH_BASE + byteOffset); - } - byteOffset++; - } - - if(rowsNotEqual != 0u) - { - /* Write flash row */ - rc = Cy_Flash_WriteRow((rowId * CY_FLASH_SIZEOF_ROW) + CY_FLASH_BASE, writeBuffer); - } - - /* Go to the next row */ - rowId++; - } - } - else - { - rc = CY_FLASH_DRV_INVALID_INPUT_PARAMETERS; - } - - /* Return error code */ - switch(rc) - { - case CY_FLASH_DRV_SUCCESS: - retCode = PSOC6_WR_SUCCESS; - break; - - case CY_FLASH_DRV_INVALID_INPUT_PARAMETERS: - case CY_FLASH_DRV_INVALID_FLASH_ADDR: - retCode = PSOC6_WR_ERROR_INVALID_PARAMETER; - break; - - default: - retCode = PSOC6_WR_ERROR_FLASH_WRITE; - break; - } - return(retCode); -} diff --git a/mcuboot/boot/cypress/cy_flash_pal/include/cy_flash_psoc6.h b/mcuboot/boot/cypress/cy_flash_pal/include/cy_flash_psoc6.h deleted file mode 100644 index 09cea984d..000000000 --- a/mcuboot/boot/cypress/cy_flash_pal/include/cy_flash_psoc6.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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 CY_FLASH_PSOC6_H_ -#define CY_FLASH_PSOC6_H_ - -#include "stddef.h" -#include "stdbool.h" - -#ifndef off_t -typedef long int off_t; -#endif - -int psoc6_flash_read(off_t addr, void *data, size_t len); -int psoc6_flash_write(off_t addr, const void *data, size_t len); -int psoc6_flash_erase(off_t addr, size_t size); - -int psoc6_flash_write_hal(uint8_t data[], - uint32_t address, - uint32_t len); -#endif /* CY_FLASH_PSOC6_H_ */ diff --git a/mcuboot/boot/cypress/cy_flash_pal/include/flash_map_backend/flash_map_backend.h b/mcuboot/boot/cypress/cy_flash_pal/include/flash_map_backend/flash_map_backend.h deleted file mode 100644 index 535723226..000000000 --- a/mcuboot/boot/cypress/cy_flash_pal/include/flash_map_backend/flash_map_backend.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * 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 __FLASH_MAP_BACKEND_H__ -#define __FLASH_MAP_BACKEND_H__ - -#include -#include "cy_flash.h" - -/** - * - * Provides abstraction of flash regions for type of use. - * I.e. dude where's my image? - * - * System will contain a map which contains flash areas. Every - * region will contain flash identifier, offset within flash and length. - * - * 1. This system map could be in a file within filesystem (Initializer - * must know/figure out where the filesystem is at). - * 2. Map could be at fixed location for project (compiled to code) - * 3. Map could be at specific place in flash (put in place at mfg time). - * - * Note that the map you use must be valid for BSP it's for, - * match the linker scripts when platform executes from flash, - * and match the target offset specified in download script. - */ -#include - -/** - * @brief Structure describing an area on a flash device. - * - * Multiple flash devices may be available in the system, each of - * which may have its own areas. For this reason, flash areas track - * which flash device they are part of. - */ -struct flash_area { - /** - * This flash area's ID; unique in the system. - */ - uint8_t fa_id; - - /** - * ID of the flash device this area is a part of. - */ - uint8_t fa_device_id; - - uint16_t pad16; - - /** - * This area's offset, relative to the beginning of its flash - * device's storage. - */ - uint32_t fa_off; - - /** - * This area's size, in bytes. - */ - uint32_t fa_size; -}; - -/** - * @brief Structure describing a sector within a flash area. - * - * Each sector has an offset relative to the start of its flash area - * (NOT relative to the start of its flash device), and a size. A - * flash area may contain sectors with different sizes. - */ -struct flash_sector { - /** - * Offset of this sector, from the start of its flash area (not device). - */ - uint32_t fs_off; - - /** - * Size of this sector, in bytes. - */ - uint32_t fs_size; -}; - -struct flash_map_entry { - uint32_t magic; - struct flash_area area; - unsigned int ref_count; -}; - -/* - * Retrieve a memory-mapped flash device's base address. - * On success, the address will be stored in the value pointed to by - * ret. - * Returns 0 on success, or an error code on failure. - */ -int flash_device_base(uint8_t fd_id, uintptr_t *ret); - -/*< Opens the area for use. id is one of the `fa_id`s */ -int flash_area_open(uint8_t id, const struct flash_area **); -void flash_area_close(const struct flash_area *); -/*< Reads `len` bytes of flash memory at `off` to the buffer at `dst` */ -int flash_area_read(const struct flash_area *, uint32_t off, void *dst, - uint32_t len); -/*< Writes `len` bytes of flash memory at `off` from the buffer at `src` */ -int flash_area_write(const struct flash_area *, uint32_t off, - const void *src, uint32_t len); -/*< Erases `len` bytes of flash memory at `off` */ -int flash_area_erase(const struct flash_area *, uint32_t off, uint32_t len); -/*< Returns this `flash_area`s alignment */ -size_t flash_area_align(const struct flash_area *); -/*< Initializes an array of flash_area elements for the slot's sectors */ -int flash_area_to_sectors(int idx, int *cnt, struct flash_area *ret); -/*< Returns the `fa_id` for slot, where slot is 0 (primary) or 1 (secondary) */ -int flash_area_id_from_image_slot(int slot); -/*< Returns the slot, for the `fa_id` supplied */ -int flash_area_id_to_image_slot(int area_id); - -int flash_area_id_from_multi_image_slot(int image_index, int slot); -int flash_area_id_to_multi_image_slot(int image_index, int area_id); - -/* - * Returns the value expected to be read when accesing any erased - * flash byte. - */ -uint8_t flash_area_erased_val(const struct flash_area *fap); - -/* - * Reads len bytes from off, and checks if the read data is erased. - * - * Returns 1 if erased, 0 if non-erased, and -1 on failure. - */ -int flash_area_read_is_empty(const struct flash_area *fa, uint32_t off, - void *dst, uint32_t len); - -#endif /* __FLASH_MAP_BACKEND_H__ */ diff --git a/mcuboot/boot/cypress/keys/cypress-test-ec-p256.pem b/mcuboot/boot/cypress/keys/cypress-test-ec-p256.pem deleted file mode 100644 index e1f8e1562..000000000 --- a/mcuboot/boot/cypress/keys/cypress-test-ec-p256.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQguR/Jq6LjMgp8DVtE -7pKguttNo6L239aEcijzGOr5C72hRANCAAT/NroNASdTGo6bS8r0+C+30YcG0WLV -chWs+99DnOr3SZoalv6/pCNIVrwFv3KkJsmsZUbNNmxeMPr+IlfGGPg0 ------END PRIVATE KEY----- diff --git a/mcuboot/boot/cypress/keys/cypress-test-ec-p256.pub b/mcuboot/boot/cypress/keys/cypress-test-ec-p256.pub deleted file mode 100644 index 8174b5d1a..000000000 --- a/mcuboot/boot/cypress/keys/cypress-test-ec-p256.pub +++ /dev/null @@ -1,16 +0,0 @@ -/* Autogenerated by imgtool.py, do not edit. */ -const unsigned char ecdsa_pub_key[] = { - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, - 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04, 0xff, 0x36, 0xba, 0x0d, 0x01, - 0x27, 0x53, 0x1a, 0x8e, 0x9b, 0x4b, 0xca, 0xf4, - 0xf8, 0x2f, 0xb7, 0xd1, 0x87, 0x06, 0xd1, 0x62, - 0xd5, 0x72, 0x15, 0xac, 0xfb, 0xdf, 0x43, 0x9c, - 0xea, 0xf7, 0x49, 0x9a, 0x1a, 0x96, 0xfe, 0xbf, - 0xa4, 0x23, 0x48, 0x56, 0xbc, 0x05, 0xbf, 0x72, - 0xa4, 0x26, 0xc9, 0xac, 0x65, 0x46, 0xcd, 0x36, - 0x6c, 0x5e, 0x30, 0xfa, 0xfe, 0x22, 0x57, 0xc6, - 0x18, 0xf8, 0x34, -}; -const unsigned int ecdsa_pub_key_len = 91; diff --git a/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM0P/GCC_ARM/cy8c6xxa_cm0plus.ld b/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM0P/GCC_ARM/cy8c6xxa_cm0plus.ld deleted file mode 100644 index 1f3a5a938..000000000 --- a/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM0P/GCC_ARM/cy8c6xxa_cm0plus.ld +++ /dev/null @@ -1,418 +0,0 @@ -/***************************************************************************//** -* \file cy8c6xxa_cm0plus.ld -* \version 2.70 -* -* 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) - -/* The size of the stack section at the end of CM0+ SRAM */ -STACK_SIZE = 0x1000; - -/* 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 CM0+ 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 the CM4 core in 'xx_cm4_dual.ld', - * where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.ld'. - */ - ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x2000 - flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x2000 - - /* 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 -{ - .cy_app_header : - { - KEEP(*(.cy_app_header)) - } > flash - - /* Cortex-M0+ application flash area */ - .text : - { - . = ALIGN(4); - __Vectors = . ; - KEEP(*(.vectors)) - . = ALIGN(4); - __Vectors_End = .; - __Vectors_Size = __Vectors_End - __Vectors; - __end__ = .; - - . = ALIGN(4); - *(.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_cm0plus.S */ - .copy.table : - { - . = ALIGN(4); - __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_cm0plus.S */ - .zero.table : - { - . = ALIGN(4); - __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(4); - /* preinit data */ - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP(*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - - . = ALIGN(4); - /* init data */ - PROVIDE_HIDDEN (__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE_HIDDEN (__init_array_end = .); - - . = ALIGN(4); - /* finit data */ - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP(*(SORT(.fini_array.*))) - KEEP(*(.fini_array)) - PROVIDE_HIDDEN (__fini_array_end = .); - - KEEP(*(.jcr*)) - . = ALIGN(4); - - KEEP(*(.cy_ramfunc*)) - . = ALIGN(4); - - __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(4); - __bss_start__ = .; - *(.bss*) - *(COMMON) - . = ALIGN(4); - __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") - - - /* Emulated EEPROM Flash area */ - .cy_em_eeprom : - { - KEEP(*(.cy_em_eeprom)) - } > em_eeprom - - - /* Supervisory Flash: User data */ - .cy_sflash_user_data : - { - KEEP(*(.cy_sflash_user_data)) - } > sflash_user_data - - - /* Supervisory Flash: Normal Access Restrictions (NAR) */ - .cy_sflash_nar : - { - KEEP(*(.cy_sflash_nar)) - } > sflash_nar - - - /* Supervisory Flash: Public Key */ - .cy_sflash_public_key : - { - KEEP(*(.cy_sflash_public_key)) - } > sflash_public_key - - - /* Supervisory Flash: Table of Content # 2 */ - .cy_toc_part2 : - { - KEEP(*(.cy_toc_part2)) - } > sflash_toc_2 - - - /* 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/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM0P/GCC_ARM/startup_psoc6_02_cm0plus.S b/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM0P/GCC_ARM/startup_psoc6_02_cm0plus.S deleted file mode 100644 index 2641f6238..000000000 --- a/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM0P/GCC_ARM/startup_psoc6_02_cm0plus.S +++ /dev/null @@ -1,372 +0,0 @@ -/**************************************************************************//** - * @file startup_psoc6_02_cm0plus.S - * @brief CMSIS Core Device Startup File for - * ARMCM0plus Device Series - * @version V5.00 - * @date 02. March 2016 - ******************************************************************************/ -/* - * Copyright (c) 2009-2016 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 - * - * 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. - */ - - /* Address of the NMI handler */ - #define CY_NMI_HANLDER_ADDR 0x0000000D - - /* The CPU VTOR register */ - #define CY_CPU_VTOR_ADDR 0xE000ED08 - - /* Copy flash vectors and data section to RAM */ - #define __STARTUP_COPY_MULTIPLE - - /* Clear single BSS section */ - #define __STARTUP_CLEAR_BSS - - .syntax unified - .arch armv6-m - - .section .stack - .align 3 -#ifdef __STACK_SIZE - .equ Stack_Size, __STACK_SIZE -#else - .equ Stack_Size, 0x00001000 -#endif - .globl __StackTop - .globl __StackLimit -__StackLimit: - .space Stack_Size - .size __StackLimit, . - __StackLimit -__StackTop: - .size __StackTop, . - __StackTop - - .section .heap - .align 3 -#ifdef __HEAP_SIZE - .equ Heap_Size, __HEAP_SIZE -#else - .equ Heap_Size, 0x00000400 -#endif - .globl __HeapBase - .globl __HeapLimit -__HeapBase: - .if Heap_Size - .space Heap_Size - .endif - .size __HeapBase, . - __HeapBase -__HeapLimit: - .size __HeapLimit, . - __HeapLimit - - .section .vectors - .align 2 - .globl __Vectors -__Vectors: - .long __StackTop /* Top of Stack */ - .long Reset_Handler /* Reset Handler */ - .long CY_NMI_HANLDER_ADDR /* NMI Handler */ - .long HardFault_Handler /* Hard Fault Handler */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long SVC_Handler /* SVCall Handler */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long PendSV_Handler /* PendSV Handler */ - .long SysTick_Handler /* SysTick Handler */ - - /* External interrupts Description */ - .long NvicMux0_IRQHandler /* CPU User Interrupt #0 */ - .long NvicMux1_IRQHandler /* CPU User Interrupt #1 */ - .long NvicMux2_IRQHandler /* CPU User Interrupt #2 */ - .long NvicMux3_IRQHandler /* CPU User Interrupt #3 */ - .long NvicMux4_IRQHandler /* CPU User Interrupt #4 */ - .long NvicMux5_IRQHandler /* CPU User Interrupt #5 */ - .long NvicMux6_IRQHandler /* CPU User Interrupt #6 */ - .long NvicMux7_IRQHandler /* CPU User Interrupt #7 */ - .long Internal0_IRQHandler /* Internal SW Interrupt #0 */ - .long Internal1_IRQHandler /* Internal SW Interrupt #1 */ - .long Internal2_IRQHandler /* Internal SW Interrupt #2 */ - .long Internal3_IRQHandler /* Internal SW Interrupt #3 */ - .long Internal4_IRQHandler /* Internal SW Interrupt #4 */ - .long Internal5_IRQHandler /* Internal SW Interrupt #5 */ - .long Internal6_IRQHandler /* Internal SW Interrupt #6 */ - .long Internal7_IRQHandler /* Internal SW Interrupt #7 */ - - .size __Vectors, . - __Vectors - .equ __VectorsSize, . - __Vectors - - .section .ram_vectors - .align 2 - .globl __ramVectors -__ramVectors: - .space __VectorsSize - .size __ramVectors, . - __ramVectors - - - .text - .thumb - .thumb_func - .align 2 - - /* - * Device startup customization - * - * Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) - * because this function is executed as the first instruction in the ResetHandler. - * The PDL is also not initialized to use the proper register offsets. - * The user of this function is responsible for initializing the PDL and resources before using them. - */ - .weak Cy_OnResetUser - .func Cy_OnResetUser, Cy_OnResetUser - .type Cy_OnResetUser, %function - -Cy_OnResetUser: - bx lr - .size Cy_OnResetUser, . - Cy_OnResetUser - .endfunc - - /* Reset handler */ - .weak Reset_Handler - .type Reset_Handler, %function - -Reset_Handler: - bl Cy_OnResetUser - cpsid i - -/* Firstly it copies data from read only memory to RAM. There are two schemes - * to copy. One can copy more than one sections. Another can only copy - * one section. The former scheme needs more instructions and read-only - * data to implement than the latter. - * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ - -#ifdef __STARTUP_COPY_MULTIPLE -/* Multiple sections scheme. - * - * Between symbol address __copy_table_start__ and __copy_table_end__, - * there are array of triplets, each of which specify: - * offset 0: LMA of start of a section to copy from - * offset 4: VMA of start of a section to copy to - * offset 8: size of the section to copy. Must be multiply of 4 - * - * All addresses must be aligned to 4 bytes boundary. - */ - ldr r4, =__copy_table_start__ - ldr r5, =__copy_table_end__ - -.L_loop0: - cmp r4, r5 - bge .L_loop0_done - ldr r1, [r4] - ldr r2, [r4, #4] - ldr r3, [r4, #8] - -.L_loop0_0: - subs r3, #4 - blt .L_loop0_0_done - ldr r0, [r1, r3] - str r0, [r2, r3] - b .L_loop0_0 - -.L_loop0_0_done: - adds r4, #12 - b .L_loop0 - -.L_loop0_done: -#else -/* Single section scheme. - * - * The ranges of copy from/to are specified by following symbols - * __etext: LMA of start of the section to copy from. Usually end of text - * __data_start__: VMA of start of the section to copy to - * __data_end__: VMA of end of the section to copy to - * - * All addresses must be aligned to 4 bytes boundary. - */ - ldr r1, =__etext - ldr r2, =__data_start__ - ldr r3, =__data_end__ - - subs r3, r2 - ble .L_loop1_done - -.L_loop1: - subs r3, #4 - ldr r0, [r1,r3] - str r0, [r2,r3] - bgt .L_loop1 - -.L_loop1_done: -#endif /*__STARTUP_COPY_MULTIPLE */ - -/* This part of work usually is done in C library startup code. Otherwise, - * define this macro to enable it in this startup. - * - * There are two schemes too. One can clear multiple BSS sections. Another - * can only clear one section. The former is more size expensive than the - * latter. - * - * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. - * Otherwise define macro __STARTUP_CLEAR_BSS to choose the later. - */ -#ifdef __STARTUP_CLEAR_BSS_MULTIPLE -/* Multiple sections scheme. - * - * Between symbol address __copy_table_start__ and __copy_table_end__, - * there are array of tuples specifying: - * offset 0: Start of a BSS section - * offset 4: Size of this BSS section. Must be multiply of 4 - */ - ldr r3, =__zero_table_start__ - ldr r4, =__zero_table_end__ - -.L_loop2: - cmp r3, r4 - bge .L_loop2_done - ldr r1, [r3] - ldr r2, [r3, #4] - movs r0, 0 - -.L_loop2_0: - subs r2, #4 - blt .L_loop2_0_done - str r0, [r1, r2] - b .L_loop2_0 -.L_loop2_0_done: - - adds r3, #8 - b .L_loop2 -.L_loop2_done: -#elif defined (__STARTUP_CLEAR_BSS) -/* Single BSS section scheme. - * - * The BSS section is specified by following symbols - * __bss_start__: start of the BSS section. - * __bss_end__: end of the BSS section. - * - * Both addresses must be aligned to 4 bytes boundary. - */ - ldr r1, =__bss_start__ - ldr r2, =__bss_end__ - - movs r0, 0 - - subs r2, r1 - ble .L_loop3_done - -.L_loop3: - subs r2, #4 - str r0, [r1, r2] - bgt .L_loop3 -.L_loop3_done: -#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ - - /* Update Vector Table Offset Register. */ - ldr r0, =__ramVectors - ldr r1, =CY_CPU_VTOR_ADDR - str r0, [r1] - dsb 0xF - -#ifndef __NO_SYSTEM_INIT - bl SystemInit -#endif - - bl main - - /* Should never get here */ - b . - - .pool - .size Reset_Handler, . - Reset_Handler - - .align 1 - .thumb_func - .weak Default_Handler - .type Default_Handler, %function -Default_Handler: - b . - .size Default_Handler, . - Default_Handler - .weak Cy_SysLib_FaultHandler - .type Cy_SysLib_FaultHandler, %function - -Cy_SysLib_FaultHandler: - b . - .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler - .type Fault_Handler, %function - -Fault_Handler: - /* Storing LR content for Creator call stack trace */ - push {LR} - movs r0, #4 - mov r1, LR - tst r0, r1 - beq .L_MSP - mrs r0, PSP - b .L_API_call -.L_MSP: - mrs r0, MSP -.L_API_call: - /* Compensation of stack pointer address due to pushing 4 bytes of LR */ - adds r0, r0, #4 - bl Cy_SysLib_FaultHandler - b . - .size Fault_Handler, . - Fault_Handler - -.macro def_fault_Handler fault_handler_name - .weak \fault_handler_name - .set \fault_handler_name, Fault_Handler - .endm - -/* Macro to define default handlers. Default handler - * will be weak symbol and just dead loops. They can be - * overwritten by other handlers */ - .macro def_irq_handler handler_name - .weak \handler_name - .set \handler_name, Default_Handler - .endm - - def_irq_handler NMI_Handler - - def_fault_Handler HardFault_Handler - - def_irq_handler SVC_Handler - def_irq_handler PendSV_Handler - def_irq_handler SysTick_Handler - - def_irq_handler NvicMux0_IRQHandler /* CPU User Interrupt #0 */ - def_irq_handler NvicMux1_IRQHandler /* CPU User Interrupt #1 */ - def_irq_handler NvicMux2_IRQHandler /* CPU User Interrupt #2 */ - def_irq_handler NvicMux3_IRQHandler /* CPU User Interrupt #3 */ - def_irq_handler NvicMux4_IRQHandler /* CPU User Interrupt #4 */ - def_irq_handler NvicMux5_IRQHandler /* CPU User Interrupt #5 */ - def_irq_handler NvicMux6_IRQHandler /* CPU User Interrupt #6 */ - def_irq_handler NvicMux7_IRQHandler /* CPU User Interrupt #7 */ - def_irq_handler Internal0_IRQHandler /* Internal SW Interrupt #0 */ - def_irq_handler Internal1_IRQHandler /* Internal SW Interrupt #1 */ - def_irq_handler Internal2_IRQHandler /* Internal SW Interrupt #2 */ - def_irq_handler Internal3_IRQHandler /* Internal SW Interrupt #3 */ - def_irq_handler Internal4_IRQHandler /* Internal SW Interrupt #4 */ - def_irq_handler Internal5_IRQHandler /* Internal SW Interrupt #5 */ - def_irq_handler Internal6_IRQHandler /* Internal SW Interrupt #6 */ - def_irq_handler Internal7_IRQHandler /* Internal SW Interrupt #7 */ - - .end - - -/* [] END OF FILE */ diff --git a/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM4/GCC_ARM/cy8c6xxa_cm4_dual.ld b/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM4/GCC_ARM/cy8c6xxa_cm4_dual.ld deleted file mode 100644 index ec703098d..000000000 --- a/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM4/GCC_ARM/cy8c6xxa_cm4_dual.ld +++ /dev/null @@ -1,436 +0,0 @@ -/***************************************************************************//** -* \file cy8c6xxa_cm4_dual.ld -* \version 2.70 -* -* 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) - -/* The size of the stack section at the end of CM4 SRAM */ -STACK_SIZE = 0x1000; - -/* The size of the Cortex-M0+ application image at the start of FLASH */ -FLASH_CM0P_SIZE = 0x2000; - -/* 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 = 0x08002000, LENGTH = 0xFD800 - flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x200000 - - /* 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-M0+ application flash image area */ - .cy_m0p_image ORIGIN(flash) : - { - . = ALIGN(4); - __cy_m0p_code_start = . ; - KEEP(*(.cy_m0p_image)) - __cy_m0p_code_end = . ; - } > flash - - /* Check if .cy_m0p_image size exceeds FLASH_CM0P_SIZE */ - ASSERT(__cy_m0p_code_end <= ORIGIN(flash) + FLASH_CM0P_SIZE, "CM0+ flash image overflows with CM4, increase FLASH_CM0P_SIZE") - - /* Cortex-M4 application flash area */ - .text ORIGIN(flash) + FLASH_CM0P_SIZE : - { - . = ALIGN(4); - __Vectors = . ; - KEEP(*(.vectors)) - . = ALIGN(4); - __Vectors_End = .; - __Vectors_Size = __Vectors_End - __Vectors; - __end__ = .; - - . = ALIGN(4); - *(.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(4); - __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(4); - __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(4); - /* preinit data */ - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP(*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - - . = ALIGN(4); - /* init data */ - PROVIDE_HIDDEN (__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE_HIDDEN (__init_array_end = .); - - . = ALIGN(4); - /* finit data */ - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP(*(SORT(.fini_array.*))) - KEEP(*(.fini_array)) - PROVIDE_HIDDEN (__fini_array_end = .); - - KEEP(*(.jcr*)) - . = ALIGN(4); - - KEEP(*(.cy_ramfunc*)) - . = ALIGN(4); - - __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(4); - __bss_start__ = .; - *(.bss*) - *(COMMON) - . = ALIGN(4); - __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 : - { - KEEP(*(.cy_em_eeprom)) - } > em_eeprom - - - /* Supervisory Flash: User data */ - .cy_sflash_user_data : - { - KEEP(*(.cy_sflash_user_data)) - } > sflash_user_data - - - /* Supervisory Flash: Normal Access Restrictions (NAR) */ - .cy_sflash_nar : - { - KEEP(*(.cy_sflash_nar)) - } > sflash_nar - - - /* Supervisory Flash: Public Key */ - .cy_sflash_public_key : - { - KEEP(*(.cy_sflash_public_key)) - } > sflash_public_key - - - /* Supervisory Flash: Table of Content # 2 */ - .cy_toc_part2 : - { - KEEP(*(.cy_toc_part2)) - } > sflash_toc_2 - - - /* 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/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM4/GCC_ARM/startup_psoc6_02_cm4.S b/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM4/GCC_ARM/startup_psoc6_02_cm4.S deleted file mode 100644 index 3eb9dab08..000000000 --- a/mcuboot/boot/cypress/platforms/PSOC_062_2M/CM4/GCC_ARM/startup_psoc6_02_cm4.S +++ /dev/null @@ -1,697 +0,0 @@ -/**************************************************************************//** - * @file startup_psoc6_02_cm4.S - * @brief CMSIS Core Device Startup File for - * ARMCM4 Device Series - * @version V5.00 - * @date 02. March 2016 - ******************************************************************************/ -/* - * Copyright (c) 2009-2016 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 - * - * 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. - */ - - /* Address of the NMI handler */ - #define CY_NMI_HANLDER_ADDR 0x0000000D - - /* The CPU VTOR register */ - #define CY_CPU_VTOR_ADDR 0xE000ED08 - - /* Copy flash vectors and data section to RAM */ - #define __STARTUP_COPY_MULTIPLE - - /* Clear single BSS section */ - #define __STARTUP_CLEAR_BSS - - .syntax unified - .arch armv7-m - - .section .stack - .align 3 -#ifdef __STACK_SIZE - .equ Stack_Size, __STACK_SIZE -#else - .equ Stack_Size, 0x00001000 -#endif - .globl __StackTop - .globl __StackLimit -__StackLimit: - .space Stack_Size - .size __StackLimit, . - __StackLimit -__StackTop: - .size __StackTop, . - __StackTop - - .section .heap - .align 3 -#ifdef __HEAP_SIZE - .equ Heap_Size, __HEAP_SIZE -#else - .equ Heap_Size, 0x00000400 -#endif - .globl __HeapBase - .globl __HeapLimit -__HeapBase: - .if Heap_Size - .space Heap_Size - .endif - .size __HeapBase, . - __HeapBase -__HeapLimit: - .size __HeapLimit, . - __HeapLimit - - .section .vectors - .align 2 - .globl __Vectors -__Vectors: - .long __StackTop /* Top of Stack */ - .long Reset_Handler /* Reset Handler */ - .long CY_NMI_HANLDER_ADDR /* NMI Handler */ - .long HardFault_Handler /* Hard Fault Handler */ - .long MemManage_Handler /* MPU Fault Handler */ - .long BusFault_Handler /* Bus Fault Handler */ - .long UsageFault_Handler /* Usage Fault Handler */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long 0 /* Reserved */ - .long SVC_Handler /* SVCall Handler */ - .long DebugMon_Handler /* Debug Monitor Handler */ - .long 0 /* Reserved */ - .long PendSV_Handler /* PendSV Handler */ - .long SysTick_Handler /* SysTick Handler */ - - /* External interrupts Description */ - .long ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ - .long ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ - .long ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ - .long ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ - .long ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ - .long ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ - .long ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ - .long ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ - .long ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ - .long ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ - .long ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ - .long ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ - .long ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ - .long ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ - .long ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ - .long ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ - .long ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ - .long lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ - .long scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ - .long srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ - .long srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ - .long srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ - .long srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ - .long cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ - .long cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ - .long cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ - .long cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ - .long cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ - .long cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ - .long cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ - .long cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ - .long cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ - .long cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ - .long cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ - .long cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ - .long cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ - .long cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ - .long cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ - .long cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ - .long scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ - .long scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ - .long scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ - .long scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ - .long scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ - .long scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ - .long scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ - .long scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ - .long scb_9_interrupt_IRQHandler /* Serial Communication Block #9 */ - .long scb_10_interrupt_IRQHandler /* Serial Communication Block #10 */ - .long scb_11_interrupt_IRQHandler /* Serial Communication Block #11 */ - .long scb_12_interrupt_IRQHandler /* Serial Communication Block #12 */ - .long csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ - .long cpuss_interrupts_dmac_0_IRQHandler /* CPUSS DMAC, Channel #0 */ - .long cpuss_interrupts_dmac_1_IRQHandler /* CPUSS DMAC, Channel #1 */ - .long cpuss_interrupts_dmac_2_IRQHandler /* CPUSS DMAC, Channel #2 */ - .long cpuss_interrupts_dmac_3_IRQHandler /* CPUSS DMAC, Channel #3 */ - .long cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ - .long cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ - .long cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ - .long cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ - .long cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ - .long cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ - .long cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ - .long cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ - .long cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ - .long cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ - .long cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ - .long cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ - .long cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ - .long cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ - .long cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ - .long cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ - .long cpuss_interrupts_dw0_16_IRQHandler /* CPUSS DataWire #0, Channel #16 */ - .long cpuss_interrupts_dw0_17_IRQHandler /* CPUSS DataWire #0, Channel #17 */ - .long cpuss_interrupts_dw0_18_IRQHandler /* CPUSS DataWire #0, Channel #18 */ - .long cpuss_interrupts_dw0_19_IRQHandler /* CPUSS DataWire #0, Channel #19 */ - .long cpuss_interrupts_dw0_20_IRQHandler /* CPUSS DataWire #0, Channel #20 */ - .long cpuss_interrupts_dw0_21_IRQHandler /* CPUSS DataWire #0, Channel #21 */ - .long cpuss_interrupts_dw0_22_IRQHandler /* CPUSS DataWire #0, Channel #22 */ - .long cpuss_interrupts_dw0_23_IRQHandler /* CPUSS DataWire #0, Channel #23 */ - .long cpuss_interrupts_dw0_24_IRQHandler /* CPUSS DataWire #0, Channel #24 */ - .long cpuss_interrupts_dw0_25_IRQHandler /* CPUSS DataWire #0, Channel #25 */ - .long cpuss_interrupts_dw0_26_IRQHandler /* CPUSS DataWire #0, Channel #26 */ - .long cpuss_interrupts_dw0_27_IRQHandler /* CPUSS DataWire #0, Channel #27 */ - .long cpuss_interrupts_dw0_28_IRQHandler /* CPUSS DataWire #0, Channel #28 */ - .long cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ - .long cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ - .long cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ - .long cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ - .long cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ - .long cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ - .long cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ - .long cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ - .long cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ - .long cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ - .long cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ - .long cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ - .long cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ - .long cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ - .long cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ - .long cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ - .long cpuss_interrupts_dw1_16_IRQHandler /* CPUSS DataWire #1, Channel #16 */ - .long cpuss_interrupts_dw1_17_IRQHandler /* CPUSS DataWire #1, Channel #17 */ - .long cpuss_interrupts_dw1_18_IRQHandler /* CPUSS DataWire #1, Channel #18 */ - .long cpuss_interrupts_dw1_19_IRQHandler /* CPUSS DataWire #1, Channel #19 */ - .long cpuss_interrupts_dw1_20_IRQHandler /* CPUSS DataWire #1, Channel #20 */ - .long cpuss_interrupts_dw1_21_IRQHandler /* CPUSS DataWire #1, Channel #21 */ - .long cpuss_interrupts_dw1_22_IRQHandler /* CPUSS DataWire #1, Channel #22 */ - .long cpuss_interrupts_dw1_23_IRQHandler /* CPUSS DataWire #1, Channel #23 */ - .long cpuss_interrupts_dw1_24_IRQHandler /* CPUSS DataWire #1, Channel #24 */ - .long cpuss_interrupts_dw1_25_IRQHandler /* CPUSS DataWire #1, Channel #25 */ - .long cpuss_interrupts_dw1_26_IRQHandler /* CPUSS DataWire #1, Channel #26 */ - .long cpuss_interrupts_dw1_27_IRQHandler /* CPUSS DataWire #1, Channel #27 */ - .long cpuss_interrupts_dw1_28_IRQHandler /* CPUSS DataWire #1, Channel #28 */ - .long cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ - .long cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ - .long cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ - .long cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ - .long cpuss_interrupts_cm4_fp_IRQHandler /* Floating Point operation fault */ - .long cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ - .long cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ - .long cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ - .long cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ - .long tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ - .long tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ - .long tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ - .long tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ - .long tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ - .long tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ - .long tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ - .long tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ - .long tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ - .long tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ - .long tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ - .long tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ - .long tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ - .long tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ - .long tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ - .long tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ - .long tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ - .long tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ - .long tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ - .long tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ - .long tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ - .long tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ - .long tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ - .long tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ - .long tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ - .long tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ - .long tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ - .long tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ - .long tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ - .long tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ - .long tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ - .long tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ - .long pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ - .long audioss_0_interrupt_i2s_IRQHandler /* I2S0 Audio interrupt */ - .long audioss_0_interrupt_pdm_IRQHandler /* PDM0/PCM0 Audio interrupt */ - .long audioss_1_interrupt_i2s_IRQHandler /* I2S1 Audio interrupt */ - .long profile_interrupt_IRQHandler /* Energy Profiler interrupt */ - .long smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ - .long usb_interrupt_hi_IRQHandler /* USB Interrupt */ - .long usb_interrupt_med_IRQHandler /* USB Interrupt */ - .long usb_interrupt_lo_IRQHandler /* USB Interrupt */ - .long sdhc_0_interrupt_wakeup_IRQHandler /* SDIO wakeup interrupt for mxsdhc */ - .long sdhc_0_interrupt_general_IRQHandler /* Consolidated interrupt for mxsdhc for everything else */ - .long sdhc_1_interrupt_wakeup_IRQHandler /* EEMC wakeup interrupt for mxsdhc, not used */ - .long sdhc_1_interrupt_general_IRQHandler /* Consolidated interrupt for mxsdhc for everything else */ - - - .size __Vectors, . - __Vectors - .equ __VectorsSize, . - __Vectors - - .section .ram_vectors - .align 2 - .globl __ramVectors -__ramVectors: - .space __VectorsSize - .size __ramVectors, . - __ramVectors - - - .text - .thumb - .thumb_func - .align 2 - - /* - * Device startup customization - * - * Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) - * because this function is executed as the first instruction in the ResetHandler. - * The PDL is also not initialized to use the proper register offsets. - * The user of this function is responsible for initializing the PDL and resources before using them. - */ - .weak Cy_OnResetUser - .func Cy_OnResetUser, Cy_OnResetUser - .type Cy_OnResetUser, %function - -Cy_OnResetUser: - bx lr - .size Cy_OnResetUser, . - Cy_OnResetUser - .endfunc - - /* OS-specific low-level initialization */ - .weak cy_toolchain_init - .func cy_toolchain_init, cy_toolchain_init - .type cy_toolchain_init, %function - -cy_toolchain_init: - bx lr - .size cy_toolchain_init, . - cy_toolchain_init - .endfunc - - /* Reset handler */ - .weak Reset_Handler - .type Reset_Handler, %function - -Reset_Handler: - bl Cy_OnResetUser - cpsid i - -/* Firstly it copies data from read only memory to RAM. There are two schemes - * to copy. One can copy more than one sections. Another can only copy - * one section. The former scheme needs more instructions and read-only - * data to implement than the latter. - * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ - -#ifdef __STARTUP_COPY_MULTIPLE -/* Multiple sections scheme. - * - * Between symbol address __copy_table_start__ and __copy_table_end__, - * there are array of triplets, each of which specify: - * offset 0: LMA of start of a section to copy from - * offset 4: VMA of start of a section to copy to - * offset 8: size of the section to copy. Must be multiply of 4 - * - * All addresses must be aligned to 4 bytes boundary. - */ - ldr r4, =__copy_table_start__ - ldr r5, =__copy_table_end__ - -.L_loop0: - cmp r4, r5 - bge .L_loop0_done - ldr r1, [r4] - ldr r2, [r4, #4] - ldr r3, [r4, #8] - -.L_loop0_0: - subs r3, #4 - ittt ge - ldrge r0, [r1, r3] - strge r0, [r2, r3] - bge .L_loop0_0 - - adds r4, #12 - b .L_loop0 - -.L_loop0_done: -#else -/* Single section scheme. - * - * The ranges of copy from/to are specified by following symbols - * __etext: LMA of start of the section to copy from. Usually end of text - * __data_start__: VMA of start of the section to copy to - * __data_end__: VMA of end of the section to copy to - * - * All addresses must be aligned to 4 bytes boundary. - */ - ldr r1, =__etext - ldr r2, =__data_start__ - ldr r3, =__data_end__ - -.L_loop1: - cmp r2, r3 - ittt lt - ldrlt r0, [r1], #4 - strlt r0, [r2], #4 - blt .L_loop1 -#endif /*__STARTUP_COPY_MULTIPLE */ - -/* This part of work usually is done in C library startup code. Otherwise, - * define this macro to enable it in this startup. - * - * There are two schemes too. One can clear multiple BSS sections. Another - * can only clear one section. The former is more size expensive than the - * latter. - * - * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. - * Otherwise define macro __STARTUP_CLEAR_BSS to choose the later. - */ -#ifdef __STARTUP_CLEAR_BSS_MULTIPLE -/* Multiple sections scheme. - * - * Between symbol address __copy_table_start__ and __copy_table_end__, - * there are array of tuples specifying: - * offset 0: Start of a BSS section - * offset 4: Size of this BSS section. Must be multiply of 4 - */ - ldr r3, =__zero_table_start__ - ldr r4, =__zero_table_end__ - -.L_loop2: - cmp r3, r4 - bge .L_loop2_done - ldr r1, [r3] - ldr r2, [r3, #4] - movs r0, 0 - -.L_loop2_0: - subs r2, #4 - itt ge - strge r0, [r1, r2] - bge .L_loop2_0 - - adds r3, #8 - b .L_loop2 -.L_loop2_done: -#elif defined (__STARTUP_CLEAR_BSS) -/* Single BSS section scheme. - * - * The BSS section is specified by following symbols - * __bss_start__: start of the BSS section. - * __bss_end__: end of the BSS section. - * - * Both addresses must be aligned to 4 bytes boundary. - */ - ldr r1, =__bss_start__ - ldr r2, =__bss_end__ - - movs r0, 0 -.L_loop3: - cmp r1, r2 - itt lt - strlt r0, [r1], #4 - blt .L_loop3 -#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ - - /* Update Vector Table Offset Register. */ - ldr r0, =__ramVectors - ldr r1, =CY_CPU_VTOR_ADDR - str r0, [r1] - dsb 0xF - - /* Enable the FPU if used */ - bl Cy_SystemInitFpuEnable - -#ifndef __NO_SYSTEM_INIT - bl SystemInit -#endif - - /* OS-specific low-level initialization */ - bl cy_toolchain_init - - /* Call C/C++ static constructors */ - bl __libc_init_array - - /* Execute main application */ - bl main - - /* Call C/C++ static destructors */ - bl __libc_fini_array - - /* Should never get here */ - b . - - .pool - .size Reset_Handler, . - Reset_Handler - - .align 1 - .thumb_func - .weak Default_Handler - .type Default_Handler, %function - -Default_Handler: - b . - .size Default_Handler, . - Default_Handler - - - .weak Cy_SysLib_FaultHandler - .type Cy_SysLib_FaultHandler, %function - -Cy_SysLib_FaultHandler: - b . - .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler - .type Fault_Handler, %function - -Fault_Handler: - /* Storing LR content for Creator call stack trace */ - push {LR} - movs r0, #4 - mov r1, LR - tst r0, r1 - beq .L_MSP - mrs r0, PSP - b .L_API_call -.L_MSP: - mrs r0, MSP -.L_API_call: - /* Compensation of stack pointer address due to pushing 4 bytes of LR */ - adds r0, r0, #4 - bl Cy_SysLib_FaultHandler - b . - .size Fault_Handler, . - Fault_Handler - -.macro def_fault_Handler fault_handler_name - .weak \fault_handler_name - .set \fault_handler_name, Fault_Handler - .endm - -/* Macro to define default handlers. Default handler - * will be weak symbol and just dead loops. They can be - * overwritten by other handlers */ - .macro def_irq_handler handler_name - .weak \handler_name - .set \handler_name, Default_Handler - .endm - - def_irq_handler NMI_Handler - - def_fault_Handler HardFault_Handler - def_fault_Handler MemManage_Handler - def_fault_Handler BusFault_Handler - def_fault_Handler UsageFault_Handler - - def_irq_handler SVC_Handler - def_irq_handler DebugMon_Handler - def_irq_handler PendSV_Handler - def_irq_handler SysTick_Handler - - def_irq_handler ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ - def_irq_handler ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ - def_irq_handler ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ - def_irq_handler ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ - def_irq_handler ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ - def_irq_handler ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ - def_irq_handler ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ - def_irq_handler ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ - def_irq_handler ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ - def_irq_handler ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ - def_irq_handler ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ - def_irq_handler ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ - def_irq_handler ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ - def_irq_handler ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ - def_irq_handler ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ - def_irq_handler ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ - def_irq_handler ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ - def_irq_handler lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ - def_irq_handler scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ - def_irq_handler srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ - def_irq_handler srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ - def_irq_handler srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ - def_irq_handler srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ - def_irq_handler cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ - def_irq_handler cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ - def_irq_handler cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ - def_irq_handler cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ - def_irq_handler cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ - def_irq_handler cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ - def_irq_handler cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ - def_irq_handler cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ - def_irq_handler cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ - def_irq_handler cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ - def_irq_handler cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ - def_irq_handler cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ - def_irq_handler cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ - def_irq_handler cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ - def_irq_handler cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ - def_irq_handler cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ - def_irq_handler scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ - def_irq_handler scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ - def_irq_handler scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ - def_irq_handler scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ - def_irq_handler scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ - def_irq_handler scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ - def_irq_handler scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ - def_irq_handler scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ - def_irq_handler scb_9_interrupt_IRQHandler /* Serial Communication Block #9 */ - def_irq_handler scb_10_interrupt_IRQHandler /* Serial Communication Block #10 */ - def_irq_handler scb_11_interrupt_IRQHandler /* Serial Communication Block #11 */ - def_irq_handler scb_12_interrupt_IRQHandler /* Serial Communication Block #12 */ - def_irq_handler csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ - def_irq_handler cpuss_interrupts_dmac_0_IRQHandler /* CPUSS DMAC, Channel #0 */ - def_irq_handler cpuss_interrupts_dmac_1_IRQHandler /* CPUSS DMAC, Channel #1 */ - def_irq_handler cpuss_interrupts_dmac_2_IRQHandler /* CPUSS DMAC, Channel #2 */ - def_irq_handler cpuss_interrupts_dmac_3_IRQHandler /* CPUSS DMAC, Channel #3 */ - def_irq_handler cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ - def_irq_handler cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ - def_irq_handler cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ - def_irq_handler cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ - def_irq_handler cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ - def_irq_handler cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ - def_irq_handler cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ - def_irq_handler cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ - def_irq_handler cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ - def_irq_handler cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ - def_irq_handler cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ - def_irq_handler cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ - def_irq_handler cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ - def_irq_handler cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ - def_irq_handler cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ - def_irq_handler cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ - def_irq_handler cpuss_interrupts_dw0_16_IRQHandler /* CPUSS DataWire #0, Channel #16 */ - def_irq_handler cpuss_interrupts_dw0_17_IRQHandler /* CPUSS DataWire #0, Channel #17 */ - def_irq_handler cpuss_interrupts_dw0_18_IRQHandler /* CPUSS DataWire #0, Channel #18 */ - def_irq_handler cpuss_interrupts_dw0_19_IRQHandler /* CPUSS DataWire #0, Channel #19 */ - def_irq_handler cpuss_interrupts_dw0_20_IRQHandler /* CPUSS DataWire #0, Channel #20 */ - def_irq_handler cpuss_interrupts_dw0_21_IRQHandler /* CPUSS DataWire #0, Channel #21 */ - def_irq_handler cpuss_interrupts_dw0_22_IRQHandler /* CPUSS DataWire #0, Channel #22 */ - def_irq_handler cpuss_interrupts_dw0_23_IRQHandler /* CPUSS DataWire #0, Channel #23 */ - def_irq_handler cpuss_interrupts_dw0_24_IRQHandler /* CPUSS DataWire #0, Channel #24 */ - def_irq_handler cpuss_interrupts_dw0_25_IRQHandler /* CPUSS DataWire #0, Channel #25 */ - def_irq_handler cpuss_interrupts_dw0_26_IRQHandler /* CPUSS DataWire #0, Channel #26 */ - def_irq_handler cpuss_interrupts_dw0_27_IRQHandler /* CPUSS DataWire #0, Channel #27 */ - def_irq_handler cpuss_interrupts_dw0_28_IRQHandler /* CPUSS DataWire #0, Channel #28 */ - def_irq_handler cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ - def_irq_handler cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ - def_irq_handler cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ - def_irq_handler cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ - def_irq_handler cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ - def_irq_handler cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ - def_irq_handler cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ - def_irq_handler cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ - def_irq_handler cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ - def_irq_handler cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ - def_irq_handler cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ - def_irq_handler cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ - def_irq_handler cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ - def_irq_handler cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ - def_irq_handler cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ - def_irq_handler cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ - def_irq_handler cpuss_interrupts_dw1_16_IRQHandler /* CPUSS DataWire #1, Channel #16 */ - def_irq_handler cpuss_interrupts_dw1_17_IRQHandler /* CPUSS DataWire #1, Channel #17 */ - def_irq_handler cpuss_interrupts_dw1_18_IRQHandler /* CPUSS DataWire #1, Channel #18 */ - def_irq_handler cpuss_interrupts_dw1_19_IRQHandler /* CPUSS DataWire #1, Channel #19 */ - def_irq_handler cpuss_interrupts_dw1_20_IRQHandler /* CPUSS DataWire #1, Channel #20 */ - def_irq_handler cpuss_interrupts_dw1_21_IRQHandler /* CPUSS DataWire #1, Channel #21 */ - def_irq_handler cpuss_interrupts_dw1_22_IRQHandler /* CPUSS DataWire #1, Channel #22 */ - def_irq_handler cpuss_interrupts_dw1_23_IRQHandler /* CPUSS DataWire #1, Channel #23 */ - def_irq_handler cpuss_interrupts_dw1_24_IRQHandler /* CPUSS DataWire #1, Channel #24 */ - def_irq_handler cpuss_interrupts_dw1_25_IRQHandler /* CPUSS DataWire #1, Channel #25 */ - def_irq_handler cpuss_interrupts_dw1_26_IRQHandler /* CPUSS DataWire #1, Channel #26 */ - def_irq_handler cpuss_interrupts_dw1_27_IRQHandler /* CPUSS DataWire #1, Channel #27 */ - def_irq_handler cpuss_interrupts_dw1_28_IRQHandler /* CPUSS DataWire #1, Channel #28 */ - def_irq_handler cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ - def_irq_handler cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ - def_irq_handler cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ - def_irq_handler cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ - def_irq_handler cpuss_interrupts_cm4_fp_IRQHandler /* Floating Point operation fault */ - def_irq_handler cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ - def_irq_handler cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ - def_irq_handler cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ - def_irq_handler cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ - def_irq_handler tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ - def_irq_handler tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ - def_irq_handler tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ - def_irq_handler tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ - def_irq_handler tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ - def_irq_handler tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ - def_irq_handler tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ - def_irq_handler tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ - def_irq_handler tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ - def_irq_handler tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ - def_irq_handler tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ - def_irq_handler tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ - def_irq_handler tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ - def_irq_handler tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ - def_irq_handler tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ - def_irq_handler tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ - def_irq_handler tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ - def_irq_handler tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ - def_irq_handler tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ - def_irq_handler tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ - def_irq_handler tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ - def_irq_handler tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ - def_irq_handler tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ - def_irq_handler tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ - def_irq_handler tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ - def_irq_handler tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ - def_irq_handler tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ - def_irq_handler tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ - def_irq_handler tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ - def_irq_handler tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ - def_irq_handler tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ - def_irq_handler tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ - def_irq_handler pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ - def_irq_handler audioss_0_interrupt_i2s_IRQHandler /* I2S0 Audio interrupt */ - def_irq_handler audioss_0_interrupt_pdm_IRQHandler /* PDM0/PCM0 Audio interrupt */ - def_irq_handler audioss_1_interrupt_i2s_IRQHandler /* I2S1 Audio interrupt */ - def_irq_handler profile_interrupt_IRQHandler /* Energy Profiler interrupt */ - def_irq_handler smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ - def_irq_handler usb_interrupt_hi_IRQHandler /* USB Interrupt */ - def_irq_handler usb_interrupt_med_IRQHandler /* USB Interrupt */ - def_irq_handler usb_interrupt_lo_IRQHandler /* USB Interrupt */ - def_irq_handler sdhc_0_interrupt_wakeup_IRQHandler /* SDIO wakeup interrupt for mxsdhc */ - def_irq_handler sdhc_0_interrupt_general_IRQHandler /* Consolidated interrupt for mxsdhc for everything else */ - def_irq_handler sdhc_1_interrupt_wakeup_IRQHandler /* EEMC wakeup interrupt for mxsdhc, not used */ - def_irq_handler sdhc_1_interrupt_general_IRQHandler /* Consolidated interrupt for mxsdhc for everything else */ - - .end - - -/* [] END OF FILE */ diff --git a/mcuboot/boot/cypress/platforms/cycfg.c b/mcuboot/boot/cypress/platforms/cycfg.c deleted file mode 100644 index ede3da09c..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg.c +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* -* File Name: cycfg.c -* -* Description: -* Wrapper function to initialize all generated code. -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../../output/libs/COMPONENT_PSOC6/psoc6pdl): 1.5.0.1837 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#include "cycfg.h" - -void init_cycfg_all(void) -{ - init_cycfg_system(); - init_cycfg_clocks(); -} diff --git a/mcuboot/boot/cypress/platforms/cycfg.h b/mcuboot/boot/cypress/platforms/cycfg.h deleted file mode 100644 index 9b741879d..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg.h +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* -* File Name: cycfg.h -* -* Description: -* Simple wrapper header containing all generated files. -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../../output/libs/COMPONENT_PSOC6/psoc6pdl): 1.5.0.1837 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#if !defined(CYCFG_H) -#define CYCFG_H - -#if defined(__cplusplus) -extern "C" { -#endif - -#include "cycfg_system.h" -#include "cycfg_clocks.h" - -void init_cycfg_all(void); - - -#if defined(__cplusplus) -} -#endif - - -#endif /* CYCFG_H */ diff --git a/mcuboot/boot/cypress/platforms/cycfg_clocks.c b/mcuboot/boot/cypress/platforms/cycfg_clocks.c deleted file mode 100644 index 7f720f7f6..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_clocks.c +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_clocks.c -* -* Description: -* Clock configuration -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../../output/libs/COMPONENT_PSOC6/psoc6pdl): 1.5.0.1837 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#include "cycfg_clocks.h" - -#if defined (CY_USING_HAL) - const cyhal_resource_inst_t CYBSP_CSD_CLK_DIV_obj = - { - .type = CYHAL_RSC_CLOCK, - .block_num = CYBSP_CSD_CLK_DIV_HW, - .channel_num = CYBSP_CSD_CLK_DIV_NUM, - }; -#endif //defined (CY_USING_HAL) - - -void init_cycfg_clocks(void) -{ - Cy_SysClk_PeriphDisableDivider(CY_SYSCLK_DIV_8_BIT, 0U); - Cy_SysClk_PeriphSetDivider(CY_SYSCLK_DIV_8_BIT, 0U, 0U); - Cy_SysClk_PeriphEnableDivider(CY_SYSCLK_DIV_8_BIT, 0U); -#if defined (CY_USING_HAL) - cyhal_hwmgr_reserve(&CYBSP_CSD_CLK_DIV_obj); -#endif //defined (CY_USING_HAL) -} diff --git a/mcuboot/boot/cypress/platforms/cycfg_clocks.h b/mcuboot/boot/cypress/platforms/cycfg_clocks.h deleted file mode 100644 index 5766ab520..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_clocks.h +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_clocks.h -* -* Description: -* Clock configuration -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../../output/libs/COMPONENT_PSOC6/psoc6pdl): 1.5.0.1837 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#if !defined(CYCFG_CLOCKS_H) -#define CYCFG_CLOCKS_H - -#include "cy_sysclk.h" -#if defined (CY_USING_HAL) - #include "cyhal_hwmgr.h" -#endif //defined (CY_USING_HAL) - -#if defined(__cplusplus) -extern "C" { -#endif - -#define CYBSP_CSD_CLK_DIV_ENABLED 1U -#define CYBSP_CSD_CLK_DIV_HW CY_SYSCLK_DIV_8_BIT -#define CYBSP_CSD_CLK_DIV_NUM 0U - -#if defined (CY_USING_HAL) - extern const cyhal_resource_inst_t CYBSP_CSD_CLK_DIV_obj; -#endif //defined (CY_USING_HAL) - -void init_cycfg_clocks(void); - -#if defined(__cplusplus) -} -#endif - - -#endif /* CYCFG_CLOCKS_H */ diff --git a/mcuboot/boot/cypress/platforms/cycfg_peripherals.c b/mcuboot/boot/cypress/platforms/cycfg_peripherals.c deleted file mode 100644 index 1c55938bf..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_peripherals.c +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_peripherals.c -* -* Description: -* Peripheral Hardware Block configuration -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../psoc6pdl): 1.3.1.1499 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#include "cycfg_peripherals.h" - -const cy_stc_scb_uart_config_t CYBSP_UART_config = -{ - .uartMode = CY_SCB_UART_STANDARD, - .enableMutliProcessorMode = false, - .smartCardRetryOnNack = false, - .irdaInvertRx = false, - .irdaEnableLowPowerReceiver = false, - .oversample = 8, - .enableMsbFirst = false, - .dataWidth = 8UL, - .parity = CY_SCB_UART_PARITY_NONE, - .stopBits = CY_SCB_UART_STOP_BITS_1, - .enableInputFilter = false, - .breakWidth = 11UL, - .dropOnFrameError = false, - .dropOnParityError = false, - .receiverAddress = 0x0UL, - .receiverAddressMask = 0x0UL, - .acceptAddrInFifo = false, - .enableCts = false, - .ctsPolarity = CY_SCB_UART_ACTIVE_LOW, - .rtsRxFifoLevel = 0UL, - .rtsPolarity = CY_SCB_UART_ACTIVE_LOW, - .rxFifoTriggerLevel = 0UL, - .rxFifoIntEnableMask = 0UL, - .txFifoTriggerLevel = 63UL, - .txFifoIntEnableMask = 0UL, -}; -#if defined (CY_USING_HAL) - const cyhal_resource_inst_t CYBSP_UART_obj = - { - .type = CYHAL_RSC_SCB, - .block_num = 5U, - .channel_num = 0U, - }; -#endif //defined (CY_USING_HAL) - - -void init_cycfg_peripherals(void) -{ - Cy_SysClk_PeriphAssignDivider(PCLK_SCB5_CLOCK, CY_SYSCLK_DIV_16_BIT, 0U); -#if defined (CY_USING_HAL) - cyhal_hwmgr_reserve(&CYBSP_UART_obj); -#endif //defined (CY_USING_HAL) -} diff --git a/mcuboot/boot/cypress/platforms/cycfg_peripherals.h b/mcuboot/boot/cypress/platforms/cycfg_peripherals.h deleted file mode 100644 index 41a0383f3..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_peripherals.h +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_peripherals.h -* -* Description: -* Peripheral Hardware Block configuration -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../psoc6pdl): 1.3.1.1499 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#if !defined(CYCFG_PERIPHERALS_H) -#define CYCFG_PERIPHERALS_H - -// #include "cycfg_notices.h" -#include "cy_scb_uart.h" -#include "cy_sysclk.h" -#if defined (CY_USING_HAL) - #include "cyhal_hwmgr.h" -#endif //defined (CY_USING_HAL) - -#if defined(__cplusplus) -extern "C" { -#endif - -#define CYBSP_UART_ENABLED 1U -#define CYBSP_UART_HW SCB5 -#define CYBSP_UART_IRQ scb_5_interrupt_IRQn - -extern const cy_stc_scb_uart_config_t CYBSP_UART_config; -#if defined (CY_USING_HAL) - extern const cyhal_resource_inst_t CYBSP_UART_obj; -#endif //defined (CY_USING_HAL) - -void init_cycfg_peripherals(void); - -#if defined(__cplusplus) -} -#endif - - -#endif /* CYCFG_PERIPHERALS_H */ diff --git a/mcuboot/boot/cypress/platforms/cycfg_pins.c b/mcuboot/boot/cypress/platforms/cycfg_pins.c deleted file mode 100644 index 771d77251..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_pins.c +++ /dev/null @@ -1,89 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_pins.c -* -* Description: -* Pin configuration -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../psoc6pdl): 1.3.1.1499 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#include "cycfg_pins.h" - -const cy_stc_gpio_pin_config_t CYBSP_UART_RX_config = -{ - .outVal = 1, - .driveMode = CY_GPIO_DM_HIGHZ, - .hsiom = CYBSP_UART_RX_HSIOM, - .intEdge = CY_GPIO_INTR_DISABLE, - .intMask = 0UL, - .vtrip = CY_GPIO_VTRIP_CMOS, - .slewRate = CY_GPIO_SLEW_FAST, - .driveSel = CY_GPIO_DRIVE_1_2, - .vregEn = 0UL, - .ibufMode = 0UL, - .vtripSel = 0UL, - .vrefSel = 0UL, - .vohSel = 0UL, -}; -#if defined (CY_USING_HAL) - const cyhal_resource_inst_t CYBSP_UART_RX_obj = - { - .type = CYHAL_RSC_GPIO, - .block_num = CYBSP_UART_RX_PORT_NUM, - .channel_num = CYBSP_UART_RX_PIN, - }; -#endif //defined (CY_USING_HAL) -const cy_stc_gpio_pin_config_t CYBSP_UART_TX_config = -{ - .outVal = 1, - .driveMode = CY_GPIO_DM_STRONG_IN_OFF, - .hsiom = CYBSP_UART_TX_HSIOM, - .intEdge = CY_GPIO_INTR_DISABLE, - .intMask = 0UL, - .vtrip = CY_GPIO_VTRIP_CMOS, - .slewRate = CY_GPIO_SLEW_FAST, - .driveSel = CY_GPIO_DRIVE_1_2, - .vregEn = 0UL, - .ibufMode = 0UL, - .vtripSel = 0UL, - .vrefSel = 0UL, - .vohSel = 0UL, -}; -#if defined (CY_USING_HAL) - const cyhal_resource_inst_t CYBSP_UART_TX_obj = - { - .type = CYHAL_RSC_GPIO, - .block_num = CYBSP_UART_TX_PORT_NUM, - .channel_num = CYBSP_UART_TX_PIN, - }; -#endif //defined (CY_USING_HAL) - -void init_cycfg_pins(void) -{ - Cy_GPIO_Pin_Init(CYBSP_UART_RX_PORT, CYBSP_UART_RX_PIN, &CYBSP_UART_RX_config); -#if defined (CY_USING_HAL) - cyhal_hwmgr_reserve(&CYBSP_UART_RX_obj); -#endif //defined (CY_USING_HAL) - - Cy_GPIO_Pin_Init(CYBSP_UART_TX_PORT, CYBSP_UART_TX_PIN, &CYBSP_UART_TX_config); -#if defined (CY_USING_HAL) - cyhal_hwmgr_reserve(&CYBSP_UART_TX_obj); -#endif //defined (CY_USING_HAL) -} diff --git a/mcuboot/boot/cypress/platforms/cycfg_pins.h b/mcuboot/boot/cypress/platforms/cycfg_pins.h deleted file mode 100644 index c21482672..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_pins.h +++ /dev/null @@ -1,113 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_pins.h -* -* Description: -* Pin configuration -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../psoc6pdl): 1.3.1.1499 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#if !defined(CYCFG_PINS_H) -#define CYCFG_PINS_H - -#include "cy_gpio.h" -#if defined (CY_USING_HAL) - #include "cyhal_hwmgr.h" -#endif //defined (CY_USING_HAL) -#include "cycfg_routing.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -#define CYBSP_UART_RX_ENABLED 1U -#define CYBSP_UART_RX_PORT GPIO_PRT5 -#define CYBSP_UART_RX_PORT_NUM 5U -#define CYBSP_UART_RX_PIN 0U -#define CYBSP_UART_RX_NUM 0U -#define CYBSP_UART_RX_DRIVEMODE CY_GPIO_DM_HIGHZ -#define CYBSP_UART_RX_INIT_DRIVESTATE 1 -#ifndef ioss_0_port_5_pin_0_HSIOM - #define ioss_0_port_5_pin_0_HSIOM HSIOM_SEL_GPIO -#endif -#define CYBSP_UART_RX_HSIOM ioss_0_port_5_pin_0_HSIOM -#define CYBSP_UART_RX_IRQ ioss_interrupts_gpio_5_IRQn -#if defined (CY_USING_HAL) - #define CYBSP_UART_RX_HAL_PORT_PIN P5_0 -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - #define CYBSP_UART_RX_HAL_IRQ CYHAL_GPIO_IRQ_NONE -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - #define CYBSP_UART_RX_HAL_DIR CYHAL_GPIO_DIR_INPUT -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - #define CYBSP_UART_RX_HAL_DRIVEMODE CYHAL_GPIO_DRIVE_NONE -#endif //defined (CY_USING_HAL) -#define CYBSP_UART_TX_ENABLED 1U -#define CYBSP_UART_TX_PORT GPIO_PRT5 -#define CYBSP_UART_TX_PORT_NUM 5U -#define CYBSP_UART_TX_PIN 1U -#define CYBSP_UART_TX_NUM 1U -#define CYBSP_UART_TX_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF -#define CYBSP_UART_TX_INIT_DRIVESTATE 1 -#ifndef ioss_0_port_5_pin_1_HSIOM - #define ioss_0_port_5_pin_1_HSIOM HSIOM_SEL_GPIO -#endif -#define CYBSP_UART_TX_HSIOM ioss_0_port_5_pin_1_HSIOM -#define CYBSP_UART_TX_IRQ ioss_interrupts_gpio_5_IRQn -#if defined (CY_USING_HAL) - #define CYBSP_UART_TX_HAL_PORT_PIN P5_1 -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - #define CYBSP_UART_TX_HAL_IRQ CYHAL_GPIO_IRQ_NONE -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - #define CYBSP_UART_TX_HAL_DIR CYHAL_GPIO_DIR_OUTPUT -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - #define CYBSP_UART_TX_HAL_DRIVEMODE CYHAL_GPIO_DRIVE_STRONG -#endif //defined (CY_USING_HAL) - -extern const cy_stc_gpio_pin_config_t CYBSP_WCO_IN_config; -#if defined (CY_USING_HAL) - extern const cyhal_resource_inst_t CYBSP_WCO_IN_obj; -#endif //defined (CY_USING_HAL) -extern const cy_stc_gpio_pin_config_t CYBSP_WCO_OUT_config; -#if defined (CY_USING_HAL) - extern const cyhal_resource_inst_t CYBSP_WCO_OUT_obj; -#endif //defined (CY_USING_HAL) -extern const cy_stc_gpio_pin_config_t CYBSP_UART_RX_config; -#if defined (CY_USING_HAL) - extern const cyhal_resource_inst_t CYBSP_UART_RX_obj; -#endif //defined (CY_USING_HAL) -extern const cy_stc_gpio_pin_config_t CYBSP_UART_TX_config; -#if defined (CY_USING_HAL) - extern const cyhal_resource_inst_t CYBSP_UART_TX_obj; -#endif //defined (CY_USING_HAL) - -void init_cycfg_pins(void); - -#if defined(__cplusplus) -} -#endif - - -#endif /* CYCFG_PINS_H */ diff --git a/mcuboot/boot/cypress/platforms/cycfg_routing.c b/mcuboot/boot/cypress/platforms/cycfg_routing.c deleted file mode 100644 index 063e736df..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_routing.c +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_routing.c -* -* Description: -* Establishes all necessary connections between hardware elements. -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../psoc6pdl): 1.4.0.1889 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#include "cycfg_routing.h" - -void init_cycfg_routing(void) -{ -} diff --git a/mcuboot/boot/cypress/platforms/cycfg_routing.h b/mcuboot/boot/cypress/platforms/cycfg_routing.h deleted file mode 100644 index bfb2998a8..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_routing.h +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_routing.h -* -* Description: -* Establishes all necessary connections between hardware elements. -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../psoc6pdl): 1.4.0.1889 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#if !defined(CYCFG_ROUTING_H) -#define CYCFG_ROUTING_H - -#if defined(__cplusplus) -extern "C" { -#endif - -void init_cycfg_routing(void); - -#define init_cycfg_connectivity() init_cycfg_routing() - -#define ioss_0_port_5_pin_0_HSIOM P5_0_SCB5_UART_RX -#define ioss_0_port_5_pin_1_HSIOM P5_1_SCB5_UART_TX - -#if defined(__cplusplus) -} -#endif - - -#endif /* CYCFG_ROUTING_H */ diff --git a/mcuboot/boot/cypress/platforms/cycfg_system.c b/mcuboot/boot/cypress/platforms/cycfg_system.c deleted file mode 100644 index 57ab01378..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_system.c +++ /dev/null @@ -1,537 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_system.c -* -* Description: -* System configuration -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../../output/libs/COMPONENT_PSOC6/psoc6pdl): 1.5.0.1837 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#include "cycfg_system.h" - -#define CY_CFG_SYSCLK_ECO_ERROR 1 -#define CY_CFG_SYSCLK_ALTHF_ERROR 2 -#define CY_CFG_SYSCLK_PLL_ERROR 3 -#define CY_CFG_SYSCLK_FLL_ERROR 4 -#define CY_CFG_SYSCLK_WCO_ERROR 5 -#define CY_CFG_SYSCLK_CLKALTSYSTICK_ENABLED 1 -#define CY_CFG_SYSCLK_CLKBAK_ENABLED 1 -#define CY_CFG_SYSCLK_CLKFAST_ENABLED 1 -#define CY_CFG_SYSCLK_FLL_ENABLED 1 -#define CY_CFG_SYSCLK_CLKHF0_ENABLED 1 -#define CY_CFG_SYSCLK_CLKHF0_FREQ_MHZ 100UL -#define CY_CFG_SYSCLK_CLKHF0_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0 -#define CY_CFG_SYSCLK_CLKHF2_ENABLED 1 -#define CY_CFG_SYSCLK_CLKHF2_FREQ_MHZ 50UL -#define CY_CFG_SYSCLK_CLKHF2_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0 -#define CY_CFG_SYSCLK_CLKHF3_ENABLED 1 -#define CY_CFG_SYSCLK_CLKHF3_FREQ_MHZ 100UL -#define CY_CFG_SYSCLK_CLKHF3_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0 -#define CY_CFG_SYSCLK_CLKHF4_ENABLED 1 -#define CY_CFG_SYSCLK_CLKHF4_FREQ_MHZ 100UL -#define CY_CFG_SYSCLK_CLKHF4_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0 -#define CY_CFG_SYSCLK_ILO_ENABLED 1 -#define CY_CFG_SYSCLK_IMO_ENABLED 1 -#define CY_CFG_SYSCLK_CLKLF_ENABLED 1 -#define CY_CFG_SYSCLK_CLKPATH0_ENABLED 1 -#define CY_CFG_SYSCLK_CLKPATH0_SOURCE CY_SYSCLK_CLKPATH_IN_IMO -#define CY_CFG_SYSCLK_CLKPATH1_ENABLED 1 -#define CY_CFG_SYSCLK_CLKPATH1_SOURCE CY_SYSCLK_CLKPATH_IN_IMO -#define CY_CFG_SYSCLK_CLKPATH2_ENABLED 1 -#define CY_CFG_SYSCLK_CLKPATH2_SOURCE CY_SYSCLK_CLKPATH_IN_IMO -#define CY_CFG_SYSCLK_CLKPERI_ENABLED 1 -#define CY_CFG_SYSCLK_PLL0_ENABLED 1 -#define CY_CFG_SYSCLK_PLL1_ENABLED 1 -#define CY_CFG_SYSCLK_CLKSLOW_ENABLED 1 -#define CY_CFG_SYSCLK_CLKTIMER_ENABLED 1 -#define CY_CFG_SYSCLK_WCO_ENABLED 1 - -static const cy_stc_fll_manual_config_t srss_0_clock_0_fll_0_fllConfig = -{ - .fllMult = 500U, - .refDiv = 20U, - .ccoRange = CY_SYSCLK_FLL_CCO_RANGE4, - .enableOutputDiv = true, - .lockTolerance = 10U, - .igain = 9U, - .pgain = 5U, - .settlingCount = 8U, - .outputMode = CY_SYSCLK_FLLPLL_OUTPUT_OUTPUT, - .cco_Freq = 355U, -}; -#if defined (CY_USING_HAL) - const cyhal_resource_inst_t srss_0_clock_0_pathmux_0_obj = - { - .type = CYHAL_RSC_CLKPATH, - .block_num = 0U, - .channel_num = 0U, - }; -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - const cyhal_resource_inst_t srss_0_clock_0_pathmux_1_obj = - { - .type = CYHAL_RSC_CLKPATH, - .block_num = 1U, - .channel_num = 0U, - }; -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - const cyhal_resource_inst_t srss_0_clock_0_pathmux_2_obj = - { - .type = CYHAL_RSC_CLKPATH, - .block_num = 2U, - .channel_num = 0U, - }; -#endif //defined (CY_USING_HAL) -static const cy_stc_pll_manual_config_t srss_0_clock_0_pll_0_pllConfig = -{ - .feedbackDiv = 36, - .referenceDiv = 1, - .outputDiv = 2, - .lfMode = false, - .outputMode = CY_SYSCLK_FLLPLL_OUTPUT_AUTO, -}; -static const cy_stc_pll_manual_config_t srss_0_clock_0_pll_1_pllConfig = -{ - .feedbackDiv = 30, - .referenceDiv = 1, - .outputDiv = 5, - .lfMode = false, - .outputMode = CY_SYSCLK_FLLPLL_OUTPUT_AUTO, -}; - -__WEAK void cycfg_ClockStartupError(uint32_t error) -{ - (void)error; /* Suppress the compiler warning */ - while(1); -} -__STATIC_INLINE void Cy_SysClk_ClkAltSysTickInit() -{ - Cy_SysTick_SetClockSource(CY_SYSTICK_CLOCK_SOURCE_CLK_LF); -} -__STATIC_INLINE void Cy_SysClk_ClkBakInit() -{ - Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_CLKLF); -} -__STATIC_INLINE void Cy_SysClk_ClkFastInit() -{ - Cy_SysClk_ClkFastSetDivider(0U); -} -__STATIC_INLINE void Cy_SysClk_FllInit() -{ - if (CY_SYSCLK_SUCCESS != Cy_SysClk_FllManualConfigure(&srss_0_clock_0_fll_0_fllConfig)) - { - cycfg_ClockStartupError(CY_CFG_SYSCLK_FLL_ERROR); - } - if (CY_SYSCLK_SUCCESS != Cy_SysClk_FllEnable(200000UL)) - { - cycfg_ClockStartupError(CY_CFG_SYSCLK_FLL_ERROR); - } -} -__STATIC_INLINE void Cy_SysClk_ClkHf0Init() -{ - Cy_SysClk_ClkHfSetSource(0U, CY_CFG_SYSCLK_CLKHF0_CLKPATH); - Cy_SysClk_ClkHfSetDivider(0U, CY_SYSCLK_CLKHF_NO_DIVIDE); -} -__STATIC_INLINE void Cy_SysClk_ClkHf2Init() -{ - Cy_SysClk_ClkHfSetSource(CY_CFG_SYSCLK_CLKHF2, CY_CFG_SYSCLK_CLKHF2_CLKPATH); - Cy_SysClk_ClkHfSetDivider(CY_CFG_SYSCLK_CLKHF2, CY_SYSCLK_CLKHF_DIVIDE_BY_2); - Cy_SysClk_ClkHfEnable(CY_CFG_SYSCLK_CLKHF2); -} -__STATIC_INLINE void Cy_SysClk_ClkHf3Init() -{ - Cy_SysClk_ClkHfSetSource(CY_CFG_SYSCLK_CLKHF3, CY_CFG_SYSCLK_CLKHF3_CLKPATH); - Cy_SysClk_ClkHfSetDivider(CY_CFG_SYSCLK_CLKHF3, CY_SYSCLK_CLKHF_NO_DIVIDE); - Cy_SysClk_ClkHfEnable(CY_CFG_SYSCLK_CLKHF3); -} -__STATIC_INLINE void Cy_SysClk_ClkHf4Init() -{ - Cy_SysClk_ClkHfSetSource(CY_CFG_SYSCLK_CLKHF4, CY_CFG_SYSCLK_CLKHF4_CLKPATH); - Cy_SysClk_ClkHfSetDivider(CY_CFG_SYSCLK_CLKHF4, CY_SYSCLK_CLKHF_NO_DIVIDE); - Cy_SysClk_ClkHfEnable(CY_CFG_SYSCLK_CLKHF4); -} -__STATIC_INLINE void Cy_SysClk_IloInit() -{ - /* The WDT is unlocked in the default startup code */ - Cy_SysClk_IloEnable(); - Cy_SysClk_IloHibernateOn(true); -} -__STATIC_INLINE void Cy_SysClk_ClkLfInit() -{ - /* The WDT is unlocked in the default startup code */ - Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_WCO); -} -__STATIC_INLINE void Cy_SysClk_ClkPath0Init() -{ - Cy_SysClk_ClkPathSetSource(0U, CY_CFG_SYSCLK_CLKPATH0_SOURCE); -} -__STATIC_INLINE void Cy_SysClk_ClkPath1Init() -{ - Cy_SysClk_ClkPathSetSource(1U, CY_CFG_SYSCLK_CLKPATH1_SOURCE); -} -__STATIC_INLINE void Cy_SysClk_ClkPath2Init() -{ - Cy_SysClk_ClkPathSetSource(2U, CY_CFG_SYSCLK_CLKPATH2_SOURCE); -} -__STATIC_INLINE void Cy_SysClk_ClkPeriInit() -{ - Cy_SysClk_ClkPeriSetDivider(1U); -} -__STATIC_INLINE void Cy_SysClk_Pll0Init() -{ - if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllManualConfigure(1U, &srss_0_clock_0_pll_0_pllConfig)) - { - cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR); - } - if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllEnable(1U, 10000u)) - { - cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR); - } -} -__STATIC_INLINE void Cy_SysClk_Pll1Init() -{ - if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllManualConfigure(2U, &srss_0_clock_0_pll_1_pllConfig)) - { - cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR); - } - if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllEnable(2U, 10000u)) - { - cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR); - } -} -__STATIC_INLINE void Cy_SysClk_ClkSlowInit() -{ - Cy_SysClk_ClkSlowSetDivider(0U); -} -__STATIC_INLINE void Cy_SysClk_ClkTimerInit() -{ - Cy_SysClk_ClkTimerDisable(); - Cy_SysClk_ClkTimerSetSource(CY_SYSCLK_CLKTIMER_IN_IMO); - Cy_SysClk_ClkTimerSetDivider(0U); - Cy_SysClk_ClkTimerEnable(); -} -__STATIC_INLINE void Cy_SysClk_WcoInit() -{ - (void)Cy_GPIO_Pin_FastInit(GPIO_PRT0, 0U, 0x00U, 0x00U, HSIOM_SEL_GPIO); - (void)Cy_GPIO_Pin_FastInit(GPIO_PRT0, 1U, 0x00U, 0x00U, HSIOM_SEL_GPIO); - if (CY_SYSCLK_SUCCESS != Cy_SysClk_WcoEnable(1000000UL)) - { - cycfg_ClockStartupError(CY_CFG_SYSCLK_WCO_ERROR); - } -} - - -void init_cycfg_system(void) -{ - /* Set worst case memory wait states (! ultra low power, 150 MHz), will update at the end */ - Cy_SysLib_SetWaitStates(false, 150UL); - #ifdef CY_CFG_PWR_ENABLED - #ifdef CY_CFG_PWR_INIT - init_cycfg_power(); - #else - #warning Power system will not be configured. Update power personality to v1.20 or later. - #endif /* CY_CFG_PWR_INIT */ - #endif /* CY_CFG_PWR_ENABLED */ - - /* Reset the core clock path to default and disable all the FLLs/PLLs */ - Cy_SysClk_ClkHfSetDivider(0U, CY_SYSCLK_CLKHF_NO_DIVIDE); - Cy_SysClk_ClkFastSetDivider(0U); - Cy_SysClk_ClkPeriSetDivider(1U); - Cy_SysClk_ClkSlowSetDivider(0U); - for (uint32_t pll = CY_SRSS_NUM_PLL; pll > 0UL; --pll) /* PLL 1 is the first PLL. 0 is invalid. */ - { - (void)Cy_SysClk_PllDisable(pll); - } - Cy_SysClk_ClkPathSetSource(CY_SYSCLK_CLKHF_IN_CLKPATH1, CY_SYSCLK_CLKPATH_IN_IMO); - - if ((CY_SYSCLK_CLKHF_IN_CLKPATH0 == Cy_SysClk_ClkHfGetSource(0UL)) && - (CY_SYSCLK_CLKPATH_IN_WCO == Cy_SysClk_ClkPathGetSource(CY_SYSCLK_CLKHF_IN_CLKPATH0))) - { - Cy_SysClk_ClkHfSetSource(0U, CY_SYSCLK_CLKHF_IN_CLKPATH1); - } - - Cy_SysClk_FllDisable(); - Cy_SysClk_ClkPathSetSource(CY_SYSCLK_CLKHF_IN_CLKPATH0, CY_SYSCLK_CLKPATH_IN_IMO); - Cy_SysClk_ClkHfSetSource(0UL, CY_SYSCLK_CLKHF_IN_CLKPATH0); - #ifdef CY_IP_MXBLESS - (void)Cy_BLE_EcoReset(); - #endif - - - /* Enable all source clocks */ - #ifdef CY_CFG_SYSCLK_PILO_ENABLED - Cy_SysClk_PiloInit(); - #endif - - #ifdef CY_CFG_SYSCLK_WCO_ENABLED - Cy_SysClk_WcoInit(); - #endif - - #ifdef CY_CFG_SYSCLK_CLKLF_ENABLED - Cy_SysClk_ClkLfInit(); - #endif - - #ifdef CY_CFG_SYSCLK_ALTHF_ENABLED - Cy_SysClk_AltHfInit(); - #endif - - #ifdef CY_CFG_SYSCLK_ECO_ENABLED - Cy_SysClk_EcoInit(); - #endif - - #ifdef CY_CFG_SYSCLK_EXTCLK_ENABLED - Cy_SysClk_ExtClkInit(); - #endif - - /* Configure CPU clock dividers */ - #ifdef CY_CFG_SYSCLK_CLKFAST_ENABLED - Cy_SysClk_ClkFastInit(); - #endif - - #ifdef CY_CFG_SYSCLK_CLKPERI_ENABLED - Cy_SysClk_ClkPeriInit(); - #endif - - #ifdef CY_CFG_SYSCLK_CLKSLOW_ENABLED - Cy_SysClk_ClkSlowInit(); - #endif - - #if ((CY_CFG_SYSCLK_CLKPATH0_SOURCE == CY_SYSCLK_CLKPATH_IN_WCO) && (CY_CFG_SYSCLK_CLKHF0_CLKPATH == CY_SYSCLK_CLKHF_IN_CLKPATH0)) - /* Configure HFCLK0 to temporarily run from IMO to initialize other clocks */ - Cy_SysClk_ClkPathSetSource(1UL, CY_SYSCLK_CLKPATH_IN_IMO); - Cy_SysClk_ClkHfSetSource(0UL, CY_SYSCLK_CLKHF_IN_CLKPATH1); - #else - #ifdef CY_CFG_SYSCLK_CLKPATH1_ENABLED - Cy_SysClk_ClkPath1Init(); - #endif - #endif - - /* Configure Path Clocks */ - #ifdef CY_CFG_SYSCLK_CLKPATH0_ENABLED - Cy_SysClk_ClkPath0Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH2_ENABLED - Cy_SysClk_ClkPath2Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH3_ENABLED - Cy_SysClk_ClkPath3Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH4_ENABLED - Cy_SysClk_ClkPath4Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH5_ENABLED - Cy_SysClk_ClkPath5Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH6_ENABLED - Cy_SysClk_ClkPath6Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH7_ENABLED - Cy_SysClk_ClkPath7Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH8_ENABLED - Cy_SysClk_ClkPath8Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH9_ENABLED - Cy_SysClk_ClkPath9Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH10_ENABLED - Cy_SysClk_ClkPath10Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH11_ENABLED - Cy_SysClk_ClkPath11Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH12_ENABLED - Cy_SysClk_ClkPath12Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH13_ENABLED - Cy_SysClk_ClkPath13Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH14_ENABLED - Cy_SysClk_ClkPath14Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKPATH15_ENABLED - Cy_SysClk_ClkPath15Init(); - #endif - - /* Configure and enable FLL */ - #ifdef CY_CFG_SYSCLK_FLL_ENABLED - Cy_SysClk_FllInit(); - #endif - - Cy_SysClk_ClkHf0Init(); - - #if ((CY_CFG_SYSCLK_CLKPATH0_SOURCE == CY_SYSCLK_CLKPATH_IN_WCO) && (CY_CFG_SYSCLK_CLKHF0_CLKPATH == CY_SYSCLK_CLKHF_IN_CLKPATH0)) - #ifdef CY_CFG_SYSCLK_CLKPATH1_ENABLED - /* Apply the ClkPath1 user setting */ - Cy_SysClk_ClkPath1Init(); - #endif - #endif - - /* Configure and enable PLLs */ - #ifdef CY_CFG_SYSCLK_PLL0_ENABLED - Cy_SysClk_Pll0Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL1_ENABLED - Cy_SysClk_Pll1Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL2_ENABLED - Cy_SysClk_Pll2Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL3_ENABLED - Cy_SysClk_Pll3Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL4_ENABLED - Cy_SysClk_Pll4Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL5_ENABLED - Cy_SysClk_Pll5Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL6_ENABLED - Cy_SysClk_Pll6Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL7_ENABLED - Cy_SysClk_Pll7Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL8_ENABLED - Cy_SysClk_Pll8Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL9_ENABLED - Cy_SysClk_Pll9Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL10_ENABLED - Cy_SysClk_Pll10Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL11_ENABLED - Cy_SysClk_Pll11Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL12_ENABLED - Cy_SysClk_Pll12Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL13_ENABLED - Cy_SysClk_Pll13Init(); - #endif - #ifdef CY_CFG_SYSCLK_PLL14_ENABLED - Cy_SysClk_Pll14Init(); - #endif - - /* Configure HF clocks */ - #ifdef CY_CFG_SYSCLK_CLKHF1_ENABLED - Cy_SysClk_ClkHf1Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF2_ENABLED - Cy_SysClk_ClkHf2Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF3_ENABLED - Cy_SysClk_ClkHf3Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF4_ENABLED - Cy_SysClk_ClkHf4Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF5_ENABLED - Cy_SysClk_ClkHf5Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF6_ENABLED - Cy_SysClk_ClkHf6Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF7_ENABLED - Cy_SysClk_ClkHf7Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF8_ENABLED - Cy_SysClk_ClkHf8Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF9_ENABLED - Cy_SysClk_ClkHf9Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF10_ENABLED - Cy_SysClk_ClkHf10Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF11_ENABLED - Cy_SysClk_ClkHf11Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF12_ENABLED - Cy_SysClk_ClkHf12Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF13_ENABLED - Cy_SysClk_ClkHf13Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF14_ENABLED - Cy_SysClk_ClkHf14Init(); - #endif - #ifdef CY_CFG_SYSCLK_CLKHF15_ENABLED - Cy_SysClk_ClkHf15Init(); - #endif - - /* Configure miscellaneous clocks */ - #ifdef CY_CFG_SYSCLK_CLKTIMER_ENABLED - Cy_SysClk_ClkTimerInit(); - #endif - - #ifdef CY_CFG_SYSCLK_CLKALTSYSTICK_ENABLED - Cy_SysClk_ClkAltSysTickInit(); - #endif - - #ifdef CY_CFG_SYSCLK_CLKPUMP_ENABLED - Cy_SysClk_ClkPumpInit(); - #endif - - #ifdef CY_CFG_SYSCLK_CLKBAK_ENABLED - Cy_SysClk_ClkBakInit(); - #endif - - /* Configure default enabled clocks */ - #ifdef CY_CFG_SYSCLK_ILO_ENABLED - Cy_SysClk_IloInit(); - #else - Cy_SysClk_IloDisable(); - #endif - - #ifndef CY_CFG_SYSCLK_IMO_ENABLED - #error the IMO must be enabled for proper chip operation - #endif - - #ifdef CY_CFG_SYSCLK_MFO_ENABLED - Cy_SysClk_MfoInit(); - #endif - - #ifdef CY_CFG_SYSCLK_CLKMF_ENABLED - Cy_SysClk_ClkMfInit(); - #endif - - /* Set accurate flash wait states */ - #if (defined (CY_CFG_PWR_ENABLED) && defined (CY_CFG_SYSCLK_CLKHF0_ENABLED)) - Cy_SysLib_SetWaitStates(CY_CFG_PWR_USING_ULP != 0, CY_CFG_SYSCLK_CLKHF0_FREQ_MHZ); - #endif - - /* Update System Core Clock values for correct Cy_SysLib_Delay functioning */ - SystemCoreClockUpdate(); - -#if defined (CY_USING_HAL) - cyhal_hwmgr_reserve(&srss_0_clock_0_pathmux_0_obj); -#endif //defined (CY_USING_HAL) - -#if defined (CY_USING_HAL) - cyhal_hwmgr_reserve(&srss_0_clock_0_pathmux_1_obj); -#endif //defined (CY_USING_HAL) - -#if defined (CY_USING_HAL) - cyhal_hwmgr_reserve(&srss_0_clock_0_pathmux_2_obj); -#endif //defined (CY_USING_HAL) -} diff --git a/mcuboot/boot/cypress/platforms/cycfg_system.h b/mcuboot/boot/cypress/platforms/cycfg_system.h deleted file mode 100644 index 581aedac0..000000000 --- a/mcuboot/boot/cypress/platforms/cycfg_system.h +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************************************************* -* File Name: cycfg_system.h -* -* Description: -* System configuration -* This file was automatically generated and should not be modified. -* Device Configurator: 2.0.0.1483 -* Device Support Library (../../../../output/libs/COMPONENT_PSOC6/psoc6pdl): 1.5.0.1837 -* -******************************************************************************** -* Copyright 2017-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. -********************************************************************************/ - -#if !defined(CYCFG_SYSTEM_H) -#define CYCFG_SYSTEM_H - -#include "cy_sysclk.h" -#include "cy_systick.h" -#if defined (CY_USING_HAL) - #include "cyhal_hwmgr.h" -#endif //defined (CY_USING_HAL) -#include "cy_gpio.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -#define cpuss_0_dap_0_ENABLED 1U -#define srss_0_clock_0_ENABLED 1U -#define srss_0_clock_0_altsystickclk_0_ENABLED 1U -#define srss_0_clock_0_bakclk_0_ENABLED 1U -#define srss_0_clock_0_fastclk_0_ENABLED 1U -#define srss_0_clock_0_fll_0_ENABLED 1U -#define srss_0_clock_0_hfclk_0_ENABLED 1U -#define CY_CFG_SYSCLK_CLKHF0 0UL -#define srss_0_clock_0_hfclk_2_ENABLED 1U -#define CY_CFG_SYSCLK_CLKHF2 2UL -#define srss_0_clock_0_hfclk_3_ENABLED 1U -#define CY_CFG_SYSCLK_CLKHF3 3UL -#define srss_0_clock_0_hfclk_4_ENABLED 1U -#define CY_CFG_SYSCLK_CLKHF4 4UL -#define srss_0_clock_0_ilo_0_ENABLED 1U -#define srss_0_clock_0_imo_0_ENABLED 1U -#define srss_0_clock_0_lfclk_0_ENABLED 1U -#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32768 -#define srss_0_clock_0_pathmux_0_ENABLED 1U -#define srss_0_clock_0_pathmux_1_ENABLED 1U -#define srss_0_clock_0_pathmux_2_ENABLED 1U -#define srss_0_clock_0_periclk_0_ENABLED 1U -#define srss_0_clock_0_pll_0_ENABLED 1U -#define srss_0_clock_0_pll_1_ENABLED 1U -#define srss_0_clock_0_slowclk_0_ENABLED 1U -#define srss_0_clock_0_timerclk_0_ENABLED 1U -#define srss_0_clock_0_wco_0_ENABLED 1U - -#if defined (CY_USING_HAL) - extern const cyhal_resource_inst_t srss_0_clock_0_pathmux_0_obj; -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - extern const cyhal_resource_inst_t srss_0_clock_0_pathmux_1_obj; -#endif //defined (CY_USING_HAL) -#if defined (CY_USING_HAL) - extern const cyhal_resource_inst_t srss_0_clock_0_pathmux_2_obj; -#endif //defined (CY_USING_HAL) - -void init_cycfg_system(void); - -#if defined(__cplusplus) -} -#endif - - -#endif /* CYCFG_SYSTEM_H */ diff --git a/mcuboot/boot/cypress/platforms/system_psoc6.h b/mcuboot/boot/cypress/platforms/system_psoc6.h deleted file mode 100644 index ee2bb386f..000000000 --- a/mcuboot/boot/cypress/platforms/system_psoc6.h +++ /dev/null @@ -1,657 +0,0 @@ -/***************************************************************************//** -* \file system_psoc6.h -* \version 2.70 -* -* \brief Device system header 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. -*******************************************************************************/ - - -#ifndef _SYSTEM_PSOC6_H_ -#define _SYSTEM_PSOC6_H_ - -/** -* \addtogroup group_system_config -* \{ -* Provides device startup, system configuration, and linker script files. -* The system startup provides the followings features: -* - See \ref group_system_config_device_initialization for the: -* * \ref group_system_config_dual_core_device_initialization -* * \ref group_system_config_single_core_device_initialization -* - \ref group_system_config_device_memory_definition -* - \ref group_system_config_heap_stack_config -* - \ref group_system_config_merge_apps -* - \ref group_system_config_default_handlers -* - \ref group_system_config_device_vector_table -* - \ref group_system_config_cm4_functions -* -* \section group_system_config_configuration Configuration Considerations -* -* \subsection group_system_config_device_memory_definition Device Memory Definition -* The flash and RAM allocation for each CPU is defined by the linker scripts. -* For dual-core devices, the physical flash and RAM memory is shared between the CPU cores. -* 2 KB of RAM (allocated at the end of RAM) are reserved for system use. -* For Single-Core devices the system reserves additional 80 bytes of RAM. -* Using the reserved memory area for other purposes will lead to unexpected behavior. -* -* \note The linker files provided with the PDL are 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. To eliminate build -* warnings in your project, you can simply comment out or remove the relevant -* code in the linker file. -* -* ARM GCC\n -* The flash and RAM sections for the CPU are defined in the linker files: -* 'xx_yy.ld', where 'xx' is the device group, and 'yy' is the target CPU; for example, -* 'cy8c6xx7_cm0plus.ld' and 'cy8c6xx7_cm4_dual.ld'. -* \note If the start of the Cortex-M4 application image is changed, the value -* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The -* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the -* Cy_SysEnableCM4() function call. -* -* Change the flash and RAM sizes by editing the macros value in the -* linker files for both CPUs: -* - 'xx_cm0plus.ld', where 'xx' is the device group: -* \code -* flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x00080000 -* ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x00024000 -* \endcode -* - 'xx_cm4_dual.ld', where 'xx' is the device group: -* \code -* flash (rx) : ORIGIN = 0x10080000, LENGTH = 0x00080000 -* ram (rwx) : ORIGIN = 0x08024000, LENGTH = 0x00023800 -* \endcode -* -* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the rom ORIGIN's -* value in the 'xx_cm4_dual.ld' file, where 'xx' is the device group. Do this -* by either: -* - Passing the following commands to the compiler:\n -* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode -* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where 'xx' is device family:\n -* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode -* -* ARM MDK\n -* The flash and RAM sections for the CPU are defined in the linker files: -* 'xx_yy.scat', where 'xx' is the device group, and 'yy' is the target CPU; for example, -* 'cy8c6xx7_cm0plus.scat' and 'cy8c6xx7_cm4_dual.scat'. -* \note If the start of the Cortex-M4 application image is changed, the value -* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The -* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref -* Cy_SysEnableCM4() function call. -* -* \note The linker files provided with the PDL are 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 the warnings during the build process: -* L6314W (no section matches pattern) and/or L6329W -* (pattern only matches removed unused sections). In your project, you can -* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to -* the linker. You can also comment out or remove the relevant code in the linker -* file. -* -* Change the flash and RAM sizes by editing the macros value in the -* linker files for both CPUs: -* - 'xx_cm0plus.scat', where 'xx' is the device group: -* \code -* #define FLASH_START 0x10000000 -* #define FLASH_SIZE 0x00080000 -* #define RAM_START 0x08000000 -* #define RAM_SIZE 0x00024000 -* \endcode -* - 'xx_cm4_dual.scat', where 'xx' is the device group: -* \code -* #define FLASH_START 0x10080000 -* #define FLASH_SIZE 0x00080000 -* #define RAM_START 0x08024000 -* #define RAM_SIZE 0x00023800 -* \endcode -* -* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the FLASH_START -* value in the 'xx_cm4_dual.scat' file, -* where 'xx' is the device group. Do this by either: -* - Passing the following commands to the compiler:\n -* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode -* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where -* 'xx' is device family:\n -* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode -* -* IAR\n -* The flash and RAM sections for the CPU are defined in the linker files: -* 'xx_yy.icf', where 'xx' is the device group, and 'yy' is the target CPU; for example, -* 'cy8c6xx7_cm0plus.icf' and 'cy8c6xx7_cm4_dual.icf'. -* \note If the start of the Cortex-M4 application image is changed, the value -* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The -* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref -* Cy_SysEnableCM4() function call. -* -* Change the flash and RAM sizes by editing the macros value in the -* linker files for both CPUs: -* - 'xx_cm0plus.icf', where 'xx' is the device group: -* \code -* define symbol __ICFEDIT_region_IROM1_start__ = 0x10000000; -* define symbol __ICFEDIT_region_IROM1_end__ = 0x10080000; -* define symbol __ICFEDIT_region_IRAM1_start__ = 0x08000000; -* define symbol __ICFEDIT_region_IRAM1_end__ = 0x08024000; -* \endcode -* - 'xx_cm4_dual.icf', where 'xx' is the device group: -* \code -* define symbol __ICFEDIT_region_IROM1_start__ = 0x10080000; -* define symbol __ICFEDIT_region_IROM1_end__ = 0x10100000; -* define symbol __ICFEDIT_region_IRAM1_start__ = 0x08024000; -* define symbol __ICFEDIT_region_IRAM1_end__ = 0x08047800; -* \endcode -* -* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the -* __ICFEDIT_region_IROM1_start__ value in the 'xx_cm4_dual.icf' file, where 'xx' -* is the device group. Do this by either: -* - Passing the following commands to the compiler:\n -* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode -* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where -* 'xx' is device family:\n -* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode -* -* \subsection group_system_config_device_initialization Device Initialization -* After a power-on-reset (POR), the boot process is handled by the boot code -* from the on-chip ROM that is always executed by the Cortex-M0+ core. The boot -* code passes the control to the Cortex-M0+ startup code located in flash. -* -* \subsubsection group_system_config_dual_core_device_initialization Dual-Core Devices -* The Cortex-M0+ startup code performs the device initialization by a call to -* SystemInit() and then calls the main() function. The Cortex-M4 core is disabled -* by default. Enable the core using the \ref Cy_SysEnableCM4() function. -* See \ref group_system_config_cm4_functions for more details. -* \note Startup code executes SystemInit() function for the both Cortex-M0+ and Cortex-M4 cores. -* The function has a separate implementation on each core. -* Both function implementations unlock and disable the WDT. -* Therefore enable the WDT after both cores have been initialized. -* -* \subsubsection group_system_config_single_core_device_initialization Single-Core Devices -* The Cortex-M0+ core is not user-accessible on these devices. In this case the -* Flash Boot handles setup of the CM0+ core and starts the Cortex-M4 core. -* -* \subsection group_system_config_heap_stack_config Heap and Stack Configuration -* There are two ways to adjust heap and stack configurations: -* -# Editing source code files -* -# Specifying via command line -* -* By default, the stack size is set to 0x00001000 and the heap size is set to 0x00000400. -* -* \subsubsection group_system_config_heap_stack_config_gcc ARM GCC -* - Editing source code files\n -* The heap and stack sizes are defined in the assembler startup files -* (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S). -* Change the heap and stack sizes by modifying the following lines:\n -* \code .equ Stack_Size, 0x00001000 \endcode -* \code .equ Heap_Size, 0x00000400 \endcode -* -* - Specifying via command line\n -* Change the heap and stack sizes passing the following commands to the compiler:\n -* \code -D __STACK_SIZE=0x000000400 \endcode -* \code -D __HEAP_SIZE=0x000000100 \endcode -* -* \subsubsection group_system_config_heap_stack_config_mdk ARM MDK -* - Editing source code files\n -* The heap and stack sizes are defined in the assembler startup files -* (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). -* Change the heap and stack sizes by modifying the following lines:\n -* \code Stack_Size EQU 0x00001000 \endcode -* \code Heap_Size EQU 0x00000400 \endcode -* -* - Specifying via command line\n -* Change the heap and stack sizes passing the following commands to the assembler:\n -* \code "--predefine=___STACK_SIZE SETA 0x000000400" \endcode -* \code "--predefine=__HEAP_SIZE SETA 0x000000100" \endcode -* -* \subsubsection group_system_config_heap_stack_config_iar IAR -* - Editing source code files\n -* The heap and stack sizes are defined in the linker scatter files: 'xx_yy.icf', -* where 'xx' is the device family, and 'yy' is the target CPU; for example, -* cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf. -* Change the heap and stack sizes by modifying the following lines:\n -* \code Stack_Size EQU 0x00001000 \endcode -* \code Heap_Size EQU 0x00000400 \endcode -* -* - Specifying via command line\n -* Change the heap and stack sizes passing the following commands to the -* linker (including quotation marks):\n -* \code --define_symbol __STACK_SIZE=0x000000400 \endcode -* \code --define_symbol __HEAP_SIZE=0x000000100 \endcode -* -* \subsection group_system_config_merge_apps Merging CM0+ and CM4 Executables -* The CM0+ project and linker script build the CM0+ application image. Similarly, -* the CM4 linker script builds the CM4 application image. Each specifies -* locations, sizes, and contents of sections in memory. See -* \ref group_system_config_device_memory_definition for the symbols and default -* values. -* -* The cymcuelftool is invoked by a post-build command. The precise project -* setting is IDE-specific. -* -* The cymcuelftool combines the two executables. The tool examines the -* executables to ensure that memory regions either do not overlap, or contain -* identical bytes (shared). If there are no problems, it creates a new ELF file -* with the merged image, without changing any of the addresses or data. -* -* \subsection group_system_config_default_handlers Default Interrupt Handlers Definition -* The default interrupt handler functions are defined as weak functions to a dummy -* handler in the startup file. The naming convention for the interrupt handler names -* is \_IRQHandler. A default interrupt handler can be overwritten in -* user code by defining the handler function using the same name. For example: -* \code -* void scb_0_interrupt_IRQHandler(void) -*{ -* ... -*} -* \endcode -* -* \subsection group_system_config_device_vector_table Vectors Table Copy from Flash to RAM -* This process uses memory sections defined in the linker script. The startup -* code actually defines the contents of the vector table and performs the copy. -* \subsubsection group_system_config_device_vector_table_gcc ARM GCC -* The linker script file is 'xx_yy.ld', where 'xx' is the device family, and -* 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.ld and cy8c6xx7_cm4_dual.ld. -* It defines sections and locations in memory.\n -* Copy interrupt vectors from flash to RAM: \n -* From: \code LONG (__Vectors) \endcode -* To: \code LONG (__ram_vectors_start__) \endcode -* Size: \code LONG (__Vectors_End - __Vectors) \endcode -* The vector table address (and the vector table itself) are defined in the -* assembler startup files (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S). -* The code in these files copies the vector table from Flash to RAM. -* \subsubsection group_system_config_device_vector_table_mdk ARM MDK -* The linker script file is 'xx_yy.scat', where 'xx' is the device family, -* and 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.scat and -* cy8c6xx7_cm4_dual.scat. The linker script specifies that the vector table -* (RESET_RAM) shall be first in the RAM section.\n -* RESET_RAM represents the vector table. It is defined in the assembler startup -* files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). -* The code in these files copies the vector table from Flash to RAM. -* -* \subsubsection group_system_config_device_vector_table_iar IAR -* The linker script file is 'xx_yy.icf', where 'xx' is the device family, and -* 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf. -* This file defines the .intvec_ram section and its location. -* \code place at start of IRAM1_region { readwrite section .intvec_ram}; \endcode -* The vector table address (and the vector table itself) are defined in the -* assembler startup files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). -* The code in these files copies the vector table from Flash to RAM. -* -* \section group_system_config_more_information More Information -* Refer to the PDL User Guide for the -* more details. -* -* \section group_system_config_MISRA MISRA Compliance -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
2.3RThe character sequence // shall not be used within a comment.The comments provide a useful WEB link to the documentation.
-* -* \section group_system_config_changelog Changelog -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
VersionChangesReason for Change
2.70Updated \ref SystemCoreClockUpdate() implementation - The SysClk API is reused.Code optimization.
Updated \ref SystemInit() implementation - The IPC7 structure is initialized for both cores.Provided support for SysPM driver updates.
Updated the linker scripts.Reserved FLASH area for the MCU boot headers.
Added System Pipe initialization for all devices. Improved PDL usability according to user experience.
2.60Updated linker scripts.Provided support for new devices, updated usage of CM0p prebuilt image.
2.50Updated assembler files, C files, linker scripts.Dynamic allocated HEAP size for Arm Compiler 6, IAR 8.
2.40Updated assembler files, C files, linker scripts.Added Arm Compiler 6 support.
2.30Added assembler files, linker scripts for Mbed OS.Added Arm Mbed OS embedded operating system support.
Updated linker scripts to extend the Flash and Ram memories size available for the CM4 core.Enhanced PDL usability.
2.20Moved the Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit() functions implementation from IPC to Startup.Changed the IPC driver configuration method from compile time to run time.
2.10Added constructor attribute to SystemInit() function declaration for ARM MDK compiler. \n -* Removed $Sub$$main symbol for ARM MDK compiler. -* uVision Debugger support.
Updated description of the Startup behavior for Single-Core Devices. \n -* Added note about WDT disabling by SystemInit() function. -* Documentation improvement.
2.0Added restoring of FLL registers to the default state in SystemInit() API for single core devices. -* Single core device support. -*
Added Normal Access Restrictions, Public Key, TOC part2 and TOC part2 copy to Supervisory flash linker memory regions. \n -* Renamed 'wflash' memory region to 'em_eeprom'. -* Linker scripts usability improvement.
Added Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit(), Cy_Flash_Init() functions call to SystemInit() API.Reserved system resources for internal operations.
Added clearing and releasing of IPC structure #7 (reserved for the Deep-Sleep operations) to SystemInit() API.To avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering.
1.0Initial version
-* -* -* \defgroup group_system_config_macro Macro -* \{ -* \defgroup group_system_config_system_macro System -* \defgroup group_system_config_cm4_status_macro Cortex-M4 Status -* \defgroup group_system_config_user_settings_macro User Settings -* \} -* \defgroup group_system_config_functions Functions -* \{ -* \defgroup group_system_config_system_functions System -* \defgroup group_system_config_cm4_functions Cortex-M4 Control -* \} -* \defgroup group_system_config_globals Global Variables -* -* \} -*/ - -/** -* \addtogroup group_system_config_system_functions -* \{ -* \details -* The following system functions implement CMSIS Core functions. -* Refer to the [CMSIS documentation] -* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") -* for more details. -* \} -*/ - -#ifdef __cplusplus -extern "C" { -#endif - - -/******************************************************************************* -* Include files -*******************************************************************************/ -#include - - -/******************************************************************************* -* Global preprocessor symbols/macros ('define') -*******************************************************************************/ -#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ - (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \ - (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3))) - #define CY_SYSTEM_CPU_CM0P 1UL -#else - #define CY_SYSTEM_CPU_CM0P 0UL -#endif - - -/******************************************************************************* -* -* START OF USER SETTINGS HERE -* =========================== -* -* All lines with '<<<' can be set by user. -* -*******************************************************************************/ - -/** -* \addtogroup group_system_config_user_settings_macro -* \{ -*/ - - -/***************************************************************************//** -* \brief Start address of the Cortex-M4 application ([address]UL) -* (USER SETTING) -*******************************************************************************/ -#if !defined (CY_CORTEX_M4_APPL_ADDR) - #define CY_CORTEX_M4_APPL_ADDR (CY_FLASH_BASE + 0x2000U) /* <<< 8 kB of flash is reserved for the Cortex-M0+ application */ -#endif /* (CY_CORTEX_M4_APPL_ADDR) */ - - -/***************************************************************************//** -* \brief IPC Semaphores allocation ([value]UL). -* (USER SETTING) -*******************************************************************************/ -#define CY_IPC_SEMA_COUNT (128UL) /* <<< This will allow 128 (4*32) semaphores */ - - -/***************************************************************************//** -* \brief IPC Pipe definitions ([value]UL). -* (USER SETTING) -*******************************************************************************/ -#define CY_IPC_MAX_ENDPOINTS (8UL) /* <<< 8 endpoints */ - - -/******************************************************************************* -* -* END OF USER SETTINGS HERE -* ========================= -* -*******************************************************************************/ - -/** \} group_system_config_user_settings_macro */ - - -/** -* \addtogroup group_system_config_system_macro -* \{ -*/ - -#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) - /** The Cortex-M0+ startup driver identifier */ - #define CY_STARTUP_M0P_ID ((uint32_t)((uint32_t)((0x0EU) & 0x3FFFU) << 18U)) -#endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */ - -#if (CY_SYSTEM_CPU_CM0P != 1UL) || defined(CY_DOXYGEN) - /** The Cortex-M4 startup driver identifier */ - #define CY_STARTUP_M4_ID ((uint32_t)((uint32_t)((0x0FU) & 0x3FFFU) << 18U)) -#endif /* (CY_SYSTEM_CPU_CM0P != 1UL) */ - -/** \} group_system_config_system_macro */ - - -/** -* \addtogroup group_system_config_system_functions -* \{ -*/ -#if defined(__ARMCC_VERSION) - extern void SystemInit(void) __attribute__((constructor)); -#else - extern void SystemInit(void); -#endif /* (__ARMCC_VERSION) */ - -extern void SystemCoreClockUpdate(void); -/** \} group_system_config_system_functions */ - - -/** -* \addtogroup group_system_config_cm4_functions -* \{ -*/ -extern uint32_t Cy_SysGetCM4Status(void); -extern void Cy_SysEnableCM4(uint32_t vectorTableOffset); -extern void Cy_SysDisableCM4(void); -extern void Cy_SysRetainCM4(void); -extern void Cy_SysResetCM4(void); -/** \} group_system_config_cm4_functions */ - - -/** \cond */ -extern void Default_Handler (void); - -void Cy_SysIpcPipeIsrCm0(void); -void Cy_SysIpcPipeIsrCm4(void); - -extern void Cy_SystemInit(void); -extern void Cy_SystemInitFpuEnable(void); - -extern uint32_t cy_delayFreqKhz; -extern uint8_t cy_delayFreqMhz; -extern uint32_t cy_delay32kMs; -/** \endcond */ - - -#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) -/** -* \addtogroup group_system_config_cm4_status_macro -* \{ -*/ -#define CY_SYS_CM4_STATUS_ENABLED (3U) /**< The Cortex-M4 core is enabled: power on, clock on, no isolate, no reset and no retain. */ -#define CY_SYS_CM4_STATUS_DISABLED (0U) /**< The Cortex-M4 core is disabled: power off, clock off, isolate, reset and no retain. */ -#define CY_SYS_CM4_STATUS_RETAINED (2U) /**< The Cortex-M4 core is retained. power off, clock off, isolate, no reset and retain. */ -#define CY_SYS_CM4_STATUS_RESET (1U) /**< The Cortex-M4 core is in the Reset mode: clock off, no isolated, no retain and reset. */ -/** \} group_system_config_cm4_status_macro */ - -#endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */ - - -/******************************************************************************* -* IPC Configuration -* ========================= -*******************************************************************************/ -/* IPC CY_PIPE default configuration */ -#define CY_SYS_CYPIPE_CLIENT_CNT (8UL) - -#define CY_SYS_INTR_CYPIPE_MUX_EP0 (1UL) /* IPC CYPRESS PIPE */ -#define CY_SYS_INTR_CYPIPE_PRIOR_EP0 (1UL) /* Notifier Priority */ -#define CY_SYS_INTR_CYPIPE_PRIOR_EP1 (1UL) /* Notifier Priority */ - -#define CY_SYS_CYPIPE_CHAN_MASK_EP0 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP0) -#define CY_SYS_CYPIPE_CHAN_MASK_EP1 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP1) - - -/******************************************************************************/ -/* - * The System pipe configuration defines the IPC channel number, interrupt - * number, and the pipe interrupt mask for the endpoint. - * - * The format of the endPoint configuration - * Bits[31:16] Interrupt Mask - * Bits[15:8 ] IPC interrupt - * Bits[ 7:0 ] IPC channel - */ - -/* System Pipe addresses */ -/* CyPipe defines */ - -#define CY_SYS_CYPIPE_INTR_MASK ( CY_SYS_CYPIPE_CHAN_MASK_EP0 | CY_SYS_CYPIPE_CHAN_MASK_EP1 ) - -#define CY_SYS_CYPIPE_CONFIG_EP0 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ - | (CY_IPC_INTR_CYPIPE_EP0 << CY_IPC_PIPE_CFG_INTR_Pos) \ - | CY_IPC_CHAN_CYPIPE_EP0) -#define CY_SYS_CYPIPE_CONFIG_EP1 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ - | (CY_IPC_INTR_CYPIPE_EP1 << CY_IPC_PIPE_CFG_INTR_Pos) \ - | CY_IPC_CHAN_CYPIPE_EP1) - -/******************************************************************************/ - - -/** \addtogroup group_system_config_globals -* \{ -*/ - -extern uint32_t SystemCoreClock; -extern uint32_t cy_BleEcoClockFreqHz; -extern uint32_t cy_Hfclk0FreqHz; -extern uint32_t cy_PeriClkFreqHz; - -/** \} group_system_config_globals */ - - - -/** \cond INTERNAL */ -/******************************************************************************* -* Backward compatibility macros. The following code is DEPRECATED and must -* not be used in new projects -*******************************************************************************/ - -/* BWC defines for functions related to enter/exit critical section */ -#define Cy_SaveIRQ Cy_SysLib_EnterCriticalSection -#define Cy_RestoreIRQ Cy_SysLib_ExitCriticalSection -#define CY_SYS_INTR_CYPIPE_EP0 (CY_IPC_INTR_CYPIPE_EP0) -#define CY_SYS_INTR_CYPIPE_EP1 (CY_IPC_INTR_CYPIPE_EP1) -#define cy_delayFreqHz (SystemCoreClock) - -/** \endcond */ - -#ifdef __cplusplus -} -#endif - -#endif /* _SYSTEM_PSOC6_H_ */ - - -/* [] END OF FILE */ diff --git a/mcuboot/boot/cypress/platforms/system_psoc6_cm0plus.c b/mcuboot/boot/cypress/platforms/system_psoc6_cm0plus.c deleted file mode 100644 index 18cc19756..000000000 --- a/mcuboot/boot/cypress/platforms/system_psoc6_cm0plus.c +++ /dev/null @@ -1,526 +0,0 @@ -/***************************************************************************//** -* \file system_psoc6_cm0plus.c -* \version 2.70 -* -* The device system-source 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. -*******************************************************************************/ - -#include -#include "system_psoc6.h" -#include "cy_device.h" -#include "cy_device_headers.h" -#include "cy_syslib.h" -#include "cy_sysclk.h" -#include "cy_wdt.h" - -#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) - #include "cy_ipc_sema.h" - #include "cy_ipc_pipe.h" - #include "cy_ipc_drv.h" - - #if defined(CY_DEVICE_PSOC6ABLE2) - #include "cy_flash.h" - #endif /* defined(CY_DEVICE_PSOC6ABLE2) */ -#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ - - -/******************************************************************************* -* SystemCoreClockUpdate() -*******************************************************************************/ - -/** Default HFClk frequency in Hz */ -#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT (8000000UL) - -/** Default PeriClk frequency in Hz */ -#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (4000000UL) - -/** Default SlowClk system core frequency in Hz */ -#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (4000000UL) - - -/** -* Holds the SlowClk (Cortex-M0+) or FastClk (Cortex-M4) system core clock, -* which is the system clock frequency supplied to the SysTick timer and the -* processor core clock. -* This variable implements CMSIS Core global variable. -* Refer to the [CMSIS documentation] -* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") -* for more details. -* This variable can be used by debuggers to query the frequency -* of the debug timer or to configure the trace clock speed. -* -* \attention Compilers must be configured to avoid removing this variable in case -* the application program is not using it. Debugging systems require the variable -* to be physically present in memory so that it can be examined to configure the debugger. */ -uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; - -/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ -uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; - -/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ -uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; - -/** Holds the Alternate high frequency clock in Hz. Updated by \ref Cy_BLE_EcoConfigure(). */ -uint32_t cy_BleEcoClockFreqHz = 0UL; - - -/******************************************************************************* -* SystemInit() -*******************************************************************************/ - -/* CLK_FLL_CONFIG default values */ -#define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) -#define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) -#define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) -#define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) - - -/******************************************************************************* -* SystemCoreClockUpdate (void) -*******************************************************************************/ - -/* Do not use these definitions directly in your application */ -#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) -#define CY_DELAY_1K_THRESHOLD (1000u) -#define CY_DELAY_1M_THRESHOLD (1000000u) - -uint32_t cy_delayFreqKhz = CY_SYSLIB_DIV_ROUNDUP(CY_CLK_SYSTEM_FREQ_HZ_DEFAULT, CY_DELAY_1K_THRESHOLD); - -uint8_t cy_delayFreqMhz = (uint8_t)CY_SYSLIB_DIV_ROUNDUP(CY_CLK_SYSTEM_FREQ_HZ_DEFAULT, CY_DELAY_1M_THRESHOLD); - -uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * - CY_SYSLIB_DIV_ROUNDUP(CY_CLK_SYSTEM_FREQ_HZ_DEFAULT, CY_DELAY_1K_THRESHOLD); - - -/******************************************************************************* -* Cy_SysEnableCM4(), Cy_SysRetainCM4(), and Cy_SysResetCM4() -*******************************************************************************/ -#define CY_SYS_CM4_PWR_CTL_KEY_OPEN (0x05FAUL) -#define CY_SYS_CM4_PWR_CTL_KEY_CLOSE (0xFA05UL) -#define CY_SYS_CM4_VECTOR_TABLE_VALID_ADDR (0x000003FFUL) - - -/******************************************************************************* -* Function Name: SystemInit -****************************************************************************//** -* -* Initializes the system: -* - Restores FLL registers to the default state. -* - Unlocks and disables WDT. -* - Calls Cy_PDL_Init() function to define the driver library. -* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. -* - Calls \ref SystemCoreClockUpdate(). -* -*******************************************************************************/ -void SystemInit(void) -{ - Cy_PDL_Init(CY_DEVICE_CFG); - - /* Restore FLL registers to the default state as they are not restored by the ROM code */ - uint32_t copy = SRSS->CLK_FLL_CONFIG; - copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; - SRSS->CLK_FLL_CONFIG = copy; - - copy = SRSS->CLK_ROOT_SELECT[0u]; - copy &= ~SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk; /* Set ROOT_DIV = 0*/ - SRSS->CLK_ROOT_SELECT[0u] = copy; - - SRSS->CLK_FLL_CONFIG = CY_FB_CLK_FLL_CONFIG_VALUE; - SRSS->CLK_FLL_CONFIG2 = CY_FB_CLK_FLL_CONFIG2_VALUE; - SRSS->CLK_FLL_CONFIG3 = CY_FB_CLK_FLL_CONFIG3_VALUE; - SRSS->CLK_FLL_CONFIG4 = CY_FB_CLK_FLL_CONFIG4_VALUE; - - /* Unlock and disable WDT */ - Cy_WDT_Unlock(); - Cy_WDT_Disable(); - - Cy_SystemInit(); - SystemCoreClockUpdate(); - - /* Clear data register of IPC structure #7, reserved for the Deep-Sleep operations. */ - REG_IPC_STRUCT_DATA(CY_IPC_STRUCT_PTR(CY_IPC_CHAN_DDFT)) = 0UL; - - /* Release IPC structure #7 to avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering. */ - REG_IPC_STRUCT_RELEASE(CY_IPC_STRUCT_PTR(CY_IPC_CHAN_DDFT)) = 0UL; - -#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) - /* Allocate and initialize semaphores for the system operations. */ - CY_SECTION(".cy_sharedmem") - static uint32_t ipcSemaArray[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD]; - - (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, CY_IPC_SEMA_COUNT, ipcSemaArray); - - - /******************************************************************************** - * - * Initializes the system pipes. The system pipes are used by BLE and Flash. - * - * If the default startup file is not used, or SystemInit() is not called in your - * project, call the following three functions prior to executing any flash or - * EmEEPROM write or erase operation: - * -# Cy_IPC_Sema_Init() - * -# Cy_IPC_Pipe_Config() - * -# Cy_IPC_Pipe_Init() - * -# Cy_Flash_Init() - * - *******************************************************************************/ - - /* Create an array of endpoint structures */ - static cy_stc_ipc_pipe_ep_t systemIpcPipeEpArray[CY_IPC_MAX_ENDPOINTS]; - - Cy_IPC_Pipe_Config(systemIpcPipeEpArray); - - static cy_ipc_pipe_callback_ptr_t systemIpcPipeSysCbArray[CY_SYS_CYPIPE_CLIENT_CNT]; - - static const cy_stc_ipc_pipe_config_t systemIpcPipeConfigCm0 = - { - /* .ep0ConfigData */ - { - /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP0, - /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP0, - /* .ipcNotifierMuxNumber */ CY_SYS_INTR_CYPIPE_MUX_EP0, - /* .epAddress */ CY_IPC_EP_CYPIPE_CM0_ADDR, - /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP0 - }, - /* .ep1ConfigData */ - { - /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP1, - /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP1, - /* .ipcNotifierMuxNumber */ 0u, - /* .epAddress */ CY_IPC_EP_CYPIPE_CM4_ADDR, - /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP1 - }, - /* .endpointClientsCount */ CY_SYS_CYPIPE_CLIENT_CNT, - /* .endpointsCallbacksArray */ systemIpcPipeSysCbArray, - /* .userPipeIsrHandler */ &Cy_SysIpcPipeIsrCm0 - }; - - Cy_IPC_Pipe_Init(&systemIpcPipeConfigCm0); - -#if defined(CY_DEVICE_PSOC6ABLE2) - Cy_Flash_Init(); -#endif /* defined(CY_DEVICE_PSOC6ABLE2) */ - -#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ -} - - -/******************************************************************************* -* Function Name: Cy_SystemInit -****************************************************************************//** -* -* The function is called during device startup. Once project compiled as part of -* the PSoC Creator project, the Cy_SystemInit() function is generated by the -* PSoC Creator. -* -* The function generated by PSoC Creator performs all of the necessary device -* configuration based on the design settings. This includes settings from the -* Design Wide Resources (DWR) such as Clocks and Pins as well as any component -* configuration that is necessary. -* -*******************************************************************************/ -__WEAK void Cy_SystemInit(void) -{ - /* Empty weak function. The actual implementation to be in the PSoC Creator - * generated strong function. - */ -} - - -/******************************************************************************* -* Function Name: SystemCoreClockUpdate -****************************************************************************//** -* -* Gets core clock frequency and updates \ref SystemCoreClock. -* -* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref -* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). -* -*******************************************************************************/ -void SystemCoreClockUpdate (void) -{ - uint32 locHf0Clock = Cy_SysClk_ClkHfGetFrequency(0UL); - - if (0UL != locHf0Clock) - { - cy_Hfclk0FreqHz = locHf0Clock; - cy_PeriClkFreqHz = locHf0Clock / (1UL + (uint32_t)Cy_SysClk_ClkPeriGetDivider()); - SystemCoreClock = cy_PeriClkFreqHz / (1UL + (uint32_t)Cy_SysClk_ClkSlowGetDivider()); - - /* Sets clock frequency for Delay API */ - cy_delayFreqMhz = (uint8_t)CY_SYSLIB_DIV_ROUNDUP(SystemCoreClock, CY_DELAY_1M_THRESHOLD); - cy_delayFreqKhz = CY_SYSLIB_DIV_ROUNDUP(SystemCoreClock, CY_DELAY_1K_THRESHOLD); - cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; - } -} - - -#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) -/******************************************************************************* -* Function Name: Cy_SysGetCM4Status -****************************************************************************//** -* -* Returns the Cortex-M4 core power mode. -* -* \return \ref group_system_config_cm4_status_macro -* -*******************************************************************************/ -uint32_t Cy_SysGetCM4Status(void) -{ - uint32_t regValue; - - /* Get current power mode */ - regValue = CPUSS->CM4_PWR_CTL & CPUSS_CM4_PWR_CTL_PWR_MODE_Msk; - - return (regValue); -} - - -/******************************************************************************* -* Function Name: Cy_SysEnableCM4 -****************************************************************************//** -* -* Sets vector table base address and enables the Cortex-M4 core. -* -* \note If the CPU is already enabled, it is reset and then enabled. -* -* \param vectorTableOffset The offset of the vector table base address from -* memory address 0x00000000. The offset should be multiple to 1024 bytes. -* -*******************************************************************************/ -void Cy_SysEnableCM4(uint32_t vectorTableOffset) -{ - uint32_t regValue; - uint32_t interruptState; - uint32_t cpuState; - - CY_ASSERT_L2((vectorTableOffset & CY_SYS_CM4_VECTOR_TABLE_VALID_ADDR) == 0UL); - - interruptState = Cy_SysLib_EnterCriticalSection(); - - cpuState = Cy_SysGetCM4Status(); - if (CY_SYS_CM4_STATUS_ENABLED == cpuState) - { - Cy_SysResetCM4(); - } - - CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; - - regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); - regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); - regValue |= CY_SYS_CM4_STATUS_ENABLED; - CPUSS->CM4_PWR_CTL = regValue; - - while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) - { - /* Wait for the power mode to take effect */ - } - - Cy_SysLib_ExitCriticalSection(interruptState); -} - - -/******************************************************************************* -* Function Name: Cy_SysDisableCM4 -****************************************************************************//** -* -* Disables the Cortex-M4 core and waits for the mode to take the effect. -* -* \warning Do not call the function while the Cortex-M4 is executing because -* such a call may corrupt/abort a pending bus-transaction by the CPU and cause -* unexpected behavior in the system including a deadlock. Call the function -* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use -* the \ref group_syspm Power Management (syspm) API to put the CPU into the -* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the -* CPU. -* -*******************************************************************************/ -void Cy_SysDisableCM4(void) -{ - uint32_t interruptState; - uint32_t regValue; - - interruptState = Cy_SysLib_EnterCriticalSection(); - - regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); - regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); - regValue |= CY_SYS_CM4_STATUS_DISABLED; - CPUSS->CM4_PWR_CTL = regValue; - - while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) - { - /* Wait for the power mode to take effect */ - } - - Cy_SysLib_ExitCriticalSection(interruptState); -} - - -/******************************************************************************* -* Function Name: Cy_SysRetainCM4 -****************************************************************************//** -* -* Retains the Cortex-M4 core and exists without waiting for the mode to take -* effect. -* -* \note The retained mode can be entered only from the enabled mode. -* -* \warning Do not call the function while the Cortex-M4 is executing because -* such a call may corrupt/abort a pending bus-transaction by the CPU and cause -* unexpected behavior in the system including a deadlock. Call the function -* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use -* the \ref group_syspm Power Management (syspm) API to put the CPU into the -* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. -* -*******************************************************************************/ -void Cy_SysRetainCM4(void) -{ - uint32_t interruptState; - uint32_t regValue; - - interruptState = Cy_SysLib_EnterCriticalSection(); - - regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); - regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); - regValue |= CY_SYS_CM4_STATUS_RETAINED; - CPUSS->CM4_PWR_CTL = regValue; - - Cy_SysLib_ExitCriticalSection(interruptState); -} - - -/******************************************************************************* -* Function Name: Cy_SysResetCM4 -****************************************************************************//** -* -* Resets the Cortex-M4 core and waits for the mode to take the effect. -* -* \note The reset mode can not be entered from the retained mode. -* -* \warning Do not call the function while the Cortex-M4 is executing because -* such a call may corrupt/abort a pending bus-transaction by the CPU and cause -* unexpected behavior in the system including a deadlock. Call the function -* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use -* the \ref group_syspm Power Management (syspm) API to put the CPU into the -* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. -* -*******************************************************************************/ -void Cy_SysResetCM4(void) -{ - uint32_t interruptState; - uint32_t regValue; - - interruptState = Cy_SysLib_EnterCriticalSection(); - - regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); - regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); - regValue |= CY_SYS_CM4_STATUS_RESET; - CPUSS->CM4_PWR_CTL = regValue; - - while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) - { - /* Wait for the power mode to take effect */ - } - - Cy_SysLib_ExitCriticalSection(interruptState); -} -#endif /* #if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) */ - -#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) -/******************************************************************************* -* Function Name: Cy_SysIpcPipeIsrCm0 -****************************************************************************//** -* -* This is the interrupt service routine for the system pipe. -* -*******************************************************************************/ -void Cy_SysIpcPipeIsrCm0(void) -{ - Cy_IPC_Pipe_ExecuteCallback(CY_IPC_EP_CYPIPE_CM0_ADDR); -} -#endif - - -/******************************************************************************* -* Function Name: Cy_MemorySymbols -****************************************************************************//** -* -* The intention of the function is to declare boundaries of the memories for the -* MDK compilers. For the rest of the supported compilers, this is done using -* linker configuration files. The following symbols used by the cymcuelftool. -* -*******************************************************************************/ -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050) -__asm void Cy_MemorySymbols(void) -{ - /* Flash */ - EXPORT __cy_memory_0_start - EXPORT __cy_memory_0_length - EXPORT __cy_memory_0_row_size - - /* Working Flash */ - EXPORT __cy_memory_1_start - EXPORT __cy_memory_1_length - EXPORT __cy_memory_1_row_size - - /* Supervisory Flash */ - EXPORT __cy_memory_2_start - EXPORT __cy_memory_2_length - EXPORT __cy_memory_2_row_size - - /* XIP */ - EXPORT __cy_memory_3_start - EXPORT __cy_memory_3_length - EXPORT __cy_memory_3_row_size - - /* eFuse */ - EXPORT __cy_memory_4_start - EXPORT __cy_memory_4_length - EXPORT __cy_memory_4_row_size - - /* Flash */ -__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) -__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) -__cy_memory_0_row_size EQU 0x200 - - /* Flash region for EEPROM emulation */ -__cy_memory_1_start EQU __cpp(CY_EM_EEPROM_BASE) -__cy_memory_1_length EQU __cpp(CY_EM_EEPROM_SIZE) -__cy_memory_1_row_size EQU 0x200 - - /* Supervisory Flash */ -__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) -__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) -__cy_memory_2_row_size EQU 0x200 - - /* XIP */ -__cy_memory_3_start EQU __cpp(CY_XIP_BASE) -__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) -__cy_memory_3_row_size EQU 0x200 - - /* eFuse */ -__cy_memory_4_start EQU __cpp(0x90700000) -__cy_memory_4_length EQU __cpp(0x100000) -__cy_memory_4_row_size EQU __cpp(1) -} -#endif /* defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050) */ - - -/* [] END OF FILE */ diff --git a/mcuboot/boot/cypress/platforms/system_psoc6_cm4.c b/mcuboot/boot/cypress/platforms/system_psoc6_cm4.c deleted file mode 100644 index 7800d6b2e..000000000 --- a/mcuboot/boot/cypress/platforms/system_psoc6_cm4.c +++ /dev/null @@ -1,390 +0,0 @@ -/***************************************************************************//** -* \file system_psoc6_cm4.c -* \version 2.70 -* -* The device system-source 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. -*******************************************************************************/ - -#include -#include "system_psoc6.h" -#include "cy_device.h" -#include "cy_device_headers.h" -#include "cy_syslib.h" -#include "cy_sysclk.h" -#include "cy_wdt.h" - -#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) - #include "cy_ipc_sema.h" - #include "cy_ipc_pipe.h" - #include "cy_ipc_drv.h" - - #if defined(CY_DEVICE_PSOC6ABLE2) - #include "cy_flash.h" - #endif /* defined(CY_DEVICE_PSOC6ABLE2) */ -#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ - - -/******************************************************************************* -* SystemCoreClockUpdate() -*******************************************************************************/ - -/** Default HFClk frequency in Hz */ -#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT (8000000UL) - -/** Default PeriClk frequency in Hz */ -#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (4000000UL) - -/** Default FastClk system core frequency in Hz */ -#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (8000000UL) - - -/** -* Holds the SlowClk (Cortex-M0+) or FastClk (Cortex-M4) system core clock, -* which is the system clock frequency supplied to the SysTick timer and the -* processor core clock. -* This variable implements CMSIS Core global variable. -* Refer to the [CMSIS documentation] -* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") -* for more details. -* This variable can be used by debuggers to query the frequency -* of the debug timer or to configure the trace clock speed. -* -* \attention Compilers must be configured to avoid removing this variable in case -* the application program is not using it. Debugging systems require the variable -* to be physically present in memory so that it can be examined to configure the debugger. */ -uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; - -/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ -uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; - -/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ -uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; - -/** Holds the Alternate high frequency clock in Hz. Updated by \ref Cy_BLE_EcoConfigure(). */ -uint32_t cy_BleEcoClockFreqHz = 0UL; - -/* SCB->CPACR */ -#define SCB_CPACR_CP10_CP11_ENABLE (0xFUL << 20u) - - -/******************************************************************************* -* SystemInit() -*******************************************************************************/ - -/* CLK_FLL_CONFIG default values */ -#define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) -#define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) -#define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) -#define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) - -/* IPC_STRUCT7->DATA configuration */ -#define CY_STARTUP_CM0_DP_STATE (0x2uL) -#define CY_STARTUP_IPC7_DP_OFFSET (0x28u) - - -/******************************************************************************* -* SystemCoreClockUpdate (void) -*******************************************************************************/ - -/* Do not use these definitions directly in your application */ -#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) -#define CY_DELAY_1K_THRESHOLD (1000u) -#define CY_DELAY_1M_THRESHOLD (1000000u) - -uint32_t cy_delayFreqKhz = CY_SYSLIB_DIV_ROUNDUP(CY_CLK_SYSTEM_FREQ_HZ_DEFAULT, CY_DELAY_1K_THRESHOLD); - -uint8_t cy_delayFreqMhz = (uint8_t)CY_SYSLIB_DIV_ROUNDUP(CY_CLK_SYSTEM_FREQ_HZ_DEFAULT, CY_DELAY_1M_THRESHOLD); - -uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * - CY_SYSLIB_DIV_ROUNDUP(CY_CLK_SYSTEM_FREQ_HZ_DEFAULT, CY_DELAY_1K_THRESHOLD); - - -/******************************************************************************* -* Function Name: SystemInit -****************************************************************************//** -* \cond -* Initializes the system: -* - Restores FLL registers to the default state for single core devices. -* - Unlocks and disables WDT. -* - Calls Cy_PDL_Init() function to define the driver library. -* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. -* - Calls \ref SystemCoreClockUpdate(). -* \endcond -*******************************************************************************/ -void SystemInit(void) -{ - Cy_PDL_Init(CY_DEVICE_CFG); - -#ifdef __CM0P_PRESENT - #if (__CM0P_PRESENT == 0) - /* Restore FLL registers to the default state as they are not restored by the ROM code */ - uint32_t copy = SRSS->CLK_FLL_CONFIG; - copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; - SRSS->CLK_FLL_CONFIG = copy; - - copy = SRSS->CLK_ROOT_SELECT[0u]; - copy &= ~SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk; /* Set ROOT_DIV = 0*/ - SRSS->CLK_ROOT_SELECT[0u] = copy; - - SRSS->CLK_FLL_CONFIG = CY_FB_CLK_FLL_CONFIG_VALUE; - SRSS->CLK_FLL_CONFIG2 = CY_FB_CLK_FLL_CONFIG2_VALUE; - SRSS->CLK_FLL_CONFIG3 = CY_FB_CLK_FLL_CONFIG3_VALUE; - SRSS->CLK_FLL_CONFIG4 = CY_FB_CLK_FLL_CONFIG4_VALUE; - - /* Unlock and disable WDT */ - Cy_WDT_Unlock(); - Cy_WDT_Disable(); - #endif /* (__CM0P_PRESENT == 0) */ -#endif /* __CM0P_PRESENT */ - - Cy_SystemInit(); - SystemCoreClockUpdate(); - -#ifdef __CM0P_PRESENT - #if (__CM0P_PRESENT == 0) - /* Configure data register (as CM0p in deep sleep state) of IPC structure #7, reserved for the Deep-Sleep operations. */ - REG_IPC_STRUCT_DATA(CY_IPC_STRUCT_PTR(CY_IPC_CHAN_DDFT)) = (CY_STARTUP_CM0_DP_STATE << - CY_STARTUP_IPC7_DP_OFFSET); - - /* Release IPC structure #7 to avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering. */ - REG_IPC_STRUCT_RELEASE(CY_IPC_STRUCT_PTR(CY_IPC_CHAN_DDFT)) = 0UL; - #endif /* (__CM0P_PRESENT == 0) */ -#endif /* __CM0P_PRESENT */ - -#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) - -#ifdef __CM0P_PRESENT - #if (__CM0P_PRESENT == 0) - /* Allocate and initialize semaphores for the system operations. */ - static uint32_t ipcSemaArray[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD]; - (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, CY_IPC_SEMA_COUNT, ipcSemaArray); - #else - (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, 0ul, NULL); - #endif /* (__CM0P_PRESENT) */ -#else - (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, 0ul, NULL); -#endif /* __CM0P_PRESENT */ - - - /******************************************************************************** - * - * Initializes the system pipes. The system pipes are used by BLE and Flash. - * - * If the default startup file is not used, or SystemInit() is not called in your - * project, call the following three functions prior to executing any flash or - * EmEEPROM write or erase operation: - * -# Cy_IPC_Sema_Init() - * -# Cy_IPC_Pipe_Config() - * -# Cy_IPC_Pipe_Init() - * -# Cy_Flash_Init() - * - *******************************************************************************/ - /* Create an array of endpoint structures */ - static cy_stc_ipc_pipe_ep_t systemIpcPipeEpArray[CY_IPC_MAX_ENDPOINTS]; - - Cy_IPC_Pipe_Config(systemIpcPipeEpArray); - - static cy_ipc_pipe_callback_ptr_t systemIpcPipeSysCbArray[CY_SYS_CYPIPE_CLIENT_CNT]; - - static const cy_stc_ipc_pipe_config_t systemIpcPipeConfigCm4 = - { - /* .ep0ConfigData */ - { - /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP0, - /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP0, - /* .ipcNotifierMuxNumber */ CY_SYS_INTR_CYPIPE_MUX_EP0, - /* .epAddress */ CY_IPC_EP_CYPIPE_CM0_ADDR, - /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP0 - }, - /* .ep1ConfigData */ - { - /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP1, - /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP1, - /* .ipcNotifierMuxNumber */ 0u, - /* .epAddress */ CY_IPC_EP_CYPIPE_CM4_ADDR, - /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP1 - }, - /* .endpointClientsCount */ CY_SYS_CYPIPE_CLIENT_CNT, - /* .endpointsCallbacksArray */ systemIpcPipeSysCbArray, - /* .userPipeIsrHandler */ &Cy_SysIpcPipeIsrCm4 - }; - - Cy_IPC_Pipe_Init(&systemIpcPipeConfigCm4); - -#if defined(CY_DEVICE_PSOC6ABLE2) - Cy_Flash_Init(); -#endif /* defined(CY_DEVICE_PSOC6ABLE2) */ - -#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ -} - - -/******************************************************************************* -* Function Name: Cy_SystemInit -****************************************************************************//** -* -* The function is called during device startup. Once project compiled as part of -* the PSoC Creator project, the Cy_SystemInit() function is generated by the -* PSoC Creator. -* -* The function generated by PSoC Creator performs all of the necessary device -* configuration based on the design settings. This includes settings from the -* Design Wide Resources (DWR) such as Clocks and Pins as well as any component -* configuration that is necessary. -* -*******************************************************************************/ -__WEAK void Cy_SystemInit(void) -{ - /* Empty weak function. The actual implementation to be in the PSoC Creator - * generated strong function. - */ -} - - -/******************************************************************************* -* Function Name: SystemCoreClockUpdate -****************************************************************************//** -* -* Gets core clock frequency and updates \ref SystemCoreClock, \ref -* cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. -* -* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref -* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). -* -*******************************************************************************/ -void SystemCoreClockUpdate (void) -{ - uint32 locHf0Clock = Cy_SysClk_ClkHfGetFrequency(0UL); - - if (0UL != locHf0Clock) - { - cy_Hfclk0FreqHz = locHf0Clock; - cy_PeriClkFreqHz = locHf0Clock / (1UL + (uint32_t)Cy_SysClk_ClkPeriGetDivider()); - SystemCoreClock = locHf0Clock / (1UL + (uint32_t)Cy_SysClk_ClkFastGetDivider()); - - /* Sets clock frequency for Delay API */ - cy_delayFreqMhz = (uint8_t)CY_SYSLIB_DIV_ROUNDUP(SystemCoreClock, CY_DELAY_1M_THRESHOLD); - cy_delayFreqKhz = CY_SYSLIB_DIV_ROUNDUP(SystemCoreClock, CY_DELAY_1K_THRESHOLD); - cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; - } -} - - -/******************************************************************************* -* Function Name: Cy_SystemInitFpuEnable -****************************************************************************//** -* -* Enables the FPU if it is used. The function is called from the startup file. -* -*******************************************************************************/ -void Cy_SystemInitFpuEnable(void) -{ - #if defined (__FPU_USED) && (__FPU_USED == 1U) - uint32_t interruptState; - interruptState = Cy_SysLib_EnterCriticalSection(); - SCB->CPACR |= SCB_CPACR_CP10_CP11_ENABLE; - __DSB(); - __ISB(); - Cy_SysLib_ExitCriticalSection(interruptState); - #endif /* (__FPU_USED) && (__FPU_USED == 1U) */ -} - - -#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) -/******************************************************************************* -* Function Name: Cy_SysIpcPipeIsrCm4 -****************************************************************************//** -* -* This is the interrupt service routine for the system pipe. -* -*******************************************************************************/ -void Cy_SysIpcPipeIsrCm4(void) -{ - Cy_IPC_Pipe_ExecuteCallback(CY_IPC_EP_CYPIPE_CM4_ADDR); -} -#endif - - -/******************************************************************************* -* Function Name: Cy_MemorySymbols -****************************************************************************//** -* -* The intention of the function is to declare boundaries of the memories for the -* MDK compilers. For the rest of the supported compilers, this is done using -* linker configuration files. The following symbols used by the cymcuelftool. -* -*******************************************************************************/ -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050) -__asm void Cy_MemorySymbols(void) -{ - /* Flash */ - EXPORT __cy_memory_0_start - EXPORT __cy_memory_0_length - EXPORT __cy_memory_0_row_size - - /* Working Flash */ - EXPORT __cy_memory_1_start - EXPORT __cy_memory_1_length - EXPORT __cy_memory_1_row_size - - /* Supervisory Flash */ - EXPORT __cy_memory_2_start - EXPORT __cy_memory_2_length - EXPORT __cy_memory_2_row_size - - /* XIP */ - EXPORT __cy_memory_3_start - EXPORT __cy_memory_3_length - EXPORT __cy_memory_3_row_size - - /* eFuse */ - EXPORT __cy_memory_4_start - EXPORT __cy_memory_4_length - EXPORT __cy_memory_4_row_size - - /* Flash */ -__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) -__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) -__cy_memory_0_row_size EQU 0x200 - - /* Flash region for EEPROM emulation */ -__cy_memory_1_start EQU __cpp(CY_EM_EEPROM_BASE) -__cy_memory_1_length EQU __cpp(CY_EM_EEPROM_SIZE) -__cy_memory_1_row_size EQU 0x200 - - /* Supervisory Flash */ -__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) -__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) -__cy_memory_2_row_size EQU 0x200 - - /* XIP */ -__cy_memory_3_start EQU __cpp(CY_XIP_BASE) -__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) -__cy_memory_3_row_size EQU 0x200 - - /* eFuse */ -__cy_memory_4_start EQU __cpp(0x90700000) -__cy_memory_4_length EQU __cpp(0x100000) -__cy_memory_4_row_size EQU __cpp(1) -} -#endif /* defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050) */ - - -/* [] END OF FILE */ diff --git a/mcuboot/boot/mynewt/README.md b/mcuboot/boot/mynewt/README.md deleted file mode 100644 index ef924d50b..000000000 --- a/mcuboot/boot/mynewt/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# mcuboot - apps/boot - -This sample app implements a boot loader for the Mynewt OS (apache.mynewt.org). -This app requires the following Mynewt repositories: - * @mcuboot (this one) - * @apache-mynewt-core diff --git a/mcuboot/boot/mynewt/boot_uart/include/boot_uart/boot_uart.h b/mcuboot/boot/mynewt/boot_uart/include/boot_uart/boot_uart.h deleted file mode 100644 index 6d69668e4..000000000 --- a/mcuboot/boot/mynewt/boot_uart/include/boot_uart/boot_uart.h +++ /dev/null @@ -1,28 +0,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 _BOOT_UART_H_ -#define _BOOT_UART_H_ - -int boot_uart_open(void); -void boot_uart_close(void); -int boot_uart_read(char *str, int cnt, int *newline); -void boot_uart_write(const char *ptr, int cnt); - -#endif /* _BOOT_UART_H_ */ diff --git a/mcuboot/boot/mynewt/boot_uart/pkg.yml b/mcuboot/boot/mynewt/boot_uart/pkg.yml deleted file mode 100644 index a100a209f..000000000 --- a/mcuboot/boot/mynewt/boot_uart/pkg.yml +++ /dev/null @@ -1,32 +0,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. -# - -pkg.name: boot/mynewt/boot_uart -pkg.description: "For interfacing with uart from boot_serial" -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - loader - - boot - - bootloader - -pkg.deps: - - "@apache-mynewt-core/hw/hal" - - diff --git a/mcuboot/boot/mynewt/boot_uart/src/boot_uart.c b/mcuboot/boot/mynewt/boot_uart/src/boot_uart.c deleted file mode 100644 index 7593e338a..000000000 --- a/mcuboot/boot/mynewt/boot_uart/src/boot_uart.c +++ /dev/null @@ -1,178 +0,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. - */ -#include -#include -#include -#include "os/mynewt.h" -#include - -/* - * RX is a ring buffer, which gets drained constantly. - * TX blocks until buffer has been completely transmitted. - */ -#define CONSOLE_HEAD_INC(cr) (((cr)->head + 1) & (sizeof((cr)->buf) - 1)) -#define CONSOLE_TAIL_INC(cr) (((cr)->tail + 1) & (sizeof((cr)->buf) - 1)) - -struct { - uint16_t head; - uint16_t tail; - uint8_t buf[MYNEWT_VAL(CONSOLE_UART_RX_BUF_SIZE)]; -} bs_uart_rx; - -struct { - uint8_t *ptr; - int cnt; -} volatile bs_uart_tx; - -static struct uart_dev *bs_uart; - -static int bs_rx_char(void *arg, uint8_t byte); -static int bs_tx_char(void *arg); - -int -boot_uart_open(void) -{ - struct uart_conf uc = { - .uc_speed = MYNEWT_VAL(CONSOLE_UART_BAUD), - .uc_databits = 8, - .uc_stopbits = 1, - .uc_parity = UART_PARITY_NONE, - .uc_flow_ctl = MYNEWT_VAL(CONSOLE_UART_FLOW_CONTROL), - .uc_tx_char = bs_tx_char, - .uc_rx_char = bs_rx_char, - }; - - bs_uart = (struct uart_dev *)os_dev_open(MYNEWT_VAL(CONSOLE_UART_DEV), - OS_TIMEOUT_NEVER, &uc); - if (!bs_uart) { - return -1; - } - return 0; -} - -void -boot_uart_close(void) -{ - os_dev_close(&bs_uart->ud_dev); - bs_uart_rx.head = 0; - bs_uart_rx.tail = 0; - bs_uart_tx.cnt = 0; -} - -static int -bs_rx_char(void *arg, uint8_t byte) -{ - if (CONSOLE_HEAD_INC(&bs_uart_rx) == bs_uart_rx.tail) { - /* - * RX queue full. Reader must drain this. - */ - return -1; - } - bs_uart_rx.buf[bs_uart_rx.head] = byte; - bs_uart_rx.head = CONSOLE_HEAD_INC(&bs_uart_rx); - return 0; -} - -static uint8_t -bs_pull_char(void) -{ - uint8_t ch; - - ch = bs_uart_rx.buf[bs_uart_rx.tail]; - bs_uart_rx.tail = CONSOLE_TAIL_INC(&bs_uart_rx); - return ch; -} - -int -boot_uart_read(char *str, int cnt, int *newline) -{ - int i; - int sr; - uint8_t ch; - - *newline = 0; - OS_ENTER_CRITICAL(sr); - for (i = 0; i < cnt; i++) { - if (bs_uart_rx.head == bs_uart_rx.tail) { - break; - } - - ch = bs_pull_char(); - if (ch == '\n') { - *str = '\0'; - *newline = 1; - break; - } - /* - * Unblock interrupts allowing more incoming data. - */ - OS_EXIT_CRITICAL(sr); - OS_ENTER_CRITICAL(sr); - *str++ = ch; - } - OS_EXIT_CRITICAL(sr); - if (i > 0 || *newline) { - uart_start_rx(bs_uart); - } - return i; -} - -static int -bs_tx_char(void *arg) -{ - uint8_t ch; - - if (!bs_uart_tx.cnt) { - return -1; - } - - bs_uart_tx.cnt--; - ch = *bs_uart_tx.ptr; - bs_uart_tx.ptr++; - return ch; -} - -#if MYNEWT_VAL(SELFTEST) -/* - * OS is not running, so native uart 'driver' cannot run either. - * At the moment unit tests don't check the responses to messages it - * sends, so we can drop the outgoing data here. - */ -void -boot_uart_write(const char *ptr, int cnt) -{ -} - -#else - -void -boot_uart_write(const char *ptr, int cnt) -{ - int sr; - - OS_ENTER_CRITICAL(sr); - bs_uart_tx.ptr = (uint8_t *)ptr; - bs_uart_tx.cnt = cnt; - OS_EXIT_CRITICAL(sr); - - uart_start_tx(bs_uart); - while (bs_uart_tx.cnt); -} - -#endif diff --git a/mcuboot/boot/mynewt/boot_uart/syscfg.yml b/mcuboot/boot/mynewt/boot_uart/syscfg.yml deleted file mode 100644 index 29f4b53c4..000000000 --- a/mcuboot/boot/mynewt/boot_uart/syscfg.yml +++ /dev/null @@ -1,24 +0,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. -# - -syscfg.defs: - CONSOLE_UART_RX_BUF_SIZE: - description: > - UART console receive buffer size; must be power of 2. - value: 32 - diff --git a/mcuboot/boot/mynewt/flash_map_backend/include/flash_map_backend/flash_map_backend.h b/mcuboot/boot/mynewt/flash_map_backend/include/flash_map_backend/flash_map_backend.h deleted file mode 100644 index ff628e12b..000000000 --- a/mcuboot/boot/mynewt/flash_map_backend/include/flash_map_backend/flash_map_backend.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2018 Nordic Semiconductor ASA - * Copyright (c) 2015 Runtime Inc - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef __FLASH_MAP_BACKEND_H__ -#define __FLASH_MAP_BACKEND_H__ - -#include -#include - -#if (MCUBOOT_IMAGE_NUMBER == 1) - -#define FLASH_AREA_IMAGE_PRIMARY(x) (((x) == 0) ? \ - FLASH_AREA_IMAGE_0 : \ - FLASH_AREA_IMAGE_0) -#define FLASH_AREA_IMAGE_SECONDARY(x) (((x) == 0) ? \ - FLASH_AREA_IMAGE_1 : \ - FLASH_AREA_IMAGE_1) - -#elif (MCUBOOT_IMAGE_NUMBER == 2) - -#define FLASH_AREA_IMAGE_PRIMARY(x) (((x) == 0) ? \ - FLASH_AREA_IMAGE_0 : \ - ((x) == 1) ? \ - FLASH_AREA_IMAGE_2 : \ - 255) -#define FLASH_AREA_IMAGE_SECONDARY(x) (((x) == 0) ? \ - FLASH_AREA_IMAGE_1 : \ - ((x) == 1) ? \ - FLASH_AREA_IMAGE_3 : \ - 255) - -#else -#error "Image slot and flash area mapping is not defined" -#endif - -int flash_area_id_from_multi_image_slot(int image_index, int slot); -int flash_area_id_to_multi_image_slot(int image_index, int area_id); - -#endif /* __FLASH_MAP_BACKEND_H__ */ diff --git a/mcuboot/boot/mynewt/flash_map_backend/pkg.yml b/mcuboot/boot/mynewt/flash_map_backend/pkg.yml deleted file mode 100644 index ba1bf5bbf..000000000 --- a/mcuboot/boot/mynewt/flash_map_backend/pkg.yml +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (c) 2018 Nordic Semiconductor ASA -# -# SPDX-License-Identifier: Apache-2.0 -# - -pkg.name: boot/mynewt/flash_map_backend -pkg.description: Flash_map API helper reference. -pkg.author: "Nordic Semiconductor ASA" -pkg.homepage: "http://mcuboot.com" - -pkg.deps: - - "@apache-mynewt-core/sys/flash_map" - - "@mcuboot/boot/mynewt/mcuboot_config" diff --git a/mcuboot/boot/mynewt/flash_map_backend/src/flash_map_extended.c b/mcuboot/boot/mynewt/flash_map_backend/src/flash_map_extended.c deleted file mode 100644 index 2e3e6d3f8..000000000 --- a/mcuboot/boot/mynewt/flash_map_backend/src/flash_map_extended.c +++ /dev/null @@ -1,44 +0,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. - */ - -#include -#include - -int flash_area_id_from_multi_image_slot(int image_index, int slot) -{ - switch (slot) { - case 0: return FLASH_AREA_IMAGE_PRIMARY(image_index); - case 1: return FLASH_AREA_IMAGE_SECONDARY(image_index); -#if MCUBOOT_SWAP_USING_SCRATCH - case 2: return FLASH_AREA_IMAGE_SCRATCH; -#endif - } - return 255; -} - -int flash_area_id_to_multi_image_slot(int image_index, int area_id) -{ - if (area_id == FLASH_AREA_IMAGE_PRIMARY(image_index)) { - return 0; - } - if (area_id == FLASH_AREA_IMAGE_SECONDARY(image_index)) { - return 1; - } - return 255; -} diff --git a/mcuboot/boot/mynewt/mcuboot_config/include/mcuboot_config/mcuboot_config.h b/mcuboot/boot/mynewt/mcuboot_config/include/mcuboot_config/mcuboot_config.h deleted file mode 100644 index 696f2e70a..000000000 --- a/mcuboot/boot/mynewt/mcuboot_config/include/mcuboot_config/mcuboot_config.h +++ /dev/null @@ -1,104 +0,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_CONFIG_H__ -#define __MCUBOOT_CONFIG_H__ - -#include - -#if MYNEWT_VAL(BOOTUTIL_IMAGE_NUMBER) -#define MCUBOOT_IMAGE_NUMBER MYNEWT_VAL(BOOTUTIL_IMAGE_NUMBER) -#else -#define MCUBOOT_IMAGE_NUMBER 1 -#endif -#if MYNEWT_VAL(BOOT_SERIAL) -#define MCUBOOT_SERIAL 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_VALIDATE_SLOT0) -#define MCUBOOT_VALIDATE_PRIMARY_SLOT 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_USE_MBED_TLS) -#define MCUBOOT_USE_MBED_TLS 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_USE_TINYCRYPT) -#define MCUBOOT_USE_TINYCRYPT 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_SIGN_EC256) -#define MCUBOOT_SIGN_EC256 1 - #ifndef MCUBOOT_USE_TINYCRYPT - #error "EC256 requires the use of tinycrypt." - #endif -#endif -#if MYNEWT_VAL(BOOTUTIL_SIGN_RSA) -#define MCUBOOT_SIGN_RSA 1 -#define MCUBOOT_SIGN_RSA_LEN MYNEWT_VAL(BOOTUTIL_SIGN_RSA_LEN) -#endif -#if MYNEWT_VAL(BOOTUTIL_SIGN_ED25519) -#define MCUBOOT_SIGN_ED25519 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_SIGN_EC) -#define MCUBOOT_SIGN_EC 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_ENCRYPT_RSA) -#define MCUBOOT_ENCRYPT_RSA 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_ENCRYPT_KW) -#define MCUBOOT_ENCRYPT_KW 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_ENCRYPT_EC256) -#define MCUBOOT_ENCRYPT_EC256 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_ENCRYPT_X25519) -#define MCUBOOT_ENCRYPT_X25519 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_ENCRYPT_RSA) || MYNEWT_VAL(BOOTUTIL_ENCRYPT_KW) || \ - MYNEWT_VAL(BOOTUTIL_ENCRYPT_EC256) || MYNEWT_VAL(BOOTUTIL_ENCRYPT_X25519) -#define MCUBOOT_ENC_IMAGES 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_SWAP_USING_MOVE) -#define MCUBOOT_SWAP_USING_MOVE 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_SWAP_SAVE_ENCTLV) -#define MCUBOOT_SWAP_SAVE_ENCTLV 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_OVERWRITE_ONLY) -#define MCUBOOT_OVERWRITE_ONLY 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_OVERWRITE_ONLY_FAST) -#define MCUBOOT_OVERWRITE_ONLY_FAST 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_HAVE_LOGGING) -#define MCUBOOT_HAVE_LOGGING 1 -#endif -#if MYNEWT_VAL(BOOTUTIL_BOOTSTRAP) -#define MCUBOOT_BOOTSTRAP 1 -#endif - -#define MCUBOOT_MAX_IMG_SECTORS MYNEWT_VAL(BOOTUTIL_MAX_IMG_SECTORS) - -#if MYNEWT_VAL(BOOTUTIL_FEED_WATCHDOG) && MYNEWT_VAL(WATCHDOG_INTERVAL) -#include -#define MCUBOOT_WATCHDOG_FEED() \ - do { \ - hal_watchdog_tickle(); \ - } while (0) -#else -#define MCUBOOT_WATCHDOG_FEED() do {} while (0) -#endif - -#endif /* __MCUBOOT_CONFIG_H__ */ diff --git a/mcuboot/boot/mynewt/mcuboot_config/include/mcuboot_config/mcuboot_logging.h b/mcuboot/boot/mynewt/mcuboot_config/include/mcuboot_config/mcuboot_logging.h deleted file mode 100644 index a646fafcc..000000000 --- a/mcuboot/boot/mynewt/mcuboot_config/include/mcuboot_config/mcuboot_logging.h +++ /dev/null @@ -1,87 +0,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 -#include - -#define BOOTUTIL_LOG_LEVEL_OFF 1 -#define BOOTUTIL_LOG_LEVEL_ERROR 2 -#define BOOTUTIL_LOG_LEVEL_WARNING 3 -#define BOOTUTIL_LOG_LEVEL_INFO 4 -#define BOOTUTIL_LOG_LEVEL_DEBUG 5 - -#define MCUBOOT_LOG_LEVEL_OFF BOOTUTIL_LOG_LEVEL_OFF -#define MCUBOOT_LOG_LEVEL_ERROR BOOTUTIL_LOG_LEVEL_ERROR -#define MCUBOOT_LOG_LEVEL_WARNING BOOTUTIL_LOG_LEVEL_WARNING -#define MCUBOOT_LOG_LEVEL_INFO BOOTUTIL_LOG_LEVEL_INFO -#define MCUBOOT_LOG_LEVEL_DEBUG BOOTUTIL_LOG_LEVEL_DEBUG - -#ifndef MCUBOOT_LOG_LEVEL -#define MCUBOOT_LOG_LEVEL MYNEWT_VAL(BOOTUTIL_LOG_LEVEL) -#endif - -#define MCUBOOT_LOG_MODULE_DECLARE(domain) /* ignore */ -#define MCUBOOT_LOG_MODULE_REGISTER(domain) /* ignore */ - -#if !((MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_OFF) && \ - (MCUBOOT_LOG_LEVEL <= MCUBOOT_LOG_LEVEL_DEBUG)) -#error "Invalid MCUBOOT_LOG_LEVEL config." -#endif - -#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_ERROR -#define MCUBOOT_LOG_ERR(_fmt, ...) \ - do { \ - printf("[ERR] " _fmt "\n", ##__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 { \ - printf("[WRN] " _fmt "\n", ##__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 { \ - printf("[INF] " _fmt "\n", ##__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 { \ - printf("[DBG] " _fmt "\n", ##__VA_ARGS__); \ - } while (0) -#else -#define MCUBOOT_LOG_DBG(...) IGNORE(__VA_ARGS__) -#endif - -#define MCUBOOT_LOG_SIM(...) IGNORE(__VA_ARGS__) - -#endif diff --git a/mcuboot/boot/mynewt/mcuboot_config/pkg.yml b/mcuboot/boot/mynewt/mcuboot_config/pkg.yml deleted file mode 100644 index 33ba332a1..000000000 --- a/mcuboot/boot/mynewt/mcuboot_config/pkg.yml +++ /dev/null @@ -1,23 +0,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. -# - -pkg.name: boot/mynewt/mcuboot_config -pkg.description: "Mynewt's mcuboot configuration" -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" diff --git a/mcuboot/boot/mynewt/mcuboot_config/syscfg.yml b/mcuboot/boot/mynewt/mcuboot_config/syscfg.yml deleted file mode 100644 index 06e9768e2..000000000 --- a/mcuboot/boot/mynewt/mcuboot_config/syscfg.yml +++ /dev/null @@ -1,103 +0,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. -# - -# Package: boot/mynewt/mcuboot_config - -syscfg.defs: - BOOTUTIL_IMAGE_NUMBER: - description: 'Number of images for multi-image (0 and 1 mean single image).' - value: 0 - BOOTUTIL_VALIDATE_SLOT0: - description: 'Validate image at slot 0 on each boot.' - value: 0 - BOOTUTIL_SIGN_RSA: - description: 'Images are signed using RSA.' - value: 0 - BOOTUTIL_SIGN_RSA_LEN: - description: 'Key size for RSA keys (2048 or 3072).' - value: 2048 - BOOTUTIL_SIGN_EC: - description: 'Images are signed using ECDSA NIST P-224.' - value: 0 - BOOTUTIL_SIGN_EC256: - description: 'Images are signed using ECDSA NIST P-256.' - value: 0 - BOOTUTIL_SIGN_ED25519: - description: 'Images are signed using ED25519.' - value: 0 - BOOTUTIL_ENCRYPT_RSA: - description: 'Support for encrypted images using RSA-2048-OAEP.' - value: 0 - BOOTUTIL_ENCRYPT_KW: - description: 'Support for encrypted images using AES-128-Keywrap.' - value: 0 - BOOTUTIL_ENCRYPT_EC256: - description: 'Support for encrypted images using ECIES-P256.' - value: 0 - BOOTUTIL_ENCRYPT_X25519: - description: 'Support for encrypted images using ECIES-X25519.' - value: 0 - BOOTUTIL_USE_MBED_TLS: - description: 'Use mbed TLS for crypto operations.' - value: 1 - BOOTUTIL_USE_TINYCRYPT: - description: 'Use tinycrypt for crypto operations.' - value: 0 - BOOTUTIL_SWAP_USING_MOVE: - description: 'Perform swap without requiring scratch.' - value: 0 - BOOTUTIL_SWAP_SAVE_ENCTLV: - description: 'Save TLVs instead of plaintext encryption keys in swap status.' - value: 0 - BOOTUTIL_OVERWRITE_ONLY: - description: 'Non-swapping upgrades, copy from slot 1 to slot 0 only.' - value: 0 - BOOTUTIL_OVERWRITE_ONLY_FAST: - description: 'Use faster copy only upgrade.' - value: 1 - BOOTUTIL_IMAGE_FORMAT_V2: - description: 'Indicates that system is using v2 of image format.' - value: 1 - BOOTUTIL_MAX_IMG_SECTORS: - description: 'Maximum number of sectors that are swapped.' - value: 128 - BOOTUTIL_HAVE_LOGGING: - description: 'Enable serial logging' - value: 0 - restrictions: - - "!BOOTUTIL_NO_LOGGING" - BOOTUTIL_NO_LOGGING: - description: 'No serial logging' - value: 1 - restrictions: - - "!BOOTUTIL_HAVE_LOGGING" - BOOTUTIL_LOG_LEVEL: - description: > - Default console log level. Valid values are: - BOOTUTIL_LOG_LEVEL_OFF - BOOTUTIL_LOG_LEVEL_ERROR - BOOTUTIL_LOG_LEVEL_WARNING - BOOTUTIL_LOG_LEVEL_INFO - BOOTUTIL_LOG_LEVEL_DEBUG - value: 'BOOTUTIL_LOG_LEVEL_INFO' - BOOTUTIL_BOOTSTRAP: - description: 'Support bootstrapping slot0 from slot1, if slot0 is empty' - value: 0 - BOOTUTIL_FEED_WATCHDOG: - description: 'Enable watchdog feeding while performing a swap upgrade' - value: 0 diff --git a/mcuboot/boot/mynewt/pkg.yml b/mcuboot/boot/mynewt/pkg.yml deleted file mode 100644 index fe12d0963..000000000 --- a/mcuboot/boot/mynewt/pkg.yml +++ /dev/null @@ -1,46 +0,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. -# - -pkg.name: boot/mynewt -pkg.type: app -pkg.description: "Mynewt port of mcuboot" -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - - loader - -pkg.cflags: - - "-DMCUBOOT_MYNEWT=1" - -pkg.deps: - - "@mcuboot/boot/mynewt/mcuboot_config" - - "@mcuboot/boot/bootutil" - - "@mcuboot/boot/mynewt/flash_map_backend" - - "@apache-mynewt-core/kernel/os" - - "@apache-mynewt-core/sys/log/stub" - -pkg.deps.BOOTUTIL_NO_LOGGING: - - "@apache-mynewt-core/sys/console/stub" - -pkg.deps.BOOTUTIL_HAVE_LOGGING: - - "@apache-mynewt-core/sys/console/minimal" - -pkg.deps.BOOT_SERIAL: - - "@mcuboot/boot/boot_serial" - - "@mcuboot/boot/mynewt/boot_uart" diff --git a/mcuboot/boot/mynewt/src/main.c b/mcuboot/boot/mynewt/src/main.c deleted file mode 100755 index 6fc5c60c7..000000000 --- a/mcuboot/boot/mynewt/src/main.c +++ /dev/null @@ -1,254 +0,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. - */ - -#include "mcuboot_config/mcuboot_config.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef MCUBOOT_SERIAL -#include -#include -#include -#endif -#if defined(MCUBOOT_SERIAL) -#include -#endif -#include -#include "bootutil/image.h" -#include "bootutil/bootutil.h" -#include "bootutil/bootutil_log.h" - -#if MYNEWT_VAL(BOOT_CUSTOM_START) -void boot_custom_start(uintptr_t flash_base, struct boot_rsp *rsp); -#endif - -#if defined(MCUBOOT_SERIAL) -#define BOOT_SERIAL_REPORT_DUR \ - (MYNEWT_VAL(OS_CPUTIME_FREQ) / MYNEWT_VAL(BOOT_SERIAL_REPORT_FREQ)) -#define BOOT_SERIAL_INPUT_MAX (512) - -static int boot_read(char *str, int cnt, int *newline); -static const struct boot_uart_funcs boot_uart_funcs = { - .read = boot_read, - .write = boot_uart_write -}; - -static int -boot_read(char *str, int cnt, int *newline) -{ -#if MYNEWT_VAL(BOOT_SERIAL_REPORT_PIN) != -1 - static uint32_t tick = 0; - - if (tick == 0) { - /* - * Configure GPIO line as output. This is a pin we toggle at the - * given frequency. - */ - hal_gpio_init_out(MYNEWT_VAL(BOOT_SERIAL_REPORT_PIN), 0); - tick = os_cputime_get32(); - } else { - if (os_cputime_get32() - tick > BOOT_SERIAL_REPORT_DUR) { - hal_gpio_toggle(MYNEWT_VAL(BOOT_SERIAL_REPORT_PIN)); - tick = os_cputime_get32(); - } - } -#endif - hal_watchdog_tickle(); - - return boot_uart_read(str, cnt, newline); -} - -#if MYNEWT_VAL(BOOT_SERIAL_DETECT_TIMEOUT) != 0 - -/** Don't include null-terminator in comparison. */ -#define BOOT_SERIAL_DETECT_STRING_LEN \ - (sizeof MYNEWT_VAL(BOOT_SERIAL_DETECT_STRING) - 1) - -/** - * Listens on the UART for the management string. Blocks for up to - * BOOT_SERIAL_DETECT_TIMEOUT milliseconds. - * - * @return true if the management string was received; - * false if the management string was not received - * before the UART listen timeout expired. - */ -static bool -serial_detect_uart_string(void) -{ - uint32_t start_tick; - char buf[BOOT_SERIAL_DETECT_STRING_LEN] = { 0 }; - char ch; - int newline; - int rc; - - /* Calculate the timeout duration in OS cputime ticks. */ - static const uint32_t timeout_dur = - MYNEWT_VAL(BOOT_SERIAL_DETECT_TIMEOUT) / - (1000.0 / MYNEWT_VAL(OS_CPUTIME_FREQ)); - - rc = boot_uart_open(); - assert(rc == 0); - - start_tick = os_cputime_get32(); - - while (1) { - /* Read a single character from the UART. */ - rc = boot_uart_read(&ch, 1, &newline); - if (rc > 0) { - /* Eliminate the oldest character in the buffer to make room for - * the new one. - */ - memmove(buf, buf + 1, BOOT_SERIAL_DETECT_STRING_LEN - 1); - buf[BOOT_SERIAL_DETECT_STRING_LEN - 1] = ch; - - /* If the full management string has been received, indicate that - * the serial boot loader should start. - */ - rc = memcmp(buf, - MYNEWT_VAL(BOOT_SERIAL_DETECT_STRING), - BOOT_SERIAL_DETECT_STRING_LEN); - if (rc == 0) { - boot_uart_close(); - return true; - } - } - - /* Abort the listen on timeout. */ - if (os_cputime_get32() >= start_tick + timeout_dur) { - boot_uart_close(); - return false; - } - } -} -#endif - -static void -serial_boot_detect(void) -{ - /* - * Read retained register and compare with expected magic value. - * If it matches, await for download commands from serial. - */ -#if MYNEWT_VAL(BOOT_SERIAL_NVREG_INDEX) != -1 - if (hal_nvreg_read(MYNEWT_VAL(BOOT_SERIAL_NVREG_INDEX)) == - MYNEWT_VAL(BOOT_SERIAL_NVREG_MAGIC)) { - - hal_nvreg_write(MYNEWT_VAL(BOOT_SERIAL_NVREG_INDEX), 0); - goto serial_boot; - } -#endif - - /* - * Configure a GPIO as input, and compare it against expected value. - * If it matches, await for download commands from serial. - */ -#if MYNEWT_VAL(BOOT_SERIAL_DETECT_PIN) != -1 - hal_gpio_init_in(MYNEWT_VAL(BOOT_SERIAL_DETECT_PIN), - MYNEWT_VAL(BOOT_SERIAL_DETECT_PIN_CFG)); - if (hal_gpio_read(MYNEWT_VAL(BOOT_SERIAL_DETECT_PIN)) == - MYNEWT_VAL(BOOT_SERIAL_DETECT_PIN_VAL)) { - goto serial_boot; - } -#endif - - /* - * Listen for management pattern in UART input. If detected, await for - * download commands from serial. - */ -#if MYNEWT_VAL(BOOT_SERIAL_DETECT_TIMEOUT) != 0 - if (serial_detect_uart_string()) { - goto serial_boot; - } -#endif - return; -serial_boot: - boot_uart_open(); - boot_serial_start(&boot_uart_funcs); - assert(0); -} -#endif - -/* - * Temporary flash_device_base() implementation. - * - * TODO: remove this when mynewt needs to support flash_device_base() - * for devices with nonzero base addresses. - */ -int flash_device_base(uint8_t fd_id, uintptr_t *ret) -{ - *ret = 0; - return 0; -} - -int -main(void) -{ - struct boot_rsp rsp; - uintptr_t flash_base; - int rc; - - hal_bsp_init(); - -#if !MYNEWT_VAL(OS_SCHEDULING) && MYNEWT_VAL(WATCHDOG_INTERVAL) - rc = hal_watchdog_init(MYNEWT_VAL(WATCHDOG_INTERVAL)); - assert(rc == 0); -#endif - -#if defined(MCUBOOT_SERIAL) || defined(MCUBOOT_HAVE_LOGGING) || \ - MYNEWT_VAL(CRYPTO) || MYNEWT_VAL(HASH) - /* initialize uart/crypto without os */ - os_dev_initialize_all(OS_DEV_INIT_PRIMARY); - os_dev_initialize_all(OS_DEV_INIT_SECONDARY); - sysinit(); - console_blocking_mode(); -#if defined(MCUBOOT_SERIAL) - serial_boot_detect(); - hal_timer_deinit(MYNEWT_VAL(OS_CPUTIME_TIMER_NUM)); -#endif -#else - flash_map_init(); -#endif - - rc = boot_go(&rsp); - assert(rc == 0); - - rc = flash_device_base(rsp.br_flash_dev_id, &flash_base); - assert(rc == 0); - -#if MYNEWT_VAL(BOOT_CUSTOM_START) - boot_custom_start(flash_base, &rsp); -#else - hal_system_start((void *)(flash_base + rsp.br_image_off + - rsp.br_hdr->ih_hdr_size)); -#endif - - return 0; -} diff --git a/mcuboot/boot/mynewt/syscfg.yml b/mcuboot/boot/mynewt/syscfg.yml deleted file mode 100644 index d472c207b..000000000 --- a/mcuboot/boot/mynewt/syscfg.yml +++ /dev/null @@ -1,36 +0,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. -# - -# Package: boot/mynewt - -syscfg.defs: - BOOT_LOADER: - description: 'Set to indicate that this app is a bootloader.' - value: 1 - BOOT_SERIAL: - description: 'Support image upgrade over serial within bootloader' - value: 0 - BOOT_CUSTOM_START: - description: 'Override hal_system_start with a custom start routine' - value: 0 - -syscfg.vals: - SYSINIT_CONSTRAIN_INIT: 0 - OS_SCHEDULING: 0 - MSYS_1_BLOCK_COUNT: 0 - CONSOLE_COMPAT: 1 diff --git a/mcuboot/boot/zephyr/CMakeLists.txt b/mcuboot/boot/zephyr/CMakeLists.txt deleted file mode 100644 index cda5a48e1..000000000 --- a/mcuboot/boot/zephyr/CMakeLists.txt +++ /dev/null @@ -1,248 +0,0 @@ -# CMakeLists.txt for building mcuboot as a Zephyr project -# -# Copyright (c) 2017 Open Source Foundries Limited -# -# SPDX-License-Identifier: Apache-2.0 - -cmake_minimum_required(VERSION 3.13.1) - -# Add a common dts overlay necessary to ensure mcuboot is linked into, -# and fits inside, the boot partition. (If the user specified a -# DTC_OVERLAY_FILE on the CMake command line, we need to append onto -# the list). -if(DTC_OVERLAY_FILE) - set(DTC_OVERLAY_FILE - "${DTC_OVERLAY_FILE} ${CMAKE_CURRENT_LIST_DIR}/dts.overlay" - CACHE STRING "" FORCE - ) -else() - set(DTC_OVERLAY_FILE ${CMAKE_CURRENT_LIST_DIR}/dts.overlay) -endif() - -# Enable Zephyr runner options which request mass erase if so -# configured. -# -# Note that this also disables the default "leave" option when -# targeting STM32 DfuSe devices with dfu-util, making the chip stay in -# the bootloader after flashing. -# -# That's the right thing, because mcuboot has nothing to do since the -# chip was just erased. The next thing the user is going to want to do -# is flash the application. (Developers can reset DfuSE devices -# manually to test mcuboot behavior on an otherwise erased flash -# device.) -macro(app_set_runner_args) - if(CONFIG_ZEPHYR_TRY_MASS_ERASE) - board_runner_args(dfu-util "--dfuse-modifiers=force:mass-erase") - board_runner_args(pyocd "--flash-opt=-e=chip") - board_runner_args(nrfjprog "--erase") - endif() -endmacro() - -# Standard Zephyr application boilerplate: -# http://docs.zephyrproject.org/application/application.html -include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE) -project(NONE) - -# Path to "boot" subdirectory of repository root. -get_filename_component(BOOT_DIR ${APPLICATION_SOURCE_DIR} DIRECTORY) -# Path to top-level repository root directory. -get_filename_component(MCUBOOT_DIR ${BOOT_DIR} DIRECTORY) -# Path to tinycrypt library source subdirectory of MCUBOOT_DIR. -set(TINYCRYPT_DIR "${MCUBOOT_DIR}/ext/tinycrypt/lib") -assert_exists(TINYCRYPT_DIR) -set(TINYCRYPT_SHA512_DIR "${MCUBOOT_DIR}/ext/tinycrypt-sha512/lib") -assert_exists(TINYCRYPT_SHA512_DIR) -# Path to crypto-fiat -set(FIAT_DIR "${MCUBOOT_DIR}/ext/fiat") -assert_exists(FIAT_DIR) -# Path to mbed-tls' asn1 parser library. -set(MBEDTLS_ASN1_DIR "${MCUBOOT_DIR}/ext/mbedtls-asn1") -assert_exists(MBEDTLS_ASN1_DIR) -set(NRF_DIR "${MCUBOOT_DIR}/ext/nrf") - -if(CONFIG_BOOT_USE_NRF_CC310_BL) -set(NRFXLIB_DIR $ENV{ZEPHYR_BASE}/../nrfxlib) -assert_exists(NRFXLIB_DIR) -# Don't include this if we are using west - add_subdirectory(${NRFXLIB_DIR} ${PROJECT_BINARY_DIR}/nrfxlib) -endif() - -zephyr_library_include_directories( - include - targets - ) -if(EXISTS targets/${BOARD}.h) - zephyr_library_compile_definitions(MCUBOOT_TARGET_CONFIG="${BOARD}.h") -endif() - -# Zephyr port-specific sources. -zephyr_library_sources( - main.c - flash_map_extended.c - os.c - keys.c - ) - -if(NOT DEFINED CONFIG_FLASH_PAGE_LAYOUT) - zephyr_library_sources( - flash_map_legacy.c - ) -endif() - -# Generic bootutil sources and includes. -zephyr_library_include_directories(${BOOT_DIR}/bootutil/include) -zephyr_library_sources( - ${BOOT_DIR}/bootutil/src/loader.c - ${BOOT_DIR}/bootutil/src/swap_misc.c - ${BOOT_DIR}/bootutil/src/swap_scratch.c - ${BOOT_DIR}/bootutil/src/swap_move.c - ${BOOT_DIR}/bootutil/src/bootutil_misc.c - ${BOOT_DIR}/bootutil/src/image_validate.c - ${BOOT_DIR}/bootutil/src/encrypted.c - ${BOOT_DIR}/bootutil/src/image_rsa.c - ${BOOT_DIR}/bootutil/src/image_ec256.c - ${BOOT_DIR}/bootutil/src/image_ed25519.c - ${BOOT_DIR}/bootutil/src/caps.c - ${BOOT_DIR}/bootutil/src/tlv.c - ) - -if(CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256 OR CONFIG_BOOT_ENCRYPT_EC256) - zephyr_library_include_directories( - ${MBEDTLS_ASN1_DIR}/include - ) - zephyr_library_sources( - # Additionally pull in just the ASN.1 parser from mbedTLS. - ${MBEDTLS_ASN1_DIR}/src/asn1parse.c - ${MBEDTLS_ASN1_DIR}/src/platform_util.c - ) - if(CONFIG_BOOT_USE_TINYCRYPT) - # When using ECDSA signatures, pull in our copy of the tinycrypt library. - zephyr_library_include_directories( - ${BOOT_DIR}/zephyr/include - ${TINYCRYPT_DIR}/include - ) - - zephyr_library_sources( - ${TINYCRYPT_DIR}/source/ecc.c - ${TINYCRYPT_DIR}/source/ecc_dsa.c - ${TINYCRYPT_DIR}/source/sha256.c - ${TINYCRYPT_DIR}/source/utils.c - ) - elseif(CONFIG_BOOT_USE_NRF_CC310_BL) - zephyr_library_sources(${NRF_DIR}/cc310_glue.c) - zephyr_library_include_directories(${NRF_DIR}) - zephyr_link_libraries(nrfxlib_crypto) - endif() - - # Since here we are not using Zephyr's mbedTLS but rather our own, we need - # to set MBEDTLS_CONFIG_FILE ourselves. When using Zephyr's copy, this - # variable is set by its Kconfig in the Zephyr codebase. - zephyr_library_compile_definitions( - MBEDTLS_CONFIG_FILE="${CMAKE_CURRENT_LIST_DIR}/include/mcuboot-mbedtls-cfg.h" - ) -elseif(CONFIG_BOOT_SIGNATURE_TYPE_NONE) - zephyr_library_include_directories( - ${BOOT_DIR}/zephyr/include - ${TINYCRYPT_DIR}/include - ) - - zephyr_library_sources( - ${TINYCRYPT_DIR}/source/sha256.c - ${TINYCRYPT_DIR}/source/utils.c - ) -elseif(CONFIG_BOOT_SIGNATURE_TYPE_RSA) - # Use mbedTLS provided by Zephyr for RSA signatures. (Its config file - # is set using Kconfig.) - zephyr_include_directories(include) -elseif(CONFIG_BOOT_SIGNATURE_TYPE_ED25519 OR CONFIG_BOOT_ENCRYPT_X25519) - if(CONFIG_BOOT_USE_TINYCRYPT) - zephyr_library_include_directories( - ${MBEDTLS_ASN1_DIR}/include - ${BOOT_DIR}/zephyr/include - ${TINYCRYPT_DIR}/include - ${TINYCRYPT_SHA512_DIR}/include - ) - zephyr_library_sources( - ${TINYCRYPT_DIR}/source/sha256.c - ${TINYCRYPT_DIR}/source/utils.c - ${TINYCRYPT_SHA512_DIR}/source/sha512.c - # Additionally pull in just the ASN.1 parser from mbedTLS. - ${MBEDTLS_ASN1_DIR}/src/asn1parse.c - ${MBEDTLS_ASN1_DIR}/src/platform_util.c - ) - zephyr_library_compile_definitions( - MBEDTLS_CONFIG_FILE="${CMAKE_CURRENT_LIST_DIR}/include/mcuboot-mbedtls-cfg.h" - ) - else() - zephyr_include_directories(include) - endif() - - zephyr_library_include_directories( - ${BOOT_DIR}/zephyr/include - ${FIAT_DIR}/include/ - ) - - zephyr_library_sources( - ${FIAT_DIR}/src/curve25519.c - ) -endif() - -if(CONFIG_BOOT_ENCRYPT_EC256 OR CONFIG_BOOT_ENCRYPT_X25519) - zephyr_library_sources( - ${TINYCRYPT_DIR}/source/aes_encrypt.c - ${TINYCRYPT_DIR}/source/aes_decrypt.c - ${TINYCRYPT_DIR}/source/ctr_mode.c - ${TINYCRYPT_DIR}/source/hmac.c - ${TINYCRYPT_DIR}/source/ecc_dh.c - ) -endif() - -if(CONFIG_BOOT_ENCRYPT_EC256) - zephyr_library_sources( - ${TINYCRYPT_DIR}/source/ecc_dh.c - ) -endif() - -if(CONFIG_MCUBOOT_SERIAL) - zephyr_sources(${BOOT_DIR}/zephyr/serial_adapter.c) - zephyr_sources(${BOOT_DIR}/boot_serial/src/boot_serial.c) - zephyr_sources(${BOOT_DIR}/boot_serial/src/serial_recovery_cbor.c) - zephyr_sources(${BOOT_DIR}/boot_serial/src/cbor_decode.c) - - zephyr_include_directories(${BOOT_DIR}/bootutil/include) - zephyr_include_directories(${BOOT_DIR}/boot_serial/include) - zephyr_include_directories(include) - - zephyr_include_directories_ifdef( - CONFIG_BOOT_ERASE_PROGRESSIVELY - ${BOOT_DIR}/bootutil/src - ) -endif() - -if(NOT CONFIG_BOOT_SIGNATURE_KEY_FILE STREQUAL "") - if(IS_ABSOLUTE ${CONFIG_BOOT_SIGNATURE_KEY_FILE}) - set(KEY_FILE ${CONFIG_BOOT_SIGNATURE_KEY_FILE}) - else() - set(KEY_FILE ${MCUBOOT_DIR}/${CONFIG_BOOT_SIGNATURE_KEY_FILE}) - endif() - set(GENERATED_PUBKEY ${ZEPHYR_BINARY_DIR}/autogen-pubkey.c) - add_custom_command( - OUTPUT ${GENERATED_PUBKEY} - COMMAND - ${PYTHON_EXECUTABLE} - ${MCUBOOT_DIR}/scripts/imgtool.py - getpub - -k - ${KEY_FILE} - > ${GENERATED_PUBKEY} - DEPENDS ${KEY_FILE} - ) - zephyr_library_sources(${GENERATED_PUBKEY}) -endif() - -if(CONFIG_MCUBOOT_CLEANUP_ARM_CORE) -zephyr_library_sources( - ${BOOT_DIR}/zephyr/arm_cleanup.c -) -endif() diff --git a/mcuboot/boot/zephyr/Kconfig b/mcuboot/boot/zephyr/Kconfig deleted file mode 100644 index 3b5f91fdc..000000000 --- a/mcuboot/boot/zephyr/Kconfig +++ /dev/null @@ -1,453 +0,0 @@ -# Copyright (c) 2017-2020 Linaro Limited -# Copyright (c) 2020 Arm Limited -# -# SPDX-License-Identifier: Apache-2.0 -# - -mainmenu "MCUboot configuration" - -comment "MCUboot-specific configuration options" - -# Hidden option to mark a project as MCUboot -config MCUBOOT - default y - bool - select MPU_ALLOW_FLASH_WRITE if ARM_MPU - select USE_DT_CODE_PARTITION if HAS_FLASH_LOAD_OFFSET - -config BOOT_USE_MBEDTLS - bool - # Hidden option - default n - help - Use mbedTLS for crypto primitives. - -config BOOT_USE_TINYCRYPT - bool - # Hidden option - default n - # When building for ECDSA, we use our own copy of mbedTLS, so the - # Zephyr one must not be enabled or the MBEDTLS_CONFIG_FILE macros - # will collide. - depends on ! MBEDTLS - help - Use TinyCrypt for crypto primitives. - -config BOOT_USE_CC310 - bool - # Hidden option - default n - # When building for ECDSA, we use our own copy of mbedTLS, so the - # Zephyr one must not be enabled or the MBEDTLS_CONFIG_FILE macros - # will collide. - depends on ! MBEDTLS - help - Use cc310 for crypto primitives. - -config BOOT_USE_NRF_CC310_BL - bool - default n - -config NRFXLIB_CRYPTO - bool - default n - -config NRF_CC310_BL - bool - default n - -menu "MCUBoot settings" - -choice - prompt "Signature type" - default BOOT_SIGNATURE_TYPE_RSA - -config BOOT_SIGNATURE_TYPE_NONE - bool "No signature; use only hash check" - select BOOT_USE_TINYCRYPT - -config BOOT_SIGNATURE_TYPE_RSA - bool "RSA signatures" - select BOOT_USE_MBEDTLS - select MBEDTLS - -if BOOT_SIGNATURE_TYPE_RSA -config BOOT_SIGNATURE_TYPE_RSA_LEN - int "RSA signature length" - range 2048 3072 - default 2048 -endif - -config BOOT_SIGNATURE_TYPE_ECDSA_P256 - bool "Elliptic curve digital signatures with curve P-256" - -if BOOT_SIGNATURE_TYPE_ECDSA_P256 -choice - prompt "Ecdsa implementation" - default BOOT_ECDSA_TINYCRYPT -config BOOT_ECDSA_TINYCRYPT - bool "Use tinycrypt" - select BOOT_USE_TINYCRYPT -config BOOT_CC310 - bool "Use CC310" - select BOOT_USE_NRF_CC310_BL if HAS_HW_NRF_CC310 - select NRF_CC310_BL if HAS_HW_NRF_CC310 - select NRFXLIB_CRYPTO if SOC_FAMILY_NRF - select BOOT_USE_CC310 -endchoice -endif - -config BOOT_SIGNATURE_TYPE_ED25519 - bool "Edwards curve digital signatures using ed25519" - -if BOOT_SIGNATURE_TYPE_ED25519 -choice - prompt "Ecdsa implementation" - default BOOT_ED25519_TINYCRYPT -config BOOT_ED25519_TINYCRYPT - bool "Use tinycrypt" - select BOOT_USE_TINYCRYPT -config BOOT_ED25519_MBEDTLS - bool "Use mbedTLS" - select BOOT_USE_MBEDTLS - select MBEDTLS -endchoice -endif - -endchoice - -config BOOT_SIGNATURE_KEY_FILE - string "PEM key file" - default "" - help - The key file will be parsed by imgtool's getpub command and a .c source - with the public key information will be written in a format expected by - MCUboot. - -config MCUBOOT_CLEANUP_ARM_CORE - bool "Perform core cleanup before chain-load the application" - depends on CPU_CORTEX_M - default y - -config MBEDTLS_CFG_FILE - default "mcuboot-mbedtls-cfg.h" - -config BOOT_HW_KEY - bool "Use HW key for image verification" - default n - help - Use HW key for image verification, otherwise the public key is embedded - in MCUBoot. If enabled the public key is appended to the signed image - and requires the hash of the public key to be provisioned to the device - beforehand. - -config BOOT_VALIDATE_SLOT0 - bool "Validate image in the primary slot on every boot" - default y - help - If y, the bootloader attempts to validate the signature of the - primary slot every boot. This adds the signature check time to - every boot, but can mitigate against some changes that are - able to modify the flash image itself. - -config BOOT_UPGRADE_ONLY - bool "Overwrite image updates instead of swapping" - default n - help - If y, overwrite the primary slot with the upgrade image instead - of swapping them. This prevents the fallback recovery, but - uses a much simpler code path. - -config BOOT_SWAP_USING_MOVE - bool "Swap mode that can run without a scratch partition" - default y if SOC_FAMILY_NRF - default n - help - If y, the swap upgrade is done in two steps, where first every - sector of the primary slot is moved up one sector, then for - each sector X in the secondary slot, it is moved to index X in - the primary slot, then the sector at X+1 in the primary is - moved to index X in the secondary. - This allows a swap upgrade without using a scratch partition, - but is currently limited to all sectors in both slots being of - the same size. - -config BOOT_BOOTSTRAP - bool "Bootstrap erased the primary slot from the secondary slot" - default n - help - If y, enables bootstraping support. Bootstrapping allows an erased - primary slot to be initialized from a valid image in the secondary slot. - If unsure, leave at the default value. - -config BOOT_SWAP_SAVE_ENCTLV - bool "Save encrypted key TLVs instead of plaintext keys in swap metadata" - default n - help - If y, instead of saving the encrypted image keys in plaintext in the - swap resume metadata, save the encrypted image TLVs. This should be used - when there is no security mechanism protecting the data in the primary - slot from being dumped. If n is selected (default), the keys are written - after being decrypted from the image TLVs and could be read by an - attacker who has access to the flash contents of the primary slot (eg - JTAG/SWD or primary slot in external flash). - If unsure, leave at the default value. - -config BOOT_ENCRYPT_RSA - bool "Support for encrypted upgrade images using RSA" - default n - help - If y, images in the secondary slot can be encrypted and are decrypted - on the fly when upgrading to the primary slot, as well as encrypted - back when swapping from the primary slot to the secondary slot. The - encryption mechanism used in this case is RSA-OAEP (2048 bits). - -config BOOT_ENCRYPT_EC256 - bool "Support for encrypted upgrade images using ECIES-P256" - default n - help - If y, images in the secondary slot can be encrypted and are decrypted - on the fly when upgrading to the primary slot, as well as encrypted - back when swapping from the primary slot to the secondary slot. The - encryption mechanism used in this case is ECIES using primitives - described under "ECIES-P256 encryption" in docs/encrypted_images.md. - -config BOOT_ENCRYPT_X25519 - bool "Support for encrypted upgrade images using ECIES-X25519" - default n - help - If y, images in the secondary slot can be encrypted and are decrypted - on the fly when upgrading to the primary slot, as well as encrypted - back when swapping from the primary slot to the secondary slot. The - encryption mechanism used in this case is ECIES using primitives - described under "ECIES-X25519 encryption" in docs/encrypted_images.md. - -config BOOT_MAX_IMG_SECTORS - int "Maximum number of sectors per image slot" - default 128 - help - This option controls the maximum number of sectors that each of - the two image areas can contain. Smaller values reduce MCUboot's - memory usage; larger values allow it to support larger images. - If unsure, leave at the default value. - -config BOOT_ERASE_PROGRESSIVELY - bool "Erase flash progressively when receiving new firmware" - default y if SOC_NRF52840 - help - If enabled, flash is erased as necessary when receiving new firmware, - instead of erasing the whole image slot at once. This is necessary - on some hardware that has long erase times, to prevent long wait - times at the beginning of the DFU process. - -config MEASURED_BOOT - bool "Store the boot state/measurements in shared memory" - default n - help - If enabled, the bootloader will store certain boot measurements such as - the hash of the firmware image in a shared memory area. This data can - be used later by runtime services (e.g. by a device attestation service). - -config BOOT_SHARE_DATA - bool "Save application specific data in shared memory area" - default n - -config BOOT_WAIT_FOR_USB_DFU - bool "Wait for a prescribed duration to see if USB DFU is invoked" - default n - select USB - select USB_DFU_CLASS - select IMG_MANAGER - help - If y, MCUboot waits for a prescribed duration of time to allow - for USB DFU to be invoked. Please note DFU always updates the - slot1 image. - -config ZEPHYR_TRY_MASS_ERASE - bool "Try to mass erase flash when flashing MCUboot image" - default y - help - If y, attempt to configure the Zephyr build system's "flash" - target to mass-erase the flash device before flashing the - MCUboot image. This ensures the scratch and other partitions - are in a consistent state. - - This is not available for all targets. - -config BOOT_USE_BENCH - bool "Enable benchmark code" - default n - help - If y, adds support for simple benchmarking that can record - time intervals between two calls. The time printed depends - on the particular Zephyr target, and is generally ticks of a - specific board-specific timer. - -module = MCUBOOT -module-str = MCUBoot bootloader -source "subsys/logging/Kconfig.template.log_config" - -config MCUBOOT_LOG_THREAD_STACK_SIZE - int "Stack size for the MCUBoot log processing thread" - depends on LOG && !LOG_IMMEDIATE - default 2048 if COVERAGE_GCOV - default 1024 if NO_OPTIMIZATIONS - default 1024 if XTENSA - default 4096 if (X86 && X86_64) - default 4096 if ARM64 - default 768 - help - Set the internal stack size for MCUBoot log processing thread. - -menuconfig MCUBOOT_SERIAL - bool "MCUboot serial recovery" - default n - select REBOOT - select GPIO - select SERIAL - select UART_INTERRUPT_DRIVEN - select BASE64 - select TINYCBOR - help - If y, enables a serial-port based update mode. This allows - MCUboot itself to load update images into flash over a UART. - If unsure, leave at the default value. - -if MCUBOOT_SERIAL - -choice - prompt "Serial device" - default BOOT_SERIAL_UART if !BOARD_NRF52840DONGLE_NRF52840 - default BOOT_SERIAL_CDC_ACM if BOARD_NRF52840DONGLE_NRF52840 - -config BOOT_SERIAL_UART - bool "UART" - # SERIAL and UART_INTERRUPT_DRIVEN already selected - -config BOOT_SERIAL_CDC_ACM - bool "CDC ACM" - select USB - select USB_DEVICE_STACK - select USB_CDC_ACM - -endchoice - -config BOOT_MAX_LINE_INPUT_LEN - int "Maximum command line length" - default 512 - help - Maximum length of commands transported over the serial port. - -config BOOT_SERIAL_DETECT_PORT - string "GPIO device to trigger serial recovery mode" - default GPIO_0 if SOC_FAMILY_NRF - help - Zephyr GPIO device which contains the pin used to trigger - serial recovery mode. - -config BOOT_SERIAL_DETECT_PIN - int "Pin to trigger serial recovery mode" - default 6 if BOARD_NRF9160DK_NRF9160 - default 11 if BOARD_NRF52840DK_NRF52840 - default 13 if BOARD_NRF52DK_NRF52832 - default 23 if BOARD_NRF5340_DK_NRF5340_CPUAPP || BOARD_NRF5340_DK_NRF5340_CPUAPPNS - help - Pin on the serial detect port which triggers serial recovery mode. - -config BOOT_SERIAL_DETECT_PIN_VAL - int "Serial detect pin trigger value" - default 0 - range 0 1 - help - Logic value of the detect pin which triggers serial recovery - mode. - -# Workaround for not being able to have commas in macro arguments -DT_CHOSEN_Z_CONSOLE := zephyr,console - -config RECOVERY_UART_DEV_NAME - string "UART Device Name for Recovery UART" - default "$(dt_chosen_label,$(DT_CHOSEN_Z_CONSOLE))" if HAS_DTS - default "UART_0" - depends on BOOT_SERIAL_UART - help - This option specifies the name of UART device to be used for - serial recovery. - -endif # MCUBOOT_SERIAL - -endmenu - -config MCUBOOT_DEVICE_SETTINGS - # Hidden selector for device-specific settings - bool - default y - # CPU options - select MCUBOOT_DEVICE_CPU_CORTEX_M0 if CPU_CORTEX_M0 - # Enable flash page layout if available - select FLASH_PAGE_LAYOUT if FLASH_HAS_PAGE_LAYOUT - # Enable flash_map module as flash I/O back-end - select FLASH_MAP - -config MCUBOOT_DEVICE_CPU_CORTEX_M0 - # Hidden selector for Cortex-M0 settings - bool - default n - select SW_VECTOR_RELAY if !CPU_CORTEX_M0_HAS_VECTOR_TABLE_REMAP - -comment "Zephyr configuration options" - -# Disabling MULTITHREADING provides a code size advantage, but -# it requires peripheral drivers (particularly a flash driver) -# that works properly with the option enabled. -# -# If you know for sure that your hardware will work, you can default -# it to n here. Otherwise, having it on by default makes the most -# hardware work. -config MULTITHREADING - default y if BOOT_SERIAL_CDC_ACM #usb driver requires MULTITHREADING - default n if SOC_FAMILY_NRF - default y - -config LOG_IMMEDIATE - default n if MULTITHREADING - default y - -config LOG_PROCESS_THREAD - default n # mcuboot has its own log processing thread - -# override USB device name -config USB_DEVICE_PRODUCT - default "MCUBOOT" - -config UPDATEABLE_IMAGE_NUMBER - int "Number of updateable images" - default 1 - help - Enables support of multi image update. - -choice - prompt "Downgrade prevention" - optional - -config MCUBOOT_DOWNGRADE_PREVENTION - bool "SW based downgrade prevention" - depends on BOOT_UPGRADE_ONLY - help - Prevent downgrades by enforcing incrementing version numbers. - When this option is set, any upgrade must have greater major version - or greater minor version with equal major version. This mechanism - only protects against some attacks against version downgrades (for - example, a JTAG could be used to write an older version). - -config MCUBOOT_HW_DOWNGRADE_PREVENTION - bool "HW based downgrade prevention" - help - Prevent undesirable/malicious software downgrades. When this option is - set, any upgrade must have greater or equal security counter value. - Because of the acceptance of equal values it allows for software - downgrade to some extent. - -endchoice - -source "Kconfig.zephyr" diff --git a/mcuboot/boot/zephyr/arm_cleanup.c b/mcuboot/boot/zephyr/arm_cleanup.c deleted file mode 100644 index 647b8b429..000000000 --- a/mcuboot/boot/zephyr/arm_cleanup.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2020 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include - -void cleanup_arm_nvic(void) { - /* Allow any pending interrupts to be recognized */ - __ISB(); - __disable_irq(); - - /* Disable NVIC interrupts */ - for (u8_t i = 0; i < ARRAY_SIZE(NVIC->ICER); i++) { - NVIC->ICER[i] = 0xFFFFFFFF; - } - /* Clear pending NVIC interrupts */ - for (u8_t i = 0; i < ARRAY_SIZE(NVIC->ICPR); i++) { - NVIC->ICPR[i] = 0xFFFFFFFF; - } -} diff --git a/mcuboot/boot/zephyr/boards/actinius_icarus.conf b/mcuboot/boot/zephyr/boards/actinius_icarus.conf deleted file mode 100644 index fc67561ab..000000000 --- a/mcuboot/boot/zephyr/boards/actinius_icarus.conf +++ /dev/null @@ -1,13 +0,0 @@ -# Disable Zephyr console -CONFIG_CONSOLE=n -CONFIG_CONSOLE_HANDLER=n -CONFIG_UART_CONSOLE=n - -# MCUBoot settings -CONFIG_BOOT_MAX_IMG_SECTORS=256 - -# MCUboot serial recovery -CONFIG_MCUBOOT_SERIAL=y -CONFIG_BOOT_SERIAL_DETECT_PORT="GPIO_0" -CONFIG_BOOT_SERIAL_DETECT_PIN=5 -CONFIG_BOOT_SERIAL_DETECT_PIN_VAL=0 diff --git a/mcuboot/boot/zephyr/boards/disco_l475_iot1.conf b/mcuboot/boot/zephyr/boards/disco_l475_iot1.conf deleted file mode 100644 index 0b6a72dfa..000000000 --- a/mcuboot/boot/zephyr/boards/disco_l475_iot1.conf +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_BOOT_MAX_IMG_SECTORS=256 - diff --git a/mcuboot/boot/zephyr/boards/intel_s1000_crb.conf b/mcuboot/boot/zephyr/boards/intel_s1000_crb.conf deleted file mode 100644 index ab2bfd692..000000000 --- a/mcuboot/boot/zephyr/boards/intel_s1000_crb.conf +++ /dev/null @@ -1,4 +0,0 @@ -CONFIG_DEBUG=n -CONFIG_I2C=n -CONFIG_BOOT_MAX_IMG_SECTORS=512 -CONFIG_BOOT_WAIT_FOR_USB_DFU=y diff --git a/mcuboot/boot/zephyr/boards/intel_s1000_crb.overlay b/mcuboot/boot/zephyr/boards/intel_s1000_crb.overlay deleted file mode 100644 index 61f0d436c..000000000 --- a/mcuboot/boot/zephyr/boards/intel_s1000_crb.overlay +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2018 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ -/ { - sram0: memory@be000000 { - device_type = "memory"; - compatible = "mmio-sram"; - reg = <0xbe000000 0x30000>; - }; -}; - diff --git a/mcuboot/boot/zephyr/boards/nrf51dk_nrf51422.conf b/mcuboot/boot/zephyr/boards/nrf51dk_nrf51422.conf deleted file mode 100644 index bd4eaac8d..000000000 --- a/mcuboot/boot/zephyr/boards/nrf51dk_nrf51422.conf +++ /dev/null @@ -1,6 +0,0 @@ -# Due the small boot partition, we can't enable logging or the debug -# optimization level out off the box. You need to increase the boot -# partition size with a zephyr DTS overlay to make MCUboot's debug -# builds fit. -CONFIG_LOG=n -CONFIG_SIZE_OPTIMIZATIONS=y diff --git a/mcuboot/boot/zephyr/boards/nrf52840_big.overlay b/mcuboot/boot/zephyr/boards/nrf52840_big.overlay deleted file mode 100644 index 094a7a45a..000000000 --- a/mcuboot/boot/zephyr/boards/nrf52840_big.overlay +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2020 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/delete-node/ &boot_partition; -/delete-node/ &slot0_partition; -/delete-node/ &slot1_partition; - -&flash0 { - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - boot_partition: partition@0 { - label = "mcuboot"; - reg = <0x000000000 0x00010000>; - }; - slot0_partition: partition@10000 { - label = "image-0"; - reg = <0x000010000 0x000074000>; - }; - slot1_partition: partition@75000 { - label = "image-1"; - reg = <0x00084000 0x000074000>; - }; - }; -}; diff --git a/mcuboot/boot/zephyr/boards/nrf52840dongle_nrf52840.conf b/mcuboot/boot/zephyr/boards/nrf52840dongle_nrf52840.conf deleted file mode 100644 index ba333d9c1..000000000 --- a/mcuboot/boot/zephyr/boards/nrf52840dongle_nrf52840.conf +++ /dev/null @@ -1,32 +0,0 @@ -# The UART is used for Serial Recovery, so logging requires -# an RTT console, which is not available out of the box on this board. -# Disable logging. -CONFIG_LOG=n - -# The build won't fit on the partition allocated for it without size -# optimizations. -CONFIG_SIZE_OPTIMIZATIONS=y - -# Serial -CONFIG_SERIAL=y -CONFIG_UART_NRFX=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_UART_LINE_CTRL=y - -# MCUBoot serial -CONFIG_GPIO=y -CONFIG_MCUBOOT_SERIAL=y -CONFIG_BOOT_SERIAL_CDC_ACM=y -CONFIG_BOOT_SERIAL_DETECT_PORT="GPIO_1" -CONFIG_BOOT_SERIAL_DETECT_PIN=6 - -# Required by USB -CONFIG_MULTITHREADING=y - -# USB -CONFIG_USB=y -CONFIG_USB_DEVICE_STACK=y -CONFIG_USB_DEVICE_PRODUCT="MCUBOOT" -CONFIG_USB_CDC_ACM=y -CONFIG_USB_COMPOSITE_DEVICE=n -CONFIG_USB_MASS_STORAGE=n diff --git a/mcuboot/boot/zephyr/boards/nrf52_minimal_footprint.conf b/mcuboot/boot/zephyr/boards/nrf52_minimal_footprint.conf deleted file mode 100644 index afe8c9baf..000000000 --- a/mcuboot/boot/zephyr/boards/nrf52_minimal_footprint.conf +++ /dev/null @@ -1,67 +0,0 @@ -# Minimal MCUBoot flash footprint configuration -# for nRF52832 SoC targets -# This is not recomendet configuration because of security and reliability -# reasons. - - -# Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib) -CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=y -CONFIG_BOOT_SIGNATURE_KEY_FILE="root-ec-p256.pem" - -# In any real project CONFIG_BOOT_VALIDATE_SLOT0 enabling is recommended -# by security reason. -# CONFIG_BOOT_VALIDATE_SLOT0 is not set - -# In most of projects CONFIG_BOOT_UPGRADE_ONLY disabling is recommended -# by reliability reason. -CONFIG_BOOT_UPGRADE_ONLY=y - -# CONFIG_ZEPHYR_TRY_MASS_ERASE is not set -# CONFIG_BOARD_ENABLE_DCDC is not set -CONFIG_SOC_SERIES_NRF52X=y -CONFIG_SOC_NRF52832_QFAA=y -CONFIG_ARM=y -CONFIG_ARM_MPU=n -CONFIG_MAIN_STACK_SIZE=10240 -CONFIG_THREAD_STACK_INFO=n -# CONFIG_TICKLESS_KERNEL is not set -CONFIG_SYSTEM_CLOCK_DISABLE=y -CONFIG_FLASH=y - -CONFIG_CONSOLE=n -CONFIG_DEBUG=n -CONFIG_EARLY_CONSOLE=n -CONFIG_PRINTK=n - -CONFIG_SYS_CLOCK_EXISTS=n - -# Drivers and peripherals -CONFIG_I2C=n -CONFIG_WATCHDOG=n -CONFIG_GPIO=n -CONFIG_PINMUX=n -CONFIG_SPI=n -CONFIG_SERIAL=n - -# Power management -CONFIG_SYS_POWER_MANAGEMENT=n - -# Interrupts -CONFIG_DYNAMIC_INTERRUPTS=n -CONFIG_IRQ_OFFLOAD=n - -# Memory protection -CONFIG_MEMORY_PROTECTION=n -CONFIG_THREAD_CUSTOM_DATA=n -CONFIG_FPU=n - -# Boot -CONFIG_BOOT_BANNER=n -CONFIG_BOOT_DELAY=0 - -# Console -CONFIG_UART_CONSOLE=n -CONFIG_STDOUT_CONSOLE=n - -# Build -CONFIG_SIZE_OPTIMIZATIONS=y diff --git a/mcuboot/boot/zephyr/dts.overlay b/mcuboot/boot/zephyr/dts.overlay deleted file mode 100644 index 74d3dfbfd..000000000 --- a/mcuboot/boot/zephyr/dts.overlay +++ /dev/null @@ -1,5 +0,0 @@ -/ { - chosen { - zephyr,code-partition = &boot_partition; - }; -}; diff --git a/mcuboot/boot/zephyr/flash_map_extended.c b/mcuboot/boot/zephyr/flash_map_extended.c deleted file mode 100644 index 4723af187..000000000 --- a/mcuboot/boot/zephyr/flash_map_extended.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2018 Nordic Semiconductor ASA - * Copyright (c) 2015 Runtime Inc - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include - -#include "target.h" - -#include -#include - -#include "bootutil/bootutil_log.h" - -MCUBOOT_LOG_MODULE_DECLARE(mcuboot); - -#if (!defined(CONFIG_XTENSA) && defined(DT_CHOSEN_ZEPHYR_FLASH_CONTROLLER_LABEL)) -#define FLASH_DEVICE_ID SOC_FLASH_0_ID -#define FLASH_DEVICE_BASE CONFIG_FLASH_BASE_ADDRESS -#elif (defined(CONFIG_XTENSA) && defined(DT_JEDEC_SPI_NOR_0_LABEL)) -#define FLASH_DEVICE_ID SPI_FLASH_0_ID -#define FLASH_DEVICE_BASE 0 -#else -#error "FLASH_DEVICE_ID could not be determined" -#endif - -static struct device *flash_dev; - -struct device *flash_device_get_binding(char *dev_name) -{ - if (!flash_dev) { - flash_dev = device_get_binding(dev_name); - } - return flash_dev; -} - -int flash_device_base(uint8_t fd_id, uintptr_t *ret) -{ - if (fd_id != FLASH_DEVICE_ID) { - BOOT_LOG_ERR("invalid flash ID %d; expected %d", - fd_id, FLASH_DEVICE_ID); - return -EINVAL; - } - *ret = FLASH_DEVICE_BASE; - return 0; -} - -/* - * This depends on the mappings defined in sysflash.h. - * MCUBoot uses continuous numbering for the primary slot, the secondary slot, - * and the scratch while zephyr might number it differently. - */ -int flash_area_id_from_multi_image_slot(int image_index, int slot) -{ - switch (slot) { - case 0: return FLASH_AREA_IMAGE_PRIMARY(image_index); - case 1: return FLASH_AREA_IMAGE_SECONDARY(image_index); -#if !defined(CONFIG_BOOT_SWAP_USING_MOVE) - case 2: return FLASH_AREA_IMAGE_SCRATCH; -#endif - } - - return -EINVAL; /* flash_area_open will fail on that */ -} - -int flash_area_id_from_image_slot(int slot) -{ - return flash_area_id_from_multi_image_slot(0, slot); -} - -int flash_area_id_to_multi_image_slot(int image_index, int area_id) -{ - if (area_id == FLASH_AREA_IMAGE_PRIMARY(image_index)) { - return 0; - } - if (area_id == FLASH_AREA_IMAGE_SECONDARY(image_index)) { - return 1; - } - - BOOT_LOG_ERR("invalid flash area ID"); - return -1; -} - -int flash_area_id_to_image_slot(int area_id) -{ - return flash_area_id_to_multi_image_slot(0, area_id); -} - -int flash_area_sector_from_off(off_t off, struct flash_sector *sector) -{ - int rc; - struct flash_pages_info page; - - rc = flash_get_page_info_by_offs(flash_dev, off, &page); - if (rc) { - return rc; - } - - sector->fs_off = page.start_offset; - sector->fs_size = page.size; - - return rc; -} - -#define ERASED_VAL 0xff -uint8_t flash_area_erased_val(const struct flash_area *fap) -{ - (void)fap; - return ERASED_VAL; -} - -int flash_area_read_is_empty(const struct flash_area *fa, uint32_t off, - void *dst, uint32_t len) -{ - uint8_t i; - uint8_t *u8dst; - int rc; - - rc = flash_area_read(fa, off, dst, len); - if (rc) { - return -1; - } - - for (i = 0, u8dst = (uint8_t *)dst; i < len; i++) { - if (u8dst[i] != ERASED_VAL) { - return 0; - } - } - - return 1; -} diff --git a/mcuboot/boot/zephyr/flash_map_legacy.c b/mcuboot/boot/zephyr/flash_map_legacy.c deleted file mode 100644 index b21794721..000000000 --- a/mcuboot/boot/zephyr/flash_map_legacy.c +++ /dev/null @@ -1,104 +0,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. - */ - -/** - * @file - * @brief Legacy flash fallbacks - * - * This file contains hacks for flash drivers without page layout - * support. They're hacks because they guess a page layout that may be - * incorrect, but is likely to "work". Needless to say, such guesswork - * is undesirable in trusted bootloader code. - * - * The behavior is: - * - * - If FLASH_AREA_IMAGE_SECTOR_SIZE is defined (this was used by - * older Zephyr ports), the image sectors have uniform sector sizes. - * We also assume that's the size of the scratch sectors. - * - * - Otherwise, we assume that the size of the entire scratch area is - * a least common multiple of all sector sizes, and use that as - * FLASH_AREA_IMAGE_SECTOR_SIZE. - */ - -#include "bootutil/bootutil_log.h" - -#include -#include -#include - -#warning "The flash driver lacks page layout support; falling back on hacks." - -#if !defined(FLASH_AREA_IMAGE_SECTOR_SIZE) -#define FLASH_AREA_IMAGE_SECTOR_SIZE FLASH_AREA_IMAGE_SCRATCH_SIZE -#endif - -MCUBOOT_LOG_MODULE_DECLARE(mcuboot); - -/* - * Lookup the sector map for a given flash area. This should fill in - * `ret` with all of the sectors in the area. `*cnt` will be set to - * the storage at `ret` and should be set to the final number of - * sectors in this area. - */ -int flash_area_get_sectors(int idx, uint32_t *cnt, struct flash_sector *ret) -{ - const struct flash_area *fa; - uint32_t max_cnt = *cnt; - uint32_t rem_len; - int rc = -1; - - if (flash_area_open(idx, &fa)) { - goto out; - } - - BOOT_LOG_DBG("area %d: offset=0x%x, length=0x%x", idx, fa->fa_off, - fa->fa_size); - - if (*cnt < 1) { - goto fa_close_out; - } - - rem_len = fa->fa_size; - *cnt = 0; - while (rem_len > 0 && *cnt < max_cnt) { - if (rem_len < FLASH_AREA_IMAGE_SECTOR_SIZE) { - BOOT_LOG_ERR("area %d size 0x%x not divisible by sector size 0x%x", - idx, fa->fa_size, FLASH_AREA_IMAGE_SECTOR_SIZE); - goto fa_close_out; - } - - ret[*cnt].fs_off = FLASH_AREA_IMAGE_SECTOR_SIZE * (*cnt); - ret[*cnt].fs_size = FLASH_AREA_IMAGE_SECTOR_SIZE; - *cnt = *cnt + 1; - rem_len -= FLASH_AREA_IMAGE_SECTOR_SIZE; - } - - if (*cnt >= max_cnt) { - BOOT_LOG_ERR("flash area %d sector count overflow", idx); - goto fa_close_out; - } - - rc = 0; - -fa_close_out: - flash_area_close(fa); -out: - return rc; -} diff --git a/mcuboot/boot/zephyr/include/arm_cleanup.h b/mcuboot/boot/zephyr/include/arm_cleanup.h deleted file mode 100644 index 7ff914a3e..000000000 --- a/mcuboot/boot/zephyr/include/arm_cleanup.h +++ /dev/null @@ -1,15 +0,0 @@ - -/* - * Copyright (c) 2020 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef H_ARM_CLEANUP_ -#define H_ARM_CLEANUP_ - -/** - * Cleanup interrupt priority and interupt enable registers. - */ -void cleanup_arm_nvic(void); -#endif diff --git a/mcuboot/boot/zephyr/include/config-asn1.h b/mcuboot/boot/zephyr/include/config-asn1.h deleted file mode 100644 index 6acb0e9ac..000000000 --- a/mcuboot/boot/zephyr/include/config-asn1.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Configuration of mbedTLS containing only the ASN.1 parser. - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * Copyright (C) 2016, Linaro Ltd - * 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) - */ - -/* - * Minimal configuration for using TLS in the bootloader - * - * - RSA or ECDSA signature verification - */ - -#ifndef MBEDTLS_CONFIG_ASN1_H -#define MBEDTLS_CONFIG_ASN1_H - -#define MBEDTLS_PLATFORM_C -#define MBEDTLS_PLATFORM_MEMORY -#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS - -/* mbed TLS modules */ -#define MBEDTLS_ASN1_PARSE_C -// #define MBEDTLS_ASN1_WRITE_C -// #define MBEDTLS_BIGNUM_C -// #define MBEDTLS_MD_C -// #define MBEDTLS_OID_C -// #define MBEDTLS_SHA256_C - -#include "mbedtls/check_config.h" - -#endif /* MBEDTLS_CONFIG_ASN1_H */ diff --git a/mcuboot/boot/zephyr/include/config-ed25519.h b/mcuboot/boot/zephyr/include/config-ed25519.h deleted file mode 100644 index fb0750a6a..000000000 --- a/mcuboot/boot/zephyr/include/config-ed25519.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Configuration of mbedTLS containing only the ASN.1 parser. - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * Copyright (C) 2016, Linaro Ltd - * 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) - */ - -/* - * Minimal configuration for using TLS in the bootloader - * - * - ed25519 signature verification - */ - -#ifndef MCUBOOT_MBEDTLS_CONFIG_ED25519 -#define MCUBOOT_MBEDTLS_CONFIG_ED25519 - -#ifdef CONFIG_MCUBOOT_SERIAL -/* Mcuboot uses mbedts-base64 for serial protocol encoding. */ -#define MBEDTLS_BASE64_C -#endif - -/* System support */ -#define MBEDTLS_PLATFORM_C -#define MBEDTLS_PLATFORM_MEMORY -#define MBEDTLS_MEMORY_BUFFER_ALLOC_C -#define MBEDTLS_NO_PLATFORM_ENTROPY -#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES - -/* STD functions */ -#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS - -#define MBEDTLS_PLATFORM_EXIT_ALT -#define MBEDTLS_PLATFORM_PRINTF_ALT -#define MBEDTLS_PLATFORM_SNPRINTF_ALT - -#if !defined(CONFIG_ARM) -#define MBEDTLS_HAVE_ASM -#endif - -/* mbed TLS modules */ -#define MBEDTLS_ASN1_PARSE_C -#define MBEDTLS_BIGNUM_C -#define MBEDTLS_MD_C -#define MBEDTLS_OID_C -#define MBEDTLS_SHA256_C -#define MBEDTLS_SHA512_C -#define MBEDTLS_AES_C - -/* Save RAM by adjusting to our exact needs */ -//#define MBEDTLS_ECP_MAX_BITS 2048 - -#define MBEDTLS_MPI_MAX_SIZE 64 - -//#define MBEDTLS_SSL_MAX_CONTENT_LEN 1024 - -/* Save ROM and a few bytes of RAM by specifying our own ciphersuite list */ -#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 - -#include "mbedtls/check_config.h" - -#endif /* MCUBOOT_MBEDTLS_CONFIG_RSA */ diff --git a/mcuboot/boot/zephyr/include/config-kw.h b/mcuboot/boot/zephyr/include/config-kw.h deleted file mode 100644 index 41e5baa35..000000000 --- a/mcuboot/boot/zephyr/include/config-kw.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Minimal configuration for using TLS in the bootloader - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * Copyright (C) 2016, Linaro Ltd - * 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) - */ - -/* - * Minimal configuration for using TLS in the bootloader - * - * - RSA or ECDSA signature verification - */ - -#ifndef MCUBOOT_MBEDTLS_CONFIG_KW -#define MCUBOOT_MBEDTLS_CONFIG_KW - -#ifdef CONFIG_MCUBOOT_SERIAL -/* Mcuboot uses mbedts-base64 for serial protocol encoding. */ -#define MBEDTLS_BASE64_C -#endif - -/* System support */ -#define MBEDTLS_PLATFORM_C -#define MBEDTLS_PLATFORM_MEMORY -#define MBEDTLS_MEMORY_BUFFER_ALLOC_C -#define MBEDTLS_NO_PLATFORM_ENTROPY -#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES - -/* STD functions */ -#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS - -#define MBEDTLS_PLATFORM_EXIT_ALT -#define MBEDTLS_PLATFORM_PRINTF_ALT -#define MBEDTLS_PLATFORM_SNPRINTF_ALT - -#define MBEDTLS_ASN1_PARSE_C - -#if !defined(CONFIG_ARM) -#define MBEDTLS_HAVE_ASM -#endif - -#define MBEDTLS_SHA256_C -#define MBEDTLS_AES_C -#define MBEDTLS_CIPHER_C -#define MBEDTLS_NIST_KW_C - -#include "mbedtls/check_config.h" - -#endif /* MCUBOOT_MBEDTLS_CONFIG_KW */ diff --git a/mcuboot/boot/zephyr/include/config-rsa-kw.h b/mcuboot/boot/zephyr/include/config-rsa-kw.h deleted file mode 100644 index eb9143c6a..000000000 --- a/mcuboot/boot/zephyr/include/config-rsa-kw.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Minimal configuration for using TLS in the bootloader - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * Copyright (C) 2016, Linaro Ltd - * 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) - */ - -/* - * Minimal configuration for using TLS in the bootloader - * - * - RSA signature verification + NIST Keywrapping support - */ - -#ifndef MCUBOOT_MBEDTLS_CONFIG_RSA_KW -#define MCUBOOT_MBEDTLS_CONFIG_RSA_KW - -#ifdef CONFIG_MCUBOOT_SERIAL -/* Mcuboot uses mbedts-base64 for serial protocol encoding. */ -#define MBEDTLS_BASE64_C -#endif - -/* System support */ -#define MBEDTLS_PLATFORM_C -#define MBEDTLS_PLATFORM_MEMORY -#define MBEDTLS_MEMORY_BUFFER_ALLOC_C -#define MBEDTLS_NO_PLATFORM_ENTROPY -#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES - -/* STD functions */ -#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS - -#define MBEDTLS_PLATFORM_EXIT_ALT -#define MBEDTLS_PLATFORM_PRINTF_ALT -#define MBEDTLS_PLATFORM_SNPRINTF_ALT - -#if !defined(CONFIG_ARM) -#define MBEDTLS_HAVE_ASM -#endif - -#define MBEDTLS_RSA_C -#define MBEDTLS_PKCS1_V21 - -/* mbed TLS modules */ -#define MBEDTLS_ASN1_PARSE_C -#define MBEDTLS_BIGNUM_C -#define MBEDTLS_MD_C -#define MBEDTLS_OID_C -#define MBEDTLS_SHA256_C -#define MBEDTLS_AES_C -#define MBEDTLS_CIPHER_C -#define MBEDTLS_NIST_KW_C - -/* Save RAM by adjusting to our exact needs */ -#define MBEDTLS_ECP_MAX_BITS 2048 -#define MBEDTLS_MPI_MAX_SIZE 256 - -#define MBEDTLS_SSL_MAX_CONTENT_LEN 1024 - -/* Save ROM and a few bytes of RAM by specifying our own ciphersuite list */ -#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 - -#include "mbedtls/check_config.h" - -#endif /* MCUBOOT_MBEDTLS_CONFIG_RSA_KW */ diff --git a/mcuboot/boot/zephyr/include/config-rsa.h b/mcuboot/boot/zephyr/include/config-rsa.h deleted file mode 100644 index 3e05692c0..000000000 --- a/mcuboot/boot/zephyr/include/config-rsa.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Minimal configuration for using TLS in the bootloader - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * Copyright (C) 2016, Linaro Ltd - * 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) - */ - -/* - * Minimal configuration for using TLS in the bootloader - * - * - RSA or ECDSA signature verification - */ - -#ifndef MCUBOOT_MBEDTLS_CONFIG_RSA -#define MCUBOOT_MBEDTLS_CONFIG_RSA - -#ifdef CONFIG_MCUBOOT_SERIAL -/* Mcuboot uses mbedts-base64 for serial protocol encoding. */ -#define MBEDTLS_BASE64_C -#endif - -/* System support */ -#define MBEDTLS_PLATFORM_C -#define MBEDTLS_PLATFORM_MEMORY -#define MBEDTLS_MEMORY_BUFFER_ALLOC_C -#define MBEDTLS_NO_PLATFORM_ENTROPY -#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES - -/* STD functions */ -#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS - -#define MBEDTLS_PLATFORM_EXIT_ALT -#define MBEDTLS_PLATFORM_PRINTF_ALT -#define MBEDTLS_PLATFORM_SNPRINTF_ALT - -#if !defined(CONFIG_ARM) -#define MBEDTLS_HAVE_ASM -#endif - -#define MBEDTLS_RSA_C -#define MBEDTLS_PKCS1_V21 - -/* mbed TLS modules */ -#define MBEDTLS_ASN1_PARSE_C -#define MBEDTLS_ASN1_WRITE_C -#define MBEDTLS_BIGNUM_C -#define MBEDTLS_MD_C -#define MBEDTLS_OID_C -#define MBEDTLS_SHA256_C -#define MBEDTLS_AES_C - -/* Save RAM by adjusting to our exact needs */ -#define MBEDTLS_ECP_MAX_BITS 2048 - -#if (CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN == 3072) -#define MBEDTLS_MPI_MAX_SIZE 384 -#else -#define MBEDTLS_MPI_MAX_SIZE 256 -#endif - -#define MBEDTLS_SSL_MAX_CONTENT_LEN 1024 - -/* Save ROM and a few bytes of RAM by specifying our own ciphersuite list */ -#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 - -#include "mbedtls/check_config.h" - -#endif /* MCUBOOT_MBEDTLS_CONFIG_RSA */ diff --git a/mcuboot/boot/zephyr/include/flash_map_backend/flash_map_backend.h b/mcuboot/boot/zephyr/include/flash_map_backend/flash_map_backend.h deleted file mode 100644 index 20dd37914..000000000 --- a/mcuboot/boot/zephyr/include/flash_map_backend/flash_map_backend.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2018 Nordic Semiconductor ASA - * Copyright (c) 2015 Runtime Inc - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef __FLASH_MAP_BACKEND_H__ -#define __FLASH_MAP_BACKEND_H__ - -#include // the zephyr flash_map - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * - * Provides abstraction of flash regions for type of use. - * I.e. dude where's my image? - * - * System will contain a map which contains flash areas. Every - * region will contain flash identifier, offset within flash and length. - * - * 1. This system map could be in a file within filesystem (Initializer - * must know/figure out where the filesystem is at). - * 2. Map could be at fixed location for project (compiled to code) - * 3. Map could be at specific place in flash (put in place at mfg time). - * - * Note that the map you use must be valid for BSP it's for, - * match the linker scripts when platform executes from flash, - * and match the target offset specified in download script. - */ -#include -#include - -/* Retrieve the flash device with the given name. - * - * Returns the flash device on success, or NULL on failure. - */ -struct device *flash_device_get_binding(char *dev_name); - -/* - * Retrieve a memory-mapped flash device's base address. - * - * On success, the address will be stored in the value pointed to by - * ret. - * - * Returns 0 on success, or an error code on failure. - */ -int flash_device_base(uint8_t fd_id, uintptr_t *ret); - -int flash_area_id_from_image_slot(int slot); -int flash_area_id_from_multi_image_slot(int image_index, int slot); - -/** - * Converts the specified flash area ID to an image slot index. - * - * Returns image slot index (0 or 1), or -1 if ID doesn't correspond to an image - * slot. - */ -int flash_area_id_to_image_slot(int area_id); - -/** - * Converts the specified flash area ID and image index (in multi-image setup) - * to an image slot index. - * - * Returns image slot index (0 or 1), or -1 if ID doesn't correspond to an image - * slot. - */ -int flash_area_id_to_multi_image_slot(int image_index, int area_id); - -/* Retrieve the flash sector a given offset belongs to. - * - * Returns 0 on success, or an error code on failure. - */ -int flash_area_sector_from_off(off_t off, struct flash_sector *sector); - -/* - * Returns the value expected to be read when accessing any erased - * flash byte. - */ -uint8_t flash_area_erased_val(const struct flash_area *fap); - -/* - * Reads len bytes from off, and checks if the read data is erased. - * - * Returns 1 if erased, 0 if non-erased, and -1 on failure. - */ -int flash_area_read_is_empty(const struct flash_area *fa, uint32_t off, - void *dst, uint32_t len); - -#ifdef __cplusplus -} -#endif - -#endif /* __FLASH_MAP_BACKEND_H__ */ diff --git a/mcuboot/boot/zephyr/include/hal/hal_bsp.h b/mcuboot/boot/zephyr/include/hal/hal_bsp.h deleted file mode 100644 index 8b52f271b..000000000 --- a/mcuboot/boot/zephyr/include/hal/hal_bsp.h +++ /dev/null @@ -1,79 +0,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 __HAL_BSP_H_ -#define __HAL_BSP_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* - * Initializes BSP; registers flash_map with the system. - */ -void hal_bsp_init(void); - -/* - * Return pointer to flash device structure, given BSP specific - * flash id. - */ -struct hal_flash; -const struct hal_flash *hal_bsp_flash_dev(uint8_t flash_id); - -/* - * Grows heap by given amount. XXX giving space back not implemented. - */ -void *_sbrk(int incr); - -/* - * Report which memory areas should be included inside a coredump. - */ -struct hal_bsp_mem_dump { - void *hbmd_start; - uint32_t hbmd_size; -}; - -const struct hal_bsp_mem_dump *hal_bsp_core_dump(int *area_cnt); - -/* - * Get unique HW identifier/serial number for platform. - * Returns the number of bytes filled in. - */ -#define HAL_BSP_MAX_ID_LEN 32 -int hal_bsp_hw_id(uint8_t *id, int max_len); - -#define HAL_BSP_POWER_ON (1) -#define HAL_BSP_POWER_WFI (2) -#define HAL_BSP_POWER_SLEEP (3) -#define HAL_BSP_POWER_DEEP_SLEEP (4) -#define HAL_BSP_POWER_OFF (5) -#define HAL_BSP_POWER_PERUSER (128) - -int hal_bsp_power_state(int state); - -/* Returns priority of given interrupt number */ -uint32_t hal_bsp_get_nvic_priority(int irq_num, uint32_t pri); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/zephyr/include/hal/hal_flash.h b/mcuboot/boot/zephyr/include/hal/hal_flash.h deleted file mode 100644 index 2895479b4..000000000 --- a/mcuboot/boot/zephyr/include/hal/hal_flash.h +++ /dev/null @@ -1,43 +0,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 H_HAL_FLASH_ -#define H_HAL_FLASH_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -int hal_flash_read(uint8_t flash_id, uint32_t address, void *dst, - uint32_t num_bytes); -int hal_flash_write(uint8_t flash_id, uint32_t address, const void *src, - uint32_t num_bytes); -int hal_flash_erase_sector(uint8_t flash_id, uint32_t sector_address); -int hal_flash_erase(uint8_t flash_id, uint32_t address, uint32_t num_bytes); -uint8_t hal_flash_align(uint8_t flash_id); -int hal_flash_init(void); - - -#ifdef __cplusplus -} -#endif - -#endif /* H_HAL_FLASH_ */ diff --git a/mcuboot/boot/zephyr/include/mcuboot-mbedtls-cfg.h b/mcuboot/boot/zephyr/include/mcuboot-mbedtls-cfg.h deleted file mode 100644 index 2bab537d7..000000000 --- a/mcuboot/boot/zephyr/include/mcuboot-mbedtls-cfg.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2018 Open Source Foundries Limited - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef _MCUBOOT_MBEDTLS_CONFIG_ -#define _MCUBOOT_MBEDTLS_CONFIG_ - -/** - * @file - * - * This is the top-level mbedTLS configuration file for MCUboot. The - * configuration depends on the signature type, so this file just - * pulls in the right header depending on that setting. - */ - -/* - * IMPORTANT: - * - * If you put any "generic" definitions in here, make sure to update - * the simulator build.rs accordingly. - */ - -#if defined(CONFIG_BOOT_SIGNATURE_TYPE_RSA) || defined(CONFIG_BOOT_ENCRYPT_RSA) -#include "config-rsa.h" -#elif defined(CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256) || \ - defined(CONFIG_BOOT_ENCRYPT_EC256) || \ - (defined(CONFIG_BOOT_ENCRYPT_X25519) && !defined(CONFIG_BOOT_SIGNATURE_TYPE_ED25519)) -#include "config-asn1.h" -#elif defined(CONFIG_BOOT_SIGNATURE_TYPE_ED25519) -#include "config-ed25519.h" -#else -#error "Cannot configure mbedTLS; signature type is unknown." -#endif - -#endif diff --git a/mcuboot/boot/zephyr/include/mcuboot_config/mcuboot_config.h b/mcuboot/boot/zephyr/include/mcuboot_config/mcuboot_config.h deleted file mode 100644 index a64208832..000000000 --- a/mcuboot/boot/zephyr/include/mcuboot_config/mcuboot_config.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2018 Open Source Foundries Limited - * Copyright (c) 2019-2020 Arm Limited - * Copyright (c) 2019-2020 Linaro Limited - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef __MCUBOOT_CONFIG_H__ -#define __MCUBOOT_CONFIG_H__ - -/* - * This file is also included by the simulator, but we don't want to - * define anything here in simulator builds. - * - * Instead of using mcuboot_config.h, the simulator adds MCUBOOT_xxx - * configuration flags to the compiler command lines based on the - * values of environment variables. However, the file still must - * exist, or bootutil won't build. - */ -#ifndef __BOOTSIM__ - -#ifdef CONFIG_BOOT_SIGNATURE_TYPE_RSA -#define MCUBOOT_SIGN_RSA -# if (CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN != 2048 && \ - CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN != 3072) -# error "Invalid RSA key size (must be 2048 or 3072)" -# else -# define MCUBOOT_SIGN_RSA_LEN CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN -# endif -#elif defined(CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256) -#define MCUBOOT_SIGN_EC256 -#elif defined(CONFIG_BOOT_SIGNATURE_TYPE_ED25519) -#define MCUBOOT_SIGN_ED25519 -#endif - -#ifdef CONFIG_BOOT_USE_MBEDTLS -#define MCUBOOT_USE_MBED_TLS -#elif defined(CONFIG_BOOT_USE_TINYCRYPT) -#define MCUBOOT_USE_TINYCRYPT -#elif defined(CONFIG_BOOT_USE_CC310) -#define MCUBOOT_USE_CC310 -#ifdef CONFIG_BOOT_USE_NRF_CC310_BL -#define MCUBOOT_USE_NRF_CC310_BL -#endif -#endif - -#ifdef CONFIG_BOOT_HW_KEY -#define MCUBOOT_HW_KEY -#endif - -#ifdef CONFIG_BOOT_VALIDATE_SLOT0 -#define MCUBOOT_VALIDATE_PRIMARY_SLOT -#endif - -#ifdef CONFIG_BOOT_UPGRADE_ONLY -#define MCUBOOT_OVERWRITE_ONLY -#define MCUBOOT_OVERWRITE_ONLY_FAST -#endif - -#ifdef CONFIG_BOOT_SWAP_USING_MOVE -#define MCUBOOT_SWAP_USING_MOVE 1 -#endif - -#ifdef CONFIG_LOG -#define MCUBOOT_HAVE_LOGGING 1 -#endif - -#ifdef CONFIG_BOOT_SWAP_SAVE_ENCTLV -#define MCUBOOT_SWAP_SAVE_ENCTLV 1 -#endif - -#ifdef CONFIG_BOOT_ENCRYPT_RSA -#define MCUBOOT_ENC_IMAGES -#define MCUBOOT_ENCRYPT_RSA -#endif - -#ifdef CONFIG_BOOT_ENCRYPT_EC256 -#define MCUBOOT_ENC_IMAGES -#define MCUBOOT_ENCRYPT_EC256 -#endif - -#ifdef CONFIG_BOOT_ENCRYPT_X25519 -#define MCUBOOT_ENC_IMAGES -#define MCUBOOT_ENCRYPT_X25519 -#endif - -#ifdef CONFIG_BOOT_BOOTSTRAP -#define MCUBOOT_BOOTSTRAP 1 -#endif - -#ifdef CONFIG_BOOT_USE_BENCH -#define MCUBOOT_USE_BENCH 1 -#endif - -#ifdef CONFIG_UPDATEABLE_IMAGE_NUMBER -#define MCUBOOT_IMAGE_NUMBER CONFIG_UPDATEABLE_IMAGE_NUMBER -#else -#define MCUBOOT_IMAGE_NUMBER 1 -#endif - -#ifdef CONFIG_MCUBOOT_DOWNGRADE_PREVENTION -#define MCUBOOT_DOWNGRADE_PREVENTION 1 -#endif - -#ifdef CONFIG_MCUBOOT_HW_DOWNGRADE_PREVENTION -#define MCUBOOT_HW_ROLLBACK_PROT -#endif - -#ifdef CONFIG_MEASURED_BOOT -#define MCUBOOT_MEASURED_BOOT -#endif - -#ifdef CONFIG_BOOT_SHARE_DATA -#define MCUBOOT_DATA_SHARING -#endif - -/* - * Enabling this option uses newer flash map APIs. This saves RAM and - * avoids deprecated API usage. - * - * (This can be deleted when flash_area_to_sectors() is removed instead - * of simply deprecated.) - */ -#define MCUBOOT_USE_FLASH_AREA_GET_SECTORS - -#define MCUBOOT_MAX_IMG_SECTORS CONFIG_BOOT_MAX_IMG_SECTORS - -#endif /* !__BOOTSIM__ */ - -#define MCUBOOT_WATCHDOG_FEED() \ - do { \ - /* TODO: to be implemented */ \ - } while (0) - -#endif /* __MCUBOOT_CONFIG_H__ */ diff --git a/mcuboot/boot/zephyr/include/mcuboot_config/mcuboot_logging.h b/mcuboot/boot/zephyr/include/mcuboot_config/mcuboot_logging.h deleted file mode 100644 index fa43a8044..000000000 --- a/mcuboot/boot/zephyr/include/mcuboot_config/mcuboot_logging.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2018 Runtime Inc - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef __MCUBOOT_LOGGING_H__ -#define __MCUBOOT_LOGGING_H__ - -#ifndef __BOOTSIM__ - -/* - * When building for targets running Zephyr, delegate to its native - * logging subsystem. - */ - -#define MCUBOOT_LOG_MODULE_DECLARE(domain) LOG_MODULE_DECLARE(domain, CONFIG_MCUBOOT_LOG_LEVEL) -#define MCUBOOT_LOG_MODULE_REGISTER(domain) LOG_MODULE_REGISTER(domain, CONFIG_MCUBOOT_LOG_LEVEL) - -#define MCUBOOT_LOG_ERR(...) LOG_ERR(__VA_ARGS__) -#define MCUBOOT_LOG_WRN(...) LOG_WRN(__VA_ARGS__) -#define MCUBOOT_LOG_INF(...) LOG_INF(__VA_ARGS__) -#define MCUBOOT_LOG_DBG(...) LOG_DBG(__VA_ARGS__) -#define MCUBOOT_LOG_SIM(...) IGNORE(__VA_ARGS__) - -#include - -#endif /* !__BOOTSIM__ */ - -#endif /* __MCUBOOT_LOGGING_H__ */ diff --git a/mcuboot/boot/zephyr/include/os/os.h b/mcuboot/boot/zephyr/include/os/os.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/mcuboot/boot/zephyr/include/os/os_heap.h b/mcuboot/boot/zephyr/include/os/os_heap.h deleted file mode 100644 index 4413568e4..000000000 --- a/mcuboot/boot/zephyr/include/os/os_heap.h +++ /dev/null @@ -1,38 +0,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 H_OS_HEAP_ -#define H_OS_HEAP_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -void *os_malloc(size_t size); -void os_free(void *mem); -void *os_realloc(void *ptr, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/mcuboot/boot/zephyr/include/os/os_malloc.h b/mcuboot/boot/zephyr/include/os/os_malloc.h deleted file mode 100644 index 32b72c2a6..000000000 --- a/mcuboot/boot/zephyr/include/os/os_malloc.h +++ /dev/null @@ -1,42 +0,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 H_OS_MALLOC_ -#define H_OS_MALLOC_ - -#include "os/os_heap.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#undef malloc -#define malloc os_malloc - -#undef free -#define free os_free - -#undef realloc -#define realloc os_realloc - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mcuboot/boot/zephyr/include/platform-bench.h b/mcuboot/boot/zephyr/include/platform-bench.h deleted file mode 100644 index ed746122a..000000000 --- a/mcuboot/boot/zephyr/include/platform-bench.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2019 Linaro Limited - * - * 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. - */ - -#ifndef H_ZEPHYR_BENCH_H__ -#define H_ZEPHYR_BENCH_H__ - -#include -#include -#include "zephyr.h" -#include "bootutil/bootutil_log.h" - -/* TODO: Unclear if this can be here (redundantly). */ -MCUBOOT_LOG_MODULE_DECLARE(mcuboot); - -typedef uint32_t bench_state_t; - -#define plat_bench_start(_s) do { \ - BOOT_LOG_ERR("start benchmark"); \ - *(_s) = k_cycle_get_32(); \ -} while (0) - -#define plat_bench_stop(_s) do { \ - uint32_t _stop_time = k_cycle_get_32(); \ - BOOT_LOG_ERR("bench: %" PRId32 " cycles", _stop_time - *(_s)); \ -} while (0) - -#endif /* not H_ZEPHYR_BENCH_H__ */ diff --git a/mcuboot/boot/zephyr/include/serial_adapter/serial_adapter.h b/mcuboot/boot/zephyr/include/serial_adapter/serial_adapter.h deleted file mode 100644 index 1f407a138..000000000 --- a/mcuboot/boot/zephyr/include/serial_adapter/serial_adapter.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2017 Nordic Semiconductor ASA - * - * 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. - */ - -#ifndef H_SERIAL_ADAPTER -#define H_SERIAL_ADAPTER - -int -console_out(int c); - -void -console_write(const char *str, int cnt); - -int -boot_console_init(void); - -int -console_read(char *str, int str_cnt, int *newline); - -#endif // SERIAL_ADAPTER diff --git a/mcuboot/boot/zephyr/include/sysflash/sysflash.h b/mcuboot/boot/zephyr/include/sysflash/sysflash.h deleted file mode 100644 index 66dce1d24..000000000 --- a/mcuboot/boot/zephyr/include/sysflash/sysflash.h +++ /dev/null @@ -1,44 +0,0 @@ -/* Manual version of auto-generated version. */ - -#ifndef __SYSFLASH_H__ -#define __SYSFLASH_H__ - -#include -#include - -#if (MCUBOOT_IMAGE_NUMBER == 1) -/* - * NOTE: the definition below returns the same values for true/false on - * purpose, to avoid having to mark x as non-used by all callers when - * running in single image mode. - */ -#define FLASH_AREA_IMAGE_PRIMARY(x) (((x) == 0) ? \ - FLASH_AREA_ID(image_0) : \ - FLASH_AREA_ID(image_0)) -#define FLASH_AREA_IMAGE_SECONDARY(x) (((x) == 0) ? \ - FLASH_AREA_ID(image_1) : \ - FLASH_AREA_ID(image_1)) -#elif (MCUBOOT_IMAGE_NUMBER == 2) -/* MCUBoot currently supports only up to 2 updateable firmware images. - * If the number of the current image is greater than MCUBOOT_IMAGE_NUMBER - 1 - * then a dummy value will be assigned to the flash area macros. - */ -#define FLASH_AREA_IMAGE_PRIMARY(x) (((x) == 0) ? \ - FLASH_AREA_ID(image_0) : \ - ((x) == 1) ? \ - FLASH_AREA_ID(image_2) : \ - 255) -#define FLASH_AREA_IMAGE_SECONDARY(x) (((x) == 0) ? \ - FLASH_AREA_ID(image_1) : \ - ((x) == 1) ? \ - FLASH_AREA_ID(image_3) : \ - 255) -#else -#error "Image slot and flash area mapping is not defined" -#endif - -#if !defined(CONFIG_BOOT_SWAP_USING_MOVE) -#define FLASH_AREA_IMAGE_SCRATCH FLASH_AREA_ID(image_scratch) -#endif - -#endif /* __SYSFLASH_H__ */ diff --git a/mcuboot/boot/zephyr/include/target.h b/mcuboot/boot/zephyr/include/target.h deleted file mode 100644 index 2e0f5fdaf..000000000 --- a/mcuboot/boot/zephyr/include/target.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2017, Linaro Ltd - * Copyright (c) 2019, Arm Limited - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef H_TARGETS_TARGET_ -#define H_TARGETS_TARGET_ - -#if defined(MCUBOOT_TARGET_CONFIG) -/* - * Target-specific definitions are permitted in legacy cases that - * don't provide the information via DTS, etc. - */ -#include MCUBOOT_TARGET_CONFIG -#else -/* - * Otherwise, the Zephyr SoC header and the DTS provide most - * everything we need. - */ -#include -#include - -#define FLASH_ALIGN FLASH_WRITE_BLOCK_SIZE - -#endif /* !defined(MCUBOOT_TARGET_CONFIG) */ - -#if DT_NODE_HAS_PROP(DT_INST(0, jedec_spi_nor), label) -#define JEDEC_SPI_NOR_0_LABEL DT_LABEL(DT_INST(0, jedec_spi_nor)) -#endif - -/* - * Sanity check the target support. - */ -#if (!defined(CONFIG_XTENSA) && !defined(DT_CHOSEN_ZEPHYR_FLASH_CONTROLLER_LABEL)) || \ - (defined(CONFIG_XTENSA) && !defined(JEDEC_SPI_NOR_0_LABEL)) || \ - !defined(FLASH_ALIGN) || \ - !(FLASH_AREA_LABEL_EXISTS(image_0)) || \ - !(FLASH_AREA_LABEL_EXISTS(image_1)) || \ - (!defined(CONFIG_BOOT_SWAP_USING_MOVE) && !(FLASH_AREA_LABEL_EXISTS(image_scratch))) -#error "Target support is incomplete; cannot build mcuboot." -#endif - -#if (MCUBOOT_IMAGE_NUMBER == 2) && (!(FLASH_AREA_LABEL_EXISTS(image_2)) || \ - !(FLASH_AREA_LABEL_EXISTS(image_3))) -#error "Target support is incomplete; cannot build mcuboot." -#endif - -#endif /* H_TARGETS_TARGET_ */ diff --git a/mcuboot/boot/zephyr/keys.c b/mcuboot/boot/zephyr/keys.c deleted file mode 100644 index 72147483a..000000000 --- a/mcuboot/boot/zephyr/keys.c +++ /dev/null @@ -1,216 +0,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. - */ - -#include - -/* - * Even though this is in principle a Zephyr-specific file, the - * simulator builds it and uses it as well. Because of that, we can't - * use Kconfig symbols for key types, and have to rely on the MCUBoot - * symbols (which Zephyr provides via this header, and the simulator - * provides via the compiler command line). - */ -#include - -#if !defined(MCUBOOT_HW_KEY) -#if defined(MCUBOOT_SIGN_RSA) -#define HAVE_KEYS -extern const unsigned char rsa_pub_key[]; -extern unsigned int rsa_pub_key_len; -#elif defined(MCUBOOT_SIGN_EC256) -#define HAVE_KEYS -extern const unsigned char ecdsa_pub_key[]; -extern unsigned int ecdsa_pub_key_len; -#elif defined(MCUBOOT_SIGN_ED25519) -#define HAVE_KEYS -extern const unsigned char ed25519_pub_key[]; -extern unsigned int ed25519_pub_key_len; -#endif - -/* - * NOTE: *_pub_key and *_pub_key_len are autogenerated based on the provided - * key file. If no key file was configured, the array and length must be - * provided and added to the build manually. - */ -#if defined(HAVE_KEYS) -const struct bootutil_key bootutil_keys[] = { - { -#if defined(MCUBOOT_SIGN_RSA) - .key = rsa_pub_key, - .len = &rsa_pub_key_len, -#elif defined(MCUBOOT_SIGN_EC256) - .key = ecdsa_pub_key, - .len = &ecdsa_pub_key_len, -#elif defined(MCUBOOT_SIGN_ED25519) - .key = ed25519_pub_key, - .len = &ed25519_pub_key_len, -#endif - }, -}; -const int bootutil_key_cnt = 1; -#endif /* HAVE_KEYS */ -#else -unsigned int pub_key_len; -struct bootutil_key bootutil_keys[1] = { - { - .key = 0, - .len = &pub_key_len, - } -}; -const int bootutil_key_cnt = 1; -#endif /* !MCUBOOT_HW_KEY */ - -#if defined(MCUBOOT_ENCRYPT_RSA) -unsigned char enc_priv_key[] = { - 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, - 0xb4, 0x26, 0x14, 0x49, 0x3d, 0x16, 0x13, 0x3a, 0x6d, 0x9c, 0x84, 0xa9, - 0x8b, 0x6a, 0x10, 0x20, 0x61, 0xef, 0x48, 0x04, 0xa4, 0x4b, 0x24, 0xf3, - 0x00, 0x32, 0xac, 0x22, 0xe0, 0x30, 0x27, 0x70, 0x18, 0xe5, 0x55, 0xc8, - 0xb8, 0x05, 0x34, 0x03, 0xb0, 0xf8, 0xa5, 0x96, 0xd2, 0x48, 0x58, 0xef, - 0x70, 0xb0, 0x09, 0xdb, 0xe3, 0x58, 0x62, 0xef, 0x99, 0x63, 0x01, 0xb2, - 0x89, 0xc4, 0xb3, 0xf6, 0x9e, 0x62, 0xbf, 0x4d, 0xc2, 0x8a, 0xd0, 0xc9, - 0x4d, 0x43, 0xa3, 0xd8, 0xe5, 0x1d, 0xec, 0x62, 0x63, 0x08, 0xe2, 0x20, - 0xa5, 0xfc, 0x78, 0xd0, 0x3e, 0x74, 0xc8, 0xa4, 0x1b, 0x36, 0xad, 0x7b, - 0xf5, 0x06, 0xae, 0x4d, 0x51, 0x9b, 0x40, 0xce, 0x30, 0x4f, 0x6c, 0xea, - 0xf9, 0xe9, 0x74, 0xea, 0x06, 0xee, 0x9c, 0xe4, 0x14, 0x68, 0x20, 0xb9, - 0x3d, 0xe7, 0x11, 0x14, 0x8b, 0x25, 0xa3, 0xff, 0x4c, 0x8a, 0xf3, 0x53, - 0xee, 0x6b, 0x3e, 0xef, 0x34, 0xcd, 0x6a, 0x3f, 0x62, 0x68, 0xc0, 0xff, - 0x78, 0x4c, 0xb0, 0xc3, 0xe6, 0x96, 0x61, 0xfc, 0x1f, 0x18, 0xf1, 0x7a, - 0x82, 0xe2, 0x8f, 0x35, 0xa8, 0x2b, 0x86, 0x16, 0xa4, 0x46, 0xfb, 0xac, - 0x7e, 0x41, 0xdb, 0x02, 0x05, 0x91, 0x6d, 0xdf, 0xc1, 0xde, 0x13, 0x95, - 0x9c, 0xf9, 0x9e, 0x5e, 0x72, 0xba, 0xa7, 0x25, 0x93, 0xfb, 0xdc, 0xe8, - 0xab, 0x86, 0x45, 0x88, 0x47, 0x2d, 0xed, 0xee, 0xee, 0x97, 0x9e, 0xce, - 0x5d, 0x9b, 0x04, 0x04, 0x40, 0x7c, 0xcb, 0x7c, 0x3d, 0x2c, 0x74, 0xab, - 0xa4, 0xcc, 0x64, 0xa3, 0x5c, 0x95, 0x3d, 0xd4, 0xa2, 0xdc, 0x92, 0xb2, - 0xc8, 0x18, 0xcb, 0xf9, 0x00, 0x39, 0x81, 0x8f, 0x8f, 0x40, 0xc2, 0xdf, - 0x99, 0x29, 0xac, 0x8a, 0xc2, 0x3b, 0xd8, 0xa4, 0xf2, 0xad, 0xaf, 0x74, - 0xc0, 0x11, 0xc7, 0x99, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, - 0x00, 0x42, 0x47, 0x80, 0x4f, 0x31, 0xda, 0x5d, 0x58, 0xb1, 0xdb, 0x54, - 0x33, 0xcc, 0xc7, 0x49, 0x07, 0xa1, 0x00, 0x98, 0x4e, 0x9c, 0xe3, 0xc8, - 0xc4, 0x5e, 0xde, 0x45, 0xd6, 0xcf, 0x04, 0xe8, 0x7d, 0xa5, 0xab, 0x3a, - 0xd4, 0x8e, 0x5f, 0xdb, 0xb3, 0x3f, 0xf9, 0x3b, 0x73, 0x32, 0x0a, 0xcc, - 0x2d, 0xcc, 0x17, 0xf8, 0x88, 0x9e, 0x2c, 0x76, 0xba, 0x10, 0x85, 0x0c, - 0xaa, 0xd3, 0x65, 0x3b, 0x91, 0x10, 0xd4, 0xe3, 0xed, 0x88, 0x15, 0xea, - 0x9b, 0x25, 0x82, 0x2d, 0x56, 0x2f, 0x75, 0xc2, 0xf2, 0xaf, 0xdd, 0x24, - 0xd5, 0x3e, 0x3c, 0x95, 0x76, 0x88, 0x84, 0x0f, 0x0d, 0xd1, 0xb5, 0x5c, - 0x3e, 0xae, 0xf7, 0xb6, 0x49, 0x5c, 0x2c, 0xf2, 0xba, 0xe9, 0xab, 0x4f, - 0x37, 0x64, 0x9b, 0x30, 0x18, 0xaa, 0x54, 0x40, 0x04, 0xea, 0x3d, 0x25, - 0x4d, 0x02, 0x29, 0x71, 0x6f, 0x4d, 0x82, 0x9b, 0xc3, 0x44, 0x2a, 0x9d, - 0x0c, 0x98, 0xd3, 0xc8, 0x15, 0x0d, 0x04, 0x93, 0x60, 0x30, 0xc7, 0x5e, - 0x79, 0xea, 0x53, 0x9d, 0xc0, 0x0e, 0x81, 0xac, 0x90, 0xbc, 0x9e, 0x1e, - 0xd2, 0x28, 0x0f, 0x10, 0xf5, 0x1f, 0xdf, 0x38, 0x7f, 0x8a, 0x90, 0x8d, - 0x49, 0x07, 0x7d, 0x78, 0xcb, 0xa7, 0xef, 0x92, 0x6d, 0x3b, 0x13, 0x95, - 0x9b, 0xba, 0x83, 0xc6, 0xb3, 0x71, 0x25, 0x27, 0x07, 0x99, 0x54, 0x82, - 0x3d, 0xec, 0xc5, 0xf8, 0xb4, 0xa0, 0x38, 0x7a, 0x59, 0x6a, 0x0b, 0xca, - 0x69, 0x6c, 0x17, 0xa4, 0x18, 0xe0, 0xb4, 0xaa, 0x89, 0x99, 0x8f, 0xcb, - 0x71, 0x34, 0x09, 0x1b, 0x6e, 0xe6, 0x87, 0x00, 0xb5, 0xba, 0x70, 0x8a, - 0x29, 0x3d, 0x9a, 0x06, 0x18, 0x2d, 0x66, 0x5e, 0x61, 0x37, 0xeb, 0xdd, - 0x5e, 0xc8, 0x28, 0x92, 0x05, 0x30, 0xfd, 0xb8, 0x65, 0xb1, 0x7f, 0xbf, - 0x2d, 0x55, 0x12, 0x91, 0xc1, 0x02, 0x81, 0x81, 0x00, 0xda, 0x65, 0xda, - 0x38, 0x7c, 0x18, 0xfb, 0x00, 0x11, 0x60, 0xeb, 0x37, 0x65, 0xb8, 0x83, - 0x62, 0x88, 0xc4, 0x3a, 0x4e, 0x64, 0x6a, 0xf3, 0x3e, 0x4e, 0xc0, 0x34, - 0x19, 0x8a, 0xcb, 0x4a, 0xca, 0x2f, 0x5d, 0x50, 0x7a, 0xac, 0xf7, 0x9e, - 0x87, 0x5a, 0xfc, 0x4d, 0x49, 0xd7, 0xf9, 0x21, 0xf5, 0x0b, 0x6f, 0x57, - 0x41, 0x3d, 0x8f, 0xb8, 0xec, 0x7f, 0xcc, 0x92, 0x09, 0xbe, 0xd3, 0xa4, - 0xc3, 0x14, 0x85, 0x21, 0x5d, 0x05, 0xa3, 0xaa, 0x20, 0xf6, 0x62, 0x44, - 0x50, 0x03, 0x5e, 0x53, 0x4a, 0xcd, 0x6a, 0xb6, 0x65, 0x8e, 0x4e, 0x4b, - 0x3f, 0x25, 0xc6, 0x16, 0x31, 0xf5, 0x99, 0x13, 0x77, 0x42, 0xda, 0xdc, - 0x70, 0x4d, 0x65, 0xb0, 0x99, 0x0f, 0xdf, 0x5a, 0xb1, 0x45, 0xf0, 0xb9, - 0x8e, 0xa0, 0xae, 0x4f, 0x4d, 0x65, 0x09, 0x84, 0xb5, 0x38, 0x29, 0xbf, - 0x69, 0xe0, 0x88, 0x1f, 0x27, 0x02, 0x81, 0x81, 0x00, 0xd3, 0x2a, 0x59, - 0xec, 0x28, 0xc3, 0x0d, 0x4f, 0x92, 0x96, 0xca, 0x67, 0x94, 0xfc, 0x2e, - 0xa6, 0x86, 0x68, 0x45, 0x53, 0x92, 0xcc, 0x86, 0x7f, 0x8a, 0xe1, 0x5d, - 0xe8, 0x1d, 0x9e, 0xbb, 0x1e, 0x00, 0x26, 0x1d, 0x80, 0x12, 0xff, 0x9c, - 0x11, 0x0a, 0xbd, 0xa6, 0xc3, 0x8d, 0x48, 0xda, 0xfc, 0x10, 0xf7, 0x7a, - 0x16, 0x07, 0x15, 0xa0, 0x3a, 0xd3, 0x94, 0xfb, 0x52, 0x87, 0x39, 0xee, - 0xe7, 0xc4, 0x26, 0x49, 0x16, 0xc6, 0xc0, 0x83, 0x25, 0xbf, 0x6a, 0x4e, - 0x8c, 0x0b, 0x10, 0x85, 0x66, 0xab, 0x7e, 0xae, 0xac, 0x4c, 0x69, 0x3c, - 0x44, 0xeb, 0xcd, 0xe9, 0xf6, 0x64, 0x8b, 0x4a, 0xd8, 0x6a, 0x4d, 0x6d, - 0x47, 0xa9, 0xb8, 0x55, 0x72, 0xc1, 0xfd, 0xf4, 0x81, 0x4c, 0x66, 0xbe, - 0x49, 0xf2, 0x75, 0x4f, 0x80, 0xf1, 0x20, 0x38, 0xb8, 0x6a, 0x1b, 0x75, - 0x41, 0x30, 0x0f, 0x1b, 0x3f, 0x02, 0x81, 0x80, 0x09, 0x35, 0xfa, 0x7a, - 0x1f, 0x61, 0xbe, 0x54, 0x46, 0x67, 0x5c, 0x04, 0x3e, 0x1a, 0x06, 0x10, - 0x85, 0xcc, 0x20, 0xd9, 0x65, 0x8a, 0xcd, 0x2f, 0x77, 0x8a, 0xcb, 0xa7, - 0xb8, 0x1e, 0xd2, 0xcc, 0xac, 0x2a, 0xb7, 0x56, 0x35, 0x2d, 0x4c, 0x56, - 0x51, 0x14, 0x0a, 0xfe, 0x6e, 0x49, 0x67, 0x91, 0x3a, 0x26, 0x3b, 0xfb, - 0xd8, 0x68, 0xd3, 0x57, 0xc6, 0x1c, 0x0e, 0x9c, 0xb2, 0x9b, 0xa2, 0x7b, - 0x47, 0xc6, 0x45, 0x9d, 0xf2, 0xba, 0xf0, 0x55, 0xeb, 0x8e, 0x41, 0x6b, - 0x4e, 0x79, 0x0f, 0xf2, 0x3b, 0xaf, 0xa0, 0x79, 0xb0, 0x02, 0xc5, 0x51, - 0xa8, 0x7a, 0x2e, 0x3d, 0x75, 0x2a, 0x3b, 0x93, 0xf0, 0x11, 0xe2, 0xf2, - 0x29, 0x91, 0x7c, 0x5d, 0x38, 0x3a, 0x27, 0x4d, 0x0a, 0xb2, 0x18, 0x61, - 0x57, 0x8d, 0x82, 0x72, 0xb5, 0x2c, 0x2d, 0x98, 0xa7, 0x01, 0xbb, 0xbc, - 0xef, 0x67, 0x4e, 0x49, 0x02, 0x81, 0x81, 0x00, 0xb2, 0x70, 0x53, 0x54, - 0x70, 0x8d, 0x82, 0xad, 0xff, 0x1d, 0x55, 0x24, 0x7a, 0x8d, 0x2f, 0x8e, - 0xa0, 0x7d, 0x74, 0x37, 0xcf, 0x10, 0xed, 0x86, 0xd1, 0x80, 0xe7, 0xad, - 0xc1, 0x79, 0xe4, 0x7c, 0xd1, 0x7b, 0x63, 0xea, 0x5a, 0x23, 0x8d, 0x6a, - 0x09, 0x3d, 0x81, 0xb2, 0x35, 0xad, 0x9e, 0xfe, 0xea, 0x07, 0x76, 0x2f, - 0x2f, 0x05, 0x63, 0x44, 0xd2, 0x8e, 0x4e, 0x61, 0xca, 0xcb, 0x75, 0xca, - 0x7b, 0xc2, 0x2e, 0x79, 0x04, 0xb2, 0xa1, 0x20, 0x40, 0xc4, 0x40, 0x63, - 0xae, 0xe5, 0xe3, 0x14, 0x83, 0x4e, 0xa5, 0xa4, 0x0b, 0x5d, 0xd2, 0x04, - 0x1b, 0x8f, 0x01, 0x69, 0xa8, 0x44, 0xdc, 0x96, 0x4c, 0x1d, 0xe9, 0x7e, - 0x69, 0x38, 0xcf, 0x5c, 0x0d, 0xf9, 0xdf, 0xa7, 0x73, 0x3c, 0x4f, 0x08, - 0x85, 0xce, 0x03, 0xc4, 0xdd, 0xfd, 0x70, 0x70, 0xc5, 0x99, 0x36, 0x58, - 0x43, 0x98, 0x40, 0x59, 0x02, 0x81, 0x81, 0x00, 0xd5, 0xaa, 0xfb, 0xec, - 0x8d, 0xc6, 0xdd, 0xfa, 0x2b, 0x5a, 0x24, 0xd0, 0xda, 0x58, 0xbd, 0x87, - 0x92, 0x1a, 0x29, 0x62, 0x13, 0x1d, 0x4b, 0x79, 0x1b, 0xbe, 0x79, 0x7d, - 0xad, 0x79, 0xca, 0x17, 0x75, 0xda, 0xe8, 0x32, 0xe8, 0xa0, 0x9e, 0xa8, - 0x77, 0x53, 0xac, 0x38, 0xd6, 0xeb, 0xe6, 0x22, 0x65, 0xc4, 0xaa, 0x4c, - 0xc8, 0xd0, 0x33, 0x1a, 0x1e, 0xbe, 0xbd, 0x73, 0x09, 0x4a, 0xfa, 0x85, - 0x5c, 0xf3, 0x0c, 0x9c, 0x81, 0x56, 0x30, 0xa7, 0xf7, 0x9b, 0xf4, 0x92, - 0x9c, 0x6b, 0x93, 0x6a, 0x00, 0x33, 0xdc, 0x2f, 0x54, 0x1e, 0x78, 0xd4, - 0x97, 0xec, 0x24, 0xa2, 0xdb, 0x3d, 0x03, 0x33, 0x09, 0xb2, 0x2c, 0x03, - 0x05, 0x40, 0xde, 0x52, 0xf2, 0x9b, 0xfa, 0x00, 0x8d, 0x4b, 0xfe, 0x5b, - 0x9b, 0x9c, 0x73, 0xad, 0xfb, 0x7a, 0x00, 0x42, 0x62, 0x9e, 0xa0, 0x95, - 0x55, 0x50, 0x32, 0x87 -}; -static unsigned int enc_priv_key_len = 1192; - -const struct bootutil_key bootutil_enc_key = { - .key = enc_priv_key, - .len = &enc_priv_key_len, -}; -#elif defined(MCUBOOT_ENCRYPT_EC256) -unsigned char enc_priv_key[] = { - 0x30, 0x81, 0x43, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, - 0x03, 0x01, 0x07, 0x04, 0x29, 0x30, 0x27, 0x02, 0x01, 0x01, 0x04, 0x20, - 0xf6, 0x1e, 0x51, 0x9d, 0xf8, 0xfa, 0xdd, 0xa1, 0xb7, 0xd9, 0xa9, 0x64, - 0x64, 0x3b, 0x54, 0xd0, 0x3d, 0xd0, 0x1f, 0xe5, 0x78, 0xd9, 0x17, 0x98, - 0xa5, 0x28, 0xca, 0xcc, 0x6b, 0x67, 0x9e, 0x06, 0xa1, 0x44, -}; -static unsigned int enc_priv_key_len = 70; -const struct bootutil_key bootutil_enc_key = { - .key = enc_priv_key, - .len = &enc_priv_key_len, -}; -#elif defined(MCUBOOT_ENCRYPT_X25519) -unsigned char enc_key[] = { - 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x6e, - 0x04, 0x22, 0x04, 0x20, 0x28, 0x80, 0x2f, 0xef, 0xef, 0x82, 0x95, 0x50, - 0xf1, 0x41, 0x93, 0x03, 0x6c, 0x1b, 0xb9, 0x49, 0x6c, 0x51, 0xe5, 0x26, - 0x87, 0x8f, 0x77, 0x07, 0xf8, 0xb4, 0x1f, 0x04, 0x45, 0x6d, 0x84, 0x4f, -}; -static unsigned int enc_key_len = 48; -const struct bootutil_key bootutil_enc_key = { - .key = enc_key, - .len = &enc_key_len, -}; -#elif defined(MCUBOOT_ENCRYPT_KW) -#error "Encrypted images with AES-KW is not implemented yet." -#endif diff --git a/mcuboot/boot/zephyr/main.c b/mcuboot/boot/zephyr/main.c deleted file mode 100644 index c3e4cfef2..000000000 --- a/mcuboot/boot/zephyr/main.c +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (c) 2012-2014 Wind River Systems, Inc. - * - * 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 -#include -#include -#include -#include -#include -#include -#include - -#include "target.h" - -#include "bootutil/bootutil_log.h" -#include "bootutil/image.h" -#include "bootutil/bootutil.h" -#include "flash_map_backend/flash_map_backend.h" - -#ifdef CONFIG_MCUBOOT_SERIAL -#include "boot_serial/boot_serial.h" -#include "serial_adapter/serial_adapter.h" - -const struct boot_uart_funcs boot_funcs = { - .read = console_read, - .write = console_write -}; -#endif - -#ifdef CONFIG_BOOT_WAIT_FOR_USB_DFU -#include -#endif - -#if CONFIG_MCUBOOT_CLEANUP_ARM_CORE -#include -#endif - -#if defined(CONFIG_LOG) && !defined(CONFIG_LOG_IMMEDIATE) -#ifdef CONFIG_LOG_PROCESS_THREAD -#warning "The log internal thread for log processing can't transfer the log"\ - "well for MCUBoot." -#else -#include - -#define BOOT_LOG_PROCESSING_INTERVAL K_MSEC(30) /* [ms] */ - -/* log are processing in custom routine */ -K_THREAD_STACK_DEFINE(boot_log_stack, CONFIG_MCUBOOT_LOG_THREAD_STACK_SIZE); -struct k_thread boot_log_thread; -volatile bool boot_log_stop = false; -K_SEM_DEFINE(boot_log_sem, 1, 1); - -/* log processing need to be initalized by the application */ -#define ZEPHYR_BOOT_LOG_START() zephyr_boot_log_start() -#define ZEPHYR_BOOT_LOG_STOP() zephyr_boot_log_stop() -#endif /* CONFIG_LOG_PROCESS_THREAD */ -#else -/* synchronous log mode doesn't need to be initalized by the application */ -#define ZEPHYR_BOOT_LOG_START() do { } while (false) -#define ZEPHYR_BOOT_LOG_STOP() do { } while (false) -#endif /* defined(CONFIG_LOG) && !defined(CONFIG_LOG_IMMEDIATE) */ - -#ifdef CONFIG_SOC_FAMILY_NRF -#include - -static inline bool boot_skip_serial_recovery() -{ -#if NRF_POWER_HAS_RESETREAS - u32_t rr = nrf_power_resetreas_get(NRF_POWER); - - return !(rr == 0 || (rr & NRF_POWER_RESETREAS_RESETPIN_MASK)); -#else - return false; -#endif -} -#else -static inline bool boot_skip_serial_recovery() -{ - return false; -} -#endif - -MCUBOOT_LOG_MODULE_REGISTER(mcuboot); - -void os_heap_init(void); - -#if defined(CONFIG_ARM) -struct arm_vector_table { - uint32_t msp; - uint32_t reset; -}; - -extern void sys_clock_disable(void); - -static void do_boot(struct boot_rsp *rsp) -{ - struct arm_vector_table *vt; - uintptr_t flash_base; - int rc; - - /* The beginning of the image is the ARM vector table, containing - * the initial stack pointer address and the reset vector - * consecutively. Manually set the stack pointer and jump into the - * reset vector - */ - rc = flash_device_base(rsp->br_flash_dev_id, &flash_base); - assert(rc == 0); - - vt = (struct arm_vector_table *)(flash_base + - rsp->br_image_off + - rsp->br_hdr->ih_hdr_size); - irq_lock(); -#ifdef CONFIG_SYS_CLOCK_EXISTS - sys_clock_disable(); -#endif -#ifdef CONFIG_USB - /* Disable the USB to prevent it from firing interrupts */ - usb_disable(); -#endif -#if CONFIG_MCUBOOT_CLEANUP_ARM_CORE - cleanup_arm_nvic(); /* cleanup NVIC registers */ -#endif - __set_MSP(vt->msp); -#if CONFIG_MCUBOOT_CLEANUP_ARM_CORE - __set_CONTROL(0x00); /* application will configures core on its own */ -#endif - ((void (*)(void))vt->reset)(); -} - -#elif defined(CONFIG_XTENSA) -#define SRAM_BASE_ADDRESS 0xBE030000 - -static void copy_img_to_SRAM(int slot, unsigned int hdr_offset) -{ - const struct flash_area *fap; - int area_id; - int rc; - unsigned char *dst = (unsigned char *)(SRAM_BASE_ADDRESS + hdr_offset); - - BOOT_LOG_INF("Copying image to SRAM"); - - area_id = flash_area_id_from_image_slot(slot); - rc = flash_area_open(area_id, &fap); - if (rc != 0) { - BOOT_LOG_ERR("flash_area_open failed with %d\n", rc); - goto done; - } - - rc = flash_area_read(fap, hdr_offset, dst, fap->fa_size - hdr_offset); - if (rc != 0) { - BOOT_LOG_ERR("flash_area_read failed with %d\n", rc); - goto done; - } - -done: - flash_area_close(fap); -} - -/* Entry point (.ResetVector) is at the very beginning of the image. - * Simply copy the image to a suitable location and jump there. - */ -static void do_boot(struct boot_rsp *rsp) -{ - void *start; - - BOOT_LOG_INF("br_image_off = 0x%x\n", rsp->br_image_off); - BOOT_LOG_INF("ih_hdr_size = 0x%x\n", rsp->br_hdr->ih_hdr_size); - - /* Copy from the flash to HP SRAM */ - copy_img_to_SRAM(0, rsp->br_hdr->ih_hdr_size); - - /* Jump to entry point */ - start = (void *)(SRAM_BASE_ADDRESS + rsp->br_hdr->ih_hdr_size); - ((void (*)(void))start)(); -} - -#else -/* Default: Assume entry point is at the very beginning of the image. Simply - * lock interrupts and jump there. This is the right thing to do for X86 and - * possibly other platforms. - */ -static void do_boot(struct boot_rsp *rsp) -{ - uintptr_t flash_base; - void *start; - int rc; - - rc = flash_device_base(rsp->br_flash_dev_id, &flash_base); - assert(rc == 0); - - start = (void *)(flash_base + rsp->br_image_off + - rsp->br_hdr->ih_hdr_size); - - /* Lock interrupts and dive into the entry point */ - irq_lock(); - ((void (*)(void))start)(); -} -#endif - -#if defined(CONFIG_LOG) && !defined(CONFIG_LOG_IMMEDIATE) &&\ - !defined(CONFIG_LOG_PROCESS_THREAD) -/* The log internal thread for log processing can't transfer log well as has too - * low priority. - * Dedicated thread for log processing below uses highest application - * priority. This allows to transmit all logs without adding k_sleep/k_yield - * anywhere else int the code. - */ - -/* most simple log processing theread */ -void boot_log_thread_func(void *dummy1, void *dummy2, void *dummy3) -{ - (void)dummy1; - (void)dummy2; - (void)dummy3; - - log_init(); - - while (1) { - if (log_process(false) == false) { - if (boot_log_stop) { - break; - } - k_sleep(BOOT_LOG_PROCESSING_INTERVAL); - } - } - - k_sem_give(&boot_log_sem); -} - -void zephyr_boot_log_start(void) -{ - /* start logging thread */ - k_thread_create(&boot_log_thread, boot_log_stack, - K_THREAD_STACK_SIZEOF(boot_log_stack), - boot_log_thread_func, NULL, NULL, NULL, - K_HIGHEST_APPLICATION_THREAD_PRIO, 0, - BOOT_LOG_PROCESSING_INTERVAL); - - k_thread_name_set(&boot_log_thread, "logging"); -} - -void zephyr_boot_log_stop(void) -{ - boot_log_stop = true; - - /* wait until log procesing thread expired - * This can be reworked using a thread_join() API once a such will be - * available in zephyr. - * see https://github.com/zephyrproject-rtos/zephyr/issues/21500 - */ - (void)k_sem_take(&boot_log_sem, K_FOREVER); -} -#endif/* defined(CONFIG_LOG) && !defined(CONFIG_LOG_IMMEDIATE) &&\ - !defined(CONFIG_LOG_PROCESS_THREAD) */ - -void main(void) -{ - struct boot_rsp rsp; - int rc; - - BOOT_LOG_INF("Starting bootloader"); - - os_heap_init(); - - ZEPHYR_BOOT_LOG_START(); - -#if (!defined(CONFIG_XTENSA) && defined(DT_CHOSEN_ZEPHYR_FLASH_CONTROLLER_LABEL)) - if (!flash_device_get_binding(DT_CHOSEN_ZEPHYR_FLASH_CONTROLLER_LABEL)) { - BOOT_LOG_ERR("Flash device %s not found", - DT_CHOSEN_ZEPHYR_FLASH_CONTROLLER_LABEL); - while (1) - ; - } -#elif (defined(CONFIG_XTENSA) && defined(JEDEC_SPI_NOR_0_LABEL)) - if (!flash_device_get_binding(JEDEC_SPI_NOR_0_LABEL)) { - BOOT_LOG_ERR("Flash device %s not found", JEDEC_SPI_NOR_0_LABEL); - while (1) - ; - } -#endif - -#ifdef CONFIG_MCUBOOT_SERIAL - - struct device *detect_port; - u32_t detect_value = !CONFIG_BOOT_SERIAL_DETECT_PIN_VAL; - - detect_port = device_get_binding(CONFIG_BOOT_SERIAL_DETECT_PORT); - __ASSERT(detect_port, "Error: Bad port for boot serial detection.\n"); - - /* The default presence value is 0 which would normally be - * active-low, but historically the raw value was checked so we'll - * use the raw interface. - */ - rc = gpio_pin_configure(detect_port, CONFIG_BOOT_SERIAL_DETECT_PIN, -#ifdef GPIO_INPUT - GPIO_INPUT | GPIO_PULL_UP -#else - GPIO_DIR_IN | GPIO_PUD_PULL_UP -#endif - ); - __ASSERT(rc == 0, "Error of boot detect pin initialization.\n"); - -#ifdef GPIO_INPUT - rc = gpio_pin_get_raw(detect_port, CONFIG_BOOT_SERIAL_DETECT_PIN); - detect_value = rc; -#else - rc = gpio_pin_read(detect_port, CONFIG_BOOT_SERIAL_DETECT_PIN, - &detect_value); -#endif - __ASSERT(rc >= 0, "Error of the reading the detect pin.\n"); - if (detect_value == CONFIG_BOOT_SERIAL_DETECT_PIN_VAL && - !boot_skip_serial_recovery()) { - BOOT_LOG_INF("Enter the serial recovery mode"); - rc = boot_console_init(); - __ASSERT(rc == 0, "Error initializing boot console.\n"); - boot_serial_start(&boot_funcs); - __ASSERT(0, "Bootloader serial process was terminated unexpectedly.\n"); - } -#endif - -#ifdef CONFIG_BOOT_WAIT_FOR_USB_DFU - rc = usb_enable(NULL); - if (rc) { - BOOT_LOG_ERR("Cannot enable USB"); - } else { - BOOT_LOG_INF("Waiting for USB DFU"); - wait_for_usb_dfu(); - BOOT_LOG_INF("USB DFU wait time elapsed"); - } -#endif - - rc = boot_go(&rsp); - if (rc != 0) { - BOOT_LOG_ERR("Unable to find bootable image"); - while (1) - ; - } - - BOOT_LOG_INF("Bootloader chainload address offset: 0x%x", - rsp.br_image_off); - - BOOT_LOG_INF("Jumping to the first image slot"); - ZEPHYR_BOOT_LOG_STOP(); - do_boot(&rsp); - - BOOT_LOG_ERR("Never should get here"); - while (1) - ; -} diff --git a/mcuboot/boot/zephyr/os.c b/mcuboot/boot/zephyr/os.c deleted file mode 100644 index eaa60b4fa..000000000 --- a/mcuboot/boot/zephyr/os.c +++ /dev/null @@ -1,63 +0,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. - */ - -#include -#include - -#include "os/os_heap.h" - -#ifdef CONFIG_BOOT_USE_MBEDTLS - -#include -#include - -/* - * This is the heap for mbed TLS. The value needed depends on the key - * size and algorithm used. - * - * - RSA-2048 signing without encryption is known to work well with 6144 bytes; - * - When using RSA-2048-OAEP encryption + RSA-2048 signing, or RSA-3072 - * signing (no encryption) 10240 bytes seems to be enough. - * - * NOTE: RSA-3072 signing + RSA-2048-OAEP might require growing the size... - */ -#if (CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN == 2048) && !defined(CONFIG_BOOT_ENCRYPT_RSA) -#define CRYPTO_HEAP_SIZE 6144 -#else -# if !defined(MBEDTLS_RSA_NO_CRT) -# define CRYPTO_HEAP_SIZE 10240 -# else -# define CRYPTO_HEAP_SIZE 16384 -# endif -#endif - -static unsigned char mempool[CRYPTO_HEAP_SIZE]; - -/* - * Initialize mbedtls to be able to use the local heap. - */ -void os_heap_init(void) -{ - mbedtls_memory_buffer_alloc_init(mempool, sizeof(mempool)); -} -#else -void os_heap_init(void) -{ -} -#endif diff --git a/mcuboot/boot/zephyr/prj.conf b/mcuboot/boot/zephyr/prj.conf deleted file mode 100644 index 17826db08..000000000 --- a/mcuboot/boot/zephyr/prj.conf +++ /dev/null @@ -1,51 +0,0 @@ -CONFIG_CONSOLE_HANDLER=y -CONFIG_DEBUG=y -CONFIG_SYSTEM_CLOCK_DISABLE=y -CONFIG_SYS_POWER_MANAGEMENT=n - -CONFIG_MAIN_STACK_SIZE=10240 -CONFIG_MBEDTLS_CFG_FILE="mcuboot-mbedtls-cfg.h" - -CONFIG_BOOT_SWAP_SAVE_ENCTLV=n -CONFIG_BOOT_ENCRYPT_RSA=n -CONFIG_BOOT_ENCRYPT_EC256=n -CONFIG_BOOT_ENCRYPT_X25519=n - -CONFIG_BOOT_UPGRADE_ONLY=n -CONFIG_BOOT_BOOTSTRAP=n - -### Default to RSA -CONFIG_BOOT_SIGNATURE_TYPE_NONE=n -CONFIG_BOOT_SIGNATURE_TYPE_RSA=y -CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN=2048 -CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=n -CONFIG_BOOT_SIGNATURE_TYPE_ED25519=n - -### The bootloader generates its own signature verification based on a -### key file which needs to be provided and needs to match the selected signing -### algorithm (CONFIG_BOOT_SIGNATURE_TYPE_). -### The PEM files below are provided as examples. -CONFIG_BOOT_SIGNATURE_KEY_FILE="root-rsa-2048.pem" -#CONFIG_BOOT_SIGNATURE_KEY_FILE="root-rsa-3072.pem" -#CONFIG_BOOT_SIGNATURE_KEY_FILE="root-ec-p256.pem" -#CONFIG_BOOT_SIGNATURE_KEY_FILE="root-ed25519.pem" - -### mbedTLS has its own heap -# CONFIG_HEAP_MEM_POOL_SIZE is not set - -### We never want Zephyr's copy of tinycrypt. If tinycrypt is needed, -### MCUboot has its own copy in tree. -# CONFIG_TINYCRYPT is not set -# CONFIG_TINYCRYPT_ECC_DSA is not set -# CONFIG_TINYCRYPT_SHA256 is not set - -CONFIG_FLASH=y - -### Various Zephyr boards enable features that we don't want. -# CONFIG_BT is not set -# CONFIG_BT_CTLR is not set -# CONFIG_I2C is not set - -CONFIG_LOG=y -### Ensure Zephyr logging changes don't use more resources -CONFIG_LOG_DEFAULT_LEVEL=0 diff --git a/mcuboot/boot/zephyr/sample.yaml b/mcuboot/boot/zephyr/sample.yaml deleted file mode 100644 index b64562067..000000000 --- a/mcuboot/boot/zephyr/sample.yaml +++ /dev/null @@ -1,20 +0,0 @@ -sample: - description: mcuboot test build sample - name: mcuboot - -tests: - sample.bootloader.mcuboot: - tags: bootloader_mcuboot - platform_whitelist: nrf52840dk_nrf52840 frdm_k64f - sample.bootloader.mcuboot.serial_recovery: - extra_args: OVERLAY_CONFIG=serial_recovery.conf - platform_whitelist: nrf52840dk_nrf52840 - tags: bootloader_mcuboot - sample.bootloader.mcuboot.usb_cdc_acm_recovery: - tags: bootloader_mcuboot - platform_whitelist: nrf52840dongle_nrf52840 - sample.bootloader.mcuboot.usb_cdc_acm_recovery_log: - extra_args: OVERLAY_CONFIG=./usb_cdc_acm_log_recovery.conf - DTC_OVERLAY=./boards/nrf52840_big.overlay - platform_whitelist: nrf52840dk_nrf52840 - tags: bootloader_mcuboot diff --git a/mcuboot/boot/zephyr/serial_adapter.c b/mcuboot/boot/zephyr/serial_adapter.c deleted file mode 100644 index 63dca025a..000000000 --- a/mcuboot/boot/zephyr/serial_adapter.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (c) 2017 Nordic Semiconductor ASA - * - * 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 -#include -#include -#include -#include -#include "bootutil/bootutil_log.h" -#include - -#if defined(CONFIG_BOOT_SERIAL_UART) && defined(CONFIG_UART_CONSOLE) -#error Zephyr UART console must been disabled if serial_adapter module is used. -#endif - -MCUBOOT_LOG_MODULE_REGISTER(serial_adapter); - -/** @brief Console input representation - * - * This struct is used to represent an input line from a serial interface. - */ -struct line_input { - /** Required to use sys_slist */ - sys_snode_t node; - - int len; - /** Buffer where the input line is recorded */ - char line[CONFIG_BOOT_MAX_LINE_INPUT_LEN]; -}; - -static struct device *uart_dev; -static struct line_input line_bufs[2]; - -static sys_slist_t avail_queue; -static sys_slist_t lines_queue; - -static u16_t cur; - -static int boot_uart_fifo_getline(char **line); -static int boot_uart_fifo_init(void); - -int -console_out(int c) -{ - uart_poll_out(uart_dev, c); - - return c; -} - -void -console_write(const char *str, int cnt) -{ - int i; - - for (i = 0; i < cnt; i++) { - if (console_out((int)str[i]) == EOF) { - break; - } - } -} - -int -console_read(char *str, int str_size, int *newline) -{ - char *line; - int len; - - len = boot_uart_fifo_getline(&line); - - if (line == NULL) { - *newline = 0; - return 0; - } - - if (len > str_size - 1) { - len = str_size - 1; - } - - memcpy(str, line, len); - str[len] = '\0'; - *newline = 1; - return len + 1; -} - -int -boot_console_init(void) -{ - int i; - - /* Zephyr UART handler takes an empty buffer from avail_queue, - * stores UART input in it until EOL, and then puts it into - * lines_queue. - */ - sys_slist_init(&avail_queue); - sys_slist_init(&lines_queue); - - for (i = 0; i < ARRAY_SIZE(line_bufs); i++) { - sys_slist_append(&avail_queue, &line_bufs[i].node); - } - - return boot_uart_fifo_init(); -} - -static void -boot_uart_fifo_callback(struct device *dev) -{ - static struct line_input *cmd; - u8_t byte; - int rx; - - uart_irq_update(uart_dev); - - if (!uart_irq_rx_ready(uart_dev)) { - return; - } - - while (true) { - rx = uart_fifo_read(uart_dev, &byte, 1); - if (rx != 1) { - break; - } - - if (!cmd) { - sys_snode_t *node; - - node = sys_slist_get(&avail_queue); - if (!node) { - BOOT_LOG_ERR("Not enough memory to store" - " incoming data!"); - return; - } - cmd = CONTAINER_OF(node, struct line_input, node); - } - - if (cur < CONFIG_BOOT_MAX_LINE_INPUT_LEN) { - cmd->line[cur++] = byte; - } - - if (byte == '\n') { - cmd->len = cur; - sys_slist_append(&lines_queue, &cmd->node); - cur = 0; - cmd = NULL; - } - } -} - -static int -boot_uart_fifo_getline(char **line) -{ - static struct line_input *cmd; - sys_snode_t *node; - int key; - - key = irq_lock(); - /* Recycle cmd buffer returned previous time */ - if (cmd != NULL) { - if (sys_slist_peek_tail(&avail_queue) != &cmd->node) { - sys_slist_append(&avail_queue, &cmd->node); - } - } - - node = sys_slist_get(&lines_queue); - irq_unlock(key); - - if (node == NULL) { - cmd = NULL; - *line = NULL; - - return 0; - } - - cmd = CONTAINER_OF(node, struct line_input, node); - *line = cmd->line; - return cmd->len; -} - -static int -boot_uart_fifo_init(void) -{ -#ifdef CONFIG_BOOT_SERIAL_UART - uart_dev = device_get_binding(CONFIG_RECOVERY_UART_DEV_NAME); -#elif CONFIG_BOOT_SERIAL_CDC_ACM - uart_dev = device_get_binding(CONFIG_USB_CDC_ACM_DEVICE_NAME "_0"); - if (uart_dev) { - int rc; - rc = usb_enable(NULL); - if (rc) { - return (-1); - } - } -#endif - u8_t c; - - if (!uart_dev) { - return (-1); - } - - uart_irq_callback_set(uart_dev, boot_uart_fifo_callback); - - /* Drain the fifo */ - if (uart_irq_rx_ready(uart_dev)) { - while (uart_fifo_read(uart_dev, &c, 1)) { - ; - } - } - - cur = 0; - - uart_irq_rx_enable(uart_dev); - - /* Enable all interrupts unconditionally. Note that this is due - * to Zephyr issue #8393. This should be removed once the - * issue is fixed in upstream Zephyr. - */ - irq_unlock(0); - - return 0; -} diff --git a/mcuboot/boot/zephyr/serial_recovery.conf b/mcuboot/boot/zephyr/serial_recovery.conf deleted file mode 100644 index ddd08fcf6..000000000 --- a/mcuboot/boot/zephyr/serial_recovery.conf +++ /dev/null @@ -1,3 +0,0 @@ -CONFIG_MCUBOOT_SERIAL=y -CONFIG_BOOT_SERIAL_UART=y -CONFIG_UART_CONSOLE=n diff --git a/mcuboot/boot/zephyr/targets/arduino_101.h b/mcuboot/boot/zephyr/targets/arduino_101.h deleted file mode 100644 index 19095b383..000000000 --- a/mcuboot/boot/zephyr/targets/arduino_101.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2017 Intel 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 - * @brief Bootloader device specific configuration. - */ - -/* - * NOTE: This flash layout is a simple one for demonstration purposes. - * It assumes we are building MCUboot as a 3rd-stage loader, leaving the - * stock bootloaders on the Arduino 101 untouched. - * - * In this configuration MCUboot will live at 0x40010000 - */ - -#define FLASH_DEV_NAME CONFIG_SOC_FLASH_QMSI_DEV_NAME -#define FLASH_ALIGN 4 -#define FLASH_AREA_IMAGE_0_OFFSET 0x40020000 -#define FLASH_AREA_IMAGE_0_SIZE 0x10000 -#define FLASH_AREA_IMAGE_1_OFFSET 0x40030000 -#define FLASH_AREA_IMAGE_1_SIZE 0x10000 -#define FLASH_AREA_IMAGE_SCRATCH_OFFSET 0x40040000 -#define FLASH_AREA_IMAGE_SCRATCH_SIZE 0x10000 diff --git a/mcuboot/boot/zephyr/usb_cdc_acm_log_recovery.conf b/mcuboot/boot/zephyr/usb_cdc_acm_log_recovery.conf deleted file mode 100644 index ae412fed5..000000000 --- a/mcuboot/boot/zephyr/usb_cdc_acm_log_recovery.conf +++ /dev/null @@ -1,16 +0,0 @@ -CONFIG_LOG=y - -# The build won't fit on the partition allocated for it without size -# optimizations. -CONFIG_SIZE_OPTIMIZATIONS=y - -# Serial -CONFIG_SERIAL=y -CONFIG_UART_LINE_CTRL=y - -# MCUBoot serial -CONFIG_MCUBOOT_SERIAL=y -CONFIG_BOOT_SERIAL_CDC_ACM=y - -CONFIG_LOG_BACKEND_UART=y -CONFIG_LOG_BACKEND_RTT=n diff --git a/mcuboot/ci/check-signed-off-by.sh b/mcuboot/ci/check-signed-off-by.sh deleted file mode 100755 index 45adec733..000000000 --- a/mcuboot/ci/check-signed-off-by.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -# 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 retrieves the merge commit created by GH -parents=(`git log -n 1 --format=%p HEAD`) - -if [[ "${#parents[@]}" -ne 2 ]]; then - echo "This PR's merge commit is missing a parent!" - exit 1 -fi - -from="${parents[0]}" -into="${parents[1]}" -commits=$(git show -s --format=%h ${from}..${into}) - -has_commits=false -for sha in $commits; do - author="Signed-off-by: $(git show -s --format="%an <%ae>" ${sha})" - committer="Signed-off-by: $(git show -s --format="%cn <%ce>" ${sha})" - - lines="$(git show -s --format=%B ${sha})" - - found_author=false - found_committer=false - IFS=$'\n' - for line in ${lines}; do - stripped=$(echo $line | sed -e 's/^\s*//' | sed -e 's/\s*$//') - if [[ ${stripped} == ${author} ]]; then - found_author=true - fi - if [[ ${stripped} == ${committer} ]]; then - found_committer=true - fi - - [[ ${found_author} == true && ${found_committer} == true ]] && break - done - - if [[ ${found_author} == false ]]; then - echo -e "Missing \"${author}\" in commit ${sha}" - fi - if [[ ${found_committer} == false ]]; then - echo -e "Missing \"${committer}\" in commit ${sha}" - fi - if [[ ${found_author} == false || ${found_committer} == false ]]; then - exit 1 - fi - - has_commits=true -done - -if [[ ${has_commits} = false ]]; then - echo "No commits found in this PR!" - exit 1 -fi diff --git a/mcuboot/ci/compare_versions.py b/mcuboot/ci/compare_versions.py deleted file mode 100755 index 18a92e289..000000000 --- a/mcuboot/ci/compare_versions.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 - -# 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. - -from packaging.version import parse, LegacyVersion -import argparse -import sys - -# exit with 0 if --new is equal to --old -# exit with 1 on errors -# exit with 2 if --new is newer than --old -# exit with 3 if --new is older than --old - -parser = argparse.ArgumentParser() -parser.add_argument('--old', help='Version currently in use') -parser.add_argument('--new', help='New version to publish') - -args = parser.parse_args() -if args.old is None or args.new is None: - parser.print_help() - exit(1) - -old, new = parse(args.old), parse(args.new) - -# only accept versions that were correctly parsed -for version in [old, new]: - if isinstance(version, LegacyVersion): - print("Invalid version parsed: {}".format(version)) - sys.exit(1) - -if new == old: - print("No version change") - sys.exit(0) -elif new > old: - print("Upgrade detected ({} > {})".format(new, old)) - sys.exit(2) - -print("Downgrade detected ({} < {})".format(new, old)) -sys.exit(3) diff --git a/mcuboot/ci/get_features.py b/mcuboot/ci/get_features.py deleted file mode 100755 index 3220dc3bd..000000000 --- a/mcuboot/ci/get_features.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2020 JUUL Labs -# -# 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 argparse -import os.path -import toml - -parser = argparse.ArgumentParser(description='Print features from a Cargo.toml.') -parser.add_argument('infile', help='Input file to parse') - -args = parser.parse_args() -if not os.path.isfile(args.infile): - print("File not found") - exit(1) - -try: - cargo_toml = open(args.infile).read() -except Exception: - print("Error reading \"{}\"".format(args.infile)) - exit(1) - -config = toml.loads(cargo_toml) -if 'features' not in config: - print("Missing \"[features]\" section") - exit(1) - -print(" ".join([k for k in config['features'] if k != 'default'])) diff --git a/mcuboot/ci/imgtool_install.sh b/mcuboot/ci/imgtool_install.sh deleted file mode 100755 index 94264f6c5..000000000 --- a/mcuboot/ci/imgtool_install.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -x - -# 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. - -if [[ $TRAVIS_PULL_REQUEST != "false" || $TRAVIS_BRANCH != "master" ]]; then - echo "Either a PR or not \"master\" branch, exiting" - exit 0 -fi - -pip3 install setuptools twine packaging -pip3 install --pre imgtool diff --git a/mcuboot/ci/imgtool_run.sh b/mcuboot/ci/imgtool_run.sh deleted file mode 100755 index 1cf042d48..000000000 --- a/mcuboot/ci/imgtool_run.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -x - -# 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. - -if [[ $TRAVIS_PULL_REQUEST != "false" || $TRAVIS_BRANCH != "master" ]]; then - echo "Either a PR or not \"master\" branch, exiting" - exit 0 -fi - -IMGTOOL_VER_PREFIX="\+imgtool_version = " -IMGTOOL_VER_FILE="imgtool/__init__.py" -DIST_DIR="dist" - -if [[ -z "$TWINE_TOKEN" ]]; then - echo "\$TWINE_TOKEN must be set in travis settings" - exit 0 -fi - -cd scripts/ - -last_release=$(pip show imgtool | grep "Version: " | cut -d" " -f2) -repo_version=$(grep "imgtool_version = " imgtool/__init__.py | sed 's/^.* = "\(.*\)"/\1/g') - -python3 ../ci/compare_versions.py --old $last_release --new $repo_version -rc=$? - -if [[ $rc -eq 0 ]]; then - echo "Imgtool version not changed; will not publish" - exit 0 -elif [[ $rc -eq 1 ]]; then - echo "Error parsing versions" - exit 1 -elif [[ $rc -eq 3 ]]; then - echo "Imgtool downgrade detected!" - exit 1 -fi - -rm -rf $DIST_DIR -python setup.py sdist bdist_wheel - -twine upload --username __token__ --password "${TWINE_TOKEN}" "${DIST_DIR}/*" diff --git a/mcuboot/ci/mynewt_install.sh b/mcuboot/ci/mynewt_install.sh deleted file mode 100755 index abadfb383..000000000 --- a/mcuboot/ci/mynewt_install.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash -x - -# 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. - -install_newt() { - pushd $HOME - git clone --depth=1 https://github.com/apache/mynewt-newt - [[ $? -ne 0 ]] && exit 1 - - pushd mynewt-newt && ./build.sh - [[ $? -ne 0 ]] && exit 1 - - cp newt/newt $HOME/bin - popd - popd -} - -shallow_clone_mynewt() { - mkdir -p repos/apache-mynewt-core - git clone --depth=1 https://github.com/apache/mynewt-core repos/apache-mynewt-core - [[ $? -ne 0 ]] && exit 1 -} - -arm_toolchain_install() { - TOOLCHAIN_PATH=$HOME/TOOLCHAIN - - GCC_URL=https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2 - GCC_BASE=gcc-arm-none-eabi-7-2017-q4-major - - mkdir -p $TOOLCHAIN_PATH - - if [ ! -s ${TOOLCHAIN_PATH}/$GCC_BASE/bin/arm-none-eabi-gcc ]; then - wget -O ${TOOLCHAIN_PATH}/${GCC_BASE}.tar.bz2 $GCC_URL - [[ $? -ne 0 ]] && exit 1 - - tar xfj ${TOOLCHAIN_PATH}/${GCC_BASE}.tar.bz2 -C $TOOLCHAIN_PATH - fi - - for i in ${TOOLCHAIN_PATH}/${GCC_BASE}/bin/arm-none-eabi-* ; do - rm -f $HOME/bin/${i##*/} - ln -s $i $HOME/bin/${i##*/} - done -} - -mkdir -p $HOME/bin -export PATH=$HOME/bin:$PATH - -install_newt -shallow_clone_mynewt -arm_toolchain_install diff --git a/mcuboot/ci/mynewt_keys/enc_kw/pkg.yml b/mcuboot/ci/mynewt_keys/enc_kw/pkg.yml deleted file mode 100644 index 0e993a46e..000000000 --- a/mcuboot/ci/mynewt_keys/enc_kw/pkg.yml +++ /dev/null @@ -1,22 +0,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. -# - -pkg.name: keys/enc_kw -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" diff --git a/mcuboot/ci/mynewt_keys/enc_kw/src/keys.c b/mcuboot/ci/mynewt_keys/enc_kw/src/keys.c deleted file mode 100644 index ae4c5c7bb..000000000 --- a/mcuboot/ci/mynewt_keys/enc_kw/src/keys.c +++ /dev/null @@ -1,30 +0,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. - */ - -#include -#include -unsigned char enc_key[] = { - 0x96, 0x69, 0xd2, 0xcf, 0x0e, 0xb1, 0xc6, 0x56, 0xf2, 0xa0, 0x1f, 0x46, - 0x06, 0xd3, 0x49, 0x31, -}; -static unsigned int enc_key_len = 16; -const struct bootutil_key bootutil_enc_key = { - .key = enc_key, - .len = &enc_key_len, -}; diff --git a/mcuboot/ci/mynewt_keys/enc_rsa/pkg.yml b/mcuboot/ci/mynewt_keys/enc_rsa/pkg.yml deleted file mode 100644 index 61918f1b4..000000000 --- a/mcuboot/ci/mynewt_keys/enc_rsa/pkg.yml +++ /dev/null @@ -1,25 +0,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. -# - -pkg.name: keys/enc_rsa -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" - -pkg.cflags: - - '-DMBEDTLS_USER_CONFIG_FILE="mbedtls/config_mynewt.h"' diff --git a/mcuboot/ci/mynewt_keys/enc_rsa/src/keys.c b/mcuboot/ci/mynewt_keys/enc_rsa/src/keys.c deleted file mode 100644 index 201d6ad12..000000000 --- a/mcuboot/ci/mynewt_keys/enc_rsa/src/keys.c +++ /dev/null @@ -1,128 +0,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. - */ - -#include -#include -unsigned char enc_key[] = { - 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, - 0xb4, 0x26, 0x14, 0x49, 0x3d, 0x16, 0x13, 0x3a, 0x6d, 0x9c, 0x84, 0xa9, - 0x8b, 0x6a, 0x10, 0x20, 0x61, 0xef, 0x48, 0x04, 0xa4, 0x4b, 0x24, 0xf3, - 0x00, 0x32, 0xac, 0x22, 0xe0, 0x30, 0x27, 0x70, 0x18, 0xe5, 0x55, 0xc8, - 0xb8, 0x05, 0x34, 0x03, 0xb0, 0xf8, 0xa5, 0x96, 0xd2, 0x48, 0x58, 0xef, - 0x70, 0xb0, 0x09, 0xdb, 0xe3, 0x58, 0x62, 0xef, 0x99, 0x63, 0x01, 0xb2, - 0x89, 0xc4, 0xb3, 0xf6, 0x9e, 0x62, 0xbf, 0x4d, 0xc2, 0x8a, 0xd0, 0xc9, - 0x4d, 0x43, 0xa3, 0xd8, 0xe5, 0x1d, 0xec, 0x62, 0x63, 0x08, 0xe2, 0x20, - 0xa5, 0xfc, 0x78, 0xd0, 0x3e, 0x74, 0xc8, 0xa4, 0x1b, 0x36, 0xad, 0x7b, - 0xf5, 0x06, 0xae, 0x4d, 0x51, 0x9b, 0x40, 0xce, 0x30, 0x4f, 0x6c, 0xea, - 0xf9, 0xe9, 0x74, 0xea, 0x06, 0xee, 0x9c, 0xe4, 0x14, 0x68, 0x20, 0xb9, - 0x3d, 0xe7, 0x11, 0x14, 0x8b, 0x25, 0xa3, 0xff, 0x4c, 0x8a, 0xf3, 0x53, - 0xee, 0x6b, 0x3e, 0xef, 0x34, 0xcd, 0x6a, 0x3f, 0x62, 0x68, 0xc0, 0xff, - 0x78, 0x4c, 0xb0, 0xc3, 0xe6, 0x96, 0x61, 0xfc, 0x1f, 0x18, 0xf1, 0x7a, - 0x82, 0xe2, 0x8f, 0x35, 0xa8, 0x2b, 0x86, 0x16, 0xa4, 0x46, 0xfb, 0xac, - 0x7e, 0x41, 0xdb, 0x02, 0x05, 0x91, 0x6d, 0xdf, 0xc1, 0xde, 0x13, 0x95, - 0x9c, 0xf9, 0x9e, 0x5e, 0x72, 0xba, 0xa7, 0x25, 0x93, 0xfb, 0xdc, 0xe8, - 0xab, 0x86, 0x45, 0x88, 0x47, 0x2d, 0xed, 0xee, 0xee, 0x97, 0x9e, 0xce, - 0x5d, 0x9b, 0x04, 0x04, 0x40, 0x7c, 0xcb, 0x7c, 0x3d, 0x2c, 0x74, 0xab, - 0xa4, 0xcc, 0x64, 0xa3, 0x5c, 0x95, 0x3d, 0xd4, 0xa2, 0xdc, 0x92, 0xb2, - 0xc8, 0x18, 0xcb, 0xf9, 0x00, 0x39, 0x81, 0x8f, 0x8f, 0x40, 0xc2, 0xdf, - 0x99, 0x29, 0xac, 0x8a, 0xc2, 0x3b, 0xd8, 0xa4, 0xf2, 0xad, 0xaf, 0x74, - 0xc0, 0x11, 0xc7, 0x99, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, - 0x00, 0x42, 0x47, 0x80, 0x4f, 0x31, 0xda, 0x5d, 0x58, 0xb1, 0xdb, 0x54, - 0x33, 0xcc, 0xc7, 0x49, 0x07, 0xa1, 0x00, 0x98, 0x4e, 0x9c, 0xe3, 0xc8, - 0xc4, 0x5e, 0xde, 0x45, 0xd6, 0xcf, 0x04, 0xe8, 0x7d, 0xa5, 0xab, 0x3a, - 0xd4, 0x8e, 0x5f, 0xdb, 0xb3, 0x3f, 0xf9, 0x3b, 0x73, 0x32, 0x0a, 0xcc, - 0x2d, 0xcc, 0x17, 0xf8, 0x88, 0x9e, 0x2c, 0x76, 0xba, 0x10, 0x85, 0x0c, - 0xaa, 0xd3, 0x65, 0x3b, 0x91, 0x10, 0xd4, 0xe3, 0xed, 0x88, 0x15, 0xea, - 0x9b, 0x25, 0x82, 0x2d, 0x56, 0x2f, 0x75, 0xc2, 0xf2, 0xaf, 0xdd, 0x24, - 0xd5, 0x3e, 0x3c, 0x95, 0x76, 0x88, 0x84, 0x0f, 0x0d, 0xd1, 0xb5, 0x5c, - 0x3e, 0xae, 0xf7, 0xb6, 0x49, 0x5c, 0x2c, 0xf2, 0xba, 0xe9, 0xab, 0x4f, - 0x37, 0x64, 0x9b, 0x30, 0x18, 0xaa, 0x54, 0x40, 0x04, 0xea, 0x3d, 0x25, - 0x4d, 0x02, 0x29, 0x71, 0x6f, 0x4d, 0x82, 0x9b, 0xc3, 0x44, 0x2a, 0x9d, - 0x0c, 0x98, 0xd3, 0xc8, 0x15, 0x0d, 0x04, 0x93, 0x60, 0x30, 0xc7, 0x5e, - 0x79, 0xea, 0x53, 0x9d, 0xc0, 0x0e, 0x81, 0xac, 0x90, 0xbc, 0x9e, 0x1e, - 0xd2, 0x28, 0x0f, 0x10, 0xf5, 0x1f, 0xdf, 0x38, 0x7f, 0x8a, 0x90, 0x8d, - 0x49, 0x07, 0x7d, 0x78, 0xcb, 0xa7, 0xef, 0x92, 0x6d, 0x3b, 0x13, 0x95, - 0x9b, 0xba, 0x83, 0xc6, 0xb3, 0x71, 0x25, 0x27, 0x07, 0x99, 0x54, 0x82, - 0x3d, 0xec, 0xc5, 0xf8, 0xb4, 0xa0, 0x38, 0x7a, 0x59, 0x6a, 0x0b, 0xca, - 0x69, 0x6c, 0x17, 0xa4, 0x18, 0xe0, 0xb4, 0xaa, 0x89, 0x99, 0x8f, 0xcb, - 0x71, 0x34, 0x09, 0x1b, 0x6e, 0xe6, 0x87, 0x00, 0xb5, 0xba, 0x70, 0x8a, - 0x29, 0x3d, 0x9a, 0x06, 0x18, 0x2d, 0x66, 0x5e, 0x61, 0x37, 0xeb, 0xdd, - 0x5e, 0xc8, 0x28, 0x92, 0x05, 0x30, 0xfd, 0xb8, 0x65, 0xb1, 0x7f, 0xbf, - 0x2d, 0x55, 0x12, 0x91, 0xc1, 0x02, 0x81, 0x81, 0x00, 0xda, 0x65, 0xda, - 0x38, 0x7c, 0x18, 0xfb, 0x00, 0x11, 0x60, 0xeb, 0x37, 0x65, 0xb8, 0x83, - 0x62, 0x88, 0xc4, 0x3a, 0x4e, 0x64, 0x6a, 0xf3, 0x3e, 0x4e, 0xc0, 0x34, - 0x19, 0x8a, 0xcb, 0x4a, 0xca, 0x2f, 0x5d, 0x50, 0x7a, 0xac, 0xf7, 0x9e, - 0x87, 0x5a, 0xfc, 0x4d, 0x49, 0xd7, 0xf9, 0x21, 0xf5, 0x0b, 0x6f, 0x57, - 0x41, 0x3d, 0x8f, 0xb8, 0xec, 0x7f, 0xcc, 0x92, 0x09, 0xbe, 0xd3, 0xa4, - 0xc3, 0x14, 0x85, 0x21, 0x5d, 0x05, 0xa3, 0xaa, 0x20, 0xf6, 0x62, 0x44, - 0x50, 0x03, 0x5e, 0x53, 0x4a, 0xcd, 0x6a, 0xb6, 0x65, 0x8e, 0x4e, 0x4b, - 0x3f, 0x25, 0xc6, 0x16, 0x31, 0xf5, 0x99, 0x13, 0x77, 0x42, 0xda, 0xdc, - 0x70, 0x4d, 0x65, 0xb0, 0x99, 0x0f, 0xdf, 0x5a, 0xb1, 0x45, 0xf0, 0xb9, - 0x8e, 0xa0, 0xae, 0x4f, 0x4d, 0x65, 0x09, 0x84, 0xb5, 0x38, 0x29, 0xbf, - 0x69, 0xe0, 0x88, 0x1f, 0x27, 0x02, 0x81, 0x81, 0x00, 0xd3, 0x2a, 0x59, - 0xec, 0x28, 0xc3, 0x0d, 0x4f, 0x92, 0x96, 0xca, 0x67, 0x94, 0xfc, 0x2e, - 0xa6, 0x86, 0x68, 0x45, 0x53, 0x92, 0xcc, 0x86, 0x7f, 0x8a, 0xe1, 0x5d, - 0xe8, 0x1d, 0x9e, 0xbb, 0x1e, 0x00, 0x26, 0x1d, 0x80, 0x12, 0xff, 0x9c, - 0x11, 0x0a, 0xbd, 0xa6, 0xc3, 0x8d, 0x48, 0xda, 0xfc, 0x10, 0xf7, 0x7a, - 0x16, 0x07, 0x15, 0xa0, 0x3a, 0xd3, 0x94, 0xfb, 0x52, 0x87, 0x39, 0xee, - 0xe7, 0xc4, 0x26, 0x49, 0x16, 0xc6, 0xc0, 0x83, 0x25, 0xbf, 0x6a, 0x4e, - 0x8c, 0x0b, 0x10, 0x85, 0x66, 0xab, 0x7e, 0xae, 0xac, 0x4c, 0x69, 0x3c, - 0x44, 0xeb, 0xcd, 0xe9, 0xf6, 0x64, 0x8b, 0x4a, 0xd8, 0x6a, 0x4d, 0x6d, - 0x47, 0xa9, 0xb8, 0x55, 0x72, 0xc1, 0xfd, 0xf4, 0x81, 0x4c, 0x66, 0xbe, - 0x49, 0xf2, 0x75, 0x4f, 0x80, 0xf1, 0x20, 0x38, 0xb8, 0x6a, 0x1b, 0x75, - 0x41, 0x30, 0x0f, 0x1b, 0x3f, 0x02, 0x81, 0x80, 0x09, 0x35, 0xfa, 0x7a, - 0x1f, 0x61, 0xbe, 0x54, 0x46, 0x67, 0x5c, 0x04, 0x3e, 0x1a, 0x06, 0x10, - 0x85, 0xcc, 0x20, 0xd9, 0x65, 0x8a, 0xcd, 0x2f, 0x77, 0x8a, 0xcb, 0xa7, - 0xb8, 0x1e, 0xd2, 0xcc, 0xac, 0x2a, 0xb7, 0x56, 0x35, 0x2d, 0x4c, 0x56, - 0x51, 0x14, 0x0a, 0xfe, 0x6e, 0x49, 0x67, 0x91, 0x3a, 0x26, 0x3b, 0xfb, - 0xd8, 0x68, 0xd3, 0x57, 0xc6, 0x1c, 0x0e, 0x9c, 0xb2, 0x9b, 0xa2, 0x7b, - 0x47, 0xc6, 0x45, 0x9d, 0xf2, 0xba, 0xf0, 0x55, 0xeb, 0x8e, 0x41, 0x6b, - 0x4e, 0x79, 0x0f, 0xf2, 0x3b, 0xaf, 0xa0, 0x79, 0xb0, 0x02, 0xc5, 0x51, - 0xa8, 0x7a, 0x2e, 0x3d, 0x75, 0x2a, 0x3b, 0x93, 0xf0, 0x11, 0xe2, 0xf2, - 0x29, 0x91, 0x7c, 0x5d, 0x38, 0x3a, 0x27, 0x4d, 0x0a, 0xb2, 0x18, 0x61, - 0x57, 0x8d, 0x82, 0x72, 0xb5, 0x2c, 0x2d, 0x98, 0xa7, 0x01, 0xbb, 0xbc, - 0xef, 0x67, 0x4e, 0x49, 0x02, 0x81, 0x81, 0x00, 0xb2, 0x70, 0x53, 0x54, - 0x70, 0x8d, 0x82, 0xad, 0xff, 0x1d, 0x55, 0x24, 0x7a, 0x8d, 0x2f, 0x8e, - 0xa0, 0x7d, 0x74, 0x37, 0xcf, 0x10, 0xed, 0x86, 0xd1, 0x80, 0xe7, 0xad, - 0xc1, 0x79, 0xe4, 0x7c, 0xd1, 0x7b, 0x63, 0xea, 0x5a, 0x23, 0x8d, 0x6a, - 0x09, 0x3d, 0x81, 0xb2, 0x35, 0xad, 0x9e, 0xfe, 0xea, 0x07, 0x76, 0x2f, - 0x2f, 0x05, 0x63, 0x44, 0xd2, 0x8e, 0x4e, 0x61, 0xca, 0xcb, 0x75, 0xca, - 0x7b, 0xc2, 0x2e, 0x79, 0x04, 0xb2, 0xa1, 0x20, 0x40, 0xc4, 0x40, 0x63, - 0xae, 0xe5, 0xe3, 0x14, 0x83, 0x4e, 0xa5, 0xa4, 0x0b, 0x5d, 0xd2, 0x04, - 0x1b, 0x8f, 0x01, 0x69, 0xa8, 0x44, 0xdc, 0x96, 0x4c, 0x1d, 0xe9, 0x7e, - 0x69, 0x38, 0xcf, 0x5c, 0x0d, 0xf9, 0xdf, 0xa7, 0x73, 0x3c, 0x4f, 0x08, - 0x85, 0xce, 0x03, 0xc4, 0xdd, 0xfd, 0x70, 0x70, 0xc5, 0x99, 0x36, 0x58, - 0x43, 0x98, 0x40, 0x59, 0x02, 0x81, 0x81, 0x00, 0xd5, 0xaa, 0xfb, 0xec, - 0x8d, 0xc6, 0xdd, 0xfa, 0x2b, 0x5a, 0x24, 0xd0, 0xda, 0x58, 0xbd, 0x87, - 0x92, 0x1a, 0x29, 0x62, 0x13, 0x1d, 0x4b, 0x79, 0x1b, 0xbe, 0x79, 0x7d, - 0xad, 0x79, 0xca, 0x17, 0x75, 0xda, 0xe8, 0x32, 0xe8, 0xa0, 0x9e, 0xa8, - 0x77, 0x53, 0xac, 0x38, 0xd6, 0xeb, 0xe6, 0x22, 0x65, 0xc4, 0xaa, 0x4c, - 0xc8, 0xd0, 0x33, 0x1a, 0x1e, 0xbe, 0xbd, 0x73, 0x09, 0x4a, 0xfa, 0x85, - 0x5c, 0xf3, 0x0c, 0x9c, 0x81, 0x56, 0x30, 0xa7, 0xf7, 0x9b, 0xf4, 0x92, - 0x9c, 0x6b, 0x93, 0x6a, 0x00, 0x33, 0xdc, 0x2f, 0x54, 0x1e, 0x78, 0xd4, - 0x97, 0xec, 0x24, 0xa2, 0xdb, 0x3d, 0x03, 0x33, 0x09, 0xb2, 0x2c, 0x03, - 0x05, 0x40, 0xde, 0x52, 0xf2, 0x9b, 0xfa, 0x00, 0x8d, 0x4b, 0xfe, 0x5b, - 0x9b, 0x9c, 0x73, 0xad, 0xfb, 0x7a, 0x00, 0x42, 0x62, 0x9e, 0xa0, 0x95, - 0x55, 0x50, 0x32, 0x87 -}; -static unsigned int enc_key_len = 1192; -const struct bootutil_key bootutil_enc_key = { - .key = enc_key, - .len = &enc_key_len, -}; diff --git a/mcuboot/ci/mynewt_run.sh b/mcuboot/ci/mynewt_run.sh deleted file mode 100755 index c84dccfb6..000000000 --- a/mcuboot/ci/mynewt_run.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -x - -# 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. - -export PATH=$HOME/bin:$PATH -pwd - -for target in $(ls ci/mynewt_targets); do - newt build $target - [[ $? -ne 0 ]] && exit 1 -done - -exit 0 diff --git a/mcuboot/ci/mynewt_targets/basic/pkg.yml b/mcuboot/ci/mynewt_targets/basic/pkg.yml deleted file mode 100644 index 736f2788f..000000000 --- a/mcuboot/ci/mynewt_targets/basic/pkg.yml +++ /dev/null @@ -1,27 +0,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. -# - -pkg.name: "targets/basic" -pkg.type: "target" -pkg.description: -pkg.author: -pkg.homepage: - -pkg.deps: - - "@mcuboot/boot/mynewt" diff --git a/mcuboot/ci/mynewt_targets/basic/syscfg.yml b/mcuboot/ci/mynewt_targets/basic/syscfg.yml deleted file mode 100644 index e4044685d..000000000 --- a/mcuboot/ci/mynewt_targets/basic/syscfg.yml +++ /dev/null @@ -1,45 +0,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. -# - -syscfg.vals: - BOOT_SERIAL: 0 - BOOT_SERIAL_DETECT_PIN: 11 - BOOT_SERIAL_DETECT_PIN_VAL: 0 - BOOT_SERIAL_REPORT_PIN: 13 - BOOTUTIL_VALIDATE_SLOT0: 0 - BOOTUTIL_MAX_IMG_SECTORS: 256 - BOOTUTIL_SIGN_EC256: 0 - BOOTUTIL_SIGN_RSA: 0 - BOOTUTIL_ENCRYPT_RSA: 0 - BOOTUTIL_ENCRYPT_KW: 0 - BOOTUTIL_USE_MBED_TLS: 0 - BOOTUTIL_USE_TINYCRYPT: 1 - BOOTUTIL_OVERWRITE_ONLY: 0 - BOOTUTIL_OVERWRITE_ONLY_FAST: 1 - BOOTUTIL_HAVE_LOGGING: 0 - BOOTUTIL_NO_LOGGING: 1 - BOOTUTIL_LOG_LEVEL: 'BOOTUTIL_LOG_LEVEL_INFO' - CONSOLE_COMPAT: 1 - CONSOLE_INPUT: 0 - CONSOLE_UART: 0 - CONSOLE_RTT: 0 - OS_CPUTIME_TIMER_NUM: 0 - TIMER_0: 1 - UART_0: 0 - BOOTUTIL_BOOTSTRAP: 0 - MBEDTLS_NIST_KW_C: 0 diff --git a/mcuboot/ci/mynewt_targets/basic/target.yml b/mcuboot/ci/mynewt_targets/basic/target.yml deleted file mode 100644 index 6cb85a9fc..000000000 --- a/mcuboot/ci/mynewt_targets/basic/target.yml +++ /dev/null @@ -1,22 +0,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. -# - -target.app: "@mcuboot/boot/mynewt" -target.bsp: "@apache-mynewt-core/hw/bsp/nordic_pca10056" -target.build_profile: "optimized" diff --git a/mcuboot/ci/mynewt_targets/bootserial/pkg.yml b/mcuboot/ci/mynewt_targets/bootserial/pkg.yml deleted file mode 100644 index b7dd9e292..000000000 --- a/mcuboot/ci/mynewt_targets/bootserial/pkg.yml +++ /dev/null @@ -1,27 +0,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. -# - -pkg.name: "targets/bootserial" -pkg.type: "target" -pkg.description: -pkg.author: -pkg.homepage: - -pkg.deps: - - "@mcuboot/boot/mynewt" diff --git a/mcuboot/ci/mynewt_targets/bootserial/syscfg.yml b/mcuboot/ci/mynewt_targets/bootserial/syscfg.yml deleted file mode 100644 index 304cca565..000000000 --- a/mcuboot/ci/mynewt_targets/bootserial/syscfg.yml +++ /dev/null @@ -1,24 +0,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. -# - -$import: - - '@mcuboot/ci/mynewt_targets/basic/syscfg.yml' - -syscfg.vals: - BOOT_SERIAL: 1 - UART_0: 1 diff --git a/mcuboot/ci/mynewt_targets/bootserial/target.yml b/mcuboot/ci/mynewt_targets/bootserial/target.yml deleted file mode 100644 index 6cb85a9fc..000000000 --- a/mcuboot/ci/mynewt_targets/bootserial/target.yml +++ /dev/null @@ -1,22 +0,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. -# - -target.app: "@mcuboot/boot/mynewt" -target.bsp: "@apache-mynewt-core/hw/bsp/nordic_pca10056" -target.build_profile: "optimized" diff --git a/mcuboot/ci/mynewt_targets/ecdsa/pkg.yml b/mcuboot/ci/mynewt_targets/ecdsa/pkg.yml deleted file mode 100644 index 81bc2b42e..000000000 --- a/mcuboot/ci/mynewt_targets/ecdsa/pkg.yml +++ /dev/null @@ -1,27 +0,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. -# - -pkg.name: "targets/ecdsa" -pkg.type: "target" -pkg.description: -pkg.author: -pkg.homepage: - -pkg.deps: - - "@mcuboot/boot/mynewt" diff --git a/mcuboot/ci/mynewt_targets/ecdsa/syscfg.yml b/mcuboot/ci/mynewt_targets/ecdsa/syscfg.yml deleted file mode 100644 index 5162df85a..000000000 --- a/mcuboot/ci/mynewt_targets/ecdsa/syscfg.yml +++ /dev/null @@ -1,24 +0,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. -# - -$import: - - '@mcuboot/ci/mynewt_targets/basic/syscfg.yml' - -syscfg.vals: - BOOTUTIL_VALIDATE_SLOT0: 1 - BOOTUTIL_SIGN_EC256: 1 diff --git a/mcuboot/ci/mynewt_targets/ecdsa/target.yml b/mcuboot/ci/mynewt_targets/ecdsa/target.yml deleted file mode 100644 index ac122f8a7..000000000 --- a/mcuboot/ci/mynewt_targets/ecdsa/target.yml +++ /dev/null @@ -1,23 +0,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. -# - -target.app: "@mcuboot/boot/mynewt" -target.bsp: "@apache-mynewt-core/hw/bsp/nordic_pca10056" -target.build_profile: "optimized" -target.key_file: "@mcuboot/root-ec-p256.pem" diff --git a/mcuboot/ci/mynewt_targets/ecdsa_kw/pkg.yml b/mcuboot/ci/mynewt_targets/ecdsa_kw/pkg.yml deleted file mode 100644 index d56caeb8e..000000000 --- a/mcuboot/ci/mynewt_targets/ecdsa_kw/pkg.yml +++ /dev/null @@ -1,28 +0,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. -# - -pkg.name: "targets/ecdsa_kw" -pkg.type: "target" -pkg.description: -pkg.author: -pkg.homepage: - -pkg.deps: - - "@mcuboot/boot/mynewt" - - "@mcuboot/keys/enc_kw" diff --git a/mcuboot/ci/mynewt_targets/ecdsa_kw/syscfg.yml b/mcuboot/ci/mynewt_targets/ecdsa_kw/syscfg.yml deleted file mode 100644 index 6065e56c8..000000000 --- a/mcuboot/ci/mynewt_targets/ecdsa_kw/syscfg.yml +++ /dev/null @@ -1,25 +0,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. -# - -$import: - - '@mcuboot/ci/mynewt_targets/basic/syscfg.yml' - -syscfg.vals: - BOOTUTIL_VALIDATE_SLOT0: 1 - BOOTUTIL_SIGN_EC256: 1 - BOOTUTIL_ENCRYPT_KW: 1 diff --git a/mcuboot/ci/mynewt_targets/ecdsa_kw/target.yml b/mcuboot/ci/mynewt_targets/ecdsa_kw/target.yml deleted file mode 100644 index ac122f8a7..000000000 --- a/mcuboot/ci/mynewt_targets/ecdsa_kw/target.yml +++ /dev/null @@ -1,23 +0,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. -# - -target.app: "@mcuboot/boot/mynewt" -target.bsp: "@apache-mynewt-core/hw/bsp/nordic_pca10056" -target.build_profile: "optimized" -target.key_file: "@mcuboot/root-ec-p256.pem" diff --git a/mcuboot/ci/mynewt_targets/rsa/pkg.yml b/mcuboot/ci/mynewt_targets/rsa/pkg.yml deleted file mode 100644 index 8e3264cad..000000000 --- a/mcuboot/ci/mynewt_targets/rsa/pkg.yml +++ /dev/null @@ -1,27 +0,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. -# - -pkg.name: "targets/rsa" -pkg.type: "target" -pkg.description: -pkg.author: -pkg.homepage: - -pkg.deps: - - "@mcuboot/boot/mynewt" diff --git a/mcuboot/ci/mynewt_targets/rsa/syscfg.yml b/mcuboot/ci/mynewt_targets/rsa/syscfg.yml deleted file mode 100644 index b40d0ab21..000000000 --- a/mcuboot/ci/mynewt_targets/rsa/syscfg.yml +++ /dev/null @@ -1,27 +0,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. -# - -$import: - - '@mcuboot/ci/mynewt_targets/basic/syscfg.yml' - -syscfg.vals: - BOOTUTIL_VALIDATE_SLOT0: 1 - BOOTUTIL_SIGN_EC256: 0 - BOOTUTIL_SIGN_RSA: 1 - BOOTUTIL_USE_MBED_TLS: 1 - BOOTUTIL_USE_TINYCRYPT: 0 diff --git a/mcuboot/ci/mynewt_targets/rsa/target.yml b/mcuboot/ci/mynewt_targets/rsa/target.yml deleted file mode 100644 index cbfc8c7bf..000000000 --- a/mcuboot/ci/mynewt_targets/rsa/target.yml +++ /dev/null @@ -1,23 +0,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. -# - -target.app: "@mcuboot/boot/mynewt" -target.bsp: "@apache-mynewt-core/hw/bsp/nordic_pca10056" -target.build_profile: "optimized" -target.key_file: "@mcuboot/root-rsa-2048.pem" diff --git a/mcuboot/ci/mynewt_targets/rsa_kw/pkg.yml b/mcuboot/ci/mynewt_targets/rsa_kw/pkg.yml deleted file mode 100644 index 99af67b09..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_kw/pkg.yml +++ /dev/null @@ -1,28 +0,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. -# - -pkg.name: "targets/rsa_kw" -pkg.type: "target" -pkg.description: -pkg.author: -pkg.homepage: - -pkg.deps: - - "@mcuboot/boot/mynewt" - - "@mcuboot/keys/enc_kw" diff --git a/mcuboot/ci/mynewt_targets/rsa_kw/syscfg.yml b/mcuboot/ci/mynewt_targets/rsa_kw/syscfg.yml deleted file mode 100644 index 4b44287d7..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_kw/syscfg.yml +++ /dev/null @@ -1,29 +0,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. -# - -$import: - - '@mcuboot/ci/mynewt_targets/basic/syscfg.yml' - -syscfg.vals: - BOOTUTIL_VALIDATE_SLOT0: 1 - BOOTUTIL_SIGN_EC256: 0 - BOOTUTIL_SIGN_RSA: 1 - BOOTUTIL_USE_MBED_TLS: 1 - BOOTUTIL_USE_TINYCRYPT: 0 - BOOTUTIL_ENCRYPT_KW: 1 - MBEDTLS_NIST_KW_C: 1 diff --git a/mcuboot/ci/mynewt_targets/rsa_kw/target.yml b/mcuboot/ci/mynewt_targets/rsa_kw/target.yml deleted file mode 100644 index cbfc8c7bf..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_kw/target.yml +++ /dev/null @@ -1,23 +0,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. -# - -target.app: "@mcuboot/boot/mynewt" -target.bsp: "@apache-mynewt-core/hw/bsp/nordic_pca10056" -target.build_profile: "optimized" -target.key_file: "@mcuboot/root-rsa-2048.pem" diff --git a/mcuboot/ci/mynewt_targets/rsa_overwriteonly/pkg.yml b/mcuboot/ci/mynewt_targets/rsa_overwriteonly/pkg.yml deleted file mode 100644 index 12256075b..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_overwriteonly/pkg.yml +++ /dev/null @@ -1,27 +0,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. -# - -pkg.name: "targets/rsa_overwriteonly" -pkg.type: "target" -pkg.description: -pkg.author: -pkg.homepage: - -pkg.deps: - - "@mcuboot/boot/mynewt" diff --git a/mcuboot/ci/mynewt_targets/rsa_overwriteonly/syscfg.yml b/mcuboot/ci/mynewt_targets/rsa_overwriteonly/syscfg.yml deleted file mode 100644 index 8dabbe80b..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_overwriteonly/syscfg.yml +++ /dev/null @@ -1,28 +0,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. -# - -$import: - - '@mcuboot/ci/mynewt_targets/basic/syscfg.yml' - -syscfg.vals: - BOOTUTIL_VALIDATE_SLOT0: 1 - BOOTUTIL_SIGN_EC256: 0 - BOOTUTIL_SIGN_RSA: 1 - BOOTUTIL_USE_MBED_TLS: 1 - BOOTUTIL_USE_TINYCRYPT: 0 - BOOTUTIL_OVERWRITE_ONLY: 1 diff --git a/mcuboot/ci/mynewt_targets/rsa_overwriteonly/target.yml b/mcuboot/ci/mynewt_targets/rsa_overwriteonly/target.yml deleted file mode 100644 index cbfc8c7bf..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_overwriteonly/target.yml +++ /dev/null @@ -1,23 +0,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. -# - -target.app: "@mcuboot/boot/mynewt" -target.bsp: "@apache-mynewt-core/hw/bsp/nordic_pca10056" -target.build_profile: "optimized" -target.key_file: "@mcuboot/root-rsa-2048.pem" diff --git a/mcuboot/ci/mynewt_targets/rsa_rsaoaep/pkg.yml b/mcuboot/ci/mynewt_targets/rsa_rsaoaep/pkg.yml deleted file mode 100644 index fc69f109a..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_rsaoaep/pkg.yml +++ /dev/null @@ -1,27 +0,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. -# - -pkg.name: "targets/rsa_rsaoaep" -pkg.type: "target" -pkg.description: -pkg.author: -pkg.homepage: - -pkg.deps: - - "@mcuboot/boot/mynewt" - - "@mcuboot/keys/enc_rsa" diff --git a/mcuboot/ci/mynewt_targets/rsa_rsaoaep/syscfg.yml b/mcuboot/ci/mynewt_targets/rsa_rsaoaep/syscfg.yml deleted file mode 100644 index 649077ca3..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_rsaoaep/syscfg.yml +++ /dev/null @@ -1,28 +0,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. -# - -$import: - - '@mcuboot/ci/mynewt_targets/basic/syscfg.yml' - -syscfg.vals: - BOOTUTIL_VALIDATE_SLOT0: 1 - BOOTUTIL_SIGN_EC256: 0 - BOOTUTIL_SIGN_RSA: 1 - BOOTUTIL_USE_MBED_TLS: 1 - BOOTUTIL_USE_TINYCRYPT: 0 - BOOTUTIL_ENCRYPT_RSA: 1 diff --git a/mcuboot/ci/mynewt_targets/rsa_rsaoaep/target.yml b/mcuboot/ci/mynewt_targets/rsa_rsaoaep/target.yml deleted file mode 100644 index cbfc8c7bf..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_rsaoaep/target.yml +++ /dev/null @@ -1,23 +0,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. -# - -target.app: "@mcuboot/boot/mynewt" -target.bsp: "@apache-mynewt-core/hw/bsp/nordic_pca10056" -target.build_profile: "optimized" -target.key_file: "@mcuboot/root-rsa-2048.pem" diff --git a/mcuboot/ci/mynewt_targets/rsa_rsaoaep_bootstrap/pkg.yml b/mcuboot/ci/mynewt_targets/rsa_rsaoaep_bootstrap/pkg.yml deleted file mode 100644 index d0b3619e2..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_rsaoaep_bootstrap/pkg.yml +++ /dev/null @@ -1,27 +0,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. -# - -pkg.name: "targets/rsa_rsaoaep_bootstrap" -pkg.type: "target" -pkg.description: -pkg.author: -pkg.homepage: - -pkg.deps: - - "@mcuboot/boot/mynewt" - - "@mcuboot/keys/enc_rsa" diff --git a/mcuboot/ci/mynewt_targets/rsa_rsaoaep_bootstrap/syscfg.yml b/mcuboot/ci/mynewt_targets/rsa_rsaoaep_bootstrap/syscfg.yml deleted file mode 100644 index a2ec07459..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_rsaoaep_bootstrap/syscfg.yml +++ /dev/null @@ -1,29 +0,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. -# - -$import: - - '@mcuboot/ci/mynewt_targets/basic/syscfg.yml' - -syscfg.vals: - BOOTUTIL_VALIDATE_SLOT0: 1 - BOOTUTIL_SIGN_EC256: 0 - BOOTUTIL_SIGN_RSA: 1 - BOOTUTIL_USE_MBED_TLS: 1 - BOOTUTIL_USE_TINYCRYPT: 0 - BOOTUTIL_ENCRYPT_RSA: 1 - BOOTUTIL_BOOTSTRAP: 1 diff --git a/mcuboot/ci/mynewt_targets/rsa_rsaoaep_bootstrap/target.yml b/mcuboot/ci/mynewt_targets/rsa_rsaoaep_bootstrap/target.yml deleted file mode 100644 index cbfc8c7bf..000000000 --- a/mcuboot/ci/mynewt_targets/rsa_rsaoaep_bootstrap/target.yml +++ /dev/null @@ -1,23 +0,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. -# - -target.app: "@mcuboot/boot/mynewt" -target.bsp: "@apache-mynewt-core/hw/bsp/nordic_pca10056" -target.build_profile: "optimized" -target.key_file: "@mcuboot/root-rsa-2048.pem" diff --git a/mcuboot/ci/requirements.txt b/mcuboot/ci/requirements.txt deleted file mode 100644 index bd79a658f..000000000 --- a/mcuboot/ci/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -toml diff --git a/mcuboot/ci/sim_install.sh b/mcuboot/ci/sim_install.sh deleted file mode 100755 index 8ec96cf4c..000000000 --- a/mcuboot/ci/sim_install.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -x - -# 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. - -pip3 install --user -r ci/requirements.txt - -pushd sim && cargo fetch -[[ $? -ne 0 ]] && exit 1 -popd diff --git a/mcuboot/ci/sim_run.sh b/mcuboot/ci/sim_run.sh deleted file mode 100755 index 6c0e3f277..000000000 --- a/mcuboot/ci/sim_run.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -x - -# 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. - -GET_FEATURES="$(pwd)/ci/get_features.py" -CARGO_TOML="$(pwd)/sim/Cargo.toml" - -pushd sim - -all_features="$(${GET_FEATURES} ${CARGO_TOML})" -[ $? -ne 0 ] && exit 1 - -EXIT_CODE=0 - -if [[ ! -z $SINGLE_FEATURES ]]; then - if [[ $SINGLE_FEATURES =~ "none" ]]; then - echo "Running cargo with no features" - cargo test - rc=$? && [ $rc -ne 0 ] && EXIT_CODE=$rc - fi - - for feature in $all_features; do - if [[ $SINGLE_FEATURES =~ $feature ]]; then - echo "Running cargo for feature=\"${feature}\"" - cargo test --features $feature - rc=$? && [ $rc -ne 0 ] && EXIT_CODE=$rc - fi - done -fi - -if [[ ! -z $MULTI_FEATURES ]]; then - IFS=',' - read -ra multi_features <<< "$MULTI_FEATURES" - for features in "${multi_features[@]}"; do - echo "Running cargo for features=\"${features}\"" - cargo test --features "$features" - rc=$? && [ $rc -ne 0 ] && EXIT_CODE=$rc - done -fi - -popd -exit $EXIT_CODE diff --git a/mcuboot/docs/.gitignore b/mcuboot/docs/.gitignore deleted file mode 100644 index cf1879a5c..000000000 --- a/mcuboot/docs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.sass-cache/ -_site/ diff --git a/mcuboot/docs/Gemfile b/mcuboot/docs/Gemfile deleted file mode 100644 index a9dad35f8..000000000 --- a/mcuboot/docs/Gemfile +++ /dev/null @@ -1,27 +0,0 @@ -source "https://rubygems.org" - -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! -gem "jekyll", ">= 3.7.4" - -# This is the default theme for new Jekyll sites. You may change this to anything you like. -# gem "jekyll-theme-cayman", "~> 0.1" - -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -gem "github-pages", group: :jekyll_plugins - -# If you have any plugins, put them here! -# group :jekyll_plugins do -# gem "jekyll-feed", "~> 0.6" -# end - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] - diff --git a/mcuboot/docs/Gemfile.lock b/mcuboot/docs/Gemfile.lock deleted file mode 100644 index e3b08620c..000000000 --- a/mcuboot/docs/Gemfile.lock +++ /dev/null @@ -1,250 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (4.2.10) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.11.1) - colorator (1.1.0) - commonmarker (0.17.13) - ruby-enum (~> 0.5) - concurrent-ruby (1.1.4) - dnsruby (1.61.2) - addressable (~> 2.5) - em-websocket (0.5.1) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) - ethon (0.11.0) - ffi (>= 1.3.0) - eventmachine (1.2.7) - execjs (2.7.0) - faraday (0.15.4) - multipart-post (>= 1.2, < 3) - ffi (1.9.25) - forwardable-extended (2.6.0) - gemoji (3.0.0) - github-pages (193) - activesupport (= 4.2.10) - github-pages-health-check (= 1.8.1) - jekyll (= 3.7.4) - jekyll-avatar (= 0.6.0) - jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.1.5) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.11.0) - jekyll-gist (= 1.5.0) - jekyll-github-metadata (= 2.9.4) - jekyll-mentions (= 1.4.1) - jekyll-optional-front-matter (= 0.3.0) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.2.0) - jekyll-redirect-from (= 0.14.0) - jekyll-relative-links (= 0.5.3) - jekyll-remote-theme (= 0.3.1) - jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.5.0) - jekyll-sitemap (= 1.2.0) - jekyll-swiss (= 0.4.0) - jekyll-theme-architect (= 0.1.1) - jekyll-theme-cayman (= 0.1.1) - jekyll-theme-dinky (= 0.1.1) - jekyll-theme-hacker (= 0.1.1) - jekyll-theme-leap-day (= 0.1.1) - jekyll-theme-merlot (= 0.1.1) - jekyll-theme-midnight (= 0.1.1) - jekyll-theme-minimal (= 0.1.1) - jekyll-theme-modernist (= 0.1.1) - jekyll-theme-primer (= 0.5.3) - jekyll-theme-slate (= 0.1.1) - jekyll-theme-tactile (= 0.1.1) - jekyll-theme-time-machine (= 0.1.1) - jekyll-titles-from-headings (= 0.5.1) - jemoji (= 0.10.1) - kramdown (= 1.17.0) - liquid (= 4.0.0) - listen (= 3.1.5) - mercenary (~> 0.3) - minima (= 2.5.0) - nokogiri (>= 1.8.2, < 2.0) - rouge (= 2.2.1) - terminal-table (~> 1.4) - github-pages-health-check (1.8.1) - addressable (~> 2.3) - dnsruby (~> 1.60) - octokit (~> 4.0) - public_suffix (~> 2.0) - typhoeus (~> 1.3) - html-pipeline (2.9.1) - activesupport (>= 2) - nokogiri (>= 1.4) - http_parser.rb (0.6.0) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - jekyll (3.7.4) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (~> 0.7) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 2.0) - kramdown (~> 1.14) - liquid (~> 4.0) - mercenary (~> 0.3.3) - pathutil (~> 0.9) - rouge (>= 1.7, < 4) - safe_yaml (~> 1.0) - jekyll-avatar (0.6.0) - jekyll (~> 3.0) - jekyll-coffeescript (1.1.1) - coffee-script (~> 2.2) - coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.2.0) - commonmarker (~> 0.14) - jekyll (>= 3.0, < 4.0) - jekyll-commonmark-ghpages (0.1.5) - commonmarker (~> 0.17.6) - jekyll-commonmark (~> 1) - rouge (~> 2) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.11.0) - jekyll (~> 3.3) - jekyll-gist (1.5.0) - octokit (~> 4.2) - jekyll-github-metadata (2.9.4) - jekyll (~> 3.1) - octokit (~> 4.0, != 4.4.0) - jekyll-mentions (1.4.1) - html-pipeline (~> 2.3) - jekyll (~> 3.0) - jekyll-optional-front-matter (0.3.0) - jekyll (~> 3.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.2.0) - jekyll (~> 3.0) - jekyll-redirect-from (0.14.0) - jekyll (~> 3.3) - jekyll-relative-links (0.5.3) - jekyll (~> 3.3) - jekyll-remote-theme (0.3.1) - jekyll (~> 3.5) - rubyzip (>= 1.2.1, < 3.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) - jekyll-seo-tag (2.5.0) - jekyll (~> 3.3) - jekyll-sitemap (1.2.0) - jekyll (~> 3.3) - jekyll-swiss (0.4.0) - jekyll-theme-architect (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.5.3) - jekyll (~> 3.5) - jekyll-github-metadata (~> 2.9) - jekyll-seo-tag (~> 2.0) - jekyll-theme-slate (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-titles-from-headings (0.5.1) - jekyll (~> 3.3) - jekyll-watch (2.1.2) - listen (~> 3.0) - jemoji (0.10.1) - gemoji (~> 3.0) - html-pipeline (~> 2.2) - jekyll (~> 3.0) - kramdown (1.17.0) - liquid (4.0.0) - listen (3.1.5) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) - mercenary (0.3.6) - mini_portile2 (2.4.0) - minima (2.5.0) - jekyll (~> 3.5) - jekyll-feed (~> 0.9) - jekyll-seo-tag (~> 2.1) - minitest (5.11.3) - multipart-post (2.0.0) - nokogiri (1.10.8) - mini_portile2 (~> 2.4.0) - octokit (4.13.0) - sawyer (~> 0.8.0, >= 0.5.3) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (2.0.5) - rb-fsevent (0.10.3) - rb-inotify (0.10.0) - ffi (~> 1.0) - rouge (2.2.1) - ruby-enum (0.7.2) - i18n - ruby_dep (1.5.0) - rubyzip (2.0.0) - safe_yaml (1.0.4) - sass (3.7.2) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.1) - addressable (>= 2.3.5, < 2.6) - faraday (~> 0.8, < 1.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - typhoeus (1.3.1) - ethon (>= 0.9.0) - tzinfo (1.2.5) - thread_safe (~> 0.1) - unicode-display_width (1.4.1) - -PLATFORMS - ruby - -DEPENDENCIES - github-pages - jekyll (>= 3.7.4) - tzinfo-data - -BUNDLED WITH - 1.16.1 diff --git a/mcuboot/docs/PORTING.md b/mcuboot/docs/PORTING.md deleted file mode 100644 index 61a4f8d47..000000000 --- a/mcuboot/docs/PORTING.md +++ /dev/null @@ -1,158 +0,0 @@ -# Porting How-To - -This document describes the requirements and necessary steps required to port -`mcuboot` to a new target `OS`. - -# Requirements - -* `mcuboot` requires a configuration file, which can be included as - mcuboot_config/mcuboot_config.h, which configures various options - (that begin with MCUBOOT_). - -* `mcuboot` requires that the target provides a `flash` API with ability to - get the flash's minimum write size, and read/write/erase individual sectors. - -* `mcuboot` doesn't bundle a cryptographic library, which means the target - OS must already have it bundled. The supported libraries at the moment are - either `mbed TLS` or the set `tinycrypt` + `mbed TLS` (where `mbed TLS` is - used to provide functionality not existing in `tinycrypt`). - -# Steps to port - -## Main app and calling the bootloader - -From the perspective of the target OS, the bootloader can be seen as a library, -so an entry point must be provided. This is likely a typical `app` for the -target OS, and it must call the following function to run the bootloader: - -```c -int boot_go(struct boot_rsp *rsp); -``` - -This function is located at `boot/bootutil/loader.c` and receives a `struct -boot_rsp` pointer. The `struct boot_rsp` is defined as: - -```c -struct boot_rsp { - /** A pointer to the header of the image to be executed. */ - const struct image_header *br_hdr; - - /** - * The flash offset of the image to execute. Indicates the position of - * the image header. - */ - uint8_t br_flash_id; - uint32_t br_image_addr; -}; -``` - -After running the management functions of the bootloader, `boot_go` returns -an initialized `boot_rsp` which has pointers to the location of the image -where the target firmware is located which can be used to jump to. - -## Configuration file - -You must provide a file, mcuboot_config/mcuboot_config.h. This is -included by several files in the "library" portion of MCUboot; it -provides preprocessor definitions that configure the library's -build. - -See the file samples/mcuboot_config/mcuboot_config.template.h for a -starting point and more information. This is a good place to convert -settings in your environment's configuration system to those required -by MCUboot. For example, Mynewt uses MYNEWT_VAL() and Zephyr uses -Kconfig; these configuration systems are converted to MCUBOOT_ options -in the following files: - -- boot/zephyr/include/mcuboot_config/mcuboot_config.h -- boot/mynewt/mcuboot_config/include/mcuboot_config/mcuboot_config.h - -## Flash Map - -The bootloader requires a `flash_map` to be able to know how the flash is -partitioned. A `flash_map` consists of `struct flash_area` entries -specifying the partitions, where a `flash_area` defined as follows: - -```c -struct flash_area { - uint8_t fa_id; /** The slot/scratch identification */ - uint8_t fa_device_id; /** The device id (usually there's only one) */ - uint16_t pad16; - uint32_t fa_off; /** The flash offset from the beginning */ - uint32_t fa_size; /** The size of this sector */ -}; -``` - -`fa_id` is can be one of the following options: - -```c -/* Independent from multiple image boot */ -#define FLASH_AREA_BOOTLOADER 0 -#define FLASH_AREA_IMAGE_SCRATCH 3 -``` -```c -/* Flash area IDs of the first image in case of multiple images */ -#define FLASH_AREA_IMAGE_PRIMARY 1 -#define FLASH_AREA_IMAGE_SECONDARY 2 -``` -```c -/* Flash area IDs of the second image in case of multiple images */ -#define FLASH_AREA_IMAGE_PRIMARY 5 -#define FLASH_AREA_IMAGE_SECONDARY 6 -``` - -The functions that must be defined for working with the `flash_area`s are: - -```c -/*< Opens the area for use. id is one of the `fa_id`s */ -int flash_area_open(uint8_t id, const struct flash_area **); -void flash_area_close(const struct flash_area *); -/*< Reads `len` bytes of flash memory at `off` to the buffer at `dst` */ -int flash_area_read(const struct flash_area *, uint32_t off, void *dst, - uint32_t len); -/*< Writes `len` bytes of flash memory at `off` from the buffer at `src` */ -int flash_area_write(const struct flash_area *, uint32_t off, - const void *src, uint32_t len); -/*< Erases `len` bytes of flash memory at `off` */ -int flash_area_erase(const struct flash_area *, uint32_t off, uint32_t len); -/*< Returns this `flash_area`s alignment */ -uint8_t flash_area_align(const struct flash_area *); -/*< What is value is read from erased flash bytes. */ -uint8_t flash_area_erased_val(const struct flash_area *); -/*< Reads len bytes from off, and checks if the read data is erased. Returns - 1 if empty (that is containing erased value), 0 if not-empty, and -1 on - failure. */ -int flash_area_read_is_empty(const struct flash_area *fa, uint32_t off, - void *dst, uint32_t len); -/*< Given flash area ID, return info about sectors within the area. */ -int flash_area_get_sectors(int fa_id, uint32_t *count, - struct flash_sector *sectors); -/*< Returns the `fa_id` for slot, where slot is 0 (primary) or 1 (secondary). - `image_index` (0 or 1) is the index of the image. Image index is - relevant only when multi-image support support is enabled */ -int flash_area_id_from_multi_image_slot(int image_index, int slot); -/*< Returns the slot (0 for primary or 1 for secondary), for the supplied - `image_index` and `area_id`. `area_id` is unique and is represented by - `fa_id` in the `flash_area` struct. */ -int flash_area_id_to_multi_image_slot(int image_index, int area_id); -``` - -## Memory management for mbed TLS - -`mbed TLS` employs dynamic allocation of memory, making use of the pair -`calloc/free`. If `mbed TLS` is to be used for crypto, your target RTOS -needs to provide this pair of function. - -To configure the what functions are called when allocating/deallocating -memory `mbed TLS` uses the following call [^1]: - -``` -int mbedtls_platform_set_calloc_free (void *(*calloc_func)(size_t, size_t), - void (*free_func)(void *)); -``` - -If your system already provides functions with compatible signatures, those -can be used directly here, otherwise create new functions that glue to -your `calloc/free` implementations. - -[^1]: ```https://tls.mbed.org/api/platform_8h.html``` diff --git a/mcuboot/docs/SECURITY.md b/mcuboot/docs/SECURITY.md deleted file mode 100644 index ae003a4b4..000000000 --- a/mcuboot/docs/SECURITY.md +++ /dev/null @@ -1,49 +0,0 @@ -# MCUboot project security policy - -## Reporting Security Issues - -The MCUboot team takes security, vulnerabilities, and weaknesses -seriously. - -Security issues should be sent to the current maintainers of the -project: - -- David Brown: davidb@davidb.org or david.brown@linaro.org -- Fabio Utzig: utzig@apache.org - -If you wish to send encrypted email, you may use these PGP keys: - - pub rsa4096 2011-10-14 [SC] - DAFD760825AE2636AEA9CB19E6BA9F5C5E54DF82 - uid [ultimate] David Brown - uid [ultimate] David Brown - sub rsa4096 2011-10-14 [E] - -and - - pub rsa4096 2017-07-28 [SC] - 126087C7E725625BC7E89CC7537097EDFD4A7339 - uid [ unknown] Fabio Utzig - uid [ unknown] Fabio Utzig - sub rsa4096 2017-07-28 [E] - -Please include the word "SECURITY" as well as "MCUboot" in the subject -of any messages. - -We will make our best effort to respond within a timely manner. Most -vulnerabilities found within published code will undergo an embargo of -90 days to allow time fixes to be developed and deployed. - -## Vulnerability Advisories - -Vulnerability reports and published fixes will be reported as follows: - -- Issues will be entered into Github's [Security Advisory - system](https://github.com/JuulLabs-OSS/mcuboot/security/advisories), with - the interested parties (including the reporter) added as viewers. - -- The release notes will contain a reference to any allocated CVE(s). - -- When any embargo is lifted, the Security Advisory page will be made - public, and the public CVE database will be updated with all - relevant information. diff --git a/mcuboot/docs/SubmittingPatches.md b/mcuboot/docs/SubmittingPatches.md deleted file mode 100644 index 8a6cf7c43..000000000 --- a/mcuboot/docs/SubmittingPatches.md +++ /dev/null @@ -1,70 +0,0 @@ -# Submitting Patches - -Development on mcuboot primarily takes place in github, at: -https://github.com/JuulLabs-OSS/mcuboot - -Changes should be submitted via github pull requests. Each commit -should have a Signed-off-by line for the author (and the committer, if -that is different). It is not necessary (or possible) to get a -Signed-off-by from Github itself, even though some commits may be -generated by that tool. - -The Signed-off-by line should be at the end of the commit text, in the -last blank-line-separated section. There can be multiple lines in -this section (the format being roughly like RFC-2822). Currently -supported trailer lines are: - - Signed-off-by: Developer Name - -which indicates that the signer agrees to the Developer Certificate of -Origin below, and - - JIRA: MCUB-1234 - -which associates this commit with a particular JIRA ticket. You can -put more than one JIRA ticket, by separating them with a comma and a -space. JIRA is quite flexible about where the indicators go, but -putting them in a trailer with a common format will make them easier -to find later. - -# Developer Certificate of Origin - -``` -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -1 Letterman Drive -Suite D4700 -San Francisco, CA, 94129 - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` diff --git a/mcuboot/docs/_config.yml b/mcuboot/docs/_config.yml deleted file mode 100644 index 277f1f2c5..000000000 --- a/mcuboot/docs/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman diff --git a/mcuboot/docs/design.md b/mcuboot/docs/design.md deleted file mode 100644 index 9e3550c51..000000000 --- a/mcuboot/docs/design.md +++ /dev/null @@ -1,1075 +0,0 @@ - - -# Boot Loader - -## [Summary](#summary) - -mcuboot comprises two packages: - -* The bootutil library (boot/bootutil) -* The boot application (each port has its own at boot/) - -The bootutil library performs most of the functions of a boot loader. In -particular, the piece that is missing is the final step of actually jumping to -the main image. This last step is instead implemented by the boot application. -Boot loader functionality is separated in this manner to enable unit testing of -the boot loader. A library can be unit tested, but an application can't. -Therefore, functionality is delegated to the bootutil library when possible. - -## [Limitations](#limitations) - -The boot loader currently only supports images with the following -characteristics: -* Built to run from flash. -* Built to run from a fixed location (i.e., not position-independent). - -## [Image Format](#image-format) - -The following definitions describe the image format. - -``` c -#define IMAGE_MAGIC 0x96f3b83d - -#define IMAGE_HEADER_SIZE 32 - -struct image_version { - uint8_t iv_major; - uint8_t iv_minor; - uint16_t iv_revision; - uint32_t iv_build_num; -}; - -/** Image header. All fields are in little endian byte order. */ -struct image_header { - uint32_t ih_magic; - uint32_t ih_load_addr; - uint16_t ih_hdr_size; /* Size of image header (bytes). */ - uint16_t ih_protect_tlv_size; /* Size of protected TLV area (bytes). */ - uint32_t ih_img_size; /* Does not include header. */ - uint32_t ih_flags; /* IMAGE_F_[...]. */ - struct image_version ih_ver; - uint32_t _pad1; -}; - -#define IMAGE_TLV_INFO_MAGIC 0x6907 -#define IMAGE_TLV_PROT_INFO_MAGIC 0x6908 - -/** Image TLV header. All fields in little endian. */ -struct image_tlv_info { - uint16_t it_magic; - uint16_t it_tlv_tot; /* size of TLV area (including tlv_info header) */ -}; - -/** Image trailer TLV format. All fields in little endian. */ -struct image_tlv { - uint8_t it_type; /* IMAGE_TLV_[...]. */ - uint8_t _pad; - uint16_t it_len; /* Data length (not including TLV header). */ -}; - -/* - * Image header flags. - */ -#define IMAGE_F_PIC 0x00000001 /* Not supported. */ -#define IMAGE_F_NON_BOOTABLE 0x00000010 /* Split image app. */ -#define IMAGE_F_RAM_LOAD 0x00000020 - -/* - * Image trailer TLV types. - */ -#define IMAGE_TLV_KEYHASH 0x01 /* hash of the public key */ -#define IMAGE_TLV_SHA256 0x10 /* SHA256 of image hdr and body */ -#define IMAGE_TLV_RSA2048_PSS 0x20 /* RSA2048 of hash output */ -#define IMAGE_TLV_ECDSA224 0x21 /* ECDSA of hash output */ -#define IMAGE_TLV_ECDSA256 0x22 /* ECDSA of hash output */ -#define IMAGE_TLV_RSA3072_PSS 0x23 /* RSA3072 of hash output */ -#define IMAGE_TLV_ED25519 0x24 /* ED25519 of hash output */ -#define IMAGE_TLV_ENC_RSA2048 0x30 /* Key encrypted with RSA-OAEP-2048 */ -#define IMAGE_TLV_ENC_KW128 0x31 /* Key encrypted with AES-KW-128 */ -#define IMAGE_TLV_ENC_EC256 0x32 /* Key encrypted with ECIES-P256 */ -#define IMAGE_TLV_ENC_X25519 0x33 /* Key encrypted with ECIES-X25519 */ -#define IMAGE_TLV_DEPENDENCY 0x40 /* Image depends on other image */ -#define IMAGE_TLV_SEC_CNT 0x50 /* security counter */ -``` - -Optional type-length-value records (TLVs) containing image metadata are placed -after the end of the image. - -The `ih_protect_tlv_size` field indicates the length of the protected TLV area. -If protected TLVs are present then a TLV info header with magic equal to -`IMAGE_TLV_PROT_INFO_MAGIC` must be present and the protected TLVs (plus the -info header itself) have to be included in the hash calculation. Otherwise the -hash is only calculated over the image header and the image itself. In this -case the value of the `ih_protect_tlv_size` field is 0. - -The `ih_hdr_size` field indicates the length of the header, and therefore the -offset of the image itself. This field provides for backwards compatibility in -case of changes to the format of the image header. - -## [Flash Map](#flash-map) - -A device's flash is partitioned according to its _flash map_. At a high -level, the flash map maps numeric IDs to _flash areas_. A flash area is a -region of disk with the following properties: -1. An area can be fully erased without affecting any other areas. -2. A write to one area does not restrict writes to other areas. - -The boot loader uses the following flash area IDs: -```c -/* Independent from multiple image boot */ -#define FLASH_AREA_BOOTLOADER 0 -#define FLASH_AREA_IMAGE_SCRATCH 3 -``` -```c -/* If the boot loader is working with the first image */ -#define FLASH_AREA_IMAGE_PRIMARY 1 -#define FLASH_AREA_IMAGE_SECONDARY 2 -``` -```c -/* If the boot loader is working with the second image */ -#define FLASH_AREA_IMAGE_PRIMARY 5 -#define FLASH_AREA_IMAGE_SECONDARY 6 -``` - -The bootloader area contains the bootloader image itself. The other areas are -described in subsequent sections. The flash could contain multiple executable -images therefore the flash area IDs of primary and secondary areas are mapped -based on the number of the active image (on which the bootloader is currently -working). - -## [Image Slots](#image-slots) - -A portion of the flash memory can be partitioned into multiple image areas, each -contains two image slots: a primary slot and a secondary slot. -The boot loader will only run an image from the primary slot, so images must be -built such that they can run from that fixed location in flash. If the boot -loader needs to run the image resident in the secondary slot, it must copy its -contents into the primary slot before doing so, either by swapping the two -images or by overwriting the contents of the primary slot. The bootloader -supports either swap- or overwrite-based image upgrades, but must be configured -at build time to choose one of these two strategies. - -In addition to the slots of image areas, the boot loader requires a scratch -area to allow for reliable image swapping. The scratch area must have a size -that is enough to store at least the largest sector that is going to be swapped. -Many devices have small equally sized flash sectors, eg 4K, while others have -variable sized sectors where the largest sectors might be 128K or 256K, so the -scratch must be big enough to store that. The scratch is only ever used when -swapping firmware, which means only when doing an upgrade. Given that, the main -reason for using a larger size for the scratch is that flash wear will be more -evenly distributed, because a single sector would be written twice the number of -times than using two sectors, for example. To evaluate the ideal size of the -scratch for your use case the following parameters are relevant: - -* the ratio of image size / scratch size -* the number of erase cycles supported by the flash hardware - -The image size is used (instead of slot size) because only the slot's sectors -that are actually used for storing the image are copied. The image/scratch ratio -is the number of times the scratch will be erased on every upgrade. The number -of erase cycles divided by the image/scratch ratio will give you the number of -times an upgrade can be performed before the device goes out of spec. - -``` -num_upgrades = number_of_erase_cycles / (image_size / scratch_size) -``` - -Let's assume, for example, a device with 10000 erase cycles, an image size of -150K and a scratch of 4K (usual minimum size of 4K sector devices). This would -result in a total of: - -`10000 / (150 / 4) ~ 267` - -Increasing the scratch to 16K would give us: - -`10000 / (150 / 16) ~ 1067` - -There is no *best* ratio, as the right size is use-case dependent. Factors to -consider include the number of times a device will be upgraded both in the field -and during development, as well as any desired safety margin on the -manufacturer's specified number of erase cycles. In general, using a ratio that -allows hundreds to thousands of field upgrades in production is recommended. - -The overwrite upgrade strategy is substantially simpler to implement than the -image swapping strategy, especially since the bootloader must work properly -even when it is reset during the middle of an image swap. For this reason, the -rest of the document describes its behavior when configured to swap images -during an upgrade. - -## [Boot Swap Types](#boot-swap-types) - -When the device first boots under normal circumstances, there is an up-to-date -firmware image in each primary slot, which mcuboot can validate and then -chain-load. In this case, no image swaps are necessary. During device upgrades, -however, new candidate image(s) is present in the secondary slot(s), which -mcuboot must swap into the primary slot(s) before booting as discussed above. - -Upgrading an old image with a new one by swapping can be a two-step process. In -this process, mcuboot performs a "test" swap of image data in flash and boots -the new image or it will be executed during operation. The new image can then -update the contents of flash at runtime to mark itself "OK", and mcuboot will -then still choose to run it during the next boot. When this happens, the swap is -made "permanent". If this doesn't happen, mcuboot will perform a "revert" swap -during the next boot by swapping the image(s) back into its original location(s) -, and attempting to boot the old image(s). - -Depending on the use case, the first swap can also be made permanent directly. -In this case, mcuboot will never attempt to revert the images on the next reset. - -Test swaps are supported to provide a rollback mechanism to prevent devices -from becoming "bricked" by bad firmware. If the device crashes immediately -upon booting a new (bad) image, mcuboot will revert to the old (working) image -at the next device reset, rather than booting the bad image again. This allows -device firmware to make test swaps permanent only after performing a self-test -routine. - -On startup, mcuboot inspects the contents of flash to decide for each images -which of these "swap types" to perform; this decision determines how it -proceeds. - -The possible swap types, and their meanings, are: - -- `BOOT_SWAP_TYPE_NONE`: The "usual" or "no upgrade" case; attempt to boot the - contents of the primary slot. - -- `BOOT_SWAP_TYPE_TEST`: Boot the contents of the secondary slot by swapping - images. Unless the swap is made permanent, revert back on the next boot. - -- `BOOT_SWAP_TYPE_PERM`: Permanently swap images, and boot the upgraded image - firmware. - -- `BOOT_SWAP_TYPE_REVERT`: A previous test swap was not made permanent; - swap back to the old image whose data are now in the secondary slot. If the - old image marks itself "OK" when it boots, the next boot will have swap type - `BOOT_SWAP_TYPE_NONE`. - -- `BOOT_SWAP_TYPE_FAIL`: Swap failed because image to be run is not valid. - -- `BOOT_SWAP_TYPE_PANIC`: Swapping encountered an unrecoverable error. - -The "swap type" is a high-level representation of the outcome of the -boot. Subsequent sections describe how mcuboot determines the swap type from -the bit-level contents of flash. - -## [Image Trailer](#image-trailer) - -For the bootloader to be able to determine the current state and what actions -should be taken during the current boot operation, it uses metadata stored in -the image flash areas. While swapping, some of this metadata is temporarily -copied into and out of the scratch area. - -This metadata is located at the end of the image flash areas, and is called an -image trailer. An image trailer has the following structure: - -``` - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - ~ ~ - ~ Swap status (BOOT_MAX_IMG_SECTORS * min-write-size * 3) ~ - ~ ~ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Encryption key 0 (16 octets) [*] | - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Encryption key 1 (16 octets) [*] | - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Swap size (4 octets) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Swap info | 0xff padding (7 octets) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Copy done | 0xff padding (7 octets) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Image OK | 0xff padding (7 octets) | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | MAGIC (16 octets) | - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -``` - -[*]: Only present if the encryption option is enabled (`MCUBOOT_ENC_IMAGES`). - -The offset immediately following such a record represents the start of the next -flash area. - -Note: "min-write-size" is a property of the flash hardware. If the hardware -allows individual bytes to be written at arbitrary addresses, then -min-write-size is 1. If the hardware only allows writes at even addresses, -then min-write-size is 2, and so on. - -An image trailer contains the following fields: - -1. Swap status: A series of records which records the progress of an image - swap. To swap entire images, data are swapped between the two image areas - one or more sectors at a time, like this: - - - sector data in the primary slot is copied into scratch, then erased - - sector data in the secondary slot is copied into the primary slot, - then erased - - sector data in scratch is copied into the secondary slot - -As it swaps images, the bootloader updates the swap status field in a way that -allows it to compute how far this swap operation has progressed for each -sector. The swap status field can thus used to resume a swap operation if the -bootloader is halted while a swap operation is ongoing and later reset. The -`BOOT_MAX_IMG_SECTORS` value is the configurable maximum number of sectors -mcuboot supports for each image; its value defaults to 128, but allows for -either decreasing this size, to limit RAM usage, or to increase it in devices -that have massive amounts of Flash or very small sized sectors and thus require -a bigger configuration to allow for the handling of all slot's sectors. -The factor of min-write-sz is due to the behavior of flash hardware. The factor -of 3 is explained below. - -2. Encryption keys: key-encrypting keys (KEKs). These keys are needed for - image encryption and decryption. See the - [encrypted images](encrypted_images.md) document for more information. - -3. Swap size: When beginning a new swap operation, the total size that needs - to be swapped (based on the slot with largest image + TLVs) is written to - this location for easier recovery in case of a reset while performing the - swap. - -4. Swap info: A single byte which encodes the following information: - - Swap type: Stored in bits 0-3. Indicating the type of swap operation in - progress. When mcuboot resumes an interrupted swap, it uses this field to - determine the type of operation to perform. This field contains one of the - following values in the table below. - - Image number: Stored in bits 4-7. It has always 0 value at single image - boot. In case of multi image boot it indicates, which image was swapped when - interrupt happened. The same scratch area is used during in case of all - image swap operation. Therefore this field is used to determine which image - the trailer belongs to if boot status is found on scratch area when the swap - operation is resumed. - -| Name | Value | -| ------------------------- | ----- | -| `BOOT_SWAP_TYPE_TEST` | 2 | -| `BOOT_SWAP_TYPE_PERM` | 3 | -| `BOOT_SWAP_TYPE_REVERT` | 4 | - - -5. Copy done: A single byte indicating whether the image in this slot is - complete (0x01=done; 0xff=not done). - -6. Image OK: A single byte indicating whether the image in this slot has been - confirmed as good by the user (0x01=confirmed; 0xff=not confirmed). - -7. MAGIC: The following 16 bytes, written in host-byte-order: - -``` c - const uint32_t boot_img_magic[4] = { - 0xf395c277, - 0x7fefd260, - 0x0f505235, - 0x8079b62c, - }; -``` - -## [IMAGE TRAILERS](#image-trailers) - -At startup, the boot loader determines the boot swap type by inspecting the -image trailers. When using the term "image trailers" what is meant is the -aggregate information provided by both image slot's trailers. - -### [New swaps (non-resumes)](#new-swaps-non-resumes) - -For new swaps, mcuboot must inspect a collection of fields to determine which -swap operation to perform. - -The image trailers records are structured around the limitations imposed by -flash hardware. As a consequence, they do not have a very intuitive design, and -it is difficult to get a sense of the state of the device just by looking at the -image trailers. It is better to map all the possible trailer states to the swap -types described above via a set of tables. These tables are reproduced below. - -Note: An important caveat about the tables described below is that they must -be evaluated in the order presented here. Lower state numbers must have a -higher priority when testing the image trailers. - -``` - State I - | primary slot | secondary slot | - -----------------+--------------+----------------| - magic | Any | Good | - image-ok | Any | Unset | - copy-done | Any | Any | - -----------------+--------------+----------------' - result: BOOT_SWAP_TYPE_TEST | - -------------------------------------------------' - - - State II - | primary slot | secondary slot | - -----------------+--------------+----------------| - magic | Any | Good | - image-ok | Any | 0x01 | - copy-done | Any | Any | - -----------------+--------------+----------------' - result: BOOT_SWAP_TYPE_PERM | - -------------------------------------------------' - - - State III - | primary slot | secondary slot | - -----------------+--------------+----------------| - magic | Good | Unset | - image-ok | 0xff | Any | - copy-done | 0x01 | Any | - -----------------+--------------+----------------' - result: BOOT_SWAP_TYPE_REVERT | - -------------------------------------------------' -``` - -Any of the above three states results in mcuboot attempting to swap images. - -Otherwise, mcuboot does not attempt to swap images, resulting in one of the -other three swap types, as illustrated by State IV. - -``` - State IV - | primary slot | secondary slot | - -----------------+--------------+----------------| - magic | Any | Any | - image-ok | Any | Any | - copy-done | Any | Any | - -----------------+--------------+----------------' - result: BOOT_SWAP_TYPE_NONE, | - BOOT_SWAP_TYPE_FAIL, or | - BOOT_SWAP_TYPE_PANIC | - -------------------------------------------------' -``` - -In State IV, when no errors occur, mcuboot will attempt to boot the contents of -the primary slot directly, and the result is `BOOT_SWAP_TYPE_NONE`. If the image -in the primary slot is not valid, the result is `BOOT_SWAP_TYPE_FAIL`. If a -fatal error occurs during boot, the result is `BOOT_SWAP_TYPE_PANIC`. If the -result is either `BOOT_SWAP_TYPE_FAIL` or `BOOT_SWAP_TYPE_PANIC`, mcuboot hangs -rather than booting an invalid or compromised image. - -Note: An important caveat to the above is the result when a swap is requested - and the image in the secondary slot fails to validate, due to a hashing or - signing error. This state behaves as State IV with the extra action of - marking the image in the primary slot as "OK", to prevent further attempts - to swap. - -### [Resumed swaps](#resumed-swaps) - -If mcuboot determines that it is resuming an interrupted swap (i.e., a reset -occurred mid-swap), it fully determines the operation to resume by reading the -`swap info` field from the active trailer and extracting the swap type from bits -0-3. The set of tables in the previous section are not necessary in the resume -case. - -## [High-Level Operation](#high-level-operation) - -With the terms defined, we can now explore the boot loader's operation. First, -a high-level overview of the boot process is presented. Then, the following -sections describe each step of the process in more detail. - -Procedure: - -1. Inspect swap status region; is an interrupted swap being resumed? - + Yes: Complete the partial swap operation; skip to step 3. - + No: Proceed to step 2. - -2. Inspect image trailers; is a swap requested? - + Yes: - 1. Is the requested image valid (integrity and security check)? - + Yes. - a. Perform swap operation. - b. Persist completion of swap procedure to image trailers. - c. Proceed to step 3. - + No. - a. Erase invalid image. - b. Persist failure of swap procedure to image trailers. - c. Proceed to step 3. - - + No: Proceed to step 3. - -3. Boot into image in primary slot. - -### [Multiple Image Boot](#multiple-image-boot) - -When the flash contains multiple executable images the boot loader's operation -is a bit more complex but similar to the previously described procedure with -one image. Every image can be updated independently therefore the flash is -partitioned further to arrange two slots for each image. -``` -+--------------------+ -| MCUBoot | -+--------------------+ - ~~~~~ <- memory might be not contiguous -+--------------------+ -| Image 0 | -| primary slot | -+--------------------+ -| Image 0 | -| secondary slot | -+--------------------+ - ~~~~~ <- memory might be not contiguous -+--------------------+ -| Image N | -| primary slot | -+--------------------+ -| Image N | -| secondary slot | -+--------------------+ -| Scratch | -+--------------------+ -``` -MCUBoot is also capable of handling dependencies between images. For example -if an image needs to be reverted it might be necessary to revert another one too -(e.g. due to API incompatibilities) or simply to prevent from being updated -because of an unsatisfied dependency. Therefore all aborted swaps have to be -completed and all the swap types have to be determined for each image before -the dependency checks. Dependency handling is described in more detail in a -following section. The multiple image boot procedure is organized in loops which -iterate over all the firmware images. The high-level overview of the boot -process is presented below. - -+ ###### Loop 1. Iterate over all images - 1. Inspect swap status region of current image; is an interrupted swap being - resumed? - + Yes: - + Review the validity of previously determined swap types - of other images. - + Complete the partial swap operation. - + Mark the swap type as `None`. - + Skip to next image. - + No: Proceed to step 2. - - 2. Inspect image trailers in the primary and secondary slot; is an image - swap requested? - + Yes: Review the validity of previously determined swap types of other - images. Is the requested image valid (integrity and security - check)? - + Yes: - + Set the previously determined swap type for the current image. - + Skip to next image. - + No: - + Erase invalid image. - + Persist failure of swap procedure to image trailers. - + Mark the swap type as `Fail`. - + Skip to next image. - + No: - + Mark the swap type as `None`. - + Skip to next image. - -+ ###### Loop 2. Iterate over all images - 1. Does the current image depend on other image(s)? - + Yes: Are all the image dependencies satisfied? - + Yes: Skip to next image. - + No: - + Modify swap type depending on what the previous type was. - + Restart dependency check from the first image. - + No: Skip to next image. - -+ ###### Loop 3. Iterate over all images - 1. Is an image swap requested? - + Yes: - + Perform image update operation. - + Persist completion of swap procedure to image trailers. - + Skip to next image. - + No: Skip to next image. - -+ ###### Loop 4. Iterate over all images - 1. Validate image in the primary slot (integrity and security check) or - at least do a basic sanity check to avoid booting into an empty flash - area. - -+ Boot into image in the primary slot of the 0th image position\ - (other image in the boot chain is started by another image). - -## [Image Swapping](#image-swapping) - -The boot loader swaps the contents of the two image slots for two reasons: - - * User has issued a "set pending" operation; the image in the secondary slot - should be run once (state I) or repeatedly (state II), depending on - whether a permanent swap was specified. - * Test image rebooted without being confirmed; the boot loader should - revert to the original image currently in the secondary slot (state III). - -If the image trailers indicates that the image in the secondary slot should be -run, the boot loader needs to copy it to the primary slot. The image currently -in the primary slot also needs to be retained in flash so that it can be used -later. Furthermore, both images need to be recoverable if the boot loader -resets in the middle of the swap operation. The two images are swapped -according to the following procedure: - -1. Determine if both slots are compatible enough to have their images swapped. - To be compatible, both have to have only sectors that can fit into the - scratch area and if one of them has larger sectors than the other, it must - be able to entirely fit some rounded number of sectors from the other slot. - In the next steps we'll use the terminology "region" for the total amount of - data copied/erased because this can be any amount of sectors depending on - how many the scratch is able to fit for some swap operation. -2. Iterate the list of region indices in descending order (i.e., starting - with the greatest index); only regions that are predetermined to be part of - the image are copied; current element = "index". - + a. Erase scratch area. - + b. Copy secondary_slot[index] to scratch area. - - If this is the last region in the slot, scratch area has a temporary - status area initialized to store the initial state, because the - primary slot's last region will have to be erased. In this case, - only the data that was calculated to amount to the image is copied. - - Else if this is the first swapped region but not the last region in - the slot, initialize the status area in primary slot and copy the - full region contents. - - Else, copy entire region contents. - + c. Write updated swap status (i). - + d. Erase secondary_slot[index] - + e. Copy primary_slot[index] to secondary_slot[index] according to amount - previosly copied at step b. - - If this is not the last region in the slot, erase the trailer in the - secondary slot, to always use the one in the primary slot. - + f. Write updated swap status (ii). - + g. Erase primary_slot[index]. - + h. Copy scratch area to primary_slot[index] according to amount - previously copied at step b. - - If this is the last region in the slot, the status is read from - scratch (where it was stored temporarily) and written anew in the - primary slot. - + i. Write updated swap status (iii). -3. Persist completion of swap procedure to the primary slot image trailer. - -The additional caveats in step 2f are necessary so that the secondary slot image -trailer can be written by the user at a later time. With the image trailer -unwritten, the user can test the image in the secondary slot -(i.e., transition to state I). - -Note1: If the region being copied contains the last sector, then swap status is -temporarily maintained on scratch for the duration of this operation, always -using the primary slot's area otherwise. - -Note2: The bootloader tries to copy only used sectors (based on largest image -installed on any of the slots), minimizing the amount of sectors copied and -reducing the amount of time required for a swap operation. - -The particulars of step 3 vary depending on whether an image is being tested, -permanently used, reverted or a validation failure of the secondary slot -happened when a swap was requested: - - * test: - o Write primary_slot.copy_done = 1 - (swap caused the following values to be written: - primary_slot.magic = BOOT_MAGIC - secondary_slot.magic = UNSET - primary_slot.image_ok = Unset) - - * permanent: - o Write primary_slot.copy_done = 1 - (swap caused the following values to be written: - primary_slot.magic = BOOT_MAGIC - secondary_slot.magic = UNSET - primary_slot.image_ok = 0x01) - - * revert: - o Write primary_slot.copy_done = 1 - o Write primary_slot.image_ok = 1 - (swap caused the following values to be written: - primary_slot.magic = BOOT_MAGIC) - - * failure to validate the secondary slot: - o Write primary_slot.image_ok = 1 - -After completing the operations as described above the image in the primary slot -should be booted. - -## [Swap Status](#swap-status) - -The swap status region allows the boot loader to recover in case it restarts in -the middle of an image swap operation. The swap status region consists of a -series of single-byte records. These records are written independently, and -therefore must be padded according to the minimum write size imposed by the -flash hardware. In the below figure, a min-write-size of 1 is assumed for -simplicity. The structure of the swap status region is illustrated below. In -this figure, a min-write-size of 1 is assumed for simplicity. - -``` - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |sec127,state 0 |sec127,state 1 |sec127,state 2 |sec126,state 0 | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |sec126,state 1 |sec126,state 2 |sec125,state 0 |sec125,state 1 | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |sec125,state 2 | | - +-+-+-+-+-+-+-+-+ + - ~ ~ - ~ [Records for indices 124 through 1 ~ - ~ ~ - ~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - ~ |sec000,state 0 |sec000,state 1 |sec000,state 2 | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -``` - -The above is probably not helpful at all; here is a description in English. - -Each image slot is partitioned into a sequence of flash sectors. If we were to -enumerate the sectors in a single slot, starting at 0, we would have a list of -sector indices. Since there are two image slots, each sector index would -correspond to a pair of sectors. For example, sector index 0 corresponds to -the first sector in the primary slot and the first sector in the secondary slot. -Finally, reverse the list of indices such that the list starts with index -`BOOT_MAX_IMG_SECTORS - 1` and ends with 0. The swap status region is a -representation of this reversed list. - -During a swap operation, each sector index transitions through four separate -states: -``` -0. primary slot: image 0, secondary slot: image 1, scratch: N/A -1. primary slot: image 0, secondary slot: N/A, scratch: image 1 (1->s, erase 1) -2. primary slot: N/A, secondary slot: image 0, scratch: image 1 (0->1, erase 0) -3. primary slot: image 1, secondary slot: image 0, scratch: N/A (s->0) -``` - -Each time a sector index transitions to a new state, the boot loader writes a -record to the swap status region. Logically, the boot loader only needs one -record per sector index to keep track of the current swap state. However, due -to limitations imposed by flash hardware, a record cannot be overwritten when -an index's state changes. To solve this problem, the boot loader uses three -records per sector index rather than just one. - -Each sector-state pair is represented as a set of three records. The record -values map to the above four states as follows - -``` - | rec0 | rec1 | rec2 - --------+------+------+------ - state 0 | 0xff | 0xff | 0xff - state 1 | 0x01 | 0xff | 0xff - state 2 | 0x01 | 0x02 | 0xff - state 3 | 0x01 | 0x02 | 0x03 -``` - -The swap status region can accommodate `BOOT_MAX_IMG_SECTORS` sector indices. -Hence, the size of the region, in bytes, is -`BOOT_MAX_IMG_SECTORS * min-write-size * 3`. The only requirement for the index -count is that it is great enough to account for a maximum-sized image -(i.e., at least as great as the total sector count in an image slot). If a -device's image slots have been configured with `BOOT_MAX_IMG_SECTORS: 128` and -use less than 128 sectors, the first record that gets written will be somewhere -in the middle of the region. For example, if a slot uses 64 sectors, the first -sector index that gets swapped is 63, which corresponds to the exact halfway -point within the region. - -Note: since the scratch area only ever needs to record swapping of the last -sector, it uses at most min-write-size * 3 bytes for its own status area. - -## [Reset Recovery](#reset-recovery) - -If the boot loader resets in the middle of a swap operation, the two images may -be discontiguous in flash. Bootutil recovers from this condition by using the -image trailers to determine how the image parts are distributed in flash. - -The first step is determine where the relevant swap status region is located. -Because this region is embedded within the image slots, its location in flash -changes during a swap operation. The below set of tables map image trailers -contents to swap status location. In these tables, the "source" field -indicates where the swap status region is located. In case of multi image boot -the images primary area and the single scratch area is always examined in pairs. -If swap status found on scratch area then it might not belong to the current -image. The swap_info field of swap status stores the corresponding image number. -If it does not match then "source: none" is returned. - -``` - | primary slot | scratch | - ----------+--------------+--------------| - magic | Good | Any | - copy-done | 0x01 | N/A | - ----------+--------------+--------------' - source: none | - ----------------------------------------' - - | primary slot | scratch | - ----------+--------------+--------------| - magic | Good | Any | - copy-done | 0xff | N/A | - ----------+--------------+--------------' - source: primary slot | - ----------------------------------------' - - | primary slot | scratch | - ----------+--------------+--------------| - magic | Any | Good | - copy-done | Any | N/A | - ----------+--------------+--------------' - source: scratch | - ----------------------------------------' - - | primary slot | scratch | - ----------+--------------+--------------| - magic | Unset | Any | - copy-done | 0xff | N/A | - ----------+--------------+--------------| - source: primary slot | - ----------------------------------------+------------------------------+ - This represents one of two cases: | - o No swaps ever (no status to read, so no harm in checking). | - o Mid-revert; status in the primary slot. | - For this reason we assume the primary slot as source, to trigger a | - check of the status area and find out if there was swapping under way. | - -----------------------------------------------------------------------' -``` - -If the swap status region indicates that the images are not contiguous, mcuboot -determines the type of swap operation that was interrupted by reading the `swap -info` field in the active image trailer and extracting the swap type from bits -0-3 then resumes the operation. In other words, it applies the procedure defined -in the previous section, moving image 1 into the primary slot and image 0 into -the secondary slot. If the boot status indicates that an image part is present -in the scratch area, this part is copied into the correct location by starting -at step e or step h in the area-swap procedure, depending on whether the part -belongs to image 0 or image 1. - -After the swap operation has been completed, the boot loader proceeds as though -it had just been started. - -## [Integrity Check](#integrity-check) - -An image is checked for integrity immediately before it gets copied into the -primary slot. If the boot loader doesn't perform an image swap, then it can -perform an optional integrity check of the image in the primary slot if -`MCUBOOT_VALIDATE_PRIMARY_SLOT` is set, otherwise it doesn't perform an -integrity check. - -During the integrity check, the boot loader verifies the following aspects of -an image: - - * 32-bit magic number must be correct (`IMAGE_MAGIC`). - * Image must contain an `image_tlv_info` struct, identified by its magic - (`IMAGE_TLV_PROT_INFO_MAGIC` or `IMAGE_TLV_INFO_MAGIC`) exactly following - the firmware (`hdr_size` + `img_size`). If `IMAGE_TLV_PROT_INFO_MAGIC` is - found then after `ih_protect_tlv_size` bytes, another `image_tlv_info` - with magic equal to `IMAGE_TLV_INFO_MAGIC` must be present. - * Image must contain a SHA256 TLV. - * Calculated SHA256 must match SHA256 TLV contents. - * Image *may* contain a signature TLV. If it does, it must also have a - KEYHASH TLV with the hash of the key that was used to sign. The list of - keys will then be iterated over looking for the matching key, which then - will then be used to verify the image contents. - -## [Security](#security) - -As indicated above, the final step of the integrity check is signature -verification. The boot loader can have one or more public keys embedded in it -at build time. During signature verification, the boot loader verifies that an -image was signed with a private key that corresponds to the embedded KEYHASH -TLV. - -For information on embedding public keys in the boot loader, as well as -producing signed images, see: [signed_images](signed_images.md). - -If you want to enable and use encrypted images, see: -[encrypted_images](encrypted_images.md). - -### [Using Hardware Keys for Verification](#hw-key-support) - -By default, the whole public key is embedded in the bootloader code and its -hash is added to the image manifest as a KEYHASH TLV entry. As an alternative -the bootloader can be made independent of the keys by setting the -`MCUBOOT_HW_KEY` option. In this case the hash of the public key must be -provisioned to the target device and mcuboot must be able to retrieve the -key-hash from there. For this reason the target must provide a definition -for the `boot_retrieve_public_key_hash()` function which is declared in -`boot/bootutil/include/bootutil/sign_key.h`. It is also required to use -the `full` option for the `--public-key-format` imgtool argument in order to -add the whole public key (PUBKEY TLV) to the image manifest instead of its -hash (KEYHASH TLV). During boot the public key is validated before using it for -signature verification, mcuboot calculates the hash of the public key from the -TLV area and compares it with the key-hash that was retrieved from the device. -This way mcuboot is independent from the public key(s). The key(s) can be -provisioned any time and by different parties. - -## [Protected TLVs](#protected-tlvs) - -If the TLV area contains protected TLV entries, by beginning with a `struct -image_tlv_info` with a magic value of `IMAGE_TLV_PROT_INFO_MAGIC` then the -data of those TLVs must also be integrity and authenticity protected. Beyond -the full size of the protected TLVs being stored in the `image_tlv_info`, -the size of the protected TLVs together with the size of the `image_tlv_info` -struct itself are also saved in the `ih_protected_size` field inside the -header. - -Whenever an image has protected TLVs the SHA256 has to be calculated over -not just the image header and the image but also the TLV info header and the -protected TLVs. - -``` -A +---------------------+ - | Header | <- struct image_header - +---------------------+ - | Payload | - +---------------------+ - | TLV area | - | +-----------------+ | struct image_tlv_info with - | | TLV area header | | <- IMAGE_TLV_PROT_INFO_MAGIC (optional) - | +-----------------+ | - | | Protected TLVs | | <- Protected TLVs (struct image_tlv) -B | +-----------------+ | - | | TLV area header | | <- struct image_tlv_info with IMAGE_TLV_INFO_MAGIC -C | +-----------------+ | - | | SHA256 hash | | <- hash from A - B (struct image_tlv) -D | +-----------------+ | - | | Keyhash | | <- indicates which pub. key for sig (struct image_tlv) - | +-----------------+ | - | | Signature | | <- signature from C - D (struct image_tlv), only hash - | +-----------------+ | - +---------------------+ -``` - -## [Dependency Check](#dependency-check) - -MCUBoot can handle multiple firmware images. It is possible to update them -independently but in many cases it can be desired to be able to describe -dependencies between the images (e.g. to ensure API compliance and avoid -interoperability issues). - -The dependencies between images can be described with additional TLV entries in -the protected TLV area after the end of an image. There can be more than one -dependency entry, but in practice if the platform only supports two individual -images then there can be maximum one entry which reflects to the other image. - -At the phase of dependency check all aborted swaps are finalized if there were -any. During the dependency check the boot loader verifies whether the image -dependencies are all satisfied. If at least one of the dependencies of an image -is not fulfilled then the swap type of that image has to be modified -accordingly and the dependency check needs to be restarted. This way the number -of unsatisfied dependencies will decrease or remain the same. There is always at -least 1 valid configuration. In worst case, the system returns to the initial -state after dependency check. - -For more information on adding dependency entries to an image, -see: [imgtool](imgtool.md). - -## [Downgrade Prevention](#downgrade-prevention) - -Downgrade prevention is a feature which enforces that the new image must have a -higher version/security counter number than the image it is replacing, thus -preventing the malicious downgrading of the device to an older and possibly -vulnerable version of its firmware. - -### [SW Based Downgrade Prevention](#sw-downgrade-prevention) - -During the software based downgrade prevention the image version numbers are -compared. This feature is enabled with the `MCUBOOT_DOWNGRADE_PREVENTION` -option. In this case downgrade prevention is only available when the -overwrite-based image update strategy is used (i.e. `MCUBOOT_OVERWRITE_ONLY` -is set). - -### [HW Based Downgrade Prevention](#hw-downgrade-prevention) - -Each signed image can contain a security counter in its protected TLV area, which -can be added to the image using the `-s` option of the [imgtool](imgtool.md) script. -During the hardware based downgrade prevention (alias rollback protection) the -new image's security counter will be compared with the currently active security -counter value which must be stored in a non-volatile and trusted component of -the device. It is beneficial to handle this counter independently from image -version number: - - * It does not need to increase with each software release, - * It makes it possible to do software downgrade to some extent: if the - security counter has the same value in the older image then it is accepted. - -It is an optional step of the image validation process and can be enabled with -the `MCUBOOT_HW_ROLLBACK_PROT` config option. When enabled, the target must -provide an implementation of the security counter interface defined in -`boot/bootutil/include/security_cnt.h`. - -## [Measured boot and data sharing](#boot-data-sharing) - -MCUBoot defines a mechanism for sharing boot status information (also known as -measured boot) and an interface for sharing application specific information -with the runtime software. If any of these are enabled the target must provide -a shared data area between the bootloader and runtime firmware and define the -following parameters: - -```c -#define MCUBOOT_SHARED_DATA_BASE -#define MCUBOOT_SHARED_DATA_SIZE -``` - -In the shared memory area all data entries are stored in a type-length-value -(TLV) format. Before adding the first data entry, the whole area is overwritten -with zeros and a TLV header is added at the beginning of the area during an -initialization phase. This TLV header contains a `tlv_magic` field with a value -of `SHARED_DATA_TLV_INFO_MAGIC` and a `tlv_tot_len` field which is indicating -the total length of shared TLV area including this header. The header is -followed by the the data TLV entries which are composed from a -`shared_data_tlv_entry` header and the data itself. In the data header there is -a `tlv_type` field which identifies the consumer of the entry (in the runtime -software) and specifies the subtype of that data item. More information about -the `tlv_type` field and data types can be found in the -`boot/bootutil/include/bootutil/boot_status.h` file. The type is followed by a -`tlv_len` field which indicates the size of the data entry in bytes, not -including the entry header. After this header structure comes the actual data. - -```c -/** Shared data TLV header. All fields in little endian. */ -struct shared_data_tlv_header { - uint16_t tlv_magic; - uint16_t tlv_tot_len; /* size of whole TLV area (including this header) */ -}; - -/** Shared data TLV entry header format. All fields in little endian. */ -struct shared_data_tlv_entry { - uint16_t tlv_type; - uint16_t tlv_len; /* TLV data length (not including this header). */ -}; -``` - -The measured boot can be enabled with the `MCUBOOT_MEASURED_BOOT` config option. -When enabled, the `--boot_record` argument of the imgtool script must also be -used during the image signing process to add a BOOT_RECORD TLV to the image -manifest. This TLV contains the following attributes/measurements of the -image in CBOR encoded format: - - * Software type (role of the software component) - * Software version - * Signer ID (identifies the signing authority) - * Measurement value (hash of the image) - * Measurement type (algorithm used to calculate the measurement value) - -The `sw_type` string that is passed as the `--boot_record` option's parameter -will be the value of the "Software type" attribute in the generated BOOT_RECORD -TLV. The target must also define the `MAX_BOOT_RECORD_SZ` macro which indicates -the maximum size of the CBOR encoded boot record in bytes. -During boot, MCUBoot will look for these TLVs (in case of multiple images) in -the manifests of the active images (the latest and validated) and copy the CBOR -encoded binary data to the shared data area. Preserving all these image -attributes from the boot stage for use by later runtime services (such as an -attestation service) is known as a measured boot. - -Setting the `MCUBOOT_DATA_SHARING` option enables the sharing of application -specific data using the same shared data area as for the measured boot. For -this, the target must provide a definition for the `boot_save_shared_data()` -function which is declared in `boot/bootutil/include/bootutil/boot_record.h`. -The `boot_add_data_to_shared_area()` function can be used for adding new TLV -entries to the shared data area. diff --git a/mcuboot/docs/ecdsa.md b/mcuboot/docs/ecdsa.md deleted file mode 100644 index e60c7aa4b..000000000 --- a/mcuboot/docs/ecdsa.md +++ /dev/null @@ -1,90 +0,0 @@ -# ECDSA signature format - -When ECDSA SECP256R1 (EC256) signature support was added to MCUboot, a -shortcut was taken, and these signatures were padded to make them -always a fixed length. Unfortunately, this padding was done in a way -that is not easily reversible. Some crypto libraries are fairly -strict about the formatting of the ECDSA signature (specifically, mbed -TLS). This currently means that the ECDSA SECP224R1 (EC) signature -checking code will fail to boot about 1 out of every 256 images, -because the signature itself will end in a 0x00 byte, and the code -will remove too much data, invalidating the signature. - -There are a couple of ways to fix this: - - 1. Use a reversible padding scheme. This will work, but requires - at least one pad byte always be added (to set the length). This - padding would be somewhat incompatible across versions (older - EC256 would work, newer mcuboot code would reject old - signatures. EC code would only reliably work in the new - combination). - - 2. Remove the padding entirely. Depending on which tool, this will - require some rethinking of how TLV generation is implemented so - that the length does not need to be known until the signature is - generated. These tools are all written in higher-level - languages and this change should not be difficult. - - However, this will also break compatibility with older versions, - specifically in that images generated with newer tools will not - work with older versions of MCUboot. - -This document proposes a multi-stage approach, to give a transition -period. - - - First, add a `--no-pad-sig` argument to the sign command in - `imgtool.py`. Without this, the images will be padded with the - existing scheme, and with the argument, the ecdsa will be encoded - without any padding. The `--pad-sig` argument will also be - accepted, but this will initially be the default. - - - MCUboot will be modified to allow unpadded signatures right away. - The existing EC256 implementations will still work (with or - without padding), and the existing EC implementation will begin - accepting padded and unpadded signatures. - - - An mbed TLS implementation of EC256 can be added, but will require - the `--no-pad-sig` signature to be able to boot all generated - images (without the argument 3 of out 4 images generated will have - padding, and be considered invalid). - -After one or more MCUboot release cycles, and announcements over -relevant channels, the arguments to `imgtool.py` will change: - - - `--no-pad-sig` will still be accepted, but have no effect. - - - `--pad-sig` will now bring back the old padding behavior. - -This will require a change to any scripts that are relying on a -default, but not specifying a specific version of imgtool. - -The signature generation in the simulator can be changed at the same -time the boot code begins to accept unpadded signatures. The sim is -always run out of the same tree as the mcuboot code, so there should -not be any compatibility issues. - -## Background - -ECDSA signatures are encoded as ASN.1, notably with the signature -itself being encoded as: - - ECDSA-Sig-Value ::= SEQUENCE { - r INTEGER, - s INTEGER - } - -where both `r` and `s` are 256-bit numbers. Because these are -unsigned numbers that are being encoded in ASN.1 as signed values, if -the high bit of the number is set, the DER encoded representation will -require 33 bytes instead of 32. This means that the length of the -signature will vary by a couple of bytes, depending on whether one of -both of these numbers has the high bit set. - -Originally, MCUboot added padding to the entire signature, and just -removed any trailing 0 bytes from the data block. This would be fine 255/256 -times, when the last byte of the signature was non-zero, but if the -signature ended in a zero, it would remove too many bytes, and the -signature would be considered invalid. - -The correct approach here is to accept that ECDSA signatures are -variable length, and make sure that we can handle them as such. diff --git a/mcuboot/docs/encrypted_images.md b/mcuboot/docs/encrypted_images.md deleted file mode 100644 index 4bc7f86e9..000000000 --- a/mcuboot/docs/encrypted_images.md +++ /dev/null @@ -1,165 +0,0 @@ - - -# Encrypted images - -## [Rationale](#rationale) - -To provide confidentiality of image data while in transport to the -device or while residing on an external flash, `MCUBoot` has support -for encrypting/decrypting images on-the-fly while upgrading. - -The image header needs to flag this image as `ENCRYPTED` (0x04) and -a TLV with the key must be present in the image. When upgrading the -image from the `secondary slot` to the `primary slot` it is automatically -decrypted (after validation). If swap upgrades are enabled, the image -located in the `primary slot`, also having the `ENCRYPTED` flag set and the -TLV present, is re-encrypted while swapping to the `secondary slot`. - -## [Threat model](#threat-model) - -The encrypted image support is supposed to allow for confidentiality -if the image is not residing on the device or is written to external -storage, eg a SPI flash being used for the secondary slot. - -It does not protect against the possibility of attaching a JTAG and -reading the internal flash memory, or using some attack vector that -enables dumping the internal flash in any way. - -Since decrypting requires a private key (or secret if using symmetric -crypto) to reside inside the device, it is the responsibility of the -device manufacturer to guarantee that this key is already in the device -and not possible to extract. - -## [Design](#design) - -When encrypting an image, only the payload (FW) is encrypted. The header, -TLVs are still sent as plain data. - -Hashing and signing also remain functionally the same way as before, -applied over the un-encrypted data. Validation on encrypted images, checks -that the encrypted flag is set and TLV data is OK, then it decrypts each -image block before sending the data to the hash routines. - -The image is encrypted using AES-CTR-128, with a counter that starts -from zero (over the payload blocks) and increments by 1 for each 16-byte -block. AES-CTR-128 was chosen for speed/simplicity and allowing for any -block to be encrypted/decrypted without requiring knowledge of any other -block (allowing for simple resume operations on swap interruptions). - -The key used is a randomized when creating a new image, by `imgtool` or -`newt`. This key should never be reused and no checks are done for this, -but randomizing a 16-byte block with a TRNG should make it highly -improbable that duplicates ever happen. - -To distribute this AES-CTR-128 key, new TLVs were defined. The key can be -encrypted using either RSA-OAEP, AES-KW-128, ECIES-P256 or ECIES-X25519. - -For RSA-OAEP a new TLV with value `0x30` is added to the image, for -AES-KW-128 a new TLV with value `0x31` is added to the image, for -ECIES-P256 a new TLV with value `0x32` is added, and for ECIES-X25519 a -newt TLV with value `0x33` is added. The contents of those TLVs -are the results of applying the given operations over the AES-CTR-128 key. - -## [ECIES encryption](#ecies-encryption) - -ECIES follows a well defined protocol to generate an encryption key. There are -multiple standards which differ only on which building blocks are used; for -MCUBoot we settled on some primitives that are easily found on our crypto -libraries. The whole key encryption can be summarized as: - -* Generate a new private key and derive the public key; when using ECIES-P256 - this is a secp256r1 keypair, when using ECIES-X25519 this will be a x25519 - keypair. Those keys will be our ephemeral keys. -* Generate a new secret (DH) using the ephemeral private key and the public key - that corresponds to the private key embedded in the HW. -* Derive the new keys from the secret using HKDF (built on HMAC-SHA256). We - are not using a `salt` and using an `info` of `MCUBoot_ECIES_v1`, generating - 48 bytes of key material. -* A new random encryption key of 16 bytes is generated (for AES-128). This is - the AES key used to encrypt the images. -* The key is encrypted with AES-128-CTR and a `nonce` of 0 using the first - 16 bytes of key material generated previously by the HKDF. -* The encrypted key now goes through a HMAC-SHA256 using the remaining 32 - bytes of key material from the HKDF. - -The final TLV is built from the 65 bytes for ECIES-P256 or 32 bytes for -ECIES-X25519, which correspond to the ephemeral public key, followed by the -32 bytes of MAC tag and the 16 bytes of the encrypted key, resulting in a TLV -of 113 bytes for ECIES-P256 or 80 bytes for ECIES-X25519. - -The implemenation of ECIES-P256 is named ENC_EC256 in the source code and -artifacts while ECIES-X25519 is named ENC_X25519. - -## [Upgrade process](#upgrade-process) - -When starting a new upgrade process, `MCUBoot` checks that the image in the -`secondary slot` has the `ENCRYPTED` flag set and has the required TLV with the -encrypted key. It then uses its internal private/secret key to decrypt -the TLV containing the key. Given that no errors are found, it will then -start the validation process, decrypting the blocks before check. A good -image being determined, the upgrade consists in reading the blocks from -the `secondary slot`, decrypting and writing to the `primary slot`. - -If swap is used for the upgrade process, the encryption happens when -copying the sectors of the `secondary slot` to the scratch area. - -The `scratch` area is not encrypted, so it must reside in the internal -flash of the MCU to avoid attacks that could interrupt the upgrade and -dump the data. - -Also when swap is used, the image in the `primary slot` is checked for -presence of the `ENCRYPTED` flag and the key TLV. If those are present the -sectors are re-encrypted when copying from the `primary slot` to -the `secondary slot`. - -PS: Each encrypted image must have its own key TLV that should be unique -and used only for this particular image. - -Also when swap method is employed, the sizes of both images are saved to -the status area just before starting the upgrade process, because it -would be very hard to determine this information when an interruption -occurs and the information is spread across multiple areas. - -## [Creating your keys with imgtool](#creating-your-keys-with-imgtool) - -`imgtool` can generate keys by using `imgtool genkey -k -t `, - where type can be one of `rsa-2048`, `rsa-3072`, `ecdsa-p256`, `ecdsa-p224` -or `ed25519`. This will generate a keypair or private key. - -To extract the public key in source file form, use -`imgtool getpub -k -l `, where lang can be one of `c` or -`rust` (defaults to `c`). - -If using AES-KW-128, follow the steps in the next section to generate the -required keys. - -## [Creating your keys with Unix tooling](#creating-your-keys-with-unix-tooling) - -* If using RSA-OAEP, generate a keypair following steps similar to those - described in [signed_images](signed_images.md) to create RSA keys. -* If using ECIES-P256, generate a keypair following steps similar to those - described in [signed_images](signed_images.md) to create ECDSA256 keys. -* If using ECIES-X25519, generate a private key passing the option `-t x25519` - to `imgtool keygen` command. To generate public key PEM file the following - command can be used: `openssl pkey -in -pubout` -* If using AES-KW-128 (`newt` only), the `kek` can be generated with a - command like `dd if=/dev/urandom bs=1 count=16 | base64 > my_kek.b64` diff --git a/mcuboot/docs/imgtool.md b/mcuboot/docs/imgtool.md deleted file mode 100644 index 97f32722d..000000000 --- a/mcuboot/docs/imgtool.md +++ /dev/null @@ -1,135 +0,0 @@ -# Image tool - -The Python program `scripts/imgtool.py` can be used to perform the -operations that are necessary to manage keys and sign images. Using -this script should be preferred to the manual steps described in -`doc/signed_images.md`. - -This program is written for Python3, and has several dependencies on -Python libraries. These can be installed using 'pip3': - - pip3 install --user -r scripts/requirements.txt - -## [Managing keys](#managing-keys) - -This tool currently supports rsa-2048, rsa-3072, ecdsa-p256 and ed25519 keys. -You can generate a keypair for one of these types using the 'keygen' command: - - ./scripts/imgtool.py keygen -k filename.pem -t rsa-2048 - -or use rsa-3072, ecdsa-p256, or ed25519 for the type. The key type used -should match what mcuboot is configured to verify. - -This key file is what is used to sign images, this file should be -protected, and not widely distributed. - -You can add the `-p` argument to `keygen`, which will cause it to -prompt for a password. You will need to enter this password in every -time you use the private key. - -## [Incorporating the public key into the code](#incorporating-the-public-key-into-the-code) - -There is a development key distributed with mcuboot that can be used -for testing. Since this private key is widely distributed, it should -never be used for production. Once you have generated a production -key, as described above, you should replace the public key in the -bootloader with the generated one. - -For Zephyr, the keys live in the file `boot/zephyr/keys.c`. For -mynewt, follow the instructions in `doc/signed_images.md` to generate -the key file. - - ./scripts/imgtool.py getpub -k filename.pem - -will extract the public key from the given private key file, and -output it as a C data structure. You can replace or insert this code -into the key file. However, when the `MCUBOOT_HW_KEY` config option is -enabled, this last step is unnecessary and can be skipped. - -## [Signing images](#signing-images) - -Image signing takes an image in binary or Intel Hex format intended for the -primary slot and adds a header and trailer that the bootloader is expecting: - - Usage: imgtool.py sign [OPTIONS] INFILE OUTFILE - - Create a signed or unsigned image - - INFILE and OUTFILE are parsed as Intel HEX if the params have .hex - extension, otherwise binary format is used - - Options: - -k, --key filename - --public-key-format [hash|full] - --align [1|2|4|8] [required] - -v, --version TEXT [required] - -s, --security-counter TEXT Specify the value of security counter. Use - the `auto` keyword to automatically generate - it from the image version. - -d, --dependencies TEXT - --pad-sig Add 0-2 bytes of padding to ECDSA signature - (for mcuboot <1.5) - -H, --header-size INTEGER [required] - --pad-header Add --header-size zeroed bytes at the - beginning of the image - -S, --slot-size INTEGER Size of the slot where the image will be - written [required] - --pad Pad image to --slot-size bytes, adding - trailer magic - --confirm When padding the image, mark it as confirmed - -M, --max-sectors INTEGER When padding allow for this amount of - sectors (defaults to 128) - --boot-record sw_type Create CBOR encoded boot record TLV. The - sw_type represents the role of the software - component (e.g. CoFM for coprocessor - firmware). [max. 12 characters] - --overwrite-only Use overwrite-only instead of swap upgrades - -e, --endian [little|big] Select little or big endian - -E, --encrypt filename Encrypt image using the provided public key - --save-enctlv When upgrading, save encrypted key TLVs - instead of plain keys. Enable when - BOOT_SWAP_SAVE_ENCTLV config option was set. - -L, --load-addr INTEGER Load address for image when it should run - from RAM. - -x, --hex-addr INTEGER Adjust address in hex output file. - -R, --erased-val [0|0xff] The value that is read back from erased - flash. - -h, --help Show this message and exit. - -The main arguments given are the key file generated above, a version -field to place in the header (1.2.3 for example), the alignment of the -flash device in question, and the header size. - -The header size depends on the operating system and the particular -flash device. For Zephyr, it will be configured as part of the build, -and will be a small power of two. By default, the Zephyr build system will -already prepended a zeroed header to the image. If another build system is -in use that does not automatically add this zeroed header, `--pad-header` can -be passed and the `--header-size` will be added by imgtool. If `--pad-header` -is used with an Intel Hex file, `--header-size` bytes will be subtracted from -the load address (in Intel Hex terms, the Extended Linear Address record) to -adjust for the new bytes prepended to the file. The load address of all data -existing in the file should not change. - -The `--slot-size` argument is required and used to check that the firmware -does not overflow into the swap status area (metadata). If swap upgrades are -not being used, `--overwrite-only` can be passed to avoid adding the swap -status area size when calculating overflow. - -The optional `--pad` argument will place a trailer on the image that -indicates that the image should be considered an upgrade. Writing this image -in the secondary slot will then cause the bootloader to upgrade to it. - -A dependency can be specified in the following way: -`-d "(image_id, image_version)"`. The `image_id` is the number of the image -which the current image depends on. The `image_version` is the minimum version -of that image to satisfy compliance. For example `-d "(1, 1.2.3+0)"` means this -image depends on Image 1 which version has to be at least 1.2.3+0. - -The `--public-key-format` argument can be used to distinguish where the public -key is stored for image authentication. The `hash` option is used by default, in -which case only the hash of the public key is added to the TLV area (the full -public key is incorporated into the bootloader). When the `full` option is used -instead, the TLV area will contain the whole public key and thus the bootloader -can be independent from the key(s). For more information on the additional -requirements of this option, see the [design](design.md) document. diff --git a/mcuboot/docs/index.md b/mcuboot/docs/index.md deleted file mode 100644 index e0c11db5b..000000000 --- a/mcuboot/docs/index.md +++ /dev/null @@ -1,72 +0,0 @@ -# MCUboot - -## Overview - -MCUboot is a secure bootloader for 32-bit MCUs. The goal of MCUboot is to -define a common infrastructure for the bootloader, system flash layout on -microcontroller systems, and to provide a secure bootloader that enables -easy software upgrade. - -MCUboot is operating system and hardware independent and relies on -hardware porting layers from the operating system it works with. Currently -MCUboot works with both the Apache Mynewt, and Zephyr operating systems, but -more ports are planned in the future. RIOT is currently supported as a boot -target with a complete port planned. - -## Contents - -- General - this document -- [Release notes](release-notes.md) -- [Bootloader design](design.md) -- [Encrypted images](encrypted_images.md) -- [imgtool](imgtool.md) - image signing and key management -- [ecdsa](ecdsa.md) - Information about ECDSA signature formats -- Usage instructions: - - [Zephyr](readme-zephyr.md) - - [Mynewt](readme-mynewt.md) - - [RIOT](readme-riot.md) -- [Patch submission](SubmittingPatches.md) - information - on how to contribute to mcuboot -- Testing - - [Zephyr](testplan-zephyr.md) test plan - - [mynewt](testplan-mynewt.md) test plan -- [Release process](release.md) - -There is also a document about [signed images](signed_images.md) that is out -of date. You should use `imgtool.py` instead of these documents. - -## Roadmap - -The issues being planned and worked on are tracked using GitHub issues. To participate -please visit: - -[MCUboot Issues](https://github.com/JuulLabs-OSS/mcuboot/issues) - -~~Issues were previously tracked on [MCUboot JIRA](https://runtimeco.atlassian.net/projects/MCUB/summary) -, but it is now deprecated.~~ - -## Browsing - -Information and documentation on the bootloader is stored within the source. - -~~It was previously also documented on confluence: [Confluence page](https://runtimeco.atlassian.net/wiki/discover/all-updates) -, but it is now deprecated and not currently maintained~~ - -For more information in the source, here are some pointers: - -- [boot/bootutil](https://github.com/JuulLabs-OSS/mcuboot/tree/master/boot/bootutil): The core of the bootloader itself. -- [boot/boot\_serial](https://github.com/JuulLabs-OSS/mcuboot/tree/master/boot/boot_serial): Support for serial upgrade within the bootloader itself. -- [boot/zephyr](https://github.com/JuulLabs-OSS/mcuboot/tree/master/boot/zephyr): Port of the bootloader to Zephyr -- [boot/mynewt](https://github.com/JuulLabs-OSS/mcuboot/tree/master/boot/mynewt): Mynewt bootloader app -- [imgtool](https://github.com/JuulLabs-OSS/mcuboot/tree/master/scripts/imgtool.py): A tool to securely sign firmware images for booting by MCUboot. -- [sim](https://github.com/JuulLabs-OSS/mcuboot/tree/master/sim): A bootloader simulator for testing and regression - -## Joining - -Developers welcome! - -* [Our developer mailing list](https://groups.io/g/MCUBoot) -* [Our Slack channel](https://mcuboot.slack.com/)
- Get your invite [here!](https://join.slack.com/t/mcuboot/shared_invite/MjE2NDcwMTQ2MTYyLTE1MDA4MTIzNTAtYzgyZTU0NjFkMg) -* [Our IRC channel](http://irc.freenode.net), channel #mcuboot ([IRC - link](irc://chat.freenode.net/#mcuboot) diff --git a/mcuboot/docs/readme-mynewt.md b/mcuboot/docs/readme-mynewt.md deleted file mode 100644 index c2e509dd6..000000000 --- a/mcuboot/docs/readme-mynewt.md +++ /dev/null @@ -1,52 +0,0 @@ -# Running mynewt apps with MCUboot - -Due to small differences between Mynewt's bundled bootloader and MCUboot, -when building an app that will be run with MCUboot as the bootloader and -which at the same time requires to use `newtmgr` to manage images, MCUboot -must be added as a new dependency for this app. - -First you need to add the repo to your `project.yml`: - -``` - project.repositories: - - mcuboot - - repository.mcuboot: - type: github - vers: 0-dev - user: JuulLabs-OSS - repo: mcuboot -``` - -Then update your app's `pkg.yml` adding the extra dependency: - -``` - pkg.deps: - - "@mcuboot/boot/bootutil" -``` - -Also remove any dependency on `boot/bootutil` (mynewt's bundled bootloader) -which might exist. - -To configure MCUboot check all the options available in -`boot/mynewt/mcuboot_config/syscfg.yml`. - -Also, MCUboot uses a different image header struct as well as slightly -different TLV structure, so images created by `newt` have to be generated -in this new format. That is done by passing the extra parameter `-2` as in: - -`newt create-image -2` - -# Boot serial functionality with Mynewt - -Building with `BOOT_SERIAL: 1` enables some basic management functionality -like listing images and uploading a new image to `slot0`. The serial bootloader -requires that `mtu` is set to a value that is less than or equal to `256`. -This can be done either by editing `~/.newtmgr.cp.json` and setting the `mtu` -for the connection profile, or specifying you connection string manually as in: - -``` -newtmgr --conntype serial --connstring "dev=/dev/ttyUSB0,mtu=256" image upload -e blinky.img -``` - -where `/dev/ttyUSB0` is your serial port. diff --git a/mcuboot/docs/readme-riot.md b/mcuboot/docs/readme-riot.md deleted file mode 100644 index 9bb1b9b2a..000000000 --- a/mcuboot/docs/readme-riot.md +++ /dev/null @@ -1,47 +0,0 @@ -# Building and using MCUboot with RIOT - -MCUboot began its life as the bootloader for Mynewt. It has since -acquired the ability to be used as a bootloader for RIOT as well. -Currently the support is limited to the nrf52dk platform. - -## Building the bootloader itself - -In this first version, a prebuilt Mynewt binary is downloaded at -compile time. This binary was compiled to do an integrity check, but -not a signature check. In order to configure the bootloader for -signature check it is necessary to re-compile it either with Mynewt -or Zephyr, following the provided instructions. - -In the next version, it is planned to compile MCUboot using RIOT, -which should be able to boot any of the supported OS images. - -## Building Applications for the bootloader - -A compatible MCUboot image can be compiled by typing: `make mcuboot`. - -The only variable which needs to be set is `IMAGE_VERSION` loaded -with a valid formatted value. The format is `major.minor.patch+other` -(e.g. `export IMAGE_VERSION= 1.1.1+1`. This variable can be either -exported in the Makefile or manually, prior to the compilation process. - -The goal is to produce an ELF file which is linked to be flashed at a -`BOOTLOADER_OFFSET` offset rather than the beginning of ROM. MCUboot -also expects an image padded with some specific headers containing the -version information, and trailer type-length-value records (TLVs) with -hash and signing information. This is done through the imgtool.py -application, which is executed automatically by the RIOT build system. - -### Signing the application - -The application will be automatically signed with the provided key. -If no key is provided, a new key will be automatically generated. The -default key type is RSA-2048. - -In order to use your provided key, you need to recompile the bootloader -using you public key, either in Zephyr or Mynewt by following the -provided procedure for the selected OS. - -### Flashing the application - -The application can be flashed by typing: `make flash-mcuboot`. -This will flash both the bootloader and the application. diff --git a/mcuboot/docs/readme-zephyr.md b/mcuboot/docs/readme-zephyr.md deleted file mode 100644 index 26bc51939..000000000 --- a/mcuboot/docs/readme-zephyr.md +++ /dev/null @@ -1,162 +0,0 @@ -# Building and using MCUboot with Zephyr - -MCUboot began its life as the bootloader for Mynewt. It has since -acquired the ability to be used as a bootloader for Zephyr as well. -There are some pretty significant differences in how apps are built -for Zephyr, and these are documented here. - -Please see the [design document](design.md) for documentation on the design -and operation of the bootloader itself. This functionality should be the same -on all supported RTOSs. - -The first step required for Zephyr is making sure your board has flash -partitions defined in its device tree. These partitions are: - -- `boot_partition`: for MCUboot itself -- `image_0_primary_partition`: the primary slot of Image 0 -- `image_0_secondary_partition`: the secondary slot of Image 0 -- `scratch_partition`: the scratch slot - -Currently, the two image slots must be contiguous. If you are running -MCUboot as your stage 1 bootloader, `boot_partition` must be configured -so your SoC runs it out of reset. If there are multiple updateable images -then the corresponding primary and secondary partitions must be defined for -the rest of the images too (e.g. `image_1_primary_partition` and -`image_1_secondary_partition` for Image 1). - -The flash partitions are typically defined in the Zephyr boards folder, in a -file named `boards///.dts`. An example `.dts` file with -flash partitions defined is the frdm_k64f's in -`boards/arm/frdm_k64f/frdm_k64f.dts`. Make sure the labels in your board's -`.dts` file match the ones used there. - -## Installing Requirements and Dependencies - -Install additional packages required for development with mcuboot: - -``` - cd ~/mcuboot # or to your directory where mcuboot is cloned - pip3 install --user -r scripts/requirements.txt -``` - -## Building the bootloader itself - -The bootloader is an ordinary Zephyr application, at least from -Zephyr's point of view. There is a bit of configuration that needs to -be made before building it. Most of this can be done as documented in -the `CMakeLists.txt` file in boot/zephyr. There are comments there for -guidance. It is important to select a signature algorithm, and decide -if the primary slot should be validated on every boot. - -To build MCUboot, create a build directory in boot/zephyr, and build -it as usual: - -``` - cd boot/zephyr - mkdir build && cd build - cmake -GNinja -DBOARD= .. - ninja -``` - -In addition to the partitions defined in DTS, some additional -information about the flash layout is currently required to build -MCUboot itself. All the needed configuration is collected in -`boot/zephyr/include/target.h`. Depending on the board, this information -may come from board-specific headers, Device Tree, or be configured by -MCUboot on a per-SoC family basis. - -After building the bootloader, the binaries should reside in -`build/zephyr/zephyr.{bin,hex,elf}`, where `build` is the build -directory you chose when running `cmake`. Use the Zephyr build -system `flash` target to flash these binaries, usually by running -`make flash` (or `ninja flash`, etc.) from the build directory. Depending -on the target and flash tool used, this might erase the whole of the flash -memory (mass erase) or only the sectors where the boot loader resides prior to -programming the bootloader image itself. - -## Building Applications for the bootloader - -In addition to flash partitions in DTS, some additional configuration -is required to build applications for MCUboot. - -This is handled internally by the Zephyr configuration system and is wrapped -in the `CONFIG_BOOTLOADER_MCUBOOT` Kconfig variable, which must be enabled in -the application's `prj.conf` file. - -The directory `samples/zephyr/hello-world` in the MCUboot tree contains -a simple application with everything you need. You can try it on your -board and then just make a copy of it to get started on your own -application; see samples/zephyr/README.md for a tutorial. - -The Zephyr `CONFIG_BOOTLOADER_MCUBOOT` configuration option -[documentation](http://docs.zephyrproject.org/reference/kconfig/CONFIG_BOOTLOADER_MCUBOOT.html) -provides additional details regarding the changes it makes to the image -placement and generation in order for an application to be bootable by -MCUboot. - -With this, build the application as your normally would. - -### Signing the application - -In order to upgrade to an image (or even boot it, if -`MCUBOOT_VALIDATE_PRIMARY_SLOT` is enabled), the images must be signed. -To make development easier, MCUboot is distributed with some example -keys. It is important to stress that these should never be used for -production, since the private key is publicly available in this -repository. See below on how to make your own signatures. - -Images can be signed with the `scripts/imgtool.py` script. It is best -to look at `samples/zephyr/Makefile` for examples on how to use this. - -### Flashing the application - -The application itself can flashed with regular flash tools, but will -need to be programmed at the offset of the primary slot for this particular -target. Depending on the platform and flash tool you might need to manually -specify a flash offset corresponding to the primary slot starting address. This -is usually not relevant for flash tools that use Intel Hex images (.hex) instead -of raw binary images (.bin) since the former include destination address -information. Additionally you will need to make sure that the flash tool does -not perform a mass erase (erasing the whole of the flash) or else you would be -deleting MCUboot. -These images can also be marked for upgrade, and loaded into the secondary slot, -at which point the bootloader should perform an upgrade. It is up to -the image to mark the primary slot as "image ok" before the next reboot, -otherwise the bootloader will revert the application. - -## Managing signing keys - -The signing keys used by MCUboot are represented in standard formats, -and can be generated and processed using conventional tools. However, -`scripts/imgtool.py` is able to generate key pairs in all of the -supported formats. See [the docs](imgtool.md) for more details on -this tool. - -### Generating a new keypair - -Generating a keypair with imgtool is a matter of running the keygen -subcommand: - -``` - $ ./scripts/imgtool.py keygen -k mykey.pem -t rsa-2048 -``` - -The argument to `-t` should be the desired key type. See the -[the docs](imgtool.md) for more details on the possible key types. - -### Extracting the public key - -The generated keypair above contains both the public and the private -key. It is necessary to extract the public key and insert it into the -bootloader. The keys live in `boot/zephyr/keys.c`, and can be -extracted using imgtool: - -``` - $ ./scripts/imgtool.py getpub -k mykey.pem -``` - -This will output the public key as a C array that can be dropped -directly into the `keys.c` file. - -Once this is done, this new keypair file (`mykey.pem` in this -example) can be used to sign images. diff --git a/mcuboot/docs/release-notes.md b/mcuboot/docs/release-notes.md deleted file mode 100644 index c78d439de..000000000 --- a/mcuboot/docs/release-notes.md +++ /dev/null @@ -1,293 +0,0 @@ -# MCUboot Release Notes - -- Table of Contents -{:toc} - -## Version 1.6.0 - -The 1.6.0 release of MCUboot adds support for the PSOC6 platform, -X25519 encrypted images, rollback protection, hardware keys, and a -shared boot record to communicate boot attestation information to -later boot stages. There are bug fixes, and associated imgtool -updates as well. - -### About this release - -- Initial support for the Cypress PSOC6 plaformt. This platform - builds using the Cypress SDK, which has been added as submodules. -- CBOR decoding in serial recovery replaced by code generated from a - CDDL description. -- Add support for X25519 encrypted images. -- Add rollback protection. There is support for a HW rollback counter - (which must be provided as part of the platform), as well as a SW - solution that protects against some types of rollback. -- Add an optional boot record in shared memory to communicate boot - attributes to later-run code. -- Add support for hardware keys. -- Various fixes to work with the latest Zephyr version. - -### Security issues addressed - -- CVE-2020-7595 "xmlStringLenDecodeEntities in parser.c in libxml2 - 2.9.10 has an infinite loop in a certain end-of-file situation." Fix - by updating a dependency in documentation generation. - -### Zephyr-RTOS Compatibility - -This release of MCUboot works the Zephyr "master" at the time of the -release. It was tested as of has 1a89ca1238. When Zephyr v2.3.0 is -released, there will be a possible 1.6.1 or similar release of Zephyr -if needed to address any issues. There also may be branch releases of -MCUboot specifically for the current version of Zephyr, e.g. -v1.6.0-zephyr-2.2.1. - -## Version 1.5.0 - -The 1.5.0 release of MCUboot adds support for encrypted images using -ECIES with secp256r1 as an Elliptic Curve alternative to RSA-OAEP. A -new swap method was added which allows for upgrades without using a -scratch partition. There are also lots of bug fixes, extra simulator -testing coverage and some imgtool updates. - -### About this release - -- TLVs were updated to use 16-bit lengths (from previous 8). This - should work with no changes for little-endian targets, but will - break compatibility with big-endian targets. -- A benchmark framework was added to Zephyr -- ed25519 signature validation can now build without using mbedTLS - by relying on a bundled tinycrypt based sha-512 implementation. -- imgtool was updated to correctly detect trailer overruns by image. -- Encrypted image TLVs can be saved in swap metadata during a swap - upgrade instead of the plain AES key. -- imgtool can dump private keys in C format (getpriv command), which - can be added as decryption keys. Optionally can remove superfluous - fields from the ASN1 by passing it `--minimal`. -- Lots of other smaller bugs fixes. -- Added downgrade prevention feature (available when the overwrite-based - image update strategy is used) - -### Known issues - -- TLV size change breaks compatibility with big-endian targets. - -## Version 1.4.0 - -The 1.4.0 release of MCUboot primarily adds support for multi-image -booting. With this release, MCUboot can manage two images that can be -updated independently. With this, it also supports additions to the -TLV that allow these dependencies to be specified. - -Multi-image support adds backward-incompatible changes to the format -of the images: specifically adding support for protected TLV entries. -If multiple images and dependencies are not used, the images will be -compatible with previous releases of MCUboot. - -### About this release - -- Fixed CVE-2019-5477, and CVE-2019-16892. These fix issue with - dependencies used in the generation of the documentation on github. -- Numerous code cleanups and refactorings -- Documentation updates for multi-image features -- Update imgtool.py to support the new features -- Updated the mbed TLS submodule to current stable version 2.16.3 -- Moved the mbed TLS submodule from within sim/mcuboot-sys to ext. - This will make it easier for other board supports to use this code. -- Added some additional overflow and bound checks to data in the image - header, and TLV data. -- Add a `-x` (or `--hex_addr`) flag to imgtool to set the base address - written to a hex-format image. This allows the image to be flashed - at an offset, without having to use additional tools to modify the - image. - -## Version 1.3.1 - -The 1.3.1 release of MCUboot consists mostly of small bug fixes and updates. -There are no breaking changes in functionality. This release should work with -Mynewt 1.6.0 and up, and any Zephyr `master` after sha -f51e3c296040f73bca0e8fe1051d5ee63ce18e0d. - -### About this release - -- Fixed a revert interruption bug -- Added ed25519 signing support -- Added RSA-3072 signing support -- Allow ec256 to run on CC310 interface -- Some preparation work was done to allow for multi image support, which - should land in 1.4.0. This includes a simulator update for testing - multi-images, and a new name for slot0/slot1 which are now called - "primary slot" and "secondary slot". -- Other minor bugfixes and improvements - -## Version 1.3.0 - -The 1.3.0 release of MCUboot brings in many fixes and updates. There -are no breaking changes in functionality. Many of the changes are -refactorings that will make the code easier to maintain going forward. -In addition, support has been added for encrypted images. See [the -docs](encrypted_images.md) for more information. - -### About this release - -- Modernize the Zephyr build scripts. -- Add a `ptest` utility to help run the simulator in different - configurations. -- Migrate the simulator to Rust 2018 edition. The sim now requires at - least Rust 1.32 to build. -- Simulator cleanups. The simulator code is now built the same way - for every configuration, and queries the MCUboot code for how it was - compiled. -- Abstract logging in MCUboot. This was needed to support the new - logging system used in Zephyr. -- Add multiple flash support. Allows slot1/scratch to be stored in an - external flash device. -- Add support for [encrypted images](encrypted_images.md). -- Add support for flash devices that read as '0' when erased. -- Add support to Zephyr for the `nrf52840_pca10059`. This board - supports serial recovery over USB with CDC ACM. -- imgtool is now also available as a python package on pypi.org. -- Add an option to erase flash pages progressively during recovery to - avoid possible timeouts (required especially by serial recovery - using USB with CDC ACM). -- imgtool: big-endian support -- imgtool: saves in intel-hex format when output filename has `.hex` - extension; otherwise saves in binary format. - -## Version 1.2.0 - -The 1.2.0 release of MCUboot brings a lot of fixes/updates, where much of the -changes were on the boot serial functionality and imgtool utility. There are -no breaking changes in MCUBoot functionality, but some of the CLI parameters -in imgtool were changed (either removed or added or updated). - -### About this release - -- imgtool accepts .hex formatted input -- Logging system is now configurable -- Most Zephyr configuration has been switched to Kconfig -- Build system accepts .pem files in build system to autogenerate required - key arrays used internally -- Zephyr build switched to using built-in flash_map and TinyCBOR modules -- Serial boot has substantially decreased in space usage after refactorings -- Serial boot build doesn't require newlib-c anymore on Zephyr -- imgtool updates: - + "create" subcommand can be used as an alias for "sign" - + To allow imgtool to always perform the check that firmware does not - overflow the status area, `--slot-size` was added and `--pad` was updated - to act as a flag parameter. - + `--overwrite-only` can be passed if not using swap upgrades - + `--max-sectors` can be used to adjust the maximum amount of sectors that - a swap can handle; this value must also be configured for the bootloader - + `--pad-header` substitutes `--included-header` with reverted semantics, - so it's not required for firmware built by Zephyr build system - -### Known issues - -None - -## Version 1.1.0 - -The 1.1.0 release of MCUboot brings a lot of fixes/updates to its -inner workings, specially to its testing infrastructure which now -enables a more thorough quality assurance of many of the available -options. As expected of the 1.x.x release cycle, no breaking changes -were made. From the tooling perpective the main addition is -newt/imgtool support for password protected keys. - -### About this release - -- serial recovery functionality support under Zephyr -- simulator: lots of refactors were applied, which result in the - simulator now leveraging the Rust testing infrastructure; testing - of ecdsa (secp256r1) was added -- imgtool: removed PKCS1.5 support, added support for password - protected keys -- tinycrypt 0.2.8 and the mbed-tls ASN1 parser are now bundled with - mcuboot (eg secp256r1 is now free of external dependencies!) -- Overwrite-only mode was updated to erase/copy only sectors that - actually store firmware -- A lot of small code and documentation fixes and updates. - -### Known issues - -None - -## Version 1.0.0 - -The 1.0.0 release of MCUboot introduces a format change. It is -important to either use the `imgtool.py` also from this release, or -pass the `-2` to recent versions of the `newt` tool in order to -generate image headers with the new format. There should be no -incompatible format changes throughout the 1.x.y release series. - -### About this release - -- Header format change. This change was made to move all of the - information about signatures out of the header and into the TLV - block appended to the image. This allows - - The signature to be replaced without changing the image. - - Multiple signatures to be applied. This can be used, for example, - to sign an image with two algorithms, to support different - bootloader configurations based on these image. - - The public key is referred to by its SHA1 hash (or a prefix of the - hash), instead of an index that has to be maintained with the - bootloader. - - Allow new types of signatures in the future. -- Support for PKCS#1 v1.5 signatures has been dropped. All RSA - signatures should be made with PSS. The tools have been changed to - reflect this. -- The source for Tinycrypt has been placed in the MCUboot tree. A - recent version of Tinycrypt introduced breaking API changes. To - allow MCUboot to work across various platforms, we stop using the - Tinycrypt bundled with the OS platform, and use our own version. A - future release of MCUboot will update the Tinycrypt version. -- Support for some new targets: - - Nordic nRF51 and nRF52832 dev kits - - Hexiwear K64 -- Clearer sample applications have been added under `samples`. -- Test plans for [zephyr](testplan-zephyr.md), and - [mynewt](testplan-mynewt.md). -- The simulator is now able to test RSA signatures. -- There is an unimplemented `load_addr` header for future support for - RAM loading in the bootloader. -- Numerous documentation. - -### Known issues - -None - -## Version 0.9.0 - -This is the first release of MCUboot, a secure bootloader for 32-bit MCUs. -It is designed to be operating system-agnostic and works over any transport - -wired or wireless. It is also hardware independent, and relies on hardware -porting layers from the operating system it works with. For the first release, -we have support for three open source operating systems: Apache Mynewt, Zephyr -and RIOT. - -### About this release - -- This release supports building with and running Apache Mynewt and Zephyr - targets. -- RIOT is supported as a running target. -- Image integrity is provided with SHA256. -- Image originator authenticity is provided supporting the following - signature algorithms: - - RSA 2048 and RSA PKCS#1 v1.5 or v2.1 - - Elliptic curve DSA with secp224r1 and secp256r1 -- Two firmware upgrade algorithms are provided: - - An overwrite only which upgrades slot 0 with the image in slot 1. - - A swapping upgrade which enables image test, allowing for rollback to a - previous known good image. -- Supports both mbed-TLS and tinycrypt as backend crypto libraries. One of them - must be defined and the chosen signing algorithm will require a particular - library according to this list: - - RSA 2048 needs mbed TLS - - ECDSA secp224r1 needs mbed TLS - - ECDSA secp256r1 needs tinycrypt as well as the ASN.1 code from mbed TLS - (so still needs that present). - -### Known issues - -- The image header and TLV formats are planned to change with release 1.0: - https://runtimeco.atlassian.net/browse/MCUB-66 diff --git a/mcuboot/docs/release.md b/mcuboot/docs/release.md deleted file mode 100644 index 34bd5c3d0..000000000 --- a/mcuboot/docs/release.md +++ /dev/null @@ -1,84 +0,0 @@ -# Release Process - -The following documents the release process used with mcuboot. - -## Version numbering - -MCUboot uses [semantic versioning][semver], where version numbers -follow a MAJOR.MINOR.PATCH format with the following guidelines on -incremeting the numbers: - -1. MAJOR version when you make incompatible API changes, -2. MINOR version when you add functionality in a backwards-compatible - manner, and -3. PATCH version when you make backwards-compatible bug fixes. - -We add pre-release tags of the format MAJOR.MINOR.PATCH-rc1. - -## Release Notes - -Before making a release, be sure to update the `docs/release-notes.md` -to describe the release. This should be a high-level description of -the changes, not a list of the git commits. - -## Release Candidates - -Prior to each release, tags are made (see below) for at least one -release candidate (a.b.c-rc1, followed by a.b.c-rc2, etc, followed by -the official a.b.c release). The intent is to freeze the code for a -time, and allow testing to happen. - -During the time between rc1 and the final release, the only changes -that should be merged into master are those to fix bugs found in the -rc and Mynewt metadata as described in the next section. - -## imgtool release - -imgtool is released through pypi.org (The Python package index) and -requires that its version to be updated by editing -`scripts/imgtool/__init__.py` and modifying the exported version: - -`imgtool_version = "X.Y.ZrcN"` - -where `rcX`, `aX` and `bX` are accepted pre-release versions (just -numbers for final releases). For more info see: - -https://www.python.org/dev/peps/pep-0440/#pre-releases - -## Mynewt release information - -On Mynewt, `newt` always fetches a versioned MCUBoot release, so after -the rc step is finished, the release needs to be exported by modifying -`repository.yml` in the root directory; it must be updated with the -new release version, including updates to the pseudo keys -(`*-(latest|dev)`). - -## Tagging and Release - -To make a release, make sure your local repo is on the tip version by -fetching from origin. Typically, the releaser should create a branch -named after the particular release. - -Create a commit on top of the branch that modifies the version number -in the top-level `README.md`, and create a commit, with just this -change, with a commit text similar to “Bump to version -a.b.c”. Having the version bump helps to make the releases -easier to find, as each release has a commit associated with it, and -not just a tag pointing to another commit. - -Once this is done, the release should create a signed tag: -``` bash -git tag -s va.b.c-rcn -``` -with the appropriate tag name. The releaser will need to make sure -that git is configured to use the proper signing key, and that the -public key is signed by enough parties to be trusted. - -At this point, the tag can be pushed to github to make the actual -release happen: -``` bash -git push origin HEAD:refs/heads/master -git push origin va.b.c-rcn -``` - -[semver]: http://semver.org/ diff --git a/mcuboot/docs/signed_images.md b/mcuboot/docs/signed_images.md deleted file mode 100644 index 22a6836c1..000000000 --- a/mcuboot/docs/signed_images.md +++ /dev/null @@ -1,106 +0,0 @@ - - -## Image signing - -This signs the image by computing hash over the image, and then -signing that hash. Signature is computed by newt tool when it's -creating the image. This signature is placed in the image trailer. - -The public key of this keypair must be included in the bootloader, -as it verifies it before allowing the image to run. - -This facility allows you to use multiple signing keys. This would -be useful when you want to prevent production units from booting -development images, but want development units to be able to boot -both production images and development images. - -For an alternative solution when the public key(s) doesn't need to be -included in the bootloader, see the [design](design.md) document. - -## Creating signing keys -First you need a keypair to use for signing. You can create -one with openssl command line tool. - -openssl genrsa -out image_sign.pem 2048 - -This created a file which contains both the private and public key, -and will be used when signing images. - -Then you need to extract the public key from this to include it -in the bootloader. Bootloader need to keep key parsing minimal, -so it expects simple key format. - -openssl rsa -in image_sign.pem -pubout -out image_sign_pub.der -outform DER -RSAPublicKey_out - -Now the public key is in file called image_sign_pub.der. - -For ECDSA224 these commands are similar. - -openssl ecparam -name secp224r1 -genkey -noout -out image_sign.pem -openssl ec -in image_sign.pem -pubout -outform DER -out image_sign_pub.der - -And then the ECDSA256. -openssl ecparam -name prime256v1 -genkey -noout -out image_sign.pem -openssl ec -in image_sign.pem -pubout -outform DER -out image_sign_pub.der - -## Creating a key package - -xxd -i image_sign_pub.der image_sign_pub.c.import - -Then you need to create a package containing this key, or keys. - -## Sample pkg.yml -This gets bootutil to turn on image signature validation. - - pkg.name: libs/mykeys - pkg.deps: - - "@apache-mynewt-core/boot/bootutil" - -## Sample source file -This exports the keys. - - #include - - #include "image_sign_pub.c.import" - - const struct bootutil_key bootutil_keys[] = { - [0] = { - .key = image_sign_pub_der, - .len = &image_sign_pub_der_len, - } - }; - - const int bootutil_key_cnt = sizeof(bootutil_keys) / sizeof(bootutil_keys[0]); - -## Building bootloader - -Enable the BOOTUTIL_SIGN_RSA syscfg setting in your app or target syscfg.yml -file - - syscfg.vals: - BOOTUTIL_SIGN_RSA: 1 - -After you've created the key package, you must include it in the build -for bootloader. So modify the pkg.yml for apps/boot to include it. - -The syscfg variable to enable ECDSA224 is BOOTUTIL_SIGN_EC, and -BOOTUTIL_SIGN_EC256 for ECDS256. diff --git a/mcuboot/docs/testplan-mynewt.md b/mcuboot/docs/testplan-mynewt.md deleted file mode 100644 index 5a227b943..000000000 --- a/mcuboot/docs/testplan-mynewt.md +++ /dev/null @@ -1,157 +0,0 @@ -## mcuboot test plan - -The current target for running the tests is the Freedom K64F board. - -### Basic sign support (RSA/EC/EC256) - -For each supported signing algorithm, check that non-signed, and signed -with wrong key images are not swapped to, and image signed with correct key -is swapped to. - -For the 3 algorithms supported, rsa, ec and ec256, two files are provided: -key_.pem, key__2.pem. And a keys file with the C public -key data for key_.pem. - -Build and load mcuboot: - -* `newt build k64f_boot_` -* `newt load k64f_boot_` - -Build and load good image in slot 0: - -* `newt create-image k64f_blinky 1.0.1 key_.pem` -* `newt load k64f_blinky` - -NOTE: If testing RSA/PSS `newt create-image` needs to be passed in the extra -flag `--rsa-pss` eg: - -`newt create-image k64f_blinky 1.0.1 key_rsa.pem --rsa-pss` - -Build and load image in slot 1 with no signing, signed with -key__2.pem and signed with key_.pem. Mark each one as -test image and check that swap only happens for image signed with -key_.pem. Both others should be erased. - -* `newt create-image k64f_blinky2 1.0.2 ` -* `newtmgr image upload k64f_blinky2` -* `newtmgr image list` -* `newtmgr image test ` - -### Image signed with more than one key - -FIXME: this is currently not functional, skip this section! - -Build and load mcuboot: - -* `newt build k64f_boot_rsa_ec` -* `newt load k64f_boot_rsa_ec` - -Build and load good image in slot 0: - -* `newt create-image k64f_blinky 1.0.1 key_rsa.pem` -* `newt load k64f_blinky` - -Build and load image in slot 1 with no signing, signed with -key__2.pem and signed with key_.pem. Mark each one as -test image and check that swap only happens for image signed with -key_.pem. Both others should be erased. - -Use all of this options: - -* `newt create-image k64f_blinky2 1.0.2` - -And load - -* `newtmgr image upload k64f_blinky2` -* `newtmgr image list` -* `newtmgr image test ` - -### Overwrite only functionality - -Build/load mcuboot: - -* `newt build k64f_boot_rsa_noswap` -* `newt load k64f_boot_rsa_noswap` - -Build/load blinky to slot 0: - -* `newt create-image k64f_blinky 1.0.1 key_rsa.pem` -* `newt load k64f_blinky` - -Build/load blinky2 both with bad and good key, followed by a permanent swap -request: - -* `newt create-image k64f_blinky2 1.0.2 .pem` -* `newtmgr image upload k64f_blinky2` -* `newtmgr image list` -* `newtmgr image confirm ` - -This should not swap and delete the image in slot 1 when signed with the wrong -key, otherwise the image in slot 1 should be *moved* to slot 0 and slot 1 should -be empty. - -### Validate slot 0 option - -Build/load mcuboot: - -* `newt build k64f_boot_rsa_validate0` -* `newt load k64f_boot_rsa_validate0` - -Build non-signed image: - -* `newt create-image k64f_blinky 1.0.1` -* `newt load k64f_blinky` -* Reset and no image should be run - -Build signed image with invalid key: - -* `newt create-image k64f_blinky 1.0.1 key_rsa_2.pem` -* `newt load k64f_blinky` -* Reset and no image should be run - -Build signed image with *valid* key: - -* `newt create-image k64f_blinky 1.0.1 key_rsa.pem` -* `newt load k64f_blinky` -* Reset and image *should* run - -### Swap with random failures - -DISCLAIMER: be careful with copy/paste of commands, this test uses another -target/app! - -Build/load mcuboot: - -* `newt build k64f_boot_rsa` -* `newt load k64f_boot_rsa` - -Build/load slinky to slot 0: - -* `newt create-image k64f_slinky 1.0.1 key_rsa.pem` -* `newt load k64f_slinky` - -Build/load slinky2 to slot 1: - -* `newt create-image k64f_slinky2 1.0.2 key_rsa.pem` -* `newtmgr image upload k64f_slinky2` - -Confirm that both images are installed, request a permanent request to the -image in slot 1 and check that it works. - -* `newtmgr image list` -* `newtmgr image confirm ` - -If everything works, now proceed with requests for permanent swap to the image -in slot 1 and do random swaps (as much as you like!). When the swap finishes -confirm that the swap was finished with the previous slot 1 image now in -slot 0 and vice-versa. - -### Help - -* Mass erase MCU - - $ pyocd erase --chip - -* Flashing image in slot 1: - - $ pyocd flash -e sector -a 0x80000 ${IMG_FILE} bin diff --git a/mcuboot/docs/testplan-zephyr.md b/mcuboot/docs/testplan-zephyr.md deleted file mode 100644 index bd5b34be9..000000000 --- a/mcuboot/docs/testplan-zephyr.md +++ /dev/null @@ -1,71 +0,0 @@ -# Zephyr Test Plan - -The following roughly describes how mcuboot is tested on Zephyr. The -testing is done with the code in `samples/zephyr`. These examples -were written using the FRDM-K64F, but other boards should be similar. -At this time, however, the partitions are hardcoded in the Makefile -targets to flash. - -Note that the script "run-tests.sh" in that directory is helpful for -automating the process, and provides simple "y or n" prompts for each -test case and expected result. - -## Building and running. - -The tests are build using the various `test-*` targets in -`samples/zephyr/Makefile`. For each test, invoke `make` with that -target: - - $ make test-good-rsa - -Begin by doing a full erase, and programming the bootloader itself: - - $ pyocd erase --chip - $ make flash_boot - -After it resets, look for "main: Starting bootloader", a few debug -messages, and lastly: "main: Unable to find bootable image". - -Then, load hello1: - - $ make flash_hello1 - -This should print "main: Jumping to the first image slot", and you -should get an image "hello1". - -Note that there are comments with each test target describing the -intended behavior for each of these steps. Sometimes an upgrade will -happen and sometimes it will not. - - $ make flash_hello2 - -This should print a message: `boot_swap_type: Swap type: test`, and -you should see "hello2". - -Now reset the target:: - - $ pyocd commander -c reset - -And you should see a revert and "hello1" running. - -## Testing that mark ok works - -Repeat this, to make sure we can mark the image as OK, and that a -revert doesn't happen: - - $ make flash_hello1 - $ make flash_hello2 - -We should have just booted the hello2. Mark this as OK: - - $ pyocd flash -a 0x7ffe8 image_ok.bin - $ pyocd commander -c reset - -And make sure this stays in the "hello2" image. - -This step doesn't make sense on the tests where the upgrade doesn't -happen. - -## Testing all configurations - -Repeat these steps for each of the `test-*` targest in the Makefile. diff --git a/mcuboot/enc-aes128kw.b64 b/mcuboot/enc-aes128kw.b64 deleted file mode 100644 index ed2c9fb3a..000000000 --- a/mcuboot/enc-aes128kw.b64 +++ /dev/null @@ -1 +0,0 @@ -0VoElcTCqP8weM5Jtfyy3Q== diff --git a/mcuboot/enc-ec256-priv.pem b/mcuboot/enc-ec256-priv.pem deleted file mode 100644 index 352615aa9..000000000 --- a/mcuboot/enc-ec256-priv.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9h5Rnfj63aG32alk -ZDtU0D3QH+V42ReYpSjKzGtnngahRANCAASKRHMAlMmAJzENIzZr6Wmfy8V8yEQa -k+bufYamrl6TcnTZ4Vocm2UaK2FBKAJzhBKXOi2ioGd3AtpnGkvd13HM ------END PRIVATE KEY----- diff --git a/mcuboot/enc-ec256-pub.pem b/mcuboot/enc-ec256-pub.pem deleted file mode 100644 index dfd21e14b..000000000 --- a/mcuboot/enc-ec256-pub.pem +++ /dev/null @@ -1,4 +0,0 @@ ------BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEikRzAJTJgCcxDSM2a+lpn8vFfMhE -GpPm7n2Gpq5ek3J02eFaHJtlGithQSgCc4QSlzotoqBndwLaZxpL3ddxzA== ------END PUBLIC KEY----- diff --git a/mcuboot/enc-rsa2048-priv.pem b/mcuboot/enc-rsa2048-priv.pem deleted file mode 100644 index a2bf0cb19..000000000 --- a/mcuboot/enc-rsa2048-priv.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAtCYUST0WEzptnISpi2oQIGHvSASkSyTzADKsIuAwJ3AY5VXI -uAU0A7D4pZbSSFjvcLAJ2+NYYu+ZYwGyicSz9p5iv03CitDJTUOj2OUd7GJjCOIg -pfx40D50yKQbNq179QauTVGbQM4wT2zq+el06gbunOQUaCC5PecRFIslo/9MivNT -7ms+7zTNaj9iaMD/eEyww+aWYfwfGPF6guKPNagrhhakRvusfkHbAgWRbd/B3hOV -nPmeXnK6pyWT+9zoq4ZFiEct7e7ul57OXZsEBEB8y3w9LHSrpMxko1yVPdSi3JKy -yBjL+QA5gY+PQMLfmSmsisI72KTyra90wBHHmQIDAQABAoIBAEJHgE8x2l1YsdtU -M8zHSQehAJhOnOPIxF7eRdbPBOh9pas61I5f27M/+TtzMgrMLcwX+IieLHa6EIUM -qtNlO5EQ1OPtiBXqmyWCLVYvdcLyr90k1T48lXaIhA8N0bVcPq73tklcLPK66atP -N2SbMBiqVEAE6j0lTQIpcW9NgpvDRCqdDJjTyBUNBJNgMMdeeepTncAOgayQvJ4e -0igPEPUf3zh/ipCNSQd9eMun75JtOxOVm7qDxrNxJScHmVSCPezF+LSgOHpZagvK -aWwXpBjgtKqJmY/LcTQJG27mhwC1unCKKT2aBhgtZl5hN+vdXsgokgUw/bhlsX+/ -LVUSkcECgYEA2mXaOHwY+wARYOs3ZbiDYojEOk5kavM+TsA0GYrLSsovXVB6rPee -h1r8TUnX+SH1C29XQT2PuOx/zJIJvtOkwxSFIV0Fo6og9mJEUANeU0rNarZljk5L -PyXGFjH1mRN3QtrccE1lsJkP31qxRfC5jqCuT01lCYS1OCm/aeCIHycCgYEA0ypZ -7CjDDU+SlspnlPwupoZoRVOSzIZ/iuFd6B2eux4AJh2AEv+cEQq9psONSNr8EPd6 -FgcVoDrTlPtShznu58QmSRbGwIMlv2pOjAsQhWarfq6sTGk8ROvN6fZki0rYak1t -R6m4VXLB/fSBTGa+SfJ1T4DxIDi4aht1QTAPGz8CgYAJNfp6H2G+VEZnXAQ+GgYQ -hcwg2WWKzS93isunuB7SzKwqt1Y1LUxWURQK/m5JZ5E6Jjv72GjTV8YcDpyym6J7 -R8ZFnfK68FXrjkFrTnkP8juvoHmwAsVRqHouPXUqO5PwEeLyKZF8XTg6J00Kshhh -V42CcrUsLZinAbu872dOSQKBgQCycFNUcI2Crf8dVSR6jS+OoH10N88Q7YbRgOet -wXnkfNF7Y+paI41qCT2BsjWtnv7qB3YvLwVjRNKOTmHKy3XKe8IueQSyoSBAxEBj -ruXjFINOpaQLXdIEG48BaahE3JZMHel+aTjPXA3536dzPE8Ihc4DxN39cHDFmTZY -Q5hAWQKBgQDVqvvsjcbd+itaJNDaWL2HkhopYhMdS3kbvnl9rXnKF3Xa6DLooJ6o -d1OsONbr5iJlxKpMyNAzGh6+vXMJSvqFXPMMnIFWMKf3m/SSnGuTagAz3C9UHnjU -l+wkots9AzMJsiwDBUDeUvKb+gCNS/5bm5xzrft6AEJinqCVVVAyhw== ------END RSA PRIVATE KEY----- diff --git a/mcuboot/enc-rsa2048-pub.pem b/mcuboot/enc-rsa2048-pub.pem deleted file mode 100644 index adc2adba9..000000000 --- a/mcuboot/enc-rsa2048-pub.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtCYUST0WEzptnISpi2oQ -IGHvSASkSyTzADKsIuAwJ3AY5VXIuAU0A7D4pZbSSFjvcLAJ2+NYYu+ZYwGyicSz -9p5iv03CitDJTUOj2OUd7GJjCOIgpfx40D50yKQbNq179QauTVGbQM4wT2zq+el0 -6gbunOQUaCC5PecRFIslo/9MivNT7ms+7zTNaj9iaMD/eEyww+aWYfwfGPF6guKP -NagrhhakRvusfkHbAgWRbd/B3hOVnPmeXnK6pyWT+9zoq4ZFiEct7e7ul57OXZsE -BEB8y3w9LHSrpMxko1yVPdSi3JKyyBjL+QA5gY+PQMLfmSmsisI72KTyra90wBHH -mQIDAQAB ------END PUBLIC KEY----- diff --git a/mcuboot/enc-x25519-priv.pem b/mcuboot/enc-x25519-priv.pem deleted file mode 100644 index cb92491d7..000000000 --- a/mcuboot/enc-x25519-priv.pem +++ /dev/null @@ -1,3 +0,0 @@ ------BEGIN PRIVATE KEY----- -MC4CAQAwBQYDK2VuBCIEICiAL+/vgpVQ8UGTA2wbuUlsUeUmh493B/i0HwRFbYRP ------END PRIVATE KEY----- diff --git a/mcuboot/enc-x25519-pub.pem b/mcuboot/enc-x25519-pub.pem deleted file mode 100644 index 80d89a643..000000000 --- a/mcuboot/enc-x25519-pub.pem +++ /dev/null @@ -1,3 +0,0 @@ ------BEGIN PUBLIC KEY----- -MCowBQYDK2VuAyEApnrfU1lvc6n45HmsC6ogwvmJkv+Wltehx3CxYYsqD3A= ------END PUBLIC KEY----- diff --git a/mcuboot/ext/fiat/LICENSE b/mcuboot/ext/fiat/LICENSE deleted file mode 100644 index bd46c6137..000000000 --- a/mcuboot/ext/fiat/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2016 the fiat-crypto authors (see -https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/mcuboot/ext/fiat/METADATA b/mcuboot/ext/fiat/METADATA deleted file mode 100644 index 0e4012f3d..000000000 --- a/mcuboot/ext/fiat/METADATA +++ /dev/null @@ -1,13 +0,0 @@ -name: "fiat" -description: "Fiat-Crypto: Synthesizing Correct-by-Construction Code for Cryptographic Primitives." - -third_party { - url { - type: GIT - value: "https://github.com/mit-plv/fiat-crypto" - } - version: "4441785fb44b88bb6943ddbf639d872c8c903281" - last_upgrade_date { year: 2019 month: 1 day: 16 } - - local_modifications: "Fiat-generated code has been integrated into existing BoringSSL code" -} diff --git a/mcuboot/ext/fiat/README.chromium b/mcuboot/ext/fiat/README.chromium deleted file mode 100644 index 73c5ba20b..000000000 --- a/mcuboot/ext/fiat/README.chromium +++ /dev/null @@ -1,10 +0,0 @@ -Name: Fiat-Crypto: Synthesizing Correct-by-Construction Code for Cryptographic Primitives -Short Name: fiat-crypto -URL: https://github.com/mit-plv/fiat-crypto -Version: git (see METADATA) -License: MIT -License File: LICENSE -Security Critical: yes - -Description: -See README.md and METADATA. diff --git a/mcuboot/ext/fiat/README.md b/mcuboot/ext/fiat/README.md deleted file mode 100644 index cf66900ce..000000000 --- a/mcuboot/ext/fiat/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Fiat - -Some of the code in this directory is generated by -[Fiat](https://github.com/mit-plv/fiat-crypto) and thus these files are -licensed under the MIT license. (See LICENSE file.) - -## Curve25519 - -To generate the field arithmetic procedures in `curve25519.c` from a fiat-crypto -checkout (as of `7892c66d5e0e5770c79463ce551193ceef870641`), run -`make src/Specific/solinas32_2e255m19_10limbs/femul.c` (replacing `femul` with -the desired field operation). The "source" file specifying the finite field and -referencing the desired implementation strategy is -`src/Specific/solinas32_2e255m19_10limbs/CurveParameters.v`, specifying roughly -"unsaturated arithmetic modulo 2^255-19 using 10 limbs of radix 2^25.5 in 32-bit -unsigned integers with a single carry chain and two wraparound carries" where -only the prime is considered normative and everything else is treated as -"compiler hints". - -The 64-bit implementation uses 5 limbs of radix 2^51 with instruction scheduling -taken from curve25519-donna-c64. It is found in -`src/Specific/solinas64_2e255m19_5limbs_donna`. - -## P256 - -To generate the field arithmetic procedures in `p256.c` from a fiat-crypto -checkout, run -`make src/Specific/montgomery64_2e256m2e224p2e192p2e96m1_4limbs/femul.c`. -The corresponding "source" file is -`src/Specific/montgomery64_2e256m2e224p2e192p2e96m1_4limbs/CurveParameters.v`, -specifying roughly "64-bit saturated word-by-word Montgomery reduction modulo -2^256 - 2^224 + 2^192 + 2^96 - 1". Again, everything except for the prime is -untrusted. There is currently a known issue where `fesub.c` for p256 does not -manage to complete the build (specialization) within a week on Coq 8.7.0. - -does manage to build that file, but the work on that branch was never finished -(the correctness proofs of implementation templates still apply, but the -now abandoned prototype specialization facilities there are unverified). - -## Working With Fiat Crypto Field Arithmetic - -The fiat-crypto readme -contains an overview of the implementation templates followed by a tour of the -specialization machinery. It may be helpful to first read about the less messy -parts of the system from chapter 3 of . -There is work ongoing to replace the entire specialization mechanism with -something much more principled . diff --git a/mcuboot/ext/fiat/pkg.yml b/mcuboot/ext/fiat/pkg.yml deleted file mode 100644 index 73a6559dc..000000000 --- a/mcuboot/ext/fiat/pkg.yml +++ /dev/null @@ -1,24 +0,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. -# - -pkg.name: ext/fiat -pkg.description: "MCUboot's bundled fiat-crypto" -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: diff --git a/mcuboot/ext/fiat/src/curve25519.c b/mcuboot/ext/fiat/src/curve25519.c deleted file mode 100644 index f669570c4..000000000 --- a/mcuboot/ext/fiat/src/curve25519.c +++ /dev/null @@ -1,1311 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file). -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -// Some of this code is taken from the ref10 version of Ed25519 in SUPERCOP -// 20141124 (http://bench.cr.yp.to/supercop.html). That code is released as -// public domain but parts have been replaced with code generated by Fiat -// (https://github.com/mit-plv/fiat-crypto), which is MIT licensed. -// -// The field functions are shared by Ed25519 and X25519 where possible. - -#include -#include -#include - -#include - -#if defined(MCUBOOT_USE_MBED_TLS) -#include -#include -#else -#include -#include -#include -#endif - -#include "curve25519.h" -// Various pre-computed constants. -#include "curve25519_tables.h" - -#define SHA512_DIGEST_LENGTH 64 - -// Low-level intrinsic operations - -static uint64_t load_3(const uint8_t *in) { - uint64_t result; - result = (uint64_t)in[0]; - result |= ((uint64_t)in[1]) << 8; - result |= ((uint64_t)in[2]) << 16; - return result; -} - -static uint64_t load_4(const uint8_t *in) { - uint64_t result; - result = (uint64_t)in[0]; - result |= ((uint64_t)in[1]) << 8; - result |= ((uint64_t)in[2]) << 16; - result |= ((uint64_t)in[3]) << 24; - return result; -} - - -// Field operations. - -typedef uint32_t fe_limb_t; -#define FE_NUM_LIMBS 10 - -// assert_fe asserts that |f| satisfies bounds: -// -// [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], -// [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], -// [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], -// [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], -// [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] -// -// See comments in curve25519_32.h for which functions use these bounds for -// inputs or outputs. -#define assert_fe(f) \ - do { \ - for (unsigned _assert_fe_i = 0; _assert_fe_i < 10; _assert_fe_i++) { \ - assert(f[_assert_fe_i] <= \ - ((_assert_fe_i & 1) ? 0x2333333u : 0x4666666u)); \ - } \ - } while (0) - -// assert_fe_loose asserts that |f| satisfies bounds: -// -// [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], -// [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], -// [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], -// [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], -// [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] -// -// See comments in curve25519_32.h for which functions use these bounds for -// inputs or outputs. -#define assert_fe_loose(f) \ - do { \ - for (unsigned _assert_fe_i = 0; _assert_fe_i < 10; _assert_fe_i++) { \ - assert(f[_assert_fe_i] <= \ - ((_assert_fe_i & 1) ? 0x6999999u : 0xd333332u)); \ - } \ - } while (0) - -//FIXME: use Zephyr macro -_Static_assert(sizeof(fe) == sizeof(fe_limb_t) * FE_NUM_LIMBS, - "fe_limb_t[FE_NUM_LIMBS] is inconsistent with fe"); - -static void fe_frombytes_strict(fe *h, const uint8_t s[32]) { - // |fiat_25519_from_bytes| requires the top-most bit be clear. - assert((s[31] & 0x80) == 0); - fiat_25519_from_bytes(h->v, s); - assert_fe(h->v); -} - -static void fe_frombytes(fe *h, const uint8_t s[32]) { - uint8_t s_copy[32]; - memcpy(s_copy, s, 32); - s_copy[31] &= 0x7f; - fe_frombytes_strict(h, s_copy); -} - -static void fe_tobytes(uint8_t s[32], const fe *f) { - assert_fe(f->v); - fiat_25519_to_bytes(s, f->v); -} - -// h = 0 -static void fe_0(fe *h) { -#if defined(MCUBOOT_USE_MBED_TLS) - mbedtls_platform_zeroize(h, sizeof(fe)); -#else - _set(h, 0, sizeof(fe)); -#endif -} - -// h = 1 -static void fe_1(fe *h) { -#if defined(MCUBOOT_USE_MBED_TLS) - mbedtls_platform_zeroize(h, sizeof(fe)); -#else - _set(h, 0, sizeof(fe)); -#endif - h->v[0] = 1; -} - -// h = f + g -// Can overlap h with f or g. -static void fe_add(fe_loose *h, const fe *f, const fe *g) { - assert_fe(f->v); - assert_fe(g->v); - fiat_25519_add(h->v, f->v, g->v); - assert_fe_loose(h->v); -} - -// h = f - g -// Can overlap h with f or g. -static void fe_sub(fe_loose *h, const fe *f, const fe *g) { - assert_fe(f->v); - assert_fe(g->v); - fiat_25519_sub(h->v, f->v, g->v); - assert_fe_loose(h->v); -} - -static void fe_carry(fe *h, const fe_loose* f) { - assert_fe_loose(f->v); - fiat_25519_carry(h->v, f->v); - assert_fe(h->v); -} - -static void fe_mul_impl(fe_limb_t out[FE_NUM_LIMBS], - const fe_limb_t in1[FE_NUM_LIMBS], - const fe_limb_t in2[FE_NUM_LIMBS]) { - assert_fe_loose(in1); - assert_fe_loose(in2); - fiat_25519_carry_mul(out, in1, in2); - assert_fe(out); -} - -static void fe_mul_ltt(fe_loose *h, const fe *f, const fe *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -static void fe_mul_ttt(fe *h, const fe *f, const fe *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -static void fe_mul_tlt(fe *h, const fe_loose *f, const fe *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -static void fe_mul_ttl(fe *h, const fe *f, const fe_loose *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -static void fe_mul_tll(fe *h, const fe_loose *f, const fe_loose *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -static void fe_sq_tl(fe *h, const fe_loose *f) { - assert_fe_loose(f->v); - fiat_25519_carry_square(h->v, f->v); - assert_fe(h->v); -} - -static void fe_sq_tt(fe *h, const fe *f) { - assert_fe_loose(f->v); - fiat_25519_carry_square(h->v, f->v); - assert_fe(h->v); -} - -// h = -f -static void fe_neg(fe_loose *h, const fe *f) { - assert_fe(f->v); - fiat_25519_opp(h->v, f->v); - assert_fe_loose(h->v); -} - -// h = f -static void fe_copy(fe *h, const fe *f) { - memmove(h, f, sizeof(fe)); -} - -static void fe_copy_lt(fe_loose *h, const fe *f) { - //FIXME: use Zephyr macro - _Static_assert(sizeof(fe_loose) == sizeof(fe), "fe and fe_loose mismatch"); - memmove(h, f, sizeof(fe)); -} - -static void fe_loose_invert(fe *out, const fe_loose *z) { - fe t0; - fe t1; - fe t2; - fe t3; - int i; - - fe_sq_tl(&t0, z); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 2; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_tlt(&t1, z, &t1); - fe_mul_ttt(&t0, &t0, &t1); - fe_sq_tt(&t2, &t0); - fe_mul_ttt(&t1, &t1, &t2); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 5; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 10; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t2, &t2, &t1); - fe_sq_tt(&t3, &t2); - for (i = 1; i < 20; ++i) { - fe_sq_tt(&t3, &t3); - } - fe_mul_ttt(&t2, &t3, &t2); - fe_sq_tt(&t2, &t2); - for (i = 1; i < 10; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 50; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t2, &t2, &t1); - fe_sq_tt(&t3, &t2); - for (i = 1; i < 100; ++i) { - fe_sq_tt(&t3, &t3); - } - fe_mul_ttt(&t2, &t3, &t2); - fe_sq_tt(&t2, &t2); - for (i = 1; i < 50; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t1, &t1); - for (i = 1; i < 5; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(out, &t1, &t0); -} - -static void fe_invert(fe *out, const fe *z) { - fe_loose l; - fe_copy_lt(&l, z); - fe_loose_invert(out, &l); -} - -static int CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len) { - const uint8_t *a = in_a; - const uint8_t *b = in_b; - uint8_t x = 0; - - for (size_t i = 0; i < len; i++) { - x |= a[i] ^ b[i]; - } - - return x; -} - -// return 0 if f == 0 -// return 1 if f != 0 -static int fe_isnonzero(const fe_loose *f) { - fe tight; - fe_carry(&tight, f); - uint8_t s[32]; - fe_tobytes(s, &tight); - - static const uint8_t zero[32] = {0}; - return CRYPTO_memcmp(s, zero, sizeof(zero)) != 0; -} - -// return 1 if f is in {1,3,5,...,q-2} -// return 0 if f is in {0,2,4,...,q-1} -static int fe_isnegative(const fe *f) { - uint8_t s[32]; - fe_tobytes(s, f); - return s[0] & 1; -} - -static void fe_sq2_tt(fe *h, const fe *f) { - // h = f^2 - fe_sq_tt(h, f); - - // h = h + h - fe_loose tmp; - fe_add(&tmp, h, h); - fe_carry(h, &tmp); -} - -static void fe_pow22523(fe *out, const fe *z) { - fe t0; - fe t1; - fe t2; - int i; - - fe_sq_tt(&t0, z); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 2; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t1, z, &t1); - fe_mul_ttt(&t0, &t0, &t1); - fe_sq_tt(&t0, &t0); - fe_mul_ttt(&t0, &t1, &t0); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 5; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t0, &t1, &t0); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 10; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t1, &t1, &t0); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 20; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t1, &t1); - for (i = 1; i < 10; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t0, &t1, &t0); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 50; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t1, &t1, &t0); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 100; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t1, &t1); - for (i = 1; i < 50; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t0, &t1, &t0); - fe_sq_tt(&t0, &t0); - for (i = 1; i < 2; ++i) { - fe_sq_tt(&t0, &t0); - } - fe_mul_ttt(out, &t0, z); -} - - -// Group operations. - -void x25519_ge_tobytes(uint8_t s[32], const ge_p2 *h) { - fe recip; - fe x; - fe y; - - fe_invert(&recip, &h->Z); - fe_mul_ttt(&x, &h->X, &recip); - fe_mul_ttt(&y, &h->Y, &recip); - fe_tobytes(s, &y); - s[31] ^= fe_isnegative(&x) << 7; -} - -int x25519_ge_frombytes_vartime(ge_p3 *h, const uint8_t s[32]) { - fe u; - fe_loose v; - fe v3; - fe vxx; - fe_loose check; - - fe_frombytes(&h->Y, s); - fe_1(&h->Z); - fe_sq_tt(&v3, &h->Y); - fe_mul_ttt(&vxx, &v3, &d); - fe_sub(&v, &v3, &h->Z); // u = y^2-1 - fe_carry(&u, &v); - fe_add(&v, &vxx, &h->Z); // v = dy^2+1 - - fe_sq_tl(&v3, &v); - fe_mul_ttl(&v3, &v3, &v); // v3 = v^3 - fe_sq_tt(&h->X, &v3); - fe_mul_ttl(&h->X, &h->X, &v); - fe_mul_ttt(&h->X, &h->X, &u); // x = uv^7 - - fe_pow22523(&h->X, &h->X); // x = (uv^7)^((q-5)/8) - fe_mul_ttt(&h->X, &h->X, &v3); - fe_mul_ttt(&h->X, &h->X, &u); // x = uv^3(uv^7)^((q-5)/8) - - fe_sq_tt(&vxx, &h->X); - fe_mul_ttl(&vxx, &vxx, &v); - fe_sub(&check, &vxx, &u); - if (fe_isnonzero(&check)) { - fe_add(&check, &vxx, &u); - if (fe_isnonzero(&check)) { - return 0; - } - fe_mul_ttt(&h->X, &h->X, &sqrtm1); - } - - if (fe_isnegative(&h->X) != (s[31] >> 7)) { - fe_loose t; - fe_neg(&t, &h->X); - fe_carry(&h->X, &t); - } - - fe_mul_ttt(&h->T, &h->X, &h->Y); - return 1; -} - -static void ge_p2_0(ge_p2 *h) { - fe_0(&h->X); - fe_1(&h->Y); - fe_1(&h->Z); -} - -// r = p -static void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p) { - fe_copy(&r->X, &p->X); - fe_copy(&r->Y, &p->Y); - fe_copy(&r->Z, &p->Z); -} - -// r = p -void x25519_ge_p3_to_cached(ge_cached *r, const ge_p3 *p) { - fe_add(&r->YplusX, &p->Y, &p->X); - fe_sub(&r->YminusX, &p->Y, &p->X); - fe_copy_lt(&r->Z, &p->Z); - fe_mul_ltt(&r->T2d, &p->T, &d2); -} - -// r = p -void x25519_ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) { - fe_mul_tll(&r->X, &p->X, &p->T); - fe_mul_tll(&r->Y, &p->Y, &p->Z); - fe_mul_tll(&r->Z, &p->Z, &p->T); -} - -// r = p -void x25519_ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) { - fe_mul_tll(&r->X, &p->X, &p->T); - fe_mul_tll(&r->Y, &p->Y, &p->Z); - fe_mul_tll(&r->Z, &p->Z, &p->T); - fe_mul_tll(&r->T, &p->X, &p->Y); -} - -// r = 2 * p -static void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) { - fe trX, trZ, trT; - fe t0; - - fe_sq_tt(&trX, &p->X); - fe_sq_tt(&trZ, &p->Y); - fe_sq2_tt(&trT, &p->Z); - fe_add(&r->Y, &p->X, &p->Y); - fe_sq_tl(&t0, &r->Y); - - fe_add(&r->Y, &trZ, &trX); - fe_sub(&r->Z, &trZ, &trX); - fe_carry(&trZ, &r->Y); - fe_sub(&r->X, &t0, &trZ); - fe_carry(&trZ, &r->Z); - fe_sub(&r->T, &trT, &trZ); -} - -// r = 2 * p -static void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p) { - ge_p2 q; - ge_p3_to_p2(&q, p); - ge_p2_dbl(r, &q); -} - -// r = p + q -static void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { - fe trY, trZ, trT; - - fe_add(&r->X, &p->Y, &p->X); - fe_sub(&r->Y, &p->Y, &p->X); - fe_mul_tll(&trZ, &r->X, &q->yplusx); - fe_mul_tll(&trY, &r->Y, &q->yminusx); - fe_mul_tlt(&trT, &q->xy2d, &p->T); - fe_add(&r->T, &p->Z, &p->Z); - fe_sub(&r->X, &trZ, &trY); - fe_add(&r->Y, &trZ, &trY); - fe_carry(&trZ, &r->T); - fe_add(&r->Z, &trZ, &trT); - fe_sub(&r->T, &trZ, &trT); -} - -// r = p - q -static void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { - fe trY, trZ, trT; - - fe_add(&r->X, &p->Y, &p->X); - fe_sub(&r->Y, &p->Y, &p->X); - fe_mul_tll(&trZ, &r->X, &q->yminusx); - fe_mul_tll(&trY, &r->Y, &q->yplusx); - fe_mul_tlt(&trT, &q->xy2d, &p->T); - fe_add(&r->T, &p->Z, &p->Z); - fe_sub(&r->X, &trZ, &trY); - fe_add(&r->Y, &trZ, &trY); - fe_carry(&trZ, &r->T); - fe_sub(&r->Z, &trZ, &trT); - fe_add(&r->T, &trZ, &trT); -} - -// r = p + q -void x25519_ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { - fe trX, trY, trZ, trT; - - fe_add(&r->X, &p->Y, &p->X); - fe_sub(&r->Y, &p->Y, &p->X); - fe_mul_tll(&trZ, &r->X, &q->YplusX); - fe_mul_tll(&trY, &r->Y, &q->YminusX); - fe_mul_tlt(&trT, &q->T2d, &p->T); - fe_mul_ttl(&trX, &p->Z, &q->Z); - fe_add(&r->T, &trX, &trX); - fe_sub(&r->X, &trZ, &trY); - fe_add(&r->Y, &trZ, &trY); - fe_carry(&trZ, &r->T); - fe_add(&r->Z, &trZ, &trT); - fe_sub(&r->T, &trZ, &trT); -} - -// r = p - q -void x25519_ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { - fe trX, trY, trZ, trT; - - fe_add(&r->X, &p->Y, &p->X); - fe_sub(&r->Y, &p->Y, &p->X); - fe_mul_tll(&trZ, &r->X, &q->YminusX); - fe_mul_tll(&trY, &r->Y, &q->YplusX); - fe_mul_tlt(&trT, &q->T2d, &p->T); - fe_mul_ttl(&trX, &p->Z, &q->Z); - fe_add(&r->T, &trX, &trX); - fe_sub(&r->X, &trZ, &trY); - fe_add(&r->Y, &trZ, &trY); - fe_carry(&trZ, &r->T); - fe_sub(&r->Z, &trZ, &trT); - fe_add(&r->T, &trZ, &trT); -} - -static void slide(signed char *r, const uint8_t *a) { - int i; - int b; - int k; - - for (i = 0; i < 256; ++i) { - r[i] = 1 & (a[i >> 3] >> (i & 7)); - } - - for (i = 0; i < 256; ++i) { - if (r[i]) { - for (b = 1; b <= 6 && i + b < 256; ++b) { - if (r[i + b]) { - if (r[i] + (r[i + b] << b) <= 15) { - r[i] += r[i + b] << b; - r[i + b] = 0; - } else if (r[i] - (r[i + b] << b) >= -15) { - r[i] -= r[i + b] << b; - for (k = i + b; k < 256; ++k) { - if (!r[k]) { - r[k] = 1; - break; - } - r[k] = 0; - } - } else { - break; - } - } - } - } - } -} - -// r = a * A + b * B -// where a = a[0]+256*a[1]+...+256^31 a[31]. -// and b = b[0]+256*b[1]+...+256^31 b[31]. -// B is the Ed25519 base point (x,4/5) with x positive. -static void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a, - const ge_p3 *A, const uint8_t *b) { - signed char aslide[256]; - signed char bslide[256]; - ge_cached Ai[8]; // A,3A,5A,7A,9A,11A,13A,15A - ge_p1p1 t; - ge_p3 u; - ge_p3 A2; - int i; - - slide(aslide, a); - slide(bslide, b); - - x25519_ge_p3_to_cached(&Ai[0], A); - ge_p3_dbl(&t, A); - x25519_ge_p1p1_to_p3(&A2, &t); - x25519_ge_add(&t, &A2, &Ai[0]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[1], &u); - x25519_ge_add(&t, &A2, &Ai[1]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[2], &u); - x25519_ge_add(&t, &A2, &Ai[2]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[3], &u); - x25519_ge_add(&t, &A2, &Ai[3]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[4], &u); - x25519_ge_add(&t, &A2, &Ai[4]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[5], &u); - x25519_ge_add(&t, &A2, &Ai[5]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[6], &u); - x25519_ge_add(&t, &A2, &Ai[6]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[7], &u); - - ge_p2_0(r); - - for (i = 255; i >= 0; --i) { - if (aslide[i] || bslide[i]) { - break; - } - } - - for (; i >= 0; --i) { - ge_p2_dbl(&t, r); - - if (aslide[i] > 0) { - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_add(&t, &u, &Ai[aslide[i] / 2]); - } else if (aslide[i] < 0) { - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); - } - - if (bslide[i] > 0) { - x25519_ge_p1p1_to_p3(&u, &t); - ge_madd(&t, &u, &Bi[bslide[i] / 2]); - } else if (bslide[i] < 0) { - x25519_ge_p1p1_to_p3(&u, &t); - ge_msub(&t, &u, &Bi[(-bslide[i]) / 2]); - } - - x25519_ge_p1p1_to_p2(r, &t); - } -} - -// int64_lshift21 returns |a << 21| but is defined when shifting bits into the -// sign bit. This works around a language flaw in C. -static inline int64_t int64_lshift21(int64_t a) { - return (int64_t)((uint64_t)a << 21); -} - -// The set of scalars is \Z/l -// where l = 2^252 + 27742317777372353535851937790883648493. - -// Input: -// s[0]+256*s[1]+...+256^63*s[63] = s -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = s mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -// Overwrites s in place. -void x25519_sc_reduce(uint8_t s[64]) { - int64_t s0 = 2097151 & load_3(s); - int64_t s1 = 2097151 & (load_4(s + 2) >> 5); - int64_t s2 = 2097151 & (load_3(s + 5) >> 2); - int64_t s3 = 2097151 & (load_4(s + 7) >> 7); - int64_t s4 = 2097151 & (load_4(s + 10) >> 4); - int64_t s5 = 2097151 & (load_3(s + 13) >> 1); - int64_t s6 = 2097151 & (load_4(s + 15) >> 6); - int64_t s7 = 2097151 & (load_3(s + 18) >> 3); - int64_t s8 = 2097151 & load_3(s + 21); - int64_t s9 = 2097151 & (load_4(s + 23) >> 5); - int64_t s10 = 2097151 & (load_3(s + 26) >> 2); - int64_t s11 = 2097151 & (load_4(s + 28) >> 7); - int64_t s12 = 2097151 & (load_4(s + 31) >> 4); - int64_t s13 = 2097151 & (load_3(s + 34) >> 1); - int64_t s14 = 2097151 & (load_4(s + 36) >> 6); - int64_t s15 = 2097151 & (load_3(s + 39) >> 3); - int64_t s16 = 2097151 & load_3(s + 42); - int64_t s17 = 2097151 & (load_4(s + 44) >> 5); - int64_t s18 = 2097151 & (load_3(s + 47) >> 2); - int64_t s19 = 2097151 & (load_4(s + 49) >> 7); - int64_t s20 = 2097151 & (load_4(s + 52) >> 4); - int64_t s21 = 2097151 & (load_3(s + 55) >> 1); - int64_t s22 = 2097151 & (load_4(s + 57) >> 6); - int64_t s23 = (load_4(s + 60) >> 3); - int64_t carry0; - int64_t carry1; - int64_t carry2; - int64_t carry3; - int64_t carry4; - int64_t carry5; - int64_t carry6; - int64_t carry7; - int64_t carry8; - int64_t carry9; - int64_t carry10; - int64_t carry11; - int64_t carry12; - int64_t carry13; - int64_t carry14; - int64_t carry15; - int64_t carry16; - - s11 += s23 * 666643; - s12 += s23 * 470296; - s13 += s23 * 654183; - s14 -= s23 * 997805; - s15 += s23 * 136657; - s16 -= s23 * 683901; - s23 = 0; - - s10 += s22 * 666643; - s11 += s22 * 470296; - s12 += s22 * 654183; - s13 -= s22 * 997805; - s14 += s22 * 136657; - s15 -= s22 * 683901; - s22 = 0; - - s9 += s21 * 666643; - s10 += s21 * 470296; - s11 += s21 * 654183; - s12 -= s21 * 997805; - s13 += s21 * 136657; - s14 -= s21 * 683901; - s21 = 0; - - s8 += s20 * 666643; - s9 += s20 * 470296; - s10 += s20 * 654183; - s11 -= s20 * 997805; - s12 += s20 * 136657; - s13 -= s20 * 683901; - s20 = 0; - - s7 += s19 * 666643; - s8 += s19 * 470296; - s9 += s19 * 654183; - s10 -= s19 * 997805; - s11 += s19 * 136657; - s12 -= s19 * 683901; - s19 = 0; - - s6 += s18 * 666643; - s7 += s18 * 470296; - s8 += s18 * 654183; - s9 -= s18 * 997805; - s10 += s18 * 136657; - s11 -= s18 * 683901; - s18 = 0; - - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - carry12 = (s12 + (1 << 20)) >> 21; - s13 += carry12; - s12 -= int64_lshift21(carry12); - carry14 = (s14 + (1 << 20)) >> 21; - s15 += carry14; - s14 -= int64_lshift21(carry14); - carry16 = (s16 + (1 << 20)) >> 21; - s17 += carry16; - s16 -= int64_lshift21(carry16); - - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - carry13 = (s13 + (1 << 20)) >> 21; - s14 += carry13; - s13 -= int64_lshift21(carry13); - carry15 = (s15 + (1 << 20)) >> 21; - s16 += carry15; - s15 -= int64_lshift21(carry15); - - s5 += s17 * 666643; - s6 += s17 * 470296; - s7 += s17 * 654183; - s8 -= s17 * 997805; - s9 += s17 * 136657; - s10 -= s17 * 683901; - s17 = 0; - - s4 += s16 * 666643; - s5 += s16 * 470296; - s6 += s16 * 654183; - s7 -= s16 * 997805; - s8 += s16 * 136657; - s9 -= s16 * 683901; - s16 = 0; - - s3 += s15 * 666643; - s4 += s15 * 470296; - s5 += s15 * 654183; - s6 -= s15 * 997805; - s7 += s15 * 136657; - s8 -= s15 * 683901; - s15 = 0; - - s2 += s14 * 666643; - s3 += s14 * 470296; - s4 += s14 * 654183; - s5 -= s14 * 997805; - s6 += s14 * 136657; - s7 -= s14 * 683901; - s14 = 0; - - s1 += s13 * 666643; - s2 += s13 * 470296; - s3 += s13 * 654183; - s4 -= s13 * 997805; - s5 += s13 * 136657; - s6 -= s13 * 683901; - s13 = 0; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = (s0 + (1 << 20)) >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry2 = (s2 + (1 << 20)) >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry4 = (s4 + (1 << 20)) >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - - carry1 = (s1 + (1 << 20)) >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry3 = (s3 + (1 << 20)) >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry5 = (s5 + (1 << 20)) >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry1 = s1 >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry2 = s2 >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry3 = s3 >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry4 = s4 >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry5 = s5 >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry6 = s6 >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry7 = s7 >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry8 = s8 >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry9 = s9 >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry10 = s10 >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - carry11 = s11 >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry1 = s1 >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry2 = s2 >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry3 = s3 >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry4 = s4 >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry5 = s5 >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry6 = s6 >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry7 = s7 >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry8 = s8 >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry9 = s9 >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry10 = s10 >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - - s[0] = s0 >> 0; - s[1] = s0 >> 8; - s[2] = (s0 >> 16) | (s1 << 5); - s[3] = s1 >> 3; - s[4] = s1 >> 11; - s[5] = (s1 >> 19) | (s2 << 2); - s[6] = s2 >> 6; - s[7] = (s2 >> 14) | (s3 << 7); - s[8] = s3 >> 1; - s[9] = s3 >> 9; - s[10] = (s3 >> 17) | (s4 << 4); - s[11] = s4 >> 4; - s[12] = s4 >> 12; - s[13] = (s4 >> 20) | (s5 << 1); - s[14] = s5 >> 7; - s[15] = (s5 >> 15) | (s6 << 6); - s[16] = s6 >> 2; - s[17] = s6 >> 10; - s[18] = (s6 >> 18) | (s7 << 3); - s[19] = s7 >> 5; - s[20] = s7 >> 13; - s[21] = s8 >> 0; - s[22] = s8 >> 8; - s[23] = (s8 >> 16) | (s9 << 5); - s[24] = s9 >> 3; - s[25] = s9 >> 11; - s[26] = (s9 >> 19) | (s10 << 2); - s[27] = s10 >> 6; - s[28] = (s10 >> 14) | (s11 << 7); - s[29] = s11 >> 1; - s[30] = s11 >> 9; - s[31] = s11 >> 17; -} - -int ED25519_verify(const uint8_t *message, size_t message_len, - const uint8_t signature[64], const uint8_t public_key[32]) { - ge_p3 A; - if ((signature[63] & 224) != 0 || - !x25519_ge_frombytes_vartime(&A, public_key)) { - return 0; - } - - fe_loose t; - fe_neg(&t, &A.X); - fe_carry(&A.X, &t); - fe_neg(&t, &A.T); - fe_carry(&A.T, &t); - - uint8_t pkcopy[32]; - memcpy(pkcopy, public_key, 32); - uint8_t rcopy[32]; - memcpy(rcopy, signature, 32); - union { - uint64_t u64[4]; - uint8_t u8[32]; - } scopy; - memcpy(&scopy.u8[0], signature + 32, 32); - - // https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that s be in - // the range [0, order) in order to prevent signature malleability. - - // kOrder is the order of Curve25519 in little-endian form. - static const uint64_t kOrder[4] = { - UINT64_C(0x5812631a5cf5d3ed), - UINT64_C(0x14def9dea2f79cd6), - 0, - UINT64_C(0x1000000000000000), - }; - for (size_t i = 3;; i--) { - if (scopy.u64[i] > kOrder[i]) { - return 0; - } else if (scopy.u64[i] < kOrder[i]) { - break; - } else if (i == 0) { - return 0; - } - } - -#if defined(MCUBOOT_USE_MBED_TLS) - - mbedtls_sha512_context ctx; - int ret; - - mbedtls_sha512_init(&ctx); - - ret = mbedtls_sha512_starts_ret(&ctx, 0); - assert(ret == 0); - - ret = mbedtls_sha512_update_ret(&ctx, signature, 32); - assert(ret == 0); - ret = mbedtls_sha512_update_ret(&ctx, public_key, 32); - assert(ret == 0); - ret = mbedtls_sha512_update_ret(&ctx, message, message_len); - assert(ret == 0); - - uint8_t h[SHA512_DIGEST_LENGTH]; - ret = mbedtls_sha512_finish_ret(&ctx, h); - assert(ret == 0); - mbedtls_sha512_free(&ctx); - -#else - - struct tc_sha512_state_struct s; - int rc; - - rc = tc_sha512_init(&s); - assert(rc == TC_CRYPTO_SUCCESS); - - rc = tc_sha512_update(&s, signature, 32); - assert(rc == TC_CRYPTO_SUCCESS); - rc = tc_sha512_update(&s, public_key, 32); - assert(rc == TC_CRYPTO_SUCCESS); - rc = tc_sha512_update(&s, message, message_len); - assert(rc == TC_CRYPTO_SUCCESS); - - uint8_t h[TC_SHA512_DIGEST_SIZE]; - rc = tc_sha512_final(h, &s); - assert(rc == TC_CRYPTO_SUCCESS); - -#endif - - x25519_sc_reduce(h); - - ge_p2 R; - ge_double_scalarmult_vartime(&R, h, &A, scopy.u8); - - uint8_t rcheck[32]; - x25519_ge_tobytes(rcheck, &R); - - return CRYPTO_memcmp(rcheck, rcopy, sizeof(rcheck)) == 0; -} - -static void fe_cswap(fe *f, fe *g, fe_limb_t b) { - b = 0-b; - for (unsigned i = 0; i < FE_NUM_LIMBS; i++) { - fe_limb_t x = f->v[i] ^ g->v[i]; - x &= b; - f->v[i] ^= x; - g->v[i] ^= x; - } -} - -static void fiat_25519_carry_scmul_121666(uint32_t out1[10], const uint32_t arg1[10]) { - uint64_t x1 = ((uint64_t)UINT32_C(0x1db42) * (arg1[9])); - uint64_t x2 = ((uint64_t)UINT32_C(0x1db42) * (arg1[8])); - uint64_t x3 = ((uint64_t)UINT32_C(0x1db42) * (arg1[7])); - uint64_t x4 = ((uint64_t)UINT32_C(0x1db42) * (arg1[6])); - uint64_t x5 = ((uint64_t)UINT32_C(0x1db42) * (arg1[5])); - uint64_t x6 = ((uint64_t)UINT32_C(0x1db42) * (arg1[4])); - uint64_t x7 = ((uint64_t)UINT32_C(0x1db42) * (arg1[3])); - uint64_t x8 = ((uint64_t)UINT32_C(0x1db42) * (arg1[2])); - uint64_t x9 = ((uint64_t)UINT32_C(0x1db42) * (arg1[1])); - uint64_t x10 = ((uint64_t)UINT32_C(0x1db42) * (arg1[0])); - uint32_t x11 = (uint32_t)(x10 >> 26); - uint32_t x12 = (uint32_t)(x10 & UINT32_C(0x3ffffff)); - uint64_t x13 = (x11 + x9); - uint32_t x14 = (uint32_t)(x13 >> 25); - uint32_t x15 = (uint32_t)(x13 & UINT32_C(0x1ffffff)); - uint64_t x16 = (x14 + x8); - uint32_t x17 = (uint32_t)(x16 >> 26); - uint32_t x18 = (uint32_t)(x16 & UINT32_C(0x3ffffff)); - uint64_t x19 = (x17 + x7); - uint32_t x20 = (uint32_t)(x19 >> 25); - uint32_t x21 = (uint32_t)(x19 & UINT32_C(0x1ffffff)); - uint64_t x22 = (x20 + x6); - uint32_t x23 = (uint32_t)(x22 >> 26); - uint32_t x24 = (uint32_t)(x22 & UINT32_C(0x3ffffff)); - uint64_t x25 = (x23 + x5); - uint32_t x26 = (uint32_t)(x25 >> 25); - uint32_t x27 = (uint32_t)(x25 & UINT32_C(0x1ffffff)); - uint64_t x28 = (x26 + x4); - uint32_t x29 = (uint32_t)(x28 >> 26); - uint32_t x30 = (uint32_t)(x28 & UINT32_C(0x3ffffff)); - uint64_t x31 = (x29 + x3); - uint32_t x32 = (uint32_t)(x31 >> 25); - uint32_t x33 = (uint32_t)(x31 & UINT32_C(0x1ffffff)); - uint64_t x34 = (x32 + x2); - uint32_t x35 = (uint32_t)(x34 >> 26); - uint32_t x36 = (uint32_t)(x34 & UINT32_C(0x3ffffff)); - uint64_t x37 = (x35 + x1); - uint32_t x38 = (uint32_t)(x37 >> 25); - uint32_t x39 = (uint32_t)(x37 & UINT32_C(0x1ffffff)); - uint32_t x40 = (x38 * (uint32_t)UINT8_C(0x13)); - uint32_t x41 = (x12 + x40); - uint32_t x42 = (x41 >> 26); - uint32_t x43 = (x41 & UINT32_C(0x3ffffff)); - uint32_t x44 = (x42 + x15); - uint32_t x45 = (x44 >> 25); - uint32_t x46 = (x44 & UINT32_C(0x1ffffff)); - uint32_t x47 = (x45 + x18); - out1[0] = x43; - out1[1] = x46; - out1[2] = x47; - out1[3] = x21; - out1[4] = x24; - out1[5] = x27; - out1[6] = x30; - out1[7] = x33; - out1[8] = x36; - out1[9] = x39; -} - -static void fe_mul121666(fe *h, const fe_loose *f) { - assert_fe_loose(f->v); - fiat_25519_carry_scmul_121666(h->v, f->v); - assert_fe(h->v); -} - -static void x25519_scalar_mult_generic(uint8_t out[32], - const uint8_t scalar[32], - const uint8_t point[32]) { - fe x1, x2, z2, x3, z3, tmp0, tmp1; - fe_loose x2l, z2l, x3l, tmp0l, tmp1l; - - uint8_t e[32]; - memcpy(e, scalar, 32); - e[0] &= 248; - e[31] &= 127; - e[31] |= 64; - - // The following implementation was transcribed to Coq and proven to - // correspond to unary scalar multiplication in affine coordinates given that - // x1 != 0 is the x coordinate of some point on the curve. It was also checked - // in Coq that doing a ladderstep with x1 = x3 = 0 gives z2' = z3' = 0, and z2 - // = z3 = 0 gives z2' = z3' = 0. The statement was quantified over the - // underlying field, so it applies to Curve25519 itself and the quadratic - // twist of Curve25519. It was not proven in Coq that prime-field arithmetic - // correctly simulates extension-field arithmetic on prime-field values. - // The decoding of the byte array representation of e was not considered. - // Specification of Montgomery curves in affine coordinates: - // - // Proof that these form a group that is isomorphic to a Weierstrass curve: - // - // Coq transcription and correctness proof of the loop (where scalarbits=255): - // - // - // preconditions: 0 <= e < 2^255 (not necessarily e < order), fe_invert(0) = 0 - fe_frombytes(&x1, point); - fe_1(&x2); - fe_0(&z2); - fe_copy(&x3, &x1); - fe_1(&z3); - - unsigned swap = 0; - int pos; - for (pos = 254; pos >= 0; --pos) { - // loop invariant as of right before the test, for the case where x1 != 0: - // pos >= -1; if z2 = 0 then x2 is nonzero; if z3 = 0 then x3 is nonzero - // let r := e >> (pos+1) in the following equalities of projective points: - // to_xz (r*P) === if swap then (x3, z3) else (x2, z2) - // to_xz ((r+1)*P) === if swap then (x2, z2) else (x3, z3) - // x1 is the nonzero x coordinate of the nonzero point (r*P-(r+1)*P) - unsigned b = 1 & (e[pos / 8] >> (pos & 7)); - swap ^= b; - fe_cswap(&x2, &x3, swap); - fe_cswap(&z2, &z3, swap); - swap = b; - // Coq transcription of ladderstep formula (called from transcribed loop): - // - // - // x1 != 0 - // x1 = 0 - fe_sub(&tmp0l, &x3, &z3); - fe_sub(&tmp1l, &x2, &z2); - fe_add(&x2l, &x2, &z2); - fe_add(&z2l, &x3, &z3); - fe_mul_tll(&z3, &tmp0l, &x2l); - fe_mul_tll(&z2, &z2l, &tmp1l); - fe_sq_tl(&tmp0, &tmp1l); - fe_sq_tl(&tmp1, &x2l); - fe_add(&x3l, &z3, &z2); - fe_sub(&z2l, &z3, &z2); - fe_mul_ttt(&x2, &tmp1, &tmp0); - fe_sub(&tmp1l, &tmp1, &tmp0); - fe_sq_tl(&z2, &z2l); - fe_mul121666(&z3, &tmp1l); - fe_sq_tl(&x3, &x3l); - fe_add(&tmp0l, &tmp0, &z3); - fe_mul_ttt(&z3, &x1, &z2); - fe_mul_tll(&z2, &tmp1l, &tmp0l); - } - // here pos=-1, so r=e, so to_xz (e*P) === if swap then (x3, z3) else (x2, z2) - fe_cswap(&x2, &x3, swap); - fe_cswap(&z2, &z3, swap); - - fe_invert(&z2, &z2); - fe_mul_ttt(&x2, &x2, &z2); - fe_tobytes(out, &x2); -} - -int X25519(uint8_t out_shared_key[32], const uint8_t private_key[32], - const uint8_t peer_public_value[32]) { - static const uint8_t kZeros[32] = {0}; - x25519_scalar_mult_generic(out_shared_key, private_key, peer_public_value); - // The all-zero output results when the input is a point of small order. - return CRYPTO_memcmp(kZeros, out_shared_key, 32) != 0; -} diff --git a/mcuboot/ext/fiat/src/curve25519.h b/mcuboot/ext/fiat/src/curve25519.h deleted file mode 100644 index e98334ace..000000000 --- a/mcuboot/ext/fiat/src/curve25519.h +++ /dev/null @@ -1,884 +0,0 @@ -/* Autogenerated */ -/* curve description: 25519 */ -/* requested operations: carry_mul, carry_square, carry_scmul121666, carry, add, sub, opp, selectznz, to_bytes, from_bytes */ -/* n = 10 (from "10") */ -/* s = 0x8000000000000000000000000000000000000000000000000000000000000000 (from "2^255") */ -/* c = [(1, 19)] (from "1,19") */ -/* machine_wordsize = 32 (from "32") */ - -#include - -#ifndef UINT64_C -#define UINT64_C(x) x##ULL -#endif -#ifndef UINT32_C -#define UINT32_C(x) x##UL -#endif -#ifndef UINT8_C -#define UINT8_C(x) (x) -#endif - -// fe means field element. Here the field is \Z/(2^255-19). An element t, -// entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 -// t[3]+2^102 t[4]+...+2^230 t[9]. -// fe limbs are bounded by 1.125*2^26,1.125*2^25,1.125*2^26,1.125*2^25,etc. -// Multiplication and carrying produce fe from fe_loose. -typedef struct fe { uint32_t v[10]; } fe; - -// fe_loose limbs are bounded by 3.375*2^26,3.375*2^25,3.375*2^26,3.375*2^25,etc. -// Addition and subtraction produce fe_loose from (fe, fe). -typedef struct fe_loose { uint32_t v[10]; } fe_loose; - -// ge means group element. -// -// Here the group is the set of pairs (x,y) of field elements (see fe.h) -// satisfying -x^2 + y^2 = 1 + d x^2y^2 -// where d = -121665/121666. -// -// Representations: -// ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z -// ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT -// ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T -// ge_precomp (Duif): (y+x,y-x,2dxy) - -typedef struct { - fe X; - fe Y; - fe Z; -} ge_p2; - -typedef struct { - fe X; - fe Y; - fe Z; - fe T; -} ge_p3; - -typedef struct { - fe_loose X; - fe_loose Y; - fe_loose Z; - fe_loose T; -} ge_p1p1; - -typedef struct { - fe_loose yplusx; - fe_loose yminusx; - fe_loose xy2d; -} ge_precomp; - -typedef struct { - fe_loose YplusX; - fe_loose YminusX; - fe_loose Z; - fe_loose T2d; -} ge_cached; - -typedef unsigned char fiat_25519_uint1; -typedef signed char fiat_25519_int1; - -/* - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x3ffffff] - * arg3: [0x0 ~> 0x3ffffff] - * Output Bounds: - * out1: [0x0 ~> 0x3ffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_addcarryx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - uint32_t x1 = ((arg1 + arg2) + arg3); - uint32_t x2 = (x1 & UINT32_C(0x3ffffff)); - fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 26); - *out1 = x2; - *out2 = x3; -} - -/* - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x3ffffff] - * arg3: [0x0 ~> 0x3ffffff] - * Output Bounds: - * out1: [0x0 ~> 0x3ffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_subborrowx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - int32_t x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3); - fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 26); - uint32_t x3 = (x1 & UINT32_C(0x3ffffff)); - *out1 = x3; - *out2 = (fiat_25519_uint1)(0x0 - x2); -} - -/* - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x1ffffff] - * arg3: [0x0 ~> 0x1ffffff] - * Output Bounds: - * out1: [0x0 ~> 0x1ffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_addcarryx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - uint32_t x1 = ((arg1 + arg2) + arg3); - uint32_t x2 = (x1 & UINT32_C(0x1ffffff)); - fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 25); - *out1 = x2; - *out2 = x3; -} - -/* - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x1ffffff] - * arg3: [0x0 ~> 0x1ffffff] - * Output Bounds: - * out1: [0x0 ~> 0x1ffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_subborrowx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - int32_t x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3); - fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 25); - uint32_t x3 = (x1 & UINT32_C(0x1ffffff)); - *out1 = x3; - *out2 = (fiat_25519_uint1)(0x0 - x2); -} - -// value_barrier_u32 returns |a|, but prevents GCC and Clang from reasoning about -// the returned value. This is used to mitigate compilers undoing constant-time -// code, until we can express our requirements directly in the language. -// -// Note the compiler is aware that |value_barrier_u32| has no side effects and -// always has the same output for a given input. This allows it to eliminate -// dead code, move computations across loops, and vectorize. -static inline uint32_t value_barrier_u32(uint32_t a) { -#if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) - __asm__("" : "+r"(a) : /* no inputs */); -#endif - return a; -} - -/* - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffff] - * arg3: [0x0 ~> 0xffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffff] - */ -static void fiat_25519_cmovznz_u32(uint32_t* out1, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - fiat_25519_uint1 x1 = (!(!arg1)); - uint32_t x2 = ((fiat_25519_int1)(0x0 - x1) & UINT32_C(0xffffffff)); - // Note this line has been patched from the synthesized code to add value - // barriers. - // - // Clang recognizes this pattern as a select. While it usually transforms it - // to a cmov, it sometimes further transforms it into a branch, which we do - // not want. - uint32_t x3 = ((value_barrier_u32(x2) & arg3) | (value_barrier_u32(~x2) & arg2)); - *out1 = x3; -} - -/* - * Input Bounds: - * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - * arg2: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - * Output Bounds: - * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - */ -static void fiat_25519_carry_mul(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) { - uint64_t x1 = ((uint64_t)(arg1[9]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x2 = ((uint64_t)(arg1[9]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); - uint64_t x3 = ((uint64_t)(arg1[9]) * ((arg2[7]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x4 = ((uint64_t)(arg1[9]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); - uint64_t x5 = ((uint64_t)(arg1[9]) * ((arg2[5]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x6 = ((uint64_t)(arg1[9]) * ((arg2[4]) * (uint32_t)UINT8_C(0x13))); - uint64_t x7 = ((uint64_t)(arg1[9]) * ((arg2[3]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x8 = ((uint64_t)(arg1[9]) * ((arg2[2]) * (uint32_t)UINT8_C(0x13))); - uint64_t x9 = ((uint64_t)(arg1[9]) * ((arg2[1]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x10 = ((uint64_t)(arg1[8]) * ((arg2[9]) * (uint32_t)UINT8_C(0x13))); - uint64_t x11 = ((uint64_t)(arg1[8]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); - uint64_t x12 = ((uint64_t)(arg1[8]) * ((arg2[7]) * (uint32_t)UINT8_C(0x13))); - uint64_t x13 = ((uint64_t)(arg1[8]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); - uint64_t x14 = ((uint64_t)(arg1[8]) * ((arg2[5]) * (uint32_t)UINT8_C(0x13))); - uint64_t x15 = ((uint64_t)(arg1[8]) * ((arg2[4]) * (uint32_t)UINT8_C(0x13))); - uint64_t x16 = ((uint64_t)(arg1[8]) * ((arg2[3]) * (uint32_t)UINT8_C(0x13))); - uint64_t x17 = ((uint64_t)(arg1[8]) * ((arg2[2]) * (uint32_t)UINT8_C(0x13))); - uint64_t x18 = ((uint64_t)(arg1[7]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x19 = ((uint64_t)(arg1[7]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); - uint64_t x20 = ((uint64_t)(arg1[7]) * ((arg2[7]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x21 = ((uint64_t)(arg1[7]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); - uint64_t x22 = ((uint64_t)(arg1[7]) * ((arg2[5]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x23 = ((uint64_t)(arg1[7]) * ((arg2[4]) * (uint32_t)UINT8_C(0x13))); - uint64_t x24 = ((uint64_t)(arg1[7]) * ((arg2[3]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x25 = ((uint64_t)(arg1[6]) * ((arg2[9]) * (uint32_t)UINT8_C(0x13))); - uint64_t x26 = ((uint64_t)(arg1[6]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); - uint64_t x27 = ((uint64_t)(arg1[6]) * ((arg2[7]) * (uint32_t)UINT8_C(0x13))); - uint64_t x28 = ((uint64_t)(arg1[6]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); - uint64_t x29 = ((uint64_t)(arg1[6]) * ((arg2[5]) * (uint32_t)UINT8_C(0x13))); - uint64_t x30 = ((uint64_t)(arg1[6]) * ((arg2[4]) * (uint32_t)UINT8_C(0x13))); - uint64_t x31 = ((uint64_t)(arg1[5]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x32 = ((uint64_t)(arg1[5]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); - uint64_t x33 = ((uint64_t)(arg1[5]) * ((arg2[7]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x34 = ((uint64_t)(arg1[5]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); - uint64_t x35 = ((uint64_t)(arg1[5]) * ((arg2[5]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x36 = ((uint64_t)(arg1[4]) * ((arg2[9]) * (uint32_t)UINT8_C(0x13))); - uint64_t x37 = ((uint64_t)(arg1[4]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); - uint64_t x38 = ((uint64_t)(arg1[4]) * ((arg2[7]) * (uint32_t)UINT8_C(0x13))); - uint64_t x39 = ((uint64_t)(arg1[4]) * ((arg2[6]) * (uint32_t)UINT8_C(0x13))); - uint64_t x40 = ((uint64_t)(arg1[3]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x41 = ((uint64_t)(arg1[3]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); - uint64_t x42 = ((uint64_t)(arg1[3]) * ((arg2[7]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x43 = ((uint64_t)(arg1[2]) * ((arg2[9]) * (uint32_t)UINT8_C(0x13))); - uint64_t x44 = ((uint64_t)(arg1[2]) * ((arg2[8]) * (uint32_t)UINT8_C(0x13))); - uint64_t x45 = ((uint64_t)(arg1[1]) * ((arg2[9]) * ((uint32_t)0x2 * UINT8_C(0x13)))); - uint64_t x46 = ((uint64_t)(arg1[9]) * (arg2[0])); - uint64_t x47 = ((uint64_t)(arg1[8]) * (arg2[1])); - uint64_t x48 = ((uint64_t)(arg1[8]) * (arg2[0])); - uint64_t x49 = ((uint64_t)(arg1[7]) * (arg2[2])); - uint64_t x50 = ((uint64_t)(arg1[7]) * ((arg2[1]) * (uint32_t)0x2)); - uint64_t x51 = ((uint64_t)(arg1[7]) * (arg2[0])); - uint64_t x52 = ((uint64_t)(arg1[6]) * (arg2[3])); - uint64_t x53 = ((uint64_t)(arg1[6]) * (arg2[2])); - uint64_t x54 = ((uint64_t)(arg1[6]) * (arg2[1])); - uint64_t x55 = ((uint64_t)(arg1[6]) * (arg2[0])); - uint64_t x56 = ((uint64_t)(arg1[5]) * (arg2[4])); - uint64_t x57 = ((uint64_t)(arg1[5]) * ((arg2[3]) * (uint32_t)0x2)); - uint64_t x58 = ((uint64_t)(arg1[5]) * (arg2[2])); - uint64_t x59 = ((uint64_t)(arg1[5]) * ((arg2[1]) * (uint32_t)0x2)); - uint64_t x60 = ((uint64_t)(arg1[5]) * (arg2[0])); - uint64_t x61 = ((uint64_t)(arg1[4]) * (arg2[5])); - uint64_t x62 = ((uint64_t)(arg1[4]) * (arg2[4])); - uint64_t x63 = ((uint64_t)(arg1[4]) * (arg2[3])); - uint64_t x64 = ((uint64_t)(arg1[4]) * (arg2[2])); - uint64_t x65 = ((uint64_t)(arg1[4]) * (arg2[1])); - uint64_t x66 = ((uint64_t)(arg1[4]) * (arg2[0])); - uint64_t x67 = ((uint64_t)(arg1[3]) * (arg2[6])); - uint64_t x68 = ((uint64_t)(arg1[3]) * ((arg2[5]) * (uint32_t)0x2)); - uint64_t x69 = ((uint64_t)(arg1[3]) * (arg2[4])); - uint64_t x70 = ((uint64_t)(arg1[3]) * ((arg2[3]) * (uint32_t)0x2)); - uint64_t x71 = ((uint64_t)(arg1[3]) * (arg2[2])); - uint64_t x72 = ((uint64_t)(arg1[3]) * ((arg2[1]) * (uint32_t)0x2)); - uint64_t x73 = ((uint64_t)(arg1[3]) * (arg2[0])); - uint64_t x74 = ((uint64_t)(arg1[2]) * (arg2[7])); - uint64_t x75 = ((uint64_t)(arg1[2]) * (arg2[6])); - uint64_t x76 = ((uint64_t)(arg1[2]) * (arg2[5])); - uint64_t x77 = ((uint64_t)(arg1[2]) * (arg2[4])); - uint64_t x78 = ((uint64_t)(arg1[2]) * (arg2[3])); - uint64_t x79 = ((uint64_t)(arg1[2]) * (arg2[2])); - uint64_t x80 = ((uint64_t)(arg1[2]) * (arg2[1])); - uint64_t x81 = ((uint64_t)(arg1[2]) * (arg2[0])); - uint64_t x82 = ((uint64_t)(arg1[1]) * (arg2[8])); - uint64_t x83 = ((uint64_t)(arg1[1]) * ((arg2[7]) * (uint32_t)0x2)); - uint64_t x84 = ((uint64_t)(arg1[1]) * (arg2[6])); - uint64_t x85 = ((uint64_t)(arg1[1]) * ((arg2[5]) * (uint32_t)0x2)); - uint64_t x86 = ((uint64_t)(arg1[1]) * (arg2[4])); - uint64_t x87 = ((uint64_t)(arg1[1]) * ((arg2[3]) * (uint32_t)0x2)); - uint64_t x88 = ((uint64_t)(arg1[1]) * (arg2[2])); - uint64_t x89 = ((uint64_t)(arg1[1]) * ((arg2[1]) * (uint32_t)0x2)); - uint64_t x90 = ((uint64_t)(arg1[1]) * (arg2[0])); - uint64_t x91 = ((uint64_t)(arg1[0]) * (arg2[9])); - uint64_t x92 = ((uint64_t)(arg1[0]) * (arg2[8])); - uint64_t x93 = ((uint64_t)(arg1[0]) * (arg2[7])); - uint64_t x94 = ((uint64_t)(arg1[0]) * (arg2[6])); - uint64_t x95 = ((uint64_t)(arg1[0]) * (arg2[5])); - uint64_t x96 = ((uint64_t)(arg1[0]) * (arg2[4])); - uint64_t x97 = ((uint64_t)(arg1[0]) * (arg2[3])); - uint64_t x98 = ((uint64_t)(arg1[0]) * (arg2[2])); - uint64_t x99 = ((uint64_t)(arg1[0]) * (arg2[1])); - uint64_t x100 = ((uint64_t)(arg1[0]) * (arg2[0])); - uint64_t x101 = (x100 + (x45 + (x44 + (x42 + (x39 + (x35 + (x30 + (x24 + (x17 + x9))))))))); - uint64_t x102 = (x101 >> 26); - uint32_t x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff)); - uint64_t x104 = (x91 + (x82 + (x74 + (x67 + (x61 + (x56 + (x52 + (x49 + (x47 + x46))))))))); - uint64_t x105 = (x92 + (x83 + (x75 + (x68 + (x62 + (x57 + (x53 + (x50 + (x48 + x1))))))))); - uint64_t x106 = (x93 + (x84 + (x76 + (x69 + (x63 + (x58 + (x54 + (x51 + (x10 + x2))))))))); - uint64_t x107 = (x94 + (x85 + (x77 + (x70 + (x64 + (x59 + (x55 + (x18 + (x11 + x3))))))))); - uint64_t x108 = (x95 + (x86 + (x78 + (x71 + (x65 + (x60 + (x25 + (x19 + (x12 + x4))))))))); - uint64_t x109 = (x96 + (x87 + (x79 + (x72 + (x66 + (x31 + (x26 + (x20 + (x13 + x5))))))))); - uint64_t x110 = (x97 + (x88 + (x80 + (x73 + (x36 + (x32 + (x27 + (x21 + (x14 + x6))))))))); - uint64_t x111 = (x98 + (x89 + (x81 + (x40 + (x37 + (x33 + (x28 + (x22 + (x15 + x7))))))))); - uint64_t x112 = (x99 + (x90 + (x43 + (x41 + (x38 + (x34 + (x29 + (x23 + (x16 + x8))))))))); - uint64_t x113 = (x102 + x112); - uint64_t x114 = (x113 >> 25); - uint32_t x115 = (uint32_t)(x113 & UINT32_C(0x1ffffff)); - uint64_t x116 = (x114 + x111); - uint64_t x117 = (x116 >> 26); - uint32_t x118 = (uint32_t)(x116 & UINT32_C(0x3ffffff)); - uint64_t x119 = (x117 + x110); - uint64_t x120 = (x119 >> 25); - uint32_t x121 = (uint32_t)(x119 & UINT32_C(0x1ffffff)); - uint64_t x122 = (x120 + x109); - uint64_t x123 = (x122 >> 26); - uint32_t x124 = (uint32_t)(x122 & UINT32_C(0x3ffffff)); - uint64_t x125 = (x123 + x108); - uint64_t x126 = (x125 >> 25); - uint32_t x127 = (uint32_t)(x125 & UINT32_C(0x1ffffff)); - uint64_t x128 = (x126 + x107); - uint64_t x129 = (x128 >> 26); - uint32_t x130 = (uint32_t)(x128 & UINT32_C(0x3ffffff)); - uint64_t x131 = (x129 + x106); - uint64_t x132 = (x131 >> 25); - uint32_t x133 = (uint32_t)(x131 & UINT32_C(0x1ffffff)); - uint64_t x134 = (x132 + x105); - uint64_t x135 = (x134 >> 26); - uint32_t x136 = (uint32_t)(x134 & UINT32_C(0x3ffffff)); - uint64_t x137 = (x135 + x104); - uint64_t x138 = (x137 >> 25); - uint32_t x139 = (uint32_t)(x137 & UINT32_C(0x1ffffff)); - uint64_t x140 = (x138 * (uint64_t)UINT8_C(0x13)); - uint64_t x141 = (x103 + x140); - uint32_t x142 = (uint32_t)(x141 >> 26); - uint32_t x143 = (uint32_t)(x141 & UINT32_C(0x3ffffff)); - uint32_t x144 = (x142 + x115); - uint32_t x145 = (x144 >> 25); - uint32_t x146 = (x144 & UINT32_C(0x1ffffff)); - uint32_t x147 = (x145 + x118); - out1[0] = x143; - out1[1] = x146; - out1[2] = x147; - out1[3] = x121; - out1[4] = x124; - out1[5] = x127; - out1[6] = x130; - out1[7] = x133; - out1[8] = x136; - out1[9] = x139; -} - -/* - * Input Bounds: - * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - * Output Bounds: - * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - */ -static void fiat_25519_carry_square(uint32_t out1[10], const uint32_t arg1[10]) { - uint32_t x1 = ((arg1[9]) * (uint32_t)UINT8_C(0x13)); - uint32_t x2 = (x1 * (uint32_t)0x2); - uint32_t x3 = ((arg1[9]) * (uint32_t)0x2); - uint32_t x4 = ((arg1[8]) * (uint32_t)UINT8_C(0x13)); - uint64_t x5 = (x4 * (uint64_t)0x2); - uint32_t x6 = ((arg1[8]) * (uint32_t)0x2); - uint32_t x7 = ((arg1[7]) * (uint32_t)UINT8_C(0x13)); - uint32_t x8 = (x7 * (uint32_t)0x2); - uint32_t x9 = ((arg1[7]) * (uint32_t)0x2); - uint32_t x10 = ((arg1[6]) * (uint32_t)UINT8_C(0x13)); - uint64_t x11 = (x10 * (uint64_t)0x2); - uint32_t x12 = ((arg1[6]) * (uint32_t)0x2); - uint32_t x13 = ((arg1[5]) * (uint32_t)UINT8_C(0x13)); - uint32_t x14 = ((arg1[5]) * (uint32_t)0x2); - uint32_t x15 = ((arg1[4]) * (uint32_t)0x2); - uint32_t x16 = ((arg1[3]) * (uint32_t)0x2); - uint32_t x17 = ((arg1[2]) * (uint32_t)0x2); - uint32_t x18 = ((arg1[1]) * (uint32_t)0x2); - uint64_t x19 = ((uint64_t)(arg1[9]) * (x1 * (uint32_t)0x2)); - uint64_t x20 = ((uint64_t)(arg1[8]) * x2); - uint64_t x21 = ((uint64_t)(arg1[8]) * x4); - uint64_t x22 = ((arg1[7]) * (x2 * (uint64_t)0x2)); - uint64_t x23 = ((arg1[7]) * x5); - uint64_t x24 = ((uint64_t)(arg1[7]) * (x7 * (uint32_t)0x2)); - uint64_t x25 = ((uint64_t)(arg1[6]) * x2); - uint64_t x26 = ((arg1[6]) * x5); - uint64_t x27 = ((uint64_t)(arg1[6]) * x8); - uint64_t x28 = ((uint64_t)(arg1[6]) * x10); - uint64_t x29 = ((arg1[5]) * (x2 * (uint64_t)0x2)); - uint64_t x30 = ((arg1[5]) * x5); - uint64_t x31 = ((arg1[5]) * (x8 * (uint64_t)0x2)); - uint64_t x32 = ((arg1[5]) * x11); - uint64_t x33 = ((uint64_t)(arg1[5]) * (x13 * (uint32_t)0x2)); - uint64_t x34 = ((uint64_t)(arg1[4]) * x2); - uint64_t x35 = ((arg1[4]) * x5); - uint64_t x36 = ((uint64_t)(arg1[4]) * x8); - uint64_t x37 = ((arg1[4]) * x11); - uint64_t x38 = ((uint64_t)(arg1[4]) * x14); - uint64_t x39 = ((uint64_t)(arg1[4]) * (arg1[4])); - uint64_t x40 = ((arg1[3]) * (x2 * (uint64_t)0x2)); - uint64_t x41 = ((arg1[3]) * x5); - uint64_t x42 = ((arg1[3]) * (x8 * (uint64_t)0x2)); - uint64_t x43 = ((uint64_t)(arg1[3]) * x12); - uint64_t x44 = ((uint64_t)(arg1[3]) * (x14 * (uint32_t)0x2)); - uint64_t x45 = ((uint64_t)(arg1[3]) * x15); - uint64_t x46 = ((uint64_t)(arg1[3]) * ((arg1[3]) * (uint32_t)0x2)); - uint64_t x47 = ((uint64_t)(arg1[2]) * x2); - uint64_t x48 = ((arg1[2]) * x5); - uint64_t x49 = ((uint64_t)(arg1[2]) * x9); - uint64_t x50 = ((uint64_t)(arg1[2]) * x12); - uint64_t x51 = ((uint64_t)(arg1[2]) * x14); - uint64_t x52 = ((uint64_t)(arg1[2]) * x15); - uint64_t x53 = ((uint64_t)(arg1[2]) * x16); - uint64_t x54 = ((uint64_t)(arg1[2]) * (arg1[2])); - uint64_t x55 = ((arg1[1]) * (x2 * (uint64_t)0x2)); - uint64_t x56 = ((uint64_t)(arg1[1]) * x6); - uint64_t x57 = ((uint64_t)(arg1[1]) * (x9 * (uint32_t)0x2)); - uint64_t x58 = ((uint64_t)(arg1[1]) * x12); - uint64_t x59 = ((uint64_t)(arg1[1]) * (x14 * (uint32_t)0x2)); - uint64_t x60 = ((uint64_t)(arg1[1]) * x15); - uint64_t x61 = ((uint64_t)(arg1[1]) * (x16 * (uint32_t)0x2)); - uint64_t x62 = ((uint64_t)(arg1[1]) * x17); - uint64_t x63 = ((uint64_t)(arg1[1]) * ((arg1[1]) * (uint32_t)0x2)); - uint64_t x64 = ((uint64_t)(arg1[0]) * x3); - uint64_t x65 = ((uint64_t)(arg1[0]) * x6); - uint64_t x66 = ((uint64_t)(arg1[0]) * x9); - uint64_t x67 = ((uint64_t)(arg1[0]) * x12); - uint64_t x68 = ((uint64_t)(arg1[0]) * x14); - uint64_t x69 = ((uint64_t)(arg1[0]) * x15); - uint64_t x70 = ((uint64_t)(arg1[0]) * x16); - uint64_t x71 = ((uint64_t)(arg1[0]) * x17); - uint64_t x72 = ((uint64_t)(arg1[0]) * x18); - uint64_t x73 = ((uint64_t)(arg1[0]) * (arg1[0])); - uint64_t x74 = (x73 + (x55 + (x48 + (x42 + (x37 + x33))))); - uint64_t x75 = (x74 >> 26); - uint32_t x76 = (uint32_t)(x74 & UINT32_C(0x3ffffff)); - uint64_t x77 = (x64 + (x56 + (x49 + (x43 + x38)))); - uint64_t x78 = (x65 + (x57 + (x50 + (x44 + (x39 + x19))))); - uint64_t x79 = (x66 + (x58 + (x51 + (x45 + x20)))); - uint64_t x80 = (x67 + (x59 + (x52 + (x46 + (x22 + x21))))); - uint64_t x81 = (x68 + (x60 + (x53 + (x25 + x23)))); - uint64_t x82 = (x69 + (x61 + (x54 + (x29 + (x26 + x24))))); - uint64_t x83 = (x70 + (x62 + (x34 + (x30 + x27)))); - uint64_t x84 = (x71 + (x63 + (x40 + (x35 + (x31 + x28))))); - uint64_t x85 = (x72 + (x47 + (x41 + (x36 + x32)))); - uint64_t x86 = (x75 + x85); - uint64_t x87 = (x86 >> 25); - uint32_t x88 = (uint32_t)(x86 & UINT32_C(0x1ffffff)); - uint64_t x89 = (x87 + x84); - uint64_t x90 = (x89 >> 26); - uint32_t x91 = (uint32_t)(x89 & UINT32_C(0x3ffffff)); - uint64_t x92 = (x90 + x83); - uint64_t x93 = (x92 >> 25); - uint32_t x94 = (uint32_t)(x92 & UINT32_C(0x1ffffff)); - uint64_t x95 = (x93 + x82); - uint64_t x96 = (x95 >> 26); - uint32_t x97 = (uint32_t)(x95 & UINT32_C(0x3ffffff)); - uint64_t x98 = (x96 + x81); - uint64_t x99 = (x98 >> 25); - uint32_t x100 = (uint32_t)(x98 & UINT32_C(0x1ffffff)); - uint64_t x101 = (x99 + x80); - uint64_t x102 = (x101 >> 26); - uint32_t x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff)); - uint64_t x104 = (x102 + x79); - uint64_t x105 = (x104 >> 25); - uint32_t x106 = (uint32_t)(x104 & UINT32_C(0x1ffffff)); - uint64_t x107 = (x105 + x78); - uint64_t x108 = (x107 >> 26); - uint32_t x109 = (uint32_t)(x107 & UINT32_C(0x3ffffff)); - uint64_t x110 = (x108 + x77); - uint64_t x111 = (x110 >> 25); - uint32_t x112 = (uint32_t)(x110 & UINT32_C(0x1ffffff)); - uint64_t x113 = (x111 * (uint64_t)UINT8_C(0x13)); - uint64_t x114 = (x76 + x113); - uint32_t x115 = (uint32_t)(x114 >> 26); - uint32_t x116 = (uint32_t)(x114 & UINT32_C(0x3ffffff)); - uint32_t x117 = (x115 + x88); - uint32_t x118 = (x117 >> 25); - uint32_t x119 = (x117 & UINT32_C(0x1ffffff)); - uint32_t x120 = (x118 + x91); - out1[0] = x116; - out1[1] = x119; - out1[2] = x120; - out1[3] = x94; - out1[4] = x97; - out1[5] = x100; - out1[6] = x103; - out1[7] = x106; - out1[8] = x109; - out1[9] = x112; -} - -/* - * Input Bounds: - * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - * Output Bounds: - * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - */ -static void fiat_25519_carry(uint32_t out1[10], const uint32_t arg1[10]) { - uint32_t x1 = (arg1[0]); - uint32_t x2 = ((x1 >> 26) + (arg1[1])); - uint32_t x3 = ((x2 >> 25) + (arg1[2])); - uint32_t x4 = ((x3 >> 26) + (arg1[3])); - uint32_t x5 = ((x4 >> 25) + (arg1[4])); - uint32_t x6 = ((x5 >> 26) + (arg1[5])); - uint32_t x7 = ((x6 >> 25) + (arg1[6])); - uint32_t x8 = ((x7 >> 26) + (arg1[7])); - uint32_t x9 = ((x8 >> 25) + (arg1[8])); - uint32_t x10 = ((x9 >> 26) + (arg1[9])); - uint32_t x11 = ((x1 & UINT32_C(0x3ffffff)) + ((x10 >> 25) * (uint32_t)UINT8_C(0x13))); - uint32_t x12 = ((x11 >> 26) + (x2 & UINT32_C(0x1ffffff))); - uint32_t x13 = (x11 & UINT32_C(0x3ffffff)); - uint32_t x14 = (x12 & UINT32_C(0x1ffffff)); - uint32_t x15 = ((x12 >> 25) + (x3 & UINT32_C(0x3ffffff))); - uint32_t x16 = (x4 & UINT32_C(0x1ffffff)); - uint32_t x17 = (x5 & UINT32_C(0x3ffffff)); - uint32_t x18 = (x6 & UINT32_C(0x1ffffff)); - uint32_t x19 = (x7 & UINT32_C(0x3ffffff)); - uint32_t x20 = (x8 & UINT32_C(0x1ffffff)); - uint32_t x21 = (x9 & UINT32_C(0x3ffffff)); - uint32_t x22 = (x10 & UINT32_C(0x1ffffff)); - out1[0] = x13; - out1[1] = x14; - out1[2] = x15; - out1[3] = x16; - out1[4] = x17; - out1[5] = x18; - out1[6] = x19; - out1[7] = x20; - out1[8] = x21; - out1[9] = x22; -} - -/* - * Input Bounds: - * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * arg2: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * Output Bounds: - * out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - */ -static void fiat_25519_add(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) { - uint32_t x1 = ((arg1[0]) + (arg2[0])); - uint32_t x2 = ((arg1[1]) + (arg2[1])); - uint32_t x3 = ((arg1[2]) + (arg2[2])); - uint32_t x4 = ((arg1[3]) + (arg2[3])); - uint32_t x5 = ((arg1[4]) + (arg2[4])); - uint32_t x6 = ((arg1[5]) + (arg2[5])); - uint32_t x7 = ((arg1[6]) + (arg2[6])); - uint32_t x8 = ((arg1[7]) + (arg2[7])); - uint32_t x9 = ((arg1[8]) + (arg2[8])); - uint32_t x10 = ((arg1[9]) + (arg2[9])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; - out1[6] = x7; - out1[7] = x8; - out1[8] = x9; - out1[9] = x10; -} - -/* - * Input Bounds: - * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * arg2: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * Output Bounds: - * out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - */ -static void fiat_25519_sub(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) { - uint32_t x1 = ((UINT32_C(0x7ffffda) + (arg1[0])) - (arg2[0])); - uint32_t x2 = ((UINT32_C(0x3fffffe) + (arg1[1])) - (arg2[1])); - uint32_t x3 = ((UINT32_C(0x7fffffe) + (arg1[2])) - (arg2[2])); - uint32_t x4 = ((UINT32_C(0x3fffffe) + (arg1[3])) - (arg2[3])); - uint32_t x5 = ((UINT32_C(0x7fffffe) + (arg1[4])) - (arg2[4])); - uint32_t x6 = ((UINT32_C(0x3fffffe) + (arg1[5])) - (arg2[5])); - uint32_t x7 = ((UINT32_C(0x7fffffe) + (arg1[6])) - (arg2[6])); - uint32_t x8 = ((UINT32_C(0x3fffffe) + (arg1[7])) - (arg2[7])); - uint32_t x9 = ((UINT32_C(0x7fffffe) + (arg1[8])) - (arg2[8])); - uint32_t x10 = ((UINT32_C(0x3fffffe) + (arg1[9])) - (arg2[9])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; - out1[6] = x7; - out1[7] = x8; - out1[8] = x9; - out1[9] = x10; -} - -/* - * Input Bounds: - * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * Output Bounds: - * out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - */ -static void fiat_25519_opp(uint32_t out1[10], const uint32_t arg1[10]) { - uint32_t x1 = (UINT32_C(0x7ffffda) - (arg1[0])); - uint32_t x2 = (UINT32_C(0x3fffffe) - (arg1[1])); - uint32_t x3 = (UINT32_C(0x7fffffe) - (arg1[2])); - uint32_t x4 = (UINT32_C(0x3fffffe) - (arg1[3])); - uint32_t x5 = (UINT32_C(0x7fffffe) - (arg1[4])); - uint32_t x6 = (UINT32_C(0x3fffffe) - (arg1[5])); - uint32_t x7 = (UINT32_C(0x7fffffe) - (arg1[6])); - uint32_t x8 = (UINT32_C(0x3fffffe) - (arg1[7])); - uint32_t x9 = (UINT32_C(0x7fffffe) - (arg1[8])); - uint32_t x10 = (UINT32_C(0x3fffffe) - (arg1[9])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; - out1[6] = x7; - out1[7] = x8; - out1[8] = x9; - out1[9] = x10; -} - -/* - * Input Bounds: - * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * Output Bounds: - * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] - */ -static void fiat_25519_to_bytes(uint8_t out1[32], const uint32_t arg1[10]) { - uint32_t x1; - fiat_25519_uint1 x2; - fiat_25519_subborrowx_u26(&x1, &x2, 0x0, (arg1[0]), UINT32_C(0x3ffffed)); - uint32_t x3; - fiat_25519_uint1 x4; - fiat_25519_subborrowx_u25(&x3, &x4, x2, (arg1[1]), UINT32_C(0x1ffffff)); - uint32_t x5; - fiat_25519_uint1 x6; - fiat_25519_subborrowx_u26(&x5, &x6, x4, (arg1[2]), UINT32_C(0x3ffffff)); - uint32_t x7; - fiat_25519_uint1 x8; - fiat_25519_subborrowx_u25(&x7, &x8, x6, (arg1[3]), UINT32_C(0x1ffffff)); - uint32_t x9; - fiat_25519_uint1 x10; - fiat_25519_subborrowx_u26(&x9, &x10, x8, (arg1[4]), UINT32_C(0x3ffffff)); - uint32_t x11; - fiat_25519_uint1 x12; - fiat_25519_subborrowx_u25(&x11, &x12, x10, (arg1[5]), UINT32_C(0x1ffffff)); - uint32_t x13; - fiat_25519_uint1 x14; - fiat_25519_subborrowx_u26(&x13, &x14, x12, (arg1[6]), UINT32_C(0x3ffffff)); - uint32_t x15; - fiat_25519_uint1 x16; - fiat_25519_subborrowx_u25(&x15, &x16, x14, (arg1[7]), UINT32_C(0x1ffffff)); - uint32_t x17; - fiat_25519_uint1 x18; - fiat_25519_subborrowx_u26(&x17, &x18, x16, (arg1[8]), UINT32_C(0x3ffffff)); - uint32_t x19; - fiat_25519_uint1 x20; - fiat_25519_subborrowx_u25(&x19, &x20, x18, (arg1[9]), UINT32_C(0x1ffffff)); - uint32_t x21; - fiat_25519_cmovznz_u32(&x21, x20, 0x0, UINT32_C(0xffffffff)); - uint32_t x22; - fiat_25519_uint1 x23; - fiat_25519_addcarryx_u26(&x22, &x23, 0x0, (x21 & UINT32_C(0x3ffffed)), x1); - uint32_t x24; - fiat_25519_uint1 x25; - fiat_25519_addcarryx_u25(&x24, &x25, x23, (x21 & UINT32_C(0x1ffffff)), x3); - uint32_t x26; - fiat_25519_uint1 x27; - fiat_25519_addcarryx_u26(&x26, &x27, x25, (x21 & UINT32_C(0x3ffffff)), x5); - uint32_t x28; - fiat_25519_uint1 x29; - fiat_25519_addcarryx_u25(&x28, &x29, x27, (x21 & UINT32_C(0x1ffffff)), x7); - uint32_t x30; - fiat_25519_uint1 x31; - fiat_25519_addcarryx_u26(&x30, &x31, x29, (x21 & UINT32_C(0x3ffffff)), x9); - uint32_t x32; - fiat_25519_uint1 x33; - fiat_25519_addcarryx_u25(&x32, &x33, x31, (x21 & UINT32_C(0x1ffffff)), x11); - uint32_t x34; - fiat_25519_uint1 x35; - fiat_25519_addcarryx_u26(&x34, &x35, x33, (x21 & UINT32_C(0x3ffffff)), x13); - uint32_t x36; - fiat_25519_uint1 x37; - fiat_25519_addcarryx_u25(&x36, &x37, x35, (x21 & UINT32_C(0x1ffffff)), x15); - uint32_t x38; - fiat_25519_uint1 x39; - fiat_25519_addcarryx_u26(&x38, &x39, x37, (x21 & UINT32_C(0x3ffffff)), x17); - uint32_t x40; - fiat_25519_uint1 x41; - fiat_25519_addcarryx_u25(&x40, &x41, x39, (x21 & UINT32_C(0x1ffffff)), x19); - uint32_t x42 = (x40 << 6); - uint32_t x43 = (x38 << 4); - uint32_t x44 = (x36 << 3); - uint32_t x45 = (x34 * (uint32_t)0x2); - uint32_t x46 = (x30 << 6); - uint32_t x47 = (x28 << 5); - uint32_t x48 = (x26 << 3); - uint32_t x49 = (x24 << 2); - uint32_t x50 = (x22 >> 8); - uint8_t x51 = (uint8_t)(x22 & UINT8_C(0xff)); - uint32_t x52 = (x50 >> 8); - uint8_t x53 = (uint8_t)(x50 & UINT8_C(0xff)); - uint8_t x54 = (uint8_t)(x52 >> 8); - uint8_t x55 = (uint8_t)(x52 & UINT8_C(0xff)); - uint32_t x56 = (x54 + x49); - uint32_t x57 = (x56 >> 8); - uint8_t x58 = (uint8_t)(x56 & UINT8_C(0xff)); - uint32_t x59 = (x57 >> 8); - uint8_t x60 = (uint8_t)(x57 & UINT8_C(0xff)); - uint8_t x61 = (uint8_t)(x59 >> 8); - uint8_t x62 = (uint8_t)(x59 & UINT8_C(0xff)); - uint32_t x63 = (x61 + x48); - uint32_t x64 = (x63 >> 8); - uint8_t x65 = (uint8_t)(x63 & UINT8_C(0xff)); - uint32_t x66 = (x64 >> 8); - uint8_t x67 = (uint8_t)(x64 & UINT8_C(0xff)); - uint8_t x68 = (uint8_t)(x66 >> 8); - uint8_t x69 = (uint8_t)(x66 & UINT8_C(0xff)); - uint32_t x70 = (x68 + x47); - uint32_t x71 = (x70 >> 8); - uint8_t x72 = (uint8_t)(x70 & UINT8_C(0xff)); - uint32_t x73 = (x71 >> 8); - uint8_t x74 = (uint8_t)(x71 & UINT8_C(0xff)); - uint8_t x75 = (uint8_t)(x73 >> 8); - uint8_t x76 = (uint8_t)(x73 & UINT8_C(0xff)); - uint32_t x77 = (x75 + x46); - uint32_t x78 = (x77 >> 8); - uint8_t x79 = (uint8_t)(x77 & UINT8_C(0xff)); - uint32_t x80 = (x78 >> 8); - uint8_t x81 = (uint8_t)(x78 & UINT8_C(0xff)); - uint8_t x82 = (uint8_t)(x80 >> 8); - uint8_t x83 = (uint8_t)(x80 & UINT8_C(0xff)); - uint8_t x84 = (uint8_t)(x82 & UINT8_C(0xff)); - uint32_t x85 = (x32 >> 8); - uint8_t x86 = (uint8_t)(x32 & UINT8_C(0xff)); - uint32_t x87 = (x85 >> 8); - uint8_t x88 = (uint8_t)(x85 & UINT8_C(0xff)); - fiat_25519_uint1 x89 = (fiat_25519_uint1)(x87 >> 8); - uint8_t x90 = (uint8_t)(x87 & UINT8_C(0xff)); - uint32_t x91 = (x89 + x45); - uint32_t x92 = (x91 >> 8); - uint8_t x93 = (uint8_t)(x91 & UINT8_C(0xff)); - uint32_t x94 = (x92 >> 8); - uint8_t x95 = (uint8_t)(x92 & UINT8_C(0xff)); - uint8_t x96 = (uint8_t)(x94 >> 8); - uint8_t x97 = (uint8_t)(x94 & UINT8_C(0xff)); - uint32_t x98 = (x96 + x44); - uint32_t x99 = (x98 >> 8); - uint8_t x100 = (uint8_t)(x98 & UINT8_C(0xff)); - uint32_t x101 = (x99 >> 8); - uint8_t x102 = (uint8_t)(x99 & UINT8_C(0xff)); - uint8_t x103 = (uint8_t)(x101 >> 8); - uint8_t x104 = (uint8_t)(x101 & UINT8_C(0xff)); - uint32_t x105 = (x103 + x43); - uint32_t x106 = (x105 >> 8); - uint8_t x107 = (uint8_t)(x105 & UINT8_C(0xff)); - uint32_t x108 = (x106 >> 8); - uint8_t x109 = (uint8_t)(x106 & UINT8_C(0xff)); - uint8_t x110 = (uint8_t)(x108 >> 8); - uint8_t x111 = (uint8_t)(x108 & UINT8_C(0xff)); - uint32_t x112 = (x110 + x42); - uint32_t x113 = (x112 >> 8); - uint8_t x114 = (uint8_t)(x112 & UINT8_C(0xff)); - uint32_t x115 = (x113 >> 8); - uint8_t x116 = (uint8_t)(x113 & UINT8_C(0xff)); - uint8_t x117 = (uint8_t)(x115 >> 8); - uint8_t x118 = (uint8_t)(x115 & UINT8_C(0xff)); - out1[0] = x51; - out1[1] = x53; - out1[2] = x55; - out1[3] = x58; - out1[4] = x60; - out1[5] = x62; - out1[6] = x65; - out1[7] = x67; - out1[8] = x69; - out1[9] = x72; - out1[10] = x74; - out1[11] = x76; - out1[12] = x79; - out1[13] = x81; - out1[14] = x83; - out1[15] = x84; - out1[16] = x86; - out1[17] = x88; - out1[18] = x90; - out1[19] = x93; - out1[20] = x95; - out1[21] = x97; - out1[22] = x100; - out1[23] = x102; - out1[24] = x104; - out1[25] = x107; - out1[26] = x109; - out1[27] = x111; - out1[28] = x114; - out1[29] = x116; - out1[30] = x118; - out1[31] = x117; -} - -/* - * Input Bounds: - * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] - * Output Bounds: - * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - */ -static void fiat_25519_from_bytes(uint32_t out1[10], const uint8_t arg1[32]) { - uint32_t x1 = ((uint32_t)(arg1[31]) << 18); - uint32_t x2 = ((uint32_t)(arg1[30]) << 10); - uint32_t x3 = ((uint32_t)(arg1[29]) << 2); - uint32_t x4 = ((uint32_t)(arg1[28]) << 20); - uint32_t x5 = ((uint32_t)(arg1[27]) << 12); - uint32_t x6 = ((uint32_t)(arg1[26]) << 4); - uint32_t x7 = ((uint32_t)(arg1[25]) << 21); - uint32_t x8 = ((uint32_t)(arg1[24]) << 13); - uint32_t x9 = ((uint32_t)(arg1[23]) << 5); - uint32_t x10 = ((uint32_t)(arg1[22]) << 23); - uint32_t x11 = ((uint32_t)(arg1[21]) << 15); - uint32_t x12 = ((uint32_t)(arg1[20]) << 7); - uint32_t x13 = ((uint32_t)(arg1[19]) << 24); - uint32_t x14 = ((uint32_t)(arg1[18]) << 16); - uint32_t x15 = ((uint32_t)(arg1[17]) << 8); - uint8_t x16 = (arg1[16]); - uint32_t x17 = ((uint32_t)(arg1[15]) << 18); - uint32_t x18 = ((uint32_t)(arg1[14]) << 10); - uint32_t x19 = ((uint32_t)(arg1[13]) << 2); - uint32_t x20 = ((uint32_t)(arg1[12]) << 19); - uint32_t x21 = ((uint32_t)(arg1[11]) << 11); - uint32_t x22 = ((uint32_t)(arg1[10]) << 3); - uint32_t x23 = ((uint32_t)(arg1[9]) << 21); - uint32_t x24 = ((uint32_t)(arg1[8]) << 13); - uint32_t x25 = ((uint32_t)(arg1[7]) << 5); - uint32_t x26 = ((uint32_t)(arg1[6]) << 22); - uint32_t x27 = ((uint32_t)(arg1[5]) << 14); - uint32_t x28 = ((uint32_t)(arg1[4]) << 6); - uint32_t x29 = ((uint32_t)(arg1[3]) << 24); - uint32_t x30 = ((uint32_t)(arg1[2]) << 16); - uint32_t x31 = ((uint32_t)(arg1[1]) << 8); - uint8_t x32 = (arg1[0]); - uint32_t x33 = (x32 + (x31 + (x30 + x29))); - uint8_t x34 = (uint8_t)(x33 >> 26); - uint32_t x35 = (x33 & UINT32_C(0x3ffffff)); - uint32_t x36 = (x3 + (x2 + x1)); - uint32_t x37 = (x6 + (x5 + x4)); - uint32_t x38 = (x9 + (x8 + x7)); - uint32_t x39 = (x12 + (x11 + x10)); - uint32_t x40 = (x16 + (x15 + (x14 + x13))); - uint32_t x41 = (x19 + (x18 + x17)); - uint32_t x42 = (x22 + (x21 + x20)); - uint32_t x43 = (x25 + (x24 + x23)); - uint32_t x44 = (x28 + (x27 + x26)); - uint32_t x45 = (x34 + x44); - uint8_t x46 = (uint8_t)(x45 >> 25); - uint32_t x47 = (x45 & UINT32_C(0x1ffffff)); - uint32_t x48 = (x46 + x43); - uint8_t x49 = (uint8_t)(x48 >> 26); - uint32_t x50 = (x48 & UINT32_C(0x3ffffff)); - uint32_t x51 = (x49 + x42); - uint8_t x52 = (uint8_t)(x51 >> 25); - uint32_t x53 = (x51 & UINT32_C(0x1ffffff)); - uint32_t x54 = (x52 + x41); - uint32_t x55 = (x54 & UINT32_C(0x3ffffff)); - uint8_t x56 = (uint8_t)(x40 >> 25); - uint32_t x57 = (x40 & UINT32_C(0x1ffffff)); - uint32_t x58 = (x56 + x39); - uint8_t x59 = (uint8_t)(x58 >> 26); - uint32_t x60 = (x58 & UINT32_C(0x3ffffff)); - uint32_t x61 = (x59 + x38); - uint8_t x62 = (uint8_t)(x61 >> 25); - uint32_t x63 = (x61 & UINT32_C(0x1ffffff)); - uint32_t x64 = (x62 + x37); - uint8_t x65 = (uint8_t)(x64 >> 26); - uint32_t x66 = (x64 & UINT32_C(0x3ffffff)); - uint32_t x67 = (x65 + x36); - out1[0] = x35; - out1[1] = x47; - out1[2] = x50; - out1[3] = x53; - out1[4] = x55; - out1[5] = x57; - out1[6] = x60; - out1[7] = x63; - out1[8] = x66; - out1[9] = x67; -} - diff --git a/mcuboot/ext/fiat/src/curve25519_tables.h b/mcuboot/ext/fiat/src/curve25519_tables.h deleted file mode 100644 index bfefc1c51..000000000 --- a/mcuboot/ext/fiat/src/curve25519_tables.h +++ /dev/null @@ -1,107 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file). -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -// This file is generated from -// ./make_curve25519_tables.py > curve25519_tables.h - -static const fe d = {{ - 56195235, 13857412, 51736253, 6949390, 114729, 24766616, - 60832955, 30306712, 48412415, 21499315 -}}; - -static const fe sqrtm1 = {{ - 34513072, 25610706, 9377949, 3500415, 12389472, - 33281959, 41962654, 31548777, 326685, 11406482 -}}; - -static const fe d2 = {{ - 45281625, 27714825, 36363642, 13898781, 229458, 15978800, - 54557047, 27058993, 29715967, 9444199 -}}; - -// Bi[i] = (2*i+1)*B -static const ge_precomp Bi[8] = { - { - {{25967493, 19198397, 29566455, 3660896, 54414519, 4014786, 27544626, - 21800161, 61029707, 2047604}}, - {{54563134, 934261, 64385954, 3049989, 66381436, 9406985, 12720692, - 5043384, 19500929, 18085054}}, - {{58370664, 4489569, 9688441, 18769238, 10184608, 21191052, 29287918, - 11864899, 42594502, 29115885}}, - }, - { - {{15636272, 23865875, 24204772, 25642034, 616976, 16869170, 27787599, - 18782243, 28944399, 32004408}}, - {{16568933, 4717097, 55552716, 32452109, 15682895, 21747389, 16354576, - 21778470, 7689661, 11199574}}, - {{30464137, 27578307, 55329429, 17883566, 23220364, 15915852, 7512774, - 10017326, 49359771, 23634074}}, - }, - { - {{10861363, 11473154, 27284546, 1981175, 37044515, 12577860, 32867885, - 14515107, 51670560, 10819379}}, - {{4708026, 6336745, 20377586, 9066809, 55836755, 6594695, 41455196, - 12483687, 54440373, 5581305}}, - {{19563141, 16186464, 37722007, 4097518, 10237984, 29206317, 28542349, - 13850243, 43430843, 17738489}}, - }, - { - {{5153727, 9909285, 1723747, 30776558, 30523604, 5516873, 19480852, - 5230134, 43156425, 18378665}}, - {{36839857, 30090922, 7665485, 10083793, 28475525, 1649722, 20654025, - 16520125, 30598449, 7715701}}, - {{28881826, 14381568, 9657904, 3680757, 46927229, 7843315, 35708204, - 1370707, 29794553, 32145132}}, - }, - { - {{44589871, 26862249, 14201701, 24808930, 43598457, 8844725, 18474211, - 32192982, 54046167, 13821876}}, - {{60653668, 25714560, 3374701, 28813570, 40010246, 22982724, 31655027, - 26342105, 18853321, 19333481}}, - {{4566811, 20590564, 38133974, 21313742, 59506191, 30723862, 58594505, - 23123294, 2207752, 30344648}}, - }, - { - {{41954014, 29368610, 29681143, 7868801, 60254203, 24130566, 54671499, - 32891431, 35997400, 17421995}}, - {{25576264, 30851218, 7349803, 21739588, 16472781, 9300885, 3844789, - 15725684, 171356, 6466918}}, - {{23103977, 13316479, 9739013, 17404951, 817874, 18515490, 8965338, - 19466374, 36393951, 16193876}}, - }, - { - {{33587053, 3180712, 64714734, 14003686, 50205390, 17283591, 17238397, - 4729455, 49034351, 9256799}}, - {{41926547, 29380300, 32336397, 5036987, 45872047, 11360616, 22616405, - 9761698, 47281666, 630304}}, - {{53388152, 2639452, 42871404, 26147950, 9494426, 27780403, 60554312, - 17593437, 64659607, 19263131}}, - }, - { - {{63957664, 28508356, 9282713, 6866145, 35201802, 32691408, 48168288, - 15033783, 25105118, 25659556}}, - {{42782475, 15950225, 35307649, 18961608, 55446126, 28463506, 1573891, - 30928545, 2198789, 17749813}}, - {{64009494, 10324966, 64867251, 7453182, 61661885, 30818928, 53296841, - 17317989, 34647629, 21263748}}, - }, -}; diff --git a/mcuboot/ext/mbedtls-asn1/README b/mcuboot/ext/mbedtls-asn1/README deleted file mode 100644 index b6b4dcb0f..000000000 --- a/mcuboot/ext/mbedtls-asn1/README +++ /dev/null @@ -1,3 +0,0 @@ -This bundles the asn1 parser from mbed-tls into mcuboot, which allows -adding EC crypto (tinycrypt based) functionality for target OSes that -don't bundle mbed-tls. diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/asn1.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/asn1.h deleted file mode 100644 index 96c1c9a8a..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/asn1.h +++ /dev/null @@ -1,358 +0,0 @@ -/** - * \file asn1.h - * - * \brief Generic ASN.1 parsing - */ -/* - * Copyright (C) 2006-2015, 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_ASN1_H -#define MBEDTLS_ASN1_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if defined(MBEDTLS_BIGNUM_C) -#include "bignum.h" -#endif - -/** - * \addtogroup asn1_module - * \{ - */ - -/** - * \name ASN1 Error codes - * These error codes are OR'ed to X509 error codes for - * higher error granularity. - * ASN1 is a standard to specify data structures. - * \{ - */ -#define MBEDTLS_ERR_ASN1_OUT_OF_DATA -0x0060 /**< Out of data when parsing an ASN1 data structure. */ -#define MBEDTLS_ERR_ASN1_UNEXPECTED_TAG -0x0062 /**< ASN1 tag was of an unexpected value. */ -#define MBEDTLS_ERR_ASN1_INVALID_LENGTH -0x0064 /**< Error when trying to determine the length or invalid length. */ -#define MBEDTLS_ERR_ASN1_LENGTH_MISMATCH -0x0066 /**< Actual length differs from expected length. */ -#define MBEDTLS_ERR_ASN1_INVALID_DATA -0x0068 /**< Data is invalid. (not used) */ -#define MBEDTLS_ERR_ASN1_ALLOC_FAILED -0x006A /**< Memory allocation failed */ -#define MBEDTLS_ERR_ASN1_BUF_TOO_SMALL -0x006C /**< Buffer too small when writing ASN.1 data structure. */ - -/* \} name */ - -/** - * \name DER constants - * These constants comply with the DER encoded ASN.1 type tags. - * DER encoding uses hexadecimal representation. - * An example DER sequence is:\n - * - 0x02 -- tag indicating INTEGER - * - 0x01 -- length in octets - * - 0x05 -- value - * Such sequences are typically read into \c ::mbedtls_x509_buf. - * \{ - */ -#define MBEDTLS_ASN1_BOOLEAN 0x01 -#define MBEDTLS_ASN1_INTEGER 0x02 -#define MBEDTLS_ASN1_BIT_STRING 0x03 -#define MBEDTLS_ASN1_OCTET_STRING 0x04 -#define MBEDTLS_ASN1_NULL 0x05 -#define MBEDTLS_ASN1_OID 0x06 -#define MBEDTLS_ASN1_UTF8_STRING 0x0C -#define MBEDTLS_ASN1_SEQUENCE 0x10 -#define MBEDTLS_ASN1_SET 0x11 -#define MBEDTLS_ASN1_PRINTABLE_STRING 0x13 -#define MBEDTLS_ASN1_T61_STRING 0x14 -#define MBEDTLS_ASN1_IA5_STRING 0x16 -#define MBEDTLS_ASN1_UTC_TIME 0x17 -#define MBEDTLS_ASN1_GENERALIZED_TIME 0x18 -#define MBEDTLS_ASN1_UNIVERSAL_STRING 0x1C -#define MBEDTLS_ASN1_BMP_STRING 0x1E -#define MBEDTLS_ASN1_PRIMITIVE 0x00 -#define MBEDTLS_ASN1_CONSTRUCTED 0x20 -#define MBEDTLS_ASN1_CONTEXT_SPECIFIC 0x80 - -/* - * Bit masks for each of the components of an ASN.1 tag as specified in - * ITU X.690 (08/2015), section 8.1 "General rules for encoding", - * paragraph 8.1.2.2: - * - * Bit 8 7 6 5 1 - * +-------+-----+------------+ - * | Class | P/C | Tag number | - * +-------+-----+------------+ - */ -#define MBEDTLS_ASN1_TAG_CLASS_MASK 0xC0 -#define MBEDTLS_ASN1_TAG_PC_MASK 0x20 -#define MBEDTLS_ASN1_TAG_VALUE_MASK 0x1F - -/* \} name */ -/* \} addtogroup asn1_module */ - -/** Returns the size of the binary string, without the trailing \\0 */ -#define MBEDTLS_OID_SIZE(x) (sizeof(x) - 1) - -/** - * Compares an mbedtls_asn1_buf structure to a reference OID. - * - * Only works for 'defined' oid_str values (MBEDTLS_OID_HMAC_SHA1), you cannot use a - * 'unsigned char *oid' here! - */ -#define MBEDTLS_OID_CMP(oid_str, oid_buf) \ - ( ( MBEDTLS_OID_SIZE(oid_str) != (oid_buf)->len ) || \ - memcmp( (oid_str), (oid_buf)->p, (oid_buf)->len) != 0 ) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \name Functions to parse ASN.1 data structures - * \{ - */ - -/** - * Type-length-value structure that allows for ASN1 using DER. - */ -typedef struct mbedtls_asn1_buf -{ - int tag; /**< ASN1 type, e.g. MBEDTLS_ASN1_UTF8_STRING. */ - size_t len; /**< ASN1 length, in octets. */ - unsigned char *p; /**< ASN1 data, e.g. in ASCII. */ -} -mbedtls_asn1_buf; - -/** - * Container for ASN1 bit strings. - */ -typedef struct mbedtls_asn1_bitstring -{ - size_t len; /**< ASN1 length, in octets. */ - unsigned char unused_bits; /**< Number of unused bits at the end of the string */ - unsigned char *p; /**< Raw ASN1 data for the bit string */ -} -mbedtls_asn1_bitstring; - -/** - * Container for a sequence of ASN.1 items - */ -typedef struct mbedtls_asn1_sequence -{ - mbedtls_asn1_buf buf; /**< Buffer containing the given ASN.1 item. */ - struct mbedtls_asn1_sequence *next; /**< The next entry in the sequence. */ -} -mbedtls_asn1_sequence; - -/** - * Container for a sequence or list of 'named' ASN.1 data items - */ -typedef struct mbedtls_asn1_named_data -{ - mbedtls_asn1_buf oid; /**< The object identifier. */ - mbedtls_asn1_buf val; /**< The named value. */ - struct mbedtls_asn1_named_data *next; /**< The next entry in the sequence. */ - unsigned char next_merged; /**< Merge next item into the current one? */ -} -mbedtls_asn1_named_data; - -/** - * \brief Get the length of an ASN.1 element. - * Updates the pointer to immediately behind the length. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param len The variable that will receive the value - * - * \return 0 if successful, MBEDTLS_ERR_ASN1_OUT_OF_DATA on reaching - * end of data, MBEDTLS_ERR_ASN1_INVALID_LENGTH if length is - * unparseable. - */ -int mbedtls_asn1_get_len( unsigned char **p, - const unsigned char *end, - size_t *len ); - -/** - * \brief Get the tag and length of the tag. Check for the requested tag. - * Updates the pointer to immediately behind the tag and length. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param len The variable that will receive the length - * \param tag The expected tag - * - * \return 0 if successful, MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if tag did - * not match requested tag, or another specific ASN.1 error code. - */ -int mbedtls_asn1_get_tag( unsigned char **p, - const unsigned char *end, - size_t *len, int tag ); - -/** - * \brief Retrieve a boolean ASN.1 tag and its value. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param val The variable that will receive the value - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_bool( unsigned char **p, - const unsigned char *end, - int *val ); - -/** - * \brief Retrieve an integer ASN.1 tag and its value. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param val The variable that will receive the value - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_int( unsigned char **p, - const unsigned char *end, - int *val ); - -/** - * \brief Retrieve a bitstring ASN.1 tag and its value. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param bs The variable that will receive the value - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end, - mbedtls_asn1_bitstring *bs); - -/** - * \brief Retrieve a bitstring ASN.1 tag without unused bits and its - * value. - * Updates the pointer to the beginning of the bit/octet string. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param len Length of the actual bit/octect string in bytes - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end, - size_t *len ); - -/** - * \brief Parses and splits an ASN.1 "SEQUENCE OF " - * Updated the pointer to immediately behind the full sequence tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param cur First variable in the chain to fill - * \param tag Type of sequence - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_sequence_of( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_sequence *cur, - int tag); - -#if defined(MBEDTLS_BIGNUM_C) -/** - * \brief Retrieve a MPI value from an integer ASN.1 tag. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param X The MPI that will receive the value - * - * \return 0 if successful or a specific ASN.1 or MPI error code. - */ -int mbedtls_asn1_get_mpi( unsigned char **p, - const unsigned char *end, - mbedtls_mpi *X ); -#endif /* MBEDTLS_BIGNUM_C */ - -/** - * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence. - * Updates the pointer to immediately behind the full - * AlgorithmIdentifier. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param alg The buffer to receive the OID - * \param params The buffer to receive the params (if any) - * - * \return 0 if successful or a specific ASN.1 or MPI error code. - */ -int mbedtls_asn1_get_alg( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params ); - -/** - * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no - * params. - * Updates the pointer to immediately behind the full - * AlgorithmIdentifier. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param alg The buffer to receive the OID - * - * \return 0 if successful or a specific ASN.1 or MPI error code. - */ -int mbedtls_asn1_get_alg_null( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_buf *alg ); - -/** - * \brief Find a specific named_data entry in a sequence or list based on - * the OID. - * - * \param list The list to seek through - * \param oid The OID to look for - * \param len Size of the OID - * - * \return NULL if not found, or a pointer to the existing entry. - */ -mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list, - const char *oid, size_t len ); - -/** - * \brief Free a mbedtls_asn1_named_data entry - * - * \param entry The named data entry to free - */ -void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *entry ); - -/** - * \brief Free all entries in a mbedtls_asn1_named_data list - * Head will be set to NULL - * - * \param head Pointer to the head of the list of named data entries to free - */ -void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head ); - -#ifdef __cplusplus -} -#endif - -#endif /* asn1.h */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/bignum.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/bignum.h deleted file mode 100644 index 40cfab49a..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/bignum.h +++ /dev/null @@ -1,821 +0,0 @@ -/** - * \file bignum.h - * - * \brief Multi-precision integer library - */ -/* - * Copyright (C) 2006-2015, 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_BIGNUM_H -#define MBEDTLS_BIGNUM_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if defined(MBEDTLS_FS_IO) -#include -#endif - -#define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002 /**< An error occurred while reading from or writing to a file. */ -#define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006 /**< There is an invalid character in the digit string. */ -#define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008 /**< The buffer is too small to write to. */ -#define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A /**< The input arguments are negative or result in illegal output. */ -#define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C /**< The input argument for division is zero, which is not allowed. */ -#define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E /**< The input arguments are not acceptable. */ -#define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010 /**< Memory allocation failed. */ - -#define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 ) - -/* - * Maximum size MPIs are allowed to grow to in number of limbs. - */ -#define MBEDTLS_MPI_MAX_LIMBS 10000 - -#if !defined(MBEDTLS_MPI_WINDOW_SIZE) -/* - * Maximum window size used for modular exponentiation. Default: 6 - * Minimum value: 1. Maximum value: 6. - * - * Result is an array of ( 2 << MBEDTLS_MPI_WINDOW_SIZE ) MPIs used - * for the sliding window calculation. (So 64 by default) - * - * Reduction in size, reduces speed. - */ -#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ -#endif /* !MBEDTLS_MPI_WINDOW_SIZE */ - -#if !defined(MBEDTLS_MPI_MAX_SIZE) -/* - * Maximum size of MPIs allowed in bits and bytes for user-MPIs. - * ( Default: 512 bytes => 4096 bits, Maximum tested: 2048 bytes => 16384 bits ) - * - * Note: Calculations can temporarily result in larger MPIs. So the number - * of limbs required (MBEDTLS_MPI_MAX_LIMBS) is higher. - */ -#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ -#endif /* !MBEDTLS_MPI_MAX_SIZE */ - -#define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE ) /**< Maximum number of bits for usable MPIs. */ - -/* - * When reading from files with mbedtls_mpi_read_file() and writing to files with - * mbedtls_mpi_write_file() the buffer should have space - * for a (short) label, the MPI (in the provided radix), the newline - * characters and the '\0'. - * - * By default we assume at least a 10 char label, a minimum radix of 10 - * (decimal) and a maximum of 4096 bit numbers (1234 decimal chars). - * Autosized at compile time for at least a 10 char label, a minimum radix - * of 10 (decimal) for a number of MBEDTLS_MPI_MAX_BITS size. - * - * This used to be statically sized to 1250 for a maximum of 4096 bit - * numbers (1234 decimal chars). - * - * Calculate using the formula: - * MBEDTLS_MPI_RW_BUFFER_SIZE = ceil(MBEDTLS_MPI_MAX_BITS / ln(10) * ln(2)) + - * LabelSize + 6 - */ -#define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS ) -#define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332 -#define MBEDTLS_MPI_RW_BUFFER_SIZE ( ((MBEDTLS_MPI_MAX_BITS_SCALE100 + MBEDTLS_LN_2_DIV_LN_10_SCALE100 - 1) / MBEDTLS_LN_2_DIV_LN_10_SCALE100) + 10 + 6 ) - -/* - * Define the base integer type, architecture-wise. - * - * 32 or 64-bit integer types can be forced regardless of the underlying - * architecture by defining MBEDTLS_HAVE_INT32 or MBEDTLS_HAVE_INT64 - * respectively and undefining MBEDTLS_HAVE_ASM. - * - * Double-width integers (e.g. 128-bit in 64-bit architectures) can be - * disabled by defining MBEDTLS_NO_UDBL_DIVISION. - */ -#if !defined(MBEDTLS_HAVE_INT32) - #if defined(_MSC_VER) && defined(_M_AMD64) - /* Always choose 64-bit when using MSC */ - #if !defined(MBEDTLS_HAVE_INT64) - #define MBEDTLS_HAVE_INT64 - #endif /* !MBEDTLS_HAVE_INT64 */ - typedef int64_t mbedtls_mpi_sint; - typedef uint64_t mbedtls_mpi_uint; - #elif defined(__GNUC__) && ( \ - defined(__amd64__) || defined(__x86_64__) || \ - defined(__ppc64__) || defined(__powerpc64__) || \ - defined(__ia64__) || defined(__alpha__) || \ - ( defined(__sparc__) && defined(__arch64__) ) || \ - defined(__s390x__) || defined(__mips64) ) - #if !defined(MBEDTLS_HAVE_INT64) - #define MBEDTLS_HAVE_INT64 - #endif /* MBEDTLS_HAVE_INT64 */ - typedef int64_t mbedtls_mpi_sint; - typedef uint64_t mbedtls_mpi_uint; - #if !defined(MBEDTLS_NO_UDBL_DIVISION) - /* mbedtls_t_udbl defined as 128-bit unsigned int */ - typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI))); - #define MBEDTLS_HAVE_UDBL - #endif /* !MBEDTLS_NO_UDBL_DIVISION */ - #elif defined(__ARMCC_VERSION) && defined(__aarch64__) - /* - * __ARMCC_VERSION is defined for both armcc and armclang and - * __aarch64__ is only defined by armclang when compiling 64-bit code - */ - #if !defined(MBEDTLS_HAVE_INT64) - #define MBEDTLS_HAVE_INT64 - #endif /* !MBEDTLS_HAVE_INT64 */ - typedef int64_t mbedtls_mpi_sint; - typedef uint64_t mbedtls_mpi_uint; - #if !defined(MBEDTLS_NO_UDBL_DIVISION) - /* mbedtls_t_udbl defined as 128-bit unsigned int */ - typedef __uint128_t mbedtls_t_udbl; - #define MBEDTLS_HAVE_UDBL - #endif /* !MBEDTLS_NO_UDBL_DIVISION */ - #elif defined(MBEDTLS_HAVE_INT64) - /* Force 64-bit integers with unknown compiler */ - typedef int64_t mbedtls_mpi_sint; - typedef uint64_t mbedtls_mpi_uint; - #endif -#endif /* !MBEDTLS_HAVE_INT32 */ - -#if !defined(MBEDTLS_HAVE_INT64) - /* Default to 32-bit compilation */ - #if !defined(MBEDTLS_HAVE_INT32) - #define MBEDTLS_HAVE_INT32 - #endif /* !MBEDTLS_HAVE_INT32 */ - typedef int32_t mbedtls_mpi_sint; - typedef uint32_t mbedtls_mpi_uint; - #if !defined(MBEDTLS_NO_UDBL_DIVISION) - typedef uint64_t mbedtls_t_udbl; - #define MBEDTLS_HAVE_UDBL - #endif /* !MBEDTLS_NO_UDBL_DIVISION */ -#endif /* !MBEDTLS_HAVE_INT64 */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief MPI structure - */ -typedef struct mbedtls_mpi -{ - int s; /*!< integer sign */ - size_t n; /*!< total # of limbs */ - mbedtls_mpi_uint *p; /*!< pointer to limbs */ -} -mbedtls_mpi; - -/** - * \brief Initialize one MPI (make internal references valid) - * This just makes it ready to be set or freed, - * but does not define a value for the MPI. - * - * \param X One MPI to initialize. - */ -void mbedtls_mpi_init( mbedtls_mpi *X ); - -/** - * \brief Unallocate one MPI - * - * \param X One MPI to unallocate. - */ -void mbedtls_mpi_free( mbedtls_mpi *X ); - -/** - * \brief Enlarge to the specified number of limbs - * - * This function does nothing if the MPI is already large enough. - * - * \param X MPI to grow - * \param nblimbs The target number of limbs - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs ); - -/** - * \brief Resize down, keeping at least the specified number of limbs - * - * If \c X is smaller than \c nblimbs, it is resized up - * instead. - * - * \param X MPI to shrink - * \param nblimbs The minimum number of limbs to keep - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - * (this can only happen when resizing up). - */ -int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs ); - -/** - * \brief Copy the contents of Y into X - * - * \param X Destination MPI. It is enlarged if necessary. - * \param Y Source MPI. - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y ); - -/** - * \brief Swap the contents of X and Y - * - * \param X First MPI value - * \param Y Second MPI value - */ -void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ); - -/** - * \brief Safe conditional assignement X = Y if assign is 1 - * - * \param X MPI to conditionally assign to - * \param Y Value to be assigned - * \param assign 1: perform the assignment, 0: keep X's original value - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * - * \note This function is equivalent to - * if( assign ) mbedtls_mpi_copy( X, Y ); - * except that it avoids leaking any information about whether - * the assignment was done or not (the above code may leak - * information through branch prediction and/or memory access - * patterns analysis). - */ -int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign ); - -/** - * \brief Safe conditional swap X <-> Y if swap is 1 - * - * \param X First mbedtls_mpi value - * \param Y Second mbedtls_mpi value - * \param assign 1: perform the swap, 0: keep X and Y's original values - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * - * \note This function is equivalent to - * if( assign ) mbedtls_mpi_swap( X, Y ); - * except that it avoids leaking any information about whether - * the assignment was done or not (the above code may leak - * information through branch prediction and/or memory access - * patterns analysis). - */ -int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign ); - -/** - * \brief Set value from integer - * - * \param X MPI to set - * \param z Value to use - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z ); - -/** - * \brief Get a specific bit from X - * - * \param X MPI to use - * \param pos Zero-based index of the bit in X - * - * \return Either a 0 or a 1 - */ -int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos ); - -/** - * \brief Set a bit of X to a specific value of 0 or 1 - * - * \note Will grow X if necessary to set a bit to 1 in a not yet - * existing limb. Will not grow if bit should be set to 0 - * - * \param X MPI to use - * \param pos Zero-based index of the bit in X - * \param val The value to set the bit to (0 or 1) - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if val is not 0 or 1 - */ -int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val ); - -/** - * \brief Return the number of zero-bits before the least significant - * '1' bit - * - * Note: Thus also the zero-based index of the least significant '1' bit - * - * \param X MPI to use - */ -size_t mbedtls_mpi_lsb( const mbedtls_mpi *X ); - -/** - * \brief Return the number of bits up to and including the most - * significant '1' bit' - * - * Note: Thus also the one-based index of the most significant '1' bit - * - * \param X MPI to use - */ -size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X ); - -/** - * \brief Return the total size in bytes - * - * \param X MPI to use - */ -size_t mbedtls_mpi_size( const mbedtls_mpi *X ); - -/** - * \brief Import from an ASCII string - * - * \param X Destination MPI - * \param radix Input numeric base - * \param s Null-terminated string buffer - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code - */ -int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s ); - -/** - * \brief Export into an ASCII string - * - * \param X Source MPI - * \param radix Output numeric base - * \param buf Buffer to write the string to - * \param buflen Length of buf - * \param olen Length of the string written, including final NUL byte - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code. - * *olen is always updated to reflect the amount - * of data that has (or would have) been written. - * - * \note Call this function with buflen = 0 to obtain the - * minimum required buffer size in *olen. - */ -int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, - char *buf, size_t buflen, size_t *olen ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Read MPI from a line in an opened file - * - * \param X Destination MPI - * \param radix Input numeric base - * \param fin Input file handle - * - * \return 0 if successful, MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if - * the file read buffer is too small or a - * MBEDTLS_ERR_MPI_XXX error code - * - * \note On success, this function advances the file stream - * to the end of the current line or to EOF. - * - * The function returns 0 on an empty line. - * - * Leading whitespaces are ignored, as is a - * '0x' prefix for radix 16. - * - */ -int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin ); - -/** - * \brief Write X into an opened file, or stdout if fout is NULL - * - * \param p Prefix, can be NULL - * \param X Source MPI - * \param radix Output numeric base - * \param fout Output file handle (can be NULL) - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code - * - * \note Set fout == NULL to print X on the console. - */ -int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Import X from unsigned binary data, big endian - * - * \param X Destination MPI - * \param buf Input buffer - * \param buflen Input buffer size - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen ); - -/** - * \brief Export X into unsigned binary data, big endian. - * Always fills the whole buffer, which will start with zeros - * if the number is smaller. - * - * \param X Source MPI - * \param buf Output buffer - * \param buflen Output buffer size - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if buf isn't large enough - */ -int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen ); - -/** - * \brief Left-shift: X <<= count - * - * \param X MPI to shift - * \param count Amount to shift - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count ); - -/** - * \brief Right-shift: X >>= count - * - * \param X MPI to shift - * \param count Amount to shift - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count ); - -/** - * \brief Compare unsigned values - * - * \param X Left-hand MPI - * \param Y Right-hand MPI - * - * \return 1 if |X| is greater than |Y|, - * -1 if |X| is lesser than |Y| or - * 0 if |X| is equal to |Y| - */ -int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y ); - -/** - * \brief Compare signed values - * - * \param X Left-hand MPI - * \param Y Right-hand MPI - * - * \return 1 if X is greater than Y, - * -1 if X is lesser than Y or - * 0 if X is equal to Y - */ -int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y ); - -/** - * \brief Compare signed values - * - * \param X Left-hand MPI - * \param z The integer value to compare to - * - * \return 1 if X is greater than z, - * -1 if X is lesser than z or - * 0 if X is equal to z - */ -int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z ); - -/** - * \brief Unsigned addition: X = |A| + |B| - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Unsigned subtraction: X = |A| - |B| - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B is greater than A - */ -int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Signed addition: X = A + B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Signed subtraction: X = A - B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Signed addition: X = A + b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The integer value to add - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Signed subtraction: X = A - b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The integer value to subtract - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Baseline multiplication: X = A * B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Baseline multiplication: X = A * b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The unsigned integer value to multiply with - * - * \note b is unsigned - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b ); - -/** - * \brief Division by mbedtls_mpi: A = Q * B + R - * - * \param Q Destination MPI for the quotient - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0 - * - * \note Either Q or R can be NULL. - */ -int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Division by int: A = Q * b + R - * - * \param Q Destination MPI for the quotient - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param b Integer to divide by - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0 - * - * \note Either Q or R can be NULL. - */ -int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Modulo: R = A mod B - * - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0, - * MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B < 0 - */ -int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Modulo: r = A mod b - * - * \param r Destination mbedtls_mpi_uint - * \param A Left-hand MPI - * \param b Integer to divide by - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0, - * MBEDTLS_ERR_MPI_NEGATIVE_VALUE if b < 0 - */ -int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Sliding-window exponentiation: X = A^E mod N - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param E Exponent MPI - * \param N Modular MPI - * \param _RR Speed-up MPI used for recalculations - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is negative or even or - * if E is negative - * - * \note _RR is used to avoid re-computing R*R mod N across - * multiple calls, which speeds up things a bit. It can - * be set to NULL if the extra performance is unneeded. - */ -int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR ); - -/** - * \brief Fill an MPI X with size bytes of random - * - * \param X Destination MPI - * \param size Size in bytes - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - * - * \note The bytes obtained from the PRNG are interpreted - * as a big-endian representation of an MPI; this can - * be relevant in applications like deterministic ECDSA. - */ -int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Greatest common divisor: G = gcd(A, B) - * - * \param G Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Modular inverse: X = A^-1 mod N - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param N Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is <= 1, - MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if A has no inverse mod N. - */ -int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N ); - -#if !defined(MBEDTLS_DEPRECATED_REMOVED) -#if defined(MBEDTLS_DEPRECATED_WARNING) -#define MBEDTLS_DEPRECATED __attribute__((deprecated)) -#else -#define MBEDTLS_DEPRECATED -#endif -/** - * \brief Miller-Rabin primality test with error probability of - * 2-80 - * - * \deprecated Superseded by mbedtls_mpi_is_prime_ext() which allows - * specifying the number of Miller-Rabin rounds. - * - * \param X MPI to check - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful (probably prime), - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if X is not prime - */ -MBEDTLS_DEPRECATED int mbedtls_mpi_is_prime( const mbedtls_mpi *X, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); -#undef MBEDTLS_DEPRECATED -#endif /* !MBEDTLS_DEPRECATED_REMOVED */ - -/** - * \brief Miller-Rabin primality test. - * - * \warning If \p X is potentially generated by an adversary, for example - * when validating cryptographic parameters that you didn't - * generate yourself and that are supposed to be prime, then - * \p rounds should be at least the half of the security - * strength of the cryptographic algorithm. On the other hand, - * if \p X is chosen uniformly or non-adversially (as is the - * case when mbedtls_mpi_gen_prime calls this function), then - * \p rounds can be much lower. - * - * \param X MPI to check - * \param rounds Number of bases to perform Miller-Rabin primality test for. - * The probability of returning 0 on a composite is at most - * 2-2*\p rounds. - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful (probably prime), - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if X is not prime - */ -int mbedtls_mpi_is_prime_ext( const mbedtls_mpi *X, int rounds, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); -/** - * \brief Flags for mbedtls_mpi_gen_prime() - * - * Each of these flags is a constraint on the result X returned by - * mbedtls_mpi_gen_prime(). - */ -typedef enum { - MBEDTLS_MPI_GEN_PRIME_FLAG_DH = 0x0001, /**< (X-1)/2 is prime too */ - MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR = 0x0002, /**< lower error rate from 2-80 to 2-128 */ -} mbedtls_mpi_gen_prime_flag_t; - -/** - * \brief Prime number generation - * - * \param X Destination MPI - * \param nbits Required size of X in bits - * ( 3 <= nbits <= MBEDTLS_MPI_MAX_BITS ) - * \param flags Mask of flags of type #mbedtls_mpi_gen_prime_flag_t - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful (probably prime), - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if nbits is < 3 - */ -int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int flags, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_mpi_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* bignum.h */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/check_config.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/check_config.h deleted file mode 100644 index 425e3ea58..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/check_config.h +++ /dev/null @@ -1,693 +0,0 @@ -/** - * \file check_config.h - * - * \brief Consistency checks for configuration options - */ -/* - * 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) - */ - -/* - * It is recommended to include this file from your config.h - * in order to catch dependency issues early. - */ - -#ifndef MBEDTLS_CHECK_CONFIG_H -#define MBEDTLS_CHECK_CONFIG_H - -/* - * We assume CHAR_BIT is 8 in many places. In practice, this is true on our - * target platforms, so not an issue, but let's just be extra sure. - */ -#include -#if CHAR_BIT != 8 -#error "mbed TLS requires a platform with 8-bit chars" -#endif - -#if defined(_WIN32) -#if !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_C is required on Windows" -#endif - -/* Fix the config here. Not convenient to put an #ifdef _WIN32 in config.h as - * it would confuse config.pl. */ -#if !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && \ - !defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) -#define MBEDTLS_PLATFORM_SNPRINTF_ALT -#endif -#endif /* _WIN32 */ - -#if defined(TARGET_LIKE_MBED) && \ - ( defined(MBEDTLS_NET_C) || defined(MBEDTLS_TIMING_C) ) -#error "The NET and TIMING modules are not available for mbed OS - please use the network and timing functions provided by mbed OS" -#endif - -#if defined(MBEDTLS_DEPRECATED_WARNING) && \ - !defined(__GNUC__) && !defined(__clang__) -#error "MBEDTLS_DEPRECATED_WARNING only works with GCC and Clang" -#endif - -#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_HAVE_TIME) -#error "MBEDTLS_HAVE_TIME_DATE without MBEDTLS_HAVE_TIME does not make sense" -#endif - -#if defined(MBEDTLS_AESNI_C) && !defined(MBEDTLS_HAVE_ASM) -#error "MBEDTLS_AESNI_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_AES_C) -#error "MBEDTLS_CTR_DRBG_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_DHM_C) && !defined(MBEDTLS_BIGNUM_C) -#error "MBEDTLS_DHM_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) && !defined(MBEDTLS_SSL_TRUNCATED_HMAC) -#error "MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_CMAC_C) && \ - !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_DES_C) -#error "MBEDTLS_CMAC_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_NIST_KW_C) && \ - ( !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_CIPHER_C) ) -#error "MBEDTLS_NIST_KW_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECDH_C) && !defined(MBEDTLS_ECP_C) -#error "MBEDTLS_ECDH_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECDSA_C) && \ - ( !defined(MBEDTLS_ECP_C) || \ - !defined(MBEDTLS_ASN1_PARSE_C) || \ - !defined(MBEDTLS_ASN1_WRITE_C) ) -#error "MBEDTLS_ECDSA_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECJPAKE_C) && \ - ( !defined(MBEDTLS_ECP_C) || !defined(MBEDTLS_MD_C) ) -#error "MBEDTLS_ECJPAKE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_RESTARTABLE) && \ - ( defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) || \ - defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) || \ - defined(MBEDTLS_ECDSA_SIGN_ALT) || \ - defined(MBEDTLS_ECDSA_VERIFY_ALT) || \ - defined(MBEDTLS_ECDSA_GENKEY_ALT) || \ - defined(MBEDTLS_ECP_ALT) ) -#error "MBEDTLS_ECP_RESTARTABLE defined, but it cannot coexist with an alternative ECP implementation" -#endif - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) && !defined(MBEDTLS_HMAC_DRBG_C) -#error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_C) && ( !defined(MBEDTLS_BIGNUM_C) || ( \ - !defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) ) ) -#error "MBEDTLS_ECP_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ENTROPY_C) && (!defined(MBEDTLS_SHA512_C) && \ - !defined(MBEDTLS_SHA256_C)) -#error "MBEDTLS_ENTROPY_C defined, but not all prerequisites" -#endif -#if defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_SHA512_C) && \ - defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 64) -#error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" -#endif -#if defined(MBEDTLS_ENTROPY_C) && \ - ( !defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_ENTROPY_FORCE_SHA256) ) \ - && defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 32) -#error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" -#endif -#if defined(MBEDTLS_ENTROPY_C) && \ - defined(MBEDTLS_ENTROPY_FORCE_SHA256) && !defined(MBEDTLS_SHA256_C) -#error "MBEDTLS_ENTROPY_FORCE_SHA256 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_TEST_NULL_ENTROPY) && \ - ( !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) ) -#error "MBEDTLS_TEST_NULL_ENTROPY defined, but not all prerequisites" -#endif -#if defined(MBEDTLS_TEST_NULL_ENTROPY) && \ - ( defined(MBEDTLS_ENTROPY_NV_SEED) || defined(MBEDTLS_ENTROPY_HARDWARE_ALT) || \ - defined(MBEDTLS_HAVEGE_C) ) -#error "MBEDTLS_TEST_NULL_ENTROPY defined, but entropy sources too" -#endif - -#if defined(MBEDTLS_GCM_C) && ( \ - !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_CAMELLIA_C) ) -#error "MBEDTLS_GCM_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) -#error "MBEDTLS_ECP_RANDOMIZE_JAC_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_ADD_MIXED_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) -#error "MBEDTLS_ECP_ADD_MIXED_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) -#error "MBEDTLS_ECP_DOUBLE_JAC_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) -#error "MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) -#error "MBEDTLS_ECP_NORMALIZE_JAC_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) -#error "MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) -#error "MBEDTLS_ECP_RANDOMIZE_MXZ_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) -#error "MBEDTLS_ECP_NORMALIZE_MXZ_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_HAVEGE_C) && !defined(MBEDTLS_TIMING_C) -#error "MBEDTLS_HAVEGE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_HKDF_C) && !defined(MBEDTLS_MD_C) -#error "MBEDTLS_HKDF_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_HMAC_DRBG_C) && !defined(MBEDTLS_MD_C) -#error "MBEDTLS_HMAC_DRBG_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) && !defined(MBEDTLS_DHM_C) -#error "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) && \ - !defined(MBEDTLS_ECDH_C) -#error "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ - ( !defined(MBEDTLS_DHM_C) || !defined(MBEDTLS_RSA_C) || \ - !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_RSA_C) || \ - !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_ECDSA_C) || \ - !defined(MBEDTLS_X509_CRT_PARSE_C) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \ - ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ - !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ - ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ - !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \ - ( !defined(MBEDTLS_ECJPAKE_C) || !defined(MBEDTLS_SHA256_C) || \ - !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) ) -#error "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) -#error "MBEDTLS_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PADLOCK_C) && !defined(MBEDTLS_HAVE_ASM) -#error "MBEDTLS_PADLOCK_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PEM_PARSE_C) && !defined(MBEDTLS_BASE64_C) -#error "MBEDTLS_PEM_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PEM_WRITE_C) && !defined(MBEDTLS_BASE64_C) -#error "MBEDTLS_PEM_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PK_C) && \ - ( !defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_ECP_C) ) -#error "MBEDTLS_PK_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_PK_C) -#error "MBEDTLS_PK_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PK_WRITE_C) && !defined(MBEDTLS_PK_C) -#error "MBEDTLS_PK_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PKCS11_C) && !defined(MBEDTLS_PK_C) -#error "MBEDTLS_PKCS11_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_EXIT_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_EXIT_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_EXIT_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_EXIT) ||\ - defined(MBEDTLS_PLATFORM_EXIT_ALT) ) -#error "MBEDTLS_PLATFORM_EXIT_MACRO and MBEDTLS_PLATFORM_STD_EXIT/MBEDTLS_PLATFORM_EXIT_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_TIME_ALT) &&\ - ( !defined(MBEDTLS_PLATFORM_C) ||\ - !defined(MBEDTLS_HAVE_TIME) ) -#error "MBEDTLS_PLATFORM_TIME_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\ - ( !defined(MBEDTLS_PLATFORM_C) ||\ - !defined(MBEDTLS_HAVE_TIME) ) -#error "MBEDTLS_PLATFORM_TIME_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ - ( !defined(MBEDTLS_PLATFORM_C) ||\ - !defined(MBEDTLS_HAVE_TIME) ) -#error "MBEDTLS_PLATFORM_TIME_TYPE_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\ - defined(MBEDTLS_PLATFORM_TIME_ALT) ) -#error "MBEDTLS_PLATFORM_TIME_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\ - defined(MBEDTLS_PLATFORM_TIME_ALT) ) -#error "MBEDTLS_PLATFORM_TIME_TYPE_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_FPRINTF_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_FPRINTF_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_FPRINTF) ||\ - defined(MBEDTLS_PLATFORM_FPRINTF_ALT) ) -#error "MBEDTLS_PLATFORM_FPRINTF_MACRO and MBEDTLS_PLATFORM_STD_FPRINTF/MBEDTLS_PLATFORM_FPRINTF_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) -#error "MBEDTLS_PLATFORM_FREE_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ - defined(MBEDTLS_PLATFORM_STD_FREE) -#error "MBEDTLS_PLATFORM_FREE_MACRO and MBEDTLS_PLATFORM_STD_FREE cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && !defined(MBEDTLS_PLATFORM_CALLOC_MACRO) -#error "MBEDTLS_PLATFORM_CALLOC_MACRO must be defined if MBEDTLS_PLATFORM_FREE_MACRO is" -#endif - -#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) -#error "MBEDTLS_PLATFORM_CALLOC_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ - defined(MBEDTLS_PLATFORM_STD_CALLOC) -#error "MBEDTLS_PLATFORM_CALLOC_MACRO and MBEDTLS_PLATFORM_STD_CALLOC cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && !defined(MBEDTLS_PLATFORM_FREE_MACRO) -#error "MBEDTLS_PLATFORM_FREE_MACRO must be defined if MBEDTLS_PLATFORM_CALLOC_MACRO is" -#endif - -#if defined(MBEDTLS_PLATFORM_MEMORY) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_MEMORY defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_PRINTF_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_PRINTF_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_PRINTF) ||\ - defined(MBEDTLS_PLATFORM_PRINTF_ALT) ) -#error "MBEDTLS_PLATFORM_PRINTF_MACRO and MBEDTLS_PLATFORM_STD_PRINTF/MBEDTLS_PLATFORM_PRINTF_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_SNPRINTF_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_SNPRINTF_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_SNPRINTF) ||\ - defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) ) -#error "MBEDTLS_PLATFORM_SNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_SNPRINTF/MBEDTLS_PLATFORM_SNPRINTF_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) &&\ - !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) -#error "MBEDTLS_PLATFORM_STD_MEM_HDR defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) -#error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) -#error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_FREE) && !defined(MBEDTLS_PLATFORM_MEMORY) -#error "MBEDTLS_PLATFORM_STD_FREE defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_EXIT) &&\ - !defined(MBEDTLS_PLATFORM_EXIT_ALT) -#error "MBEDTLS_PLATFORM_STD_EXIT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_TIME) &&\ - ( !defined(MBEDTLS_PLATFORM_TIME_ALT) ||\ - !defined(MBEDTLS_HAVE_TIME) ) -#error "MBEDTLS_PLATFORM_STD_TIME defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_FPRINTF) &&\ - !defined(MBEDTLS_PLATFORM_FPRINTF_ALT) -#error "MBEDTLS_PLATFORM_STD_FPRINTF defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_PRINTF) &&\ - !defined(MBEDTLS_PLATFORM_PRINTF_ALT) -#error "MBEDTLS_PLATFORM_STD_PRINTF defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_SNPRINTF) &&\ - !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) -#error "MBEDTLS_PLATFORM_STD_SNPRINTF defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ENTROPY_NV_SEED) &&\ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_ENTROPY_C) ) -#error "MBEDTLS_ENTROPY_NV_SEED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) &&\ - !defined(MBEDTLS_ENTROPY_NV_SEED) -#error "MBEDTLS_PLATFORM_NV_SEED_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) &&\ - !defined(MBEDTLS_PLATFORM_NV_SEED_ALT) -#error "MBEDTLS_PLATFORM_STD_NV_SEED_READ defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) &&\ - !defined(MBEDTLS_PLATFORM_NV_SEED_ALT) -#error "MBEDTLS_PLATFORM_STD_NV_SEED_WRITE defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) ||\ - defined(MBEDTLS_PLATFORM_NV_SEED_ALT) ) -#error "MBEDTLS_PLATFORM_NV_SEED_READ_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_READ cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) ||\ - defined(MBEDTLS_PLATFORM_NV_SEED_ALT) ) -#error "MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_WRITE cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ - !defined(MBEDTLS_OID_C) ) -#error "MBEDTLS_RSA_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_PKCS1_V21) && \ - !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_RSA_C defined, but none of the PKCS1 versions enabled" -#endif - -#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \ - ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_PKCS1_V21) ) -#error "MBEDTLS_X509_RSASSA_PSS_SUPPORT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_SSL3) && ( !defined(MBEDTLS_MD5_C) || \ - !defined(MBEDTLS_SHA1_C) ) -#error "MBEDTLS_SSL_PROTO_SSL3 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_TLS1) && ( !defined(MBEDTLS_MD5_C) || \ - !defined(MBEDTLS_SHA1_C) ) -#error "MBEDTLS_SSL_PROTO_TLS1 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_TLS1_1) && ( !defined(MBEDTLS_MD5_C) || \ - !defined(MBEDTLS_SHA1_C) ) -#error "MBEDTLS_SSL_PROTO_TLS1_1 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && ( !defined(MBEDTLS_SHA1_C) && \ - !defined(MBEDTLS_SHA256_C) && !defined(MBEDTLS_SHA512_C) ) -#error "MBEDTLS_SSL_PROTO_TLS1_2 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_DTLS) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2) -#error "MBEDTLS_SSL_PROTO_DTLS defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_CLI_C) && !defined(MBEDTLS_SSL_TLS_C) -#error "MBEDTLS_SSL_CLI_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && ( !defined(MBEDTLS_CIPHER_C) || \ - !defined(MBEDTLS_MD_C) ) -#error "MBEDTLS_SSL_TLS_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_SRV_C) && !defined(MBEDTLS_SSL_TLS_C) -#error "MBEDTLS_SSL_SRV_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (!defined(MBEDTLS_SSL_PROTO_SSL3) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1) && !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2)) -#error "MBEDTLS_SSL_TLS_C defined, but no protocols are active" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ - defined(MBEDTLS_SSL_PROTO_TLS1_1) && !defined(MBEDTLS_SSL_PROTO_TLS1)) -#error "Illegal protocol selection" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_TLS1) && \ - defined(MBEDTLS_SSL_PROTO_TLS1_2) && !defined(MBEDTLS_SSL_PROTO_TLS1_1)) -#error "Illegal protocol selection" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ - defined(MBEDTLS_SSL_PROTO_TLS1_2) && (!defined(MBEDTLS_SSL_PROTO_TLS1) || \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1))) -#error "Illegal protocol selection" -#endif - -#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && !defined(MBEDTLS_SSL_PROTO_DTLS) -#error "MBEDTLS_SSL_DTLS_HELLO_VERIFY defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && \ - !defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) -#error "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) && \ - ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) -#error "MBEDTLS_SSL_DTLS_ANTI_REPLAY defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ - ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) -#error "MBEDTLS_SSL_DTLS_BADMAC_LIMIT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2) -#error "MBEDTLS_SSL_ENCRYPT_THEN_MAC defined, but not all prerequsites" -#endif - -#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2) -#error "MBEDTLS_SSL_EXTENDED_MASTER_SECRET defined, but not all prerequsites" -#endif - -#if defined(MBEDTLS_SSL_TICKET_C) && !defined(MBEDTLS_CIPHER_C) -#error "MBEDTLS_SSL_TICKET_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) && \ - !defined(MBEDTLS_SSL_PROTO_SSL3) && !defined(MBEDTLS_SSL_PROTO_TLS1) -#error "MBEDTLS_SSL_CBC_RECORD_SPLITTING defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \ - !defined(MBEDTLS_X509_CRT_PARSE_C) -#error "MBEDTLS_SSL_SERVER_NAME_INDICATION defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_THREADING_PTHREAD) -#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) -#error "MBEDTLS_THREADING_PTHREAD defined, but not all prerequisites" -#endif -#define MBEDTLS_THREADING_IMPL -#endif - -#if defined(MBEDTLS_THREADING_ALT) -#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) -#error "MBEDTLS_THREADING_ALT defined, but not all prerequisites" -#endif -#define MBEDTLS_THREADING_IMPL -#endif - -#if defined(MBEDTLS_THREADING_C) && !defined(MBEDTLS_THREADING_IMPL) -#error "MBEDTLS_THREADING_C defined, single threading implementation required" -#endif -#undef MBEDTLS_THREADING_IMPL - -#if defined(MBEDTLS_VERSION_FEATURES) && !defined(MBEDTLS_VERSION_C) -#error "MBEDTLS_VERSION_FEATURES defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_USE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ - !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_PARSE_C) || \ - !defined(MBEDTLS_PK_PARSE_C) ) -#error "MBEDTLS_X509_USE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CREATE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ - !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_WRITE_C) || \ - !defined(MBEDTLS_PK_WRITE_C) ) -#error "MBEDTLS_X509_CREATE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) -#error "MBEDTLS_X509_CRT_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CRL_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) -#error "MBEDTLS_X509_CRL_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CSR_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) -#error "MBEDTLS_X509_CSR_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CRT_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) -#error "MBEDTLS_X509_CRT_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CSR_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) -#error "MBEDTLS_X509_CSR_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_HAVE_INT32) && defined(MBEDTLS_HAVE_INT64) -#error "MBEDTLS_HAVE_INT32 and MBEDTLS_HAVE_INT64 cannot be defined simultaneously" -#endif /* MBEDTLS_HAVE_INT32 && MBEDTLS_HAVE_INT64 */ - -#if ( defined(MBEDTLS_HAVE_INT32) || defined(MBEDTLS_HAVE_INT64) ) && \ - defined(MBEDTLS_HAVE_ASM) -#error "MBEDTLS_HAVE_INT32/MBEDTLS_HAVE_INT64 and MBEDTLS_HAVE_ASM cannot be defined simultaneously" -#endif /* (MBEDTLS_HAVE_INT32 || MBEDTLS_HAVE_INT64) && MBEDTLS_HAVE_ASM */ - -/* - * Avoid warning from -pedantic. This is a convenient place for this - * workaround since this is included by every single file before the - * #if defined(MBEDTLS_xxx_C) that results in emtpy translation units. - */ -typedef int mbedtls_iso_c_forbids_empty_translation_units; - -#endif /* MBEDTLS_CHECK_CONFIG_H */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/config.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/config.h deleted file mode 100644 index 2fa14ebc3..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/config.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (C) 2006-2015, 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 - -//#define MBEDTLS_PLATFORM_MEMORY -#define MBEDTLS_FS_IO -//#define MBEDTLS_VERSION_FEATURES -#define MBEDTLS_ASN1_PARSE_C -#define MBEDTLS_BASE64_C -#define MBEDTLS_BIGNUM_C -#define MBEDTLS_MD_C -#define MBEDTLS_OID_C -#define MBEDTLS_PEM_PARSE_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_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 - -//#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ -//#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ -//#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ - -#if defined(TARGET_LIKE_MBED) && defined(YOTTA_CFG_MBEDTLS_TARGET_CONFIG_FILE) -#include YOTTA_CFG_MBEDTLS_TARGET_CONFIG_FILE -#endif - -#if defined(YOTTA_CFG_MBEDTLS_USER_CONFIG_FILE) -#include YOTTA_CFG_MBEDTLS_USER_CONFIG_FILE -#elif defined(MBEDTLS_USER_CONFIG_FILE) -#include MBEDTLS_USER_CONFIG_FILE -#endif - -#include "check_config.h" - -#endif /* MBEDTLS_CONFIG_H */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/ecdsa.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/ecdsa.h deleted file mode 100644 index 4057828d4..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/ecdsa.h +++ /dev/null @@ -1,466 +0,0 @@ -/** - * \file ecdsa.h - * - * \brief This file contains ECDSA definitions and functions. - * - * The Elliptic Curve Digital Signature Algorithm (ECDSA) is defined in - * Standards for Efficient Cryptography Group (SECG): - * SEC1 Elliptic Curve Cryptography. - * The use of ECDSA for TLS is defined in RFC-4492: Elliptic Curve - * Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS). - * - */ -/* - * Copyright (C) 2006-2018, Arm Limited (or its affiliates), 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_ECDSA_H -#define MBEDTLS_ECDSA_H - -#include "ecp.h" -#include "md.h" - -/* - * RFC-4492 page 20: - * - * Ecdsa-Sig-Value ::= SEQUENCE { - * r INTEGER, - * s INTEGER - * } - * - * Size is at most - * 1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s, - * twice that + 1 (tag) + 2 (len) for the sequence - * (assuming ECP_MAX_BYTES is less than 126 for r and s, - * and less than 124 (total len <= 255) for the sequence) - */ -#if MBEDTLS_ECP_MAX_BYTES > 124 -#error "MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN" -#endif -/** The maximal size of an ECDSA signature in Bytes. */ -#define MBEDTLS_ECDSA_MAX_LEN ( 3 + 2 * ( 3 + MBEDTLS_ECP_MAX_BYTES ) ) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief The ECDSA context structure. - * - * \warning Performing multiple operations concurrently on the same - * ECDSA context is not supported; objects of this type - * should not be shared between multiple threads. - */ -typedef mbedtls_ecp_keypair mbedtls_ecdsa_context; - -#if defined(MBEDTLS_ECP_RESTARTABLE) - -/** - * \brief Internal restart context for ecdsa_verify() - * - * \note Opaque struct, defined in ecdsa.c - */ -typedef struct mbedtls_ecdsa_restart_ver mbedtls_ecdsa_restart_ver_ctx; - -/** - * \brief Internal restart context for ecdsa_sign() - * - * \note Opaque struct, defined in ecdsa.c - */ -typedef struct mbedtls_ecdsa_restart_sig mbedtls_ecdsa_restart_sig_ctx; - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) -/** - * \brief Internal restart context for ecdsa_sign_det() - * - * \note Opaque struct, defined in ecdsa.c - */ -typedef struct mbedtls_ecdsa_restart_det mbedtls_ecdsa_restart_det_ctx; -#endif - -/** - * \brief General context for resuming ECDSA operations - */ -typedef struct -{ - mbedtls_ecp_restart_ctx ecp; /*!< base context for ECP restart and - shared administrative info */ - mbedtls_ecdsa_restart_ver_ctx *ver; /*!< ecdsa_verify() sub-context */ - mbedtls_ecdsa_restart_sig_ctx *sig; /*!< ecdsa_sign() sub-context */ -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) - mbedtls_ecdsa_restart_det_ctx *det; /*!< ecdsa_sign_det() sub-context */ -#endif -} mbedtls_ecdsa_restart_ctx; - -#else /* MBEDTLS_ECP_RESTARTABLE */ - -/* Now we can declare functions that take a pointer to that */ -typedef void mbedtls_ecdsa_restart_ctx; - -#endif /* MBEDTLS_ECP_RESTARTABLE */ - -/** - * \brief This function computes the ECDSA signature of a - * previously-hashed message. - * - * \note The deterministic version is usually preferred. - * - * \note If the bitlength of the message hash is larger than the - * bitlength of the group order, then the hash is truncated - * as defined in Standards for Efficient Cryptography Group - * (SECG): SEC1 Elliptic Curve Cryptography, section - * 4.1.3, step 5. - * - * \see ecp.h - * - * \param grp The ECP group. - * \param r The first output integer. - * \param s The second output integer. - * \param d The private signing key. - * \param buf The message hash. - * \param blen The length of \p buf. - * \param f_rng The RNG function. - * \param p_rng The RNG context. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX - * or \c MBEDTLS_MPI_XXX error code on failure. - */ -int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, - const mbedtls_mpi *d, const unsigned char *buf, size_t blen, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) -/** - * \brief This function computes the ECDSA signature of a - * previously-hashed message, deterministic version. - * - * For more information, see RFC-6979: Deterministic - * Usage of the Digital Signature Algorithm (DSA) and Elliptic - * Curve Digital Signature Algorithm (ECDSA). - * - * \note If the bitlength of the message hash is larger than the - * bitlength of the group order, then the hash is truncated as - * defined in Standards for Efficient Cryptography Group - * (SECG): SEC1 Elliptic Curve Cryptography, section - * 4.1.3, step 5. - * - * \see ecp.h - * - * \param grp The ECP group. - * \param r The first output integer. - * \param s The second output integer. - * \param d The private signing key. - * \param buf The message hash. - * \param blen The length of \p buf. - * \param md_alg The MD algorithm used to hash the message. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX - * error code on failure. - */ -int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, - const mbedtls_mpi *d, const unsigned char *buf, size_t blen, - mbedtls_md_type_t md_alg ); -#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ - -/** - * \brief This function verifies the ECDSA signature of a - * previously-hashed message. - * - * \note If the bitlength of the message hash is larger than the - * bitlength of the group order, then the hash is truncated as - * defined in Standards for Efficient Cryptography Group - * (SECG): SEC1 Elliptic Curve Cryptography, section - * 4.1.4, step 3. - * - * \see ecp.h - * - * \param grp The ECP group. - * \param buf The message hash. - * \param blen The length of \p buf. - * \param Q The public key to use for verification. - * \param r The first integer of the signature. - * \param s The second integer of the signature. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the signature - * is invalid. - * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX - * error code on failure for any other reason. - */ -int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp, - const unsigned char *buf, size_t blen, - const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s); - -/** - * \brief This function computes the ECDSA signature and writes it - * to a buffer, serialized as defined in RFC-4492: - * Elliptic Curve Cryptography (ECC) Cipher Suites for - * Transport Layer Security (TLS). - * - * \warning It is not thread-safe to use the same context in - * multiple threads. - * - * \note The deterministic version is used if - * #MBEDTLS_ECDSA_DETERMINISTIC is defined. For more - * information, see RFC-6979: Deterministic Usage - * of the Digital Signature Algorithm (DSA) and Elliptic - * Curve Digital Signature Algorithm (ECDSA). - * - * \note The \p sig buffer must be at least twice as large as the - * size of the curve used, plus 9. For example, 73 Bytes if - * a 256-bit curve is used. A buffer length of - * #MBEDTLS_ECDSA_MAX_LEN is always safe. - * - * \note If the bitlength of the message hash is larger than the - * bitlength of the group order, then the hash is truncated as - * defined in Standards for Efficient Cryptography Group - * (SECG): SEC1 Elliptic Curve Cryptography, section - * 4.1.3, step 5. - * - * \see ecp.h - * - * \param ctx The ECDSA context. - * \param md_alg The message digest that was used to hash the message. - * \param hash The message hash. - * \param hlen The length of the hash. - * \param sig The buffer that holds the signature. - * \param slen The length of the signature written. - * \param f_rng The RNG function. - * \param p_rng The RNG context. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or - * \c MBEDTLS_ERR_ASN1_XXX error code on failure. - */ -int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hlen, - unsigned char *sig, size_t *slen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief This function computes the ECDSA signature and writes it - * to a buffer, in a restartable way. - * - * \see \c mbedtls_ecdsa_write_signature() - * - * \note This function is like \c mbedtls_ecdsa_write_signature() - * but it can return early and restart according to the limit - * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. - * - * \param ctx The ECDSA context. - * \param md_alg The message digest that was used to hash the message. - * \param hash The message hash. - * \param hlen The length of the hash. - * \param sig The buffer that holds the signature. - * \param slen The length of the signature written. - * \param f_rng The RNG function. - * \param p_rng The RNG context. - * \param rs_ctx The restart context (NULL disables restart). - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of - * operations was reached: see \c mbedtls_ecp_set_max_ops(). - * \return Another \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or - * \c MBEDTLS_ERR_ASN1_XXX error code on failure. - */ -int mbedtls_ecdsa_write_signature_restartable( mbedtls_ecdsa_context *ctx, - mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hlen, - unsigned char *sig, size_t *slen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - mbedtls_ecdsa_restart_ctx *rs_ctx ); - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) -#if ! defined(MBEDTLS_DEPRECATED_REMOVED) -#if defined(MBEDTLS_DEPRECATED_WARNING) -#define MBEDTLS_DEPRECATED __attribute__((deprecated)) -#else -#define MBEDTLS_DEPRECATED -#endif -/** - * \brief This function computes an ECDSA signature and writes - * it to a buffer, serialized as defined in RFC-4492: - * Elliptic Curve Cryptography (ECC) Cipher Suites for - * Transport Layer Security (TLS). - * - * The deterministic version is defined in RFC-6979: - * Deterministic Usage of the Digital Signature Algorithm (DSA) - * and Elliptic Curve Digital Signature Algorithm (ECDSA). - * - * \warning It is not thread-safe to use the same context in - * multiple threads. - * - * \note The \p sig buffer must be at least twice as large as the - * size of the curve used, plus 9. For example, 73 Bytes if a - * 256-bit curve is used. A buffer length of - * #MBEDTLS_ECDSA_MAX_LEN is always safe. - * - * \note If the bitlength of the message hash is larger than the - * bitlength of the group order, then the hash is truncated as - * defined in Standards for Efficient Cryptography Group - * (SECG): SEC1 Elliptic Curve Cryptography, section - * 4.1.3, step 5. - * - * \see ecp.h - * - * \deprecated Superseded by mbedtls_ecdsa_write_signature() in - * Mbed TLS version 2.0 and later. - * - * \param ctx The ECDSA context. - * \param hash The message hash. - * \param hlen The length of the hash. - * \param sig The buffer that holds the signature. - * \param slen The length of the signature written. - * \param md_alg The MD algorithm used to hash the message. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or - * \c MBEDTLS_ERR_ASN1_XXX error code on failure. - */ -int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx, - const unsigned char *hash, size_t hlen, - unsigned char *sig, size_t *slen, - mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED; -#undef MBEDTLS_DEPRECATED -#endif /* MBEDTLS_DEPRECATED_REMOVED */ -#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ - -/** - * \brief This function reads and verifies an ECDSA signature. - * - * \note If the bitlength of the message hash is larger than the - * bitlength of the group order, then the hash is truncated as - * defined in Standards for Efficient Cryptography Group - * (SECG): SEC1 Elliptic Curve Cryptography, section - * 4.1.4, step 3. - * - * \see ecp.h - * - * \param ctx The ECDSA context. - * \param hash The message hash. - * \param hlen The size of the hash. - * \param sig The signature to read and verify. - * \param slen The size of \p sig. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid. - * \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid - * signature in \p sig, but its length is less than \p siglen. - * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX - * error code on failure for any other reason. - */ -int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx, - const unsigned char *hash, size_t hlen, - const unsigned char *sig, size_t slen ); - -/** - * \brief This function reads and verifies an ECDSA signature, - * in a restartable way. - * - * \see \c mbedtls_ecdsa_read_signature() - * - * \note This function is like \c mbedtls_ecdsa_read_signature() - * but it can return early and restart according to the limit - * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. - * - * \param ctx The ECDSA context. - * \param hash The message hash. - * \param hlen The size of the hash. - * \param sig The signature to read and verify. - * \param slen The size of \p sig. - * \param rs_ctx The restart context (NULL disables restart). - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid. - * \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid - * signature in \p sig, but its length is less than \p siglen. - * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of - * operations was reached: see \c mbedtls_ecp_set_max_ops(). - * \return Another \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX - * error code on failure for any other reason. - */ -int mbedtls_ecdsa_read_signature_restartable( mbedtls_ecdsa_context *ctx, - const unsigned char *hash, size_t hlen, - const unsigned char *sig, size_t slen, - mbedtls_ecdsa_restart_ctx *rs_ctx ); - -/** - * \brief This function generates an ECDSA keypair on the given curve. - * - * \see ecp.h - * - * \param ctx The ECDSA context to store the keypair in. - * \param gid The elliptic curve to use. One of the various - * \c MBEDTLS_ECP_DP_XXX macros depending on configuration. - * \param f_rng The RNG function. - * \param p_rng The RNG context. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX code on failure. - */ -int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief This function sets an ECDSA context from an EC key pair. - * - * \see ecp.h - * - * \param ctx The ECDSA context to set. - * \param key The EC key to use. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX code on failure. - */ -int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key ); - -/** - * \brief This function initializes an ECDSA context. - * - * \param ctx The ECDSA context to initialize. - */ -void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx ); - -/** - * \brief This function frees an ECDSA context. - * - * \param ctx The ECDSA context to free. - */ -void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx ); - -#if defined(MBEDTLS_ECP_RESTARTABLE) -/** - * \brief Initialize a restart context - */ -void mbedtls_ecdsa_restart_init( mbedtls_ecdsa_restart_ctx *ctx ); - -/** - * \brief Free the components of a restart context - */ -void mbedtls_ecdsa_restart_free( mbedtls_ecdsa_restart_ctx *ctx ); -#endif /* MBEDTLS_ECP_RESTARTABLE */ - -#ifdef __cplusplus -} -#endif - -#endif /* ecdsa.h */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/ecp.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/ecp.h deleted file mode 100644 index 2fb1af49a..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/ecp.h +++ /dev/null @@ -1,993 +0,0 @@ -/** - * \file ecp.h - * - * \brief This file provides an API for Elliptic Curves over GF(P) (ECP). - * - * The use of ECP in cryptography and TLS is defined in - * Standards for Efficient Cryptography Group (SECG): SEC1 - * Elliptic Curve Cryptography and - * RFC-4492: Elliptic Curve Cryptography (ECC) Cipher Suites - * for Transport Layer Security (TLS). - * - * RFC-2409: The Internet Key Exchange (IKE) defines ECP - * group types. - * - */ - -/* - * Copyright (C) 2006-2018, Arm Limited (or its affiliates), 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_ECP_H -#define MBEDTLS_ECP_H - -#include "bignum.h" - -/* - * ECP error codes - */ -#define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 /**< The buffer is too small to write to. */ -#define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 /**< The requested feature is not available, for example, the requested curve is not supported. */ -#define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00 /**< The signature is not valid. */ -#define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80 /**< Memory allocation failed. */ -#define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00 /**< Generation of random value, such as ephemeral key, failed. */ -#define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80 /**< Invalid private or public key. */ -#define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 /**< The buffer contains a valid signature followed by more data. */ - -/* MBEDTLS_ERR_ECP_HW_ACCEL_FAILED is deprecated and should not be used. */ -#define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80 /**< The ECP hardware accelerator failed. */ - -#define MBEDTLS_ERR_ECP_IN_PROGRESS -0x4B00 /**< Operation in progress, call again with the same parameters to continue. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Domain-parameter identifiers: curve, subgroup, and generator. - * - * \note Only curves over prime fields are supported. - * - * \warning This library does not support validation of arbitrary domain - * parameters. Therefore, only standardized domain parameters from trusted - * sources should be used. See mbedtls_ecp_group_load(). - */ -typedef enum -{ - MBEDTLS_ECP_DP_NONE = 0, /*!< Curve not defined. */ - MBEDTLS_ECP_DP_SECP192R1, /*!< Domain parameters for the 192-bit curve defined by FIPS 186-4 and SEC1. */ - MBEDTLS_ECP_DP_SECP224R1, /*!< Domain parameters for the 224-bit curve defined by FIPS 186-4 and SEC1. */ - MBEDTLS_ECP_DP_SECP256R1, /*!< Domain parameters for the 256-bit curve defined by FIPS 186-4 and SEC1. */ - MBEDTLS_ECP_DP_SECP384R1, /*!< Domain parameters for the 384-bit curve defined by FIPS 186-4 and SEC1. */ - MBEDTLS_ECP_DP_SECP521R1, /*!< Domain parameters for the 521-bit curve defined by FIPS 186-4 and SEC1. */ - MBEDTLS_ECP_DP_BP256R1, /*!< Domain parameters for 256-bit Brainpool curve. */ - MBEDTLS_ECP_DP_BP384R1, /*!< Domain parameters for 384-bit Brainpool curve. */ - MBEDTLS_ECP_DP_BP512R1, /*!< Domain parameters for 512-bit Brainpool curve. */ - MBEDTLS_ECP_DP_CURVE25519, /*!< Domain parameters for Curve25519. */ - MBEDTLS_ECP_DP_SECP192K1, /*!< Domain parameters for 192-bit "Koblitz" curve. */ - MBEDTLS_ECP_DP_SECP224K1, /*!< Domain parameters for 224-bit "Koblitz" curve. */ - MBEDTLS_ECP_DP_SECP256K1, /*!< Domain parameters for 256-bit "Koblitz" curve. */ - MBEDTLS_ECP_DP_CURVE448, /*!< Domain parameters for Curve448. */ -} mbedtls_ecp_group_id; - -/** - * The number of supported curves, plus one for #MBEDTLS_ECP_DP_NONE. - * - * \note Montgomery curves are currently excluded. - */ -#define MBEDTLS_ECP_DP_MAX 12 - -/** - * Curve information, for use by other modules. - */ -typedef struct mbedtls_ecp_curve_info -{ - mbedtls_ecp_group_id grp_id; /*!< An internal identifier. */ - uint16_t tls_id; /*!< The TLS NamedCurve identifier. */ - uint16_t bit_size; /*!< The curve size in bits. */ - const char *name; /*!< A human-friendly name. */ -} mbedtls_ecp_curve_info; - -/** - * \brief The ECP point structure, in Jacobian coordinates. - * - * \note All functions expect and return points satisfying - * the following condition: Z == 0 or - * Z == 1. Other values of \p Z are - * used only by internal functions. - * The point is zero, or "at infinity", if Z == 0. - * Otherwise, \p X and \p Y are its standard (affine) - * coordinates. - */ -typedef struct mbedtls_ecp_point -{ - mbedtls_mpi X; /*!< The X coordinate of the ECP point. */ - mbedtls_mpi Y; /*!< The Y coordinate of the ECP point. */ - mbedtls_mpi Z; /*!< The Z coordinate of the ECP point. */ -} -mbedtls_ecp_point; - -#if !defined(MBEDTLS_ECP_ALT) -/* - * default mbed TLS elliptic curve arithmetic implementation - * - * (in case MBEDTLS_ECP_ALT is defined then the developer has to provide an - * alternative implementation for the whole module and it will replace this - * one.) - */ - -/** - * \brief The ECP group structure. - * - * We consider two types of curve equations: - *
  • Short Weierstrass: y^2 = x^3 + A x + B mod P - * (SEC1 + RFC-4492)
  • - *
  • Montgomery: y^2 = x^3 + A x^2 + x mod P (Curve25519, - * Curve448)
- * In both cases, the generator (\p G) for a prime-order subgroup is fixed. - * - * For Short Weierstrass, this subgroup is the whole curve, and its - * cardinality is denoted by \p N. Our code requires that \p N is an - * odd prime as mbedtls_ecp_mul() requires an odd number, and - * mbedtls_ecdsa_sign() requires that it is prime for blinding purposes. - * - * For Montgomery curves, we do not store \p A, but (A + 2) / 4, - * which is the quantity used in the formulas. Additionally, \p nbits is - * not the size of \p N but the required size for private keys. - * - * If \p modp is NULL, reduction modulo \p P is done using a generic algorithm. - * Otherwise, \p modp must point to a function that takes an \p mbedtls_mpi in the - * range of 0..2^(2*pbits)-1, and transforms it in-place to an integer - * which is congruent mod \p P to the given MPI, and is close enough to \p pbits - * in size, so that it may be efficiently brought in the 0..P-1 range by a few - * additions or subtractions. Therefore, it is only an approximative modular - * reduction. It must return 0 on success and non-zero on failure. - * - */ -typedef struct mbedtls_ecp_group -{ - mbedtls_ecp_group_id id; /*!< An internal group identifier. */ - mbedtls_mpi P; /*!< The prime modulus of the base field. */ - mbedtls_mpi A; /*!< For Short Weierstrass: \p A in the equation. For - Montgomery curves: (A + 2) / 4. */ - mbedtls_mpi B; /*!< For Short Weierstrass: \p B in the equation. - For Montgomery curves: unused. */ - mbedtls_ecp_point G; /*!< The generator of the subgroup used. */ - mbedtls_mpi N; /*!< The order of \p G. */ - size_t pbits; /*!< The number of bits in \p P.*/ - size_t nbits; /*!< For Short Weierstrass: The number of bits in \p P. - For Montgomery curves: the number of bits in the - private keys. */ - unsigned int h; /*!< \internal 1 if the constants are static. */ - int (*modp)(mbedtls_mpi *); /*!< The function for fast pseudo-reduction - mod \p P (see above).*/ - int (*t_pre)(mbedtls_ecp_point *, void *); /*!< Unused. */ - int (*t_post)(mbedtls_ecp_point *, void *); /*!< Unused. */ - void *t_data; /*!< Unused. */ - mbedtls_ecp_point *T; /*!< Pre-computed points for ecp_mul_comb(). */ - size_t T_size; /*!< The number of pre-computed points. */ -} -mbedtls_ecp_group; - -#if defined(MBEDTLS_ECP_RESTARTABLE) - -/** - * \brief Internal restart context for multiplication - * - * \note Opaque struct - */ -typedef struct mbedtls_ecp_restart_mul mbedtls_ecp_restart_mul_ctx; - -/** - * \brief Internal restart context for ecp_muladd() - * - * \note Opaque struct - */ -typedef struct mbedtls_ecp_restart_muladd mbedtls_ecp_restart_muladd_ctx; - -/** - * \brief General context for resuming ECC operations - */ -typedef struct -{ - unsigned ops_done; /*!< current ops count */ - unsigned depth; /*!< call depth (0 = top-level) */ - mbedtls_ecp_restart_mul_ctx *rsm; /*!< ecp_mul_comb() sub-context */ - mbedtls_ecp_restart_muladd_ctx *ma; /*!< ecp_muladd() sub-context */ -} mbedtls_ecp_restart_ctx; - -/* - * Operation counts for restartable functions - */ -#define MBEDTLS_ECP_OPS_CHK 3 /*!< basic ops count for ecp_check_pubkey() */ -#define MBEDTLS_ECP_OPS_DBL 8 /*!< basic ops count for ecp_double_jac() */ -#define MBEDTLS_ECP_OPS_ADD 11 /*!< basic ops count for see ecp_add_mixed() */ -#define MBEDTLS_ECP_OPS_INV 120 /*!< empirical equivalent for mpi_mod_inv() */ - -/** - * \brief Internal; for restartable functions in other modules. - * Check and update basic ops budget. - * - * \param grp Group structure - * \param rs_ctx Restart context - * \param ops Number of basic ops to do - * - * \return \c 0 if doing \p ops basic ops is still allowed, - * \return #MBEDTLS_ERR_ECP_IN_PROGRESS otherwise. - */ -int mbedtls_ecp_check_budget( const mbedtls_ecp_group *grp, - mbedtls_ecp_restart_ctx *rs_ctx, - unsigned ops ); - -/* Utility macro for checking and updating ops budget */ -#define MBEDTLS_ECP_BUDGET( ops ) \ - MBEDTLS_MPI_CHK( mbedtls_ecp_check_budget( grp, rs_ctx, \ - (unsigned) (ops) ) ); - -#else /* MBEDTLS_ECP_RESTARTABLE */ - -#define MBEDTLS_ECP_BUDGET( ops ) /* no-op; for compatibility */ - -/* We want to declare restartable versions of existing functions anyway */ -typedef void mbedtls_ecp_restart_ctx; - -#endif /* MBEDTLS_ECP_RESTARTABLE */ - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h, or define them using the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_ECP_MAX_BITS) -/** - * The maximum size of the groups, that is, of \c N and \c P. - */ -#define MBEDTLS_ECP_MAX_BITS 521 /**< The maximum size of groups, in bits. */ -#endif - -#define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 ) -#define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 ) - -#if !defined(MBEDTLS_ECP_WINDOW_SIZE) -/* - * Maximum "window" size used for point multiplication. - * Default: 6. - * Minimum value: 2. Maximum value: 7. - * - * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) - * points used for point multiplication. This value is directly tied to EC - * peak memory usage, so decreasing it by one should roughly cut memory usage - * by two (if large curves are in use). - * - * Reduction in size may reduce speed, but larger curves are impacted first. - * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1): - * w-size: 6 5 4 3 2 - * 521 145 141 135 120 97 - * 384 214 209 198 177 146 - * 256 320 320 303 262 226 - * 224 475 475 453 398 342 - * 192 640 640 633 587 476 - */ -#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< The maximum window size used. */ -#endif /* MBEDTLS_ECP_WINDOW_SIZE */ - -#if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM) -/* - * Trade memory for speed on fixed-point multiplication. - * - * This speeds up repeated multiplication of the generator (that is, the - * multiplication in ECDSA signatures, and half of the multiplications in - * ECDSA verification and ECDHE) by a factor roughly 3 to 4. - * - * The cost is increasing EC peak memory usage by a factor roughly 2. - * - * Change this value to 0 to reduce peak memory usage. - */ -#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up. */ -#endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */ - -/* \} name SECTION: Module settings */ - -#else /* MBEDTLS_ECP_ALT */ -#include "ecp_alt.h" -#endif /* MBEDTLS_ECP_ALT */ - -/** - * \brief The ECP key-pair structure. - * - * A generic key-pair that may be used for ECDSA and fixed ECDH, for example. - * - * \note Members are deliberately in the same order as in the - * ::mbedtls_ecdsa_context structure. - */ -typedef struct mbedtls_ecp_keypair -{ - mbedtls_ecp_group grp; /*!< Elliptic curve and base point */ - mbedtls_mpi d; /*!< our secret value */ - mbedtls_ecp_point Q; /*!< our public value */ -} -mbedtls_ecp_keypair; - -/* - * Point formats, from RFC 4492's enum ECPointFormat - */ -#define MBEDTLS_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format. */ -#define MBEDTLS_ECP_PF_COMPRESSED 1 /**< Compressed point format. */ - -/* - * Some other constants from RFC 4492 - */ -#define MBEDTLS_ECP_TLS_NAMED_CURVE 3 /**< The named_curve of ECCurveType. */ - -#if defined(MBEDTLS_ECP_RESTARTABLE) -/** - * \brief Set the maximum number of basic operations done in a row. - * - * If more operations are needed to complete a computation, - * #MBEDTLS_ERR_ECP_IN_PROGRESS will be returned by the - * function performing the computation. It is then the - * caller's responsibility to either call again with the same - * parameters until it returns 0 or an error code; or to free - * the restart context if the operation is to be aborted. - * - * It is strictly required that all input parameters and the - * restart context be the same on successive calls for the - * same operation, but output parameters need not be the - * same; they must not be used until the function finally - * returns 0. - * - * This only applies to functions whose documentation - * mentions they may return #MBEDTLS_ERR_ECP_IN_PROGRESS (or - * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS for functions in the - * SSL module). For functions that accept a "restart context" - * argument, passing NULL disables restart and makes the - * function equivalent to the function with the same name - * with \c _restartable removed. For functions in the ECDH - * module, restart is disabled unless the function accepts - * an "ECDH context" argument and - * mbedtls_ecdh_enable_restart() was previously called on - * that context. For function in the SSL module, restart is - * only enabled for specific sides and key exchanges - * (currently only for clients and ECDHE-ECDSA). - * - * \param max_ops Maximum number of basic operations done in a row. - * Default: 0 (unlimited). - * Lower (non-zero) values mean ECC functions will block for - * a lesser maximum amount of time. - * - * \note A "basic operation" is defined as a rough equivalent of a - * multiplication in GF(p) for the NIST P-256 curve. - * As an indication, with default settings, a scalar - * multiplication (full run of \c mbedtls_ecp_mul()) is: - * - about 3300 basic operations for P-256 - * - about 9400 basic operations for P-384 - * - * \note Very low values are not always respected: sometimes - * functions need to block for a minimum number of - * operations, and will do so even if max_ops is set to a - * lower value. That minimum depends on the curve size, and - * can be made lower by decreasing the value of - * \c MBEDTLS_ECP_WINDOW_SIZE. As an indication, here is the - * lowest effective value for various curves and values of - * that parameter (w for short): - * w=6 w=5 w=4 w=3 w=2 - * P-256 208 208 160 136 124 - * P-384 682 416 320 272 248 - * P-521 1364 832 640 544 496 - * - * \note This setting is currently ignored by Curve25519. - */ -void mbedtls_ecp_set_max_ops( unsigned max_ops ); - -/** - * \brief Check if restart is enabled (max_ops != 0) - * - * \return \c 0 if \c max_ops == 0 (restart disabled) - * \return \c 1 otherwise (restart enabled) - */ -int mbedtls_ecp_restart_is_enabled( void ); -#endif /* MBEDTLS_ECP_RESTARTABLE */ - -/** - * \brief This function retrieves the information defined in - * mbedtls_ecp_curve_info() for all supported curves in order - * of preference. - * - * \return A statically allocated array. The last entry is 0. - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void ); - -/** - * \brief This function retrieves the list of internal group - * identifiers of all supported curves in the order of - * preference. - * - * \return A statically allocated array, - * terminated with MBEDTLS_ECP_DP_NONE. - */ -const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void ); - -/** - * \brief This function retrieves curve information from an internal - * group identifier. - * - * \param grp_id An \c MBEDTLS_ECP_DP_XXX value. - * - * \return The associated curve information on success. - * \return NULL on failure. - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id ); - -/** - * \brief This function retrieves curve information from a TLS - * NamedCurve value. - * - * \param tls_id An \c MBEDTLS_ECP_DP_XXX value. - * - * \return The associated curve information on success. - * \return NULL on failure. - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id ); - -/** - * \brief This function retrieves curve information from a - * human-readable name. - * - * \param name The human-readable name. - * - * \return The associated curve information on success. - * \return NULL on failure. - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name ); - -/** - * \brief This function initializes a point as zero. - * - * \param pt The point to initialize. - */ -void mbedtls_ecp_point_init( mbedtls_ecp_point *pt ); - -/** - * \brief This function initializes an ECP group context - * without loading any domain parameters. - * - * \note After this function is called, domain parameters - * for various ECP groups can be loaded through the - * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group() - * functions. - */ -void mbedtls_ecp_group_init( mbedtls_ecp_group *grp ); - -/** - * \brief This function initializes a key pair as an invalid one. - * - * \param key The key pair to initialize. - */ -void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key ); - -/** - * \brief This function frees the components of a point. - * - * \param pt The point to free. - */ -void mbedtls_ecp_point_free( mbedtls_ecp_point *pt ); - -/** - * \brief This function frees the components of an ECP group. - * \param grp The group to free. - */ -void mbedtls_ecp_group_free( mbedtls_ecp_group *grp ); - -/** - * \brief This function frees the components of a key pair. - * \param key The key pair to free. - */ -void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key ); - -#if defined(MBEDTLS_ECP_RESTARTABLE) -/** - * \brief Initialize a restart context - */ -void mbedtls_ecp_restart_init( mbedtls_ecp_restart_ctx *ctx ); - -/** - * \brief Free the components of a restart context - */ -void mbedtls_ecp_restart_free( mbedtls_ecp_restart_ctx *ctx ); -#endif /* MBEDTLS_ECP_RESTARTABLE */ - -/** - * \brief This function copies the contents of point \p Q into - * point \p P. - * - * \param P The destination point. - * \param Q The source point. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. - */ -int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ); - -/** - * \brief This function copies the contents of group \p src into - * group \p dst. - * - * \param dst The destination group. - * \param src The source group. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. - */ -int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src ); - -/** - * \brief This function sets a point to zero. - * - * \param pt The point to set. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. - */ -int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt ); - -/** - * \brief This function checks if a point is zero. - * - * \param pt The point to test. - * - * \return \c 1 if the point is zero. - * \return \c 0 if the point is non-zero. - */ -int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt ); - -/** - * \brief This function compares two points. - * - * \note This assumes that the points are normalized. Otherwise, - * they may compare as "not equal" even if they are. - * - * \param P The first point to compare. - * \param Q The second point to compare. - * - * \return \c 0 if the points are equal. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the points are not equal. - */ -int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P, - const mbedtls_ecp_point *Q ); - -/** - * \brief This function imports a non-zero point from two ASCII - * strings. - * - * \param P The destination point. - * \param radix The numeric base of the input. - * \param x The first affine coordinate, as a null-terminated string. - * \param y The second affine coordinate, as a null-terminated string. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_MPI_XXX error code on failure. - */ -int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix, - const char *x, const char *y ); - -/** - * \brief This function exports a point into unsigned binary data. - * - * \param grp The group to which the point should belong. - * \param P The point to export. - * \param format The point format. Should be an \c MBEDTLS_ECP_PF_XXX macro. - * \param olen The length of the output. - * \param buf The output buffer. - * \param buflen The length of the output buffer. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA - * or #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL on failure. - */ -int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P, - int format, size_t *olen, - unsigned char *buf, size_t buflen ); - -/** - * \brief This function imports a point from unsigned binary data. - * - * \note This function does not check that the point actually - * belongs to the given group, see mbedtls_ecp_check_pubkey() - * for that. - * - * \param grp The group to which the point should belong. - * \param P The point to import. - * \param buf The input buffer. - * \param ilen The length of the input. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. - * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. - * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format - * is not implemented. - * - */ -int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, - const unsigned char *buf, size_t ilen ); - -/** - * \brief This function imports a point from a TLS ECPoint record. - * - * \note On function return, \p buf is updated to point to immediately - * after the ECPoint record. - * - * \param grp The ECP group used. - * \param pt The destination point. - * \param buf The address of the pointer to the start of the input buffer. - * \param len The length of the buffer. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization failure. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. - */ -int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, - const unsigned char **buf, size_t len ); - -/** - * \brief This function exports a point as a TLS ECPoint record. - * - * \param grp The ECP group used. - * \param pt The point format to export to. The point format is an - * \c MBEDTLS_ECP_PF_XXX constant. - * \param format The export format. - * \param olen The length of the data written. - * \param buf The buffer to write to. - * \param blen The length of the buffer. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA or - * #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL on failure. - */ -int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt, - int format, size_t *olen, - unsigned char *buf, size_t blen ); - -/** - * \brief This function sets a group using standardized domain parameters. - * - * \note The index should be a value of the NamedCurve enum, - * as defined in RFC-4492: Elliptic Curve Cryptography - * (ECC) Cipher Suites for Transport Layer Security (TLS), - * usually in the form of an \c MBEDTLS_ECP_DP_XXX macro. - * - * \param grp The destination group. - * \param id The identifier of the domain parameter set to load. - * - * \return \c 0 on success, - * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization failure. - * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE for unkownn groups. - - */ -int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id ); - -/** - * \brief This function sets a group from a TLS ECParameters record. - * - * \note \p buf is updated to point right after the ECParameters record - * on exit. - * - * \param grp The destination group. - * \param buf The address of the pointer to the start of the input buffer. - * \param len The length of the buffer. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization failure. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. - */ -int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len ); - -/** - * \brief This function writes the TLS ECParameters record for a group. - * - * \param grp The ECP group used. - * \param olen The number of Bytes written. - * \param buf The buffer to write to. - * \param blen The length of the buffer. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL on failure. - */ -int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen, - unsigned char *buf, size_t blen ); - -/** - * \brief This function performs multiplication of a point by - * an integer: \p R = \p m * \p P. - * - * It is not thread-safe to use same group in multiple threads. - * - * \note To prevent timing attacks, this function - * executes the exact same sequence of base-field - * operations for any valid \p m. It avoids any if-branch or - * array index depending on the value of \p m. - * - * \note If \p f_rng is not NULL, it is used to randomize - * intermediate results to prevent potential timing attacks - * targeting these results. We recommend always providing - * a non-NULL \p f_rng. The overhead is negligible. - * - * \param grp The ECP group. - * \param R The destination point. - * \param m The integer by which to multiply. - * \param P The point to multiply. - * \param f_rng The RNG function. - * \param p_rng The RNG context. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private - * key, or \p P is not a valid public key. - * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. - */ -int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, - const mbedtls_mpi *m, const mbedtls_ecp_point *P, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief This function performs multiplication of a point by - * an integer: \p R = \p m * \p P in a restartable way. - * - * \see mbedtls_ecp_mul() - * - * \note This function does the same as \c mbedtls_ecp_mul(), but - * it can return early and restart according to the limit set - * with \c mbedtls_ecp_set_max_ops() to reduce blocking. - * - * \param grp The ECP group. - * \param R The destination point. - * \param m The integer by which to multiply. - * \param P The point to multiply. - * \param f_rng The RNG function. - * \param p_rng The RNG context. - * \param rs_ctx The restart context (NULL disables restart). - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private - * key, or \p P is not a valid public key. - * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. - * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of - * operations was reached: see \c mbedtls_ecp_set_max_ops(). - */ -int mbedtls_ecp_mul_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, - const mbedtls_mpi *m, const mbedtls_ecp_point *P, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - mbedtls_ecp_restart_ctx *rs_ctx ); - -/** - * \brief This function performs multiplication and addition of two - * points by integers: \p R = \p m * \p P + \p n * \p Q - * - * It is not thread-safe to use same group in multiple threads. - * - * \note In contrast to mbedtls_ecp_mul(), this function does not - * guarantee a constant execution flow and timing. - * - * \param grp The ECP group. - * \param R The destination point. - * \param m The integer by which to multiply \p P. - * \param P The point to multiply by \p m. - * \param n The integer by which to multiply \p Q. - * \param Q The point to be multiplied by \p n. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not - * valid private keys, or \p P or \p Q are not valid public - * keys. - * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. - */ -int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, - const mbedtls_mpi *m, const mbedtls_ecp_point *P, - const mbedtls_mpi *n, const mbedtls_ecp_point *Q ); - -/** - * \brief This function performs multiplication and addition of two - * points by integers: \p R = \p m * \p P + \p n * \p Q in a - * restartable way. - * - * \see \c mbedtls_ecp_muladd() - * - * \note This function works the same as \c mbedtls_ecp_muladd(), - * but it can return early and restart according to the limit - * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. - * - * \param grp The ECP group. - * \param R The destination point. - * \param m The integer by which to multiply \p P. - * \param P The point to multiply by \p m. - * \param n The integer by which to multiply \p Q. - * \param Q The point to be multiplied by \p n. - * \param rs_ctx The restart context (NULL disables restart). - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not - * valid private keys, or \p P or \p Q are not valid public - * keys. - * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. - * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of - * operations was reached: see \c mbedtls_ecp_set_max_ops(). - */ -int mbedtls_ecp_muladd_restartable( - mbedtls_ecp_group *grp, mbedtls_ecp_point *R, - const mbedtls_mpi *m, const mbedtls_ecp_point *P, - const mbedtls_mpi *n, const mbedtls_ecp_point *Q, - mbedtls_ecp_restart_ctx *rs_ctx ); - -/** - * \brief This function checks that a point is a valid public key - * on this curve. - * - * It only checks that the point is non-zero, has - * valid coordinates and lies on the curve. It does not verify - * that it is indeed a multiple of \p G. This additional - * check is computationally more expensive, is not required - * by standards, and should not be necessary if the group - * used has a small cofactor. In particular, it is useless for - * the NIST groups which all have a cofactor of 1. - * - * \note This function uses bare components rather than an - * ::mbedtls_ecp_keypair structure, to ease use with other - * structures, such as ::mbedtls_ecdh_context or - * ::mbedtls_ecdsa_context. - * - * \param grp The curve the point should lie on. - * \param pt The point to check. - * - * \return \c 0 if the point is a valid public key. - * \return #MBEDTLS_ERR_ECP_INVALID_KEY on failure. - */ -int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ); - -/** - * \brief This function checks that an \p mbedtls_mpi is a valid private - * key for this curve. - * - * \note This function uses bare components rather than an - * ::mbedtls_ecp_keypair structure to ease use with other - * structures, such as ::mbedtls_ecdh_context or - * ::mbedtls_ecdsa_context. - * - * \param grp The group used. - * \param d The integer to check. - * - * \return \c 0 if the point is a valid private key. - * \return #MBEDTLS_ERR_ECP_INVALID_KEY on failure. - */ -int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d ); - -/** - * \brief This function generates a private key. - * - * \param grp The ECP group. - * \param d The destination MPI (secret part). - * \param f_rng The RNG function. - * \param p_rng The RNG parameter. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code - * on failure. - */ -int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp, - mbedtls_mpi *d, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief This function generates a keypair with a configurable base - * point. - * - * \note This function uses bare components rather than an - * ::mbedtls_ecp_keypair structure to ease use with other - * structures, such as ::mbedtls_ecdh_context or - * ::mbedtls_ecdsa_context. - * - * \param grp The ECP group. - * \param G The chosen base point. - * \param d The destination MPI (secret part). - * \param Q The destination point (public part). - * \param f_rng The RNG function. - * \param p_rng The RNG context. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code - * on failure. - */ -int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp, - const mbedtls_ecp_point *G, - mbedtls_mpi *d, mbedtls_ecp_point *Q, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief This function generates an ECP keypair. - * - * \note This function uses bare components rather than an - * ::mbedtls_ecp_keypair structure to ease use with other - * structures, such as ::mbedtls_ecdh_context or - * ::mbedtls_ecdsa_context. - * - * \param grp The ECP group. - * \param d The destination MPI (secret part). - * \param Q The destination point (public part). - * \param f_rng The RNG function. - * \param p_rng The RNG context. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code - * on failure. - */ -int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief This function generates an ECP key. - * - * \param grp_id The ECP group identifier. - * \param key The destination key. - * \param f_rng The RNG function. - * \param p_rng The RNG context. - * - * \return \c 0 on success. - * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code - * on failure. - */ -int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief This function checks that the keypair objects - * \p pub and \p prv have the same group and the - * same public point, and that the private key in - * \p prv is consistent with the public key. - * - * \param pub The keypair structure holding the public key. - * If it contains a private key, that part is ignored. - * \param prv The keypair structure holding the full keypair. - * - * \return \c 0 on success, meaning that the keys are valid and match. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the keys are invalid or do not match. - * \return An \c MBEDTLS_ERR_ECP_XXX or an \c MBEDTLS_ERR_MPI_XXX - * error code on calculation failure. - */ -int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv ); - -#if defined(MBEDTLS_SELF_TEST) - -/** - * \brief The ECP checkup routine. - * - * \return \c 0 on success. - * \return \c 1 on failure. - */ -int mbedtls_ecp_self_test( int verbose ); - -#endif /* MBEDTLS_SELF_TEST */ - -#ifdef __cplusplus -} -#endif - -#endif /* ecp.h */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/md.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/md.h deleted file mode 100644 index 8bcf766a6..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/md.h +++ /dev/null @@ -1,468 +0,0 @@ - /** - * \file md.h - * - * \brief This file contains the generic message-digest wrapper. - * - * \author Adriaan de Jong - */ -/* - * Copyright (C) 2006-2018, Arm Limited (or its affiliates), 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_MD_H -#define MBEDTLS_MD_H - -#include - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */ -#define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */ -#define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */ - -/* MBEDTLS_ERR_MD_HW_ACCEL_FAILED is deprecated and should not be used. */ -#define MBEDTLS_ERR_MD_HW_ACCEL_FAILED -0x5280 /**< MD hardware accelerator failed. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Supported message digests. - * - * \warning MD2, MD4, MD5 and SHA-1 are considered weak message digests and - * their use constitutes a security risk. We recommend considering - * stronger message digests instead. - * - */ -typedef enum { - MBEDTLS_MD_NONE=0, /**< None. */ - MBEDTLS_MD_MD2, /**< The MD2 message digest. */ - MBEDTLS_MD_MD4, /**< The MD4 message digest. */ - MBEDTLS_MD_MD5, /**< The MD5 message digest. */ - MBEDTLS_MD_SHA1, /**< The SHA-1 message digest. */ - MBEDTLS_MD_SHA224, /**< The SHA-224 message digest. */ - MBEDTLS_MD_SHA256, /**< The SHA-256 message digest. */ - MBEDTLS_MD_SHA384, /**< The SHA-384 message digest. */ - MBEDTLS_MD_SHA512, /**< The SHA-512 message digest. */ - MBEDTLS_MD_RIPEMD160, /**< The RIPEMD-160 message digest. */ -} mbedtls_md_type_t; - -#if defined(MBEDTLS_SHA512_C) -#define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ -#else -#define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ -#endif - -/** - * Opaque struct defined in md_internal.h. - */ -typedef struct mbedtls_md_info_t mbedtls_md_info_t; - -/** - * The generic message-digest context. - */ -typedef struct mbedtls_md_context_t -{ - /** Information about the associated message digest. */ - const mbedtls_md_info_t *md_info; - - /** The digest-specific context. */ - void *md_ctx; - - /** The HMAC part of the context. */ - void *hmac_ctx; -} mbedtls_md_context_t; - -/** - * \brief This function returns the list of digests supported by the - * generic digest module. - * - * \return A statically allocated array of digests. Each element - * in the returned list is an integer belonging to the - * message-digest enumeration #mbedtls_md_type_t. - * The last entry is 0. - */ -const int *mbedtls_md_list( void ); - -/** - * \brief This function returns the message-digest information - * associated with the given digest name. - * - * \param md_name The name of the digest to search for. - * - * \return The message-digest information associated with \p md_name. - * \return NULL if the associated message-digest information is not found. - */ -const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ); - -/** - * \brief This function returns the message-digest information - * associated with the given digest type. - * - * \param md_type The type of digest to search for. - * - * \return The message-digest information associated with \p md_type. - * \return NULL if the associated message-digest information is not found. - */ -const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ); - -/** - * \brief This function initializes a message-digest context without - * binding it to a particular message-digest algorithm. - * - * This function should always be called first. It prepares the - * context for mbedtls_md_setup() for binding it to a - * message-digest algorithm. - */ -void mbedtls_md_init( mbedtls_md_context_t *ctx ); - -/** - * \brief This function clears the internal structure of \p ctx and - * frees any embedded internal structure, but does not free - * \p ctx itself. - * - * If you have called mbedtls_md_setup() on \p ctx, you must - * call mbedtls_md_free() when you are no longer using the - * context. - * Calling this function if you have previously - * called mbedtls_md_init() and nothing else is optional. - * You must not call this function if you have not called - * mbedtls_md_init(). - */ -void mbedtls_md_free( mbedtls_md_context_t *ctx ); - -#if ! defined(MBEDTLS_DEPRECATED_REMOVED) -#if defined(MBEDTLS_DEPRECATED_WARNING) -#define MBEDTLS_DEPRECATED __attribute__((deprecated)) -#else -#define MBEDTLS_DEPRECATED -#endif -/** - * \brief This function selects the message digest algorithm to use, - * and allocates internal structures. - * - * It should be called after mbedtls_md_init() or mbedtls_md_free(). - * Makes it necessary to call mbedtls_md_free() later. - * - * \deprecated Superseded by mbedtls_md_setup() in 2.0.0 - * - * \param ctx The context to set up. - * \param md_info The information structure of the message-digest algorithm - * to use. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. - */ -int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED; -#undef MBEDTLS_DEPRECATED -#endif /* MBEDTLS_DEPRECATED_REMOVED */ - -/** - * \brief This function selects the message digest algorithm to use, - * and allocates internal structures. - * - * It should be called after mbedtls_md_init() or - * mbedtls_md_free(). Makes it necessary to call - * mbedtls_md_free() later. - * - * \param ctx The context to set up. - * \param md_info The information structure of the message-digest algorithm - * to use. - * \param hmac Defines if HMAC is used. 0: HMAC is not used (saves some memory), - * or non-zero: HMAC is used with this context. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. - */ -int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ); - -/** - * \brief This function clones the state of an message-digest - * context. - * - * \note You must call mbedtls_md_setup() on \c dst before calling - * this function. - * - * \note The two contexts must have the same type, - * for example, both are SHA-256. - * - * \warning This function clones the message-digest state, not the - * HMAC state. - * - * \param dst The destination context. - * \param src The context to be cloned. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification failure. - */ -int mbedtls_md_clone( mbedtls_md_context_t *dst, - const mbedtls_md_context_t *src ); - -/** - * \brief This function extracts the message-digest size from the - * message-digest information structure. - * - * \param md_info The information structure of the message-digest algorithm - * to use. - * - * \return The size of the message-digest output in Bytes. - */ -unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ); - -/** - * \brief This function extracts the message-digest type from the - * message-digest information structure. - * - * \param md_info The information structure of the message-digest algorithm - * to use. - * - * \return The type of the message digest. - */ -mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ); - -/** - * \brief This function extracts the message-digest name from the - * message-digest information structure. - * - * \param md_info The information structure of the message-digest algorithm - * to use. - * - * \return The name of the message digest. - */ -const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ); - -/** - * \brief This function starts a message-digest computation. - * - * You must call this function after setting up the context - * with mbedtls_md_setup(), and before passing data with - * mbedtls_md_update(). - * - * \param ctx The generic message-digest context. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - */ -int mbedtls_md_starts( mbedtls_md_context_t *ctx ); - -/** - * \brief This function feeds an input buffer into an ongoing - * message-digest computation. - * - * You must call mbedtls_md_starts() before calling this - * function. You may call this function multiple times. - * Afterwards, call mbedtls_md_finish(). - * - * \param ctx The generic message-digest context. - * \param input The buffer holding the input data. - * \param ilen The length of the input data. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - */ -int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief This function finishes the digest operation, - * and writes the result to the output buffer. - * - * Call this function after a call to mbedtls_md_starts(), - * followed by any number of calls to mbedtls_md_update(). - * Afterwards, you may either clear the context with - * mbedtls_md_free(), or call mbedtls_md_starts() to reuse - * the context for another digest operation with the same - * algorithm. - * - * \param ctx The generic message-digest context. - * \param output The buffer for the generic message-digest checksum result. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - */ -int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ); - -/** - * \brief This function calculates the message-digest of a buffer, - * with respect to a configurable message-digest algorithm - * in a single call. - * - * The result is calculated as - * Output = message_digest(input buffer). - * - * \param md_info The information structure of the message-digest algorithm - * to use. - * \param input The buffer holding the data. - * \param ilen The length of the input data. - * \param output The generic message-digest checksum result. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - */ -int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, - unsigned char *output ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief This function calculates the message-digest checksum - * result of the contents of the provided file. - * - * The result is calculated as - * Output = message_digest(file contents). - * - * \param md_info The information structure of the message-digest algorithm - * to use. - * \param path The input file name. - * \param output The generic message-digest checksum result. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_FILE_IO_ERROR on an I/O error accessing - * the file pointed by \p path. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info was NULL. - */ -int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, - unsigned char *output ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief This function sets the HMAC key and prepares to - * authenticate a new message. - * - * Call this function after mbedtls_md_setup(), to use - * the MD context for an HMAC calculation, then call - * mbedtls_md_hmac_update() to provide the input data, and - * mbedtls_md_hmac_finish() to get the HMAC value. - * - * \param ctx The message digest context containing an embedded HMAC - * context. - * \param key The HMAC secret key. - * \param keylen The length of the HMAC key in Bytes. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - */ -int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, - size_t keylen ); - -/** - * \brief This function feeds an input buffer into an ongoing HMAC - * computation. - * - * Call mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() - * before calling this function. - * You may call this function multiple times to pass the - * input piecewise. - * Afterwards, call mbedtls_md_hmac_finish(). - * - * \param ctx The message digest context containing an embedded HMAC - * context. - * \param input The buffer holding the input data. - * \param ilen The length of the input data. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - */ -int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, - size_t ilen ); - -/** - * \brief This function finishes the HMAC operation, and writes - * the result to the output buffer. - * - * Call this function after mbedtls_md_hmac_starts() and - * mbedtls_md_hmac_update() to get the HMAC value. Afterwards - * you may either call mbedtls_md_free() to clear the context, - * or call mbedtls_md_hmac_reset() to reuse the context with - * the same HMAC key. - * - * \param ctx The message digest context containing an embedded HMAC - * context. - * \param output The generic HMAC checksum result. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - */ -int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output); - -/** - * \brief This function prepares to authenticate a new message with - * the same key as the previous HMAC operation. - * - * You may call this function after mbedtls_md_hmac_finish(). - * Afterwards call mbedtls_md_hmac_update() to pass the new - * input. - * - * \param ctx The message digest context containing an embedded HMAC - * context. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - */ -int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ); - -/** - * \brief This function calculates the full generic HMAC - * on the input buffer with the provided key. - * - * The function allocates the context, performs the - * calculation, and frees the context. - * - * The HMAC result is calculated as - * output = generic HMAC(hmac key, input buffer). - * - * \param md_info The information structure of the message-digest algorithm - * to use. - * \param key The HMAC secret key. - * \param keylen The length of the HMAC secret key in Bytes. - * \param input The buffer holding the input data. - * \param ilen The length of the input data. - * \param output The generic HMAC result. - * - * \return \c 0 on success. - * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification - * failure. - */ -int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, - const unsigned char *input, size_t ilen, - unsigned char *output ); - -/* Internal use */ -int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_MD_H */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/oid.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/oid.h deleted file mode 100644 index fcecdafdc..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/oid.h +++ /dev/null @@ -1,570 +0,0 @@ -/** - * \file oid.h - * - * \brief Object Identifier (OID) database - * - * Copyright (C) 2006-2015, 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_OID_H -#define MBEDTLS_OID_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "asn1.h" -#include "pk.h" - -#include - -#if defined(MBEDTLS_CIPHER_C) -#include "cipher.h" -#endif - -#if defined(MBEDTLS_MD_C) -#include "md.h" -#endif - -#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) -#include "x509.h" -#endif - -#define MBEDTLS_ERR_OID_NOT_FOUND -0x002E /**< OID is not found. */ -#define MBEDTLS_ERR_OID_BUF_TOO_SMALL -0x000B /**< output buffer is too small */ - -/* - * Top level OID tuples - */ -#define MBEDTLS_OID_ISO_MEMBER_BODIES "\x2a" /* {iso(1) member-body(2)} */ -#define MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x2b" /* {iso(1) identified-organization(3)} */ -#define MBEDTLS_OID_ISO_CCITT_DS "\x55" /* {joint-iso-ccitt(2) ds(5)} */ -#define MBEDTLS_OID_ISO_ITU_COUNTRY "\x60" /* {joint-iso-itu-t(2) country(16)} */ - -/* - * ISO Member bodies OID parts - */ -#define MBEDTLS_OID_COUNTRY_US "\x86\x48" /* {us(840)} */ -#define MBEDTLS_OID_ORG_RSA_DATA_SECURITY "\x86\xf7\x0d" /* {rsadsi(113549)} */ -#define MBEDTLS_OID_RSA_COMPANY MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ - MBEDTLS_OID_ORG_RSA_DATA_SECURITY /* {iso(1) member-body(2) us(840) rsadsi(113549)} */ -#define MBEDTLS_OID_ORG_ANSI_X9_62 "\xce\x3d" /* ansi-X9-62(10045) */ -#define MBEDTLS_OID_ANSI_X9_62 MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ - MBEDTLS_OID_ORG_ANSI_X9_62 - -/* - * ISO Identified organization OID parts - */ -#define MBEDTLS_OID_ORG_DOD "\x06" /* {dod(6)} */ -#define MBEDTLS_OID_ORG_OIW "\x0e" -#define MBEDTLS_OID_OIW_SECSIG MBEDTLS_OID_ORG_OIW "\x03" -#define MBEDTLS_OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG "\x02" -#define MBEDTLS_OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_ALG "\x1a" -#define MBEDTLS_OID_ORG_CERTICOM "\x81\x04" /* certicom(132) */ -#define MBEDTLS_OID_CERTICOM MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_CERTICOM -#define MBEDTLS_OID_ORG_TELETRUST "\x24" /* teletrust(36) */ -#define MBEDTLS_OID_TELETRUST MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_TELETRUST - -/* - * ISO ITU OID parts - */ -#define MBEDTLS_OID_ORGANIZATION "\x01" /* {organization(1)} */ -#define MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_COUNTRY MBEDTLS_OID_COUNTRY_US MBEDTLS_OID_ORGANIZATION /* {joint-iso-itu-t(2) country(16) us(840) organization(1)} */ - -#define MBEDTLS_OID_ORG_GOV "\x65" /* {gov(101)} */ -#define MBEDTLS_OID_GOV MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_GOV /* {joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101)} */ - -#define MBEDTLS_OID_ORG_NETSCAPE "\x86\xF8\x42" /* {netscape(113730)} */ -#define MBEDTLS_OID_NETSCAPE MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_NETSCAPE /* Netscape OID {joint-iso-itu-t(2) country(16) us(840) organization(1) netscape(113730)} */ - -/* ISO arc for standard certificate and CRL extensions */ -#define MBEDTLS_OID_ID_CE MBEDTLS_OID_ISO_CCITT_DS "\x1D" /**< id-ce OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 29} */ - -/** - * Private Internet Extensions - * { iso(1) identified-organization(3) dod(6) internet(1) - * security(5) mechanisms(5) pkix(7) } - */ -#define MBEDTLS_OID_PKIX MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_DOD "\x01\x05\x05\x07" - -/* - * Arc for standard naming attributes - */ -#define MBEDTLS_OID_AT MBEDTLS_OID_ISO_CCITT_DS "\x04" /**< id-at OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 4} */ -#define MBEDTLS_OID_AT_CN MBEDTLS_OID_AT "\x03" /**< id-at-commonName AttributeType:= {id-at 3} */ -#define MBEDTLS_OID_AT_SUR_NAME MBEDTLS_OID_AT "\x04" /**< id-at-surName AttributeType:= {id-at 4} */ -#define MBEDTLS_OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT "\x05" /**< id-at-serialNumber AttributeType:= {id-at 5} */ -#define MBEDTLS_OID_AT_COUNTRY MBEDTLS_OID_AT "\x06" /**< id-at-countryName AttributeType:= {id-at 6} */ -#define MBEDTLS_OID_AT_LOCALITY MBEDTLS_OID_AT "\x07" /**< id-at-locality AttributeType:= {id-at 7} */ -#define MBEDTLS_OID_AT_STATE MBEDTLS_OID_AT "\x08" /**< id-at-state AttributeType:= {id-at 8} */ -#define MBEDTLS_OID_AT_ORGANIZATION MBEDTLS_OID_AT "\x0A" /**< id-at-organizationName AttributeType:= {id-at 10} */ -#define MBEDTLS_OID_AT_ORG_UNIT MBEDTLS_OID_AT "\x0B" /**< id-at-organizationalUnitName AttributeType:= {id-at 11} */ -#define MBEDTLS_OID_AT_TITLE MBEDTLS_OID_AT "\x0C" /**< id-at-title AttributeType:= {id-at 12} */ -#define MBEDTLS_OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT "\x10" /**< id-at-postalAddress AttributeType:= {id-at 16} */ -#define MBEDTLS_OID_AT_POSTAL_CODE MBEDTLS_OID_AT "\x11" /**< id-at-postalCode AttributeType:= {id-at 17} */ -#define MBEDTLS_OID_AT_GIVEN_NAME MBEDTLS_OID_AT "\x2A" /**< id-at-givenName AttributeType:= {id-at 42} */ -#define MBEDTLS_OID_AT_INITIALS MBEDTLS_OID_AT "\x2B" /**< id-at-initials AttributeType:= {id-at 43} */ -#define MBEDTLS_OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT "\x2C" /**< id-at-generationQualifier AttributeType:= {id-at 44} */ -#define MBEDTLS_OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT "\x2D" /**< id-at-uniqueIdentifier AttributType:= {id-at 45} */ -#define MBEDTLS_OID_AT_DN_QUALIFIER MBEDTLS_OID_AT "\x2E" /**< id-at-dnQualifier AttributeType:= {id-at 46} */ -#define MBEDTLS_OID_AT_PSEUDONYM MBEDTLS_OID_AT "\x41" /**< id-at-pseudonym AttributeType:= {id-at 65} */ - -#define MBEDTLS_OID_DOMAIN_COMPONENT "\x09\x92\x26\x89\x93\xF2\x2C\x64\x01\x19" /** id-domainComponent AttributeType:= {itu-t(0) data(9) pss(2342) ucl(19200300) pilot(100) pilotAttributeType(1) domainComponent(25)} */ - -/* - * OIDs for standard certificate extensions - */ -#define MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x23" /**< id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } */ -#define MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x0E" /**< id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } */ -#define MBEDTLS_OID_KEY_USAGE MBEDTLS_OID_ID_CE "\x0F" /**< id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } */ -#define MBEDTLS_OID_CERTIFICATE_POLICIES MBEDTLS_OID_ID_CE "\x20" /**< id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } */ -#define MBEDTLS_OID_POLICY_MAPPINGS MBEDTLS_OID_ID_CE "\x21" /**< id-ce-policyMappings OBJECT IDENTIFIER ::= { id-ce 33 } */ -#define MBEDTLS_OID_SUBJECT_ALT_NAME MBEDTLS_OID_ID_CE "\x11" /**< id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } */ -#define MBEDTLS_OID_ISSUER_ALT_NAME MBEDTLS_OID_ID_CE "\x12" /**< id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } */ -#define MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_ID_CE "\x09" /**< id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::= { id-ce 9 } */ -#define MBEDTLS_OID_BASIC_CONSTRAINTS MBEDTLS_OID_ID_CE "\x13" /**< id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } */ -#define MBEDTLS_OID_NAME_CONSTRAINTS MBEDTLS_OID_ID_CE "\x1E" /**< id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } */ -#define MBEDTLS_OID_POLICY_CONSTRAINTS MBEDTLS_OID_ID_CE "\x24" /**< id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 } */ -#define MBEDTLS_OID_EXTENDED_KEY_USAGE MBEDTLS_OID_ID_CE "\x25" /**< id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } */ -#define MBEDTLS_OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_ID_CE "\x1F" /**< id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 } */ -#define MBEDTLS_OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_ID_CE "\x36" /**< id-ce-inhibitAnyPolicy OBJECT IDENTIFIER ::= { id-ce 54 } */ -#define MBEDTLS_OID_FRESHEST_CRL MBEDTLS_OID_ID_CE "\x2E" /**< id-ce-freshestCRL OBJECT IDENTIFIER ::= { id-ce 46 } */ - -/* - * Netscape certificate extensions - */ -#define MBEDTLS_OID_NS_CERT MBEDTLS_OID_NETSCAPE "\x01" -#define MBEDTLS_OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT "\x01" -#define MBEDTLS_OID_NS_BASE_URL MBEDTLS_OID_NS_CERT "\x02" -#define MBEDTLS_OID_NS_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x03" -#define MBEDTLS_OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x04" -#define MBEDTLS_OID_NS_RENEWAL_URL MBEDTLS_OID_NS_CERT "\x07" -#define MBEDTLS_OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CERT "\x08" -#define MBEDTLS_OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_CERT "\x0C" -#define MBEDTLS_OID_NS_COMMENT MBEDTLS_OID_NS_CERT "\x0D" -#define MBEDTLS_OID_NS_DATA_TYPE MBEDTLS_OID_NETSCAPE "\x02" -#define MBEDTLS_OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_DATA_TYPE "\x05" - -/* - * OIDs for CRL extensions - */ -#define MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_ID_CE "\x10" -#define MBEDTLS_OID_CRL_NUMBER MBEDTLS_OID_ID_CE "\x14" /**< id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } */ - -/* - * X.509 v3 Extended key usage OIDs - */ -#define MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE "\x00" /**< anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } */ - -#define MBEDTLS_OID_KP MBEDTLS_OID_PKIX "\x03" /**< id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } */ -#define MBEDTLS_OID_SERVER_AUTH MBEDTLS_OID_KP "\x01" /**< id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } */ -#define MBEDTLS_OID_CLIENT_AUTH MBEDTLS_OID_KP "\x02" /**< id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } */ -#define MBEDTLS_OID_CODE_SIGNING MBEDTLS_OID_KP "\x03" /**< id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } */ -#define MBEDTLS_OID_EMAIL_PROTECTION MBEDTLS_OID_KP "\x04" /**< id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } */ -#define MBEDTLS_OID_TIME_STAMPING MBEDTLS_OID_KP "\x08" /**< id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } */ -#define MBEDTLS_OID_OCSP_SIGNING MBEDTLS_OID_KP "\x09" /**< id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } */ - -/* - * PKCS definition OIDs - */ - -#define MBEDTLS_OID_PKCS MBEDTLS_OID_RSA_COMPANY "\x01" /**< pkcs OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) 1 } */ -#define MBEDTLS_OID_PKCS1 MBEDTLS_OID_PKCS "\x01" /**< pkcs-1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } */ -#define MBEDTLS_OID_PKCS5 MBEDTLS_OID_PKCS "\x05" /**< pkcs-5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 } */ -#define MBEDTLS_OID_PKCS9 MBEDTLS_OID_PKCS "\x09" /**< pkcs-9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } */ -#define MBEDTLS_OID_PKCS12 MBEDTLS_OID_PKCS "\x0c" /**< pkcs-12 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 } */ - -/* - * PKCS#1 OIDs - */ -#define MBEDTLS_OID_PKCS1_RSA MBEDTLS_OID_PKCS1 "\x01" /**< rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } */ -#define MBEDTLS_OID_PKCS1_MD2 MBEDTLS_OID_PKCS1 "\x02" /**< md2WithRSAEncryption ::= { pkcs-1 2 } */ -#define MBEDTLS_OID_PKCS1_MD4 MBEDTLS_OID_PKCS1 "\x03" /**< md4WithRSAEncryption ::= { pkcs-1 3 } */ -#define MBEDTLS_OID_PKCS1_MD5 MBEDTLS_OID_PKCS1 "\x04" /**< md5WithRSAEncryption ::= { pkcs-1 4 } */ -#define MBEDTLS_OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1 "\x05" /**< sha1WithRSAEncryption ::= { pkcs-1 5 } */ -#define MBEDTLS_OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1 "\x0e" /**< sha224WithRSAEncryption ::= { pkcs-1 14 } */ -#define MBEDTLS_OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1 "\x0b" /**< sha256WithRSAEncryption ::= { pkcs-1 11 } */ -#define MBEDTLS_OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1 "\x0c" /**< sha384WithRSAEncryption ::= { pkcs-1 12 } */ -#define MBEDTLS_OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1 "\x0d" /**< sha512WithRSAEncryption ::= { pkcs-1 13 } */ - -#define MBEDTLS_OID_RSA_SHA_OBS "\x2B\x0E\x03\x02\x1D" - -#define MBEDTLS_OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9 "\x01" /**< emailAddress AttributeType ::= { pkcs-9 1 } */ - -/* RFC 4055 */ -#define MBEDTLS_OID_RSASSA_PSS MBEDTLS_OID_PKCS1 "\x0a" /**< id-RSASSA-PSS ::= { pkcs-1 10 } */ -#define MBEDTLS_OID_MGF1 MBEDTLS_OID_PKCS1 "\x08" /**< id-mgf1 ::= { pkcs-1 8 } */ - -/* - * Digest algorithms - */ -#define MBEDTLS_OID_DIGEST_ALG_MD2 MBEDTLS_OID_RSA_COMPANY "\x02\x02" /**< id-mbedtls_md2 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } */ -#define MBEDTLS_OID_DIGEST_ALG_MD4 MBEDTLS_OID_RSA_COMPANY "\x02\x04" /**< id-mbedtls_md4 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 4 } */ -#define MBEDTLS_OID_DIGEST_ALG_MD5 MBEDTLS_OID_RSA_COMPANY "\x02\x05" /**< id-mbedtls_md5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } */ -#define MBEDTLS_OID_DIGEST_ALG_SHA1 MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_SHA1 /**< id-mbedtls_sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } */ -#define MBEDTLS_OID_DIGEST_ALG_SHA224 MBEDTLS_OID_GOV "\x03\x04\x02\x04" /**< id-sha224 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 4 } */ -#define MBEDTLS_OID_DIGEST_ALG_SHA256 MBEDTLS_OID_GOV "\x03\x04\x02\x01" /**< id-mbedtls_sha256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 1 } */ - -#define MBEDTLS_OID_DIGEST_ALG_SHA384 MBEDTLS_OID_GOV "\x03\x04\x02\x02" /**< id-sha384 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 2 } */ - -#define MBEDTLS_OID_DIGEST_ALG_SHA512 MBEDTLS_OID_GOV "\x03\x04\x02\x03" /**< id-mbedtls_sha512 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 3 } */ - -#define MBEDTLS_OID_HMAC_SHA1 MBEDTLS_OID_RSA_COMPANY "\x02\x07" /**< id-hmacWithSHA1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 7 } */ - -/* - * Encryption algorithms - */ -#define MBEDTLS_OID_DES_CBC MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_ALG "\x07" /**< desCBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7 } */ -#define MBEDTLS_OID_DES_EDE3_CBC MBEDTLS_OID_RSA_COMPANY "\x03\x07" /**< des-ede3-cbc OBJECT IDENTIFIER ::= { iso(1) member-body(2) -- us(840) rsadsi(113549) encryptionAlgorithm(3) 7 } */ - -/* - * PKCS#5 OIDs - */ -#define MBEDTLS_OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5 "\x0c" /**< id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} */ -#define MBEDTLS_OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5 "\x0d" /**< id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13} */ -#define MBEDTLS_OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5 "\x0e" /**< id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14} */ - -/* - * PKCS#5 PBES1 algorithms - */ -#define MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5 "\x01" /**< pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1} */ -#define MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5 "\x04" /**< pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4} */ -#define MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5 "\x03" /**< pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3} */ -#define MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5 "\x06" /**< pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6} */ -#define MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5 "\x0a" /**< pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10} */ -#define MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5 "\x0b" /**< pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11} */ - -/* - * PKCS#8 OIDs - */ -#define MBEDTLS_OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9 "\x0e" /**< extensionRequest OBJECT IDENTIFIER ::= {pkcs-9 14} */ - -/* - * PKCS#12 PBE OIDs - */ -#define MBEDTLS_OID_PKCS12_PBE MBEDTLS_OID_PKCS12 "\x01" /**< pkcs-12PbeIds OBJECT IDENTIFIER ::= {pkcs-12 1} */ - -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE "\x01" /**< pbeWithSHAAnd128BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 1} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE "\x02" /**< pbeWithSHAAnd40BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 2} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x03" /**< pbeWithSHAAnd3-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 3} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x04" /**< pbeWithSHAAnd2-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 4} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE "\x05" /**< pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE "\x06" /**< pbeWithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6} */ - -/* - * EC key algorithms from RFC 5480 - */ - -/* id-ecPublicKey OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } */ -#define MBEDTLS_OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_ANSI_X9_62 "\x02\01" - -/* id-ecDH OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) - * schemes(1) ecdh(12) } */ -#define MBEDTLS_OID_EC_ALG_ECDH MBEDTLS_OID_CERTICOM "\x01\x0c" - -/* - * ECParameters namedCurve identifiers, from RFC 5480, RFC 5639, and SEC2 - */ - -/* secp192r1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 1 } */ -#define MBEDTLS_OID_EC_GRP_SECP192R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x01" - -/* secp224r1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 33 } */ -#define MBEDTLS_OID_EC_GRP_SECP224R1 MBEDTLS_OID_CERTICOM "\x00\x21" - -/* secp256r1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 7 } */ -#define MBEDTLS_OID_EC_GRP_SECP256R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x07" - -/* secp384r1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 34 } */ -#define MBEDTLS_OID_EC_GRP_SECP384R1 MBEDTLS_OID_CERTICOM "\x00\x22" - -/* secp521r1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 35 } */ -#define MBEDTLS_OID_EC_GRP_SECP521R1 MBEDTLS_OID_CERTICOM "\x00\x23" - -/* secp192k1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 31 } */ -#define MBEDTLS_OID_EC_GRP_SECP192K1 MBEDTLS_OID_CERTICOM "\x00\x1f" - -/* secp224k1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 32 } */ -#define MBEDTLS_OID_EC_GRP_SECP224K1 MBEDTLS_OID_CERTICOM "\x00\x20" - -/* secp256k1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 10 } */ -#define MBEDTLS_OID_EC_GRP_SECP256K1 MBEDTLS_OID_CERTICOM "\x00\x0a" - -/* RFC 5639 4.1 - * ecStdCurvesAndGeneration OBJECT IDENTIFIER::= {iso(1) - * identified-organization(3) teletrust(36) algorithm(3) signature- - * algorithm(3) ecSign(2) 8} - * ellipticCurve OBJECT IDENTIFIER ::= {ecStdCurvesAndGeneration 1} - * versionOne OBJECT IDENTIFIER ::= {ellipticCurve 1} */ -#define MBEDTLS_OID_EC_BRAINPOOL_V1 MBEDTLS_OID_TELETRUST "\x03\x03\x02\x08\x01\x01" - -/* brainpoolP256r1 OBJECT IDENTIFIER ::= {versionOne 7} */ -#define MBEDTLS_OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x07" - -/* brainpoolP384r1 OBJECT IDENTIFIER ::= {versionOne 11} */ -#define MBEDTLS_OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0B" - -/* brainpoolP512r1 OBJECT IDENTIFIER ::= {versionOne 13} */ -#define MBEDTLS_OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0D" - -/* - * SEC1 C.1 - * - * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 } - * id-fieldType OBJECT IDENTIFIER ::= { ansi-X9-62 fieldType(1)} - */ -#define MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62 "\x01" -#define MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE "\x01" - -/* - * ECDSA signature identifiers, from RFC 5480 - */ -#define MBEDTLS_OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62 "\x04" /* signatures(4) */ -#define MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG "\x03" /* ecdsa-with-SHA2(3) */ - -/* ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) 1 } */ -#define MBEDTLS_OID_ECDSA_SHA1 MBEDTLS_OID_ANSI_X9_62_SIG "\x01" - -/* ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 1 } */ -#define MBEDTLS_OID_ECDSA_SHA224 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x01" - -/* ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 2 } */ -#define MBEDTLS_OID_ECDSA_SHA256 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x02" - -/* ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 3 } */ -#define MBEDTLS_OID_ECDSA_SHA384 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x03" - -/* ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 4 } */ -#define MBEDTLS_OID_ECDSA_SHA512 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x04" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Base OID descriptor structure - */ -typedef struct { - const char *asn1; /*!< OID ASN.1 representation */ - size_t asn1_len; /*!< length of asn1 */ - const char *name; /*!< official name (e.g. from RFC) */ - const char *description; /*!< human friendly description */ -} mbedtls_oid_descriptor_t; - -/** - * \brief Translate an ASN.1 OID into its numeric representation - * (e.g. "\x2A\x86\x48\x86\xF7\x0D" into "1.2.840.113549") - * - * \param buf buffer to put representation in - * \param size size of the buffer - * \param oid OID to translate - * - * \return Length of the string written (excluding final NULL) or - * MBEDTLS_ERR_OID_BUF_TOO_SMALL in case of error - */ -int mbedtls_oid_get_numeric_string( char *buf, size_t size, const mbedtls_asn1_buf *oid ); - -#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) -/** - * \brief Translate an X.509 extension OID into local values - * - * \param oid OID to use - * \param ext_type place to store the extension type - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_x509_ext_type( const mbedtls_asn1_buf *oid, int *ext_type ); -#endif - -/** - * \brief Translate an X.509 attribute type OID into the short name - * (e.g. the OID for an X520 Common Name into "CN") - * - * \param oid OID to use - * \param short_name place to store the string pointer - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_attr_short_name( const mbedtls_asn1_buf *oid, const char **short_name ); - -/** - * \brief Translate PublicKeyAlgorithm OID into pk_type - * - * \param oid OID to use - * \param pk_alg place to store public key algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_pk_alg( const mbedtls_asn1_buf *oid, mbedtls_pk_type_t *pk_alg ); - -/** - * \brief Translate pk_type into PublicKeyAlgorithm OID - * - * \param pk_alg Public key type to look for - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_type_t pk_alg, - const char **oid, size_t *olen ); - -#if defined(MBEDTLS_ECP_C) -/** - * \brief Translate NamedCurve OID into an EC group identifier - * - * \param oid OID to use - * \param grp_id place to store group id - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_ec_grp( const mbedtls_asn1_buf *oid, mbedtls_ecp_group_id *grp_id ); - -/** - * \brief Translate EC group identifier into NamedCurve OID - * - * \param grp_id EC group identifier - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_ec_grp( mbedtls_ecp_group_id grp_id, - const char **oid, size_t *olen ); -#endif /* MBEDTLS_ECP_C */ - -#if defined(MBEDTLS_MD_C) -/** - * \brief Translate SignatureAlgorithm OID into md_type and pk_type - * - * \param oid OID to use - * \param md_alg place to store message digest algorithm - * \param pk_alg place to store public key algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_sig_alg( const mbedtls_asn1_buf *oid, - mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg ); - -/** - * \brief Translate SignatureAlgorithm OID into description - * - * \param oid OID to use - * \param desc place to store string pointer - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_sig_alg_desc( const mbedtls_asn1_buf *oid, const char **desc ); - -/** - * \brief Translate md_type and pk_type into SignatureAlgorithm OID - * - * \param md_alg message digest algorithm - * \param pk_alg public key algorithm - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_sig_alg( mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, - const char **oid, size_t *olen ); - -/** - * \brief Translate hash algorithm OID into md_type - * - * \param oid OID to use - * \param md_alg place to store message digest algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_md_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg ); -#endif /* MBEDTLS_MD_C */ - -/** - * \brief Translate Extended Key Usage OID into description - * - * \param oid OID to use - * \param desc place to store string pointer - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_extended_key_usage( const mbedtls_asn1_buf *oid, const char **desc ); - -/** - * \brief Translate md_type into hash algorithm OID - * - * \param md_alg message digest algorithm - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_md( mbedtls_md_type_t md_alg, const char **oid, size_t *olen ); - -#if defined(MBEDTLS_CIPHER_C) -/** - * \brief Translate encryption algorithm OID into cipher_type - * - * \param oid OID to use - * \param cipher_alg place to store cipher algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_cipher_alg( const mbedtls_asn1_buf *oid, mbedtls_cipher_type_t *cipher_alg ); -#endif /* MBEDTLS_CIPHER_C */ - -#if defined(MBEDTLS_PKCS12_C) -/** - * \brief Translate PKCS#12 PBE algorithm OID into md_type and - * cipher_type - * - * \param oid OID to use - * \param md_alg place to store message digest algorithm - * \param cipher_alg place to store cipher algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_pkcs12_pbe_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg, - mbedtls_cipher_type_t *cipher_alg ); -#endif /* MBEDTLS_PKCS12_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* oid.h */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/pk.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/pk.h deleted file mode 100644 index df3a03c7c..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/pk.h +++ /dev/null @@ -1,701 +0,0 @@ -/** - * \file pk.h - * - * \brief Public Key abstraction layer - */ -/* - * Copyright (C) 2006-2015, 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_PK_H -#define MBEDTLS_PK_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "md.h" - -#if defined(MBEDTLS_RSA_C) -#include "rsa.h" -#endif - -#if defined(MBEDTLS_ECP_C) -#include "ecp.h" -#endif - -#if defined(MBEDTLS_ECDSA_C) -#include "ecdsa.h" -#endif - -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - -#define MBEDTLS_ERR_PK_ALLOC_FAILED -0x3F80 /**< Memory allocation failed. */ -#define MBEDTLS_ERR_PK_TYPE_MISMATCH -0x3F00 /**< Type mismatch, eg attempt to encrypt with an ECDSA key */ -#define MBEDTLS_ERR_PK_BAD_INPUT_DATA -0x3E80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_PK_FILE_IO_ERROR -0x3E00 /**< Read/write of file failed. */ -#define MBEDTLS_ERR_PK_KEY_INVALID_VERSION -0x3D80 /**< Unsupported key version */ -#define MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -0x3D00 /**< Invalid key tag or value. */ -#define MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -0x3C80 /**< Key algorithm is unsupported (only RSA and EC are supported). */ -#define MBEDTLS_ERR_PK_PASSWORD_REQUIRED -0x3C00 /**< Private key password can't be empty. */ -#define MBEDTLS_ERR_PK_PASSWORD_MISMATCH -0x3B80 /**< Given private key password does not allow for correct decryption. */ -#define MBEDTLS_ERR_PK_INVALID_PUBKEY -0x3B00 /**< The pubkey tag or value is invalid (only RSA and EC are supported). */ -#define MBEDTLS_ERR_PK_INVALID_ALG -0x3A80 /**< The algorithm tag or value is invalid. */ -#define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00 /**< Elliptic curve is unsupported (only NIST curves are supported). */ -#define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980 /**< Unavailable feature, e.g. RSA disabled for RSA key. */ -#define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -0x3900 /**< The buffer contains a valid signature followed by more data. */ - -/* MBEDTLS_ERR_PK_HW_ACCEL_FAILED is deprecated and should not be used. */ -#define MBEDTLS_ERR_PK_HW_ACCEL_FAILED -0x3880 /**< PK hardware accelerator failed. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Public key types - */ -typedef enum { - MBEDTLS_PK_NONE=0, - MBEDTLS_PK_RSA, - MBEDTLS_PK_ECKEY, - MBEDTLS_PK_ECKEY_DH, - MBEDTLS_PK_ECDSA, - MBEDTLS_PK_RSA_ALT, - MBEDTLS_PK_RSASSA_PSS, -} mbedtls_pk_type_t; - -/** - * \brief Options for RSASSA-PSS signature verification. - * See \c mbedtls_rsa_rsassa_pss_verify_ext() - */ -typedef struct mbedtls_pk_rsassa_pss_options -{ - mbedtls_md_type_t mgf1_hash_id; - int expected_salt_len; - -} mbedtls_pk_rsassa_pss_options; - -/** - * \brief Types for interfacing with the debug module - */ -typedef enum -{ - MBEDTLS_PK_DEBUG_NONE = 0, - MBEDTLS_PK_DEBUG_MPI, - MBEDTLS_PK_DEBUG_ECP, -} mbedtls_pk_debug_type; - -/** - * \brief Item to send to the debug module - */ -typedef struct mbedtls_pk_debug_item -{ - mbedtls_pk_debug_type type; - const char *name; - void *value; -} mbedtls_pk_debug_item; - -/** Maximum number of item send for debugging, plus 1 */ -#define MBEDTLS_PK_DEBUG_MAX_ITEMS 3 - -/** - * \brief Public key information and operations - */ -typedef struct mbedtls_pk_info_t mbedtls_pk_info_t; - -/** - * \brief Public key container - */ -typedef struct mbedtls_pk_context -{ - const mbedtls_pk_info_t * pk_info; /**< Public key information */ - void * pk_ctx; /**< Underlying public key context */ -} mbedtls_pk_context; - -#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) -/** - * \brief Context for resuming operations - */ -typedef struct -{ - const mbedtls_pk_info_t * pk_info; /**< Public key information */ - void * rs_ctx; /**< Underlying restart context */ -} mbedtls_pk_restart_ctx; -#else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ -/* Now we can declare functions that take a pointer to that */ -typedef void mbedtls_pk_restart_ctx; -#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ - -#if defined(MBEDTLS_RSA_C) -/** - * Quick access to an RSA context inside a PK context. - * - * \warning You must make sure the PK context actually holds an RSA context - * before using this function! - */ -static inline mbedtls_rsa_context *mbedtls_pk_rsa( const mbedtls_pk_context pk ) -{ - return( (mbedtls_rsa_context *) (pk).pk_ctx ); -} -#endif /* MBEDTLS_RSA_C */ - -#if defined(MBEDTLS_ECP_C) -/** - * Quick access to an EC context inside a PK context. - * - * \warning You must make sure the PK context actually holds an EC context - * before using this function! - */ -static inline mbedtls_ecp_keypair *mbedtls_pk_ec( const mbedtls_pk_context pk ) -{ - return( (mbedtls_ecp_keypair *) (pk).pk_ctx ); -} -#endif /* MBEDTLS_ECP_C */ - -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -/** - * \brief Types for RSA-alt abstraction - */ -typedef int (*mbedtls_pk_rsa_alt_decrypt_func)( void *ctx, int mode, size_t *olen, - const unsigned char *input, unsigned char *output, - size_t output_max_len ); -typedef int (*mbedtls_pk_rsa_alt_sign_func)( void *ctx, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, - const unsigned char *hash, unsigned char *sig ); -typedef size_t (*mbedtls_pk_rsa_alt_key_len_func)( void *ctx ); -#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ - -/** - * \brief Return information associated with the given PK type - * - * \param pk_type PK type to search for. - * - * \return The PK info associated with the type or NULL if not found. - */ -const mbedtls_pk_info_t *mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type ); - -/** - * \brief Initialize a mbedtls_pk_context (as NONE) - */ -void mbedtls_pk_init( mbedtls_pk_context *ctx ); - -/** - * \brief Free a mbedtls_pk_context - */ -void mbedtls_pk_free( mbedtls_pk_context *ctx ); - -#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) -/** - * \brief Initialize a restart context - */ -void mbedtls_pk_restart_init( mbedtls_pk_restart_ctx *ctx ); - -/** - * \brief Free the components of a restart context - */ -void mbedtls_pk_restart_free( mbedtls_pk_restart_ctx *ctx ); -#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ - -/** - * \brief Initialize a PK context with the information given - * and allocates the type-specific PK subcontext. - * - * \param ctx Context to initialize. Must be empty (type NONE). - * \param info Information to use - * - * \return 0 on success, - * MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input, - * MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure. - * - * \note For contexts holding an RSA-alt key, use - * \c mbedtls_pk_setup_rsa_alt() instead. - */ -int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info ); - -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -/** - * \brief Initialize an RSA-alt context - * - * \param ctx Context to initialize. Must be empty (type NONE). - * \param key RSA key pointer - * \param decrypt_func Decryption function - * \param sign_func Signing function - * \param key_len_func Function returning key length in bytes - * - * \return 0 on success, or MBEDTLS_ERR_PK_BAD_INPUT_DATA if the - * context wasn't already initialized as RSA_ALT. - * - * \note This function replaces \c mbedtls_pk_setup() for RSA-alt. - */ -int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key, - mbedtls_pk_rsa_alt_decrypt_func decrypt_func, - mbedtls_pk_rsa_alt_sign_func sign_func, - mbedtls_pk_rsa_alt_key_len_func key_len_func ); -#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ - -/** - * \brief Get the size in bits of the underlying key - * - * \param ctx Context to use - * - * \return Key size in bits, or 0 on error - */ -size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx ); - -/** - * \brief Get the length in bytes of the underlying key - * \param ctx Context to use - * - * \return Key length in bytes, or 0 on error - */ -static inline size_t mbedtls_pk_get_len( const mbedtls_pk_context *ctx ) -{ - return( ( mbedtls_pk_get_bitlen( ctx ) + 7 ) / 8 ); -} - -/** - * \brief Tell if a context can do the operation given by type - * - * \param ctx Context to test - * \param type Target type - * - * \return 0 if context can't do the operations, - * 1 otherwise. - */ -int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type ); - -/** - * \brief Verify signature (including padding if relevant). - * - * \param ctx PK context to use - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Signature to verify - * \param sig_len Signature length - * - * \return 0 on success (signature is valid), - * #MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid - * signature in sig but its length is less than \p siglen, - * or a specific error code. - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * Use \c mbedtls_pk_verify_ext( MBEDTLS_PK_RSASSA_PSS, ... ) - * to verify RSASSA_PSS signatures. - * - * \note If hash_len is 0, then the length associated with md_alg - * is used instead, or an error returned if it is invalid. - * - * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 - */ -int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - const unsigned char *sig, size_t sig_len ); - -/** - * \brief Restartable version of \c mbedtls_pk_verify() - * - * \note Performs the same job as \c mbedtls_pk_verify(), but can - * return early and restart according to the limit set with - * \c mbedtls_ecp_set_max_ops() to reduce blocking for ECC - * operations. For RSA, same as \c mbedtls_pk_verify(). - * - * \param ctx PK context to use - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Signature to verify - * \param sig_len Signature length - * \param rs_ctx Restart context (NULL to disable restart) - * - * \return See \c mbedtls_pk_verify(), or - * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of - * operations was reached: see \c mbedtls_ecp_set_max_ops(). - */ -int mbedtls_pk_verify_restartable( mbedtls_pk_context *ctx, - mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - const unsigned char *sig, size_t sig_len, - mbedtls_pk_restart_ctx *rs_ctx ); - -/** - * \brief Verify signature, with options. - * (Includes verification of the padding depending on type.) - * - * \param type Signature type (inc. possible padding type) to verify - * \param options Pointer to type-specific options, or NULL - * \param ctx PK context to use - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Signature to verify - * \param sig_len Signature length - * - * \return 0 on success (signature is valid), - * #MBEDTLS_ERR_PK_TYPE_MISMATCH if the PK context can't be - * used for this type of signatures, - * #MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid - * signature in sig but its length is less than \p siglen, - * or a specific error code. - * - * \note If hash_len is 0, then the length associated with md_alg - * is used instead, or an error returned if it is invalid. - * - * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 - * - * \note If type is MBEDTLS_PK_RSASSA_PSS, then options must point - * to a mbedtls_pk_rsassa_pss_options structure, - * otherwise it must be NULL. - */ -int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options, - mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - const unsigned char *sig, size_t sig_len ); - -/** - * \brief Make signature, including padding if relevant. - * - * \param ctx PK context to use - must hold a private key - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Place to write the signature - * \param sig_len Number of bytes written - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 on success, or a specific error code. - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * There is no interface in the PK module to make RSASSA-PSS - * signatures yet. - * - * \note If hash_len is 0, then the length associated with md_alg - * is used instead, or an error returned if it is invalid. - * - * \note For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0. - * For ECDSA, md_alg may never be MBEDTLS_MD_NONE. - */ -int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - unsigned char *sig, size_t *sig_len, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Restartable version of \c mbedtls_pk_sign() - * - * \note Performs the same job as \c mbedtls_pk_sign(), but can - * return early and restart according to the limit set with - * \c mbedtls_ecp_set_max_ops() to reduce blocking for ECC - * operations. For RSA, same as \c mbedtls_pk_sign(). - * - * \param ctx PK context to use - must hold a private key - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Place to write the signature - * \param sig_len Number of bytes written - * \param f_rng RNG function - * \param p_rng RNG parameter - * \param rs_ctx Restart context (NULL to disable restart) - * - * \return See \c mbedtls_pk_sign(), or - * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of - * operations was reached: see \c mbedtls_ecp_set_max_ops(). - */ -int mbedtls_pk_sign_restartable( mbedtls_pk_context *ctx, - mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - unsigned char *sig, size_t *sig_len, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - mbedtls_pk_restart_ctx *rs_ctx ); - -/** - * \brief Decrypt message (including padding if relevant). - * - * \param ctx PK context to use - must hold a private key - * \param input Input to decrypt - * \param ilen Input size - * \param output Decrypted output - * \param olen Decrypted message length - * \param osize Size of the output buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_pk_decrypt( mbedtls_pk_context *ctx, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Encrypt message (including padding if relevant). - * - * \param ctx PK context to use - * \param input Message to encrypt - * \param ilen Message size - * \param output Encrypted output - * \param olen Encrypted output length - * \param osize Size of the output buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_pk_encrypt( mbedtls_pk_context *ctx, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Check if a public-private pair of keys matches. - * - * \param pub Context holding a public key. - * \param prv Context holding a private (and public) key. - * - * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA - */ -int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv ); - -/** - * \brief Export debug information - * - * \param ctx Context to use - * \param items Place to write debug items - * - * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA - */ -int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items ); - -/** - * \brief Access the type name - * - * \param ctx Context to use - * - * \return Type name on success, or "invalid PK" - */ -const char * mbedtls_pk_get_name( const mbedtls_pk_context *ctx ); - -/** - * \brief Get the key type - * - * \param ctx Context to use - * - * \return Type on success, or MBEDTLS_PK_NONE - */ -mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx ); - -#if defined(MBEDTLS_PK_PARSE_C) -/** \ingroup pk_module */ -/** - * \brief Parse a private key in PEM or DER format - * - * \param ctx key to be initialized - * \param key input buffer - * \param keylen size of the buffer - * (including the terminating null byte for PEM data) - * \param pwd password for decryption (optional) - * \param pwdlen size of the password - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_key( mbedtls_pk_context *ctx, - const unsigned char *key, size_t keylen, - const unsigned char *pwd, size_t pwdlen ); - -/** \ingroup pk_module */ -/** - * \brief Parse a public key in PEM or DER format - * - * \param ctx key to be initialized - * \param key input buffer - * \param keylen size of the buffer - * (including the terminating null byte for PEM data) - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx, - const unsigned char *key, size_t keylen ); - -#if defined(MBEDTLS_FS_IO) -/** \ingroup pk_module */ -/** - * \brief Load and parse a private key - * - * \param ctx key to be initialized - * \param path filename to read the private key from - * \param password password to decrypt the file (can be NULL) - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx, - const char *path, const char *password ); - -/** \ingroup pk_module */ -/** - * \brief Load and parse a public key - * - * \param ctx key to be initialized - * \param path filename to read the public key from - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If - * you need a specific key type, check the result with - * mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path ); -#endif /* MBEDTLS_FS_IO */ -#endif /* MBEDTLS_PK_PARSE_C */ - -#if defined(MBEDTLS_PK_WRITE_C) -/** - * \brief Write a private key to a PKCS#1 or SEC1 DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx private to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return length of data written if successful, or a specific - * error code - */ -int mbedtls_pk_write_key_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); - -/** - * \brief Write a public key to a SubjectPublicKeyInfo DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx public key to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return length of data written if successful, or a specific - * error code - */ -int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); - -#if defined(MBEDTLS_PEM_WRITE_C) -/** - * \brief Write a public key to a PEM string - * - * \param ctx public key to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return 0 if successful, or a specific error code - */ -int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); - -/** - * \brief Write a private key to a PKCS#1 or SEC1 PEM string - * - * \param ctx private to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return 0 if successful, or a specific error code - */ -int mbedtls_pk_write_key_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); -#endif /* MBEDTLS_PEM_WRITE_C */ -#endif /* MBEDTLS_PK_WRITE_C */ - -/* - * WARNING: Low-level functions. You probably do not want to use these unless - * you are certain you do ;) - */ - -#if defined(MBEDTLS_PK_PARSE_C) -/** - * \brief Parse a SubjectPublicKeyInfo DER structure - * - * \param p the position in the ASN.1 data - * \param end end of the buffer - * \param pk the key to fill - * - * \return 0 if successful, or a specific PK error code - */ -int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end, - mbedtls_pk_context *pk ); -#endif /* MBEDTLS_PK_PARSE_C */ - -#if defined(MBEDTLS_PK_WRITE_C) -/** - * \brief Write a subjectPublicKey to ASN.1 data - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param key public key to write away - * - * \return the length written or a negative error code - */ -int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start, - const mbedtls_pk_context *key ); -#endif /* MBEDTLS_PK_WRITE_C */ - -/* - * Internal module functions. You probably do not want to use these unless you - * know you do. - */ -#if defined(MBEDTLS_FS_IO) -int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_PK_H */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/platform.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/platform.h deleted file mode 100644 index 89fe8a7b1..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/platform.h +++ /dev/null @@ -1,367 +0,0 @@ -/** - * \file platform.h - * - * \brief This file contains the definitions and functions of the - * Mbed TLS platform abstraction layer. - * - * The platform abstraction layer removes the need for the library - * to directly link to standard C library functions or operating - * system services, making the library easier to port and embed. - * Application developers and users of the library can provide their own - * implementations of these functions, or implementations specific to - * their platform, which can be statically linked to the library or - * dynamically configured at runtime. - */ -/* - * Copyright (C) 2006-2018, Arm Limited (or its affiliates), 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_PLATFORM_H -#define MBEDTLS_PLATFORM_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#if defined(MBEDTLS_HAVE_TIME) -#include "platform_time.h" -#endif - -#define MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED -0x0070 /**< Hardware accelerator failed */ -#define MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED -0x0072 /**< The requested feature is not supported by the platform */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) -#include -#include -#include -#if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF) -#if defined(_WIN32) -#define MBEDTLS_PLATFORM_STD_SNPRINTF mbedtls_platform_win32_snprintf /**< The default \c snprintf function to use. */ -#else -#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< The default \c snprintf function to use. */ -#endif -#endif -#if !defined(MBEDTLS_PLATFORM_STD_PRINTF) -#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< The default \c printf function to use. */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_FPRINTF) -#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< The default \c fprintf function to use. */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_CALLOC) -#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< The default \c calloc function to use. */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_FREE) -#define MBEDTLS_PLATFORM_STD_FREE free /**< The default \c free function to use. */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_EXIT) -#define MBEDTLS_PLATFORM_STD_EXIT exit /**< The default \c exit function to use. */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_TIME) -#define MBEDTLS_PLATFORM_STD_TIME time /**< The default \c time function to use. */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS) -#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS EXIT_SUCCESS /**< The default exit value to use. */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE) -#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE EXIT_FAILURE /**< The default exit value to use. */ -#endif -#if defined(MBEDTLS_FS_IO) -#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) -#define MBEDTLS_PLATFORM_STD_NV_SEED_READ mbedtls_platform_std_nv_seed_read -#endif -#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) -#define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write -#endif -#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_FILE) -#define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" -#endif -#endif /* MBEDTLS_FS_IO */ -#else /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ -#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) -#include MBEDTLS_PLATFORM_STD_MEM_HDR -#endif -#endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ - - -/* \} name SECTION: Module settings */ - -/* - * The function pointers for calloc and free. - */ -#if defined(MBEDTLS_PLATFORM_MEMORY) -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && \ - defined(MBEDTLS_PLATFORM_CALLOC_MACRO) -#define mbedtls_free MBEDTLS_PLATFORM_FREE_MACRO -#define mbedtls_calloc MBEDTLS_PLATFORM_CALLOC_MACRO -#else -/* For size_t */ -#include -extern void *mbedtls_calloc( size_t n, size_t size ); -extern void mbedtls_free( void *ptr ); - -/** - * \brief This function dynamically sets the memory-management - * functions used by the library, during runtime. - * - * \param calloc_func The \c calloc function implementation. - * \param free_func The \c free function implementation. - * - * \return \c 0. - */ -int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ), - void (*free_func)( void * ) ); -#endif /* MBEDTLS_PLATFORM_FREE_MACRO && MBEDTLS_PLATFORM_CALLOC_MACRO */ -#else /* !MBEDTLS_PLATFORM_MEMORY */ -#define mbedtls_free free -#define mbedtls_calloc calloc -#endif /* MBEDTLS_PLATFORM_MEMORY && !MBEDTLS_PLATFORM_{FREE,CALLOC}_MACRO */ - -/* - * The function pointers for fprintf - */ -#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) -/* We need FILE * */ -#include -extern int (*mbedtls_fprintf)( FILE *stream, const char *format, ... ); - -/** - * \brief This function dynamically configures the fprintf - * function that is called when the - * mbedtls_fprintf() function is invoked by the library. - * - * \param fprintf_func The \c fprintf function implementation. - * - * \return \c 0. - */ -int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *stream, const char *, - ... ) ); -#else -#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) -#define mbedtls_fprintf MBEDTLS_PLATFORM_FPRINTF_MACRO -#else -#define mbedtls_fprintf fprintf -#endif /* MBEDTLS_PLATFORM_FPRINTF_MACRO */ -#endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ - -/* - * The function pointers for printf - */ -#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) -extern int (*mbedtls_printf)( const char *format, ... ); - -/** - * \brief This function dynamically configures the snprintf - * function that is called when the mbedtls_snprintf() - * function is invoked by the library. - * - * \param printf_func The \c printf function implementation. - * - * \return \c 0 on success. - */ -int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) ); -#else /* !MBEDTLS_PLATFORM_PRINTF_ALT */ -#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) -#define mbedtls_printf MBEDTLS_PLATFORM_PRINTF_MACRO -#else -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_PRINTF_MACRO */ -#endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ - -/* - * The function pointers for snprintf - * - * The snprintf implementation should conform to C99: - * - it *must* always correctly zero-terminate the buffer - * (except when n == 0, then it must leave the buffer untouched) - * - however it is acceptable to return -1 instead of the required length when - * the destination buffer is too short. - */ -#if defined(_WIN32) -/* For Windows (inc. MSYS2), we provide our own fixed implementation */ -int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... ); -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) -extern int (*mbedtls_snprintf)( char * s, size_t n, const char * format, ... ); - -/** - * \brief This function allows configuring a custom - * \c snprintf function pointer. - * - * \param snprintf_func The \c snprintf function implementation. - * - * \return \c 0 on success. - */ -int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n, - const char * format, ... ) ); -#else /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ -#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) -#define mbedtls_snprintf MBEDTLS_PLATFORM_SNPRINTF_MACRO -#else -#define mbedtls_snprintf MBEDTLS_PLATFORM_STD_SNPRINTF -#endif /* MBEDTLS_PLATFORM_SNPRINTF_MACRO */ -#endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ - -/* - * The function pointers for exit - */ -#if defined(MBEDTLS_PLATFORM_EXIT_ALT) -extern void (*mbedtls_exit)( int status ); - -/** - * \brief This function dynamically configures the exit - * function that is called when the mbedtls_exit() - * function is invoked by the library. - * - * \param exit_func The \c exit function implementation. - * - * \return \c 0 on success. - */ -int mbedtls_platform_set_exit( void (*exit_func)( int status ) ); -#else -#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) -#define mbedtls_exit MBEDTLS_PLATFORM_EXIT_MACRO -#else -#define mbedtls_exit exit -#endif /* MBEDTLS_PLATFORM_EXIT_MACRO */ -#endif /* MBEDTLS_PLATFORM_EXIT_ALT */ - -/* - * The default exit values - */ -#if defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS) -#define MBEDTLS_EXIT_SUCCESS MBEDTLS_PLATFORM_STD_EXIT_SUCCESS -#else -#define MBEDTLS_EXIT_SUCCESS 0 -#endif -#if defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE) -#define MBEDTLS_EXIT_FAILURE MBEDTLS_PLATFORM_STD_EXIT_FAILURE -#else -#define MBEDTLS_EXIT_FAILURE 1 -#endif - -/* - * The function pointers for reading from and writing a seed file to - * Non-Volatile storage (NV) in a platform-independent way - * - * Only enabled when the NV seed entropy source is enabled - */ -#if defined(MBEDTLS_ENTROPY_NV_SEED) -#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO) -/* Internal standard platform definitions */ -int mbedtls_platform_std_nv_seed_read( unsigned char *buf, size_t buf_len ); -int mbedtls_platform_std_nv_seed_write( unsigned char *buf, size_t buf_len ); -#endif - -#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) -extern int (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len ); -extern int (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len ); - -/** - * \brief This function allows configuring custom seed file writing and - * reading functions. - * - * \param nv_seed_read_func The seed reading function implementation. - * \param nv_seed_write_func The seed writing function implementation. - * - * \return \c 0 on success. - */ -int mbedtls_platform_set_nv_seed( - int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ), - int (*nv_seed_write_func)( unsigned char *buf, size_t buf_len ) - ); -#else -#if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) && \ - defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO) -#define mbedtls_nv_seed_read MBEDTLS_PLATFORM_NV_SEED_READ_MACRO -#define mbedtls_nv_seed_write MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO -#else -#define mbedtls_nv_seed_read mbedtls_platform_std_nv_seed_read -#define mbedtls_nv_seed_write mbedtls_platform_std_nv_seed_write -#endif -#endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ -#endif /* MBEDTLS_ENTROPY_NV_SEED */ - -#if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) - -/** - * \brief The platform context structure. - * - * \note This structure may be used to assist platform-specific - * setup or teardown operations. - */ -typedef struct mbedtls_platform_context -{ - char dummy; /**< A placeholder member, as empty structs are not portable. */ -} -mbedtls_platform_context; - -#else -#include "platform_alt.h" -#endif /* !MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ - -/** - * \brief This function performs any platform-specific initialization - * operations. - * - * \note This function should be called before any other library functions. - * - * Its implementation is platform-specific, and unless - * platform-specific code is provided, it does nothing. - * - * \note The usage and necessity of this function is dependent on the platform. - * - * \param ctx The platform context. - * - * \return \c 0 on success. - */ -int mbedtls_platform_setup( mbedtls_platform_context *ctx ); -/** - * \brief This function performs any platform teardown operations. - * - * \note This function should be called after every other Mbed TLS module - * has been correctly freed using the appropriate free function. - * - * Its implementation is platform-specific, and unless - * platform-specific code is provided, it does nothing. - * - * \note The usage and necessity of this function is dependent on the platform. - * - * \param ctx The platform context. - * - */ -void mbedtls_platform_teardown( mbedtls_platform_context *ctx ); - -#ifdef __cplusplus -} -#endif - -#endif /* platform.h */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/platform_util.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/platform_util.h deleted file mode 100644 index 164a1a05f..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/platform_util.h +++ /dev/null @@ -1,103 +0,0 @@ -/** - * \file platform_util.h - * - * \brief Common and shared functions used by multiple modules in the Mbed TLS - * library. - */ -/* - * Copyright (C) 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_PLATFORM_UTIL_H -#define MBEDTLS_PLATFORM_UTIL_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "mbedtls/config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#if defined(MBEDTLS_HAVE_TIME_DATE) -#include "mbedtls/platform_time.h" -#include -#endif /* MBEDTLS_HAVE_TIME_DATE */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Securely zeroize a buffer - * - * The function is meant to wipe the data contained in a buffer so - * that it can no longer be recovered even if the program memory - * is later compromised. Call this function on sensitive data - * stored on the stack before returning from a function, and on - * sensitive data stored on the heap before freeing the heap - * object. - * - * It is extremely difficult to guarantee that calls to - * mbedtls_platform_zeroize() are not removed by aggressive - * compiler optimizations in a portable way. For this reason, Mbed - * TLS provides the configuration option - * MBEDTLS_PLATFORM_ZEROIZE_ALT, which allows users to configure - * mbedtls_platform_zeroize() to use a suitable implementation for - * their platform and needs - * - * \param buf Buffer to be zeroized - * \param len Length of the buffer in bytes - * - */ -void mbedtls_platform_zeroize( void *buf, size_t len ); - -#if defined(MBEDTLS_HAVE_TIME_DATE) -/** - * \brief Platform-specific implementation of gmtime_r() - * - * The function is a thread-safe abstraction that behaves - * similarly to the gmtime_r() function from Unix/POSIX. - * - * Mbed TLS will try to identify the underlying platform and - * make use of an appropriate underlying implementation (e.g. - * gmtime_r() for POSIX and gmtime_s() for Windows). If this is - * not possible, then gmtime() will be used. In this case, calls - * from the library to gmtime() will be guarded by the mutex - * mbedtls_threading_gmtime_mutex if MBEDTLS_THREADING_C is - * enabled. It is recommended that calls from outside the library - * are also guarded by this mutex. - * - * If MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, then Mbed TLS will - * unconditionally use the alternative implementation for - * mbedtls_platform_gmtime_r() supplied by the user at compile time. - * - * \param tt Pointer to an object containing time (in seconds) since the - * epoch to be converted - * \param tm_buf Pointer to an object where the results will be stored - * - * \return Pointer to an object of type struct tm on success, otherwise - * NULL - */ -struct tm *mbedtls_platform_gmtime_r( const mbedtls_time_t *tt, - struct tm *tm_buf ); -#endif /* MBEDTLS_HAVE_TIME_DATE */ - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_PLATFORM_UTIL_H */ diff --git a/mcuboot/ext/mbedtls-asn1/include/mbedtls/threading.h b/mcuboot/ext/mbedtls-asn1/include/mbedtls/threading.h deleted file mode 100644 index 92e6e6b98..000000000 --- a/mcuboot/ext/mbedtls-asn1/include/mbedtls/threading.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - * \file threading.h - * - * \brief Threading abstraction layer - */ -/* - * Copyright (C) 2006-2015, 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_THREADING_H -#define MBEDTLS_THREADING_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE is deprecated and should not be - * used. */ -#define MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE -0x001A /**< The selected feature is not available. */ - -#define MBEDTLS_ERR_THREADING_BAD_INPUT_DATA -0x001C /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_THREADING_MUTEX_ERROR -0x001E /**< Locking / unlocking / free failed with error code. */ - -#if defined(MBEDTLS_THREADING_PTHREAD) -#include -typedef struct mbedtls_threading_mutex_t -{ - pthread_mutex_t mutex; - char is_valid; -} mbedtls_threading_mutex_t; -#endif - -#if defined(MBEDTLS_THREADING_ALT) -/* You should define the mbedtls_threading_mutex_t type in your header */ -#include "threading_alt.h" - -/** - * \brief Set your alternate threading implementation function - * pointers and initialize global mutexes. If used, this - * function must be called once in the main thread before any - * other mbed TLS function is called, and - * mbedtls_threading_free_alt() must be called once in the main - * thread after all other mbed TLS functions. - * - * \note mutex_init() and mutex_free() don't return a status code. - * If mutex_init() fails, it should leave its argument (the - * mutex) in a state such that mutex_lock() will fail when - * called with this argument. - * - * \param mutex_init the init function implementation - * \param mutex_free the free function implementation - * \param mutex_lock the lock function implementation - * \param mutex_unlock the unlock function implementation - */ -void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ), - void (*mutex_free)( mbedtls_threading_mutex_t * ), - int (*mutex_lock)( mbedtls_threading_mutex_t * ), - int (*mutex_unlock)( mbedtls_threading_mutex_t * ) ); - -/** - * \brief Free global mutexes. - */ -void mbedtls_threading_free_alt( void ); -#endif /* MBEDTLS_THREADING_ALT */ - -#if defined(MBEDTLS_THREADING_C) -/* - * The function pointers for mutex_init, mutex_free, mutex_ and mutex_unlock - * - * All these functions are expected to work or the result will be undefined. - */ -extern void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t *mutex ); -extern void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t *mutex ); -extern int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t *mutex ); -extern int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t *mutex ); - -/* - * Global mutexes - */ -#if defined(MBEDTLS_FS_IO) -extern mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex; -#endif - -#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) -/* This mutex may or may not be used in the default definition of - * mbedtls_platform_gmtime_r(), but in order to determine that, - * we need to check POSIX features, hence modify _POSIX_C_SOURCE. - * With the current approach, this declaration is orphaned, lacking - * an accompanying definition, in case mbedtls_platform_gmtime_r() - * doesn't need it, but that's not a problem. */ -extern mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex; -#endif /* MBEDTLS_HAVE_TIME_DATE && !MBEDTLS_PLATFORM_GMTIME_R_ALT */ - -#endif /* MBEDTLS_THREADING_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* threading.h */ diff --git a/mcuboot/ext/mbedtls-asn1/pkg.yml b/mcuboot/ext/mbedtls-asn1/pkg.yml deleted file mode 100644 index 148f9c712..000000000 --- a/mcuboot/ext/mbedtls-asn1/pkg.yml +++ /dev/null @@ -1,24 +0,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. -# - -pkg.name: ext/mbedtls-asn1 -pkg.description: "MCUboot's bundled mbed-tls ASN1 parser" -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: diff --git a/mcuboot/ext/mbedtls-asn1/src/asn1parse.c b/mcuboot/ext/mbedtls-asn1/src/asn1parse.c deleted file mode 100644 index 171c340b8..000000000 --- a/mcuboot/ext/mbedtls-asn1/src/asn1parse.c +++ /dev/null @@ -1,389 +0,0 @@ -/* - * Generic ASN.1 parsing - * - * Copyright (C) 2006-2015, 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) - */ - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "mbedtls/config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#if defined(MBEDTLS_ASN1_PARSE_C) - -#include "mbedtls/asn1.h" -#include "mbedtls/platform_util.h" - -#include - -#if defined(MBEDTLS_BIGNUM_C) -#include "mbedtls/bignum.h" -#endif - -#if defined(MBEDTLS_PLATFORM_C) -#include "mbedtls/platform.h" -#else -#include -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif - -/* - * ASN.1 DER decoding routines - */ -int mbedtls_asn1_get_len( unsigned char **p, - const unsigned char *end, - size_t *len ) -{ - if( ( end - *p ) < 1 ) - return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - - if( ( **p & 0x80 ) == 0 ) - *len = *(*p)++; - else - { - switch( **p & 0x7F ) - { - case 1: - if( ( end - *p ) < 2 ) - return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - - *len = (*p)[1]; - (*p) += 2; - break; - - case 2: - if( ( end - *p ) < 3 ) - return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - - *len = ( (size_t)(*p)[1] << 8 ) | (*p)[2]; - (*p) += 3; - break; - - case 3: - if( ( end - *p ) < 4 ) - return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - - *len = ( (size_t)(*p)[1] << 16 ) | - ( (size_t)(*p)[2] << 8 ) | (*p)[3]; - (*p) += 4; - break; - - case 4: - if( ( end - *p ) < 5 ) - return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - - *len = ( (size_t)(*p)[1] << 24 ) | ( (size_t)(*p)[2] << 16 ) | - ( (size_t)(*p)[3] << 8 ) | (*p)[4]; - (*p) += 5; - break; - - default: - return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); - } - } - - if( *len > (size_t) ( end - *p ) ) - return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - - return( 0 ); -} - -int mbedtls_asn1_get_tag( unsigned char **p, - const unsigned char *end, - size_t *len, int tag ) -{ - if( ( end - *p ) < 1 ) - return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - - if( **p != tag ) - return( MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); - - (*p)++; - - return( mbedtls_asn1_get_len( p, end, len ) ); -} - -int mbedtls_asn1_get_bool( unsigned char **p, - const unsigned char *end, - int *val ) -{ - int ret; - size_t len; - - if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_BOOLEAN ) ) != 0 ) - return( ret ); - - if( len != 1 ) - return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); - - *val = ( **p != 0 ) ? 1 : 0; - (*p)++; - - return( 0 ); -} - -int mbedtls_asn1_get_int( unsigned char **p, - const unsigned char *end, - int *val ) -{ - int ret; - size_t len; - - if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) - return( ret ); - - if( len == 0 || len > sizeof( int ) || ( **p & 0x80 ) != 0 ) - return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); - - *val = 0; - - while( len-- > 0 ) - { - *val = ( *val << 8 ) | **p; - (*p)++; - } - - return( 0 ); -} - -#if defined(MBEDTLS_BIGNUM_C) -int mbedtls_asn1_get_mpi( unsigned char **p, - const unsigned char *end, - mbedtls_mpi *X ) -{ - int ret; - size_t len; - - if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) - return( ret ); - - ret = mbedtls_mpi_read_binary( X, *p, len ); - - *p += len; - - return( ret ); -} -#endif /* MBEDTLS_BIGNUM_C */ - -int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end, - mbedtls_asn1_bitstring *bs) -{ - int ret; - - /* Certificate type is a single byte bitstring */ - if( ( ret = mbedtls_asn1_get_tag( p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 ) - return( ret ); - - /* Check length, subtract one for actual bit string length */ - if( bs->len < 1 ) - return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - bs->len -= 1; - - /* Get number of unused bits, ensure unused bits <= 7 */ - bs->unused_bits = **p; - if( bs->unused_bits > 7 ) - return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); - (*p)++; - - /* Get actual bitstring */ - bs->p = *p; - *p += bs->len; - - if( *p != end ) - return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); - - return( 0 ); -} - -/* - * Get a bit string without unused bits - */ -int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end, - size_t *len ) -{ - int ret; - - if( ( ret = mbedtls_asn1_get_tag( p, end, len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 ) - return( ret ); - - if( (*len)-- < 2 || *(*p)++ != 0 ) - return( MBEDTLS_ERR_ASN1_INVALID_DATA ); - - return( 0 ); -} - - - -/* - * Parses and splits an ASN.1 "SEQUENCE OF " - */ -int mbedtls_asn1_get_sequence_of( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_sequence *cur, - int tag) -{ - int ret; - size_t len; - mbedtls_asn1_buf *buf; - - /* Get main sequence tag */ - if( ( ret = mbedtls_asn1_get_tag( p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) - return( ret ); - - if( *p + len != end ) - return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); - - while( *p < end ) - { - buf = &(cur->buf); - buf->tag = **p; - - if( ( ret = mbedtls_asn1_get_tag( p, end, &buf->len, tag ) ) != 0 ) - return( ret ); - - buf->p = *p; - *p += buf->len; - - /* Allocate and assign next pointer */ - if( *p < end ) - { - cur->next = (mbedtls_asn1_sequence*)mbedtls_calloc( 1, - sizeof( mbedtls_asn1_sequence ) ); - - if( cur->next == NULL ) - return( MBEDTLS_ERR_ASN1_ALLOC_FAILED ); - - cur = cur->next; - } - } - - /* Set final sequence entry's next pointer to NULL */ - cur->next = NULL; - - if( *p != end ) - return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); - - return( 0 ); -} - -int mbedtls_asn1_get_alg( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params ) -{ - int ret; - size_t len; - - if( ( ret = mbedtls_asn1_get_tag( p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) - return( ret ); - - if( ( end - *p ) < 1 ) - return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - - alg->tag = **p; - end = *p + len; - - if( ( ret = mbedtls_asn1_get_tag( p, end, &alg->len, MBEDTLS_ASN1_OID ) ) != 0 ) - return( ret ); - - alg->p = *p; - *p += alg->len; - - if( *p == end ) - { - mbedtls_platform_zeroize( params, sizeof(mbedtls_asn1_buf) ); - return( 0 ); - } - - params->tag = **p; - (*p)++; - - if( ( ret = mbedtls_asn1_get_len( p, end, ¶ms->len ) ) != 0 ) - return( ret ); - - params->p = *p; - *p += params->len; - - if( *p != end ) - return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); - - return( 0 ); -} - -int mbedtls_asn1_get_alg_null( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_buf *alg ) -{ - int ret; - mbedtls_asn1_buf params; - - memset( ¶ms, 0, sizeof(mbedtls_asn1_buf) ); - - if( ( ret = mbedtls_asn1_get_alg( p, end, alg, ¶ms ) ) != 0 ) - return( ret ); - - if( ( params.tag != MBEDTLS_ASN1_NULL && params.tag != 0 ) || params.len != 0 ) - return( MBEDTLS_ERR_ASN1_INVALID_DATA ); - - return( 0 ); -} - -void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *cur ) -{ - if( cur == NULL ) - return; - - mbedtls_free( cur->oid.p ); - mbedtls_free( cur->val.p ); - - mbedtls_platform_zeroize( cur, sizeof( mbedtls_asn1_named_data ) ); -} - -void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head ) -{ - mbedtls_asn1_named_data *cur; - - while( ( cur = *head ) != NULL ) - { - *head = cur->next; - mbedtls_asn1_free_named_data( cur ); - mbedtls_free( cur ); - } -} - -mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list, - const char *oid, size_t len ) -{ - while( list != NULL ) - { - if( list->oid.len == len && - memcmp( list->oid.p, oid, len ) == 0 ) - { - break; - } - - list = list->next; - } - - return( list ); -} - -#endif /* MBEDTLS_ASN1_PARSE_C */ diff --git a/mcuboot/ext/mbedtls-asn1/src/platform_util.c b/mcuboot/ext/mbedtls-asn1/src/platform_util.c deleted file mode 100644 index ca5fe4fb8..000000000 --- a/mcuboot/ext/mbedtls-asn1/src/platform_util.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Common and shared functions used by multiple modules in the Mbed TLS - * library. - * - * Copyright (C) 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) - */ - -/* - * Ensure gmtime_r is available even with -std=c99; must be defined before - * config.h, which pulls in glibc's features.h. Harmless on other platforms. - */ -#if !defined(_POSIX_C_SOURCE) -#define _POSIX_C_SOURCE 200112L -#endif - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "mbedtls/config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "mbedtls/platform_util.h" -#include "mbedtls/threading.h" - -#include -#include - -#if !defined(MBEDTLS_PLATFORM_ZEROIZE_ALT) -/* - * This implementation should never be optimized out by the compiler - * - * This implementation for mbedtls_platform_zeroize() was inspired from Colin - * Percival's blog article at: - * - * http://www.daemonology.net/blog/2014-09-04-how-to-zero-a-buffer.html - * - * It uses a volatile function pointer to the standard memset(). Because the - * pointer is volatile the compiler expects it to change at - * any time and will not optimize out the call that could potentially perform - * other operations on the input buffer instead of just setting it to 0. - * Nevertheless, as pointed out by davidtgoldblatt on Hacker News - * (refer to http://www.daemonology.net/blog/2014-09-05-erratum.html for - * details), optimizations of the following form are still possible: - * - * if( memset_func != memset ) - * memset_func( buf, 0, len ); - * - * Note that it is extremely difficult to guarantee that - * mbedtls_platform_zeroize() will not be optimized out by aggressive compilers - * in a portable way. For this reason, Mbed TLS also provides the configuration - * option MBEDTLS_PLATFORM_ZEROIZE_ALT, which allows users to configure - * mbedtls_platform_zeroize() to use a suitable implementation for their - * platform and needs. - */ -static void * (* const volatile memset_func)( void *, int, size_t ) = memset; - -void mbedtls_platform_zeroize( void *buf, size_t len ) -{ - memset_func( buf, 0, len ); -} -#endif /* MBEDTLS_PLATFORM_ZEROIZE_ALT */ - -#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) -#include -#if !defined(_WIN32) && (defined(unix) || \ - defined(__unix) || defined(__unix__) || (defined(__APPLE__) && \ - defined(__MACH__))) -#include -#endif /* !_WIN32 && (unix || __unix || __unix__ || - * (__APPLE__ && __MACH__)) */ - -#if !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ - ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ - _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) -/* - * This is a convenience shorthand macro to avoid checking the long - * preprocessor conditions above. Ideally, we could expose this macro in - * platform_util.h and simply use it in platform_util.c, threading.c and - * threading.h. However, this macro is not part of the Mbed TLS public API, so - * we keep it private by only defining it in this file - */ -#if ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) -#define PLATFORM_UTIL_USE_GMTIME -#endif /* ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) */ - -#endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ - ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ - _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) */ - -struct tm *mbedtls_platform_gmtime_r( const mbedtls_time_t *tt, - struct tm *tm_buf ) -{ -#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) - return( ( gmtime_s( tm_buf, tt ) == 0 ) ? tm_buf : NULL ); -#elif !defined(PLATFORM_UTIL_USE_GMTIME) - return( gmtime_r( tt, tm_buf ) ); -#else - struct tm *lt; - -#if defined(MBEDTLS_THREADING_C) - if( mbedtls_mutex_lock( &mbedtls_threading_gmtime_mutex ) != 0 ) - return( NULL ); -#endif /* MBEDTLS_THREADING_C */ - - lt = gmtime( tt ); - - if( lt != NULL ) - { - memcpy( tm_buf, lt, sizeof( struct tm ) ); - } - -#if defined(MBEDTLS_THREADING_C) - if( mbedtls_mutex_unlock( &mbedtls_threading_gmtime_mutex ) != 0 ) - return( NULL ); -#endif /* MBEDTLS_THREADING_C */ - - return( ( lt == NULL ) ? NULL : tm_buf ); -#endif /* _WIN32 && !EFIX64 && !EFI32 */ -} -#endif /* MBEDTLS_HAVE_TIME_DATE && MBEDTLS_PLATFORM_GMTIME_R_ALT */ diff --git a/mcuboot/ext/nrf/README.md b/mcuboot/ext/nrf/README.md deleted file mode 100644 index ba4cfaad5..000000000 --- a/mcuboot/ext/nrf/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Building MCUBoot with nRF52840 CC310 enabled - -## Pre-prerequisites - -Clone [nrfxlib](https://github.com/NordicPlayground/nrfxlib) next to the mcuboot root folder. So that it's located `../nrfxlib` from mcuboots root folder. - -## Building - -make sure `root-ec-p256.pem` is set as the certificate and that `CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256` is selected not `CONFIG_BOOT_SIGNATURE_TYPE_RSA` in `prj.conf` of `boot/zephyr`. -Since it defaults to tinycrypt you'll have to go into `menuconfig` and change the implementation selection to `cc310` or also set this in `prj.conf`. - -``` -mkdir build && cd build -cmake -GNinja -DBOARD=nrf52840dk_nrf52840 -ninja flash -``` - -Build a hello world example in zephyr and sign it with imgtool.py with the `root-ec-p256.pem` and flash it at `FLASH_AREA_IMAGE_0`. diff --git a/mcuboot/ext/nrf/cc310_glue.c b/mcuboot/ext/nrf/cc310_glue.c deleted file mode 100644 index 14b9ac600..000000000 --- a/mcuboot/ext/nrf/cc310_glue.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2019 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic - */ - -#include "cc310_glue.h" - -int cc310_init(void) -{ - /* Only initialize once */ - static bool initialized; - - if (!initialized) { - nrf_cc310_enable(); - if (nrf_cc310_bl_init() != 0) { - return -1; - } - initialized = true; - nrf_cc310_disable(); - } - - return 0; -} - -void cc310_sha256_update(nrf_cc310_bl_hash_context_sha256_t *ctx, - const void *data, - uint32_t data_len) -{ - /* - * NRF Cryptocell can only read from RAM this allocates a buffer on the stack - * if the data provided is not located in RAM. - */ - - if ((uint32_t) data < CONFIG_SRAM_BASE_ADDRESS) { - uint8_t stack_buffer[data_len]; - uint32_t block_len = data_len; - memcpy(stack_buffer, data, block_len); - nrf_cc310_bl_hash_sha256_update(ctx, stack_buffer, block_len); - } else { - nrf_cc310_bl_hash_sha256_update(ctx, data, data_len); - } -}; - -int cc310_ecdsa_verify_secp256r1(uint8_t *hash, - uint8_t *public_key, - uint8_t *signature, - size_t hash_len) -{ - int rc; - nrf_cc310_bl_ecdsa_verify_context_secp256r1_t ctx; - cc310_init(); - nrf_cc310_enable(); - rc = nrf_cc310_bl_ecdsa_verify_secp256r1(&ctx, - (nrf_cc310_bl_ecc_public_key_secp256r1_t *) public_key, - (nrf_cc310_bl_ecc_signature_secp256r1_t *) signature, - hash, - hash_len); - nrf_cc310_disable(); - return rc; -} - diff --git a/mcuboot/ext/nrf/cc310_glue.h b/mcuboot/ext/nrf/cc310_glue.h deleted file mode 100644 index 92f03c8ac..000000000 --- a/mcuboot/ext/nrf/cc310_glue.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2019 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic - */ -#ifndef NRF_CC310_GLUE_H__ -#define NRF_CC310_GLUE_H__ - -#include -#include -#include -#include -#include -#include - -typedef nrf_cc310_bl_hash_context_sha256_t bootutil_sha256_context; - -int cc310_ecdsa_verify_secp256r1(uint8_t *hash, - uint8_t *public_key, - uint8_t *signature, - size_t hash_len); - - -int cc310_init(void); - -static inline void cc310_sha256_init(nrf_cc310_bl_hash_context_sha256_t *ctx); - -void cc310_sha256_update(nrf_cc310_bl_hash_context_sha256_t *ctx, - const void *data, - uint32_t data_len); - -static inline void nrf_cc310_enable(void) -{ - NRF_CRYPTOCELL->ENABLE=1; -} - -static inline void nrf_cc310_disable(void) -{ - NRF_CRYPTOCELL->ENABLE=0; -} - -/* Enable and disable cc310 to reduce power consumption */ -static inline void cc310_sha256_init(nrf_cc310_bl_hash_context_sha256_t * ctx) -{ - cc310_init(); - nrf_cc310_enable(); - nrf_cc310_bl_hash_sha256_init(ctx); -} - -static inline void cc310_sha256_finalize(bootutil_sha256_context *ctx, - uint8_t *output) -{ - nrf_cc310_bl_hash_sha256_finalize(ctx, - (nrf_cc310_bl_hash_digest_sha256_t *)output); - nrf_cc310_disable(); -} - -#endif /* NRF_CC310_GLUE_H__ */ diff --git a/mcuboot/ext/tinycrypt-sha512/lib/include/tinycrypt/sha512.h b/mcuboot/ext/tinycrypt-sha512/lib/include/tinycrypt/sha512.h deleted file mode 100644 index f0211b251..000000000 --- a/mcuboot/ext/tinycrypt-sha512/lib/include/tinycrypt/sha512.h +++ /dev/null @@ -1,129 +0,0 @@ -/* sha512.h - TinyCrypt interface to a SHA-512 implementation */ - -/* - * Copyright (C) 2020 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to a SHA-512 implementation. - * - * Overview: SHA-512 is a NIST approved cryptographic hashing algorithm - * specified in FIPS 180. A hash algorithm maps data of arbitrary - * size to data of fixed length. - * - * Security: SHA-512 provides 256 bits of security against collision attacks - * and 512 bits of security against pre-image attacks. SHA-512 does - * NOT behave like a random oracle, but it can be used as one if - * the string being hashed is prefix-free encoded before hashing. - * - * Usage: 1) call tc_sha512_init to initialize a struct - * tc_sha512_state_struct before hashing a new string. - * - * 2) call tc_sha512_update to hash the next string segment; - * tc_sha512_update can be called as many times as needed to hash - * all of the segments of a string; the order is important. - * - * 3) call tc_sha512_final to out put the digest from a hashing - * operation. - */ - -#ifndef __TC_SHA512_H__ -#define __TC_SHA512_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define TC_SHA512_BLOCK_SIZE (128) -#define TC_SHA512_DIGEST_SIZE (64) -#define TC_SHA512_STATE_BLOCKS (TC_SHA512_DIGEST_SIZE/8) - -struct tc_sha512_state_struct { - uint64_t iv[TC_SHA512_STATE_BLOCKS]; - uint64_t bits_hashed; - uint8_t leftover[TC_SHA512_BLOCK_SIZE]; - size_t leftover_offset; -}; - -typedef struct tc_sha512_state_struct *TCSha512State_t; - -/** - * @brief SHA512 initialization procedure - * Initializes s - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if s == NULL - * @param s Sha512 state struct - */ -int tc_sha512_init(TCSha512State_t s); - -/** - * @brief SHA512 update procedure - * Hashes data_length bytes addressed by data into state s - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * s == NULL, - * s->iv == NULL, - * data == NULL - * @note Assumes s has been initialized by tc_sha512_init - * @warning The state buffer 'leftover' is left in memory after processing - * If your application intends to have sensitive data in this - * buffer, remind to erase it after the data has been processed - * @param s Sha512 state struct - * @param data message to hash - * @param datalen length of message to hash - */ -int tc_sha512_update (TCSha512State_t s, const uint8_t *data, size_t datalen); - -/** - * @brief SHA512 final procedure - * Inserts the completed hash computation into digest - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * s == NULL, - * s->iv == NULL, - * digest == NULL - * @note Assumes: s has been initialized by tc_sha512_init - * digest points to at least TC_SHA512_DIGEST_SIZE bytes - * @warning The state buffer 'leftover' is left in memory after processing - * If your application intends to have sensitive data in this - * buffer, remind to erase it after the data has been processed - * @param digest unsigned eight bit integer - * @param Sha512 state struct - */ -int tc_sha512_final(uint8_t *digest, TCSha512State_t s); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_SHA512_H__ */ diff --git a/mcuboot/ext/tinycrypt-sha512/lib/pkg.yml b/mcuboot/ext/tinycrypt-sha512/lib/pkg.yml deleted file mode 100644 index b9cb8e6ba..000000000 --- a/mcuboot/ext/tinycrypt-sha512/lib/pkg.yml +++ /dev/null @@ -1,30 +0,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. -# - -pkg.name: ext/tinycrypt-sha512/lib -pkg.description: "MCUboot's SHA512 for tinycrypt" -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - -pkg.src_dirs: - - "source" - -pkg.cflags: - - "-std=c99" diff --git a/mcuboot/ext/tinycrypt-sha512/lib/source/sha512.c b/mcuboot/ext/tinycrypt-sha512/lib/source/sha512.c deleted file mode 100644 index eb3aa7682..000000000 --- a/mcuboot/ext/tinycrypt-sha512/lib/source/sha512.c +++ /dev/null @@ -1,234 +0,0 @@ -/* sha512.c - TinyCrypt SHA-512 crypto hash algorithm implementation */ - -/* - * Copyright (C) 2020 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -static void compress(uint64_t *iv, const uint8_t *data); - -int tc_sha512_init(TCSha512State_t s) -{ - /* input sanity check: */ - if (s == (TCSha512State_t) 0) { - return TC_CRYPTO_FAIL; - } - - /* - * Setting the initial state values. - * These values correspond to the first 64 bits of the fractional parts - * of the square roots of the first 8 primes: 2, 3, 5, 7, 11, 13, 17 - * and 19. - */ - _set((uint8_t *) s, 0x00, sizeof(*s)); - s->iv[0] = 0x6a09e667f3bcc908; - s->iv[1] = 0xbb67ae8584caa73b; - s->iv[2] = 0x3c6ef372fe94f82b; - s->iv[3] = 0xa54ff53a5f1d36f1; - s->iv[4] = 0x510e527fade682d1; - s->iv[5] = 0x9b05688c2b3e6c1f; - s->iv[6] = 0x1f83d9abfb41bd6b; - s->iv[7] = 0x5be0cd19137e2179; - - return TC_CRYPTO_SUCCESS; -} - -int tc_sha512_update(TCSha512State_t s, const uint8_t *data, size_t datalen) -{ - /* input sanity check: */ - if (s == (TCSha512State_t) 0 || data == (void *) 0) { - return TC_CRYPTO_FAIL; - } else if (datalen == 0) { - return TC_CRYPTO_SUCCESS; - } - - while (datalen-- > 0) { - s->leftover[s->leftover_offset++] = *(data++); - if (s->leftover_offset >= TC_SHA512_BLOCK_SIZE) { - compress(s->iv, s->leftover); - s->leftover_offset = 0; - s->bits_hashed += (TC_SHA512_BLOCK_SIZE << 3); - } - } - - return TC_CRYPTO_SUCCESS; -} - -int tc_sha512_final(uint8_t *digest, TCSha512State_t s) -{ - unsigned int i; - - /* input sanity check: */ - if (digest == (uint8_t *) 0 || s == (TCSha512State_t) 0) { - return TC_CRYPTO_FAIL; - } - - s->bits_hashed += (s->leftover_offset << 3); - - s->leftover[s->leftover_offset++] = 0x80; /* always room for one byte */ - if (s->leftover_offset > (sizeof(s->leftover) - 16)) { - /* there is not room for all the padding in this block */ - _set(s->leftover + s->leftover_offset, 0x00, - sizeof(s->leftover) - s->leftover_offset); - compress(s->iv, s->leftover); - s->leftover_offset = 0; - } - - /* - * add the padding and the length in big-Endian format - * - * NOTE: SHA-512 uses 128 bits for the length of the message, but the - * current implementation is only using 64 bits for size, leaving the - * 64 "upper" bits zeroed. - */ - _set(s->leftover + s->leftover_offset, 0x00, - sizeof(s->leftover) - 8 - s->leftover_offset); - s->leftover[sizeof(s->leftover) - 1] = (uint8_t)(s->bits_hashed); - s->leftover[sizeof(s->leftover) - 2] = (uint8_t)(s->bits_hashed >> 8); - s->leftover[sizeof(s->leftover) - 3] = (uint8_t)(s->bits_hashed >> 16); - s->leftover[sizeof(s->leftover) - 4] = (uint8_t)(s->bits_hashed >> 24); - s->leftover[sizeof(s->leftover) - 5] = (uint8_t)(s->bits_hashed >> 32); - s->leftover[sizeof(s->leftover) - 6] = (uint8_t)(s->bits_hashed >> 40); - s->leftover[sizeof(s->leftover) - 7] = (uint8_t)(s->bits_hashed >> 48); - s->leftover[sizeof(s->leftover) - 8] = (uint8_t)(s->bits_hashed >> 56); - - /* hash the padding and length */ - compress(s->iv, s->leftover); - - /* copy the iv out to digest */ - for (i = 0; i < TC_SHA512_STATE_BLOCKS; ++i) { - uint64_t t = *((uint64_t *) &s->iv[i]); - *digest++ = (uint8_t)(t >> 56); - *digest++ = (uint8_t)(t >> 48); - *digest++ = (uint8_t)(t >> 40); - *digest++ = (uint8_t)(t >> 32); - *digest++ = (uint8_t)(t >> 24); - *digest++ = (uint8_t)(t >> 16); - *digest++ = (uint8_t)(t >> 8); - *digest++ = (uint8_t)(t); - } - - /* destroy the current state */ - _set(s, 0, sizeof(*s)); - - return TC_CRYPTO_SUCCESS; -} - -/* - * Initializing SHA-512 Hash constant words K. - * These values correspond to the first 64 bits of the fractional parts of the - * cube roots of the first 80 primes between 2 and 409. - */ -static const uint64_t k512[80] = { - 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, - 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe, - 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, - 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, - 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab, - 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, - 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, - 0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, - 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, - 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, - 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, - 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, - 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c, - 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, - 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, - 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 -}; - -static inline uint64_t ROTR(uint64_t a, uint64_t n) -{ - return (((a) >> n) | ((a) << (64 - n))); -} - -#define Sigma0(a)(ROTR((a), 28) ^ ROTR((a), 34) ^ ROTR((a), 39)) -#define Sigma1(a)(ROTR((a), 14) ^ ROTR((a), 18) ^ ROTR((a), 41)) -#define sigma0(a)(ROTR((a), 1) ^ ROTR((a), 8) ^ ((a) >> 7)) -#define sigma1(a)(ROTR((a), 19) ^ ROTR((a), 61) ^ ((a) >> 6)) - -#define Ch(a, b, c)(((a) & (b)) ^ ((~(a)) & (c))) -#define Maj(a, b, c)(((a) & (b)) ^ ((a) & (c)) ^ ((b) & (c))) - -static inline uint64_t BigEndian(const uint8_t **c) -{ - uint64_t n = 0; - - n = (uint64_t)(*((*c)++)) << 56; - n |= (uint64_t)(*((*c)++)) << 48; - n |= (uint64_t)(*((*c)++)) << 40; - n |= (uint64_t)(*((*c)++)) << 32; - n |= (uint64_t)(*((*c)++)) << 24; - n |= (uint64_t)(*((*c)++)) << 16; - n |= (uint64_t)(*((*c)++)) << 8; - n |= (uint64_t)(*((*c)++)); - return n; -} - -static void compress(uint64_t *iv, const uint8_t *data) -{ - uint64_t a, b, c, d, e, f, g, h; - uint64_t s0, s1; - uint64_t t1, t2; - uint64_t work_space[16]; - uint64_t n; - unsigned int i; - - a = iv[0]; b = iv[1]; c = iv[2]; d = iv[3]; - e = iv[4]; f = iv[5]; g = iv[6]; h = iv[7]; - - for (i = 0; i < 16; ++i) { - n = BigEndian(&data); - t1 = work_space[i] = n; - t1 += h + Sigma1(e) + Ch(e, f, g) + k512[i]; - t2 = Sigma0(a) + Maj(a, b, c); - h = g; g = f; f = e; e = d + t1; - d = c; c = b; b = a; a = t1 + t2; - } - - for ( ; i < 80; ++i) { - s0 = work_space[(i+1)&0x0f]; - s0 = sigma0(s0); - s1 = work_space[(i+14)&0x0f]; - s1 = sigma1(s1); - - t1 = work_space[i&0xf] += s0 + s1 + work_space[(i+9)&0xf]; - t1 += h + Sigma1(e) + Ch(e, f, g) + k512[i]; - t2 = Sigma0(a) + Maj(a, b, c); - h = g; g = f; f = e; e = d + t1; - d = c; c = b; b = a; a = t1 + t2; - } - - iv[0] += a; iv[1] += b; iv[2] += c; iv[3] += d; - iv[4] += e; iv[5] += f; iv[6] += g; iv[7] += h; -} diff --git a/mcuboot/ext/tinycrypt/.gitignore b/mcuboot/ext/tinycrypt/.gitignore deleted file mode 100644 index c960ccc71..000000000 --- a/mcuboot/ext/tinycrypt/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.o -*~ -*.d -*.exe -*.a diff --git a/mcuboot/ext/tinycrypt/AUTHORS b/mcuboot/ext/tinycrypt/AUTHORS deleted file mode 100644 index 0a8e9f806..000000000 --- a/mcuboot/ext/tinycrypt/AUTHORS +++ /dev/null @@ -1,15 +0,0 @@ -Architect: -Rafael Misoczki - -Open Source Maintainer: -Constanza Heath -Rafael Misoczki - -Contributors: -Constanza Heath -Rafael Misoczki -Flavio Santes -Jarkko Sakkinen -Chris Morrison -Marti Bolivar -Colin Ian King diff --git a/mcuboot/ext/tinycrypt/LICENSE b/mcuboot/ext/tinycrypt/LICENSE deleted file mode 100644 index 2e1db516a..000000000 --- a/mcuboot/ext/tinycrypt/LICENSE +++ /dev/null @@ -1,61 +0,0 @@ - -================================================================================ - - TinyCrypt Cryptographic Library - -================================================================================ - - Copyright (c) 2017, Intel Corporation. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - - Neither the name of the Intel Corporation nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -================================================================================ -Copyright (c) 2014, Kenneth MacKay -All rights reserved. - -https://github.com/kmackay/micro-ecc - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -================================================================================ diff --git a/mcuboot/ext/tinycrypt/Makefile b/mcuboot/ext/tinycrypt/Makefile deleted file mode 100644 index 3c0e42b9c..000000000 --- a/mcuboot/ext/tinycrypt/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -################################################################################ -# -# Copyright (C) 2017 by Intel Corporation, All Rights Reserved. -# -# Global Makefile. -# See lib/Makefile and tests/Makefile for further configuration. -# -################################################################################ -include config.mk - -all: - $(MAKE) -C lib -ifeq ($(ENABLE_TESTS),true) - $(MAKE) -C tests -endif - -clean: - $(MAKE) -C lib clean - $(MAKE) -C tests clean - $(RM) *~ - diff --git a/mcuboot/ext/tinycrypt/README b/mcuboot/ext/tinycrypt/README deleted file mode 100644 index fb52c196a..000000000 --- a/mcuboot/ext/tinycrypt/README +++ /dev/null @@ -1,71 +0,0 @@ - -================================================================================ - - TinyCrypt Cryptographic Library - -================================================================================ - - Copyright (c) 2017, Intel Corporation. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - - Neither the name of the Intel Corporation nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -================================================================================ - -Overview: - -The TinyCrypt Library provides an implementation for constrained devices of a -minimal set of standard cryptography primitives. - -Please, ***SEE THE DOCUMENTATION*** folder for more information on the supported -cryptographic primitives and the limitations of TinyCrypt library. For usage, -security and technicalities, please see the corresponding header file of each -cryptographic primitive. - -================================================================================ - -Organization: - -/lib: C source code of the cryptographic primitives. -/lib/include/tinycrypt: C header files of the cryptographic primitives. -/tests: Test vectors of the cryptographic primitives. -/doc: Documentation of TinyCrypt. - -================================================================================ - -Building: - -1) In Makefile.conf set: - - CFLAGS for compiler flags. - - CC for compiler. - - ENABLE_TESTS for enabling (true) or disabling (false) tests compilation. -2) In lib/Makefile select the primitives required by your project. -3) In tests/Makefile select the corresponding tests of the selected primitives. -4) make -5) run tests in tests/ - -================================================================================ - diff --git a/mcuboot/ext/tinycrypt/VERSION b/mcuboot/ext/tinycrypt/VERSION deleted file mode 100644 index a45be4627..000000000 --- a/mcuboot/ext/tinycrypt/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.2.8 diff --git a/mcuboot/ext/tinycrypt/config.mk b/mcuboot/ext/tinycrypt/config.mk deleted file mode 100644 index a5b9fb77d..000000000 --- a/mcuboot/ext/tinycrypt/config.mk +++ /dev/null @@ -1,35 +0,0 @@ -################################################################################ -# -# Copyright (C) 2017 by Intel Corporation, All Rights Reserved. -# -# Global configuration Makefile. Included everywhere. -# -################################################################################ - -# EDIT HERE: -CC:=gcc -CFLAGS:=-Os -std=c99 -Wall -Wextra -D_ISOC99_SOURCE -MMD -I../lib/include/ -I../lib/source/ -I../tests/include/ -vpath %.c ../lib/source/ -ENABLE_TESTS=true - -# override MinGW built-in recipe -%.o: %.c - $(COMPILE.c) $(OUTPUT_OPTION) $< - -ifeq ($(OS),Windows_NT) -DOTEXE:=.exe -endif - -# DO NOT EDIT AFTER THIS POINT: -ifeq ($(ENABLE_TESTS), true) -CFLAGS += -DENABLE_TESTS -else -CFLAGS += -DDISABLE_TESTS -endif - -export CC -export CFLAGS -export VPATH -export ENABLE_TESTS - -################################################################################ diff --git a/mcuboot/ext/tinycrypt/documentation/tinycrypt.rst b/mcuboot/ext/tinycrypt/documentation/tinycrypt.rst deleted file mode 100644 index 356c099a0..000000000 --- a/mcuboot/ext/tinycrypt/documentation/tinycrypt.rst +++ /dev/null @@ -1,352 +0,0 @@ - -TinyCrypt Cryptographic Library -############################### -Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - -Overview -******** -The TinyCrypt Library provides an implementation for targeting constrained devices -with a minimal set of standard cryptography primitives, as listed below. To better -serve applications targeting constrained devices, TinyCrypt implementations differ -from the standard specifications (see the Important Remarks section for some -important differences). Certain cryptographic primitives depend on other -primitives, as mentioned in the list below. - -Aside from the Important Remarks section below, valuable information on the usage, -security and technicalities of each cryptographic primitive are found in the -corresponding header file. - -* SHA-256: - - * Type of primitive: Hash function. - * Standard Specification: NIST FIPS PUB 180-4. - * Requires: -- - -* HMAC-SHA256: - - * Type of primitive: Message authentication code. - * Standard Specification: RFC 2104. - * Requires: SHA-256 - -* HMAC-PRNG: - - * Type of primitive: Pseudo-random number generator (256-bit strength). - * Standard Specification: NIST SP 800-90A. - * Requires: SHA-256 and HMAC-SHA256. - -* AES-128: - - * Type of primitive: Block cipher. - * Standard Specification: NIST FIPS PUB 197. - * Requires: -- - -* AES-CBC mode: - - * Type of primitive: Encryption mode of operation. - * Standard Specification: NIST SP 800-38A. - * Requires: AES-128. - -* AES-CTR mode: - - * Type of primitive: Encryption mode of operation. - * Standard Specification: NIST SP 800-38A. - * Requires: AES-128. - -* AES-CMAC mode: - - * Type of primitive: Message authentication code. - * Standard Specification: NIST SP 800-38B. - * Requires: AES-128. - -* AES-CCM mode: - - * Type of primitive: Authenticated encryption. - * Standard Specification: NIST SP 800-38C. - * Requires: AES-128. - -* CTR-PRNG: - - * Type of primitive: Pseudo-random number generator (128-bit strength). - * Standard Specification: NIST SP 800-90A. - * Requires: AES-128. - -* ECC-DH: - - * Type of primitive: Key exchange based on curve NIST p-256. - * Standard Specification: RFC 6090. - * Requires: ECC auxiliary functions (ecc.h/c). - -* ECC-DSA: - - * Type of primitive: Digital signature based on curve NIST p-256. - * Standard Specification: RFC 6090. - * Requires: ECC auxiliary functions (ecc.h/c). - -Design Goals -************ - -* Minimize the code size of each cryptographic primitive. This means minimize - the size of a platform-independent implementation, as presented in TinyCrypt. - Note that various applications may require further features, optimizations with - respect to other metrics and countermeasures for particular threats. These - peculiarities would increase the code size and thus are not considered here. - -* Minimize the dependencies among the cryptographic primitives. This means - that it is unnecessary to build and allocate object code for more primitives - than the ones strictly required by the intended application. In other words, - one can select and compile only the primitives required by the application. - - -Important Remarks -***************** - -The cryptographic implementations in TinyCrypt library have some limitations. -Some of these limitations are inherent to the cryptographic primitives -themselves, while others are specific to TinyCrypt. These limitations were accepted -in order to meet its design goals (in special, minimal code size) and to better -serve applications targeting constrained devices in general. Some of these -limitations are discussed in-depth below. - -General Remarks -*************** - -* TinyCrypt does **not** intend to be fully side-channel resistant. Due to the - variety of side-channel attacks, many of them only relevant to certain - platforms. In this sense, instead of penalizing all library users with - side-channel countermeasures such as increasing the overall code size, - TinyCrypt only implements certain generic timing-attack countermeasures. - -Specific Remarks -**************** - -* SHA-256: - - * The number of bits_hashed in the state is not checked for overflow. Note - however that this will only be a problem if you intend to hash more than - 2^64 bits, which is an extremely large window. - -* HMAC: - - * The HMAC verification process is assumed to be performed by the application. - This compares the computed tag with some given tag. - Note that conventional memory-comparison methods (such as memcmp function) - might be vulnerable to timing attacks; thus be sure to use a constant-time - memory comparison function (such as compare_constant_time - function provided in lib/utils.c). - - * The tc_hmac_final function, responsible for computing the message tag, - cleans the state context before exiting. Thus, applications do not need to - clean the TCHmacState_t ctx after calling tc_hmac_final. This should not - be changed in future versions of the library as there are applications - currently relying on this good-practice/feature of TinyCrypt. - -* HMAC-PRNG: - - * Before using HMAC-PRNG, you *must* find an entropy source to produce a seed. - PRNGs only stretch the seed into a seemingly random output of arbitrary - length. The security of the output is exactly equal to the - unpredictability of the seed. - - * NIST SP 800-90A requires three items as seed material in the initialization - step: entropy seed, personalization and a nonce (which is not implemented). - TinyCrypt requires the personalization byte array and automatically creates - the entropy seed using a mandatory call to the re-seed function. - -* AES-128: - - * The current implementation does not support other key-lengths (such as 256 - bits). Note that if you need AES-256, it doesn't sound as though your - application is running in a constrained environment. AES-256 requires keys - twice the size as for AES-128, and the key schedule is 40% larger. - -* CTR mode: - - * The AES-CTR mode limits the size of a data message they encrypt to 2^32 - blocks. If you need to encrypt larger data sets, your application would - need to replace the key after 2^32 block encryptions. - -* CTR-PRNG: - - * Before using CTR-PRNG, you *must* find an entropy source to produce a seed. - PRNGs only stretch the seed into a seemingly random output of arbitrary - length. The security of the output is exactly equal to the - unpredictability of the seed. - -* CBC mode: - - * TinyCrypt CBC decryption assumes that the iv and the ciphertext are - contiguous (as produced by TinyCrypt CBC encryption). This allows for a - very efficient decryption algorithm that would not otherwise be possible. - -* CMAC mode: - - * AES128-CMAC mode of operation offers 64 bits of security against collision - attacks. Note however that an external attacker cannot generate the tags - him/herself without knowing the MAC key. In this sense, to attack the - collision property of AES128-CMAC, an external attacker would need the - cooperation of the legal user to produce an exponentially high number of - tags (e.g. 2^64) to finally be able to look for collisions and benefit - from them. As an extra precaution, the current implementation allows to at - most 2^48 calls to tc_cmac_update function before re-calling tc_cmac_setup - (allowing a new key to be set), as suggested in Appendix B of SP 800-38B. - -* CCM mode: - - * There are a few tradeoffs for the selection of the parameters of CCM mode. - In special, there is a tradeoff between the maximum number of invocations - of CCM under a given key and the maximum payload length for those - invocations. Both things are related to the parameter 'q' of CCM mode. The - maximum number of invocations of CCM under a given key is determined by - the nonce size, which is: 15-q bytes. The maximum payload length for those - invocations is defined as 2^(8q) bytes. - - To achieve minimal code size, TinyCrypt CCM implementation fixes q = 2, - which is a quite reasonable choice for constrained applications. The - implications of this choice are: - - The nonce size is: 13 bytes. - - The maximum payload length is: 2^16 bytes = 65 KB. - - The mac size parameter is an important parameter to estimate the security - against collision attacks (that aim at finding different messages that - produce the same authentication tag). TinyCrypt CCM implementation - accepts any even integer between 4 and 16, as suggested in SP 800-38C. - - * TinyCrypt CCM implementation accepts associated data of any length between - 0 and (2^16 - 2^8) = 65280 bytes. - - * TinyCrypt CCM implementation accepts: - - * Both non-empty payload and associated data (it encrypts and - authenticates the payload and only authenticates the associated data); - - * Non-empty payload and empty associated data (it encrypts and - authenticates the payload); - - * Non-empty associated data and empty payload (it degenerates to an - authentication-only mode on the associated data). - - * RFC-3610, which also specifies CCM, presents a few relevant security - suggestions, such as: it is recommended for most applications to use a - mac size greater than 8. Besides, it is emphasized that the usage of the - same nonce for two different messages which are encrypted with the same - key obviously destroys the security properties of CCM mode. - -* ECC-DH and ECC-DSA: - - * TinyCrypt ECC implementation is based on micro-ecc (see - https://github.com/kmackay/micro-ecc). In the original micro-ecc - documentation, there is an important remark about the way integers are - represented: - - "Integer representation: To reduce code size, all large integers are - represented using little-endian words - so the least significant word is - first. You can use the 'ecc_bytes2native()' and 'ecc_native2bytes()' - functions to convert between the native integer representation and the - standardized octet representation." - - Note that the assumed bit layout is: {31, 30, ..., 0}, {63, 62, ..., 32}, - {95, 94, ..., 64}, {127, 126, ..., 96} for a very-long-integer (vli) - consisting of 4 unsigned integers (as an example). - - * A cryptographically-secure PRNG function must be set (using uECC_set_rng()) - before calling uECC_make_key() or uECC_sign(). - -Examples of Applications -************************ -It is possible to do useful cryptography with only the given small set of -primitives. With this list of primitives it becomes feasible to support a range -of cryptography usages: - - * Measurement of code, data structures, and other digital artifacts (SHA256); - - * Generate commitments (SHA256); - - * Construct keys (HMAC-SHA256); - - * Extract entropy from strings containing some randomness (HMAC-SHA256); - - * Construct random mappings (HMAC-SHA256); - - * Construct nonces and challenges (HMAC-PRNG, CTR-PRNG); - - * Authenticate using a shared secret (HMAC-SHA256); - - * Create an authenticated, replay-protected session (HMAC-SHA256 + HMAC-PRNG); - - * Authenticated encryption (AES-128 + AES-CCM); - - * Key-exchange (EC-DH); - - * Digital signature (EC-DSA); - -Test Vectors -************ - -The library provides a test program for each cryptographic primitive (see 'test' -folder). Besides illustrating how to use the primitives, these tests evaluate -the correctness of the implementations by checking the results against -well-known publicly validated test vectors. - -For the case of the HMAC-PRNG, due to the necessity of performing an extensive -battery test to produce meaningful conclusions, we suggest the user to evaluate -the unpredictability of the implementation by using the NIST Statistical Test -Suite (see References). - -For the case of the EC-DH and EC-DSA implementations, most of the test vectors -were obtained from the site of the NIST Cryptographic Algorithm Validation -Program (CAVP), see References. - -References -********** - -* `NIST FIPS PUB 180-4 (SHA-256)`_ - -.. _NIST FIPS PUB 180-4 (SHA-256): - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf - -* `NIST FIPS PUB 197 (AES-128)`_ - -.. _NIST FIPS PUB 197 (AES-128): - http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf - -* `NIST SP800-90A (HMAC-PRNG)`_ - -.. _NIST SP800-90A (HMAC-PRNG): - http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf - -* `NIST SP 800-38A (AES-CBC and AES-CTR)`_ - -.. _NIST SP 800-38A (AES-CBC and AES-CTR): - http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf - -* `NIST SP 800-38B (AES-CMAC)`_ - -.. _NIST SP 800-38B (AES-CMAC): - http://csrc.nist.gov/publications/nistpubs/800-38B/SP_800-38B.pdf - -* `NIST SP 800-38C (AES-CCM)`_ - -.. _NIST SP 800-38C (AES-CCM): - http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf - -* `NIST Statistical Test Suite (useful for testing HMAC-PRNG)`_ - -.. _NIST Statistical Test Suite (useful for testing HMAC-PRNG): - http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html - -* `NIST Cryptographic Algorithm Validation Program (CAVP) site`_ - -.. _NIST Cryptographic Algorithm Validation Program (CAVP) site: - http://csrc.nist.gov/groups/STM/cavp/ - -* `RFC 2104 (HMAC-SHA256)`_ - -.. _RFC 2104 (HMAC-SHA256): - https://www.ietf.org/rfc/rfc2104.txt - -* `RFC 6090 (ECC-DH and ECC-DSA)`_ - -.. _RFC 6090 (ECC-DH and ECC-DSA): - https://www.ietf.org/rfc/rfc6090.txt diff --git a/mcuboot/ext/tinycrypt/lib/Makefile b/mcuboot/ext/tinycrypt/lib/Makefile deleted file mode 100644 index 9c4d8e27d..000000000 --- a/mcuboot/ext/tinycrypt/lib/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -################################################################################ -# -# Copyright (C) 2017 by Intel Corporation, All Rights Reserved. -# -# Cryptographic Primitives Makefile. -# -################################################################################ - -include ../config.mk - -# Edit the OBJS content to add/remove primitives needed from TinyCrypt library: -OBJS:=aes_decrypt.o \ - aes_encrypt.o \ - cbc_mode.o \ - ctr_mode.o \ - ctr_prng.o \ - hmac.o \ - hmac_prng.o \ - sha256.o \ - ecc.o \ - ecc_dh.o \ - ecc_dsa.o \ - ccm_mode.o \ - cmac_mode.o \ - utils.o - -DEPS:=$(OBJS:.o=.d) - -all: libtinycrypt.a - -libtinycrypt.a: $(OBJS) - $(AR) $(ARFLAGS) $@ $^ - -.PHONY: clean - -clean: - -$(RM) *.exe $(OBJS) $(DEPS) *~ libtinycrypt.a - --include $(DEPS) diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/aes.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/aes.h deleted file mode 100644 index b612213a0..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/aes.h +++ /dev/null @@ -1,130 +0,0 @@ -/* aes.h - TinyCrypt interface to an AES-128 implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief -- Interface to an AES-128 implementation. - * - * Overview: AES-128 is a NIST approved block cipher specified in - * FIPS 197. Block ciphers are deterministic algorithms that - * perform a transformation specified by a symmetric key in fixed- - * length data sets, also called blocks. - * - * Security: AES-128 provides approximately 128 bits of security. - * - * Usage: 1) call tc_aes128_set_encrypt/decrypt_key to set the key. - * - * 2) call tc_aes_encrypt/decrypt to process the data. - */ - -#ifndef __TC_AES_H__ -#define __TC_AES_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define Nb (4) /* number of columns (32-bit words) comprising the state */ -#define Nk (4) /* number of 32-bit words comprising the key */ -#define Nr (10) /* number of rounds */ -#define TC_AES_BLOCK_SIZE (Nb*Nk) -#define TC_AES_KEY_SIZE (Nb*Nk) - -typedef struct tc_aes_key_sched_struct { - unsigned int words[Nb*(Nr+1)]; -} *TCAesKeySched_t; - -/** - * @brief Set AES-128 encryption key - * Uses key k to initialize s - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: s == NULL or k == NULL - * @note This implementation skips the additional steps required for keys - * larger than 128 bits, and must not be used for AES-192 or - * AES-256 key schedule -- see FIPS 197 for details - * @param s IN/OUT -- initialized struct tc_aes_key_sched_struct - * @param k IN -- points to the AES key - */ -int tc_aes128_set_encrypt_key(TCAesKeySched_t s, const uint8_t *k); - -/** - * @brief AES-128 Encryption procedure - * Encrypts contents of in buffer into out buffer under key; - * schedule s - * @note Assumes s was initialized by aes_set_encrypt_key; - * out and in point to 16 byte buffers - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: out == NULL or in == NULL or s == NULL - * @param out IN/OUT -- buffer to receive ciphertext block - * @param in IN -- a plaintext block to encrypt - * @param s IN -- initialized AES key schedule - */ -int tc_aes_encrypt(uint8_t *out, const uint8_t *in, - const TCAesKeySched_t s); - -/** - * @brief Set the AES-128 decryption key - * Uses key k to initialize s - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: s == NULL or k == NULL - * @note This is the implementation of the straightforward inverse cipher - * using the cipher documented in FIPS-197 figure 12, not the - * equivalent inverse cipher presented in Figure 15 - * @warning This routine skips the additional steps required for keys larger - * than 128, and must not be used for AES-192 or AES-256 key - * schedule -- see FIPS 197 for details - * @param s IN/OUT -- initialized struct tc_aes_key_sched_struct - * @param k IN -- points to the AES key - */ -int tc_aes128_set_decrypt_key(TCAesKeySched_t s, const uint8_t *k); - -/** - * @brief AES-128 Encryption procedure - * Decrypts in buffer into out buffer under key schedule s - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: out is NULL or in is NULL or s is NULL - * @note Assumes s was initialized by aes_set_encrypt_key - * out and in point to 16 byte buffers - * @param out IN/OUT -- buffer to receive ciphertext block - * @param in IN -- a plaintext block to encrypt - * @param s IN -- initialized AES key schedule - */ -int tc_aes_decrypt(uint8_t *out, const uint8_t *in, - const TCAesKeySched_t s); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_AES_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/cbc_mode.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/cbc_mode.h deleted file mode 100644 index 4a837fd01..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/cbc_mode.h +++ /dev/null @@ -1,151 +0,0 @@ -/* cbc_mode.h - TinyCrypt interface to a CBC mode implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to a CBC mode implementation. - * - * Overview: CBC (for "cipher block chaining") mode is a NIST approved mode of - * operation defined in SP 800-38a. It can be used with any block - * cipher to provide confidentiality of strings whose lengths are - * multiples of the block_size of the underlying block cipher. - * TinyCrypt hard codes AES as the block cipher. - * - * Security: CBC mode provides data confidentiality given that the maximum - * number q of blocks encrypted under a single key satisfies - * q < 2^63, which is not a practical constraint (it is considered a - * good practice to replace the encryption when q == 2^56). CBC mode - * provides NO data integrity. - * - * CBC mode assumes that the IV value input into the - * tc_cbc_mode_encrypt is randomly generated. The TinyCrypt library - * provides HMAC-PRNG module, which generates suitable IVs. Other - * methods for generating IVs are acceptable, provided that the - * values of the IVs generated appear random to any adversary, - * including someone with complete knowledge of the system design. - * - * The randomness property on which CBC mode's security depends is - * the unpredictability of the IV. Since it is unpredictable, this - * means in practice that CBC mode requires that the IV is stored - * somehow with the ciphertext in order to recover the plaintext. - * - * TinyCrypt CBC encryption prepends the IV to the ciphertext, - * because this affords a more efficient (few buffers) decryption. - * Hence tc_cbc_mode_encrypt assumes the ciphertext buffer is always - * 16 bytes larger than the plaintext buffer. - * - * Requires: AES-128 - * - * Usage: 1) call tc_cbc_mode_encrypt to encrypt data. - * - * 2) call tc_cbc_mode_decrypt to decrypt data. - * - */ - -#ifndef __TC_CBC_MODE_H__ -#define __TC_CBC_MODE_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief CBC encryption procedure - * CBC encrypts inlen bytes of the in buffer into the out buffer - * using the encryption key schedule provided, prepends iv to out - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * out == NULL or - * in == NULL or - * ctr == NULL or - * sched == NULL or - * inlen == 0 or - * (inlen % TC_AES_BLOCK_SIZE) != 0 or - * (outlen % TC_AES_BLOCK_SIZE) != 0 or - * outlen != inlen + TC_AES_BLOCK_SIZE - * @note Assumes: - sched has been configured by aes_set_encrypt_key - * - iv contains a 16 byte random string - * - out buffer is large enough to hold the ciphertext + iv - * - out buffer is a contiguous buffer - * - in holds the plaintext and is a contiguous buffer - * - inlen gives the number of bytes in the in buffer - * @param out IN/OUT -- buffer to receive the ciphertext - * @param outlen IN -- length of ciphertext buffer in bytes - * @param in IN -- plaintext to encrypt - * @param inlen IN -- length of plaintext buffer in bytes - * @param iv IN -- the IV for the this encrypt/decrypt - * @param sched IN -- AES key schedule for this encrypt - */ -int tc_cbc_mode_encrypt(uint8_t *out, unsigned int outlen, const uint8_t *in, - unsigned int inlen, const uint8_t *iv, - const TCAesKeySched_t sched); - -/** - * @brief CBC decryption procedure - * CBC decrypts inlen bytes of the in buffer into the out buffer - * using the provided encryption key schedule - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * out == NULL or - * in == NULL or - * sched == NULL or - * inlen == 0 or - * outlen == 0 or - * (inlen % TC_AES_BLOCK_SIZE) != 0 or - * (outlen % TC_AES_BLOCK_SIZE) != 0 or - * outlen != inlen + TC_AES_BLOCK_SIZE - * @note Assumes:- in == iv + ciphertext, i.e. the iv and the ciphertext are - * contiguous. This allows for a very efficient decryption - * algorithm that would not otherwise be possible - * - sched was configured by aes_set_decrypt_key - * - out buffer is large enough to hold the decrypted plaintext - * and is a contiguous buffer - * - inlen gives the number of bytes in the in buffer - * @param out IN/OUT -- buffer to receive decrypted data - * @param outlen IN -- length of plaintext buffer in bytes - * @param in IN -- ciphertext to decrypt, including IV - * @param inlen IN -- length of ciphertext buffer in bytes - * @param iv IN -- the IV for the this encrypt/decrypt - * @param sched IN -- AES key schedule for this decrypt - * - */ -int tc_cbc_mode_decrypt(uint8_t *out, unsigned int outlen, const uint8_t *in, - unsigned int inlen, const uint8_t *iv, - const TCAesKeySched_t sched); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_CBC_MODE_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ccm_mode.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ccm_mode.h deleted file mode 100644 index 69c798e2f..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ccm_mode.h +++ /dev/null @@ -1,211 +0,0 @@ -/* ccm_mode.h - TinyCrypt interface to a CCM mode implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to a CCM mode implementation. - * - * Overview: CCM (for "Counter with CBC-MAC") mode is a NIST approved mode of - * operation defined in SP 800-38C. - * - * TinyCrypt CCM implementation accepts: - * - * 1) Both non-empty payload and associated data (it encrypts and - * authenticates the payload and also authenticates the associated - * data); - * 2) Non-empty payload and empty associated data (it encrypts and - * authenticates the payload); - * 3) Non-empty associated data and empty payload (it degenerates to - * an authentication mode on the associated data). - * - * TinyCrypt CCM implementation accepts associated data of any length - * between 0 and (2^16 - 2^8) bytes. - * - * Security: The mac length parameter is an important parameter to estimate the - * security against collision attacks (that aim at finding different - * messages that produce the same authentication tag). TinyCrypt CCM - * implementation accepts any even integer between 4 and 16, as - * suggested in SP 800-38C. - * - * RFC-3610, which also specifies CCM, presents a few relevant - * security suggestions, such as: it is recommended for most - * applications to use a mac length greater than 8. Besides, the - * usage of the same nonce for two different messages which are - * encrypted with the same key destroys the security of CCM mode. - * - * Requires: AES-128 - * - * Usage: 1) call tc_ccm_config to configure. - * - * 2) call tc_ccm_mode_encrypt to encrypt data and generate tag. - * - * 3) call tc_ccm_mode_decrypt to decrypt data and verify tag. - */ - -#ifndef __TC_CCM_MODE_H__ -#define __TC_CCM_MODE_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* max additional authenticated size in bytes: 2^16 - 2^8 = 65280 */ -#define TC_CCM_AAD_MAX_BYTES 0xff00 - -/* max message size in bytes: 2^(8L) = 2^16 = 65536 */ -#define TC_CCM_PAYLOAD_MAX_BYTES 0x10000 - -/* struct tc_ccm_mode_struct represents the state of a CCM computation */ -typedef struct tc_ccm_mode_struct { - TCAesKeySched_t sched; /* AES key schedule */ - uint8_t *nonce; /* nonce required by CCM */ - unsigned int mlen; /* mac length in bytes (parameter t in SP-800 38C) */ -} *TCCcmMode_t; - -/** - * @brief CCM configuration procedure - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * c == NULL or - * sched == NULL or - * nonce == NULL or - * mlen != {4, 6, 8, 10, 12, 16} - * @param c -- CCM state - * @param sched IN -- AES key schedule - * @param nonce IN - nonce - * @param nlen -- nonce length in bytes - * @param mlen -- mac length in bytes (parameter t in SP-800 38C) - */ -int tc_ccm_config(TCCcmMode_t c, TCAesKeySched_t sched, uint8_t *nonce, - unsigned int nlen, unsigned int mlen); - -/** - * @brief CCM tag generation and encryption procedure - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * out == NULL or - * c == NULL or - * ((plen > 0) and (payload == NULL)) or - * ((alen > 0) and (associated_data == NULL)) or - * (alen >= TC_CCM_AAD_MAX_BYTES) or - * (plen >= TC_CCM_PAYLOAD_MAX_BYTES) or - * (olen < plen + maclength) - * - * @param out OUT -- encrypted data - * @param olen IN -- output length in bytes - * @param associated_data IN -- associated data - * @param alen IN -- associated data length in bytes - * @param payload IN -- payload - * @param plen IN -- payload length in bytes - * @param c IN -- CCM state - * - * @note: out buffer should be at least (plen + c->mlen) bytes long. - * - * @note: The sequence b for encryption is formatted as follows: - * b = [FLAGS | nonce | counter ], where: - * FLAGS is 1 byte long - * nonce is 13 bytes long - * counter is 2 bytes long - * The byte FLAGS is composed by the following 8 bits: - * 0-2 bits: used to represent the value of q-1 - * 3-7 btis: always 0's - * - * @note: The sequence b for authentication is formatted as follows: - * b = [FLAGS | nonce | length(mac length)], where: - * FLAGS is 1 byte long - * nonce is 13 bytes long - * length(mac length) is 2 bytes long - * The byte FLAGS is composed by the following 8 bits: - * 0-2 bits: used to represent the value of q-1 - * 3-5 bits: mac length (encoded as: (mlen-2)/2) - * 6: Adata (0 if alen == 0, and 1 otherwise) - * 7: always 0 - */ -int tc_ccm_generation_encryption(uint8_t *out, unsigned int olen, - const uint8_t *associated_data, - unsigned int alen, const uint8_t *payload, - unsigned int plen, TCCcmMode_t c); - -/** - * @brief CCM decryption and tag verification procedure - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * out == NULL or - * c == NULL or - * ((plen > 0) and (payload == NULL)) or - * ((alen > 0) and (associated_data == NULL)) or - * (alen >= TC_CCM_AAD_MAX_BYTES) or - * (plen >= TC_CCM_PAYLOAD_MAX_BYTES) or - * (olen < plen - c->mlen) - * - * @param out OUT -- decrypted data - * @param associated_data IN -- associated data - * @param alen IN -- associated data length in bytes - * @param payload IN -- payload - * @param plen IN -- payload length in bytes - * @param c IN -- CCM state - * - * @note: out buffer should be at least (plen - c->mlen) bytes long. - * - * @note: The sequence b for encryption is formatted as follows: - * b = [FLAGS | nonce | counter ], where: - * FLAGS is 1 byte long - * nonce is 13 bytes long - * counter is 2 bytes long - * The byte FLAGS is composed by the following 8 bits: - * 0-2 bits: used to represent the value of q-1 - * 3-7 btis: always 0's - * - * @note: The sequence b for authentication is formatted as follows: - * b = [FLAGS | nonce | length(mac length)], where: - * FLAGS is 1 byte long - * nonce is 13 bytes long - * length(mac length) is 2 bytes long - * The byte FLAGS is composed by the following 8 bits: - * 0-2 bits: used to represent the value of q-1 - * 3-5 bits: mac length (encoded as: (mlen-2)/2) - * 6: Adata (0 if alen == 0, and 1 otherwise) - * 7: always 0 - */ -int tc_ccm_decryption_verification(uint8_t *out, unsigned int olen, - const uint8_t *associated_data, - unsigned int alen, const uint8_t *payload, unsigned int plen, - TCCcmMode_t c); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_CCM_MODE_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/cmac_mode.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/cmac_mode.h deleted file mode 100644 index f44b0a53c..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/cmac_mode.h +++ /dev/null @@ -1,194 +0,0 @@ -/* cmac_mode.h -- interface to a CMAC implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to a CMAC implementation. - * - * Overview: CMAC is defined NIST in SP 800-38B, and is the standard algorithm - * for computing a MAC using a block cipher. It can compute the MAC - * for a byte string of any length. It is distinguished from CBC-MAC - * in the processing of the final message block; CMAC uses a - * different technique to compute the final message block is full - * size or only partial, while CBC-MAC uses the same technique for - * both. This difference permits CMAC to be applied to variable - * length messages, while all messages authenticated by CBC-MAC must - * be the same length. - * - * Security: AES128-CMAC mode of operation offers 64 bits of security against - * collision attacks. Note however that an external attacker cannot - * generate the tags him/herself without knowing the MAC key. In this - * sense, to attack the collision property of AES128-CMAC, an - * external attacker would need the cooperation of the legal user to - * produce an exponentially high number of tags (e.g. 2^64) to - * finally be able to look for collisions and benefit from them. As - * an extra precaution, the current implementation allows to at most - * 2^48 calls to the tc_cmac_update function before re-calling - * tc_cmac_setup (allowing a new key to be set), as suggested in - * Appendix B of SP 800-38B. - * - * Requires: AES-128 - * - * Usage: This implementation provides a "scatter-gather" interface, so that - * the CMAC value can be computed incrementally over a message - * scattered in different segments throughout memory. Experience shows - * this style of interface tends to minimize the burden of programming - * correctly. Like all symmetric key operations, it is session - * oriented. - * - * To begin a CMAC session, use tc_cmac_setup to initialize a struct - * tc_cmac_struct with encryption key and buffer. Our implementation - * always assume that the AES key to be the same size as the block - * cipher block size. Once setup, this data structure can be used for - * many CMAC computations. - * - * Once the state has been setup with a key, computing the CMAC of - * some data requires three steps: - * - * (1) first use tc_cmac_init to initialize a new CMAC computation. - * (2) next mix all of the data into the CMAC computation state using - * tc_cmac_update. If all of the data resides in a single data - * segment then only one tc_cmac_update call is needed; if data - * is scattered throughout memory in n data segments, then n calls - * will be needed. CMAC IS ORDER SENSITIVE, to be able to detect - * attacks that swap bytes, so the order in which data is mixed - * into the state is critical! - * (3) Once all of the data for a message has been mixed, use - * tc_cmac_final to compute the CMAC tag value. - * - * Steps (1)-(3) can be repeated as many times as you want to CMAC - * multiple messages. A practical limit is 2^48 1K messages before you - * have to change the key. - * - * Once you are done computing CMAC with a key, it is a good idea to - * destroy the state so an attacker cannot recover the key; use - * tc_cmac_erase to accomplish this. - */ - -#ifndef __TC_CMAC_MODE_H__ -#define __TC_CMAC_MODE_H__ - -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* padding for last message block */ -#define TC_CMAC_PADDING 0x80 - -/* struct tc_cmac_struct represents the state of a CMAC computation */ -typedef struct tc_cmac_struct { -/* initialization vector */ - uint8_t iv[TC_AES_BLOCK_SIZE]; -/* used if message length is a multiple of block_size bytes */ - uint8_t K1[TC_AES_BLOCK_SIZE]; -/* used if message length isn't a multiple block_size bytes */ - uint8_t K2[TC_AES_BLOCK_SIZE]; -/* where to put bytes that didn't fill a block */ - uint8_t leftover[TC_AES_BLOCK_SIZE]; -/* identifies the encryption key */ - unsigned int keyid; -/* next available leftover location */ - unsigned int leftover_offset; -/* AES key schedule */ - TCAesKeySched_t sched; -/* calls to tc_cmac_update left before re-key */ - uint64_t countdown; -} *TCCmacState_t; - -/** - * @brief Configures the CMAC state to use the given AES key - * @return returns TC_CRYPTO_SUCCESS (1) after having configured the CMAC state - * returns TC_CRYPTO_FAIL (0) if: - * s == NULL or - * key == NULL - * - * @param s IN/OUT -- the state to set up - * @param key IN -- the key to use - * @param sched IN -- AES key schedule - */ -int tc_cmac_setup(TCCmacState_t s, const uint8_t *key, - TCAesKeySched_t sched); - -/** - * @brief Erases the CMAC state - * @return returns TC_CRYPTO_SUCCESS (1) after having configured the CMAC state - * returns TC_CRYPTO_FAIL (0) if: - * s == NULL - * - * @param s IN/OUT -- the state to erase - */ -int tc_cmac_erase(TCCmacState_t s); - -/** - * @brief Initializes a new CMAC computation - * @return returns TC_CRYPTO_SUCCESS (1) after having initialized the CMAC state - * returns TC_CRYPTO_FAIL (0) if: - * s == NULL - * - * @param s IN/OUT -- the state to initialize - */ -int tc_cmac_init(TCCmacState_t s); - -/** - * @brief Incrementally computes CMAC over the next data segment - * @return returns TC_CRYPTO_SUCCESS (1) after successfully updating the CMAC state - * returns TC_CRYPTO_FAIL (0) if: - * s == NULL or - * if data == NULL when dlen > 0 - * - * @param s IN/OUT -- the CMAC state - * @param data IN -- the next data segment to MAC - * @param dlen IN -- the length of data in bytes - */ -int tc_cmac_update(TCCmacState_t s, const uint8_t *data, size_t dlen); - -/** - * @brief Generates the tag from the CMAC state - * @return returns TC_CRYPTO_SUCCESS (1) after successfully generating the tag - * returns TC_CRYPTO_FAIL (0) if: - * tag == NULL or - * s == NULL - * - * @param tag OUT -- the CMAC tag - * @param s IN -- CMAC state - */ -int tc_cmac_final(uint8_t *tag, TCCmacState_t s); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_CMAC_MODE_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/constants.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/constants.h deleted file mode 100644 index 965490e00..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/constants.h +++ /dev/null @@ -1,61 +0,0 @@ -/* constants.h - TinyCrypt interface to constants */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief -- Interface to constants. - * - */ - -#ifndef __TC_CONSTANTS_H__ -#define __TC_CONSTANTS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#ifndef NULL -#define NULL ((void *)0) -#endif - -#define TC_CRYPTO_SUCCESS 1 -#define TC_CRYPTO_FAIL 0 - -#define TC_ZERO_BYTE 0x00 - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_CONSTANTS_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ctr_mode.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ctr_mode.h deleted file mode 100644 index dc221f9ee..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ctr_mode.h +++ /dev/null @@ -1,108 +0,0 @@ -/* ctr_mode.h - TinyCrypt interface to CTR mode */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to CTR mode. - * - * Overview: CTR (pronounced "counter") mode is a NIST approved mode of - * operation defined in SP 800-38a. It can be used with any - * block cipher to provide confidentiality of strings of any - * length. TinyCrypt hard codes AES128 as the block cipher. - * - * Security: CTR mode achieves confidentiality only if the counter value is - * never reused with a same encryption key. If the counter is - * repeated, than an adversary might be able to defeat the scheme. - * - * A usual method to ensure different counter values refers to - * initialize the counter in a given value (0, for example) and - * increases it every time a new block is enciphered. This naturally - * leaves to a limitation on the number q of blocks that can be - * enciphered using a same key: q < 2^(counter size). - * - * TinyCrypt uses a counter of 32 bits. This means that after 2^32 - * block encryptions, the counter will be reused (thus losing CBC - * security). 2^32 block encryptions should be enough for most of - * applications targeting constrained devices. Applications intended - * to encrypt a larger number of blocks must replace the key after - * 2^32 block encryptions. - * - * CTR mode provides NO data integrity. - * - * Requires: AES-128 - * - * Usage: 1) call tc_ctr_mode to process the data to encrypt/decrypt. - * - */ - -#ifndef __TC_CTR_MODE_H__ -#define __TC_CTR_MODE_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief CTR mode encryption/decryption procedure. - * CTR mode encrypts (or decrypts) inlen bytes from in buffer into out buffer - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * out == NULL or - * in == NULL or - * ctr == NULL or - * sched == NULL or - * inlen == 0 or - * outlen == 0 or - * inlen != outlen - * @note Assumes:- The current value in ctr has NOT been used with sched - * - out points to inlen bytes - * - in points to inlen bytes - * - ctr is an integer counter in littleEndian format - * - sched was initialized by aes_set_encrypt_key - * @param out OUT -- produced ciphertext (plaintext) - * @param outlen IN -- length of ciphertext buffer in bytes - * @param in IN -- data to encrypt (or decrypt) - * @param inlen IN -- length of input data in bytes - * @param ctr IN/OUT -- the current counter value - * @param sched IN -- an initialized AES key schedule - */ -int tc_ctr_mode(uint8_t *out, unsigned int outlen, const uint8_t *in, - unsigned int inlen, uint8_t *ctr, const TCAesKeySched_t sched); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_CTR_MODE_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ctr_prng.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ctr_prng.h deleted file mode 100644 index 9be06dbb1..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ctr_prng.h +++ /dev/null @@ -1,166 +0,0 @@ -/* ctr_prng.h - TinyCrypt interface to a CTR-PRNG implementation */ - -/* - * Copyright (c) 2016, Chris Morrison - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to a CTR-PRNG implementation. - * - * Overview: A pseudo-random number generator (PRNG) generates a sequence - * of numbers that have a distribution close to the one expected - * for a sequence of truly random numbers. The NIST Special - * Publication 800-90A specifies several mechanisms to generate - * sequences of pseudo random numbers, including the CTR-PRNG one - * which is based on AES. TinyCrypt implements CTR-PRNG with - * AES-128. - * - * Security: A cryptographically secure PRNG depends on the existence of an - * entropy source to provide a truly random seed as well as the - * security of the primitives used as the building blocks (AES-128 - * in this instance). - * - * Requires: - AES-128 - * - * Usage: 1) call tc_ctr_prng_init to seed the prng context - * - * 2) call tc_ctr_prng_reseed to mix in additional entropy into - * the prng context - * - * 3) call tc_ctr_prng_generate to output the pseudo-random data - * - * 4) call tc_ctr_prng_uninstantiate to zero out the prng context - */ - -#ifndef __TC_CTR_PRNG_H__ -#define __TC_CTR_PRNG_H__ - -#include - -#define TC_CTR_PRNG_RESEED_REQ -1 - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - /* updated each time another BLOCKLEN_BYTES bytes are produced */ - uint8_t V[TC_AES_BLOCK_SIZE]; - - /* updated whenever the PRNG is reseeded */ - struct tc_aes_key_sched_struct key; - - /* number of requests since initialization/reseeding */ - uint64_t reseedCount; -} TCCtrPrng_t; - - -/** - * @brief CTR-PRNG initialization procedure - * Initializes prng context with entropy and personalization string (if any) - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * ctx == NULL, - * entropy == NULL, - * entropyLen < (TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE) - * @note Only the first (TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE) bytes of - * both the entropy and personalization inputs are used - - * supplying additional bytes has no effect. - * @param ctx IN/OUT -- the PRNG context to initialize - * @param entropy IN -- entropy used to seed the PRNG - * @param entropyLen IN -- entropy length in bytes - * @param personalization IN -- personalization string used to seed the PRNG - * (may be null) - * @param plen IN -- personalization length in bytes - * - */ -int tc_ctr_prng_init(TCCtrPrng_t * const ctx, - uint8_t const * const entropy, - unsigned int entropyLen, - uint8_t const * const personalization, - unsigned int pLen); - -/** - * @brief CTR-PRNG reseed procedure - * Mixes entropy and additional_input into the prng context - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * ctx == NULL, - * entropy == NULL, - * entropylen < (TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE) - * @note It is better to reseed an existing prng context rather than - * re-initialise, so that any existing entropy in the context is - * presereved. This offers some protection against undetected failures - * of the entropy source. - * @note Assumes tc_ctr_prng_init has been called for ctx - * @param ctx IN/OUT -- the PRNG state - * @param entropy IN -- entropy to mix into the prng - * @param entropylen IN -- length of entropy in bytes - * @param additional_input IN -- additional input to the prng (may be null) - * @param additionallen IN -- additional input length in bytes - */ -int tc_ctr_prng_reseed(TCCtrPrng_t * const ctx, - uint8_t const * const entropy, - unsigned int entropyLen, - uint8_t const * const additional_input, - unsigned int additionallen); - -/** - * @brief CTR-PRNG generate procedure - * Generates outlen pseudo-random bytes into out buffer, updates prng - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CTR_PRNG_RESEED_REQ (-1) if a reseed is needed - * returns TC_CRYPTO_FAIL (0) if: - * ctx == NULL, - * out == NULL, - * outlen >= 2^16 - * @note Assumes tc_ctr_prng_init has been called for ctx - * @param ctx IN/OUT -- the PRNG context - * @param additional_input IN -- additional input to the prng (may be null) - * @param additionallen IN -- additional input length in bytes - * @param out IN/OUT -- buffer to receive output - * @param outlen IN -- size of out buffer in bytes - */ -int tc_ctr_prng_generate(TCCtrPrng_t * const ctx, - uint8_t const * const additional_input, - unsigned int additionallen, - uint8_t * const out, - unsigned int outlen); - -/** - * @brief CTR-PRNG uninstantiate procedure - * Zeroes the internal state of the supplied prng context - * @return none - * @param ctx IN/OUT -- the PRNG context - */ -void tc_ctr_prng_uninstantiate(TCCtrPrng_t * const ctx); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_CTR_PRNG_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc.h deleted file mode 100644 index 8abc949cc..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc.h +++ /dev/null @@ -1,545 +0,0 @@ -/* ecc.h - TinyCrypt interface to common ECC functions */ - -/* Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief -- Interface to common ECC functions. - * - * Overview: This software is an implementation of common functions - * necessary to elliptic curve cryptography. This implementation uses - * curve NIST p-256. - * - * Security: The curve NIST p-256 provides approximately 128 bits of security. - * - */ - -#ifndef __TC_UECC_H__ -#define __TC_UECC_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Word size (4 bytes considering 32-bits architectures) */ -#define uECC_WORD_SIZE 4 - -/* setting max number of calls to prng: */ -#ifndef uECC_RNG_MAX_TRIES -#define uECC_RNG_MAX_TRIES 64 -#endif - -/* defining data types to store word and bit counts: */ -typedef int8_t wordcount_t; -typedef int16_t bitcount_t; -/* defining data type for comparison result: */ -typedef int8_t cmpresult_t; -/* defining data type to store ECC coordinate/point in 32bits words: */ -typedef unsigned int uECC_word_t; -/* defining data type to store an ECC coordinate/point in 64bits words: */ -typedef uint64_t uECC_dword_t; - -/* defining masks useful for ecc computations: */ -#define HIGH_BIT_SET 0x80000000 -#define uECC_WORD_BITS 32 -#define uECC_WORD_BITS_SHIFT 5 -#define uECC_WORD_BITS_MASK 0x01F - -/* Number of words of 32 bits to represent an element of the the curve p-256: */ -#define NUM_ECC_WORDS 8 -/* Number of bytes to represent an element of the the curve p-256: */ -#define NUM_ECC_BYTES (uECC_WORD_SIZE*NUM_ECC_WORDS) - -/* structure that represents an elliptic curve (e.g. p256):*/ -struct uECC_Curve_t; -typedef const struct uECC_Curve_t * uECC_Curve; -struct uECC_Curve_t { - wordcount_t num_words; - wordcount_t num_bytes; - bitcount_t num_n_bits; - uECC_word_t p[NUM_ECC_WORDS]; - uECC_word_t n[NUM_ECC_WORDS]; - uECC_word_t G[NUM_ECC_WORDS * 2]; - uECC_word_t b[NUM_ECC_WORDS]; - void (*double_jacobian)(uECC_word_t * X1, uECC_word_t * Y1, uECC_word_t * Z1, - uECC_Curve curve); - void (*x_side)(uECC_word_t *result, const uECC_word_t *x, uECC_Curve curve); - void (*mmod_fast)(uECC_word_t *result, uECC_word_t *product); -}; - -/* - * @brief computes doubling of point ion jacobian coordinates, in place. - * @param X1 IN/OUT -- x coordinate - * @param Y1 IN/OUT -- y coordinate - * @param Z1 IN/OUT -- z coordinate - * @param curve IN -- elliptic curve - */ -void double_jacobian_default(uECC_word_t * X1, uECC_word_t * Y1, - uECC_word_t * Z1, uECC_Curve curve); - -/* - * @brief Computes x^3 + ax + b. result must not overlap x. - * @param result OUT -- x^3 + ax + b - * @param x IN -- value of x - * @param curve IN -- elliptic curve - */ -void x_side_default(uECC_word_t *result, const uECC_word_t *x, - uECC_Curve curve); - -/* - * @brief Computes result = product % curve_p - * from http://www.nsa.gov/ia/_files/nist-routines.pdf - * @param result OUT -- product % curve_p - * @param product IN -- value to be reduced mod curve_p - */ -void vli_mmod_fast_secp256r1(unsigned int *result, unsigned int *product); - -/* Bytes to words ordering: */ -#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) 0x##d##c##b##a, 0x##h##g##f##e -#define BYTES_TO_WORDS_4(a, b, c, d) 0x##d##c##b##a -#define BITS_TO_WORDS(num_bits) \ - ((num_bits + ((uECC_WORD_SIZE * 8) - 1)) / (uECC_WORD_SIZE * 8)) -#define BITS_TO_BYTES(num_bits) ((num_bits + 7) / 8) - -/* definition of curve NIST p-256: */ -static const struct uECC_Curve_t curve_secp256r1 = { - NUM_ECC_WORDS, - NUM_ECC_BYTES, - 256, /* num_n_bits */ { - BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF), - BYTES_TO_WORDS_8(FF, FF, FF, FF, 00, 00, 00, 00), - BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00), - BYTES_TO_WORDS_8(01, 00, 00, 00, FF, FF, FF, FF) - }, { - BYTES_TO_WORDS_8(51, 25, 63, FC, C2, CA, B9, F3), - BYTES_TO_WORDS_8(84, 9E, 17, A7, AD, FA, E6, BC), - BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF), - BYTES_TO_WORDS_8(00, 00, 00, 00, FF, FF, FF, FF) - }, { - BYTES_TO_WORDS_8(96, C2, 98, D8, 45, 39, A1, F4), - BYTES_TO_WORDS_8(A0, 33, EB, 2D, 81, 7D, 03, 77), - BYTES_TO_WORDS_8(F2, 40, A4, 63, E5, E6, BC, F8), - BYTES_TO_WORDS_8(47, 42, 2C, E1, F2, D1, 17, 6B), - - BYTES_TO_WORDS_8(F5, 51, BF, 37, 68, 40, B6, CB), - BYTES_TO_WORDS_8(CE, 5E, 31, 6B, 57, 33, CE, 2B), - BYTES_TO_WORDS_8(16, 9E, 0F, 7C, 4A, EB, E7, 8E), - BYTES_TO_WORDS_8(9B, 7F, 1A, FE, E2, 42, E3, 4F) - }, { - BYTES_TO_WORDS_8(4B, 60, D2, 27, 3E, 3C, CE, 3B), - BYTES_TO_WORDS_8(F6, B0, 53, CC, B0, 06, 1D, 65), - BYTES_TO_WORDS_8(BC, 86, 98, 76, 55, BD, EB, B3), - BYTES_TO_WORDS_8(E7, 93, 3A, AA, D8, 35, C6, 5A) - }, - &double_jacobian_default, - &x_side_default, - &vli_mmod_fast_secp256r1 -}; - -uECC_Curve uECC_secp256r1(void); - -/* - * @brief Generates a random integer in the range 0 < random < top. - * Both random and top have num_words words. - * @param random OUT -- random integer in the range 0 < random < top - * @param top IN -- upper limit - * @param num_words IN -- number of words - * @return a random integer in the range 0 < random < top - */ -int uECC_generate_random_int(uECC_word_t *random, const uECC_word_t *top, - wordcount_t num_words); - - -/* uECC_RNG_Function type - * The RNG function should fill 'size' random bytes into 'dest'. It should - * return 1 if 'dest' was filled with random data, or 0 if the random data could - * not be generated. The filled-in values should be either truly random, or from - * a cryptographically-secure PRNG. - * - * A correctly functioning RNG function must be set (using uECC_set_rng()) - * before calling uECC_make_key() or uECC_sign(). - * - * Setting a correctly functioning RNG function improves the resistance to - * side-channel attacks for uECC_shared_secret(). - * - * A correct RNG function is set by default. If you are building on another - * POSIX-compliant system that supports /dev/random or /dev/urandom, you can - * define uECC_POSIX to use the predefined RNG. - */ -typedef int(*uECC_RNG_Function)(uint8_t *dest, unsigned int size); - -/* - * @brief Set the function that will be used to generate random bytes. The RNG - * function should return 1 if the random data was generated, or 0 if the random - * data could not be generated. - * - * @note On platforms where there is no predefined RNG function, this must be - * called before uECC_make_key() or uECC_sign() are used. - * - * @param rng_function IN -- function that will be used to generate random bytes - */ -void uECC_set_rng(uECC_RNG_Function rng_function); - -/* - * @brief provides current uECC_RNG_Function. - * @return Returns the function that will be used to generate random bytes. - */ -uECC_RNG_Function uECC_get_rng(void); - -/* - * @brief computes the size of a private key for the curve in bytes. - * @param curve IN -- elliptic curve - * @return size of a private key for the curve in bytes. - */ -int uECC_curve_private_key_size(uECC_Curve curve); - -/* - * @brief computes the size of a public key for the curve in bytes. - * @param curve IN -- elliptic curve - * @return the size of a public key for the curve in bytes. - */ -int uECC_curve_public_key_size(uECC_Curve curve); - -/* - * @brief Compute the corresponding public key for a private key. - * @param private_key IN -- The private key to compute the public key for - * @param public_key OUT -- Will be filled in with the corresponding public key - * @param curve - * @return Returns 1 if key was computed successfully, 0 if an error occurred. - */ -int uECC_compute_public_key(const uint8_t *private_key, - uint8_t *public_key, uECC_Curve curve); - -/* - * @brief Compute public-key. - * @return corresponding public-key. - * @param result OUT -- public-key - * @param private_key IN -- private-key - * @param curve IN -- elliptic curve - */ -uECC_word_t EccPoint_compute_public_key(uECC_word_t *result, - uECC_word_t *private_key, uECC_Curve curve); - -/* - * @brief Regularize the bitcount for the private key so that attackers cannot - * use a side channel attack to learn the number of leading zeros. - * @return Regularized k - * @param k IN -- private-key - * @param k0 IN/OUT -- regularized k - * @param k1 IN/OUT -- regularized k - * @param curve IN -- elliptic curve - */ -uECC_word_t regularize_k(const uECC_word_t * const k, uECC_word_t *k0, - uECC_word_t *k1, uECC_Curve curve); - -/* - * @brief Point multiplication algorithm using Montgomery's ladder with co-Z - * coordinates. See http://eprint.iacr.org/2011/338.pdf. - * @note Result may overlap point. - * @param result OUT -- returns scalar*point - * @param point IN -- elliptic curve point - * @param scalar IN -- scalar - * @param initial_Z IN -- initial value for z - * @param num_bits IN -- number of bits in scalar - * @param curve IN -- elliptic curve - */ -void EccPoint_mult(uECC_word_t * result, const uECC_word_t * point, - const uECC_word_t * scalar, const uECC_word_t * initial_Z, - bitcount_t num_bits, uECC_Curve curve); - -/* - * @brief Constant-time comparison to zero - secure way to compare long integers - * @param vli IN -- very long integer - * @param num_words IN -- number of words in the vli - * @return 1 if vli == 0, 0 otherwise. - */ -uECC_word_t uECC_vli_isZero(const uECC_word_t *vli, wordcount_t num_words); - -/* - * @brief Check if 'point' is the point at infinity - * @param point IN -- elliptic curve point - * @param curve IN -- elliptic curve - * @return if 'point' is the point at infinity, 0 otherwise. - */ -uECC_word_t EccPoint_isZero(const uECC_word_t *point, uECC_Curve curve); - -/* - * @brief computes the sign of left - right, in constant time. - * @param left IN -- left term to be compared - * @param right IN -- right term to be compared - * @param num_words IN -- number of words - * @return the sign of left - right - */ -cmpresult_t uECC_vli_cmp(const uECC_word_t *left, const uECC_word_t *right, - wordcount_t num_words); - -/* - * @brief computes sign of left - right, not in constant time. - * @note should not be used if inputs are part of a secret - * @param left IN -- left term to be compared - * @param right IN -- right term to be compared - * @param num_words IN -- number of words - * @return the sign of left - right - */ -cmpresult_t uECC_vli_cmp_unsafe(const uECC_word_t *left, const uECC_word_t *right, - wordcount_t num_words); - -/* - * @brief Computes result = (left - right) % mod. - * @note Assumes that (left < mod) and (right < mod), and that result does not - * overlap mod. - * @param result OUT -- (left - right) % mod - * @param left IN -- leftright term in modular subtraction - * @param right IN -- right term in modular subtraction - * @param mod IN -- mod - * @param num_words IN -- number of words - */ -void uECC_vli_modSub(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, const uECC_word_t *mod, - wordcount_t num_words); - -/* - * @brief Computes P' = (x1', y1', Z3), P + Q = (x3, y3, Z3) or - * P => P', Q => P + Q - * @note assumes Input P = (x1, y1, Z), Q = (x2, y2, Z) - * @param X1 IN -- x coordinate of P - * @param Y1 IN -- y coordinate of P - * @param X2 IN -- x coordinate of Q - * @param Y2 IN -- y coordinate of Q - * @param curve IN -- elliptic curve - */ -void XYcZ_add(uECC_word_t * X1, uECC_word_t * Y1, uECC_word_t * X2, - uECC_word_t * Y2, uECC_Curve curve); - -/* - * @brief Computes (x1 * z^2, y1 * z^3) - * @param X1 IN -- previous x1 coordinate - * @param Y1 IN -- previous y1 coordinate - * @param Z IN -- z value - * @param curve IN -- elliptic curve - */ -void apply_z(uECC_word_t * X1, uECC_word_t * Y1, const uECC_word_t * const Z, - uECC_Curve curve); - -/* - * @brief Check if bit is set. - * @return Returns nonzero if bit 'bit' of vli is set. - * @warning It is assumed that the value provided in 'bit' is within the - * boundaries of the word-array 'vli'. - * @note The bit ordering layout assumed for vli is: {31, 30, ..., 0}, - * {63, 62, ..., 32}, {95, 94, ..., 64}, {127, 126,..., 96} for a vli consisting - * of 4 uECC_word_t elements. - */ -uECC_word_t uECC_vli_testBit(const uECC_word_t *vli, bitcount_t bit); - -/* - * @brief Computes result = product % mod, where product is 2N words long. - * @param result OUT -- product % mod - * @param mod IN -- module - * @param num_words IN -- number of words - * @warning Currently only designed to work for curve_p or curve_n. - */ -void uECC_vli_mmod(uECC_word_t *result, uECC_word_t *product, - const uECC_word_t *mod, wordcount_t num_words); - -/* - * @brief Computes modular product (using curve->mmod_fast) - * @param result OUT -- (left * right) mod % curve_p - * @param left IN -- left term in product - * @param right IN -- right term in product - * @param curve IN -- elliptic curve - */ -void uECC_vli_modMult_fast(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, uECC_Curve curve); - -/* - * @brief Computes result = left - right. - * @note Can modify in place. - * @param result OUT -- left - right - * @param left IN -- left term in subtraction - * @param right IN -- right term in subtraction - * @param num_words IN -- number of words - * @return borrow - */ -uECC_word_t uECC_vli_sub(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, wordcount_t num_words); - -/* - * @brief Constant-time comparison function(secure way to compare long ints) - * @param left IN -- left term in comparison - * @param right IN -- right term in comparison - * @param num_words IN -- number of words - * @return Returns 0 if left == right, 1 otherwise. - */ -uECC_word_t uECC_vli_equal(const uECC_word_t *left, const uECC_word_t *right, - wordcount_t num_words); - -/* - * @brief Computes (left * right) % mod - * @param result OUT -- (left * right) % mod - * @param left IN -- left term in product - * @param right IN -- right term in product - * @param mod IN -- mod - * @param num_words IN -- number of words - */ -void uECC_vli_modMult(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, const uECC_word_t *mod, - wordcount_t num_words); - -/* - * @brief Computes (1 / input) % mod - * @note All VLIs are the same size. - * @note See "Euclid's GCD to Montgomery Multiplication to the Great Divide" - * @param result OUT -- (1 / input) % mod - * @param input IN -- value to be modular inverted - * @param mod IN -- mod - * @param num_words -- number of words - */ -void uECC_vli_modInv(uECC_word_t *result, const uECC_word_t *input, - const uECC_word_t *mod, wordcount_t num_words); - -/* - * @brief Sets dest = src. - * @param dest OUT -- destination buffer - * @param src IN -- origin buffer - * @param num_words IN -- number of words - */ -void uECC_vli_set(uECC_word_t *dest, const uECC_word_t *src, - wordcount_t num_words); - -/* - * @brief Computes (left + right) % mod. - * @note Assumes that (left < mod) and right < mod), and that result does not - * overlap mod. - * @param result OUT -- (left + right) % mod. - * @param left IN -- left term in addition - * @param right IN -- right term in addition - * @param mod IN -- mod - * @param num_words IN -- number of words - */ -void uECC_vli_modAdd(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, const uECC_word_t *mod, - wordcount_t num_words); - -/* - * @brief Counts the number of bits required to represent vli. - * @param vli IN -- very long integer - * @param max_words IN -- number of words - * @return number of bits in given vli - */ -bitcount_t uECC_vli_numBits(const uECC_word_t *vli, - const wordcount_t max_words); - -/* - * @brief Erases (set to 0) vli - * @param vli IN -- very long integer - * @param num_words IN -- number of words - */ -void uECC_vli_clear(uECC_word_t *vli, wordcount_t num_words); - -/* - * @brief check if it is a valid point in the curve - * @param point IN -- point to be checked - * @param curve IN -- elliptic curve - * @return 0 if point is valid - * @exception returns -1 if it is a point at infinity - * @exception returns -2 if x or y is smaller than p, - * @exception returns -3 if y^2 != x^3 + ax + b. - */ -int uECC_valid_point(const uECC_word_t *point, uECC_Curve curve); - -/* - * @brief Check if a public key is valid. - * @param public_key IN -- The public key to be checked. - * @return returns 0 if the public key is valid - * @exception returns -1 if it is a point at infinity - * @exception returns -2 if x or y is smaller than p, - * @exception returns -3 if y^2 != x^3 + ax + b. - * @exception returns -4 if public key is the group generator. - * - * @note Note that you are not required to check for a valid public key before - * using any other uECC functions. However, you may wish to avoid spending CPU - * time computing a shared secret or verifying a signature using an invalid - * public key. - */ -int uECC_valid_public_key(const uint8_t *public_key, uECC_Curve curve); - - /* - * @brief Converts an integer in uECC native format to big-endian bytes. - * @param bytes OUT -- bytes representation - * @param num_bytes IN -- number of bytes - * @param native IN -- uECC native representation - */ -void uECC_vli_nativeToBytes(uint8_t *bytes, int num_bytes, - const unsigned int *native); - -/* - * @brief Converts big-endian bytes to an integer in uECC native format. - * @param native OUT -- uECC native representation - * @param bytes IN -- bytes representation - * @param num_bytes IN -- number of bytes - */ -void uECC_vli_bytesToNative(unsigned int *native, const uint8_t *bytes, - int num_bytes); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_UECC_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc_dh.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc_dh.h deleted file mode 100644 index b828e195d..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc_dh.h +++ /dev/null @@ -1,131 +0,0 @@ -/* ecc_dh.h - TinyCrypt interface to EC-DH implementation */ - -/* - * Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief -- Interface to EC-DH implementation. - * - * Overview: This software is an implementation of EC-DH. This implementation - * uses curve NIST p-256. - * - * Security: The curve NIST p-256 provides approximately 128 bits of security. - */ - -#ifndef __TC_ECC_DH_H__ -#define __TC_ECC_DH_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Create a public/private key pair. - * @return returns TC_CRYPTO_SUCCESS (1) if the key pair was generated successfully - * returns TC_CRYPTO_FAIL (0) if error while generating key pair - * - * @param p_public_key OUT -- Will be filled in with the public key. Must be at - * least 2 * the curve size (in bytes) long. For curve secp256r1, p_public_key - * must be 64 bytes long. - * @param p_private_key OUT -- Will be filled in with the private key. Must be as - * long as the curve order (for secp256r1, p_private_key must be 32 bytes long). - * - * @note side-channel countermeasure: algorithm strengthened against timing - * attack. - * @warning A cryptographically-secure PRNG function must be set (using - * uECC_set_rng()) before calling uECC_make_key(). - */ -int uECC_make_key(uint8_t *p_public_key, uint8_t *p_private_key, uECC_Curve curve); - -#ifdef ENABLE_TESTS - -/** - * @brief Create a public/private key pair given a specific d. - * - * @note THIS FUNCTION SHOULD BE CALLED ONLY FOR TEST PURPOSES. Refer to - * uECC_make_key() function for real applications. - */ -int uECC_make_key_with_d(uint8_t *p_public_key, uint8_t *p_private_key, - unsigned int *d, uECC_Curve curve); -#endif - -/** - * @brief Compute a shared secret given your secret key and someone else's - * public key. - * @return returns TC_CRYPTO_SUCCESS (1) if the shared secret was computed successfully - * returns TC_CRYPTO_FAIL (0) otherwise - * - * @param p_secret OUT -- Will be filled in with the shared secret value. Must be - * the same size as the curve size (for curve secp256r1, secret must be 32 bytes - * long. - * @param p_public_key IN -- The public key of the remote party. - * @param p_private_key IN -- Your private key. - * - * @warning It is recommended to use the output of uECC_shared_secret() as the - * input of a recommended Key Derivation Function (see NIST SP 800-108) in - * order to produce a cryptographically secure symmetric key. - */ -int uECC_shared_secret(const uint8_t *p_public_key, const uint8_t *p_private_key, - uint8_t *p_secret, uECC_Curve curve); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_ECC_DH_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc_dsa.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc_dsa.h deleted file mode 100644 index aca00bc95..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc_dsa.h +++ /dev/null @@ -1,139 +0,0 @@ -/* ecc_dh.h - TinyCrypt interface to EC-DSA implementation */ - -/* - * Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief -- Interface to EC-DSA implementation. - * - * Overview: This software is an implementation of EC-DSA. This implementation - * uses curve NIST p-256. - * - * Security: The curve NIST p-256 provides approximately 128 bits of security. - * - * Usage: - To sign: Compute a hash of the data you wish to sign (SHA-2 is - * recommended) and pass it in to ecdsa_sign function along with your - * private key and a random number. You must use a new non-predictable - * random number to generate each new signature. - * - To verify a signature: Compute the hash of the signed data using - * the same hash as the signer and pass it to this function along with - * the signer's public key and the signature values (r and s). - */ - -#ifndef __TC_ECC_DSA_H__ -#define __TC_ECC_DSA_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Generate an ECDSA signature for a given hash value. - * @return returns TC_CRYPTO_SUCCESS (1) if the signature generated successfully - * returns TC_CRYPTO_FAIL (0) if an error occurred. - * - * @param p_private_key IN -- Your private key. - * @param p_message_hash IN -- The hash of the message to sign. - * @param p_hash_size IN -- The size of p_message_hash in bytes. - * @param p_signature OUT -- Will be filled in with the signature value. Must be - * at least 2 * curve size long (for secp256r1, signature must be 64 bytes long). - * - * @warning A cryptographically-secure PRNG function must be set (using - * uECC_set_rng()) before calling uECC_sign(). - * @note Usage: Compute a hash of the data you wish to sign (SHA-2 is - * recommended) and pass it in to this function along with your private key. - * @note side-channel countermeasure: algorithm strengthened against timing - * attack. - */ -int uECC_sign(const uint8_t *p_private_key, const uint8_t *p_message_hash, - unsigned p_hash_size, uint8_t *p_signature, uECC_Curve curve); - -#ifdef ENABLE_TESTS -/* - * THIS FUNCTION SHOULD BE CALLED FOR TEST PURPOSES ONLY. - * Refer to uECC_sign() function for real applications. - */ -int uECC_sign_with_k(const uint8_t *private_key, const uint8_t *message_hash, - unsigned int hash_size, uECC_word_t *k, uint8_t *signature, - uECC_Curve curve); -#endif - -/** - * @brief Verify an ECDSA signature. - * @return returns TC_SUCCESS (1) if the signature is valid - * returns TC_FAIL (0) if the signature is invalid. - * - * @param p_public_key IN -- The signer's public key. - * @param p_message_hash IN -- The hash of the signed data. - * @param p_hash_size IN -- The size of p_message_hash in bytes. - * @param p_signature IN -- The signature values. - * - * @note Usage: Compute the hash of the signed data using the same hash as the - * signer and pass it to this function along with the signer's public key and - * the signature values (hash_size and signature). - */ -int uECC_verify(const uint8_t *p_public_key, const uint8_t *p_message_hash, - unsigned int p_hash_size, const uint8_t *p_signature, uECC_Curve curve); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_ECC_DSA_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc_platform_specific.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc_platform_specific.h deleted file mode 100644 index e2c882356..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/ecc_platform_specific.h +++ /dev/null @@ -1,81 +0,0 @@ -/* uECC_platform_specific.h - Interface to platform specific functions*/ - -/* Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE.*/ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * uECC_platform_specific.h -- Interface to platform specific functions - */ - -#ifndef __UECC_PLATFORM_SPECIFIC_H_ -#define __UECC_PLATFORM_SPECIFIC_H_ - -/* - * The RNG function should fill 'size' random bytes into 'dest'. It should - * return 1 if 'dest' was filled with random data, or 0 if the random data could - * not be generated. The filled-in values should be either truly random, or from - * a cryptographically-secure PRNG. - * - * A cryptographically-secure PRNG function must be set (using uECC_set_rng()) - * before calling uECC_make_key() or uECC_sign(). - * - * Setting a cryptographically-secure PRNG function improves the resistance to - * side-channel attacks for uECC_shared_secret(). - * - * A correct PRNG function is set by default (default_RNG_defined = 1) and works - * for some platforms, such as Unix and Linux. For other platforms, you may need - * to provide another PRNG function. -*/ -#define default_RNG_defined 1 - -int default_CSPRNG(uint8_t *dest, unsigned int size); - -#endif /* __UECC_PLATFORM_SPECIFIC_H_ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/hmac.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/hmac.h deleted file mode 100644 index 3a081494a..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/hmac.h +++ /dev/null @@ -1,139 +0,0 @@ -/* hmac.h - TinyCrypt interface to an HMAC implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to an HMAC implementation. - * - * Overview: HMAC is a message authentication code based on hash functions. - * TinyCrypt hard codes SHA-256 as the hash function. A message - * authentication code based on hash functions is also called a - * keyed cryptographic hash function since it performs a - * transformation specified by a key in an arbitrary length data - * set into a fixed length data set (also called tag). - * - * Security: The security of the HMAC depends on the length of the key and - * on the security of the hash function. Note that HMAC primitives - * are much less affected by collision attacks than their - * corresponding hash functions. - * - * Requires: SHA-256 - * - * Usage: 1) call tc_hmac_set_key to set the HMAC key. - * - * 2) call tc_hmac_init to initialize a struct hash_state before - * processing the data. - * - * 3) call tc_hmac_update to process the next input segment; - * tc_hmac_update can be called as many times as needed to process - * all of the segments of the input; the order is important. - * - * 4) call tc_hmac_final to out put the tag. - */ - -#ifndef __TC_HMAC_H__ -#define __TC_HMAC_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct tc_hmac_state_struct { - /* the internal state required by h */ - struct tc_sha256_state_struct hash_state; - /* HMAC key schedule */ - uint8_t key[2*TC_SHA256_BLOCK_SIZE]; -}; -typedef struct tc_hmac_state_struct *TCHmacState_t; - -/** - * @brief HMAC set key procedure - * Configures ctx to use key - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if - * ctx == NULL or - * key == NULL or - * key_size == 0 - * @param ctx IN/OUT -- the struct tc_hmac_state_struct to initial - * @param key IN -- the HMAC key to configure - * @param key_size IN -- the HMAC key size - */ -int tc_hmac_set_key(TCHmacState_t ctx, const uint8_t *key, - unsigned int key_size); - -/** - * @brief HMAC init procedure - * Initializes ctx to begin the next HMAC operation - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: ctx == NULL or key == NULL - * @param ctx IN/OUT -- struct tc_hmac_state_struct buffer to init - */ -int tc_hmac_init(TCHmacState_t ctx); - -/** - * @brief HMAC update procedure - * Mixes data_length bytes addressed by data into state - * @return returns TC_CRYPTO_SUCCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: ctx == NULL or key == NULL - * @note Assumes state has been initialized by tc_hmac_init - * @param ctx IN/OUT -- state of HMAC computation so far - * @param data IN -- data to incorporate into state - * @param data_length IN -- size of data in bytes - */ -int tc_hmac_update(TCHmacState_t ctx, const void *data, - unsigned int data_length); - -/** - * @brief HMAC final procedure - * Writes the HMAC tag into the tag buffer - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * tag == NULL or - * ctx == NULL or - * key == NULL or - * taglen != TC_SHA256_DIGEST_SIZE - * @note ctx is erased before exiting. This should never be changed/removed. - * @note Assumes the tag bufer is at least sizeof(hmac_tag_size(state)) bytes - * state has been initialized by tc_hmac_init - * @param tag IN/OUT -- buffer to receive computed HMAC tag - * @param taglen IN -- size of tag in bytes - * @param ctx IN/OUT -- the HMAC state for computing tag - */ -int tc_hmac_final(uint8_t *tag, unsigned int taglen, TCHmacState_t ctx); - -#ifdef __cplusplus -} -#endif - -#endif /*__TC_HMAC_H__*/ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/hmac_prng.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/hmac_prng.h deleted file mode 100644 index ad12cbbf0..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/hmac_prng.h +++ /dev/null @@ -1,164 +0,0 @@ -/* hmac_prng.h - TinyCrypt interface to an HMAC-PRNG implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to an HMAC-PRNG implementation. - * - * Overview: A pseudo-random number generator (PRNG) generates a sequence - * of numbers that have a distribution close to the one expected - * for a sequence of truly random numbers. The NIST Special - * Publication 800-90A specifies several mechanisms to generate - * sequences of pseudo random numbers, including the HMAC-PRNG one - * which is based on HMAC. TinyCrypt implements HMAC-PRNG with - * certain modifications from the NIST SP 800-90A spec. - * - * Security: A cryptographically secure PRNG depends on the existence of an - * entropy source to provide a truly random seed as well as the - * security of the primitives used as the building blocks (HMAC and - * SHA256, for TinyCrypt). - * - * The NIST SP 800-90A standard tolerates a null personalization, - * while TinyCrypt requires a non-null personalization. This is - * because a personalization string (the host name concatenated - * with a time stamp, for example) is easily computed and might be - * the last line of defense against failure of the entropy source. - * - * Requires: - SHA-256 - * - HMAC - * - * Usage: 1) call tc_hmac_prng_init to set the HMAC key and process the - * personalization data. - * - * 2) call tc_hmac_prng_reseed to process the seed and additional - * input. - * - * 3) call tc_hmac_prng_generate to out put the pseudo-random data. - */ - -#ifndef __TC_HMAC_PRNG_H__ -#define __TC_HMAC_PRNG_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define TC_HMAC_PRNG_RESEED_REQ -1 - -struct tc_hmac_prng_struct { - /* the HMAC instance for this PRNG */ - struct tc_hmac_state_struct h; - /* the PRNG key */ - uint8_t key[TC_SHA256_DIGEST_SIZE]; - /* PRNG state */ - uint8_t v[TC_SHA256_DIGEST_SIZE]; - /* calls to tc_hmac_prng_generate left before re-seed */ - unsigned int countdown; -}; - -typedef struct tc_hmac_prng_struct *TCHmacPrng_t; - -/** - * @brief HMAC-PRNG initialization procedure - * Initializes prng with personalization, disables tc_hmac_prng_generate - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * prng == NULL, - * personalization == NULL, - * plen > MAX_PLEN - * @note Assumes: - personalization != NULL. - * The personalization is a platform unique string (e.g., the host - * name) and is the last line of defense against failure of the - * entropy source - * @warning NIST SP 800-90A specifies 3 items as seed material during - * initialization: entropy seed, personalization, and an optional - * nonce. TinyCrypts requires instead a non-null personalization - * (which is easily computed) and indirectly requires an entropy - * seed (since the reseed function is mandatorily called after - * init) - * @param prng IN/OUT -- the PRNG state to initialize - * @param personalization IN -- personalization string - * @param plen IN -- personalization length in bytes - */ -int tc_hmac_prng_init(TCHmacPrng_t prng, - const uint8_t *personalization, - unsigned int plen); - -/** - * @brief HMAC-PRNG reseed procedure - * Mixes seed into prng, enables tc_hmac_prng_generate - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * prng == NULL, - * seed == NULL, - * seedlen < MIN_SLEN, - * seendlen > MAX_SLEN, - * additional_input != (const uint8_t *) 0 && additionallen == 0, - * additional_input != (const uint8_t *) 0 && additionallen > MAX_ALEN - * @note Assumes:- tc_hmac_prng_init has been called for prng - * - seed has sufficient entropy. - * - * @param prng IN/OUT -- the PRNG state - * @param seed IN -- entropy to mix into the prng - * @param seedlen IN -- length of seed in bytes - * @param additional_input IN -- additional input to the prng - * @param additionallen IN -- additional input length in bytes - */ -int tc_hmac_prng_reseed(TCHmacPrng_t prng, const uint8_t *seed, - unsigned int seedlen, const uint8_t *additional_input, - unsigned int additionallen); - -/** - * @brief HMAC-PRNG generate procedure - * Generates outlen pseudo-random bytes into out buffer, updates prng - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_HMAC_PRNG_RESEED_REQ (-1) if a reseed is needed - * returns TC_CRYPTO_FAIL (0) if: - * out == NULL, - * prng == NULL, - * outlen == 0, - * outlen >= MAX_OUT - * @note Assumes tc_hmac_prng_init has been called for prng - * @param out IN/OUT -- buffer to receive output - * @param outlen IN -- size of out buffer in bytes - * @param prng IN/OUT -- the PRNG state - */ -int tc_hmac_prng_generate(uint8_t *out, unsigned int outlen, TCHmacPrng_t prng); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_HMAC_PRNG_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/sha256.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/sha256.h deleted file mode 100644 index af5e8baf7..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/sha256.h +++ /dev/null @@ -1,129 +0,0 @@ -/* sha256.h - TinyCrypt interface to a SHA-256 implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to a SHA-256 implementation. - * - * Overview: SHA-256 is a NIST approved cryptographic hashing algorithm - * specified in FIPS 180. A hash algorithm maps data of arbitrary - * size to data of fixed length. - * - * Security: SHA-256 provides 128 bits of security against collision attacks - * and 256 bits of security against pre-image attacks. SHA-256 does - * NOT behave like a random oracle, but it can be used as one if - * the string being hashed is prefix-free encoded before hashing. - * - * Usage: 1) call tc_sha256_init to initialize a struct - * tc_sha256_state_struct before hashing a new string. - * - * 2) call tc_sha256_update to hash the next string segment; - * tc_sha256_update can be called as many times as needed to hash - * all of the segments of a string; the order is important. - * - * 3) call tc_sha256_final to out put the digest from a hashing - * operation. - */ - -#ifndef __TC_SHA256_H__ -#define __TC_SHA256_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define TC_SHA256_BLOCK_SIZE (64) -#define TC_SHA256_DIGEST_SIZE (32) -#define TC_SHA256_STATE_BLOCKS (TC_SHA256_DIGEST_SIZE/4) - -struct tc_sha256_state_struct { - unsigned int iv[TC_SHA256_STATE_BLOCKS]; - uint64_t bits_hashed; - uint8_t leftover[TC_SHA256_BLOCK_SIZE]; - size_t leftover_offset; -}; - -typedef struct tc_sha256_state_struct *TCSha256State_t; - -/** - * @brief SHA256 initialization procedure - * Initializes s - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if s == NULL - * @param s Sha256 state struct - */ -int tc_sha256_init(TCSha256State_t s); - -/** - * @brief SHA256 update procedure - * Hashes data_length bytes addressed by data into state s - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * s == NULL, - * s->iv == NULL, - * data == NULL - * @note Assumes s has been initialized by tc_sha256_init - * @warning The state buffer 'leftover' is left in memory after processing - * If your application intends to have sensitive data in this - * buffer, remind to erase it after the data has been processed - * @param s Sha256 state struct - * @param data message to hash - * @param datalen length of message to hash - */ -int tc_sha256_update (TCSha256State_t s, const uint8_t *data, size_t datalen); - -/** - * @brief SHA256 final procedure - * Inserts the completed hash computation into digest - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * s == NULL, - * s->iv == NULL, - * digest == NULL - * @note Assumes: s has been initialized by tc_sha256_init - * digest points to at least TC_SHA256_DIGEST_SIZE bytes - * @warning The state buffer 'leftover' is left in memory after processing - * If your application intends to have sensitive data in this - * buffer, remind to erase it after the data has been processed - * @param digest unsigned eight bit integer - * @param Sha256 state struct - */ -int tc_sha256_final(uint8_t *digest, TCSha256State_t s); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_SHA256_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/utils.h b/mcuboot/ext/tinycrypt/lib/include/tinycrypt/utils.h deleted file mode 100644 index bab5c3202..000000000 --- a/mcuboot/ext/tinycrypt/lib/include/tinycrypt/utils.h +++ /dev/null @@ -1,95 +0,0 @@ -/* utils.h - TinyCrypt interface to platform-dependent run-time operations */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @file - * @brief Interface to platform-dependent run-time operations. - * - */ - -#ifndef __TC_UTILS_H__ -#define __TC_UTILS_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Copy the the buffer 'from' to the buffer 'to'. - * @return returns TC_CRYPTO_SUCCESS (1) - * returns TC_CRYPTO_FAIL (0) if: - * from_len > to_len. - * - * @param to OUT -- destination buffer - * @param to_len IN -- length of destination buffer - * @param from IN -- origin buffer - * @param from_len IN -- length of origin buffer - */ -unsigned int _copy(uint8_t *to, unsigned int to_len, - const uint8_t *from, unsigned int from_len); - -/** - * @brief Set the value 'val' into the buffer 'to', 'len' times. - * - * @param to OUT -- destination buffer - * @param val IN -- value to be set in 'to' - * @param len IN -- number of times the value will be copied - */ -void _set(void *to, uint8_t val, unsigned int len); - -/* - * @brief AES specific doubling function, which utilizes - * the finite field used by AES. - * @return Returns a^2 - * - * @param a IN/OUT -- value to be doubled - */ -uint8_t _double_byte(uint8_t a); - -/* - * @brief Constant-time algorithm to compare if two sequences of bytes are equal - * @return Returns 0 if equal, and non-zero otherwise - * - * @param a IN -- sequence of bytes a - * @param b IN -- sequence of bytes b - * @param size IN -- size of sequences a and b - */ -int _compare(const uint8_t *a, const uint8_t *b, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif /* __TC_UTILS_H__ */ diff --git a/mcuboot/ext/tinycrypt/lib/pkg.yml b/mcuboot/ext/tinycrypt/lib/pkg.yml deleted file mode 100644 index 42db8aa0e..000000000 --- a/mcuboot/ext/tinycrypt/lib/pkg.yml +++ /dev/null @@ -1,30 +0,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. -# - -pkg.name: ext/tinycrypt/lib -pkg.description: "MCUboot's bundled tinycrypt" -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - -pkg.src_dirs: - - "source" - -pkg.cflags: - - "-std=c99" diff --git a/mcuboot/ext/tinycrypt/lib/source/aes_decrypt.c b/mcuboot/ext/tinycrypt/lib/source/aes_decrypt.c deleted file mode 100644 index 993a6180c..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/aes_decrypt.c +++ /dev/null @@ -1,164 +0,0 @@ -/* aes_decrypt.c - TinyCrypt implementation of AES decryption procedure */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -static const uint8_t inv_sbox[256] = { - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d -}; - -int tc_aes128_set_decrypt_key(TCAesKeySched_t s, const uint8_t *k) -{ - return tc_aes128_set_encrypt_key(s, k); -} - -#define mult8(a)(_double_byte(_double_byte(_double_byte(a)))) -#define mult9(a)(mult8(a)^(a)) -#define multb(a)(mult8(a)^_double_byte(a)^(a)) -#define multd(a)(mult8(a)^_double_byte(_double_byte(a))^(a)) -#define multe(a)(mult8(a)^_double_byte(_double_byte(a))^_double_byte(a)) - -static inline void mult_row_column(uint8_t *out, const uint8_t *in) -{ - out[0] = multe(in[0]) ^ multb(in[1]) ^ multd(in[2]) ^ mult9(in[3]); - out[1] = mult9(in[0]) ^ multe(in[1]) ^ multb(in[2]) ^ multd(in[3]); - out[2] = multd(in[0]) ^ mult9(in[1]) ^ multe(in[2]) ^ multb(in[3]); - out[3] = multb(in[0]) ^ multd(in[1]) ^ mult9(in[2]) ^ multe(in[3]); -} - -static inline void inv_mix_columns(uint8_t *s) -{ - uint8_t t[Nb*Nk]; - - mult_row_column(t, s); - mult_row_column(&t[Nb], s+Nb); - mult_row_column(&t[2*Nb], s+(2*Nb)); - mult_row_column(&t[3*Nb], s+(3*Nb)); - (void)_copy(s, sizeof(t), t, sizeof(t)); -} - -static inline void add_round_key(uint8_t *s, const unsigned int *k) -{ - s[0] ^= (uint8_t)(k[0] >> 24); s[1] ^= (uint8_t)(k[0] >> 16); - s[2] ^= (uint8_t)(k[0] >> 8); s[3] ^= (uint8_t)(k[0]); - s[4] ^= (uint8_t)(k[1] >> 24); s[5] ^= (uint8_t)(k[1] >> 16); - s[6] ^= (uint8_t)(k[1] >> 8); s[7] ^= (uint8_t)(k[1]); - s[8] ^= (uint8_t)(k[2] >> 24); s[9] ^= (uint8_t)(k[2] >> 16); - s[10] ^= (uint8_t)(k[2] >> 8); s[11] ^= (uint8_t)(k[2]); - s[12] ^= (uint8_t)(k[3] >> 24); s[13] ^= (uint8_t)(k[3] >> 16); - s[14] ^= (uint8_t)(k[3] >> 8); s[15] ^= (uint8_t)(k[3]); -} - -static inline void inv_sub_bytes(uint8_t *s) -{ - unsigned int i; - - for (i = 0; i < (Nb*Nk); ++i) { - s[i] = inv_sbox[s[i]]; - } -} - -/* - * This inv_shift_rows also implements the matrix flip required for - * inv_mix_columns, but performs it here to reduce the number of memory - * operations. - */ -static inline void inv_shift_rows(uint8_t *s) -{ - uint8_t t[Nb*Nk]; - - t[0] = s[0]; t[1] = s[13]; t[2] = s[10]; t[3] = s[7]; - t[4] = s[4]; t[5] = s[1]; t[6] = s[14]; t[7] = s[11]; - t[8] = s[8]; t[9] = s[5]; t[10] = s[2]; t[11] = s[15]; - t[12] = s[12]; t[13] = s[9]; t[14] = s[6]; t[15] = s[3]; - (void)_copy(s, sizeof(t), t, sizeof(t)); -} - -int tc_aes_decrypt(uint8_t *out, const uint8_t *in, const TCAesKeySched_t s) -{ - uint8_t state[Nk*Nb]; - unsigned int i; - - if (out == (uint8_t *) 0) { - return TC_CRYPTO_FAIL; - } else if (in == (const uint8_t *) 0) { - return TC_CRYPTO_FAIL; - } else if (s == (TCAesKeySched_t) 0) { - return TC_CRYPTO_FAIL; - } - - (void)_copy(state, sizeof(state), in, sizeof(state)); - - add_round_key(state, s->words + Nb*Nr); - - for (i = Nr - 1; i > 0; --i) { - inv_shift_rows(state); - inv_sub_bytes(state); - add_round_key(state, s->words + Nb*i); - inv_mix_columns(state); - } - - inv_shift_rows(state); - inv_sub_bytes(state); - add_round_key(state, s->words); - - (void)_copy(out, sizeof(state), state, sizeof(state)); - - /*zeroing out the state buffer */ - _set(state, TC_ZERO_BYTE, sizeof(state)); - - - return TC_CRYPTO_SUCCESS; -} diff --git a/mcuboot/ext/tinycrypt/lib/source/aes_encrypt.c b/mcuboot/ext/tinycrypt/lib/source/aes_encrypt.c deleted file mode 100644 index 8991aee52..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/aes_encrypt.c +++ /dev/null @@ -1,191 +0,0 @@ -/* aes_encrypt.c - TinyCrypt implementation of AES encryption procedure */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -static const uint8_t sbox[256] = { - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16 -}; - -static inline unsigned int rotword(unsigned int a) -{ - return (((a) >> 24)|((a) << 8)); -} - -#define subbyte(a, o)(sbox[((a) >> (o))&0xff] << (o)) -#define subword(a)(subbyte(a, 24)|subbyte(a, 16)|subbyte(a, 8)|subbyte(a, 0)) - -int tc_aes128_set_encrypt_key(TCAesKeySched_t s, const uint8_t *k) -{ - const unsigned int rconst[11] = { - 0x00000000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, - 0x20000000, 0x40000000, 0x80000000, 0x1b000000, 0x36000000 - }; - unsigned int i; - unsigned int t; - - if (s == (TCAesKeySched_t) 0) { - return TC_CRYPTO_FAIL; - } else if (k == (const uint8_t *) 0) { - return TC_CRYPTO_FAIL; - } - - for (i = 0; i < Nk; ++i) { - s->words[i] = (k[Nb*i]<<24) | (k[Nb*i+1]<<16) | - (k[Nb*i+2]<<8) | (k[Nb*i+3]); - } - - for (; i < (Nb * (Nr + 1)); ++i) { - t = s->words[i-1]; - if ((i % Nk) == 0) { - t = subword(rotword(t)) ^ rconst[i/Nk]; - } - s->words[i] = s->words[i-Nk] ^ t; - } - - return TC_CRYPTO_SUCCESS; -} - -static inline void add_round_key(uint8_t *s, const unsigned int *k) -{ - s[0] ^= (uint8_t)(k[0] >> 24); s[1] ^= (uint8_t)(k[0] >> 16); - s[2] ^= (uint8_t)(k[0] >> 8); s[3] ^= (uint8_t)(k[0]); - s[4] ^= (uint8_t)(k[1] >> 24); s[5] ^= (uint8_t)(k[1] >> 16); - s[6] ^= (uint8_t)(k[1] >> 8); s[7] ^= (uint8_t)(k[1]); - s[8] ^= (uint8_t)(k[2] >> 24); s[9] ^= (uint8_t)(k[2] >> 16); - s[10] ^= (uint8_t)(k[2] >> 8); s[11] ^= (uint8_t)(k[2]); - s[12] ^= (uint8_t)(k[3] >> 24); s[13] ^= (uint8_t)(k[3] >> 16); - s[14] ^= (uint8_t)(k[3] >> 8); s[15] ^= (uint8_t)(k[3]); -} - -static inline void sub_bytes(uint8_t *s) -{ - unsigned int i; - - for (i = 0; i < (Nb * Nk); ++i) { - s[i] = sbox[s[i]]; - } -} - -#define triple(a)(_double_byte(a)^(a)) - -static inline void mult_row_column(uint8_t *out, const uint8_t *in) -{ - out[0] = _double_byte(in[0]) ^ triple(in[1]) ^ in[2] ^ in[3]; - out[1] = in[0] ^ _double_byte(in[1]) ^ triple(in[2]) ^ in[3]; - out[2] = in[0] ^ in[1] ^ _double_byte(in[2]) ^ triple(in[3]); - out[3] = triple(in[0]) ^ in[1] ^ in[2] ^ _double_byte(in[3]); -} - -static inline void mix_columns(uint8_t *s) -{ - uint8_t t[Nb*Nk]; - - mult_row_column(t, s); - mult_row_column(&t[Nb], s+Nb); - mult_row_column(&t[2 * Nb], s + (2 * Nb)); - mult_row_column(&t[3 * Nb], s + (3 * Nb)); - (void) _copy(s, sizeof(t), t, sizeof(t)); -} - -/* - * This shift_rows also implements the matrix flip required for mix_columns, but - * performs it here to reduce the number of memory operations. - */ -static inline void shift_rows(uint8_t *s) -{ - uint8_t t[Nb * Nk]; - - t[0] = s[0]; t[1] = s[5]; t[2] = s[10]; t[3] = s[15]; - t[4] = s[4]; t[5] = s[9]; t[6] = s[14]; t[7] = s[3]; - t[8] = s[8]; t[9] = s[13]; t[10] = s[2]; t[11] = s[7]; - t[12] = s[12]; t[13] = s[1]; t[14] = s[6]; t[15] = s[11]; - (void) _copy(s, sizeof(t), t, sizeof(t)); -} - -int tc_aes_encrypt(uint8_t *out, const uint8_t *in, const TCAesKeySched_t s) -{ - uint8_t state[Nk*Nb]; - unsigned int i; - - if (out == (uint8_t *) 0) { - return TC_CRYPTO_FAIL; - } else if (in == (const uint8_t *) 0) { - return TC_CRYPTO_FAIL; - } else if (s == (TCAesKeySched_t) 0) { - return TC_CRYPTO_FAIL; - } - - (void)_copy(state, sizeof(state), in, sizeof(state)); - add_round_key(state, s->words); - - for (i = 0; i < (Nr - 1); ++i) { - sub_bytes(state); - shift_rows(state); - mix_columns(state); - add_round_key(state, s->words + Nb*(i+1)); - } - - sub_bytes(state); - shift_rows(state); - add_round_key(state, s->words + Nb*(i+1)); - - (void)_copy(out, sizeof(state), state, sizeof(state)); - - /* zeroing out the state buffer */ - _set(state, TC_ZERO_BYTE, sizeof(state)); - - return TC_CRYPTO_SUCCESS; -} diff --git a/mcuboot/ext/tinycrypt/lib/source/cbc_mode.c b/mcuboot/ext/tinycrypt/lib/source/cbc_mode.c deleted file mode 100644 index 62d7879eb..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/cbc_mode.c +++ /dev/null @@ -1,114 +0,0 @@ -/* cbc_mode.c - TinyCrypt implementation of CBC mode encryption & decryption */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -int tc_cbc_mode_encrypt(uint8_t *out, unsigned int outlen, const uint8_t *in, - unsigned int inlen, const uint8_t *iv, - const TCAesKeySched_t sched) -{ - - uint8_t buffer[TC_AES_BLOCK_SIZE]; - unsigned int n, m; - - /* input sanity check: */ - if (out == (uint8_t *) 0 || - in == (const uint8_t *) 0 || - sched == (TCAesKeySched_t) 0 || - inlen == 0 || - outlen == 0 || - (inlen % TC_AES_BLOCK_SIZE) != 0 || - (outlen % TC_AES_BLOCK_SIZE) != 0 || - outlen != inlen + TC_AES_BLOCK_SIZE) { - return TC_CRYPTO_FAIL; - } - - /* copy iv to the buffer */ - (void)_copy(buffer, TC_AES_BLOCK_SIZE, iv, TC_AES_BLOCK_SIZE); - /* copy iv to the output buffer */ - (void)_copy(out, TC_AES_BLOCK_SIZE, iv, TC_AES_BLOCK_SIZE); - out += TC_AES_BLOCK_SIZE; - - for (n = m = 0; n < inlen; ++n) { - buffer[m++] ^= *in++; - if (m == TC_AES_BLOCK_SIZE) { - (void)tc_aes_encrypt(buffer, buffer, sched); - (void)_copy(out, TC_AES_BLOCK_SIZE, - buffer, TC_AES_BLOCK_SIZE); - out += TC_AES_BLOCK_SIZE; - m = 0; - } - } - - return TC_CRYPTO_SUCCESS; -} - -int tc_cbc_mode_decrypt(uint8_t *out, unsigned int outlen, const uint8_t *in, - unsigned int inlen, const uint8_t *iv, - const TCAesKeySched_t sched) -{ - - uint8_t buffer[TC_AES_BLOCK_SIZE]; - const uint8_t *p; - unsigned int n, m; - - /* sanity check the inputs */ - if (out == (uint8_t *) 0 || - in == (const uint8_t *) 0 || - sched == (TCAesKeySched_t) 0 || - inlen == 0 || - outlen == 0 || - (inlen % TC_AES_BLOCK_SIZE) != 0 || - (outlen % TC_AES_BLOCK_SIZE) != 0 || - outlen != inlen - TC_AES_BLOCK_SIZE) { - return TC_CRYPTO_FAIL; - } - - /* - * Note that in == iv + ciphertext, i.e. the iv and the ciphertext are - * contiguous. This allows for a very efficient decryption algorithm - * that would not otherwise be possible. - */ - p = iv; - for (n = m = 0; n < inlen; ++n) { - if ((n % TC_AES_BLOCK_SIZE) == 0) { - (void)tc_aes_decrypt(buffer, in, sched); - in += TC_AES_BLOCK_SIZE; - m = 0; - } - *out++ = buffer[m++] ^ *p++; - } - - return TC_CRYPTO_SUCCESS; -} diff --git a/mcuboot/ext/tinycrypt/lib/source/ccm_mode.c b/mcuboot/ext/tinycrypt/lib/source/ccm_mode.c deleted file mode 100644 index 929adac63..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/ccm_mode.c +++ /dev/null @@ -1,266 +0,0 @@ -/* ccm_mode.c - TinyCrypt implementation of CCM mode */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -#include - -int tc_ccm_config(TCCcmMode_t c, TCAesKeySched_t sched, uint8_t *nonce, - unsigned int nlen, unsigned int mlen) -{ - - /* input sanity check: */ - if (c == (TCCcmMode_t) 0 || - sched == (TCAesKeySched_t) 0 || - nonce == (uint8_t *) 0) { - return TC_CRYPTO_FAIL; - } else if (nlen != 13) { - return TC_CRYPTO_FAIL; /* The allowed nonce size is: 13. See documentation.*/ - } else if ((mlen < 4) || (mlen > 16) || (mlen & 1)) { - return TC_CRYPTO_FAIL; /* The allowed mac sizes are: 4, 6, 8, 10, 12, 14, 16.*/ - } - - c->mlen = mlen; - c->sched = sched; - c->nonce = nonce; - - return TC_CRYPTO_SUCCESS; -} - -/** - * Variation of CBC-MAC mode used in CCM. - */ -static void ccm_cbc_mac(uint8_t *T, const uint8_t *data, unsigned int dlen, - unsigned int flag, TCAesKeySched_t sched) -{ - - unsigned int i; - - if (flag > 0) { - T[0] ^= (uint8_t)(dlen >> 8); - T[1] ^= (uint8_t)(dlen); - dlen += 2; i = 2; - } else { - i = 0; - } - - while (i < dlen) { - T[i++ % (Nb * Nk)] ^= *data++; - if (((i % (Nb * Nk)) == 0) || dlen == i) { - (void) tc_aes_encrypt(T, T, sched); - } - } -} - -/** - * Variation of CTR mode used in CCM. - * The CTR mode used by CCM is slightly different than the conventional CTR - * mode (the counter is increased before encryption, instead of after - * encryption). Besides, it is assumed that the counter is stored in the last - * 2 bytes of the nonce. - */ -static int ccm_ctr_mode(uint8_t *out, unsigned int outlen, const uint8_t *in, - unsigned int inlen, uint8_t *ctr, const TCAesKeySched_t sched) -{ - - uint8_t buffer[TC_AES_BLOCK_SIZE]; - uint8_t nonce[TC_AES_BLOCK_SIZE]; - uint16_t block_num; - unsigned int i; - - /* input sanity check: */ - if (out == (uint8_t *) 0 || - in == (uint8_t *) 0 || - ctr == (uint8_t *) 0 || - sched == (TCAesKeySched_t) 0 || - inlen == 0 || - outlen == 0 || - outlen != inlen) { - return TC_CRYPTO_FAIL; - } - - /* copy the counter to the nonce */ - (void) _copy(nonce, sizeof(nonce), ctr, sizeof(nonce)); - - /* select the last 2 bytes of the nonce to be incremented */ - block_num = (uint16_t) ((nonce[14] << 8)|(nonce[15])); - for (i = 0; i < inlen; ++i) { - if ((i % (TC_AES_BLOCK_SIZE)) == 0) { - block_num++; - nonce[14] = (uint8_t)(block_num >> 8); - nonce[15] = (uint8_t)(block_num); - if (!tc_aes_encrypt(buffer, nonce, sched)) { - return TC_CRYPTO_FAIL; - } - } - /* update the output */ - *out++ = buffer[i % (TC_AES_BLOCK_SIZE)] ^ *in++; - } - - /* update the counter */ - ctr[14] = nonce[14]; ctr[15] = nonce[15]; - - return TC_CRYPTO_SUCCESS; -} - -int tc_ccm_generation_encryption(uint8_t *out, unsigned int olen, - const uint8_t *associated_data, - unsigned int alen, const uint8_t *payload, - unsigned int plen, TCCcmMode_t c) -{ - - /* input sanity check: */ - if ((out == (uint8_t *) 0) || - (c == (TCCcmMode_t) 0) || - ((plen > 0) && (payload == (uint8_t *) 0)) || - ((alen > 0) && (associated_data == (uint8_t *) 0)) || - (alen >= TC_CCM_AAD_MAX_BYTES) || /* associated data size unsupported */ - (plen >= TC_CCM_PAYLOAD_MAX_BYTES) || /* payload size unsupported */ - (olen < (plen + c->mlen))) { /* invalid output buffer size */ - return TC_CRYPTO_FAIL; - } - - uint8_t b[Nb * Nk]; - uint8_t tag[Nb * Nk]; - unsigned int i; - - /* GENERATING THE AUTHENTICATION TAG: */ - - /* formatting the sequence b for authentication: */ - b[0] = ((alen > 0) ? 0x40:0) | (((c->mlen - 2) / 2 << 3)) | (1); - for (i = 1; i <= 13; ++i) { - b[i] = c->nonce[i - 1]; - } - b[14] = (uint8_t)(plen >> 8); - b[15] = (uint8_t)(plen); - - /* computing the authentication tag using cbc-mac: */ - (void) tc_aes_encrypt(tag, b, c->sched); - if (alen > 0) { - ccm_cbc_mac(tag, associated_data, alen, 1, c->sched); - } - if (plen > 0) { - ccm_cbc_mac(tag, payload, plen, 0, c->sched); - } - - /* ENCRYPTION: */ - - /* formatting the sequence b for encryption: */ - b[0] = 1; /* q - 1 = 2 - 1 = 1 */ - b[14] = b[15] = TC_ZERO_BYTE; - - /* encrypting payload using ctr mode: */ - ccm_ctr_mode(out, plen, payload, plen, b, c->sched); - - b[14] = b[15] = TC_ZERO_BYTE; /* restoring initial counter for ctr_mode (0):*/ - - /* encrypting b and adding the tag to the output: */ - (void) tc_aes_encrypt(b, b, c->sched); - out += plen; - for (i = 0; i < c->mlen; ++i) { - *out++ = tag[i] ^ b[i]; - } - - return TC_CRYPTO_SUCCESS; -} - -int tc_ccm_decryption_verification(uint8_t *out, unsigned int olen, - const uint8_t *associated_data, - unsigned int alen, const uint8_t *payload, - unsigned int plen, TCCcmMode_t c) -{ - - /* input sanity check: */ - if ((out == (uint8_t *) 0) || - (c == (TCCcmMode_t) 0) || - ((plen > 0) && (payload == (uint8_t *) 0)) || - ((alen > 0) && (associated_data == (uint8_t *) 0)) || - (alen >= TC_CCM_AAD_MAX_BYTES) || /* associated data size unsupported */ - (plen >= TC_CCM_PAYLOAD_MAX_BYTES) || /* payload size unsupported */ - (olen < plen - c->mlen)) { /* invalid output buffer size */ - return TC_CRYPTO_FAIL; - } - - uint8_t b[Nb * Nk]; - uint8_t tag[Nb * Nk]; - unsigned int i; - - /* DECRYPTION: */ - - /* formatting the sequence b for decryption: */ - b[0] = 1; /* q - 1 = 2 - 1 = 1 */ - for (i = 1; i < 14; ++i) { - b[i] = c->nonce[i - 1]; - } - b[14] = b[15] = TC_ZERO_BYTE; /* initial counter value is 0 */ - - /* decrypting payload using ctr mode: */ - ccm_ctr_mode(out, plen - c->mlen, payload, plen - c->mlen, b, c->sched); - - b[14] = b[15] = TC_ZERO_BYTE; /* restoring initial counter value (0) */ - - /* encrypting b and restoring the tag from input: */ - (void) tc_aes_encrypt(b, b, c->sched); - for (i = 0; i < c->mlen; ++i) { - tag[i] = *(payload + plen - c->mlen + i) ^ b[i]; - } - - /* VERIFYING THE AUTHENTICATION TAG: */ - - /* formatting the sequence b for authentication: */ - b[0] = ((alen > 0) ? 0x40:0)|(((c->mlen - 2) / 2 << 3)) | (1); - for (i = 1; i < 14; ++i) { - b[i] = c->nonce[i - 1]; - } - b[14] = (uint8_t)((plen - c->mlen) >> 8); - b[15] = (uint8_t)(plen - c->mlen); - - /* computing the authentication tag using cbc-mac: */ - (void) tc_aes_encrypt(b, b, c->sched); - if (alen > 0) { - ccm_cbc_mac(b, associated_data, alen, 1, c->sched); - } - if (plen > 0) { - ccm_cbc_mac(b, out, plen - c->mlen, 0, c->sched); - } - - /* comparing the received tag and the computed one: */ - if (_compare(b, tag, c->mlen) == 0) { - return TC_CRYPTO_SUCCESS; - } else { - /* erase the decrypted buffer in case of mac validation failure: */ - _set(out, 0, plen - c->mlen); - return TC_CRYPTO_FAIL; - } -} diff --git a/mcuboot/ext/tinycrypt/lib/source/cmac_mode.c b/mcuboot/ext/tinycrypt/lib/source/cmac_mode.c deleted file mode 100644 index 96d147e80..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/cmac_mode.c +++ /dev/null @@ -1,254 +0,0 @@ -/* cmac_mode.c - TinyCrypt CMAC mode implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include - -/* max number of calls until change the key (2^48).*/ -const static uint64_t MAX_CALLS = ((uint64_t)1 << 48); - -/* - * gf_wrap -- In our implementation, GF(2^128) is represented as a 16 byte - * array with byte 0 the most significant and byte 15 the least significant. - * High bit carry reduction is based on the primitive polynomial - * - * X^128 + X^7 + X^2 + X + 1, - * - * which leads to the reduction formula X^128 = X^7 + X^2 + X + 1. Indeed, - * since 0 = (X^128 + X^7 + X^2 + 1) mod (X^128 + X^7 + X^2 + X + 1) and since - * addition of polynomials with coefficients in Z/Z(2) is just XOR, we can - * add X^128 to both sides to get - * - * X^128 = (X^7 + X^2 + X + 1) mod (X^128 + X^7 + X^2 + X + 1) - * - * and the coefficients of the polynomial on the right hand side form the - * string 1000 0111 = 0x87, which is the value of gf_wrap. - * - * This gets used in the following way. Doubling in GF(2^128) is just a left - * shift by 1 bit, except when the most significant bit is 1. In the latter - * case, the relation X^128 = X^7 + X^2 + X + 1 says that the high order bit - * that overflows beyond 128 bits can be replaced by addition of - * X^7 + X^2 + X + 1 <--> 0x87 to the low order 128 bits. Since addition - * in GF(2^128) is represented by XOR, we therefore only have to XOR 0x87 - * into the low order byte after a left shift when the starting high order - * bit is 1. - */ -const unsigned char gf_wrap = 0x87; - -/* - * assumes: out != NULL and points to a GF(2^n) value to receive the - * doubled value; - * in != NULL and points to a 16 byte GF(2^n) value - * to double; - * the in and out buffers do not overlap. - * effects: doubles the GF(2^n) value pointed to by "in" and places - * the result in the GF(2^n) value pointed to by "out." - */ -void gf_double(uint8_t *out, uint8_t *in) -{ - - /* start with low order byte */ - uint8_t *x = in + (TC_AES_BLOCK_SIZE - 1); - - /* if msb == 1, we need to add the gf_wrap value, otherwise add 0 */ - uint8_t carry = (in[0] >> 7) ? gf_wrap : 0; - - out += (TC_AES_BLOCK_SIZE - 1); - for (;;) { - *out-- = (*x << 1) ^ carry; - if (x == in) { - break; - } - carry = *x-- >> 7; - } -} - -int tc_cmac_setup(TCCmacState_t s, const uint8_t *key, TCAesKeySched_t sched) -{ - - /* input sanity check: */ - if (s == (TCCmacState_t) 0 || - key == (const uint8_t *) 0) { - return TC_CRYPTO_FAIL; - } - - /* put s into a known state */ - _set(s, 0, sizeof(*s)); - s->sched = sched; - - /* configure the encryption key used by the underlying block cipher */ - tc_aes128_set_encrypt_key(s->sched, key); - - /* compute s->K1 and s->K2 from s->iv using s->keyid */ - _set(s->iv, 0, TC_AES_BLOCK_SIZE); - tc_aes_encrypt(s->iv, s->iv, s->sched); - gf_double (s->K1, s->iv); - gf_double (s->K2, s->K1); - - /* reset s->iv to 0 in case someone wants to compute now */ - tc_cmac_init(s); - - return TC_CRYPTO_SUCCESS; -} - -int tc_cmac_erase(TCCmacState_t s) -{ - if (s == (TCCmacState_t) 0) { - return TC_CRYPTO_FAIL; - } - - /* destroy the current state */ - _set(s, 0, sizeof(*s)); - - return TC_CRYPTO_SUCCESS; -} - -int tc_cmac_init(TCCmacState_t s) -{ - /* input sanity check: */ - if (s == (TCCmacState_t) 0) { - return TC_CRYPTO_FAIL; - } - - /* CMAC starts with an all zero initialization vector */ - _set(s->iv, 0, TC_AES_BLOCK_SIZE); - - /* and the leftover buffer is empty */ - _set(s->leftover, 0, TC_AES_BLOCK_SIZE); - s->leftover_offset = 0; - - /* Set countdown to max number of calls allowed before re-keying: */ - s->countdown = MAX_CALLS; - - return TC_CRYPTO_SUCCESS; -} - -int tc_cmac_update(TCCmacState_t s, const uint8_t *data, size_t data_length) -{ - unsigned int i; - - /* input sanity check: */ - if (s == (TCCmacState_t) 0) { - return TC_CRYPTO_FAIL; - } - if (data_length == 0) { - return TC_CRYPTO_SUCCESS; - } - if (data == (const uint8_t *) 0) { - return TC_CRYPTO_FAIL; - } - - if (s->countdown == 0) { - return TC_CRYPTO_FAIL; - } - - s->countdown--; - - if (s->leftover_offset > 0) { - /* last data added to s didn't end on a TC_AES_BLOCK_SIZE byte boundary */ - size_t remaining_space = TC_AES_BLOCK_SIZE - s->leftover_offset; - - if (data_length < remaining_space) { - /* still not enough data to encrypt this time either */ - _copy(&s->leftover[s->leftover_offset], data_length, data, data_length); - s->leftover_offset += data_length; - return TC_CRYPTO_SUCCESS; - } - /* leftover block is now full; encrypt it first */ - _copy(&s->leftover[s->leftover_offset], - remaining_space, - data, - remaining_space); - data_length -= remaining_space; - data += remaining_space; - s->leftover_offset = 0; - - for (i = 0; i < TC_AES_BLOCK_SIZE; ++i) { - s->iv[i] ^= s->leftover[i]; - } - tc_aes_encrypt(s->iv, s->iv, s->sched); - } - - /* CBC encrypt each (except the last) of the data blocks */ - while (data_length > TC_AES_BLOCK_SIZE) { - for (i = 0; i < TC_AES_BLOCK_SIZE; ++i) { - s->iv[i] ^= data[i]; - } - tc_aes_encrypt(s->iv, s->iv, s->sched); - data += TC_AES_BLOCK_SIZE; - data_length -= TC_AES_BLOCK_SIZE; - } - - if (data_length > 0) { - /* save leftover data for next time */ - _copy(s->leftover, data_length, data, data_length); - s->leftover_offset = data_length; - } - - return TC_CRYPTO_SUCCESS; -} - -int tc_cmac_final(uint8_t *tag, TCCmacState_t s) -{ - uint8_t *k; - unsigned int i; - - /* input sanity check: */ - if (tag == (uint8_t *) 0 || - s == (TCCmacState_t) 0) { - return TC_CRYPTO_FAIL; - } - - if (s->leftover_offset == TC_AES_BLOCK_SIZE) { - /* the last message block is a full-sized block */ - k = (uint8_t *) s->K1; - } else { - /* the final message block is not a full-sized block */ - size_t remaining = TC_AES_BLOCK_SIZE - s->leftover_offset; - - _set(&s->leftover[s->leftover_offset], 0, remaining); - s->leftover[s->leftover_offset] = TC_CMAC_PADDING; - k = (uint8_t *) s->K2; - } - for (i = 0; i < TC_AES_BLOCK_SIZE; ++i) { - s->iv[i] ^= s->leftover[i] ^ k[i]; - } - - tc_aes_encrypt(tag, s->iv, s->sched); - - /* erasing state: */ - tc_cmac_erase(s); - - return TC_CRYPTO_SUCCESS; -} diff --git a/mcuboot/ext/tinycrypt/lib/source/ctr_mode.c b/mcuboot/ext/tinycrypt/lib/source/ctr_mode.c deleted file mode 100644 index 1dfb92dfe..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/ctr_mode.c +++ /dev/null @@ -1,85 +0,0 @@ -/* ctr_mode.c - TinyCrypt CTR mode implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -int tc_ctr_mode(uint8_t *out, unsigned int outlen, const uint8_t *in, - unsigned int inlen, uint8_t *ctr, const TCAesKeySched_t sched) -{ - - uint8_t buffer[TC_AES_BLOCK_SIZE]; - uint8_t nonce[TC_AES_BLOCK_SIZE]; - unsigned int block_num; - unsigned int i; - - /* input sanity check: */ - if (out == (uint8_t *) 0 || - in == (uint8_t *) 0 || - ctr == (uint8_t *) 0 || - sched == (TCAesKeySched_t) 0 || - inlen == 0 || - outlen == 0 || - outlen != inlen) { - return TC_CRYPTO_FAIL; - } - - /* copy the ctr to the nonce */ - (void)_copy(nonce, sizeof(nonce), ctr, sizeof(nonce)); - - /* select the last 4 bytes of the nonce to be incremented */ - block_num = (nonce[12] << 24) | (nonce[13] << 16) | - (nonce[14] << 8) | (nonce[15]); - for (i = 0; i < inlen; ++i) { - if ((i % (TC_AES_BLOCK_SIZE)) == 0) { - /* encrypt data using the current nonce */ - if (tc_aes_encrypt(buffer, nonce, sched)) { - block_num++; - nonce[12] = (uint8_t)(block_num >> 24); - nonce[13] = (uint8_t)(block_num >> 16); - nonce[14] = (uint8_t)(block_num >> 8); - nonce[15] = (uint8_t)(block_num); - } else { - return TC_CRYPTO_FAIL; - } - } - /* update the output */ - *out++ = buffer[i%(TC_AES_BLOCK_SIZE)] ^ *in++; - } - - /* update the counter */ - ctr[12] = nonce[12]; ctr[13] = nonce[13]; - ctr[14] = nonce[14]; ctr[15] = nonce[15]; - - return TC_CRYPTO_SUCCESS; -} diff --git a/mcuboot/ext/tinycrypt/lib/source/ctr_prng.c b/mcuboot/ext/tinycrypt/lib/source/ctr_prng.c deleted file mode 100644 index cac2cc41d..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/ctr_prng.c +++ /dev/null @@ -1,283 +0,0 @@ -/* ctr_prng.c - TinyCrypt implementation of CTR-PRNG */ - -/* - * Copyright (c) 2016, Chris Morrison - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include - -/* - * This PRNG is based on the CTR_DRBG described in Recommendation for Random - * Number Generation Using Deterministic Random Bit Generators, - * NIST SP 800-90A Rev. 1. - * - * Annotations to particular steps (e.g. 10.2.1.2 Step 1) refer to the steps - * described in that document. - * - */ - -/** - * @brief Array incrementer - * Treats the supplied array as one contiguous number (MSB in arr[0]), and - * increments it by one - * @return none - * @param arr IN/OUT -- array to be incremented - * @param len IN -- size of arr in bytes - */ -static void arrInc(uint8_t arr[], unsigned int len) -{ - unsigned int i; - if (0 != arr) { - for (i = len; i > 0U; i--) { - if (++arr[i-1] != 0U) { - break; - } - } - } -} - -/** - * @brief CTR PRNG update - * Updates the internal state of supplied the CTR PRNG context - * increments it by one - * @return none - * @note Assumes: providedData is (TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE) bytes long - * @param ctx IN/OUT -- CTR PRNG state - * @param providedData IN -- data used when updating the internal state - */ -static void tc_ctr_prng_update(TCCtrPrng_t * const ctx, uint8_t const * const providedData) -{ - if (0 != ctx) { - /* 10.2.1.2 step 1 */ - uint8_t temp[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE]; - unsigned int len = 0U; - - /* 10.2.1.2 step 2 */ - while (len < sizeof temp) { - unsigned int blocklen = sizeof(temp) - len; - uint8_t output_block[TC_AES_BLOCK_SIZE]; - - /* 10.2.1.2 step 2.1 */ - arrInc(ctx->V, sizeof ctx->V); - - /* 10.2.1.2 step 2.2 */ - if (blocklen > TC_AES_BLOCK_SIZE) { - blocklen = TC_AES_BLOCK_SIZE; - } - (void)tc_aes_encrypt(output_block, ctx->V, &ctx->key); - - /* 10.2.1.2 step 2.3/step 3 */ - memcpy(&(temp[len]), output_block, blocklen); - - len += blocklen; - } - - /* 10.2.1.2 step 4 */ - if (0 != providedData) { - unsigned int i; - for (i = 0U; i < sizeof temp; i++) { - temp[i] ^= providedData[i]; - } - } - - /* 10.2.1.2 step 5 */ - (void)tc_aes128_set_encrypt_key(&ctx->key, temp); - - /* 10.2.1.2 step 6 */ - memcpy(ctx->V, &(temp[TC_AES_KEY_SIZE]), TC_AES_BLOCK_SIZE); - } -} - -int tc_ctr_prng_init(TCCtrPrng_t * const ctx, - uint8_t const * const entropy, - unsigned int entropyLen, - uint8_t const * const personalization, - unsigned int pLen) -{ - int result = TC_CRYPTO_FAIL; - unsigned int i; - uint8_t personalization_buf[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE] = {0U}; - uint8_t seed_material[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE]; - uint8_t zeroArr[TC_AES_BLOCK_SIZE] = {0U}; - - if (0 != personalization) { - /* 10.2.1.3.1 step 1 */ - unsigned int len = pLen; - if (len > sizeof personalization_buf) { - len = sizeof personalization_buf; - } - - /* 10.2.1.3.1 step 2 */ - memcpy(personalization_buf, personalization, len); - } - - if ((0 != ctx) && (0 != entropy) && (entropyLen >= sizeof seed_material)) { - /* 10.2.1.3.1 step 3 */ - memcpy(seed_material, entropy, sizeof seed_material); - for (i = 0U; i < sizeof seed_material; i++) { - seed_material[i] ^= personalization_buf[i]; - } - - /* 10.2.1.3.1 step 4 */ - (void)tc_aes128_set_encrypt_key(&ctx->key, zeroArr); - - /* 10.2.1.3.1 step 5 */ - memset(ctx->V, 0x00, sizeof ctx->V); - - /* 10.2.1.3.1 step 6 */ - tc_ctr_prng_update(ctx, seed_material); - - /* 10.2.1.3.1 step 7 */ - ctx->reseedCount = 1U; - - result = TC_CRYPTO_SUCCESS; - } - return result; -} - -int tc_ctr_prng_reseed(TCCtrPrng_t * const ctx, - uint8_t const * const entropy, - unsigned int entropyLen, - uint8_t const * const additional_input, - unsigned int additionallen) -{ - unsigned int i; - int result = TC_CRYPTO_FAIL; - uint8_t additional_input_buf[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE] = {0U}; - uint8_t seed_material[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE]; - - if (0 != additional_input) { - /* 10.2.1.4.1 step 1 */ - unsigned int len = additionallen; - if (len > sizeof additional_input_buf) { - len = sizeof additional_input_buf; - } - - /* 10.2.1.4.1 step 2 */ - memcpy(additional_input_buf, additional_input, len); - } - - unsigned int seedlen = (unsigned int)TC_AES_KEY_SIZE + (unsigned int)TC_AES_BLOCK_SIZE; - if ((0 != ctx) && (entropyLen >= seedlen)) { - /* 10.2.1.4.1 step 3 */ - memcpy(seed_material, entropy, sizeof seed_material); - for (i = 0U; i < sizeof seed_material; i++) { - seed_material[i] ^= additional_input_buf[i]; - } - - /* 10.2.1.4.1 step 4 */ - tc_ctr_prng_update(ctx, seed_material); - - /* 10.2.1.4.1 step 5 */ - ctx->reseedCount = 1U; - - result = TC_CRYPTO_SUCCESS; - } - return result; -} - -int tc_ctr_prng_generate(TCCtrPrng_t * const ctx, - uint8_t const * const additional_input, - unsigned int additionallen, - uint8_t * const out, - unsigned int outlen) -{ - /* 2^48 - see section 10.2.1 */ - static const uint64_t MAX_REQS_BEFORE_RESEED = 0x1000000000000ULL; - - /* 2^19 bits - see section 10.2.1 */ - static const unsigned int MAX_BYTES_PER_REQ = 65536U; - - unsigned int result = TC_CRYPTO_FAIL; - - if ((0 != ctx) && (0 != out) && (outlen < MAX_BYTES_PER_REQ)) { - /* 10.2.1.5.1 step 1 */ - if (ctx->reseedCount > MAX_REQS_BEFORE_RESEED) { - result = TC_CTR_PRNG_RESEED_REQ; - } else { - uint8_t additional_input_buf[TC_AES_KEY_SIZE + TC_AES_BLOCK_SIZE] = {0U}; - if (0 != additional_input) { - /* 10.2.1.5.1 step 2 */ - unsigned int len = additionallen; - if (len > sizeof additional_input_buf) { - len = sizeof additional_input_buf; - } - memcpy(additional_input_buf, additional_input, len); - tc_ctr_prng_update(ctx, additional_input_buf); - } - - /* 10.2.1.5.1 step 3 - implicit */ - - /* 10.2.1.5.1 step 4 */ - unsigned int len = 0U; - while (len < outlen) { - unsigned int blocklen = outlen - len; - uint8_t output_block[TC_AES_BLOCK_SIZE]; - - /* 10.2.1.5.1 step 4.1 */ - arrInc(ctx->V, sizeof ctx->V); - - /* 10.2.1.5.1 step 4.2 */ - (void)tc_aes_encrypt(output_block, ctx->V, &ctx->key); - - /* 10.2.1.5.1 step 4.3/step 5 */ - if (blocklen > TC_AES_BLOCK_SIZE) { - blocklen = TC_AES_BLOCK_SIZE; - } - memcpy(&(out[len]), output_block, blocklen); - - len += blocklen; - } - - /* 10.2.1.5.1 step 6 */ - tc_ctr_prng_update(ctx, additional_input_buf); - - /* 10.2.1.5.1 step 7 */ - ctx->reseedCount++; - - /* 10.2.1.5.1 step 8 */ - result = TC_CRYPTO_SUCCESS; - } - } - - return result; -} - -void tc_ctr_prng_uninstantiate(TCCtrPrng_t * const ctx) -{ - if (0 != ctx) { - memset(ctx->key.words, 0x00, sizeof ctx->key.words); - memset(ctx->V, 0x00, sizeof ctx->V); - ctx->reseedCount = 0U; - } -} - - - - diff --git a/mcuboot/ext/tinycrypt/lib/source/ecc.c b/mcuboot/ext/tinycrypt/lib/source/ecc.c deleted file mode 100644 index 46080bf61..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/ecc.c +++ /dev/null @@ -1,942 +0,0 @@ -/* ecc.c - TinyCrypt implementation of common ECC functions */ - -/* - * Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -/* IMPORTANT: Make sure a cryptographically-secure PRNG is set and the platform - * has access to enough entropy in order to feed the PRNG regularly. */ -#if default_RNG_defined -static uECC_RNG_Function g_rng_function = &default_CSPRNG; -#else -static uECC_RNG_Function g_rng_function = 0; -#endif - -void uECC_set_rng(uECC_RNG_Function rng_function) -{ - g_rng_function = rng_function; -} - -uECC_RNG_Function uECC_get_rng(void) -{ - return g_rng_function; -} - -int uECC_curve_private_key_size(uECC_Curve curve) -{ - return BITS_TO_BYTES(curve->num_n_bits); -} - -int uECC_curve_public_key_size(uECC_Curve curve) -{ - return 2 * curve->num_bytes; -} - -void uECC_vli_clear(uECC_word_t *vli, wordcount_t num_words) -{ - wordcount_t i; - for (i = 0; i < num_words; ++i) { - vli[i] = 0; - } -} - -uECC_word_t uECC_vli_isZero(const uECC_word_t *vli, wordcount_t num_words) -{ - uECC_word_t bits = 0; - wordcount_t i; - for (i = 0; i < num_words; ++i) { - bits |= vli[i]; - } - return (bits == 0); -} - -uECC_word_t uECC_vli_testBit(const uECC_word_t *vli, bitcount_t bit) -{ - return (vli[bit >> uECC_WORD_BITS_SHIFT] & - ((uECC_word_t)1 << (bit & uECC_WORD_BITS_MASK))); -} - -/* Counts the number of words in vli. */ -static wordcount_t vli_numDigits(const uECC_word_t *vli, - const wordcount_t max_words) -{ - - wordcount_t i; - /* Search from the end until we find a non-zero digit. We do it in reverse - * because we expect that most digits will be nonzero. */ - for (i = max_words - 1; i >= 0 && vli[i] == 0; --i) { - } - - return (i + 1); -} - -bitcount_t uECC_vli_numBits(const uECC_word_t *vli, - const wordcount_t max_words) -{ - - uECC_word_t i; - uECC_word_t digit; - - wordcount_t num_digits = vli_numDigits(vli, max_words); - if (num_digits == 0) { - return 0; - } - - digit = vli[num_digits - 1]; - for (i = 0; digit; ++i) { - digit >>= 1; - } - - return (((bitcount_t)(num_digits - 1) << uECC_WORD_BITS_SHIFT) + i); -} - -void uECC_vli_set(uECC_word_t *dest, const uECC_word_t *src, - wordcount_t num_words) -{ - wordcount_t i; - - for (i = 0; i < num_words; ++i) { - dest[i] = src[i]; - } -} - -cmpresult_t uECC_vli_cmp_unsafe(const uECC_word_t *left, - const uECC_word_t *right, - wordcount_t num_words) -{ - wordcount_t i; - - for (i = num_words - 1; i >= 0; --i) { - if (left[i] > right[i]) { - return 1; - } else if (left[i] < right[i]) { - return -1; - } - } - return 0; -} - -uECC_word_t uECC_vli_equal(const uECC_word_t *left, const uECC_word_t *right, - wordcount_t num_words) -{ - - uECC_word_t diff = 0; - wordcount_t i; - - for (i = num_words - 1; i >= 0; --i) { - diff |= (left[i] ^ right[i]); - } - return !(diff == 0); -} - -uECC_word_t cond_set(uECC_word_t p_true, uECC_word_t p_false, unsigned int cond) -{ - return (p_true*(cond)) | (p_false*(!cond)); -} - -/* Computes result = left - right, returning borrow, in constant time. - * Can modify in place. */ -uECC_word_t uECC_vli_sub(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, wordcount_t num_words) -{ - uECC_word_t borrow = 0; - wordcount_t i; - for (i = 0; i < num_words; ++i) { - uECC_word_t diff = left[i] - right[i] - borrow; - uECC_word_t val = (diff > left[i]); - borrow = cond_set(val, borrow, (diff != left[i])); - - result[i] = diff; - } - return borrow; -} - -/* Computes result = left + right, returning carry, in constant time. - * Can modify in place. */ -static uECC_word_t uECC_vli_add(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, wordcount_t num_words) -{ - uECC_word_t carry = 0; - wordcount_t i; - for (i = 0; i < num_words; ++i) { - uECC_word_t sum = left[i] + right[i] + carry; - uECC_word_t val = (sum < left[i]); - carry = cond_set(val, carry, (sum != left[i])); - result[i] = sum; - } - return carry; -} - -cmpresult_t uECC_vli_cmp(const uECC_word_t *left, const uECC_word_t *right, - wordcount_t num_words) -{ - uECC_word_t tmp[NUM_ECC_WORDS]; - uECC_word_t neg = !!uECC_vli_sub(tmp, left, right, num_words); - uECC_word_t equal = uECC_vli_isZero(tmp, num_words); - return (!equal - 2 * neg); -} - -/* Computes vli = vli >> 1. */ -static void uECC_vli_rshift1(uECC_word_t *vli, wordcount_t num_words) -{ - uECC_word_t *end = vli; - uECC_word_t carry = 0; - - vli += num_words; - while (vli-- > end) { - uECC_word_t temp = *vli; - *vli = (temp >> 1) | carry; - carry = temp << (uECC_WORD_BITS - 1); - } -} - -static void muladd(uECC_word_t a, uECC_word_t b, uECC_word_t *r0, - uECC_word_t *r1, uECC_word_t *r2) -{ - - uECC_dword_t p = (uECC_dword_t)a * b; - uECC_dword_t r01 = ((uECC_dword_t)(*r1) << uECC_WORD_BITS) | *r0; - r01 += p; - *r2 += (r01 < p); - *r1 = r01 >> uECC_WORD_BITS; - *r0 = (uECC_word_t)r01; - -} - -/* Computes result = left * right. Result must be 2 * num_words long. */ -static void uECC_vli_mult(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, wordcount_t num_words) -{ - - uECC_word_t r0 = 0; - uECC_word_t r1 = 0; - uECC_word_t r2 = 0; - wordcount_t i, k; - - /* Compute each digit of result in sequence, maintaining the carries. */ - for (k = 0; k < num_words; ++k) { - - for (i = 0; i <= k; ++i) { - muladd(left[i], right[k - i], &r0, &r1, &r2); - } - - result[k] = r0; - r0 = r1; - r1 = r2; - r2 = 0; - } - - for (k = num_words; k < num_words * 2 - 1; ++k) { - - for (i = (k + 1) - num_words; i < num_words; ++i) { - muladd(left[i], right[k - i], &r0, &r1, &r2); - } - result[k] = r0; - r0 = r1; - r1 = r2; - r2 = 0; - } - result[num_words * 2 - 1] = r0; -} - -void uECC_vli_modAdd(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, const uECC_word_t *mod, - wordcount_t num_words) -{ - uECC_word_t carry = uECC_vli_add(result, left, right, num_words); - if (carry || uECC_vli_cmp_unsafe(mod, result, num_words) != 1) { - /* result > mod (result = mod + remainder), so subtract mod to get - * remainder. */ - uECC_vli_sub(result, result, mod, num_words); - } -} - -void uECC_vli_modSub(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, const uECC_word_t *mod, - wordcount_t num_words) -{ - uECC_word_t l_borrow = uECC_vli_sub(result, left, right, num_words); - if (l_borrow) { - /* In this case, result == -diff == (max int) - diff. Since -x % d == d - x, - * we can get the correct result from result + mod (with overflow). */ - uECC_vli_add(result, result, mod, num_words); - } -} - -/* Computes result = product % mod, where product is 2N words long. */ -/* Currently only designed to work for curve_p or curve_n. */ -void uECC_vli_mmod(uECC_word_t *result, uECC_word_t *product, - const uECC_word_t *mod, wordcount_t num_words) -{ - uECC_word_t mod_multiple[2 * NUM_ECC_WORDS]; - uECC_word_t tmp[2 * NUM_ECC_WORDS]; - uECC_word_t *v[2] = {tmp, product}; - uECC_word_t index; - - /* Shift mod so its highest set bit is at the maximum position. */ - bitcount_t shift = (num_words * 2 * uECC_WORD_BITS) - - uECC_vli_numBits(mod, num_words); - wordcount_t word_shift = shift / uECC_WORD_BITS; - wordcount_t bit_shift = shift % uECC_WORD_BITS; - uECC_word_t carry = 0; - uECC_vli_clear(mod_multiple, word_shift); - if (bit_shift > 0) { - for(index = 0; index < (uECC_word_t)num_words; ++index) { - mod_multiple[word_shift + index] = (mod[index] << bit_shift) | carry; - carry = mod[index] >> (uECC_WORD_BITS - bit_shift); - } - } else { - uECC_vli_set(mod_multiple + word_shift, mod, num_words); - } - - for (index = 1; shift >= 0; --shift) { - uECC_word_t borrow = 0; - wordcount_t i; - for (i = 0; i < num_words * 2; ++i) { - uECC_word_t diff = v[index][i] - mod_multiple[i] - borrow; - if (diff != v[index][i]) { - borrow = (diff > v[index][i]); - } - v[1 - index][i] = diff; - } - /* Swap the index if there was no borrow */ - index = !(index ^ borrow); - uECC_vli_rshift1(mod_multiple, num_words); - mod_multiple[num_words - 1] |= mod_multiple[num_words] << - (uECC_WORD_BITS - 1); - uECC_vli_rshift1(mod_multiple + num_words, num_words); - } - uECC_vli_set(result, v[index], num_words); -} - -void uECC_vli_modMult(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, const uECC_word_t *mod, - wordcount_t num_words) -{ - uECC_word_t product[2 * NUM_ECC_WORDS]; - uECC_vli_mult(product, left, right, num_words); - uECC_vli_mmod(result, product, mod, num_words); -} - -void uECC_vli_modMult_fast(uECC_word_t *result, const uECC_word_t *left, - const uECC_word_t *right, uECC_Curve curve) -{ - uECC_word_t product[2 * NUM_ECC_WORDS]; - uECC_vli_mult(product, left, right, curve->num_words); - - curve->mmod_fast(result, product); -} - -static void uECC_vli_modSquare_fast(uECC_word_t *result, - const uECC_word_t *left, - uECC_Curve curve) -{ - uECC_vli_modMult_fast(result, left, left, curve); -} - - -#define EVEN(vli) (!(vli[0] & 1)) - -static void vli_modInv_update(uECC_word_t *uv, - const uECC_word_t *mod, - wordcount_t num_words) -{ - - uECC_word_t carry = 0; - - if (!EVEN(uv)) { - carry = uECC_vli_add(uv, uv, mod, num_words); - } - uECC_vli_rshift1(uv, num_words); - if (carry) { - uv[num_words - 1] |= HIGH_BIT_SET; - } -} - -void uECC_vli_modInv(uECC_word_t *result, const uECC_word_t *input, - const uECC_word_t *mod, wordcount_t num_words) -{ - uECC_word_t a[NUM_ECC_WORDS], b[NUM_ECC_WORDS]; - uECC_word_t u[NUM_ECC_WORDS], v[NUM_ECC_WORDS]; - cmpresult_t cmpResult; - - if (uECC_vli_isZero(input, num_words)) { - uECC_vli_clear(result, num_words); - return; - } - - uECC_vli_set(a, input, num_words); - uECC_vli_set(b, mod, num_words); - uECC_vli_clear(u, num_words); - u[0] = 1; - uECC_vli_clear(v, num_words); - while ((cmpResult = uECC_vli_cmp_unsafe(a, b, num_words)) != 0) { - if (EVEN(a)) { - uECC_vli_rshift1(a, num_words); - vli_modInv_update(u, mod, num_words); - } else if (EVEN(b)) { - uECC_vli_rshift1(b, num_words); - vli_modInv_update(v, mod, num_words); - } else if (cmpResult > 0) { - uECC_vli_sub(a, a, b, num_words); - uECC_vli_rshift1(a, num_words); - if (uECC_vli_cmp_unsafe(u, v, num_words) < 0) { - uECC_vli_add(u, u, mod, num_words); - } - uECC_vli_sub(u, u, v, num_words); - vli_modInv_update(u, mod, num_words); - } else { - uECC_vli_sub(b, b, a, num_words); - uECC_vli_rshift1(b, num_words); - if (uECC_vli_cmp_unsafe(v, u, num_words) < 0) { - uECC_vli_add(v, v, mod, num_words); - } - uECC_vli_sub(v, v, u, num_words); - vli_modInv_update(v, mod, num_words); - } - } - uECC_vli_set(result, u, num_words); -} - -/* ------ Point operations ------ */ - -void double_jacobian_default(uECC_word_t * X1, uECC_word_t * Y1, - uECC_word_t * Z1, uECC_Curve curve) -{ - /* t1 = X, t2 = Y, t3 = Z */ - uECC_word_t t4[NUM_ECC_WORDS]; - uECC_word_t t5[NUM_ECC_WORDS]; - wordcount_t num_words = curve->num_words; - - if (uECC_vli_isZero(Z1, num_words)) { - return; - } - - uECC_vli_modSquare_fast(t4, Y1, curve); /* t4 = y1^2 */ - uECC_vli_modMult_fast(t5, X1, t4, curve); /* t5 = x1*y1^2 = A */ - uECC_vli_modSquare_fast(t4, t4, curve); /* t4 = y1^4 */ - uECC_vli_modMult_fast(Y1, Y1, Z1, curve); /* t2 = y1*z1 = z3 */ - uECC_vli_modSquare_fast(Z1, Z1, curve); /* t3 = z1^2 */ - - uECC_vli_modAdd(X1, X1, Z1, curve->p, num_words); /* t1 = x1 + z1^2 */ - uECC_vli_modAdd(Z1, Z1, Z1, curve->p, num_words); /* t3 = 2*z1^2 */ - uECC_vli_modSub(Z1, X1, Z1, curve->p, num_words); /* t3 = x1 - z1^2 */ - uECC_vli_modMult_fast(X1, X1, Z1, curve); /* t1 = x1^2 - z1^4 */ - - uECC_vli_modAdd(Z1, X1, X1, curve->p, num_words); /* t3 = 2*(x1^2 - z1^4) */ - uECC_vli_modAdd(X1, X1, Z1, curve->p, num_words); /* t1 = 3*(x1^2 - z1^4) */ - if (uECC_vli_testBit(X1, 0)) { - uECC_word_t l_carry = uECC_vli_add(X1, X1, curve->p, num_words); - uECC_vli_rshift1(X1, num_words); - X1[num_words - 1] |= l_carry << (uECC_WORD_BITS - 1); - } else { - uECC_vli_rshift1(X1, num_words); - } - - /* t1 = 3/2*(x1^2 - z1^4) = B */ - uECC_vli_modSquare_fast(Z1, X1, curve); /* t3 = B^2 */ - uECC_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - A */ - uECC_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - 2A = x3 */ - uECC_vli_modSub(t5, t5, Z1, curve->p, num_words); /* t5 = A - x3 */ - uECC_vli_modMult_fast(X1, X1, t5, curve); /* t1 = B * (A - x3) */ - /* t4 = B * (A - x3) - y1^4 = y3: */ - uECC_vli_modSub(t4, X1, t4, curve->p, num_words); - - uECC_vli_set(X1, Z1, num_words); - uECC_vli_set(Z1, Y1, num_words); - uECC_vli_set(Y1, t4, num_words); -} - -void x_side_default(uECC_word_t *result, - const uECC_word_t *x, - uECC_Curve curve) -{ - uECC_word_t _3[NUM_ECC_WORDS] = {3}; /* -a = 3 */ - wordcount_t num_words = curve->num_words; - - uECC_vli_modSquare_fast(result, x, curve); /* r = x^2 */ - uECC_vli_modSub(result, result, _3, curve->p, num_words); /* r = x^2 - 3 */ - uECC_vli_modMult_fast(result, result, x, curve); /* r = x^3 - 3x */ - /* r = x^3 - 3x + b: */ - uECC_vli_modAdd(result, result, curve->b, curve->p, num_words); -} - -uECC_Curve uECC_secp256r1(void) -{ - return &curve_secp256r1; -} - -void vli_mmod_fast_secp256r1(unsigned int *result, unsigned int*product) -{ - unsigned int tmp[NUM_ECC_WORDS]; - int carry; - - /* t */ - uECC_vli_set(result, product, NUM_ECC_WORDS); - - /* s1 */ - tmp[0] = tmp[1] = tmp[2] = 0; - tmp[3] = product[11]; - tmp[4] = product[12]; - tmp[5] = product[13]; - tmp[6] = product[14]; - tmp[7] = product[15]; - carry = uECC_vli_add(tmp, tmp, tmp, NUM_ECC_WORDS); - carry += uECC_vli_add(result, result, tmp, NUM_ECC_WORDS); - - /* s2 */ - tmp[3] = product[12]; - tmp[4] = product[13]; - tmp[5] = product[14]; - tmp[6] = product[15]; - tmp[7] = 0; - carry += uECC_vli_add(tmp, tmp, tmp, NUM_ECC_WORDS); - carry += uECC_vli_add(result, result, tmp, NUM_ECC_WORDS); - - /* s3 */ - tmp[0] = product[8]; - tmp[1] = product[9]; - tmp[2] = product[10]; - tmp[3] = tmp[4] = tmp[5] = 0; - tmp[6] = product[14]; - tmp[7] = product[15]; - carry += uECC_vli_add(result, result, tmp, NUM_ECC_WORDS); - - /* s4 */ - tmp[0] = product[9]; - tmp[1] = product[10]; - tmp[2] = product[11]; - tmp[3] = product[13]; - tmp[4] = product[14]; - tmp[5] = product[15]; - tmp[6] = product[13]; - tmp[7] = product[8]; - carry += uECC_vli_add(result, result, tmp, NUM_ECC_WORDS); - - /* d1 */ - tmp[0] = product[11]; - tmp[1] = product[12]; - tmp[2] = product[13]; - tmp[3] = tmp[4] = tmp[5] = 0; - tmp[6] = product[8]; - tmp[7] = product[10]; - carry -= uECC_vli_sub(result, result, tmp, NUM_ECC_WORDS); - - /* d2 */ - tmp[0] = product[12]; - tmp[1] = product[13]; - tmp[2] = product[14]; - tmp[3] = product[15]; - tmp[4] = tmp[5] = 0; - tmp[6] = product[9]; - tmp[7] = product[11]; - carry -= uECC_vli_sub(result, result, tmp, NUM_ECC_WORDS); - - /* d3 */ - tmp[0] = product[13]; - tmp[1] = product[14]; - tmp[2] = product[15]; - tmp[3] = product[8]; - tmp[4] = product[9]; - tmp[5] = product[10]; - tmp[6] = 0; - tmp[7] = product[12]; - carry -= uECC_vli_sub(result, result, tmp, NUM_ECC_WORDS); - - /* d4 */ - tmp[0] = product[14]; - tmp[1] = product[15]; - tmp[2] = 0; - tmp[3] = product[9]; - tmp[4] = product[10]; - tmp[5] = product[11]; - tmp[6] = 0; - tmp[7] = product[13]; - carry -= uECC_vli_sub(result, result, tmp, NUM_ECC_WORDS); - - if (carry < 0) { - do { - carry += uECC_vli_add(result, result, curve_secp256r1.p, NUM_ECC_WORDS); - } - while (carry < 0); - } else { - while (carry || - uECC_vli_cmp_unsafe(curve_secp256r1.p, result, NUM_ECC_WORDS) != 1) { - carry -= uECC_vli_sub(result, result, curve_secp256r1.p, NUM_ECC_WORDS); - } - } -} - -uECC_word_t EccPoint_isZero(const uECC_word_t *point, uECC_Curve curve) -{ - return uECC_vli_isZero(point, curve->num_words * 2); -} - -void apply_z(uECC_word_t * X1, uECC_word_t * Y1, const uECC_word_t * const Z, - uECC_Curve curve) -{ - uECC_word_t t1[NUM_ECC_WORDS]; - - uECC_vli_modSquare_fast(t1, Z, curve); /* z^2 */ - uECC_vli_modMult_fast(X1, X1, t1, curve); /* x1 * z^2 */ - uECC_vli_modMult_fast(t1, t1, Z, curve); /* z^3 */ - uECC_vli_modMult_fast(Y1, Y1, t1, curve); /* y1 * z^3 */ -} - -/* P = (x1, y1) => 2P, (x2, y2) => P' */ -static void XYcZ_initial_double(uECC_word_t * X1, uECC_word_t * Y1, - uECC_word_t * X2, uECC_word_t * Y2, - const uECC_word_t * const initial_Z, - uECC_Curve curve) -{ - uECC_word_t z[NUM_ECC_WORDS]; - wordcount_t num_words = curve->num_words; - if (initial_Z) { - uECC_vli_set(z, initial_Z, num_words); - } else { - uECC_vli_clear(z, num_words); - z[0] = 1; - } - - uECC_vli_set(X2, X1, num_words); - uECC_vli_set(Y2, Y1, num_words); - - apply_z(X1, Y1, z, curve); - curve->double_jacobian(X1, Y1, z, curve); - apply_z(X2, Y2, z, curve); -} - -void XYcZ_add(uECC_word_t * X1, uECC_word_t * Y1, - uECC_word_t * X2, uECC_word_t * Y2, - uECC_Curve curve) -{ - /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */ - uECC_word_t t5[NUM_ECC_WORDS]; - wordcount_t num_words = curve->num_words; - - uECC_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */ - uECC_vli_modSquare_fast(t5, t5, curve); /* t5 = (x2 - x1)^2 = A */ - uECC_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */ - uECC_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */ - uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */ - uECC_vli_modSquare_fast(t5, Y2, curve); /* t5 = (y2 - y1)^2 = D */ - - uECC_vli_modSub(t5, t5, X1, curve->p, num_words); /* t5 = D - B */ - uECC_vli_modSub(t5, t5, X2, curve->p, num_words); /* t5 = D - B - C = x3 */ - uECC_vli_modSub(X2, X2, X1, curve->p, num_words); /* t3 = C - B */ - uECC_vli_modMult_fast(Y1, Y1, X2, curve); /* t2 = y1*(C - B) */ - uECC_vli_modSub(X2, X1, t5, curve->p, num_words); /* t3 = B - x3 */ - uECC_vli_modMult_fast(Y2, Y2, X2, curve); /* t4 = (y2 - y1)*(B - x3) */ - uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y3 */ - - uECC_vli_set(X2, t5, num_words); -} - -/* Input P = (x1, y1, Z), Q = (x2, y2, Z) - Output P + Q = (x3, y3, Z3), P - Q = (x3', y3', Z3) - or P => P - Q, Q => P + Q - */ -static void XYcZ_addC(uECC_word_t * X1, uECC_word_t * Y1, - uECC_word_t * X2, uECC_word_t * Y2, - uECC_Curve curve) -{ - /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */ - uECC_word_t t5[NUM_ECC_WORDS]; - uECC_word_t t6[NUM_ECC_WORDS]; - uECC_word_t t7[NUM_ECC_WORDS]; - wordcount_t num_words = curve->num_words; - - uECC_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */ - uECC_vli_modSquare_fast(t5, t5, curve); /* t5 = (x2 - x1)^2 = A */ - uECC_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */ - uECC_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */ - uECC_vli_modAdd(t5, Y2, Y1, curve->p, num_words); /* t5 = y2 + y1 */ - uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */ - - uECC_vli_modSub(t6, X2, X1, curve->p, num_words); /* t6 = C - B */ - uECC_vli_modMult_fast(Y1, Y1, t6, curve); /* t2 = y1 * (C - B) = E */ - uECC_vli_modAdd(t6, X1, X2, curve->p, num_words); /* t6 = B + C */ - uECC_vli_modSquare_fast(X2, Y2, curve); /* t3 = (y2 - y1)^2 = D */ - uECC_vli_modSub(X2, X2, t6, curve->p, num_words); /* t3 = D - (B + C) = x3 */ - - uECC_vli_modSub(t7, X1, X2, curve->p, num_words); /* t7 = B - x3 */ - uECC_vli_modMult_fast(Y2, Y2, t7, curve); /* t4 = (y2 - y1)*(B - x3) */ - /* t4 = (y2 - y1)*(B - x3) - E = y3: */ - uECC_vli_modSub(Y2, Y2, Y1, curve->p, num_words); - - uECC_vli_modSquare_fast(t7, t5, curve); /* t7 = (y2 + y1)^2 = F */ - uECC_vli_modSub(t7, t7, t6, curve->p, num_words); /* t7 = F - (B + C) = x3' */ - uECC_vli_modSub(t6, t7, X1, curve->p, num_words); /* t6 = x3' - B */ - uECC_vli_modMult_fast(t6, t6, t5, curve); /* t6 = (y2+y1)*(x3' - B) */ - /* t2 = (y2+y1)*(x3' - B) - E = y3': */ - uECC_vli_modSub(Y1, t6, Y1, curve->p, num_words); - - uECC_vli_set(X1, t7, num_words); -} - -void EccPoint_mult(uECC_word_t * result, const uECC_word_t * point, - const uECC_word_t * scalar, - const uECC_word_t * initial_Z, - bitcount_t num_bits, uECC_Curve curve) -{ - /* R0 and R1 */ - uECC_word_t Rx[2][NUM_ECC_WORDS]; - uECC_word_t Ry[2][NUM_ECC_WORDS]; - uECC_word_t z[NUM_ECC_WORDS]; - bitcount_t i; - uECC_word_t nb; - wordcount_t num_words = curve->num_words; - - uECC_vli_set(Rx[1], point, num_words); - uECC_vli_set(Ry[1], point + num_words, num_words); - - XYcZ_initial_double(Rx[1], Ry[1], Rx[0], Ry[0], initial_Z, curve); - - for (i = num_bits - 2; i > 0; --i) { - nb = !uECC_vli_testBit(scalar, i); - XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve); - XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve); - } - - nb = !uECC_vli_testBit(scalar, 0); - XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve); - - /* Find final 1/Z value. */ - uECC_vli_modSub(z, Rx[1], Rx[0], curve->p, num_words); /* X1 - X0 */ - uECC_vli_modMult_fast(z, z, Ry[1 - nb], curve); /* Yb * (X1 - X0) */ - uECC_vli_modMult_fast(z, z, point, curve); /* xP * Yb * (X1 - X0) */ - uECC_vli_modInv(z, z, curve->p, num_words); /* 1 / (xP * Yb * (X1 - X0))*/ - /* yP / (xP * Yb * (X1 - X0)) */ - uECC_vli_modMult_fast(z, z, point + num_words, curve); - /* Xb * yP / (xP * Yb * (X1 - X0)) */ - uECC_vli_modMult_fast(z, z, Rx[1 - nb], curve); - /* End 1/Z calculation */ - - XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve); - apply_z(Rx[0], Ry[0], z, curve); - - uECC_vli_set(result, Rx[0], num_words); - uECC_vli_set(result + num_words, Ry[0], num_words); -} - -uECC_word_t regularize_k(const uECC_word_t * const k, uECC_word_t *k0, - uECC_word_t *k1, uECC_Curve curve) -{ - - wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits); - - bitcount_t num_n_bits = curve->num_n_bits; - - uECC_word_t carry = uECC_vli_add(k0, k, curve->n, num_n_words) || - (num_n_bits < ((bitcount_t)num_n_words * uECC_WORD_SIZE * 8) && - uECC_vli_testBit(k0, num_n_bits)); - - uECC_vli_add(k1, k0, curve->n, num_n_words); - - return carry; -} - -uECC_word_t EccPoint_compute_public_key(uECC_word_t *result, - uECC_word_t *private_key, - uECC_Curve curve) -{ - - uECC_word_t tmp1[NUM_ECC_WORDS]; - uECC_word_t tmp2[NUM_ECC_WORDS]; - uECC_word_t *p2[2] = {tmp1, tmp2}; - uECC_word_t carry; - - /* Regularize the bitcount for the private key so that attackers cannot - * use a side channel attack to learn the number of leading zeros. */ - carry = regularize_k(private_key, tmp1, tmp2, curve); - - EccPoint_mult(result, curve->G, p2[!carry], 0, curve->num_n_bits + 1, curve); - - if (EccPoint_isZero(result, curve)) { - return 0; - } - return 1; -} - -/* Converts an integer in uECC native format to big-endian bytes. */ -void uECC_vli_nativeToBytes(uint8_t *bytes, int num_bytes, - const unsigned int *native) -{ - wordcount_t i; - for (i = 0; i < num_bytes; ++i) { - unsigned b = num_bytes - 1 - i; - bytes[i] = native[b / uECC_WORD_SIZE] >> (8 * (b % uECC_WORD_SIZE)); - } -} - -/* Converts big-endian bytes to an integer in uECC native format. */ -void uECC_vli_bytesToNative(unsigned int *native, const uint8_t *bytes, - int num_bytes) -{ - wordcount_t i; - uECC_vli_clear(native, (num_bytes + (uECC_WORD_SIZE - 1)) / uECC_WORD_SIZE); - for (i = 0; i < num_bytes; ++i) { - unsigned b = num_bytes - 1 - i; - native[b / uECC_WORD_SIZE] |= - (uECC_word_t)bytes[i] << (8 * (b % uECC_WORD_SIZE)); - } -} - -int uECC_generate_random_int(uECC_word_t *random, const uECC_word_t *top, - wordcount_t num_words) -{ - uECC_word_t mask = (uECC_word_t)-1; - uECC_word_t tries; - bitcount_t num_bits = uECC_vli_numBits(top, num_words); - - if (!g_rng_function) { - return 0; - } - - for (tries = 0; tries < uECC_RNG_MAX_TRIES; ++tries) { - if (!g_rng_function((uint8_t *)random, num_words * uECC_WORD_SIZE)) { - return 0; - } - random[num_words - 1] &= - mask >> ((bitcount_t)(num_words * uECC_WORD_SIZE * 8 - num_bits)); - if (!uECC_vli_isZero(random, num_words) && - uECC_vli_cmp(top, random, num_words) == 1) { - return 1; - } - } - return 0; -} - - -int uECC_valid_point(const uECC_word_t *point, uECC_Curve curve) -{ - uECC_word_t tmp1[NUM_ECC_WORDS]; - uECC_word_t tmp2[NUM_ECC_WORDS]; - wordcount_t num_words = curve->num_words; - - /* The point at infinity is invalid. */ - if (EccPoint_isZero(point, curve)) { - return -1; - } - - /* x and y must be smaller than p. */ - if (uECC_vli_cmp_unsafe(curve->p, point, num_words) != 1 || - uECC_vli_cmp_unsafe(curve->p, point + num_words, num_words) != 1) { - return -2; - } - - uECC_vli_modSquare_fast(tmp1, point + num_words, curve); - curve->x_side(tmp2, point, curve); /* tmp2 = x^3 + ax + b */ - - /* Make sure that y^2 == x^3 + ax + b */ - if (uECC_vli_equal(tmp1, tmp2, num_words) != 0) - return -3; - - return 0; -} - -int uECC_valid_public_key(const uint8_t *public_key, uECC_Curve curve) -{ - - uECC_word_t _public[NUM_ECC_WORDS * 2]; - - uECC_vli_bytesToNative(_public, public_key, curve->num_bytes); - uECC_vli_bytesToNative( - _public + curve->num_words, - public_key + curve->num_bytes, - curve->num_bytes); - - if (uECC_vli_cmp_unsafe(_public, curve->G, NUM_ECC_WORDS * 2) == 0) { - return -4; - } - - return uECC_valid_point(_public, curve); -} - -int uECC_compute_public_key(const uint8_t *private_key, uint8_t *public_key, - uECC_Curve curve) -{ - - uECC_word_t _private[NUM_ECC_WORDS]; - uECC_word_t _public[NUM_ECC_WORDS * 2]; - - uECC_vli_bytesToNative( - _private, - private_key, - BITS_TO_BYTES(curve->num_n_bits)); - - /* Make sure the private key is in the range [1, n-1]. */ - if (uECC_vli_isZero(_private, BITS_TO_WORDS(curve->num_n_bits))) { - return 0; - } - - if (uECC_vli_cmp(curve->n, _private, BITS_TO_WORDS(curve->num_n_bits)) != 1) { - return 0; - } - - /* Compute public key. */ - if (!EccPoint_compute_public_key(_public, _private, curve)) { - return 0; - } - - uECC_vli_nativeToBytes(public_key, curve->num_bytes, _public); - uECC_vli_nativeToBytes( - public_key + - curve->num_bytes, curve->num_bytes, _public + curve->num_words); - return 1; -} - - - diff --git a/mcuboot/ext/tinycrypt/lib/source/ecc_dh.c b/mcuboot/ext/tinycrypt/lib/source/ecc_dh.c deleted file mode 100644 index e5257d2d4..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/ecc_dh.c +++ /dev/null @@ -1,200 +0,0 @@ -/* ec_dh.c - TinyCrypt implementation of EC-DH */ - -/* - * Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#include -#include -#include -#include - -#if default_RNG_defined -static uECC_RNG_Function g_rng_function = &default_CSPRNG; -#else -static uECC_RNG_Function g_rng_function = 0; -#endif - -int uECC_make_key_with_d(uint8_t *public_key, uint8_t *private_key, - unsigned int *d, uECC_Curve curve) -{ - - uECC_word_t _private[NUM_ECC_WORDS]; - uECC_word_t _public[NUM_ECC_WORDS * 2]; - - /* This function is designed for test purposes-only (such as validating NIST - * test vectors) as it uses a provided value for d instead of generating - * it uniformly at random. */ - memcpy (_private, d, NUM_ECC_BYTES); - - /* Computing public-key from private: */ - if (EccPoint_compute_public_key(_public, _private, curve)) { - - /* Converting buffers to correct bit order: */ - uECC_vli_nativeToBytes(private_key, - BITS_TO_BYTES(curve->num_n_bits), - _private); - uECC_vli_nativeToBytes(public_key, - curve->num_bytes, - _public); - uECC_vli_nativeToBytes(public_key + curve->num_bytes, - curve->num_bytes, - _public + curve->num_words); - - /* erasing temporary buffer used to store secret: */ - memset(_private, 0, NUM_ECC_BYTES); - - return 1; - } - return 0; -} - -int uECC_make_key(uint8_t *public_key, uint8_t *private_key, uECC_Curve curve) -{ - - uECC_word_t _random[NUM_ECC_WORDS * 2]; - uECC_word_t _private[NUM_ECC_WORDS]; - uECC_word_t _public[NUM_ECC_WORDS * 2]; - uECC_word_t tries; - - for (tries = 0; tries < uECC_RNG_MAX_TRIES; ++tries) { - /* Generating _private uniformly at random: */ - uECC_RNG_Function rng_function = uECC_get_rng(); - if (!rng_function || - !rng_function((uint8_t *)_random, 2 * NUM_ECC_WORDS*uECC_WORD_SIZE)) { - return 0; - } - - /* computing modular reduction of _random (see FIPS 186.4 B.4.1): */ - uECC_vli_mmod(_private, _random, curve->n, BITS_TO_WORDS(curve->num_n_bits)); - - /* Computing public-key from private: */ - if (EccPoint_compute_public_key(_public, _private, curve)) { - - /* Converting buffers to correct bit order: */ - uECC_vli_nativeToBytes(private_key, - BITS_TO_BYTES(curve->num_n_bits), - _private); - uECC_vli_nativeToBytes(public_key, - curve->num_bytes, - _public); - uECC_vli_nativeToBytes(public_key + curve->num_bytes, - curve->num_bytes, - _public + curve->num_words); - - /* erasing temporary buffer that stored secret: */ - memset(_private, 0, NUM_ECC_BYTES); - - return 1; - } - } - return 0; -} - -int uECC_shared_secret(const uint8_t *public_key, const uint8_t *private_key, - uint8_t *secret, uECC_Curve curve) -{ - - uECC_word_t _public[NUM_ECC_WORDS * 2]; - uECC_word_t _private[NUM_ECC_WORDS]; - - uECC_word_t tmp[NUM_ECC_WORDS]; - uECC_word_t *p2[2] = {_private, tmp}; - uECC_word_t *initial_Z = 0; - uECC_word_t carry; - wordcount_t num_words = curve->num_words; - wordcount_t num_bytes = curve->num_bytes; - int r; - - /* Converting buffers to correct bit order: */ - uECC_vli_bytesToNative(_private, - private_key, - BITS_TO_BYTES(curve->num_n_bits)); - uECC_vli_bytesToNative(_public, - public_key, - num_bytes); - uECC_vli_bytesToNative(_public + num_words, - public_key + num_bytes, - num_bytes); - - /* Regularize the bitcount for the private key so that attackers cannot use a - * side channel attack to learn the number of leading zeros. */ - carry = regularize_k(_private, _private, tmp, curve); - - /* If an RNG function was specified, try to get a random initial Z value to - * improve protection against side-channel attacks. */ - if (g_rng_function) { - if (!uECC_generate_random_int(p2[carry], curve->p, num_words)) { - r = 0; - goto clear_and_out; - } - initial_Z = p2[carry]; - } - - EccPoint_mult(_public, _public, p2[!carry], initial_Z, curve->num_n_bits + 1, - curve); - - uECC_vli_nativeToBytes(secret, num_bytes, _public); - r = !EccPoint_isZero(_public, curve); - -clear_and_out: - /* erasing temporary buffer used to store secret: */ - memset(p2, 0, sizeof(p2)); - __asm__ __volatile__("" :: "g"(p2) : "memory"); - memset(tmp, 0, sizeof(tmp)); - __asm__ __volatile__("" :: "g"(tmp) : "memory"); - memset(_private, 0, sizeof(_private)); - __asm__ __volatile__("" :: "g"(_private) : "memory"); - - return r; -} diff --git a/mcuboot/ext/tinycrypt/lib/source/ecc_dsa.c b/mcuboot/ext/tinycrypt/lib/source/ecc_dsa.c deleted file mode 100644 index 064dfe5ae..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/ecc_dsa.c +++ /dev/null @@ -1,295 +0,0 @@ -/* ec_dsa.c - TinyCrypt implementation of EC-DSA */ - -/* Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE.*/ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -#if default_RNG_defined -static uECC_RNG_Function g_rng_function = &default_CSPRNG; -#else -static uECC_RNG_Function g_rng_function = 0; -#endif - -static void bits2int(uECC_word_t *native, const uint8_t *bits, - unsigned bits_size, uECC_Curve curve) -{ - unsigned num_n_bytes = BITS_TO_BYTES(curve->num_n_bits); - unsigned num_n_words = BITS_TO_WORDS(curve->num_n_bits); - int shift; - uECC_word_t carry; - uECC_word_t *ptr; - - if (bits_size > num_n_bytes) { - bits_size = num_n_bytes; - } - - uECC_vli_clear(native, num_n_words); - uECC_vli_bytesToNative(native, bits, bits_size); - if (bits_size * 8 <= (unsigned)curve->num_n_bits) { - return; - } - shift = bits_size * 8 - curve->num_n_bits; - carry = 0; - ptr = native + num_n_words; - while (ptr-- > native) { - uECC_word_t temp = *ptr; - *ptr = (temp >> shift) | carry; - carry = temp << (uECC_WORD_BITS - shift); - } - - /* Reduce mod curve_n */ - if (uECC_vli_cmp_unsafe(curve->n, native, num_n_words) != 1) { - uECC_vli_sub(native, native, curve->n, num_n_words); - } -} - -int uECC_sign_with_k(const uint8_t *private_key, const uint8_t *message_hash, - unsigned hash_size, uECC_word_t *k, uint8_t *signature, - uECC_Curve curve) -{ - - uECC_word_t tmp[NUM_ECC_WORDS]; - uECC_word_t s[NUM_ECC_WORDS]; - uECC_word_t *k2[2] = {tmp, s}; - uECC_word_t p[NUM_ECC_WORDS * 2]; - uECC_word_t carry; - wordcount_t num_words = curve->num_words; - wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits); - bitcount_t num_n_bits = curve->num_n_bits; - - /* Make sure 0 < k < curve_n */ - if (uECC_vli_isZero(k, num_words) || - uECC_vli_cmp(curve->n, k, num_n_words) != 1) { - return 0; - } - - carry = regularize_k(k, tmp, s, curve); - EccPoint_mult(p, curve->G, k2[!carry], 0, num_n_bits + 1, curve); - if (uECC_vli_isZero(p, num_words)) { - return 0; - } - - /* If an RNG function was specified, get a random number - to prevent side channel analysis of k. */ - if (!g_rng_function) { - uECC_vli_clear(tmp, num_n_words); - tmp[0] = 1; - } - else if (!uECC_generate_random_int(tmp, curve->n, num_n_words)) { - return 0; - } - - /* Prevent side channel analysis of uECC_vli_modInv() to determine - bits of k / the private key by premultiplying by a random number */ - uECC_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k' = rand * k */ - uECC_vli_modInv(k, k, curve->n, num_n_words); /* k = 1 / k' */ - uECC_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k = 1 / k */ - - uECC_vli_nativeToBytes(signature, curve->num_bytes, p); /* store r */ - - /* tmp = d: */ - uECC_vli_bytesToNative(tmp, private_key, BITS_TO_BYTES(curve->num_n_bits)); - - s[num_n_words - 1] = 0; - uECC_vli_set(s, p, num_words); - uECC_vli_modMult(s, tmp, s, curve->n, num_n_words); /* s = r*d */ - - bits2int(tmp, message_hash, hash_size, curve); - uECC_vli_modAdd(s, tmp, s, curve->n, num_n_words); /* s = e + r*d */ - uECC_vli_modMult(s, s, k, curve->n, num_n_words); /* s = (e + r*d) / k */ - if (uECC_vli_numBits(s, num_n_words) > (bitcount_t)curve->num_bytes * 8) { - return 0; - } - - uECC_vli_nativeToBytes(signature + curve->num_bytes, curve->num_bytes, s); - return 1; -} - -int uECC_sign(const uint8_t *private_key, const uint8_t *message_hash, - unsigned hash_size, uint8_t *signature, uECC_Curve curve) -{ - uECC_word_t _random[2*NUM_ECC_WORDS]; - uECC_word_t k[NUM_ECC_WORDS]; - uECC_word_t tries; - - for (tries = 0; tries < uECC_RNG_MAX_TRIES; ++tries) { - /* Generating _random uniformly at random: */ - uECC_RNG_Function rng_function = uECC_get_rng(); - if (!rng_function || - !rng_function((uint8_t *)_random, 2*NUM_ECC_WORDS*uECC_WORD_SIZE)) { - return 0; - } - - // computing k as modular reduction of _random (see FIPS 186.4 B.5.1): - uECC_vli_mmod(k, _random, curve->n, BITS_TO_WORDS(curve->num_n_bits)); - - if (uECC_sign_with_k(private_key, message_hash, hash_size, k, signature, - curve)) { - return 1; - } - } - return 0; -} - -static bitcount_t smax(bitcount_t a, bitcount_t b) -{ - return (a > b ? a : b); -} - -int uECC_verify(const uint8_t *public_key, const uint8_t *message_hash, - unsigned hash_size, const uint8_t *signature, - uECC_Curve curve) -{ - - uECC_word_t u1[NUM_ECC_WORDS], u2[NUM_ECC_WORDS]; - uECC_word_t z[NUM_ECC_WORDS]; - uECC_word_t sum[NUM_ECC_WORDS * 2]; - uECC_word_t rx[NUM_ECC_WORDS]; - uECC_word_t ry[NUM_ECC_WORDS]; - uECC_word_t tx[NUM_ECC_WORDS]; - uECC_word_t ty[NUM_ECC_WORDS]; - uECC_word_t tz[NUM_ECC_WORDS]; - const uECC_word_t *points[4]; - const uECC_word_t *point; - bitcount_t num_bits; - bitcount_t i; - - uECC_word_t _public[NUM_ECC_WORDS * 2]; - uECC_word_t r[NUM_ECC_WORDS], s[NUM_ECC_WORDS]; - wordcount_t num_words = curve->num_words; - wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits); - - rx[num_n_words - 1] = 0; - r[num_n_words - 1] = 0; - s[num_n_words - 1] = 0; - - uECC_vli_bytesToNative(_public, public_key, curve->num_bytes); - uECC_vli_bytesToNative(_public + num_words, public_key + curve->num_bytes, - curve->num_bytes); - uECC_vli_bytesToNative(r, signature, curve->num_bytes); - uECC_vli_bytesToNative(s, signature + curve->num_bytes, curve->num_bytes); - - /* r, s must not be 0. */ - if (uECC_vli_isZero(r, num_words) || uECC_vli_isZero(s, num_words)) { - return 0; - } - - /* r, s must be < n. */ - if (uECC_vli_cmp_unsafe(curve->n, r, num_n_words) != 1 || - uECC_vli_cmp_unsafe(curve->n, s, num_n_words) != 1) { - return 0; - } - - /* Calculate u1 and u2. */ - uECC_vli_modInv(z, s, curve->n, num_n_words); /* z = 1/s */ - u1[num_n_words - 1] = 0; - bits2int(u1, message_hash, hash_size, curve); - uECC_vli_modMult(u1, u1, z, curve->n, num_n_words); /* u1 = e/s */ - uECC_vli_modMult(u2, r, z, curve->n, num_n_words); /* u2 = r/s */ - - /* Calculate sum = G + Q. */ - uECC_vli_set(sum, _public, num_words); - uECC_vli_set(sum + num_words, _public + num_words, num_words); - uECC_vli_set(tx, curve->G, num_words); - uECC_vli_set(ty, curve->G + num_words, num_words); - uECC_vli_modSub(z, sum, tx, curve->p, num_words); /* z = x2 - x1 */ - XYcZ_add(tx, ty, sum, sum + num_words, curve); - uECC_vli_modInv(z, z, curve->p, num_words); /* z = 1/z */ - apply_z(sum, sum + num_words, z, curve); - - /* Use Shamir's trick to calculate u1*G + u2*Q */ - points[0] = 0; - points[1] = curve->G; - points[2] = _public; - points[3] = sum; - num_bits = smax(uECC_vli_numBits(u1, num_n_words), - uECC_vli_numBits(u2, num_n_words)); - - point = points[(!!uECC_vli_testBit(u1, num_bits - 1)) | - ((!!uECC_vli_testBit(u2, num_bits - 1)) << 1)]; - uECC_vli_set(rx, point, num_words); - uECC_vli_set(ry, point + num_words, num_words); - uECC_vli_clear(z, num_words); - z[0] = 1; - - for (i = num_bits - 2; i >= 0; --i) { - uECC_word_t index; - curve->double_jacobian(rx, ry, z, curve); - - index = (!!uECC_vli_testBit(u1, i)) | ((!!uECC_vli_testBit(u2, i)) << 1); - point = points[index]; - if (point) { - uECC_vli_set(tx, point, num_words); - uECC_vli_set(ty, point + num_words, num_words); - apply_z(tx, ty, z, curve); - uECC_vli_modSub(tz, rx, tx, curve->p, num_words); /* Z = x2 - x1 */ - XYcZ_add(tx, ty, rx, ry, curve); - uECC_vli_modMult_fast(z, z, tz, curve); - } - } - - uECC_vli_modInv(z, z, curve->p, num_words); /* Z = 1/Z */ - apply_z(rx, ry, z, curve); - - /* v = x1 (mod n) */ - if (uECC_vli_cmp_unsafe(curve->n, rx, num_n_words) != 1) { - uECC_vli_sub(rx, rx, curve->n, num_n_words); - } - - /* Accept only if v == r. */ - return (int)(uECC_vli_equal(rx, r, num_words) == 0); -} - diff --git a/mcuboot/ext/tinycrypt/lib/source/ecc_platform_specific.c b/mcuboot/ext/tinycrypt/lib/source/ecc_platform_specific.c deleted file mode 100644 index 1867988f9..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/ecc_platform_specific.c +++ /dev/null @@ -1,105 +0,0 @@ -/* uECC_platform_specific.c - Implementation of platform specific functions*/ - -/* Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE.*/ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * uECC_platform_specific.c -- Implementation of platform specific functions - */ - - -#if defined(unix) || defined(__linux__) || defined(__unix__) || \ - defined(__unix) | (defined(__APPLE__) && defined(__MACH__)) || \ - defined(uECC_POSIX) - -/* Some POSIX-like system with /dev/urandom or /dev/random. */ -#include -#include -#include - -#include - -#ifndef O_CLOEXEC -#define O_CLOEXEC 0 -#endif - -int default_CSPRNG(uint8_t *dest, unsigned int size) { - - /* input sanity check: */ - if (dest == (uint8_t *) 0 || (size <= 0)) - return 0; - - int fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC); - if (fd == -1) { - fd = open("/dev/random", O_RDONLY | O_CLOEXEC); - if (fd == -1) { - return 0; - } - } - - char *ptr = (char *)dest; - size_t left = (size_t) size; - while (left > 0) { - ssize_t bytes_read = read(fd, ptr, left); - if (bytes_read <= 0) { // read failed - close(fd); - return 0; - } - left -= bytes_read; - ptr += bytes_read; - } - - close(fd); - return 1; -} - -#endif /* platform */ - diff --git a/mcuboot/ext/tinycrypt/lib/source/hmac.c b/mcuboot/ext/tinycrypt/lib/source/hmac.c deleted file mode 100644 index 89878cec7..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/hmac.c +++ /dev/null @@ -1,148 +0,0 @@ -/* hmac.c - TinyCrypt implementation of the HMAC algorithm */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -static void rekey(uint8_t *key, const uint8_t *new_key, unsigned int key_size) -{ - const uint8_t inner_pad = (uint8_t) 0x36; - const uint8_t outer_pad = (uint8_t) 0x5c; - unsigned int i; - - for (i = 0; i < key_size; ++i) { - key[i] = inner_pad ^ new_key[i]; - key[i + TC_SHA256_BLOCK_SIZE] = outer_pad ^ new_key[i]; - } - for (; i < TC_SHA256_BLOCK_SIZE; ++i) { - key[i] = inner_pad; key[i + TC_SHA256_BLOCK_SIZE] = outer_pad; - } -} - -int tc_hmac_set_key(TCHmacState_t ctx, const uint8_t *key, - unsigned int key_size) -{ - - /* input sanity check: */ - if (ctx == (TCHmacState_t) 0 || - key == (const uint8_t *) 0 || - key_size == 0) { - return TC_CRYPTO_FAIL; - } - - const uint8_t dummy_key[key_size]; - struct tc_hmac_state_struct dummy_state; - - if (key_size <= TC_SHA256_BLOCK_SIZE) { - /* - * The next three lines consist of dummy calls just to avoid - * certain timing attacks. Without these dummy calls, - * adversaries would be able to learn whether the key_size is - * greater than TC_SHA256_BLOCK_SIZE by measuring the time - * consumed in this process. - */ - (void)tc_sha256_init(&dummy_state.hash_state); - (void)tc_sha256_update(&dummy_state.hash_state, - dummy_key, - key_size); - (void)tc_sha256_final(&dummy_state.key[TC_SHA256_DIGEST_SIZE], - &dummy_state.hash_state); - - /* Actual code for when key_size <= TC_SHA256_BLOCK_SIZE: */ - rekey(ctx->key, key, key_size); - } else { - (void)tc_sha256_init(&ctx->hash_state); - (void)tc_sha256_update(&ctx->hash_state, key, key_size); - (void)tc_sha256_final(&ctx->key[TC_SHA256_DIGEST_SIZE], - &ctx->hash_state); - rekey(ctx->key, - &ctx->key[TC_SHA256_DIGEST_SIZE], - TC_SHA256_DIGEST_SIZE); - } - - return TC_CRYPTO_SUCCESS; -} - -int tc_hmac_init(TCHmacState_t ctx) -{ - - /* input sanity check: */ - if (ctx == (TCHmacState_t) 0) { - return TC_CRYPTO_FAIL; - } - - (void) tc_sha256_init(&ctx->hash_state); - (void) tc_sha256_update(&ctx->hash_state, ctx->key, TC_SHA256_BLOCK_SIZE); - - return TC_CRYPTO_SUCCESS; -} - -int tc_hmac_update(TCHmacState_t ctx, - const void *data, - unsigned int data_length) -{ - - /* input sanity check: */ - if (ctx == (TCHmacState_t) 0) { - return TC_CRYPTO_FAIL; - } - - (void)tc_sha256_update(&ctx->hash_state, data, data_length); - - return TC_CRYPTO_SUCCESS; -} - -int tc_hmac_final(uint8_t *tag, unsigned int taglen, TCHmacState_t ctx) -{ - - /* input sanity check: */ - if (tag == (uint8_t *) 0 || - taglen != TC_SHA256_DIGEST_SIZE || - ctx == (TCHmacState_t) 0) { - return TC_CRYPTO_FAIL; - } - - (void) tc_sha256_final(tag, &ctx->hash_state); - - (void)tc_sha256_init(&ctx->hash_state); - (void)tc_sha256_update(&ctx->hash_state, - &ctx->key[TC_SHA256_BLOCK_SIZE], - TC_SHA256_BLOCK_SIZE); - (void)tc_sha256_update(&ctx->hash_state, tag, TC_SHA256_DIGEST_SIZE); - (void)tc_sha256_final(tag, &ctx->hash_state); - - /* destroy the current state */ - _set(ctx, 0, sizeof(*ctx)); - - return TC_CRYPTO_SUCCESS; -} diff --git a/mcuboot/ext/tinycrypt/lib/source/hmac_prng.c b/mcuboot/ext/tinycrypt/lib/source/hmac_prng.c deleted file mode 100644 index 68b5b1faf..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/hmac_prng.c +++ /dev/null @@ -1,212 +0,0 @@ -/* hmac_prng.c - TinyCrypt implementation of HMAC-PRNG */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include - -/* - * min bytes in the seed string. - * MIN_SLEN*8 must be at least the expected security level. - */ -static const unsigned int MIN_SLEN = 32; - -/* - * max bytes in the seed string; - * SP800-90A specifies a maximum of 2^35 bits (i.e., 2^32 bytes). - */ -static const unsigned int MAX_SLEN = UINT32_MAX; - -/* - * max bytes in the personalization string; - * SP800-90A specifies a maximum of 2^35 bits (i.e., 2^32 bytes). - */ -static const unsigned int MAX_PLEN = UINT32_MAX; - -/* - * max bytes in the additional_info string; - * SP800-90A specifies a maximum of 2^35 bits (i.e., 2^32 bytes). - */ -static const unsigned int MAX_ALEN = UINT32_MAX; - -/* - * max number of generates between re-seeds; - * TinyCrypt accepts up to (2^32 - 1) which is the maximal value of - * a 32-bit unsigned int variable, while SP800-90A specifies a maximum of 2^48. - */ -static const unsigned int MAX_GENS = UINT32_MAX; - -/* - * maximum bytes per generate call; - * SP800-90A specifies a maximum up to 2^19. - */ -static const unsigned int MAX_OUT = (1 << 19); - -/* - * Assumes: prng != NULL, e != NULL, len >= 0. - */ -static void update(TCHmacPrng_t prng, const uint8_t *e, unsigned int len) -{ - const uint8_t separator0 = 0x00; - const uint8_t separator1 = 0x01; - - /* use current state, e and separator 0 to compute a new prng key: */ - (void)tc_hmac_init(&prng->h); - (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v)); - (void)tc_hmac_update(&prng->h, &separator0, sizeof(separator0)); - (void)tc_hmac_update(&prng->h, e, len); - (void)tc_hmac_final(prng->key, sizeof(prng->key), &prng->h); - /* configure the new prng key into the prng's instance of hmac */ - (void)tc_hmac_set_key(&prng->h, prng->key, sizeof(prng->key)); - - /* use the new key to compute a new state variable v */ - (void)tc_hmac_init(&prng->h); - (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v)); - (void)tc_hmac_final(prng->v, sizeof(prng->v), &prng->h); - - /* use current state, e and separator 1 to compute a new prng key: */ - (void)tc_hmac_init(&prng->h); - (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v)); - (void)tc_hmac_update(&prng->h, &separator1, sizeof(separator1)); - (void)tc_hmac_update(&prng->h, e, len); - (void)tc_hmac_final(prng->key, sizeof(prng->key), &prng->h); - /* configure the new prng key into the prng's instance of hmac */ - (void)tc_hmac_set_key(&prng->h, prng->key, sizeof(prng->key)); - - /* use the new key to compute a new state variable v */ - (void)tc_hmac_init(&prng->h); - (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v)); - (void)tc_hmac_final(prng->v, sizeof(prng->v), &prng->h); -} - -int tc_hmac_prng_init(TCHmacPrng_t prng, - const uint8_t *personalization, - unsigned int plen) -{ - - /* input sanity check: */ - if (prng == (TCHmacPrng_t) 0 || - personalization == (uint8_t *) 0 || - plen > MAX_PLEN) { - return TC_CRYPTO_FAIL; - } - - /* put the generator into a known state: */ - _set(prng->key, 0x00, sizeof(prng->key)); - _set(prng->v, 0x01, sizeof(prng->v)); - tc_hmac_set_key(&prng->h, prng->key, sizeof(prng->key)); - /* update assumes SOME key has been configured into HMAC */ - - update(prng, personalization, plen); - - /* force a reseed before allowing tc_hmac_prng_generate to succeed: */ - prng->countdown = 0; - - return TC_CRYPTO_SUCCESS; -} - -int tc_hmac_prng_reseed(TCHmacPrng_t prng, - const uint8_t *seed, - unsigned int seedlen, - const uint8_t *additional_input, - unsigned int additionallen) -{ - - /* input sanity check: */ - if (prng == (TCHmacPrng_t) 0 || - seed == (const uint8_t *) 0 || - seedlen < MIN_SLEN || - seedlen > MAX_SLEN) { - return TC_CRYPTO_FAIL; - } - - if (additional_input != (const uint8_t *) 0) { - /* - * Abort if additional_input is provided but has inappropriate - * length - */ - if (additionallen == 0 || - additionallen > MAX_ALEN) { - return TC_CRYPTO_FAIL; - } else { - /* call update for the seed and additional_input */ - update(prng, seed, seedlen); - update(prng, additional_input, additionallen); - } - } else { - /* call update only for the seed */ - update(prng, seed, seedlen); - } - - /* ... and enable hmac_prng_generate */ - prng->countdown = MAX_GENS; - - return TC_CRYPTO_SUCCESS; -} - -int tc_hmac_prng_generate(uint8_t *out, unsigned int outlen, TCHmacPrng_t prng) -{ - unsigned int bufferlen; - - /* input sanity check: */ - if (out == (uint8_t *) 0 || - prng == (TCHmacPrng_t) 0 || - outlen == 0 || - outlen > MAX_OUT) { - return TC_CRYPTO_FAIL; - } else if (prng->countdown == 0) { - return TC_HMAC_PRNG_RESEED_REQ; - } - - prng->countdown--; - - while (outlen != 0) { - /* operate HMAC in OFB mode to create "random" outputs */ - (void)tc_hmac_init(&prng->h); - (void)tc_hmac_update(&prng->h, prng->v, sizeof(prng->v)); - (void)tc_hmac_final(prng->v, sizeof(prng->v), &prng->h); - - bufferlen = (TC_SHA256_DIGEST_SIZE > outlen) ? - outlen : TC_SHA256_DIGEST_SIZE; - (void)_copy(out, bufferlen, prng->v, bufferlen); - - out += bufferlen; - outlen = (outlen > TC_SHA256_DIGEST_SIZE) ? - (outlen - TC_SHA256_DIGEST_SIZE) : 0; - } - - /* block future PRNG compromises from revealing past state */ - update(prng, prng->v, TC_SHA256_DIGEST_SIZE); - - return TC_CRYPTO_SUCCESS; -} diff --git a/mcuboot/ext/tinycrypt/lib/source/sha256.c b/mcuboot/ext/tinycrypt/lib/source/sha256.c deleted file mode 100644 index b4efd2044..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/sha256.c +++ /dev/null @@ -1,217 +0,0 @@ -/* sha256.c - TinyCrypt SHA-256 crypto hash algorithm implementation */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -static void compress(unsigned int *iv, const uint8_t *data); - -int tc_sha256_init(TCSha256State_t s) -{ - /* input sanity check: */ - if (s == (TCSha256State_t) 0) { - return TC_CRYPTO_FAIL; - } - - /* - * Setting the initial state values. - * These values correspond to the first 32 bits of the fractional parts - * of the square roots of the first 8 primes: 2, 3, 5, 7, 11, 13, 17 - * and 19. - */ - _set((uint8_t *) s, 0x00, sizeof(*s)); - s->iv[0] = 0x6a09e667; - s->iv[1] = 0xbb67ae85; - s->iv[2] = 0x3c6ef372; - s->iv[3] = 0xa54ff53a; - s->iv[4] = 0x510e527f; - s->iv[5] = 0x9b05688c; - s->iv[6] = 0x1f83d9ab; - s->iv[7] = 0x5be0cd19; - - return TC_CRYPTO_SUCCESS; -} - -int tc_sha256_update(TCSha256State_t s, const uint8_t *data, size_t datalen) -{ - /* input sanity check: */ - if (s == (TCSha256State_t) 0 || - data == (void *) 0) { - return TC_CRYPTO_FAIL; - } else if (datalen == 0) { - return TC_CRYPTO_SUCCESS; - } - - while (datalen-- > 0) { - s->leftover[s->leftover_offset++] = *(data++); - if (s->leftover_offset >= TC_SHA256_BLOCK_SIZE) { - compress(s->iv, s->leftover); - s->leftover_offset = 0; - s->bits_hashed += (TC_SHA256_BLOCK_SIZE << 3); - } - } - - return TC_CRYPTO_SUCCESS; -} - -int tc_sha256_final(uint8_t *digest, TCSha256State_t s) -{ - unsigned int i; - - /* input sanity check: */ - if (digest == (uint8_t *) 0 || - s == (TCSha256State_t) 0) { - return TC_CRYPTO_FAIL; - } - - s->bits_hashed += (s->leftover_offset << 3); - - s->leftover[s->leftover_offset++] = 0x80; /* always room for one byte */ - if (s->leftover_offset > (sizeof(s->leftover) - 8)) { - /* there is not room for all the padding in this block */ - _set(s->leftover + s->leftover_offset, 0x00, - sizeof(s->leftover) - s->leftover_offset); - compress(s->iv, s->leftover); - s->leftover_offset = 0; - } - - /* add the padding and the length in big-Endian format */ - _set(s->leftover + s->leftover_offset, 0x00, - sizeof(s->leftover) - 8 - s->leftover_offset); - s->leftover[sizeof(s->leftover) - 1] = (uint8_t)(s->bits_hashed); - s->leftover[sizeof(s->leftover) - 2] = (uint8_t)(s->bits_hashed >> 8); - s->leftover[sizeof(s->leftover) - 3] = (uint8_t)(s->bits_hashed >> 16); - s->leftover[sizeof(s->leftover) - 4] = (uint8_t)(s->bits_hashed >> 24); - s->leftover[sizeof(s->leftover) - 5] = (uint8_t)(s->bits_hashed >> 32); - s->leftover[sizeof(s->leftover) - 6] = (uint8_t)(s->bits_hashed >> 40); - s->leftover[sizeof(s->leftover) - 7] = (uint8_t)(s->bits_hashed >> 48); - s->leftover[sizeof(s->leftover) - 8] = (uint8_t)(s->bits_hashed >> 56); - - /* hash the padding and length */ - compress(s->iv, s->leftover); - - /* copy the iv out to digest */ - for (i = 0; i < TC_SHA256_STATE_BLOCKS; ++i) { - unsigned int t = *((unsigned int *) &s->iv[i]); - *digest++ = (uint8_t)(t >> 24); - *digest++ = (uint8_t)(t >> 16); - *digest++ = (uint8_t)(t >> 8); - *digest++ = (uint8_t)(t); - } - - /* destroy the current state */ - _set(s, 0, sizeof(*s)); - - return TC_CRYPTO_SUCCESS; -} - -/* - * Initializing SHA-256 Hash constant words K. - * These values correspond to the first 32 bits of the fractional parts of the - * cube roots of the first 64 primes between 2 and 311. - */ -static const unsigned int k256[64] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, - 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, - 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, - 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, - 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, - 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 -}; - -static inline unsigned int ROTR(unsigned int a, unsigned int n) -{ - return (((a) >> n) | ((a) << (32 - n))); -} - -#define Sigma0(a)(ROTR((a), 2) ^ ROTR((a), 13) ^ ROTR((a), 22)) -#define Sigma1(a)(ROTR((a), 6) ^ ROTR((a), 11) ^ ROTR((a), 25)) -#define sigma0(a)(ROTR((a), 7) ^ ROTR((a), 18) ^ ((a) >> 3)) -#define sigma1(a)(ROTR((a), 17) ^ ROTR((a), 19) ^ ((a) >> 10)) - -#define Ch(a, b, c)(((a) & (b)) ^ ((~(a)) & (c))) -#define Maj(a, b, c)(((a) & (b)) ^ ((a) & (c)) ^ ((b) & (c))) - -static inline unsigned int BigEndian(const uint8_t **c) -{ - unsigned int n = 0; - - n = (((unsigned int)(*((*c)++))) << 24); - n |= ((unsigned int)(*((*c)++)) << 16); - n |= ((unsigned int)(*((*c)++)) << 8); - n |= ((unsigned int)(*((*c)++))); - return n; -} - -static void compress(unsigned int *iv, const uint8_t *data) -{ - unsigned int a, b, c, d, e, f, g, h; - unsigned int s0, s1; - unsigned int t1, t2; - unsigned int work_space[16]; - unsigned int n; - unsigned int i; - - a = iv[0]; b = iv[1]; c = iv[2]; d = iv[3]; - e = iv[4]; f = iv[5]; g = iv[6]; h = iv[7]; - - for (i = 0; i < 16; ++i) { - n = BigEndian(&data); - t1 = work_space[i] = n; - t1 += h + Sigma1(e) + Ch(e, f, g) + k256[i]; - t2 = Sigma0(a) + Maj(a, b, c); - h = g; g = f; f = e; e = d + t1; - d = c; c = b; b = a; a = t1 + t2; - } - - for ( ; i < 64; ++i) { - s0 = work_space[(i+1)&0x0f]; - s0 = sigma0(s0); - s1 = work_space[(i+14)&0x0f]; - s1 = sigma1(s1); - - t1 = work_space[i&0xf] += s0 + s1 + work_space[(i+9)&0xf]; - t1 += h + Sigma1(e) + Ch(e, f, g) + k256[i]; - t2 = Sigma0(a) + Maj(a, b, c); - h = g; g = f; f = e; e = d + t1; - d = c; c = b; b = a; a = t1 + t2; - } - - iv[0] += a; iv[1] += b; iv[2] += c; iv[3] += d; - iv[4] += e; iv[5] += f; iv[6] += g; iv[7] += h; -} diff --git a/mcuboot/ext/tinycrypt/lib/source/utils.c b/mcuboot/ext/tinycrypt/lib/source/utils.c deleted file mode 100644 index 13cc49512..000000000 --- a/mcuboot/ext/tinycrypt/lib/source/utils.c +++ /dev/null @@ -1,74 +0,0 @@ -/* utils.c - TinyCrypt platform-dependent run-time operations */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -#include - -#define MASK_TWENTY_SEVEN 0x1b - -unsigned int _copy(uint8_t *to, unsigned int to_len, - const uint8_t *from, unsigned int from_len) -{ - if (from_len <= to_len) { - (void)memcpy(to, from, from_len); - return from_len; - } else { - return TC_CRYPTO_FAIL; - } -} - -void _set(void *to, uint8_t val, unsigned int len) -{ - (void)memset(to, val, len); -} - -/* - * Doubles the value of a byte for values up to 127. - */ -uint8_t _double_byte(uint8_t a) -{ - return ((a<<1) ^ ((a>>7) * MASK_TWENTY_SEVEN)); -} - -int _compare(const uint8_t *a, const uint8_t *b, size_t size) -{ - const uint8_t *tempa = a; - const uint8_t *tempb = b; - uint8_t result = 0; - - for (unsigned int i = 0; i < size; i++) { - result |= tempa[i] ^ tempb[i]; - } - return result; -} diff --git a/mcuboot/ext/tinycrypt/tests/Makefile b/mcuboot/ext/tinycrypt/tests/Makefile deleted file mode 100644 index eff5a88a8..000000000 --- a/mcuboot/ext/tinycrypt/tests/Makefile +++ /dev/null @@ -1,67 +0,0 @@ -################################################################################ -# -# Copyright (C) 2017 by Intel Corporation, All Rights Reserved. -# -# Tests Makefile. -# -################################################################################ - -include ../config.mk - -TEST_LIB_FILE:=test_ecc_utils.c -TEST_SOURCE:=$(filter-out $(TEST_LIB_FILE), $(wildcard test_*.c)) - -TEST_OBJECTS:=$(TEST_SOURCE:.c=.o) -TEST_DEPS:=$(TEST_SOURCE:.c=.d) -TEST_BINARY:=$(TEST_SOURCE:.c=$(DOTEXE)) - -# Edit the 'all' content to add/remove tests needed from TinyCrypt library: -all: $(TEST_BINARY) - -clean: - -$(RM) $(TEST_BINARY) $(TEST_OBJECTS) $(TEST_DEPS) - -$(RM) *~ *.o *.d - -# Dependencies -test_aes$(DOTEXE): test_aes.o aes_encrypt.o aes_decrypt.o utils.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_cbc_mode$(DOTEXE): test_cbc_mode.o cbc_mode.o \ - aes_encrypt.o aes_decrypt.o utils.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_ctr_mode$(DOTEXE): test_ctr_mode.o ctr_mode.o \ - aes_encrypt.o utils.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_ctr_prng$(DOTEXE): test_ctr_prng.o ctr_prng.o \ - aes_encrypt.o utils.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_cmac_mode$(DOTEXE): test_cmac_mode.o aes_encrypt.o utils.o \ - cmac_mode.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_ccm_mode$(DOTEXE): test_ccm_mode.o aes_encrypt.o \ - utils.o ccm_mode.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_hmac$(DOTEXE): test_hmac.o hmac.o sha256.o utils.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_hmac_prng$(DOTEXE): test_hmac_prng.o hmac_prng.o hmac.o \ - sha256.o utils.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_sha256$(DOTEXE): test_sha256.o sha256.o utils.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_ecc_dh$(DOTEXE): test_ecc_dh.o ecc.o ecc_dh.o test_ecc_utils.o ecc_platform_specific.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - -test_ecc_dsa$(DOTEXE): test_ecc_dsa.o ecc.o utils.o ecc_dh.o \ - ecc_dsa.o sha256.o test_ecc_utils.o ecc_platform_specific.o - $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ - - --include $(TEST_DEPS) diff --git a/mcuboot/ext/tinycrypt/tests/include/test_ecc_utils.h b/mcuboot/ext/tinycrypt/tests/include/test_ecc_utils.h deleted file mode 100644 index 4e2905496..000000000 --- a/mcuboot/ext/tinycrypt/tests/include/test_ecc_utils.h +++ /dev/null @@ -1,100 +0,0 @@ -/* test_ecc_utils.h - TinyCrypt interface to common functions for ECC tests */ - -/* Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE.*/ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * test_ecc_utils.h -- Interface to common functions for ECC tests. - */ - -#ifndef __TEST_ECC_UTILS_H__ -#define __TEST_ECC_UTILS_H__ - -#include -#include -#include - -int hex2int (char hex); - - -/* - * Convert hex string to byte string - * Return number of bytes written to buf, or 0 on error - */ -int hex2bin(uint8_t *buf, const size_t buflen, const char *hex, - const size_t hexlen); - -/* - * Convert hex string to zero-padded nanoECC scalar - */ -void string2scalar(unsigned int * scalar, unsigned int num_word32, char *str); - - -void print_ecc_scalar(const char *label, const unsigned int * p_vli, - unsigned int num_word32); - -int check_ecc_result(const int num, const char *name, - const unsigned int *expected, - const unsigned int *computed, - const unsigned int num_word32, const bool verbose); - -/* Test ecc_make_keys, and also as keygen part of other tests */ -int keygen_vectors(char **d_vec, char **qx_vec, char **qy_vec, int tests, bool verbose); - -void vli_print_bytes(uint8_t *vli, unsigned int size); - - -int check_code(const int num, const char *name, const int expected, - const int computed, const int verbose); - - -#endif /* __TEST_ECC_UTILS_H__ */ - diff --git a/mcuboot/ext/tinycrypt/tests/include/test_utils.h b/mcuboot/ext/tinycrypt/tests/include/test_utils.h deleted file mode 100644 index 055f91b97..000000000 --- a/mcuboot/ext/tinycrypt/tests/include/test_utils.h +++ /dev/null @@ -1,125 +0,0 @@ -/* test_utils.h - TinyCrypt interface to common functions for tests */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * test_utils.h -- Interface to common functions for tests. - */ - -#ifndef __TEST_UTILS_H__ -#define __TEST_UTILS_H__ - -#include - -#include -#include -#include -#include - -#define PRINT_DATA(fmt, ...) printf(fmt, ##__VA_ARGS__) - -#define PRINT_LINE \ - PRINT_DATA( \ - "============================================================" \ - "=======\n") - - -#define FAIL "FAIL" -#define PASS "PASS" -#define FMT_ERROR "%s - %s@%d. " - -/* TC_ here stands for 'Test Case' not 'TinyCrypt' */ -#define TC_PASS 0 -#define TC_FAIL 1 - -#define TC_ERROR(fmt, ...) \ - do { \ - PRINT_DATA(FMT_ERROR, FAIL, __func__, __LINE__); \ - PRINT_DATA(fmt, ##__VA_ARGS__); \ - } while (0) - -#define TC_PRINT(fmt, ...) PRINT_DATA(fmt, ##__VA_ARGS__) -#define TC_START(name) PRINT_DATA("tc_start() - %s\n", name) -#define TC_END(result, fmt, ...) PRINT_DATA(fmt, ##__VA_ARGS__) - -/* prints result and the function name */ -#define TC_END_RESULT(result) \ - do { \ - PRINT_LINE; \ - TC_END(result, "%s - %s.\n", \ - result == TC_PASS ? PASS : FAIL, __func__); \ - } while (0) - -#define TC_END_REPORT(result) \ - do { \ - PRINT_LINE; \ - TC_END(result, \ - "PROJECT EXECUTION %s\n", \ - result == TC_PASS ? "SUCCESSFUL" : "FAILED"); \ - } while (0) - -static inline void show_str(const char *label, const uint8_t *s, size_t len) -{ - unsigned int i; - - TC_PRINT("%s = ", label); - for (i = 0; i < (unsigned int) len; ++i) { - TC_PRINT("%02x", s[i]); - } - TC_PRINT("\n"); -} - -static inline void fatal(unsigned int testnum, const void *expected, size_t expectedlen, - const void *computed, size_t computedlen) -{ - - TC_ERROR("\tTest #%d Failed!\n", testnum); - show_str("\t\tExpected", expected, expectedlen); - show_str("\t\tComputed ", computed, computedlen); - TC_PRINT("\n"); -} - -static inline unsigned int check_result(unsigned int testnum, const void *expected, size_t expectedlen, - const void *computed, size_t computedlen) -{ - unsigned int result = TC_PASS; - - if (expectedlen != computedlen) { - TC_ERROR("The length of the computed buffer (%zu)", computedlen); - TC_ERROR("does not match the expected length (%zu).", expectedlen); - result = TC_FAIL; - } else if (memcmp(computed, expected, computedlen) != 0) { - fatal(testnum, expected, expectedlen, computed, computedlen); - result = TC_FAIL; - } - - return result; -} - -#endif /* __TEST_UTILS_H__ */ diff --git a/mcuboot/ext/tinycrypt/tests/pseudo-random-data.bin b/mcuboot/ext/tinycrypt/tests/pseudo-random-data.bin deleted file mode 100644 index 4f174c58b..000000000 Binary files a/mcuboot/ext/tinycrypt/tests/pseudo-random-data.bin and /dev/null differ diff --git a/mcuboot/ext/tinycrypt/tests/test_aes.c b/mcuboot/ext/tinycrypt/tests/test_aes.c deleted file mode 100644 index ea3e2da59..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_aes.c +++ /dev/null @@ -1,2078 +0,0 @@ -/* test_aes.c - TinyCrypt AES-128 tests (including NIST tests) */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * DESCRIPTION - * This module tests the following AES routines: - * - * Scenarios tested include: - * - AES128 NIST key schedule test - * - AES128 NIST encryption test - * - AES128 NIST fixed-key and variable-text - * - AES128 NIST variable-key and fixed-text - */ - -#include -#include -#include - -#include -#include -#include - -#include -#include - -#define NUM_OF_NIST_KEYS 16 -#define NUM_OF_FIXED_KEYS 128 - - -struct kat_table { - uint8_t in[NUM_OF_NIST_KEYS]; - uint8_t out[NUM_OF_NIST_KEYS]; -}; - -/* - * NIST test key schedule. - */ -int test_1(void) -{ - int result = TC_PASS; - const uint8_t nist_key[NUM_OF_NIST_KEYS] = { - 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, - 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c - }; - const struct tc_aes_key_sched_struct expected = { - { - 0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x09cf4f3c, - 0xa0fafe17, 0x88542cb1, 0x23a33939, 0x2a6c7605, - 0xf2c295f2, 0x7a96b943, 0x5935807a, 0x7359f67f, - 0x3d80477d, 0x4716fe3e, 0x1e237e44, 0x6d7a883b, - 0xef44a541, 0xa8525b7f, 0xb671253b, 0xdb0bad00, - 0xd4d1c6f8, 0x7c839d87, 0xcaf2b8bc, 0x11f915bc, - 0x6d88a37a, 0x110b3efd, 0xdbf98641, 0xca0093fd, - 0x4e54f70e, 0x5f5fc9f3, 0x84a64fb2, 0x4ea6dc4f, - 0xead27321, 0xb58dbad2, 0x312bf560, 0x7f8d292f, - 0xac7766f3, 0x19fadc21, 0x28d12941, 0x575c006e, - 0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6 - } - }; - struct tc_aes_key_sched_struct s; - - TC_PRINT("AES128 %s (NIST key schedule test):\n", __func__); - - if (tc_aes128_set_encrypt_key(&s, nist_key) == 0) { - TC_ERROR("AES128 test %s (NIST key schedule test) failed.\n", - __func__); - result = TC_FAIL; - goto exitTest1; - } - - result = check_result(1, expected.words, sizeof(expected.words), s.words, - sizeof(s.words)); - -exitTest1: - TC_END_RESULT(result); - return result; -} - -/* - * NIST test vectors for encryption. - */ -int test_2(void) -{ - int result = TC_PASS; - const uint8_t nist_key[NUM_OF_NIST_KEYS] = { - 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, - 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c - }; - const uint8_t nist_input[NUM_OF_NIST_KEYS] = { - 0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, - 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34 - }; - const uint8_t expected[NUM_OF_NIST_KEYS] = { - 0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb, - 0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32 - }; - struct tc_aes_key_sched_struct s; - uint8_t ciphertext[NUM_OF_NIST_KEYS]; - - TC_PRINT("AES128 %s (NIST encryption test):\n", __func__); - - (void)tc_aes128_set_encrypt_key(&s, nist_key); - if (tc_aes_encrypt(ciphertext, nist_input, &s) == 0) { - TC_ERROR("AES128 %s (NIST encryption test) failed.\n", - __func__); - result = TC_FAIL; - goto exitTest2; - } - - result = check_result(2, expected, sizeof(expected), ciphertext, - sizeof(ciphertext)); - -exitTest2: - TC_END_RESULT(result); - - return result; -} - -int var_text_test(unsigned int r, const uint8_t *in, const uint8_t *out, - TCAesKeySched_t s) -{ - uint8_t ciphertext[NUM_OF_NIST_KEYS]; - uint8_t decrypted[NUM_OF_NIST_KEYS]; - int result = TC_PASS; - - (void)tc_aes_encrypt(ciphertext, in, s); - result = check_result(r, out, NUM_OF_NIST_KEYS, ciphertext, - sizeof(ciphertext)); - if (result != TC_FAIL) { - if (tc_aes_decrypt(decrypted, ciphertext, s) == 0) { - TC_ERROR("aes_decrypt failed\n"); - result = TC_FAIL; - } else { - result = check_result(r, in, NUM_OF_NIST_KEYS, - decrypted, sizeof(decrypted)); - } - } - - return result; -} - -/* - * All NIST tests with fixed key and variable text. - */ -int test_3(void) -{ - int result = TC_PASS; - const uint8_t key[NUM_OF_NIST_KEYS] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - const struct kat_table kat_tbl[NUM_OF_FIXED_KEYS] = { - {{ - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x3a, 0xd7, 0x8e, 0x72, 0x6c, 0x1e, 0xc0, 0x2b, - 0x7e, 0xbf, 0xe9, 0x2b, 0x23, 0xd9, 0xec, 0x34 - } }, - {{ - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xaa, 0xe5, 0x93, 0x9c, 0x8e, 0xfd, 0xf2, 0xf0, - 0x4e, 0x60, 0xb9, 0xfe, 0x71, 0x17, 0xb2, 0xc2 - } }, - {{ - 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf0, 0x31, 0xd4, 0xd7, 0x4f, 0x5d, 0xcb, 0xf3, - 0x9d, 0xaa, 0xf8, 0xca, 0x3a, 0xf6, 0xe5, 0x27 - } }, - {{ - 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x96, 0xd9, 0xfd, 0x5c, 0xc4, 0xf0, 0x74, 0x41, - 0x72, 0x7d, 0xf0, 0xf3, 0x3e, 0x40, 0x1a, 0x36 - } }, - {{ - 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x30, 0xcc, 0xdb, 0x04, 0x46, 0x46, 0xd7, 0xe1, - 0xf3, 0xcc, 0xea, 0x3d, 0xca, 0x08, 0xb8, 0xc0 - } }, - {{ - 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x16, 0xae, 0x4c, 0xe5, 0x04, 0x2a, 0x67, 0xee, - 0x8e, 0x17, 0x7b, 0x7c, 0x58, 0x7e, 0xcc, 0x82 - } }, - {{ - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xb6, 0xda, 0x0b, 0xb1, 0x1a, 0x23, 0x85, 0x5d, - 0x9c, 0x5c, 0xb1, 0xb4, 0xc6, 0x41, 0x2e, 0x0a - } }, - {{ - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xdb, 0x4f, 0x1a, 0xa5, 0x30, 0x96, 0x7d, 0x67, - 0x32, 0xce, 0x47, 0x15, 0xeb, 0x0e, 0xe2, 0x4b - } }, - {{ - 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xa8, 0x17, 0x38, 0x25, 0x26, 0x21, 0xdd, 0x18, - 0x0a, 0x34, 0xf3, 0x45, 0x5b, 0x4b, 0xaa, 0x2f - } }, - {{ - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x77, 0xe2, 0xb5, 0x08, 0xdb, 0x7f, 0xd8, 0x92, - 0x34, 0xca, 0xf7, 0x93, 0x9e, 0xe5, 0x62, 0x1a - } }, - {{ - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xb8, 0x49, 0x9c, 0x25, 0x1f, 0x84, 0x42, 0xee, - 0x13, 0xf0, 0x93, 0x3b, 0x68, 0x8f, 0xcd, 0x19 - } }, - {{ - 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x96, 0x51, 0x35, 0xf8, 0xa8, 0x1f, 0x25, 0xc9, - 0xd6, 0x30, 0xb1, 0x75, 0x02, 0xf6, 0x8e, 0x53 - } }, - {{ - 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x8b, 0x87, 0x14, 0x5a, 0x01, 0xad, 0x1c, 0x6c, - 0xed, 0xe9, 0x95, 0xea, 0x36, 0x70, 0x45, 0x4f - } }, - {{ - 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x8e, 0xae, 0x3b, 0x10, 0xa0, 0xc8, 0xca, 0x6d, - 0x1d, 0x3b, 0x0f, 0xa6, 0x1e, 0x56, 0xb0, 0xb2 - } }, - {{ - 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x64, 0xb4, 0xd6, 0x29, 0x81, 0x0f, 0xda, 0x6b, - 0xaf, 0xdf, 0x08, 0xf3, 0xb0, 0xd8, 0xd2, 0xc5 - } }, - {{ - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xd7, 0xe5, 0xdb, 0xd3, 0x32, 0x45, 0x95, 0xf8, - 0xfd, 0xc7, 0xd7, 0xc5, 0x71, 0xda, 0x6c, 0x2a - } }, - {{ - 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf3, 0xf7, 0x23, 0x75, 0x26, 0x4e, 0x16, 0x7f, - 0xca, 0x9d, 0xe2, 0xc1, 0x52, 0x7d, 0x96, 0x06 - } }, - {{ - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x8e, 0xe7, 0x9d, 0xd4, 0xf4, 0x01, 0xff, 0x9b, - 0x7e, 0xa9, 0x45, 0xd8, 0x66, 0x66, 0xc1, 0x3b - } }, - {{ - 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xdd, 0x35, 0xce, 0xa2, 0x79, 0x99, 0x40, 0xb4, - 0x0d, 0xb3, 0xf8, 0x19, 0xcb, 0x94, 0xc0, 0x8b - } }, - {{ - 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x69, 0x41, 0xcb, 0x6b, 0x3e, 0x08, 0xc2, 0xb7, - 0xaf, 0xa5, 0x81, 0xeb, 0xdd, 0x60, 0x7b, 0x87 - } }, - {{ - 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x2c, 0x20, 0xf4, 0x39, 0xf6, 0xbb, 0x09, 0x7b, - 0x29, 0xb8, 0xbd, 0x6d, 0x99, 0xaa, 0xd7, 0x99 - } }, - {{ - 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x62, 0x5d, 0x01, 0xf0, 0x58, 0xe5, 0x65, 0xf7, - 0x7a, 0xe8, 0x63, 0x78, 0xbd, 0x2c, 0x49, 0xb3 - } }, - {{ - 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xc0, 0xb5, 0xfd, 0x98, 0x19, 0x0e, 0xf4, 0x5f, - 0xbb, 0x43, 0x01, 0x43, 0x8d, 0x09, 0x59, 0x50 - } }, - {{ - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x13, 0x00, 0x1f, 0xf5, 0xd9, 0x98, 0x06, 0xef, - 0xd2, 0x5d, 0xa3, 0x4f, 0x56, 0xbe, 0x85, 0x4b - } }, - {{ - 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x3b, 0x59, 0x4c, 0x60, 0xf5, 0xc8, 0x27, 0x7a, - 0x51, 0x13, 0x67, 0x7f, 0x94, 0x20, 0x8d, 0x82 - } }, - {{ - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xe9, 0xc0, 0xfc, 0x18, 0x18, 0xe4, 0xaa, 0x46, - 0xbd, 0x2e, 0x39, 0xd6, 0x38, 0xf8, 0x9e, 0x05 - } }, - {{ - 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf8, 0x02, 0x3e, 0xe9, 0xc3, 0xfd, 0xc4, 0x5a, - 0x01, 0x9b, 0x4e, 0x98, 0x5c, 0x7e, 0x1a, 0x54 - } }, - {{ - 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x35, 0xf4, 0x01, 0x82, 0xab, 0x46, 0x62, 0xf3, - 0x02, 0x3b, 0xae, 0xc1, 0xee, 0x79, 0x6b, 0x57 - } }, - {{ - 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x3a, 0xeb, 0xba, 0xd7, 0x30, 0x36, 0x49, 0xb4, - 0x19, 0x4a, 0x69, 0x45, 0xc6, 0xcc, 0x36, 0x94 - } }, - {{ - 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xa2, 0x12, 0x4b, 0xea, 0x53, 0xec, 0x28, 0x34, - 0x27, 0x9b, 0xed, 0x7f, 0x7e, 0xb0, 0xf9, 0x38 - } }, - {{ - 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xb9, 0xfb, 0x43, 0x99, 0xfa, 0x4f, 0xac, 0xc7, - 0x30, 0x9e, 0x14, 0xec, 0x98, 0x36, 0x0b, 0x0a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xc2, 0x62, 0x77, 0x43, 0x74, 0x20, 0xc5, 0xd6, - 0x34, 0xf7, 0x15, 0xae, 0xa8, 0x1a, 0x91, 0x32 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x17, 0x1a, 0x0e, 0x1b, 0x2d, 0xd4, 0x24, 0xf0, - 0xe0, 0x89, 0xaf, 0x2c, 0x4c, 0x10, 0xf3, 0x2f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x7c, 0xad, 0xbe, 0x40, 0x2d, 0x1b, 0x20, 0x8f, - 0xe7, 0x35, 0xed, 0xce, 0x00, 0xae, 0xe7, 0xce - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x43, 0xb0, 0x2f, 0xf9, 0x29, 0xa1, 0x48, 0x5a, - 0xf6, 0xf5, 0xc6, 0xd6, 0x55, 0x8b, 0xaa, 0x0f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x09, 0x2f, 0xaa, 0xcc, 0x9b, 0xf4, 0x35, 0x08, - 0xbf, 0x8f, 0xa8, 0x61, 0x3c, 0xa7, 0x5d, 0xea - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xcb, 0x2b, 0xf8, 0x28, 0x0f, 0x3f, 0x97, 0x42, - 0xc7, 0xed, 0x51, 0x3f, 0xe8, 0x02, 0x62, 0x9c - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x21, 0x5a, 0x41, 0xee, 0x44, 0x2f, 0xa9, 0x92, - 0xa6, 0xe3, 0x23, 0x98, 0x6d, 0xed, 0x3f, 0x68 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf2, 0x1e, 0x99, 0xcf, 0x4f, 0x0f, 0x77, 0xce, - 0xa8, 0x36, 0xe1, 0x1a, 0x2f, 0xe7, 0x5f, 0xb1 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x95, 0xe3, 0xa0, 0xca, 0x90, 0x79, 0xe6, 0x46, - 0x33, 0x1d, 0xf8, 0xb4, 0xe7, 0x0d, 0x2c, 0xd6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x4a, 0xfe, 0x7f, 0x12, 0x0c, 0xe7, 0x61, 0x3f, - 0x74, 0xfc, 0x12, 0xa0, 0x1a, 0x82, 0x80, 0x73 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x82, 0x7f, 0x00, 0x0e, 0x75, 0xe2, 0xc8, 0xb9, - 0xd4, 0x79, 0xbe, 0xed, 0x91, 0x3f, 0xe6, 0x78 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x35, 0x83, 0x0c, 0x8e, 0x7a, 0xae, 0xfe, 0x2d, - 0x30, 0x31, 0x0e, 0xf3, 0x81, 0xcb, 0xf6, 0x91 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x19, 0x1a, 0xa0, 0xf2, 0xc8, 0x57, 0x01, 0x44, - 0xf3, 0x86, 0x57, 0xea, 0x40, 0x85, 0xeb, 0xe5 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x85, 0x06, 0x2c, 0x2c, 0x90, 0x9f, 0x15, 0xd9, - 0x26, 0x9b, 0x6c, 0x18, 0xce, 0x99, 0xc4, 0xf0 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x67, 0x80, 0x34, 0xdc, 0x9e, 0x41, 0xb5, 0xa5, - 0x60, 0xed, 0x23, 0x9e, 0xea, 0xb1, 0xbc, 0x78 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xc2, 0xf9, 0x3a, 0x4c, 0xe5, 0xab, 0x6d, 0x5d, - 0x56, 0xf1, 0xb9, 0x3c, 0xf1, 0x99, 0x11, 0xc1 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x1c, 0x31, 0x12, 0xbc, 0xb0, 0xc1, 0xdc, 0xc7, - 0x49, 0xd7, 0x99, 0x74, 0x36, 0x91, 0xbf, 0x82 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x00, 0xc5, 0x5b, 0xd7, 0x5c, 0x7f, 0x9c, 0x88, - 0x19, 0x89, 0xd3, 0xec, 0x19, 0x11, 0xc0, 0xd4 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xea, 0x2e, 0x6b, 0x5e, 0xf1, 0x82, 0xb7, 0xdf, - 0xf3, 0x62, 0x9a, 0xbd, 0x6a, 0x12, 0x04, 0x5f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x22, 0x32, 0x23, 0x27, 0xe0, 0x17, 0x80, 0xb1, - 0x73, 0x97, 0xf2, 0x40, 0x87, 0xf8, 0xcc, 0x6f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xc9, 0xca, 0xcb, 0x5c, 0xd1, 0x16, 0x92, 0xc3, - 0x73, 0xb2, 0x41, 0x17, 0x68, 0x14, 0x9e, 0xe7 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xa1, 0x8e, 0x3d, 0xbb, 0xca, 0x57, 0x78, 0x60, - 0xda, 0xb6, 0xb8, 0x0d, 0xa3, 0x13, 0x92, 0x56 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x79, 0xb6, 0x1c, 0x37, 0xbf, 0x32, 0x8e, 0xcc, - 0xa8, 0xd7, 0x43, 0x26, 0x5a, 0x3d, 0x42, 0x5c - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xd2, 0xd9, 0x9c, 0x6b, 0xcc, 0x1f, 0x06, 0xfd, - 0xa8, 0xe2, 0x7e, 0x8a, 0xe3, 0xf1, 0xcc, 0xc7 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x1b, 0xfd, 0x4b, 0x91, 0xc7, 0x01, 0xfd, 0x6b, - 0x61, 0xb7, 0xf9, 0x97, 0x82, 0x9d, 0x66, 0x3b - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x11, 0x00, 0x5d, 0x52, 0xf2, 0x5f, 0x16, 0xbd, - 0xc9, 0x54, 0x5a, 0x87, 0x6a, 0x63, 0x49, 0x0a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x3a, 0x4d, 0x35, 0x4f, 0x02, 0xbb, 0x5a, 0x5e, - 0x47, 0xd3, 0x96, 0x66, 0x86, 0x7f, 0x24, 0x6a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xd4, 0x51, 0xb8, 0xd6, 0xe1, 0xe1, 0xa0, 0xeb, - 0xb1, 0x55, 0xfb, 0xbf, 0x6e, 0x7b, 0x7d, 0xc3 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x68, 0x98, 0xd4, 0xf4, 0x2f, 0xa7, 0xba, 0x6a, - 0x10, 0xac, 0x05, 0xe8, 0x7b, 0x9f, 0x20, 0x80 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xb6, 0x11, 0x29, 0x5e, 0x73, 0x9c, 0xa7, 0xd9, - 0xb5, 0x0f, 0x8e, 0x4c, 0x0e, 0x75, 0x4a, 0x3f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x7d, 0x33, 0xfc, 0x7d, 0x8a, 0xbe, 0x3c, 0xa1, - 0x93, 0x67, 0x59, 0xf8, 0xf5, 0xde, 0xaf, 0x20 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x3b, 0x5e, 0x0f, 0x56, 0x6d, 0xc9, 0x6c, 0x29, - 0x8f, 0x0c, 0x12, 0x63, 0x75, 0x39, 0xb2, 0x5c - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf8, 0x07, 0xc3, 0xe7, 0x98, 0x5f, 0xe0, 0xf5, - 0xa5, 0x0e, 0x2c, 0xdb, 0x25, 0xc5, 0x10, 0x9e - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x41, 0xf9, 0x92, 0xa8, 0x56, 0xfb, 0x27, 0x8b, - 0x38, 0x9a, 0x62, 0xf5, 0xd2, 0x74, 0xd7, 0xe9 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x10, 0xd3, 0xed, 0x7a, 0x6f, 0xe1, 0x5a, 0xb4, - 0xd9, 0x1a, 0xcb, 0xc7, 0xd0, 0x76, 0x7a, 0xb1 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x21, 0xfe, 0xec, 0xd4, 0x5b, 0x2e, 0x67, 0x59, - 0x73, 0xac, 0x33, 0xbf, 0x0c, 0x54, 0x24, 0xfc - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x14, 0x80, 0xcb, 0x39, 0x55, 0xba, 0x62, 0xd0, - 0x9e, 0xea, 0x66, 0x8f, 0x7c, 0x70, 0x88, 0x17 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x66, 0x40, 0x40, 0x33, 0xd6, 0xb7, 0x2b, 0x60, - 0x93, 0x54, 0xd5, 0x49, 0x6e, 0x7e, 0xb5, 0x11 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x1c, 0x31, 0x7a, 0x22, 0x0a, 0x7d, 0x70, 0x0d, - 0xa2, 0xb1, 0xe0, 0x75, 0xb0, 0x02, 0x66, 0xe1 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xab, 0x3b, 0x89, 0x54, 0x22, 0x33, 0xf1, 0x27, - 0x1b, 0xf8, 0xfd, 0x0c, 0x0f, 0x40, 0x35, 0x45 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xd9, 0x3e, 0xae, 0x96, 0x6f, 0xac, 0x46, 0xdc, - 0xa9, 0x27, 0xd6, 0xb1, 0x14, 0xfa, 0x3f, 0x9e - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x1b, 0xde, 0xc5, 0x21, 0x31, 0x65, 0x03, 0xd9, - 0xd5, 0xee, 0x65, 0xdf, 0x3e, 0xa9, 0x4d, 0xdf - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xee, 0xf4, 0x56, 0x43, 0x1d, 0xea, 0x8b, 0x4a, - 0xcf, 0x83, 0xbd, 0xae, 0x37, 0x17, 0xf7, 0x5f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x06, 0xf2, 0x51, 0x9a, 0x2f, 0xaf, 0xaa, 0x59, - 0x6b, 0xfe, 0xf5, 0xcf, 0xa1, 0x5c, 0x21, 0xb9 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x25, 0x1a, 0x7e, 0xac, 0x7e, 0x2f, 0xe8, 0x09, - 0xe4, 0xaa, 0x8d, 0x0d, 0x70, 0x12, 0x53, 0x1a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x3b, 0xff, 0xc1, 0x6e, 0x4c, 0x49, 0xb2, 0x68, - 0xa2, 0x0f, 0x8d, 0x96, 0xa6, 0x0b, 0x40, 0x58 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xe8, 0x86, 0xf9, 0x28, 0x19, 0x99, 0xc5, 0xbb, - 0x3b, 0x3e, 0x88, 0x62, 0xe2, 0xf7, 0xc9, 0x88 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x56, 0x3b, 0xf9, 0x0d, 0x61, 0xbe, 0xef, 0x39, - 0xf4, 0x8d, 0xd6, 0x25, 0xfc, 0xef, 0x13, 0x61 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x4d, 0x37, 0xc8, 0x50, 0x64, 0x45, 0x63, 0xc6, - 0x9f, 0xd0, 0xac, 0xd9, 0xa0, 0x49, 0x32, 0x5b - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xb8, 0x7c, 0x92, 0x1b, 0x91, 0x82, 0x9e, 0xf3, - 0xb1, 0x3c, 0xa5, 0x41, 0xee, 0x11, 0x30, 0xa6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x2e, 0x65, 0xeb, 0x6b, 0x6e, 0xa3, 0x83, 0xe1, - 0x09, 0xac, 0xcc, 0xe8, 0x32, 0x6b, 0x03, 0x93 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x9c, 0xa5, 0x47, 0xf7, 0x43, 0x9e, 0xdc, 0x3e, - 0x25, 0x5c, 0x0f, 0x4d, 0x49, 0xaa, 0x89, 0x90 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xa5, 0xe6, 0x52, 0x61, 0x4c, 0x93, 0x00, 0xf3, - 0x78, 0x16, 0xb1, 0xf9, 0xfd, 0x0c, 0x87, 0xf9 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x14, 0x95, 0x4f, 0x0b, 0x46, 0x97, 0x77, 0x6f, - 0x44, 0x49, 0x4f, 0xe4, 0x58, 0xd8, 0x14, 0xed - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x7c, 0x8d, 0x9a, 0xb6, 0xc2, 0x76, 0x17, 0x23, - 0xfe, 0x42, 0xf8, 0xbb, 0x50, 0x6c, 0xbc, 0xf7 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xdb, 0x7e, 0x19, 0x32, 0x67, 0x9f, 0xdd, 0x99, - 0x74, 0x2a, 0xab, 0x04, 0xaa, 0x0d, 0x5a, 0x80 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x4c, 0x6a, 0x1c, 0x83, 0xe5, 0x68, 0xcd, 0x10, - 0xf2, 0x7c, 0x2d, 0x73, 0xde, 0xd1, 0x9c, 0x28 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00 - }, { - 0x90, 0xec, 0xbe, 0x61, 0x77, 0xe6, 0x74, 0xc9, - 0x8d, 0xe4, 0x12, 0x41, 0x3f, 0x7a, 0xc9, 0x15 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00 - }, { - 0x90, 0x68, 0x4a, 0x2a, 0xc5, 0x5f, 0xe1, 0xec, - 0x2b, 0x8e, 0xbd, 0x56, 0x22, 0x52, 0x0b, 0x73 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00 - }, { - 0x74, 0x72, 0xf9, 0xa7, 0x98, 0x86, 0x07, 0xca, - 0x79, 0x70, 0x77, 0x95, 0x99, 0x10, 0x35, 0xe6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00 - }, { - 0x56, 0xaf, 0xf0, 0x89, 0x87, 0x8b, 0xf3, 0x35, - 0x2f, 0x8d, 0xf1, 0x72, 0xa3, 0xae, 0x47, 0xd8 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00 - }, { - 0x65, 0xc0, 0x52, 0x6c, 0xbe, 0x40, 0x16, 0x1b, - 0x80, 0x19, 0xa2, 0xa3, 0x17, 0x1a, 0xbd, 0x23 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00 - }, { - 0x37, 0x7b, 0xe0, 0xbe, 0x33, 0xb4, 0xe3, 0xe3, - 0x10, 0xb4, 0xaa, 0xbd, 0xa1, 0x73, 0xf8, 0x4f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00 - }, { - 0x94, 0x02, 0xe9, 0xaa, 0x6f, 0x69, 0xde, 0x65, - 0x04, 0xda, 0x8d, 0x20, 0xc4, 0xfc, 0xaa, 0x2f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 - }, { - 0x12, 0x3c, 0x1f, 0x4a, 0xf3, 0x13, 0xad, 0x8c, - 0x2c, 0xe6, 0x48, 0xb2, 0xe7, 0x1f, 0xb6, 0xe1 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00 - }, { - 0x1f, 0xfc, 0x62, 0x6d, 0x30, 0x20, 0x3d, 0xcd, - 0xb0, 0x01, 0x9f, 0xb8, 0x0f, 0x72, 0x6c, 0xf4 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00 - }, { - 0x76, 0xda, 0x1f, 0xbe, 0x3a, 0x50, 0x72, 0x8c, - 0x50, 0xfd, 0x2e, 0x62, 0x1b, 0x5a, 0xd8, 0x85 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00 - }, { - 0x08, 0x2e, 0xb8, 0xbe, 0x35, 0xf4, 0x42, 0xfb, - 0x52, 0x66, 0x8e, 0x16, 0xa5, 0x91, 0xd1, 0xd6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00 - }, { - 0xe6, 0x56, 0xf9, 0xec, 0xf5, 0xfe, 0x27, 0xec, - 0x3e, 0x4a, 0x73, 0xd0, 0x0c, 0x28, 0x2f, 0xb3 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00 - }, { - 0x2c, 0xa8, 0x20, 0x9d, 0x63, 0x27, 0x4c, 0xd9, - 0xa2, 0x9b, 0xb7, 0x4b, 0xcd, 0x77, 0x68, 0x3a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00 - }, { - 0x79, 0xbf, 0x5d, 0xce, 0x14, 0xbb, 0x7d, 0xd7, - 0x3a, 0x8e, 0x36, 0x11, 0xde, 0x7c, 0xe0, 0x26 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00 - }, { - 0x3c, 0x84, 0x99, 0x39, 0xa5, 0xd2, 0x93, 0x99, - 0xf3, 0x44, 0xc4, 0xa0, 0xec, 0xa8, 0xa5, 0x76 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 - }, { - 0xed, 0x3c, 0x0a, 0x94, 0xd5, 0x9b, 0xec, 0xe9, - 0x88, 0x35, 0xda, 0x7a, 0xa4, 0xf0, 0x7c, 0xa2 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00 - }, { - 0x63, 0x91, 0x9e, 0xd4, 0xce, 0x10, 0x19, 0x64, - 0x38, 0xb6, 0xad, 0x09, 0xd9, 0x9c, 0xd7, 0x95 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00 - }, { - 0x76, 0x78, 0xf3, 0xa8, 0x33, 0xf1, 0x9f, 0xea, - 0x95, 0xf3, 0xc6, 0x02, 0x9e, 0x2b, 0xc6, 0x10 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00 - }, { - 0x3a, 0xa4, 0x26, 0x83, 0x10, 0x67, 0xd3, 0x6b, - 0x92, 0xbe, 0x7c, 0x5f, 0x81, 0xc1, 0x3c, 0x56 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00 - }, { - 0x92, 0x72, 0xe2, 0xd2, 0xcd, 0xd1, 0x10, 0x50, - 0x99, 0x8c, 0x84, 0x50, 0x77, 0xa3, 0x0e, 0xa0 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00 - }, { - 0x08, 0x8c, 0x4b, 0x53, 0xf5, 0xec, 0x0f, 0xf8, - 0x14, 0xc1, 0x9a, 0xda, 0xe7, 0xf6, 0x24, 0x6c - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00 - }, { - 0x40, 0x10, 0xa5, 0xe4, 0x01, 0xfd, 0xf0, 0xa0, - 0x35, 0x4d, 0xdb, 0xcc, 0x0d, 0x01, 0x2b, 0x17 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00 - }, { - 0xa8, 0x7a, 0x38, 0x57, 0x36, 0xc0, 0xa6, 0x18, - 0x9b, 0xd6, 0x58, 0x9b, 0xd8, 0x44, 0x5a, 0x93 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 - }, { - 0x54, 0x5f, 0x2b, 0x83, 0xd9, 0x61, 0x6d, 0xcc, - 0xf6, 0x0f, 0xa9, 0x83, 0x0e, 0x9c, 0xd2, 0x87 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00 - }, { - 0x4b, 0x70, 0x6f, 0x7f, 0x92, 0x40, 0x63, 0x52, - 0x39, 0x40, 0x37, 0xa6, 0xd4, 0xf4, 0x68, 0x8d - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00 - }, { - 0xb7, 0x97, 0x2b, 0x39, 0x41, 0xc4, 0x4b, 0x90, - 0xaf, 0xa7, 0xb2, 0x64, 0xbf, 0xba, 0x73, 0x87 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00 - }, { - 0x6f, 0x45, 0x73, 0x2c, 0xf1, 0x08, 0x81, 0x54, - 0x6f, 0x0f, 0xd2, 0x38, 0x96, 0xd2, 0xbb, 0x60 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00 - }, { - 0x2e, 0x35, 0x79, 0xca, 0x15, 0xaf, 0x27, 0xf6, - 0x4b, 0x3c, 0x95, 0x5a, 0x5b, 0xfc, 0x30, 0xba - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00 - }, { - 0x34, 0xa2, 0xc5, 0xa9, 0x1a, 0xe2, 0xae, 0xc9, - 0x9b, 0x7d, 0x1b, 0x5f, 0xa6, 0x78, 0x04, 0x47 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00 - }, { - 0xa4, 0xd6, 0x61, 0x6b, 0xd0, 0x4f, 0x87, 0x33, - 0x5b, 0x0e, 0x53, 0x35, 0x12, 0x27, 0xa9, 0xee - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00 - }, { - 0x7f, 0x69, 0x2b, 0x03, 0x94, 0x58, 0x67, 0xd1, - 0x61, 0x79, 0xa8, 0xce, 0xfc, 0x83, 0xea, 0x3f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 - }, { - 0x3b, 0xd1, 0x41, 0xee, 0x84, 0xa0, 0xe6, 0x41, - 0x4a, 0x26, 0xe7, 0xa4, 0xf2, 0x81, 0xf8, 0xa2 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80 - }, { - 0xd1, 0x78, 0x8f, 0x57, 0x2d, 0x98, 0xb2, 0xb1, - 0x6e, 0xc5, 0xd5, 0xf3, 0x92, 0x2b, 0x99, 0xbc - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0 - }, { - 0x08, 0x33, 0xff, 0x6f, 0x61, 0xd9, 0x8a, 0x57, - 0xb2, 0x88, 0xe8, 0xc3, 0x58, 0x6b, 0x85, 0xa6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0 - }, { - 0x85, 0x68, 0x26, 0x17, 0x97, 0xde, 0x17, 0x6b, - 0xf0, 0xb4, 0x3b, 0xec, 0xc6, 0x28, 0x5a, 0xfb - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0 - }, { - 0xf9, 0xb0, 0xfd, 0xa0, 0xc4, 0xa8, 0x98, 0xf5, - 0xb9, 0xe6, 0xf6, 0x61, 0xc4, 0xce, 0x4d, 0x07 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8 - }, { - 0x8a, 0xde, 0x89, 0x59, 0x13, 0x68, 0x5c, 0x67, - 0xc5, 0x26, 0x9f, 0x8a, 0xae, 0x42, 0x98, 0x3e - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc - }, { - 0x39, 0xbd, 0xe6, 0x7d, 0x5c, 0x8e, 0xd8, 0xa8, - 0xb1, 0xc3, 0x7e, 0xb8, 0xfa, 0x9f, 0x5a, 0xc0 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe - }, { - 0x5c, 0x00, 0x5e, 0x72, 0xc1, 0x41, 0x8c, 0x44, - 0xf5, 0x69, 0xf2, 0xea, 0x33, 0xba, 0x54, 0xf3 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff - }, { - 0x3f, 0x5b, 0x8c, 0xc9, 0xea, 0x85, 0x5a, 0x0a, - 0xfa, 0x73, 0x47, 0xd2, 0x3e, 0x8d, 0x66, 0x4e - } } - }; - struct tc_aes_key_sched_struct s; - unsigned int i; - - TC_PRINT("AES128 %s (NIST fixed-key and variable-text):\n", __func__); - - (void)tc_aes128_set_encrypt_key(&s, key); - - for (i = 0; i < 128; ++i) { - result = var_text_test(i, kat_tbl[i].in, kat_tbl[i].out, &s); - if (result == TC_FAIL) { - break; - } - } - - TC_END_RESULT(result); - - return result; -} - -int var_key_test(unsigned int r, const uint8_t *in, const uint8_t *out) -{ - int result = TC_PASS; - - const uint8_t plaintext[NUM_OF_NIST_KEYS] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - uint8_t ciphertext[NUM_OF_NIST_KEYS]; - struct tc_aes_key_sched_struct s; - - (void)tc_aes128_set_encrypt_key(&s, in); - - (void)tc_aes_encrypt(ciphertext, plaintext, &s); - result = check_result(r, out, NUM_OF_NIST_KEYS, ciphertext, - sizeof(ciphertext)); - - return result; -} - -/* - * All NIST tests with variable key and fixed text. - */ -int test_4(void) -{ - int result = TC_PASS; - const struct kat_table kat_tbl[NUM_OF_FIXED_KEYS] = { - {{ - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x0e, 0xdd, 0x33, 0xd3, 0xc6, 0x21, 0xe5, 0x46, - 0x45, 0x5b, 0xd8, 0xba, 0x14, 0x18, 0xbe, 0xc8 - } }, - {{ - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x4b, 0xc3, 0xf8, 0x83, 0x45, 0x0c, 0x11, 0x3c, - 0x64, 0xca, 0x42, 0xe1, 0x11, 0x2a, 0x9e, 0x87 - } }, - {{ - 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x72, 0xa1, 0xda, 0x77, 0x0f, 0x5d, 0x7a, 0xc4, - 0xc9, 0xef, 0x94, 0xd8, 0x22, 0xaf, 0xfd, 0x97 - } }, - {{ - 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x97, 0x00, 0x14, 0xd6, 0x34, 0xe2, 0xb7, 0x65, - 0x07, 0x77, 0xe8, 0xe8, 0x4d, 0x03, 0xcc, 0xd8 - } }, - {{ - 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf1, 0x7e, 0x79, 0xae, 0xd0, 0xdb, 0x7e, 0x27, - 0x9e, 0x95, 0x5b, 0x5f, 0x49, 0x38, 0x75, 0xa7 - } }, - {{ - 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x9e, 0xd5, 0xa7, 0x51, 0x36, 0xa9, 0x40, 0xd0, - 0x96, 0x3d, 0xa3, 0x79, 0xdb, 0x4a, 0xf2, 0x6a - } }, - {{ - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xc4, 0x29, 0x5f, 0x83, 0x46, 0x5c, 0x77, 0x55, - 0xe8, 0xfa, 0x36, 0x4b, 0xac, 0x6a, 0x7e, 0xa5 - } }, - {{ - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xb1, 0xd7, 0x58, 0x25, 0x6b, 0x28, 0xfd, 0x85, - 0x0a, 0xd4, 0x94, 0x42, 0x08, 0xcf, 0x11, 0x55 - } }, - {{ - 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x42, 0xff, 0xb3, 0x4c, 0x74, 0x3d, 0xe4, 0xd8, - 0x8c, 0xa3, 0x80, 0x11, 0xc9, 0x90, 0x89, 0x0b - } }, - {{ - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x99, 0x58, 0xf0, 0xec, 0xea, 0x8b, 0x21, 0x72, - 0xc0, 0xc1, 0x99, 0x5f, 0x91, 0x82, 0xc0, 0xf3 - } }, - {{ - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x95, 0x6d, 0x77, 0x98, 0xfa, 0xc2, 0x0f, 0x82, - 0xa8, 0x82, 0x3f, 0x98, 0x4d, 0x06, 0xf7, 0xf5 - } }, - {{ - 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xa0, 0x1b, 0xf4, 0x4f, 0x2d, 0x16, 0xbe, 0x92, - 0x8c, 0xa4, 0x4a, 0xaf, 0x7b, 0x9b, 0x10, 0x6b - } }, - {{ - 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xb5, 0xf1, 0xa3, 0x3e, 0x50, 0xd4, 0x0d, 0x10, - 0x37, 0x64, 0xc7, 0x6b, 0xd4, 0xc6, 0xb6, 0xf8 - } }, - {{ - 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x26, 0x37, 0x05, 0x0c, 0x9f, 0xc0, 0xd4, 0x81, - 0x7e, 0x2d, 0x69, 0xde, 0x87, 0x8a, 0xee, 0x8d - } }, - {{ - 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x11, 0x3e, 0xcb, 0xe4, 0xa4, 0x53, 0x26, 0x9a, - 0x0d, 0xd2, 0x60, 0x69, 0x46, 0x7f, 0xb5, 0xb5 - } }, - {{ - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x97, 0xd0, 0x75, 0x4f, 0xe6, 0x8f, 0x11, 0xb9, - 0xe3, 0x75, 0xd0, 0x70, 0xa6, 0x08, 0xc8, 0x84 - } }, - {{ - 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xc6, 0xa0, 0xb3, 0xe9, 0x98, 0xd0, 0x50, 0x68, - 0xa5, 0x39, 0x97, 0x78, 0x40, 0x52, 0x00, 0xb4 - } }, - {{ - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xdf, 0x55, 0x6a, 0x33, 0x43, 0x8d, 0xb8, 0x7b, - 0xc4, 0x1b, 0x17, 0x52, 0xc5, 0x5e, 0x5e, 0x49 - } }, - {{ - 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x90, 0xfb, 0x12, 0x8d, 0x3a, 0x1a, 0xf6, 0xe5, - 0x48, 0x52, 0x1b, 0xb9, 0x62, 0xbf, 0x1f, 0x05 - } }, - {{ - 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x26, 0x29, 0x8e, 0x9c, 0x1d, 0xb5, 0x17, 0xc2, - 0x15, 0xfa, 0xdf, 0xb7, 0xd2, 0xa8, 0xd6, 0x91 - } }, - {{ - 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xa6, 0xcb, 0x76, 0x1d, 0x61, 0xf8, 0x29, 0x2d, - 0x0d, 0xf3, 0x93, 0xa2, 0x79, 0xad, 0x03, 0x80 - } }, - {{ - 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x12, 0xac, 0xd8, 0x9b, 0x13, 0xcd, 0x5f, 0x87, - 0x26, 0xe3, 0x4d, 0x44, 0xfd, 0x48, 0x61, 0x08 - } }, - {{ - 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x95, 0xb1, 0x70, 0x3f, 0xc5, 0x7b, 0xa0, 0x9f, - 0xe0, 0xc3, 0x58, 0x0f, 0xeb, 0xdd, 0x7e, 0xd4 - } }, - {{ - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xde, 0x11, 0x72, 0x2d, 0x89, 0x3e, 0x9f, 0x91, - 0x21, 0xc3, 0x81, 0xbe, 0xcc, 0x1d, 0xa5, 0x9a - } }, - {{ - 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x6d, 0x11, 0x4c, 0xcb, 0x27, 0xbf, 0x39, 0x10, - 0x12, 0xe8, 0x97, 0x4c, 0x54, 0x6d, 0x9b, 0xf2 - } }, - {{ - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x5c, 0xe3, 0x7e, 0x17, 0xeb, 0x46, 0x46, 0xec, - 0xfa, 0xc2, 0x9b, 0x9c, 0xc3, 0x8d, 0x93, 0x40 - } }, - {{ - 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x18, 0xc1, 0xb6, 0xe2, 0x15, 0x71, 0x22, 0x05, - 0x6d, 0x02, 0x43, 0xd8, 0xa1, 0x65, 0xcd, 0xdb - } }, - {{ - 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x99, 0x69, 0x3e, 0x6a, 0x59, 0xd1, 0x36, 0x6c, - 0x74, 0xd8, 0x23, 0x56, 0x2d, 0x7e, 0x14, 0x31 - } }, - {{ - 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x6c, 0x7c, 0x64, 0xdc, 0x84, 0xa8, 0xbb, 0xa7, - 0x58, 0xed, 0x17, 0xeb, 0x02, 0x5a, 0x57, 0xe3 - } }, - {{ - 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xe1, 0x7b, 0xc7, 0x9f, 0x30, 0xea, 0xab, 0x2f, - 0xac, 0x2c, 0xbb, 0xe3, 0x45, 0x8d, 0x68, 0x7a - } }, - {{ - 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x11, 0x14, 0xbc, 0x20, 0x28, 0x00, 0x9b, 0x92, - 0x3f, 0x0b, 0x01, 0x91, 0x5c, 0xe5, 0xe7, 0xc4 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x9c, 0x28, 0x52, 0x4a, 0x16, 0xa1, 0xe1, 0xc1, - 0x45, 0x29, 0x71, 0xca, 0xa8, 0xd1, 0x34, 0x76 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xed, 0x62, 0xe1, 0x63, 0x63, 0x63, 0x83, 0x60, - 0xfd, 0xd6, 0xad, 0x62, 0x11, 0x27, 0x94, 0xf0 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x5a, 0x86, 0x88, 0xf0, 0xb2, 0xa2, 0xc1, 0x62, - 0x24, 0xc1, 0x61, 0x65, 0x8f, 0xfd, 0x40, 0x44 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x23, 0xf7, 0x10, 0x84, 0x2b, 0x9b, 0xb9, 0xc3, - 0x2f, 0x26, 0x64, 0x8c, 0x78, 0x68, 0x07, 0xca - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x44, 0xa9, 0x8b, 0xf1, 0x1e, 0x16, 0x3f, 0x63, - 0x2c, 0x47, 0xec, 0x6a, 0x49, 0x68, 0x3a, 0x89 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x0f, 0x18, 0xaf, 0xf9, 0x42, 0x74, 0x69, 0x6d, - 0x9b, 0x61, 0x84, 0x8b, 0xd5, 0x0a, 0xc5, 0xe5 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x82, 0x40, 0x85, 0x71, 0xc3, 0xe2, 0x42, 0x45, - 0x40, 0x20, 0x7f, 0x83, 0x3b, 0x6d, 0xda, 0x69 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x30, 0x3f, 0xf9, 0x96, 0x94, 0x7f, 0x0c, 0x7d, - 0x1f, 0x43, 0xc8, 0xf3, 0x02, 0x7b, 0x9b, 0x75 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x7d, 0xf4, 0xda, 0xf4, 0xad, 0x29, 0xa3, 0x61, - 0x5a, 0x9b, 0x6e, 0xce, 0x5c, 0x99, 0x51, 0x8a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xc7, 0x29, 0x54, 0xa4, 0x8d, 0x07, 0x74, 0xdb, - 0x0b, 0x49, 0x71, 0xc5, 0x26, 0x26, 0x04, 0x15 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x1d, 0xf9, 0xb7, 0x61, 0x12, 0xdc, 0x65, 0x31, - 0xe0, 0x7d, 0x2c, 0xfd, 0xa0, 0x44, 0x11, 0xf0 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x8e, 0x4d, 0x8e, 0x69, 0x91, 0x19, 0xe1, 0xfc, - 0x87, 0x54, 0x5a, 0x64, 0x7f, 0xb1, 0xd3, 0x4f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xe6, 0xc4, 0x80, 0x7a, 0xe1, 0x1f, 0x36, 0xf0, - 0x91, 0xc5, 0x7d, 0x9f, 0xb6, 0x85, 0x48, 0xd1 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x8e, 0xbf, 0x73, 0xaa, 0xd4, 0x9c, 0x82, 0x00, - 0x7f, 0x77, 0xa5, 0xc1, 0xcc, 0xec, 0x6a, 0xb4 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x4f, 0xb2, 0x88, 0xcc, 0x20, 0x40, 0x04, 0x90, - 0x01, 0xd2, 0xc7, 0x58, 0x5a, 0xd1, 0x23, 0xfc - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x04, 0x49, 0x71, 0x10, 0xef, 0xb9, 0xdc, 0xeb, - 0x13, 0xe2, 0xb1, 0x3f, 0xb4, 0x46, 0x55, 0x64 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x75, 0x55, 0x0e, 0x6c, 0xb5, 0xa8, 0x8e, 0x49, - 0x63, 0x4c, 0x9a, 0xb6, 0x9e, 0xda, 0x04, 0x30 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xb6, 0x76, 0x84, 0x73, 0xce, 0x98, 0x43, 0xea, - 0x66, 0xa8, 0x14, 0x05, 0xdd, 0x50, 0xb3, 0x45 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xcb, 0x2f, 0x43, 0x03, 0x83, 0xf9, 0x08, 0x4e, - 0x03, 0xa6, 0x53, 0x57, 0x1e, 0x06, 0x5d, 0xe6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xff, 0x4e, 0x66, 0xc0, 0x7b, 0xae, 0x3e, 0x79, - 0xfb, 0x7d, 0x21, 0x08, 0x47, 0xa3, 0xb0, 0xba - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x7b, 0x90, 0x78, 0x51, 0x25, 0x50, 0x5f, 0xad, - 0x59, 0xb1, 0x3c, 0x18, 0x6d, 0xd6, 0x6c, 0xe3 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x8b, 0x52, 0x7a, 0x6a, 0xeb, 0xda, 0xec, 0x9e, - 0xae, 0xf8, 0xed, 0xa2, 0xcb, 0x77, 0x83, 0xe5 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x43, 0xfd, 0xaf, 0x53, 0xeb, 0xbc, 0x98, 0x80, - 0xc2, 0x28, 0x61, 0x7d, 0x6a, 0x9b, 0x54, 0x8b - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x53, 0x78, 0x61, 0x04, 0xb9, 0x74, 0x4b, 0x98, - 0xf0, 0x52, 0xc4, 0x6f, 0x1c, 0x85, 0x0d, 0x0b - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xb5, 0xab, 0x30, 0x13, 0xdd, 0x1e, 0x61, 0xdf, - 0x06, 0xcb, 0xaf, 0x34, 0xca, 0x2a, 0xee, 0x78 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x74, 0x70, 0x46, 0x9b, 0xe9, 0x72, 0x30, 0x30, - 0xfd, 0xcc, 0x73, 0xa8, 0xcd, 0x4f, 0xbb, 0x10 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xa3, 0x5a, 0x63, 0xf5, 0x34, 0x3e, 0xbe, 0x9e, - 0xf8, 0x16, 0x7b, 0xcb, 0x48, 0xad, 0x12, 0x2e - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xfd, 0x86, 0x87, 0xf0, 0x75, 0x7a, 0x21, 0x0e, - 0x9f, 0xdf, 0x18, 0x12, 0x04, 0xc3, 0x08, 0x63 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x7a, 0x18, 0x1e, 0x84, 0xbd, 0x54, 0x57, 0xd2, - 0x6a, 0x88, 0xfb, 0xae, 0x96, 0x01, 0x8f, 0xb0 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x65, 0x33, 0x17, 0xb9, 0x36, 0x2b, 0x6f, 0x9b, - 0x9e, 0x1a, 0x58, 0x0e, 0x68, 0xd4, 0x94, 0xb5 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x99, 0x5c, 0x9d, 0xc0, 0xb6, 0x89, 0xf0, 0x3c, - 0x45, 0x86, 0x7b, 0x5f, 0xaa, 0x5c, 0x18, 0xd1 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x77, 0xa4, 0xd9, 0x6d, 0x56, 0xdd, 0xa3, 0x98, - 0xb9, 0xaa, 0xbe, 0xcf, 0xc7, 0x57, 0x29, 0xfd - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x84, 0xbe, 0x19, 0xe0, 0x53, 0x63, 0x5f, 0x09, - 0xf2, 0x66, 0x5e, 0x7b, 0xae, 0x85, 0xb4, 0x2d - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x32, 0xcd, 0x65, 0x28, 0x42, 0x92, 0x6a, 0xea, - 0x4a, 0xa6, 0x13, 0x7b, 0xb2, 0xbe, 0x2b, 0x5e - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x49, 0x3d, 0x4a, 0x4f, 0x38, 0xeb, 0xb3, 0x37, - 0xd1, 0x0a, 0xa8, 0x4e, 0x91, 0x71, 0xa5, 0x54 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xd9, 0xbf, 0xf7, 0xff, 0x45, 0x4b, 0x0e, 0xc5, - 0xa4, 0xa2, 0xa6, 0x95, 0x66, 0xe2, 0xcb, 0x84 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x35, 0x35, 0xd5, 0x65, 0xac, 0xe3, 0xf3, 0x1e, - 0xb2, 0x49, 0xba, 0x2c, 0xc6, 0x76, 0x5d, 0x7a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf6, 0x0e, 0x91, 0xfc, 0x32, 0x69, 0xee, 0xcf, - 0x32, 0x31, 0xc6, 0xe9, 0x94, 0x56, 0x97, 0xc6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xab, 0x69, 0xcf, 0xad, 0xf5, 0x1f, 0x8e, 0x60, - 0x4d, 0x9c, 0xc3, 0x71, 0x82, 0xf6, 0x63, 0x5a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x78, 0x66, 0x37, 0x3f, 0x24, 0xa0, 0xb6, 0xed, - 0x56, 0xe0, 0xd9, 0x6f, 0xcd, 0xaf, 0xb8, 0x77 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x1e, 0xa4, 0x48, 0xc2, 0xaa, 0xc9, 0x54, 0xf5, - 0xd8, 0x12, 0xe9, 0xd7, 0x84, 0x94, 0x44, 0x6a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xac, 0xc5, 0x59, 0x9d, 0xd8, 0xac, 0x02, 0x23, - 0x9a, 0x0f, 0xef, 0x4a, 0x36, 0xdd, 0x16, 0x68 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xd8, 0x76, 0x44, 0x68, 0xbb, 0x10, 0x38, 0x28, - 0xcf, 0x7e, 0x14, 0x73, 0xce, 0x89, 0x50, 0x73 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x1b, 0x0d, 0x02, 0x89, 0x36, 0x83, 0xb9, 0xf1, - 0x80, 0x45, 0x8e, 0x4a, 0xa6, 0xb7, 0x39, 0x82 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x96, 0xd9, 0xb0, 0x17, 0xd3, 0x02, 0xdf, 0x41, - 0x0a, 0x93, 0x7d, 0xcd, 0xb8, 0xbb, 0x6e, 0x43 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xef, 0x16, 0x23, 0xcc, 0x44, 0x31, 0x3c, 0xff, - 0x44, 0x0b, 0x15, 0x94, 0xa7, 0xe2, 0x1c, 0xc6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x28, 0x4c, 0xa2, 0xfa, 0x35, 0x80, 0x7b, 0x8b, - 0x0a, 0xe4, 0xd1, 0x9e, 0x11, 0xd7, 0xdb, 0xd7 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf2, 0xe9, 0x76, 0x87, 0x57, 0x55, 0xf9, 0x40, - 0x1d, 0x54, 0xf3, 0x6e, 0x2a, 0x23, 0xa5, 0x94 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xec, 0x19, 0x8a, 0x18, 0xe1, 0x0e, 0x53, 0x24, - 0x03, 0xb7, 0xe2, 0x08, 0x87, 0xc8, 0xdd, 0x80 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x54, 0x5d, 0x50, 0xeb, 0xd9, 0x19, 0xe4, 0xa6, - 0x94, 0x9d, 0x96, 0xad, 0x47, 0xe4, 0x6a, 0x80 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xdb, 0xdf, 0xb5, 0x27, 0x06, 0x0e, 0x0a, 0x71, - 0x00, 0x9c, 0x7b, 0xb0, 0xc6, 0x8f, 0x1d, 0x44 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x9c, 0xfa, 0x13, 0x22, 0xea, 0x33, 0xda, 0x21, - 0x73, 0xa0, 0x24, 0xf2, 0xff, 0x0d, 0x89, 0x6d - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x87, 0x85, 0xb1, 0xa7, 0x5b, 0x0f, 0x3b, 0xd9, - 0x58, 0xdc, 0xd0, 0xe2, 0x93, 0x18, 0xc5, 0x21 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x38, 0xf6, 0x7b, 0x9e, 0x98, 0xe4, 0xa9, 0x7b, - 0x6d, 0xf0, 0x30, 0xa9, 0xfc, 0xdd, 0x01, 0x04 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x19, 0x2a, 0xff, 0xfb, 0x2c, 0x88, 0x0e, 0x82, - 0xb0, 0x59, 0x26, 0xd0, 0xfc, 0x6c, 0x44, 0x8b - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0x6a, 0x79, 0x80, 0xce, 0x7b, 0x10, 0x5c, 0xf5, - 0x30, 0x95, 0x2d, 0x74, 0xda, 0xaf, 0x79, 0x8c - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 - }, { - 0xea, 0x36, 0x95, 0xe1, 0x35, 0x1b, 0x9d, 0x68, - 0x58, 0xbd, 0x95, 0x8c, 0xf5, 0x13, 0xef, 0x6c - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00 - }, { - 0x6d, 0xa0, 0x49, 0x0b, 0xa0, 0xba, 0x03, 0x43, - 0xb9, 0x35, 0x68, 0x1d, 0x2c, 0xce, 0x5b, 0xa1 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf0, 0xea, 0x23, 0xaf, 0x08, 0x53, 0x40, 0x11, - 0xc6, 0x00, 0x09, 0xab, 0x29, 0xad, 0xa2, 0xf1 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00 - }, { - 0xff, 0x13, 0x80, 0x6c, 0xf1, 0x9c, 0xc3, 0x87, - 0x21, 0x55, 0x4d, 0x7c, 0x0f, 0xcd, 0xcd, 0x4b - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00 - }, { - 0x68, 0x38, 0xaf, 0x1f, 0x4f, 0x69, 0xba, 0xe9, - 0xd8, 0x5d, 0xd1, 0x88, 0xdc, 0xdf, 0x06, 0x88 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00 - }, { - 0x36, 0xcf, 0x44, 0xc9, 0x2d, 0x55, 0x0b, 0xfb, - 0x1e, 0xd2, 0x8e, 0xf5, 0x83, 0xdd, 0xf5, 0xd7 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00 - }, { - 0xd0, 0x6e, 0x31, 0x95, 0xb5, 0x37, 0x6f, 0x10, - 0x9d, 0x5c, 0x4e, 0xc6, 0xc5, 0xd6, 0x2c, 0xed - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00 - }, { - 0xc4, 0x40, 0xde, 0x01, 0x4d, 0x3d, 0x61, 0x07, - 0x07, 0x27, 0x9b, 0x13, 0x24, 0x2a, 0x5c, 0x36 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 - }, { - 0xf0, 0xc5, 0xc6, 0xff, 0xa5, 0xe0, 0xbd, 0x3a, - 0x94, 0xc8, 0x8f, 0x6b, 0x6f, 0x7c, 0x16, 0xb9 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00 - }, { - 0x3e, 0x40, 0xc3, 0x90, 0x1c, 0xd7, 0xef, 0xfc, - 0x22, 0xbf, 0xfc, 0x35, 0xde, 0xe0, 0xb4, 0xd9 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00 - }, { - 0xb6, 0x33, 0x05, 0xc7, 0x2b, 0xed, 0xfa, 0xb9, - 0x73, 0x82, 0xc4, 0x06, 0xd0, 0xc4, 0x9b, 0xc6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00 - }, { - 0x36, 0xbb, 0xaa, 0xb2, 0x2a, 0x6b, 0xd4, 0x92, - 0x5a, 0x99, 0xa2, 0xb4, 0x08, 0xd2, 0xdb, 0xae - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00 - }, { - 0x30, 0x7c, 0x5b, 0x8f, 0xcd, 0x05, 0x33, 0xab, - 0x98, 0xbc, 0x51, 0xe2, 0x7a, 0x6c, 0xe4, 0x61 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00 - }, { - 0x82, 0x9c, 0x04, 0xff, 0x4c, 0x07, 0x51, 0x3c, - 0x0b, 0x3e, 0xf0, 0x5c, 0x03, 0xe3, 0x37, 0xb5 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00 - }, { - 0xf1, 0x7a, 0xf0, 0xe8, 0x95, 0xdd, 0xa5, 0xeb, - 0x98, 0xef, 0xc6, 0x80, 0x66, 0xe8, 0x4c, 0x54 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00 - }, { - 0x27, 0x71, 0x67, 0xf3, 0x81, 0x2a, 0xff, 0xf1, - 0xff, 0xac, 0xb4, 0xa9, 0x34, 0x37, 0x9f, 0xc3 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 - }, { - 0x2c, 0xb1, 0xdc, 0x3a, 0x9c, 0x72, 0x97, 0x2e, - 0x42, 0x5a, 0xe2, 0xef, 0x3e, 0xb5, 0x97, 0xcd - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00 - }, { - 0x36, 0xae, 0xaa, 0x3a, 0x21, 0x3e, 0x96, 0x8d, - 0x4b, 0x5b, 0x67, 0x9d, 0x3a, 0x2c, 0x97, 0xfe - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00 - }, { - 0x92, 0x41, 0xda, 0xca, 0x4f, 0xdd, 0x03, 0x4a, - 0x82, 0x37, 0x2d, 0xb5, 0x0e, 0x1a, 0x0f, 0x3f - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00 - }, { - 0xc1, 0x45, 0x74, 0xd9, 0xcd, 0x00, 0xcf, 0x2b, - 0x5a, 0x7f, 0x77, 0xe5, 0x3c, 0xd5, 0x78, 0x85 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00 - }, { - 0x79, 0x3d, 0xe3, 0x92, 0x36, 0x57, 0x0a, 0xba, - 0x83, 0xab, 0x9b, 0x73, 0x7c, 0xb5, 0x21, 0xc9 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00 - }, { - 0x16, 0x59, 0x1c, 0x0f, 0x27, 0xd6, 0x0e, 0x29, - 0xb8, 0x5a, 0x96, 0xc3, 0x38, 0x61, 0xa7, 0xef - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00 - }, { - 0x44, 0xfb, 0x5c, 0x4d, 0x4f, 0x5c, 0xb7, 0x9b, - 0xe5, 0xc1, 0x74, 0xa3, 0xb1, 0xc9, 0x73, 0x48 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00 - }, { - 0x67, 0x4d, 0x2b, 0x61, 0x63, 0x3d, 0x16, 0x2b, - 0xe5, 0x9d, 0xde, 0x04, 0x22, 0x2f, 0x47, 0x40 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 - }, { - 0xb4, 0x75, 0x0f, 0xf2, 0x63, 0xa6, 0x5e, 0x1f, - 0x9e, 0x92, 0x4c, 0xcf, 0xd9, 0x8f, 0x3e, 0x37 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00 - }, { - 0x62, 0xd0, 0x66, 0x2d, 0x6e, 0xae, 0xdd, 0xed, - 0xeb, 0xae, 0x7f, 0x7e, 0xa3, 0xa4, 0xf6, 0xb6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00 - }, { - 0x70, 0xc4, 0x6b, 0xb3, 0x06, 0x92, 0xbe, 0x65, - 0x7f, 0x7e, 0xaa, 0x93, 0xeb, 0xad, 0x98, 0x97 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00 - }, { - 0x32, 0x39, 0x94, 0xcf, 0xb9, 0xda, 0x28, 0x5a, - 0x5d, 0x96, 0x42, 0xe1, 0x75, 0x9b, 0x22, 0x4a - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00 - }, { - 0x1d, 0xbf, 0x57, 0x87, 0x7b, 0x7b, 0x17, 0x38, - 0x5c, 0x85, 0xd0, 0xb5, 0x48, 0x51, 0xe3, 0x71 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00 - }, { - 0xdf, 0xa5, 0xc0, 0x97, 0xcd, 0xc1, 0x53, 0x2a, - 0xc0, 0x71, 0xd5, 0x7b, 0x1d, 0x28, 0xd1, 0xbd - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00 - }, { - 0x3a, 0x0c, 0x53, 0xfa, 0x37, 0x31, 0x1f, 0xc1, - 0x0b, 0xd2, 0xa9, 0x98, 0x1f, 0x51, 0x31, 0x74 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00 - }, { - 0xba, 0x4f, 0x97, 0x0c, 0x0a, 0x25, 0xc4, 0x18, - 0x14, 0xbd, 0xae, 0x2e, 0x50, 0x6b, 0xe3, 0xb4 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 - }, { - 0x2d, 0xce, 0x3a, 0xcb, 0x72, 0x7c, 0xd1, 0x3c, - 0xcd, 0x76, 0xd4, 0x25, 0xea, 0x56, 0xe4, 0xf6 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80 - }, { - 0x51, 0x60, 0x47, 0x4d, 0x50, 0x4b, 0x9b, 0x3e, - 0xef, 0xb6, 0x8d, 0x35, 0xf2, 0x45, 0xf4, 0xb3 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0 - }, { - 0x41, 0xa8, 0xa9, 0x47, 0x76, 0x66, 0x35, 0xde, - 0xc3, 0x75, 0x53, 0xd9, 0xa6, 0xc0, 0xcb, 0xb7 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0 - }, { - 0x25, 0xd6, 0xcf, 0xe6, 0x88, 0x1f, 0x2b, 0xf4, - 0x97, 0xdd, 0x14, 0xcd, 0x4d, 0xdf, 0x44, 0x5b - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0 - }, { - 0x41, 0xc7, 0x8c, 0x13, 0x5e, 0xd9, 0xe9, 0x8c, - 0x09, 0x66, 0x40, 0x64, 0x72, 0x65, 0xda, 0x1e - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8 - }, { - 0x5a, 0x4d, 0x40, 0x4d, 0x89, 0x17, 0xe3, 0x53, - 0xe9, 0x2a, 0x21, 0x07, 0x2c, 0x3b, 0x23, 0x05 - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc - }, { - 0x02, 0xbc, 0x96, 0x84, 0x6b, 0x3f, 0xdc, 0x71, - 0x64, 0x3f, 0x38, 0x4c, 0xd3, 0xcc, 0x3e, 0xaf - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe - }, { - 0x9b, 0xa4, 0xa9, 0x14, 0x3f, 0x4e, 0x5d, 0x40, - 0x48, 0x52, 0x1c, 0x4f, 0x88, 0x77, 0xd8, 0x8e - } }, - {{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff - }, { - 0xa1, 0xf6, 0x25, 0x8c, 0x87, 0x7d, 0x5f, 0xcd, - 0x89, 0x64, 0x48, 0x45, 0x38, 0xbf, 0xc9, 0x2c - } } - }; - unsigned int i; - - TC_PRINT("AES128 test #4 (NIST variable-key and fixed-text):\n"); - - for (i = 0; i < NUM_OF_FIXED_KEYS; ++i) { - result = var_key_test(i, kat_tbl[i].in, kat_tbl[i].out); - if (result == TC_FAIL) { - break; - } - - } - - TC_END_RESULT(result); - - return result; -} - -/* - * Main task to test AES - */ -int main(void) -{ - int result = TC_PASS; - - TC_START("Performing AES128 tests:"); - - result = test_1(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("AES128 test #1 (NIST key schedule test) failed.\n"); - goto exitTest; - } - result = test_2(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("AES128 test #2 (NIST encryption test) failed.\n"); - goto exitTest; - } - result = test_3(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("AES128 test #3 (NIST fixed-key and variable-text) " - "failed.\n"); - goto exitTest; - } - result = test_4(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("AES128 test #4 (NIST variable-key and fixed-text) " - "failed.\n"); - goto exitTest; - } - - TC_PRINT("All AES128 tests succeeded!\n"); - - exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); - - return result; -} diff --git a/mcuboot/ext/tinycrypt/tests/test_cbc_mode.c b/mcuboot/ext/tinycrypt/tests/test_cbc_mode.c deleted file mode 100644 index ffa0a889b..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_cbc_mode.c +++ /dev/null @@ -1,177 +0,0 @@ -/* test_cbc_mode.c - TinyCrypt implementation of some AES-CBC tests */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -/* - * DESCRIPTION - * This module tests the following AES-CBC Mode routines: - * - * Scenarios tested include: - * - AES128 CBC mode encryption SP 800-38a tests - */ - -#include -#include -#include - -#include -#include -#include - -/* - * NIST test vectors from SP 800-38a: - * - * Block #1 - * Plaintext 6bc1bee22e409f96e93d7e117393172a - * Input Block 6bc0bce12a459991e134741a7f9e1925 - * Output Block 7649abac8119b246cee98e9b12e9197d - * Ciphertext 7649abac8119b246cee98e9b12e9197d - * Block #2 - * Plaintext ae2d8a571e03ac9c9eb76fac45af8e51 - * Input Block d86421fb9f1a1eda505ee1375746972c - * Output Block 5086cb9b507219ee95db113a917678b2 - * Ciphertext 5086cb9b507219ee95db113a917678b2 - * Block #3 - * Plaintext 30c81c46a35ce411e5fbc1191a0a52ef - * Input Block 604ed7ddf32efdff7020d0238b7c2a5d - * Output Block 73bed6b8e3c1743b7116e69e22229516 - * Ciphertext 73bed6b8e3c1743b7116e69e22229516 - * Block #4 - * Plaintext f69f2445df4f9b17ad2b417be66c3710 - * Input Block 8521f2fd3c8eef2cdc3da7e5c44ea206 - * Output Block 3ff1caa1681fac09120eca307586e1a7 - * Ciphertext 3ff1caa1681fac09120eca307586e1a7 - */ -const uint8_t key[16] = { - 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, - 0x09, 0xcf, 0x4f, 0x3c -}; - -const uint8_t iv[16] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f -}; - -const uint8_t plaintext[64] = { - 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, - 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, - 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, - 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, - 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, - 0xe6, 0x6c, 0x37, 0x10 -}; - -const uint8_t ciphertext[80] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46, - 0xce, 0xe9, 0x8e, 0x9b, 0x12, 0xe9, 0x19, 0x7d, 0x50, 0x86, 0xcb, 0x9b, - 0x50, 0x72, 0x19, 0xee, 0x95, 0xdb, 0x11, 0x3a, 0x91, 0x76, 0x78, 0xb2, - 0x73, 0xbe, 0xd6, 0xb8, 0xe3, 0xc1, 0x74, 0x3b, 0x71, 0x16, 0xe6, 0x9e, - 0x22, 0x22, 0x95, 0x16, 0x3f, 0xf1, 0xca, 0xa1, 0x68, 0x1f, 0xac, 0x09, - 0x12, 0x0e, 0xca, 0x30, 0x75, 0x86, 0xe1, 0xa7 -}; - -/* - * NIST SP 800-38a CBC Test for encryption and decryption. - */ -int test_1_and_2(void) -{ - struct tc_aes_key_sched_struct a; - uint8_t iv_buffer[16]; - uint8_t encrypted[80]; - uint8_t decrypted[64]; - uint8_t *p; - unsigned int length; - int result = TC_PASS; - - (void)tc_aes128_set_encrypt_key(&a, key); - - (void)memcpy(iv_buffer, iv, TC_AES_BLOCK_SIZE); - - TC_PRINT("CBC test #1 (encryption SP 800-38a tests):\n"); - if (tc_cbc_mode_encrypt(encrypted, sizeof(plaintext) + TC_AES_BLOCK_SIZE, - plaintext, sizeof(plaintext), iv_buffer, &a) == 0) { - TC_ERROR("CBC test #1 (encryption SP 800-38a tests) failed in " - "%s.\n", __func__); - result = TC_FAIL; - goto exitTest1; - } - - result = check_result(1, ciphertext, sizeof(encrypted), encrypted, - sizeof(encrypted)); - TC_END_RESULT(result); - - TC_PRINT("CBC test #2 (decryption SP 800-38a tests):\n"); - (void)tc_aes128_set_decrypt_key(&a, key); - - p = &encrypted[TC_AES_BLOCK_SIZE]; - length = ((unsigned int) sizeof(encrypted)) - TC_AES_BLOCK_SIZE; - - if (tc_cbc_mode_decrypt(decrypted, length - TC_AES_BLOCK_SIZE, p, length, - encrypted, &a) == 0) { - TC_ERROR("CBC test #2 (decryption SP 800-38a tests) failed in. " - "%s\n", __func__); - result = TC_FAIL; - goto exitTest1; - } - - result = check_result(2, plaintext, sizeof(decrypted), decrypted, - sizeof(decrypted)); - -exitTest1: - TC_END_RESULT(result); - return result; -} - -/* - * Main task to test AES - */ -int main(void) -{ - int result = TC_PASS; - - TC_START("Performing AES128 tests:"); - - TC_PRINT("Performing CBC tests:\n"); - result = test_1_and_2(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("CBC test #1 failed.\n"); - goto exitTest; - } - - TC_PRINT("All CBC tests succeeded!\n"); - -exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); - - return result; -} diff --git a/mcuboot/ext/tinycrypt/tests/test_ccm_mode.c b/mcuboot/ext/tinycrypt/tests/test_ccm_mode.c deleted file mode 100644 index 878edb3dd..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_ccm_mode.c +++ /dev/null @@ -1,545 +0,0 @@ -/* test_ccm_mode.c - TinyCrypt AES-CCM tests (RFC 3610 tests) */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * DESCRIPTION - * This module tests the following AES-CCM Mode routines: - * - * Scenarios tested include: - * - AES128 CCM mode encryption RFC 3610 test vector #1 - * - AES128 CCM mode encryption RFC 3610 test vector #2 - * - AES128 CCM mode encryption RFC 3610 test vector #3 - * - AES128 CCM mode encryption RFC 3610 test vector #7 - * - AES128 CCM mode encryption RFC 3610 test vector #8 - * - AES128 CCM mode encryption RFC 3610 test vector #9 - * - AES128 CCM mode encryption No associated data - * - AES128 CCM mode encryption No payload data - */ - -#include -#include -#include - -#include - -#define TC_CCM_MAX_CT_SIZE 50 -#define TC_CCM_MAX_PT_SIZE 25 -#define NUM_NIST_KEYS 16 -#define NONCE_LEN 13 -#define HEADER_LEN 8 -#define M_LEN8 8 -#define M_LEN10 10 -#define DATA_BUF_LEN23 23 -#define DATA_BUF_LEN24 24 -#define DATA_BUF_LEN25 25 -#define EXPECTED_BUF_LEN31 31 -#define EXPECTED_BUF_LEN32 32 -#define EXPECTED_BUF_LEN33 33 -#define EXPECTED_BUF_LEN34 34 -#define EXPECTED_BUF_LEN35 35 - -int do_test(const uint8_t *key, uint8_t *nonce, - size_t nlen, const uint8_t *hdr, - size_t hlen, const uint8_t *data, - size_t dlen, const uint8_t *expected, - size_t elen, const int mlen) -{ - - int result = TC_PASS; - - uint8_t ciphertext[TC_CCM_MAX_CT_SIZE]; - uint8_t decrypted[TC_CCM_MAX_PT_SIZE]; - struct tc_ccm_mode_struct c; - struct tc_aes_key_sched_struct sched; - - tc_aes128_set_encrypt_key(&sched, key); - - result = tc_ccm_config(&c, &sched, nonce, nlen, mlen); - if (result == 0) { - TC_ERROR("CCM config failed in %s.\n", __func__); - - result = TC_FAIL; - goto exitTest1; - } - - result = tc_ccm_generation_encryption(ciphertext, TC_CCM_MAX_CT_SIZE, hdr, - hlen, data, dlen, &c); - if (result == 0) { - TC_ERROR("ccm_encrypt failed in %s.\n", __func__); - - result = TC_FAIL; - goto exitTest1; - } - - - if (memcmp(expected, ciphertext, elen) != 0) { - TC_ERROR("ccm_encrypt produced wrong ciphertext in %s.\n", - __func__); - show_str("\t\tExpected", expected, elen); - show_str("\t\tComputed", ciphertext, elen); - - result = TC_FAIL; - goto exitTest1; - } - - result = tc_ccm_decryption_verification(decrypted, TC_CCM_MAX_PT_SIZE, hdr, - hlen, ciphertext, dlen+mlen, &c); - if (result == 0) { - TC_ERROR("ccm_decrypt failed in %s.\n", __func__); - show_str("\t\tExpected", data, dlen); - show_str("\t\tComputed", decrypted, sizeof(decrypted)); - - result = TC_FAIL; - goto exitTest1; - } - - result = TC_PASS; - -exitTest1: - TC_END_RESULT(result); - return result; -} - -int test_vector_1(void) -{ - int result = TC_PASS; - /* RFC 3610 test vector #1 */ - const uint8_t key[NUM_NIST_KEYS] = { - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf - }; - uint8_t nonce[NONCE_LEN] = { - 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0xa0, - 0xa1, 0xa2, 0xa3, 0xa4, 0xa5 - }; - const uint8_t hdr[HEADER_LEN] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 - }; - const uint8_t data[DATA_BUF_LEN23] = { - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e - }; - const uint8_t expected[EXPECTED_BUF_LEN31] = { - 0x58, 0x8c, 0x97, 0x9a, 0x61, 0xc6, 0x63, 0xd2, - 0xf0, 0x66, 0xd0, 0xc2, 0xc0, 0xf9, 0x89, 0x80, - 0x6d, 0x5f, 0x6b, 0x61, 0xda, 0xc3, 0x84, 0x17, - 0xe8, 0xd1, 0x2c, 0xfd, 0xf9, 0x26, 0xe0 - }; - uint16_t mlen = M_LEN8; - - TC_PRINT("%s: Performing CCM test #1 (RFC 3610 test vector #1):\n", - __func__); - - result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr), - data, sizeof(data), expected, sizeof(expected), mlen); - - return result; -} - -int test_vector_2(void) -{ - int result = TC_PASS; - /* RFC 3610 test vector #2 */ - const uint8_t key[NUM_NIST_KEYS] = { - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf - }; - uint8_t nonce[NONCE_LEN] = { - 0x00, 0x00, 0x00, 0x04, 0x03, 0x02, 0x01, 0xa0, - 0xa1, 0xa2, 0xa3, 0xa4, 0xa5 - }; - const uint8_t hdr[HEADER_LEN] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 - }; - const uint8_t data[DATA_BUF_LEN24] = { - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f - }; - const uint8_t expected[EXPECTED_BUF_LEN32] = { - 0x72, 0xc9, 0x1a, 0x36, 0xe1, 0x35, 0xf8, 0xcf, - 0x29, 0x1c, 0xa8, 0x94, 0x08, 0x5c, 0x87, 0xe3, - 0xcc, 0x15, 0xc4, 0x39, 0xc9, 0xe4, 0x3a, 0x3b, - 0xa0, 0x91, 0xd5, 0x6e, 0x10, 0x40, 0x09, 0x16 - }; - uint16_t mlen = M_LEN8; - - TC_PRINT("%s: Performing CCM test #2 (RFC 3610 test vector #2):\n", - __func__); - - result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr), - data, sizeof(data), expected, sizeof(expected), mlen); - - return result; -} - -int test_vector_3(void) -{ - int result = TC_PASS; - /* RFC 3610 test vector #3 */ - const uint8_t key[NUM_NIST_KEYS] = { - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf - }; - uint8_t nonce[NONCE_LEN] = { - 0x00, 0x00, 0x00, 0x05, 0x04, 0x03, 0x02, 0xa0, - 0xa1, 0xa2, 0xa3, 0xa4, 0xa5 - }; - const uint8_t hdr[HEADER_LEN] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 - }; - const uint8_t data[DATA_BUF_LEN25] = { - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20 - }; - const uint8_t expected[EXPECTED_BUF_LEN33] = { - 0x51, 0xb1, 0xe5, 0xf4, 0x4a, 0x19, 0x7d, 0x1d, - 0xa4, 0x6b, 0x0f, 0x8e, 0x2d, 0x28, 0x2a, 0xe8, - 0x71, 0xe8, 0x38, 0xbb, 0x64, 0xda, 0x85, 0x96, - 0x57, 0x4a, 0xda, 0xa7, 0x6f, 0xbd, 0x9f, 0xb0, - 0xc5 - }; - uint16_t mlen = M_LEN8; - - TC_PRINT("%s: Performing CCM test #3 (RFC 3610 test vector #3):\n", - __func__); - - result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr), data, - sizeof(data), expected, sizeof(expected), mlen); - - return result; -} - -int test_vector_4(void) -{ - int result = TC_PASS; - /* RFC 3610 test vector #7 */ - const uint8_t key[NUM_NIST_KEYS] = { - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf - }; - uint8_t nonce[NONCE_LEN] = { - 0x00, 0x00, 0x00, 0x09, 0x08, 0x07, 0x06, 0xa0, - 0xa1, 0xa2, 0xa3, 0xa4, 0xa5 - }; - const uint8_t hdr[HEADER_LEN] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 - }; - const uint8_t data[DATA_BUF_LEN23] = { - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e - }; - const uint8_t expected[EXPECTED_BUF_LEN33] = { - 0x01, 0x35, 0xD1, 0xB2, 0xC9, 0x5F, 0x41, 0xD5, - 0xD1, 0xD4, 0xFE, 0xC1, 0x85, 0xD1, 0x66, 0xB8, - 0x09, 0x4E, 0x99, 0x9D, 0xFE, 0xD9, 0x6C, 0x04, - 0x8C, 0x56, 0x60, 0x2C, 0x97, 0xAC, 0xBB, 0x74, - 0x90 - }; - uint16_t mlen = M_LEN10; - - TC_PRINT("%s: Performing CCM test #4 (RFC 3610 test vector #7):\n", - __func__); - - result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr), - data, sizeof(data), expected, sizeof(expected), mlen); - - return result; -} - -int test_vector_5(void) -{ - int result = TC_PASS; - /* RFC 3610 test vector #8 */ - const uint8_t key[NUM_NIST_KEYS] = { - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, - 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF - }; - uint8_t nonce[NONCE_LEN] = { - 0x00, 0x00, 0x00, 0x0A, 0x09, 0x08, 0x07, 0xA0, - 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 - }; - const uint8_t hdr[HEADER_LEN] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 - }; - const uint8_t data[DATA_BUF_LEN24] = { - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f - }; - const uint8_t expected[EXPECTED_BUF_LEN34] = { - 0x7B, 0x75, 0x39, 0x9A, 0xC0, 0x83, 0x1D, 0xD2, - 0xF0, 0xBB, 0xD7, 0x58, 0x79, 0xA2, 0xFD, 0x8F, - 0x6C, 0xAE, 0x6B, 0x6C, 0xD9, 0xB7, 0xDB, 0x24, - 0xC1, 0x7B, 0x44, 0x33, 0xF4, 0x34, 0x96, 0x3F, - 0x34, 0xB4 - }; - uint16_t mlen = M_LEN10; - - TC_PRINT("%s: Performing CCM test #5 (RFC 3610 test vector #8):\n", - __func__); - - result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr), - data, sizeof(data), expected, sizeof(expected), mlen); - - return result; -} - -int test_vector_6(void) -{ - int result = TC_PASS; - /* RFC 3610 test vector #9 */ - const uint8_t key[NUM_NIST_KEYS] = { - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, - 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF - }; - uint8_t nonce[NONCE_LEN] = { - 0x00, 0x00, 0x00, 0x0B, 0x0A, 0x09, 0x08, 0xA0, - 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 - }; - const uint8_t hdr[HEADER_LEN] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 - }; - const uint8_t data[DATA_BUF_LEN25] = { - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20 - }; - const uint8_t expected[EXPECTED_BUF_LEN35] = { - 0x82, 0x53, 0x1a, 0x60, 0xCC, 0x24, 0x94, 0x5a, - 0x4b, 0x82, 0x79, 0x18, 0x1a, 0xb5, 0xc8, 0x4d, - 0xf2, 0x1c, 0xe7, 0xf9, 0xb7, 0x3f, 0x42, 0xe1, - 0x97, 0xea, 0x9c, 0x07, 0xe5, 0x6b, 0x5e, 0xb1, - 0x7e, 0x5f, 0x4e - }; - uint16_t mlen = M_LEN10; - - TC_PRINT("%s: Performing CCM test #6 (RFC 3610 test vector #9):\n", - __func__); - - result = do_test(key, nonce, sizeof(nonce), hdr, sizeof(hdr), - data, sizeof(data), expected, sizeof(expected), mlen); - - return result; -} - -int test_vector_7(void) -{ - int result = TC_PASS; - /* Test based on RFC 3610 test vector #9 but with no associated data */ - const uint8_t key[NUM_NIST_KEYS] = { - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, - 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF - }; - uint8_t nonce[NONCE_LEN] = { - 0x00, 0x00, 0x00, 0x0B, 0x0A, 0x09, 0x08, 0xA0, - 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 - }; - uint8_t *hdr = NULL; - - uint8_t data[DATA_BUF_LEN25] = { - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20 - }; - struct tc_ccm_mode_struct c; - struct tc_aes_key_sched_struct sched; - uint8_t decrypted[TC_CCM_MAX_PT_SIZE]; - uint8_t ciphertext[TC_CCM_MAX_CT_SIZE]; - uint16_t mlen = M_LEN10; - - TC_PRINT("%s: Performing CCM test #7 (no associated data):\n", - __func__); - - tc_aes128_set_encrypt_key(&sched, key); - if (tc_ccm_config(&c, &sched, nonce, sizeof(nonce), mlen) == 0) { - TC_ERROR("ccm_config failed in %s.\n", __func__); - - result = TC_FAIL; - goto exitTest1; - } - - result = tc_ccm_generation_encryption(ciphertext, TC_CCM_MAX_CT_SIZE, hdr, - 0, data, sizeof(data), &c); - if (result == 0) { - TC_ERROR("ccm_encryption failed in %s.\n", __func__); - - result = TC_FAIL; - goto exitTest1; - } - - result = tc_ccm_decryption_verification (decrypted, TC_CCM_MAX_PT_SIZE, hdr, - 0, ciphertext, sizeof(data)+mlen, &c); - if (result == 0) { - TC_ERROR("ccm_decrypt failed in %s.\n", __func__); - show_str("\t\tExpected", data, sizeof(data)); - show_str("\t\tComputed", decrypted, sizeof(decrypted)); - - result = TC_FAIL; - goto exitTest1; - } - - result = TC_PASS; - -exitTest1: - TC_END_RESULT(result); - return result; - -} - -int test_vector_8(void) -{ - int result = TC_PASS; - /* Test based on RFC 3610 test vector #9 but with no payload data */ - const uint8_t key[NUM_NIST_KEYS] = { - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, - 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF - }; - uint8_t nonce[NONCE_LEN] = { - 0x00, 0x00, 0x00, 0x0B, 0x0A, 0x09, 0x08, 0xA0, - 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 - }; - const uint8_t hdr[8] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 - }; - - uint8_t *data = NULL; - - struct tc_ccm_mode_struct c; - struct tc_aes_key_sched_struct sched; - - uint8_t decrypted[TC_CCM_MAX_PT_SIZE]; - uint8_t ciphertext[TC_CCM_MAX_CT_SIZE]; - - uint16_t mlen = M_LEN10; - - TC_PRINT("%s: Performing CCM test #8 (no payload data):\n", __func__); - - tc_aes128_set_encrypt_key(&sched, key); - if (tc_ccm_config(&c, &sched, nonce, sizeof(nonce), mlen) == 0) { - TC_ERROR("CCM config failed in %s.\n", __func__); - - result = TC_FAIL; - goto exitTest1; - } - - result = tc_ccm_generation_encryption(ciphertext, TC_CCM_MAX_CT_SIZE, hdr, - sizeof(hdr), data, 0, &c); - if (result == 0) { - TC_ERROR("ccm_encrypt failed in %s.\n", __func__); - - result = TC_FAIL; - goto exitTest1; - } - - result = tc_ccm_decryption_verification(decrypted, TC_CCM_MAX_PT_SIZE, hdr, - sizeof(hdr), ciphertext, mlen, &c); - if (result == 0) { - TC_ERROR("ccm_decrypt failed in %s.\n", __func__); - show_str("\t\tExpected", data, sizeof(data)); - show_str("\t\tComputed", decrypted, sizeof(decrypted)); - - result = TC_FAIL; - goto exitTest1; - } - - result = TC_PASS; - -exitTest1: - TC_END_RESULT(result); - return result; -} - -/* - * Main task to test CCM - */ -int main(void) -{ - int result = TC_PASS; - - TC_START("Performing CCM tests:"); - - result = test_vector_1(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("CCM test #1 (RFC 3610 test vector #1) failed.\n"); - goto exitTest; - } - result = test_vector_2(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("CCM test #2 failed.\n"); - goto exitTest; - } - result = test_vector_3(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("CCM test #3 failed.\n"); - goto exitTest; - } - result = test_vector_4(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("CCM test #4 failed.\n"); - goto exitTest; - } - result = test_vector_5(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("CCM test #5 failed.\n"); - goto exitTest; - } - result = test_vector_6(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("CCM test #6 failed.\n"); - goto exitTest; - } - result = test_vector_7(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("CCM test #7 failed.\n"); - goto exitTest; - } - result = test_vector_8(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("CCM test #8 (no payload data) failed.\n"); - goto exitTest; - } - - TC_PRINT("All CCM tests succeeded!\n"); - -exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); - - return result; -} diff --git a/mcuboot/ext/tinycrypt/tests/test_cmac_mode.c b/mcuboot/ext/tinycrypt/tests/test_cmac_mode.c deleted file mode 100644 index dc757fea2..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_cmac_mode.c +++ /dev/null @@ -1,314 +0,0 @@ -/* test_cmac_mode.c - TinyCrypt AES-CMAC tests (including SP 800-38B tests) */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -/* - * DESCRIPTION - * This module tests the following AES-CMAC test (including SP 800-38B): - * - * Scenarios tested include: - * - CMAC test #1 (GF(2^128) double)) - * - CMAC test #2 null msg (SP 800-38B test vector #1) - * - CMAC test #3 1 block msg (SP 800-38B test vector #2) - * - CMAC test #4 320 bit msg (SP 800-38B test vector #3) - * - CMAC test #5 512 bit msg (SP 800-38B test vector #4) - */ - -#include -#include -#include -#include - -#include -#include - -#define BUF_LEN 16 - -static void show(const char *label, const uint8_t *s, size_t slen) -{ - unsigned int i; - - TC_PRINT("%s\t", label); - for (i = 0; i < slen; ++i) { - TC_PRINT("%02x", s[i]); - } - TC_PRINT("\n"); -} - -extern void gf_double(uint8_t *out, uint8_t *in); - -static int verify_gf_2_128_double(uint8_t *K1, uint8_t *K2, - struct tc_cmac_struct s) -{ - int result = TC_PASS; - - TC_PRINT("Performing CMAC test #1 (GF(2^128) double):\n"); - - uint8_t zero[BUF_LEN]; - uint8_t L[BUF_LEN]; - const uint8_t l[BUF_LEN] = { - 0x7d, 0xf7, 0x6b, 0x0c, 0x1a, 0xb8, 0x99, 0xb3, - 0x3e, 0x42, 0xf0, 0x47, 0xb9, 0x1b, 0x54, 0x6f - }; - const uint8_t k1[BUF_LEN] = { - 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66, - 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde - }; - const uint8_t k2[BUF_LEN] = { - 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc, - 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b - }; - - (void) memset(zero, '\0', sizeof(zero)); - tc_aes_encrypt(L, zero, s.sched); - if (memcmp(L, l, BUF_LEN) != 0) { - TC_ERROR("%s: AES encryption failed\n", __func__); - show("expected L =", l, sizeof(l)); - show("computed L =", L, sizeof(L)); - return TC_FAIL; - } - - gf_double(K1, L); - if (memcmp(K1, k1, BUF_LEN) != 0) { - TC_ERROR("%s: gf_2_128_double failed when msb = 0\n", __func__); - show("expected K1 =", k1, sizeof(k1)); - show("computed K1 =", K1, sizeof(k1)); - return TC_FAIL; - } - - gf_double(K2, K1); - if (memcmp(K2, k2, BUF_LEN) != 0) { - TC_ERROR("%s: gf_2_128_double failed when msb = 1\n", __func__); - show("expected K2 =", k2, sizeof(k2)); - show("computed K2 =", K2, sizeof(k2)); - return TC_FAIL; - } - - TC_END_RESULT(result); - return result; -} - -static int verify_cmac_null_msg(TCCmacState_t s) -{ - int result = TC_PASS; - - TC_PRINT("Performing CMAC test #2 (SP 800-38B test vector #1):\n"); - - const uint8_t tag[BUF_LEN] = { - 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28, - 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46 - }; - uint8_t Tag[BUF_LEN]; - - (void) tc_cmac_init(s); - (void) tc_cmac_update(s, (const uint8_t *) 0, 0); - (void) tc_cmac_final(Tag, s); - - if (memcmp(Tag, tag, BUF_LEN) != 0) { - TC_ERROR("%s: aes_cmac failed with null msg = 1\n", __func__); - show("expected Tag =", tag, sizeof(tag)); - show("computed Tag =", Tag, sizeof(Tag)); - return TC_FAIL; - } - - TC_END_RESULT(result); - return result; -} - -static int verify_cmac_1_block_msg(TCCmacState_t s) -{ - int result = TC_PASS; - - TC_PRINT("Performing CMAC test #3 (SP 800-38B test vector #2):\n"); - - const uint8_t msg[BUF_LEN] = { - 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, - 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a - }; - const uint8_t tag[BUF_LEN] = { - 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44, - 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c - }; - uint8_t Tag[BUF_LEN]; - - (void) tc_cmac_init(s); - (void) tc_cmac_update(s, msg, sizeof(msg)); - (void) tc_cmac_final(Tag, s); - - if (memcmp(Tag, tag, BUF_LEN) != 0) { - TC_ERROR("%s: aes_cmac failed with 1 block msg\n", __func__); - show("aes_cmac failed with 1 block msg =", msg, sizeof(msg)); - show("expected Tag =", tag, sizeof(tag)); - show("computed Tag =", Tag, sizeof(Tag)); - return TC_FAIL; - } - - TC_END_RESULT(result); - return result; -} - -static int verify_cmac_320_bit_msg(TCCmacState_t s) -{ - int result = TC_PASS; - - TC_PRINT("Performing CMAC test #4 (SP 800-38B test vector #3):\n"); - - const uint8_t msg[40] = { - 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, - 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, - 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, - 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, - 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11 - }; - const uint8_t tag[BUF_LEN] = { - 0xdf, 0xa6, 0x67, 0x47, 0xde, 0x9a, 0xe6, 0x30, - 0x30, 0xca, 0x32, 0x61, 0x14, 0x97, 0xc8, 0x27 - }; - uint8_t Tag[BUF_LEN]; - - (void) tc_cmac_init(s); - (void) tc_cmac_update(s, msg, sizeof(msg)); - (void) tc_cmac_final(Tag, s); - - if (memcmp(Tag, tag, BUF_LEN) != 0) { - TC_ERROR("%s: aes_cmac failed with 320 bit msg\n", __func__); - show("aes_cmac failed with 320 bit msg =", msg, sizeof(msg)); - show("expected Tag =", tag, sizeof(tag)); - show("computed Tag =", Tag, sizeof(Tag)); - return TC_FAIL; - } - - TC_END_RESULT(result); - return result; -} - -static int verify_cmac_512_bit_msg(TCCmacState_t s) -{ - int result = TC_PASS; - - TC_PRINT("Performing CMAC test #5 (SP 800-38B test vector #4)\n"); - - const uint8_t msg[64] = { - 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, - 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, - 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, - 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, - 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, - 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, - 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, - 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 - }; - const uint8_t tag[BUF_LEN] = { - 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92, - 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe - }; - uint8_t Tag[BUF_LEN]; - - (void)tc_cmac_init(s); - (void)tc_cmac_update(s, msg, sizeof(msg)); - (void)tc_cmac_final(Tag, s); - - if (memcmp(Tag, tag, BUF_LEN) != 0) { - TC_ERROR("%s: aes_cmac failed with 512 bit msg\n", __func__); - show("aes_cmac failed with 512 bit msg =", msg, sizeof(msg)); - show("expected Tag =", tag, sizeof(tag)); - show("computed Tag =", Tag, sizeof(Tag)); - return TC_FAIL; - } - - TC_END_RESULT(result); - return result; -} - -/* - * Main task to test CMAC - * effects: returns 1 if all tests pass - * exceptions: returns a negative value if some test fails - */ -int main(void) -{ - - int result = TC_PASS; - - struct tc_cmac_struct state; - struct tc_aes_key_sched_struct sched; - - const uint8_t key[BUF_LEN] = { - 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, - 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c - }; - uint8_t K1[BUF_LEN], K2[BUF_LEN]; - - TC_START("Performing CMAC tests:"); - - (void) tc_cmac_setup(&state, key, &sched); - result = verify_gf_2_128_double(K1, K2, state); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("CMAC test #1 (128 double) failed.\n"); - goto exitTest; - } - (void) tc_cmac_setup(&state, key, &sched); - result = verify_cmac_null_msg(&state); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("CMAC test #2 (null msg) failed.\n"); - goto exitTest; - } - (void) tc_cmac_setup(&state, key, &sched); - result = verify_cmac_1_block_msg(&state); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("CMAC test #3 (1 block msg)failed.\n"); - goto exitTest; - } - (void) tc_cmac_setup(&state, key, &sched); - result = verify_cmac_320_bit_msg(&state); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("CMAC test #4 (320 bit msg) failed.\n"); - goto exitTest; - } - (void) tc_cmac_setup(&state, key, &sched); - result = verify_cmac_512_bit_msg(&state); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("CMAC test #5 (512 bit msg)failed.\n"); - goto exitTest; - } - - TC_PRINT("All CMAC tests succeeded!\n"); - -exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); - - return result; -} diff --git a/mcuboot/ext/tinycrypt/tests/test_ctr_mode.c b/mcuboot/ext/tinycrypt/tests/test_ctr_mode.c deleted file mode 100644 index daf378782..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_ctr_mode.c +++ /dev/null @@ -1,138 +0,0 @@ -/* test_ctr_mode.c - TinyCrypt implementation of some AES-CTR tests */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - DESCRIPTION - This module tests the following AES-CTR Mode routines: - - Scenarios tested include: - - AES128 CTR mode encryption SP 800-38a tests -*/ - -#include -#include -#include -#include - -#include -#include -#include - -/* - * NIST SP 800-38a CTR Test for encryption and decryption. - */ -unsigned int test_1_and_2(void) -{ - const uint8_t key[16] = { - 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, - 0x09, 0xcf, 0x4f, 0x3c - }; - uint8_t ctr[16] = { - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, - 0xfc, 0xfd, 0xfe, 0xff - }; - const uint8_t plaintext[64] = { - 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, - 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, - 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, - 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, - 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, - 0xe6, 0x6c, 0x37, 0x10 - }; - const uint8_t ciphertext[80] = { - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, - 0xfc, 0xfd, 0xfe, 0xff, 0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26, - 0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce, 0x98, 0x06, 0xf6, 0x6b, - 0x79, 0x70, 0xfd, 0xff, 0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff, - 0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e, 0x5b, 0x4f, 0x09, 0x02, - 0x0d, 0xb0, 0x3e, 0xab, 0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1, - 0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee - }; - struct tc_aes_key_sched_struct sched; - uint8_t out[80]; - uint8_t decrypted[64]; - unsigned int result = TC_PASS; - - TC_PRINT("CTR test #1 (encryption SP 800-38a tests):\n"); - (void)tc_aes128_set_encrypt_key(&sched, key); - - (void)memcpy(out, ctr, sizeof(ctr)); - if (tc_ctr_mode(&out[TC_AES_BLOCK_SIZE], sizeof(plaintext), plaintext, - sizeof(plaintext), ctr, &sched) == 0) { - TC_ERROR("CTR test #1 (encryption SP 800-38a tests) failed in %s.\n", __func__); - result = TC_FAIL; - goto exitTest1; - } - - result = check_result(1, ciphertext, sizeof(out), out, sizeof(out)); - TC_END_RESULT(result); - - TC_PRINT("CTR test #2 (decryption SP 800-38a tests):\n"); - (void) memcpy(ctr, out, sizeof(ctr)); - if (tc_ctr_mode(decrypted, sizeof(decrypted), &out[TC_AES_BLOCK_SIZE], - sizeof(decrypted), ctr, &sched) == 0) { - TC_ERROR("CTR test #2 (decryption SP 800-38a tests) failed in %s.\n", __func__); - result = TC_FAIL; - goto exitTest1; - } - - result = check_result(2, plaintext, sizeof(plaintext), - decrypted, sizeof(plaintext)); - - exitTest1: - TC_END_RESULT(result); - return result; -} - -/* - * Main task to test AES - */ - -int main(void) -{ - unsigned int result = TC_PASS; - - TC_START("Performing AES128-CTR mode tests:"); - - TC_PRINT("Performing CTR tests:\n"); - result = test_1_and_2(); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("CBC test #1 failed.\n"); - goto exitTest; - } - - TC_PRINT("All CTR tests succeeded!\n"); - - exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); -} diff --git a/mcuboot/ext/tinycrypt/tests/test_ctr_prng.c b/mcuboot/ext/tinycrypt/tests/test_ctr_prng.c deleted file mode 100644 index e95f7f1ab..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_ctr_prng.c +++ /dev/null @@ -1,565 +0,0 @@ -/* test_ctr_prng.c - TinyCrypt implementation of some CTR-PRNG tests */ - -/* - * Copyright (c) 2016, Chris Morrison, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - DESCRIPTION - This module tests the CTR-PRNG routines -*/ - -#include -#include -#include -#include - - -#include -#include -#include - -/* utility function to convert hex character representation to their nibble (4 bit) values */ -static uint8_t nibbleFromChar(char c) -{ - if(c >= '0' && c <= '9') return c - '0'; - if(c >= 'a' && c <= 'f') return c - 'a' + 10U; - if(c >= 'A' && c <= 'F') return c - 'A' + 10U; - return 255U; -} - -/* - * Convert a string of characters representing a hex buffer into a series of - * bytes of that real value - */ -uint8_t *hexStringToBytes(char *inhex) -{ - uint8_t *retval; - uint8_t *p; - int len, i; - - len = strlen(inhex) / 2; - retval = (uint8_t *)malloc(len+1); - for(i=0, p = (uint8_t *) inhex; i -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -int ecdh_vectors(char **qx_vec, char **qy_vec, char **d_vec, char **z_vec, - int tests, int verbose) -{ - - unsigned int pub[2*NUM_ECC_WORDS]; - unsigned int prv[NUM_ECC_WORDS]; - unsigned int z[NUM_ECC_WORDS]; - unsigned int result = TC_PASS; - - int rc; - unsigned int exp_z[NUM_ECC_WORDS]; - - const struct uECC_Curve_t * curve = uECC_secp256r1(); - - for (int i = 0; i < tests; i++) { - - string2scalar(pub + NUM_ECC_WORDS, NUM_ECC_WORDS, qx_vec[i]); - string2scalar(pub, NUM_ECC_WORDS, qy_vec[i]); - string2scalar(exp_z, NUM_ECC_WORDS, z_vec[i]); - string2scalar(prv, NUM_ECC_WORDS, d_vec[i]); - - uint8_t pub_bytes[2*NUM_ECC_BYTES]; - uECC_vli_nativeToBytes(pub_bytes, 2*NUM_ECC_BYTES, pub); - uint8_t private_bytes[NUM_ECC_BYTES]; - uECC_vli_nativeToBytes(private_bytes, NUM_ECC_BYTES, prv); - uint8_t z_bytes[NUM_ECC_BYTES]; - uECC_vli_nativeToBytes(z_bytes, NUM_ECC_BYTES, exp_z); - - rc = uECC_shared_secret(pub_bytes, private_bytes, z_bytes, curve); - - if (rc == TC_CRYPTO_FAIL) { - TC_ERROR("ECDH failure, exit.\n"); - result = TC_FAIL; - return result;; - } - - uECC_vli_bytesToNative(z, z_bytes, NUM_ECC_BYTES); - - result = check_ecc_result(i, "Z", exp_z, z, NUM_ECC_WORDS, verbose); - if (result == TC_FAIL) { - return result; - } - } - return result; -} - -int cavp_ecdh(bool verbose) -{ - unsigned int result = TC_PASS; - /* - * P-256 - */ - char *d[] = { - "7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534", - "38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5", - "1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8", - "207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d", - "59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf", - "f5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef", - "3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190", - "d8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8", - "0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d", - "2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08", - "77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848", - "42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e", - "ceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b", - "43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604", - "b2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903", - "4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8", - "4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147", - "1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e", - "dd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3", - "5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76", - "b601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d", - "fefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535", - "334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce", - "2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d", - "85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0", - }; - - char *x[] = { - "700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287", - "809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7ae", - "a2339c12d4a03c33546de533268b4ad667debf458b464d77443636440ee7fec3", - "df3989b9fa55495719b3cf46dccd28b5153f7808191dd518eff0c3cff2b705ed", - "41192d2813e79561e6a1d6f53c8bc1a433a199c835e141b05a74a97b0faeb922", - "33e82092a0f1fb38f5649d5867fba28b503172b7035574bf8e5b7100a3052792", - "6a9e0c3f916e4e315c91147be571686d90464e8bf981d34a90b6353bca6eeba7", - "a9c0acade55c2a73ead1a86fb0a9713223c82475791cd0e210b046412ce224bb", - "94e94f16a98255fff2b9ac0c9598aac35487b3232d3231bd93b7db7df36f9eb9", - "e099bf2a4d557460b5544430bbf6da11004d127cb5d67f64ab07c94fcdf5274f", - "f75a5fe56bda34f3c1396296626ef012dc07e4825838778a645c8248cff01658", - "2db4540d50230756158abf61d9835712b6486c74312183ccefcaef2797b7674d", - "cd94fc9497e8990750309e9a8534fd114b0a6e54da89c4796101897041d14ecb", - "15b9e467af4d290c417402e040426fe4cf236bae72baa392ed89780dfccdb471", - "49c503ba6c4fa605182e186b5e81113f075bc11dcfd51c932fb21e951eee2fa1", - "19b38de39fdd2f70f7091631a4f75d1993740ba9429162c2a45312401636b29c", - "2c91c61f33adfe9311c942fdbff6ba47020feff416b7bb63cec13faf9b099954", - "a28a2edf58025668f724aaf83a50956b7ac1cfbbff79b08c3bf87dfd2828d767", - "a2ef857a081f9d6eb206a81c4cf78a802bdf598ae380c8886ecd85fdc1ed7644", - "ccd8a2d86bc92f2e01bce4d6922cf7fe1626aed044685e95e2eebd464505f01f", - "c188ffc8947f7301fb7b53e36746097c2134bf9cc981ba74b4e9c4361f595e4e", - "317e1020ff53fccef18bf47bb7f2dd7707fb7b7a7578e04f35b3beed222a0eb6", - "45fb02b2ceb9d7c79d9c2fa93e9c7967c2fa4df5789f9640b24264b1e524fcb1", - "a19ef7bff98ada781842fbfc51a47aff39b5935a1c7d9625c8d323d511c92de6", - "356c5a444c049a52fee0adeb7e5d82ae5aa83030bfff31bbf8ce2096cf161c4b", - }; - - char *y[] = { - "db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac", - "b29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3", - "ef48a3ab26e20220bcda2c1851076839dae88eae962869a497bf73cb66faf536", - "422294ff46003429d739a33206c8752552c8ba54a270defc06e221e0feaf6ac4", - "1af98cc45e98a7e041b01cf35f462b7562281351c8ebf3ffa02e33a0722a1328", - "f2cf6b601e0a05945e335550bf648d782f46186c772c0f20d3cd0d6b8ca14b2f", - "40f9bead39c2f2bcc2602f75b8a73ec7bdffcbcead159d0174c6c4d3c5357f05", - "f6de0afa20e93e078467c053d241903edad734c6b403ba758c2b5ff04c9d4229", - "d8049a43579cfa90b8093a94416cbefbf93386f15b3f6e190b6e3455fedfe69a", - "d9c50dbe70d714edb5e221f4e020610eeb6270517e688ca64fb0e98c7ef8c1c5", - "33bbdf1b1772d8059df568b061f3f1122f28a8d819167c97be448e3dc3fb0c3c", - "62f57f314e3f3495dc4e099012f5e0ba71770f9660a1eada54104cdfde77243e", - "c3def4b5fe04faee0a11932229fff563637bfdee0e79c6deeaf449f85401c5c4", - "cdf4e9170fb904302b8fd93a820ba8cc7ed4efd3a6f2d6b05b80b2ff2aee4e77", - "8af706ff0922d87b3f0c5e4e31d8b259aeb260a9269643ed520a13bb25da5924", - "09aed7232b28e060941741b6828bcdfa2bc49cc844f3773611504f82a390a5ae", - "6cab31b06419e5221fca014fb84ec870622a1b12bab5ae43682aa7ea73ea08d0", - "dfa7bfffd4c766b86abeaf5c99b6e50cb9ccc9d9d00b7ffc7804b0491b67bc03", - "563c4c20419f07bc17d0539fade1855e34839515b892c0f5d26561f97fa04d1a", - "e9ddd583a9635a667777d5b8a8f31b0f79eba12c75023410b54b8567dddc0f38", - "bf7d2f2056e72421ef393f0c0f2b0e00130e3cac4abbcc00286168e85ec55051", - "09420ce5a19d77c6fe1ee587e6a49fbaf8f280e8df033d75403302e5a27db2ae", - "5c6e8ecf1f7d3023893b7b1ca1e4d178972ee2a230757ddc564ffe37f5c5a321", - "e9c184df75c955e02e02e400ffe45f78f339e1afe6d056fb3245f4700ce606ef", - "57d128de8b2a57a094d1a001e572173f96e8866ae352bf29cddaf92fc85b2f92", - }; - - char *Z[] = { - "46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b", - "057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67", - "2d457b78b4614132477618a5b077965ec90730a8c81a1c75d6d4ec68005d67ec", - "96441259534b80f6aee3d287a6bb17b5094dd4277d9e294f8fe73e48bf2a0024", - "19d44c8d63e8e8dd12c22a87b8cd4ece27acdde04dbf47f7f27537a6999a8e62", - "664e45d5bba4ac931cd65d52017e4be9b19a515f669bea4703542a2c525cd3d3", - "ca342daa50dc09d61be7c196c85e60a80c5cb04931746820be548cdde055679d", - "35aa9b52536a461bfde4e85fc756be928c7de97923f0416c7a3ac8f88b3d4489", - "605c16178a9bc875dcbff54d63fe00df699c03e8a888e9e94dfbab90b25f39b4", - "f96e40a1b72840854bb62bc13c40cc2795e373d4e715980b261476835a092e0b", - "8388fa79c4babdca02a8e8a34f9e43554976e420a4ad273c81b26e4228e9d3a3", - "72877cea33ccc4715038d4bcbdfe0e43f42a9e2c0c3b017fc2370f4b9acbda4a", - "e4e7408d85ff0e0e9c838003f28cdbd5247cdce31f32f62494b70e5f1bc36307", - "ed56bcf695b734142c24ecb1fc1bb64d08f175eb243a31f37b3d9bb4407f3b96", - "bc5c7055089fc9d6c89f83c1ea1ada879d9934b2ea28fcf4e4a7e984b28ad2cf", - "9a4e8e657f6b0e097f47954a63c75d74fcba71a30d83651e3e5a91aa7ccd8343", - "3ca1fc7ad858fb1a6aba232542f3e2a749ffc7203a2374a3f3d3267f1fc97b78", - "1aaabe7ee6e4a6fa732291202433a237df1b49bc53866bfbe00db96a0f58224f", - "430e6a4fba4449d700d2733e557f66a3bf3d50517c1271b1ddae1161b7ac798c", - "1ce9e6740529499f98d1f1d71329147a33df1d05e4765b539b11cf615d6974d3", - "4690e3743c07d643f1bc183636ab2a9cb936a60a802113c49bb1b3f2d0661660", - "30c2261bd0004e61feda2c16aa5e21ffa8d7e7f7dbf6ec379a43b48e4b36aeb0", - "2adae4a138a239dcd93c243a3803c3e4cf96e37fe14e6a9b717be9599959b11c", - "2e277ec30f5ea07d6ce513149b9479b96e07f4b6913b1b5c11305c1444a1bc0b", - "1e51373bd2c6044c129c436e742a55be2a668a85ae08441b6756445df5493857", - }; - - TC_PRINT("Test #1: ECDH"); - TC_PRINT("NIST-p256\n"); - - result = ecdh_vectors(x, y, d, Z, 25, verbose); - if(result == TC_FAIL) { - goto exitTest1; - } - - exitTest1: - TC_END_RESULT(result); - return result; -} - -int cavp_keygen(bool verbose) -{ - unsigned int result = TC_PASS; - /* - * [P-256, B.4.2 Key Pair Generation by Testing Candidates] - */ - char *d[] = { - "c9806898a0334916c860748880a541f093b579a9b1f32934d86c363c39800357", - "710735c8388f48c684a97bd66751cc5f5a122d6b9a96a2dbe73662f78217446d", - "78d5d8b7b3e2c16b3e37e7e63becd8ceff61e2ce618757f514620ada8a11f6e4", - "2a61a0703860585fe17420c244e1de5a6ac8c25146b208ef88ad51ae34c8cb8c", - "01b965b45ff386f28c121c077f1d7b2710acc6b0cb58d8662d549391dcf5a883", - "fac92c13d374c53a085376fe4101618e1e181b5a63816a84a0648f3bdc24e519", - "f257a192dde44227b3568008ff73bcf599a5c45b32ab523b5b21ca582fef5a0a", - "add67e57c42a3d28708f0235eb86885a4ea68e0d8cfd76eb46134c596522abfd", - "4494860fd2c805c5c0d277e58f802cff6d731f76314eb1554142a637a9bc5538", - "d40b07b1ea7b86d4709ef9dc634c61229feb71abd63dc7fc85ef46711a87b210", - }; - - char *x[] = { - "d0720dc691aa80096ba32fed1cb97c2b620690d06de0317b8618d5ce65eb728f", - "f6836a8add91cb182d8d258dda6680690eb724a66dc3bb60d2322565c39e4ab9", - "76711126cbb2af4f6a5fe5665dad4c88d27b6cb018879e03e54f779f203a854e", - "e1aa7196ceeac088aaddeeba037abb18f67e1b55c0a5c4e71ec70ad666fcddc8", - "1f038c5422e88eec9e88b815e8f6b3e50852333fc423134348fc7d79ef8e8a10", - "7258f2ab96fc84ef6ccb33e308cd392d8b568ea635730ceb4ebd72fa870583b9", - "d2e01411817b5512b79bbbe14d606040a4c90deb09e827d25b9f2fc068997872", - "55bed2d9c029b7f230bde934c7124ed52b1330856f13cbac65a746f9175f85d7", - "5190277a0c14d8a3d289292f8a544ce6ea9183200e51aec08440e0c1a463a4e4", - "fbcea7c2827e0e8085d7707b23a3728823ea6f4878b24747fb4fd2842d406c73", - }; - - char *y[] = { - "9681b517b1cda17d0d83d335d9c4a8a9a9b0b1b3c7106d8f3c72bc5093dc275f", - "1f837aa32864870cb8e8d0ac2ff31f824e7beddc4bb7ad72c173ad974b289dc2", - "a26df39960ab5248fd3620fd018398e788bd89a3cea509b352452b69811e6856", - "d7d35bdce6dedc5de98a7ecb27a9cd066a08f586a733b59f5a2cdb54f971d5c8", - "43a047cb20e94b4ffb361ef68952b004c0700b2962e0c0635a70269bc789b849", - "489807ca55bdc29ca5c8fe69b94f227b0345cccdbe89975e75d385cc2f6bb1e2", - "503f138f8bab1df2c4507ff663a1fdf7f710e7adb8e7841eaa902703e314e793", - "32805e311d583b4e007c40668185e85323948e21912b6b0d2cda8557389ae7b0", - "ecd98514821bd5aaf3419ab79b71780569470e4fed3da3c1353b28fe137f36eb", - "2393c85f1f710c5afc115a39ba7e18abe03f19c9d4bb3d47d19468b818efa535", - }; - - TC_PRINT("Test #2: ECC KeyGen "); - TC_PRINT("NIST-p256\n"); - - result = keygen_vectors(d, x, y, 10, verbose); - if(result == TC_FAIL) { - goto exitTest1; - } - - exitTest1: - TC_END_RESULT(result); - return result; -} - -/* Test ecc_make_keys, and also as keygen part of other tests */ -int pkv_vectors(char **qx_vec, char **qy_vec, char **res_vec, int tests, - bool verbose) -{ - - unsigned int pub[2 * NUM_ECC_WORDS]; - uint8_t _public[2 * NUM_ECC_BYTES]; - int rc; - int exp_rc; - char tmp; - unsigned int result = TC_PASS; - const struct uECC_Curve_t * curve = uECC_secp256r1(); - - for (int i = 0; i < tests; i++) { - - if (2 != sscanf(res_vec[i], "%c (%d ", &tmp, &exp_rc)) { - TC_ERROR("Error: failed to parse CAVP response.\n"); - result = TC_FAIL; - goto exitTest1; - } - - if (strlen(qx_vec[i]) > 2 * NUM_ECC_BYTES || - strlen(qy_vec[i]) > 2 * NUM_ECC_BYTES) { - /* invalid input to ECC digit conversion (string2native()) */ - rc = -2; - } else { - string2scalar(pub, NUM_ECC_WORDS, qx_vec[i]); - string2scalar(pub + NUM_ECC_WORDS, NUM_ECC_WORDS, qy_vec[i]); - - uECC_vli_nativeToBytes(_public, NUM_ECC_BYTES, pub); - uECC_vli_nativeToBytes(_public + NUM_ECC_BYTES, NUM_ECC_BYTES, pub+NUM_ECC_WORDS); - - rc = uECC_valid_public_key(_public, curve); - } - - /* - * map to CAVP error codes - * 0 => 0 - success - * -1 => ? - (x,y) = (0,0) (not covered) - * -2 => 1 - out of bounds (pubverify or ecc import) - * -3 => 2 - not on curve - * -4 => ? - public key is the group generator - */ - - if (rc == -3) rc = 2; - if (rc == -2) rc = 1; - - result = check_code(i, res_vec[i], exp_rc, rc, verbose); - if(result == TC_FAIL) { - goto exitTest1; - } - } - - exitTest1: - TC_END_RESULT(result); - return result; -} - -int cavp_pkv(bool verbose) -{ - /* - * [P-256] - */ - char *x[] = { - "e0f7449c5588f24492c338f2bc8f7865f755b958d48edb0f2d0056e50c3fd5b7", - "d17c446237d9df87266ba3a91ff27f45abfdcb77bfd83536e92903efb861a9a9", - "17875397ae87369365656d490e8ce956911bd97607f2aff41b56f6f3a61989826", - "f2d1c0dc0852c3d8a2a2500a23a44813ccce1ac4e58444175b440469ffc12273", - "10b0ca230fff7c04768f4b3d5c75fa9f6c539bea644dffbec5dc796a213061b58", - "2c1052f25360a15062d204a056274e93cbe8fc4c4e9b9561134ad5c15ce525da", - "a40d077a87dae157d93dcccf3fe3aca9c6479a75aa2669509d2ef05c7de6782f", - "2633d398a3807b1895548adbb0ea2495ef4b930f91054891030817df87d4ac0a", - "14bf57f76c260b51ec6bbc72dbd49f02a56eaed070b774dc4bad75a54653c3d56", - "2fa74931ae816b426f484180e517f5050c92decfc8daf756cd91f54d51b302f1", - "f8c6dd3181a76aa0e36c2790bba47041acbe7b1e473ff71eee39a824dc595ff0", - "7a81a7e0b015252928d8b36e4ca37e92fdc328eb25c774b4f872693028c4be38", - }; - - char *y[] = { - "86d7e9255d0f4b6f44fa2cd6f8ba3c0aa828321d6d8cc430ca6284ce1d5b43a0", - "1eabb6a349ce2cd447d777b6739c5fc066add2002d2029052c408d0701066231c", - "980a3c4f61b9692633fbba5ef04c9cb546dd05cdec9fa8428b8849670e2fba92", - "32bfe992831b305d8c37b9672df5d29fcb5c29b4a40534683e3ace23d24647dd", - "f5edf37c11052b75f771b7f9fa050e353e464221fec916684ed45b6fead38205", - "ced9783713a8a2a09eff366987639c625753295d9a85d0f5325e32dedbcada0b", - "503d86b87d743ba20804fd7e7884aa017414a7b5b5963e0d46e3a9611419ddf3", - "d6b2f738e3873cc8364a2d364038ce7d0798bb092e3dd77cbdae7c263ba618d2", - "7a231a23bf8b3aa31d9600d888a0678677a30e573decd3dc56b33f365cc11236", - "5b994346137988c58c14ae2152ac2f6ad96d97decb33099bd8a0210114cd1141", - "9c965f227f281b3072b95b8daf29e88b35284f3574462e268e529bbdc50e9e52", - "08862f7335147261e7b1c3d055f9a316e4cab7daf99cc09d1c647f5dd6e7d5bb", - }; - - char *Result[] = { - "P (0 )", "F (1 - Q_x or Q_y out of range)", - "F (1 - Q_x or Q_y out of range)", "F (2 - Point not on curve)", - "F (1 - Q_x or Q_y out of range)", "P (0 )", - "F (2 - Point not on curve)", "P (0 )", - "F (1 - Q_x or Q_y out of range)", "P (0 )", - "F (2 - Point not on curve)", "F (2 - Point not on curve)", - }; - - TC_PRINT("Test #3: PubKeyVerify "); - TC_PRINT("NIST-p256-SHA2-256\n"); - - return pkv_vectors(x, y, Result, 12, verbose); -} - -int montecarlo_ecdh(int num_tests, bool verbose) -{ - int i; - uint8_t private1[NUM_ECC_BYTES] = {0}; - uint8_t private2[NUM_ECC_BYTES] = {0}; - uint8_t public1[2*NUM_ECC_BYTES] = {0}; - uint8_t public2[2*NUM_ECC_BYTES] = {0}; - uint8_t secret1[NUM_ECC_BYTES] = {0}; - uint8_t secret2[NUM_ECC_BYTES] = {0}; - unsigned int result = TC_PASS; - - const struct uECC_Curve_t * curve = uECC_secp256r1(); - - TC_PRINT("Test #4: Monte Carlo (%d Randomized EC-DH key-exchange) ", num_tests); - TC_PRINT("NIST-p256\n "); - - for (i = 0; i < num_tests; ++i) { - if (verbose) { - TC_PRINT("."); - fflush(stdout); - } - - if (!uECC_make_key(public1, private1, curve) || - !uECC_make_key(public2, private2, curve)) { - TC_ERROR("uECC_make_key() failed\n"); - result = TC_FAIL; - goto exitTest1; - } - - if (!uECC_shared_secret(public2, private1, secret1, curve)) { - TC_ERROR("shared_secret() failed (1)\n"); - result = TC_FAIL; - goto exitTest1;; - } - - if (!uECC_shared_secret(public1, private2, secret2, curve)) { - TC_ERROR("shared_secret() failed (2)\n"); - result = TC_FAIL; - goto exitTest1; - } - - if (memcmp(secret1, secret2, sizeof(secret1)) != 0) { - TC_PRINT("Shared secrets are not identical!\n"); - TC_PRINT("Private key 1 = "); - vli_print_bytes(private1, 32); - TC_PRINT("\nPrivate key 2 = "); - vli_print_bytes(private2, 32); - TC_PRINT("\nPublic key 1 = "); - vli_print_bytes(public1, 64); - TC_PRINT("\nPublic key 2 = "); - vli_print_bytes(public2, 64); - TC_PRINT("\nShared secret 1 = "); - vli_print_bytes(secret1, 32); - TC_PRINT("\nShared secret 2 = "); - vli_print_bytes(secret2, 32); - TC_PRINT("\n"); - } - } - - TC_PRINT("\n"); - - exitTest1: - TC_END_RESULT(result); - return result; -} - -int main() -{ - unsigned int result = TC_PASS; - - TC_START("Performing ECC-DH tests:"); - - /* Setup of the Cryptographically Secure PRNG. */ - uECC_set_rng(&default_CSPRNG); - - bool verbose = true; - - TC_PRINT("Performing cavp_ecdh test:\n"); - result = cavp_ecdh(verbose); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("cavp_ecdh test failed.\n"); - goto exitTest; - } - TC_PRINT("Performing cavp_keygen test:\n"); - result = cavp_keygen(verbose); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("cavp_keygen test failed.\n"); - goto exitTest; - } - TC_PRINT("Performing cavp_pkv test:\n"); - result = cavp_pkv(verbose); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("cavp_pkv failed.\n"); - goto exitTest; - } - TC_PRINT("Performing montecarlo_ecdh test:\n"); - result = montecarlo_ecdh(10, verbose); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("montecarlo_ecdh test failed.\n"); - goto exitTest; - } - - TC_PRINT("All EC-DH tests succeeded!\n"); - - exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); -} diff --git a/mcuboot/ext/tinycrypt/tests/test_ecc_dsa.c b/mcuboot/ext/tinycrypt/tests/test_ecc_dsa.c deleted file mode 100644 index d1e933cd4..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_ecc_dsa.c +++ /dev/null @@ -1,669 +0,0 @@ -/* test_ecc_ecdsa.c - TinyCrypt implementation of some EC-DSA tests */ - -/* Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE.*/ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * test_ecc_ecdsa.c -- Implementation of some EC-DSA tests - * - */ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -/* Maximum size of message to be signed. */ -#define BUF_SIZE 256 - -int sign_vectors(TCSha256State_t hash, char **d_vec, char **k_vec, - char **msg_vec, char **qx_vec, char **qy_vec, char **r_vec, - char **s_vec, int tests, bool verbose) -{ - - unsigned int k[NUM_ECC_WORDS]; - unsigned int private[NUM_ECC_WORDS]; - uint8_t private_bytes[NUM_ECC_BYTES]; - unsigned int sig[2 * NUM_ECC_WORDS]; - uint8_t sig_bytes[2 * NUM_ECC_BYTES]; - unsigned int digest[TC_SHA256_DIGEST_SIZE / 4]; - uint8_t digest_bytes[TC_SHA256_DIGEST_SIZE]; - unsigned int result = TC_PASS; - - /* expected outputs (converted input vectors) */ - unsigned int exp_r[NUM_ECC_WORDS]; - unsigned int exp_s[NUM_ECC_WORDS]; - - uint8_t msg[BUF_SIZE]; - size_t msglen; - - for (int i = 0; i < tests; i++) { - - /* use keygen test to generate and validate pubkey */ - keygen_vectors(d_vec+i, qx_vec+i, qy_vec+i, 1, false); - string2scalar(private, NUM_ECC_WORDS, d_vec[i]); - uECC_vli_nativeToBytes(private_bytes, NUM_ECC_BYTES, private); - - /* validate ECDSA: hash message, sign digest, check r+s */ - memset(k, 0, NUM_ECC_BYTES); - string2scalar(k, NUM_ECC_WORDS, k_vec[i]); - string2scalar(exp_r, NUM_ECC_WORDS, r_vec[i]); - string2scalar(exp_s, NUM_ECC_WORDS, s_vec[i]); - - msglen = hex2bin(msg, BUF_SIZE, msg_vec[i], strlen(msg_vec[i])); - - if (msglen == false) { - TC_ERROR("failed to import message!\n"); - result = TC_FAIL; - goto exitTest1; - } - - tc_sha256_init(hash); - tc_sha256_update(hash, msg, msglen); - tc_sha256_final(digest_bytes, hash); - - /* if digest larger than ECC scalar, drop the end - * if digest smaller than ECC scalar, zero-pad front */ - int hash_dwords = TC_SHA256_DIGEST_SIZE / 4; - if (NUM_ECC_WORDS < hash_dwords) { - hash_dwords = NUM_ECC_WORDS; - } - - memset(digest, 0, NUM_ECC_BYTES - 4 * hash_dwords); - uECC_vli_bytesToNative(digest + (NUM_ECC_WORDS-hash_dwords), - digest_bytes, TC_SHA256_DIGEST_SIZE); - - if (uECC_sign_with_k(private_bytes, digest_bytes, - sizeof(digest_bytes), k, sig_bytes, uECC_secp256r1()) == 0) { - TC_ERROR("ECDSA_sign failed!\n"); - result = TC_FAIL; - goto exitTest1; - } - - uECC_vli_bytesToNative(sig, sig_bytes, NUM_ECC_BYTES); - uECC_vli_bytesToNative(sig + NUM_ECC_WORDS, sig_bytes+NUM_ECC_BYTES, NUM_ECC_BYTES); - - result = check_ecc_result(i, "sig.r", exp_r, sig, NUM_ECC_WORDS, verbose); - if(result == TC_FAIL) { - goto exitTest1; - } - result = check_ecc_result(i, "sig.s", exp_s, sig + NUM_ECC_WORDS, NUM_ECC_WORDS, verbose); - if(result == TC_FAIL) { - goto exitTest1; - } - } - - exitTest1: - TC_END_RESULT(result); - return result; -} - -int cavp_sign(bool verbose) -{ - - /* - * [P-256,SHA-256] - */ - char *d[] = { - "519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464", - "0f56db78ca460b055c500064824bed999a25aaf48ebb519ac201537b85479813", - "e283871239837e13b95f789e6e1af63bf61c918c992e62bca040d64cad1fc2ef", - "a3d2d3b7596f6592ce98b4bfe10d41837f10027a90d7bb75349490018cf72d07", - "53a0e8a8fe93db01e7ae94e1a9882a102ebd079b3a535827d583626c272d280d", - "4af107e8e2194c830ffb712a65511bc9186a133007855b49ab4b3833aefc4a1d", - "78dfaa09f1076850b3e206e477494cddcfb822aaa0128475053592c48ebaf4ab", - "80e692e3eb9fcd8c7d44e7de9f7a5952686407f90025a1d87e52c7096a62618a", - "5e666c0db0214c3b627a8e48541cc84a8b6fd15f300da4dff5d18aec6c55b881", - "f73f455271c877c4d5334627e37c278f68d143014b0a05aa62f308b2101c5308", - "b20d705d9bd7c2b8dc60393a5357f632990e599a0975573ac67fd89b49187906", - "d4234bebfbc821050341a37e1240efe5e33763cbbb2ef76a1c79e24724e5a5e7", - "b58f5211dff440626bb56d0ad483193d606cf21f36d9830543327292f4d25d8c", - "54c066711cdb061eda07e5275f7e95a9962c6764b84f6f1f3ab5a588e0a2afb1", - "34fa4682bf6cb5b16783adcd18f0e6879b92185f76d7c920409f904f522db4b1", - }; - - char *k[] = { - "94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de", - "6d3e71882c3b83b156bb14e0ab184aa9fb728068d3ae9fac421187ae0b2f34c6", - "ad5e887eb2b380b8d8280ad6e5ff8a60f4d26243e0124c2f31a297b5d0835de2", - "24fc90e1da13f17ef9fe84cc96b9471ed1aaac17e3a4bae33a115df4e5834f18", - "5d833e8d24cc7a402d7ee7ec852a3587cddeb48358cea71b0bedb8fabe84e0c4", - "e18f96f84dfa2fd3cdfaec9159d4c338cd54ad314134f0b31e20591fc238d0ab", - "295544dbb2da3da170741c9b2c6551d40af7ed4e891445f11a02b66a5c258a77", - "7c80fd66d62cc076cef2d030c17c0a69c99611549cb32c4ff662475adbe84b22", - "2e7625a48874d86c9e467f890aaa7cd6ebdf71c0102bfdcfa24565d6af3fdce9", - "62f8665fd6e26b3fa069e85281777a9b1f0dfd2c0b9f54a086d0c109ff9fd615", - "72b656f6b35b9ccbc712c9f1f3b1a14cbbebaec41c4bca8da18f492a062d6f6f", - "d926fe10f1bfd9855610f4f5a3d666b1a149344057e35537373372ead8b1a778", - "e158bf4a2d19a99149d9cdb879294ccb7aaeae03d75ddd616ef8ae51a6dc1071", - "646fe933e96c3b8f9f507498e907fdd201f08478d0202c752a7c2cfebf4d061a", - "a6f463ee72c9492bc792fe98163112837aebd07bab7a84aaed05be64db3086f4", - }; - - char *Msg[] = { - "5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe16" - "5b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd280" - "65b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d0379979" - "0fe2d308d16146d5c9b0d0debd97d79ce8", - "c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df" - "987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011" - "a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011c" - "e375b56621a20642b4d36e060db4524af1", - "3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffe" - "f5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc" - "859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf80" - "6edf79b15a3fcd46e7067b7669f83188ee", - "0989122410d522af64ceb07da2c865219046b4c3d9d99b01278c07ff63eaf1039cb787ae9e" - "2dd46436cc0415f280c562bebb83a23e639e476a02ec8cff7ea06cd12c86dcc3adefbf1a9e" - "9a9b6646c7599ec631b0da9a60debeb9b3e19324977f3b4f36892c8a38671c8e1cc8e50fcd" - "50f9e51deaf98272f9266fc702e4e57c30", - "dc66e39f9bbfd9865318531ffe9207f934fa615a5b285708a5e9c46b7775150e818d7f24d2" - "a123df3672fff2094e3fd3df6fbe259e3989dd5edfcccbe7d45e26a775a5c4329a084f057c" - "42c13f3248e3fd6f0c76678f890f513c32292dd306eaa84a59abe34b16cb5e38d0e885525d" - "10336ca443e1682aa04a7af832b0eee4e7", - "600974e7d8c5508e2c1aab0783ad0d7c4494ab2b4da265c2fe496421c4df238b0be25f2565" - "9157c8a225fb03953607f7df996acfd402f147e37aee2f1693e3bf1c35eab3ae360a2bd91d" - "04622ea47f83d863d2dfecb618e8b8bdc39e17d15d672eee03bb4ce2cc5cf6b217e5faf3f3" - "36fdd87d972d3a8b8a593ba85955cc9d71", - "dfa6cb9b39adda6c74cc8b2a8b53a12c499ab9dee01b4123642b4f11af336a91a5c9ce0520" - "eb2395a6190ecbf6169c4cba81941de8e76c9c908eb843b98ce95e0da29c5d4388040264e0" - "5e07030a577cc5d176387154eabae2af52a83e85c61c7c61da930c9b19e45d7e34c8516dc3" - "c238fddd6e450a77455d534c48a152010b", - "51d2547cbff92431174aa7fc7302139519d98071c755ff1c92e4694b58587ea560f72f32fc" - "6dd4dee7d22bb7387381d0256e2862d0644cdf2c277c5d740fa089830eb52bf79d1e75b859" - "6ecf0ea58a0b9df61e0c9754bfcd62efab6ea1bd216bf181c5593da79f10135a9bc6e164f1" - "854bc8859734341aad237ba29a81a3fc8b", - "558c2ac13026402bad4a0a83ebc9468e50f7ffab06d6f981e5db1d082098065bcff6f21a7a" - "74558b1e8612914b8b5a0aa28ed5b574c36ac4ea5868432a62bb8ef0695d27c1e3ceaf75c7" - "b251c65ddb268696f07c16d2767973d85beb443f211e6445e7fe5d46f0dce70d58a4cd9fe7" - "0688c035688ea8c6baec65a5fc7e2c93e8", - "4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510" - "a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad" - "285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e681" - "51fc4aee5adebb066eb6da4eaa5681378e", - "f8248ad47d97c18c984f1f5c10950dc1404713c56b6ea397e01e6dd925e903b4fadfe2c9e8" - "77169e71ce3c7fe5ce70ee4255d9cdc26f6943bf48687874de64f6cf30a012512e787b8805" - "9bbf561162bdcc23a3742c835ac144cc14167b1bd6727e940540a9c99f3cbb41fb1dcb00d7" - "6dda04995847c657f4c19d303eb09eb48a", - "3b6ee2425940b3d240d35b97b6dcd61ed3423d8e71a0ada35d47b322d17b35ea0472f35edd" - "1d252f87b8b65ef4b716669fc9ac28b00d34a9d66ad118c9d94e7f46d0b4f6c2b2d339fd6b" - "cd351241a387cc82609057048c12c4ec3d85c661975c45b300cb96930d89370a327c98b67d" - "efaa89497aa8ef994c77f1130f752f94a4", - "c5204b81ec0a4df5b7e9fda3dc245f98082ae7f4efe81998dcaa286bd4507ca840a53d21b0" - "1e904f55e38f78c3757d5a5a4a44b1d5d4e480be3afb5b394a5d2840af42b1b4083d40afbf" - "e22d702f370d32dbfd392e128ea4724d66a3701da41ae2f03bb4d91bb946c7969404cb544f" - "71eb7a49eb4c4ec55799bda1eb545143a7", - "72e81fe221fb402148d8b7ab03549f1180bcc03d41ca59d7653801f0ba853add1f6d29edd7" - "f9abc621b2d548f8dbf8979bd16608d2d8fc3260b4ebc0dd42482481d548c7075711b57596" - "49c41f439fad69954956c9326841ea6492956829f9e0dc789f73633b40f6ac77bcae6dfc79" - "30cfe89e526d1684365c5b0be2437fdb01", - "21188c3edd5de088dacc1076b9e1bcecd79de1003c2414c3866173054dc82dde85169baa77" - "993adb20c269f60a5226111828578bcc7c29e6e8d2dae81806152c8ba0c6ada1986a1983eb" - "eec1473a73a04795b6319d48662d40881c1723a706f516fe75300f92408aa1dc6ae4288d20" - "46f23c1aa2e54b7fb6448a0da922bd7f34", - }; - - char *Qx[] = { - "1ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83", - "e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8a", - "74ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde8", - "322f80371bf6e044bc49391d97c1714ab87f990b949bc178cb7c43b7c22d89e1", - "1bcec4570e1ec2436596b8ded58f60c3b1ebc6a403bc5543040ba82963057244", - "a32e50be3dae2c8ba3f5e4bdae14cf7645420d425ead94036c22dd6c4fc59e00", - "8bcfe2a721ca6d753968f564ec4315be4857e28bef1908f61a366b1f03c97479", - "a88bc8430279c8c0400a77d751f26c0abc93e5de4ad9a4166357952fe041e767", - "1bc487570f040dc94196c9befe8ab2b6de77208b1f38bdaae28f9645c4d2bc3a", - "b8188bd68701fc396dab53125d4d28ea33a91daf6d21485f4770f6ea8c565dde", - "51f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce", - "8fb287f0202ad57ae841aea35f29b2e1d53e196d0ddd9aec24813d64c0922fb7", - "68229b48c2fe19d3db034e4c15077eb7471a66031f28a980821873915298ba76", - "0a7dbb8bf50cb605eb2268b081f26d6b08e012f952c4b70a5a1e6e7d46af98bb", - "105d22d9c626520faca13e7ced382dcbe93498315f00cc0ac39c4821d0d73737", - }; - - char *Qy[] = { - "ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9", - "bfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39", - "29074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614", - "3c15d54a5cc6b9f09de8457e873eb3deb1fceb54b0b295da6050294fae7fd999", - "8af62a4c683f096b28558320737bf83b9959a46ad2521004ef74cf85e67494e1", - "d623bf641160c289d6742c6257ae6ba574446dd1d0e74db3aaa80900b78d4ae9", - "0f67576a30b8e20d4232d8530b52fb4c89cbc589ede291e499ddd15fe870ab96", - "2d365a1eef25ead579cc9a069b6abc1b16b81c35f18785ce26a10ba6d1381185", - "ec81602abd8345e71867c8210313737865b8aa186851e1b48eaca140320f5d8f", - "423f058810f277f8fe076f6db56e9285a1bf2c2a1dae145095edd9c04970bc4a", - "4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1", - "1f6daff1aa2dd2d6d3741623eecb5e7b612997a1039aab2e5cf2de969cfea573", - "303e8ee3742a893f78b810991da697083dd8f11128c47651c27a56740a80c24c", - "f26dd7d799930062480849962ccf5004edcfd307c044f4e8f667c9baa834eeae", - "6c47f3cbbfa97dfcebe16270b8c7d5d3a5900b888c42520d751e8faf3b401ef4", - }; - - char *R[] = { - "f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac", - "976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db", - "35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1", - "d7c562370af617b581c84a2468cc8bd50bb1cbf322de41b7887ce07c0e5884ca", - "18caaf7b663507a8bcd992b836dec9dc5703c080af5e51dfa3a9a7c387182604", - "8524c5024e2d9a73bde8c72d9129f57873bbad0ed05215a372a84fdbc78f2e68", - "c5a186d72df452015480f7f338970bfe825087f05c0088d95305f87aacc9b254", - "9d0c6afb6df3bced455b459cc21387e14929392664bb8741a3693a1795ca6902", - "2f9e2b4e9f747c657f705bffd124ee178bbc5391c86d056717b140c153570fd9", - "1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620", - "9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c42", - "490efd106be11fc365c7467eb89b8d39e15d65175356775deab211163c2504cb", - "e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb", - "b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64b", - "542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d962663", - }; - - char *S[] = { - "8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903", - "1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932", - "ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96", - "b46d9f2d8c4bf83546ff178f1d78937c008d64e8ecc5cbb825cb21d94d670d89", - "77c68928ac3b88d985fb43fb615fb7ff45c18ba5c81af796c613dfa98352d29c", - "d18c2caf3b1072f87064ec5e8953f51301cada03469c640244760328eb5a05cb", - "84a58f9e9d9e735344b316b1aa1ab5185665b85147dc82d92e969d7bee31ca30", - "d7f9ddd191f1f412869429209ee3814c75c72fa46a9cccf804a2f5cc0b7e739f", - "f5413bfd85949da8d83de83ab0d19b2986613e224d1901d76919de23ccd03199", - "880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430", - "2bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c", - "644300fc0da4d40fb8c6ead510d14f0bd4e1321a469e9c0a581464c7186b7aa7", - "9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333", - "d7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851", - "4f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f", - }; - - struct tc_sha256_state_struct sha256_ctx; - - TC_PRINT("Test #1: ECDSAsign "); - TC_PRINT("NIST-p256, SHA2-256\n"); - - return sign_vectors(&sha256_ctx, d, k, Msg, Qx, Qy, R, S, 15, verbose); -} - -int vrfy_vectors(TCSha256State_t hash, char **msg_vec, char **qx_vec, char **qy_vec, - char **r_vec, char **s_vec, char **res_vec, int tests, bool verbose) -{ - - const struct uECC_Curve_t * curve = uECC_secp256r1(); - unsigned int pub[2 * NUM_ECC_WORDS]; - uint8_t pub_bytes[2 * NUM_ECC_BYTES]; - unsigned int sig[2 * NUM_ECC_WORDS]; - uint8_t sig_bytes[2 * NUM_ECC_BYTES]; - uint8_t digest_bytes[TC_SHA256_DIGEST_SIZE]; - unsigned int digest[TC_SHA256_DIGEST_SIZE / 4]; - unsigned int result = TC_PASS; - - int rc; - int exp_rc; - char tmp; - - uint8_t msg[BUF_SIZE]; - size_t msglen; - - for (int i = 0; i < tests; i++) { - - string2scalar(pub, NUM_ECC_WORDS, qx_vec[i]); - string2scalar(pub + NUM_ECC_WORDS, NUM_ECC_WORDS, qy_vec[i]); - string2scalar(sig, NUM_ECC_WORDS, r_vec[i]); - string2scalar(sig + NUM_ECC_WORDS, NUM_ECC_WORDS, s_vec[i]); - - if (2 != sscanf(res_vec[i], "%c (%d ", &tmp, &exp_rc)) { - TC_ERROR("Error: failed to parse CAVP response.\n"); - result = TC_FAIL; - goto exitTest1; - } - - /* validate ECDSA: hash message, verify r+s */ - msglen = hex2bin(msg, BUF_SIZE, msg_vec[i], strlen(msg_vec[i])); - - if (msglen == false) { - TC_ERROR("failed to import message!\n"); - result = TC_FAIL; - goto exitTest1; - } - - tc_sha256_init(hash); - tc_sha256_update(hash, msg, msglen); - tc_sha256_final(digest_bytes, hash); - - /* if digest larger than ECC scalar, drop the end - * if digest smaller than ECC scalar, zero-pad front */ - int hash_dwords = TC_SHA256_DIGEST_SIZE / 4; - if (NUM_ECC_WORDS < hash_dwords) { - hash_dwords = NUM_ECC_WORDS; - } - - memset(digest, 0, NUM_ECC_BYTES - 4 * hash_dwords); - uECC_vli_bytesToNative(digest + (NUM_ECC_WORDS-hash_dwords), digest_bytes, - TC_SHA256_DIGEST_SIZE); - - uECC_vli_nativeToBytes(pub_bytes, NUM_ECC_BYTES, pub); - uECC_vli_nativeToBytes(pub_bytes + NUM_ECC_BYTES, NUM_ECC_BYTES, - pub + NUM_ECC_WORDS); - - /* adapt return codes to match CAVP error: */ - if (0 != uECC_valid_public_key(pub_bytes, curve)) { - /* error 4 - Q changed */ - rc = 4; - } else { - uECC_vli_nativeToBytes(sig_bytes, NUM_ECC_BYTES, sig); - uECC_vli_nativeToBytes(sig_bytes + NUM_ECC_BYTES, NUM_ECC_BYTES, - sig + NUM_ECC_WORDS); - - rc = uECC_verify(pub_bytes, digest_bytes, sizeof(digest_bytes), sig_bytes, - uECC_secp256r1()); - /* CAVP expects 0 for success, others for fail */ - rc = !rc; - if (exp_rc != 0 && rc != 0) { - /* mimic CAVP code on errors. */ - rc = exp_rc; - } - } - - result = check_code(i, res_vec[i], exp_rc, rc, verbose); - if(result == TC_FAIL) { - goto exitTest1; - } - } - exitTest1: - TC_END_RESULT(result); - return result; -} - -int cavp_verify(bool verbose) -{ - - /* - * [P-256,SHA-256] - */ - char *Msg[] = { - "e4796db5f785f207aa30d311693b3702821dff1168fd2e04c0836825aefd850d9aa60326d8" - "8cde1a23c7745351392ca2288d632c264f197d05cd424a30336c19fd09bb229654f0222fcb" - "881a4b35c290a093ac159ce13409111ff0358411133c24f5b8e2090d6db6558afc36f06ca1" - "f6ef779785adba68db27a409859fc4c4a0", - "069a6e6b93dfee6df6ef6997cd80dd2182c36653cef10c655d524585655462d683877f95ec" - "c6d6c81623d8fac4e900ed0019964094e7de91f1481989ae1873004565789cbf5dc56c62ae" - "dc63f62f3b894c9c6f7788c8ecaadc9bd0e81ad91b2b3569ea12260e93924fdddd3972af52" - "73198f5efda0746219475017557616170e", - "df04a346cf4d0e331a6db78cca2d456d31b0a000aa51441defdb97bbeb20b94d8d746429a3" - "93ba88840d661615e07def615a342abedfa4ce912e562af714959896858af817317a840dcf" - "f85a057bb91a3c2bf90105500362754a6dd321cdd86128cfc5f04667b57aa78c112411e42d" - "a304f1012d48cd6a7052d7de44ebcc01de", - "e1130af6a38ccb412a9c8d13e15dbfc9e69a16385af3c3f1e5da954fd5e7c45fd75e2b8c36" - "699228e92840c0562fbf3772f07e17f1add56588dd45f7450e1217ad239922dd9c32695dc7" - "1ff2424ca0dec1321aa47064a044b7fe3c2b97d03ce470a592304c5ef21eed9f93da56bb23" - "2d1eeb0035f9bf0dfafdcc4606272b20a3", - "73c5f6a67456ae48209b5f85d1e7de7758bf235300c6ae2bdceb1dcb27a7730fb68c950b7f" - "cada0ecc4661d3578230f225a875e69aaa17f1e71c6be5c831f22663bac63d0c7a9635edb0" - "043ff8c6f26470f02a7bc56556f1437f06dfa27b487a6c4290d8bad38d4879b334e341ba09" - "2dde4e4ae694a9c09302e2dbf443581c08", - "666036d9b4a2426ed6585a4e0fd931a8761451d29ab04bd7dc6d0c5b9e38e6c2b263ff6cb8" - "37bd04399de3d757c6c7005f6d7a987063cf6d7e8cb38a4bf0d74a282572bd01d0f41e3fd0" - "66e3021575f0fa04f27b700d5b7ddddf50965993c3f9c7118ed78888da7cb221849b326059" - "2b8e632d7c51e935a0ceae15207bedd548", - "7e80436bce57339ce8da1b5660149a20240b146d108deef3ec5da4ae256f8f894edcbbc57b" - "34ce37089c0daa17f0c46cd82b5a1599314fd79d2fd2f446bd5a25b8e32fcf05b76d644573" - "a6df4ad1dfea707b479d97237a346f1ec632ea5660efb57e8717a8628d7f82af50a4e84b11" - "f21bdff6839196a880ae20b2a0918d58cd", - "1669bfb657fdc62c3ddd63269787fc1c969f1850fb04c933dda063ef74a56ce13e3a649700" - "820f0061efabf849a85d474326c8a541d99830eea8131eaea584f22d88c353965dabcdc4bf" - "6b55949fd529507dfb803ab6b480cd73ca0ba00ca19c438849e2cea262a1c57d8f81cd257f" - "b58e19dec7904da97d8386e87b84948169", - "3fe60dd9ad6caccf5a6f583b3ae65953563446c4510b70da115ffaa0ba04c076115c7043ab" - "8733403cd69c7d14c212c655c07b43a7c71b9a4cffe22c2684788ec6870dc2013f269172c8" - "22256f9e7cc674791bf2d8486c0f5684283e1649576efc982ede17c7b74b214754d70402fb" - "4bb45ad086cf2cf76b3d63f7fce39ac970", - "983a71b9994d95e876d84d28946a041f8f0a3f544cfcc055496580f1dfd4e312a2ad418fe6" - "9dbc61db230cc0c0ed97e360abab7d6ff4b81ee970a7e97466acfd9644f828ffec538abc38" - "3d0e92326d1c88c55e1f46a668a039beaa1be631a89129938c00a81a3ae46d4aecbf9707f7" - "64dbaccea3ef7665e4c4307fa0b0a3075c", - "4a8c071ac4fd0d52faa407b0fe5dab759f7394a5832127f2a3498f34aac287339e043b4ffa" - "79528faf199dc917f7b066ad65505dab0e11e6948515052ce20cfdb892ffb8aa9bf3f1aa5b" - "e30a5bbe85823bddf70b39fd7ebd4a93a2f75472c1d4f606247a9821f1a8c45a6cb80545de" - "2e0c6c0174e2392088c754e9c8443eb5af", - "0a3a12c3084c865daf1d302c78215d39bfe0b8bf28272b3c0b74beb4b7409db0718239de70" - "0785581514321c6440a4bbaea4c76fa47401e151e68cb6c29017f0bce4631290af5ea5e2bf" - "3ed742ae110b04ade83a5dbd7358f29a85938e23d87ac8233072b79c94670ff0959f9c7f45" - "17862ff829452096c78f5f2e9a7e4e9216", - "785d07a3c54f63dca11f5d1a5f496ee2c2f9288e55007e666c78b007d95cc28581dce51f49" - "0b30fa73dc9e2d45d075d7e3a95fb8a9e1465ad191904124160b7c60fa720ef4ef1c5d2998" - "f40570ae2a870ef3e894c2bc617d8a1dc85c3c55774928c38789b4e661349d3f84d2441a3b" - "856a76949b9f1f80bc161648a1cad5588e", - "76f987ec5448dd72219bd30bf6b66b0775c80b394851a43ff1f537f140a6e7229ef8cd72ad" - "58b1d2d20298539d6347dd5598812bc65323aceaf05228f738b5ad3e8d9fe4100fd767c2f0" - "98c77cb99c2992843ba3eed91d32444f3b6db6cd212dd4e5609548f4bb62812a920f6e2bf1" - "581be1ebeebdd06ec4e971862cc42055ca", - "60cd64b2cd2be6c33859b94875120361a24085f3765cb8b2bf11e026fa9d8855dbe435acf7" - "882e84f3c7857f96e2baab4d9afe4588e4a82e17a78827bfdb5ddbd1c211fbc2e6d884cddd" - "7cb9d90d5bf4a7311b83f352508033812c776a0e00c003c7e0d628e50736c7512df0acfa9f" - "2320bd102229f46495ae6d0857cc452a84", - }; - - char *Qx[] = { - "87f8f2b218f49845f6f10eec3877136269f5c1a54736dbdf69f89940cad41555", - "5cf02a00d205bdfee2016f7421807fc38ae69e6b7ccd064ee689fc1a94a9f7d2", - "2ddfd145767883ffbb0ac003ab4a44346d08fa2570b3120dcce94562422244cb", - "e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c", - "e0fc6a6f50e1c57475673ee54e3a57f9a49f3328e743bf52f335e3eeaa3d2864", - "a849bef575cac3c6920fbce675c3b787136209f855de19ffe2e8d29b31a5ad86", - "3dfb6f40f2471b29b77fdccba72d37c21bba019efa40c1c8f91ec405d7dcc5df", - "69b7667056e1e11d6caf6e45643f8b21e7a4bebda463c7fdbc13bc98efbd0214", - "bf02cbcf6d8cc26e91766d8af0b164fc5968535e84c158eb3bc4e2d79c3cc682", - "224a4d65b958f6d6afb2904863efd2a734b31798884801fcab5a590f4d6da9de", - "43691c7795a57ead8c5c68536fe934538d46f12889680a9cb6d055a066228369", - "9157dbfcf8cf385f5bb1568ad5c6e2a8652ba6dfc63bc1753edf5268cb7eb596", - "072b10c081a4c1713a294f248aef850e297991aca47fa96a7470abe3b8acfdda", - "09308ea5bfad6e5adf408634b3d5ce9240d35442f7fe116452aaec0d25be8c24", - "2d98ea01f754d34bbc3003df5050200abf445ec728556d7ed7d5c54c55552b6d", - }; - - char *Qy[] = { - "e15f369036f49842fac7a86c8a2b0557609776814448b8f5e84aa9f4395205e9", - "ec530ce3cc5c9d1af463f264d685afe2b4db4b5828d7e61b748930f3ce622a85", - "5f70c7d11ac2b7a435ccfbbae02c3df1ea6b532cc0e9db74f93fffca7c6f9a64", - "970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927", - "7f59d689c91e463607d9194d99faf316e25432870816dde63f5d4b373f12f22a", - "bf5fe4f7858f9b805bd8dcc05ad5e7fb889de2f822f3d8b41694e6c55c16b471", - "f22f953f1e395a52ead7f3ae3fc47451b438117b1e04d613bc8555b7d6e6d1bb", - "d3f9b12eb46c7c6fda0da3fc85bc1fd831557f9abc902a3be3cb3e8be7d1aa2f", - "069ba6cb06b49d60812066afa16ecf7b51352f2c03bd93ec220822b1f3dfba03", - "178d51fddada62806f097aa615d33b8f2404e6b1479f5fd4859d595734d6d2b9", - "f8790110b3c3b281aa1eae037d4f1234aff587d903d93ba3af225c27ddc9ccac", - "972570f4313d47fc96f7c02d5594d77d46f91e949808825b3d31f029e8296405", - "9581145cca04a0fb94cedce752c8f0370861916d2a94e7c647c5373ce6a4c8f5", - "f40c93e023ef494b1c3079b2d10ef67f3170740495ce2cc57f8ee4b0618b8ee5", - "9b52672742d637a32add056dfd6d8792f2a33c2e69dafabea09b960bc61e230a", - }; - - char *R[] = { - "d19ff48b324915576416097d2544f7cbdf8768b1454ad20e0baac50e211f23b0", - "dc23d130c6117fb5751201455e99f36f59aba1a6a21cf2d0e7481a97451d6693", - "9913111cff6f20c5bf453a99cd2c2019a4e749a49724a08774d14e4c113edda8", - "bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f", - "1d75830cd36f4c9aa181b2c4221e87f176b7f05b7c87824e82e396c88315c407", - "25acc3aa9d9e84c7abf08f73fa4195acc506491d6fc37cb9074528a7db87b9d6", - "548886278e5ec26bed811dbb72db1e154b6f17be70deb1b210107decb1ec2a5a", - "288f7a1cd391842cce21f00e6f15471c04dc182fe4b14d92dc18910879799790", - "f5acb06c59c2b4927fb852faa07faf4b1852bbb5d06840935e849c4d293d1bad", - "87b93ee2fecfda54deb8dff8e426f3c72c8864991f8ec2b3205bb3b416de93d2", - "8acd62e8c262fa50dd9840480969f4ef70f218ebf8ef9584f199031132c6b1ce", - "dfaea6f297fa320b707866125c2a7d5d515b51a503bee817de9faa343cc48eeb", - "09f5483eccec80f9d104815a1be9cc1a8e5b12b6eb482a65c6907b7480cf4f19", - "5cc8aa7c35743ec0c23dde88dabd5e4fcd0192d2116f6926fef788cddb754e73", - "06108e525f845d0155bf60193222b3219c98e3d49424c2fb2a0987f825c17959", - }; - - char *Result[] = { - "F (3 - S changed)", "F (2 - R changed)", "F (4 - Q changed)", - "P (0 )", "P (0 )", "F (2 - R changed)", - "F (4 - Q changed)", "F (1 - Message changed)", "F (3 - S changed)", - "F (2 - R changed)", "F (3 - S changed)", "F (1 - Message changed)", - "F (4 - Q changed)", "F (1 - Message changed)", "P (0 )", - }; - - char *S[] = { - "a3e81e59311cdfff2d4784949f7a2cb50ba6c3a91fa54710568e61aca3e847c6", - "d6ce7708c18dbf35d4f8aa7240922dc6823f2e7058cbc1484fcad1599db5018c", - "9467cd4cd21ecb56b0cab0a9a453b43386845459127a952421f5c6382866c5cc", - "17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c", - "cb2acb01dac96efc53a32d4a0d85d0c2e48955214783ecf50a4f0414a319c05a", - "9b21d5b5259ed3f2ef07dfec6cc90d3a37855d1ce122a85ba6a333f307d31537", - "e93bfebd2f14f3d827ca32b464be6e69187f5edbd52def4f96599c37d58eee75", - "247b3c4e89a3bcadfea73c7bfd361def43715fa382b8c3edf4ae15d6e55e9979", - "049dab79c89cc02f1484c437f523e080a75f134917fda752f2d5ca397addfe5d", - "4044a24df85be0cc76f21a4430b75b8e77b932a87f51e4eccbc45c263ebf8f66", - "cfca7ed3d4347fb2a29e526b43c348ae1ce6c60d44f3191b6d8ea3a2d9c92154", - "8f780ad713f9c3e5a4f7fa4c519833dfefc6a7432389b1e4af463961f09764f2", - "a4f90e560c5e4eb8696cb276e5165b6a9d486345dedfb094a76e8442d026378d", - "9c9c045ebaa1b828c32f82ace0d18daebf5e156eb7cbfdc1eff4399a8a900ae7", - "62b5cdd591e5b507e560167ba8f6f7cda74673eb315680cb89ccbc4eec477dce", - }; - - struct tc_sha256_state_struct sha256_ctx; - - printf("Test #2: ECDSAvrfy "); - printf("NIST-p256, SHA2-256\n"); - - return vrfy_vectors(&sha256_ctx, Msg, Qx, Qy, R, S, Result, 15, verbose); -} - -int montecarlo_signverify(int num_tests, bool verbose) -{ - printf("Test #3: Monte Carlo (%d Randomized EC-DSA signatures) ", num_tests); - printf("NIST-p256, SHA2-256\n "); - int i; - uint8_t private[NUM_ECC_BYTES]; - uint8_t public[2*NUM_ECC_BYTES]; - uint8_t hash[NUM_ECC_BYTES]; - unsigned int hash_words[NUM_ECC_WORDS]; - uint8_t sig[2*NUM_ECC_BYTES]; - - const struct uECC_Curve_t * curve = uECC_secp256r1(); - - for (i = 0; i < num_tests; ++i) { - if (verbose) { - TC_PRINT("."); - fflush(stdout); - } - - uECC_generate_random_int(hash_words, curve->n, BITS_TO_WORDS(curve->num_n_bits)); - uECC_vli_nativeToBytes(hash, NUM_ECC_BYTES, hash_words); - - if (!uECC_make_key(public, private, curve)) { - TC_ERROR("uECC_make_key() failed\n"); - return TC_FAIL; - } - - if (!uECC_sign(private, hash, sizeof(hash), sig, curve)) { - TC_ERROR("uECC_sign() failed\n"); - return TC_FAIL; - } - - if (!uECC_verify(public, hash, sizeof(hash), sig, curve)) { - TC_ERROR("uECC_verify() failed\n"); - return TC_FAIL; - } - if (verbose) { - fflush(stdout); - printf("."); - } - } - TC_PRINT("\n"); - return TC_PASS; -} - -int main() -{ - unsigned int result = TC_PASS; - - TC_START("Performing ECC-DSA tests:"); - /* Setup of the Cryptographically Secure PRNG. */ - uECC_set_rng(&default_CSPRNG); - - bool verbose = true; - - TC_PRINT("Performing cavp_sign test:\n"); - result = cavp_sign(verbose); - if (result == TC_FAIL) { /* terminate test */ - TC_ERROR("cavp_sign test failed.\n"); - goto exitTest; - } - TC_PRINT("Performing cavp_verify test:\n"); - result = cavp_verify(verbose); - if (result == TC_FAIL) { - TC_ERROR("cavp_verify test failed.\n"); - goto exitTest; - } - TC_PRINT("Performing montecarlo_signverify test:\n"); - result = montecarlo_signverify(10, verbose); - if (result == TC_FAIL) { - TC_ERROR("montecarlo_signverify test failed.\n"); - goto exitTest; - } - - TC_PRINT("\nAll ECC-DSA tests succeeded.\n"); - - exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); -} diff --git a/mcuboot/ext/tinycrypt/tests/test_ecc_utils.c b/mcuboot/ext/tinycrypt/tests/test_ecc_utils.c deleted file mode 100644 index 5c81eba3c..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_ecc_utils.c +++ /dev/null @@ -1,271 +0,0 @@ -/* test_ecc_utils.c - TinyCrypt common functions for ECC tests */ - -/* Copyright (c) 2014, Kenneth MacKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE.*/ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * test_ecc_utils.c -- Implementation of some common functions for ECC tests. - * - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -int hex2int (char hex) -{ - uint8_t dec; - - if ('0' <= hex && hex <= '9') dec = hex - '0'; - else if ('a' <= hex && hex <= 'f') dec = hex - 'a' + 10; - else if ('A' <= hex && hex <= 'F') dec = hex - 'A' + 10; - else return -1; - - return dec; -} - -/* - * Convert hex string to byte string - * Return number of bytes written to buf, or 0 on error - */ -int hex2bin(uint8_t *buf, const size_t buflen, const char *hex, - const size_t hexlen) -{ - - int dec; - - if (buflen < hexlen / 2 + hexlen % 2) - { - return false; - } - - /* if hexlen is uneven, insert leading zero nibble */ - if (hexlen % 2) - { - dec = hex2int(hex[0]); - if (dec == -1) - return false; - buf[0] = dec; - buf++; - hex++; - } - - /* regular hex conversion */ - for (size_t i = 0; i < hexlen / 2; i++) - { - dec = hex2int(hex[2 * i]); - if (dec == -1) - { - return false; - } - buf[i] = dec << 4; - - dec = hex2int(hex[ 2 * i + 1]); - if (dec == -1) - { - return false; - } - buf[i] += dec; - } - return hexlen / 2 + hexlen % 2; -} - -/* - * Convert hex string to zero-padded nanoECC scalar - */ -void string2scalar(unsigned int *scalar, unsigned int num_word32, char *str) -{ - - unsigned int num_bytes = 4 * num_word32; - uint8_t tmp[num_bytes]; - size_t hexlen = strlen(str); - - int padding; - - if (0 > (padding = 2 * num_bytes - strlen(str))) - { - printf("Error: 2 * num_bytes(%d) < strlen(hex) (%zu)\n", - 2 * num_bytes, strlen(str)); - exit(-1); - } - - memset(tmp, 0, padding / 2); - - if (false == hex2bin(tmp + padding / 2, num_bytes, str, hexlen)) - { - exit(-1); - } - uECC_vli_bytesToNative(scalar, tmp, num_bytes); - -} - -void vli_print_bytes(uint8_t *vli, unsigned int size) -{ - for(unsigned i = 0; i < size; ++i) - { - printf("%02X ", (unsigned)vli[i]); - } -} - -void print_ecc_scalar(const char *label, const unsigned int * p_vli, - unsigned int num_word32) -{ - unsigned int i; - - if (label) { - printf("%s = { ", label); - } - - for(i = 0; i < num_word32 - 1; ++i) { - printf("0x%08lX, ", (unsigned long)p_vli[i]); - } - printf("0x%08lX", (unsigned long)p_vli[i]); - - if (label) { - printf(" };\n"); - } -} - -int check_ecc_result(const int num, const char *name, - const unsigned int *expected, - const unsigned int *computed, - const unsigned int num_word32, const bool verbose) -{ - uint32_t num_bytes = 4 * num_word32; - if (memcmp(computed, expected, num_bytes)) { - TC_PRINT("\n Vector #%02d check %s - FAILURE:\n\n", num, name); - print_ecc_scalar("Expected", expected, num_word32); - print_ecc_scalar("Computed", computed, num_word32); - TC_PRINT("\n"); - return TC_FAIL; - } - if (verbose) { - TC_PRINT(" Vector #%02d check %s - success\n", num, name); - } - return TC_PASS; -} - -int check_code(const int num, const char *name, const int expected, - const int computed, const int verbose) -{ - - if (expected != computed) { - TC_ERROR("\n Vector #%02d check %s - FAILURE:\n", num, name); - TC_ERROR("\n Expected: %d, computed: %d\n\n", expected, computed); - return TC_FAIL; - } - - if (verbose) { - TC_PRINT(" Vector #%02d check %s - success (%d=%d)\n", num, name, - expected, computed); - } - - return TC_PASS; -} - -/* Test ecc_make_keys, and also as keygen part of other tests */ -int keygen_vectors(char **d_vec, char **qx_vec, char **qy_vec, int tests, - bool verbose) -{ - - unsigned int pub[2 * NUM_ECC_WORDS]; - unsigned int d[NUM_ECC_WORDS]; - unsigned int prv[NUM_ECC_WORDS]; - unsigned int result = TC_PASS; - - /* expected outputs (converted input vectors) */ - unsigned int exp_pub[2 * NUM_ECC_WORDS]; - unsigned int exp_prv[NUM_ECC_WORDS]; - - for (int i = 0; i < tests; i++) { - string2scalar(exp_prv, NUM_ECC_WORDS, d_vec[i]); - string2scalar(exp_pub, NUM_ECC_WORDS, qx_vec[i]); - string2scalar(exp_pub + NUM_ECC_WORDS, NUM_ECC_WORDS, qy_vec[i]); - - /* - * Feed prvkey vector as padded random seed into ecc_make_key. - * Internal mod-reduction will be zero-op and generate correct prv/pub - */ - memset(d, 0, NUM_ECC_WORDS); - string2scalar(d, NUM_ECC_WORDS, d_vec[i]); - - uint8_t pub_bytes[2*NUM_ECC_BYTES]; - uint8_t prv_bytes[NUM_ECC_BYTES]; - - uECC_make_key_with_d(pub_bytes, prv_bytes, d, uECC_secp256r1()); - - uECC_vli_bytesToNative(prv, prv_bytes, NUM_ECC_BYTES); - uECC_vli_bytesToNative(pub, pub_bytes, NUM_ECC_BYTES); - uECC_vli_bytesToNative(pub + NUM_ECC_WORDS, pub_bytes + NUM_ECC_BYTES, NUM_ECC_BYTES); - - /* validate correctness of vector conversion and make_key() */ - result = check_ecc_result(i, "prv ", exp_prv, prv, NUM_ECC_WORDS, verbose); - if (result == TC_FAIL) { - return result; - } - result = check_ecc_result(i, "pub.x", exp_pub, pub, NUM_ECC_WORDS, verbose); - if (result == TC_FAIL) { - return result; - } - result = check_ecc_result(i, "pub.y", exp_pub + NUM_ECC_WORDS, pub + NUM_ECC_WORDS, NUM_ECC_WORDS, verbose); - if (result == TC_FAIL) { - return result; - } - } - return result; -} diff --git a/mcuboot/ext/tinycrypt/tests/test_hmac.c b/mcuboot/ext/tinycrypt/tests/test_hmac.c deleted file mode 100644 index a41275e63..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_hmac.c +++ /dev/null @@ -1,362 +0,0 @@ -/* test_hmac.c - TinyCrypt implementation of some HMAC tests */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - DESCRIPTION - This module tests the following HMAC routines: - - Scenarios tested include: - - HMAC tests (RFC 4231 test vectors) -*/ - -#include -#include -#include -#include - -#include -#include -#include -#include - -unsigned int do_hmac_test(TCHmacState_t h, unsigned int testnum, const uint8_t *data, - size_t datalen, const uint8_t *expected, - size_t expectedlen) -{ - uint8_t digest[32]; - unsigned int result = TC_PASS; - - (void)tc_hmac_init(h); - (void)tc_hmac_update(h, data, datalen); - (void)tc_hmac_final(digest, TC_SHA256_DIGEST_SIZE, h); - result = check_result(testnum, expected, expectedlen, - digest, sizeof(digest)); - return result; -} - -/* - * NIST test vectors for encryption. - */ -unsigned int test_1(void) -{ - unsigned int result = TC_PASS; - - TC_PRINT("HMAC %s:\n", __func__); - - const uint8_t key[20] = { - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b - }; - const uint8_t data[8] = { - 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65 - }; - const uint8_t expected[32] = { - 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, - 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, - 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7 - }; - struct tc_hmac_state_struct h; - - (void)memset(&h, 0x00, sizeof(h)); - (void)tc_hmac_set_key(&h, key, sizeof(key)); - result = do_hmac_test(&h, 1, data, sizeof(data),expected, - sizeof(expected)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_2(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("HMAC %s:\n", __func__); - const uint8_t key[4] = { - 0x4a, 0x65, 0x66, 0x65 - }; - const uint8_t data[28] = { - 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, 0x79, 0x61, 0x20, 0x77, - 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68, - 0x69, 0x6e, 0x67, 0x3f - }; - const uint8_t expected[32] = { - 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26, - 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, - 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 - }; - struct tc_hmac_state_struct h; - - (void)memset(&h, 0x00, sizeof(h)); - (void)tc_hmac_set_key(&h, key, sizeof(key)); - - result = do_hmac_test(&h, 2, data, sizeof(data), expected, - sizeof(expected)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_3(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("HMAC %s:\n", __func__); - const uint8_t key[20] = { - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa - }; - const uint8_t data[50] = { - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd - }; - const uint8_t expected[32] = { - 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb, - 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, - 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe - }; - struct tc_hmac_state_struct h; - - (void)memset(&h, 0x00, sizeof(h)); - (void)tc_hmac_set_key(&h, key, sizeof(key)); - - result = do_hmac_test(&h, 3, data, sizeof(data), expected, - sizeof(expected)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_4(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("HMAC %s:\n", __func__); - - const uint8_t key[25] = { - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, - 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19 - }; - const uint8_t data[50] = { - 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, - 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, - 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, - 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, - 0xcd, 0xcd - }; - const uint8_t expected[32] = { - 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98, - 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, - 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b - }; - struct tc_hmac_state_struct h; - - (void)memset(&h, 0x00, sizeof(h)); - (void)tc_hmac_set_key(&h, key, sizeof(key)); - - result = do_hmac_test(&h, 4, data, sizeof(data), expected, - sizeof(expected)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_5(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("HMAC %s:\n", __func__); - const uint8_t key[20] = { - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c - }; - const uint8_t data[20] = { - 0x54, 0x65, 0x73, 0x74, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x54, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e - }; - const uint8_t expected[32] = { - 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0, 0x6e, 0x0c, 0x79, 0x6c, - 0x29, 0x55, 0x55, 0x2b, 0xfa, 0x6f, 0x7c, 0x0a, 0x6a, 0x8a, 0xef, 0x8b, - 0x93, 0xf8, 0x60, 0xaa, 0xb0, 0xcd, 0x20, 0xc5 - }; - struct tc_hmac_state_struct h; - - (void)memset(&h, 0x00, sizeof(h)); - (void)tc_hmac_set_key(&h, key, sizeof(key)); - - result = do_hmac_test(&h, 5, data, sizeof(data), expected, - sizeof(expected)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_6(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("HMAC %s:\n", __func__); - const uint8_t key[131] = { - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa - }; - const uint8_t data[54] = { - 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4c, - 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x54, 0x68, 0x61, 0x6e, 0x20, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x4b, 0x65, - 0x79, 0x20, 0x2d, 0x20, 0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79, - 0x20, 0x46, 0x69, 0x72, 0x73, 0x74 - }; - const uint8_t expected[32] = { - 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, - 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, - 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54 - }; - struct tc_hmac_state_struct h; - - (void)memset(&h, 0x00, sizeof(h)); - (void)tc_hmac_set_key(&h, key, sizeof(key)); - - result = do_hmac_test(&h, 6, data, sizeof(data), expected, - sizeof(expected)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_7(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("HMAC %s:\n", __func__); - const uint8_t key[131] = { - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa - }; - const uint8_t data[152] = { - 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, - 0x73, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c, - 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6b, 0x65, - 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, - 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x20, 0x54, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65, - 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62, - 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x4d, 0x41, 0x43, 0x20, 0x61, 0x6c, - 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x2e - }; - const uint8_t expected[32] = { - 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc, - 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, - 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2 - }; - struct tc_hmac_state_struct h; - - (void)memset(&h, 0x00, sizeof(h)); - (void)tc_hmac_set_key(&h, key, sizeof(key)); - - result = do_hmac_test(&h, 7, data, sizeof(data), expected, - sizeof(expected)); - TC_END_RESULT(result); - return result; -} - -/* - * Main task to test AES - */ -int main(void) -{ - unsigned int result = TC_PASS; - - TC_START("Performing HMAC tests (RFC4231 test vectors):"); - - result = test_1(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("HMAC test #1 failed.\n"); - goto exitTest; - } - result = test_2(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("HMAC test #2 failed.\n"); - goto exitTest; - } - result = test_3(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("HMAC test #3 failed.\n"); - goto exitTest; - } - result = test_4(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("HMAC test #4 failed.\n"); - goto exitTest; - } - result = test_5(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("HMAC test #5 failed.\n"); - goto exitTest; - } - result = test_6(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("HMAC #6 test failed.\n"); - goto exitTest; - } - result = test_7(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("HMAC test #7 failed.\n"); - goto exitTest; - } - - TC_PRINT("All HMAC tests succeeded!\n"); - -exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); -} diff --git a/mcuboot/ext/tinycrypt/tests/test_hmac_prng.c b/mcuboot/ext/tinycrypt/tests/test_hmac_prng.c deleted file mode 100644 index b45e984c4..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_hmac_prng.c +++ /dev/null @@ -1,135 +0,0 @@ -/* test_hmac_prng.c - TinyCrypt implementation of some HMAC-PRNG tests */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - DESCRIPTION - This module tests the following PRNG routines: - - Scenarios tested include: - - HMAC-PRNG init - - HMAC-PRNG reseed - - HMAC-PRNG generate) -*/ - -#include -#include -#include - -#include -#include -#include - -#define TC_DEBUG_MODE 0 - -#ifdef TC_DEBUG_MODE -void show(const char *label, const uint8_t *s, size_t len) -{ - unsigned int i; - printf ("%s = ", label); - for (i = 0; i < (unsigned int) len; ++i) { - printf ("%02x", s[i]); - } - printf ("\n"); -} - -void printBinaryFile(const uint8_t *s, unsigned int slen) -{ - FILE *write_ptr; - write_ptr = fopen("pseudo-random-data.bin","wb"); - fwrite(s, slen, 1, write_ptr); -} -#endif - -/* - * Main task to test AES - */ -int main(void) -{ - uint8_t seed[128]; - struct tc_hmac_prng_struct h; - unsigned int size = (1 << 19); - uint8_t random[size]; - unsigned int i; - unsigned int result = TC_PASS; - - TC_START("Performing HMAC-PRNG tests:"); - TC_PRINT("HMAC-PRNG test#1 (init, reseed, generate):\n"); - - /* Fake seed (replace by a a truly random seed): */ - for (i = 0; i < (unsigned int) sizeof(seed); ++i) { - seed[i] = i; - } - - /* Fake personalization and additional_input (replace by appropriate - * values): * - * e.g.: hostname+timestamp */ - uint8_t *personalization = (uint8_t *) "HOSTNAME"; - uint8_t *additional_input = (uint8_t *) "additional input"; - - TC_PRINT("HMAC-PRNG test#1 (init):\n"); - if (tc_hmac_prng_init(&h, personalization, - sizeof(personalization)) == 0) { - TC_ERROR("HMAC-PRNG initialization failed.\n"); - result = TC_FAIL; - goto exitTest; - } - TC_END_RESULT(result); - - TC_PRINT("HMAC-PRNG test#1 (reseed):\n"); - if (tc_hmac_prng_reseed(&h, seed, sizeof(seed), additional_input, - sizeof(additional_input)) == 0) { - TC_ERROR("HMAC-PRNG reseed failed.\n"); - result = TC_FAIL; - goto exitTest; - } - - TC_END_RESULT(result); - - TC_PRINT("HMAC-PRNG test#1 (generate):\n"); - if (tc_hmac_prng_generate(random, size, &h) < 1) { - TC_ERROR("HMAC-PRNG generate failed.\n"); - result = TC_FAIL; - goto exitTest; - } - TC_END_RESULT(result); - -#ifdef TC_DEBUG_MODE - printBinaryFile(random, size); - show ("Pseudo-random data", random, size); -#endif - - TC_PRINT("All HMAC tests succeeded!\n"); - - exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); -} diff --git a/mcuboot/ext/tinycrypt/tests/test_sha256.c b/mcuboot/ext/tinycrypt/tests/test_sha256.c deleted file mode 100644 index b309ed186..000000000 --- a/mcuboot/ext/tinycrypt/tests/test_sha256.c +++ /dev/null @@ -1,511 +0,0 @@ -/* test_sha256.c - TinyCrypt implementation of some SHA-256 tests */ - -/* - * Copyright (C) 2017 by Intel Corporation, All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - DESCRIPTION - This module tests the following SHA256 routines: - - Scenarios tested include: - - NIST SHA256 test vectors -*/ - -#include -#include -#include - -#include -#include -#include -#include - -/* - * NIST SHA256 test vector 1. - */ -unsigned int test_1(void) -{ - unsigned int result = TC_PASS; - - TC_PRINT("SHA256 test #1:\n"); - const uint8_t expected[32] = { - 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, - 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, - 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad - }; - const char *m = "abc"; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, (const uint8_t *) m, strlen(m)); - (void)tc_sha256_final(digest, &s); - result = check_result(1, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -/* - * NIST SHA256 test vector 2. - */ -unsigned int test_2(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #2:\n"); - const uint8_t expected[32] = { - 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93, - 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, - 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 - }; - const char *m = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, (const uint8_t *) m, strlen(m)); - (void) tc_sha256_final(digest, &s); - - result = check_result(2, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_3(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #3:\n"); - const uint8_t expected[32] = { - 0x68, 0x32, 0x57, 0x20, 0xaa, 0xbd, 0x7c, 0x82, 0xf3, 0x0f, 0x55, 0x4b, - 0x31, 0x3d, 0x05, 0x70, 0xc9, 0x5a, 0xcc, 0xbb, 0x7d, 0xc4, 0xb5, 0xaa, - 0xe1, 0x12, 0x04, 0xc0, 0x8f, 0xfe, 0x73, 0x2b - }; - const uint8_t m[1] = { 0xbd }; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, m, sizeof(m)); - (void)tc_sha256_final(digest, &s); - - result = check_result(3, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_4(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #4:\n"); - const uint8_t expected[32] = { - 0x7a, 0xbc, 0x22, 0xc0, 0xae, 0x5a, 0xf2, 0x6c, 0xe9, 0x3d, 0xbb, 0x94, - 0x43, 0x3a, 0x0e, 0x0b, 0x2e, 0x11, 0x9d, 0x01, 0x4f, 0x8e, 0x7f, 0x65, - 0xbd, 0x56, 0xc6, 0x1c, 0xcc, 0xcd, 0x95, 0x04 - }; - const uint8_t m[4] = { 0xc9, 0x8c, 0x8e, 0x55 }; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, m, sizeof(m)); - (void)tc_sha256_final(digest, &s); - - result = check_result(4, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_5(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #5:\n"); - - const uint8_t expected[32] = { - 0x02, 0x77, 0x94, 0x66, 0xcd, 0xec, 0x16, 0x38, 0x11, 0xd0, 0x78, 0x81, - 0x5c, 0x63, 0x3f, 0x21, 0x90, 0x14, 0x13, 0x08, 0x14, 0x49, 0x00, 0x2f, - 0x24, 0xaa, 0x3e, 0x80, 0xf0, 0xb8, 0x8e, 0xf7 - }; - uint8_t m[55]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)memset(m, 0x00, sizeof(m)); - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, m, sizeof(m)); - (void)tc_sha256_final(digest, &s); - - result = check_result(5, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_6(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #6:\n"); - const uint8_t expected[32] = { - 0xd4, 0x81, 0x7a, 0xa5, 0x49, 0x76, 0x28, 0xe7, 0xc7, 0x7e, 0x6b, 0x60, - 0x61, 0x07, 0x04, 0x2b, 0xbb, 0xa3, 0x13, 0x08, 0x88, 0xc5, 0xf4, 0x7a, - 0x37, 0x5e, 0x61, 0x79, 0xbe, 0x78, 0x9f, 0xbb - }; - uint8_t m[56]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)memset(m, 0x00, sizeof(m)); - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, m, sizeof(m)); - (void)tc_sha256_final(digest, &s); - - result = check_result(6, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_7(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #7:\n"); - const uint8_t expected[32] = { - 0x65, 0xa1, 0x6c, 0xb7, 0x86, 0x13, 0x35, 0xd5, 0xac, 0xe3, 0xc6, 0x07, - 0x18, 0xb5, 0x05, 0x2e, 0x44, 0x66, 0x07, 0x26, 0xda, 0x4c, 0xd1, 0x3b, - 0xb7, 0x45, 0x38, 0x1b, 0x23, 0x5a, 0x17, 0x85 - }; - uint8_t m[57]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)memset(m, 0x00, sizeof(m)); - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, m, sizeof(m)); - (void)tc_sha256_final(digest, &s); - - result = check_result(7, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_8(void) -{ - unsigned int result = TC_PASS; - - TC_PRINT("SHA256 test #8:\n"); - const uint8_t expected[32] = { - 0xf5, 0xa5, 0xfd, 0x42, 0xd1, 0x6a, 0x20, 0x30, 0x27, 0x98, 0xef, 0x6e, - 0xd3, 0x09, 0x97, 0x9b, 0x43, 0x00, 0x3d, 0x23, 0x20, 0xd9, 0xf0, 0xe8, - 0xea, 0x98, 0x31, 0xa9, 0x27, 0x59, 0xfb, 0x4b - }; - uint8_t m[64]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)memset(m, 0x00, sizeof(m)); - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, m, sizeof(m)); - (void)tc_sha256_final(digest, &s); - - result = check_result(8, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_9(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #9:\n"); - const uint8_t expected[32] = { - 0x54, 0x1b, 0x3e, 0x9d, 0xaa, 0x09, 0xb2, 0x0b, 0xf8, 0x5f, 0xa2, 0x73, - 0xe5, 0xcb, 0xd3, 0xe8, 0x01, 0x85, 0xaa, 0x4e, 0xc2, 0x98, 0xe7, 0x65, - 0xdb, 0x87, 0x74, 0x2b, 0x70, 0x13, 0x8a, 0x53 - }; - uint8_t m[1000]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)memset(m, 0x00, sizeof(m)); - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, m, sizeof(m)); - (void)tc_sha256_final(digest, &s); - - result = check_result(9, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_10(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #10:\n"); - const uint8_t expected[32] = { - 0xc2, 0xe6, 0x86, 0x82, 0x34, 0x89, 0xce, 0xd2, 0x01, 0x7f, 0x60, 0x59, - 0xb8, 0xb2, 0x39, 0x31, 0x8b, 0x63, 0x64, 0xf6, 0xdc, 0xd8, 0x35, 0xd0, - 0xa5, 0x19, 0x10, 0x5a, 0x1e, 0xad, 0xd6, 0xe4 - }; - uint8_t m[1000]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)memset(m, 0x41, sizeof(m)); - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, m, sizeof(m)); - (void)tc_sha256_final(digest, &s); - - result = check_result(10, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_11(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #11:\n"); - const uint8_t expected[32] = { - 0xf4, 0xd6, 0x2d, 0xde, 0xc0, 0xf3, 0xdd, 0x90, 0xea, 0x13, 0x80, 0xfa, - 0x16, 0xa5, 0xff, 0x8d, 0xc4, 0xc5, 0x4b, 0x21, 0x74, 0x06, 0x50, 0xf2, - 0x4a, 0xfc, 0x41, 0x20, 0x90, 0x35, 0x52, 0xb0 - }; - uint8_t m[1005]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - - (void)memset(m, 0x55, sizeof(m)); - - (void)tc_sha256_init(&s); - tc_sha256_update(&s, m, sizeof(m)); - (void)tc_sha256_final(digest, &s); - - result = check_result(11, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_12(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #12:\n"); - - const uint8_t expected[32] = { - 0xd2, 0x97, 0x51, 0xf2, 0x64, 0x9b, 0x32, 0xff, 0x57, 0x2b, 0x5e, 0x0a, - 0x9f, 0x54, 0x1e, 0xa6, 0x60, 0xa5, 0x0f, 0x94, 0xff, 0x0b, 0xee, 0xdf, - 0xb0, 0xb6, 0x92, 0xb9, 0x24, 0xcc, 0x80, 0x25 - }; - uint8_t m[1000]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - unsigned int i; - - (void)memset(m, 0x00, sizeof(m)); - - (void)tc_sha256_init(&s); - for (i = 0; i < 1000; ++i) { - tc_sha256_update(&s, m, sizeof(m)); - } - (void)tc_sha256_final(digest, &s); - - result = check_result(12, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_13(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #13:\n"); - const uint8_t expected[32] = { - 0x15, 0xa1, 0x86, 0x8c, 0x12, 0xcc, 0x53, 0x95, 0x1e, 0x18, 0x23, 0x44, - 0x27, 0x74, 0x47, 0xcd, 0x09, 0x79, 0x53, 0x6b, 0xad, 0xcc, 0x51, 0x2a, - 0xd2, 0x4c, 0x67, 0xe9, 0xb2, 0xd4, 0xf3, 0xdd - }; - uint8_t m[32768]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - unsigned int i; - - (void)memset(m, 0x5a, sizeof(m)); - - (void)tc_sha256_init(&s); - for (i = 0; i < 16384; ++i) { - tc_sha256_update(&s, m, sizeof(m)); - } - (void)tc_sha256_final(digest, &s); - - result = check_result(13, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -unsigned int test_14(void) -{ - unsigned int result = TC_PASS; - TC_PRINT("SHA256 test #14:\n"); - const uint8_t expected[32] = { - 0x46, 0x1c, 0x19, 0xa9, 0x3b, 0xd4, 0x34, 0x4f, 0x92, 0x15, 0xf5, 0xec, - 0x64, 0x35, 0x70, 0x90, 0x34, 0x2b, 0xc6, 0x6b, 0x15, 0xa1, 0x48, 0x31, - 0x7d, 0x27, 0x6e, 0x31, 0xcb, 0xc2, 0x0b, 0x53 - }; - uint8_t m[32768]; - uint8_t digest[32]; - struct tc_sha256_state_struct s; - unsigned int i; - - (void)memset(m, 0x00, sizeof(m)); - - (void) tc_sha256_init(&s); - for (i = 0; i < 33280; ++i) { - tc_sha256_update(&s, m, sizeof(m)); - } - (void) tc_sha256_final(digest, &s); - - result = check_result(14, expected, sizeof(expected), - digest, sizeof(digest)); - TC_END_RESULT(result); - return result; -} - -/* - * Main task to test AES - */ - -int main(void) -{ - unsigned int result = TC_PASS; - TC_START("Performing SHA256 tests (NIST tests vectors):"); - - result = test_1(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #1 failed.\n"); - goto exitTest; - } - result = test_2(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #2 failed.\n"); - goto exitTest; - } - result = test_3(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #3 failed.\n"); - goto exitTest; - } - result = test_4(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #4 failed.\n"); - goto exitTest; - } - result = test_5(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #5 failed.\n"); - goto exitTest; - } - result = test_6(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #6 failed.\n"); - goto exitTest; - } - result = test_7(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #7 failed.\n"); - goto exitTest; - } - result = test_8(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #8 failed.\n"); - goto exitTest; - } - result = test_9(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #9 failed.\n"); - goto exitTest; - } - result = test_10(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #10 failed.\n"); - goto exitTest; - } - result = test_11(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #11 failed.\n"); - goto exitTest; - } - result = test_12(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #12 failed.\n"); - goto exitTest; - } - /* memory and computation intensive test cases: */ - result = test_13(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #13 failed.\n"); - goto exitTest; - } - result = test_14(); - if (result == TC_FAIL) { - /* terminate test */ - TC_ERROR("SHA256 test #14 failed.\n"); - goto exitTest; - } - - TC_PRINT("All SHA256 tests succeeded!\n"); - -exitTest: - TC_END_RESULT(result); - TC_END_REPORT(result); -} - diff --git a/mcuboot/project.yml b/mcuboot/project.yml deleted file mode 100644 index 37f9ef135..000000000 --- a/mcuboot/project.yml +++ /dev/null @@ -1,31 +0,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. -# - -project.name: "mcuboot" - -project.repositories: - - apache-mynewt-core - -# Use github's distribution mechanism for core ASF libraries. -# This provides mirroring automatically for us. -repository.apache-mynewt-core: - type: github - vers: 0-dev - user: apache - repo: mynewt-core diff --git a/mcuboot/ptest/.gitignore b/mcuboot/ptest/.gitignore deleted file mode 100644 index 940967444..000000000 --- a/mcuboot/ptest/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target -.*.swp diff --git a/mcuboot/ptest/Cargo.lock b/mcuboot/ptest/Cargo.lock deleted file mode 100644 index 940c8089d..000000000 --- a/mcuboot/ptest/Cargo.lock +++ /dev/null @@ -1,406 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "aho-corasick" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "atty" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "autocfg" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "backtrace" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "backtrace-sys" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cc" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cfg-if" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "chrono" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "env_logger" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "failure" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "failure_derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.24 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "humantime" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lazy_static" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libc" -version = "0.2.47" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "linked-hash-map" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "log" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "memchr" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-integer" -version = "0.1.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-traits" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "num_cpus" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "proc-macro2" -version = "0.4.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ptest" -version = "0.1.0" -dependencies = [ - "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "std-semaphore 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "quick-error" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "quote" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "redox_syscall" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "std-semaphore" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "syn" -version = "0.15.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "synstructure" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.24 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "termcolor" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "termion" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "time" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ucd-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "utf8-ranges" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "wincolor" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "yaml-rust" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[metadata] -"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" -"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e5f34df7a019573fb8bdc7e24a2bfebe51a2a1d6bfdbaeccedb3c41fc574727" -"checksum backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b493b66e03090ebc4343eb02f94ff944e0cbc9ac6571491d170ba026741eb5" -"checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749" -"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" -"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" -"checksum env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afb070faf94c85d17d50ca44f6ad076bce18ae92f0037d350947240a36e9d42e" -"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" -"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" -"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" -"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" -"checksum libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "48450664a984b25d5b479554c29cc04e3150c97aa4c01da5604a2d4ed9151476" -"checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" -"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" -"checksum memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "db4c41318937f6e76648f42826b1d9ade5c09cafb5aef7e351240a70f39206e9" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a69d464bdc213aaaff628444e99578ede64e9c854025aa43b9796530afa9238" -"checksum proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "77619697826f31a02ae974457af0b29b723e5619e113e9397b8b82c6bd253f09" -"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c" -"checksum redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)" = "52ee9a534dc1301776eff45b4fa92d2c39b1d8c3d3357e6eb593e0d795506fc2" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" -"checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" -"checksum std-semaphore 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "33ae9eec00137a8eed469fb4148acd9fc6ac8c3f9b110f52cd34698c8b5bfa0e" -"checksum syn 0.15.24 (registry+https://github.com/rust-lang/crates.io-index)" = "734ecc29cd36e8123850d9bf21dfd62ef8300aaa8f879aabaa899721808be37c" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" -"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "95acf0db5515d07da9965ec0e0ba6cc2d825e2caeb7303b66ca441729801254e" diff --git a/mcuboot/ptest/Cargo.toml b/mcuboot/ptest/Cargo.toml deleted file mode 100644 index c63a30267..000000000 --- a/mcuboot/ptest/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "ptest" -version = "0.1.0" -authors = ["david.brown"] -edition = "2018" - -[dependencies] -chrono = "0.4" -env_logger = "0.6.0" -failure = "0.1.5" -log = "0.4.6" -num_cpus = "1.9" -regex = "1.1" -std-semaphore = "0.1" -yaml-rust = "0.4" diff --git a/mcuboot/ptest/src/main.rs b/mcuboot/ptest/src/main.rs deleted file mode 100644 index df8f155e0..000000000 --- a/mcuboot/ptest/src/main.rs +++ /dev/null @@ -1,300 +0,0 @@ -//! Parallel testing. -//! -//! mcuboot simulator is strictly single threaded, as there is a lock around running the C startup -//! code, because it contains numerous global variables. -//! -//! To help speed up testing, the Travis configuration defines all of the configurations that can -//! be run in parallel. Fortunately, cargo works well this way, and these can be run by simply -//! using subprocess for each particular thread. - -use chrono::Local; -use failure::format_err; -use log::{debug, error, warn}; -use regex::Regex; -use std::{ - collections::HashSet, - fs::{self, OpenOptions}, - io::{ErrorKind, stdout, Write}, - process::{Command, Output}, - result, - sync::{ - Arc, - Mutex, - }, - thread, - time::Duration, -}; -use std_semaphore::Semaphore; -use yaml_rust::{ - Yaml, - YamlLoader, -}; - -type Result = result::Result; - -fn main() -> Result<()> { - env_logger::init(); - - let travis_text = fs::read_to_string("../.travis.yml")?; - let travis = YamlLoader::load_from_str(&travis_text)?; - - let ncpus = num_cpus::get(); - let limiter = Arc::new(Semaphore::new(ncpus as isize)); - - let matrix = Matrix::from_yaml(&travis)?; - - let mut children = vec![]; - let state = State::new(matrix.envs.len()); - let st2 = state.clone(); - let _status = thread::spawn(move || { - loop { - thread::sleep(Duration::new(15, 0)); - st2.lock().unwrap().status(); - } - }); - for env in matrix.envs { - let state = state.clone(); - let limiter = limiter.clone(); - - let child = thread::spawn(move || { - let _run = limiter.access(); - state.lock().unwrap().start(&env); - let out = env.run(); - state.lock().unwrap().done(&env, out); - }); - children.push(child); - } - - for child in children { - child.join().unwrap(); - } - - println!(""); - - Ok(()) -} - -/// State, for printing status. -struct State { - running: HashSet, - done: HashSet, - total: usize, -} - -impl State { - fn new(total: usize) -> Arc> { - Arc::new(Mutex::new(State { - running: HashSet::new(), - done: HashSet::new(), - total: total, - })) - } - - fn start(&mut self, fs: &FeatureSet) { - let key = fs.textual(); - if self.running.contains(&key) || self.done.contains(&key) { - warn!("Duplicate: {:?}", key); - } - debug!("Starting: {} ({} running)", key, self.running.len() + 1); - self.running.insert(key); - self.status(); - } - - fn done(&mut self, fs: &FeatureSet, output: Result>) { - let key = fs.textual(); - self.running.remove(&key); - self.done.insert(key.clone()); - match output { - Ok(None) => { - // println!("Success {} ({} running)", key, self.running.len()); - } - Ok(Some(output)) => { - // Write the output into a file. - let mut count = 1; - let (mut fd, logname) = loop { - let name = format!("./failure-{:04}.log", count); - count += 1; - match OpenOptions::new() - .create_new(true) - .write(true) - .open(&name) - { - Ok(file) => break (file, name), - Err(ref err) if err.kind() == ErrorKind::AlreadyExists => continue, - Err(err) => { - error!("Unable to write log file to current directory: {:?}", err); - return; - } - } - }; - writeln!(&mut fd, "Test failure {}", key).unwrap(); - writeln!(&mut fd, "time: {}", Local::now().to_rfc3339()).unwrap(); - writeln!(&mut fd, "----------------------------------------").unwrap(); - writeln!(&mut fd, "stdout:").unwrap(); - fd.write_all(&output.stdout).unwrap(); - writeln!(&mut fd, "----------------------------------------").unwrap(); - writeln!(&mut fd, "\nstderr:").unwrap(); - fd.write_all(&output.stderr).unwrap(); - error!("Failure {} log:{:?} ({} running)", key, logname, - self.running.len()); - } - Err(err) => { - error!("Unable to run test {:?} ({:?})", key, err); - } - } - self.status(); - } - - fn status(&self) { - let running = self.running.len(); - let done = self.done.len(); - print!(" {} running ({}/{}/{} done)\r", running, done, running + done, self.total); - stdout().flush().unwrap(); - } -} - -/// The extracted configurations from the travis config -#[derive(Debug)] -struct Matrix { - envs: Vec, -} - -#[derive(Debug, Eq, Hash, PartialEq)] -struct FeatureSet { - // The environment variable to set. - env: String, - // The successive values to set it to. - values: Vec, -} - -impl Matrix { - fn from_yaml(yaml: &[Yaml]) -> Result { - let mut envs = vec![]; - - let mut all_tests = HashSet::new(); - - for y in yaml { - let m = match lookup_matrix(y) { - Some (m) => m, - None => continue, - }; - for elt in m { - if lookup_os(elt) == Some("linux") { - debug!("yaml: {:?}", lookup_env(elt)); - let env = match lookup_env(elt) { - Some (env) => env, - None => continue, - }; - - // Skip features not targeted to this build. - let fset = match FeatureSet::decode(env) { - Ok(fset) => fset, - Err(err) => { - warn!("Skipping: {:?}", err); - continue; - } - }; - debug!("fset: {:?}", fset); - - if false { - // Respect the groupings in the `.travis.yml` file. - envs.push(fset); - } else { - // Break each test up so we can run more in - // parallel. - let env = fset.env.clone(); - for val in fset.values { - if !all_tests.contains(&val) { - all_tests.insert(val.clone()); - envs.push(FeatureSet { - env: env.clone(), - values: vec![val], - }); - } else { - warn!("Duplicate: {:?}: {:?}", env, val); - } - } - } - } - } - } - - Ok(Matrix { - envs: envs, - }) - } -} - -impl FeatureSet { - fn decode(text: &str) -> Result { - // This is not general environment settings, but specific to the - // travis file. - let re = Regex::new(r#"^([A-Z_]+)="(.*)" TEST=sim$"#)?; - - match re.captures(text) { - None => Err(format_err!("Invalid line: {:?}", text)), - Some(cap) => { - let ename = &cap[1]; - let sep = if ename == "SINGLE_FEATURES" { ' ' } else { ',' }; - let values: Vec<_> = cap[2] - .split(sep) - .map(|s| s.to_string()) - .collect(); - debug!("name={:?} values={:?}", ename, values); - Ok(FeatureSet { - env: ename.to_string(), - values: values, - }) - } - } - } - - /// Run a test for this given feature set. Output is captured and will be returned if there is - /// an error. Each will be run successively, and the first failure will be returned. - /// Otherwise, it returns None, which means everything worked. - fn run(&self) -> Result> { - for v in &self.values { - let output = Command::new("bash") - .arg("./ci/sim_run.sh") - .current_dir("..") - .env(&self.env, v) - .output()?; - if !output.status.success() { - return Ok(Some(output)); - } - } - return Ok(None); - } - - /// Convert this feature set into a textual representation - fn textual(&self) -> String { - use std::fmt::Write; - - let mut buf = String::new(); - - write!(&mut buf, "{}:", self.env).unwrap(); - for v in &self.values { - write!(&mut buf, " {}", v).unwrap(); - } - - buf - } -} - -fn lookup_matrix(y: &Yaml) -> Option<&Vec> { - let matrix = Yaml::String("matrix".to_string()); - let include = Yaml::String("include".to_string()); - y.as_hash()?.get(&matrix)?.as_hash()?.get(&include)?.as_vec() -} - -fn lookup_os(y: &Yaml) -> Option<&str> { - let os = Yaml::String("os".to_string()); - - y.as_hash()?.get(&os)?.as_str() -} - -fn lookup_env(y: &Yaml) -> Option<&str> { - let env = Yaml::String("env".to_string()); - - y.as_hash()?.get(&env)?.as_str() -} diff --git a/mcuboot/repository.yml b/mcuboot/repository.yml deleted file mode 100644 index 11c17ff0c..000000000 --- a/mcuboot/repository.yml +++ /dev/null @@ -1,38 +0,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. -# - -repo.name: mcuboot -repo.submodules: "" -repo.versions: - "0.0.0": "master" - "0.9.0": "v0.9.0" - "1.0.0": "v1.0.0" - "1.1.0": "v1.1.0" - "1.2.0": "v1.2.0" - "1.3.0": "v1.3.0" - "1.3.1": "v1.3.1" - "1.4.0": "v1.4.0" - "1.5.0": "v1.5.0" - "1.6.0": "v1.6.0" - - "0-dev": "0.0.0" # master - "0-latest": "1.6.0" # latest stable release - "1-latest": "1.6.0" # latest stable release - - "1.0-latest": "1.6.0" diff --git a/mcuboot/root-ec-p256-pkcs8.pem b/mcuboot/root-ec-p256-pkcs8.pem deleted file mode 100644 index 42a1e0e51..000000000 --- a/mcuboot/root-ec-p256-pkcs8.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg15jVL4MBJDvTVCt+ -Ve1MdGEZALD5UFqCT+Ho7AY7z/GhRANCAAQqy0A86P7tW6RJlaGpHa7o274ZN80U -+y8kVzfllTmI2ZS51lrr183VMIrW/kiySmqBDuXwfYtoNMw6avxTjvrB ------END PRIVATE KEY----- diff --git a/mcuboot/root-ec-p256.pem b/mcuboot/root-ec-p256.pem deleted file mode 100644 index 2f4accfba..000000000 --- a/mcuboot/root-ec-p256.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEINeY1S+DASQ701QrflXtTHRhGQCw+VBagk/h6OwGO8/xoAoGCCqGSM49 -AwEHoUQDQgAEKstAPOj+7VukSZWhqR2u6Nu+GTfNFPsvJFc35ZU5iNmUudZa69fN -1TCK1v5IskpqgQ7l8H2LaDTMOmr8U476wQ== ------END EC PRIVATE KEY----- diff --git a/mcuboot/root-ed25519.pem b/mcuboot/root-ed25519.pem deleted file mode 100644 index 8bc718117..000000000 --- a/mcuboot/root-ed25519.pem +++ /dev/null @@ -1,3 +0,0 @@ ------BEGIN PRIVATE KEY----- -MC4CAQAwBQYDK2VwBCIEICjJcMmhqKi8d3hoYtLnbQ1DCitXyHz8N5BLy6rIdMvY ------END PRIVATE KEY----- diff --git a/mcuboot/root-rsa-2048.pem b/mcuboot/root-rsa-2048.pem deleted file mode 100644 index 78c0c3419..000000000 --- a/mcuboot/root-rsa-2048.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEA0QYIGhhELBjo+/33DaNPH7vuXvmq0ksY01rpbRiAGfnwnDQb -y/O8dNtC54x/EFN+Q14NVyxE0WcIDw27XO7ss5nf4E2EC6p3QWDtFShJpwG0PBDm -aYwvX6xBTZ5cFN/y+M89Hm/nW7q0qciIfkc8lMN3Z1RLqo04NcpiYX634RXbd3PU -vntyIYlpJPv4ZW5kPsgO14XVXErkUw0v/7f98xM5gz+jrtIPp2qd+f64zvoqvq+4 -4PqCN1T0PuEr0NMIWBj2XkzIiIExrV+wghfyimknI/Orhz6TGh3+6PgaJGZZ+Byr -3M5oG2ZkNez6DRGdr1w6p9FnxkfvsUssYuHRyQIDAQABAoIBAEahFCHFK1v/OtLT -eSSZl0Xw2dYr5QXULFpWsOOVUMv2QdB2ZyIehQKziEL3nYPlwpd+82EOa16awwVb -LYF0lnUFvLltV/4dJtjnqJTqnSCamc1mJIVrwiJA8XwJ07GWDuL2G//p7jJ3v05T -nZOV/KmD9xfqSvshZun+LgolqHqcrAa1f4cmuP9C9oqenZryljyfj7piaIZGI0JR -PrJJ5kImYJqRcMgKTyHP4L8nwQ4moMJr6zbfbWxxb5TC7KVZSQ9UKZZ+ZLuy/pkU -Qe4G8XSE0r+R9u4JCg87I1vgHhn8WJSxVX027OVUq5HfOzg2skQBTcExph5V9B2b -onNxd8UCgYEA/32PW+ZwRcdKXMj+QVkxXUd6xkXy7mTXPEaQuOLWZQgrSqAFH1l4 -5/6d099KAJrjM6kR8pKXtz72IIyMHTPm332ghymjKvaEl2XP9sF+f6FmYURar4y6 -8Zh3eivP86+Q/YzOGKwtRSziBMzrAfoIXgtwH8pwIPYLP3zBV4449ZsCgYEA0XC/ -gu2ub5M6EXBnjq9K2d4LlTyAPsIbAcMSwkhOUH4YJFS22qXLYQUA9zM+DUyLCrl/ -PKN2G0HQVgMb4DIbeHv8kXB5oGm5zfbWorWqOomXB3AsI7X8YDMtf/PsZV2amBei -qVskmPJQV21qFyeOcHlT+dHuRb0O0un3dK8RHmsCgYEApDCH4dJ80osZoflVVJ/C -VqTqJOOtFEFgBQ+AUCEPEQyn7aRaxmPUjJsXyKJVx3/ChV+g9hf5Qj1HJXHNVbMW -KwhsEpDSmHimizlV5clBxzntNpMcCHdTaJHILo5bbMqmThugE0ELMsp+UgFzAeky -WWXWX8fUOYqFff5prh/rQQMCgYBQQ8FhT+113Rp37HgDerJY5HvT6afMZV8sQbJC -uqsotepSohShnsBeoihIlF7HgfoXVhepCYwNzh8ll3NrbEiS2BFnO4+hJmOKx3pi -SPTAElLLCvYfiXL6+yII01ZZUpIYj5ZLCR7xbovTtZ7e2M4B1L2WFBoYp+eydO/c -y+rnmQKBgCh0gfyBT/OKPkfKv+Bbt8HcoxgEj+TyH+vYdeTbP9ZSJ6y5utMbPg7z -iLLbJ+9IcSwPCwJSmI+I0Om4xEp4ZblCrzAG7hWvG2NNzxQjmoOOrAANyTvJR/ap -N+UkQA4WrMSKEYyBlRS/hR9Unz31vMc2k9Re0ukWhWh/QksQGDfJ ------END RSA PRIVATE KEY----- diff --git a/mcuboot/root-rsa-3072.pem b/mcuboot/root-rsa-3072.pem deleted file mode 100644 index 3a3b32903..000000000 --- a/mcuboot/root-rsa-3072.pem +++ /dev/null @@ -1,39 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIG5AIBAAKCAYEAtCwOmFgQpKdYmXwB3QgqKDQz+JYaNCBdRchxJiXl0pbqe7EV -qqaKYyKLLU6Bc79uFWiMGvTvKo+MIp5xV0veD35y03q4px1ErYcAg1z9cwVyRj+L -+RAA2G7Mhe35Sdt4NoBJOHbdX1QE2ow0pysTJW/RFU+twuGl0k5XDH6cm7pOaLLg -JQKqANO0zC945b5HZx/IbiJsXmG2ms3lqLp6gBMbFy6W7c+zm+Qc6K2n9jpRZl6Z -jofuYCX4jb7OpKjKk2zXv9RzM41EhcxzMAicTbKqWmxve6u3s3zD++fKxPiab8u7 -W4LneugZ/S8RIvt/doxrlKQJT6Vqd1Hrp37ahwbu3L7R6hpAHRv/GrFRfBKw8/aD -AZznDJm/rGhYcqSwWYXuhawqIvTPFQiAHw3QHqCglMj3+mXdUuiWNyMwVzbmnfQM -SgV1H60ByrdtjEN0BgqB8wFi//f1X6/nKw74gbVl3QHZnwcXihjPI26IZZG1e9Ow -La+TZmN0rFrmc947AgMBAAECggGBAJjDTjCvYpUo6r9gXHgbZxslf/dC1b7ivhLf -68gLk/xlRzVPJW7GvElnzZfBm5MXeXAfb8Ofb3WntorXyoPY6NQ8Q4G56PyQnV2A -PNgkrSSsNoMHeFfZ0M2xzCm2Z4rO0fNr/Ckq53HfXCotfKtMo3Q3hZDLOSomhqF1 -GOuYIpMLeVXebJwU0S3YUtBZY+lv1zzBvwBaoYW41coVz6arThhvmqWiNAg49jG0 -TSqfquzj74abqRkned798uvEH5OPJJ6r/7HrjbSan2HfhiQgWebR6NV5xtmAy//2 -iuNqrm9e1Qrinjo1teHP63hzGQbk9HzXdIzMmw83vHOppFmteOCSxJIxJ2h4RlsV -ln/7O5N4jAhdpqu/5AWBlWHefEsWvxfGUwmBdtxF0M4p+Z5qGIIX/WGHx+Eg9qsP -1NhnMhQ8DJjCPNzej7dmsiHcICsI/SJ84Xby5KlG8OJbsYSpzyd4/PD789VXSTK/ -BwIN3IZsWhNw1G7AOfzch86fXNpCoQKBwQDlvyQII6M8etnZMYGFNKDxpcRahrF4 -znENW3IDsm41044oy+qv8fR7NFI+88xcbm/zzQ+oz4FGAcTNfUa1JAII/h1oJx7Q -eAFytlGq41cxnGfVGSemmpEOgZqzWVneFnZ8s/81sq35/OzpQ+pKgTN8SYgjySQb -f5pJECHV3oaX6g/DZcEU6JngYWyG4gAovBph/EXaPn3saHUo7u75yD6HnLxcxa4C -//Zs9NOHmRDxW1AFq6c9qqHjAwiwoWz/1PECgcEAyMKx1WjcdW7AU4TmMoWY7dwc -ginhBzEne7z5hgnabsnFaudRpAix/IBT0G0/lDEBXja+j8V56Jy7xCVLmJi044nj -fzCn0bbtOHOE3BztGP7eWRODN+2u/V9xk6v7y4R7NOLzE7+1/SupaYWW5uQo9Z1v -CamU7MuIXq6b9BS3HD8vS9IpeDQIJKQ9G0NIRN9naLwyfLk0EXBDqE0VlXWusDi8 -B9W5ZQ0l9dY2XLCx8Gx7Foc8UA85EvivtfpC3bXrAoHACywfYXHyNze2LlS0+rhT -d0zbXpecO8a2QrMGuV1M9Lsj96Hq+MFoZTFnKn6KmpgYQ5/eOhRVMgVV/7Qu4xIs -MynAXldArVyYnW52TDwf+l6jwf4mKnjrwuvUjRI0R5OKEYhjScY1pamCD9noo9Ti -nxGoWC0o31l2NEVfj9nxa6PLPnJNUGn7SakTMP/+h/yVv9wXvYQ6dWui/umXn3f4 -annZwx0t2CGAZ04El1x/MW2CV7RAPsR0eOil3IkNFufRAoHAVDtj879oaBkMtr4W -+3GURZBJoc9CbAsSntcd9kAiFsOvgfgGCAXh76hEAjokJ+Aby9S6RYY8bP19xoFD -Y4YGt0U+Xzoh31qZ00qcnuHAFPGyhrsqHggqmII4HBZXsf8m1ny2Mj4IdG2iSfTT -6JIoIU1prispoeSPlfI62sDqRv63sF9AKP/jvsPuI4cqRkNZltcHc88c6ogoyu90 -s93JaoSTV9IzVBOdLrUu39r+/Xn2dvBMvOZ2MuCGkJqs/Wr7AoHBAL1k1bH0+xs3 -sMQjxXyo5CYe5fmi1y8Gnt05kivgvGaGPLIb2lG8JRfIhasO04DrvxnW5EBiap6s -rtAF+MU55/EjXn97fs1TvDRwZ2/SJRCACHepFnXrPMz1dBBe8IG7s8Ai5WTDuVbb -7T4/8fwSrqAnIF7oQwHFwlpDnFGUJLZCJ/+H/jjcn2TgTnGIENTwlSIofhcWT+Ot -GtlLLU4J6+l07vVfueEofoJMfqWjDUpOr3FmnP+K2drZWFnzv/3Rgg== ------END RSA PRIVATE KEY----- diff --git a/mcuboot/samples/mcuboot_config/mcuboot_config.template.h b/mcuboot/samples/mcuboot_config/mcuboot_config.template.h deleted file mode 100644 index 3038a93bb..000000000 --- a/mcuboot/samples/mcuboot_config/mcuboot_config.template.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2018 Open Source Foundries Limited - * Copyright (c) 2019 Arm 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 - */ - -/* - * 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 */ - - -/* - * 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. - */ - -/* Uncomment to enable the overwrite-only code path. */ -/* #define MCUBOOT_OVERWRITE_ONLY */ - -#ifdef MCUBOOT_OVERWRITE_ONLY -/* Uncomment to only erase and overwrite those primary slot sectors needed - * to install the new image, rather than the entire image slot. */ -/* #define MCUBOOT_OVERWRITE_ONLY_FAST */ -#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 the primary slot 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. */ -/* #define MCUBOOT_USE_FLASH_AREA_GET_SECTORS */ - -/* Default maximum number of flash sectors per image slot; change - * as desirable. */ -#define MCUBOOT_MAX_IMG_SECTORS 128 - -/* Default number of separately updateable images; change in case of - * multiple images. */ -#define MCUBOOT_IMAGE_NUMBER 1 - -/* - * Logging - */ - -/* - * If logging is enabled the following functions must be defined by the - * platform: - * - * MCUBOOT_LOG_MODULE_REGISTER(domain) - * Register a new log module and add the current C file to it. - * - * MCUBOOT_LOG_MODULE_DECLARE(domain) - * Add the current C file to an existing log module. - * - * MCUBOOT_LOG_ERR(...) - * MCUBOOT_LOG_WRN(...) - * MCUBOOT_LOG_INF(...) - * MCUBOOT_LOG_DBG(...) - * - * The function priority is: - * - * MCUBOOT_LOG_ERR > MCUBOOT_LOG_WRN > MCUBOOT_LOG_INF > MCUBOOT_LOG_DBG - */ -#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 */ - -/* - * Watchdog feeding - */ - -/* This macro might be implemented if the OS / HW watchdog is enabled while - * doing a swap upgrade and the time it takes for a swapping is long enough - * to cause an unwanted reset. If implementing this, the OS main.c must also - * enable the watchdog (if required)! - * - * #define MCUBOOT_WATCHDOG_FEED() - * do { do watchdog feeding here! } while (0) - */ - -#endif /* __MCUBOOT_CONFIG_H__ */ diff --git a/mcuboot/samples/zephyr/.gitignore b/mcuboot/samples/zephyr/.gitignore deleted file mode 100644 index a8a0dcec4..000000000 --- a/mcuboot/samples/zephyr/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.bin diff --git a/mcuboot/samples/zephyr/Makefile b/mcuboot/samples/zephyr/Makefile deleted file mode 100644 index ab5c97509..000000000 --- a/mcuboot/samples/zephyr/Makefile +++ /dev/null @@ -1,290 +0,0 @@ -########################################################################### -# Sample multi-part application Makefile -# -# Copyright (c) 2017 Linaro Limited -# Copyright (c) 2017 Open Source Foundries Limited -# -# 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 is an example Makefile to demonstrate how to use mcuboot to -# deploy and upgrade images. The image building should work on any -# supported target, however flashing will likely require changes to -# the flash addresses, depending on the partition layout of the device -# in question. -# -# running -# -# make BOARD=frdm_k64f all -# -# should generate three "*.bin" files in this directory: -# -# mcuboot.bin: The bootloader itself -# signed-hello1.bin: A signed sample. -# signed-hello2.bin: An upgrade image, signed and marked for -# upgrade. -# -# "make flash_boot" should flash the bootloader into the flash, -# erasing the rest of the device. If you examine the device at this -# time, you should see a message about the bootloader not being able -# to find a bootable image. -# -# "make flash_hello1" will then flash the first application into the -# "primary slot". This should boot into this app, print a small message, and -# give the zephyr console. -# -# "make flash_hello2" will flash hello2 into the "secondary slot". The -# reset should upgrade and run the new image. Resetting again should -# then revert back to the first app, since we did not mark this image -# as good. - -# Extra .conf fragments to merge into the MCUboot .config, as a -# semicolon-separated list (i.e., a CMake list). -BOOTLOADER_OVERLAY_CONFIG ?= - -BOARD ?= frdm_k64f - -.PHONY: check boot hello1 clean_boot clean_hello1 \ - hello2 clean_hello2 flash_boot flash_hello1 flash_hello2 - -# For signing, use the default RSA demo key, to match the default in -# the mcuboot Makefile. -SIGNING_KEY ?= ../../root-rsa-2048.pem - -# The header size should match that in hello1/prj.conf -# CONFIG_TEXT_SECTION_OFFSET. This value needs to be a power of two -# that is at least as large as the size of the vector table. The -# value given here of 0x200 should be sufficient for any supported -# devices, but it can be made smaller, as long as this value matches -# that used to build the app. -BOOT_HEADER_LEN = 0x200 - -# For upgrades, the signing tool needs to know the device alignment. -# This requirement will be going away soon. -FLASH_ALIGNMENT = 8 - -IMGTOOL = ../../scripts/imgtool.py -ASSEMBLE = ../../scripts/assemble.py -PYOCD = pyocd - -SOURCE_DIRECTORY := $(CURDIR) -BUILD_DIRECTORY := $(CURDIR)/build/$(BOARD) -BUILD_DIR_BOOT := $(BUILD_DIRECTORY)/mcuboot -BUILD_DIR_HELLO1 := $(BUILD_DIRECTORY)/hello1 -BUILD_DIR_HELLO2 := $(BUILD_DIRECTORY)/hello2 - -help: - @echo "make BOARD=" - @echo ": all, boot, hello1, full.bin" - @echo ": frdm_k64f only for now" - -all: boot hello1 hello2 - -full.bin: boot hello1 hello2 - $(ASSEMBLE) -b $(BUILD_DIR_BOOT) \ - -p signed-hello1.bin \ - -s signed-hello2.bin \ - -o full.bin - -clean: clean_boot clean_hello1 clean_hello2 - @rm -f signed-hello1.bin - @rm -f signed-hello2.bin - @rm -f mcuboot.bin - -boot: check - @rm -f mcuboot.bin - (mkdir -p $(BUILD_DIR_BOOT) && \ - cd $(BUILD_DIR_BOOT) && \ - cmake -DOVERLAY_CONFIG=$(BOOTLOADER_OVERLAY_CONFIG) \ - -G"Ninja" \ - -DBOARD=$(BOARD) \ - $(SOURCE_DIRECTORY)/../../boot/zephyr && \ - ninja) - cp $(BUILD_DIR_BOOT)/zephyr/zephyr.bin mcuboot.bin - -clean_boot: check - rm -rf $(BUILD_DIR_BOOT) - -# Build and sign "hello1". -hello1: check - (mkdir -p $(BUILD_DIR_HELLO1) && \ - cd $(BUILD_DIR_HELLO1) && \ - cmake -DFROM_WHO=hello1 \ - -G"Ninja" \ - -DBOARD=$(BOARD) \ - $(SOURCE_DIRECTORY)/hello-world && \ - ninja) - $(IMGTOOL) sign \ - --key $(SIGNING_KEY) \ - --header-size $(BOOT_HEADER_LEN) \ - --align $(FLASH_ALIGNMENT) \ - --version 1.2 \ - --slot-size 0x60000 \ - $(BUILD_DIR_HELLO1)/zephyr/zephyr.bin \ - signed-hello1.bin - -clean_hello1: check - rm -rf $(BUILD_DIR_HELLO1) - -# Build and sign "hello2". -# This is the same signing command as above, except that it adds the -# "--pad" argument. This will also add the trailer that indicates -# this image is intended to be an upgrade. It should be flashed into -# the secondary slot instead of the primary slot. -hello2: check - (mkdir -p $(BUILD_DIR_HELLO2) && \ - cd $(BUILD_DIR_HELLO2) && \ - cmake -DFROM_WHO=hello2 \ - -G"Ninja" \ - -DBOARD=$(BOARD) \ - $(SOURCE_DIRECTORY)/hello-world && \ - ninja) - $(IMGTOOL) sign \ - --key $(SIGNING_KEY) \ - --header-size $(BOOT_HEADER_LEN) \ - --align $(FLASH_ALIGNMENT) \ - --version 1.2 \ - --slot-size 0x60000 \ - --pad \ - $(BUILD_DIR_HELLO2)/zephyr/zephyr.bin \ - signed-hello2.bin - -clean_hello2: check - rm -rf $(BUILD_DIR_HELLO2) - -# These flash_* targets use pyocd to flash the images. The addresses -# are hardcoded at this time. - -flash_boot: - $(PYOCD) flash -e chip -a 0 mcuboot.bin - -flash_hello1: - $(PYOCD) flash -a 0x20000 signed-hello1.bin - -flash_hello2: - $(PYOCD) flash -a 0x80000 signed-hello2.bin - -flash_full: - $(PYOCD) flash -e chip -a 0 full.bin - -# These test- targets reinvoke make with the configuration set to test -# various configurations. This will generally be followed by using -# the above flash targets. - -# Test a good image, with a good upgrade, using RSA signatures. -# flash_boot: Unable to find bootable image -# flash_hello1: hello1 runs -# flash_hello2: hello2 runs -# reset: hello1 runs -test-good-rsa: clean - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-rsa.conf \ - all - -# Test a good image, with a good upgrade, using ECDSA signatures. -# flash_boot: Unable to find bootable image -# flash_hello1: hello1 runs -# flash_hello2: hello2 runs -# reset: hello1 runs -test-good-ecdsa: clean - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-ecdsa-p256.conf \ - SIGNING_KEY=../../root-ec-p256.pem \ - all - -# Test (with RSA) that overwrite-only works. This should boot, -# upgrade correctly, but not revert once the upgrade has been done. -# flash_boot: Unable to find bootable image -# flash_hello1: hello1 runs -# flash_hello2: hello2 runs -# reset: hello2 runs -test-overwrite: clean - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-upgrade-only.conf \ - all - -# Test that when configured for RSA, a wrong signature in the upgrade -# image will fail to upgrade. -# flash_boot: Unable to find bootable image -# flash_hello1: hello1 runs -# flash_hello2: hello1 runs -# reset: hello1 runs -test-bad-rsa-upgrade: clean - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-rsa.conf \ - boot hello1 - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-rsa.conf \ - SIGNING_KEY=../../root-ec-p256.pem \ - hello2 - -# Test that when configured for ECDSA, a wrong signature in the upgrade -# image will fail to upgrade. -# flash_boot: Unable to find bootable image -# flash_hello1: hello1 runs -# flash_hello2: hello1 runs -# reset: hello1 runs -test-bad-ecdsa-upgrade: clean - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-ecdsa-p256.conf \ - SIGNING_KEY=../../root-ec-p256.pem \ - boot hello1 - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-ecdsa-p256.conf \ - SIGNING_KEY=../../root-rsa-2048.pem \ - hello2 - -# Test that when configured to not validate the primary slot, we still boot, but -# don't upgrade. -# flash_boot: tries to boot and resets -# flash_hello1: hello1 runs -# flash_hello2: hello1 runs -# reset: hello1 runs -test-no-bootcheck: clean - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-skip-primary-slot-validate.conf \ - SIGNING_KEY=../../root-ec-p256.pem \ - all - -# Test a good image, with a wrong-signature upgrade, using RSA signatures. -# flash_boot: Unable to find bootable image -# flash_hello1: hello1 runs -# flash_hello2: hello1 runs -# reset: hello1 runs -test-wrong-rsa: clean - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-rsa.conf \ - boot hello1 - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-rsa.conf \ - SIGNING_KEY=bad-keys/bad-rsa-2048.pem \ - hello2 - -# Test a good image, with a wrong-signature upgrade, using ECDSA signatures. -# flash_boot: Unable to find bootable image -# flash_hello1: hello1 runs -# flash_hello2: hello1 runs -# reset: hello1 runs -test-wrong-ecdsa: clean - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-ecdsa-p256.conf \ - SIGNING_KEY=../../root-ec-p256.pem \ - boot hello1 - $(MAKE) \ - BOOTLOADER_OVERLAY_CONFIG=$(PWD)/overlay-ecdsa-p256.conf \ - SIGNING_KEY=bad-keys/bad-ec-p256.pem \ - hello2 - -check: - @if [ -z "$$ZEPHYR_BASE" ]; then echo "Zephyr environment not set up"; false; fi - @if [ -z "$(BOARD)" ]; then echo "You must specify BOARD="; false; fi diff --git a/mcuboot/samples/zephyr/README.md b/mcuboot/samples/zephyr/README.md deleted file mode 100644 index b19a0a907..000000000 --- a/mcuboot/samples/zephyr/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Zephyr sample application. - -In order to successfully deploy an application using mcuboot, it is -necessary to build at least one other binary: the application itself. -It is beyond the scope of this documentation to describe what an -application is able to do, however a working example is certainly -useful. - -Please see the comments in the Makefile in this directory for more -details on how to build and test this application. - -Note that this sample uses the "ninja" build tool, which can be -installed on most systems using the system package manager, e.g., for -a Debian-based distro: - -``` -$ sudo apt-get install ninja -``` - -or in Fedora: - -``` -$ sudo dnf install ninja -``` diff --git a/mcuboot/samples/zephyr/bad-keys/README.md b/mcuboot/samples/zephyr/bad-keys/README.md deleted file mode 100644 index 621ce9635..000000000 --- a/mcuboot/samples/zephyr/bad-keys/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Bad keys for testing - -This directory contains some alternate keys that can be used for -testing. Signing the images with either of these keys, but leaving -the demo keys's public keys in the bootloader should result in it not -upgrading, or not booting. diff --git a/mcuboot/samples/zephyr/bad-keys/bad-ec-p256.pem b/mcuboot/samples/zephyr/bad-keys/bad-ec-p256.pem deleted file mode 100644 index 333f41f91..000000000 --- a/mcuboot/samples/zephyr/bad-keys/bad-ec-p256.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEILmqmiH6y3EGhLkTcnNtU7hZ1wnc51MIL53npseRX7vJoAoGCCqGSM49 -AwEHoUQDQgAEcX9ExNjZfsckp6AdutjPjVJsvP6ZZkKfLsGnRpKR+9OpO9/qmJHs -ks+ZXo70SEANjWnNlxKNAVci8aUm8UskLw== ------END EC PRIVATE KEY----- diff --git a/mcuboot/samples/zephyr/bad-keys/bad-rsa-2048.pem b/mcuboot/samples/zephyr/bad-keys/bad-rsa-2048.pem deleted file mode 100644 index 755f95bca..000000000 --- a/mcuboot/samples/zephyr/bad-keys/bad-rsa-2048.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAzXhCIc6kig0DRWEyKj4N8v/bfvh/RmU73Jo0Z0RAFSLnFrE5 -5W5C9tsdDalhN5HV7xBQCzr7GSW1C6MNvtw/lVr4+x4LvgwYD6kl+9IZc5udPIJ1 -R7aLBP2o4r6rJWtCj9Y6bifsMlVkHCONIHDGhp3bSl+9C2EqfwqJENg3mHYyZcbr -kBfLhILE24T+MhxkPZiI3Ox6XthwT7Is8ZCXF6VCYaK6N8jXAXz8OiEhIpMl3Z3m -DqxaM0ovSXfXvOfMeKN76iI9m8S4JnPbuzu+/5GdSnNbIxoluzXU7e52FoKgthNM -2mArAak5x3IqsStY0qDCODSlNnSha9+jfk8ULwIDAQABAoIBAQC7Z6dx7GdY3vuP -yVIXA1h3vfP2gDKeA3GxCRko4zBL1vTNVsJGx+XeAAYk0suwAp0NGmTXiWlDC4hw -37yGy55W3I3hhQsSwTck+ZOCdqPuNQ4aBadwzEdKOw5SGbRCQe2JAc1zcYhWdFoF -7EspPpNkbxB3apEjkvFOxE42Be/XZrwxig1OQJ9DpOhTeV8+jljg6aSzOuQxdR4G -ZXTzACnb20jnefnwmC5lhZxRWYEXkc96onYIvrDpIMdTzTnTbshJjg5HNPOEEgpF -U1x2iCRB3tN9QHbzdH/XrnRBr9Yy62SUIDXf4LBqin/pRQPodh9ZM7zanrhzsuiy -Tro2WKhRAoGBANoAT73haGrUb9ZSdzpu5qOD0eaQZPCIlubRrT5BCXPS2xVIGe+g -eDaBljdlXDJnKvBqjOVQyU7lrZAIVWgz6qD1HNIQZI30WivXejL4GeoXnAnp/ohh -1QmjMVvlcGe/22jpDmJa3Qgm4leaUxnxxilO/pQlZzzndBP88Df4/hIJAoGBAPFI -xBRq0SdBWhSydeEFvm8n37/icrN+V9f/Ka9tbPZcJaowzqQPrAHtu2CBD1JVyo2G -sKxFy867vCHntFu8zq2KSpCPVyeR+pDvwknr9PDm+DiLScBCGdyKqjBazT5+mHzP -fKk6nRV8uoNXLZQtnqKJzN61bYrnFaOQx6GZM6J3AoGAUHqA9bY7GAUo7FQxU88R -Mhg96wIvYWTrYHbToAHefXXAD1E40e/JsUWRsQ2oRas0fOC49wcl6gx8UInjDb7s -xVL3usz2cjlc+IZpxFs3JeZlYnuRzcNgJFispiJDpul7FHXFK6YjpxjDwldkilVp -NGLHNOXCAQfpIF/mRqOTGBECgYAmb7kMp5d58WcwNN2iYw/bFTcHkkNDZLUJq5Qw -ZfYdqMA3RF8ms3hrNjvLO8P9Eb2angI270dwP2fQ3uBUXNdvvb/zF2KC4zZPMGJ6 -9COo3KJeH5I4Fk+YWl6SJWTct74C4+qv6q5rZdswYQrZuAq1Sc5hC/XPUtCXpdCn -ZYhcMQKBgEHN3ZYe7gOfxR4rqk+OIsAUN9P3zyu6kQzUL1BQ7t7Gwi1dv6+E+BGQ -vGUt4RGG10g3K9twfhOHnwAiruEk6CK2+1G/ZsGCrPIE21KCcucUCPvzUGhintO+ -b+Q5kAeZFg5CB9b616SY/GvlzPraNx5OZfI8nw39U9do7N/yFiKT ------END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/mcuboot/samples/zephyr/build-boot.sh b/mcuboot/samples/zephyr/build-boot.sh deleted file mode 100755 index 81691e7d2..000000000 --- a/mcuboot/samples/zephyr/build-boot.sh +++ /dev/null @@ -1,22 +0,0 @@ -#! /bin/bash - -# Build the bootloader. - -# In order to build successfully, ZEPHYR_SDK_INSTALL_DIR and -# ZEPHYR_GCC_VARIANT need to be set, as well as zephyr/zephyr-env.sh -# must be sourced. - -die() { - echo error: "$@" - exit 1 -} - -if [ -z "$ZEPHYR_BASE" ]; then - die "Please setup for a Zephyr build before running this script." -fi - -if [ -z "$BOARD" ]; then - die "Please set BOARD to a valid board before running this script." -fi - -make BOARD=${BOARD} -j$(nproc) boot || die "Build mcuboot" diff --git a/mcuboot/samples/zephyr/build-hello.sh b/mcuboot/samples/zephyr/build-hello.sh deleted file mode 100755 index 6920f320e..000000000 --- a/mcuboot/samples/zephyr/build-hello.sh +++ /dev/null @@ -1,22 +0,0 @@ -#! /bin/bash - -# Build the Sample hello program - -# In order to build successfully, ZEPHYR_SDK_INSTALL_DIR and -# ZEPHYR_GCC_VARIANT need to be set, as well as zephyr/zephyr-env.sh -# must be sourced. - -die() { - echo error: "$@" - exit 1 -} - -if [ -z "$ZEPHYR_BASE" ]; then - die "Please setup for a Zephyr build before running this script." -fi - -if [ -z "$BOARD" ]; then - die "Please set BOARD to a valid board before running this script." -fi - -make BOARD=${BOARD} -j$(nproc) hello1 || die "Build hello1" diff --git a/mcuboot/samples/zephyr/hello-world/CMakeLists.txt b/mcuboot/samples/zephyr/hello-world/CMakeLists.txt deleted file mode 100644 index 0415fef6c..000000000 --- a/mcuboot/samples/zephyr/hello-world/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -# Top-level CMakeLists.txt for the skeleton application. -# -# Copyright (c) 2017 Open Source Foundries Limited -# Copyright (c) 2018 Foundries.io Ltd -# -# SPDX-License-Identifier: Apache-2.0 -# -# This provides a basic application structure suitable for loading by -# mcuboot, which is easy to customize on a per-board basis. It can be -# used as a starting point for new applications. - -cmake_minimum_required(VERSION 3.8) - -# Standard Zephyr application boilerplate. -include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE) -project(NONE) - -# This string ends up getting printed in the device console -if (NOT DEFINED FROM_WHO) - set(FROM_WHO Zephyr) -endif() - -target_compile_definitions(app PRIVATE "-DMCUBOOT_HELLO_WORLD_FROM=\"${FROM_WHO}\"") - -target_sources(app PRIVATE src/main.c) diff --git a/mcuboot/samples/zephyr/hello-world/README.rst b/mcuboot/samples/zephyr/hello-world/README.rst deleted file mode 100644 index 2c89008db..000000000 --- a/mcuboot/samples/zephyr/hello-world/README.rst +++ /dev/null @@ -1,6 +0,0 @@ -This is a "Hello world" skeleton application which can be used as a -starting point for Zephyr application development using mcuboot. - -It includes the configuration "glue" needed to make the application -loadable by mcuboot in addition to a basic Zephyr hello world -application's code. diff --git a/mcuboot/samples/zephyr/hello-world/boards/.gitignore b/mcuboot/samples/zephyr/hello-world/boards/.gitignore deleted file mode 100644 index 27e8bd87c..000000000 --- a/mcuboot/samples/zephyr/hello-world/boards/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*-local.conf diff --git a/mcuboot/samples/zephyr/hello-world/boards/README.rst b/mcuboot/samples/zephyr/hello-world/boards/README.rst deleted file mode 100644 index 615c06efc..000000000 --- a/mcuboot/samples/zephyr/hello-world/boards/README.rst +++ /dev/null @@ -1,2 +0,0 @@ -You can place per-board configuration here. See the comments in the -CMakeLists.txt for more information. diff --git a/mcuboot/samples/zephyr/hello-world/prj.conf b/mcuboot/samples/zephyr/hello-world/prj.conf deleted file mode 100644 index cc674062a..000000000 --- a/mcuboot/samples/zephyr/hello-world/prj.conf +++ /dev/null @@ -1,9 +0,0 @@ -# Print a banner on the UART on startup. -CONFIG_BOOT_BANNER=y - -# Enable console and printk() -CONFIG_PRINTK=y -CONFIG_STDOUT_CONSOLE=y - -# Enable Zephyr application to be booted by MCUboot -CONFIG_BOOTLOADER_MCUBOOT=y diff --git a/mcuboot/samples/zephyr/hello-world/sample.yaml b/mcuboot/samples/zephyr/hello-world/sample.yaml deleted file mode 100644 index 424177893..000000000 --- a/mcuboot/samples/zephyr/hello-world/sample.yaml +++ /dev/null @@ -1,9 +0,0 @@ -sample: - name: Application Skeleton - description: Basic "hello world" application, but loadable by mcuboot - platforms: all -tests: - - test: - build_only: true - tags: samples tests - min_ram: 16 diff --git a/mcuboot/samples/zephyr/hello-world/src/Makefile b/mcuboot/samples/zephyr/hello-world/src/Makefile deleted file mode 100644 index 00066e156..000000000 --- a/mcuboot/samples/zephyr/hello-world/src/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-y = main.o diff --git a/mcuboot/samples/zephyr/hello-world/src/main.c b/mcuboot/samples/zephyr/hello-world/src/main.c deleted file mode 100644 index 027bb5f64..000000000 --- a/mcuboot/samples/zephyr/hello-world/src/main.c +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (c) 2017 Linaro, Ltd. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include - -void main(void) -{ - printk("Hello World from %s on %s!\n", - MCUBOOT_HELLO_WORLD_FROM, CONFIG_BOARD); -} diff --git a/mcuboot/samples/zephyr/overlay-ecdsa-p256.conf b/mcuboot/samples/zephyr/overlay-ecdsa-p256.conf deleted file mode 100644 index 8555816c3..000000000 --- a/mcuboot/samples/zephyr/overlay-ecdsa-p256.conf +++ /dev/null @@ -1,3 +0,0 @@ -# Kconfig overlay for building with ECDSA-P256 signatures -CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=y -CONFIG_BOOT_SIGNATURE_KEY_FILE="root-ec-p256.pem" diff --git a/mcuboot/samples/zephyr/overlay-rsa.conf b/mcuboot/samples/zephyr/overlay-rsa.conf deleted file mode 100644 index 539e779dc..000000000 --- a/mcuboot/samples/zephyr/overlay-rsa.conf +++ /dev/null @@ -1,2 +0,0 @@ -# Kconfig overlay for building with RSA signatures -CONFIG_BOOT_SIGNATURE_TYPE_RSA=y diff --git a/mcuboot/samples/zephyr/overlay-skip-primary-slot-validate.conf b/mcuboot/samples/zephyr/overlay-skip-primary-slot-validate.conf deleted file mode 100644 index e94518e79..000000000 --- a/mcuboot/samples/zephyr/overlay-skip-primary-slot-validate.conf +++ /dev/null @@ -1,3 +0,0 @@ -# Kconfig overlay for building without validating primary slot. - -# CONFIG_BOOT_VALIDATE_SLOT0 is not set diff --git a/mcuboot/samples/zephyr/overlay-upgrade-only.conf b/mcuboot/samples/zephyr/overlay-upgrade-only.conf deleted file mode 100644 index bdff7ac92..000000000 --- a/mcuboot/samples/zephyr/overlay-upgrade-only.conf +++ /dev/null @@ -1,2 +0,0 @@ -# Kconfig overlay for building in upgrade-only mode. -CONFIG_BOOT_UPGRADE_ONLY=y diff --git a/mcuboot/samples/zephyr/run-tests.go b/mcuboot/samples/zephyr/run-tests.go deleted file mode 100644 index 88160b4a3..000000000 --- a/mcuboot/samples/zephyr/run-tests.go +++ /dev/null @@ -1,419 +0,0 @@ -// +build ignore -// -// Build multiple configurations of MCUboot for Zephyr, making sure -// that they run properly. -// -// Run as: -// -// go run run-tests.go [flags] -// -// Add -help as a flag to get help. See comment below for logIn on -// how to configure terminal output to a file so this program can see -// the output of the Zephyr device. - -package main - -import ( - "bufio" - "flag" - "fmt" - "io" - "log" - "os" - "os/exec" - "strings" - "time" -) - -// logIn gives the pathname of the log output from the Zephyr device. -// In order to see the serial output, but still be useful for human -// debugging, the output of the terminal emulator should be teed to a -// file that this program will read from. This can be done with -// something like: -// -// picocom -b 115200 /dev/ttyACM0 | tee /tmp/zephyr.out -// -// Other terminal programs should also have logging options. -var logIn = flag.String("login", "/tmp/zephyr.out", "File name of terminal log from Zephyr device") - -// Output from this test run is written to the given log file. -var logOut = flag.String("logout", "tests.log", "Log file to write to") - -// The main driver of this consists of a series of tests. Each test -// then contains a series of commands and expect results. -var tests = []struct { - name string - tests []oneTest -}{ - { - name: "Good RSA", - tests: []oneTest{ - { - commands: [][]string{ - {"make", "test-good-rsa"}, - {"make", "flash_boot"}, - }, - expect: "Unable to find bootable image", - }, - { - commands: [][]string{ - {"make", "flash_hello1"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"make", "flash_hello2"}, - }, - expect: "Hello World from hello2", - }, - { - commands: [][]string{ - {"pyocd", "commander", "-c", "reset"}, - }, - expect: "Hello World from hello1", - }, - }, - }, - { - name: "Good ECDSA", - tests: []oneTest{ - { - commands: [][]string{ - {"make", "test-good-ecdsa"}, - {"make", "flash_boot"}, - }, - expect: "Unable to find bootable image", - }, - { - commands: [][]string{ - {"make", "flash_hello1"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"make", "flash_hello2"}, - }, - expect: "Hello World from hello2", - }, - { - commands: [][]string{ - {"pyocd", "commander", "-c", "reset"}, - }, - expect: "Hello World from hello1", - }, - }, - }, - { - name: "Overwrite", - tests: []oneTest{ - { - commands: [][]string{ - {"make", "test-overwrite"}, - {"make", "flash_boot"}, - }, - expect: "Unable to find bootable image", - }, - { - commands: [][]string{ - {"make", "flash_hello1"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"make", "flash_hello2"}, - }, - expect: "Hello World from hello2", - }, - { - commands: [][]string{ - {"pyocd", "commander", "-c", "reset"}, - }, - expect: "Hello World from hello2", - }, - }, - }, - { - name: "Bad RSA", - tests: []oneTest{ - { - commands: [][]string{ - {"make", "test-bad-rsa-upgrade"}, - {"make", "flash_boot"}, - }, - expect: "Unable to find bootable image", - }, - { - commands: [][]string{ - {"make", "flash_hello1"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"make", "flash_hello2"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"pyocd", "commander", "-c", "reset"}, - }, - expect: "Hello World from hello1", - }, - }, - }, - { - name: "Bad RSA", - tests: []oneTest{ - { - commands: [][]string{ - {"make", "test-bad-ecdsa-upgrade"}, - {"make", "flash_boot"}, - }, - expect: "Unable to find bootable image", - }, - { - commands: [][]string{ - {"make", "flash_hello1"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"make", "flash_hello2"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"pyocd", "commander", "-c", "reset"}, - }, - expect: "Hello World from hello1", - }, - }, - }, - { - name: "No bootcheck", - tests: []oneTest{ - { - commands: [][]string{ - {"make", "test-no-bootcheck"}, - {"make", "flash_boot"}, - }, - expect: "Unable to find bootable image", - }, - { - commands: [][]string{ - {"make", "flash_hello1"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"make", "flash_hello2"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"pyocd", "commander", "-c", "reset"}, - }, - expect: "Hello World from hello1", - }, - }, - }, - { - name: "Wrong RSA", - tests: []oneTest{ - { - commands: [][]string{ - {"make", "test-wrong-rsa"}, - {"make", "flash_boot"}, - }, - expect: "Unable to find bootable image", - }, - { - commands: [][]string{ - {"make", "flash_hello1"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"make", "flash_hello2"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"pyocd", "commander", "-c", "reset"}, - }, - expect: "Hello World from hello1", - }, - }, - }, - { - name: "Wrong ECDSA", - tests: []oneTest{ - { - commands: [][]string{ - {"make", "test-wrong-ecdsa"}, - {"make", "flash_boot"}, - }, - expect: "Unable to find bootable image", - }, - { - commands: [][]string{ - {"make", "flash_hello1"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"make", "flash_hello2"}, - }, - expect: "Hello World from hello1", - }, - { - commands: [][]string{ - {"pyocd", "commander", "-c", "reset"}, - }, - expect: "Hello World from hello1", - }, - }, - }, -} - -type oneTest struct { - commands [][]string - expect string -} - -func main() { - err := run() - if err != nil { - log.Fatal(err) - } -} - -func run() error { - flag.Parse() - - lines := make(chan string, 30) - go readLog(lines) - - // Write output to a log file - logFile, err := os.Create(*logOut) - if err != nil { - return err - } - defer logFile.Close() - lg := bufio.NewWriter(logFile) - defer lg.Flush() - - for _, group := range tests { - fmt.Printf("Running %q\n", group.name) - fmt.Fprintf(lg, "-------------------------------------\n") - fmt.Fprintf(lg, "---- Running %q\n", group.name) - - for _, test := range group.tests { - for _, cmd := range test.commands { - fmt.Printf(" %s\n", cmd) - fmt.Fprintf(lg, "---- Run: %s\n", cmd) - err = runCommand(cmd, lg) - if err != nil { - return err - } - } - - err = expect(lg, lines, test.expect) - if err != nil { - return err - } - - fmt.Fprintf(lg, "---- Passed\n") - } - fmt.Printf(" Passed!\n") - } - - return nil -} - -// Run a single command. -func runCommand(cmd []string, lg io.Writer) error { - c := exec.Command(cmd[0], cmd[1:]...) - c.Stdout = lg - c.Stderr = lg - return c.Run() -} - -// Expect the given string. -func expect(lg io.Writer, lines <-chan string, exp string) error { - // Read lines, and if we hit a timeout before seeing our - // expected line, then consider that an error. - fmt.Fprintf(lg, "---- expect: %q\n", exp) - - stopper := time.NewTimer(10 * time.Second) - defer stopper.Stop() -outer: - for { - select { - case line := <-lines: - fmt.Fprintf(lg, "---- target: %q\n", line) - if strings.Contains(line, exp) { - break outer - } - case <-stopper.C: - fmt.Fprintf(lg, "timeout, didn't receive output\n") - return fmt.Errorf("timeout, didn't receive expected string: %q", exp) - } - } - - return nil -} - -// Read things from the log file, discarding everything already there. -func readLog(sink chan<- string) { - file, err := os.Open(*logIn) - if err != nil { - log.Fatal(err) - } - - _, err = file.Seek(0, 2) - if err != nil { - log.Fatal(err) - } - - prefix := "" - for { - // Read lines until EOF, then delay a bit, and do it - // all again. - rd := bufio.NewReader(file) - - for { - line, err := rd.ReadString('\n') - if err == io.EOF { - // A partial line can happen because - // we are racing with the writer. - if line != "" { - prefix = line - } - break - } - if err != nil { - log.Fatal(err) - } - - line = prefix + line - prefix = "" - sink <- line - // fmt.Printf("line: %q\n", line) - } - - // Pause a little - time.Sleep(250 * time.Millisecond) - } -} diff --git a/mcuboot/samples/zephyr/run-tests.sh b/mcuboot/samples/zephyr/run-tests.sh deleted file mode 100755 index e2e4a9caa..000000000 --- a/mcuboot/samples/zephyr/run-tests.sh +++ /dev/null @@ -1,196 +0,0 @@ -#!/bin/bash - -# Test runner -# -# Copyright (c) 2017 Open Source Foundries Limited - -# -# This script can be used to execute the Zephyr test plan detailed in -# docs/testplan-zephyr.md. -# - -function ok_yn () { - while true ; do - read -p "Test result OK (y/n)? " -n 1 choice - echo - case "$choice" in - y|Y ) - return - ;; - n|N ) - echo "Test failed; exiting" - exit 1 - ;; - * ) - echo Please enter y or n - ;; - esac - done -} - -set -e - -echo '--------------------------------------------------------' -echo '------------------------ GOOD RSA ----------------------' -make test-good-rsa -pyocd erase --chip -echo "Flashing bootloader" -make flash_boot -echo "Expected result: unable to find bootable image" -ok_yn -echo "Flashing hello 1" -make flash_hello1 -echo "Expected result: hello1 runs" -ok_yn -echo "Flashing hello 2" -make flash_hello2 -echo "Expected result: hello2 runs" -ok_yn -echo "Resetting" -pyocd commander -c reset -echo "Expected result: hello1 runs" -ok_yn - -echo '--------------------------------------------------------' -echo '------------------------ GOOD ECDSA --------------------' -make test-good-ecdsa -pyocd erase --chip -make flash_boot -echo "Expected result: unable to find bootable image" -ok_yn -echo "Flashing hello 1" -make flash_hello1 -echo "Expected result: hello1 runs" -ok_yn -echo "Flashing hello 2" -make flash_hello2 -echo "Expected result: hello2 runs" -ok_yn -echo "Resetting" -pyocd commander -c reset -echo "Expected result: hello1 runs" -ok_yn - -echo '--------------------------------------------------------' -echo '------------------------ OVERWRITE ---------------------' -make test-overwrite -pyocd erase --chip -make flash_boot -echo "Expected result: unable to find bootable image" -ok_yn -echo "Flashing hello 1" -make flash_hello1 -echo "Expected result: hello1 runs" -ok_yn -echo "Flashing hello 2" -make flash_hello2 -echo "Expected result: hello2 runs" -ok_yn -echo "Resetting" -pyocd commander -c reset -echo "Expected result: hello2 runs" -ok_yn - -echo '--------------------------------------------------------' -echo '------------------------ BAD RSA -----------------------' -make test-bad-rsa-upgrade -pyocd erase --chip -make flash_boot -echo "Expected result: unable to find bootable image" -ok_yn -echo "Flashing hello 1" -make flash_hello1 -echo "Expected result: hello1 runs" -ok_yn -echo "Flashing hello 2" -make flash_hello2 -echo "Expected result: hello1 runs" -ok_yn -echo "Resetting" -pyocd commander -c reset -echo "Expected result: hello1 runs" -ok_yn - -echo '--------------------------------------------------------' -echo '------------------------ BAD ECDSA ---------------------' -make test-bad-ecdsa-upgrade -pyocd erase --chip -make flash_boot -echo "Expected result: unable to find bootable image" -ok_yn -echo "Flashing hello 1" -make flash_hello1 -echo "Expected result: hello1 runs" -ok_yn -echo "Flashing hello 2" -make flash_hello2 -echo "Expected result: hello1 runs" -ok_yn -echo "Resetting" -pyocd commander -c reset -echo "Expected result: hello1 runs" -ok_yn - -echo '--------------------------------------------------------' -echo '------------------------ NO BOOTCHECK ------------------' -make test-no-bootcheck -pyocd erase --chip -make flash_boot -echo "Expected result: unable to find bootable image" -ok_yn -echo "Flashing hello 1" -make flash_hello1 -echo "Expected result: hello1 runs" -ok_yn -echo "Flashing hello 2" -make flash_hello2 -echo "Expected result: hello1 runs" -ok_yn -echo "Resetting" -pyocd commander -c reset -echo "Expected result: hello1 runs" -ok_yn - -echo '--------------------------------------------------------' -echo '------------------------ WRONG RSA ---------------------' -make test-wrong-rsa -pyocd erase --chip -make flash_boot -echo "Expected result: unable to find bootable image" -ok_yn -echo "Flashing hello 1" -make flash_hello1 -echo "Expected result: hello1 runs" -ok_yn -echo "Flashing hello 2" -make flash_hello2 -echo "Expected result: hello1 runs" -ok_yn -echo "Resetting" -pyocd commander -c reset -echo "Expected result: hello1 runs" -ok_yn - -echo '--------------------------------------------------------' -echo '------------------------ WRONG ECDSA -------------------' -make test-wrong-ecdsa -pyocd erase --chip -make flash_boot -echo "Expected result: unable to find bootable image" -ok_yn -echo "Flashing hello 1" -make flash_hello1 -echo "Expected result: hello1 runs" -ok_yn -echo "Flashing hello 2" -make flash_hello2 -echo "Expected result: hello1 runs" -ok_yn -echo "Resetting" -pyocd commander -c reset -echo "Expected result: hello1 runs" -ok_yn - -echo '========================================================' -echo ' ALL TESTS PASSED' -echo '========================================================' diff --git a/mcuboot/scripts/assemble.py b/mcuboot/scripts/assemble.py deleted file mode 100755 index e895ee773..000000000 --- a/mcuboot/scripts/assemble.py +++ /dev/null @@ -1,131 +0,0 @@ -#! /usr/bin/env python3 -# -# Copyright 2017 Linaro Limited -# -# 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. - -""" -Assemble multiple images into a single image that can be flashed on the device. -""" - -import argparse -import errno -import io -import re -import os.path -import sys - -ZEPHYR_BASE = os.getenv("ZEPHYR_BASE") -if not ZEPHYR_BASE: - sys.exit("$ZEPHYR_BASE environment variable undefined") - -sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts", "dts")) -import edtlib - -def same_keys(a, b): - """Determine if the dicts a and b have the same keys in them""" - for ak in a.keys(): - if ak not in b: - return False - for bk in b.keys(): - if bk not in a: - return False - return True - -offset_re = re.compile(r"^#define DT_FLASH_AREA_([0-9A-Z_]+)_OFFSET(_0)?\s+(0x[0-9a-fA-F]+|[0-9]+)$") -size_re = re.compile(r"^#define DT_FLASH_AREA_([0-9A-Z_]+)_SIZE(_0)?\s+(0x[0-9a-fA-F]+|[0-9]+)$") - -class Assembly(): - def __init__(self, output, bootdir, edt): - self.find_slots(edt) - try: - os.unlink(output) - except OSError as e: - if e.errno != errno.ENOENT: - raise - self.output = output - - def find_slots(self, edt): - offsets = {} - sizes = {} - - part_nodes = edt.compat2nodes["fixed-partitions"] - for node in part_nodes: - for child in node.children.values(): - if "label" in child.props: - label = child.props["label"].val - offsets[label] = child.regs[0].addr - sizes[label] = child.regs[0].size - - if not same_keys(offsets, sizes): - raise Exception("Inconsistent data in devicetree.h") - - # We care about the mcuboot, image-0, and image-1 partitions. - if 'mcuboot' not in offsets: - raise Exception("Board partition table does not have mcuboot partition") - - if 'image-0' not in offsets: - raise Exception("Board partition table does not have image-0 partition") - - if 'image-1' not in offsets: - raise Exception("Board partition table does not have image-1 partition") - - self.offsets = offsets - self.sizes = sizes - - def add_image(self, source, partition): - with open(self.output, 'ab') as ofd: - pos = ofd.tell() - print("partition {}, pos={}, offset={}".format(partition, pos, self.offsets[partition])) - if pos > self.offsets[partition]: - raise Exception("Partitions not in order, unsupported") - if pos < self.offsets[partition]: - buf = b'\xFF' * (self.offsets[partition] - pos) - ofd.write(buf) - with open(source, 'rb') as rfd: - ibuf = rfd.read() - if len(ibuf) > self.sizes[partition]: - raise Exception("Image {} is too large for partition".format(source)) - ofd.write(ibuf) - -def main(): - parser = argparse.ArgumentParser() - - parser.add_argument('-b', '--bootdir', required=True, - help='Directory of built bootloader') - parser.add_argument('-p', '--primary', required=True, - help='Signed image file for primary image') - parser.add_argument('-s', '--secondary', - help='Signed image file for secondary image') - parser.add_argument('-o', '--output', required=True, - help='Filename to write full image to') - - args = parser.parse_args() - - # Extract board name from path - board = os.path.split(os.path.split(args.bootdir)[0])[1] - - dts_path = os.path.join(args.bootdir, "zephyr", board + ".dts.pre.tmp") - - edt = edtlib.EDT(dts_path, [os.path.join(ZEPHYR_BASE, "dts", "bindings")], - warn_reg_unit_address_mismatch=False) - - output = Assembly(args.output, args.bootdir, edt) - - output.add_image(os.path.join(args.bootdir, 'zephyr', 'zephyr.bin'), 'mcuboot') - output.add_image(args.primary, "image-0") - if args.secondary is not None: - output.add_image(args.secondary, "image-1") - -if __name__ == '__main__': - main() diff --git a/mcuboot/scripts/flash.sh b/mcuboot/scripts/flash.sh deleted file mode 100755 index a2c58c750..000000000 --- a/mcuboot/scripts/flash.sh +++ /dev/null @@ -1,18 +0,0 @@ -#! /bin/bash - -source $(dirname $0)/../target.sh - -lscript=/tmp/flash$$.jlink - -cat >$lscript < $gscript < {}; -let - # Nixpkgs has fairly recent versions of the dependencies, so we can - # rely on them without having to build our own derivations. - imgtoolPythonEnv = python37.withPackages ( - _: [ - python37.pkgs.click - python37.pkgs.cryptography - python37.pkgs.intelhex - python37.pkgs.setuptools - python37.pkgs.cbor - ] - ); -in -myEnvFun { - name = "imgtool"; - - buildInputs = [ imgtoolPythonEnv ]; -} diff --git a/mcuboot/scripts/imgtool.py b/mcuboot/scripts/imgtool.py deleted file mode 100755 index 78614745b..000000000 --- a/mcuboot/scripts/imgtool.py +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env python3 -# -# Copyright 2017 Linaro Limited -# -# 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. - -from imgtool import main - -if __name__ == '__main__': - main.imgtool() diff --git a/mcuboot/scripts/imgtool/__init__.py b/mcuboot/scripts/imgtool/__init__.py deleted file mode 100644 index 09549c7c6..000000000 --- a/mcuboot/scripts/imgtool/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2017 Linaro Limited -# -# 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. - -imgtool_version = "1.6.0" diff --git a/mcuboot/scripts/imgtool/boot_record.py b/mcuboot/scripts/imgtool/boot_record.py deleted file mode 100644 index 4112b225a..000000000 --- a/mcuboot/scripts/imgtool/boot_record.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) 2019, Arm Limited. -# Copyright (c) 2020, Linaro Limited -# -# 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. - -from enum import Enum -import cbor - - -class SwComponent(int, Enum): - """ - Software component property IDs specified by - Arm's PSA Attestation API 1.0 document. - """ - TYPE = 1 - MEASUREMENT_VALUE = 2 - VERSION = 4 - SIGNER_ID = 5 - MEASUREMENT_DESCRIPTION = 6 - - -def create_sw_component_data(sw_type, sw_version, sw_measurement_description, - sw_measurement_value, sw_signer_id): - - # List of software component properties (Key ID + value) - properties = { - SwComponent.TYPE: sw_type, - SwComponent.VERSION: sw_version, - SwComponent.SIGNER_ID: sw_signer_id, - SwComponent.MEASUREMENT_DESCRIPTION: sw_measurement_description, - } - - # Note: The measurement value must be the last item of the property - # list because later it will be modified by the bootloader. - properties[SwComponent.MEASUREMENT_VALUE] = sw_measurement_value - - return cbor.dumps(properties) diff --git a/mcuboot/scripts/imgtool/image.py b/mcuboot/scripts/imgtool/image.py deleted file mode 100644 index acb1794d1..000000000 --- a/mcuboot/scripts/imgtool/image.py +++ /dev/null @@ -1,552 +0,0 @@ -# Copyright 2018 Nordic Semiconductor ASA -# Copyright 2017 Linaro Limited -# Copyright 2019-2020 Arm Limited -# -# 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. - -""" -Image signing and management. -""" - -from . import version as versmod -from .boot_record import create_sw_component_data -import click -from enum import Enum -from intelhex import IntelHex -import hashlib -import struct -import os.path -from .keys import rsa, ecdsa, x25519 -from cryptography.hazmat.primitives.asymmetric import ec, padding -from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey -from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes -from cryptography.hazmat.primitives.kdf.hkdf import HKDF -from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import hashes, hmac -from cryptography.exceptions import InvalidSignature - -IMAGE_MAGIC = 0x96f3b83d -IMAGE_HEADER_SIZE = 32 -BIN_EXT = "bin" -INTEL_HEX_EXT = "hex" -DEFAULT_MAX_SECTORS = 128 -MAX_ALIGN = 8 -DEP_IMAGES_KEY = "images" -DEP_VERSIONS_KEY = "versions" -MAX_SW_TYPE_LENGTH = 12 # Bytes - -# Image header flags. -IMAGE_F = { - 'PIC': 0x0000001, - 'NON_BOOTABLE': 0x0000010, - 'RAM_LOAD': 0x0000020, - 'ENCRYPTED': 0x0000004, -} - -TLV_VALUES = { - 'KEYHASH': 0x01, - 'PUBKEY': 0x02, - 'SHA256': 0x10, - 'RSA2048': 0x20, - 'ECDSA224': 0x21, - 'ECDSA256': 0x22, - 'RSA3072': 0x23, - 'ED25519': 0x24, - 'ENCRSA2048': 0x30, - 'ENCKW128': 0x31, - 'ENCEC256': 0x32, - 'ENCX25519': 0x33, - 'DEPENDENCY': 0x40, - 'SEC_CNT': 0x50, - 'BOOT_RECORD': 0x60, -} - -TLV_SIZE = 4 -TLV_INFO_SIZE = 4 -TLV_INFO_MAGIC = 0x6907 -TLV_PROT_INFO_MAGIC = 0x6908 - -boot_magic = bytes([ - 0x77, 0xc2, 0x95, 0xf3, - 0x60, 0xd2, 0xef, 0x7f, - 0x35, 0x52, 0x50, 0x0f, - 0x2c, 0xb6, 0x79, 0x80, ]) - -STRUCT_ENDIAN_DICT = { - 'little': '<', - 'big': '>' -} - -VerifyResult = Enum('VerifyResult', - """ - OK INVALID_MAGIC INVALID_TLV_INFO_MAGIC INVALID_HASH - INVALID_SIGNATURE - """) - - -class TLV(): - def __init__(self, endian, magic=TLV_INFO_MAGIC): - self.magic = magic - self.buf = bytearray() - self.endian = endian - - def __len__(self): - return TLV_INFO_SIZE + len(self.buf) - - def add(self, kind, payload): - """ - Add a TLV record. Kind should be a string found in TLV_VALUES above. - """ - e = STRUCT_ENDIAN_DICT[self.endian] - buf = struct.pack(e + 'BBH', TLV_VALUES[kind], 0, len(payload)) - self.buf += buf - self.buf += payload - - def get(self): - if len(self.buf) == 0: - return bytes() - e = STRUCT_ENDIAN_DICT[self.endian] - header = struct.pack(e + 'HH', self.magic, len(self)) - return header + bytes(self.buf) - - -class Image(): - - def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE, - pad_header=False, pad=False, confirm=False, align=1, - slot_size=0, max_sectors=DEFAULT_MAX_SECTORS, - overwrite_only=False, endian="little", load_addr=0, - erased_val=None, save_enctlv=False, security_counter=None): - self.version = version or versmod.decode_version("0") - self.header_size = header_size - self.pad_header = pad_header - self.pad = pad - self.confirm = confirm - self.align = align - self.slot_size = slot_size - self.max_sectors = max_sectors - self.overwrite_only = overwrite_only - self.endian = endian - self.base_addr = None - self.load_addr = 0 if load_addr is None else load_addr - self.erased_val = 0xff if erased_val is None else int(erased_val, 0) - self.payload = [] - self.enckey = None - self.save_enctlv = save_enctlv - self.enctlv_len = 0 - - if security_counter == 'auto': - # Security counter has not been explicitly provided, - # generate it from the version number - self.security_counter = ((self.version.major << 24) - + (self.version.minor << 16) - + self.version.revision) - else: - self.security_counter = security_counter - - def __repr__(self): - return "".format( - self.version, - self.header_size, - self.security_counter, - self.base_addr if self.base_addr is not None else "N/A", - self.load_addr, - self.align, - self.slot_size, - self.max_sectors, - self.overwrite_only, - self.endian, - self.__class__.__name__, - len(self.payload)) - - def load(self, path): - """Load an image from a given file""" - ext = os.path.splitext(path)[1][1:].lower() - try: - if ext == INTEL_HEX_EXT: - ih = IntelHex(path) - self.payload = ih.tobinarray() - self.base_addr = ih.minaddr() - else: - with open(path, 'rb') as f: - self.payload = f.read() - except FileNotFoundError: - raise click.UsageError("Input file not found") - - # Add the image header if needed. - if self.pad_header and self.header_size > 0: - if self.base_addr: - # Adjust base_addr for new header - self.base_addr -= self.header_size - self.payload = bytes([self.erased_val] * self.header_size) + \ - self.payload - - self.check_header() - - def save(self, path, hex_addr=None): - """Save an image from a given file""" - ext = os.path.splitext(path)[1][1:].lower() - if ext == INTEL_HEX_EXT: - # input was in binary format, but HEX needs to know the base addr - if self.base_addr is None and hex_addr is None: - raise click.UsageError("No address exists in input file " - "neither was it provided by user") - h = IntelHex() - if hex_addr is not None: - self.base_addr = hex_addr - h.frombytes(bytes=self.payload, offset=self.base_addr) - if self.pad: - trailer_size = self._trailer_size(self.align, self.max_sectors, - self.overwrite_only, - self.enckey, - self.save_enctlv, - self.enctlv_len) - trailer_addr = (self.base_addr + self.slot_size) - trailer_size - padding = bytes([self.erased_val] * - (trailer_size - len(boot_magic))) + boot_magic - h.puts(trailer_addr, padding) - h.tofile(path, 'hex') - else: - if self.pad: - self.pad_to(self.slot_size) - with open(path, 'wb') as f: - f.write(self.payload) - - def check_header(self): - if self.header_size > 0 and not self.pad_header: - if any(v != 0 for v in self.payload[0:self.header_size]): - raise click.UsageError("Header padding was not requested and " - "image does not start with zeros") - - def check_trailer(self): - if self.slot_size > 0: - tsize = self._trailer_size(self.align, self.max_sectors, - self.overwrite_only, self.enckey, - self.save_enctlv, self.enctlv_len) - padding = self.slot_size - (len(self.payload) + tsize) - if padding < 0: - msg = "Image size (0x{:x}) + trailer (0x{:x}) exceeds " \ - "requested size 0x{:x}".format( - len(self.payload), tsize, self.slot_size) - raise click.UsageError(msg) - - def ecies_hkdf(self, enckey, plainkey): - if isinstance(enckey, ecdsa.ECDSA256P1Public): - newpk = ec.generate_private_key(ec.SECP256R1(), default_backend()) - shared = newpk.exchange(ec.ECDH(), enckey._get_public()) - else: - newpk = X25519PrivateKey.generate() - shared = newpk.exchange(enckey._get_public()) - derived_key = HKDF( - algorithm=hashes.SHA256(), length=48, salt=None, - info=b'MCUBoot_ECIES_v1', backend=default_backend()).derive(shared) - encryptor = Cipher(algorithms.AES(derived_key[:16]), - modes.CTR(bytes([0] * 16)), - backend=default_backend()).encryptor() - cipherkey = encryptor.update(plainkey) + encryptor.finalize() - mac = hmac.HMAC(derived_key[16:], hashes.SHA256(), - backend=default_backend()) - mac.update(cipherkey) - ciphermac = mac.finalize() - if isinstance(enckey, ecdsa.ECDSA256P1Public): - pubk = newpk.public_key().public_bytes( - encoding=Encoding.X962, - format=PublicFormat.UncompressedPoint) - else: - pubk = newpk.public_key().public_bytes( - encoding=Encoding.Raw, - format=PublicFormat.Raw) - return cipherkey, ciphermac, pubk - - def create(self, key, public_key_format, enckey, dependencies=None, - sw_type=None): - self.enckey = enckey - - # Calculate the hash of the public key - if key is not None: - pub = key.get_public_bytes() - sha = hashlib.sha256() - sha.update(pub) - pubbytes = sha.digest() - else: - pubbytes = bytes(hashlib.sha256().digest_size) - - protected_tlv_size = 0 - - if self.security_counter is not None: - # Size of the security counter TLV: header ('HH') + payload ('I') - # = 4 + 4 = 8 Bytes - protected_tlv_size += TLV_SIZE + 4 - - if sw_type is not None: - if len(sw_type) > MAX_SW_TYPE_LENGTH: - msg = "'{}' is too long ({} characters) for sw_type. Its " \ - "maximum allowed length is 12 characters.".format( - sw_type, len(sw_type)) - raise click.UsageError(msg) - - image_version = (str(self.version.major) + '.' - + str(self.version.minor) + '.' - + str(self.version.revision)) - - # The image hash is computed over the image header, the image - # itself and the protected TLV area. However, the boot record TLV - # (which is part of the protected area) should contain this hash - # before it is even calculated. For this reason the script fills - # this field with zeros and the bootloader will insert the right - # value later. - digest = bytes(hashlib.sha256().digest_size) - - # Create CBOR encoded boot record - boot_record = create_sw_component_data(sw_type, image_version, - "SHA256", digest, - pubbytes) - - protected_tlv_size += TLV_SIZE + len(boot_record) - - if dependencies is not None: - # Size of a Dependency TLV = Header ('HH') + Payload('IBBHI') - # = 4 + 12 = 16 Bytes - dependencies_num = len(dependencies[DEP_IMAGES_KEY]) - protected_tlv_size += (dependencies_num * 16) - - if protected_tlv_size != 0: - # Add the size of the TLV info header - protected_tlv_size += TLV_INFO_SIZE - - # At this point the image is already on the payload, this adds - # the header to the payload as well - self.add_header(enckey, protected_tlv_size) - - prot_tlv = TLV(self.endian, TLV_PROT_INFO_MAGIC) - - # Protected TLVs must be added first, because they are also included - # in the hash calculation - protected_tlv_off = None - if protected_tlv_size != 0: - - e = STRUCT_ENDIAN_DICT[self.endian] - - if self.security_counter is not None: - payload = struct.pack(e + 'I', self.security_counter) - prot_tlv.add('SEC_CNT', payload) - - if sw_type is not None: - prot_tlv.add('BOOT_RECORD', boot_record) - - if dependencies is not None: - for i in range(dependencies_num): - payload = struct.pack( - e + 'B3x'+'BBHI', - int(dependencies[DEP_IMAGES_KEY][i]), - dependencies[DEP_VERSIONS_KEY][i].major, - dependencies[DEP_VERSIONS_KEY][i].minor, - dependencies[DEP_VERSIONS_KEY][i].revision, - dependencies[DEP_VERSIONS_KEY][i].build - ) - prot_tlv.add('DEPENDENCY', payload) - - protected_tlv_off = len(self.payload) - self.payload += prot_tlv.get() - - tlv = TLV(self.endian) - - # Note that ecdsa wants to do the hashing itself, which means - # we get to hash it twice. - sha = hashlib.sha256() - sha.update(self.payload) - digest = sha.digest() - - tlv.add('SHA256', digest) - - if key is not None: - if public_key_format == 'hash': - tlv.add('KEYHASH', pubbytes) - else: - tlv.add('PUBKEY', pub) - - # `sign` expects the full image payload (sha256 done internally), - # while `sign_digest` expects only the digest of the payload - - if hasattr(key, 'sign'): - sig = key.sign(bytes(self.payload)) - else: - sig = key.sign_digest(digest) - tlv.add(key.sig_tlv(), sig) - - # At this point the image was hashed + signed, we can remove the - # protected TLVs from the payload (will be re-added later) - if protected_tlv_off is not None: - self.payload = self.payload[:protected_tlv_off] - - if enckey is not None: - plainkey = os.urandom(16) - - if isinstance(enckey, rsa.RSAPublic): - cipherkey = enckey._get_public().encrypt( - plainkey, padding.OAEP( - mgf=padding.MGF1(algorithm=hashes.SHA256()), - algorithm=hashes.SHA256(), - label=None)) - self.enctlv_len = len(cipherkey) - tlv.add('ENCRSA2048', cipherkey) - elif isinstance(enckey, (ecdsa.ECDSA256P1Public, - x25519.X25519Public)): - cipherkey, mac, pubk = self.ecies_hkdf(enckey, plainkey) - enctlv = pubk + mac + cipherkey - self.enctlv_len = len(enctlv) - if isinstance(enckey, ecdsa.ECDSA256P1Public): - tlv.add('ENCEC256', enctlv) - else: - tlv.add('ENCX25519', enctlv) - - nonce = bytes([0] * 16) - cipher = Cipher(algorithms.AES(plainkey), modes.CTR(nonce), - backend=default_backend()) - encryptor = cipher.encryptor() - img = bytes(self.payload[self.header_size:]) - self.payload[self.header_size:] = \ - encryptor.update(img) + encryptor.finalize() - - self.payload += prot_tlv.get() - self.payload += tlv.get() - - self.check_trailer() - - def add_header(self, enckey, protected_tlv_size): - """Install the image header.""" - - flags = 0 - if enckey is not None: - flags |= IMAGE_F['ENCRYPTED'] - if self.load_addr != 0: - # Indicates that this image should be loaded into RAM - # instead of run directly from flash. - flags |= IMAGE_F['RAM_LOAD'] - - e = STRUCT_ENDIAN_DICT[self.endian] - fmt = (e + - # type ImageHdr struct { - 'I' + # Magic uint32 - 'I' + # LoadAddr uint32 - 'H' + # HdrSz uint16 - 'H' + # PTLVSz uint16 - 'I' + # ImgSz uint32 - 'I' + # Flags uint32 - 'BBHI' + # Vers ImageVersion - 'I' # Pad1 uint32 - ) # } - assert struct.calcsize(fmt) == IMAGE_HEADER_SIZE - header = struct.pack(fmt, - IMAGE_MAGIC, - self.load_addr, - self.header_size, - protected_tlv_size, # TLV Info header + Protected TLVs - len(self.payload) - self.header_size, # ImageSz - flags, - self.version.major, - self.version.minor or 0, - self.version.revision or 0, - self.version.build or 0, - 0) # Pad1 - self.payload = bytearray(self.payload) - self.payload[:len(header)] = header - - def _trailer_size(self, write_size, max_sectors, overwrite_only, enckey, - save_enctlv, enctlv_len): - # NOTE: should already be checked by the argument parser - magic_size = 16 - if overwrite_only: - return MAX_ALIGN * 2 + magic_size - else: - if write_size not in set([1, 2, 4, 8]): - raise click.BadParameter("Invalid alignment: {}".format( - write_size)) - m = DEFAULT_MAX_SECTORS if max_sectors is None else max_sectors - trailer = m * 3 * write_size # status area - if enckey is not None: - if save_enctlv: - # TLV saved by the bootloader is aligned - keylen = (int((enctlv_len - 1) / MAX_ALIGN) + 1) * MAX_ALIGN - else: - keylen = 16 - trailer += keylen * 2 # encryption keys - trailer += MAX_ALIGN * 4 # image_ok/copy_done/swap_info/swap_size - trailer += magic_size - return trailer - - def pad_to(self, size): - """Pad the image to the given size, with the given flash alignment.""" - tsize = self._trailer_size(self.align, self.max_sectors, - self.overwrite_only, self.enckey, - self.save_enctlv, self.enctlv_len) - padding = size - (len(self.payload) + tsize) - pbytes = bytearray([self.erased_val] * padding) - pbytes += bytearray([self.erased_val] * (tsize - len(boot_magic))) - if self.confirm and not self.overwrite_only: - pbytes[-MAX_ALIGN] = 0x01 # image_ok = 0x01 - pbytes += boot_magic - self.payload += pbytes - - @staticmethod - def verify(imgfile, key): - with open(imgfile, "rb") as f: - b = f.read() - - magic, _, header_size, _, img_size = struct.unpack('IIHHI', b[:16]) - version = struct.unpack('BBHI', b[20:28]) - - if magic != IMAGE_MAGIC: - return VerifyResult.INVALID_MAGIC, None - - tlv_info = b[header_size+img_size:header_size+img_size+TLV_INFO_SIZE] - magic, tlv_tot = struct.unpack('HH', tlv_info) - if magic != TLV_INFO_MAGIC: - return VerifyResult.INVALID_TLV_INFO_MAGIC, None - - sha = hashlib.sha256() - sha.update(b[:header_size+img_size]) - digest = sha.digest() - - tlv_off = header_size + img_size - tlv_end = tlv_off + tlv_tot - tlv_off += TLV_INFO_SIZE # skip tlv info - while tlv_off < tlv_end: - tlv = b[tlv_off:tlv_off+TLV_SIZE] - tlv_type, _, tlv_len = struct.unpack('BBH', tlv) - if tlv_type == TLV_VALUES["SHA256"]: - off = tlv_off + TLV_SIZE - if digest == b[off:off+tlv_len]: - if key is None: - return VerifyResult.OK, version - else: - return VerifyResult.INVALID_HASH, None - elif key is not None and tlv_type == TLV_VALUES[key.sig_tlv()]: - off = tlv_off + TLV_SIZE - tlv_sig = b[off:off+tlv_len] - payload = b[:header_size+img_size] - try: - if hasattr(key, 'verify'): - key.verify(tlv_sig, payload) - else: - key.verify_digest(tlv_sig, digest) - return VerifyResult.OK, version - except InvalidSignature: - # continue to next TLV - pass - tlv_off += TLV_SIZE + tlv_len - return VerifyResult.INVALID_SIGNATURE, None diff --git a/mcuboot/scripts/imgtool/keys/__init__.py b/mcuboot/scripts/imgtool/keys/__init__.py deleted file mode 100644 index af6caffaa..000000000 --- a/mcuboot/scripts/imgtool/keys/__init__.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright 2017 Linaro Limited -# -# 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. - -""" -Cryptographic key management for imgtool. -""" - -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import serialization -from cryptography.hazmat.primitives.asymmetric.rsa import ( - RSAPrivateKey, RSAPublicKey) -from cryptography.hazmat.primitives.asymmetric.ec import ( - EllipticCurvePrivateKey, EllipticCurvePublicKey) -from cryptography.hazmat.primitives.asymmetric.ed25519 import ( - Ed25519PrivateKey, Ed25519PublicKey) -from cryptography.hazmat.primitives.asymmetric.x25519 import ( - X25519PrivateKey, X25519PublicKey) - -from .rsa import RSA, RSAPublic, RSAUsageError, RSA_KEY_SIZES -from .ecdsa import ECDSA256P1, ECDSA256P1Public, ECDSAUsageError -from .ed25519 import Ed25519, Ed25519Public, Ed25519UsageError -from .x25519 import X25519, X25519Public, X25519UsageError - - -class PasswordRequired(Exception): - """Raised to indicate that the key is password protected, but a - password was not specified.""" - pass - - -def load(path, passwd=None): - """Try loading a key from the given path. Returns None if the password wasn't specified.""" - with open(path, 'rb') as f: - raw_pem = f.read() - try: - pk = serialization.load_pem_private_key( - raw_pem, - password=passwd, - backend=default_backend()) - # Unfortunately, the crypto library raises unhelpful exceptions, - # so we have to look at the text. - except TypeError as e: - msg = str(e) - if "private key is encrypted" in msg: - return None - raise e - except ValueError: - # This seems to happen if the key is a public key, let's try - # loading it as a public key. - pk = serialization.load_pem_public_key( - raw_pem, - backend=default_backend()) - - if isinstance(pk, RSAPrivateKey): - if pk.key_size not in RSA_KEY_SIZES: - raise Exception("Unsupported RSA key size: " + pk.key_size) - return RSA(pk) - elif isinstance(pk, RSAPublicKey): - if pk.key_size not in RSA_KEY_SIZES: - raise Exception("Unsupported RSA key size: " + pk.key_size) - return RSAPublic(pk) - elif isinstance(pk, EllipticCurvePrivateKey): - if pk.curve.name != 'secp256r1': - raise Exception("Unsupported EC curve: " + pk.curve.name) - if pk.key_size != 256: - raise Exception("Unsupported EC size: " + pk.key_size) - return ECDSA256P1(pk) - elif isinstance(pk, EllipticCurvePublicKey): - if pk.curve.name != 'secp256r1': - raise Exception("Unsupported EC curve: " + pk.curve.name) - if pk.key_size != 256: - raise Exception("Unsupported EC size: " + pk.key_size) - return ECDSA256P1Public(pk) - elif isinstance(pk, Ed25519PrivateKey): - return Ed25519(pk) - elif isinstance(pk, Ed25519PublicKey): - return Ed25519Public(pk) - elif isinstance(pk, X25519PrivateKey): - return X25519(pk) - elif isinstance(pk, X25519PublicKey): - return X25519Public(pk) - else: - raise Exception("Unknown key type: " + str(type(pk))) diff --git a/mcuboot/scripts/imgtool/keys/ecdsa.py b/mcuboot/scripts/imgtool/keys/ecdsa.py deleted file mode 100644 index 81aa32145..000000000 --- a/mcuboot/scripts/imgtool/keys/ecdsa.py +++ /dev/null @@ -1,157 +0,0 @@ -""" -ECDSA key management -""" - -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import serialization -from cryptography.hazmat.primitives.asymmetric import ec -from cryptography.hazmat.primitives.hashes import SHA256 - -from .general import KeyClass - -class ECDSAUsageError(Exception): - pass - -class ECDSA256P1Public(KeyClass): - def __init__(self, key): - self.key = key - - def shortname(self): - return "ecdsa" - - def _unsupported(self, name): - raise ECDSAUsageError("Operation {} requires private key".format(name)) - - def _get_public(self): - return self.key - - def get_public_bytes(self): - # The key is embedded into MBUboot in "SubjectPublicKeyInfo" format - return self._get_public().public_bytes( - encoding=serialization.Encoding.DER, - format=serialization.PublicFormat.SubjectPublicKeyInfo) - - def get_private_bytes(self, minimal): - self._unsupported('get_private_bytes') - - def export_private(self, path, passwd=None): - self._unsupported('export_private') - - def export_public(self, path): - """Write the public key to the given file.""" - pem = self._get_public().public_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PublicFormat.SubjectPublicKeyInfo) - with open(path, 'wb') as f: - f.write(pem) - - def sig_type(self): - return "ECDSA256_SHA256" - - def sig_tlv(self): - return "ECDSA256" - - def sig_len(self): - # Early versions of MCUboot (< v1.5.0) required ECDSA - # signatures to be padded to 72 bytes. Because the DER - # encoding is done with signed integers, the size of the - # signature will vary depending on whether the high bit is set - # in each value. This padding was done in a - # not-easily-reversible way (by just adding zeros). - # - # The signing code no longer requires this padding, and newer - # versions of MCUboot don't require it. But, continue to - # return the total length so that the padding can be done if - # requested. - return 72 - - def verify(self, signature, payload): - # strip possible paddings added during sign - signature = signature[:signature[1] + 2] - k = self.key - if isinstance(self.key, ec.EllipticCurvePrivateKey): - k = self.key.public_key() - return k.verify(signature=signature, data=payload, - signature_algorithm=ec.ECDSA(SHA256())) - - -class ECDSA256P1(ECDSA256P1Public): - """ - Wrapper around an ECDSA private key. - """ - - def __init__(self, key): - """key should be an instance of EllipticCurvePrivateKey""" - self.key = key - self.pad_sig = False - - @staticmethod - def generate(): - pk = ec.generate_private_key( - ec.SECP256R1(), - backend=default_backend()) - return ECDSA256P1(pk) - - def _get_public(self): - return self.key.public_key() - - def _build_minimal_ecdsa_privkey(self, der): - ''' - Builds a new DER that only includes the EC private key, removing the - public key that is added as an "optional" BITSTRING. - ''' - offset_PUB = 68 - EXCEPTION_TEXT = "Error parsing ecdsa key. Please submit an issue!" - if der[offset_PUB] != 0xa1: - raise ECDSAUsageError(EXCEPTION_TEXT) - len_PUB = der[offset_PUB + 1] - b = bytearray(der[:-offset_PUB]) - offset_SEQ = 29 - if b[offset_SEQ] != 0x30: - raise ECDSAUsageError(EXCEPTION_TEXT) - b[offset_SEQ + 1] -= len_PUB - offset_OCT_STR = 27 - if b[offset_OCT_STR] != 0x04: - raise ECDSAUsageError(EXCEPTION_TEXT) - b[offset_OCT_STR + 1] -= len_PUB - if b[0] != 0x30 or b[1] != 0x81: - raise ECDSAUsageError(EXCEPTION_TEXT) - b[2] -= len_PUB - return b - - def get_private_bytes(self, minimal): - priv = self.key.private_bytes( - encoding=serialization.Encoding.DER, - format=serialization.PrivateFormat.PKCS8, - encryption_algorithm=serialization.NoEncryption()) - if minimal: - priv = self._build_minimal_ecdsa_privkey(priv) - return priv - - def export_private(self, path, passwd=None): - """Write the private key to the given file, protecting it with the optional password.""" - if passwd is None: - enc = serialization.NoEncryption() - else: - enc = serialization.BestAvailableEncryption(passwd) - pem = self.key.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.PKCS8, - encryption_algorithm=enc) - with open(path, 'wb') as f: - f.write(pem) - - def raw_sign(self, payload): - """Return the actual signature""" - return self.key.sign( - data=payload, - signature_algorithm=ec.ECDSA(SHA256())) - - def sign(self, payload): - sig = self.raw_sign(payload) - if self.pad_sig: - # To make fixed length, pad with one or two zeros. - sig += b'\000' * (self.sig_len() - len(sig)) - return sig - else: - return sig diff --git a/mcuboot/scripts/imgtool/keys/ecdsa_test.py b/mcuboot/scripts/imgtool/keys/ecdsa_test.py deleted file mode 100644 index 31fe08590..000000000 --- a/mcuboot/scripts/imgtool/keys/ecdsa_test.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -Tests for ECDSA keys -""" - -import io -import os.path -import sys -import tempfile -import unittest - -from cryptography.exceptions import InvalidSignature -from cryptography.hazmat.primitives.asymmetric import ec -from cryptography.hazmat.primitives.hashes import SHA256 - -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..'))) - -from imgtool.keys import load, ECDSA256P1, ECDSAUsageError - -class EcKeyGeneration(unittest.TestCase): - - def setUp(self): - self.test_dir = tempfile.TemporaryDirectory() - - def tname(self, base): - return os.path.join(self.test_dir.name, base) - - def tearDown(self): - self.test_dir.cleanup() - - def test_keygen(self): - name1 = self.tname("keygen.pem") - k = ECDSA256P1.generate() - k.export_private(name1, b'secret') - - self.assertIsNone(load(name1)) - - k2 = load(name1, b'secret') - - pubname = self.tname('keygen-pub.pem') - k2.export_public(pubname) - pk2 = load(pubname) - - # We should be able to export the public key from the loaded - # public key, but not the private key. - pk2.export_public(self.tname('keygen-pub2.pem')) - self.assertRaises(ECDSAUsageError, - pk2.export_private, self.tname('keygen-priv2.pem')) - - def test_emit(self): - """Basic sanity check on the code emitters.""" - k = ECDSA256P1.generate() - - ccode = io.StringIO() - k.emit_c_public(ccode) - self.assertIn("ecdsa_pub_key", ccode.getvalue()) - self.assertIn("ecdsa_pub_key_len", ccode.getvalue()) - - rustcode = io.StringIO() - k.emit_rust_public(rustcode) - self.assertIn("ECDSA_PUB_KEY", rustcode.getvalue()) - - def test_emit_pub(self): - """Basic sanity check on the code emitters.""" - pubname = self.tname("public.pem") - k = ECDSA256P1.generate() - k.export_public(pubname) - - k2 = load(pubname) - - ccode = io.StringIO() - k2.emit_c_public(ccode) - self.assertIn("ecdsa_pub_key", ccode.getvalue()) - self.assertIn("ecdsa_pub_key_len", ccode.getvalue()) - - rustcode = io.StringIO() - k2.emit_rust_public(rustcode) - self.assertIn("ECDSA_PUB_KEY", rustcode.getvalue()) - - def test_sig(self): - k = ECDSA256P1.generate() - buf = b'This is the message' - sig = k.raw_sign(buf) - - # The code doesn't have any verification, so verify this - # manually. - k.key.public_key().verify( - signature=sig, - data=buf, - signature_algorithm=ec.ECDSA(SHA256())) - - # Modify the message to make sure the signature fails. - self.assertRaises(InvalidSignature, - k.key.public_key().verify, - signature=sig, - data=b'This is thE message', - signature_algorithm=ec.ECDSA(SHA256())) - -if __name__ == '__main__': - unittest.main() diff --git a/mcuboot/scripts/imgtool/keys/ed25519.py b/mcuboot/scripts/imgtool/keys/ed25519.py deleted file mode 100644 index f20c5dc44..000000000 --- a/mcuboot/scripts/imgtool/keys/ed25519.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -ED25519 key management -""" - -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import serialization -from cryptography.hazmat.primitives.asymmetric import ed25519 - -from .general import KeyClass - - -class Ed25519UsageError(Exception): - pass - - -class Ed25519Public(KeyClass): - def __init__(self, key): - self.key = key - - def shortname(self): - return "ed25519" - - def _unsupported(self, name): - raise Ed25519UsageError("Operation {} requires private key".format(name)) - - def _get_public(self): - return self.key - - def get_public_bytes(self): - # The key is embedded into MBUboot in "SubjectPublicKeyInfo" format - return self._get_public().public_bytes( - encoding=serialization.Encoding.DER, - format=serialization.PublicFormat.SubjectPublicKeyInfo) - - def get_private_bytes(self, minimal): - self._unsupported('get_private_bytes') - - def export_private(self, path, passwd=None): - self._unsupported('export_private') - - def export_public(self, path): - """Write the public key to the given file.""" - pem = self._get_public().public_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PublicFormat.SubjectPublicKeyInfo) - with open(path, 'wb') as f: - f.write(pem) - - def sig_type(self): - return "ED25519" - - def sig_tlv(self): - return "ED25519" - - def sig_len(self): - return 64 - - -class Ed25519(Ed25519Public): - """ - Wrapper around an ED25519 private key. - """ - - def __init__(self, key): - """key should be an instance of EllipticCurvePrivateKey""" - self.key = key - - @staticmethod - def generate(): - pk = ed25519.Ed25519PrivateKey.generate() - return Ed25519(pk) - - def _get_public(self): - return self.key.public_key() - - def get_private_bytes(self, minimal): - raise Ed25519UsageError("Operation not supported with {} keys".format( - self.shortname())) - - def export_private(self, path, passwd=None): - """ - Write the private key to the given file, protecting it with the - optional password. - """ - if passwd is None: - enc = serialization.NoEncryption() - else: - enc = serialization.BestAvailableEncryption(passwd) - pem = self.key.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.PKCS8, - encryption_algorithm=enc) - with open(path, 'wb') as f: - f.write(pem) - - def sign_digest(self, digest): - """Return the actual signature""" - return self.key.sign(data=digest) - - def verify_digest(self, signature, digest): - """Verify that signature is valid for given digest""" - k = self.key - if isinstance(self.key, ed25519.Ed25519PrivateKey): - k = self.key.public_key() - return k.verify(signature=signature, data=digest) diff --git a/mcuboot/scripts/imgtool/keys/ed25519_test.py b/mcuboot/scripts/imgtool/keys/ed25519_test.py deleted file mode 100644 index 31f43fe9b..000000000 --- a/mcuboot/scripts/imgtool/keys/ed25519_test.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -Tests for ECDSA keys -""" - -import hashlib -import io -import os.path -import sys -import tempfile -import unittest - -from cryptography.exceptions import InvalidSignature -from cryptography.hazmat.primitives.asymmetric import ed25519 - -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..'))) - -from imgtool.keys import load, Ed25519, Ed25519UsageError - - -class Ed25519KeyGeneration(unittest.TestCase): - - def setUp(self): - self.test_dir = tempfile.TemporaryDirectory() - - def tname(self, base): - return os.path.join(self.test_dir.name, base) - - def tearDown(self): - self.test_dir.cleanup() - - def test_keygen(self): - name1 = self.tname("keygen.pem") - k = Ed25519.generate() - k.export_private(name1, b'secret') - - self.assertIsNone(load(name1)) - - k2 = load(name1, b'secret') - - pubname = self.tname('keygen-pub.pem') - k2.export_public(pubname) - pk2 = load(pubname) - - # We should be able to export the public key from the loaded - # public key, but not the private key. - pk2.export_public(self.tname('keygen-pub2.pem')) - self.assertRaises(Ed25519UsageError, - pk2.export_private, self.tname('keygen-priv2.pem')) - - def test_emit(self): - """Basic sanity check on the code emitters.""" - k = Ed25519.generate() - - ccode = io.StringIO() - k.emit_c_public(ccode) - self.assertIn("ed25519_pub_key", ccode.getvalue()) - self.assertIn("ed25519_pub_key_len", ccode.getvalue()) - - rustcode = io.StringIO() - k.emit_rust_public(rustcode) - self.assertIn("ED25519_PUB_KEY", rustcode.getvalue()) - - def test_emit_pub(self): - """Basic sanity check on the code emitters.""" - pubname = self.tname("public.pem") - k = Ed25519.generate() - k.export_public(pubname) - - k2 = load(pubname) - - ccode = io.StringIO() - k2.emit_c_public(ccode) - self.assertIn("ed25519_pub_key", ccode.getvalue()) - self.assertIn("ed25519_pub_key_len", ccode.getvalue()) - - rustcode = io.StringIO() - k2.emit_rust_public(rustcode) - self.assertIn("ED25519_PUB_KEY", rustcode.getvalue()) - - def test_sig(self): - k = Ed25519.generate() - buf = b'This is the message' - sha = hashlib.sha256() - sha.update(buf) - digest = sha.digest() - sig = k.sign_digest(digest) - - # The code doesn't have any verification, so verify this - # manually. - k.key.public_key().verify(signature=sig, data=digest) - - # Modify the message to make sure the signature fails. - sha = hashlib.sha256() - sha.update(b'This is thE message') - new_digest = sha.digest() - self.assertRaises(InvalidSignature, - k.key.public_key().verify, - signature=sig, - data=new_digest) - - -if __name__ == '__main__': - unittest.main() diff --git a/mcuboot/scripts/imgtool/keys/general.py b/mcuboot/scripts/imgtool/keys/general.py deleted file mode 100644 index f6b8a0953..000000000 --- a/mcuboot/scripts/imgtool/keys/general.py +++ /dev/null @@ -1,45 +0,0 @@ -"""General key class.""" - -import sys - -AUTOGEN_MESSAGE = "/* Autogenerated by imgtool.py, do not edit. */" - -class KeyClass(object): - def _emit(self, header, trailer, encoded_bytes, indent, file=sys.stdout, len_format=None): - print(AUTOGEN_MESSAGE, file=file) - print(header, end='', file=file) - for count, b in enumerate(encoded_bytes): - if count % 8 == 0: - print("\n" + indent, end='', file=file) - else: - print(" ", end='', file=file) - print("0x{:02x},".format(b), end='', file=file) - print("\n" + trailer, file=file) - if len_format is not None: - print(len_format.format(len(encoded_bytes)), file=file) - - def emit_c_public(self, file=sys.stdout): - self._emit( - header="const unsigned char {}_pub_key[] = {{".format(self.shortname()), - trailer="};", - encoded_bytes=self.get_public_bytes(), - indent=" ", - len_format="const unsigned int {}_pub_key_len = {{}};".format(self.shortname()), - file=file) - - def emit_rust_public(self, file=sys.stdout): - self._emit( - header="static {}_PUB_KEY: &'static [u8] = &[".format(self.shortname().upper()), - trailer="];", - encoded_bytes=self.get_public_bytes(), - indent=" ", - file=file) - - def emit_private(self, minimal, file=sys.stdout): - self._emit( - header="const unsigned char enc_priv_key[] = {", - trailer="};", - encoded_bytes=self.get_private_bytes(minimal), - indent=" ", - len_format="const unsigned int enc_priv_key_len = {};", - file=file) diff --git a/mcuboot/scripts/imgtool/keys/rsa.py b/mcuboot/scripts/imgtool/keys/rsa.py deleted file mode 100644 index 85c034215..000000000 --- a/mcuboot/scripts/imgtool/keys/rsa.py +++ /dev/null @@ -1,163 +0,0 @@ -""" -RSA Key management -""" - -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import serialization -from cryptography.hazmat.primitives.asymmetric import rsa -from cryptography.hazmat.primitives.asymmetric.padding import PSS, MGF1 -from cryptography.hazmat.primitives.hashes import SHA256 - -from .general import KeyClass - - -# Sizes that bootutil will recognize -RSA_KEY_SIZES = [2048, 3072] - - -class RSAUsageError(Exception): - pass - - -class RSAPublic(KeyClass): - """The public key can only do a few operations""" - def __init__(self, key): - self.key = key - - def key_size(self): - return self.key.key_size - - def shortname(self): - return "rsa" - - def _unsupported(self, name): - raise RSAUsageError("Operation {} requires private key".format(name)) - - def _get_public(self): - return self.key - - def get_public_bytes(self): - # The key embedded into MCUboot is in PKCS1 format. - return self._get_public().public_bytes( - encoding=serialization.Encoding.DER, - format=serialization.PublicFormat.PKCS1) - - def get_private_bytes(self, minimal): - self._unsupported('get_private_bytes') - - def export_private(self, path, passwd=None): - self._unsupported('export_private') - - def export_public(self, path): - """Write the public key to the given file.""" - pem = self._get_public().public_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PublicFormat.SubjectPublicKeyInfo) - with open(path, 'wb') as f: - f.write(pem) - - def sig_type(self): - return "PKCS1_PSS_RSA{}_SHA256".format(self.key_size()) - - def sig_tlv(self): - return"RSA{}".format(self.key_size()) - - def sig_len(self): - return self.key_size() / 8 - - def verify(self, signature, payload): - k = self.key - if isinstance(self.key, rsa.RSAPrivateKey): - k = self.key.public_key() - return k.verify(signature=signature, data=payload, - padding=PSS(mgf=MGF1(SHA256()), salt_length=32), - algorithm=SHA256()) - - -class RSA(RSAPublic): - """ - Wrapper around an RSA key, with imgtool support. - """ - - def __init__(self, key): - """The key should be a private key from cryptography""" - self.key = key - - @staticmethod - def generate(key_size=2048): - if key_size not in RSA_KEY_SIZES: - raise RSAUsageError("Key size {} is not supported by MCUboot" - .format(key_size)) - pk = rsa.generate_private_key( - public_exponent=65537, - key_size=key_size, - backend=default_backend()) - return RSA(pk) - - def _get_public(self): - return self.key.public_key() - - def _build_minimal_rsa_privkey(self, der): - ''' - Builds a new DER that only includes N/E/D/P/Q RSA parameters; - standard DER private bytes provided by OpenSSL also includes - CRT params (DP/DQ/QP) which can be removed. - ''' - OFFSET_N = 7 # N is always located at this offset - b = bytearray(der) - off = OFFSET_N - if b[off + 1] != 0x82: - raise RSAUsageError("Error parsing N while minimizing") - len_N = (b[off + 2] << 8) + b[off + 3] + 4 - off += len_N - if b[off + 1] != 0x03: - raise RSAUsageError("Error parsing E while minimizing") - len_E = b[off + 2] + 4 - off += len_E - if b[off + 1] != 0x82: - raise RSAUsageError("Error parsing D while minimizing") - len_D = (b[off + 2] << 8) + b[off + 3] + 4 - off += len_D - if b[off + 1] != 0x81: - raise RSAUsageError("Error parsing P while minimizing") - len_P = b[off + 2] + 3 - off += len_P - if b[off + 1] != 0x81: - raise RSAUsageError("Error parsing Q while minimizing") - len_Q = b[off + 2] + 3 - off += len_Q - # adjust DER size for removed elements - b[2] = (off - 4) >> 8 - b[3] = (off - 4) & 0xff - return b[:off] - - def get_private_bytes(self, minimal): - priv = self.key.private_bytes( - encoding=serialization.Encoding.DER, - format=serialization.PrivateFormat.TraditionalOpenSSL, - encryption_algorithm=serialization.NoEncryption()) - if minimal: - priv = self._build_minimal_rsa_privkey(priv) - return priv - - def export_private(self, path, passwd=None): - """Write the private key to the given file, protecting it with the - optional password.""" - if passwd is None: - enc = serialization.NoEncryption() - else: - enc = serialization.BestAvailableEncryption(passwd) - pem = self.key.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.PKCS8, - encryption_algorithm=enc) - with open(path, 'wb') as f: - f.write(pem) - - def sign(self, payload): - # The verification code only allows the salt length to be the - # same as the hash length, 32. - return self.key.sign( - data=payload, - padding=PSS(mgf=MGF1(SHA256()), salt_length=32), - algorithm=SHA256()) diff --git a/mcuboot/scripts/imgtool/keys/rsa_test.py b/mcuboot/scripts/imgtool/keys/rsa_test.py deleted file mode 100644 index b0afa8352..000000000 --- a/mcuboot/scripts/imgtool/keys/rsa_test.py +++ /dev/null @@ -1,115 +0,0 @@ -""" -Tests for RSA keys -""" - -import io -import os -import sys -import tempfile -import unittest - -from cryptography.exceptions import InvalidSignature -from cryptography.hazmat.primitives.asymmetric.padding import PSS, MGF1 -from cryptography.hazmat.primitives.hashes import SHA256 - -# Setup sys path so 'imgtool' is in it. -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), - '../..'))) - -from imgtool.keys import load, RSA, RSAUsageError -from imgtool.keys.rsa import RSA_KEY_SIZES - - -class KeyGeneration(unittest.TestCase): - - def setUp(self): - self.test_dir = tempfile.TemporaryDirectory() - - def tname(self, base): - return os.path.join(self.test_dir.name, base) - - def tearDown(self): - self.test_dir.cleanup() - - def test_keygen(self): - # Try generating a RSA key with non-supported size - with self.assertRaises(RSAUsageError): - RSA.generate(key_size=1024) - - for key_size in RSA_KEY_SIZES: - name1 = self.tname("keygen.pem") - k = RSA.generate(key_size=key_size) - k.export_private(name1, b'secret') - - # Try loading the key without a password. - self.assertIsNone(load(name1)) - - k2 = load(name1, b'secret') - - pubname = self.tname('keygen-pub.pem') - k2.export_public(pubname) - pk2 = load(pubname) - - # We should be able to export the public key from the loaded - # public key, but not the private key. - pk2.export_public(self.tname('keygen-pub2.pem')) - self.assertRaises(RSAUsageError, pk2.export_private, - self.tname('keygen-priv2.pem')) - - def test_emit(self): - """Basic sanity check on the code emitters.""" - for key_size in RSA_KEY_SIZES: - k = RSA.generate(key_size=key_size) - - ccode = io.StringIO() - k.emit_c_public(ccode) - self.assertIn("rsa_pub_key", ccode.getvalue()) - self.assertIn("rsa_pub_key_len", ccode.getvalue()) - - rustcode = io.StringIO() - k.emit_rust_public(rustcode) - self.assertIn("RSA_PUB_KEY", rustcode.getvalue()) - - def test_emit_pub(self): - """Basic sanity check on the code emitters, from public key.""" - pubname = self.tname("public.pem") - for key_size in RSA_KEY_SIZES: - k = RSA.generate(key_size=key_size) - k.export_public(pubname) - - k2 = load(pubname) - - ccode = io.StringIO() - k2.emit_c_public(ccode) - self.assertIn("rsa_pub_key", ccode.getvalue()) - self.assertIn("rsa_pub_key_len", ccode.getvalue()) - - rustcode = io.StringIO() - k2.emit_rust_public(rustcode) - self.assertIn("RSA_PUB_KEY", rustcode.getvalue()) - - def test_sig(self): - for key_size in RSA_KEY_SIZES: - k = RSA.generate(key_size=key_size) - buf = b'This is the message' - sig = k.sign(buf) - - # The code doesn't have any verification, so verify this - # manually. - k.key.public_key().verify( - signature=sig, - data=buf, - padding=PSS(mgf=MGF1(SHA256()), salt_length=32), - algorithm=SHA256()) - - # Modify the message to make sure the signature fails. - self.assertRaises(InvalidSignature, - k.key.public_key().verify, - signature=sig, - data=b'This is thE message', - padding=PSS(mgf=MGF1(SHA256()), salt_length=32), - algorithm=SHA256()) - - -if __name__ == '__main__': - unittest.main() diff --git a/mcuboot/scripts/imgtool/keys/x25519.py b/mcuboot/scripts/imgtool/keys/x25519.py deleted file mode 100644 index adb68a1a2..000000000 --- a/mcuboot/scripts/imgtool/keys/x25519.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -X25519 key management -""" - -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import serialization -from cryptography.hazmat.primitives.asymmetric import x25519 - -from .general import KeyClass - - -class X25519UsageError(Exception): - pass - - -class X25519Public(KeyClass): - def __init__(self, key): - self.key = key - - def shortname(self): - return "x25519" - - def _unsupported(self, name): - raise X25519UsageError("Operation {} requires private key".format(name)) - - def _get_public(self): - return self.key - - def get_public_bytes(self): - # The key is embedded into MBUboot in "SubjectPublicKeyInfo" format - return self._get_public().public_bytes( - encoding=serialization.Encoding.DER, - format=serialization.PublicFormat.SubjectPublicKeyInfo) - - def get_private_bytes(self, minimal): - self._unsupported('get_private_bytes') - - def export_private(self, path, passwd=None): - self._unsupported('export_private') - - def export_public(self, path): - """Write the public key to the given file.""" - pem = self._get_public().public_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PublicFormat.SubjectPublicKeyInfo) - with open(path, 'wb') as f: - f.write(pem) - - def sig_type(self): - return "X25519" - - def sig_tlv(self): - return "X25519" - - def sig_len(self): - return 32 - - -class X25519(X25519Public): - """ - Wrapper around an X25519 private key. - """ - - def __init__(self, key): - """key should be an instance of EllipticCurvePrivateKey""" - self.key = key - - @staticmethod - def generate(): - pk = x25519.X25519PrivateKey.generate() - return X25519(pk) - - def _get_public(self): - return self.key.public_key() - - def get_private_bytes(self, minimal): - return self.key.private_bytes( - encoding=serialization.Encoding.DER, - format=serialization.PrivateFormat.PKCS8, - encryption_algorithm=serialization.NoEncryption()) - - def export_private(self, path, passwd=None): - """ - Write the private key to the given file, protecting it with the - optional password. - """ - if passwd is None: - enc = serialization.NoEncryption() - else: - enc = serialization.BestAvailableEncryption(passwd) - pem = self.key.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.PKCS8, - encryption_algorithm=enc) - with open(path, 'wb') as f: - f.write(pem) - - def sign_digest(self, digest): - """Return the actual signature""" - return self.key.sign(data=digest) - - def verify_digest(self, signature, digest): - """Verify that signature is valid for given digest""" - k = self.key - if isinstance(self.key, x25519.X25519PrivateKey): - k = self.key.public_key() - return k.verify(signature=signature, data=digest) diff --git a/mcuboot/scripts/imgtool/main.py b/mcuboot/scripts/imgtool/main.py deleted file mode 100755 index bc96ca986..000000000 --- a/mcuboot/scripts/imgtool/main.py +++ /dev/null @@ -1,352 +0,0 @@ -#! /usr/bin/env python3 -# -# Copyright 2017-2020 Linaro Limited -# Copyright 2019-2020 Arm Limited -# -# 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 re -import click -import getpass -import imgtool.keys as keys -import sys -from imgtool import image, imgtool_version -from imgtool.version import decode_version -from .keys import ( - RSAUsageError, ECDSAUsageError, Ed25519UsageError, X25519UsageError) - -MIN_PYTHON_VERSION = (3, 6) -if sys.version_info < MIN_PYTHON_VERSION: - sys.exit("Python %s.%s or newer is required by imgtool." - % MIN_PYTHON_VERSION) - - -def gen_rsa2048(keyfile, passwd): - keys.RSA.generate().export_private(path=keyfile, passwd=passwd) - - -def gen_rsa3072(keyfile, passwd): - keys.RSA.generate(key_size=3072).export_private(path=keyfile, - passwd=passwd) - - -def gen_ecdsa_p256(keyfile, passwd): - keys.ECDSA256P1.generate().export_private(keyfile, passwd=passwd) - - -def gen_ecdsa_p224(keyfile, passwd): - print("TODO: p-224 not yet implemented") - - -def gen_ed25519(keyfile, passwd): - keys.Ed25519.generate().export_private(path=keyfile, passwd=passwd) - - -def gen_x25519(keyfile, passwd): - keys.X25519.generate().export_private(path=keyfile, passwd=passwd) - - -valid_langs = ['c', 'rust'] -keygens = { - 'rsa-2048': gen_rsa2048, - 'rsa-3072': gen_rsa3072, - 'ecdsa-p256': gen_ecdsa_p256, - 'ecdsa-p224': gen_ecdsa_p224, - 'ed25519': gen_ed25519, - 'x25519': gen_x25519, -} - - -def load_key(keyfile): - # TODO: better handling of invalid pass-phrase - key = keys.load(keyfile) - if key is not None: - return key - passwd = getpass.getpass("Enter key passphrase: ").encode('utf-8') - return keys.load(keyfile, passwd) - - -def get_password(): - while True: - passwd = getpass.getpass("Enter key passphrase: ") - passwd2 = getpass.getpass("Reenter passphrase: ") - if passwd == passwd2: - break - print("Passwords do not match, try again") - - # Password must be bytes, always use UTF-8 for consistent - # encoding. - return passwd.encode('utf-8') - - -@click.option('-p', '--password', is_flag=True, - help='Prompt for password to protect key') -@click.option('-t', '--type', metavar='type', required=True, - type=click.Choice(keygens.keys()), prompt=True, - help='{}'.format('One of: {}'.format(', '.join(keygens.keys())))) -@click.option('-k', '--key', metavar='filename', required=True) -@click.command(help='Generate pub/private keypair') -def keygen(type, key, password): - password = get_password() if password else None - keygens[type](key, password) - - -@click.option('-l', '--lang', metavar='lang', default=valid_langs[0], - type=click.Choice(valid_langs)) -@click.option('-k', '--key', metavar='filename', required=True) -@click.command(help='Dump public key from keypair') -def getpub(key, lang): - key = load_key(key) - if key is None: - print("Invalid passphrase") - elif lang == 'c': - key.emit_c_public() - elif lang == 'rust': - key.emit_rust_public() - else: - raise ValueError("BUG: should never get here!") - - -@click.option('--minimal', default=False, is_flag=True, - help='Reduce the size of the dumped private key to include only ' - 'the minimum amount of data required to decrypt. This ' - 'might require changes to the build config. Check the docs!' - ) -@click.option('-k', '--key', metavar='filename', required=True) -@click.command(help='Dump private key from keypair') -def getpriv(key, minimal): - key = load_key(key) - if key is None: - print("Invalid passphrase") - try: - key.emit_private(minimal) - except (RSAUsageError, ECDSAUsageError, Ed25519UsageError, - X25519UsageError) as e: - raise click.UsageError(e) - - -@click.argument('imgfile') -@click.option('-k', '--key', metavar='filename') -@click.command(help="Check that signed image can be verified by given key") -def verify(key, imgfile): - key = load_key(key) if key else None - ret, version = image.Image.verify(imgfile, key) - if ret == image.VerifyResult.OK: - print("Image was correctly validated") - print("Image version: {}.{}.{}+{}".format(*version)) - return - elif ret == image.VerifyResult.INVALID_MAGIC: - print("Invalid image magic; is this an MCUboot image?") - elif ret == image.VerifyResult.INVALID_TLV_INFO_MAGIC: - print("Invalid TLV info magic; is this an MCUboot image?") - elif ret == image.VerifyResult.INVALID_HASH: - print("Image has an invalid sha256 digest") - elif ret == image.VerifyResult.INVALID_SIGNATURE: - print("No signature found for the given key") - else: - print("Unknown return code: {}".format(ret)) - sys.exit(1) - - -def validate_version(ctx, param, value): - try: - decode_version(value) - return value - except ValueError as e: - raise click.BadParameter("{}".format(e)) - - -def validate_security_counter(ctx, param, value): - if value is not None: - if value.lower() == 'auto': - return 'auto' - else: - try: - return int(value, 0) - except ValueError: - raise click.BadParameter( - "{} is not a valid integer. Please use code literals " - "prefixed with 0b/0B, 0o/0O, or 0x/0X as necessary." - .format(value)) - - -def validate_header_size(ctx, param, value): - min_hdr_size = image.IMAGE_HEADER_SIZE - if value < min_hdr_size: - raise click.BadParameter( - "Minimum value for -H/--header-size is {}".format(min_hdr_size)) - return value - - -def get_dependencies(ctx, param, value): - if value is not None: - versions = [] - images = re.findall(r"\((\d+)", value) - if len(images) == 0: - raise click.BadParameter( - "Image dependency format is invalid: {}".format(value)) - raw_versions = re.findall(r",\s*([0-9.+]+)\)", value) - if len(images) != len(raw_versions): - raise click.BadParameter( - '''There's a mismatch between the number of dependency images - and versions in: {}'''.format(value)) - for raw_version in raw_versions: - try: - versions.append(decode_version(raw_version)) - except ValueError as e: - raise click.BadParameter("{}".format(e)) - dependencies = dict() - dependencies[image.DEP_IMAGES_KEY] = images - dependencies[image.DEP_VERSIONS_KEY] = versions - return dependencies - - -class BasedIntParamType(click.ParamType): - name = 'integer' - - def convert(self, value, param, ctx): - try: - return int(value, 0) - except ValueError: - self.fail('%s is not a valid integer. Please use code literals ' - 'prefixed with 0b/0B, 0o/0O, or 0x/0X as necessary.' - % value, param, ctx) - - -@click.argument('outfile') -@click.argument('infile') -@click.option('-R', '--erased-val', type=click.Choice(['0', '0xff']), - required=False, - help='The value that is read back from erased flash.') -@click.option('-x', '--hex-addr', type=BasedIntParamType(), required=False, - help='Adjust address in hex output file.') -@click.option('-L', '--load-addr', type=BasedIntParamType(), required=False, - help='Load address for image when it should run from RAM.') -@click.option('--save-enctlv', default=False, is_flag=True, - help='When upgrading, save encrypted key TLVs instead of plain ' - 'keys. Enable when BOOT_SWAP_SAVE_ENCTLV config option ' - 'was set.') -@click.option('-E', '--encrypt', metavar='filename', - help='Encrypt image using the provided public key') -@click.option('-e', '--endian', type=click.Choice(['little', 'big']), - default='little', help="Select little or big endian") -@click.option('--overwrite-only', default=False, is_flag=True, - help='Use overwrite-only instead of swap upgrades') -@click.option('--boot-record', metavar='sw_type', help='Create CBOR encoded ' - 'boot record TLV. The sw_type represents the role of the ' - 'software component (e.g. CoFM for coprocessor firmware). ' - '[max. 12 characters]') -@click.option('-M', '--max-sectors', type=int, - help='When padding allow for this amount of sectors (defaults ' - 'to 128)') -@click.option('--confirm', default=False, is_flag=True, - help='When padding the image, mark it as confirmed') -@click.option('--pad', default=False, is_flag=True, - help='Pad image to --slot-size bytes, adding trailer magic') -@click.option('-S', '--slot-size', type=BasedIntParamType(), required=True, - help='Size of the slot where the image will be written') -@click.option('--pad-header', default=False, is_flag=True, - help='Add --header-size zeroed bytes at the beginning of the ' - 'image') -@click.option('-H', '--header-size', callback=validate_header_size, - type=BasedIntParamType(), required=True) -@click.option('--pad-sig', default=False, is_flag=True, - help='Add 0-2 bytes of padding to ECDSA signature ' - '(for mcuboot <1.5)') -@click.option('-d', '--dependencies', callback=get_dependencies, - required=False, help='''Add dependence on another image, format: - "(,), ... "''') -@click.option('-s', '--security-counter', callback=validate_security_counter, - help='Specify the value of security counter. Use the `auto` ' - 'keyword to automatically generate it from the image version.') -@click.option('-v', '--version', callback=validate_version, required=True) -@click.option('--align', type=click.Choice(['1', '2', '4', '8']), - required=True) -@click.option('--public-key-format', type=click.Choice(['hash', 'full']), - default='hash', help='In what format to add the public key to ' - 'the image manifest: full key or hash of the key.') -@click.option('-k', '--key', metavar='filename') -@click.command(help='''Create a signed or unsigned image\n - INFILE and OUTFILE are parsed as Intel HEX if the params have - .hex extension, otherwise binary format is used''') -def sign(key, public_key_format, align, version, pad_sig, header_size, - pad_header, slot_size, pad, confirm, max_sectors, overwrite_only, - endian, encrypt, infile, outfile, dependencies, load_addr, hex_addr, - erased_val, save_enctlv, security_counter, boot_record): - img = image.Image(version=decode_version(version), header_size=header_size, - pad_header=pad_header, pad=pad, confirm=confirm, - align=int(align), slot_size=slot_size, - max_sectors=max_sectors, overwrite_only=overwrite_only, - endian=endian, load_addr=load_addr, erased_val=erased_val, - save_enctlv=save_enctlv, - security_counter=security_counter) - img.load(infile) - key = load_key(key) if key else None - enckey = load_key(encrypt) if encrypt else None - if enckey and key: - if ((isinstance(key, keys.ECDSA256P1) and - not isinstance(enckey, keys.ECDSA256P1Public)) - or (isinstance(key, keys.RSA) and - not isinstance(enckey, keys.RSAPublic))): - # FIXME - raise click.UsageError("Signing and encryption must use the same " - "type of key") - - if pad_sig and hasattr(key, 'pad_sig'): - key.pad_sig = True - - img.create(key, public_key_format, enckey, dependencies, boot_record) - img.save(outfile, hex_addr) - - -class AliasesGroup(click.Group): - - _aliases = { - "create": "sign", - } - - def list_commands(self, ctx): - cmds = [k for k in self.commands] - aliases = [k for k in self._aliases] - return sorted(cmds + aliases) - - def get_command(self, ctx, cmd_name): - rv = click.Group.get_command(self, ctx, cmd_name) - if rv is not None: - return rv - if cmd_name in self._aliases: - return click.Group.get_command(self, ctx, self._aliases[cmd_name]) - return None - - -@click.command(help='Print imgtool version information') -def version(): - print(imgtool_version) - - -@click.command(cls=AliasesGroup, - context_settings=dict(help_option_names=['-h', '--help'])) -def imgtool(): - pass - - -imgtool.add_command(keygen) -imgtool.add_command(getpub) -imgtool.add_command(getpriv) -imgtool.add_command(verify) -imgtool.add_command(sign) -imgtool.add_command(version) - - -if __name__ == '__main__': - imgtool() diff --git a/mcuboot/scripts/imgtool/version.py b/mcuboot/scripts/imgtool/version.py deleted file mode 100644 index 8910e0b1a..000000000 --- a/mcuboot/scripts/imgtool/version.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2017 Linaro Limited -# -# 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. - -""" -Semi Semantic Versioning - -Implements a subset of semantic versioning that is supportable by the image -header. -""" - -from collections import namedtuple -import re - -SemiSemVersion = namedtuple('SemiSemVersion', ['major', 'minor', 'revision', - 'build']) - -version_re = re.compile( - r"""^([1-9]\d*|0)(\.([1-9]\d*|0)(\.([1-9]\d*|0)(\+([1-9]\d*|0))?)?)?$""") - - -def decode_version(text): - """Decode the version string, which should be of the form maj.min.rev+build - """ - m = version_re.match(text) - if m: - result = SemiSemVersion( - int(m.group(1)) if m.group(1) else 0, - int(m.group(3)) if m.group(3) else 0, - int(m.group(5)) if m.group(5) else 0, - int(m.group(7)) if m.group(7) else 0) - return result - else: - msg = "Invalid version number, should be maj.min.rev+build with later " - msg += "parts optional" - raise ValueError(msg) - - -if __name__ == '__main__': - print(decode_version("1.2")) - print(decode_version("1.0")) - print(decode_version("0.0.2+75")) - print(decode_version("0.0.0+00")) diff --git a/mcuboot/scripts/jgdb.sh b/mcuboot/scripts/jgdb.sh deleted file mode 100755 index a79c87c6f..000000000 --- a/mcuboot/scripts/jgdb.sh +++ /dev/null @@ -1,6 +0,0 @@ -#! /bin/bash - -source $(dirname $0)/../target.sh - -# Start the jlink gdb server -JLinkGDBServer -if swd -device $SOC -speed auto diff --git a/mcuboot/scripts/jl.sh b/mcuboot/scripts/jl.sh deleted file mode 100755 index 260206d58..000000000 --- a/mcuboot/scripts/jl.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -source $(dirname $0)/../target.sh - -JLinkExe -speed auto -si SWD -device $SOC diff --git a/mcuboot/scripts/mcubin.bt b/mcuboot/scripts/mcubin.bt deleted file mode 100644 index e2ec3614b..000000000 --- a/mcuboot/scripts/mcubin.bt +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (C) 2019, Linaro Ltd -// -// 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 a Binary Template file for the 010 Editor -// (http://www.sweetscape.com/010editor/) to allow it to show the -// structure of an MCUboot image. - -LittleEndian(); - -struct ENTRY { - uint32 id; - uint32 offset; - uint32 size; - uint32 pad; -}; - -// The simulator writes the partition table at the beginning of the -// image, so that we can tell where the partitions are. If you are -// trying to view an image captured from a device, you can either -// construct a synthetic partition table in the file, or change code -// described below to hardcode one. -struct PTABLE { - uchar pheader[8]; - if (ptable.pheader != "mcuboot\0") { - // NOTE: Put code here to hard code a partition table, and - // continue. - Warning("Invalid magic on ptable header"); - return -1; - } else { - uint32 count; - struct ENTRY entries[count]; - } -}; - -struct PTABLE ptable; - -struct IMAGE_VERSION { - uchar major; - uchar minor; - uint16 revision; - uint32 build_num; -}; - -struct IHDR { - uint32 magic ; - uint32 load_addr ; - uint16 hdr_size ; - uint16 protect_size ; - uint32 img_size ; - uint32 flags; - struct IMAGE_VERSION ver; - uint32 _pad1; -}; - -struct TLV_HDR { - uint16 magic; - uint16 tlv_tot; -}; - -struct TLV { - uchar type ; - uchar pad; - uint16 len; - - switch (type) { - case 0x01: // keyhash - uchar keyhash[len]; - break; - case 0x40: // dependency - if (len != 12) { - Warning("Invalid dependency size"); - return -1; - } - uchar image_id; - uchar pad1; - uint16 pad2; - struct IMAGE_VERSION version; - break; - default: - // Other, just consume the data. - uchar data[len]; - } -}; - -local int i; -local int epos; - -for (i = 0; i < ptable.count; i++) { - FSeek(ptable.entries[i].offset); - switch (ptable.entries[i].id) { - case 1: - case 2: - case 4: - case 5: - struct IMAGE { - struct IHDR ihdr; - - if (ihdr.magic == 0x96f3b83d) { - uchar payload[ihdr.img_size]; - - epos = FTell(); - struct TLV_HDR tlv_hdr; - - if (tlv_hdr.magic == 0x6907) { - epos += tlv_hdr.tlv_tot; - while (FTell() < epos) { - struct TLV tlv; - } - } - } - // uchar block[ptable.entries[i].size]; - } image; - break; - case 3: - struct SCRATCH { - uchar data[ptable.entries[i].size]; - } scratch; - break; - default: - break; - } -} diff --git a/mcuboot/scripts/requirements.txt b/mcuboot/scripts/requirements.txt deleted file mode 100644 index 9481e2c12..000000000 --- a/mcuboot/scripts/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -cryptography>=2.6 -intelhex -click -cbor>=1.0.0 diff --git a/mcuboot/scripts/setup.py b/mcuboot/scripts/setup.py deleted file mode 100644 index 058d0cb4e..000000000 --- a/mcuboot/scripts/setup.py +++ /dev/null @@ -1,29 +0,0 @@ -import setuptools -from imgtool import imgtool_version - -setuptools.setup( - name="imgtool", - version=imgtool_version, - author="The MCUboot committers", - author_email="dev-mcuboot@lists.runtime.co", - description=("MCUboot's image signing and key management"), - license="Apache Software License", - url="http://github.com/JuulLabs-OSS/mcuboot", - packages=setuptools.find_packages(), - python_requires='>=3.6', - install_requires=[ - 'cryptography>=2.4.2', - 'intelhex>=2.2.1', - 'click', - 'cbor>=1.0.0', - ], - entry_points={ - "console_scripts": ["imgtool=imgtool.main:imgtool"] - }, - classifiers=[ - "Programming Language :: Python :: 3", - "Development Status :: 4 - Beta", - "Topic :: Software Development :: Build Tools", - "License :: OSI Approved :: Apache Software License", - ], -) diff --git a/mcuboot/sim/.gitignore b/mcuboot/sim/.gitignore deleted file mode 100644 index 940967444..000000000 --- a/mcuboot/sim/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target -.*.swp diff --git a/mcuboot/sim/Cargo.lock b/mcuboot/sim/Cargo.lock deleted file mode 100644 index d34e1c2c5..000000000 --- a/mcuboot/sim/Cargo.lock +++ /dev/null @@ -1,668 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "aes-ctr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "aesni 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ctr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "stream-cipher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "aes-soft" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "aesni" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stream-cipher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "aho-corasick" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "anyhow" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "backtrace" -version = "0.3.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "backtrace-sys" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "base64" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "block-cipher-trait" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bootsim" -version = "0.1.0" -dependencies = [ - "aes-ctr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "docopt 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mcuboot-sys 0.1.0", - "pem 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "simflash 0.1.0", - "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bumpalo" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "byteorder" -version = "1.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cc" -version = "1.0.50" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "ctr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "stream-cipher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "docopt" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "env_logger" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "failure" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "failure_derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "generic-array" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "heck" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hermit-abi" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "js-sys" -version = "0.3.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libc" -version = "0.2.66" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "log" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mcuboot-sys" -version = "0.1.0" -dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "simflash 0.1.0", -] - -[[package]] -name = "memchr" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "nom" -version = "4.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "pem" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "proc-macro2" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "quote" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "1.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "ring" -version = "0.16.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "simflash" -version = "0.1.0" -dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "sourcefile" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "stream-cipher" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "strsim" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "syn" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "synstructure" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "termcolor" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "typenum" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode-segmentation" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode-xid" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "untrusted" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "wasm-bindgen" -version = "0.2.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.58" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "wasm-bindgen-webidl" -version = "0.2.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "web-sys" -version = "0.3.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "weedle" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum aes-ctr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c1423b3db67ca4d7691404b6643c01a8d40569e00eb77f24f7278223fbb1a107" -"checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" -"checksum aesni 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea93ee7c249d885b395fca6181fd6416f0249b1a0a7c7a2e8bfd6b74cebd2f82" -"checksum aho-corasick 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)" = "743ad5a418686aad3b87fd14c43badd828cf26e214a00f92a384291cf22e1811" -"checksum anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" -"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -"checksum backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e4036b9bf40f3cf16aba72a3d65e8a520fc4bafcdc7079aea8f848c58c5b5536" -"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" -"checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" -"checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" -"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" -"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum ctr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28912c12ae9ba20d6971168379d1482a4ce17f4855f23218ffb53ddc91fbe69b" -"checksum docopt 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f525a586d310c87df72ebcd98009e57f1cc030c8c268305287a476beb653969" -"checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" -"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" -"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" -"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -"checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" -"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -"checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" -"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" -"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" -"checksum memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" -"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" -"checksum pem 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1581760c757a756a41f0ee3ff01256227bdf64cb752839779b95ffb01c59793" -"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" -"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" -"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" -"checksum regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "b28dfe3fe9badec5dbf0a79a9cccad2cfc2ab5484bdb3e44cbd1ae8b3ba2be06" -"checksum ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)" = "741ba1704ae21999c00942f9f5944f801e977f54302af346b596287599ad1862" -"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" -"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" -"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" -"checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" -"checksum stream-cipher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "766ac134af8a81b23b0394cce9cbbf60f6939cae7a31babe470f9766fdae9d9f" -"checksum strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" -"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" -"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" -"checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" -"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" -"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" -"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" -"checksum wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" -"checksum wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" -"checksum wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "574094772ce6921576fb6f2e3f7497b8a76273b6db092be18fc48a082de09dc3" -"checksum wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "e85031354f25eaebe78bb7db1c3d86140312a911a106b2e29f9cc440ce3e7668" -"checksum wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e7e61fc929f4c0dddb748b102ebf9f632e2b8d739f2016542b4de2965a9601" -"checksum wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "ef012a0d93fc0432df126a8eaf547b2dce25a8ce9212e1d3cbeef5c11157975d" -"checksum web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" -"checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/mcuboot/sim/Cargo.toml b/mcuboot/sim/Cargo.toml deleted file mode 100644 index b78dd92a8..000000000 --- a/mcuboot/sim/Cargo.toml +++ /dev/null @@ -1,51 +0,0 @@ -[package] -name = "bootsim" -version = "0.1.0" -authors = ["David Brown "] -edition = "2018" - -[features] -default = [] - -sig-rsa = ["mcuboot-sys/sig-rsa"] -sig-rsa3072 = ["mcuboot-sys/sig-rsa3072"] -sig-ecdsa = ["mcuboot-sys/sig-ecdsa"] -sig-ed25519 = ["mcuboot-sys/sig-ed25519"] -overwrite-only = ["mcuboot-sys/overwrite-only"] -swap-move = ["mcuboot-sys/swap-move"] -validate-primary-slot = ["mcuboot-sys/validate-primary-slot"] -enc-rsa = ["mcuboot-sys/enc-rsa"] -enc-kw = ["mcuboot-sys/enc-kw"] -enc-ec256 = ["mcuboot-sys/enc-ec256"] -enc-x25519 = ["mcuboot-sys/enc-x25519"] -bootstrap = ["mcuboot-sys/bootstrap"] -multiimage = ["mcuboot-sys/multiimage"] -large-write = [] -downgrade-prevention = ["mcuboot-sys/downgrade-prevention"] - -[dependencies] -byteorder = "1.3" -libc = "0.2" -rand = "0.4" -docopt = "1.1.0" -serde = "1.0" -serde_derive = "1.0" -log = "0.4" -env_logger = "0.5" -simflash = { path = "simflash" } -mcuboot-sys = { path = "mcuboot-sys" } -ring = "0.16.11" -untrusted = "0.7" -pem = "0.7" -aes-ctr = "0.2.0" -base64 = "0.11.0" - -# The simulator runs very slowly without optimization. A value of 1 -# compiles in about half the time, but runs about 5-6 times slower. 2 -# and 3 are hardly different in either compile time or performance. -# Use 2 in case that makes the code slightly more debuggable. -[profile.test] -opt-level = 2 - -[profile.dev] -opt-level = 2 diff --git a/mcuboot/sim/README.rst b/mcuboot/sim/README.rst deleted file mode 100644 index d07bc111a..000000000 --- a/mcuboot/sim/README.rst +++ /dev/null @@ -1,61 +0,0 @@ -MCUboot Simulator -################# - -This is a small simulator designed to exercise the mcuboot upgrade -code, specifically testing untimely reset scenarios to make sure the -code is robust. - -Prerequisites -============= - -The simulator is written in Rust_, and you will need to install it to -build it. The installation_ page describes this process. The -simulator can be built with the stable release of Rust. - -.. _Rust: https://www.rust-lang.org/ - -.. _installation: https://www.rust-lang.org/en-US/install.html - -Dependent code --------------- - -The simulator depends on some external modules. These are stored as -submodules within git. To fetch these dependencies the first time:: - - $ git submodule update --init --recursive - -will clone and check out these trees in the appropriate place. - -Testing -======= - -The tests are written as unit tests in Rust, and can be built and run -automatically:: - - $ cargo test - -this should download and compile the necessary dependencies, compile -the relevant modules from mcuboot, build the simulator, and run the -tests. - -There are several different features you can test. For example, -testing RSA signatures can be done with:: - - $ cargo test --features sig-rsa - -For a complete list of features, see Cargo.toml. - -Debugging -========= - -If the simulator indicates a failure, you can turn on additional -logging by setting ``RUST_LOG=warn`` or ``RUST_LOG=error`` in the -environment:: - - $ RUST_LOG=warn ./target/release/bootsim run ... - -It is also possible to run specific tests, for example:: - - $ cargo test -- basic_revert - -which will run only the `basic_revert` test. diff --git a/mcuboot/sim/mcuboot-sys/.gitignore b/mcuboot/sim/mcuboot-sys/.gitignore deleted file mode 100644 index 03314f77b..000000000 --- a/mcuboot/sim/mcuboot-sys/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Cargo.lock diff --git a/mcuboot/sim/mcuboot-sys/Cargo.toml b/mcuboot/sim/mcuboot-sys/Cargo.toml deleted file mode 100644 index 829d2eca9..000000000 --- a/mcuboot/sim/mcuboot-sys/Cargo.toml +++ /dev/null @@ -1,67 +0,0 @@ -[package] -name = "mcuboot-sys" -version = "0.1.0" -authors = ["David Brown "] -description = "A simple wrapper around the mcuboot code." -build = "build.rs" -publish = false -edition = "2018" - -[features] -# By default, build with simplistic signature verification. -default = [] - -# Verify RSA signatures. Note that at this time, the C code will not -# compile with both sig-rsa and sig-ecdsa enabled. -sig-rsa = [] - -# Verify RSA-3072 signatures. -sig-rsa3072 = [] - -# Verify ECDSA (secp256r1) signatures. -sig-ecdsa = [] - -# Verify ED25519 signatures. -sig-ed25519 = [] - -# Overwrite only upgrade -overwrite-only = [] - -swap-move = [] - -# Disable validation of the primary slot -validate-primary-slot = [] - -# Encrypt image in the secondary slot using RSA-OAEP-2048 -enc-rsa = [] - -# Encrypt image in the secondary slot using AES-KW-128 -enc-kw = [] - -# Encrypt image in the secondary slot using ECIES-P256 -enc-ec256 = [] - -# Encrypt image in the secondary slot using ECIES-X25519 -enc-x25519 = [] - -# Allow bootstrapping an empty/invalid primary slot from a valid secondary slot -bootstrap = [] - -# Support multiple images (currently 2 instead of 1). -multiimage = [] - -# Check (in software) against version downgrades. -downgrade-prevention = [] - -[build-dependencies] -cc = "1.0.25" - -[dependencies] -libc = "0.2" -log = "0.4" -simflash = { path = "../simflash" } - -# Optimize some, even when building for debugging, otherwise the tests -# are too slow. -[profile.test] -opt-level = 1 diff --git a/mcuboot/sim/mcuboot-sys/build.rs b/mcuboot/sim/mcuboot-sys/build.rs deleted file mode 100644 index 49739f618..000000000 --- a/mcuboot/sim/mcuboot-sys/build.rs +++ /dev/null @@ -1,312 +0,0 @@ -// Build mcuboot as a library, based on the requested features. - -extern crate cc; - -use std::env; -use std::fs; -use std::io; -use std::path::Path; - -fn main() { - // Feature flags. - let sig_rsa = env::var("CARGO_FEATURE_SIG_RSA").is_ok(); - let sig_rsa3072 = env::var("CARGO_FEATURE_SIG_RSA3072").is_ok(); - let sig_ecdsa = env::var("CARGO_FEATURE_SIG_ECDSA").is_ok(); - let sig_ed25519 = env::var("CARGO_FEATURE_SIG_ED25519").is_ok(); - let overwrite_only = env::var("CARGO_FEATURE_OVERWRITE_ONLY").is_ok(); - let swap_move = env::var("CARGO_FEATURE_SWAP_MOVE").is_ok(); - let validate_primary_slot = - env::var("CARGO_FEATURE_VALIDATE_PRIMARY_SLOT").is_ok(); - let enc_rsa = env::var("CARGO_FEATURE_ENC_RSA").is_ok(); - let enc_kw = env::var("CARGO_FEATURE_ENC_KW").is_ok(); - let enc_ec256 = env::var("CARGO_FEATURE_ENC_EC256").is_ok(); - let enc_x25519 = env::var("CARGO_FEATURE_ENC_X25519").is_ok(); - let bootstrap = env::var("CARGO_FEATURE_BOOTSTRAP").is_ok(); - let multiimage = env::var("CARGO_FEATURE_MULTIIMAGE").is_ok(); - let downgrade_prevention = env::var("CARGO_FEATURE_DOWNGRADE_PREVENTION").is_ok(); - - let mut conf = cc::Build::new(); - conf.define("__BOOTSIM__", None); - conf.define("MCUBOOT_HAVE_LOGGING", None); - conf.define("MCUBOOT_USE_FLASH_AREA_GET_SECTORS", None); - conf.define("MCUBOOT_HAVE_ASSERT_H", None); - conf.define("MCUBOOT_MAX_IMG_SECTORS", Some("128")); - conf.define("MCUBOOT_IMAGE_NUMBER", Some(if multiimage { "2" } else { "1" })); - - if downgrade_prevention && !overwrite_only { - panic!("Downgrade prevention requires overwrite only"); - } - - if bootstrap { - conf.define("MCUBOOT_BOOTSTRAP", None); - } - - if validate_primary_slot { - conf.define("MCUBOOT_VALIDATE_PRIMARY_SLOT", None); - } - - if downgrade_prevention { - conf.define("MCUBOOT_DOWNGRADE_PREVENTION", None); - } - - // Currently no more than one sig type can be used simultaneously. - if vec![sig_rsa, sig_rsa3072, sig_ecdsa, sig_ed25519].iter() - .fold(0, |sum, &v| sum + v as i32) > 1 { - panic!("mcuboot does not support more than one sig type at the same time"); - } - - if sig_rsa || sig_rsa3072 { - conf.define("MCUBOOT_SIGN_RSA", None); - // The Kconfig style defines must be added here as well because - // they are used internally by "config-rsa.h" - if sig_rsa { - conf.define("MCUBOOT_SIGN_RSA_LEN", "2048"); - conf.define("CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN", "2048"); - } else { - conf.define("MCUBOOT_SIGN_RSA_LEN", "3072"); - conf.define("CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN", "3072"); - } - conf.define("MCUBOOT_USE_MBED_TLS", None); - - conf.include("../../ext/mbedtls/crypto/include"); - conf.file("../../ext/mbedtls/crypto/library/sha256.c"); - conf.file("csupport/keys.c"); - - conf.file("../../ext/mbedtls/crypto/library/rsa.c"); - conf.file("../../ext/mbedtls/crypto/library/bignum.c"); - conf.file("../../ext/mbedtls/crypto/library/platform.c"); - conf.file("../../ext/mbedtls/crypto/library/platform_util.c"); - conf.file("../../ext/mbedtls/crypto/library/asn1parse.c"); - } else if sig_ecdsa { - conf.define("MCUBOOT_SIGN_EC256", None); - conf.define("MCUBOOT_USE_TINYCRYPT", None); - - if !enc_kw { - conf.include("../../ext/mbedtls-asn1/include"); - } - conf.include("../../ext/tinycrypt/lib/include"); - - conf.file("csupport/keys.c"); - - conf.file("../../ext/tinycrypt/lib/source/utils.c"); - conf.file("../../ext/tinycrypt/lib/source/sha256.c"); - conf.file("../../ext/tinycrypt/lib/source/ecc.c"); - conf.file("../../ext/tinycrypt/lib/source/ecc_dsa.c"); - conf.file("../../ext/tinycrypt/lib/source/ecc_platform_specific.c"); - - conf.file("../../ext/mbedtls-asn1/src/platform_util.c"); - conf.file("../../ext/mbedtls-asn1/src/asn1parse.c"); - } else if sig_ed25519 { - conf.define("MCUBOOT_SIGN_ED25519", None); - conf.define("MCUBOOT_USE_TINYCRYPT", None); - - conf.include("../../ext/tinycrypt/lib/include"); - conf.include("../../ext/tinycrypt-sha512/lib/include"); - conf.include("../../ext/mbedtls-asn1/include"); - conf.file("../../ext/tinycrypt/lib/source/sha256.c"); - conf.file("../../ext/tinycrypt-sha512/lib/source/sha512.c"); - conf.file("../../ext/tinycrypt/lib/source/utils.c"); - conf.file("csupport/keys.c"); - conf.file("../../ext/fiat/src/curve25519.c"); - conf.file("../../ext/mbedtls-asn1/src/platform_util.c"); - conf.file("../../ext/mbedtls-asn1/src/asn1parse.c"); - } else if !enc_ec256 && !enc_x25519 { - // No signature type, only sha256 validation. The default - // configuration file bundled with mbedTLS is sufficient. - // When using ECIES-P256 rely on Tinycrypt. - conf.define("MCUBOOT_USE_MBED_TLS", None); - conf.include("../../ext/mbedtls/crypto/include"); - conf.file("../../ext/mbedtls/crypto/library/sha256.c"); - } - - if overwrite_only { - conf.define("MCUBOOT_OVERWRITE_ONLY", None); - conf.define("MCUBOOT_OVERWRITE_ONLY_FAST", None); - } - - if swap_move { - conf.define("MCUBOOT_SWAP_USING_MOVE", None); - } - - if enc_rsa { - conf.define("MCUBOOT_ENCRYPT_RSA", None); - conf.define("MCUBOOT_ENC_IMAGES", None); - conf.define("MCUBOOT_USE_MBED_TLS", None); - - conf.file("../../boot/bootutil/src/encrypted.c"); - conf.file("csupport/keys.c"); - - conf.include("../../ext/mbedtls/crypto/include"); - conf.file("../../ext/mbedtls/crypto/library/sha256.c"); - - conf.file("../../ext/mbedtls/crypto/library/platform.c"); - conf.file("../../ext/mbedtls/crypto/library/platform_util.c"); - conf.file("../../ext/mbedtls/crypto/library/rsa.c"); - conf.file("../../ext/mbedtls/crypto/library/rsa_internal.c"); - conf.file("../../ext/mbedtls/crypto/library/md.c"); - conf.file("../../ext/mbedtls/crypto/library/aes.c"); - conf.file("../../ext/mbedtls/crypto/library/bignum.c"); - conf.file("../../ext/mbedtls/crypto/library/asn1parse.c"); - } - - if enc_kw { - conf.define("MCUBOOT_ENCRYPT_KW", None); - conf.define("MCUBOOT_ENC_IMAGES", None); - - conf.file("../../boot/bootutil/src/encrypted.c"); - conf.file("csupport/keys.c"); - - if sig_rsa || sig_rsa3072 { - conf.file("../../ext/mbedtls/crypto/library/sha256.c"); - } - - /* Simulator uses Mbed-TLS to wrap keys */ - conf.include("../../ext/mbedtls/crypto/include"); - conf.file("../../ext/mbedtls/crypto/library/platform.c"); - conf.file("../../ext/mbedtls/crypto/library/platform_util.c"); - conf.file("../../ext/mbedtls/crypto/library/nist_kw.c"); - conf.file("../../ext/mbedtls/crypto/library/cipher.c"); - conf.file("../../ext/mbedtls/crypto/library/cipher_wrap.c"); - conf.file("../../ext/mbedtls/crypto/library/aes.c"); - - if sig_ecdsa { - conf.define("MCUBOOT_USE_TINYCRYPT", None); - - conf.include("../../ext/tinycrypt/lib/include"); - - conf.file("../../ext/tinycrypt/lib/source/utils.c"); - conf.file("../../ext/tinycrypt/lib/source/sha256.c"); - conf.file("../../ext/tinycrypt/lib/source/aes_encrypt.c"); - conf.file("../../ext/tinycrypt/lib/source/aes_decrypt.c"); - } - - if sig_ed25519 { - panic!("ed25519 does not support image encryption with KW yet"); - } - } - - if enc_ec256 { - conf.define("MCUBOOT_ENCRYPT_EC256", None); - conf.define("MCUBOOT_ENC_IMAGES", None); - conf.define("MCUBOOT_USE_TINYCRYPT", None); - conf.define("MCUBOOT_SWAP_SAVE_ENCTLV", None); - - conf.file("../../boot/bootutil/src/encrypted.c"); - conf.file("csupport/keys.c"); - - conf.include("../../ext/mbedtls-asn1/include"); - conf.include("../../ext/tinycrypt/lib/include"); - - /* FIXME: fail with other signature schemes ? */ - - conf.file("../../ext/tinycrypt/lib/source/utils.c"); - conf.file("../../ext/tinycrypt/lib/source/sha256.c"); - conf.file("../../ext/tinycrypt/lib/source/ecc.c"); - conf.file("../../ext/tinycrypt/lib/source/ecc_dsa.c"); - conf.file("../../ext/tinycrypt/lib/source/ecc_platform_specific.c"); - - conf.file("../../ext/mbedtls-asn1/src/platform_util.c"); - conf.file("../../ext/mbedtls-asn1/src/asn1parse.c"); - - conf.file("../../ext/tinycrypt/lib/source/aes_encrypt.c"); - conf.file("../../ext/tinycrypt/lib/source/aes_decrypt.c"); - conf.file("../../ext/tinycrypt/lib/source/ctr_mode.c"); - conf.file("../../ext/tinycrypt/lib/source/hmac.c"); - conf.file("../../ext/tinycrypt/lib/source/ecc_dh.c"); - } - - if enc_x25519 { - conf.define("MCUBOOT_ENCRYPT_X25519", None); - conf.define("MCUBOOT_ENC_IMAGES", None); - conf.define("MCUBOOT_USE_TINYCRYPT", None); - conf.define("MCUBOOT_SWAP_SAVE_ENCTLV", None); - - conf.file("../../boot/bootutil/src/encrypted.c"); - conf.file("csupport/keys.c"); - - conf.include("../../ext/mbedtls-asn1/include"); - conf.include("../../ext/tinycrypt/lib/include"); - conf.include("../../ext/tinycrypt-sha512/lib/include"); - - conf.file("../../ext/fiat/src/curve25519.c"); - - conf.file("../../ext/tinycrypt/lib/source/utils.c"); - conf.file("../../ext/tinycrypt/lib/source/sha256.c"); - - conf.file("../../ext/mbedtls-asn1/src/platform_util.c"); - conf.file("../../ext/mbedtls-asn1/src/asn1parse.c"); - - conf.file("../../ext/tinycrypt/lib/source/aes_encrypt.c"); - conf.file("../../ext/tinycrypt/lib/source/aes_decrypt.c"); - conf.file("../../ext/tinycrypt/lib/source/ctr_mode.c"); - conf.file("../../ext/tinycrypt/lib/source/hmac.c"); - } - - if sig_rsa && enc_kw { - conf.define("MBEDTLS_CONFIG_FILE", Some("")); - } else if sig_rsa || sig_rsa3072 || enc_rsa { - conf.define("MBEDTLS_CONFIG_FILE", Some("")); - } else if (sig_ecdsa || enc_ec256) && !enc_kw { - conf.define("MBEDTLS_CONFIG_FILE", Some("")); - } else if sig_ed25519 || enc_x25519 { - conf.define("MBEDTLS_CONFIG_FILE", Some("")); - } else if enc_kw { - conf.define("MBEDTLS_CONFIG_FILE", Some("")); - } - - conf.file("../../boot/bootutil/src/image_validate.c"); - if sig_rsa || sig_rsa3072 { - conf.file("../../boot/bootutil/src/image_rsa.c"); - } else if sig_ecdsa { - conf.file("../../boot/bootutil/src/image_ec256.c"); - } else if sig_ed25519 { - conf.file("../../boot/bootutil/src/image_ed25519.c"); - } - conf.file("../../boot/bootutil/src/loader.c"); - conf.file("../../boot/bootutil/src/swap_misc.c"); - conf.file("../../boot/bootutil/src/swap_scratch.c"); - conf.file("../../boot/bootutil/src/swap_move.c"); - conf.file("../../boot/bootutil/src/caps.c"); - conf.file("../../boot/bootutil/src/bootutil_misc.c"); - conf.file("../../boot/bootutil/src/tlv.c"); - conf.file("csupport/run.c"); - conf.include("../../boot/bootutil/include"); - conf.include("csupport"); - conf.include("../../boot/zephyr/include"); - conf.debug(true); - conf.flag("-Wall"); - conf.flag("-Werror"); - - // FIXME: travis-ci still uses gcc 4.8.4 which defaults to std=gnu90. - // It has incomplete std=c11 and std=c99 support but std=c99 was checked - // to build correctly so leaving it here to updated in the future... - conf.flag("-std=c99"); - - conf.compile("libbootutil.a"); - - walk_dir("../../boot").unwrap(); - walk_dir("../../ext/tinycrypt/lib/source").unwrap(); - walk_dir("../../ext/mbedtls-asn1").unwrap(); - walk_dir("csupport").unwrap(); - walk_dir("../../ext/mbedtls/crypto/include").unwrap(); - walk_dir("../../ext/mbedtls/crypto/library").unwrap(); -} - -// Output the names of all files within a directory so that Cargo knows when to rebuild. -fn walk_dir>(path: P) -> io::Result<()> { - for ent in fs::read_dir(path.as_ref())? { - let ent = ent?; - let p = ent.path(); - if p.is_dir() { - walk_dir(p)?; - } else { - // Note that non-utf8 names will fail. - let name = p.to_str().unwrap(); - if name.ends_with(".c") || name.ends_with(".h") { - println!("cargo:rerun-if-changed={}", name); - } - } - } - - Ok(()) -} diff --git a/mcuboot/sim/mcuboot-sys/csupport/bootsim.h b/mcuboot/sim/mcuboot-sys/csupport/bootsim.h deleted file mode 100644 index 36e402867..000000000 --- a/mcuboot/sim/mcuboot-sys/csupport/bootsim.h +++ /dev/null @@ -1,26 +0,0 @@ -// 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 H_BOOTSIM_ -#define H_BOOTSIM_ - -#include "mcuboot_config/mcuboot_assert.h" - -#endif diff --git a/mcuboot/sim/mcuboot-sys/csupport/devicetree.h b/mcuboot/sim/mcuboot-sys/csupport/devicetree.h deleted file mode 100644 index 434e4eebf..000000000 --- a/mcuboot/sim/mcuboot-sys/csupport/devicetree.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2019 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/* This file mocks zephyr's flash map / DT macro */ - -#ifndef __DEVICETREE_H__ -#define __DEVICETREE_H__ - -#define FLASH_AREA_ID(x) FLASH_AREA_ID_##x - -#define FLASH_AREA_ID_image_0 1 -#define FLASH_AREA_ID_image_1 2 -#define FLASH_AREA_ID_image_scratch 3 -#define FLASH_AREA_ID_image_2 4 -#define FLASH_AREA_ID_image_3 5 - -#endif /*__DEVICETREE_H__*/ diff --git a/mcuboot/sim/mcuboot-sys/csupport/keys.c b/mcuboot/sim/mcuboot-sys/csupport/keys.c deleted file mode 100644 index 801162937..000000000 --- a/mcuboot/sim/mcuboot-sys/csupport/keys.c +++ /dev/null @@ -1,299 +0,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. - */ - -#include - -#include - -#if defined(MCUBOOT_SIGN_RSA) -#if MCUBOOT_SIGN_RSA_LEN == 2048 -#define HAVE_KEYS -const unsigned char root_pub_der[] = { - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd1, 0x06, 0x08, - 0x1a, 0x18, 0x44, 0x2c, 0x18, 0xe8, 0xfb, 0xfd, 0xf7, 0x0d, 0xa3, 0x4f, - 0x1f, 0xbb, 0xee, 0x5e, 0xf9, 0xaa, 0xd2, 0x4b, 0x18, 0xd3, 0x5a, 0xe9, - 0x6d, 0x18, 0x80, 0x19, 0xf9, 0xf0, 0x9c, 0x34, 0x1b, 0xcb, 0xf3, 0xbc, - 0x74, 0xdb, 0x42, 0xe7, 0x8c, 0x7f, 0x10, 0x53, 0x7e, 0x43, 0x5e, 0x0d, - 0x57, 0x2c, 0x44, 0xd1, 0x67, 0x08, 0x0f, 0x0d, 0xbb, 0x5c, 0xee, 0xec, - 0xb3, 0x99, 0xdf, 0xe0, 0x4d, 0x84, 0x0b, 0xaa, 0x77, 0x41, 0x60, 0xed, - 0x15, 0x28, 0x49, 0xa7, 0x01, 0xb4, 0x3c, 0x10, 0xe6, 0x69, 0x8c, 0x2f, - 0x5f, 0xac, 0x41, 0x4d, 0x9e, 0x5c, 0x14, 0xdf, 0xf2, 0xf8, 0xcf, 0x3d, - 0x1e, 0x6f, 0xe7, 0x5b, 0xba, 0xb4, 0xa9, 0xc8, 0x88, 0x7e, 0x47, 0x3c, - 0x94, 0xc3, 0x77, 0x67, 0x54, 0x4b, 0xaa, 0x8d, 0x38, 0x35, 0xca, 0x62, - 0x61, 0x7e, 0xb7, 0xe1, 0x15, 0xdb, 0x77, 0x73, 0xd4, 0xbe, 0x7b, 0x72, - 0x21, 0x89, 0x69, 0x24, 0xfb, 0xf8, 0x65, 0x6e, 0x64, 0x3e, 0xc8, 0x0e, - 0xd7, 0x85, 0xd5, 0x5c, 0x4a, 0xe4, 0x53, 0x0d, 0x2f, 0xff, 0xb7, 0xfd, - 0xf3, 0x13, 0x39, 0x83, 0x3f, 0xa3, 0xae, 0xd2, 0x0f, 0xa7, 0x6a, 0x9d, - 0xf9, 0xfe, 0xb8, 0xce, 0xfa, 0x2a, 0xbe, 0xaf, 0xb8, 0xe0, 0xfa, 0x82, - 0x37, 0x54, 0xf4, 0x3e, 0xe1, 0x2b, 0xd0, 0xd3, 0x08, 0x58, 0x18, 0xf6, - 0x5e, 0x4c, 0xc8, 0x88, 0x81, 0x31, 0xad, 0x5f, 0xb0, 0x82, 0x17, 0xf2, - 0x8a, 0x69, 0x27, 0x23, 0xf3, 0xab, 0x87, 0x3e, 0x93, 0x1a, 0x1d, 0xfe, - 0xe8, 0xf8, 0x1a, 0x24, 0x66, 0x59, 0xf8, 0x1c, 0xab, 0xdc, 0xce, 0x68, - 0x1b, 0x66, 0x64, 0x35, 0xec, 0xfa, 0x0d, 0x11, 0x9d, 0xaf, 0x5c, 0x3a, - 0xa7, 0xd1, 0x67, 0xc6, 0x47, 0xef, 0xb1, 0x4b, 0x2c, 0x62, 0xe1, 0xd1, - 0xc9, 0x02, 0x03, 0x01, 0x00, 0x01 -}; -const unsigned int root_pub_der_len = 270; -#elif MCUBOOT_SIGN_RSA_LEN == 3072 -#define HAVE_KEYS -const unsigned char root_pub_der[] = { - 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, - 0x00, 0xb4, 0x2c, 0x0e, 0x98, 0x58, 0x10, 0xa4, - 0xa7, 0x58, 0x99, 0x7c, 0x01, 0xdd, 0x08, 0x2a, - 0x28, 0x34, 0x33, 0xf8, 0x96, 0x1a, 0x34, 0x20, - 0x5d, 0x45, 0xc8, 0x71, 0x26, 0x25, 0xe5, 0xd2, - 0x96, 0xea, 0x7b, 0xb1, 0x15, 0xaa, 0xa6, 0x8a, - 0x63, 0x22, 0x8b, 0x2d, 0x4e, 0x81, 0x73, 0xbf, - 0x6e, 0x15, 0x68, 0x8c, 0x1a, 0xf4, 0xef, 0x2a, - 0x8f, 0x8c, 0x22, 0x9e, 0x71, 0x57, 0x4b, 0xde, - 0x0f, 0x7e, 0x72, 0xd3, 0x7a, 0xb8, 0xa7, 0x1d, - 0x44, 0xad, 0x87, 0x00, 0x83, 0x5c, 0xfd, 0x73, - 0x05, 0x72, 0x46, 0x3f, 0x8b, 0xf9, 0x10, 0x00, - 0xd8, 0x6e, 0xcc, 0x85, 0xed, 0xf9, 0x49, 0xdb, - 0x78, 0x36, 0x80, 0x49, 0x38, 0x76, 0xdd, 0x5f, - 0x54, 0x04, 0xda, 0x8c, 0x34, 0xa7, 0x2b, 0x13, - 0x25, 0x6f, 0xd1, 0x15, 0x4f, 0xad, 0xc2, 0xe1, - 0xa5, 0xd2, 0x4e, 0x57, 0x0c, 0x7e, 0x9c, 0x9b, - 0xba, 0x4e, 0x68, 0xb2, 0xe0, 0x25, 0x02, 0xaa, - 0x00, 0xd3, 0xb4, 0xcc, 0x2f, 0x78, 0xe5, 0xbe, - 0x47, 0x67, 0x1f, 0xc8, 0x6e, 0x22, 0x6c, 0x5e, - 0x61, 0xb6, 0x9a, 0xcd, 0xe5, 0xa8, 0xba, 0x7a, - 0x80, 0x13, 0x1b, 0x17, 0x2e, 0x96, 0xed, 0xcf, - 0xb3, 0x9b, 0xe4, 0x1c, 0xe8, 0xad, 0xa7, 0xf6, - 0x3a, 0x51, 0x66, 0x5e, 0x99, 0x8e, 0x87, 0xee, - 0x60, 0x25, 0xf8, 0x8d, 0xbe, 0xce, 0xa4, 0xa8, - 0xca, 0x93, 0x6c, 0xd7, 0xbf, 0xd4, 0x73, 0x33, - 0x8d, 0x44, 0x85, 0xcc, 0x73, 0x30, 0x08, 0x9c, - 0x4d, 0xb2, 0xaa, 0x5a, 0x6c, 0x6f, 0x7b, 0xab, - 0xb7, 0xb3, 0x7c, 0xc3, 0xfb, 0xe7, 0xca, 0xc4, - 0xf8, 0x9a, 0x6f, 0xcb, 0xbb, 0x5b, 0x82, 0xe7, - 0x7a, 0xe8, 0x19, 0xfd, 0x2f, 0x11, 0x22, 0xfb, - 0x7f, 0x76, 0x8c, 0x6b, 0x94, 0xa4, 0x09, 0x4f, - 0xa5, 0x6a, 0x77, 0x51, 0xeb, 0xa7, 0x7e, 0xda, - 0x87, 0x06, 0xee, 0xdc, 0xbe, 0xd1, 0xea, 0x1a, - 0x40, 0x1d, 0x1b, 0xff, 0x1a, 0xb1, 0x51, 0x7c, - 0x12, 0xb0, 0xf3, 0xf6, 0x83, 0x01, 0x9c, 0xe7, - 0x0c, 0x99, 0xbf, 0xac, 0x68, 0x58, 0x72, 0xa4, - 0xb0, 0x59, 0x85, 0xee, 0x85, 0xac, 0x2a, 0x22, - 0xf4, 0xcf, 0x15, 0x08, 0x80, 0x1f, 0x0d, 0xd0, - 0x1e, 0xa0, 0xa0, 0x94, 0xc8, 0xf7, 0xfa, 0x65, - 0xdd, 0x52, 0xe8, 0x96, 0x37, 0x23, 0x30, 0x57, - 0x36, 0xe6, 0x9d, 0xf4, 0x0c, 0x4a, 0x05, 0x75, - 0x1f, 0xad, 0x01, 0xca, 0xb7, 0x6d, 0x8c, 0x43, - 0x74, 0x06, 0x0a, 0x81, 0xf3, 0x01, 0x62, 0xff, - 0xf7, 0xf5, 0x5f, 0xaf, 0xe7, 0x2b, 0x0e, 0xf8, - 0x81, 0xb5, 0x65, 0xdd, 0x01, 0xd9, 0x9f, 0x07, - 0x17, 0x8a, 0x18, 0xcf, 0x23, 0x6e, 0x88, 0x65, - 0x91, 0xb5, 0x7b, 0xd3, 0xb0, 0x2d, 0xaf, 0x93, - 0x66, 0x63, 0x74, 0xac, 0x5a, 0xe6, 0x73, 0xde, - 0x3b, 0x02, 0x03, 0x01, 0x00, 0x01, -}; -const unsigned int root_pub_der_len = 398; -#endif -#elif defined(MCUBOOT_SIGN_EC256) -#define HAVE_KEYS -const unsigned char root_pub_der[] = { - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, - 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04, 0x2a, 0xcb, 0x40, 0x3c, 0xe8, - 0xfe, 0xed, 0x5b, 0xa4, 0x49, 0x95, 0xa1, 0xa9, - 0x1d, 0xae, 0xe8, 0xdb, 0xbe, 0x19, 0x37, 0xcd, - 0x14, 0xfb, 0x2f, 0x24, 0x57, 0x37, 0xe5, 0x95, - 0x39, 0x88, 0xd9, 0x94, 0xb9, 0xd6, 0x5a, 0xeb, - 0xd7, 0xcd, 0xd5, 0x30, 0x8a, 0xd6, 0xfe, 0x48, - 0xb2, 0x4a, 0x6a, 0x81, 0x0e, 0xe5, 0xf0, 0x7d, - 0x8b, 0x68, 0x34, 0xcc, 0x3a, 0x6a, 0xfc, 0x53, - 0x8e, 0xfa, 0xc1, }; -const unsigned int root_pub_der_len = 91; -#elif defined(MCUBOOT_SIGN_ED25519) -#define HAVE_KEYS -const unsigned char root_pub_der[] = { - 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, - 0x70, 0x03, 0x21, 0x00, 0xd4, 0xb3, 0x1b, 0xa4, - 0x9a, 0x3a, 0xdd, 0x3f, 0x82, 0x5d, 0x10, 0xca, - 0x7f, 0x31, 0xb5, 0x0b, 0x0d, 0xe8, 0x7f, 0x37, - 0xcc, 0xc4, 0x9f, 0x1a, 0x40, 0x3a, 0x5c, 0x13, - 0x20, 0xff, 0xb4, 0xe0, -}; -const unsigned int root_pub_der_len = 44; -#endif - -#if defined(HAVE_KEYS) -const struct bootutil_key bootutil_keys[] = { - { - .key = root_pub_der, - .len = &root_pub_der_len, - }, -}; -const int bootutil_key_cnt = 1; -#endif - -#if defined(MCUBOOT_ENCRYPT_RSA) -unsigned char enc_key[] = { - 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, - 0xb4, 0x26, 0x14, 0x49, 0x3d, 0x16, 0x13, 0x3a, 0x6d, 0x9c, 0x84, 0xa9, - 0x8b, 0x6a, 0x10, 0x20, 0x61, 0xef, 0x48, 0x04, 0xa4, 0x4b, 0x24, 0xf3, - 0x00, 0x32, 0xac, 0x22, 0xe0, 0x30, 0x27, 0x70, 0x18, 0xe5, 0x55, 0xc8, - 0xb8, 0x05, 0x34, 0x03, 0xb0, 0xf8, 0xa5, 0x96, 0xd2, 0x48, 0x58, 0xef, - 0x70, 0xb0, 0x09, 0xdb, 0xe3, 0x58, 0x62, 0xef, 0x99, 0x63, 0x01, 0xb2, - 0x89, 0xc4, 0xb3, 0xf6, 0x9e, 0x62, 0xbf, 0x4d, 0xc2, 0x8a, 0xd0, 0xc9, - 0x4d, 0x43, 0xa3, 0xd8, 0xe5, 0x1d, 0xec, 0x62, 0x63, 0x08, 0xe2, 0x20, - 0xa5, 0xfc, 0x78, 0xd0, 0x3e, 0x74, 0xc8, 0xa4, 0x1b, 0x36, 0xad, 0x7b, - 0xf5, 0x06, 0xae, 0x4d, 0x51, 0x9b, 0x40, 0xce, 0x30, 0x4f, 0x6c, 0xea, - 0xf9, 0xe9, 0x74, 0xea, 0x06, 0xee, 0x9c, 0xe4, 0x14, 0x68, 0x20, 0xb9, - 0x3d, 0xe7, 0x11, 0x14, 0x8b, 0x25, 0xa3, 0xff, 0x4c, 0x8a, 0xf3, 0x53, - 0xee, 0x6b, 0x3e, 0xef, 0x34, 0xcd, 0x6a, 0x3f, 0x62, 0x68, 0xc0, 0xff, - 0x78, 0x4c, 0xb0, 0xc3, 0xe6, 0x96, 0x61, 0xfc, 0x1f, 0x18, 0xf1, 0x7a, - 0x82, 0xe2, 0x8f, 0x35, 0xa8, 0x2b, 0x86, 0x16, 0xa4, 0x46, 0xfb, 0xac, - 0x7e, 0x41, 0xdb, 0x02, 0x05, 0x91, 0x6d, 0xdf, 0xc1, 0xde, 0x13, 0x95, - 0x9c, 0xf9, 0x9e, 0x5e, 0x72, 0xba, 0xa7, 0x25, 0x93, 0xfb, 0xdc, 0xe8, - 0xab, 0x86, 0x45, 0x88, 0x47, 0x2d, 0xed, 0xee, 0xee, 0x97, 0x9e, 0xce, - 0x5d, 0x9b, 0x04, 0x04, 0x40, 0x7c, 0xcb, 0x7c, 0x3d, 0x2c, 0x74, 0xab, - 0xa4, 0xcc, 0x64, 0xa3, 0x5c, 0x95, 0x3d, 0xd4, 0xa2, 0xdc, 0x92, 0xb2, - 0xc8, 0x18, 0xcb, 0xf9, 0x00, 0x39, 0x81, 0x8f, 0x8f, 0x40, 0xc2, 0xdf, - 0x99, 0x29, 0xac, 0x8a, 0xc2, 0x3b, 0xd8, 0xa4, 0xf2, 0xad, 0xaf, 0x74, - 0xc0, 0x11, 0xc7, 0x99, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, - 0x00, 0x42, 0x47, 0x80, 0x4f, 0x31, 0xda, 0x5d, 0x58, 0xb1, 0xdb, 0x54, - 0x33, 0xcc, 0xc7, 0x49, 0x07, 0xa1, 0x00, 0x98, 0x4e, 0x9c, 0xe3, 0xc8, - 0xc4, 0x5e, 0xde, 0x45, 0xd6, 0xcf, 0x04, 0xe8, 0x7d, 0xa5, 0xab, 0x3a, - 0xd4, 0x8e, 0x5f, 0xdb, 0xb3, 0x3f, 0xf9, 0x3b, 0x73, 0x32, 0x0a, 0xcc, - 0x2d, 0xcc, 0x17, 0xf8, 0x88, 0x9e, 0x2c, 0x76, 0xba, 0x10, 0x85, 0x0c, - 0xaa, 0xd3, 0x65, 0x3b, 0x91, 0x10, 0xd4, 0xe3, 0xed, 0x88, 0x15, 0xea, - 0x9b, 0x25, 0x82, 0x2d, 0x56, 0x2f, 0x75, 0xc2, 0xf2, 0xaf, 0xdd, 0x24, - 0xd5, 0x3e, 0x3c, 0x95, 0x76, 0x88, 0x84, 0x0f, 0x0d, 0xd1, 0xb5, 0x5c, - 0x3e, 0xae, 0xf7, 0xb6, 0x49, 0x5c, 0x2c, 0xf2, 0xba, 0xe9, 0xab, 0x4f, - 0x37, 0x64, 0x9b, 0x30, 0x18, 0xaa, 0x54, 0x40, 0x04, 0xea, 0x3d, 0x25, - 0x4d, 0x02, 0x29, 0x71, 0x6f, 0x4d, 0x82, 0x9b, 0xc3, 0x44, 0x2a, 0x9d, - 0x0c, 0x98, 0xd3, 0xc8, 0x15, 0x0d, 0x04, 0x93, 0x60, 0x30, 0xc7, 0x5e, - 0x79, 0xea, 0x53, 0x9d, 0xc0, 0x0e, 0x81, 0xac, 0x90, 0xbc, 0x9e, 0x1e, - 0xd2, 0x28, 0x0f, 0x10, 0xf5, 0x1f, 0xdf, 0x38, 0x7f, 0x8a, 0x90, 0x8d, - 0x49, 0x07, 0x7d, 0x78, 0xcb, 0xa7, 0xef, 0x92, 0x6d, 0x3b, 0x13, 0x95, - 0x9b, 0xba, 0x83, 0xc6, 0xb3, 0x71, 0x25, 0x27, 0x07, 0x99, 0x54, 0x82, - 0x3d, 0xec, 0xc5, 0xf8, 0xb4, 0xa0, 0x38, 0x7a, 0x59, 0x6a, 0x0b, 0xca, - 0x69, 0x6c, 0x17, 0xa4, 0x18, 0xe0, 0xb4, 0xaa, 0x89, 0x99, 0x8f, 0xcb, - 0x71, 0x34, 0x09, 0x1b, 0x6e, 0xe6, 0x87, 0x00, 0xb5, 0xba, 0x70, 0x8a, - 0x29, 0x3d, 0x9a, 0x06, 0x18, 0x2d, 0x66, 0x5e, 0x61, 0x37, 0xeb, 0xdd, - 0x5e, 0xc8, 0x28, 0x92, 0x05, 0x30, 0xfd, 0xb8, 0x65, 0xb1, 0x7f, 0xbf, - 0x2d, 0x55, 0x12, 0x91, 0xc1, 0x02, 0x81, 0x81, 0x00, 0xda, 0x65, 0xda, - 0x38, 0x7c, 0x18, 0xfb, 0x00, 0x11, 0x60, 0xeb, 0x37, 0x65, 0xb8, 0x83, - 0x62, 0x88, 0xc4, 0x3a, 0x4e, 0x64, 0x6a, 0xf3, 0x3e, 0x4e, 0xc0, 0x34, - 0x19, 0x8a, 0xcb, 0x4a, 0xca, 0x2f, 0x5d, 0x50, 0x7a, 0xac, 0xf7, 0x9e, - 0x87, 0x5a, 0xfc, 0x4d, 0x49, 0xd7, 0xf9, 0x21, 0xf5, 0x0b, 0x6f, 0x57, - 0x41, 0x3d, 0x8f, 0xb8, 0xec, 0x7f, 0xcc, 0x92, 0x09, 0xbe, 0xd3, 0xa4, - 0xc3, 0x14, 0x85, 0x21, 0x5d, 0x05, 0xa3, 0xaa, 0x20, 0xf6, 0x62, 0x44, - 0x50, 0x03, 0x5e, 0x53, 0x4a, 0xcd, 0x6a, 0xb6, 0x65, 0x8e, 0x4e, 0x4b, - 0x3f, 0x25, 0xc6, 0x16, 0x31, 0xf5, 0x99, 0x13, 0x77, 0x42, 0xda, 0xdc, - 0x70, 0x4d, 0x65, 0xb0, 0x99, 0x0f, 0xdf, 0x5a, 0xb1, 0x45, 0xf0, 0xb9, - 0x8e, 0xa0, 0xae, 0x4f, 0x4d, 0x65, 0x09, 0x84, 0xb5, 0x38, 0x29, 0xbf, - 0x69, 0xe0, 0x88, 0x1f, 0x27, 0x02, 0x81, 0x81, 0x00, 0xd3, 0x2a, 0x59, - 0xec, 0x28, 0xc3, 0x0d, 0x4f, 0x92, 0x96, 0xca, 0x67, 0x94, 0xfc, 0x2e, - 0xa6, 0x86, 0x68, 0x45, 0x53, 0x92, 0xcc, 0x86, 0x7f, 0x8a, 0xe1, 0x5d, - 0xe8, 0x1d, 0x9e, 0xbb, 0x1e, 0x00, 0x26, 0x1d, 0x80, 0x12, 0xff, 0x9c, - 0x11, 0x0a, 0xbd, 0xa6, 0xc3, 0x8d, 0x48, 0xda, 0xfc, 0x10, 0xf7, 0x7a, - 0x16, 0x07, 0x15, 0xa0, 0x3a, 0xd3, 0x94, 0xfb, 0x52, 0x87, 0x39, 0xee, - 0xe7, 0xc4, 0x26, 0x49, 0x16, 0xc6, 0xc0, 0x83, 0x25, 0xbf, 0x6a, 0x4e, - 0x8c, 0x0b, 0x10, 0x85, 0x66, 0xab, 0x7e, 0xae, 0xac, 0x4c, 0x69, 0x3c, - 0x44, 0xeb, 0xcd, 0xe9, 0xf6, 0x64, 0x8b, 0x4a, 0xd8, 0x6a, 0x4d, 0x6d, - 0x47, 0xa9, 0xb8, 0x55, 0x72, 0xc1, 0xfd, 0xf4, 0x81, 0x4c, 0x66, 0xbe, - 0x49, 0xf2, 0x75, 0x4f, 0x80, 0xf1, 0x20, 0x38, 0xb8, 0x6a, 0x1b, 0x75, - 0x41, 0x30, 0x0f, 0x1b, 0x3f, 0x02, 0x81, 0x80, 0x09, 0x35, 0xfa, 0x7a, - 0x1f, 0x61, 0xbe, 0x54, 0x46, 0x67, 0x5c, 0x04, 0x3e, 0x1a, 0x06, 0x10, - 0x85, 0xcc, 0x20, 0xd9, 0x65, 0x8a, 0xcd, 0x2f, 0x77, 0x8a, 0xcb, 0xa7, - 0xb8, 0x1e, 0xd2, 0xcc, 0xac, 0x2a, 0xb7, 0x56, 0x35, 0x2d, 0x4c, 0x56, - 0x51, 0x14, 0x0a, 0xfe, 0x6e, 0x49, 0x67, 0x91, 0x3a, 0x26, 0x3b, 0xfb, - 0xd8, 0x68, 0xd3, 0x57, 0xc6, 0x1c, 0x0e, 0x9c, 0xb2, 0x9b, 0xa2, 0x7b, - 0x47, 0xc6, 0x45, 0x9d, 0xf2, 0xba, 0xf0, 0x55, 0xeb, 0x8e, 0x41, 0x6b, - 0x4e, 0x79, 0x0f, 0xf2, 0x3b, 0xaf, 0xa0, 0x79, 0xb0, 0x02, 0xc5, 0x51, - 0xa8, 0x7a, 0x2e, 0x3d, 0x75, 0x2a, 0x3b, 0x93, 0xf0, 0x11, 0xe2, 0xf2, - 0x29, 0x91, 0x7c, 0x5d, 0x38, 0x3a, 0x27, 0x4d, 0x0a, 0xb2, 0x18, 0x61, - 0x57, 0x8d, 0x82, 0x72, 0xb5, 0x2c, 0x2d, 0x98, 0xa7, 0x01, 0xbb, 0xbc, - 0xef, 0x67, 0x4e, 0x49, 0x02, 0x81, 0x81, 0x00, 0xb2, 0x70, 0x53, 0x54, - 0x70, 0x8d, 0x82, 0xad, 0xff, 0x1d, 0x55, 0x24, 0x7a, 0x8d, 0x2f, 0x8e, - 0xa0, 0x7d, 0x74, 0x37, 0xcf, 0x10, 0xed, 0x86, 0xd1, 0x80, 0xe7, 0xad, - 0xc1, 0x79, 0xe4, 0x7c, 0xd1, 0x7b, 0x63, 0xea, 0x5a, 0x23, 0x8d, 0x6a, - 0x09, 0x3d, 0x81, 0xb2, 0x35, 0xad, 0x9e, 0xfe, 0xea, 0x07, 0x76, 0x2f, - 0x2f, 0x05, 0x63, 0x44, 0xd2, 0x8e, 0x4e, 0x61, 0xca, 0xcb, 0x75, 0xca, - 0x7b, 0xc2, 0x2e, 0x79, 0x04, 0xb2, 0xa1, 0x20, 0x40, 0xc4, 0x40, 0x63, - 0xae, 0xe5, 0xe3, 0x14, 0x83, 0x4e, 0xa5, 0xa4, 0x0b, 0x5d, 0xd2, 0x04, - 0x1b, 0x8f, 0x01, 0x69, 0xa8, 0x44, 0xdc, 0x96, 0x4c, 0x1d, 0xe9, 0x7e, - 0x69, 0x38, 0xcf, 0x5c, 0x0d, 0xf9, 0xdf, 0xa7, 0x73, 0x3c, 0x4f, 0x08, - 0x85, 0xce, 0x03, 0xc4, 0xdd, 0xfd, 0x70, 0x70, 0xc5, 0x99, 0x36, 0x58, - 0x43, 0x98, 0x40, 0x59, 0x02, 0x81, 0x81, 0x00, 0xd5, 0xaa, 0xfb, 0xec, - 0x8d, 0xc6, 0xdd, 0xfa, 0x2b, 0x5a, 0x24, 0xd0, 0xda, 0x58, 0xbd, 0x87, - 0x92, 0x1a, 0x29, 0x62, 0x13, 0x1d, 0x4b, 0x79, 0x1b, 0xbe, 0x79, 0x7d, - 0xad, 0x79, 0xca, 0x17, 0x75, 0xda, 0xe8, 0x32, 0xe8, 0xa0, 0x9e, 0xa8, - 0x77, 0x53, 0xac, 0x38, 0xd6, 0xeb, 0xe6, 0x22, 0x65, 0xc4, 0xaa, 0x4c, - 0xc8, 0xd0, 0x33, 0x1a, 0x1e, 0xbe, 0xbd, 0x73, 0x09, 0x4a, 0xfa, 0x85, - 0x5c, 0xf3, 0x0c, 0x9c, 0x81, 0x56, 0x30, 0xa7, 0xf7, 0x9b, 0xf4, 0x92, - 0x9c, 0x6b, 0x93, 0x6a, 0x00, 0x33, 0xdc, 0x2f, 0x54, 0x1e, 0x78, 0xd4, - 0x97, 0xec, 0x24, 0xa2, 0xdb, 0x3d, 0x03, 0x33, 0x09, 0xb2, 0x2c, 0x03, - 0x05, 0x40, 0xde, 0x52, 0xf2, 0x9b, 0xfa, 0x00, 0x8d, 0x4b, 0xfe, 0x5b, - 0x9b, 0x9c, 0x73, 0xad, 0xfb, 0x7a, 0x00, 0x42, 0x62, 0x9e, 0xa0, 0x95, - 0x55, 0x50, 0x32, 0x87 -}; -static unsigned int enc_key_len = 1192; -const struct bootutil_key bootutil_enc_key = { - .key = enc_key, - .len = &enc_key_len, -}; -#endif - -#if defined(MCUBOOT_ENCRYPT_KW) -unsigned char enc_key[] = { - 0xd1, 0x5a, 0x04, 0x95, 0xc4, 0xc2, 0xa8, 0xff, 0x30, 0x78, 0xce, 0x49, - 0xb5, 0xfc, 0xb2, 0xdd -}; -static unsigned int enc_key_len = 16; -const struct bootutil_key bootutil_enc_key = { - .key = enc_key, - .len = &enc_key_len, -}; -#endif - -#if defined(MCUBOOT_ENCRYPT_EC256) -unsigned char enc_key[] = { - 0x30, 0x81, 0x43, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, - 0x03, 0x01, 0x07, 0x04, 0x29, 0x30, 0x27, 0x02, 0x01, 0x01, 0x04, 0x20, - 0xf6, 0x1e, 0x51, 0x9d, 0xf8, 0xfa, 0xdd, 0xa1, 0xb7, 0xd9, 0xa9, 0x64, - 0x64, 0x3b, 0x54, 0xd0, 0x3d, 0xd0, 0x1f, 0xe5, 0x78, 0xd9, 0x17, 0x98, - 0xa5, 0x28, 0xca, 0xcc, 0x6b, 0x67, 0x9e, 0x06, 0xa1, 0x44, - -}; -static unsigned int enc_key_len = 70; -const struct bootutil_key bootutil_enc_key = { - .key = enc_key, - .len = &enc_key_len, -}; -#endif - -#if defined(MCUBOOT_ENCRYPT_X25519) -unsigned char enc_key[] = { - 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x6e, - 0x04, 0x22, 0x04, 0x20, 0x28, 0x80, 0x2f, 0xef, 0xef, 0x82, 0x95, 0x50, - 0xf1, 0x41, 0x93, 0x03, 0x6c, 0x1b, 0xb9, 0x49, 0x6c, 0x51, 0xe5, 0x26, - 0x87, 0x8f, 0x77, 0x07, 0xf8, 0xb4, 0x1f, 0x04, 0x45, 0x6d, 0x84, 0x4f, -}; -static unsigned int enc_key_len = 48; -const struct bootutil_key bootutil_enc_key = { - .key = enc_key, - .len = &enc_key_len, -}; -#endif diff --git a/mcuboot/sim/mcuboot-sys/csupport/mcuboot_config/mcuboot_assert.h b/mcuboot/sim/mcuboot-sys/csupport/mcuboot_config/mcuboot_assert.h deleted file mode 100644 index be282c9a9..000000000 --- a/mcuboot/sim/mcuboot-sys/csupport/mcuboot_config/mcuboot_assert.h +++ /dev/null @@ -1,27 +0,0 @@ -// 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_ASSERT_H__ -#define __MCUBOOT_ASSERT_H__ - -void sim_assert(int, const char *test, const char *, unsigned int, const char *); -#define ASSERT(x) sim_assert((x), #x, __FILE__, __LINE__, __func__) - -#endif /* __MCUBOOT_ASSERT_H__ */ diff --git a/mcuboot/sim/mcuboot-sys/csupport/mcuboot_config/mcuboot_logging.h b/mcuboot/sim/mcuboot-sys/csupport/mcuboot_config/mcuboot_logging.h deleted file mode 100644 index bb4ff30ab..000000000 --- a/mcuboot/sim/mcuboot-sys/csupport/mcuboot_config/mcuboot_logging.h +++ /dev/null @@ -1,107 +0,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 - -#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 -#define MCUBOOT_LOG_LEVEL_SIM 5 /* RUST_LOG=trace */ - -/* - * 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_DEBUG -#endif - -#define MCUBOOT_LOG_MODULE_DECLARE(domain) /* ignore */ -#define MCUBOOT_LOG_MODULE_REGISTER(domain) /* ignore */ - -int sim_log_enabled(int level); - -#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", ##__VA_ARGS__); \ - fflush(stderr); \ - } \ - } 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", ##__VA_ARGS__); \ - fflush(stderr); \ - } \ - } 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", ##__VA_ARGS__); \ - fflush(stderr); \ - } \ - } 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", ##__VA_ARGS__); \ - fflush(stderr); \ - } \ - } while (0) -#else -#define MCUBOOT_LOG_DBG(...) IGNORE(__VA_ARGS__) -#endif - -#if MCUBOOT_LOG_LEVEL >= MCUBOOT_LOG_LEVEL_SIM -#define MCUBOOT_LOG_SIM(_fmt, ...) \ - do { \ - if (sim_log_enabled(MCUBOOT_LOG_LEVEL_SIM)) { \ - fprintf(stderr, "[SIM] " _fmt "\n", ##__VA_ARGS__); \ - fflush(stderr); \ - } \ - } while (0) -#else -#define MCUBOOT_LOG_SIM(...) IGNORE(__VA_ARGS__) -#endif - -#endif /* __MCUBOOT_LOGGING_H__ */ diff --git a/mcuboot/sim/mcuboot-sys/csupport/run.c b/mcuboot/sim/mcuboot-sys/csupport/run.c deleted file mode 100644 index f531db910..000000000 --- a/mcuboot/sim/mcuboot-sys/csupport/run.c +++ /dev/null @@ -1,461 +0,0 @@ -/* Run the boot image. */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "../../../boot/bootutil/src/bootutil_priv.h" -#include "bootsim.h" - -#ifdef MCUBOOT_ENCRYPT_RSA -#include "mbedtls/rsa.h" -#include "mbedtls/asn1.h" -#endif - -#ifdef MCUBOOT_ENCRYPT_KW -#include "mbedtls/nist_kw.h" -#endif - -#define BOOT_LOG_LEVEL BOOT_LOG_LEVEL_ERROR -#include - -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - -struct area_desc; -extern struct area_desc *sim_get_flash_areas(void); -extern void sim_set_flash_areas(struct area_desc *areas); -extern void sim_reset_flash_areas(void); - -struct sim_context; -extern struct sim_context *sim_get_context(void); -extern void sim_set_context(struct sim_context *ctx); -extern void sim_reset_context(void); - -extern int sim_flash_erase(uint8_t flash_id, uint32_t offset, uint32_t size); -extern int sim_flash_read(uint8_t flash_id, uint32_t offset, uint8_t *dest, - uint32_t size); -extern int sim_flash_write(uint8_t flash_id, uint32_t offset, const uint8_t *src, - uint32_t size); -extern uint8_t sim_flash_align(uint8_t flash_id); -extern uint8_t sim_flash_erased_val(uint8_t flash_id); - -struct sim_context { - int flash_counter; - int jumped; - uint8_t c_asserts; - uint8_t c_catch_asserts; - jmp_buf boot_jmpbuf; -}; - -#ifdef MCUBOOT_ENCRYPT_RSA -static int -parse_pubkey(mbedtls_rsa_context *ctx, uint8_t **p, uint8_t *end) -{ - int rc; - size_t len; - - if ((rc = mbedtls_asn1_get_tag(p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { - return -1; - } - - if (*p + len != end) { - return -2; - } - - if ((rc = mbedtls_asn1_get_tag(p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { - return -3; - } - - *p += len; - - if ((rc = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_BIT_STRING)) != 0) { - return -4; - } - - if (**p != MBEDTLS_ASN1_PRIMITIVE) { - return -5; - } - - *p += 1; - - if ((rc = mbedtls_asn1_get_tag(p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { - return -6; - } - - if (mbedtls_asn1_get_mpi(p, end, &ctx->N) != 0) { - return -7; - } - - if (mbedtls_asn1_get_mpi(p, end, &ctx->E) != 0) { - return -8; - } - - ctx->len = mbedtls_mpi_size(&ctx->N); - - if (*p != end) { - return -9; - } - - if (mbedtls_rsa_check_pubkey(ctx) != 0) { - return -10; - } - - return 0; -} - -static int -fake_rng(void *p_rng, unsigned char *output, size_t len) -{ - size_t i; - - (void)p_rng; - for (i = 0; i < len; i++) { - output[i] = (char)i; - } - - return 0; -} -#endif - -int mbedtls_platform_set_calloc_free(void * (*calloc_func)(size_t, size_t), - void (*free_func)(void *)); - -int rsa_oaep_encrypt_(const uint8_t *pubkey, unsigned pubkey_len, - const uint8_t *seckey, unsigned seckey_len, - uint8_t *encbuf) -{ -#ifdef MCUBOOT_ENCRYPT_RSA - mbedtls_rsa_context ctx; - uint8_t *cp; - uint8_t *cpend; - int rc; - - mbedtls_platform_set_calloc_free(calloc, free); - - mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256); - - cp = (uint8_t *)pubkey; - cpend = cp + pubkey_len; - - rc = parse_pubkey(&ctx, &cp, cpend); - if (rc) { - goto done; - } - - rc = mbedtls_rsa_rsaes_oaep_encrypt(&ctx, fake_rng, NULL, MBEDTLS_RSA_PUBLIC, - NULL, 0, seckey_len, seckey, encbuf); - if (rc) { - goto done; - } - -done: - mbedtls_rsa_free(&ctx); - return rc; - -#else - (void)pubkey; - (void)pubkey_len; - (void)seckey; - (void)seckey_len; - (void)encbuf; - return 0; -#endif -} - -int kw_encrypt_(const uint8_t *kek, const uint8_t *seckey, uint8_t *encbuf) -{ -#ifdef MCUBOOT_ENCRYPT_KW - mbedtls_nist_kw_context kw; - size_t olen; - int rc; - - mbedtls_platform_set_calloc_free(calloc, free); - - mbedtls_nist_kw_init(&kw); - - rc = mbedtls_nist_kw_setkey(&kw, MBEDTLS_CIPHER_ID_AES, kek, 128, 1); - if (rc) { - goto done; - } - - rc = mbedtls_nist_kw_wrap(&kw, MBEDTLS_KW_MODE_KW, seckey, 16, encbuf, - &olen, 24); - -done: - mbedtls_nist_kw_free(&kw); - return rc; - -#else - (void)kek; - (void)seckey; - (void)encbuf; - return 0; -#endif -} - -uint8_t flash_area_align(const struct flash_area *area) -{ - return sim_flash_align(area->fa_device_id); -} - -uint8_t flash_area_erased_val(const struct flash_area *area) -{ - return sim_flash_erased_val(area->fa_device_id); -} - -struct area { - struct flash_area whole; - struct flash_area *areas; - uint32_t num_areas; - uint8_t id; -}; - -struct area_desc { - struct area slots[16]; - uint32_t num_slots; -}; - -int invoke_boot_go(struct sim_context *ctx, struct area_desc *adesc) -{ - int res; - struct boot_rsp rsp; - struct boot_loader_state *state; - -#if defined(MCUBOOT_SIGN_RSA) - mbedtls_platform_set_calloc_free(calloc, free); -#endif - - // NOTE: cleared internally by context_boot_go - state = malloc(sizeof(struct boot_loader_state)); - - sim_set_flash_areas(adesc); - sim_set_context(ctx); - - if (setjmp(ctx->boot_jmpbuf) == 0) { - res = context_boot_go(state, &rsp); - sim_reset_flash_areas(); - sim_reset_context(); - free(state); - /* printf("boot_go off: %d (0x%08x)\n", res, rsp.br_image_off); */ - return res; - } else { - sim_reset_flash_areas(); - sim_reset_context(); - free(state); - return -0x13579; - } -} - -void *os_malloc(size_t size) -{ - // printf("os_malloc 0x%x bytes\n", size); - return malloc(size); -} - -int flash_area_id_from_multi_image_slot(int image_index, int slot) -{ - switch (slot) { - case 0: return FLASH_AREA_IMAGE_PRIMARY(image_index); - case 1: return FLASH_AREA_IMAGE_SECONDARY(image_index); - case 2: return FLASH_AREA_IMAGE_SCRATCH; - } - - printf("Image flash area ID not found\n"); - return -1; /* flash_area_open will fail on that */ -} - -int flash_area_open(uint8_t id, const struct flash_area **area) -{ - uint32_t i; - struct area_desc *flash_areas; - - flash_areas = sim_get_flash_areas(); - for (i = 0; i < flash_areas->num_slots; i++) { - if (flash_areas->slots[i].id == id) - break; - } - if (i == flash_areas->num_slots) { - printf("Unsupported area\n"); - abort(); - } - - /* Unsure if this is right, just returning the first area. */ - *area = &flash_areas->slots[i].whole; - return 0; -} - -void flash_area_close(const struct flash_area *area) -{ - (void)area; -} - -/* - * Read/write/erase. Offset is relative from beginning of flash area. - */ -int flash_area_read(const struct flash_area *area, uint32_t off, void *dst, - uint32_t len) -{ - BOOT_LOG_SIM("%s: area=%d, off=%x, len=%x", - __func__, area->fa_id, off, len); - return sim_flash_read(area->fa_device_id, area->fa_off + off, dst, len); -} - -int flash_area_write(const struct flash_area *area, uint32_t off, const void *src, - uint32_t len) -{ - BOOT_LOG_SIM("%s: area=%d, off=%x, len=%x", __func__, - area->fa_id, off, len); - struct sim_context *ctx = sim_get_context(); - if (--(ctx->flash_counter) == 0) { - ctx->jumped++; - longjmp(ctx->boot_jmpbuf, 1); - } - return sim_flash_write(area->fa_device_id, area->fa_off + off, src, len); -} - -int flash_area_erase(const struct flash_area *area, uint32_t off, uint32_t len) -{ - BOOT_LOG_SIM("%s: area=%d, off=%x, len=%x", __func__, - area->fa_id, off, len); - struct sim_context *ctx = sim_get_context(); - if (--(ctx->flash_counter) == 0) { - ctx->jumped++; - longjmp(ctx->boot_jmpbuf, 1); - } - return sim_flash_erase(area->fa_device_id, area->fa_off + off, len); -} - -int flash_area_read_is_empty(const struct flash_area *area, uint32_t off, - void *dst, uint32_t len) -{ - uint8_t i; - uint8_t *u8dst; - int rc; - - BOOT_LOG_SIM("%s: area=%d, off=%x, len=%x", __func__, area->fa_id, off, len); - - rc = sim_flash_read(area->fa_device_id, area->fa_off + off, dst, len); - if (rc) { - return -1; - } - - for (i = 0, u8dst = (uint8_t *)dst; i < len; i++) { - if (u8dst[i] != sim_flash_erased_val(area->fa_device_id)) { - return 0; - } - } - - return 1; -} - -int flash_area_to_sectors(int idx, int *cnt, struct flash_area *ret) -{ - uint32_t i; - struct area *slot; - struct area_desc *flash_areas; - - flash_areas = sim_get_flash_areas(); - for (i = 0; i < flash_areas->num_slots; i++) { - if (flash_areas->slots[i].id == idx) - break; - } - if (i == flash_areas->num_slots) { - printf("Unsupported area\n"); - abort(); - } - - slot = &flash_areas->slots[i]; - - if (slot->num_areas > (uint32_t)*cnt) { - printf("Too many areas in slot\n"); - abort(); - } - - *cnt = slot->num_areas; - memcpy(ret, slot->areas, slot->num_areas * sizeof(struct flash_area)); - - return 0; -} - -int flash_area_get_sectors(int fa_id, uint32_t *count, - struct flash_sector *sectors) -{ - uint32_t i; - struct area *slot; - struct area_desc *flash_areas; - - flash_areas = sim_get_flash_areas(); - for (i = 0; i < flash_areas->num_slots; i++) { - if (flash_areas->slots[i].id == fa_id) - break; - } - if (i == flash_areas->num_slots) { - printf("Unsupported area\n"); - abort(); - } - - slot = &flash_areas->slots[i]; - - if (slot->num_areas > *count) { - printf("Too many areas in slot\n"); - abort(); - } - - for (i = 0; i < slot->num_areas; i++) { - sectors[i].fs_off = slot->areas[i].fa_off - - slot->whole.fa_off; - sectors[i].fs_size = slot->areas[i].fa_size; - } - *count = slot->num_areas; - - return 0; -} - -int flash_area_id_to_multi_image_slot(int image_index, int area_id) -{ - if (area_id == FLASH_AREA_IMAGE_PRIMARY(image_index)) { - return 0; - } - if (area_id == FLASH_AREA_IMAGE_SECONDARY(image_index)) { - return 1; - } - - printf("Unsupported image area ID\n"); - abort(); -} - -void sim_assert(int x, const char *assertion, const char *file, unsigned int line, const char *function) -{ - if (!(x)) { - struct sim_context *ctx = sim_get_context(); - if (ctx->c_catch_asserts) { - ctx->c_asserts++; - } else { - BOOT_LOG_ERR("%s:%d: %s: Assertion `%s' failed.", file, line, function, assertion); - - /* NOTE: if the assert below is triggered, the place where it was originally - * asserted is printed by the message above... - */ - assert(x); - } - } -} - -uint32_t boot_max_align(void) -{ - return BOOT_MAX_ALIGN; -} - -uint32_t boot_magic_sz(void) -{ - return BOOT_MAGIC_SZ; -} diff --git a/mcuboot/sim/mcuboot-sys/csupport/storage/flash_map.h b/mcuboot/sim/mcuboot-sys/csupport/storage/flash_map.h deleted file mode 100644 index b27a90ccc..000000000 --- a/mcuboot/sim/mcuboot-sys/csupport/storage/flash_map.h +++ /dev/null @@ -1,163 +0,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 H_UTIL_FLASH_MAP_ -#define H_UTIL_FLASH_MAP_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * - * Provides abstraction of flash regions for type of use. - * I.e. dude where's my image? - * - * System will contain a map which contains flash areas. Every - * region will contain flash identifier, offset within flash and length. - * - * 1. This system map could be in a file within filesystem (Initializer - * must know/figure out where the filesystem is at). - * 2. Map could be at fixed location for project (compiled to code) - * 3. Map could be at specific place in flash (put in place at mfg time). - * - * Note that the map you use must be valid for BSP it's for, - * match the linker scripts when platform executes from flash, - * and match the target offset specified in download script. - */ -#include - -/** - * @brief Structure describing an area on a flash device. - * - * Multiple flash devices may be available in the system, each of - * which may have its own areas. For this reason, flash areas track - * which flash device they are part of. - */ -struct flash_area { - /** - * This flash area's ID; unique in the system. - */ - uint8_t fa_id; - - /** - * ID of the flash device this area is a part of. - */ - uint8_t fa_device_id; - - uint16_t pad16; - - /** - * This area's offset, relative to the beginning of its flash - * device's storage. - */ - uint32_t fa_off; - - /** - * This area's size, in bytes. - */ - uint32_t fa_size; -}; - -/** - * @brief Structure describing a sector within a flash area. - * - * Each sector has an offset relative to the start of its flash area - * (NOT relative to the start of its flash device), and a size. A - * flash area may contain sectors with different sizes. - */ -struct flash_sector { - /** - * Offset of this sector, from the start of its flash area (not device). - */ - uint32_t fs_off; - - /** - * Size of this sector, in bytes. - */ - uint32_t fs_size; -}; - -/* - * Retrieve a memory-mapped flash device's base address. - * - * On success, the address will be stored in the value pointed to by - * ret. - * - * Returns 0 on success, or an error code on failure. - */ -int flash_device_base(uint8_t fd_id, uintptr_t *ret); - -/* - * Start using flash area. - */ -int flash_area_open(uint8_t id, const struct flash_area **); - -void flash_area_close(const struct flash_area *); - -/* - * Read/write/erase. Offset is relative from beginning of flash area. - */ -int flash_area_read(const struct flash_area *, uint32_t off, void *dst, - uint32_t len); -int flash_area_write(const struct flash_area *, uint32_t off, const void *src, - uint32_t len); -int flash_area_erase(const struct flash_area *, uint32_t off, uint32_t len); - -/* - * Alignment restriction for flash writes. - */ -uint8_t flash_area_align(const struct flash_area *); - -/* - * What is value is read from erased flash bytes. - */ -uint8_t flash_area_erased_val(const struct flash_area *); - -/* - * Reads len bytes from off, and checks if the read data is erased. - * - * Returns 1 if erased, 0 if non-erased, and -1 on failure. - */ -int flash_area_read_is_empty(const struct flash_area *fa, uint32_t off, - void *dst, uint32_t len); - -/* - * Given flash area ID, return info about sectors within the area. - */ -int flash_area_get_sectors(int fa_id, uint32_t *count, - struct flash_sector *sectors); - -/* - * Similar to flash_area_get_sectors(), but return the values in an - * array of struct flash_area instead. - */ -__attribute__((deprecated)) -int flash_area_to_sectors(int idx, int *cnt, struct flash_area *ret); - -int flash_area_id_from_image_slot(int slot); -int flash_area_id_from_multi_image_slot(int image_index, int slot); -int flash_area_id_to_image_slot(int area_id); -int flash_area_id_to_multi_image_slot(int image_index, int area_id); - -#ifdef __cplusplus -} -#endif - -#endif /* H_UTIL_FLASH_MAP_ */ diff --git a/mcuboot/sim/mcuboot-sys/src/api.rs b/mcuboot/sim/mcuboot-sys/src/api.rs deleted file mode 100644 index a88cfcf6e..000000000 --- a/mcuboot/sim/mcuboot-sys/src/api.rs +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright (c) 2017-2019 Linaro LTD -// Copyright (c) 2018-2019 JUUL Labs -// -// SPDX-License-Identifier: Apache-2.0 - -//! HAL api for MyNewt applications - -use crate::area::CAreaDesc; -use libc; -use log::{Level, log_enabled, warn}; -use simflash::{Result, Flash, FlashPtr}; -use std::{ - cell::RefCell, - collections::HashMap, - mem, - ptr, - slice, -}; - -/// A FlashMap maintain a table of [device_id -> Flash trait] -pub type FlashMap = HashMap; - -pub struct FlashParamsStruct { - align: u8, - erased_val: u8, -} - -pub type FlashParams = HashMap; - -pub struct CAreaDescPtr { - pub ptr: *const CAreaDesc, -} - -pub struct FlashContext { - flash_map: FlashMap, - flash_params: FlashParams, - flash_areas: CAreaDescPtr, -} - -impl FlashContext { - pub fn new() -> FlashContext { - FlashContext { - flash_map: HashMap::new(), - flash_params: HashMap::new(), - flash_areas: CAreaDescPtr{ptr: ptr::null()}, - } - } -} - -#[repr(C)] -#[derive(Debug, Default)] -pub struct CSimContext { - pub flash_counter: libc::c_int, - pub jumped: libc::c_int, - pub c_asserts: u8, - pub c_catch_asserts: u8, - // NOTE: Always leave boot_jmpbuf declaration at the end; this should - // store a "jmp_buf" which is arch specific and not defined by libc crate. - // The size below is enough to store data on a x86_64 machine. - pub boot_jmpbuf: [u64; 16], -} - -pub struct CSimContextPtr { - pub ptr: *const CSimContext, -} - -impl CSimContextPtr { - pub fn new() -> CSimContextPtr { - CSimContextPtr { - ptr: ptr::null(), - } - } -} - -thread_local! { - pub static THREAD_CTX: RefCell = RefCell::new(FlashContext::new()); - pub static SIM_CTX: RefCell = RefCell::new(CSimContextPtr::new()); -} - -// Set the flash device to be used by the simulation. The pointer is unsafely stashed away. -pub unsafe fn set_flash(dev_id: u8, dev: &mut dyn Flash) { - THREAD_CTX.with(|ctx| { - ctx.borrow_mut().flash_params.insert(dev_id, FlashParamsStruct { - align: dev.align() as u8, - erased_val: dev.erased_val(), - }); - let dev: &'static mut dyn Flash = mem::transmute(dev); - ctx.borrow_mut().flash_map.insert( - dev_id, FlashPtr{ptr: dev as *mut dyn Flash}); - }); -} - -pub unsafe fn clear_flash(dev_id: u8) { - THREAD_CTX.with(|ctx| { - ctx.borrow_mut().flash_map.remove(&dev_id); - }); -} - -// This isn't meant to call directly, but by a wrapper. - -#[no_mangle] -pub extern fn sim_get_flash_areas() -> *const CAreaDesc { - THREAD_CTX.with(|ctx| { - ctx.borrow().flash_areas.ptr - }) -} - -#[no_mangle] -pub extern fn sim_set_flash_areas(areas: *const CAreaDesc) { - THREAD_CTX.with(|ctx| { - ctx.borrow_mut().flash_areas.ptr = areas; - }); -} - -#[no_mangle] -pub extern fn sim_reset_flash_areas() { - THREAD_CTX.with(|ctx| { - ctx.borrow_mut().flash_areas.ptr = ptr::null(); - }); -} - -#[no_mangle] -pub extern fn sim_get_context() -> *const CSimContext { - SIM_CTX.with(|ctx| { - ctx.borrow().ptr - }) -} - -#[no_mangle] -pub extern fn sim_set_context(ptr: *const CSimContext) { - SIM_CTX.with(|ctx| { - ctx.borrow_mut().ptr = ptr; - }); -} - -#[no_mangle] -pub extern fn sim_reset_context() { - SIM_CTX.with(|ctx| { - ctx.borrow_mut().ptr = ptr::null(); - }); -} - -#[no_mangle] -pub extern fn sim_flash_erase(dev_id: u8, offset: u32, size: u32) -> libc::c_int { - let mut rc: libc::c_int = -19; - THREAD_CTX.with(|ctx| { - if let Some(flash) = ctx.borrow().flash_map.get(&dev_id) { - let dev = unsafe { &mut *(flash.ptr) }; - rc = map_err(dev.erase(offset as usize, size as usize)); - } - }); - rc -} - -#[no_mangle] -pub extern fn sim_flash_read(dev_id: u8, offset: u32, dest: *mut u8, size: u32) -> libc::c_int { - let mut rc: libc::c_int = -19; - THREAD_CTX.with(|ctx| { - if let Some(flash) = ctx.borrow().flash_map.get(&dev_id) { - let mut buf: &mut[u8] = unsafe { slice::from_raw_parts_mut(dest, size as usize) }; - let dev = unsafe { &mut *(flash.ptr) }; - rc = map_err(dev.read(offset as usize, &mut buf)); - } - }); - rc -} - -#[no_mangle] -pub extern fn sim_flash_write(dev_id: u8, offset: u32, src: *const u8, size: u32) -> libc::c_int { - let mut rc: libc::c_int = -19; - THREAD_CTX.with(|ctx| { - if let Some(flash) = ctx.borrow().flash_map.get(&dev_id) { - let buf: &[u8] = unsafe { slice::from_raw_parts(src, size as usize) }; - let dev = unsafe { &mut *(flash.ptr) }; - rc = map_err(dev.write(offset as usize, &buf)); - } - }); - rc -} - -#[no_mangle] -pub extern fn sim_flash_align(id: u8) -> u8 { - THREAD_CTX.with(|ctx| { - ctx.borrow().flash_params.get(&id).unwrap().align - }) -} - -#[no_mangle] -pub extern fn sim_flash_erased_val(id: u8) -> u8 { - THREAD_CTX.with(|ctx| { - ctx.borrow().flash_params.get(&id).unwrap().erased_val - }) -} - -fn map_err(err: Result<()>) -> libc::c_int { - match err { - Ok(()) => 0, - Err(e) => { - warn!("{}", e); - -1 - }, - } -} - -/// Called by C code to determine if we should log at this level. Levels are defined in -/// bootutil/bootutil_log.h. This makes the logging from the C code controlled by bootsim::api, so -/// for example, it can be enabled with something like: -/// RUST_LOG=bootsim::api=info cargo run --release runall -/// or -/// RUST_LOG=bootsim=info cargo run --release runall -#[no_mangle] -pub extern fn sim_log_enabled(level: libc::c_int) -> libc::c_int { - let res = match level { - 1 => log_enabled!(Level::Error), - 2 => log_enabled!(Level::Warn), - 3 => log_enabled!(Level::Info), - 4 => log_enabled!(Level::Debug), - 5 => log_enabled!(Level::Trace), // log level == SIM - _ => false, - }; - if res { - 1 - } else { - 0 - } -} diff --git a/mcuboot/sim/mcuboot-sys/src/area.rs b/mcuboot/sim/mcuboot-sys/src/area.rs deleted file mode 100644 index dc05e399b..000000000 --- a/mcuboot/sim/mcuboot-sys/src/area.rs +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright (c) 2017-2019 Linaro LTD -// Copyright (c) 2018-2019 JUUL Labs -// Copyright (c) 2019 Arm Limited -// -// SPDX-License-Identifier: Apache-2.0 - -//! Describe flash areas. - -use simflash::{Flash, SimFlash, Sector}; -use std::ptr; -use std::collections::HashMap; - -/// Structure to build up the boot area table. -#[derive(Debug, Clone)] -pub struct AreaDesc { - areas: Vec>, - whole: Vec, - sectors: HashMap>, -} - -impl AreaDesc { - pub fn new() -> AreaDesc { - AreaDesc { - areas: vec![], - whole: vec![], - sectors: HashMap::new(), - } - } - - pub fn add_flash_sectors(&mut self, id: u8, flash: &SimFlash) { - self.sectors.insert(id, flash.sector_iter().collect()); - } - - /// Add a slot to the image. The slot must align with erasable units in the flash device. - /// Panics if the description is not valid. There are also bootloader assumptions that the - /// slots are PRIMARY_SLOT, SECONDARY_SLOT, and SCRATCH in that order. - pub fn add_image(&mut self, base: usize, len: usize, id: FlashId, dev_id: u8) { - let nid = id as usize; - let orig_base = base; - let orig_len = len; - let mut base = base; - let mut len = len; - - while nid > self.areas.len() { - self.areas.push(vec![]); - self.whole.push(Default::default()); - } - - if nid != self.areas.len() { - panic!("Flash areas not added in order"); - } - - let mut area = vec![]; - - for sector in &self.sectors[&dev_id] { - if len == 0 { - break; - }; - if base > sector.base + sector.size - 1 { - continue; - } - if sector.base != base { - panic!("Image does not start on a sector boundary"); - } - - area.push(FlashArea { - flash_id: id, - device_id: dev_id, - pad16: 0, - off: sector.base as u32, - size: sector.size as u32, - }); - - base += sector.size; - len -= sector.size; - } - - if len != 0 { - panic!("Image goes past end of device"); - } - - self.areas.push(area); - self.whole.push(FlashArea { - flash_id: id, - device_id: dev_id, - pad16: 0, - off: orig_base as u32, - size: orig_len as u32, - }); - } - - // Add a simple slot to the image. This ignores the device layout, and just adds the area as a - // single unit. It assumes that the image lines up with image boundaries. This tests - // configurations where the partition table uses larger sectors than the underlying flash - // device. - pub fn add_simple_image(&mut self, base: usize, len: usize, id: FlashId, dev_id: u8) { - let area = vec![FlashArea { - flash_id: id, - device_id: dev_id, - pad16: 0, - off: base as u32, - size: len as u32, - }]; - - self.areas.push(area); - self.whole.push(FlashArea { - flash_id: id, - device_id: dev_id, - pad16: 0, - off: base as u32, - size: len as u32, - }); - } - - // Look for the image with the given ID, and return its offset, size and - // device id. Returns None if the area is not present. - pub fn find(&self, id: FlashId) -> Option<(usize, usize, u8)> { - for area in &self.whole { - // FIXME: should we ensure id is not duplicated over multiple devices? - if area.flash_id == id { - return Some((area.off as usize, area.size as usize, area.device_id)); - } - } - None - } - - pub fn get_c(&self) -> CAreaDesc { - let mut areas: CAreaDesc = Default::default(); - - assert_eq!(self.areas.len(), self.whole.len()); - - for (i, area) in self.areas.iter().enumerate() { - if area.len() > 0 { - areas.slots[i].areas = &area[0]; - areas.slots[i].whole = self.whole[i].clone(); - areas.slots[i].num_areas = area.len() as u32; - areas.slots[i].id = area[0].flash_id; - } - } - - areas.num_slots = self.areas.len() as u32; - - areas - } - - /// Return an iterator over all `FlashArea`s present. - pub fn iter_areas(&self) -> impl Iterator { - self.whole.iter() - } -} - -/// The area descriptor, C format. -#[repr(C)] -#[derive(Debug, Default)] -pub struct CAreaDesc { - slots: [CArea; 16], - num_slots: u32, -} - -#[repr(C)] -#[derive(Debug)] -pub struct CArea { - whole: FlashArea, - areas: *const FlashArea, - num_areas: u32, - // FIXME: is this not already available on whole/areas? - id: FlashId, -} - -impl Default for CArea { - fn default() -> CArea { - CArea { - areas: ptr::null(), - whole: Default::default(), - id: FlashId::BootLoader, - num_areas: 0, - } - } -} - -/// Flash area map. -#[repr(u8)] -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[allow(dead_code)] -pub enum FlashId { - BootLoader = 0, - Image0 = 1, - Image1 = 2, - ImageScratch = 3, - Image2 = 4, - Image3 = 5, -} - -impl Default for FlashId { - fn default() -> FlashId { - FlashId::BootLoader - } -} - -#[repr(C)] -#[derive(Debug, Clone, Default)] -pub struct FlashArea { - pub flash_id: FlashId, - pub device_id: u8, - pad16: u16, - pub off: u32, - pub size: u32, -} diff --git a/mcuboot/sim/mcuboot-sys/src/c.rs b/mcuboot/sim/mcuboot-sys/src/c.rs deleted file mode 100644 index 61276e27c..000000000 --- a/mcuboot/sim/mcuboot-sys/src/c.rs +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2017-2019 Linaro LTD -// Copyright (c) 2017-2019 JUUL Labs -// Copyright (c) 2019 Arm Limited -// -// SPDX-License-Identifier: Apache-2.0 - -//! Interface wrappers to C API entering to the bootloader - -use crate::area::AreaDesc; -use simflash::SimMultiFlash; -use libc; -use crate::api; - -/// Invoke the bootloader on this flash device. -pub fn boot_go(multiflash: &mut SimMultiFlash, areadesc: &AreaDesc, - counter: Option<&mut i32>, catch_asserts: bool) -> (i32, u8) { - unsafe { - for (&dev_id, flash) in multiflash.iter_mut() { - api::set_flash(dev_id, flash); - } - } - let mut sim_ctx = api::CSimContext { - flash_counter: match counter { - None => 0, - Some(ref c) => **c as libc::c_int - }, - jumped: 0, - c_asserts: 0, - c_catch_asserts: if catch_asserts { 1 } else { 0 }, - boot_jmpbuf: [0; 16], - }; - let result = unsafe { - raw::invoke_boot_go(&mut sim_ctx as *mut _, &areadesc.get_c() as *const _) as i32 - }; - let asserts = sim_ctx.c_asserts; - counter.map(|c| *c = sim_ctx.flash_counter); - unsafe { - for (&dev_id, _) in multiflash { - api::clear_flash(dev_id); - } - }; - (result, asserts) -} - -pub fn boot_trailer_sz(align: u32) -> u32 { - unsafe { raw::boot_trailer_sz(align) } -} - -pub fn boot_status_sz(align: u32) -> u32 { - unsafe { raw::boot_status_sz(align) } -} - -pub fn boot_magic_sz() -> usize { - unsafe { raw::boot_magic_sz() as usize } -} - -pub fn boot_max_align() -> usize { - unsafe { raw::boot_max_align() as usize } -} - -pub fn rsa_oaep_encrypt(pubkey: &[u8], seckey: &[u8]) -> Result<[u8; 256], &'static str> { - unsafe { - let mut encbuf: [u8; 256] = [0; 256]; - if raw::rsa_oaep_encrypt_(pubkey.as_ptr(), pubkey.len() as u32, - seckey.as_ptr(), seckey.len() as u32, - encbuf.as_mut_ptr()) == 0 { - return Ok(encbuf); - } - return Err("Failed to encrypt buffer"); - } -} - -pub fn kw_encrypt(kek: &[u8], seckey: &[u8]) -> Result<[u8; 24], &'static str> { - unsafe { - let mut encbuf = [0u8; 24]; - if raw::kw_encrypt_(kek.as_ptr(), seckey.as_ptr(), encbuf.as_mut_ptr()) == 0 { - return Ok(encbuf); - } - return Err("Failed to encrypt buffer"); - } -} - -mod raw { - use crate::area::CAreaDesc; - use crate::api::CSimContext; - use libc; - - extern "C" { - // This generates a warning about `CAreaDesc` not being foreign safe. There doesn't appear to - // be any way to get rid of this warning. See https://github.com/rust-lang/rust/issues/34798 - // for information and tracking. - pub fn invoke_boot_go(sim_ctx: *mut CSimContext, areadesc: *const CAreaDesc) -> libc::c_int; - - pub fn boot_trailer_sz(min_write_sz: u32) -> u32; - pub fn boot_status_sz(min_write_sz: u32) -> u32; - - pub fn boot_magic_sz() -> u32; - pub fn boot_max_align() -> u32; - - pub fn rsa_oaep_encrypt_(pubkey: *const u8, pubkey_len: libc::c_uint, - seckey: *const u8, seckey_len: libc::c_uint, - encbuf: *mut u8) -> libc::c_int; - - pub fn kw_encrypt_(kek: *const u8, seckey: *const u8, - encbuf: *mut u8) -> libc::c_int; - } -} diff --git a/mcuboot/sim/mcuboot-sys/src/lib.rs b/mcuboot/sim/mcuboot-sys/src/lib.rs deleted file mode 100644 index 8acb246ec..000000000 --- a/mcuboot/sim/mcuboot-sys/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2017-2019 Linaro LTD -// -// SPDX-License-Identifier: Apache-2.0 - -mod area; -pub mod c; - -// The API needs to be public, even though it isn't intended to be called by Rust code, but the -// functions are exported to C code. -pub mod api; - -pub use crate::area::{AreaDesc, FlashId}; diff --git a/mcuboot/sim/simflash/.gitignore b/mcuboot/sim/simflash/.gitignore deleted file mode 100644 index 03314f77b..000000000 --- a/mcuboot/sim/simflash/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Cargo.lock diff --git a/mcuboot/sim/simflash/Cargo.toml b/mcuboot/sim/simflash/Cargo.toml deleted file mode 100644 index 36776e401..000000000 --- a/mcuboot/sim/simflash/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "simflash" -version = "0.1.0" -authors = ["David Brown "] -edition = "2018" - -[dependencies] -failure = "0.1.6" -failure_derive = "0.1.6" -rand = "0.4" -log = "0.4" diff --git a/mcuboot/sim/simflash/src/lib.rs b/mcuboot/sim/simflash/src/lib.rs deleted file mode 100644 index c991d4787..000000000 --- a/mcuboot/sim/simflash/src/lib.rs +++ /dev/null @@ -1,382 +0,0 @@ -// Copyright (c) 2017-2019 Linaro LTD -// Copyright (c) 2017-2018 JUUL Labs -// -// SPDX-License-Identifier: Apache-2.0 - -//! A flash simulator -//! -//! This module is capable of simulating the type of NOR flash commonly used in microcontrollers. -//! These generally can be written as individual bytes, but must be erased in larger units. - -mod pdump; - -use crate::pdump::HexDump; -use failure::Fail; -use log::info; -use rand::{ - self, - distributions::{IndependentSample, Range}, -}; -use std::{ - collections::HashMap, - fs::File, - io::{self, Write}, - iter::Enumerate, - path::Path, - slice, -}; - -pub type Result = std::result::Result; - -#[derive(Fail, Debug)] -pub enum FlashError { - #[fail(display = "Offset out of bounds: {}", _0)] - OutOfBounds(String), - #[fail(display = "Invalid write: {}", _0)] - Write(String), - #[fail(display = "Write failed by chance: {}", _0)] - SimulatedFail(String), - #[fail(display = "{}", _0)] - Io(#[cause] io::Error), -} - -impl From for FlashError { - fn from(error: io::Error) -> Self { - FlashError::Io(error) - } -} - -// Transition from error-chain. -macro_rules! bail { - ($item:expr) => (return Err($item.into());) -} - -pub struct FlashPtr { - pub ptr: *mut dyn Flash, -} -unsafe impl Send for FlashPtr {} - -pub trait Flash { - fn erase(&mut self, offset: usize, len: usize) -> Result<()>; - fn write(&mut self, offset: usize, payload: &[u8]) -> Result<()>; - fn read(&self, offset: usize, data: &mut [u8]) -> Result<()>; - - fn add_bad_region(&mut self, offset: usize, len: usize, rate: f32) -> Result<()>; - fn reset_bad_regions(&mut self); - - fn set_verify_writes(&mut self, enable: bool); - - fn sector_iter(&self) -> SectorIter<'_>; - fn device_size(&self) -> usize; - - fn align(&self) -> usize; - fn erased_val(&self) -> u8; -} - -fn ebounds>(message: T) -> FlashError { - FlashError::OutOfBounds(message.as_ref().to_owned()) -} - -#[allow(dead_code)] -fn ewrite>(message: T) -> FlashError { - FlashError::Write(message.as_ref().to_owned()) -} - -#[allow(dead_code)] -fn esimulatedwrite>(message: T) -> FlashError { - FlashError::SimulatedFail(message.as_ref().to_owned()) -} - -/// An emulated flash device. It is represented as a block of bytes, and a list of the sector -/// mappings. -#[derive(Clone)] -pub struct SimFlash { - data: Vec, - write_safe: Vec, - sectors: Vec, - bad_region: Vec<(usize, usize, f32)>, - // Alignment required for writes. - align: usize, - verify_writes: bool, - erased_val: u8, -} - -impl SimFlash { - /// Given a sector size map, construct a flash device for that. - pub fn new(sectors: Vec, align: usize, erased_val: u8) -> SimFlash { - // Verify that the alignment is a positive power of two. - assert!(align > 0); - assert!(align & (align - 1) == 0); - - let total = sectors.iter().sum(); - SimFlash { - data: vec![erased_val; total], - write_safe: vec![true; total], - sectors: sectors, - bad_region: Vec::new(), - align: align, - verify_writes: true, - erased_val: erased_val, - } - } - - #[allow(dead_code)] - pub fn dump(&self) { - self.data.dump(); - } - - /// Dump this image to the given file. - #[allow(dead_code)] - pub fn write_file>(&self, path: P) -> Result<()> { - let mut fd = File::create(path)?; - fd.write_all(&self.data)?; - Ok(()) - } - - // Scan the sector map, and return the base and offset within a sector for this given byte. - // Returns None if the value is outside of the device. - fn get_sector(&self, offset: usize) -> Option<(usize, usize)> { - let mut offset = offset; - for (sector, &size) in self.sectors.iter().enumerate() { - if offset < size { - return Some((sector, offset)); - } - offset -= size; - } - return None; - } - -} - -pub type SimMultiFlash = HashMap; - -impl Flash for SimFlash { - /// The flash drivers tend to erase beyond the bounds of the given range. Instead, we'll be - /// strict, and make sure that the passed arguments are exactly at a sector boundary, otherwise - /// return an error. - fn erase(&mut self, offset: usize, len: usize) -> Result<()> { - let (_start, slen) = self.get_sector(offset).ok_or_else(|| ebounds("start"))?; - let (end, elen) = self.get_sector(offset + len - 1).ok_or_else(|| ebounds("end"))?; - - if slen != 0 { - bail!(ebounds("offset not at start of sector")); - } - if elen != self.sectors[end] - 1 { - bail!(ebounds("end not at start of sector")); - } - - for x in &mut self.data[offset .. offset + len] { - *x = self.erased_val; - } - - for x in &mut self.write_safe[offset .. offset + len] { - *x = true; - } - - Ok(()) - } - - /// We restrict to only allowing writes of values that are: - /// - /// 1. being written to for the first time - /// 2. being written to after being erased - /// - /// This emulates a flash device which starts out erased, with the - /// added restriction that repeated writes to the same location - /// are disallowed, even if they would be safe to do. - fn write(&mut self, offset: usize, payload: &[u8]) -> Result<()> { - for &(off, len, rate) in &self.bad_region { - if offset >= off && (offset + payload.len()) <= (off + len) { - let mut rng = rand::thread_rng(); - let between = Range::new(0., 1.); - if between.ind_sample(&mut rng) < rate { - bail!(esimulatedwrite( - format!("Ignoring write to {:#x}-{:#x}", off, off + len))); - } - } - } - - if offset + payload.len() > self.data.len() { - panic!("Write outside of device"); - } - - // Verify the alignment (which must be a power of two). - if offset & (self.align - 1) != 0 { - panic!("Misaligned write address"); - } - - if payload.len() & (self.align - 1) != 0 { - panic!("Write length not multiple of alignment"); - } - - for (i, x) in &mut self.write_safe[offset .. offset + payload.len()].iter_mut().enumerate() { - if self.verify_writes && !(*x) { - panic!("Write to unerased location at 0x{:x}", offset + i); - } - *x = false; - } - - let sub = &mut self.data[offset .. offset + payload.len()]; - sub.copy_from_slice(payload); - Ok(()) - } - - /// Read is simple. - fn read(&self, offset: usize, data: &mut [u8]) -> Result<()> { - if offset + data.len() > self.data.len() { - bail!(ebounds("Read outside of device")); - } - - let sub = &self.data[offset .. offset + data.len()]; - data.copy_from_slice(sub); - Ok(()) - } - - /// Adds a new flash bad region. Writes to this area fail with a chance - /// given by `rate`. - fn add_bad_region(&mut self, offset: usize, len: usize, rate: f32) -> Result<()> { - if rate < 0.0 || rate > 1.0 { - bail!(ebounds("Invalid rate")); - } - - info!("Adding new bad region {:#x}-{:#x}", offset, offset + len); - self.bad_region.push((offset, len, rate)); - - Ok(()) - } - - fn reset_bad_regions(&mut self) { - self.bad_region.clear(); - } - - fn set_verify_writes(&mut self, enable: bool) { - self.verify_writes = enable; - } - - /// An iterator over each sector in the device. - fn sector_iter(&self) -> SectorIter<'_> { - SectorIter { - iter: self.sectors.iter().enumerate(), - base: 0, - } - } - - fn device_size(&self) -> usize { - self.data.len() - } - - fn align(&self) -> usize { - self.align - } - - fn erased_val(&self) -> u8 { - self.erased_val - } -} - -/// It is possible to iterate over the sectors in the device, each element returning this. -#[derive(Debug, Clone)] -pub struct Sector { - /// Which sector is this, starting from 0. - pub num: usize, - /// The offset, in bytes, of the start of this sector. - pub base: usize, - /// The length, in bytes, of this sector. - pub size: usize, -} - -pub struct SectorIter<'a> { - iter: Enumerate>, - base: usize, -} - -impl<'a> Iterator for SectorIter<'a> { - type Item = Sector; - - fn next(&mut self) -> Option { - match self.iter.next() { - None => None, - Some((num, &size)) => { - let base = self.base; - self.base += size; - Some(Sector { - num: num, - base: base, - size: size, - }) - } - } - } -} - -#[cfg(test)] -mod test { - use super::{Flash, FlashError, SimFlash, Result, Sector}; - - #[test] - fn test_flash() { - for &erased_val in &[0, 0xff] { - // NXP-style, uniform sectors. - let mut f1 = SimFlash::new(vec![4096usize; 256], 1, erased_val); - test_device(&mut f1, erased_val); - - // STM style, non-uniform sectors. - let mut f2 = SimFlash::new(vec![16 * 1024, 16 * 1024, 16 * 1024, 64 * 1024, - 128 * 1024, 128 * 1024, 128 * 1024], 1, erased_val); - test_device(&mut f2, erased_val); - } - } - - fn test_device(flash: &mut dyn Flash, erased_val: u8) { - let sectors: Vec = flash.sector_iter().collect(); - - flash.erase(0, sectors[0].size).unwrap(); - let flash_size = flash.device_size(); - flash.erase(0, flash_size).unwrap(); - assert!(flash.erase(0, sectors[0].size - 1).is_bounds()); - - // Verify that write and erase do something. - flash.write(0, &[0x55]).unwrap(); - let mut buf = [0xAA; 4]; - flash.read(0, &mut buf).unwrap(); - assert_eq!(buf, [0x55, erased_val, erased_val, erased_val]); - - flash.erase(0, sectors[0].size).unwrap(); - flash.read(0, &mut buf).unwrap(); - assert_eq!(buf, [erased_val; 4]); - - // Program the first and last byte of each sector, verify that has been done, and then - // erase to verify the erase boundaries. - for sector in §ors { - let byte = [(sector.num & 127) as u8]; - flash.write(sector.base, &byte).unwrap(); - flash.write(sector.base + sector.size - 1, &byte).unwrap(); - } - - // Verify the above - let mut buf = Vec::new(); - for sector in §ors { - let byte = (sector.num & 127) as u8; - buf.resize(sector.size, 0); - flash.read(sector.base, &mut buf).unwrap(); - assert_eq!(buf.first(), Some(&byte)); - assert_eq!(buf.last(), Some(&byte)); - assert!(buf[1..buf.len()-1].iter().all(|&x| x == erased_val)); - } - } - - // Helper checks for the result type. - trait EChecker { - fn is_bounds(&self) -> bool; - } - - impl EChecker for Result { - - fn is_bounds(&self) -> bool { - match *self { - Err(FlashError::OutOfBounds(_)) => true, - _ => false, - } - } - } -} diff --git a/mcuboot/sim/simflash/src/pdump.rs b/mcuboot/sim/simflash/src/pdump.rs deleted file mode 100644 index c68aa832c..000000000 --- a/mcuboot/sim/simflash/src/pdump.rs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 2017 Linaro LTD -// -// SPDX-License-Identifier: Apache-2.0 - -// Printable hexdump. - -pub trait HexDump { - // Output the data value in hex. - fn dump(&self); -} - -struct Dumper { - hex: String, - ascii: String, - count: usize, - total_count: usize, -} - -impl Dumper { - fn new() -> Dumper { - Dumper { - hex: String::with_capacity(49), - ascii: String::with_capacity(16), - count: 0, - total_count: 0, - } - } - - fn add_byte(&mut self, ch: u8) { - if self.count == 16 { - self.ship(); - } - if self.count == 8 { - self.hex.push(' '); - } - self.hex.push_str(&format!(" {:02x}", ch)[..]); - self.ascii.push(if ch >= ' ' as u8 && ch <= '~' as u8 { - ch as char - } else { - '.' - }); - self.count += 1; - } - - fn ship(&mut self) { - if self.count == 0 { - return; - } - - println!("{:06x} {:-49} |{}|", self.total_count, self.hex, self.ascii); - - self.hex.clear(); - self.ascii.clear(); - self.total_count += 16; - self.count = 0; - } -} - -impl<'a> HexDump for &'a [u8] { - fn dump(&self) { - let mut dump = Dumper::new(); - for ch in self.iter() { - dump.add_byte(*ch); - } - dump.ship(); - } -} - -impl HexDump for Vec { - fn dump(&self) { - (&self[..]).dump() - } -} - -#[test] -fn samples() { - "Hello".as_bytes().dump(); - "This is a much longer string".as_bytes().dump(); - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f".as_bytes().dump(); -} diff --git a/mcuboot/sim/src/caps.rs b/mcuboot/sim/src/caps.rs deleted file mode 100644 index edffd0c6f..000000000 --- a/mcuboot/sim/src/caps.rs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2017-2019 Linaro LTD -// Copyright (c) 2019 JUUL Labs -// Copyright (c) 2019 Arm Limited -// -// SPDX-License-Identifier: Apache-2.0 - -// Query the bootloader's capabilities. - -#[repr(u32)] -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[allow(unused)] -pub enum Caps { - RSA2048 = (1 << 0), - EcdsaP224 = (1 << 1), - EcdsaP256 = (1 << 2), - SwapUsingScratch = (1 << 3), - OverwriteUpgrade = (1 << 4), - EncRsa = (1 << 5), - EncKw = (1 << 6), - ValidatePrimarySlot = (1 << 7), - RSA3072 = (1 << 8), - Ed25519 = (1 << 9), - EncEc256 = (1 << 10), - SwapUsingMove = (1 << 11), - DowngradePrevention = (1 << 12), - EncX25519 = (1 << 13), -} - -impl Caps { - pub fn present(self) -> bool { - let caps = unsafe { bootutil_get_caps() }; - (caps as u32) & (self as u32) != 0 - } - - /// Query for the number of images that have been configured into this - /// MCUboot build. - pub fn get_num_images() -> usize { - (unsafe { bootutil_get_num_images() }) as usize - } -} - -extern "C" { - fn bootutil_get_caps() -> Caps; - fn bootutil_get_num_images() -> u32; -} diff --git a/mcuboot/sim/src/depends.rs b/mcuboot/sim/src/depends.rs deleted file mode 100644 index f3bbc2989..000000000 --- a/mcuboot/sim/src/depends.rs +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) 2019 Linaro LTD -// -// SPDX-License-Identifier: Apache-2.0 - -//! Support and tests related to the dependency management for multi-image -//! support. - -use crate::image::ImageVersion; - -pub trait Depender { - /// Generate a version for this particular image. The slot indicates - /// which slot this is being put in. - fn my_version(&self, offset: usize, slot: usize) -> ImageVersion; - - /// Return dependencies for this image/slot combination. - fn my_deps(&self, offset: usize, slot: usize) -> Vec; - - /// Return the image ID of the other version. - fn other_id(&self) -> u8; -} - -/// A boring image is used when we aren't testing dependencies. There will -/// be meaningful version numbers. The size field is the image number we -/// are. -pub struct BoringDep { - number: usize, - test: DepTest, -} - -impl BoringDep { - pub fn new(number: usize, test: &DepTest) -> BoringDep { - BoringDep { - number: number, - test: test.clone(), - } - } -} - -impl Depender for BoringDep { - fn my_version(&self, _offset: usize, slot: usize) -> ImageVersion { - let slot = if self.test.downgrade { - 1 - slot - } else { - slot - }; - ImageVersion::new_synthetic(self.number as u8, slot as u8, 0) - } - - fn my_deps(&self, _offset: usize, _slot: usize) -> Vec { - vec![] - } - - fn other_id(&self) -> u8 { - 0 - } -} - -/// An individual test of the dependency mechanism describes one of the -/// possibilities for the dependency information for each image, and what -/// the expected outcome is. -#[derive(Clone, Debug)] -pub struct DepTest { - /// What kinds of dependency should be installed in the image. - pub depends: [DepType; 2], - - /// What is the expected outcome of the upgrade. - pub upgrades: [UpgradeInfo; 2], - - /// Should this be considered a downgrade (cause the version number to - /// decrease). - pub downgrade: bool, -} - -/// Describes the various types of dependency information that can be -/// provided. -#[derive(Clone, Debug)] -pub enum DepType { - /// Do not include dependency information - Nothing, - /// Provide dependency information that matches the other image. - Correct, - /// Provide a dependency that matches the old version of the other - /// image. - OldCorrect, - /// Provide dependency information describing something newer than the - /// other image. - Newer, - /// Don't provide an upgrade image at all for this image - NoUpgrade, -} - -/// Describes what our expectation is for an upgrade. -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum UpgradeInfo { - /// The current version should be held. - Held, - /// The image should be upgraded - Upgraded, -} - -/// A "test" that gives no dependency information. -pub static NO_DEPS: DepTest = DepTest { - depends: [DepType::Nothing, DepType::Nothing], - upgrades: [UpgradeInfo::Upgraded, UpgradeInfo::Upgraded], - downgrade: false, -}; - -/// A "test" with no dependency information, and the images marked as a -/// downgrade. -pub static REV_DEPS: DepTest = DepTest { - depends: [DepType::Nothing, DepType::Nothing], - upgrades: [UpgradeInfo::Held, UpgradeInfo::Held], - downgrade: true, -}; - -/// A PairDep describes the dependencies between two pairs. -pub struct PairDep { - /// The image number of this image. - number: usize, - - test: DepTest, -} - -impl PairDep { - pub fn new(total_image: usize, my_image: usize, deps: &DepTest) -> PairDep { - if total_image != 2 { - panic!("PairDep only works when there are two images"); - } - - PairDep { - number: my_image, - test: deps.clone(), - } - } -} - -impl Depender for PairDep { - fn my_version(&self, _offset: usize, slot: usize) -> ImageVersion { - let slot = if self.test.downgrade { - 1 - slot - } else { - slot - }; - ImageVersion::new_synthetic(self.number as u8, slot as u8, 0) - } - - fn my_deps(&self, _offset: usize, slot: usize) -> Vec { - // For now, don't put any dependencies in slot zero. They could be - // added here if we someday implement checking these. - if slot == 0 { - vec![] - } else { - match self.test.depends[self.number] { - DepType::Nothing => vec![], - DepType::NoUpgrade => panic!("Shouldn't get to this point"), - DepType::Correct => vec![ - ImageVersion::new_synthetic(self.other_id(), slot as u8, 0) - ], - DepType::OldCorrect => vec![ - ImageVersion::new_synthetic(self.other_id(), 0, 0) - ], - DepType::Newer => vec![ - ImageVersion::new_synthetic(self.other_id(), slot as u8, 1) - ], - } - } - } - - fn other_id(&self) -> u8 { - (1 - self.number) as u8 - } -} - -impl ImageVersion { - /// Generate an image version based on some key information. The image - /// number influences the major version number (by an arbitrary factor), - /// and the slot affects the major number on the build_number. The minor - /// number can also be given to force numbers to be different. - fn new_synthetic(image_id: u8, slot: u8, minor: u8) -> ImageVersion { - ImageVersion { - major: image_id * 20 + slot, - minor: minor, - revision: 1, - build_num: slot as u32, - } - } -} diff --git a/mcuboot/sim/src/ecdsa_pub_key-rs.txt b/mcuboot/sim/src/ecdsa_pub_key-rs.txt deleted file mode 100644 index b63f6b004..000000000 --- a/mcuboot/sim/src/ecdsa_pub_key-rs.txt +++ /dev/null @@ -1,14 +0,0 @@ -static ECDSA256_PUB_KEY: &'static [u8] = &[ - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, - 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04, 0x2a, 0xcb, 0x40, 0x3c, 0xe8, - 0xfe, 0xed, 0x5b, 0xa4, 0x49, 0x95, 0xa1, 0xa9, - 0x1d, 0xae, 0xe8, 0xdb, 0xbe, 0x19, 0x37, 0xcd, - 0x14, 0xfb, 0x2f, 0x24, 0x57, 0x37, 0xe5, 0x95, - 0x39, 0x88, 0xd9, 0x94, 0xb9, 0xd6, 0x5a, 0xeb, - 0xd7, 0xcd, 0xd5, 0x30, 0x8a, 0xd6, 0xfe, 0x48, - 0xb2, 0x4a, 0x6a, 0x81, 0x0e, 0xe5, 0xf0, 0x7d, - 0x8b, 0x68, 0x34, 0xcc, 0x3a, 0x6a, 0xfc, 0x53, - 0x8e, 0xfa, 0xc1, -]; diff --git a/mcuboot/sim/src/ed25519_pub_key-rs.txt b/mcuboot/sim/src/ed25519_pub_key-rs.txt deleted file mode 100644 index f624fe3bb..000000000 --- a/mcuboot/sim/src/ed25519_pub_key-rs.txt +++ /dev/null @@ -1,8 +0,0 @@ -static ED25519_PUB_KEY: &'static [u8] = &[ - 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, - 0x70, 0x03, 0x21, 0x00, 0xd4, 0xb3, 0x1b, 0xa4, - 0x9a, 0x3a, 0xdd, 0x3f, 0x82, 0x5d, 0x10, 0xca, - 0x7f, 0x31, 0xb5, 0x0b, 0x0d, 0xe8, 0x7f, 0x37, - 0xcc, 0xc4, 0x9f, 0x1a, 0x40, 0x3a, 0x5c, 0x13, - 0x20, 0xff, 0xb4, 0xe0, -]; diff --git a/mcuboot/sim/src/image.rs b/mcuboot/sim/src/image.rs deleted file mode 100644 index 420a14f68..000000000 --- a/mcuboot/sim/src/image.rs +++ /dev/null @@ -1,1602 +0,0 @@ -// Copyright (c) 2019 Linaro LTD -// Copyright (c) 2019-2020 JUUL Labs -// Copyright (c) 2019 Arm Limited -// -// SPDX-License-Identifier: Apache-2.0 - -use byteorder::{ - LittleEndian, WriteBytesExt, -}; -use log::{ - Level::Info, - error, - info, - log_enabled, - warn, -}; -use rand::{ - distributions::{IndependentSample, Range}, - Rng, SeedableRng, XorShiftRng, -}; -use std::{ - collections::HashSet, - io::{Cursor, Write}, - mem, - slice, -}; -use aes_ctr::{ - Aes128Ctr, - stream_cipher::{ - generic_array::GenericArray, - NewFixStreamCipher, - StreamCipherCore, - }, -}; - -use simflash::{Flash, SimFlash, SimMultiFlash}; -use mcuboot_sys::{c, AreaDesc, FlashId}; -use crate::{ - ALL_DEVICES, - DeviceName, -}; -use crate::caps::Caps; -use crate::depends::{ - BoringDep, - Depender, - DepTest, - DepType, - NO_DEPS, - PairDep, - UpgradeInfo, -}; -use crate::tlv::{ManifestGen, TlvGen, TlvFlags}; - -/// A builder for Images. This describes a single run of the simulator, -/// capturing the configuration of a particular set of devices, including -/// the flash simulator(s) and the information about the slots. -#[derive(Clone)] -pub struct ImagesBuilder { - flash: SimMultiFlash, - areadesc: AreaDesc, - slots: Vec<[SlotInfo; 2]>, -} - -/// Images represents the state of a simulation for a given set of images. -/// The flash holds the state of the simulated flash, whereas primaries -/// and upgrades hold the expected contents of these images. -pub struct Images { - flash: SimMultiFlash, - areadesc: AreaDesc, - images: Vec, - total_count: Option, -} - -/// When doing multi-image, there is an instance of this information for -/// each of the images. Single image there will be one of these. -struct OneImage { - slots: [SlotInfo; 2], - primaries: ImageData, - upgrades: ImageData, -} - -/// The Rust-side representation of an image. For unencrypted images, this -/// is just the unencrypted payload. For encrypted images, we store both -/// the encrypted and the plaintext. -struct ImageData { - plain: Vec, - cipher: Option>, -} - -impl ImagesBuilder { - /// Construct a new image builder for the given device. Returns - /// Some(builder) if is possible to test this configuration, or None if - /// not possible (for example, if there aren't enough image slots). - pub fn new(device: DeviceName, align: usize, erased_val: u8) -> Result { - let (flash, areadesc, unsupported_caps) = Self::make_device(device, align, erased_val); - - for cap in unsupported_caps { - if cap.present() { - return Err(format!("unsupported {:?}", cap)); - } - } - - let num_images = Caps::get_num_images(); - - let mut slots = Vec::with_capacity(num_images); - for image in 0..num_images { - // This mapping must match that defined in - // `boot/zephyr/include/sysflash/sysflash.h`. - let id0 = match image { - 0 => FlashId::Image0, - 1 => FlashId::Image2, - _ => panic!("More than 2 images not supported"), - }; - let (primary_base, primary_len, primary_dev_id) = match areadesc.find(id0) { - Some(info) => info, - None => return Err("insufficient partitions".to_string()), - }; - let id1 = match image { - 0 => FlashId::Image1, - 1 => FlashId::Image3, - _ => panic!("More than 2 images not supported"), - }; - let (secondary_base, secondary_len, secondary_dev_id) = match areadesc.find(id1) { - Some(info) => info, - None => return Err("insufficient partitions".to_string()), - }; - - let offset_from_end = c::boot_magic_sz() + c::boot_max_align() * 4; - - // Construct a primary image. - let primary = SlotInfo { - base_off: primary_base as usize, - trailer_off: primary_base + primary_len - offset_from_end, - len: primary_len as usize, - dev_id: primary_dev_id, - index: 0, - }; - - // And an upgrade image. - let secondary = SlotInfo { - base_off: secondary_base as usize, - trailer_off: secondary_base + secondary_len - offset_from_end, - len: secondary_len as usize, - dev_id: secondary_dev_id, - index: 1, - }; - - slots.push([primary, secondary]); - } - - Ok(ImagesBuilder { - flash: flash, - areadesc: areadesc, - slots: slots, - }) - } - - pub fn each_device(f: F) - where F: Fn(Self) - { - for &dev in ALL_DEVICES { - for &align in test_alignments() { - for &erased_val in &[0, 0xff] { - match Self::new(dev, align, erased_val) { - Ok(run) => f(run), - Err(msg) => warn!("Skipping {}: {}", dev, msg), - } - } - } - } - } - - /// Construct an `Images` that doesn't expect an upgrade to happen. - pub fn make_no_upgrade_image(self, deps: &DepTest) -> Images { - let num_images = self.num_images(); - let mut flash = self.flash; - let images = self.slots.into_iter().enumerate().map(|(image_num, slots)| { - let dep: Box = if num_images > 1 { - Box::new(PairDep::new(num_images, image_num, deps)) - } else { - Box::new(BoringDep::new(image_num, deps)) - }; - let primaries = install_image(&mut flash, &slots[0], 42784, &*dep, false); - let upgrades = match deps.depends[image_num] { - DepType::NoUpgrade => install_no_image(), - _ => install_image(&mut flash, &slots[1], 46928, &*dep, false) - }; - OneImage { - slots: slots, - primaries: primaries, - upgrades: upgrades, - }}).collect(); - install_ptable(&mut flash, &self.areadesc); - Images { - flash: flash, - areadesc: self.areadesc, - images: images, - total_count: None, - } - } - - pub fn make_image(self, deps: &DepTest, permanent: bool) -> Images { - let mut images = self.make_no_upgrade_image(deps); - for image in &images.images { - mark_upgrade(&mut images.flash, &image.slots[1]); - } - - // upgrades without fails, counts number of flash operations - let total_count = match images.run_basic_upgrade(permanent) { - Ok(v) => v, - Err(_) => - if deps.upgrades.iter().any(|u| *u == UpgradeInfo::Held) { - 0 - } else { - panic!("Unable to perform basic upgrade"); - } - }; - - images.total_count = Some(total_count); - images - } - - pub fn make_bad_secondary_slot_image(self) -> Images { - let mut bad_flash = self.flash; - let images = self.slots.into_iter().enumerate().map(|(image_num, slots)| { - let dep = BoringDep::new(image_num, &NO_DEPS); - let primaries = install_image(&mut bad_flash, &slots[0], 32784, &dep, false); - let upgrades = install_image(&mut bad_flash, &slots[1], 41928, &dep, true); - OneImage { - slots: slots, - primaries: primaries, - upgrades: upgrades, - }}).collect(); - Images { - flash: bad_flash, - areadesc: self.areadesc, - images: images, - total_count: None, - } - } - - /// Build the Flash and area descriptor for a given device. - pub fn make_device(device: DeviceName, align: usize, erased_val: u8) -> (SimMultiFlash, AreaDesc, &'static [Caps]) { - match device { - DeviceName::Stm32f4 => { - // STM style flash. Large sectors, with a large scratch area. - let dev = SimFlash::new(vec![16 * 1024, 16 * 1024, 16 * 1024, 16 * 1024, - 64 * 1024, - 128 * 1024, 128 * 1024, 128 * 1024], - align as usize, erased_val); - let dev_id = 0; - let mut areadesc = AreaDesc::new(); - areadesc.add_flash_sectors(dev_id, &dev); - areadesc.add_image(0x020000, 0x020000, FlashId::Image0, dev_id); - areadesc.add_image(0x040000, 0x020000, FlashId::Image1, dev_id); - areadesc.add_image(0x060000, 0x020000, FlashId::ImageScratch, dev_id); - - let mut flash = SimMultiFlash::new(); - flash.insert(dev_id, dev); - (flash, areadesc, &[Caps::SwapUsingMove]) - } - DeviceName::K64f => { - // NXP style flash. Small sectors, one small sector for scratch. - let dev = SimFlash::new(vec![4096; 128], align as usize, erased_val); - - let dev_id = 0; - let mut areadesc = AreaDesc::new(); - areadesc.add_flash_sectors(dev_id, &dev); - areadesc.add_image(0x020000, 0x020000, FlashId::Image0, dev_id); - areadesc.add_image(0x040000, 0x020000, FlashId::Image1, dev_id); - areadesc.add_image(0x060000, 0x001000, FlashId::ImageScratch, dev_id); - - let mut flash = SimMultiFlash::new(); - flash.insert(dev_id, dev); - (flash, areadesc, &[]) - } - DeviceName::K64fBig => { - // Simulating an STM style flash on top of an NXP style flash. Underlying flash device - // uses small sectors, but we tell the bootloader they are large. - let dev = SimFlash::new(vec![4096; 128], align as usize, erased_val); - - let dev_id = 0; - let mut areadesc = AreaDesc::new(); - areadesc.add_flash_sectors(dev_id, &dev); - areadesc.add_simple_image(0x020000, 0x020000, FlashId::Image0, dev_id); - areadesc.add_simple_image(0x040000, 0x020000, FlashId::Image1, dev_id); - areadesc.add_simple_image(0x060000, 0x020000, FlashId::ImageScratch, dev_id); - - let mut flash = SimMultiFlash::new(); - flash.insert(dev_id, dev); - (flash, areadesc, &[Caps::SwapUsingMove]) - } - DeviceName::Nrf52840 => { - // Simulating the flash on the nrf52840 with partitions set up so that the scratch size - // does not divide into the image size. - let dev = SimFlash::new(vec![4096; 128], align as usize, erased_val); - - let dev_id = 0; - let mut areadesc = AreaDesc::new(); - areadesc.add_flash_sectors(dev_id, &dev); - areadesc.add_image(0x008000, 0x034000, FlashId::Image0, dev_id); - areadesc.add_image(0x03c000, 0x034000, FlashId::Image1, dev_id); - areadesc.add_image(0x070000, 0x00d000, FlashId::ImageScratch, dev_id); - - let mut flash = SimMultiFlash::new(); - flash.insert(dev_id, dev); - (flash, areadesc, &[]) - } - DeviceName::Nrf52840SpiFlash => { - // Simulate nrf52840 with external SPI flash. The external SPI flash - // has a larger sector size so for now store scratch on that flash. - let dev0 = SimFlash::new(vec![4096; 128], align as usize, erased_val); - let dev1 = SimFlash::new(vec![8192; 64], align as usize, erased_val); - - let mut areadesc = AreaDesc::new(); - areadesc.add_flash_sectors(0, &dev0); - areadesc.add_flash_sectors(1, &dev1); - - areadesc.add_image(0x008000, 0x068000, FlashId::Image0, 0); - areadesc.add_image(0x000000, 0x068000, FlashId::Image1, 1); - areadesc.add_image(0x068000, 0x018000, FlashId::ImageScratch, 1); - - let mut flash = SimMultiFlash::new(); - flash.insert(0, dev0); - flash.insert(1, dev1); - (flash, areadesc, &[Caps::SwapUsingMove]) - } - DeviceName::K64fMulti => { - // NXP style flash, but larger, to support multiple images. - let dev = SimFlash::new(vec![4096; 256], align as usize, erased_val); - - let dev_id = 0; - let mut areadesc = AreaDesc::new(); - areadesc.add_flash_sectors(dev_id, &dev); - areadesc.add_image(0x020000, 0x020000, FlashId::Image0, dev_id); - areadesc.add_image(0x040000, 0x020000, FlashId::Image1, dev_id); - areadesc.add_image(0x060000, 0x001000, FlashId::ImageScratch, dev_id); - areadesc.add_image(0x080000, 0x020000, FlashId::Image2, dev_id); - areadesc.add_image(0x0a0000, 0x020000, FlashId::Image3, dev_id); - - let mut flash = SimMultiFlash::new(); - flash.insert(dev_id, dev); - (flash, areadesc, &[]) - } - } - } - - pub fn num_images(&self) -> usize { - self.slots.len() - } -} - -impl Images { - /// A simple upgrade without forced failures. - /// - /// Returns the number of flash operations which can later be used to - /// inject failures at chosen steps. - pub fn run_basic_upgrade(&self, permanent: bool) -> Result { - let (flash, total_count) = self.try_upgrade(None, permanent); - info!("Total flash operation count={}", total_count); - - if !self.verify_images(&flash, 0, 1) { - warn!("Image mismatch after first boot"); - Err(()) - } else { - Ok(total_count) - } - } - - /// Test a simple upgrade, with dependencies given, and verify that the - /// image does as is described in the test. - pub fn run_check_deps(&self, deps: &DepTest) -> bool { - let (flash, _) = self.try_upgrade(None, true); - - self.verify_dep_images(&flash, deps) - } - - fn is_swap_upgrade(&self) -> bool { - Caps::SwapUsingScratch.present() || Caps::SwapUsingMove.present() - } - - pub fn run_basic_revert(&self) -> bool { - if Caps::OverwriteUpgrade.present() { - return false; - } - - let mut fails = 0; - - // FIXME: this test would also pass if no swap is ever performed??? - if self.is_swap_upgrade() { - for count in 2 .. 5 { - info!("Try revert: {}", count); - let flash = self.try_revert(count); - if !self.verify_images(&flash, 0, 0) { - error!("Revert failure on count {}", count); - fails += 1; - } - } - } - - fails > 0 - } - - pub fn run_perm_with_fails(&self) -> bool { - let mut fails = 0; - let total_flash_ops = self.total_count.unwrap(); - - // Let's try an image halfway through. - for i in 1 .. total_flash_ops { - info!("Try interruption at {}", i); - let (flash, count) = self.try_upgrade(Some(i), true); - info!("Second boot, count={}", count); - if !self.verify_images(&flash, 0, 1) { - warn!("FAIL at step {} of {}", i, total_flash_ops); - fails += 1; - } - - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_SET, BOOT_FLAG_SET) { - warn!("Mismatched trailer for the primary slot"); - fails += 1; - } - - if !self.verify_trailers(&flash, 1, BOOT_MAGIC_UNSET, - BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) { - warn!("Mismatched trailer for the secondary slot"); - fails += 1; - } - - if self.is_swap_upgrade() { - if !self.verify_images(&flash, 1, 0) { - warn!("Secondary slot FAIL at step {} of {}", - i, total_flash_ops); - fails += 1; - } - } - } - - if fails > 0 { - error!("{} out of {} failed {:.2}%", fails, total_flash_ops, - fails as f32 * 100.0 / total_flash_ops as f32); - } - - fails > 0 - } - - pub fn run_perm_with_random_fails(&self, total_fails: usize) -> bool { - let mut fails = 0; - let total_flash_ops = self.total_count.unwrap(); - let (flash, total_counts) = self.try_random_fails(total_flash_ops, total_fails); - info!("Random interruptions at reset points={:?}", total_counts); - - let primary_slot_ok = self.verify_images(&flash, 0, 1); - let secondary_slot_ok = if self.is_swap_upgrade() { - // TODO: This result is ignored. - self.verify_images(&flash, 1, 0) - } else { - true - }; - if !primary_slot_ok || !secondary_slot_ok { - error!("Image mismatch after random interrupts: primary slot={} \ - secondary slot={}", - if primary_slot_ok { "ok" } else { "fail" }, - if secondary_slot_ok { "ok" } else { "fail" }); - fails += 1; - } - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_SET, BOOT_FLAG_SET) { - error!("Mismatched trailer for the primary slot"); - fails += 1; - } - if !self.verify_trailers(&flash, 1, BOOT_MAGIC_UNSET, - BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) { - error!("Mismatched trailer for the secondary slot"); - fails += 1; - } - - if fails > 0 { - error!("Error testing perm upgrade with {} fails", total_fails); - } - - fails > 0 - } - - pub fn run_revert_with_fails(&self) -> bool { - if Caps::OverwriteUpgrade.present() { - return false; - } - - let mut fails = 0; - - if self.is_swap_upgrade() { - for i in 1 .. self.total_count.unwrap() { - info!("Try interruption at {}", i); - if self.try_revert_with_fail_at(i) { - error!("Revert failed at interruption {}", i); - fails += 1; - } - } - } - - fails > 0 - } - - pub fn run_norevert(&self) -> bool { - if Caps::OverwriteUpgrade.present() { - return false; - } - - let mut flash = self.flash.clone(); - let mut fails = 0; - - info!("Try norevert"); - - // First do a normal upgrade... - let (result, _) = c::boot_go(&mut flash, &self.areadesc, None, false); - if result != 0 { - warn!("Failed first boot"); - fails += 1; - } - - //FIXME: copy_done is written by boot_go, is it ok if no copy - // was ever done? - - if !self.verify_images(&flash, 0, 1) { - warn!("Primary slot image verification FAIL"); - fails += 1; - } - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_UNSET, BOOT_FLAG_SET) { - warn!("Mismatched trailer for the primary slot"); - fails += 1; - } - if !self.verify_trailers(&flash, 1, BOOT_MAGIC_UNSET, - BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) { - warn!("Mismatched trailer for the secondary slot"); - fails += 1; - } - - // Marks image in the primary slot as permanent, - // no revert should happen... - self.mark_permanent_upgrades(&mut flash, 0); - - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_SET, BOOT_FLAG_SET) { - warn!("Mismatched trailer for the primary slot"); - fails += 1; - } - - let (result, _) = c::boot_go(&mut flash, &self.areadesc, None, false); - if result != 0 { - warn!("Failed second boot"); - fails += 1; - } - - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_SET, BOOT_FLAG_SET) { - warn!("Mismatched trailer for the primary slot"); - fails += 1; - } - if !self.verify_images(&flash, 0, 1) { - warn!("Failed image verification"); - fails += 1; - } - - if fails > 0 { - error!("Error running upgrade without revert"); - } - - fails > 0 - } - - // Test that an upgrade is rejected. Assumes that the image was build - // such that the upgrade is instead a downgrade. - pub fn run_nodowngrade(&self) -> bool { - if !Caps::DowngradePrevention.present() { - return false; - } - - let mut flash = self.flash.clone(); - let mut fails = 0; - - info!("Try no downgrade"); - - // First, do a normal upgrade. - let (result, _) = c::boot_go(&mut flash, &self.areadesc, None, false); - if result != 0 { - warn!("Failed first boot"); - fails += 1; - } - - if !self.verify_images(&flash, 0, 0) { - warn!("Failed verification after downgrade rejection"); - fails += 1; - } - - if fails > 0 { - error!("Error testing downgrade rejection"); - } - - fails > 0 - } - - // Tests a new image written to the primary slot that already has magic and - // image_ok set while there is no image on the secondary slot, so no revert - // should ever happen... - pub fn run_norevert_newimage(&self) -> bool { - let mut flash = self.flash.clone(); - let mut fails = 0; - - info!("Try non-revert on imgtool generated image"); - - self.mark_upgrades(&mut flash, 0); - - // This simulates writing an image created by imgtool to - // the primary slot - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) { - warn!("Mismatched trailer for the primary slot"); - fails += 1; - } - - // Run the bootloader... - let (result, _) = c::boot_go(&mut flash, &self.areadesc, None, false); - if result != 0 { - warn!("Failed first boot"); - fails += 1; - } - - // State should not have changed - if !self.verify_images(&flash, 0, 0) { - warn!("Failed image verification"); - fails += 1; - } - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) { - warn!("Mismatched trailer for the primary slot"); - fails += 1; - } - if !self.verify_trailers(&flash, 1, BOOT_MAGIC_UNSET, - BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) { - warn!("Mismatched trailer for the secondary slot"); - fails += 1; - } - - if fails > 0 { - error!("Expected a non revert with new image"); - } - - fails > 0 - } - - // Tests a new image written to the primary slot that already has magic and - // image_ok set while there is no image on the secondary slot, so no revert - // should ever happen... - pub fn run_signfail_upgrade(&self) -> bool { - let mut flash = self.flash.clone(); - let mut fails = 0; - - info!("Try upgrade image with bad signature"); - - self.mark_upgrades(&mut flash, 0); - self.mark_permanent_upgrades(&mut flash, 0); - self.mark_upgrades(&mut flash, 1); - - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_SET, BOOT_FLAG_UNSET) { - warn!("Mismatched trailer for the primary slot"); - fails += 1; - } - - // Run the bootloader... - let (result, _) = c::boot_go(&mut flash, &self.areadesc, None, false); - if result != 0 { - warn!("Failed first boot"); - fails += 1; - } - - // State should not have changed - if !self.verify_images(&flash, 0, 0) { - warn!("Failed image verification"); - fails += 1; - } - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_SET, BOOT_FLAG_UNSET) { - warn!("Mismatched trailer for the primary slot"); - fails += 1; - } - - if fails > 0 { - error!("Expected an upgrade failure when image has bad signature"); - } - - fails > 0 - } - - fn trailer_sz(&self, align: usize) -> usize { - c::boot_trailer_sz(align as u32) as usize - } - - fn status_sz(&self, align: usize) -> usize { - c::boot_status_sz(align as u32) as usize - } - - /// This test runs a simple upgrade with no fails in the images, but - /// allowing for fails in the status area. This should run to the end - /// and warn that write fails were detected... - pub fn run_with_status_fails_complete(&self) -> bool { - if !Caps::ValidatePrimarySlot.present() { - return false; - } - - let mut flash = self.flash.clone(); - let mut fails = 0; - - info!("Try swap with status fails"); - - self.mark_permanent_upgrades(&mut flash, 1); - self.mark_bad_status_with_rate(&mut flash, 0, 1.0); - - let (result, asserts) = c::boot_go(&mut flash, &self.areadesc, None, true); - if result != 0 { - warn!("Failed!"); - fails += 1; - } - - // Failed writes to the marked "bad" region don't assert anymore. - // Any detected assert() is happening in another part of the code. - if asserts != 0 { - warn!("At least one assert() was called"); - fails += 1; - } - - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_SET, BOOT_FLAG_SET) { - warn!("Mismatched trailer for the primary slot"); - fails += 1; - } - - if !self.verify_images(&flash, 0, 1) { - warn!("Failed image verification"); - fails += 1; - } - - info!("validate primary slot enabled; \ - re-run of boot_go should just work"); - let (result, _) = c::boot_go(&mut flash, &self.areadesc, None, false); - if result != 0 { - warn!("Failed!"); - fails += 1; - } - - if fails > 0 { - error!("Error running upgrade with status write fails"); - } - - fails > 0 - } - - /// This test runs a simple upgrade with no fails in the images, but - /// allowing for fails in the status area. This should run to the end - /// and warn that write fails were detected... - pub fn run_with_status_fails_with_reset(&self) -> bool { - if Caps::OverwriteUpgrade.present() { - false - } else if Caps::ValidatePrimarySlot.present() { - - let mut flash = self.flash.clone(); - let mut fails = 0; - let mut count = self.total_count.unwrap() / 2; - - //info!("count={}\n", count); - - info!("Try interrupted swap with status fails"); - - self.mark_permanent_upgrades(&mut flash, 1); - self.mark_bad_status_with_rate(&mut flash, 0, 0.5); - - // Should not fail, writing to bad regions does not assert - let (_, asserts) = c::boot_go(&mut flash, &self.areadesc, Some(&mut count), true); - if asserts != 0 { - warn!("At least one assert() was called"); - fails += 1; - } - - self.reset_bad_status(&mut flash, 0); - - info!("Resuming an interrupted swap operation"); - let (_, asserts) = c::boot_go(&mut flash, &self.areadesc, None, true); - - // This might throw no asserts, for large sector devices, where - // a single failure writing is indistinguishable from no failure, - // or throw a single assert for small sector devices that fail - // multiple times... - if asserts > 1 { - warn!("Expected single assert validating the primary slot, \ - more detected {}", asserts); - fails += 1; - } - - if fails > 0 { - error!("Error running upgrade with status write fails"); - } - - fails > 0 - } else { - let mut flash = self.flash.clone(); - let mut fails = 0; - - info!("Try interrupted swap with status fails"); - - self.mark_permanent_upgrades(&mut flash, 1); - self.mark_bad_status_with_rate(&mut flash, 0, 1.0); - - // This is expected to fail while writing to bad regions... - let (_, asserts) = c::boot_go(&mut flash, &self.areadesc, None, true); - if asserts == 0 { - warn!("No assert() detected"); - fails += 1; - } - - fails > 0 - } - } - - /// Adds a new flash area that fails statistically - fn mark_bad_status_with_rate(&self, flash: &mut SimMultiFlash, slot: usize, - rate: f32) { - if Caps::OverwriteUpgrade.present() { - return; - } - - // Set this for each image. - for image in &self.images { - let dev_id = &image.slots[slot].dev_id; - let dev = flash.get_mut(&dev_id).unwrap(); - let align = dev.align(); - let off = &image.slots[slot].base_off; - let len = &image.slots[slot].len; - let status_off = off + len - self.trailer_sz(align); - - // Mark the status area as a bad area - let _ = dev.add_bad_region(status_off, self.status_sz(align), rate); - } - } - - fn reset_bad_status(&self, flash: &mut SimMultiFlash, slot: usize) { - if !Caps::ValidatePrimarySlot.present() { - return; - } - - for image in &self.images { - let dev_id = &image.slots[slot].dev_id; - let dev = flash.get_mut(&dev_id).unwrap(); - dev.reset_bad_regions(); - - // Disabling write verification the only assert triggered by - // boot_go should be checking for integrity of status bytes. - dev.set_verify_writes(false); - } - } - - /// Test a boot, optionally stopping after 'n' flash options. Returns a count - /// of the number of flash operations done total. - fn try_upgrade(&self, stop: Option, permanent: bool) -> (SimMultiFlash, i32) { - // Clone the flash to have a new copy. - let mut flash = self.flash.clone(); - - if permanent { - self.mark_permanent_upgrades(&mut flash, 1); - } - - let mut counter = stop.unwrap_or(0); - - let (first_interrupted, count) = match c::boot_go(&mut flash, &self.areadesc, Some(&mut counter), false) { - (-0x13579, _) => (true, stop.unwrap()), - (0, _) => (false, -counter), - (x, _) => panic!("Unknown return: {}", x), - }; - - counter = 0; - if first_interrupted { - // fl.dump(); - match c::boot_go(&mut flash, &self.areadesc, Some(&mut counter), false) { - (-0x13579, _) => panic!("Shouldn't stop again"), - (0, _) => (), - (x, _) => panic!("Unknown return: {}", x), - } - } - - (flash, count - counter) - } - - fn try_revert(&self, count: usize) -> SimMultiFlash { - let mut flash = self.flash.clone(); - - // fl.write_file("image0.bin").unwrap(); - for i in 0 .. count { - info!("Running boot pass {}", i + 1); - assert_eq!(c::boot_go(&mut flash, &self.areadesc, None, false), (0, 0)); - } - flash - } - - fn try_revert_with_fail_at(&self, stop: i32) -> bool { - let mut flash = self.flash.clone(); - let mut fails = 0; - - let mut counter = stop; - let (x, _) = c::boot_go(&mut flash, &self.areadesc, Some(&mut counter), false); - if x != -0x13579 { - warn!("Should have stopped test at interruption point"); - fails += 1; - } - - // In a multi-image setup, copy done might be set if any number of - // images was already successfully swapped. - if !self.verify_trailers_loose(&flash, 0, None, None, BOOT_FLAG_UNSET) { - warn!("copy_done should be unset"); - fails += 1; - } - - let (x, _) = c::boot_go(&mut flash, &self.areadesc, None, false); - if x != 0 { - warn!("Should have finished test upgrade"); - fails += 1; - } - - if !self.verify_images(&flash, 0, 1) { - warn!("Image in the primary slot before revert is invalid at stop={}", - stop); - fails += 1; - } - if !self.verify_images(&flash, 1, 0) { - warn!("Image in the secondary slot before revert is invalid at stop={}", - stop); - fails += 1; - } - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_UNSET, BOOT_FLAG_SET) { - warn!("Mismatched trailer for the primary slot before revert"); - fails += 1; - } - if !self.verify_trailers(&flash, 1, BOOT_MAGIC_UNSET, - BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) { - warn!("Mismatched trailer for the secondary slot before revert"); - fails += 1; - } - - // Do Revert - let mut counter = stop; - let (x, _) = c::boot_go(&mut flash, &self.areadesc, Some(&mut counter), false); - if x != -0x13579 { - warn!("Should have stopped revert at interruption point"); - fails += 1; - } - - let (x, _) = c::boot_go(&mut flash, &self.areadesc, None, false); - if x != 0 { - warn!("Should have finished revert upgrade"); - fails += 1; - } - - if !self.verify_images(&flash, 0, 0) { - warn!("Image in the primary slot after revert is invalid at stop={}", - stop); - fails += 1; - } - if !self.verify_images(&flash, 1, 1) { - warn!("Image in the secondary slot after revert is invalid at stop={}", - stop); - fails += 1; - } - - if !self.verify_trailers(&flash, 0, BOOT_MAGIC_GOOD, - BOOT_FLAG_SET, BOOT_FLAG_SET) { - warn!("Mismatched trailer for the primary slot after revert"); - fails += 1; - } - if !self.verify_trailers(&flash, 1, BOOT_MAGIC_UNSET, - BOOT_FLAG_UNSET, BOOT_FLAG_UNSET) { - warn!("Mismatched trailer for the secondary slot after revert"); - fails += 1; - } - - let (x, _) = c::boot_go(&mut flash, &self.areadesc, None, false); - if x != 0 { - warn!("Should have finished 3rd boot"); - fails += 1; - } - - if !self.verify_images(&flash, 0, 0) { - warn!("Image in the primary slot is invalid on 1st boot after revert"); - fails += 1; - } - if !self.verify_images(&flash, 1, 1) { - warn!("Image in the secondary slot is invalid on 1st boot after revert"); - fails += 1; - } - - fails > 0 - } - - - fn try_random_fails(&self, total_ops: i32, count: usize) -> (SimMultiFlash, Vec) { - let mut flash = self.flash.clone(); - - self.mark_permanent_upgrades(&mut flash, 1); - - let mut rng = rand::thread_rng(); - let mut resets = vec![0i32; count]; - let mut remaining_ops = total_ops; - for i in 0 .. count { - let ops = Range::new(1, remaining_ops / 2); - let reset_counter = ops.ind_sample(&mut rng); - let mut counter = reset_counter; - match c::boot_go(&mut flash, &self.areadesc, Some(&mut counter), false) { - (0, _) | (-0x13579, _) => (), - (x, _) => panic!("Unknown return: {}", x), - } - remaining_ops -= reset_counter; - resets[i] = reset_counter; - } - - match c::boot_go(&mut flash, &self.areadesc, None, false) { - (-0x13579, _) => panic!("Should not be have been interrupted!"), - (0, _) => (), - (x, _) => panic!("Unknown return: {}", x), - } - - (flash, resets) - } - - /// Verify the image in the given flash device, the specified slot - /// against the expected image. - fn verify_images(&self, flash: &SimMultiFlash, slot: usize, against: usize) -> bool { - self.images.iter().all(|image| { - verify_image(flash, &image.slots[slot], - match against { - 0 => &image.primaries, - 1 => &image.upgrades, - _ => panic!("Invalid 'against'") - }) - }) - } - - /// Verify the images, according to the dependency test. - fn verify_dep_images(&self, flash: &SimMultiFlash, deps: &DepTest) -> bool { - for (image_num, (image, upgrade)) in self.images.iter().zip(deps.upgrades.iter()).enumerate() { - info!("Upgrade: slot:{}, {:?}", image_num, upgrade); - if !verify_image(flash, &image.slots[0], - match upgrade { - UpgradeInfo::Upgraded => &image.upgrades, - UpgradeInfo::Held => &image.primaries, - }) { - error!("Failed to upgrade properly: image: {}, upgrade: {:?}", image_num, upgrade); - return true; - } - } - - false - } - - /// Verify that at least one of the trailers of the images have the - /// specified values. - fn verify_trailers_loose(&self, flash: &SimMultiFlash, slot: usize, - magic: Option, image_ok: Option, - copy_done: Option) -> bool { - self.images.iter().any(|image| { - verify_trailer(flash, &image.slots[slot], - magic, image_ok, copy_done) - }) - } - - /// Verify that the trailers of the images have the specified - /// values. - fn verify_trailers(&self, flash: &SimMultiFlash, slot: usize, - magic: Option, image_ok: Option, - copy_done: Option) -> bool { - self.images.iter().all(|image| { - verify_trailer(flash, &image.slots[slot], - magic, image_ok, copy_done) - }) - } - - /// Mark each of the images for permanent upgrade. - fn mark_permanent_upgrades(&self, flash: &mut SimMultiFlash, slot: usize) { - for image in &self.images { - mark_permanent_upgrade(flash, &image.slots[slot]); - } - } - - /// Mark each of the images for permanent upgrade. - fn mark_upgrades(&self, flash: &mut SimMultiFlash, slot: usize) { - for image in &self.images { - mark_upgrade(flash, &image.slots[slot]); - } - } - - /// Dump out the flash image(s) to one or more files for debugging - /// purposes. The names will be written as either "{prefix}.mcubin" or - /// "{prefix}-001.mcubin" depending on how many images there are. - pub fn debug_dump(&self, prefix: &str) { - for (id, fdev) in &self.flash { - let name = if self.flash.len() == 1 { - format!("{}.mcubin", prefix) - } else { - format!("{}-{:>0}.mcubin", prefix, id) - }; - fdev.write_file(&name).unwrap(); - } - } -} - -/// Show the flash layout. -#[allow(dead_code)] -fn show_flash(flash: &dyn Flash) { - println!("---- Flash configuration ----"); - for sector in flash.sector_iter() { - println!(" {:3}: 0x{:08x}, 0x{:08x}", - sector.num, sector.base, sector.size); - } - println!(""); -} - -/// Install a "program" into the given image. This fakes the image header, or at least all of the -/// fields used by the given code. Returns a copy of the image that was written. -fn install_image(flash: &mut SimMultiFlash, slot: &SlotInfo, len: usize, - deps: &dyn Depender, bad_sig: bool) -> ImageData { - let offset = slot.base_off; - let slot_len = slot.len; - let dev_id = slot.dev_id; - - let mut tlv: Box = Box::new(make_tlv()); - - // Add the dependencies early to the tlv. - for dep in deps.my_deps(offset, slot.index) { - tlv.add_dependency(deps.other_id(), &dep); - } - - const HDR_SIZE: usize = 32; - - // Generate a boot header. Note that the size doesn't include the header. - let header = ImageHeader { - magic: tlv.get_magic(), - load_addr: 0, - hdr_size: HDR_SIZE as u16, - protect_tlv_size: tlv.protect_size(), - img_size: len as u32, - flags: tlv.get_flags(), - ver: deps.my_version(offset, slot.index), - _pad2: 0, - }; - - let mut b_header = [0; HDR_SIZE]; - b_header[..32].clone_from_slice(header.as_raw()); - assert_eq!(b_header.len(), HDR_SIZE); - - tlv.add_bytes(&b_header); - - // The core of the image itself is just pseudorandom data. - let mut b_img = vec![0; len]; - splat(&mut b_img, offset); - - // Add some information at the start of the payload to make it easier - // to see what it is. This will fail if the image itself is too small. - { - let mut wr = Cursor::new(&mut b_img); - writeln!(&mut wr, "offset: {:#x}, dev_id: {:#x}, slot_info: {:?}", - offset, dev_id, slot).unwrap(); - writeln!(&mut wr, "version: {:?}", deps.my_version(offset, slot.index)).unwrap(); - } - - // TLV signatures work over plain image - tlv.add_bytes(&b_img); - - // Generate encrypted images - let flag = TlvFlags::ENCRYPTED as u32; - let is_encrypted = (tlv.get_flags() & flag) == flag; - let mut b_encimg = vec![]; - if is_encrypted { - tlv.generate_enc_key(); - let enc_key = tlv.get_enc_key(); - let key = GenericArray::from_slice(enc_key.as_slice()); - let nonce = GenericArray::from_slice(&[0; 16]); - let mut cipher = Aes128Ctr::new(&key, &nonce); - b_encimg = b_img.clone(); - cipher.apply_keystream(&mut b_encimg); - } - - // Build the TLV itself. - if bad_sig { - tlv.corrupt_sig(); - } - let mut b_tlv = tlv.make_tlv(); - - let dev = flash.get_mut(&dev_id).unwrap(); - - let mut buf = vec![]; - buf.append(&mut b_header.to_vec()); - buf.append(&mut b_img); - buf.append(&mut b_tlv.clone()); - - // Pad the buffer to a multiple of the flash alignment. - let align = dev.align(); - while buf.len() % align != 0 { - buf.push(dev.erased_val()); - } - - let mut encbuf = vec![]; - if is_encrypted { - encbuf.append(&mut b_header.to_vec()); - encbuf.append(&mut b_encimg); - encbuf.append(&mut b_tlv); - - while encbuf.len() % align != 0 { - encbuf.push(dev.erased_val()); - } - } - - // Since images are always non-encrypted in the primary slot, we first write - // an encrypted image, re-read to use for verification, erase + flash - // un-encrypted. In the secondary slot the image is written un-encrypted, - // and if encryption is requested, it follows an erase + flash encrypted. - - if slot.index == 0 { - let enc_copy: Option>; - - if is_encrypted { - dev.write(offset, &encbuf).unwrap(); - - let mut enc = vec![0u8; encbuf.len()]; - dev.read(offset, &mut enc).unwrap(); - - enc_copy = Some(enc); - - dev.erase(offset, slot_len).unwrap(); - } else { - enc_copy = None; - } - - dev.write(offset, &buf).unwrap(); - - let mut copy = vec![0u8; buf.len()]; - dev.read(offset, &mut copy).unwrap(); - - ImageData { - plain: copy, - cipher: enc_copy, - } - } else { - - dev.write(offset, &buf).unwrap(); - - let mut copy = vec![0u8; buf.len()]; - dev.read(offset, &mut copy).unwrap(); - - let enc_copy: Option>; - - if is_encrypted { - dev.erase(offset, slot_len).unwrap(); - - dev.write(offset, &encbuf).unwrap(); - - let mut enc = vec![0u8; encbuf.len()]; - dev.read(offset, &mut enc).unwrap(); - - enc_copy = Some(enc); - } else { - enc_copy = None; - } - - ImageData { - plain: copy, - cipher: enc_copy, - } - } -} - -/// Install no image. This is used when no upgrade happens. -fn install_no_image() -> ImageData { - ImageData { - plain: vec![], - cipher: None, - } -} - -fn make_tlv() -> TlvGen { - if Caps::EcdsaP224.present() { - panic!("Ecdsa P224 not supported in Simulator"); - } - - if Caps::EncKw.present() { - if Caps::RSA2048.present() { - TlvGen::new_rsa_kw() - } else if Caps::EcdsaP256.present() { - TlvGen::new_ecdsa_kw() - } else { - TlvGen::new_enc_kw() - } - } else if Caps::EncRsa.present() { - if Caps::RSA2048.present() { - TlvGen::new_sig_enc_rsa() - } else { - TlvGen::new_enc_rsa() - } - } else if Caps::EncEc256.present() { - if Caps::EcdsaP256.present() { - TlvGen::new_ecdsa_ecies_p256() - } else { - TlvGen::new_ecies_p256() - } - } else if Caps::EncX25519.present() { - if Caps::Ed25519.present() { - TlvGen::new_ed25519_ecies_x25519() - } else { - TlvGen::new_ecies_x25519() - } - } else { - // The non-encrypted configuration. - if Caps::RSA2048.present() { - TlvGen::new_rsa_pss() - } else if Caps::RSA3072.present() { - TlvGen::new_rsa3072_pss() - } else if Caps::EcdsaP256.present() { - TlvGen::new_ecdsa() - } else if Caps::Ed25519.present() { - TlvGen::new_ed25519() - } else { - TlvGen::new_hash_only() - } - } -} - -impl ImageData { - /// Find the image contents for the given slot. This assumes that slot 0 - /// is unencrypted, and slot 1 is encrypted. - fn find(&self, slot: usize) -> &Vec { - let encrypted = Caps::EncRsa.present() || Caps::EncKw.present() || - Caps::EncEc256.present() || Caps::EncX25519.present(); - match (encrypted, slot) { - (false, _) => &self.plain, - (true, 0) => &self.plain, - (true, 1) => self.cipher.as_ref().expect("Invalid image"), - _ => panic!("Invalid slot requested"), - } - } -} - -/// Verify that given image is present in the flash at the given offset. -fn verify_image(flash: &SimMultiFlash, slot: &SlotInfo, images: &ImageData) -> bool { - let image = images.find(slot.index); - let buf = image.as_slice(); - let dev_id = slot.dev_id; - - let mut copy = vec![0u8; buf.len()]; - let offset = slot.base_off; - let dev = flash.get(&dev_id).unwrap(); - dev.read(offset, &mut copy).unwrap(); - - if buf != ©[..] { - for i in 0 .. buf.len() { - if buf[i] != copy[i] { - info!("First failure for slot{} at {:#x} ({:#x} within) {:#x}!={:#x}", - slot.index, offset + i, i, buf[i], copy[i]); - break; - } - } - false - } else { - true - } -} - -fn verify_trailer(flash: &SimMultiFlash, slot: &SlotInfo, - magic: Option, image_ok: Option, - copy_done: Option) -> bool { - if Caps::OverwriteUpgrade.present() { - return true; - } - - let offset = slot.trailer_off + c::boot_max_align(); - let dev_id = slot.dev_id; - let mut copy = vec![0u8; c::boot_magic_sz() + c::boot_max_align() * 3]; - let mut failed = false; - - let dev = flash.get(&dev_id).unwrap(); - let erased_val = dev.erased_val(); - dev.read(offset, &mut copy).unwrap(); - - failed |= match magic { - Some(v) => { - if v == 1 && ©[24..] != MAGIC { - warn!("\"magic\" mismatch at {:#x}", offset); - true - } else if v == 3 { - let expected = [erased_val; 16]; - if ©[24..] != expected { - warn!("\"magic\" mismatch at {:#x}", offset); - true - } else { - false - } - } else { - false - } - }, - None => false, - }; - - failed |= match image_ok { - Some(v) => { - if (v == 1 && copy[16] != v) || (v == 3 && copy[16] != erased_val) { - warn!("\"image_ok\" mismatch at {:#x} v={} val={:#x}", offset, v, copy[8]); - true - } else { - false - } - }, - None => false, - }; - - failed |= match copy_done { - Some(v) => { - if (v == 1 && copy[8] != v) || (v == 3 && copy[8] != erased_val) { - warn!("\"copy_done\" mismatch at {:#x} v={} val={:#x}", offset, v, copy[0]); - true - } else { - false - } - }, - None => false, - }; - - !failed -} - -/// Install a partition table. This is a simplified partition table that -/// we write at the beginning of flash so make it easier for external tools -/// to analyze these images. -fn install_ptable(flash: &mut SimMultiFlash, areadesc: &AreaDesc) { - let ids: HashSet = areadesc.iter_areas().map(|area| area.device_id).collect(); - for &id in &ids { - // If there are any partitions in this device that start at 0, and - // aren't marked as the BootLoader partition, avoid adding the - // partition table. This makes it harder to view the image, but - // avoids messing up images already written. - if areadesc.iter_areas().any(|area| { - area.device_id == id && - area.off == 0 && - area.flash_id != FlashId::BootLoader - }) { - if log_enabled!(Info) { - let special: Vec = areadesc.iter_areas() - .filter(|area| area.device_id == id && area.off == 0) - .map(|area| area.flash_id) - .collect(); - info!("Skipping partition table: {:?}", special); - } - break; - } - - let mut buf: Vec = vec![]; - write!(&mut buf, "mcuboot\0").unwrap(); - - // Iterate through all of the partitions in that device, and encode - // into the table. - let count = areadesc.iter_areas().filter(|area| area.device_id == id).count(); - buf.write_u32::(count as u32).unwrap(); - - for area in areadesc.iter_areas().filter(|area| area.device_id == id) { - buf.write_u32::(area.flash_id as u32).unwrap(); - buf.write_u32::(area.off).unwrap(); - buf.write_u32::(area.size).unwrap(); - buf.write_u32::(0).unwrap(); - } - - let dev = flash.get_mut(&id).unwrap(); - - // Pad to alignment. - while buf.len() % dev.align() != 0 { - buf.push(0); - } - - dev.write(0, &buf).unwrap(); - } -} - -/// The image header -#[repr(C)] -#[derive(Debug)] -pub struct ImageHeader { - magic: u32, - load_addr: u32, - hdr_size: u16, - protect_tlv_size: u16, - img_size: u32, - flags: u32, - ver: ImageVersion, - _pad2: u32, -} - -impl AsRaw for ImageHeader {} - -#[repr(C)] -#[derive(Clone, Debug)] -pub struct ImageVersion { - pub major: u8, - pub minor: u8, - pub revision: u16, - pub build_num: u32, -} - -#[derive(Clone, Debug)] -pub struct SlotInfo { - pub base_off: usize, - pub trailer_off: usize, - pub len: usize, - // Which slot within this device. - pub index: usize, - pub dev_id: u8, -} - -const MAGIC: &[u8] = &[0x77, 0xc2, 0x95, 0xf3, - 0x60, 0xd2, 0xef, 0x7f, - 0x35, 0x52, 0x50, 0x0f, - 0x2c, 0xb6, 0x79, 0x80]; - -// Replicates defines found in bootutil.h -const BOOT_MAGIC_GOOD: Option = Some(1); -const BOOT_MAGIC_UNSET: Option = Some(3); - -const BOOT_FLAG_SET: Option = Some(1); -const BOOT_FLAG_UNSET: Option = Some(3); - -/// Write out the magic so that the loader tries doing an upgrade. -pub fn mark_upgrade(flash: &mut SimMultiFlash, slot: &SlotInfo) { - let dev = flash.get_mut(&slot.dev_id).unwrap(); - let align = dev.align(); - let offset = slot.trailer_off + c::boot_max_align() * 4; - if offset % align != 0 || MAGIC.len() % align != 0 { - // The write size is larger than the magic value. Fill a buffer - // with the erased value, put the MAGIC in it, and write it in its - // entirety. - let mut buf = vec![dev.erased_val(); align]; - buf[(offset % align)..].copy_from_slice(MAGIC); - dev.write(offset - (offset % align), &buf).unwrap(); - } else { - dev.write(offset, MAGIC).unwrap(); - } -} - -/// Writes the image_ok flag which, guess what, tells the bootloader -/// the this image is ok (not a test, and no revert is to be performed). -fn mark_permanent_upgrade(flash: &mut SimMultiFlash, slot: &SlotInfo) { - // Overwrite mode always is permanent, and only the magic is used in - // the trailer. To avoid problems with large write sizes, don't try to - // set anything in this case. - if Caps::OverwriteUpgrade.present() { - return; - } - - let dev = flash.get_mut(&slot.dev_id).unwrap(); - let mut ok = [dev.erased_val(); 8]; - ok[0] = 1u8; - let off = slot.trailer_off + c::boot_max_align() * 3; - let align = dev.align(); - dev.write(off, &ok[..align]).unwrap(); -} - -// Drop some pseudo-random gibberish onto the data. -fn splat(data: &mut [u8], seed: usize) { - let seed_block = [0x135782ea, 0x92184728, data.len() as u32, seed as u32]; - let mut rng: XorShiftRng = SeedableRng::from_seed(seed_block); - rng.fill_bytes(data); -} - -/// Return a read-only view into the raw bytes of this object -trait AsRaw : Sized { - fn as_raw<'a>(&'a self) -> &'a [u8] { - unsafe { slice::from_raw_parts(self as *const _ as *const u8, - mem::size_of::()) } - } -} - -pub fn show_sizes() { - // This isn't panic safe. - for min in &[1, 2, 4, 8] { - let msize = c::boot_trailer_sz(*min); - println!("{:2}: {} (0x{:x})", min, msize, msize); - } -} - -#[cfg(not(feature = "large-write"))] -fn test_alignments() -> &'static [usize] { - &[1, 2, 4, 8] -} - -#[cfg(feature = "large-write")] -fn test_alignments() -> &'static [usize] { - &[1, 2, 4, 8, 128, 512] -} diff --git a/mcuboot/sim/src/lib.rs b/mcuboot/sim/src/lib.rs deleted file mode 100644 index ec8e5ed94..000000000 --- a/mcuboot/sim/src/lib.rs +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright (c) 2017-2019 Linaro LTD -// Copyright (c) 2017-2019 JUUL Labs -// Copyright (c) 2019 Arm Limited -// -// SPDX-License-Identifier: Apache-2.0 - -use docopt::Docopt; -use log::{warn, error}; -use std::{ - fmt, - process, -}; -use serde_derive::Deserialize; - -mod caps; -mod depends; -mod image; -mod tlv; -pub mod testlog; - -pub use crate::{ - depends::{ - DepTest, - DepType, - UpgradeInfo, - NO_DEPS, - REV_DEPS, - }, - image::{ - ImagesBuilder, - Images, - show_sizes, - }, -}; - -const USAGE: &'static str = " -Mcuboot simulator - -Usage: - bootsim sizes - bootsim run --device TYPE [--align SIZE] - bootsim runall - bootsim (--help | --version) - -Options: - -h, --help Show this message - --version Version - --device TYPE MCU to simulate - Valid values: stm32f4, k64f - --align SIZE Flash write alignment -"; - -#[derive(Debug, Deserialize)] -struct Args { - flag_help: bool, - flag_version: bool, - flag_device: Option, - flag_align: Option, - cmd_sizes: bool, - cmd_run: bool, - cmd_runall: bool, -} - -#[derive(Copy, Clone, Debug, Deserialize)] -pub enum DeviceName { Stm32f4, K64f, K64fBig, K64fMulti, Nrf52840, Nrf52840SpiFlash, } - -pub static ALL_DEVICES: &'static [DeviceName] = &[ - DeviceName::Stm32f4, - DeviceName::K64f, - DeviceName::K64fBig, - DeviceName::K64fMulti, - DeviceName::Nrf52840, - DeviceName::Nrf52840SpiFlash, -]; - -impl fmt::Display for DeviceName { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let name = match *self { - DeviceName::Stm32f4 => "stm32f4", - DeviceName::K64f => "k64f", - DeviceName::K64fBig => "k64fbig", - DeviceName::K64fMulti => "k64fmulti", - DeviceName::Nrf52840 => "nrf52840", - DeviceName::Nrf52840SpiFlash => "Nrf52840SpiFlash", - }; - f.write_str(name) - } -} - -#[derive(Debug)] -struct AlignArg(usize); - -struct AlignArgVisitor; - -impl<'de> serde::de::Visitor<'de> for AlignArgVisitor { - type Value = AlignArg; - - fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - formatter.write_str("1, 2, 4 or 8") - } - - fn visit_u32(self, n: u32) -> Result - where E: serde::de::Error - { - Ok(match n { - 1 | 2 | 4 | 8 => AlignArg(n as usize), - n => { - let err = format!("Could not deserialize '{}' as alignment", n); - return Err(E::custom(err)); - } - }) - } -} - -impl<'de> serde::de::Deserialize<'de> for AlignArg { - fn deserialize(d: D) -> Result - where D: serde::de::Deserializer<'de> - { - d.deserialize_u8(AlignArgVisitor) - } -} - -pub fn main() { - let args: Args = Docopt::new(USAGE) - .and_then(|d| d.deserialize()) - .unwrap_or_else(|e| e.exit()); - // println!("args: {:#?}", args); - - if args.cmd_sizes { - show_sizes(); - return; - } - - let mut status = RunStatus::new(); - if args.cmd_run { - - let align = args.flag_align.map(|x| x.0).unwrap_or(1); - - - let device = match args.flag_device { - None => panic!("Missing mandatory device argument"), - Some(dev) => dev, - }; - - status.run_single(device, align, 0xff); - } - - if args.cmd_runall { - for &dev in ALL_DEVICES { - for &align in &[1, 2, 4, 8] { - for &erased_val in &[0, 0xff] { - status.run_single(dev, align, erased_val); - } - } - } - } - - if status.failures > 0 { - error!("{} Tests ran with {} failures", status.failures + status.passes, status.failures); - process::exit(1); - } else { - error!("{} Tests ran successfully", status.passes); - process::exit(0); - } -} - -pub struct RunStatus { - failures: usize, - passes: usize, -} - -impl RunStatus { - pub fn new() -> RunStatus { - RunStatus { - failures: 0, - passes: 0, - } - } - - pub fn run_single(&mut self, device: DeviceName, align: usize, erased_val: u8) { - warn!("Running on device {} with alignment {}", device, align); - - let run = match ImagesBuilder::new(device, align, erased_val) { - Ok(builder) => builder, - Err(msg) => { - warn!("Skipping {}: {}", device, msg); - return; - } - }; - - let mut failed = false; - - // Creates a badly signed image in the secondary slot to check that - // it is not upgraded to - let bad_secondary_slot_image = run.clone().make_bad_secondary_slot_image(); - - failed |= bad_secondary_slot_image.run_signfail_upgrade(); - - let images = run.clone().make_no_upgrade_image(&NO_DEPS); - failed |= images.run_norevert_newimage(); - - let images = run.make_image(&NO_DEPS, true); - - failed |= images.run_basic_revert(); - failed |= images.run_revert_with_fails(); - failed |= images.run_perm_with_fails(); - failed |= images.run_perm_with_random_fails(5); - failed |= images.run_norevert(); - - failed |= images.run_with_status_fails_complete(); - failed |= images.run_with_status_fails_with_reset(); - - //show_flash(&flash); - - if failed { - self.failures += 1; - } else { - self.passes += 1; - } - } - - pub fn failures(&self) -> usize { - self.failures - } -} - diff --git a/mcuboot/sim/src/main.rs b/mcuboot/sim/src/main.rs deleted file mode 100644 index fd5c0162c..000000000 --- a/mcuboot/sim/src/main.rs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2017-2019 Linaro LTD -// Copyright (c) 2017-2019 JUUL Labs -// -// SPDX-License-Identifier: Apache-2.0 - -use env_logger; - -use bootsim; - -fn main() { - env_logger::init(); - - bootsim::main(); -} diff --git a/mcuboot/sim/src/rsa3072_pub_key-rs.txt b/mcuboot/sim/src/rsa3072_pub_key-rs.txt deleted file mode 100644 index 983009cfb..000000000 --- a/mcuboot/sim/src/rsa3072_pub_key-rs.txt +++ /dev/null @@ -1,53 +0,0 @@ -/* Autogenerated by imgtool.py, do not edit. */ -static RSA3072_PUB_KEY: &'static [u8] = &[ - 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, - 0x00, 0xb4, 0x2c, 0x0e, 0x98, 0x58, 0x10, 0xa4, - 0xa7, 0x58, 0x99, 0x7c, 0x01, 0xdd, 0x08, 0x2a, - 0x28, 0x34, 0x33, 0xf8, 0x96, 0x1a, 0x34, 0x20, - 0x5d, 0x45, 0xc8, 0x71, 0x26, 0x25, 0xe5, 0xd2, - 0x96, 0xea, 0x7b, 0xb1, 0x15, 0xaa, 0xa6, 0x8a, - 0x63, 0x22, 0x8b, 0x2d, 0x4e, 0x81, 0x73, 0xbf, - 0x6e, 0x15, 0x68, 0x8c, 0x1a, 0xf4, 0xef, 0x2a, - 0x8f, 0x8c, 0x22, 0x9e, 0x71, 0x57, 0x4b, 0xde, - 0x0f, 0x7e, 0x72, 0xd3, 0x7a, 0xb8, 0xa7, 0x1d, - 0x44, 0xad, 0x87, 0x00, 0x83, 0x5c, 0xfd, 0x73, - 0x05, 0x72, 0x46, 0x3f, 0x8b, 0xf9, 0x10, 0x00, - 0xd8, 0x6e, 0xcc, 0x85, 0xed, 0xf9, 0x49, 0xdb, - 0x78, 0x36, 0x80, 0x49, 0x38, 0x76, 0xdd, 0x5f, - 0x54, 0x04, 0xda, 0x8c, 0x34, 0xa7, 0x2b, 0x13, - 0x25, 0x6f, 0xd1, 0x15, 0x4f, 0xad, 0xc2, 0xe1, - 0xa5, 0xd2, 0x4e, 0x57, 0x0c, 0x7e, 0x9c, 0x9b, - 0xba, 0x4e, 0x68, 0xb2, 0xe0, 0x25, 0x02, 0xaa, - 0x00, 0xd3, 0xb4, 0xcc, 0x2f, 0x78, 0xe5, 0xbe, - 0x47, 0x67, 0x1f, 0xc8, 0x6e, 0x22, 0x6c, 0x5e, - 0x61, 0xb6, 0x9a, 0xcd, 0xe5, 0xa8, 0xba, 0x7a, - 0x80, 0x13, 0x1b, 0x17, 0x2e, 0x96, 0xed, 0xcf, - 0xb3, 0x9b, 0xe4, 0x1c, 0xe8, 0xad, 0xa7, 0xf6, - 0x3a, 0x51, 0x66, 0x5e, 0x99, 0x8e, 0x87, 0xee, - 0x60, 0x25, 0xf8, 0x8d, 0xbe, 0xce, 0xa4, 0xa8, - 0xca, 0x93, 0x6c, 0xd7, 0xbf, 0xd4, 0x73, 0x33, - 0x8d, 0x44, 0x85, 0xcc, 0x73, 0x30, 0x08, 0x9c, - 0x4d, 0xb2, 0xaa, 0x5a, 0x6c, 0x6f, 0x7b, 0xab, - 0xb7, 0xb3, 0x7c, 0xc3, 0xfb, 0xe7, 0xca, 0xc4, - 0xf8, 0x9a, 0x6f, 0xcb, 0xbb, 0x5b, 0x82, 0xe7, - 0x7a, 0xe8, 0x19, 0xfd, 0x2f, 0x11, 0x22, 0xfb, - 0x7f, 0x76, 0x8c, 0x6b, 0x94, 0xa4, 0x09, 0x4f, - 0xa5, 0x6a, 0x77, 0x51, 0xeb, 0xa7, 0x7e, 0xda, - 0x87, 0x06, 0xee, 0xdc, 0xbe, 0xd1, 0xea, 0x1a, - 0x40, 0x1d, 0x1b, 0xff, 0x1a, 0xb1, 0x51, 0x7c, - 0x12, 0xb0, 0xf3, 0xf6, 0x83, 0x01, 0x9c, 0xe7, - 0x0c, 0x99, 0xbf, 0xac, 0x68, 0x58, 0x72, 0xa4, - 0xb0, 0x59, 0x85, 0xee, 0x85, 0xac, 0x2a, 0x22, - 0xf4, 0xcf, 0x15, 0x08, 0x80, 0x1f, 0x0d, 0xd0, - 0x1e, 0xa0, 0xa0, 0x94, 0xc8, 0xf7, 0xfa, 0x65, - 0xdd, 0x52, 0xe8, 0x96, 0x37, 0x23, 0x30, 0x57, - 0x36, 0xe6, 0x9d, 0xf4, 0x0c, 0x4a, 0x05, 0x75, - 0x1f, 0xad, 0x01, 0xca, 0xb7, 0x6d, 0x8c, 0x43, - 0x74, 0x06, 0x0a, 0x81, 0xf3, 0x01, 0x62, 0xff, - 0xf7, 0xf5, 0x5f, 0xaf, 0xe7, 0x2b, 0x0e, 0xf8, - 0x81, 0xb5, 0x65, 0xdd, 0x01, 0xd9, 0x9f, 0x07, - 0x17, 0x8a, 0x18, 0xcf, 0x23, 0x6e, 0x88, 0x65, - 0x91, 0xb5, 0x7b, 0xd3, 0xb0, 0x2d, 0xaf, 0x93, - 0x66, 0x63, 0x74, 0xac, 0x5a, 0xe6, 0x73, 0xde, - 0x3b, 0x02, 0x03, 0x01, 0x00, 0x01, -]; diff --git a/mcuboot/sim/src/rsa_pub_key-rs.txt b/mcuboot/sim/src/rsa_pub_key-rs.txt deleted file mode 100644 index 288759dbd..000000000 --- a/mcuboot/sim/src/rsa_pub_key-rs.txt +++ /dev/null @@ -1,37 +0,0 @@ -/* Autogenerated by imgtool.py, do not edit. */ -static RSA_PUB_KEY: &'static [u8] = &[ - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xd1, 0x06, 0x08, 0x1a, 0x18, 0x44, 0x2c, - 0x18, 0xe8, 0xfb, 0xfd, 0xf7, 0x0d, 0xa3, 0x4f, - 0x1f, 0xbb, 0xee, 0x5e, 0xf9, 0xaa, 0xd2, 0x4b, - 0x18, 0xd3, 0x5a, 0xe9, 0x6d, 0x18, 0x80, 0x19, - 0xf9, 0xf0, 0x9c, 0x34, 0x1b, 0xcb, 0xf3, 0xbc, - 0x74, 0xdb, 0x42, 0xe7, 0x8c, 0x7f, 0x10, 0x53, - 0x7e, 0x43, 0x5e, 0x0d, 0x57, 0x2c, 0x44, 0xd1, - 0x67, 0x08, 0x0f, 0x0d, 0xbb, 0x5c, 0xee, 0xec, - 0xb3, 0x99, 0xdf, 0xe0, 0x4d, 0x84, 0x0b, 0xaa, - 0x77, 0x41, 0x60, 0xed, 0x15, 0x28, 0x49, 0xa7, - 0x01, 0xb4, 0x3c, 0x10, 0xe6, 0x69, 0x8c, 0x2f, - 0x5f, 0xac, 0x41, 0x4d, 0x9e, 0x5c, 0x14, 0xdf, - 0xf2, 0xf8, 0xcf, 0x3d, 0x1e, 0x6f, 0xe7, 0x5b, - 0xba, 0xb4, 0xa9, 0xc8, 0x88, 0x7e, 0x47, 0x3c, - 0x94, 0xc3, 0x77, 0x67, 0x54, 0x4b, 0xaa, 0x8d, - 0x38, 0x35, 0xca, 0x62, 0x61, 0x7e, 0xb7, 0xe1, - 0x15, 0xdb, 0x77, 0x73, 0xd4, 0xbe, 0x7b, 0x72, - 0x21, 0x89, 0x69, 0x24, 0xfb, 0xf8, 0x65, 0x6e, - 0x64, 0x3e, 0xc8, 0x0e, 0xd7, 0x85, 0xd5, 0x5c, - 0x4a, 0xe4, 0x53, 0x0d, 0x2f, 0xff, 0xb7, 0xfd, - 0xf3, 0x13, 0x39, 0x83, 0x3f, 0xa3, 0xae, 0xd2, - 0x0f, 0xa7, 0x6a, 0x9d, 0xf9, 0xfe, 0xb8, 0xce, - 0xfa, 0x2a, 0xbe, 0xaf, 0xb8, 0xe0, 0xfa, 0x82, - 0x37, 0x54, 0xf4, 0x3e, 0xe1, 0x2b, 0xd0, 0xd3, - 0x08, 0x58, 0x18, 0xf6, 0x5e, 0x4c, 0xc8, 0x88, - 0x81, 0x31, 0xad, 0x5f, 0xb0, 0x82, 0x17, 0xf2, - 0x8a, 0x69, 0x27, 0x23, 0xf3, 0xab, 0x87, 0x3e, - 0x93, 0x1a, 0x1d, 0xfe, 0xe8, 0xf8, 0x1a, 0x24, - 0x66, 0x59, 0xf8, 0x1c, 0xab, 0xdc, 0xce, 0x68, - 0x1b, 0x66, 0x64, 0x35, 0xec, 0xfa, 0x0d, 0x11, - 0x9d, 0xaf, 0x5c, 0x3a, 0xa7, 0xd1, 0x67, 0xc6, - 0x47, 0xef, 0xb1, 0x4b, 0x2c, 0x62, 0xe1, 0xd1, - 0xc9, 0x02, 0x03, 0x01, 0x00, 0x01, -]; diff --git a/mcuboot/sim/src/testlog.rs b/mcuboot/sim/src/testlog.rs deleted file mode 100644 index 16cd256ae..000000000 --- a/mcuboot/sim/src/testlog.rs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2017 Linaro LTD -// Copyright (c) 2019 JUUL Labs -// -// SPDX-License-Identifier: Apache-2.0 - -//! Logging support for the test framework. -//! -//! https://stackoverflow.com/questions/30177845/how-to-initialize-the-logger-for-integration-tests -//! -//! The test framework runs the tests, possibly simultaneously, and in various orders. This helper -//! function, which should be called at the beginning of each test, will setup logging for all of -//! the tests. - -use env_logger; -use std::sync::Once; - -static INIT: Once = Once::new(); - -/// Setup the logging system. Intended to be called at the beginning of each test. -pub fn setup() { - INIT.call_once(|| { - env_logger::init(); - }); -} diff --git a/mcuboot/sim/src/tlv.rs b/mcuboot/sim/src/tlv.rs deleted file mode 100644 index 23f8bb8c7..000000000 --- a/mcuboot/sim/src/tlv.rs +++ /dev/null @@ -1,616 +0,0 @@ -// Copyright (c) 2017-2020 Linaro LTD -// Copyright (c) 2017-2020 JUUL Labs -// -// SPDX-License-Identifier: Apache-2.0 - -//! TLV Support -//! -//! mcuboot images are followed immediately by a list of TLV items that contain integrity -//! information about the image. Their generation is made a little complicated because the size of -//! the TLV block is in the image header, which is included in the hash. Since some signatures can -//! vary in size, we just make them the largest size possible. -//! -//! Because of this header, we have to make two passes. The first pass will compute the size of -//! the TLV, and the second pass will build the data for the TLV. - -use byteorder::{ - LittleEndian, WriteBytesExt, -}; -use crate::image::ImageVersion; -use pem; -use base64; -use log::info; -use ring::{digest, rand, agreement, hkdf, hmac}; -use ring::rand::SecureRandom; -use ring::signature::{ - RsaKeyPair, - RSA_PSS_SHA256, - EcdsaKeyPair, - ECDSA_P256_SHA256_ASN1_SIGNING, - Ed25519KeyPair, -}; -use aes_ctr::{ - Aes128Ctr, - stream_cipher::{ - generic_array::GenericArray, - NewFixStreamCipher, - StreamCipherCore, - }, -}; -use mcuboot_sys::c; - -#[repr(u16)] -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -#[allow(dead_code)] // TODO: For now -pub enum TlvKinds { - KEYHASH = 0x01, - SHA256 = 0x10, - RSA2048 = 0x20, - ECDSA224 = 0x21, - ECDSA256 = 0x22, - RSA3072 = 0x23, - ED25519 = 0x24, - ENCRSA2048 = 0x30, - ENCKW128 = 0x31, - ENCEC256 = 0x32, - ENCX25519 = 0x33, - DEPENDENCY = 0x40, -} - -#[allow(dead_code, non_camel_case_types)] -pub enum TlvFlags { - PIC = 0x01, - NON_BOOTABLE = 0x02, - ENCRYPTED = 0x04, - RAM_LOAD = 0x20, -} - -/// A generator for manifests. The format of the manifest can be either a -/// traditional "TLV" or a SUIT-style manifest. -pub trait ManifestGen { - /// Retrieve the header magic value for this manifest type. - fn get_magic(&self) -> u32; - - /// Retrieve the flags value for this particular manifest type. - fn get_flags(&self) -> u32; - - /// Retrieve the number of bytes of this manifest that is "protected". - /// This field is stored in the outside image header instead of the - /// manifest header. - fn protect_size(&self) -> u16; - - /// Add a dependency on another image. - fn add_dependency(&mut self, id: u8, version: &ImageVersion); - - /// Add a sequence of bytes to the payload that the manifest is - /// protecting. - fn add_bytes(&mut self, bytes: &[u8]); - - /// Set an internal flag indicating that the next `make_tlv` should - /// corrupt the signature. - fn corrupt_sig(&mut self); - - /// Construct the manifest for this payload. - fn make_tlv(self: Box) -> Vec; - - /// Generate a new encryption random key - fn generate_enc_key(&mut self); - - /// Return the current encryption key - fn get_enc_key(&self) -> Vec; -} - -#[derive(Debug, Default)] -pub struct TlvGen { - flags: u32, - kinds: Vec, - payload: Vec, - dependencies: Vec, - enc_key: Vec, - /// Should this signature be corrupted. - gen_corrupted: bool, -} - -#[derive(Debug)] -struct Dependency { - id: u8, - version: ImageVersion, -} - -const AES_KEY_LEN: usize = 16; - -impl TlvGen { - /// Construct a new tlv generator that will only contain a hash of the data. - #[allow(dead_code)] - pub fn new_hash_only() -> TlvGen { - TlvGen { - kinds: vec![TlvKinds::SHA256], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_rsa_pss() -> TlvGen { - TlvGen { - kinds: vec![TlvKinds::SHA256, TlvKinds::RSA2048], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_rsa3072_pss() -> TlvGen { - TlvGen { - kinds: vec![TlvKinds::SHA256, TlvKinds::RSA3072], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_ecdsa() -> TlvGen { - TlvGen { - kinds: vec![TlvKinds::SHA256, TlvKinds::ECDSA256], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_ed25519() -> TlvGen { - TlvGen { - kinds: vec![TlvKinds::SHA256, TlvKinds::ED25519], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_enc_rsa() -> TlvGen { - TlvGen { - flags: TlvFlags::ENCRYPTED as u32, - kinds: vec![TlvKinds::SHA256, TlvKinds::ENCRSA2048], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_sig_enc_rsa() -> TlvGen { - TlvGen { - flags: TlvFlags::ENCRYPTED as u32, - kinds: vec![TlvKinds::SHA256, TlvKinds::RSA2048, TlvKinds::ENCRSA2048], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_enc_kw() -> TlvGen { - TlvGen { - flags: TlvFlags::ENCRYPTED as u32, - kinds: vec![TlvKinds::SHA256, TlvKinds::ENCKW128], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_rsa_kw() -> TlvGen { - TlvGen { - flags: TlvFlags::ENCRYPTED as u32, - kinds: vec![TlvKinds::SHA256, TlvKinds::RSA2048, TlvKinds::ENCKW128], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_ecdsa_kw() -> TlvGen { - TlvGen { - flags: TlvFlags::ENCRYPTED as u32, - kinds: vec![TlvKinds::SHA256, TlvKinds::ECDSA256, TlvKinds::ENCKW128], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_ecies_p256() -> TlvGen { - TlvGen { - flags: TlvFlags::ENCRYPTED as u32, - kinds: vec![TlvKinds::SHA256, TlvKinds::ENCEC256], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_ecdsa_ecies_p256() -> TlvGen { - TlvGen { - flags: TlvFlags::ENCRYPTED as u32, - kinds: vec![TlvKinds::SHA256, TlvKinds::ECDSA256, TlvKinds::ENCEC256], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_ecies_x25519() -> TlvGen { - TlvGen { - flags: TlvFlags::ENCRYPTED as u32, - kinds: vec![TlvKinds::SHA256, TlvKinds::ENCX25519], - ..Default::default() - } - } - - #[allow(dead_code)] - pub fn new_ed25519_ecies_x25519() -> TlvGen { - TlvGen { - flags: TlvFlags::ENCRYPTED as u32, - kinds: vec![TlvKinds::SHA256, TlvKinds::ED25519, TlvKinds::ENCX25519], - ..Default::default() - } - } -} - -impl ManifestGen for TlvGen { - fn get_magic(&self) -> u32 { - 0x96f3b83d - } - - /// Retrieve the header flags for this configuration. This can be called at any time. - fn get_flags(&self) -> u32 { - self.flags - } - - /// Add bytes to the covered hash. - fn add_bytes(&mut self, bytes: &[u8]) { - self.payload.extend_from_slice(bytes); - } - - fn protect_size(&self) -> u16 { - if self.dependencies.is_empty() { - 0 - } else { - // Include the header and space for each dependency. - 4 + (self.dependencies.len() as u16) * (4 + 4 + 8) - } - } - - fn add_dependency(&mut self, id: u8, version: &ImageVersion) { - self.dependencies.push(Dependency { - id: id, - version: version.clone(), - }); - } - - fn corrupt_sig(&mut self) { - self.gen_corrupted = true; - } - - /// Compute the TLV given the specified block of data. - fn make_tlv(self: Box) -> Vec { - let mut protected_tlv: Vec = vec![]; - - if self.protect_size() > 0 { - protected_tlv.push(0x08); - protected_tlv.push(0x69); - let size = self.protect_size(); - protected_tlv.write_u16::(size).unwrap(); - for dep in &self.dependencies { - protected_tlv.write_u16::(TlvKinds::DEPENDENCY as u16).unwrap(); - protected_tlv.write_u16::(12).unwrap(); - - // The dependency. - protected_tlv.push(dep.id); - for _ in 0 .. 3 { - protected_tlv.push(0); - } - protected_tlv.push(dep.version.major); - protected_tlv.push(dep.version.minor); - protected_tlv.write_u16::(dep.version.revision).unwrap(); - protected_tlv.write_u32::(dep.version.build_num).unwrap(); - } - - assert_eq!(size, protected_tlv.len() as u16, "protected TLV length incorrect"); - } - - // Ring does the signature itself, which means that it must be - // given a full, contiguous payload. Although this does help from - // a correct usage perspective, it is fairly stupid from an - // efficiency view. If this is shown to be a performance issue - // with the tests, the protected data could be appended to the - // payload, and then removed after the signature is done. For now, - // just make a signed payload. - let mut sig_payload = self.payload.clone(); - sig_payload.extend_from_slice(&protected_tlv); - - let mut result: Vec = vec![]; - - // add back signed payload - result.extend_from_slice(&protected_tlv); - - // add non-protected payload - let npro_pos = result.len(); - result.push(0x07); - result.push(0x69); - // Placeholder for the size. - result.write_u16::(0).unwrap(); - - if self.kinds.contains(&TlvKinds::SHA256) { - // If a signature is not requested, corrupt the hash we are - // generating. But, if there is a signature, output the - // correct hash. We want the hash test to pass so that the - // signature verification can be validated. - let mut corrupt_hash = self.gen_corrupted; - for k in &[TlvKinds::RSA2048, TlvKinds::RSA3072, - TlvKinds::ECDSA224, TlvKinds::ECDSA256, - TlvKinds::ED25519] - { - if self.kinds.contains(k) { - corrupt_hash = false; - break; - } - } - - if corrupt_hash { - sig_payload[0] ^= 1; - } - - let hash = digest::digest(&digest::SHA256, &sig_payload); - let hash = hash.as_ref(); - - assert!(hash.len() == 32); - result.write_u16::(TlvKinds::SHA256 as u16).unwrap(); - result.write_u16::(32).unwrap(); - result.extend_from_slice(hash); - - // Undo the corruption. - if corrupt_hash { - sig_payload[0] ^= 1; - } - - } - - if self.gen_corrupted { - // Corrupt what is signed by modifying the input to the - // signature code. - sig_payload[0] ^= 1; - } - - if self.kinds.contains(&TlvKinds::RSA2048) || - self.kinds.contains(&TlvKinds::RSA3072) { - - let is_rsa2048 = self.kinds.contains(&TlvKinds::RSA2048); - - // Output the hash of the public key. - let hash = if is_rsa2048 { - digest::digest(&digest::SHA256, RSA_PUB_KEY) - } else { - digest::digest(&digest::SHA256, RSA3072_PUB_KEY) - }; - let hash = hash.as_ref(); - - assert!(hash.len() == 32); - result.write_u16::(TlvKinds::KEYHASH as u16).unwrap(); - result.write_u16::(32).unwrap(); - result.extend_from_slice(hash); - - // For now assume PSS. - let key_bytes = if is_rsa2048 { - pem::parse(include_bytes!("../../root-rsa-2048.pem").as_ref()).unwrap() - } else { - pem::parse(include_bytes!("../../root-rsa-3072.pem").as_ref()).unwrap() - }; - assert_eq!(key_bytes.tag, "RSA PRIVATE KEY"); - let key_pair = RsaKeyPair::from_der(&key_bytes.contents).unwrap(); - let rng = rand::SystemRandom::new(); - let mut signature = vec![0; key_pair.public_modulus_len()]; - if is_rsa2048 { - assert_eq!(signature.len(), 256); - } else { - assert_eq!(signature.len(), 384); - } - key_pair.sign(&RSA_PSS_SHA256, &rng, &sig_payload, &mut signature).unwrap(); - - if is_rsa2048 { - result.write_u16::(TlvKinds::RSA2048 as u16).unwrap(); - } else { - result.write_u16::(TlvKinds::RSA3072 as u16).unwrap(); - } - result.write_u16::(signature.len() as u16).unwrap(); - result.extend_from_slice(&signature); - } - - if self.kinds.contains(&TlvKinds::ECDSA256) { - let keyhash = digest::digest(&digest::SHA256, ECDSA256_PUB_KEY); - let keyhash = keyhash.as_ref(); - - assert!(keyhash.len() == 32); - result.write_u16::(TlvKinds::KEYHASH as u16).unwrap(); - result.write_u16::(32).unwrap(); - result.extend_from_slice(keyhash); - - let key_bytes = pem::parse(include_bytes!("../../root-ec-p256-pkcs8.pem").as_ref()).unwrap(); - assert_eq!(key_bytes.tag, "PRIVATE KEY"); - - let key_pair = EcdsaKeyPair::from_pkcs8(&ECDSA_P256_SHA256_ASN1_SIGNING, - &key_bytes.contents).unwrap(); - let rng = rand::SystemRandom::new(); - let signature = key_pair.sign(&rng, &sig_payload).unwrap(); - - result.write_u16::(TlvKinds::ECDSA256 as u16).unwrap(); - - let signature = signature.as_ref().to_vec(); - - result.write_u16::(signature.len() as u16).unwrap(); - result.extend_from_slice(signature.as_ref()); - } - - if self.kinds.contains(&TlvKinds::ED25519) { - let keyhash = digest::digest(&digest::SHA256, ED25519_PUB_KEY); - let keyhash = keyhash.as_ref(); - - assert!(keyhash.len() == 32); - result.write_u16::(TlvKinds::KEYHASH as u16).unwrap(); - result.write_u16::(32).unwrap(); - result.extend_from_slice(keyhash); - - let hash = digest::digest(&digest::SHA256, &sig_payload); - let hash = hash.as_ref(); - assert!(hash.len() == 32); - - let key_bytes = pem::parse(include_bytes!("../../root-ed25519.pem").as_ref()).unwrap(); - assert_eq!(key_bytes.tag, "PRIVATE KEY"); - - let key_pair = Ed25519KeyPair::from_seed_and_public_key( - &key_bytes.contents[16..48], &ED25519_PUB_KEY[12..44]).unwrap(); - let signature = key_pair.sign(&hash); - - result.write_u16::(TlvKinds::ED25519 as u16).unwrap(); - - let signature = signature.as_ref().to_vec(); - result.write_u16::(signature.len() as u16).unwrap(); - result.extend_from_slice(signature.as_ref()); - } - - if self.kinds.contains(&TlvKinds::ENCRSA2048) { - let key_bytes = pem::parse(include_bytes!("../../enc-rsa2048-pub.pem") - .as_ref()).unwrap(); - assert_eq!(key_bytes.tag, "PUBLIC KEY"); - - let cipherkey = self.get_enc_key(); - let cipherkey = cipherkey.as_slice(); - let encbuf = match c::rsa_oaep_encrypt(&key_bytes.contents, cipherkey) { - Ok(v) => v, - Err(_) => panic!("Failed to encrypt secret key"), - }; - - assert!(encbuf.len() == 256); - result.write_u16::(TlvKinds::ENCRSA2048 as u16).unwrap(); - result.write_u16::(256).unwrap(); - result.extend_from_slice(&encbuf); - } - - if self.kinds.contains(&TlvKinds::ENCKW128) { - let key_bytes = base64::decode( - include_str!("../../enc-aes128kw.b64").trim()).unwrap(); - - let cipherkey = self.get_enc_key(); - let cipherkey = cipherkey.as_slice(); - let encbuf = match c::kw_encrypt(&key_bytes, cipherkey) { - Ok(v) => v, - Err(_) => panic!("Failed to encrypt secret key"), - }; - - assert!(encbuf.len() == 24); - result.write_u16::(TlvKinds::ENCKW128 as u16).unwrap(); - result.write_u16::(24).unwrap(); - result.extend_from_slice(&encbuf); - } - - if self.kinds.contains(&TlvKinds::ENCEC256) || self.kinds.contains(&TlvKinds::ENCX25519) { - let key_bytes = if self.kinds.contains(&TlvKinds::ENCEC256) { - pem::parse(include_bytes!("../../enc-ec256-pub.pem").as_ref()).unwrap() - } else { - pem::parse(include_bytes!("../../enc-x25519-pub.pem").as_ref()).unwrap() - }; - assert_eq!(key_bytes.tag, "PUBLIC KEY"); - - let rng = rand::SystemRandom::new(); - let alg = if self.kinds.contains(&TlvKinds::ENCEC256) { - &agreement::ECDH_P256 - } else { - &agreement::X25519 - }; - let pk = match agreement::EphemeralPrivateKey::generate(alg, &rng) { - Ok(v) => v, - Err(_) => panic!("Failed to generate ephemeral keypair"), - }; - - let pubk = match pk.compute_public_key() { - Ok(pubk) => pubk, - Err(_) => panic!("Failed computing ephemeral public key"), - }; - - let peer_pubk = if self.kinds.contains(&TlvKinds::ENCEC256) { - agreement::UnparsedPublicKey::new(&agreement::ECDH_P256, &key_bytes.contents[26..]) - } else { - agreement::UnparsedPublicKey::new(&agreement::X25519, &key_bytes.contents[12..]) - }; - - #[derive(Debug, PartialEq)] - struct OkmLen(T); - - impl hkdf::KeyType for OkmLen { - fn len(&self) -> usize { - self.0 - } - } - - let derived_key = match agreement::agree_ephemeral( - pk, &peer_pubk, ring::error::Unspecified, |shared| { - let salt = hkdf::Salt::new(hkdf::HKDF_SHA256, &[]); - let prk = salt.extract(&shared); - let okm = match prk.expand(&[b"MCUBoot_ECIES_v1"], OkmLen(48)) { - Ok(okm) => okm, - Err(_) => panic!("Failed building HKDF OKM"), - }; - let mut buf = [0u8; 48]; - match okm.fill(&mut buf) { - Ok(_) => Ok(buf), - Err(_) => panic!("Failed generating HKDF output"), - } - }, - ) { - Ok(v) => v, - Err(_) => panic!("Failed building HKDF"), - }; - - let key = GenericArray::from_slice(&derived_key[..16]); - let nonce = GenericArray::from_slice(&[0; 16]); - let mut cipher = Aes128Ctr::new(&key, &nonce); - let mut cipherkey = self.get_enc_key(); - cipher.apply_keystream(&mut cipherkey); - - let key = hmac::Key::new(hmac::HMAC_SHA256, &derived_key[16..]); - let tag = hmac::sign(&key, &cipherkey); - - let mut buf = vec![]; - buf.append(&mut pubk.as_ref().to_vec()); - buf.append(&mut tag.as_ref().to_vec()); - buf.append(&mut cipherkey); - - if self.kinds.contains(&TlvKinds::ENCEC256) { - assert!(buf.len() == 113); - result.write_u16::(TlvKinds::ENCEC256 as u16).unwrap(); - result.write_u16::(113).unwrap(); - } else { - assert!(buf.len() == 80); - result.write_u16::(TlvKinds::ENCX25519 as u16).unwrap(); - result.write_u16::(80).unwrap(); - } - result.extend_from_slice(&buf); - } - - // Patch the size back into the TLV header. - let size = (result.len() - npro_pos) as u16; - let mut size_buf = &mut result[npro_pos + 2 .. npro_pos + 4]; - size_buf.write_u16::(size).unwrap(); - - result - } - - fn generate_enc_key(&mut self) { - let rng = rand::SystemRandom::new(); - let mut buf = vec![0u8; AES_KEY_LEN]; - match rng.fill(&mut buf) { - Err(_) => panic!("Error generating encrypted key"), - Ok(_) => (), - } - info!("New encryption key: {:02x?}", buf); - self.enc_key = buf; - } - - fn get_enc_key(&self) -> Vec { - if self.enc_key.len() != AES_KEY_LEN { - panic!("No random key was generated"); - } - self.enc_key.clone() - } -} - -include!("rsa_pub_key-rs.txt"); -include!("rsa3072_pub_key-rs.txt"); -include!("ecdsa_pub_key-rs.txt"); -include!("ed25519_pub_key-rs.txt"); diff --git a/mcuboot/sim/tests/core.rs b/mcuboot/sim/tests/core.rs deleted file mode 100644 index 07a844938..000000000 --- a/mcuboot/sim/tests/core.rs +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright (c) 2017-2019 Linaro LTD -// Copyright (c) 2017-2019 JUUL Labs -// -// SPDX-License-Identifier: Apache-2.0 - -//! Core tests -//! -//! Run the existing testsuite as a Rust unit test. - -use bootsim::{ - DepTest, DepType, UpgradeInfo, - ImagesBuilder, - Images, - NO_DEPS, - REV_DEPS, - testlog, -}; -use std::{ - env, - sync::atomic::{AtomicUsize, Ordering}, -}; - -/// A single test, after setting up logging and such. Within the $body, -/// $arg will be bound to each device. -macro_rules! test_shell { - ($name:ident, $arg: ident, $body:expr) => { - #[test] - fn $name() { - testlog::setup(); - ImagesBuilder::each_device(|$arg| { - $body; - }); - } - } -} - -/// A typical test calls a particular constructor, and runs a given test on -/// that constructor. -macro_rules! sim_test { - ($name:ident, $maker:ident($($margs:expr),*), $test:ident($($targs:expr),*)) => { - test_shell!($name, r, { - let image = r.$maker($($margs),*); - dump_image(&image, stringify!($name)); - assert!(!image.$test($($targs),*)); - }); - }; -} - -sim_test!(bad_secondary_slot, make_bad_secondary_slot_image(), run_signfail_upgrade()); -sim_test!(norevert_newimage, make_no_upgrade_image(&NO_DEPS), run_norevert_newimage()); -sim_test!(basic_revert, make_image(&NO_DEPS, true), run_basic_revert()); -sim_test!(revert_with_fails, make_image(&NO_DEPS, false), run_revert_with_fails()); -sim_test!(perm_with_fails, make_image(&NO_DEPS, true), run_perm_with_fails()); -sim_test!(perm_with_random_fails, make_image(&NO_DEPS, true), run_perm_with_random_fails(5)); -sim_test!(norevert, make_image(&NO_DEPS, true), run_norevert()); -sim_test!(status_write_fails_complete, make_image(&NO_DEPS, true), run_with_status_fails_complete()); -sim_test!(status_write_fails_with_reset, make_image(&NO_DEPS, true), run_with_status_fails_with_reset()); -sim_test!(downgrade_prevention, make_image(&REV_DEPS, true), run_nodowngrade()); - -// Test various combinations of incorrect dependencies. -test_shell!(dependency_combos, r, { - // Only test setups with two images. - if r.num_images() != 2 { - return; - } - - for dep in TEST_DEPS { - let image = r.clone().make_image(&dep, true); - dump_image(&image, "dependency_combos"); - assert!(!image.run_check_deps(&dep)); - } -}); - -/// These are the variants of dependencies we will test. -pub static TEST_DEPS: &[DepTest] = &[ - // A sanity test, no dependencies should upgrade. - DepTest { - depends: [DepType::Nothing, DepType::Nothing], - upgrades: [UpgradeInfo::Upgraded, UpgradeInfo::Upgraded], - downgrade: false, - }, - - // If all of the dependencies are met, we should also upgrade. - DepTest { - depends: [DepType::Correct, DepType::Correct], - upgrades: [UpgradeInfo::Upgraded, UpgradeInfo::Upgraded], - downgrade: false, - }, - - // If none of the dependencies are met, the images should be held. - DepTest { - depends: [DepType::Newer, DepType::Newer], - upgrades: [UpgradeInfo::Held, UpgradeInfo::Held], - downgrade: false, - }, - - // If the first image is not met, we should hold back on the - // dependencies (it is not well defined what the correct behavior is - // here, it could also be correct to upgrade only the second image). - DepTest { - depends: [DepType::Newer, DepType::Correct], - upgrades: [UpgradeInfo::Held, UpgradeInfo::Held], - downgrade: false, - }, - - // Test the variant in the other direction. - DepTest { - depends: [DepType::Correct, DepType::Newer], - upgrades: [UpgradeInfo::Held, UpgradeInfo::Held], - downgrade: false, - }, - - // Test where only the first image is upgraded, and there are no - // dependencies. - DepTest { - depends: [DepType::Nothing, DepType::NoUpgrade], - upgrades: [UpgradeInfo::Upgraded, UpgradeInfo::Held], - downgrade: false, - }, - - // Test one image with a valid dependency on the first image. - DepTest { - depends: [DepType::OldCorrect, DepType::NoUpgrade], - upgrades: [UpgradeInfo::Upgraded, UpgradeInfo::Held], - downgrade: false, - }, - - // Test one image with an invalid dependency on the first image. - DepTest { - depends: [DepType::Newer, DepType::NoUpgrade], - upgrades: [UpgradeInfo::Held, UpgradeInfo::Held], - downgrade: false, - }, - - // Test where only the second image is upgraded, and there are no - // dependencies. - DepTest { - depends: [DepType::NoUpgrade, DepType::Nothing], - upgrades: [UpgradeInfo::Held, UpgradeInfo::Upgraded], - downgrade: false, - }, - - // Test one image with a valid dependency on the second image. - DepTest { - depends: [DepType::NoUpgrade, DepType::OldCorrect], - upgrades: [UpgradeInfo::Held, UpgradeInfo::Upgraded], - downgrade: false, - }, - - // Test one image with an invalid dependency on the second image. - DepTest { - depends: [DepType::NoUpgrade, DepType::Newer], - upgrades: [UpgradeInfo::Held, UpgradeInfo::Held], - downgrade: false, - }, -]; - -/// Counter for the image number. -static IMAGE_NUMBER: AtomicUsize = AtomicUsize::new(0); - -/// Dump an image if that makes sense. The name is the name of the test -/// being run. If the MCUBOT_DEBUG_DUMP environment variable contains, in -/// one of its comma separate strings a substring of this name, then this -/// image will be dumped. As a special case, we will dump everything if -/// this environment variable is set to all. -fn dump_image(image: &Images, name: &str) { - if let Ok(request) = env::var("MCUBOOT_DEBUG_DUMP") { - if request.split(',').any(|req| { - req == "all" || name.contains(req) - }) { - let count = IMAGE_NUMBER.fetch_add(1, Ordering::SeqCst); - let full_name = format!("{}-{:04}", name, count); - log::info!("Dump {:?}", full_name); - image.debug_dump(&full_name); - } - } -} diff --git a/mcuboot/testplan/mynewt/Makefile b/mcuboot/testplan/mynewt/Makefile deleted file mode 100644 index 86e7b9c7e..000000000 --- a/mcuboot/testplan/mynewt/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -BLINKY := k64f_blinky -BLINKY2 := k64f_blinky2 - -SLINKY := k64f_slinky -SLINKY2 := k64f_slinky2 - -BOOT_RSA := k64f_boot_rsa -BOOT_RSA_PSS := k64f_boot_rsa_pss -BOOT_EC := k64f_boot_ec -BOOT_EC256 := k64f_boot_ec256 -BOOT_RSA_EC := k64f_boot_rsa_ec -BOOT_RSA_VALIDATE0 := k64f_boot_rsa_validate0 -BOOT_RSA_NOSWAP := k64f_boot_rsa_noswap - -RSA_KEY_1 := key_rsa.pem -RSA_KEY_2 := key_rsa_2.pem - -BLINKY2_IMG := bin/targets/$(BLINKY2)/app/apps/blinky/blinky.img - -FLASH_ERASE := pyocd-flashtool -ce - -NEWTMGR_CONN := --conn k64f -NEWTMGR_IMG := newtmgr $(NEWTMGR_CONN) image - -all: build-apps build-mcuboot - -build-blinky: - @echo "* Building blinky for the primary slot... \c" - @newt build -q $(BLINKY) - @echo "ok" - -build-blinky2: - @echo "* Building blinky2 for the secondary slot... \c" - @newt build -q $(BLINKY2) - @echo "ok" - -build-slinky: - @echo "* Building slinky for the primary slot... \c" - @newt build -q $(SLINKY) - @echo "ok" - -build-slinky2: - @echo "* Building slinky2 for the secondary slot... \c" - @newt build -q $(SLINKY2) - @echo "ok" - -build-boot-rsa: - @echo "* Building mcuboot with RSA... \c" - @newt build -q $(BOOT_RSA) - @echo "ok" - -build-boot-rsa-pss: - @echo "* Building mcuboot with RSA/PSS... \c" - @newt build -q $(BOOT_RSA_PSS) - @echo "ok" - -build-boot-ec: - @echo "* Building mcuboot with EC... \c" - @newt build -q $(BOOT_EC) - @echo "ok" - -build-boot-ec256: - @echo "* Building mcuboot with EC256... \c" - @newt build -q $(BOOT_EC256) - @echo "ok" - -# FIXME: multi-key signing does not work yet... -build-boot-rsa-ec: - @echo "* Building mcuboot with RSA + EC... \c" - @newt build -q $(BOOT_RSA_EC) - @echo "ok" - -build-boot-rsa-validate0: - @echo "* Building mcuboot with primary slot validation... \c" - @newt build -q $(BOOT_RSA_VALIDATE0) - @echo "ok" - -build-boot-rsa-noswap: - @echo "* Building mcuboot with overwrite only upgrade... \c" - @newt build -q $(BOOT_RSA_NOSWAP) - @echo "ok" - -build-apps: build-blinky build-blinky2 build-slinky build-slinky2 - -build-mcuboot: build-boot-rsa build-boot-rsa-pss build-boot-ec \ - build-boot-ec256 build-boot-rsa-validate0 build-boot-rsa-noswap - -clean: - rm -rf bin/ - -.PHONY: all clean diff --git a/mcuboot/testplan/mynewt/apps/blinky/pkg.yml b/mcuboot/testplan/mynewt/apps/blinky/pkg.yml deleted file mode 100644 index f6f8b8b53..000000000 --- a/mcuboot/testplan/mynewt/apps/blinky/pkg.yml +++ /dev/null @@ -1,35 +0,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. -# - -pkg.name: apps/blinky -pkg.type: app -pkg.description: Basic example application which blinks an LED. -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - -pkg.deps: - - "@mcuboot/boot/bootutil" - - "@apache-mynewt-core/kernel/os" - - "@apache-mynewt-core/hw/hal" - - "@apache-mynewt-core/sys/console/full" - - "@apache-mynewt-core/mgmt/smp" - - "@apache-mynewt-core/mgmt/smp/transport/smp_shell" - - "@apache-mynewt-core/mgmt/imgmgr" - - "@apache-mynewt-core/sys/log/stub" diff --git a/mcuboot/testplan/mynewt/apps/blinky/src/main.c b/mcuboot/testplan/mynewt/apps/blinky/src/main.c deleted file mode 100755 index c02cb6deb..000000000 --- a/mcuboot/testplan/mynewt/apps/blinky/src/main.c +++ /dev/null @@ -1,78 +0,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. - */ - -#include -#include - -#include "sysinit/sysinit.h" -#include "os/os.h" -#include "bsp/bsp.h" -#include "hal/hal_gpio.h" -#ifdef ARCH_sim -#include "mcu/mcu_sim.h" -#endif - -#define BLINKY_PRIO (8) -#define BLINKY_STACK_SIZE OS_STACK_ALIGN(128) -static struct os_task task1; -static volatile int g_task1_loops; - -/* For LED toggling */ -int g_led_pin; - -static void -blinky_handler(void *arg) -{ - while (1) { - ++g_task1_loops; - - os_time_delay(OS_TICKS_PER_SEC / MYNEWT_VAL(BLINKY_TICKS_PER_SEC)); - - /* Toggle the LED */ - hal_gpio_toggle(g_led_pin); - } -} - -int -main(int argc, char **argv) -{ - os_stack_t *pstack; - -#ifdef ARCH_sim - mcu_sim_parse_args(argc, argv); -#endif - - sysinit(); - - g_led_pin = LED_BLINK_PIN; - hal_gpio_init_out(g_led_pin, 1); - - pstack = malloc(sizeof(os_stack_t) * BLINKY_STACK_SIZE); - assert(pstack); - - os_task_init(&task1, "blinky", blinky_handler, NULL, - BLINKY_PRIO, OS_WAIT_FOREVER, pstack, BLINKY_STACK_SIZE); - - while (1) { - os_eventq_run(os_eventq_dflt_get()); - } - - return 0; -} - diff --git a/mcuboot/testplan/mynewt/apps/blinky/syscfg.yml b/mcuboot/testplan/mynewt/apps/blinky/syscfg.yml deleted file mode 100644 index e99da2bf2..000000000 --- a/mcuboot/testplan/mynewt/apps/blinky/syscfg.yml +++ /dev/null @@ -1,8 +0,0 @@ -syscfg.defs: - BLINKY_TICKS_PER_SEC: - value: 1 - -syscfg.vals: - REBOOT_LOG_ENTRY_COUNT: 0 - REBOOT_LOG_CONSOLE: 0 - SHELL_TASK: 1 diff --git a/mcuboot/testplan/mynewt/apps/slinky/pkg.yml b/mcuboot/testplan/mynewt/apps/slinky/pkg.yml deleted file mode 100644 index 96f8eb780..000000000 --- a/mcuboot/testplan/mynewt/apps/slinky/pkg.yml +++ /dev/null @@ -1,39 +0,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. -# - -pkg.name: apps/slinky -pkg.type: app -pkg.description: "Example application which uses a variety of mynewt features." -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" -pkg.keywords: - -pkg.deps: - - "@mcuboot/boot/bootutil" - - "@apache-mynewt-core/test/flash_test" - - "@apache-mynewt-core/mgmt/imgmgr" - - "@apache-mynewt-core/mgmt/smp" - - "@apache-mynewt-core/mgmt/smp/transport/smp_shell" - - "@apache-mynewt-core/kernel/os" - - "@apache-mynewt-core/sys/shell" - - "@apache-mynewt-core/sys/config" - - "@apache-mynewt-core/sys/console/full" - - "@apache-mynewt-core/sys/id" - - "@apache-mynewt-core/sys/log/full" - - "@apache-mynewt-core/sys/stats/full" diff --git a/mcuboot/testplan/mynewt/apps/slinky/src/main.c b/mcuboot/testplan/mynewt/apps/slinky/src/main.c deleted file mode 100644 index 4da3eebc4..000000000 --- a/mcuboot/testplan/mynewt/apps/slinky/src/main.c +++ /dev/null @@ -1,296 +0,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. - */ - -#include "syscfg/syscfg.h" -#include "sysinit/sysinit.h" -#include "sysflash/sysflash.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "flash_map_backend/flash_map_backend.h" -#include -#if MYNEWT_VAL(SPLIT_LOADER) -#include "split/split.h" -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef ARCH_sim -#include -#endif - -/* Task 1 */ -#define TASK1_PRIO (8) -#define TASK1_STACK_SIZE OS_STACK_ALIGN(192) -#define MAX_CBMEM_BUF 600 -static struct os_task task1; -static volatile int g_task1_loops; - -/* Task 2 */ -#define TASK2_PRIO (9) -#define TASK2_STACK_SIZE OS_STACK_ALIGN(64) -static struct os_task task2; - -static struct log my_log; - -static volatile int g_task2_loops; - -/* Global test semaphore */ -static struct os_sem g_test_sem; - -/* For LED toggling */ -static int g_led_pin; - -STATS_SECT_START(gpio_stats) -STATS_SECT_ENTRY(toggles) -STATS_SECT_END - -static STATS_SECT_DECL(gpio_stats) g_stats_gpio_toggle; - -static STATS_NAME_START(gpio_stats) -STATS_NAME(gpio_stats, toggles) -STATS_NAME_END(gpio_stats) - -static char *test_conf_get(int argc, char **argv, char *val, int max_len); -static int test_conf_set(int argc, char **argv, char *val); -static int test_conf_commit(void); -static int test_conf_export(void (*export_func)(char *name, char *val), - enum conf_export_tgt tgt); - -static struct conf_handler test_conf_handler = { - .ch_name = "test", - .ch_get = test_conf_get, - .ch_set = test_conf_set, - .ch_commit = test_conf_commit, - .ch_export = test_conf_export -}; - -static uint8_t test8; -static uint8_t test8_shadow; -static char test_str[32]; -static uint32_t cbmem_buf[MAX_CBMEM_BUF]; -static struct cbmem cbmem; - -static char * -test_conf_get(int argc, char **argv, char *buf, int max_len) -{ - if (argc == 1) { - if (!strcmp(argv[0], "8")) { - return conf_str_from_value(CONF_INT8, &test8, buf, max_len); - } else if (!strcmp(argv[0], "str")) { - return test_str; - } - } - return NULL; -} - -static int -test_conf_set(int argc, char **argv, char *val) -{ - if (argc == 1) { - if (!strcmp(argv[0], "8")) { - return CONF_VALUE_SET(val, CONF_INT8, test8_shadow); - } else if (!strcmp(argv[0], "str")) { - return CONF_VALUE_SET(val, CONF_STRING, test_str); - } - } - return OS_ENOENT; -} - -static int -test_conf_commit(void) -{ - test8 = test8_shadow; - - return 0; -} - -static int -test_conf_export(void (*func)(char *name, char *val), enum conf_export_tgt tgt) -{ - char buf[4]; - - conf_str_from_value(CONF_INT8, &test8, buf, sizeof(buf)); - func("test/8", buf); - func("test/str", test_str); - return 0; -} - -static void -task1_handler(void *arg) -{ - struct os_task *t; - int prev_pin_state, curr_pin_state; - struct image_version ver; - - /* Set the led pin for the E407 devboard */ - g_led_pin = LED_BLINK_PIN; - hal_gpio_init_out(g_led_pin, 1); - - if (imgr_my_version(&ver) == 0) { - console_printf("\nSlinky %u.%u.%u.%u\n", - ver.iv_major, ver.iv_minor, ver.iv_revision, - (unsigned int)ver.iv_build_num); - } else { - console_printf("\nSlinky\n"); - } - - while (1) { - t = os_sched_get_current_task(); - assert(t->t_func == task1_handler); - - ++g_task1_loops; - - /* Wait one second */ - os_time_delay(OS_TICKS_PER_SEC / MYNEWT_VAL(BLINKY_TICKS_PER_SEC)); - - /* Toggle the LED */ - prev_pin_state = hal_gpio_read(g_led_pin); - curr_pin_state = hal_gpio_toggle(g_led_pin); - LOG_INFO(&my_log, LOG_MODULE_DEFAULT, "GPIO toggle from %u to %u", - prev_pin_state, curr_pin_state); - STATS_INC(g_stats_gpio_toggle, toggles); - - /* Release semaphore to task 2 */ - os_sem_release(&g_test_sem); - } -} - -static void -task2_handler(void *arg) -{ - struct os_task *t; - - while (1) { - /* just for debug; task 2 should be the running task */ - t = os_sched_get_current_task(); - assert(t->t_func == task2_handler); - - /* Increment # of times we went through task loop */ - ++g_task2_loops; - - /* Wait for semaphore from ISR */ - os_sem_pend(&g_test_sem, OS_TIMEOUT_NEVER); - } -} - -/** - * init_tasks - * - * Called by main.c after sysinit(). This function performs initializations - * that are required before tasks are running. - * - * @return int 0 success; error otherwise. - */ -static void -init_tasks(void) -{ - os_stack_t *pstack; - - /* Initialize global test semaphore */ - os_sem_init(&g_test_sem, 0); - - pstack = malloc(sizeof(os_stack_t)*TASK1_STACK_SIZE); - assert(pstack); - - os_task_init(&task1, "task1", task1_handler, NULL, - TASK1_PRIO, OS_WAIT_FOREVER, pstack, TASK1_STACK_SIZE); - - pstack = malloc(sizeof(os_stack_t)*TASK2_STACK_SIZE); - assert(pstack); - - os_task_init(&task2, "task2", task2_handler, NULL, - TASK2_PRIO, OS_WAIT_FOREVER, pstack, TASK2_STACK_SIZE); -} - -int read_random_data(void); - -/** - * main - * - * The main task for the project. This function initializes the packages, calls - * init_tasks to initialize additional tasks (and possibly other objects), - * then starts serving events from default event queue. - * - * @return int NOTE: this function should never return! - */ -int -main(int argc, char **argv) -{ - int rc; - -#ifdef ARCH_sim - mcu_sim_parse_args(argc, argv); -#endif - - sysinit(); - - rc = conf_register(&test_conf_handler); - assert(rc == 0); - - cbmem_init(&cbmem, cbmem_buf, MAX_CBMEM_BUF); - log_register("log", &my_log, &log_cbmem_handler, &cbmem, LOG_SYSLEVEL); - - stats_init(STATS_HDR(g_stats_gpio_toggle), - STATS_SIZE_INIT_PARMS(g_stats_gpio_toggle, STATS_SIZE_32), - STATS_NAME_INIT_PARMS(gpio_stats)); - - stats_register("gpio_toggle", STATS_HDR(g_stats_gpio_toggle)); - - conf_load(); - - reboot_start(hal_reset_cause()); - - (void) read_random_data(); - - init_tasks(); - - /* If this app is acting as the loader in a split image setup, jump into - * the second stage application instead of starting the OS. - */ -#if MYNEWT_VAL(SPLIT_LOADER) - { - void *entry; - rc = split_app_go(&entry, true); - if(rc == 0) { - hal_system_restart(entry); - } - } -#endif - - /* - * As the last thing, process events from default event queue. - */ - while (1) { - os_eventq_run(os_eventq_dflt_get()); - } -} diff --git a/mcuboot/testplan/mynewt/apps/slinky/src/random_data.c b/mcuboot/testplan/mynewt/apps/slinky/src/random_data.c deleted file mode 100644 index cc8c4c7e9..000000000 --- a/mcuboot/testplan/mynewt/apps/slinky/src/random_data.c +++ /dev/null @@ -1,21354 +0,0 @@ -#include -static const unsigned char random_bin[] = { - 0x12, 0x3d, 0x29, 0x6d, 0x1e, 0x9a, 0xbf, 0x19, 0xdb, 0x98, 0x7e, 0x80, - 0xb6, 0x2e, 0x25, 0x13, 0xb5, 0x5a, 0x0e, 0xdc, 0x5a, 0x3e, 0xf5, 0x9a, - 0xf1, 0x8a, 0x37, 0xbd, 0x82, 0x3e, 0x99, 0x5d, 0x23, 0x7e, 0x44, 0xd5, - 0x09, 0xdd, 0x2c, 0xfa, 0x51, 0xfb, 0xa4, 0x2e, 0x2b, 0x63, 0x19, 0xd4, - 0x00, 0x1b, 0x4e, 0x53, 0x24, 0xef, 0xdb, 0xa4, 0xd1, 0xe1, 0x0d, 0xa8, - 0xf6, 0x90, 0x03, 0x21, 0x1e, 0xda, 0x94, 0x1f, 0x67, 0xb6, 0xd8, 0x18, - 0x8a, 0x9c, 0xae, 0x4a, 0x9d, 0xd1, 0x09, 0xff, 0x8a, 0xb3, 0x83, 0xeb, - 0x8f, 0x25, 0x5b, 0x4e, 0xad, 0x8c, 0x4d, 0x79, 0x0e, 0x92, 0x67, 0x2a, - 0x4c, 0x71, 0xaf, 0xfb, 0x85, 0xc5, 0x18, 0x30, 0x74, 0x13, 0x13, 0xbf, - 0x09, 0x21, 0xc7, 0x27, 0xef, 0x50, 0x8c, 0x43, 0xc4, 0x41, 0x10, 0xb2, - 0xac, 0x09, 0x9f, 0x43, 0xa3, 0x58, 0xbd, 0xde, 0x85, 0x61, 0x58, 0x65, - 0x5e, 0x0d, 0x71, 0xfa, 0x39, 0xbd, 0x9a, 0x7d, 0xe6, 0x1f, 0x4c, 0x72, - 0x11, 0xb3, 0x1e, 0x81, 0xf8, 0x38, 0x7f, 0x05, 0x67, 0xb1, 0x57, 0x66, - 0x54, 0x5c, 0xcd, 0xc6, 0x69, 0x80, 0x0b, 0xd1, 0x2c, 0xa4, 0xd4, 0x8c, - 0x6d, 0xd7, 0x63, 0x6b, 0x66, 0xa2, 0xc3, 0x46, 0xca, 0x81, 0x3a, 0xaa, - 0xb0, 0x16, 0x40, 0x7e, 0xad, 0xe0, 0x62, 0x39, 0x35, 0x98, 0xed, 0x63, - 0x9b, 0x7a, 0x22, 0xfd, 0xb9, 0x1a, 0x05, 0x59, 0x49, 0xb5, 0x12, 0x20, - 0xbf, 0x9e, 0x3f, 0xe5, 0x50, 0x6e, 0x4d, 0x58, 0xb9, 0xfc, 0x46, 0xd5, - 0x6f, 0x86, 0xc3, 0x52, 0xd7, 0x70, 0x5f, 0xc1, 0x46, 0xf9, 0x88, 0x82, - 0x7d, 0x7b, 0xa1, 0xe9, 0x71, 0xe2, 0xff, 0x7a, 0x44, 0x88, 0x6d, 0x51, - 0x4b, 0x98, 0x37, 0x36, 0xf7, 0xcd, 0x55, 0x93, 0x40, 0x40, 0x91, 0xf0, - 0x6e, 0x9a, 0xb8, 0xa9, 0xa0, 0xa6, 0xaa, 0xd8, 0x0d, 0xc4, 0x84, 0x1e, - 0xbe, 0x70, 0x7a, 0xb8, 0xa6, 0x09, 0x38, 0x13, 0x0b, 0xb2, 0x56, 0x67, - 0xbe, 0x21, 0x61, 0x7d, 0xc6, 0x5d, 0xe5, 0xfe, 0xd8, 0x54, 0xe0, 0xc5, - 0x42, 0xed, 0x76, 0x7f, 0xd5, 0x42, 0x38, 0x8e, 0x83, 0x60, 0xc1, 0x4c, - 0xe6, 0x7e, 0xa4, 0x6e, 0x6b, 0x04, 0xd4, 0x38, 0xe0, 0x6f, 0xfe, 0xe0, - 0xd2, 0x79, 0xd6, 0xe9, 0x3c, 0xa9, 0xb6, 0x0d, 0x2a, 0xc3, 0x3f, 0x35, - 0xa6, 0x95, 0xb5, 0x62, 0xc4, 0xfb, 0x48, 0x89, 0x7c, 0x17, 0x65, 0xb9, - 0xa2, 0x4e, 0xe2, 0x09, 0xd2, 0xcd, 0xcf, 0x87, 0xb4, 0x7f, 0x17, 0x42, - 0xcc, 0x3a, 0x89, 0x38, 0x4e, 0x6d, 0xbf, 0x66, 0xec, 0xa1, 0x65, 0xea, - 0xd3, 0x1d, 0x19, 0x42, 0xb2, 0xc0, 0x81, 0x27, 0x10, 0xd9, 0x3f, 0x6c, - 0x42, 0x3e, 0xcd, 0x16, 0x8b, 0x35, 0x43, 0xea, 0x3b, 0x43, 0x95, 0x25, - 0x81, 0x80, 0x45, 0x25, 0xe1, 0x15, 0x36, 0xa7, 0x4e, 0x70, 0x02, 0x16, - 0xa8, 0x79, 0x88, 0xf3, 0x52, 0x06, 0x17, 0x9d, 0xa1, 0x4d, 0x4d, 0x67, - 0xdf, 0x2b, 0x25, 0xe3, 0xf2, 0xf0, 0x10, 0x21, 0x3c, 0x7a, 0xc6, 0xb1, - 0xa7, 0xa4, 0x9d, 0x58, 0x64, 0x4c, 0xed, 0xa3, 0x27, 0x91, 0xba, 0x6a, - 0xc3, 0x27, 0x47, 0xd7, 0x16, 0x72, 0x52, 0x83, 0xac, 0xd9, 0x85, 0x47, - 0x06, 0x5d, 0x76, 0xd9, 0x62, 0x89, 0x49, 0xca, 0x7e, 0x67, 0x6a, 0x99, - 0xa8, 0x2a, 0xf6, 0x57, 0xb1, 0x42, 0x13, 0x74, 0xc3, 0x13, 0xe3, 0x91, - 0x38, 0x0c, 0x07, 0xb3, 0xbf, 0xd4, 0x05, 0xb4, 0xd8, 0x90, 0x65, 0x4b, - 0x10, 0x08, 0xe6, 0xa1, 0x76, 0x09, 0x46, 0x4e, 0xe4, 0xda, 0xc2, 0xaa, - 0x7b, 0xab, 0xcf, 0x83, 0xe4, 0x19, 0x5e, 0x4b, 0xf5, 0x7a, 0x32, 0x6c, - 0x25, 0x8d, 0xd8, 0x58, 0x61, 0x02, 0x1a, 0x0b, 0x8d, 0xc8, 0x80, 0xd3, - 0x7b, 0xba, 0xb2, 0x5f, 0xd3, 0xe9, 0xc9, 0x4c, 0x15, 0xe5, 0x76, 0xfe, - 0x3a, 0x1f, 0x26, 0x2b, 0xe7, 0x49, 0x5f, 0xdc, 0x6b, 0xab, 0xd4, 0x3b, - 0x69, 0x84, 0x75, 0x75, 0x65, 0x3a, 0xcb, 0xd7, 0xea, 0x20, 0xda, 0xf8, - 0x4c, 0xd1, 0x78, 0x08, 0xdf, 0x67, 0x22, 0x0f, 0xb2, 0xa9, 0x32, 0x27, - 0xca, 0x17, 0x89, 0x7b, 0x16, 0x9f, 0x48, 0x4f, 0xc4, 0x59, 0x48, 0x8e, - 0xe5, 0x26, 0x3a, 0x19, 0x50, 0x44, 0xad, 0x69, 0xed, 0x58, 0x1a, 0xbb, - 0x72, 0x9c, 0x4c, 0x48, 0x7c, 0x1b, 0x42, 0x13, 0x03, 0x3f, 0xb6, 0xb5, - 0x37, 0xca, 0x97, 0xf1, 0x82, 0x68, 0xdd, 0xf8, 0x22, 0x63, 0xf0, 0x80, - 0xf2, 0x7b, 0xee, 0xb9, 0x5f, 0x6d, 0x15, 0xed, 0xa5, 0x26, 0xd1, 0x3f, - 0xb1, 0xfd, 0x9a, 0x7e, 0xe9, 0x5b, 0x46, 0x04, 0x63, 0xe5, 0xb5, 0x1b, - 0x25, 0x5b, 0x65, 0x17, 0x03, 0x55, 0x3a, 0x3f, 0x23, 0xde, 0x55, 0x56, - 0xcd, 0xcc, 0x92, 0xc1, 0x26, 0xbf, 0x7f, 0x6b, 0x2c, 0x9e, 0xed, 0x05, - 0xd7, 0x7f, 0x8d, 0x37, 0xe2, 0x55, 0x15, 0x72, 0x8a, 0xa7, 0x30, 0x84, - 0x7d, 0x9c, 0x36, 0x95, 0x2d, 0x6a, 0x0f, 0xfe, 0x6b, 0x85, 0x0c, 0x6e, - 0xdc, 0x2b, 0x78, 0x75, 0xd8, 0x65, 0xe4, 0xae, 0x8b, 0xca, 0x71, 0x92, - 0x63, 0xe3, 0xd4, 0x49, 0xa2, 0xa1, 0xde, 0x87, 0xfe, 0x6f, 0xb5, 0x26, - 0x80, 0xfd, 0xda, 0x02, 0xfc, 0xf1, 0xc0, 0x4d, 0xda, 0xf4, 0x58, 0x98, - 0x9f, 0x41, 0xcc, 0xc9, 0xcf, 0xbb, 0x85, 0xe8, 0x83, 0x6e, 0x2a, 0xc0, - 0x01, 0xaf, 0x8c, 0x98, 0x26, 0xd8, 0x08, 0x62, 0x40, 0x0c, 0x8c, 0xfd, - 0x0a, 0xd5, 0x1e, 0xdc, 0xa9, 0x72, 0x07, 0xf9, 0x75, 0x9e, 0x22, 0xa2, - 0xfd, 0x8c, 0x61, 0xee, 0xb9, 0x9b, 0x6a, 0x95, 0x73, 0xaa, 0xe6, 0x97, - 0x68, 0x07, 0x91, 0xc4, 0x46, 0x05, 0x6d, 0x2a, 0x8b, 0x45, 0x71, 0x20, - 0x90, 0x3b, 0x31, 0x3c, 0xac, 0xc4, 0x51, 0x31, 0xb1, 0x95, 0x0e, 0x70, - 0x1a, 0x28, 0x31, 0x14, 0x13, 0x5c, 0xb7, 0x1f, 0x60, 0x0b, 0x21, 0xc8, - 0x62, 0x00, 0x42, 0x5a, 0xbe, 0x72, 0xe7, 0xb1, 0x4b, 0x05, 0xe0, 0xe8, - 0xcc, 0x0e, 0xdb, 0xbb, 0xc3, 0x6b, 0x9c, 0x98, 0xa2, 0x7c, 0x64, 0xdf, - 0xaa, 0x5f, 0xdd, 0x77, 0x15, 0xe6, 0x54, 0x1b, 0x64, 0xe6, 0xf0, 0x7b, - 0x22, 0xdd, 0x7b, 0x4d, 0x35, 0xb5, 0x08, 0x69, 0xe8, 0x3e, 0xaa, 0x0c, - 0xf3, 0x2e, 0x40, 0xa2, 0x3a, 0x61, 0x61, 0x45, 0xa4, 0x0f, 0xea, 0xca, - 0xa2, 0x42, 0x35, 0xac, 0x03, 0x55, 0x93, 0x0e, 0x4d, 0x04, 0x71, 0xf4, - 0xa5, 0xb8, 0xf7, 0xe1, 0xe3, 0x20, 0xbe, 0xb9, 0xbf, 0x4e, 0xab, 0x64, - 0xd6, 0x37, 0x2f, 0x8b, 0xec, 0xfb, 0x88, 0x57, 0xbb, 0x8e, 0xcf, 0xc9, - 0xc7, 0xe0, 0x3b, 0xbf, 0xe4, 0x05, 0x63, 0xc3, 0xe7, 0x41, 0xa6, 0x2e, - 0xab, 0x02, 0x75, 0xc3, 0x39, 0x02, 0x0a, 0xec, 0xac, 0xd3, 0x00, 0xb2, - 0xd0, 0xf2, 0x72, 0x76, 0xb1, 0xdb, 0x69, 0x2f, 0xb9, 0x22, 0x68, 0x60, - 0x85, 0x12, 0x0c, 0x44, 0x1c, 0x14, 0xbb, 0xc6, 0x0e, 0x71, 0xaa, 0x44, - 0xa4, 0xe4, 0x65, 0x92, 0x52, 0x1e, 0x17, 0x4e, 0xe1, 0xfe, 0x42, 0x15, - 0x6e, 0x77, 0x5c, 0x73, 0x30, 0x0b, 0xb3, 0x68, 0xee, 0x6b, 0x69, 0x86, - 0x44, 0x6e, 0xb4, 0x90, 0x80, 0xa5, 0x04, 0xce, 0xc2, 0x6b, 0x42, 0x55, - 0xf2, 0xc7, 0x4f, 0x19, 0x26, 0x32, 0xc2, 0x23, 0x3b, 0x2f, 0x4e, 0x10, - 0x0c, 0x8d, 0x23, 0x52, 0x35, 0xc5, 0x03, 0x38, 0x47, 0xf0, 0x57, 0x90, - 0x84, 0x40, 0x1e, 0x24, 0xa3, 0x5a, 0x6f, 0xc1, 0x10, 0x87, 0x5e, 0x93, - 0x3e, 0x30, 0xb1, 0x3d, 0x2e, 0x5e, 0xd1, 0xad, 0xd8, 0x71, 0xaf, 0xd1, - 0xd7, 0x17, 0x82, 0x54, 0x5a, 0xe8, 0xc4, 0x55, 0xee, 0xd9, 0xc6, 0x42, - 0x1e, 0xea, 0x76, 0xfd, 0x68, 0xcf, 0xb3, 0x7b, 0x60, 0x66, 0x12, 0xec, - 0x44, 0xab, 0x0c, 0x22, 0xd3, 0x94, 0x97, 0x06, 0x0d, 0xd1, 0xac, 0xd1, - 0x77, 0x10, 0x17, 0xfd, 0x04, 0x24, 0xc4, 0x19, 0x1c, 0x10, 0x2d, 0xfb, - 0x03, 0xa5, 0xe7, 0xf4, 0x3d, 0x4a, 0xff, 0xf5, 0x55, 0x30, 0xf7, 0x9b, - 0xf4, 0x38, 0x57, 0xc6, 0xa8, 0x70, 0x72, 0xc6, 0xe0, 0x79, 0x4c, 0xb5, - 0xc6, 0x3a, 0xdb, 0x8f, 0x4d, 0x2a, 0x70, 0x1d, 0xba, 0x05, 0x20, 0x76, - 0x40, 0xc3, 0xc0, 0xdc, 0xf9, 0x47, 0x9c, 0x66, 0x36, 0x13, 0xe4, 0xc5, - 0xf8, 0x80, 0x5e, 0xdf, 0x28, 0xbc, 0x00, 0x87, 0x77, 0x00, 0x75, 0x55, - 0x2f, 0x53, 0x4d, 0x4d, 0x65, 0xb5, 0xaa, 0x91, 0x23, 0x60, 0x89, 0xfe, - 0x8d, 0x2d, 0x54, 0x70, 0x45, 0x71, 0xab, 0x17, 0xc3, 0x2d, 0x97, 0x9c, - 0x3f, 0xe9, 0x81, 0xda, 0x27, 0x15, 0x2c, 0x7a, 0xc3, 0x9e, 0x9c, 0x2c, - 0x99, 0x1b, 0xee, 0x68, 0xdf, 0x5f, 0x59, 0x97, 0xc6, 0x89, 0x05, 0x8a, - 0x3c, 0x19, 0xe9, 0x2e, 0x3c, 0x32, 0x71, 0x1f, 0xf8, 0x08, 0xdb, 0xc9, - 0xad, 0xc0, 0xbe, 0xfa, 0x56, 0x95, 0x2b, 0x90, 0x3e, 0x97, 0x38, 0x8e, - 0xb8, 0xf9, 0xed, 0xcb, 0x41, 0x32, 0x28, 0x0c, 0x78, 0xca, 0x4b, 0x49, - 0xce, 0x1d, 0xc0, 0xbb, 0x60, 0x60, 0x24, 0x26, 0xb8, 0x47, 0x36, 0xe1, - 0x7e, 0xed, 0xac, 0x59, 0xb0, 0x02, 0x09, 0x0e, 0x56, 0xce, 0x7e, 0x6b, - 0x91, 0xbe, 0x3b, 0xe7, 0xd4, 0x8d, 0x65, 0x48, 0x87, 0x8f, 0x75, 0xa5, - 0x4a, 0xac, 0xcb, 0x52, 0x10, 0x83, 0xfa, 0xdd, 0x44, 0x18, 0xc9, 0x80, - 0x7f, 0xaa, 0xed, 0x8e, 0x77, 0x7c, 0x9a, 0x91, 0x4f, 0x77, 0xc4, 0xcb, - 0x23, 0x2b, 0x5f, 0x3f, 0x92, 0x93, 0x0a, 0xf0, 0x62, 0xc5, 0x11, 0x92, - 0x52, 0x8a, 0xda, 0x31, 0xee, 0x95, 0x01, 0x79, 0xf3, 0x79, 0x77, 0x1f, - 0x0a, 0xef, 0x5d, 0x6f, 0x0a, 0xce, 0x86, 0xa7, 0xb2, 0xd3, 0x57, 0x48, - 0xd4, 0x2f, 0x7f, 0x45, 0xf8, 0xea, 0xbc, 0x48, 0xb9, 0x9e, 0xce, 0x71, - 0xbf, 0xa8, 0x16, 0x73, 0x32, 0x9b, 0x42, 0x86, 0xfb, 0x8f, 0x6f, 0x9b, - 0xd7, 0x18, 0x22, 0x94, 0x0f, 0xcc, 0x91, 0x71, 0xd4, 0x90, 0x5c, 0xd0, - 0x79, 0x05, 0x7e, 0x53, 0xfd, 0x3d, 0x18, 0x5b, 0x34, 0xd7, 0xe2, 0xca, - 0xfc, 0xe6, 0xd6, 0x8d, 0x49, 0xa0, 0xca, 0x63, 0xfb, 0x31, 0x4d, 0xcb, - 0xe2, 0x01, 0x56, 0x0b, 0xdb, 0x8d, 0x4f, 0xa2, 0x19, 0x9d, 0xd2, 0xec, - 0x95, 0x53, 0x7b, 0x99, 0xf4, 0xfb, 0x27, 0xbe, 0xbd, 0x1e, 0xbb, 0x87, - 0x7d, 0x89, 0x3b, 0xf9, 0xef, 0xde, 0x5e, 0x85, 0xc8, 0x8d, 0xa0, 0x2c, - 0x9f, 0x3c, 0xea, 0x61, 0x91, 0xaa, 0x4e, 0x15, 0xdb, 0x81, 0x6e, 0x9f, - 0xd6, 0x47, 0x6a, 0x7c, 0x6c, 0xe2, 0x9e, 0x0e, 0xa7, 0xcd, 0x88, 0x21, - 0x6f, 0x73, 0x82, 0xfa, 0xf2, 0x4a, 0x39, 0xe4, 0x6c, 0x1e, 0x21, 0xf6, - 0x63, 0x13, 0x39, 0x7f, 0x18, 0x7a, 0x02, 0x94, 0x8d, 0x5d, 0x09, 0xbf, - 0x52, 0xdf, 0xe8, 0x09, 0x40, 0xac, 0x5e, 0x4c, 0xc9, 0xa3, 0x71, 0x4d, - 0x4c, 0xcb, 0x42, 0x23, 0x42, 0xe1, 0x52, 0x4a, 0x0f, 0xe8, 0x3e, 0xf2, - 0x4e, 0x54, 0xaa, 0x38, 0x89, 0xd5, 0x6b, 0x3e, 0xae, 0x89, 0x0c, 0x5e, - 0x16, 0x17, 0x5b, 0x6c, 0xdf, 0x0b, 0xc9, 0x6e, 0x84, 0x05, 0x6b, 0xe1, - 0xe8, 0x18, 0x0a, 0x7c, 0xc9, 0x42, 0xa1, 0xf1, 0xfd, 0x48, 0xee, 0x13, - 0x1e, 0x16, 0x5f, 0x62, 0xf8, 0x88, 0x00, 0x18, 0x3b, 0x6d, 0x13, 0x9a, - 0xcd, 0x43, 0x9f, 0xc5, 0xeb, 0x4c, 0x3d, 0xe2, 0xbb, 0xde, 0x48, 0x77, - 0x21, 0x65, 0x34, 0xc3, 0x08, 0xe6, 0x0f, 0x91, 0x4c, 0xc8, 0xf6, 0xac, - 0xfe, 0x51, 0xe4, 0xed, 0x9d, 0xa9, 0x1d, 0x6c, 0x75, 0x60, 0x56, 0xb0, - 0xf2, 0x7b, 0xa7, 0x92, 0xa9, 0x7c, 0x20, 0x02, 0x3e, 0x91, 0x1c, 0x10, - 0xd9, 0x04, 0xa9, 0x0e, 0x5c, 0x28, 0x9c, 0x39, 0x71, 0x4f, 0xa7, 0xf9, - 0x14, 0x12, 0x76, 0x33, 0x02, 0xcc, 0x20, 0xf0, 0x84, 0xed, 0xa4, 0xa5, - 0xf0, 0x4d, 0x44, 0xcd, 0xa7, 0x38, 0x59, 0x60, 0xfd, 0x83, 0xa1, 0x2c, - 0x0c, 0xec, 0x20, 0x28, 0x12, 0xc9, 0xa4, 0x87, 0x71, 0x2f, 0x9a, 0x70, - 0x22, 0xd7, 0xc7, 0x0a, 0x85, 0x79, 0xc2, 0x95, 0x16, 0x26, 0xc0, 0x6a, - 0xad, 0x31, 0x9a, 0x7c, 0x0e, 0x93, 0x5d, 0x9f, 0xef, 0xd4, 0xe0, 0x8b, - 0x5d, 0xfe, 0xff, 0xc9, 0x6c, 0x15, 0x64, 0x77, 0xc3, 0x2d, 0xf9, 0x0b, - 0x03, 0xca, 0x78, 0x37, 0xe5, 0x4d, 0x97, 0x9f, 0xfe, 0xae, 0xb0, 0x0f, - 0x87, 0x65, 0x20, 0xfc, 0x32, 0xd4, 0xe7, 0x9d, 0xdf, 0xa8, 0x71, 0xa7, - 0x88, 0x7a, 0xdb, 0x2f, 0x32, 0x97, 0xc5, 0x42, 0xb7, 0x1d, 0xd0, 0x9a, - 0xdc, 0x34, 0x64, 0x50, 0xa2, 0x17, 0x94, 0x98, 0xb1, 0xb6, 0x75, 0xb8, - 0xe0, 0x97, 0x2d, 0x89, 0x3e, 0x9c, 0x9e, 0x20, 0x22, 0xc4, 0xbb, 0xef, - 0xe4, 0xa9, 0xb3, 0x8f, 0x57, 0xa3, 0xf0, 0x06, 0xf2, 0xc2, 0x2d, 0x1a, - 0x20, 0x4f, 0x88, 0xfc, 0x3c, 0xc6, 0x7a, 0x93, 0xbb, 0x39, 0x81, 0x96, - 0x3f, 0xf2, 0xf9, 0x7d, 0xd3, 0x14, 0x8f, 0x0e, 0x0a, 0x00, 0xd7, 0xc9, - 0xa1, 0xc4, 0x01, 0x84, 0x5f, 0x3c, 0x79, 0xac, 0x1b, 0xdd, 0xfe, 0x99, - 0x79, 0xa0, 0x09, 0x95, 0x73, 0x4a, 0x42, 0x0a, 0x57, 0x71, 0x5e, 0x7a, - 0x0d, 0x9b, 0x53, 0x98, 0x7a, 0x13, 0x64, 0x40, 0xe6, 0x3a, 0x55, 0xab, - 0xe4, 0xf9, 0x75, 0x53, 0x6c, 0xf7, 0x62, 0xa1, 0xd7, 0x00, 0x14, 0x10, - 0xa9, 0xa7, 0xac, 0x48, 0x98, 0x75, 0xd5, 0x8a, 0xc9, 0x2d, 0x5b, 0x29, - 0x70, 0x70, 0xfa, 0xca, 0xc8, 0x35, 0x37, 0x03, 0x62, 0xe7, 0xe6, 0xba, - 0x76, 0xdd, 0xcc, 0xf6, 0x9f, 0x5f, 0xc6, 0x49, 0xed, 0x78, 0xf8, 0x87, - 0x47, 0x74, 0xe7, 0x91, 0x91, 0x2d, 0xdb, 0xf0, 0x9a, 0xbe, 0x0d, 0xb3, - 0x9c, 0xd9, 0xb3, 0xa0, 0xc3, 0xbc, 0x76, 0x43, 0xdd, 0xd3, 0xba, 0x73, - 0x98, 0x0f, 0xe7, 0x9a, 0x5f, 0x58, 0x8d, 0x79, 0xc3, 0x91, 0x2c, 0x0c, - 0x8b, 0x06, 0x06, 0xe2, 0x54, 0xf9, 0x51, 0xdb, 0x03, 0xac, 0x15, 0xb7, - 0x16, 0xb4, 0x88, 0x47, 0x69, 0x14, 0x11, 0xe1, 0xd3, 0x2a, 0x07, 0xa3, - 0x0c, 0x00, 0xb9, 0xb6, 0x2a, 0x77, 0xbe, 0x73, 0x36, 0x50, 0x4a, 0x8f, - 0x71, 0xb0, 0x1c, 0x1c, 0x4e, 0xbb, 0xe8, 0xdd, 0x96, 0xaf, 0xa1, 0x40, - 0xc6, 0x3d, 0xa2, 0x8d, 0xa5, 0x3b, 0xe9, 0x1a, 0x5c, 0xc0, 0x9a, 0x1f, - 0x01, 0x70, 0x5e, 0xdb, 0xd7, 0x4b, 0x75, 0x92, 0x2f, 0x7e, 0x19, 0x55, - 0xec, 0xa6, 0xe4, 0x61, 0x3b, 0x25, 0x75, 0x50, 0x59, 0xd4, 0x7e, 0xd9, - 0x5a, 0x75, 0x87, 0xcd, 0x94, 0x5e, 0x9b, 0x3d, 0x0a, 0xb8, 0xc9, 0x75, - 0x83, 0x98, 0x16, 0x43, 0x77, 0x07, 0x1a, 0xb4, 0x2e, 0x4a, 0xad, 0xa8, - 0xcc, 0x6f, 0x3e, 0xa5, 0x4b, 0x43, 0xca, 0xb4, 0x0a, 0x2e, 0xdc, 0x5a, - 0x57, 0xa0, 0x59, 0x64, 0x0a, 0xdd, 0xef, 0x83, 0x02, 0xb5, 0xdb, 0x78, - 0x59, 0xef, 0xc3, 0xed, 0xea, 0x70, 0x87, 0x08, 0xee, 0x2b, 0xf4, 0x5d, - 0x1e, 0x24, 0x94, 0x08, 0xa0, 0x3e, 0xe1, 0x87, 0x9f, 0xd2, 0x52, 0xce, - 0x53, 0xc2, 0x20, 0x9b, 0x25, 0x1d, 0xee, 0xb2, 0x52, 0x85, 0xaa, 0x4f, - 0x57, 0x88, 0x1d, 0x16, 0x71, 0xd3, 0x54, 0xaf, 0xbb, 0xb6, 0x92, 0xd1, - 0x1d, 0x28, 0xb3, 0x6f, 0x61, 0xd4, 0x9a, 0xa2, 0xd6, 0x69, 0xd6, 0x77, - 0xcb, 0xac, 0x33, 0x7a, 0x30, 0xc4, 0x39, 0xbc, 0xf3, 0xe5, 0xdc, 0x87, - 0x6d, 0x49, 0xe6, 0xbb, 0xa3, 0x19, 0xa6, 0xb2, 0x0a, 0x8b, 0xe9, 0xea, - 0xda, 0x06, 0xe1, 0xc6, 0xee, 0x8e, 0xa4, 0x7b, 0xfd, 0x53, 0xae, 0xa0, - 0x65, 0x00, 0x76, 0xa1, 0x2c, 0xb1, 0xb6, 0x86, 0xcd, 0x5e, 0xae, 0xef, - 0x5a, 0x93, 0x0e, 0x42, 0xdc, 0xfa, 0x0c, 0x31, 0xad, 0x3d, 0x05, 0x67, - 0x33, 0x13, 0x51, 0x3c, 0x5e, 0x0b, 0xfe, 0x3f, 0x28, 0x1a, 0x15, 0xca, - 0x84, 0xac, 0xfd, 0x9c, 0xcf, 0xe4, 0xfa, 0xc0, 0x7e, 0x91, 0x49, 0x76, - 0x30, 0x2e, 0xcf, 0x19, 0x5b, 0xfb, 0xb1, 0xa0, 0xa6, 0x39, 0x6b, 0x49, - 0x1e, 0xf1, 0x79, 0x58, 0x18, 0xf5, 0x42, 0xf4, 0x14, 0x1f, 0xa6, 0x24, - 0x1e, 0xaf, 0x11, 0x27, 0xf5, 0x99, 0x11, 0xc2, 0x6a, 0xa0, 0x05, 0x12, - 0x0b, 0x27, 0x09, 0xa1, 0x36, 0xb3, 0x02, 0x9d, 0x7e, 0x42, 0xee, 0x72, - 0xc1, 0x5f, 0x8b, 0xa8, 0x19, 0xa1, 0x28, 0xa2, 0x60, 0x5a, 0x71, 0xa7, - 0x64, 0x6c, 0x05, 0xe4, 0x40, 0x1f, 0x66, 0xff, 0xcc, 0x5e, 0xe5, 0x15, - 0x92, 0x2c, 0xad, 0xeb, 0x5b, 0x8e, 0x58, 0xe0, 0x80, 0xf4, 0x93, 0x87, - 0x54, 0xad, 0x6a, 0x40, 0x81, 0x15, 0x1f, 0x39, 0xe0, 0xb7, 0xd2, 0x52, - 0x77, 0x05, 0x81, 0x1f, 0x07, 0x3f, 0xa2, 0x4a, 0x40, 0xd6, 0x70, 0xc0, - 0x1a, 0xd7, 0xcf, 0x02, 0x69, 0x6f, 0x1a, 0xf0, 0x34, 0x4e, 0x7f, 0x22, - 0x9e, 0xd5, 0x64, 0x6d, 0x95, 0x06, 0x0d, 0x8a, 0xd9, 0xae, 0x2c, 0x5c, - 0x85, 0x49, 0x3f, 0x1b, 0xfe, 0x60, 0xa4, 0xdb, 0xac, 0xf7, 0x7b, 0x45, - 0x24, 0xce, 0xf1, 0xcb, 0x92, 0x29, 0xfe, 0xb7, 0xf8, 0xe5, 0xa0, 0x36, - 0x53, 0x16, 0x10, 0xb6, 0x59, 0xb3, 0x09, 0x65, 0x25, 0xc4, 0xa8, 0x0c, - 0x94, 0x57, 0xa8, 0xd5, 0xa6, 0x41, 0xc7, 0xcd, 0xa7, 0xc3, 0x7e, 0x0a, - 0x65, 0x05, 0x42, 0x2c, 0x9f, 0x5e, 0x93, 0x1d, 0x01, 0x5a, 0xe3, 0x43, - 0x22, 0x92, 0x5c, 0xd9, 0xae, 0x13, 0xb0, 0x9a, 0x68, 0xc0, 0xcc, 0x3b, - 0xbc, 0xb5, 0xbe, 0xf9, 0x8d, 0xec, 0xb2, 0x13, 0xa6, 0x12, 0x9a, 0xf0, - 0x73, 0xbb, 0x36, 0x3f, 0x15, 0xc0, 0x1c, 0xb0, 0xac, 0xb4, 0x5a, 0xcc, - 0x27, 0x8f, 0x2f, 0x36, 0x4f, 0xe6, 0x2a, 0xf9, 0xfd, 0x77, 0x1d, 0x6d, - 0x4a, 0x89, 0xa8, 0xf2, 0x9c, 0x67, 0x98, 0xc9, 0x3d, 0x07, 0xc0, 0x49, - 0x5d, 0x44, 0x85, 0x84, 0x5e, 0x65, 0x3d, 0xd7, 0x1f, 0xcf, 0x50, 0x25, - 0x19, 0x8b, 0x0f, 0xc3, 0x64, 0x88, 0xe2, 0x56, 0xbb, 0xd2, 0xdb, 0x1a, - 0x6a, 0x72, 0xbf, 0xb8, 0xd3, 0x82, 0x09, 0xae, 0x86, 0x33, 0xc9, 0x58, - 0xb2, 0xb5, 0xce, 0x37, 0x6a, 0xe4, 0x29, 0x8a, 0xab, 0x09, 0x9e, 0xf4, - 0xab, 0x25, 0x79, 0xe3, 0x7e, 0x9a, 0x35, 0xc1, 0x9c, 0x17, 0xef, 0x13, - 0xac, 0x86, 0x38, 0xf7, 0xa9, 0x85, 0xb9, 0x2a, 0x42, 0x57, 0xbe, 0x08, - 0x35, 0x8b, 0x5c, 0x4d, 0xdd, 0xac, 0xda, 0xa9, 0xa1, 0xe7, 0x72, 0xa9, - 0x0d, 0x7d, 0x04, 0xb3, 0x11, 0x8e, 0x17, 0x69, 0x0a, 0x5e, 0xd7, 0xdc, - 0xac, 0x68, 0xaa, 0x81, 0xe7, 0xaa, 0xb2, 0xfc, 0x6c, 0xff, 0x2c, 0xdb, - 0x55, 0x06, 0xe4, 0x22, 0xd6, 0xd0, 0xab, 0xad, 0x32, 0xb0, 0x8a, 0x40, - 0x24, 0xf7, 0x69, 0xe5, 0x98, 0x6b, 0x28, 0x5a, 0xec, 0x2c, 0x8f, 0x64, - 0x07, 0xf7, 0xe8, 0xc4, 0x73, 0xac, 0x3a, 0xe8, 0xd0, 0xf9, 0xdb, 0x3c, - 0xea, 0x5a, 0x0b, 0xdc, 0x8e, 0xc7, 0x7b, 0xdd, 0xba, 0xc3, 0x49, 0x41, - 0x09, 0xd3, 0x42, 0xbc, 0xa5, 0xd2, 0x4e, 0x94, 0x1d, 0x6a, 0x7d, 0xcf, - 0xdd, 0xe5, 0x01, 0x98, 0x1f, 0x64, 0xf2, 0xc2, 0xb5, 0xda, 0x97, 0x01, - 0xff, 0x1d, 0x07, 0xfa, 0xc1, 0xb1, 0xe3, 0x22, 0x45, 0x52, 0x8c, 0x29, - 0x46, 0xb9, 0x45, 0xea, 0x04, 0x2e, 0xf7, 0x62, 0x01, 0x7d, 0x14, 0x64, - 0x43, 0xd1, 0xf1, 0xc7, 0x30, 0xfa, 0x2e, 0x73, 0xde, 0x69, 0xfa, 0x31, - 0x90, 0x7e, 0x41, 0xdc, 0x9b, 0x3d, 0x96, 0x28, 0xe1, 0xb0, 0x78, 0x3f, - 0x7a, 0x6a, 0xe2, 0xb3, 0x7d, 0x5f, 0x63, 0xb9, 0xfb, 0x98, 0x30, 0xb0, - 0xd5, 0x77, 0xf2, 0xbf, 0x61, 0x63, 0x73, 0x52, 0xdf, 0x94, 0x18, 0x8b, - 0xb8, 0x03, 0xa2, 0x7e, 0xc5, 0x8f, 0x15, 0x52, 0x1f, 0x20, 0xfb, 0x86, - 0xe0, 0x9c, 0x61, 0xfc, 0x5e, 0x2f, 0x47, 0x87, 0x71, 0x52, 0xe6, 0x3e, - 0x48, 0x5b, 0x2f, 0x46, 0x51, 0x9e, 0x92, 0xa2, 0x34, 0x3d, 0xc0, 0xe5, - 0xb1, 0xea, 0x1c, 0x55, 0x18, 0x2e, 0x3b, 0xb4, 0x83, 0x94, 0x1c, 0x0a, - 0x01, 0xeb, 0xc6, 0x42, 0x5d, 0xe3, 0x46, 0x95, 0x72, 0x08, 0x1f, 0x06, - 0xea, 0xf7, 0xa8, 0x7e, 0x1f, 0x11, 0xf4, 0xc9, 0x0e, 0x51, 0x30, 0x67, - 0x1d, 0x8b, 0x11, 0xe5, 0xb9, 0xe0, 0xe6, 0xd9, 0xfb, 0xc7, 0x05, 0x9c, - 0xbc, 0x45, 0x0b, 0x46, 0x57, 0x82, 0xf1, 0x92, 0x3d, 0xa3, 0x30, 0x14, - 0x15, 0xe8, 0x2c, 0xfe, 0x02, 0xe5, 0x16, 0x85, 0x59, 0x96, 0x8a, 0x6b, - 0xd7, 0x45, 0xac, 0xe9, 0xf6, 0x84, 0x80, 0x1b, 0xf3, 0x30, 0x74, 0xe6, - 0x4b, 0x85, 0xb8, 0x47, 0xe2, 0xa3, 0xac, 0x72, 0xbe, 0x6d, 0x45, 0xe0, - 0x3a, 0x4a, 0x69, 0xc0, 0xb7, 0xfa, 0xae, 0x4f, 0x74, 0xa6, 0x21, 0x46, - 0xa1, 0xcd, 0x4a, 0xe3, 0x80, 0x57, 0x7b, 0xd5, 0xd8, 0x73, 0x2e, 0x56, - 0xe7, 0xf9, 0xf9, 0x35, 0xb6, 0xb8, 0x7b, 0x31, 0x27, 0x46, 0xbc, 0x02, - 0xa5, 0x70, 0xb8, 0x90, 0xe8, 0xdd, 0x80, 0x93, 0xbb, 0x93, 0xf9, 0xae, - 0x1d, 0xbc, 0xcb, 0x82, 0xb8, 0x82, 0x86, 0x62, 0xa2, 0x83, 0x78, 0x98, - 0x6e, 0x69, 0xf6, 0xdd, 0x38, 0x89, 0x61, 0xf7, 0x76, 0xc9, 0x0b, 0x51, - 0x43, 0xd9, 0x98, 0x8a, 0xf4, 0x78, 0x28, 0xc4, 0x84, 0xae, 0x35, 0x87, - 0x55, 0x3c, 0xe2, 0xbd, 0xb5, 0xa5, 0x96, 0xc7, 0x06, 0x92, 0x85, 0x75, - 0x1b, 0xba, 0x4c, 0x7c, 0x2a, 0x7f, 0x15, 0x8e, 0x01, 0x17, 0xfe, 0xe6, - 0x8a, 0xf3, 0x60, 0xd2, 0xdc, 0x3d, 0x25, 0x47, 0x63, 0x29, 0x1d, 0x72, - 0x59, 0x47, 0x7c, 0xee, 0x14, 0x77, 0xa1, 0xfe, 0x47, 0x5a, 0x71, 0x39, - 0x03, 0xff, 0x4e, 0xc5, 0x84, 0x85, 0x65, 0x10, 0x17, 0x45, 0xa5, 0xb4, - 0x7c, 0xbb, 0x46, 0xcb, 0x5d, 0xdc, 0x27, 0x1e, 0xe4, 0xaf, 0x71, 0xa6, - 0x4a, 0xa5, 0xac, 0xb3, 0xe0, 0xab, 0xcd, 0xa5, 0xd8, 0x0b, 0x0e, 0x52, - 0xdf, 0x03, 0xa2, 0x54, 0x7e, 0x4a, 0xc1, 0x6d, 0x5a, 0xfe, 0x44, 0xf7, - 0xd8, 0xed, 0xa8, 0x08, 0x2a, 0x5d, 0xae, 0x6e, 0x32, 0x46, 0x16, 0x8e, - 0x86, 0xa9, 0xda, 0x1e, 0x65, 0xfb, 0x28, 0xf9, 0x99, 0x37, 0x95, 0x99, - 0x48, 0xe7, 0x88, 0xd4, 0xfd, 0xe2, 0x3f, 0x70, 0xb1, 0x3d, 0x9b, 0x39, - 0x47, 0x7f, 0xf4, 0xa3, 0xab, 0xfd, 0x64, 0xfb, 0x7b, 0x7b, 0xee, 0x37, - 0x4d, 0xfa, 0x26, 0x99, 0x2a, 0xeb, 0x29, 0x3b, 0xae, 0x45, 0xb3, 0x9e, - 0x42, 0xb4, 0x81, 0x21, 0x4c, 0xb5, 0x7d, 0x1d, 0xea, 0x62, 0xec, 0x13, - 0xcb, 0x7f, 0x8e, 0x50, 0xe5, 0x36, 0x80, 0x15, 0x3c, 0x2a, 0x98, 0x65, - 0x7b, 0x20, 0xd0, 0xc3, 0x84, 0x76, 0xc0, 0xc4, 0xba, 0xee, 0x59, 0x6c, - 0xb0, 0xf0, 0x92, 0x83, 0x51, 0x80, 0xb1, 0xcd, 0x3a, 0xf9, 0x63, 0x44, - 0x2c, 0x46, 0xaa, 0x03, 0xb8, 0x79, 0x15, 0x2f, 0x3c, 0x3a, 0x1d, 0xf6, - 0xe1, 0x8f, 0xda, 0xc8, 0xb2, 0x3d, 0x3e, 0xef, 0x8c, 0xa7, 0x5f, 0x09, - 0x5c, 0x08, 0x52, 0xd8, 0x10, 0xd5, 0xcd, 0xef, 0x58, 0xe1, 0xad, 0x26, - 0xc8, 0x06, 0xbc, 0xee, 0xc7, 0xe0, 0x03, 0x54, 0xd2, 0x40, 0x99, 0x19, - 0x43, 0x65, 0x4f, 0x77, 0x08, 0xa5, 0xeb, 0x01, 0x41, 0xaf, 0xab, 0x75, - 0xc7, 0xaa, 0xa0, 0xfc, 0x85, 0x27, 0x0f, 0xf9, 0x50, 0x32, 0xb1, 0x70, - 0x25, 0x89, 0xac, 0xe8, 0x71, 0xb3, 0x4e, 0x8c, 0x9c, 0x7c, 0x8c, 0x70, - 0xea, 0x1c, 0xca, 0xe6, 0x0d, 0xa4, 0x62, 0x25, 0xec, 0xc0, 0x51, 0xfe, - 0x91, 0x35, 0x63, 0x74, 0x84, 0xe7, 0xfb, 0x68, 0xb0, 0xdb, 0x4a, 0xb7, - 0xb6, 0x32, 0xaf, 0xe3, 0x54, 0x04, 0x4f, 0xd6, 0x0a, 0x3f, 0xf8, 0x4f, - 0x35, 0xff, 0x4f, 0xf5, 0xd8, 0xb5, 0x48, 0x98, 0x75, 0xa1, 0xfe, 0x00, - 0x22, 0x43, 0x85, 0x4a, 0x33, 0x0d, 0x29, 0x98, 0x54, 0xb4, 0x57, 0x1f, - 0x44, 0xbe, 0xee, 0x53, 0x5e, 0x0d, 0xdc, 0x8a, 0x76, 0xd8, 0xce, 0x52, - 0x90, 0x77, 0x19, 0xa7, 0xf3, 0xb3, 0x81, 0x85, 0xaf, 0x2e, 0x51, 0xbe, - 0x85, 0xd3, 0x42, 0xe0, 0x69, 0x13, 0xb3, 0x28, 0xef, 0x11, 0x1f, 0xfb, - 0x61, 0x11, 0x6f, 0x33, 0xf9, 0xca, 0x7a, 0x65, 0x33, 0xbd, 0x15, 0x2a, - 0xe3, 0x0b, 0x39, 0x18, 0xbe, 0x7d, 0x7d, 0xe4, 0x2f, 0xc4, 0x30, 0x0a, - 0x60, 0x63, 0x6e, 0x87, 0x52, 0x25, 0xc8, 0x17, 0xa0, 0x75, 0xa3, 0x07, - 0x4d, 0x62, 0x59, 0x24, 0x9d, 0x34, 0xd7, 0xb6, 0xcf, 0x23, 0x21, 0x5a, - 0xec, 0xf2, 0x59, 0x0c, 0xba, 0xd0, 0xcb, 0x55, 0xe8, 0xa9, 0x5c, 0x45, - 0x06, 0xb2, 0x17, 0x6f, 0xdc, 0xdc, 0x49, 0x84, 0xac, 0x94, 0xd8, 0x95, - 0xca, 0x4b, 0x5b, 0x16, 0x24, 0xdd, 0x08, 0x21, 0xb1, 0x09, 0xac, 0x82, - 0xc9, 0x49, 0x4d, 0x70, 0xfd, 0xbe, 0xf7, 0x59, 0x82, 0x0a, 0xaf, 0x1a, - 0xa2, 0x25, 0xaa, 0x5a, 0x18, 0xe5, 0x2c, 0x8a, 0x67, 0xef, 0x80, 0x86, - 0x4c, 0x6a, 0x5f, 0x21, 0x40, 0x58, 0xc4, 0x77, 0x27, 0x24, 0x4e, 0x2a, - 0x30, 0xf2, 0x75, 0x38, 0xaa, 0xf7, 0xc0, 0x42, 0x0b, 0x70, 0x22, 0xe0, - 0xaf, 0x32, 0xd9, 0xd0, 0x8c, 0x2c, 0xb5, 0xd6, 0xee, 0x8d, 0x22, 0x38, - 0x39, 0xf3, 0x72, 0x18, 0x65, 0x03, 0x10, 0xf8, 0xc7, 0xdd, 0xd4, 0x3d, - 0xb4, 0x20, 0x74, 0xb0, 0xca, 0x95, 0xb5, 0x6b, 0xf2, 0xc4, 0x8f, 0xb8, - 0x36, 0x43, 0x8c, 0x1b, 0x5e, 0x88, 0xf9, 0x9d, 0x07, 0x01, 0x10, 0x89, - 0x87, 0xf8, 0x82, 0x28, 0x36, 0x34, 0xf8, 0x39, 0x87, 0x71, 0x1f, 0xc1, - 0x8a, 0x2e, 0x33, 0x6c, 0x30, 0xc3, 0xba, 0x2a, 0x04, 0x92, 0xd5, 0xe6, - 0xa4, 0xe6, 0x34, 0xe3, 0x3c, 0x99, 0x16, 0xed, 0xb0, 0xf0, 0xb4, 0x5f, - 0xe8, 0x1a, 0x98, 0xf7, 0x0b, 0xaf, 0xae, 0x17, 0x5c, 0xc9, 0x3c, 0xb7, - 0xa0, 0x52, 0xf6, 0xd4, 0x4e, 0xdc, 0xc8, 0xe8, 0xa9, 0xef, 0x53, 0xc1, - 0x5f, 0x7d, 0x00, 0x43, 0xc8, 0x73, 0x08, 0x49, 0x2e, 0xa9, 0x87, 0xd1, - 0x91, 0x23, 0x70, 0xec, 0xd4, 0x9d, 0x20, 0xa5, 0xce, 0x85, 0xf0, 0x30, - 0x82, 0xe1, 0xf6, 0xb6, 0x02, 0x6a, 0x3a, 0x35, 0x9b, 0xd2, 0x8a, 0x48, - 0x97, 0x9c, 0x1d, 0x03, 0x72, 0xa6, 0xe6, 0xbc, 0xd9, 0x39, 0x64, 0xf4, - 0x0d, 0x9d, 0x27, 0xcb, 0x5f, 0x52, 0x19, 0x92, 0xed, 0x46, 0xaa, 0x06, - 0xf7, 0xf4, 0xc6, 0x2b, 0x4a, 0xd1, 0xd3, 0x51, 0x80, 0x2b, 0x7f, 0xf6, - 0x78, 0x23, 0xa9, 0x3d, 0x5f, 0x29, 0x2c, 0x71, 0x89, 0xd9, 0x4e, 0x18, - 0xa7, 0x16, 0x14, 0x1a, 0x3b, 0xb2, 0x25, 0xd0, 0x32, 0x88, 0xf8, 0x6f, - 0x2b, 0x4b, 0x0b, 0x11, 0xab, 0x84, 0xda, 0xc3, 0x69, 0x18, 0xca, 0x43, - 0x70, 0xfb, 0x08, 0x2f, 0x8e, 0x14, 0xfb, 0xc4, 0xe7, 0xa3, 0xa1, 0x8c, - 0xce, 0xd4, 0xcd, 0xd7, 0xee, 0xd5, 0x96, 0xf7, 0x53, 0xc6, 0x4c, 0x42, - 0xfb, 0x49, 0xce, 0x03, 0x0d, 0x79, 0x36, 0xa3, 0x88, 0xc8, 0xde, 0x54, - 0xc6, 0xd4, 0x64, 0xf7, 0xd2, 0x82, 0x12, 0x50, 0xb0, 0xff, 0xdb, 0x42, - 0x3b, 0xc2, 0x0f, 0xe3, 0xe4, 0x8d, 0x13, 0x36, 0xc5, 0x94, 0x11, 0xed, - 0xfe, 0x79, 0xb0, 0x9a, 0xb3, 0x37, 0xd8, 0x3d, 0x27, 0xf1, 0x64, 0xa4, - 0xaf, 0xde, 0x57, 0x23, 0x94, 0xb0, 0xc3, 0xd8, 0x22, 0x70, 0xf0, 0x8f, - 0x10, 0x25, 0xdb, 0x27, 0xa9, 0x37, 0x5e, 0x31, 0x8e, 0x8b, 0xa9, 0x3c, - 0x0f, 0x08, 0x37, 0x25, 0x9f, 0x83, 0x58, 0xf2, 0x56, 0x1b, 0xe0, 0xd3, - 0x23, 0x29, 0xf6, 0x7e, 0x2b, 0x04, 0x2a, 0xd3, 0x82, 0xd1, 0xf1, 0x23, - 0x86, 0xbc, 0x74, 0x99, 0x0a, 0x2b, 0x74, 0x73, 0xdf, 0x2a, 0x36, 0xac, - 0x30, 0xea, 0x3a, 0xa3, 0xea, 0xa5, 0xb7, 0x84, 0x7a, 0x13, 0x08, 0x1d, - 0x89, 0x3f, 0xae, 0x0a, 0xcf, 0x8b, 0x31, 0xb8, 0xe8, 0xa3, 0xb2, 0x70, - 0xc5, 0x75, 0x7e, 0x66, 0x4e, 0x25, 0xfb, 0x2c, 0x35, 0xff, 0x56, 0xa5, - 0x3c, 0x1b, 0x80, 0x68, 0x5e, 0xdd, 0x17, 0x61, 0xda, 0x10, 0x2b, 0x4d, - 0x3f, 0x32, 0x7e, 0x0c, 0x01, 0xb2, 0x6b, 0xaa, 0x31, 0xb1, 0x2e, 0xde, - 0x69, 0x09, 0x40, 0x00, 0x48, 0x97, 0xab, 0x75, 0x2d, 0x0d, 0x77, 0xcf, - 0xfd, 0xf4, 0x16, 0xb5, 0x47, 0xc9, 0xd6, 0x99, 0x0e, 0xca, 0xcc, 0x3c, - 0x22, 0x44, 0xa9, 0x81, 0xc4, 0xc6, 0x0b, 0x71, 0x15, 0x2c, 0x58, 0x93, - 0x78, 0x43, 0xfe, 0x59, 0xde, 0x73, 0x4c, 0x76, 0xd4, 0x2a, 0x6c, 0xf4, - 0x4e, 0x68, 0xa4, 0x47, 0x6a, 0x7e, 0x47, 0x8b, 0x28, 0x84, 0x0e, 0xe9, - 0x7f, 0xfa, 0x49, 0x2a, 0x83, 0x76, 0x17, 0x57, 0xff, 0x17, 0x50, 0xda, - 0x85, 0xa5, 0xff, 0xdc, 0x8e, 0xd3, 0x56, 0x94, 0x14, 0x0c, 0x41, 0x76, - 0x84, 0xf7, 0xfd, 0x13, 0x32, 0x81, 0x6c, 0x43, 0x36, 0x03, 0x6c, 0x5c, - 0xa1, 0x5e, 0x66, 0x75, 0x55, 0xf9, 0x4a, 0xd3, 0x20, 0x95, 0x29, 0x76, - 0x32, 0x75, 0x9e, 0x0b, 0xd7, 0x9d, 0x6a, 0x54, 0x05, 0x7e, 0xbe, 0xa4, - 0x9b, 0xa9, 0x37, 0x14, 0x79, 0x6f, 0x42, 0x92, 0x28, 0x69, 0x3d, 0x4f, - 0xbe, 0xe5, 0x17, 0x81, 0x9f, 0xde, 0xbb, 0x4e, 0xba, 0xd4, 0xd2, 0x6b, - 0xab, 0x28, 0x2e, 0xe8, 0xac, 0xec, 0x41, 0x87, 0xb7, 0x78, 0x50, 0x17, - 0x0a, 0xe3, 0xcc, 0xa8, 0x42, 0x98, 0x4d, 0x6a, 0x7b, 0xf0, 0xc4, 0x71, - 0x8d, 0x74, 0x1b, 0x30, 0xb3, 0xc7, 0x54, 0x2c, 0x8d, 0xe9, 0x9a, 0x6e, - 0x18, 0x40, 0xe3, 0x54, 0xc0, 0x56, 0xb7, 0x5c, 0x14, 0x2f, 0xbb, 0xb4, - 0x6c, 0x4d, 0x12, 0x4c, 0x8c, 0xaf, 0x5d, 0xcc, 0x31, 0xc2, 0xc2, 0xb7, - 0x25, 0xa9, 0x04, 0x41, 0x12, 0xbc, 0xa8, 0x5b, 0x3e, 0xed, 0xe1, 0x48, - 0x09, 0x6c, 0x21, 0x09, 0x9c, 0x80, 0x61, 0xc9, 0xe7, 0x53, 0x9b, 0xa0, - 0x1c, 0x45, 0xc9, 0x44, 0x4c, 0x2f, 0xaa, 0x73, 0x9f, 0x25, 0x63, 0x1d, - 0x05, 0x47, 0x33, 0xa4, 0x97, 0x47, 0xb8, 0x7c, 0x7b, 0x64, 0xc5, 0xa5, - 0xcc, 0x64, 0x2c, 0xb2, 0xaa, 0xee, 0x10, 0x2e, 0x3c, 0xe0, 0xb2, 0x94, - 0xb0, 0x84, 0x10, 0xb8, 0xf8, 0xe3, 0xb4, 0x88, 0x49, 0x6c, 0x1d, 0x3f, - 0x32, 0xd3, 0x8d, 0xcf, 0xa2, 0x34, 0x79, 0x7b, 0xb9, 0x48, 0x89, 0x2f, - 0x04, 0x0c, 0x72, 0x3f, 0xf9, 0x1b, 0xd8, 0xe6, 0x00, 0xae, 0x66, 0xb8, - 0x76, 0xad, 0x25, 0xd1, 0xc1, 0xb1, 0x2f, 0xc5, 0xf2, 0x8f, 0xb9, 0xe6, - 0x34, 0x33, 0x98, 0xdf, 0xf3, 0x0e, 0xa5, 0x6f, 0x3e, 0x00, 0x73, 0xf2, - 0x8a, 0x53, 0xc0, 0x1b, 0x5b, 0xd3, 0x6c, 0x42, 0xd2, 0x2a, 0xb8, 0x95, - 0xb0, 0x03, 0x50, 0x87, 0xc6, 0x02, 0x43, 0xe4, 0x5e, 0xdb, 0x9b, 0x9d, - 0xb7, 0x1a, 0x7c, 0x71, 0x34, 0xfa, 0x8e, 0xe3, 0xae, 0x43, 0x11, 0x03, - 0x31, 0xba, 0xe5, 0x21, 0xdc, 0xba, 0x96, 0x34, 0x87, 0x0c, 0xc8, 0x6e, - 0x3e, 0xbc, 0x8e, 0x4b, 0x7f, 0xcb, 0x37, 0xe5, 0x8b, 0xac, 0x83, 0xb2, - 0x12, 0xca, 0x73, 0x62, 0xd8, 0x89, 0xab, 0x70, 0x5c, 0x31, 0x59, 0xcc, - 0x49, 0x98, 0x4a, 0xd3, 0xec, 0xcf, 0x63, 0xa1, 0x2f, 0x6b, 0x68, 0xcf, - 0x9f, 0xee, 0x63, 0xe9, 0x54, 0xa8, 0xcf, 0x2e, 0x5a, 0x29, 0x1a, 0x85, - 0xf9, 0x50, 0xac, 0x61, 0x19, 0xd7, 0xfd, 0x8d, 0x6d, 0xf1, 0xa2, 0x28, - 0x33, 0x3e, 0x80, 0xbc, 0xab, 0xfe, 0x0d, 0x84, 0x05, 0xab, 0xf7, 0x98, - 0x86, 0x99, 0x7a, 0x8a, 0x6a, 0x93, 0x72, 0x21, 0x7a, 0x4b, 0x11, 0x19, - 0xe4, 0x66, 0x7e, 0xb8, 0x7d, 0x6d, 0xa1, 0xce, 0x4a, 0x94, 0xb1, 0xb1, - 0xb2, 0x09, 0x28, 0x89, 0x1e, 0x7c, 0xf3, 0xa0, 0x50, 0xe4, 0x2c, 0x1d, - 0x38, 0x83, 0xac, 0x6c, 0x79, 0x20, 0xaf, 0xa2, 0xbc, 0xb0, 0x2e, 0x4d, - 0x5c, 0xfc, 0x74, 0x4e, 0xa1, 0x5e, 0x0f, 0x92, 0x40, 0x9e, 0x2a, 0x53, - 0x8b, 0x97, 0x0d, 0xe5, 0x54, 0x68, 0x39, 0xd8, 0x37, 0xb4, 0x76, 0x1d, - 0x5e, 0xc6, 0x77, 0x2d, 0x3c, 0x6a, 0xb5, 0xe7, 0x2b, 0x21, 0x7c, 0xd4, - 0x94, 0xed, 0xeb, 0xc8, 0x24, 0xd2, 0x57, 0xe5, 0x5b, 0x0b, 0x2d, 0xb2, - 0x52, 0x5f, 0x9c, 0x93, 0xe0, 0x38, 0x2a, 0x0f, 0xa1, 0xbe, 0xeb, 0xd7, - 0x71, 0x2f, 0xc3, 0x27, 0x1c, 0x58, 0x93, 0xcb, 0xf5, 0x5b, 0xaa, 0x38, - 0x78, 0x54, 0x7a, 0xbe, 0xf7, 0x7c, 0xa7, 0x4d, 0x6b, 0x11, 0x54, 0x85, - 0x6f, 0x88, 0x1e, 0x2f, 0x43, 0x90, 0x4b, 0x75, 0x56, 0xd2, 0xf7, 0xca, - 0x6d, 0x7e, 0x77, 0x4d, 0x87, 0x29, 0xcc, 0xe3, 0x30, 0x64, 0x2d, 0xd1, - 0x5b, 0x24, 0x4b, 0x5d, 0xe9, 0x14, 0x5b, 0xdb, 0x5a, 0xd1, 0xc7, 0x41, - 0xf8, 0x56, 0x9a, 0x5d, 0x50, 0x9b, 0xac, 0xe0, 0xb1, 0xec, 0x5d, 0x95, - 0x85, 0x28, 0x92, 0x5e, 0x0e, 0x43, 0x3b, 0x38, 0x83, 0x33, 0x45, 0xf9, - 0x72, 0x72, 0xa9, 0x27, 0xa7, 0xdd, 0x32, 0xec, 0x65, 0xef, 0xf6, 0xfc, - 0x21, 0x66, 0x3f, 0xe6, 0xee, 0xeb, 0x0a, 0xde, 0xe4, 0x37, 0x47, 0xb0, - 0x29, 0x56, 0xb4, 0x6e, 0x5c, 0x13, 0xdb, 0x3f, 0xe5, 0x28, 0x41, 0x85, - 0xfc, 0x7b, 0x87, 0x83, 0x75, 0xf4, 0x5b, 0xd9, 0xb6, 0x9a, 0x03, 0x8d, - 0x8a, 0x84, 0xe7, 0x2b, 0x06, 0xa0, 0x17, 0x4a, 0x75, 0x0b, 0x28, 0xa6, - 0xfa, 0x3e, 0xed, 0x51, 0xcc, 0x44, 0xb2, 0xa3, 0x45, 0x23, 0x59, 0xee, - 0x14, 0xb2, 0x01, 0x5a, 0x3f, 0x98, 0x70, 0x6e, 0x5e, 0xf9, 0x32, 0xed, - 0x15, 0x05, 0x6d, 0xc6, 0xa1, 0xa2, 0x59, 0xfe, 0x3e, 0xec, 0xac, 0xa8, - 0xd5, 0xf4, 0xca, 0x2b, 0xb8, 0xfa, 0xcb, 0xea, 0x34, 0x3b, 0x69, 0x0d, - 0x07, 0xcb, 0x7b, 0x9c, 0x5d, 0x00, 0x00, 0x17, 0x14, 0x05, 0x9b, 0x88, - 0xcc, 0x54, 0x2f, 0xae, 0x0e, 0x1a, 0xc9, 0xc3, 0x65, 0x72, 0xa1, 0x21, - 0x8a, 0x86, 0xde, 0xe6, 0x26, 0xeb, 0x85, 0xef, 0xa5, 0xce, 0x8c, 0xfd, - 0xbc, 0x56, 0x8d, 0xb2, 0x39, 0x46, 0x54, 0x92, 0xb4, 0x06, 0x0d, 0x72, - 0x4b, 0xf9, 0xa8, 0x1a, 0xfb, 0x8a, 0xdb, 0x93, 0xf9, 0x77, 0xd7, 0xb0, - 0x83, 0xb8, 0x6b, 0x6b, 0xee, 0x8a, 0xc2, 0xe6, 0x56, 0x7b, 0xf5, 0x08, - 0x3d, 0x8c, 0xad, 0xd3, 0xbc, 0x8a, 0xee, 0x67, 0xd9, 0xbd, 0x6e, 0x6e, - 0xd9, 0xe1, 0xec, 0xf3, 0xef, 0x2e, 0xe7, 0xe4, 0x4b, 0x19, 0x2a, 0xfe, - 0x39, 0xe3, 0xdd, 0x80, 0xfa, 0xf5, 0xc4, 0x5b, 0x5c, 0xd5, 0x70, 0xc1, - 0xc2, 0xa7, 0x7e, 0x5f, 0x07, 0xd4, 0x25, 0xe2, 0xb9, 0x52, 0x0e, 0x95, - 0x0d, 0x7a, 0x8b, 0xae, 0x77, 0x29, 0x8c, 0xa6, 0xa4, 0x3a, 0x59, 0x71, - 0x6f, 0xd8, 0x80, 0xbe, 0xf0, 0xf6, 0x40, 0x7a, 0x43, 0x56, 0xff, 0x4b, - 0x80, 0xd2, 0x64, 0xe3, 0x65, 0xe6, 0x1b, 0x04, 0xa9, 0xdf, 0x16, 0x2c, - 0xfe, 0x0f, 0x0d, 0xd3, 0xe6, 0x96, 0xbb, 0x0c, 0x66, 0xca, 0x09, 0x5d, - 0xf1, 0x42, 0x98, 0xa2, 0xd8, 0x9c, 0x98, 0x55, 0x36, 0xad, 0xf6, 0x80, - 0x90, 0x2c, 0xdd, 0x62, 0x87, 0x89, 0x7c, 0x62, 0x86, 0x1f, 0x4b, 0x3a, - 0xb3, 0x3e, 0xc4, 0xfc, 0x4b, 0x09, 0x14, 0x7c, 0x25, 0x94, 0x26, 0x9d, - 0x9d, 0xe6, 0x63, 0xeb, 0x66, 0xb3, 0xf5, 0x09, 0x97, 0x0f, 0xa0, 0x09, - 0x85, 0xec, 0x83, 0x3b, 0x15, 0x56, 0xca, 0x27, 0xeb, 0x7e, 0xb2, 0x0f, - 0x21, 0xc4, 0xa5, 0xed, 0x4f, 0x72, 0x53, 0x81, 0x8d, 0x0a, 0x81, 0x18, - 0x65, 0xac, 0xaf, 0x49, 0x32, 0x54, 0x77, 0xbd, 0x12, 0x22, 0x85, 0x5f, - 0x66, 0x78, 0x13, 0x7b, 0x7e, 0xaa, 0x0e, 0xf4, 0x29, 0x83, 0xf0, 0x4c, - 0x98, 0x5a, 0x69, 0xd3, 0xd0, 0x8f, 0xc7, 0x87, 0x4e, 0x4b, 0x65, 0xfc, - 0xa2, 0x88, 0x78, 0x98, 0x1d, 0x83, 0x4d, 0xe0, 0x8b, 0x77, 0xbf, 0x6b, - 0x3f, 0x85, 0x93, 0xbd, 0x33, 0x1a, 0x5f, 0x57, 0x37, 0xd2, 0x27, 0x99, - 0xf6, 0xcc, 0x53, 0xd4, 0x07, 0x71, 0x06, 0xb4, 0xa1, 0x07, 0xab, 0xaf, - 0x4b, 0xa0, 0xbd, 0x87, 0xa8, 0xb5, 0xfc, 0xbc, 0x00, 0x58, 0x66, 0xd8, - 0xf0, 0xd1, 0x78, 0xbb, 0x5b, 0x29, 0xc1, 0x2e, 0x67, 0x80, 0x52, 0x70, - 0x78, 0xfa, 0xe7, 0x1b, 0x82, 0x86, 0x6c, 0x20, 0x5a, 0x29, 0x9c, 0xc7, - 0x7f, 0x0b, 0x83, 0xa6, 0xcc, 0x95, 0x22, 0xd3, 0xde, 0xee, 0xbe, 0x9c, - 0x70, 0xaf, 0xa9, 0xa0, 0xb8, 0x63, 0xad, 0x22, 0x0e, 0x97, 0x17, 0x51, - 0xb8, 0xb5, 0x21, 0xe9, 0x35, 0x0b, 0xae, 0xe1, 0xe1, 0xc7, 0xd6, 0xf6, - 0xe3, 0x7d, 0xac, 0xc8, 0xf3, 0x07, 0x7e, 0x19, 0x5c, 0xd4, 0xef, 0x8d, - 0x9f, 0x1d, 0x17, 0xb6, 0x03, 0xda, 0x20, 0xc4, 0x65, 0x46, 0x91, 0xdf, - 0xde, 0xf3, 0x77, 0xd0, 0x60, 0x79, 0x4c, 0x58, 0x98, 0x63, 0x98, 0x92, - 0xdf, 0x07, 0x4a, 0x66, 0x69, 0xc9, 0xcf, 0xbc, 0x74, 0x20, 0x50, 0x0c, - 0xb7, 0x16, 0x1c, 0x95, 0x31, 0x99, 0xbb, 0x44, 0x0b, 0x81, 0x8e, 0xd6, - 0x14, 0x58, 0xb9, 0x86, 0xf2, 0x46, 0x0b, 0x10, 0x19, 0xfe, 0x70, 0x98, - 0xe9, 0x65, 0xe2, 0x93, 0x43, 0xc1, 0x54, 0xbf, 0x60, 0xf3, 0x3d, 0xbf, - 0x3e, 0xa9, 0x61, 0x25, 0x91, 0xd9, 0x67, 0x33, 0x17, 0xaa, 0x27, 0x22, - 0x2f, 0xcc, 0x28, 0x37, 0x3b, 0xa1, 0xc0, 0x09, 0x7a, 0x72, 0xae, 0x4b, - 0x72, 0xed, 0x55, 0x9c, 0x92, 0xdc, 0x22, 0xe6, 0x29, 0x66, 0x65, 0xb8, - 0x9b, 0xf3, 0x39, 0x97, 0x79, 0x19, 0xc4, 0xba, 0xaa, 0xe2, 0xf8, 0x97, - 0x3f, 0x48, 0xb4, 0x9d, 0x38, 0x0b, 0xbb, 0x50, 0x79, 0x26, 0x8f, 0x7b, - 0xa5, 0xef, 0x19, 0xd3, 0xbf, 0xd3, 0x42, 0xd2, 0xca, 0x70, 0xab, 0x5c, - 0x89, 0x68, 0x34, 0x9f, 0x0e, 0x2a, 0x8f, 0xb3, 0xa4, 0x3a, 0x4c, 0x10, - 0x9b, 0xfb, 0xf7, 0x75, 0xd6, 0x22, 0xab, 0x97, 0x8b, 0x0f, 0x2e, 0x7c, - 0xa0, 0x3e, 0x71, 0x95, 0xfc, 0x03, 0x6e, 0xd9, 0xa4, 0x49, 0x7f, 0x12, - 0xf3, 0x5a, 0xcc, 0x15, 0x37, 0xa8, 0x57, 0x0e, 0x23, 0x0e, 0xcc, 0x8f, - 0xe1, 0x28, 0xca, 0x28, 0x19, 0xc2, 0x50, 0xe7, 0xb6, 0xe1, 0x9a, 0xda, - 0xa0, 0x4a, 0x20, 0xb3, 0xa4, 0xa3, 0x60, 0x84, 0x1d, 0xb2, 0xcb, 0xec, - 0x63, 0x41, 0xf3, 0x20, 0x31, 0x98, 0x99, 0x90, 0x18, 0xa9, 0x99, 0xd8, - 0xc1, 0x58, 0x39, 0xa2, 0x80, 0x10, 0x44, 0xc5, 0x50, 0x9d, 0x1d, 0x2d, - 0x0c, 0x06, 0xd7, 0x20, 0x01, 0xce, 0xf7, 0x02, 0xa5, 0xc8, 0x66, 0x38, - 0xad, 0xc3, 0x9a, 0x7d, 0x42, 0xfc, 0xd2, 0x6f, 0x3f, 0x0d, 0xef, 0xc4, - 0xf5, 0x27, 0xd8, 0x57, 0x76, 0xbc, 0x2d, 0x1d, 0xb4, 0xff, 0x92, 0xac, - 0x00, 0x06, 0x9b, 0xc3, 0x12, 0xb5, 0x62, 0x50, 0x99, 0x72, 0x09, 0xc9, - 0x25, 0xdd, 0x6b, 0x1d, 0x83, 0x23, 0x1b, 0xa7, 0xe3, 0xe6, 0xfa, 0x4e, - 0x22, 0xca, 0x63, 0x72, 0x1b, 0x14, 0xdb, 0x4d, 0x54, 0xc5, 0x70, 0x0c, - 0x32, 0xf3, 0x8f, 0xb0, 0xe8, 0x6f, 0x0f, 0xc7, 0x1e, 0xfa, 0x32, 0x09, - 0x98, 0xc0, 0x02, 0x70, 0xab, 0xd7, 0xc8, 0xb0, 0x3b, 0xc5, 0xb1, 0x20, - 0x59, 0x9d, 0x95, 0x2d, 0x6c, 0x9b, 0x2d, 0xf2, 0x2a, 0x3f, 0x92, 0x7b, - 0xac, 0x41, 0x65, 0xec, 0xe0, 0x7d, 0x6a, 0x80, 0xd2, 0xee, 0x15, 0x12, - 0x26, 0x34, 0xfc, 0x77, 0x95, 0x84, 0xc6, 0xff, 0xcc, 0xbd, 0x52, 0x1f, - 0xbb, 0xb2, 0x9e, 0x56, 0xac, 0xd8, 0x39, 0x4f, 0x09, 0xbf, 0x8b, 0x6f, - 0x0a, 0x10, 0xc7, 0x74, 0x60, 0x48, 0xbd, 0x2f, 0xb6, 0x50, 0x17, 0xac, - 0x84, 0x39, 0xdf, 0x31, 0xb8, 0x7d, 0x6c, 0xaf, 0x5c, 0x7d, 0x6e, 0x4d, - 0x31, 0x56, 0x93, 0xf0, 0x67, 0x17, 0x2c, 0x07, 0x39, 0x1b, 0x7c, 0x48, - 0xc8, 0x49, 0x4e, 0x15, 0x2d, 0x0f, 0xe0, 0xdf, 0xc7, 0x94, 0xb6, 0x08, - 0x4c, 0x26, 0xc3, 0xd8, 0xc9, 0xe2, 0x62, 0x51, 0x86, 0xf8, 0xe0, 0xcd, - 0x10, 0x8e, 0x26, 0xec, 0x32, 0x44, 0x3b, 0xc6, 0x0c, 0x8c, 0x48, 0xa6, - 0xd5, 0x72, 0x53, 0x9c, 0x89, 0x84, 0x85, 0xd3, 0x19, 0xbe, 0xdc, 0x15, - 0x0a, 0x3b, 0x45, 0xe6, 0x1b, 0x9a, 0x6c, 0xdb, 0xbf, 0x33, 0x94, 0xf5, - 0xcb, 0x60, 0xdf, 0x68, 0xb8, 0x50, 0x06, 0xdc, 0xfc, 0x6d, 0x6e, 0xc3, - 0x88, 0x43, 0xe8, 0x90, 0x51, 0x3a, 0x79, 0x7c, 0xe9, 0xc3, 0x00, 0xd2, - 0x04, 0xb9, 0xbc, 0xcb, 0xe1, 0xbc, 0x1e, 0x8f, 0x4c, 0xef, 0x2c, 0x12, - 0xff, 0xbc, 0x3c, 0xad, 0x47, 0xe5, 0x75, 0x1c, 0x55, 0x24, 0xbc, 0x0e, - 0x05, 0x30, 0x01, 0xd5, 0xb6, 0xc7, 0x30, 0x8a, 0xfe, 0x85, 0x72, 0xd3, - 0x07, 0x77, 0xd7, 0x52, 0x33, 0x4c, 0x6b, 0x20, 0x23, 0x26, 0xfb, 0x23, - 0xc8, 0x39, 0x4b, 0x47, 0x5e, 0xe9, 0xfb, 0xbc, 0x6c, 0x69, 0xe4, 0xfd, - 0x30, 0x02, 0x05, 0x97, 0xfd, 0xaa, 0x98, 0x51, 0x7f, 0x93, 0x9e, 0x81, - 0x8a, 0xdc, 0x7c, 0x73, 0xe3, 0xe1, 0x25, 0xa2, 0x72, 0x2b, 0x3e, 0x99, - 0x1d, 0xe6, 0x96, 0x95, 0x66, 0xb4, 0xbc, 0x4c, 0x6c, 0x18, 0x01, 0x57, - 0x6f, 0x93, 0x07, 0x41, 0xa8, 0x6f, 0xc8, 0xff, 0xcc, 0x77, 0xeb, 0x5b, - 0x9c, 0xf3, 0xdb, 0x27, 0x36, 0x45, 0xa5, 0xc5, 0x3e, 0x87, 0x74, 0x81, - 0x2f, 0xfb, 0x36, 0x3f, 0xea, 0xcb, 0x33, 0xa1, 0xe9, 0xb4, 0xcd, 0xea, - 0x46, 0x3e, 0x12, 0x70, 0x0d, 0x1f, 0x42, 0xde, 0xcb, 0xf4, 0x05, 0x91, - 0x21, 0xaf, 0x54, 0x68, 0x2a, 0xd2, 0x08, 0x9b, 0x5a, 0xe5, 0x08, 0x97, - 0x40, 0x42, 0xce, 0x52, 0x82, 0x04, 0x34, 0xf6, 0x2e, 0xbb, 0x98, 0x56, - 0x17, 0x39, 0x53, 0x7a, 0x4c, 0xdf, 0xa5, 0x0c, 0x4d, 0x4a, 0xa1, 0xdc, - 0x62, 0x61, 0xc5, 0xca, 0xb5, 0x3a, 0x13, 0xe0, 0x51, 0x5e, 0x2d, 0xfc, - 0x9c, 0x0b, 0xf8, 0x09, 0x95, 0x00, 0x7e, 0x8f, 0x40, 0xa1, 0x88, 0xb8, - 0x50, 0xc0, 0xa6, 0x4f, 0xa5, 0xd4, 0x4e, 0x18, 0x15, 0xa9, 0x3c, 0x11, - 0x8f, 0x2a, 0x1b, 0x9b, 0xeb, 0x8c, 0xf7, 0xf4, 0xe5, 0xa5, 0xf4, 0xc6, - 0x0f, 0x15, 0xd2, 0x73, 0x20, 0x00, 0x03, 0xa9, 0xfa, 0x82, 0xd1, 0xdc, - 0xd9, 0x6c, 0x76, 0x89, 0x57, 0xe8, 0xf7, 0xf8, 0xee, 0x9c, 0x56, 0xe7, - 0x15, 0xac, 0xfc, 0x28, 0xb3, 0x73, 0x9f, 0x7a, 0x63, 0x50, 0xce, 0x17, - 0x9c, 0xaf, 0xa8, 0xd8, 0x7f, 0xee, 0xc3, 0x4e, 0xd7, 0x9b, 0x9e, 0xc4, - 0x76, 0x8f, 0x8e, 0x67, 0x63, 0x13, 0xdb, 0xea, 0x9f, 0x33, 0xc1, 0x05, - 0xb2, 0x85, 0x9e, 0x16, 0x06, 0x58, 0x28, 0xd4, 0xf7, 0xcd, 0xc6, 0x77, - 0xc9, 0x83, 0x94, 0x59, 0x11, 0xb2, 0x86, 0xc3, 0x16, 0x74, 0x81, 0xb6, - 0x8e, 0x92, 0x4e, 0x33, 0x80, 0x54, 0x3d, 0x3d, 0x2c, 0xb0, 0x70, 0xad, - 0x08, 0x5c, 0x35, 0x49, 0x00, 0x63, 0x00, 0xed, 0xd3, 0x9c, 0xc9, 0x86, - 0xf6, 0x87, 0x81, 0x36, 0xb7, 0x9b, 0xeb, 0xdc, 0xd4, 0x5a, 0x5a, 0x1e, - 0xdf, 0x6a, 0xa0, 0x94, 0x06, 0x4b, 0x23, 0xcf, 0xdd, 0x8f, 0x1a, 0x47, - 0x0e, 0x53, 0x90, 0x05, 0xe3, 0x24, 0x7e, 0x9e, 0xee, 0x69, 0xcf, 0xb3, - 0xbe, 0x23, 0xdd, 0x05, 0xbc, 0x07, 0x13, 0x64, 0xc5, 0x2b, 0x7a, 0xbb, - 0x9b, 0x93, 0x4f, 0x28, 0xb7, 0xf2, 0x8c, 0xe0, 0x39, 0x06, 0x79, 0x73, - 0x5d, 0x7e, 0xb5, 0xdb, 0x79, 0xfc, 0xf3, 0xb1, 0xcd, 0x4e, 0xa3, 0xd7, - 0xf7, 0x48, 0x95, 0x97, 0x43, 0x2c, 0xaf, 0x30, 0xca, 0x4f, 0x33, 0x0d, - 0x66, 0x9e, 0x12, 0xa6, 0xc3, 0xbe, 0xda, 0x2f, 0x42, 0xf2, 0xa8, 0xa4, - 0xaf, 0x64, 0x93, 0x3b, 0x93, 0xd8, 0x0e, 0x2a, 0x25, 0x34, 0x44, 0xf8, - 0xef, 0xb0, 0x34, 0x4e, 0xcf, 0x0d, 0xc9, 0xcd, 0x82, 0x9e, 0x07, 0xca, - 0xa4, 0x17, 0x4b, 0x7e, 0x1f, 0x80, 0xbf, 0x04, 0xee, 0x54, 0x65, 0xec, - 0x01, 0xe4, 0xb1, 0x5a, 0x57, 0xf9, 0x34, 0xf3, 0x2f, 0x04, 0x3f, 0xdd, - 0xce, 0x45, 0x16, 0x30, 0x82, 0xc7, 0x0f, 0x83, 0xf3, 0xb4, 0x45, 0x08, - 0xb9, 0xa6, 0xeb, 0x67, 0x5d, 0xaa, 0x83, 0xf8, 0xc7, 0x6a, 0x3e, 0x8f, - 0xc5, 0x2e, 0xef, 0x0a, 0x27, 0xda, 0xb4, 0x81, 0x4e, 0x29, 0xbe, 0x96, - 0xa8, 0xed, 0xc2, 0x7f, 0xc9, 0xf6, 0x45, 0x4d, 0x89, 0x4a, 0xee, 0x32, - 0x12, 0x1c, 0xf3, 0x72, 0x7f, 0x2e, 0x32, 0x14, 0x40, 0x6b, 0x2d, 0x53, - 0xa0, 0xec, 0x2e, 0xed, 0xbc, 0xab, 0xe4, 0x8a, 0x94, 0xdf, 0x52, 0xfa, - 0x1c, 0x02, 0xe1, 0xce, 0x06, 0xd4, 0x6f, 0x12, 0xc2, 0xf9, 0x87, 0xcc, - 0x47, 0x40, 0xff, 0x59, 0x9b, 0x46, 0x7f, 0x42, 0xcd, 0x6c, 0x3d, 0x2a, - 0x5c, 0x91, 0x2d, 0x7b, 0xba, 0x24, 0xac, 0x90, 0x75, 0x2c, 0xe0, 0xdc, - 0x1c, 0x23, 0x29, 0xd0, 0x5f, 0xfd, 0x76, 0x4b, 0x74, 0x29, 0x82, 0xa8, - 0xc9, 0xb0, 0x78, 0x26, 0x13, 0xc2, 0x14, 0x6f, 0xd2, 0x95, 0x29, 0xa4, - 0xc8, 0x43, 0x07, 0x5c, 0xd6, 0xcb, 0x47, 0x17, 0x9f, 0x73, 0xbd, 0x58, - 0xb0, 0xd3, 0x23, 0x0e, 0x37, 0x5f, 0x97, 0x09, 0xb3, 0xb3, 0xd0, 0x5c, - 0xe7, 0xcb, 0x02, 0xf7, 0x7d, 0xe5, 0x85, 0xbf, 0x51, 0x6f, 0xd5, 0x42, - 0xa3, 0x25, 0x78, 0x9c, 0x29, 0x29, 0x49, 0xcc, 0x56, 0x5b, 0xd4, 0x2b, - 0x04, 0x7e, 0xcd, 0x95, 0x6e, 0x70, 0xf3, 0x82, 0xab, 0x30, 0x4e, 0xa0, - 0x36, 0xce, 0xb4, 0x11, 0x29, 0x17, 0x83, 0x8d, 0xe3, 0xf4, 0x2a, 0x78, - 0x44, 0xa3, 0x60, 0x41, 0xa1, 0x30, 0xa9, 0x03, 0xe9, 0x07, 0xa3, 0xf4, - 0xea, 0xd6, 0xbb, 0x8a, 0xfa, 0x6b, 0xda, 0xdf, 0x8d, 0x83, 0x41, 0x11, - 0xdb, 0x75, 0xad, 0x62, 0xeb, 0x6f, 0x4c, 0xdf, 0xcf, 0x8e, 0xb5, 0x85, - 0x48, 0x8f, 0x3b, 0x92, 0x9a, 0x7c, 0xe6, 0xd8, 0x13, 0x21, 0x8c, 0xa2, - 0x31, 0xea, 0xe1, 0x86, 0xb7, 0x62, 0xe4, 0x71, 0x93, 0xd1, 0x0d, 0x98, - 0xdf, 0x6f, 0x49, 0xb0, 0x98, 0xb2, 0x51, 0xd1, 0xc1, 0xd6, 0x4b, 0xa3, - 0x75, 0xa4, 0x7c, 0x70, 0x77, 0xd7, 0x80, 0x4e, 0x18, 0x45, 0x07, 0x5e, - 0x41, 0xb0, 0x44, 0x9d, 0xbd, 0x67, 0x21, 0xe7, 0x04, 0xf4, 0x1d, 0x81, - 0xf8, 0x79, 0x37, 0xdc, 0xdb, 0x30, 0xb1, 0x94, 0xe1, 0xab, 0xf0, 0x0d, - 0x24, 0xa1, 0x46, 0x15, 0xd7, 0xf8, 0xaa, 0xee, 0x3f, 0xa0, 0xce, 0xc8, - 0x39, 0x38, 0xc2, 0x15, 0xad, 0x6f, 0x64, 0x92, 0xa8, 0x15, 0x16, 0x36, - 0x71, 0x2d, 0x02, 0xf6, 0x66, 0xff, 0x9f, 0xb1, 0xe3, 0x7e, 0xf1, 0xfb, - 0x15, 0x2c, 0x59, 0x1c, 0xbf, 0x81, 0x48, 0x24, 0xd4, 0x11, 0xfc, 0xbd, - 0x85, 0xf4, 0x89, 0x83, 0xa9, 0xd7, 0x9e, 0x8c, 0x91, 0x27, 0x91, 0xdb, - 0xe9, 0x97, 0x27, 0x55, 0x5a, 0x49, 0xee, 0xba, 0xba, 0x2e, 0x24, 0x70, - 0x16, 0x0c, 0x83, 0xae, 0x84, 0x14, 0x13, 0x09, 0x91, 0x00, 0xec, 0xbb, - 0xc8, 0x93, 0xb6, 0x02, 0x2a, 0xaa, 0x52, 0x07, 0x6b, 0xd5, 0x89, 0xb5, - 0x93, 0xc8, 0x3c, 0xd5, 0xa6, 0xc5, 0x8e, 0xf9, 0x7d, 0x43, 0xd9, 0x43, - 0xab, 0x93, 0xca, 0x0e, 0x61, 0x41, 0x2e, 0xcc, 0xe5, 0xdb, 0x85, 0x02, - 0xa8, 0x9c, 0x5c, 0xef, 0x2d, 0x38, 0x43, 0x16, 0xe4, 0xae, 0x70, 0x35, - 0x18, 0xcf, 0xe7, 0x33, 0x4a, 0xeb, 0x72, 0xf4, 0x9d, 0xb2, 0xc4, 0x49, - 0xe1, 0xd9, 0x0f, 0x68, 0x94, 0xa4, 0x5e, 0x8b, 0x31, 0x4b, 0xd8, 0xf3, - 0xc7, 0x02, 0xc9, 0x8d, 0x40, 0xb6, 0x9d, 0xc9, 0x6f, 0x20, 0xd2, 0x89, - 0xec, 0x30, 0x27, 0xb2, 0x11, 0x48, 0x35, 0x3d, 0x54, 0x0d, 0xae, 0xb3, - 0xf5, 0xf7, 0x73, 0xac, 0xd4, 0xe9, 0xa1, 0xa2, 0x6f, 0x37, 0xfe, 0x83, - 0xaf, 0xae, 0x93, 0xd5, 0x67, 0xff, 0xe8, 0x47, 0x64, 0x3f, 0x43, 0x75, - 0x54, 0x44, 0x64, 0x31, 0x14, 0x7b, 0xd1, 0x34, 0x5c, 0xb8, 0x8f, 0x12, - 0xb2, 0xb5, 0x29, 0x6b, 0x32, 0xa8, 0xa2, 0x14, 0xb7, 0x05, 0x27, 0x0f, - 0x22, 0x05, 0x15, 0xb2, 0x72, 0xe0, 0xd5, 0x31, 0xd3, 0x15, 0x23, 0x7f, - 0xf5, 0x44, 0x8a, 0x05, 0x7f, 0xc9, 0x25, 0x54, 0x60, 0x00, 0x3c, 0xb7, - 0x0d, 0x84, 0x73, 0x26, 0x02, 0x51, 0xac, 0xae, 0x64, 0xec, 0xc2, 0x6b, - 0xe1, 0x52, 0xfe, 0x77, 0x96, 0xb2, 0x76, 0x67, 0xe5, 0x4b, 0x75, 0xb9, - 0xd3, 0x7b, 0xaa, 0x75, 0x5a, 0xd5, 0xe7, 0x24, 0x60, 0xcf, 0xc5, 0x02, - 0x48, 0xf0, 0xc3, 0x10, 0xeb, 0x7e, 0x98, 0x43, 0xaa, 0x9a, 0x4b, 0xdd, - 0xe4, 0x8a, 0x8e, 0xef, 0x46, 0x2e, 0xf8, 0xcb, 0x32, 0xac, 0xd3, 0x07, - 0x60, 0xda, 0x88, 0xb3, 0xd4, 0xce, 0xe1, 0x2c, 0xf8, 0xc3, 0xd0, 0x93, - 0x46, 0xa7, 0xd4, 0x55, 0x0e, 0xf1, 0xb9, 0x3f, 0x13, 0x3d, 0xea, 0xc7, - 0xfe, 0x82, 0x93, 0x4d, 0x87, 0x6f, 0xec, 0x0a, 0x8d, 0xc0, 0x22, 0x3f, - 0xe8, 0x4c, 0xd3, 0xdc, 0x28, 0x3f, 0xd5, 0x5e, 0xba, 0x57, 0xd8, 0x59, - 0x62, 0x66, 0xa6, 0xd8, 0xc5, 0xb6, 0xd5, 0x37, 0x1a, 0x74, 0x91, 0xe7, - 0x53, 0x75, 0x5c, 0x3f, 0xbf, 0x9c, 0x4f, 0x89, 0xf3, 0xde, 0x07, 0x95, - 0x4e, 0xfb, 0x33, 0xcb, 0xc3, 0x2d, 0x81, 0x32, 0xfa, 0xc7, 0xe3, 0x56, - 0x4b, 0x26, 0x8f, 0xed, 0x5d, 0x41, 0x3e, 0x60, 0x71, 0xe9, 0x7a, 0x5c, - 0xe7, 0x2a, 0xf5, 0x25, 0x7a, 0x0f, 0x49, 0x87, 0x48, 0x4a, 0x9a, 0xb5, - 0x3e, 0x03, 0x00, 0xc1, 0x66, 0xd8, 0x8c, 0x3a, 0x57, 0xcb, 0x80, 0xb5, - 0x6d, 0x74, 0x85, 0x23, 0x91, 0xff, 0x99, 0x21, 0xc4, 0xa8, 0xc6, 0x52, - 0x1c, 0xc5, 0x29, 0xae, 0xab, 0xc3, 0x05, 0xe5, 0xcd, 0x62, 0xcd, 0x5b, - 0x62, 0xc0, 0xc0, 0xdd, 0x53, 0x8e, 0x89, 0x23, 0x42, 0xa6, 0x3c, 0x87, - 0xd0, 0x63, 0x91, 0x27, 0xb9, 0x7d, 0x8d, 0x93, 0x44, 0xfa, 0x26, 0x4a, - 0xd9, 0x7f, 0x26, 0x1c, 0x3b, 0xa9, 0x69, 0x7f, 0x2a, 0x04, 0x8d, 0x1e, - 0x27, 0x42, 0x29, 0xb8, 0x69, 0xcd, 0x49, 0xa0, 0x6c, 0xcc, 0xd5, 0x18, - 0x05, 0xd9, 0x14, 0x29, 0x26, 0x29, 0x21, 0xa0, 0x31, 0xb8, 0xbd, 0xad, - 0xae, 0x1d, 0x20, 0x63, 0x81, 0x0f, 0x74, 0xc0, 0xe4, 0x60, 0xb1, 0x51, - 0x6a, 0xc7, 0x80, 0x6b, 0x0f, 0x6b, 0x87, 0x7d, 0x5e, 0xd5, 0x0c, 0x0a, - 0x1f, 0x3f, 0xec, 0x73, 0x9d, 0x0c, 0x14, 0xb0, 0x3e, 0x6e, 0x04, 0xe8, - 0xa4, 0x5d, 0x02, 0x7d, 0x00, 0xfe, 0x07, 0xef, 0xe8, 0x8d, 0x83, 0x5d, - 0xcc, 0x58, 0xc2, 0x99, 0x5c, 0x1e, 0x9e, 0x56, 0xac, 0x0d, 0xb9, 0xfc, - 0x04, 0xa6, 0xf9, 0x22, 0xa5, 0xba, 0x05, 0x09, 0x8d, 0x4a, 0x28, 0x04, - 0x7a, 0x53, 0x3f, 0x8f, 0x1b, 0xe5, 0x34, 0x4d, 0x7d, 0x2c, 0xd8, 0x73, - 0x1c, 0x3e, 0x09, 0x0d, 0xff, 0x14, 0xfc, 0xed, 0x15, 0xfb, 0x9d, 0x1e, - 0xb2, 0xd3, 0x89, 0xb1, 0xdb, 0x30, 0xf3, 0x85, 0xeb, 0x6c, 0x5f, 0x69, - 0xa5, 0x1a, 0x50, 0xa6, 0xcb, 0x06, 0x69, 0xf5, 0x31, 0x86, 0xb3, 0xb1, - 0x11, 0x0d, 0x53, 0x9d, 0xe9, 0x2a, 0x20, 0xf0, 0x5f, 0xf6, 0x4c, 0x37, - 0x9e, 0x68, 0xe7, 0xc7, 0xde, 0x99, 0x34, 0x96, 0xaa, 0x5f, 0xfc, 0x47, - 0x7c, 0x5d, 0x46, 0x26, 0xc3, 0xa4, 0xe3, 0xe7, 0xba, 0x6e, 0xfb, 0x4b, - 0x5c, 0xc9, 0xd7, 0x2b, 0xa4, 0xef, 0x1c, 0xc0, 0xba, 0x61, 0x35, 0x2c, - 0xfb, 0x84, 0xf2, 0xc7, 0x56, 0x2c, 0x73, 0x88, 0x71, 0xa2, 0x75, 0xa1, - 0xbe, 0x24, 0x11, 0x4c, 0x2b, 0x11, 0x3d, 0xac, 0xf8, 0xd9, 0x38, 0xe5, - 0x15, 0x0d, 0xc4, 0x42, 0x8a, 0x4e, 0x09, 0x76, 0x51, 0xbb, 0xfe, 0xba, - 0x34, 0x0e, 0xb9, 0x4e, 0x59, 0x66, 0x02, 0x90, 0xe6, 0x83, 0x49, 0x10, - 0x8f, 0x2b, 0x95, 0x27, 0x8c, 0xf0, 0xa7, 0xa4, 0x69, 0x52, 0x34, 0x44, - 0x6a, 0x71, 0x37, 0x24, 0x5e, 0x1c, 0x89, 0x6d, 0x32, 0xa5, 0x38, 0x43, - 0xb5, 0x00, 0xbf, 0x30, 0x26, 0x6a, 0xbd, 0x72, 0xf0, 0x8f, 0x77, 0x3e, - 0xc9, 0x1d, 0x49, 0xc5, 0x2b, 0xac, 0xb1, 0xbe, 0x0e, 0x86, 0x93, 0x67, - 0xec, 0xd9, 0xef, 0x23, 0x9e, 0x09, 0xbf, 0xe0, 0x5d, 0x08, 0x1d, 0xdf, - 0xec, 0x10, 0xe3, 0x24, 0xe0, 0xce, 0x64, 0x95, 0xa8, 0x62, 0xd5, 0x9f, - 0xde, 0x77, 0x9f, 0x38, 0xa6, 0x2b, 0x68, 0xe7, 0xb3, 0xb2, 0x1b, 0x8b, - 0x3f, 0x95, 0x2b, 0x17, 0x04, 0x2f, 0xd0, 0x74, 0x98, 0x11, 0x73, 0x4a, - 0xe1, 0xa7, 0xb4, 0xd3, 0xdd, 0x77, 0x5c, 0x07, 0x8d, 0xa9, 0xdc, 0xc4, - 0x32, 0xfa, 0x19, 0x07, 0x9b, 0xb5, 0xbe, 0xc8, 0x75, 0x2e, 0x3a, 0xdb, - 0xb2, 0xc2, 0x4b, 0x11, 0x09, 0xad, 0xbf, 0x44, 0xb7, 0x52, 0x49, 0x23, - 0x09, 0x37, 0xbc, 0x18, 0xbe, 0x81, 0xd6, 0xee, 0x9a, 0x3b, 0xcb, 0x9e, - 0x4e, 0xd2, 0x23, 0x5f, 0x54, 0x20, 0xc6, 0x7f, 0xc2, 0x4c, 0x1a, 0xdc, - 0xdf, 0x1b, 0xec, 0xc4, 0xb6, 0x6f, 0x6e, 0x39, 0xeb, 0x22, 0xfd, 0xa8, - 0x4d, 0x7c, 0xf1, 0xfe, 0xee, 0x4d, 0xd8, 0x63, 0xc1, 0xdb, 0xed, 0x1c, - 0x58, 0xb5, 0xa4, 0x4c, 0x3e, 0x72, 0xa4, 0xff, 0x80, 0x72, 0xd7, 0x01, - 0xc2, 0xde, 0x6b, 0xa0, 0x2b, 0x5e, 0x25, 0x27, 0xf6, 0x2c, 0x96, 0x23, - 0xc3, 0x12, 0xc6, 0xc1, 0x79, 0x8b, 0x06, 0x71, 0x23, 0xd4, 0x66, 0xae, - 0x2a, 0xcd, 0xb2, 0x65, 0x67, 0x3d, 0x39, 0x7f, 0xed, 0x0d, 0x8a, 0x01, - 0x69, 0xd7, 0x40, 0xe3, 0xcd, 0x37, 0x64, 0x7e, 0x3c, 0x23, 0xda, 0xea, - 0x8b, 0xcf, 0x60, 0x34, 0x5e, 0x33, 0x20, 0x7c, 0xae, 0xba, 0xed, 0xf3, - 0xfa, 0xba, 0x52, 0x4b, 0x67, 0x82, 0x65, 0x24, 0x05, 0xe1, 0x59, 0xce, - 0xcb, 0xcb, 0xfc, 0x2e, 0xe9, 0x44, 0x6f, 0xc6, 0xab, 0xbc, 0x7f, 0xba, - 0x38, 0xfe, 0x64, 0x72, 0x36, 0xf5, 0x43, 0x69, 0x95, 0xd4, 0xc7, 0xc5, - 0x8b, 0x75, 0x21, 0x49, 0x8f, 0x7a, 0xa5, 0x57, 0x7f, 0x9e, 0x10, 0x0b, - 0x2c, 0x03, 0x92, 0x94, 0x13, 0xfb, 0x62, 0xe9, 0x85, 0xc3, 0x43, 0x5a, - 0x45, 0xe5, 0x87, 0x89, 0x09, 0xc8, 0x56, 0xfb, 0xef, 0x85, 0x7b, 0x68, - 0xfa, 0x02, 0x99, 0x25, 0xe9, 0xcb, 0xe3, 0x9d, 0xd4, 0xdb, 0x9c, 0xf0, - 0x9f, 0x9b, 0x22, 0xff, 0xcd, 0xe1, 0x6f, 0x26, 0x60, 0x68, 0x8b, 0x97, - 0x3c, 0x44, 0x94, 0xc9, 0xcd, 0x57, 0x87, 0x07, 0xa6, 0xbc, 0x8f, 0x3e, - 0xdc, 0xe0, 0xa4, 0x78, 0x20, 0xbc, 0xc2, 0x55, 0xc0, 0x6d, 0xf8, 0xed, - 0x1d, 0x39, 0xba, 0x4c, 0xeb, 0xdb, 0x18, 0x02, 0x72, 0x75, 0x11, 0x44, - 0x26, 0xf7, 0x50, 0x04, 0x77, 0xee, 0x26, 0x16, 0x07, 0x2b, 0x4a, 0xc3, - 0xa4, 0xdf, 0x26, 0xc4, 0xc5, 0x1c, 0x89, 0x9d, 0xd5, 0xc6, 0x8b, 0x8d, - 0xc4, 0x77, 0x06, 0x3c, 0xea, 0xd1, 0x3c, 0x76, 0x90, 0xe7, 0x11, 0xc0, - 0xaa, 0x9b, 0x6d, 0x77, 0x99, 0x47, 0x26, 0x18, 0xf7, 0x2c, 0xb1, 0x50, - 0x58, 0x1a, 0xf9, 0xfb, 0x8b, 0x00, 0x93, 0xfe, 0x59, 0x5e, 0x09, 0xf9, - 0xc9, 0xce, 0x08, 0x43, 0xff, 0xf7, 0x29, 0xc0, 0xbe, 0x00, 0x75, 0x83, - 0x8e, 0xfc, 0x34, 0x8b, 0x39, 0xee, 0xaa, 0x9a, 0x3d, 0x58, 0x53, 0xee, - 0x91, 0x3c, 0x85, 0x1f, 0x0f, 0x4a, 0x50, 0x09, 0x84, 0xd0, 0xcb, 0x39, - 0x05, 0x0b, 0xa6, 0xc9, 0xf7, 0x56, 0x7a, 0x71, 0xe2, 0xa5, 0x07, 0xa0, - 0xaf, 0xb6, 0x34, 0xcf, 0xb5, 0x84, 0xe6, 0xc1, 0xf7, 0x45, 0xb0, 0xdf, - 0x8a, 0xb6, 0x94, 0x9d, 0x9f, 0xf4, 0xb9, 0xdf, 0x59, 0x73, 0xa1, 0x54, - 0x2c, 0xe1, 0x89, 0x74, 0x11, 0x97, 0x94, 0x16, 0x77, 0x3f, 0x09, 0xc4, - 0xe7, 0x03, 0x3c, 0x45, 0x89, 0xd4, 0x66, 0x55, 0x1c, 0x3f, 0xb1, 0xfc, - 0xf0, 0x19, 0x7d, 0x84, 0x8e, 0xc8, 0x79, 0xee, 0x14, 0x11, 0x3d, 0xd7, - 0xc4, 0x1f, 0xc5, 0x80, 0xf0, 0xb3, 0x25, 0xa8, 0xdc, 0xf9, 0xfb, 0xcb, - 0x49, 0xf1, 0xd3, 0xff, 0xa3, 0x04, 0x5b, 0x0b, 0xeb, 0x97, 0xd4, 0xe0, - 0x5c, 0x38, 0xc2, 0xac, 0x2d, 0x41, 0x3b, 0x1e, 0x8b, 0x9b, 0x81, 0xc7, - 0xe8, 0x4e, 0xc6, 0xc5, 0xfd, 0x14, 0x46, 0x70, 0x97, 0xcc, 0x73, 0x23, - 0xcd, 0x4b, 0x94, 0xcc, 0x07, 0xd6, 0x2d, 0x76, 0x1b, 0x64, 0xc5, 0x3e, - 0x7c, 0x33, 0x55, 0x6e, 0x7c, 0x00, 0x48, 0x8c, 0x5b, 0x67, 0xc4, 0x03, - 0x27, 0x18, 0x46, 0xf9, 0xa8, 0x80, 0x24, 0xf6, 0xfd, 0x25, 0x15, 0x13, - 0x24, 0x1e, 0xf4, 0x2e, 0x4d, 0x7d, 0x31, 0xdc, 0x15, 0x09, 0xdc, 0x83, - 0x95, 0x1a, 0x9a, 0x0f, 0xfb, 0xad, 0x96, 0x1b, 0x81, 0x7e, 0xa7, 0x1b, - 0x32, 0x52, 0xa7, 0x6c, 0x3e, 0x1f, 0x22, 0x25, 0x80, 0xd5, 0x13, 0x03, - 0x96, 0x52, 0x90, 0x83, 0x24, 0x85, 0xb2, 0x41, 0xa0, 0xd5, 0xd2, 0x9f, - 0x4c, 0xa6, 0x1a, 0xd3, 0x5b, 0xdc, 0x7f, 0x8a, 0xa0, 0x87, 0x16, 0x2c, - 0x3c, 0x93, 0x5b, 0xc1, 0x7f, 0x5b, 0x8a, 0xd0, 0xa9, 0x54, 0xdf, 0x4b, - 0x72, 0xaa, 0xb5, 0x21, 0xb7, 0x7c, 0x10, 0x4a, 0x3a, 0x2c, 0xd5, 0xab, - 0xdb, 0x93, 0xa2, 0xf8, 0xac, 0x73, 0x97, 0x18, 0xc8, 0x1e, 0x0b, 0x29, - 0xf6, 0x02, 0x2d, 0x33, 0x46, 0x10, 0x4d, 0x0e, 0x52, 0x2f, 0x7b, 0xd1, - 0xb2, 0x35, 0x08, 0x47, 0x7e, 0x9a, 0x9e, 0x8e, 0xab, 0xb3, 0xc0, 0x19, - 0xa9, 0xe3, 0x0f, 0xdb, 0xd2, 0xb8, 0xa7, 0xa2, 0x9e, 0xa1, 0x3a, 0x6b, - 0x61, 0xc7, 0xa7, 0x4a, 0xde, 0x8b, 0x0b, 0x59, 0x11, 0x75, 0xac, 0xd5, - 0x34, 0x9c, 0x78, 0x3d, 0xdd, 0xce, 0x01, 0xac, 0x44, 0x9a, 0xa3, 0x33, - 0xcb, 0xde, 0x28, 0x11, 0xc4, 0x25, 0xa1, 0x70, 0xb8, 0x5b, 0x58, 0xd1, - 0x45, 0xf2, 0x3c, 0xdf, 0x2c, 0x8a, 0xe6, 0x3d, 0x90, 0xcf, 0x54, 0xcc, - 0x07, 0xdc, 0x42, 0x52, 0x20, 0x90, 0xd0, 0xcc, 0xd9, 0x4e, 0xdf, 0xdc, - 0x12, 0x17, 0x40, 0xb5, 0x24, 0x38, 0x28, 0xca, 0xf3, 0xa6, 0x3d, 0x97, - 0x2c, 0xf6, 0xf3, 0x73, 0x90, 0x66, 0x60, 0xaf, 0xec, 0xb4, 0x97, 0x77, - 0x56, 0x3c, 0x95, 0x4a, 0x16, 0x4e, 0x10, 0xcf, 0xb2, 0x6e, 0x6e, 0xe9, - 0x6c, 0xb4, 0xc8, 0xcc, 0xde, 0x2e, 0x50, 0xca, 0xa3, 0x77, 0xe5, 0xa5, - 0x18, 0xf1, 0x41, 0x99, 0x05, 0x1f, 0x4e, 0x27, 0x70, 0x07, 0xd9, 0x94, - 0x99, 0x33, 0x08, 0x07, 0xa7, 0x47, 0x48, 0x1f, 0xed, 0x16, 0xfd, 0xa3, - 0xc4, 0x4c, 0x93, 0xde, 0x2b, 0xcd, 0xe5, 0x29, 0xe1, 0x70, 0x71, 0x52, - 0x97, 0x6c, 0x8a, 0x33, 0x41, 0x1b, 0xf6, 0xd3, 0x28, 0x8f, 0x28, 0x5b, - 0x4e, 0xc4, 0xe2, 0xdf, 0x6b, 0xe3, 0x28, 0x48, 0xf4, 0x56, 0x5c, 0x87, - 0x45, 0x3a, 0xaa, 0xa0, 0xbe, 0xe4, 0xae, 0x2a, 0x45, 0x82, 0x6b, 0x10, - 0x6e, 0xf9, 0xf3, 0xaf, 0x64, 0x85, 0xdd, 0xf4, 0x83, 0x84, 0x88, 0xe3, - 0x91, 0x3e, 0x72, 0x79, 0x75, 0x0d, 0x81, 0x08, 0xed, 0x57, 0x1a, 0x0a, - 0x99, 0x93, 0x8a, 0x67, 0x96, 0x41, 0x5e, 0x3e, 0x81, 0xcf, 0xa5, 0x93, - 0xa4, 0xa4, 0xb0, 0xbb, 0x00, 0xf8, 0xbc, 0x6a, 0x0c, 0x0c, 0x8e, 0x23, - 0x25, 0xc5, 0x0f, 0x5a, 0x6e, 0x73, 0xd6, 0xad, 0xa7, 0xf4, 0x97, 0x80, - 0x92, 0xf2, 0x0a, 0xd5, 0xb9, 0x0b, 0x0e, 0x5e, 0x02, 0xcd, 0x5e, 0xa3, - 0xe5, 0x28, 0xe6, 0x5b, 0x71, 0x18, 0xdb, 0xe9, 0x5a, 0x7a, 0xa2, 0x92, - 0x56, 0x85, 0x48, 0xbf, 0xc8, 0x54, 0xee, 0x98, 0x95, 0xd3, 0x46, 0xe7, - 0xc3, 0x5c, 0x88, 0x6b, 0xbe, 0x06, 0x4e, 0x88, 0x92, 0xb0, 0x78, 0xf2, - 0xff, 0xe9, 0xf0, 0x39, 0x86, 0x55, 0x0a, 0xcd, 0x70, 0x2b, 0x6d, 0xa5, - 0xdc, 0xeb, 0x58, 0x21, 0xf6, 0x7f, 0xef, 0x52, 0x71, 0x92, 0x1b, 0x98, - 0x43, 0xb1, 0x0e, 0x39, 0xc0, 0xc0, 0xa9, 0xe8, 0x4c, 0xd2, 0x82, 0x4a, - 0x6a, 0xbe, 0x4f, 0x7f, 0xc5, 0xb1, 0x2c, 0x44, 0x86, 0x01, 0x20, 0x97, - 0x3e, 0x3c, 0x1e, 0xcd, 0x5f, 0x8b, 0x32, 0x39, 0x19, 0xa5, 0x4d, 0x9f, - 0xca, 0x5a, 0x72, 0x60, 0x9a, 0x3a, 0x29, 0x97, 0xb6, 0x49, 0x71, 0x80, - 0xf3, 0xc0, 0xc3, 0xe7, 0x16, 0xb3, 0x24, 0xa1, 0x17, 0xdf, 0xfb, 0xc8, - 0x9d, 0x3b, 0xd2, 0xc4, 0xd4, 0xdf, 0x5d, 0x16, 0x74, 0x81, 0xa4, 0x72, - 0xc6, 0x3a, 0x20, 0x3c, 0x03, 0x29, 0x10, 0x39, 0x61, 0xbd, 0xe3, 0xd1, - 0x9f, 0x8a, 0x8e, 0xd2, 0x09, 0xac, 0x14, 0x2e, 0x69, 0x70, 0xc2, 0xae, - 0x70, 0x0f, 0x1b, 0x81, 0xda, 0x50, 0x18, 0xeb, 0x9c, 0x5c, 0x6f, 0x4c, - 0x1a, 0x0f, 0xd6, 0x8c, 0x77, 0xe6, 0xa0, 0x03, 0xd4, 0x89, 0xee, 0x2a, - 0x72, 0xa1, 0xda, 0x8a, 0x4c, 0x40, 0x9c, 0x43, 0xfb, 0x98, 0x63, 0x5e, - 0x69, 0xfc, 0x42, 0x20, 0x3a, 0x0c, 0xeb, 0x4d, 0x1e, 0xc8, 0xdb, 0x1e, - 0x74, 0x2c, 0xbb, 0x76, 0x72, 0xa6, 0x4e, 0x6f, 0x30, 0xe4, 0x5d, 0xe7, - 0x90, 0xa9, 0x78, 0x59, 0x39, 0xa7, 0xf6, 0x66, 0x5a, 0xa7, 0xbf, 0x90, - 0xef, 0x09, 0xb0, 0x34, 0xbe, 0x72, 0x6c, 0x28, 0x07, 0xbb, 0x45, 0xa1, - 0xcd, 0x16, 0xf0, 0x39, 0x7f, 0xe2, 0x33, 0xfe, 0x96, 0x26, 0xa9, 0x93, - 0x6e, 0x48, 0xba, 0xf8, 0x08, 0xb3, 0xc9, 0xed, 0x9c, 0x6f, 0xa3, 0xd3, - 0x94, 0x3e, 0x78, 0x9f, 0x02, 0x99, 0x2d, 0x7e, 0xee, 0x34, 0xe6, 0x45, - 0x23, 0x6f, 0x1c, 0xf8, 0x9c, 0x99, 0x6c, 0xa1, 0x9b, 0x31, 0xf0, 0xe3, - 0x27, 0x55, 0x54, 0x4b, 0x57, 0x81, 0xcb, 0x9c, 0x4a, 0xbb, 0x94, 0xc1, - 0x80, 0xed, 0xd3, 0x41, 0xde, 0xa5, 0x94, 0x92, 0x44, 0x6d, 0x3b, 0x59, - 0xde, 0xa8, 0x13, 0x1d, 0xb0, 0x7e, 0x22, 0xb6, 0x68, 0x74, 0xc4, 0x40, - 0x84, 0x3d, 0x68, 0x98, 0x15, 0x09, 0x57, 0x37, 0x6e, 0x1f, 0x5f, 0xcc, - 0x47, 0xda, 0xc4, 0xf1, 0xd9, 0xc4, 0x51, 0xe6, 0xf6, 0x13, 0xc6, 0x91, - 0x6b, 0x27, 0x36, 0x5b, 0xbe, 0xdf, 0x65, 0x93, 0xd8, 0x79, 0x4a, 0xdc, - 0xe6, 0xa8, 0x0b, 0xcf, 0x5a, 0xa8, 0x53, 0xbd, 0xf3, 0x18, 0x64, 0xf1, - 0xd2, 0x66, 0xbb, 0x90, 0x0c, 0x45, 0x2c, 0x1a, 0x70, 0x75, 0xd5, 0x53, - 0x6d, 0xcc, 0x39, 0xb7, 0xb9, 0xcf, 0x4a, 0x6d, 0x45, 0x70, 0x26, 0xc8, - 0x3d, 0x80, 0x85, 0x74, 0x0b, 0x69, 0x1f, 0x33, 0x3d, 0x96, 0x57, 0x00, - 0x04, 0xc5, 0x5d, 0x79, 0xa4, 0x4f, 0xd7, 0x9d, 0xa5, 0x37, 0x15, 0xd1, - 0xb7, 0x54, 0x09, 0xa6, 0x05, 0x7f, 0x29, 0xc0, 0xe1, 0x78, 0xcb, 0x98, - 0x2a, 0x71, 0x86, 0xaf, 0xdb, 0x5e, 0x51, 0x73, 0x66, 0xca, 0x3e, 0xd3, - 0xc0, 0x29, 0x50, 0x91, 0x15, 0xd6, 0xdc, 0x07, 0x57, 0xac, 0x5a, 0x4e, - 0xad, 0x2e, 0xe5, 0x6f, 0xc9, 0x0e, 0xf3, 0x1b, 0x4d, 0x63, 0xed, 0x9f, - 0x1e, 0xdf, 0x26, 0x6f, 0x5d, 0xf1, 0x2b, 0x14, 0xed, 0xa1, 0x59, 0x36, - 0xe4, 0x4f, 0x9b, 0x63, 0x73, 0x70, 0x6e, 0xca, 0x69, 0x15, 0xcb, 0x47, - 0x05, 0xd4, 0x10, 0xbd, 0xce, 0x6c, 0xc0, 0xfc, 0xea, 0x3c, 0xfe, 0x15, - 0x13, 0xff, 0x49, 0x77, 0x0a, 0xf8, 0x0f, 0x98, 0xb5, 0x63, 0x35, 0x75, - 0x16, 0xdd, 0x9b, 0xb2, 0xd7, 0x2c, 0x50, 0x13, 0x25, 0x7e, 0x86, 0xb7, - 0x76, 0xb3, 0xbf, 0xa1, 0x56, 0xdb, 0xd7, 0x6c, 0x59, 0x07, 0x65, 0xf8, - 0xc0, 0x6e, 0x99, 0xe1, 0x7d, 0x81, 0x55, 0x4d, 0x62, 0xe7, 0x5d, 0xd8, - 0xff, 0xd3, 0x4e, 0xaa, 0x4d, 0xa5, 0x72, 0x2d, 0x98, 0x9b, 0x0c, 0x7c, - 0x94, 0x0f, 0xdd, 0x2c, 0x4f, 0x49, 0xbb, 0x45, 0xce, 0xb2, 0xfb, 0x08, - 0xaf, 0xdf, 0x1f, 0x8d, 0xf8, 0xd4, 0xf9, 0xe4, 0xee, 0xf6, 0xa7, 0x6e, - 0x9e, 0x1b, 0xa1, 0xf3, 0x90, 0x22, 0xe4, 0x91, 0x56, 0xf5, 0x86, 0x51, - 0x68, 0xfa, 0x9e, 0x31, 0xcf, 0xac, 0xb8, 0xb1, 0x87, 0x07, 0xba, 0xc0, - 0x68, 0x86, 0xb1, 0xd0, 0xcc, 0x99, 0x2c, 0xaf, 0x42, 0x93, 0x1f, 0x87, - 0x17, 0x98, 0x2a, 0xea, 0x79, 0x63, 0x55, 0x74, 0xd2, 0x5c, 0x94, 0x13, - 0x80, 0x2c, 0x0c, 0x6b, 0xff, 0x91, 0x16, 0xaa, 0xc0, 0xdb, 0x7e, 0x81, - 0x3f, 0x19, 0xfe, 0xa1, 0x50, 0xb6, 0xf9, 0xfe, 0xcb, 0xec, 0x60, 0xa1, - 0x9b, 0x4c, 0x71, 0x51, 0xea, 0x65, 0x65, 0xb1, 0x4c, 0x79, 0xd1, 0x8e, - 0x94, 0x08, 0xce, 0xa3, 0xd2, 0x81, 0xb0, 0xaf, 0x47, 0x8c, 0xef, 0xef, - 0xdc, 0x69, 0x17, 0xa7, 0x28, 0x31, 0x20, 0x4d, 0x0f, 0x33, 0x07, 0x2d, - 0x68, 0x49, 0xcd, 0x80, 0xeb, 0x24, 0x39, 0xe2, 0xbf, 0xc4, 0xc8, 0x20, - 0x89, 0xac, 0x20, 0x40, 0xba, 0x1e, 0xac, 0x64, 0x41, 0xdf, 0x58, 0x17, - 0xc5, 0x33, 0xd1, 0x3f, 0xac, 0xc1, 0xb2, 0xc2, 0xf8, 0xf9, 0x0d, 0x08, - 0xd3, 0x2d, 0x19, 0x32, 0x12, 0x4d, 0x06, 0x88, 0xa4, 0x35, 0x6d, 0x06, - 0xf7, 0x75, 0x7f, 0x9a, 0x09, 0x4a, 0xbb, 0xa6, 0x94, 0xbc, 0xb2, 0xf6, - 0x43, 0x0a, 0x31, 0x4c, 0x0f, 0xe1, 0x95, 0x26, 0xed, 0xfd, 0xe0, 0x7e, - 0xa2, 0xfe, 0x37, 0x6f, 0x34, 0x8c, 0x6c, 0xaf, 0x1d, 0x7c, 0x83, 0x9b, - 0xbe, 0x36, 0x05, 0xf4, 0xcf, 0xdb, 0xbc, 0xb1, 0x7c, 0x32, 0x80, 0x9c, - 0x19, 0xd0, 0x2e, 0x5d, 0xd6, 0x7b, 0xeb, 0xfa, 0x10, 0xac, 0x5b, 0x0c, - 0xb4, 0xeb, 0xbb, 0x5a, 0xc8, 0x21, 0x46, 0xbb, 0x00, 0x02, 0x27, 0x0a, - 0xa5, 0x1e, 0xd9, 0xac, 0x1d, 0xa8, 0x59, 0xf7, 0xa0, 0x32, 0x74, 0x9c, - 0x1c, 0x8b, 0x1d, 0x55, 0x4a, 0xe7, 0xd2, 0x58, 0x8b, 0xba, 0x03, 0xe2, - 0xd3, 0x54, 0xb2, 0xa7, 0x8a, 0x8a, 0x9d, 0x9a, 0x77, 0x88, 0x88, 0x80, - 0x4a, 0xd6, 0x2d, 0xbd, 0x5b, 0x83, 0x80, 0x5e, 0xf6, 0x28, 0x5d, 0x24, - 0xe7, 0x5c, 0x2e, 0x7a, 0xde, 0xf4, 0x5a, 0x22, 0xd0, 0xbb, 0x8d, 0x10, - 0xe8, 0x9b, 0xa0, 0x07, 0xaf, 0xb5, 0xf0, 0x31, 0x28, 0x24, 0x53, 0x39, - 0x57, 0xdc, 0xa4, 0x47, 0x5d, 0x4b, 0x30, 0xca, 0xdc, 0x65, 0x03, 0x35, - 0x4f, 0xe4, 0xc1, 0xd7, 0x74, 0x5b, 0xe2, 0x9d, 0x72, 0x9e, 0x42, 0xe1, - 0xcc, 0xd6, 0xe2, 0x5c, 0x37, 0x60, 0x72, 0x66, 0xcb, 0x36, 0xdc, 0x70, - 0x68, 0x1a, 0xe6, 0x2a, 0xc0, 0xda, 0xae, 0x9f, 0xfe, 0xfd, 0xf4, 0x09, - 0xd4, 0xf4, 0x12, 0x52, 0x44, 0xfb, 0x9e, 0x74, 0xe4, 0x15, 0x2c, 0x81, - 0xb0, 0x48, 0x03, 0xb6, 0x35, 0x43, 0x1f, 0xeb, 0xae, 0xac, 0xc7, 0xc2, - 0x83, 0x58, 0x41, 0x1c, 0x0a, 0x23, 0x03, 0x8b, 0x0d, 0xa5, 0xae, 0xf3, - 0x87, 0x00, 0xa7, 0x89, 0x35, 0x51, 0x22, 0x08, 0xb6, 0x0a, 0x56, 0x9b, - 0xf2, 0xdf, 0x08, 0xb9, 0x20, 0x07, 0x71, 0x7d, 0xa7, 0x0c, 0x1b, 0xb8, - 0xb0, 0x68, 0x10, 0x1b, 0x6f, 0x58, 0x91, 0x91, 0x61, 0x31, 0x62, 0xe1, - 0x3c, 0x52, 0x49, 0x77, 0x34, 0x79, 0xe9, 0x9c, 0x08, 0x22, 0x0f, 0x4e, - 0xbf, 0x95, 0x30, 0x8b, 0x5c, 0x23, 0xba, 0x57, 0x74, 0xc7, 0x9a, 0x94, - 0x17, 0xb3, 0x9b, 0xce, 0xe0, 0x47, 0xc9, 0x28, 0xd3, 0xe9, 0x01, 0x72, - 0xa9, 0x20, 0x80, 0x7f, 0x29, 0x07, 0xb9, 0x44, 0x02, 0x18, 0xe7, 0xe7, - 0xcb, 0xbf, 0xac, 0x08, 0xc2, 0x61, 0xff, 0xce, 0x1c, 0x44, 0x70, 0xc6, - 0x7a, 0xfc, 0x57, 0x7b, 0xe8, 0xc0, 0x86, 0xb4, 0x7c, 0x6f, 0x82, 0x2c, - 0xbf, 0xf0, 0xb4, 0x1e, 0x9c, 0x95, 0xde, 0x91, 0xeb, 0x62, 0x0c, 0x42, - 0xb9, 0xdb, 0x03, 0x66, 0xca, 0x9f, 0x11, 0xd9, 0x71, 0xdf, 0x78, 0xde, - 0x3d, 0xb0, 0xe2, 0xc9, 0x96, 0x38, 0x9d, 0x73, 0x69, 0x72, 0xb9, 0x08, - 0xdc, 0xb4, 0x1e, 0xb9, 0x4b, 0x36, 0x96, 0x8f, 0xea, 0xe6, 0x43, 0xb2, - 0x15, 0xff, 0xc1, 0xdb, 0x1e, 0x16, 0xa0, 0x04, 0x5d, 0x5f, 0x4a, 0x91, - 0xd9, 0xd1, 0x71, 0x9a, 0x9a, 0xf3, 0xb2, 0xff, 0x5a, 0x8c, 0x20, 0xbf, - 0xda, 0xc4, 0xfe, 0x6c, 0x49, 0xb0, 0x62, 0xf4, 0x94, 0xf7, 0x11, 0x73, - 0x63, 0xab, 0x49, 0xe2, 0x0a, 0x09, 0xfa, 0xbe, 0x2e, 0x4b, 0x98, 0x31, - 0x78, 0x27, 0x38, 0x92, 0x80, 0x09, 0x51, 0xaf, 0x18, 0x17, 0x81, 0xed, - 0x39, 0xcd, 0x7a, 0x76, 0x76, 0xc2, 0xe0, 0x40, 0x0e, 0x20, 0x9a, 0x7c, - 0x30, 0x84, 0xeb, 0xc8, 0x85, 0xae, 0x34, 0xfc, 0xfe, 0xa2, 0x47, 0x79, - 0x60, 0x95, 0x64, 0x86, 0x82, 0xa2, 0x8e, 0x0b, 0x64, 0x89, 0xb3, 0xd9, - 0x19, 0x90, 0xb7, 0x6a, 0x5b, 0x28, 0xc1, 0x5d, 0x6a, 0x62, 0x7a, 0x74, - 0xcc, 0xb6, 0x9c, 0xa4, 0xf2, 0xe8, 0xdf, 0x01, 0xa6, 0xa8, 0xb8, 0x3a, - 0x45, 0x98, 0xdc, 0x23, 0xcd, 0x48, 0x2f, 0x20, 0x09, 0x1c, 0x19, 0xe9, - 0x87, 0xb1, 0xa7, 0xb4, 0x51, 0xd5, 0xdb, 0x10, 0xc4, 0x92, 0x2e, 0x07, - 0xa5, 0xc5, 0xf8, 0xa3, 0x77, 0x73, 0x1a, 0x96, 0x80, 0xe3, 0x58, 0xdd, - 0x15, 0xe1, 0xb7, 0xf5, 0x0f, 0xad, 0xb4, 0x76, 0xe9, 0xea, 0xea, 0x7e, - 0x10, 0xed, 0x2b, 0x45, 0xac, 0xe8, 0xb8, 0xb8, 0x68, 0x7b, 0x4c, 0x61, - 0x0a, 0x72, 0x2e, 0x6c, 0x65, 0x2a, 0x5f, 0x15, 0x17, 0xe7, 0xec, 0xa7, - 0x3f, 0xc2, 0x47, 0xf3, 0x60, 0x38, 0xb9, 0xd9, 0x06, 0x84, 0x0b, 0xeb, - 0xc3, 0xe4, 0x2a, 0xb2, 0x4e, 0xb3, 0x79, 0x91, 0x38, 0x41, 0x37, 0x35, - 0xdc, 0x96, 0xf3, 0x2e, 0xff, 0x6b, 0xf4, 0x02, 0x62, 0x77, 0xb1, 0xad, - 0x6f, 0x58, 0xe5, 0xd2, 0xeb, 0xd8, 0xc8, 0x5e, 0xf0, 0x43, 0xf7, 0x61, - 0x71, 0x61, 0xd8, 0x4c, 0x7d, 0xc3, 0xa4, 0xc4, 0xf4, 0x51, 0x0d, 0xc2, - 0x45, 0xa3, 0xc2, 0x53, 0x7c, 0xbe, 0x34, 0xda, 0xa5, 0xa9, 0x81, 0xc6, - 0x5c, 0x0a, 0x1f, 0xdf, 0x99, 0xb7, 0x40, 0xb7, 0xc6, 0x0a, 0x0f, 0xb7, - 0xbb, 0x33, 0xf9, 0x61, 0xbb, 0x34, 0xef, 0x9e, 0xbf, 0x86, 0x5d, 0x09, - 0x92, 0xa8, 0x9f, 0x6c, 0xfc, 0x1e, 0x05, 0xb1, 0xc3, 0x38, 0xba, 0x2d, - 0xc2, 0x5c, 0xef, 0x1d, 0x3a, 0xbc, 0x1a, 0x30, 0xe9, 0x0f, 0x67, 0xf8, - 0x4d, 0x93, 0xc5, 0xe7, 0x7b, 0x22, 0xfc, 0x7c, 0xd2, 0xcd, 0x4c, 0xaf, - 0x8b, 0x7a, 0x00, 0xd5, 0xf4, 0x2e, 0x48, 0xd5, 0x94, 0xcd, 0x9b, 0xe7, - 0x95, 0x49, 0x98, 0x3a, 0x10, 0x15, 0xff, 0xf3, 0xb6, 0x61, 0x4a, 0x05, - 0x66, 0xf9, 0xbe, 0xaa, 0x31, 0x1d, 0x53, 0x0d, 0x84, 0x2d, 0x5a, 0xde, - 0x50, 0x21, 0xc3, 0x10, 0x6f, 0x25, 0x54, 0x5e, 0xd3, 0x53, 0x89, 0xd2, - 0x9f, 0xd2, 0xe6, 0xa3, 0x05, 0x48, 0xfe, 0xa9, 0xfc, 0x3d, 0x25, 0x1c, - 0x19, 0x50, 0x0e, 0x1c, 0x31, 0x80, 0x9d, 0xa1, 0xdc, 0x57, 0xc5, 0x68, - 0xe7, 0xbb, 0x64, 0x87, 0xf3, 0xc4, 0xba, 0x7a, 0x3b, 0x66, 0xd2, 0x3e, - 0x13, 0x88, 0xf6, 0x84, 0x39, 0xb6, 0x45, 0x65, 0x61, 0xad, 0xb8, 0x6e, - 0x9a, 0x45, 0x90, 0xcd, 0xfc, 0xb3, 0xe0, 0x73, 0xa0, 0x12, 0x44, 0x1d, - 0x00, 0x3f, 0xd9, 0x64, 0x98, 0xf4, 0x01, 0xba, 0x9d, 0xfd, 0xa0, 0x89, - 0x6b, 0xd0, 0x40, 0x10, 0x39, 0x3f, 0x3d, 0x1d, 0x43, 0x33, 0xba, 0x67, - 0x68, 0x4c, 0x45, 0x9c, 0xe2, 0xcb, 0x21, 0x74, 0xb3, 0x76, 0xce, 0xe2, - 0xfe, 0x48, 0x29, 0xc9, 0x95, 0x7e, 0x36, 0xae, 0xad, 0x14, 0xec, 0x20, - 0x8c, 0x4c, 0x7e, 0xf0, 0xab, 0x9a, 0xf4, 0x94, 0xab, 0x39, 0xbb, 0xeb, - 0x39, 0x9c, 0x38, 0xf9, 0x82, 0xf0, 0x87, 0x4c, 0xe5, 0x65, 0x67, 0x16, - 0xc5, 0x14, 0x0a, 0xa9, 0x51, 0x67, 0xe2, 0x60, 0x68, 0xdf, 0x2e, 0x5d, - 0x07, 0x49, 0x7a, 0x89, 0x0d, 0x96, 0x37, 0xe5, 0x53, 0x20, 0xab, 0x87, - 0x88, 0x4a, 0x75, 0x56, 0xef, 0xee, 0xb8, 0xe0, 0x02, 0x7b, 0x5e, 0xe4, - 0xf1, 0xcc, 0x6a, 0xd1, 0x77, 0x01, 0x84, 0xa5, 0xae, 0xb5, 0x47, 0xf4, - 0x9c, 0x3a, 0x8e, 0x71, 0xc8, 0x30, 0x2c, 0x0f, 0xcd, 0x39, 0xbc, 0x52, - 0x1d, 0xc4, 0x41, 0xde, 0xfd, 0x6d, 0x77, 0xb3, 0x8a, 0xcf, 0xff, 0x74, - 0x94, 0x44, 0xb9, 0x77, 0xf5, 0x09, 0xc5, 0x3b, 0x14, 0x1a, 0x5b, 0x80, - 0x8a, 0xa7, 0x34, 0x91, 0xf0, 0xd6, 0x94, 0xb4, 0x47, 0x93, 0x6d, 0x46, - 0x4e, 0x75, 0xd5, 0x87, 0x4c, 0xdf, 0x73, 0xab, 0xaa, 0x21, 0x4b, 0x1e, - 0xa8, 0x00, 0x39, 0x85, 0x88, 0xd8, 0x20, 0x3d, 0x4c, 0x16, 0x9b, 0x67, - 0x5e, 0xbd, 0x44, 0x2f, 0x95, 0x62, 0x09, 0x00, 0x35, 0x55, 0x54, 0xc8, - 0x54, 0x98, 0xe9, 0x45, 0x68, 0x5b, 0x3f, 0xc5, 0xa3, 0x3f, 0x01, 0x0a, - 0xa1, 0x7e, 0xa9, 0x2b, 0x95, 0xe9, 0xda, 0xf4, 0x9c, 0x6a, 0x24, 0xd1, - 0xa4, 0x7f, 0xb9, 0x6f, 0x50, 0x13, 0x5b, 0x1a, 0x42, 0xbe, 0x90, 0xca, - 0x1b, 0x33, 0x95, 0x99, 0xbb, 0x4d, 0x33, 0xb2, 0xab, 0xe5, 0xae, 0xa2, - 0x4e, 0x26, 0x96, 0x28, 0x68, 0x81, 0x80, 0xe7, 0x70, 0x66, 0x2b, 0x3b, - 0x09, 0xf3, 0xc6, 0x2a, 0x49, 0xdf, 0x7f, 0xd3, 0xd3, 0x16, 0xeb, 0xd3, - 0xb8, 0xd8, 0x36, 0x74, 0x05, 0x3e, 0x50, 0x38, 0xcb, 0x31, 0xd0, 0x00, - 0x0d, 0xab, 0x26, 0xbc, 0x46, 0x72, 0x8b, 0x99, 0x9a, 0xa9, 0xec, 0xd7, - 0x07, 0xb6, 0x2a, 0xb7, 0x71, 0x02, 0x72, 0xeb, 0x8f, 0x48, 0x52, 0xf4, - 0xba, 0x99, 0xd6, 0xf9, 0xc7, 0x79, 0xf8, 0x40, 0xbd, 0x7f, 0x61, 0x1b, - 0x3d, 0x32, 0x09, 0x7e, 0xb1, 0x29, 0x38, 0x29, 0xa2, 0xed, 0x60, 0x47, - 0xfb, 0x1c, 0xfd, 0xa4, 0x80, 0x22, 0x27, 0xb8, 0xff, 0x83, 0x8c, 0x92, - 0x61, 0x96, 0x02, 0xf1, 0x90, 0x27, 0x53, 0x1c, 0x84, 0xe6, 0xf4, 0xd2, - 0xb2, 0x0e, 0x48, 0xdf, 0x36, 0x1b, 0xe2, 0xfd, 0x59, 0x67, 0x49, 0x6c, - 0x3b, 0xd3, 0xac, 0x95, 0xb4, 0x9a, 0x13, 0x41, 0x35, 0xa7, 0xdc, 0x4b, - 0xb5, 0x3f, 0x93, 0xc3, 0xc1, 0x46, 0xd4, 0xd0, 0x7e, 0xf1, 0x6e, 0x9a, - 0x50, 0x05, 0xcd, 0x4a, 0xce, 0x0c, 0x14, 0x01, 0x9f, 0xdb, 0x5e, 0x8d, - 0x41, 0xa8, 0x6b, 0x32, 0xcd, 0x32, 0x7f, 0x51, 0xb6, 0x9a, 0x96, 0x00, - 0xe3, 0x3a, 0x62, 0x99, 0x96, 0x43, 0x76, 0x0e, 0xaf, 0x2d, 0x6b, 0xc0, - 0xb8, 0xb7, 0x14, 0x8a, 0xee, 0x39, 0xd8, 0xdc, 0xfc, 0xf1, 0x2a, 0x82, - 0x14, 0xe8, 0x65, 0x4b, 0x5b, 0x10, 0x87, 0x81, 0x7b, 0xa3, 0x1a, 0x12, - 0xde, 0x12, 0xf3, 0x94, 0xa2, 0xe5, 0xf6, 0x88, 0xa0, 0x83, 0xd7, 0xa7, - 0xfb, 0xfe, 0xce, 0x5b, 0x8d, 0xd8, 0x06, 0xa4, 0xa8, 0x2b, 0xf8, 0x7c, - 0x4f, 0x99, 0x7a, 0xf2, 0xf5, 0xc8, 0x99, 0x5b, 0xe0, 0x99, 0x2b, 0x71, - 0x85, 0x9f, 0xcf, 0x35, 0xbf, 0x48, 0x84, 0x53, 0x04, 0xda, 0x84, 0x90, - 0x84, 0x4c, 0x27, 0x23, 0xba, 0xe2, 0x90, 0x63, 0xcc, 0x42, 0x2e, 0x9c, - 0x22, 0x26, 0xbb, 0x2c, 0x43, 0x64, 0x20, 0xee, 0xc2, 0x1e, 0x63, 0x74, - 0x8d, 0xc8, 0x9f, 0xcc, 0x7b, 0x89, 0x1d, 0x5e, 0x3a, 0x3d, 0x42, 0x02, - 0x1b, 0x62, 0xd1, 0xe6, 0x52, 0xd2, 0xd5, 0x67, 0xd9, 0xad, 0x9b, 0xbd, - 0x8c, 0x4e, 0x23, 0x63, 0x4c, 0x77, 0xac, 0xfe, 0x3d, 0x48, 0x5d, 0x1c, - 0x59, 0x49, 0x1a, 0x85, 0x7e, 0x3f, 0x6b, 0x7f, 0xad, 0x09, 0x8f, 0x70, - 0x01, 0xb5, 0xc6, 0x85, 0xac, 0x54, 0xe5, 0x09, 0xec, 0x02, 0x96, 0x47, - 0x7d, 0x26, 0xf8, 0x91, 0xbe, 0x3b, 0xaf, 0xf7, 0x89, 0x3a, 0xb0, 0x97, - 0x20, 0xfd, 0x46, 0xd1, 0x55, 0xf0, 0x7a, 0xdf, 0xb1, 0x8e, 0xf4, 0x79, - 0x96, 0x2f, 0x60, 0x53, 0x1e, 0xc6, 0xe5, 0x56, 0xed, 0xe7, 0x9f, 0x15, - 0x73, 0x42, 0x40, 0xe2, 0x27, 0xc0, 0x93, 0xc2, 0x84, 0x8c, 0x4c, 0x28, - 0x14, 0xdd, 0x49, 0x4c, 0x10, 0xd1, 0x7f, 0x96, 0x95, 0x3a, 0x77, 0x69, - 0x4a, 0x5a, 0xef, 0xf2, 0x39, 0x82, 0xfe, 0xae, 0xdb, 0x1d, 0x0f, 0x06, - 0xf6, 0x6d, 0x7b, 0x6e, 0x5b, 0x10, 0xce, 0xfc, 0xd1, 0xc6, 0xaa, 0xc8, - 0x13, 0xfa, 0xcb, 0x71, 0x95, 0x8d, 0x49, 0x56, 0xd6, 0x69, 0x37, 0x02, - 0x72, 0xed, 0xbd, 0xd7, 0x07, 0x2d, 0xae, 0xb6, 0xda, 0xff, 0x69, 0xae, - 0x34, 0xda, 0x47, 0x25, 0xe8, 0x87, 0xfc, 0x56, 0x0a, 0xb5, 0xa8, 0x9d, - 0xad, 0xf4, 0xa8, 0x36, 0xd0, 0x0c, 0x17, 0x2d, 0xb7, 0x45, 0x31, 0x1d, - 0x80, 0x9d, 0xf6, 0x63, 0x80, 0x9c, 0x42, 0x73, 0xc0, 0x60, 0xf0, 0x91, - 0x1d, 0x1f, 0x7f, 0x68, 0x84, 0x02, 0xf1, 0x32, 0x15, 0x6e, 0x37, 0xdf, - 0x8d, 0xca, 0x4a, 0xe3, 0xc6, 0x6f, 0x2c, 0x71, 0x96, 0x56, 0xb8, 0x05, - 0x0e, 0x2b, 0xa2, 0x62, 0x62, 0xf8, 0xc9, 0x67, 0x82, 0x20, 0x2b, 0x62, - 0xe6, 0x3b, 0xf1, 0xda, 0xbb, 0xe8, 0x63, 0xa3, 0x83, 0x74, 0xd9, 0xba, - 0xdc, 0xfa, 0x3e, 0xd8, 0x8e, 0x6b, 0xdd, 0x1c, 0x38, 0x3f, 0x12, 0x9c, - 0x37, 0x4d, 0x90, 0xa3, 0x89, 0xc0, 0xd2, 0xfc, 0xbf, 0x12, 0x96, 0x57, - 0x3d, 0xd6, 0x12, 0x95, 0xcf, 0x00, 0xba, 0x3b, 0x92, 0x3b, 0xb9, 0x51, - 0x26, 0x67, 0x64, 0x00, 0x48, 0xb5, 0xbd, 0x19, 0xa4, 0xc5, 0x3c, 0xfd, - 0x32, 0x5f, 0x0b, 0x5b, 0x99, 0x8b, 0x04, 0x5c, 0xf1, 0xff, 0xe6, 0xd5, - 0x2f, 0x82, 0xbc, 0xa1, 0x3e, 0x23, 0x1b, 0x84, 0x98, 0x04, 0x86, 0x5d, - 0x75, 0xd3, 0x85, 0xc7, 0x85, 0xb5, 0x51, 0xdf, 0xc8, 0x21, 0x0d, 0x4d, - 0xf8, 0xf6, 0xe7, 0x17, 0xae, 0x7e, 0xe4, 0x6c, 0x6a, 0xad, 0xf5, 0xee, - 0x5a, 0x1c, 0x56, 0xbe, 0x6f, 0x42, 0x87, 0x3c, 0x51, 0xc6, 0x71, 0x21, - 0x08, 0xe8, 0x98, 0xf9, 0x17, 0xcd, 0x0d, 0x7b, 0xee, 0x37, 0xc6, 0x6e, - 0x32, 0xfd, 0xae, 0xe5, 0x55, 0xf9, 0xda, 0xc4, 0x4b, 0xf8, 0xb1, 0x7a, - 0xa3, 0x34, 0xb6, 0xac, 0xf2, 0x4f, 0x4f, 0xc5, 0xf5, 0x8b, 0x73, 0xe5, - 0xf9, 0xa0, 0x05, 0xad, 0xbe, 0xa6, 0x97, 0x79, 0x58, 0xed, 0xfc, 0x3e, - 0xac, 0x08, 0xb4, 0x5d, 0x04, 0xf9, 0xd3, 0x32, 0x3c, 0x0b, 0xb5, 0x6e, - 0x9e, 0xdc, 0xbe, 0x92, 0xe1, 0x8f, 0x98, 0x69, 0x30, 0xcc, 0x15, 0x19, - 0x78, 0x98, 0xd1, 0x93, 0xe4, 0x5f, 0x27, 0x8b, 0x45, 0x02, 0xc0, 0x43, - 0xf3, 0xf2, 0xaa, 0x32, 0xef, 0xec, 0x99, 0x53, 0x18, 0x59, 0xda, 0xf5, - 0xf4, 0xd3, 0x0c, 0x60, 0x68, 0x7c, 0x66, 0x3f, 0x99, 0xfc, 0x0b, 0x1c, - 0x89, 0x5a, 0x1d, 0xdd, 0x9f, 0x81, 0x98, 0x62, 0x69, 0x1a, 0x84, 0x1f, - 0x0a, 0x44, 0x01, 0x92, 0x7a, 0xfe, 0xeb, 0xbd, 0xc3, 0x08, 0xb7, 0x16, - 0x72, 0x0f, 0x73, 0x45, 0x28, 0x36, 0x07, 0x8d, 0xfa, 0x03, 0xf2, 0x27, - 0x17, 0xbc, 0x8e, 0xcb, 0x0b, 0x49, 0xc0, 0x31, 0x5d, 0xbf, 0xe9, 0x06, - 0x14, 0x99, 0x45, 0x5c, 0xe0, 0xc8, 0x1b, 0x16, 0x5f, 0x6b, 0xc4, 0x85, - 0x4f, 0x84, 0x14, 0x11, 0x58, 0xde, 0xda, 0x3e, 0x8b, 0x81, 0x8a, 0x9d, - 0x69, 0x88, 0x10, 0x85, 0x87, 0x7c, 0xc2, 0x1c, 0x67, 0xa3, 0x5d, 0x53, - 0xf4, 0x41, 0xce, 0x92, 0x8c, 0x6d, 0x83, 0x38, 0x21, 0xdc, 0x10, 0x0a, - 0x76, 0x8b, 0x4a, 0x89, 0x84, 0x55, 0x9b, 0x17, 0x5e, 0x8a, 0xb0, 0x13, - 0xf2, 0xfb, 0xe4, 0x5b, 0x98, 0x99, 0xbd, 0x93, 0x8e, 0xee, 0xe7, 0x03, - 0x13, 0xee, 0x4c, 0xbf, 0xd4, 0x0b, 0x3d, 0x01, 0x01, 0xb7, 0xdb, 0x3a, - 0xac, 0xa3, 0x6a, 0xf7, 0x16, 0x1e, 0xde, 0x79, 0xc4, 0x58, 0x3b, 0x79, - 0x7e, 0xf9, 0x72, 0x96, 0xd7, 0x2a, 0x55, 0xf2, 0xda, 0x15, 0x71, 0x2a, - 0xaa, 0xd9, 0xcd, 0xfc, 0xb6, 0xe3, 0xc9, 0x70, 0xb6, 0x53, 0x0a, 0x47, - 0x3a, 0x95, 0x4d, 0x1d, 0x5d, 0x84, 0x02, 0x8a, 0xd6, 0x44, 0x6e, 0x39, - 0x22, 0xb5, 0x96, 0xa4, 0x13, 0x8d, 0xd7, 0xd7, 0x08, 0x75, 0x8f, 0xf0, - 0xe2, 0xae, 0x2a, 0xc5, 0x40, 0x2b, 0x83, 0x50, 0x4e, 0x50, 0x4f, 0x75, - 0x40, 0xbd, 0xf3, 0xd9, 0x93, 0x04, 0x13, 0x58, 0xa5, 0x5c, 0xcd, 0xe4, - 0x76, 0xdf, 0x89, 0x90, 0x9d, 0x2a, 0x93, 0xd0, 0x5c, 0x0c, 0xaa, 0x0d, - 0xb7, 0x6e, 0x47, 0xd6, 0x87, 0x7b, 0x69, 0x7e, 0xde, 0x02, 0x4c, 0xaa, - 0x19, 0xc6, 0x43, 0x7c, 0xd8, 0x32, 0xa7, 0xab, 0x26, 0xcf, 0x82, 0x4d, - 0xbc, 0xcc, 0xa3, 0xfb, 0xa7, 0x75, 0xe7, 0x41, 0x44, 0xab, 0xf0, 0x92, - 0x79, 0x36, 0xd9, 0xec, 0xec, 0xa3, 0xb1, 0xa4, 0x0e, 0x8d, 0x5b, 0xda, - 0xf8, 0x8d, 0xb5, 0x3f, 0x91, 0xd8, 0xb0, 0xc4, 0x76, 0xb2, 0xa9, 0xcd, - 0x05, 0xaa, 0x6e, 0x16, 0x4a, 0x0a, 0x50, 0x9a, 0xa3, 0xfb, 0x1b, 0x68, - 0xd3, 0xf2, 0xfe, 0xa3, 0x37, 0x47, 0x03, 0xb6, 0xe4, 0x11, 0xa6, 0xb9, - 0x0b, 0x7d, 0x10, 0x6f, 0xfc, 0xd1, 0x0e, 0x13, 0xdf, 0x23, 0x34, 0x4a, - 0xdd, 0xe4, 0x1c, 0x7b, 0xe1, 0x24, 0x7b, 0xc8, 0xef, 0x42, 0x5d, 0x99, - 0xe6, 0xe1, 0xce, 0x33, 0xa9, 0xb8, 0xd5, 0x16, 0x90, 0x10, 0x2b, 0xa0, - 0x18, 0x87, 0x58, 0xec, 0x4a, 0xcb, 0x51, 0x2b, 0xa8, 0xe5, 0xde, 0xd5, - 0x3d, 0xc7, 0x98, 0xcc, 0xec, 0x99, 0x68, 0x4b, 0x3c, 0xae, 0x15, 0xfa, - 0x1a, 0x05, 0xe3, 0x75, 0x8a, 0x55, 0x65, 0x45, 0xbb, 0x56, 0x96, 0x9a, - 0xb0, 0x81, 0xb9, 0xe9, 0xfa, 0x2b, 0xfa, 0x6f, 0xdd, 0x4e, 0x1d, 0xac, - 0x6c, 0x5a, 0xb0, 0x97, 0x81, 0x2c, 0x86, 0xd4, 0x4d, 0xaa, 0x07, 0x0f, - 0x6c, 0x34, 0x1d, 0x16, 0x04, 0x3a, 0x48, 0x0a, 0xf8, 0xe8, 0x83, 0xa2, - 0x2c, 0x1b, 0xa4, 0xd2, 0xa4, 0x18, 0xe6, 0x61, 0x26, 0x54, 0x05, 0xf8, - 0xf0, 0x45, 0x52, 0x45, 0x38, 0x1b, 0xb2, 0xb8, 0x8d, 0x2d, 0x49, 0x12, - 0x22, 0xbf, 0xfd, 0x70, 0xbc, 0x7f, 0xa6, 0x11, 0xaf, 0xbc, 0x7a, 0xf4, - 0xd6, 0x80, 0xe4, 0xb1, 0x61, 0x82, 0x9f, 0x54, 0x0c, 0x9b, 0x74, 0x39, - 0x5b, 0x9b, 0x43, 0x76, 0xff, 0xb7, 0xb2, 0x65, 0x43, 0x9d, 0x8e, 0x1f, - 0x22, 0x73, 0x16, 0x94, 0x16, 0x4f, 0xeb, 0x65, 0x47, 0x08, 0xe8, 0xbf, - 0x78, 0x15, 0x95, 0x79, 0x06, 0x66, 0xbe, 0x1f, 0xfa, 0xd0, 0x15, 0xbc, - 0xa7, 0xd1, 0xef, 0xb2, 0x42, 0xf0, 0x7b, 0x4c, 0xdb, 0x7d, 0x87, 0x52, - 0x82, 0xde, 0x27, 0x1e, 0x0d, 0x3b, 0x9f, 0xd9, 0x7e, 0x26, 0xd7, 0x24, - 0x6b, 0x32, 0x22, 0x9f, 0x86, 0xb8, 0xc5, 0x19, 0x96, 0xc6, 0x1e, 0x42, - 0x34, 0xf9, 0x39, 0x20, 0x6b, 0x36, 0x76, 0x90, 0x1a, 0xe0, 0x04, 0x59, - 0xc4, 0x1f, 0xdd, 0x8a, 0xf1, 0x94, 0x18, 0x87, 0xec, 0xd0, 0x0e, 0x75, - 0xb2, 0x7b, 0xaa, 0x8e, 0x07, 0x6d, 0xc3, 0x63, 0xc1, 0xac, 0x67, 0xac, - 0x23, 0x33, 0x7b, 0xfc, 0x6d, 0xf3, 0x7a, 0xdc, 0xed, 0x99, 0x9a, 0x4e, - 0xff, 0x6e, 0x4a, 0x2a, 0x6a, 0xe9, 0x9d, 0x27, 0x7a, 0xc1, 0x0a, 0xbf, - 0xcc, 0x60, 0xb7, 0x39, 0xdc, 0xaa, 0x06, 0x2f, 0x3d, 0xb9, 0xca, 0x90, - 0x87, 0x8d, 0xc5, 0x69, 0x33, 0xa6, 0x50, 0x30, 0x52, 0x4e, 0x7e, 0xae, - 0x7e, 0x30, 0x49, 0x7b, 0xd9, 0xed, 0x72, 0x25, 0x5c, 0x79, 0xa8, 0x22, - 0x2e, 0x13, 0xf7, 0x4d, 0xac, 0x9f, 0x1b, 0xbb, 0x69, 0x56, 0x5e, 0x54, - 0x12, 0x29, 0x6d, 0x4f, 0xd6, 0x12, 0xbc, 0x44, 0x54, 0xd6, 0xcf, 0xf5, - 0x55, 0x2b, 0xa1, 0x91, 0xe4, 0x5c, 0xdd, 0x3e, 0x7f, 0xc6, 0x3f, 0x22, - 0x38, 0xef, 0x14, 0xae, 0x1e, 0xef, 0x68, 0x91, 0xcb, 0xbc, 0x27, 0x11, - 0xd9, 0x7e, 0x5f, 0x94, 0x07, 0x34, 0x23, 0xa0, 0x25, 0xa7, 0x3b, 0xa7, - 0x3d, 0xed, 0x77, 0xad, 0x0f, 0xce, 0xba, 0x9b, 0x54, 0x90, 0x78, 0x3c, - 0x85, 0x8d, 0xbe, 0xfb, 0x38, 0x01, 0x42, 0xf3, 0xbf, 0x5a, 0xd9, 0x8c, - 0x38, 0x60, 0x93, 0x1f, 0x09, 0x17, 0xed, 0x57, 0x7d, 0x17, 0xdb, 0xcb, - 0xa0, 0x55, 0x0d, 0x33, 0x9f, 0xd1, 0x9a, 0x6f, 0xf7, 0xe0, 0x02, 0x33, - 0x0e, 0x0c, 0x83, 0x76, 0x62, 0xc0, 0x48, 0x47, 0xbe, 0x49, 0xf7, 0xd3, - 0xf5, 0x52, 0xe8, 0x90, 0x8a, 0xa0, 0x2e, 0x40, 0xc6, 0x07, 0xc7, 0x30, - 0x2a, 0x8b, 0x24, 0x8d, 0xa5, 0x1a, 0x90, 0x10, 0x02, 0x64, 0x23, 0x66, - 0xe9, 0x12, 0xef, 0x91, 0xc7, 0x45, 0x24, 0x99, 0x43, 0x49, 0xb5, 0x77, - 0x97, 0x93, 0x0c, 0x24, 0x84, 0xa5, 0xcc, 0xb7, 0xb7, 0x4f, 0xc1, 0x66, - 0x3d, 0xf7, 0x36, 0x28, 0xd8, 0x28, 0x5f, 0xfe, 0x98, 0xbe, 0x30, 0x33, - 0x6d, 0xff, 0xc1, 0x76, 0x0c, 0x97, 0xa1, 0x60, 0x4f, 0xa2, 0x29, 0x77, - 0x99, 0xcb, 0xeb, 0x53, 0x4f, 0xd5, 0xc2, 0x59, 0x85, 0x30, 0xa0, 0x86, - 0xad, 0x6c, 0xd2, 0x3e, 0x0a, 0x5a, 0x25, 0xb6, 0x75, 0xd0, 0x61, 0x05, - 0xcc, 0x97, 0x13, 0x0c, 0x0e, 0x88, 0xea, 0x06, 0x8e, 0x0a, 0x85, 0x5e, - 0xdc, 0x78, 0x2b, 0x3a, 0xec, 0xf8, 0x06, 0xc8, 0x40, 0xaf, 0xc3, 0x9e, - 0x90, 0xd8, 0xb4, 0x55, 0x91, 0x13, 0xf6, 0x8d, 0xb2, 0xd7, 0x22, 0x03, - 0xd9, 0xc5, 0xb7, 0x0d, 0x4c, 0xcc, 0xdc, 0x38, 0xed, 0x67, 0x03, 0xf2, - 0x2b, 0xeb, 0xdf, 0xc9, 0x93, 0xe9, 0x0c, 0x5a, 0x12, 0x9d, 0x67, 0xfd, - 0xdc, 0x0f, 0x07, 0x63, 0xf4, 0x27, 0xc6, 0x4a, 0x93, 0xfb, 0x00, 0xd6, - 0x3e, 0x04, 0x47, 0x61, 0x32, 0xce, 0xd4, 0x0f, 0xbc, 0x11, 0xfc, 0x37, - 0x01, 0x41, 0xf5, 0x44, 0x36, 0x94, 0xfd, 0xa5, 0xed, 0x81, 0xf3, 0x95, - 0x2b, 0x72, 0x3b, 0x9f, 0x82, 0x80, 0xf8, 0x6b, 0xb1, 0x78, 0x03, 0x50, - 0xb7, 0xbf, 0xf9, 0x90, 0x5e, 0x45, 0xd5, 0x0c, 0xab, 0x18, 0x9b, 0x44, - 0xe6, 0xd9, 0xfd, 0xcb, 0xdc, 0x27, 0xcd, 0x6d, 0xe6, 0x87, 0xc1, 0xbb, - 0xb3, 0xf1, 0x68, 0x15, 0x8c, 0x9f, 0xd5, 0xe4, 0x0f, 0xb4, 0xf3, 0xa8, - 0x2a, 0x3c, 0x9e, 0x49, 0x50, 0x8a, 0x20, 0x3d, 0x89, 0x78, 0xd4, 0xca, - 0xdd, 0x41, 0x6b, 0x8c, 0x52, 0x7f, 0xcd, 0x78, 0xbb, 0x8d, 0x84, 0xeb, - 0x55, 0x16, 0xf0, 0x7a, 0xa7, 0x5d, 0xad, 0x8f, 0x75, 0x0a, 0x77, 0x68, - 0x57, 0x1d, 0xb7, 0xdf, 0xa5, 0x4a, 0x4f, 0xbb, 0x5b, 0xa7, 0xc4, 0x49, - 0xa5, 0x8d, 0x9c, 0xbd, 0x41, 0xc4, 0x14, 0x44, 0xa9, 0x0e, 0xaf, 0xae, - 0x62, 0x31, 0x1b, 0x80, 0xc5, 0xf0, 0xaa, 0x4e, 0x66, 0xa4, 0xde, 0x2e, - 0x55, 0x67, 0xd6, 0x32, 0x2b, 0xf3, 0x22, 0xda, 0x0b, 0xc8, 0xb7, 0xf3, - 0xf4, 0x6d, 0x64, 0x82, 0x9f, 0x34, 0x4e, 0xae, 0xad, 0x8a, 0xd2, 0x32, - 0xd9, 0x5b, 0x42, 0x93, 0x0a, 0x2b, 0x5f, 0xd1, 0xd9, 0xdb, 0x75, 0x21, - 0xc9, 0x35, 0x7c, 0xf1, 0x3c, 0x99, 0xca, 0xb4, 0x5a, 0x6d, 0xe5, 0x5e, - 0x19, 0xdf, 0xa7, 0x1e, 0x4d, 0x20, 0x95, 0x46, 0x9d, 0xdf, 0x2e, 0x7a, - 0xbc, 0xc5, 0xa7, 0x4e, 0xdc, 0x90, 0x2e, 0x7a, 0x70, 0x51, 0x4b, 0x70, - 0xae, 0xe4, 0x3d, 0x21, 0xe9, 0x45, 0x7e, 0xe9, 0xeb, 0x9d, 0x25, 0x91, - 0x86, 0x54, 0x20, 0x88, 0x63, 0x64, 0xc5, 0xc3, 0x2e, 0x9b, 0x39, 0x30, - 0x8d, 0x27, 0x78, 0x21, 0xdb, 0x5a, 0x2a, 0x70, 0xbf, 0x7a, 0x96, 0x43, - 0xd2, 0x94, 0xd1, 0xb1, 0xe5, 0xee, 0xec, 0x3a, 0x64, 0x30, 0xbd, 0xa7, - 0xec, 0x68, 0x82, 0xf5, 0x9a, 0xa7, 0xb3, 0x1a, 0x09, 0x02, 0x81, 0x5b, - 0x9f, 0x5b, 0x75, 0xad, 0xd4, 0x87, 0xe8, 0x17, 0xab, 0x39, 0xb3, 0xe3, - 0x95, 0x51, 0x2b, 0xa2, 0xcb, 0x34, 0x06, 0x18, 0x27, 0x13, 0x07, 0x67, - 0xe8, 0x73, 0x55, 0xb7, 0x7d, 0xaa, 0x76, 0x58, 0x5e, 0x23, 0x84, 0x62, - 0x5b, 0x65, 0x9e, 0x2b, 0x95, 0x2e, 0x21, 0xea, 0xc6, 0x6e, 0xab, 0x2a, - 0x31, 0x43, 0x49, 0x23, 0xc6, 0xe5, 0xb1, 0xc5, 0xdb, 0x3a, 0x37, 0x75, - 0xc7, 0xfd, 0x9d, 0x02, 0xd7, 0x66, 0x00, 0x80, 0xa5, 0x13, 0xf8, 0x05, - 0xa1, 0xa9, 0x57, 0x08, 0xbb, 0x61, 0x21, 0x04, 0x07, 0x45, 0xbc, 0x1d, - 0x4c, 0xb3, 0x58, 0xcc, 0x4b, 0x23, 0xcd, 0x1f, 0x6b, 0x82, 0x8c, 0x21, - 0x80, 0x32, 0x9f, 0x67, 0x80, 0xbf, 0x1b, 0xc8, 0xcc, 0x66, 0xe9, 0x9f, - 0x30, 0x5d, 0x31, 0xf3, 0xc5, 0x28, 0x8c, 0xd1, 0xdf, 0x3c, 0xc6, 0x1e, - 0x60, 0xa2, 0x57, 0x5e, 0x37, 0x5c, 0x05, 0xb9, 0x26, 0x0e, 0x5d, 0xf2, - 0x4d, 0x58, 0x0e, 0x7a, 0xf6, 0x4e, 0xd1, 0xd1, 0x0c, 0x0a, 0x16, 0x69, - 0xd7, 0x8d, 0xb6, 0x75, 0xe1, 0x48, 0xb6, 0xd5, 0x9b, 0xbe, 0x8d, 0x07, - 0x1a, 0x29, 0x53, 0x14, 0x44, 0xf9, 0x19, 0x53, 0xa9, 0x64, 0xb1, 0x77, - 0xc5, 0x99, 0xf6, 0x87, 0x27, 0xac, 0xcb, 0x10, 0x98, 0x2a, 0xc7, 0x86, - 0x1d, 0x7f, 0xbd, 0xce, 0xc5, 0x35, 0x63, 0xff, 0x8c, 0x64, 0x5c, 0xe9, - 0xf4, 0xc1, 0xad, 0x8d, 0x57, 0xb6, 0xb6, 0xa8, 0xe0, 0x36, 0xe3, 0x5c, - 0xc3, 0x3a, 0x12, 0xe9, 0xa8, 0x28, 0x43, 0x5f, 0x90, 0x93, 0xb5, 0x03, - 0x50, 0x12, 0x27, 0x6b, 0x9c, 0xaa, 0xe5, 0x44, 0xc4, 0x88, 0x86, 0xa9, - 0x27, 0x9b, 0x22, 0xfd, 0x4a, 0x20, 0xe8, 0x3a, 0xc7, 0xd5, 0xab, 0xa6, - 0xc1, 0xab, 0x86, 0x4b, 0xdf, 0xfb, 0x63, 0x01, 0xab, 0xdb, 0x53, 0xd9, - 0x1a, 0xed, 0x9c, 0x95, 0x14, 0xea, 0x21, 0x6a, 0xd0, 0xf8, 0x86, 0xec, - 0xb8, 0x70, 0xc3, 0xad, 0x4d, 0xe9, 0x01, 0xfd, 0xe8, 0x6c, 0x88, 0x61, - 0x27, 0x7d, 0x8e, 0xdc, 0x68, 0xfe, 0x0a, 0x52, 0x24, 0x3c, 0xc2, 0x98, - 0xb5, 0x29, 0x18, 0x74, 0x17, 0x32, 0x9e, 0xcb, 0x93, 0xdc, 0x6a, 0x18, - 0x03, 0x91, 0x4a, 0xc2, 0x23, 0x2d, 0x26, 0xe9, 0xde, 0x7c, 0xcd, 0x18, - 0x69, 0x30, 0x0f, 0x6e, 0x46, 0x87, 0xcf, 0x8c, 0x29, 0xce, 0x0d, 0x1c, - 0xb9, 0xe1, 0x1c, 0x32, 0x58, 0xd9, 0x08, 0x69, 0x21, 0x91, 0x56, 0x3d, - 0x73, 0x02, 0xa4, 0x75, 0x77, 0x79, 0x4b, 0x79, 0x5a, 0x40, 0xb3, 0xc3, - 0x24, 0x90, 0xd0, 0x19, 0x9e, 0x25, 0xf8, 0xd4, 0x58, 0x4b, 0x27, 0xd4, - 0xf0, 0xf2, 0xa1, 0x4c, 0x54, 0xdb, 0x18, 0x73, 0x8e, 0xb4, 0x9f, 0xe2, - 0x93, 0x2a, 0x41, 0xb7, 0x79, 0x58, 0x92, 0xe5, 0xd8, 0x73, 0xeb, 0x28, - 0xf8, 0x09, 0x8a, 0xc4, 0xcf, 0x82, 0x24, 0x4c, 0xa8, 0xfa, 0xb2, 0x2d, - 0x25, 0x80, 0x43, 0xdc, 0xe6, 0x54, 0xf8, 0xec, 0x79, 0xe6, 0xe9, 0x20, - 0xac, 0xf6, 0x9f, 0xaf, 0x1e, 0xa3, 0x3f, 0xef, 0xd0, 0x21, 0x70, 0xd0, - 0x72, 0xf1, 0xfe, 0x56, 0x8d, 0x6b, 0xdd, 0x93, 0x60, 0x3e, 0x91, 0xed, - 0x51, 0x9f, 0x2c, 0x44, 0x44, 0x96, 0x50, 0xc0, 0x1b, 0xc4, 0xf0, 0xcb, - 0x32, 0x0d, 0xd2, 0xae, 0x84, 0x5c, 0xff, 0x4f, 0xd9, 0xb5, 0x43, 0xcd, - 0xb9, 0x6b, 0x05, 0xad, 0x4a, 0x6a, 0xa2, 0xeb, 0x71, 0x14, 0xd0, 0x15, - 0xae, 0x82, 0x34, 0xbd, 0x97, 0xf5, 0x75, 0x3c, 0x6d, 0x0d, 0xd0, 0x43, - 0xa8, 0xb8, 0xb1, 0xce, 0x09, 0xe0, 0x41, 0x44, 0x42, 0x03, 0xcb, 0x8b, - 0xc2, 0x1c, 0xf7, 0xb2, 0x77, 0x82, 0xd5, 0x88, 0x0c, 0x4d, 0x8d, 0x58, - 0x79, 0xe2, 0x56, 0xc9, 0x1d, 0xab, 0xfd, 0x5f, 0xbc, 0x51, 0x42, 0x3d, - 0xb7, 0x1f, 0xba, 0x1d, 0x73, 0x3e, 0xbd, 0x8f, 0x02, 0x9e, 0x41, 0x87, - 0x1b, 0xbe, 0x2f, 0x54, 0x87, 0xd6, 0xaf, 0xd0, 0x12, 0xee, 0xe5, 0x05, - 0xbc, 0x17, 0x75, 0x00, 0x39, 0x9d, 0xd7, 0x18, 0xc1, 0x10, 0x22, 0x84, - 0xae, 0xc9, 0x56, 0xba, 0xb5, 0x43, 0x41, 0x8c, 0xaa, 0x22, 0x87, 0x51, - 0xc9, 0xae, 0x8d, 0x32, 0xc4, 0xf5, 0xc3, 0x20, 0xa8, 0xc9, 0xe7, 0x97, - 0xa7, 0x38, 0xe0, 0xe7, 0x54, 0xfd, 0xeb, 0x71, 0xcc, 0xf0, 0x13, 0x2e, - 0x0a, 0x96, 0xaa, 0xd8, 0x74, 0xa5, 0x8f, 0xad, 0x9d, 0xe8, 0x14, 0x52, - 0x3d, 0x79, 0x69, 0x6f, 0x4c, 0x2c, 0xa1, 0x7c, 0xb4, 0x47, 0x56, 0x32, - 0x81, 0x31, 0xda, 0x6b, 0x0b, 0x74, 0x63, 0x2e, 0x20, 0x54, 0x12, 0x7f, - 0x3e, 0xb0, 0x6d, 0x42, 0x5d, 0x81, 0x87, 0xe0, 0x34, 0x88, 0x6f, 0x09, - 0x8f, 0xff, 0x64, 0x94, 0x71, 0x3e, 0xc9, 0x97, 0xa7, 0x7d, 0x76, 0x33, - 0x62, 0x51, 0xf5, 0x4a, 0x72, 0xb8, 0x04, 0x05, 0x17, 0x91, 0xa0, 0x2b, - 0x94, 0x35, 0x25, 0x52, 0xc0, 0x1e, 0xa3, 0x67, 0xa4, 0x5b, 0x17, 0xb2, - 0x09, 0xb1, 0x95, 0x82, 0x58, 0x65, 0xbc, 0xda, 0x51, 0xa4, 0xf9, 0x54, - 0x16, 0xd2, 0x4f, 0x10, 0xa5, 0x2f, 0x38, 0x92, 0x16, 0xb6, 0xd4, 0xbf, - 0xa7, 0xf2, 0xaf, 0xc8, 0x68, 0xcd, 0x47, 0x89, 0x5b, 0x6d, 0xbc, 0x68, - 0xa0, 0x1a, 0xc3, 0xe5, 0x7b, 0x99, 0x0d, 0x06, 0xac, 0xa3, 0xa1, 0xcf, - 0x6f, 0x11, 0x86, 0x9b, 0x56, 0xe0, 0x7d, 0x0f, 0xde, 0xbd, 0x31, 0x23, - 0x22, 0x73, 0x04, 0x60, 0x41, 0x1e, 0xfe, 0xf5, 0xbe, 0xe4, 0xec, 0x4f, - 0x14, 0x0c, 0x1f, 0x7f, 0xde, 0x11, 0xb4, 0x8a, 0x76, 0x09, 0x83, 0x54, - 0xd9, 0x68, 0x20, 0xb1, 0xe6, 0x2a, 0x33, 0x36, 0x0a, 0x94, 0x11, 0x38, - 0x2b, 0x7c, 0x54, 0x92, 0xfe, 0x74, 0xe2, 0x66, 0x0c, 0xb4, 0x72, 0xd8, - 0x3f, 0x57, 0xfc, 0x8b, 0xe5, 0x4f, 0x70, 0x63, 0x27, 0x62, 0x8c, 0x66, - 0x9a, 0x3b, 0x9c, 0xdd, 0xc8, 0x1c, 0x8e, 0x46, 0x47, 0x36, 0x5f, 0x36, - 0x89, 0xf3, 0xe7, 0x73, 0x7e, 0xc1, 0x7b, 0x3e, 0x16, 0x6f, 0x76, 0x40, - 0x24, 0x80, 0x07, 0x7e, 0x45, 0x66, 0xf7, 0x51, 0xde, 0xb1, 0x51, 0x32, - 0xb4, 0x9e, 0xf6, 0xc0, 0x2c, 0x22, 0x58, 0xc2, 0xb3, 0xf0, 0xd2, 0x6c, - 0xda, 0xa1, 0x54, 0x9c, 0x72, 0xc7, 0x83, 0x31, 0x67, 0x13, 0x37, 0x2b, - 0x58, 0x3e, 0xa7, 0xdc, 0x16, 0x6f, 0xff, 0x70, 0x1a, 0xd5, 0x2b, 0xba, - 0x02, 0x41, 0x8a, 0xd1, 0x5a, 0x19, 0xb2, 0x9a, 0x28, 0xbd, 0x9c, 0x0e, - 0xed, 0x8b, 0xa1, 0xa4, 0x67, 0x83, 0x49, 0x12, 0xbb, 0x73, 0xd4, 0x8d, - 0x89, 0x48, 0x9b, 0xe6, 0xfe, 0xc9, 0x4a, 0x41, 0xca, 0x8c, 0x43, 0xb0, - 0x0d, 0x12, 0x42, 0x58, 0x93, 0xd2, 0x14, 0x35, 0x07, 0x46, 0x47, 0x46, - 0x34, 0xfd, 0x60, 0x4b, 0x23, 0xe8, 0xdc, 0x95, 0x19, 0x95, 0x04, 0x52, - 0xb6, 0xca, 0x89, 0x84, 0xdf, 0x1c, 0x71, 0x4d, 0xd5, 0x58, 0x62, 0x14, - 0x62, 0x05, 0x1f, 0xb0, 0x0e, 0xf1, 0x32, 0x69, 0x9d, 0x65, 0x2f, 0xf1, - 0x18, 0x95, 0xbb, 0x4b, 0xff, 0x19, 0x52, 0xf0, 0xc1, 0x49, 0x18, 0xe3, - 0x84, 0x08, 0x9a, 0xf8, 0x69, 0xfe, 0x13, 0xa6, 0x20, 0x79, 0xaf, 0x22, - 0xb3, 0x32, 0x0f, 0x3d, 0x61, 0xb4, 0xd3, 0xf3, 0xb5, 0xd8, 0x6c, 0x50, - 0x0f, 0x82, 0x3a, 0x4b, 0x84, 0x85, 0xa7, 0x8f, 0xc5, 0x21, 0xd2, 0x7e, - 0x84, 0xbe, 0x2a, 0xec, 0xb5, 0x88, 0x05, 0xb2, 0x21, 0x13, 0x0b, 0x6b, - 0x1a, 0x95, 0xb3, 0xd9, 0xe5, 0x24, 0xde, 0xe6, 0x18, 0x27, 0x97, 0x71, - 0x31, 0xb4, 0x15, 0x59, 0xfc, 0x25, 0x20, 0x5f, 0xef, 0xea, 0x96, 0x9f, - 0x54, 0x79, 0x06, 0xd3, 0x19, 0xe0, 0xcd, 0x64, 0x05, 0x4a, 0x17, 0x14, - 0xa3, 0x11, 0x94, 0xc7, 0xc1, 0x94, 0x34, 0x85, 0xc3, 0xa6, 0x3f, 0xf9, - 0xd9, 0x9f, 0xc8, 0xfe, 0x2c, 0xb2, 0x2c, 0x70, 0x4a, 0x7d, 0xef, 0xb8, - 0x0c, 0xfd, 0x85, 0x77, 0x5d, 0x5e, 0x2c, 0x20, 0x50, 0x69, 0x8d, 0xdc, - 0x6d, 0xa7, 0x01, 0x30, 0xcf, 0x32, 0x7a, 0x04, 0x18, 0xbc, 0x31, 0x65, - 0x36, 0x29, 0x8e, 0xc3, 0xbd, 0xc8, 0xb6, 0xc4, 0xc1, 0x48, 0xc8, 0x6f, - 0x4e, 0x27, 0xc2, 0xb8, 0xff, 0x19, 0x8b, 0x5a, 0x04, 0x8b, 0x66, 0x57, - 0x11, 0x73, 0xd6, 0xeb, 0xf9, 0xb1, 0x81, 0x42, 0xb0, 0x35, 0xb9, 0x71, - 0x40, 0xae, 0xca, 0x46, 0xe4, 0xfe, 0x75, 0x88, 0xb9, 0x8e, 0xf1, 0x85, - 0x77, 0x7b, 0x33, 0x0c, 0x33, 0x55, 0x2b, 0xaf, 0x85, 0x3b, 0x97, 0xac, - 0x61, 0x76, 0x92, 0xda, 0xa5, 0xc7, 0xda, 0xfa, 0x29, 0xc3, 0x4a, 0x6f, - 0x72, 0x58, 0x6b, 0x77, 0x13, 0x25, 0xae, 0x8e, 0x46, 0x34, 0xc6, 0x12, - 0x93, 0x8b, 0x51, 0x6b, 0xab, 0x2f, 0x42, 0xc2, 0x38, 0x2a, 0xc8, 0x32, - 0x63, 0x99, 0xaa, 0x4c, 0xbc, 0xec, 0x48, 0xe5, 0x61, 0xc8, 0x21, 0x02, - 0x89, 0xff, 0x5a, 0x62, 0xea, 0x06, 0xd2, 0x6e, 0xcb, 0x0d, 0xeb, 0x86, - 0x37, 0x1f, 0x09, 0x65, 0x30, 0xb9, 0x31, 0x99, 0x26, 0x22, 0x6b, 0x86, - 0x09, 0xf6, 0x87, 0xdb, 0x27, 0x54, 0xa7, 0x9b, 0xf6, 0x4c, 0xb7, 0xe8, - 0x19, 0x6f, 0x96, 0x5c, 0x7e, 0x0c, 0x15, 0x9e, 0x4a, 0xd7, 0x3a, 0x3a, - 0xe2, 0xcc, 0x38, 0xe7, 0x16, 0x0c, 0x2b, 0xe7, 0x6e, 0xff, 0x6f, 0x64, - 0x26, 0x26, 0x08, 0x96, 0x19, 0x43, 0x75, 0x99, 0x19, 0x1d, 0xfa, 0xa2, - 0x18, 0xd6, 0xdb, 0xc1, 0x41, 0xae, 0xaf, 0xb4, 0x97, 0x49, 0x49, 0xca, - 0x1a, 0xf5, 0x1d, 0x57, 0x6a, 0x9b, 0x88, 0x0d, 0xf4, 0xe4, 0xa1, 0xb9, - 0xb8, 0x9d, 0x10, 0x2d, 0x2d, 0x28, 0x8e, 0x52, 0x7c, 0x5e, 0x30, 0xf4, - 0xfe, 0x2e, 0x49, 0xff, 0x5a, 0xa9, 0x05, 0xf8, 0x99, 0x7d, 0x73, 0x80, - 0x6c, 0x26, 0x5e, 0x23, 0xcb, 0xad, 0x64, 0xbd, 0xbb, 0xfb, 0xb8, 0x6a, - 0x57, 0xc5, 0x73, 0x8b, 0xac, 0x03, 0xad, 0xe3, 0xf2, 0x12, 0xfb, 0x31, - 0x8f, 0x09, 0x52, 0x34, 0x8d, 0xab, 0x59, 0xe2, 0x56, 0x41, 0xfc, 0x89, - 0x5f, 0x58, 0x6e, 0xd5, 0xa1, 0xf7, 0xd9, 0xd5, 0x83, 0xb4, 0x3a, 0xf9, - 0xab, 0x86, 0x05, 0xa3, 0xb6, 0xe7, 0x02, 0x29, 0x85, 0x14, 0x4a, 0x81, - 0x21, 0x9e, 0xb2, 0xcd, 0xe3, 0xe6, 0xa8, 0xc5, 0x16, 0x69, 0xe2, 0x99, - 0x6d, 0x12, 0x22, 0x0b, 0x3c, 0xa8, 0xfa, 0x39, 0x3b, 0x3d, 0xf3, 0xfa, - 0x24, 0x60, 0x4d, 0x59, 0xe0, 0x6d, 0x99, 0x5a, 0x8e, 0x12, 0xd9, 0x34, - 0x6d, 0x4e, 0x45, 0x36, 0xcc, 0xa7, 0x05, 0xae, 0x7b, 0xfd, 0xeb, 0xcf, - 0xb1, 0xa9, 0xca, 0xce, 0x73, 0xb4, 0x4b, 0x48, 0x21, 0xca, 0x74, 0x79, - 0x31, 0xb6, 0xda, 0x13, 0xdc, 0xa4, 0x40, 0x4d, 0x70, 0x88, 0xed, 0xa2, - 0xc0, 0x36, 0x92, 0xf7, 0x40, 0x23, 0x19, 0x58, 0x30, 0xca, 0xd6, 0xde, - 0xb3, 0xef, 0x6b, 0xeb, 0x43, 0xa8, 0x18, 0x92, 0x27, 0xa5, 0xb0, 0xb8, - 0x36, 0x3e, 0xc8, 0x20, 0x4d, 0xc0, 0xa0, 0x78, 0x24, 0x45, 0x8a, 0x40, - 0xa3, 0x3b, 0x95, 0xd2, 0xed, 0x23, 0x47, 0xde, 0x8a, 0x19, 0x82, 0x82, - 0x62, 0x62, 0x19, 0xa7, 0xca, 0x90, 0xbc, 0x26, 0xd9, 0xce, 0x83, 0xd9, - 0x37, 0x11, 0xef, 0x18, 0xe8, 0x42, 0x23, 0x0b, 0xfb, 0x52, 0x87, 0x87, - 0x13, 0xe0, 0xc3, 0xa0, 0xb9, 0x04, 0x09, 0x3c, 0x41, 0x6a, 0x06, 0xbf, - 0xf2, 0x25, 0x5a, 0x17, 0x88, 0x93, 0x79, 0x52, 0x38, 0xd9, 0x73, 0x3f, - 0xfe, 0x69, 0xd9, 0xd3, 0xc9, 0x47, 0x1a, 0x14, 0x86, 0xdc, 0x17, 0x25, - 0x13, 0x9e, 0x2a, 0xad, 0x64, 0x05, 0x5e, 0xff, 0x0d, 0xee, 0x73, 0x7d, - 0xeb, 0x3d, 0xf3, 0x40, 0x62, 0x1c, 0x8e, 0xc7, 0x60, 0x43, 0xd8, 0x81, - 0x30, 0x13, 0xe4, 0x64, 0x74, 0x04, 0x56, 0x2c, 0xfd, 0xa9, 0x01, 0x7d, - 0x42, 0x85, 0xec, 0x62, 0xf8, 0x51, 0x0f, 0xad, 0xae, 0xf3, 0x66, 0x6c, - 0x0a, 0x8c, 0x97, 0x47, 0xb3, 0xad, 0x0a, 0x7b, 0x00, 0x47, 0x44, 0x11, - 0x77, 0xcd, 0x55, 0xc0, 0x85, 0xb5, 0xd0, 0xb0, 0x33, 0xc5, 0x32, 0xe9, - 0x5e, 0x52, 0xc7, 0xd2, 0x42, 0xc1, 0xd6, 0xed, 0x54, 0xac, 0x1f, 0x7c, - 0x7a, 0xf0, 0x8f, 0x20, 0x3a, 0x77, 0xff, 0xcd, 0x14, 0xac, 0x90, 0xbf, - 0x9f, 0xd8, 0x25, 0x2e, 0x00, 0x2f, 0xae, 0x9e, 0xb9, 0x12, 0xc5, 0x85, - 0x11, 0x05, 0x74, 0xeb, 0x3a, 0x69, 0x2c, 0x09, 0x7c, 0x7f, 0x05, 0xa7, - 0x24, 0x3e, 0xf6, 0x25, 0xe3, 0x09, 0xc3, 0x0c, 0x39, 0x72, 0x06, 0x5c, - 0x8d, 0x64, 0x3e, 0xde, 0xf0, 0xed, 0xcb, 0x46, 0xee, 0x8e, 0x6c, 0x34, - 0xac, 0x2b, 0x55, 0xe7, 0xaf, 0x69, 0xfc, 0x23, 0xc3, 0x47, 0x90, 0x4b, - 0x0c, 0xab, 0x06, 0x07, 0xed, 0x97, 0xeb, 0x36, 0x0f, 0x5c, 0x5f, 0xaa, - 0x67, 0x3c, 0xc5, 0xca, 0x4a, 0x45, 0x2d, 0x2a, 0x14, 0xc5, 0x87, 0x5e, - 0xce, 0x39, 0x3d, 0x62, 0xbd, 0x9a, 0xf1, 0xea, 0x9a, 0xdb, 0x15, 0x0f, - 0x91, 0x81, 0xff, 0x83, 0xe7, 0x42, 0xd5, 0xf2, 0x2e, 0x27, 0xf0, 0x54, - 0x7e, 0xa4, 0x87, 0xf4, 0xb9, 0x17, 0xbd, 0xe1, 0x7e, 0xd1, 0xfa, 0xcb, - 0x93, 0x92, 0x5e, 0xf2, 0x4f, 0xd3, 0xc8, 0x2d, 0xb2, 0x4c, 0xaf, 0x7a, - 0xe3, 0x15, 0x9d, 0x89, 0x3f, 0x2f, 0x16, 0x77, 0x28, 0x51, 0xe8, 0x3a, - 0xfa, 0x19, 0xc4, 0xc7, 0xbd, 0xca, 0x75, 0x37, 0x35, 0x2b, 0xb6, 0xf7, - 0xd2, 0x3d, 0xbc, 0xe4, 0x08, 0x03, 0x02, 0x1f, 0xa5, 0x71, 0x4c, 0x70, - 0x08, 0x34, 0x7f, 0x00, 0x4b, 0x49, 0x6e, 0x57, 0x6c, 0x59, 0xf1, 0x67, - 0xbe, 0x03, 0x21, 0xe4, 0xdb, 0xfc, 0x7c, 0xdc, 0x9a, 0xdd, 0x53, 0x40, - 0x57, 0x6a, 0xc7, 0x83, 0x06, 0x44, 0xed, 0x72, 0xc2, 0x89, 0xc1, 0x58, - 0xe5, 0x5b, 0x00, 0x93, 0xfa, 0x4f, 0x84, 0x64, 0xe1, 0xba, 0x15, 0x66, - 0x6f, 0x91, 0x9a, 0x1e, 0x37, 0x3b, 0xdb, 0x58, 0x83, 0x1c, 0x6a, 0x31, - 0x4c, 0x32, 0xef, 0xee, 0xd4, 0x6e, 0xfe, 0x7e, 0xbd, 0xdf, 0x82, 0x80, - 0x0a, 0x23, 0xa9, 0x08, 0xc6, 0x34, 0x48, 0xe7, 0x2b, 0xd7, 0x89, 0xc1, - 0x9b, 0xd0, 0x02, 0x29, 0xe2, 0x2d, 0x1b, 0x11, 0x69, 0x55, 0x30, 0x4f, - 0x2c, 0xe9, 0x2b, 0xf3, 0x8a, 0xd6, 0xbb, 0xe0, 0x80, 0x3f, 0xc2, 0xac, - 0xdd, 0x1d, 0x73, 0x25, 0x9d, 0xbc, 0x11, 0x8c, 0xa4, 0xf1, 0x9e, 0x6d, - 0xac, 0x1c, 0x07, 0xbc, 0x1d, 0x9b, 0x36, 0xfc, 0xe7, 0x46, 0xd5, 0xe2, - 0x7f, 0xbf, 0x83, 0xe1, 0x70, 0xe6, 0xa1, 0x16, 0x94, 0xac, 0xda, 0x70, - 0x3d, 0x04, 0x80, 0x17, 0x95, 0x10, 0xe2, 0x8b, 0xe4, 0x8d, 0xf6, 0x13, - 0xe3, 0xe8, 0x24, 0xd3, 0x7e, 0x44, 0x96, 0xd1, 0xf3, 0xe0, 0x7e, 0x24, - 0x6d, 0xc7, 0x3c, 0x30, 0xff, 0x03, 0x7f, 0xe0, 0xfb, 0xe3, 0xaf, 0xaa, - 0x53, 0x85, 0x98, 0xff, 0xd8, 0x31, 0x98, 0xf6, 0x2c, 0x86, 0x8d, 0x1f, - 0x7d, 0xd8, 0x6c, 0x17, 0x22, 0x6f, 0xd8, 0x73, 0x04, 0x3b, 0x62, 0x96, - 0x82, 0x48, 0x62, 0x23, 0xb9, 0x76, 0xed, 0xd5, 0x70, 0x57, 0x07, 0x82, - 0x77, 0x28, 0x23, 0xd2, 0xe0, 0x65, 0x04, 0xb1, 0x60, 0x3f, 0x75, 0xcb, - 0x8a, 0x0f, 0x0d, 0xfa, 0x87, 0xa9, 0x0d, 0x0e, 0xc1, 0x5b, 0x20, 0x4d, - 0x39, 0xc6, 0x30, 0x37, 0x6a, 0x6c, 0x42, 0x91, 0x24, 0x54, 0xe0, 0xeb, - 0x17, 0x23, 0x43, 0x35, 0x7b, 0x73, 0x18, 0x6c, 0x75, 0xa4, 0x1f, 0x75, - 0xc0, 0x2a, 0xf2, 0x52, 0x1f, 0xdf, 0xbd, 0x2e, 0x3d, 0xbf, 0x00, 0x5f, - 0xc9, 0x01, 0x8a, 0xc3, 0x96, 0x9c, 0x78, 0xac, 0x90, 0xba, 0x0a, 0x10, - 0x0f, 0x06, 0x83, 0xd4, 0x6f, 0x0a, 0xc7, 0x1d, 0x14, 0x21, 0x27, 0xe6, - 0xc8, 0x0c, 0xc6, 0x67, 0x77, 0xa8, 0x87, 0x94, 0x1b, 0xb0, 0x0b, 0xee, - 0xf8, 0xb8, 0xea, 0x64, 0x7f, 0xd6, 0x7f, 0xfd, 0x20, 0x77, 0xe1, 0x97, - 0xae, 0xa1, 0x70, 0xca, 0x15, 0x64, 0xcc, 0x25, 0xc2, 0x20, 0x40, 0x19, - 0x12, 0x32, 0x0d, 0xb1, 0x64, 0xaf, 0x33, 0x9d, 0xd3, 0x5b, 0xea, 0x41, - 0x21, 0xe4, 0xd1, 0xca, 0x11, 0x5c, 0x45, 0x86, 0xdb, 0xab, 0x39, 0xa5, - 0x85, 0xaa, 0xa5, 0x60, 0x5e, 0x6d, 0xf5, 0x1e, 0xab, 0x2c, 0xc7, 0x5f, - 0x34, 0x6d, 0x9d, 0xab, 0x3b, 0x2e, 0x36, 0xd1, 0xb1, 0xca, 0xec, 0xc4, - 0x9f, 0x9b, 0x8c, 0xd3, 0x70, 0xe9, 0x34, 0xcc, 0x07, 0x89, 0xa6, 0x09, - 0xae, 0x31, 0xd4, 0x83, 0x80, 0xfd, 0x5e, 0xa4, 0x17, 0x99, 0xef, 0x2c, - 0xce, 0xb0, 0xf4, 0x23, 0x4f, 0x4f, 0x74, 0xcf, 0xf6, 0x43, 0xf0, 0x71, - 0x28, 0x57, 0x08, 0xc7, 0x35, 0xb9, 0x51, 0xb3, 0x21, 0x6a, 0x3c, 0xec, - 0xf3, 0xb2, 0x56, 0xef, 0x01, 0x13, 0xbf, 0x62, 0x7d, 0xae, 0xee, 0x3a, - 0x6c, 0x9c, 0x49, 0xea, 0xb9, 0x4c, 0xe4, 0xef, 0x37, 0x49, 0xd0, 0x36, - 0x27, 0xea, 0xdc, 0x65, 0xa8, 0xf2, 0x83, 0xac, 0xa7, 0xe6, 0x10, 0x37, - 0xc2, 0x61, 0xf8, 0x3b, 0x44, 0xa7, 0xc3, 0x14, 0x39, 0x05, 0x6c, 0xf5, - 0x9f, 0x3b, 0xc9, 0x0b, 0x7f, 0xf4, 0x62, 0x79, 0xc6, 0x84, 0xbf, 0x08, - 0x39, 0xc0, 0xe2, 0x63, 0xbe, 0x98, 0x25, 0xdb, 0xe7, 0x6a, 0xd3, 0xe1, - 0xfb, 0xdd, 0x7c, 0xf1, 0xea, 0x39, 0x33, 0xf5, 0x5b, 0x43, 0x87, 0xf0, - 0x43, 0xdc, 0x04, 0x02, 0x6e, 0xc9, 0xcd, 0xd1, 0x44, 0x09, 0x8e, 0x59, - 0x9b, 0x5a, 0x26, 0x18, 0x55, 0x25, 0x85, 0xbb, 0x95, 0x22, 0xaf, 0xeb, - 0xc8, 0xe1, 0xbc, 0x87, 0x55, 0x4b, 0x75, 0xe6, 0x3b, 0x35, 0x55, 0xa2, - 0x05, 0x53, 0x4a, 0x18, 0x6e, 0x4a, 0x91, 0x73, 0x2f, 0xaf, 0x15, 0xac, - 0xcd, 0x32, 0xbf, 0xbc, 0xd7, 0xda, 0xe5, 0x9f, 0x41, 0xbd, 0xc6, 0xc8, - 0x6e, 0xc2, 0xbd, 0xf8, 0x84, 0x25, 0x9b, 0xf0, 0x62, 0x20, 0x21, 0x5e, - 0x9f, 0x5f, 0xdd, 0xb5, 0x49, 0x1f, 0xcb, 0x8f, 0xa1, 0x64, 0x23, 0x0a, - 0xa7, 0x66, 0x7b, 0x71, 0x10, 0x7e, 0x6f, 0x28, 0x16, 0x45, 0x7a, 0xdc, - 0x80, 0xdc, 0x9b, 0x35, 0xa5, 0x2f, 0xcf, 0x22, 0x8c, 0xe3, 0xb3, 0x8b, - 0xa1, 0xf5, 0x3f, 0xcb, 0x3a, 0xd1, 0xb9, 0xee, 0xd5, 0x5f, 0xc8, 0x19, - 0x00, 0x38, 0x9c, 0x74, 0x32, 0x8a, 0xdc, 0x2e, 0x37, 0x0d, 0x63, 0x71, - 0x45, 0xa2, 0x0f, 0xc7, 0xee, 0x25, 0xe2, 0xe0, 0x61, 0xd5, 0x96, 0xa5, - 0x4a, 0x7d, 0xc0, 0x8c, 0x6e, 0x12, 0x0a, 0x2e, 0xfb, 0x55, 0x81, 0x9c, - 0x0a, 0xb8, 0xe1, 0x48, 0x70, 0x3c, 0xa5, 0x41, 0xd7, 0x1b, 0x35, 0xc3, - 0x9b, 0x99, 0x8a, 0x0c, 0xc8, 0x07, 0xba, 0x10, 0x44, 0x20, 0xa2, 0x5b, - 0xc6, 0x63, 0x0b, 0x7a, 0x66, 0x7e, 0x1a, 0x9f, 0x2c, 0x26, 0x44, 0x27, - 0x29, 0x66, 0xfc, 0x31, 0x60, 0x58, 0xd1, 0x5b, 0xae, 0x39, 0xb6, 0x10, - 0xf1, 0xe9, 0x68, 0xba, 0xd7, 0xbf, 0x74, 0x92, 0x3b, 0xc8, 0x9c, 0x73, - 0x34, 0xd6, 0x79, 0x50, 0x21, 0x73, 0x41, 0x2b, 0xa6, 0xe0, 0x64, 0xd0, - 0xa4, 0x74, 0x54, 0x56, 0x85, 0xe8, 0x7c, 0x72, 0x69, 0x8c, 0x62, 0x7d, - 0x19, 0xfa, 0xde, 0x89, 0xe1, 0x82, 0x09, 0x6f, 0xc0, 0x57, 0xe4, 0x24, - 0xa6, 0x27, 0x5a, 0xbc, 0x61, 0x7b, 0xc4, 0x04, 0xe8, 0xfc, 0x0e, 0x76, - 0x4a, 0x75, 0x14, 0x9e, 0x95, 0x38, 0x74, 0xae, 0xc9, 0x90, 0xdc, 0xe4, - 0x6e, 0xf7, 0xe5, 0x1a, 0x05, 0xaf, 0x9f, 0xc9, 0xc1, 0x5b, 0x72, 0x90, - 0x6d, 0x64, 0x2f, 0x80, 0x92, 0xf3, 0xdf, 0x83, 0xa4, 0x91, 0xed, 0xcd, - 0x85, 0x0f, 0x27, 0x74, 0xc7, 0x86, 0x76, 0x3d, 0xfd, 0x77, 0x82, 0xc8, - 0xa4, 0xd8, 0x8f, 0x5a, 0x89, 0xa4, 0xac, 0xa9, 0x21, 0xae, 0x54, 0xd2, - 0x46, 0xd8, 0x1c, 0xbb, 0x3b, 0x90, 0x92, 0xc6, 0x26, 0xbb, 0xf2, 0xfa, - 0x69, 0xc5, 0xc9, 0x1c, 0x68, 0x59, 0xc1, 0x43, 0xfe, 0x1d, 0xed, 0x37, - 0xee, 0xac, 0xb1, 0x31, 0xa2, 0xb9, 0x0f, 0xe2, 0x7c, 0x5d, 0xd8, 0x32, - 0x17, 0xd1, 0xf6, 0x20, 0xf4, 0x75, 0xa1, 0xcc, 0xe7, 0x38, 0x2d, 0x9e, - 0x8a, 0xb2, 0x4c, 0x99, 0xab, 0xed, 0xd1, 0xce, 0xc8, 0x83, 0x48, 0x37, - 0xbd, 0x22, 0x39, 0xf9, 0xeb, 0x3f, 0x6a, 0x3b, 0xb5, 0xfa, 0x27, 0x7d, - 0xc0, 0x36, 0x2d, 0x3a, 0x04, 0x01, 0x64, 0xf4, 0x38, 0xd8, 0x1b, 0x63, - 0xc5, 0x3a, 0x28, 0x84, 0x59, 0x07, 0xe5, 0xc5, 0xd2, 0xd5, 0xe7, 0x91, - 0x84, 0x43, 0x7f, 0xa8, 0xeb, 0xc5, 0x94, 0x2a, 0xb3, 0x15, 0x0d, 0x28, - 0xf3, 0x37, 0xdb, 0xc7, 0x80, 0x8f, 0x3d, 0x43, 0x5b, 0xc7, 0x85, 0x0b, - 0x79, 0x1e, 0x2c, 0x7c, 0xbe, 0x28, 0x1d, 0x5d, 0x15, 0x90, 0x48, 0x3a, - 0x64, 0xf3, 0x21, 0x00, 0xf8, 0x2d, 0x0e, 0xb7, 0x6d, 0x77, 0x06, 0x27, - 0x7d, 0xe4, 0x0d, 0x6e, 0x15, 0x9f, 0x28, 0x88, 0x93, 0xc8, 0x17, 0xd2, - 0x9b, 0xc7, 0x0c, 0x6a, 0x6a, 0x63, 0x90, 0xd2, 0x96, 0xfd, 0x91, 0xeb, - 0xfd, 0x14, 0x92, 0xb9, 0x50, 0x47, 0x86, 0xe3, 0x58, 0xf9, 0x97, 0xcb, - 0x80, 0xbc, 0xc7, 0x5e, 0xbf, 0x94, 0x4c, 0x2d, 0x6f, 0x13, 0x50, 0xd3, - 0x25, 0x58, 0x81, 0x0d, 0xcc, 0x4f, 0x0d, 0x28, 0x4d, 0x82, 0xc0, 0x16, - 0x42, 0x18, 0x58, 0x69, 0xa3, 0x42, 0xd3, 0x20, 0x99, 0x35, 0xb7, 0x9a, - 0xd4, 0x16, 0x15, 0xdb, 0xeb, 0x80, 0xfc, 0xdb, 0x06, 0x23, 0x60, 0xc9, - 0xc5, 0xbb, 0xbd, 0x4f, 0xca, 0xff, 0x9b, 0x80, 0xae, 0x8c, 0xeb, 0x0c, - 0x04, 0xc0, 0xfb, 0x20, 0x28, 0x68, 0x46, 0xa9, 0xcf, 0xb2, 0xec, 0x31, - 0xb1, 0x4c, 0xca, 0x06, 0x03, 0x38, 0x99, 0x9f, 0x9a, 0xb3, 0x40, 0x56, - 0xec, 0x9d, 0x11, 0xc0, 0x77, 0x11, 0x5a, 0xa1, 0x6b, 0x51, 0x70, 0x00, - 0x5c, 0x42, 0x13, 0xe9, 0xc4, 0x94, 0x4e, 0x18, 0xe7, 0x3a, 0xd5, 0xae, - 0x2d, 0x0b, 0x3d, 0x4f, 0xcd, 0xc7, 0xd6, 0x14, 0x05, 0x49, 0xea, 0x09, - 0x99, 0x0e, 0x14, 0xd6, 0x39, 0x20, 0xbc, 0x3e, 0xb9, 0x8f, 0xee, 0x0c, - 0xd4, 0x12, 0x36, 0x7e, 0x71, 0x2b, 0x05, 0x74, 0x2b, 0x77, 0x36, 0x8b, - 0x2c, 0xc9, 0xe3, 0x43, 0xbc, 0x63, 0xf3, 0x05, 0xce, 0xd3, 0x35, 0x4f, - 0xb7, 0x91, 0x39, 0x4a, 0x1d, 0x10, 0x87, 0xf3, 0xdc, 0x67, 0xa5, 0xa6, - 0x0f, 0x04, 0xd7, 0x7e, 0x1c, 0xc8, 0x26, 0x07, 0xc8, 0xb3, 0x81, 0x28, - 0xe4, 0x62, 0x99, 0x48, 0x89, 0xad, 0x1a, 0x7b, 0x17, 0xf4, 0x26, 0xc4, - 0x2a, 0xa2, 0xd5, 0xe3, 0xa8, 0x9a, 0xf0, 0x07, 0x28, 0x67, 0xa6, 0x0b, - 0x6d, 0x20, 0x8a, 0x7f, 0xd1, 0x18, 0x1c, 0x1d, 0x8b, 0xcf, 0x18, 0xbc, - 0x5b, 0x97, 0x94, 0x03, 0xd1, 0xe0, 0xe5, 0x82, 0x6a, 0x87, 0xa2, 0x06, - 0xa1, 0x4d, 0xe4, 0x3c, 0xa0, 0x5d, 0xf8, 0xaa, 0x01, 0xcc, 0xa9, 0xf2, - 0x25, 0xbf, 0x17, 0x5b, 0xc2, 0xcb, 0x58, 0x61, 0xdf, 0xb6, 0x7b, 0x77, - 0xb0, 0x04, 0x10, 0x2e, 0x21, 0xfe, 0x46, 0x73, 0xe6, 0xc8, 0x69, 0x88, - 0xc6, 0x5c, 0xb4, 0x31, 0x04, 0x95, 0x7c, 0xb5, 0x2d, 0x23, 0x45, 0x14, - 0x25, 0xea, 0xfc, 0xe7, 0xe8, 0x71, 0x7e, 0xd4, 0x4e, 0x06, 0x20, 0x9b, - 0xae, 0x4b, 0x20, 0x7e, 0x55, 0x0a, 0x7d, 0x92, 0xcc, 0xdf, 0xbf, 0xbe, - 0x57, 0x5e, 0x33, 0xba, 0xcf, 0x4b, 0x79, 0x47, 0x52, 0x53, 0x41, 0xa1, - 0x25, 0x4e, 0x9c, 0x12, 0x61, 0xcc, 0x40, 0x67, 0xda, 0xc7, 0x8b, 0x2d, - 0x18, 0xd6, 0x90, 0x08, 0x19, 0x05, 0x2c, 0x72, 0xc7, 0x67, 0xb8, 0x99, - 0x17, 0x3e, 0x23, 0x0a, 0xe8, 0x9a, 0x97, 0x54, 0xdf, 0x3a, 0x6c, 0x81, - 0x8c, 0xcd, 0xf7, 0x1a, 0x46, 0xf7, 0x4b, 0xfd, 0x76, 0x25, 0x03, 0x2a, - 0xe1, 0x67, 0xbc, 0x51, 0xfc, 0x2a, 0xd4, 0x68, 0xeb, 0x48, 0x4c, 0x11, - 0x1e, 0xfa, 0xbb, 0x4b, 0xe1, 0x75, 0x39, 0xb3, 0x78, 0x1b, 0x1a, 0x9a, - 0x08, 0xd9, 0xe8, 0xdc, 0xf2, 0xd1, 0x0c, 0x65, 0x65, 0x7a, 0x67, 0x1c, - 0x5b, 0x45, 0xd7, 0x60, 0x8d, 0xdf, 0x41, 0x37, 0x4e, 0x9d, 0x26, 0xc3, - 0x45, 0xe7, 0x29, 0xc4, 0x66, 0x7c, 0xb1, 0x90, 0x5f, 0xea, 0xc8, 0xf4, - 0x99, 0x62, 0xb0, 0x20, 0x5a, 0x81, 0x09, 0x7d, 0x05, 0xb1, 0x54, 0x1f, - 0x39, 0xbe, 0x13, 0x91, 0x06, 0x18, 0x3c, 0x0f, 0x3c, 0xfe, 0x36, 0x6f, - 0x9a, 0x95, 0xa8, 0x7b, 0x78, 0x93, 0x91, 0xb5, 0x67, 0x1b, 0x21, 0x4b, - 0x77, 0x46, 0x53, 0x1c, 0xf2, 0x10, 0xce, 0xd9, 0xe6, 0x26, 0x1d, 0xd9, - 0xdc, 0x5e, 0x38, 0xc2, 0x6e, 0xab, 0x70, 0xf8, 0xeb, 0x80, 0xbe, 0x8c, - 0x7a, 0x05, 0x9e, 0x2d, 0x3d, 0x31, 0xb7, 0x1f, 0x6d, 0x94, 0xb7, 0xaa, - 0x6c, 0x65, 0x07, 0x68, 0x83, 0xc2, 0x6f, 0xd7, 0x3c, 0xd5, 0xd2, 0x31, - 0xed, 0xd1, 0x84, 0x59, 0x1f, 0xf7, 0x76, 0x6e, 0x68, 0x15, 0x29, 0xa0, - 0x5b, 0x02, 0xd2, 0x18, 0xcd, 0x64, 0x43, 0xff, 0x42, 0x71, 0x46, 0x15, - 0x64, 0x1a, 0xd4, 0x3d, 0xc3, 0xec, 0x78, 0x2a, 0x6d, 0xdb, 0x61, 0x1f, - 0x6b, 0x32, 0x2c, 0xfd, 0x82, 0x41, 0x48, 0xc5, 0x46, 0x15, 0x9f, 0x0a, - 0xec, 0xd4, 0x5b, 0x91, 0xf0, 0x57, 0x76, 0x1d, 0x7c, 0x62, 0xff, 0x2b, - 0xc8, 0x40, 0xd0, 0xe5, 0x65, 0x0b, 0x20, 0xa5, 0x6e, 0x87, 0xbe, 0xb6, - 0x03, 0xed, 0x19, 0xee, 0x10, 0xf1, 0xea, 0x49, 0x61, 0x67, 0x73, 0x08, - 0xde, 0xff, 0xcb, 0x61, 0x45, 0x4b, 0xef, 0xd1, 0xa7, 0xd1, 0x87, 0xad, - 0xf7, 0x02, 0xc8, 0xd6, 0x01, 0xd1, 0x9b, 0xf6, 0x3e, 0x9f, 0x85, 0x97, - 0x99, 0x2e, 0x58, 0x75, 0xe1, 0xa5, 0x06, 0x40, 0x5b, 0xfd, 0x52, 0xbd, - 0x33, 0x55, 0xb0, 0x40, 0x64, 0x89, 0xeb, 0x78, 0x16, 0xc4, 0xc7, 0x5f, - 0xf5, 0x93, 0x4b, 0x58, 0x73, 0x94, 0x09, 0x5e, 0x07, 0x1d, 0xb6, 0x3a, - 0xb9, 0x8b, 0x97, 0x9b, 0xc6, 0x19, 0xc6, 0xf8, 0x53, 0xb5, 0xb1, 0x05, - 0xf5, 0xf7, 0xf3, 0x0b, 0xf3, 0x02, 0xee, 0x3b, 0xc6, 0x5a, 0xe7, 0xdd, - 0x20, 0xa2, 0x93, 0x8d, 0xc9, 0x08, 0xfe, 0x6f, 0x4a, 0x28, 0xfb, 0x23, - 0xc7, 0x8d, 0xa0, 0x09, 0x69, 0x19, 0xd9, 0xa8, 0x8f, 0x65, 0xad, 0x7d, - 0x17, 0xdc, 0xd2, 0xfd, 0xfc, 0x0c, 0x17, 0xad, 0x4e, 0x59, 0x06, 0xb4, - 0x2f, 0xe2, 0xcd, 0xa1, 0x05, 0x4c, 0xbc, 0xcb, 0x12, 0xc0, 0xb3, 0x7e, - 0x9b, 0x8d, 0x1b, 0xb6, 0x12, 0xcc, 0xef, 0xf4, 0x99, 0x3c, 0x0e, 0x41, - 0x17, 0x51, 0xa4, 0x2e, 0x18, 0x48, 0xc9, 0x86, 0x51, 0xb8, 0x21, 0xac, - 0x8c, 0x76, 0xf7, 0x76, 0x70, 0x82, 0xc7, 0x7d, 0x83, 0x8f, 0xbd, 0x03, - 0x76, 0x55, 0xf3, 0xcd, 0x6d, 0xb7, 0x69, 0x9b, 0x26, 0xc6, 0x07, 0xb9, - 0x9a, 0xc9, 0x38, 0xa1, 0x1c, 0x59, 0xc7, 0x83, 0x7e, 0x55, 0x71, 0x9f, - 0x29, 0x0f, 0xfb, 0xc1, 0x0a, 0xf1, 0x0c, 0x65, 0xc3, 0x5a, 0x81, 0xdb, - 0xc3, 0x20, 0xab, 0x11, 0x38, 0x19, 0x29, 0x18, 0x1e, 0x1d, 0xf5, 0x28, - 0xe3, 0x48, 0x2b, 0x2b, 0x0d, 0x84, 0x87, 0xa3, 0x8d, 0xcd, 0x95, 0x92, - 0x5d, 0x80, 0x85, 0xc7, 0xf2, 0x1a, 0x1d, 0x32, 0x08, 0x30, 0x2a, 0x32, - 0x99, 0xa8, 0xcb, 0x53, 0xf1, 0xbd, 0x5d, 0x07, 0x08, 0x80, 0xa3, 0x94, - 0x85, 0x2c, 0x59, 0x8b, 0x39, 0x6c, 0x69, 0xed, 0x60, 0xfd, 0xbb, 0xc2, - 0x52, 0xce, 0x39, 0xf8, 0xca, 0x8b, 0x2c, 0xa2, 0xac, 0x09, 0x86, 0xd3, - 0xd7, 0x26, 0x1c, 0xcc, 0x65, 0xb9, 0x16, 0x74, 0xa9, 0x8d, 0xc6, 0x10, - 0xd7, 0xd1, 0x5f, 0x83, 0x43, 0xb4, 0x66, 0x9f, 0xae, 0xf3, 0x50, 0x4c, - 0x34, 0xcd, 0x72, 0x40, 0x80, 0xef, 0x02, 0xab, 0x36, 0x1e, 0x88, 0x59, - 0x37, 0x3d, 0xcf, 0x6f, 0xc3, 0xca, 0x71, 0x57, 0xc0, 0x25, 0x96, 0x4f, - 0xec, 0x82, 0x6a, 0x6c, 0xa9, 0xcc, 0x67, 0xd2, 0x48, 0xc7, 0xe9, 0x92, - 0xb2, 0x6e, 0x9a, 0x4c, 0xab, 0xd6, 0x90, 0x9f, 0x9c, 0x3c, 0x60, 0x61, - 0x6f, 0x61, 0xd8, 0xd0, 0x0a, 0x56, 0x28, 0xcf, 0xff, 0x46, 0x7e, 0x1f, - 0x83, 0xbe, 0x87, 0xbb, 0x10, 0xf2, 0x93, 0xbd, 0xbb, 0x1e, 0x0c, 0x7e, - 0xf5, 0xcf, 0xf3, 0x7c, 0xf0, 0x5a, 0xf2, 0xf3, 0xf8, 0x0e, 0xc4, 0xad, - 0x90, 0xd4, 0x85, 0x3c, 0xd8, 0x20, 0xa0, 0x5b, 0x32, 0xe0, 0xbd, 0xa6, - 0xf5, 0xd7, 0x94, 0x0c, 0x1c, 0xe2, 0xd2, 0x23, 0x4b, 0x16, 0xbf, 0x52, - 0x61, 0xd5, 0xec, 0x2a, 0xe6, 0x6a, 0xa5, 0xad, 0xeb, 0x05, 0xbc, 0xb5, - 0xf0, 0xb3, 0x19, 0x5e, 0x37, 0x1b, 0xc5, 0xe6, 0xe0, 0x36, 0x58, 0x01, - 0x6c, 0x84, 0x41, 0xe2, 0x52, 0x06, 0xf4, 0x38, 0x1d, 0xa6, 0x8e, 0x58, - 0xa7, 0x6b, 0xa8, 0xfa, 0x78, 0x2d, 0x2c, 0x8c, 0x65, 0x98, 0x1c, 0x03, - 0xcc, 0x01, 0xf6, 0xb5, 0xee, 0x5d, 0x92, 0xa5, 0x54, 0x3c, 0x70, 0x56, - 0x4a, 0x84, 0x4b, 0xad, 0xbf, 0x37, 0x06, 0x7e, 0x2b, 0x31, 0x9f, 0xc0, - 0x94, 0xd9, 0xcb, 0x9c, 0x46, 0xab, 0x53, 0x83, 0x53, 0xa4, 0x32, 0x29, - 0x2b, 0xc8, 0xf3, 0xb1, 0xc2, 0x57, 0x90, 0x6a, 0x47, 0x5b, 0x8b, 0xd7, - 0xff, 0x97, 0x8d, 0x0e, 0x00, 0x43, 0x13, 0xba, 0xb7, 0x93, 0xe8, 0xda, - 0x3f, 0x56, 0x2d, 0x19, 0x89, 0x99, 0x8f, 0x3a, 0x38, 0x11, 0x8a, 0xb6, - 0x61, 0x3f, 0xbb, 0xb7, 0xb6, 0xab, 0xb3, 0x67, 0x3d, 0x54, 0xb1, 0xf4, - 0x10, 0x55, 0x22, 0xdb, 0xc6, 0xfc, 0x9f, 0x77, 0xde, 0xfa, 0x27, 0x96, - 0x4e, 0x3c, 0x57, 0x27, 0x55, 0x54, 0x0c, 0x2a, 0xb9, 0x33, 0x28, 0xce, - 0x09, 0x34, 0x8c, 0xad, 0xf2, 0x5e, 0x07, 0xc4, 0xfb, 0x8c, 0xf6, 0x04, - 0xf2, 0x7e, 0xb4, 0x6d, 0xb4, 0x7d, 0xb2, 0x0e, 0x78, 0x99, 0x90, 0xf9, - 0x58, 0xa4, 0x23, 0x53, 0xff, 0x3e, 0xe0, 0x73, 0x9e, 0x21, 0x40, 0xe6, - 0x46, 0xe8, 0x38, 0xd8, 0x8d, 0x1f, 0xb6, 0x8a, 0x3d, 0xe3, 0x89, 0xb0, - 0xe2, 0xd0, 0xdf, 0x11, 0x03, 0x63, 0xd2, 0xf5, 0x60, 0xa2, 0xa1, 0x98, - 0x58, 0xe3, 0xc6, 0x98, 0x5f, 0x1c, 0xae, 0xf9, 0xa2, 0xab, 0x50, 0xd2, - 0xee, 0x94, 0x07, 0xc3, 0x69, 0x48, 0x95, 0x71, 0x07, 0xe8, 0x69, 0xff, - 0xb7, 0xfe, 0xe6, 0xd9, 0x46, 0x4d, 0xc1, 0x8d, 0x9e, 0xe9, 0x5b, 0xa1, - 0x45, 0x32, 0x8f, 0xbd, 0x9b, 0x18, 0x79, 0x57, 0x34, 0x54, 0x48, 0xf2, - 0x32, 0xdb, 0x5a, 0xfb, 0x7a, 0xac, 0xe2, 0xdc, 0xc0, 0x19, 0x43, 0x9b, - 0x69, 0x27, 0x54, 0x8c, 0x4b, 0x4e, 0x49, 0x44, 0x09, 0x32, 0x86, 0xdf, - 0x69, 0xb1, 0xf0, 0x39, 0x6b, 0x32, 0xad, 0xe9, 0x34, 0x2e, 0x0c, 0x4b, - 0xee, 0x52, 0xb0, 0x5a, 0x79, 0x03, 0x12, 0xfe, 0xec, 0x7e, 0xf0, 0x18, - 0xa7, 0x85, 0x01, 0x50, 0xdd, 0xd2, 0xbc, 0x5b, 0xea, 0x8b, 0xfc, 0x86, - 0xdf, 0x8a, 0x22, 0xed, 0x4b, 0x50, 0x25, 0xcf, 0x54, 0xc9, 0x1c, 0x6e, - 0x28, 0x42, 0xaa, 0xfd, 0x63, 0x98, 0x34, 0x77, 0x46, 0x0b, 0x0f, 0xb9, - 0xd8, 0xc4, 0x1e, 0x0e, 0xed, 0x17, 0xa3, 0x92, 0x7f, 0x4f, 0xe9, 0xb4, - 0x67, 0x70, 0xef, 0x67, 0x3d, 0x93, 0x2f, 0x66, 0x1f, 0xe2, 0x5a, 0x7f, - 0x55, 0x77, 0x9e, 0x1c, 0x60, 0xf6, 0x25, 0x8f, 0x8b, 0x71, 0xd6, 0xb3, - 0xa5, 0x1f, 0xc8, 0x91, 0xec, 0x0b, 0x1e, 0xcb, 0x69, 0x5a, 0xf3, 0x12, - 0x9a, 0x64, 0x6a, 0xcd, 0x54, 0x0b, 0xd1, 0x54, 0xfc, 0xa5, 0x97, 0xfd, - 0x59, 0x4a, 0xe8, 0xed, 0xdf, 0x29, 0x8f, 0xc7, 0x34, 0xfa, 0x44, 0xfa, - 0xad, 0xe6, 0x41, 0xbd, 0x53, 0xfe, 0xb2, 0xdf, 0x8a, 0x21, 0xd1, 0x6b, - 0x55, 0xb8, 0x38, 0x77, 0xb8, 0x2b, 0xa2, 0xf7, 0x55, 0x61, 0xc5, 0xce, - 0xd5, 0xc4, 0xe7, 0x7e, 0xe6, 0x04, 0x78, 0x35, 0xcf, 0xde, 0xcb, 0xfc, - 0x7b, 0xbd, 0xbf, 0xa7, 0xd2, 0x08, 0xeb, 0x01, 0x7d, 0x2a, 0xbd, 0x6a, - 0xe5, 0x37, 0x03, 0x73, 0x52, 0x5a, 0xfd, 0x97, 0x96, 0xec, 0x5b, 0xaf, - 0x2b, 0xa7, 0xd8, 0xc3, 0x5d, 0x5e, 0x6c, 0x7a, 0xa6, 0xb2, 0x21, 0xb3, - 0x27, 0x26, 0x2e, 0x3b, 0x4c, 0xb0, 0xa9, 0xa5, 0x1b, 0x69, 0x1f, 0xe6, - 0x13, 0x69, 0x31, 0xc8, 0x0e, 0xe2, 0x9c, 0x06, 0x5a, 0x45, 0x86, 0xbc, - 0x48, 0x22, 0x1a, 0xd9, 0x67, 0x9a, 0x8c, 0x54, 0x7d, 0x6f, 0xbd, 0x32, - 0x14, 0xce, 0x08, 0x2b, 0x41, 0x29, 0x69, 0xaa, 0xe6, 0x60, 0x4b, 0x30, - 0x59, 0x96, 0x60, 0x31, 0x4f, 0xa1, 0xc5, 0x87, 0xef, 0x7b, 0xc9, 0x42, - 0xe7, 0x6e, 0x8e, 0xdf, 0x10, 0xd1, 0x2e, 0x79, 0xa1, 0x3a, 0x0d, 0xc7, - 0xc1, 0x60, 0x77, 0x1f, 0xa7, 0xa4, 0xfd, 0x44, 0x04, 0xde, 0xf4, 0x38, - 0x41, 0x10, 0xe8, 0x88, 0x4a, 0xc5, 0x9a, 0xc6, 0xd2, 0x5b, 0xf1, 0x73, - 0x71, 0x8b, 0x25, 0xa4, 0xf5, 0x9f, 0x62, 0x9e, 0xc7, 0xd8, 0xa8, 0x74, - 0xe3, 0x3f, 0xe5, 0x7b, 0x34, 0x1b, 0xa7, 0x0e, 0x53, 0xa5, 0x63, 0x93, - 0xb3, 0x86, 0x67, 0xcd, 0xd1, 0x7b, 0xf7, 0xb2, 0x23, 0x72, 0x07, 0xf0, - 0xd0, 0xd3, 0xb8, 0x50, 0x7d, 0xbd, 0xeb, 0x3b, 0xaf, 0xcb, 0xef, 0x97, - 0x2b, 0x0c, 0xdc, 0x1f, 0x9d, 0x26, 0x52, 0x7d, 0x62, 0xe1, 0x60, 0x87, - 0x6c, 0x6a, 0xbe, 0x7e, 0xa5, 0x66, 0x15, 0x6e, 0xb8, 0x42, 0xbc, 0x3e, - 0x05, 0x70, 0xfd, 0x56, 0x51, 0xc0, 0x38, 0x89, 0x6c, 0xae, 0x72, 0xc6, - 0x50, 0x69, 0xc2, 0x6b, 0x00, 0x80, 0x7b, 0x87, 0x6a, 0xfc, 0x67, 0x58, - 0x3b, 0x05, 0x62, 0xf0, 0x79, 0x18, 0x97, 0x8b, 0xda, 0x35, 0x79, 0x9c, - 0xcf, 0xa8, 0x58, 0xfb, 0x7b, 0x5e, 0x18, 0x6e, 0x65, 0x94, 0xa1, 0x34, - 0x93, 0x0c, 0x35, 0xb2, 0x65, 0x50, 0x34, 0xd0, 0xbb, 0xf1, 0x79, 0x4a, - 0x41, 0x07, 0x77, 0x6e, 0xca, 0xff, 0x52, 0x54, 0x6d, 0x94, 0x18, 0x34, - 0xef, 0x68, 0x87, 0x1e, 0x21, 0x69, 0xee, 0x97, 0xab, 0xd6, 0xb0, 0x33, - 0xdf, 0x00, 0xf1, 0x70, 0x2f, 0x34, 0x29, 0xcb, 0xdd, 0x30, 0x63, 0x03, - 0x79, 0xff, 0xdc, 0x62, 0xbb, 0xeb, 0x0e, 0x03, 0xd6, 0xd1, 0xea, 0x3d, - 0x28, 0xa5, 0x59, 0xa0, 0xda, 0x3b, 0xf3, 0xf0, 0x22, 0xa4, 0xd2, 0x19, - 0x9d, 0xe6, 0x3b, 0x1a, 0x56, 0x4c, 0x0e, 0x90, 0x56, 0xe4, 0xd4, 0x31, - 0x3d, 0x28, 0x7f, 0x13, 0x02, 0xc4, 0x26, 0x77, 0x8a, 0x94, 0xec, 0x0a, - 0x8f, 0x91, 0x78, 0x95, 0xeb, 0x8a, 0x7e, 0x80, 0x8b, 0x0a, 0xa3, 0x3b, - 0x82, 0xd5, 0x08, 0xd4, 0x68, 0xa8, 0x2e, 0x22, 0x93, 0x1b, 0x51, 0x85, - 0x78, 0xcf, 0xff, 0x90, 0x0a, 0xfd, 0x31, 0x01, 0x60, 0x3a, 0x8f, 0x1c, - 0x5e, 0x67, 0x32, 0x97, 0x29, 0xc8, 0x0b, 0x9d, 0x05, 0x99, 0x37, 0x6b, - 0xf4, 0xb8, 0xd5, 0x7b, 0x09, 0xd2, 0xc2, 0x3f, 0x8f, 0xc1, 0xaf, 0xbb, - 0xef, 0x3a, 0x1f, 0xed, 0xb9, 0x22, 0xbf, 0x3c, 0x9c, 0x00, 0xfc, 0xbd, - 0x12, 0xba, 0x4b, 0xd2, 0xa7, 0x1c, 0x23, 0x69, 0x92, 0x7e, 0x31, 0x8b, - 0x8c, 0x42, 0xd7, 0x44, 0xcd, 0x8a, 0x96, 0xdb, 0xad, 0x16, 0x36, 0xe6, - 0xd2, 0x45, 0x8e, 0xf2, 0x46, 0xe7, 0xc3, 0x96, 0xdd, 0xe3, 0xac, 0x47, - 0x8c, 0xd2, 0xc6, 0xb8, 0x9d, 0x41, 0xa2, 0xaa, 0xd9, 0x48, 0xaf, 0x7b, - 0x20, 0x5f, 0x71, 0x5f, 0x00, 0x2f, 0x87, 0x98, 0x3b, 0x81, 0x85, 0xe2, - 0x4f, 0x4a, 0xfe, 0x1f, 0x6c, 0xe4, 0x0c, 0x6b, 0xb8, 0xb4, 0x08, 0x5c, - 0xd0, 0x42, 0x71, 0x76, 0x6c, 0xca, 0x16, 0x91, 0x38, 0x1d, 0xb8, 0x44, - 0xcd, 0xd1, 0xad, 0x17, 0x8b, 0x04, 0xc9, 0xb5, 0x5a, 0xf6, 0x9e, 0xde, - 0x5b, 0xe2, 0x9d, 0xe8, 0x21, 0x27, 0xf7, 0xba, 0xe3, 0x6c, 0x0e, 0x2c, - 0xb8, 0x51, 0xb8, 0x73, 0x2c, 0x52, 0xc1, 0x04, 0x1d, 0xab, 0x3d, 0x7d, - 0x3b, 0x15, 0x34, 0xeb, 0xfd, 0x0b, 0x51, 0x91, 0x76, 0x22, 0x58, 0x6d, - 0x49, 0x60, 0x6a, 0x6b, 0xa4, 0xe2, 0xd2, 0x98, 0xee, 0x99, 0x17, 0x96, - 0x61, 0xa5, 0x9d, 0x20, 0xd2, 0x0f, 0xd6, 0x1b, 0xae, 0xc6, 0x1c, 0xf5, - 0xaa, 0x38, 0xee, 0x04, 0xd5, 0x36, 0x25, 0x72, 0x76, 0x43, 0x49, 0xb9, - 0x5b, 0xd2, 0xcd, 0x79, 0x7a, 0x4d, 0x84, 0x3e, 0x10, 0x44, 0xac, 0xb5, - 0xe7, 0x4d, 0x8c, 0x20, 0x4d, 0xc2, 0x5a, 0xb7, 0x01, 0xf5, 0xdb, 0xc2, - 0xb3, 0x1c, 0xa8, 0x53, 0xdb, 0xb7, 0x9d, 0x72, 0x19, 0xad, 0x97, 0x3f, - 0xc4, 0x6f, 0xd7, 0x57, 0x5e, 0x29, 0xa7, 0x10, 0x16, 0xeb, 0x35, 0x2e, - 0x40, 0xf5, 0x04, 0x83, 0x36, 0x25, 0x97, 0xa5, 0x15, 0xf6, 0x70, 0xc0, - 0x2c, 0xdf, 0xa9, 0xf2, 0x00, 0x84, 0x02, 0x89, 0x2e, 0x92, 0x41, 0x47, - 0xe0, 0x1b, 0x50, 0xb3, 0x44, 0x61, 0xac, 0xe7, 0x9d, 0x25, 0xab, 0xbb, - 0x59, 0x9a, 0xd4, 0xae, 0x9f, 0xaf, 0xef, 0x08, 0x52, 0x6d, 0x5e, 0xc3, - 0xad, 0x9f, 0x8b, 0x1a, 0x79, 0x6a, 0xca, 0x00, 0x6b, 0xa4, 0x73, 0x3d, - 0xff, 0xe9, 0xe3, 0xbf, 0xeb, 0x44, 0x75, 0xdc, 0x3b, 0x8a, 0xa3, 0x3c, - 0x62, 0x2d, 0x66, 0xa1, 0x52, 0x61, 0x73, 0x09, 0xb4, 0x65, 0x04, 0x13, - 0x14, 0xc3, 0xc4, 0xf6, 0x01, 0xa9, 0x86, 0x15, 0xf4, 0x19, 0x50, 0x6e, - 0xae, 0x2a, 0x0c, 0x09, 0x60, 0x9e, 0x66, 0x4f, 0xac, 0x29, 0x5f, 0x43, - 0x30, 0x6f, 0xf1, 0x38, 0x47, 0x6c, 0x83, 0x1f, 0xfb, 0xeb, 0xfb, 0x8c, - 0xc0, 0x24, 0x47, 0x8b, 0x63, 0x4e, 0x7d, 0x5f, 0xc1, 0x26, 0x55, 0xf8, - 0x9c, 0xca, 0x7b, 0x14, 0x42, 0xc2, 0x0f, 0xce, 0x1a, 0x41, 0x5d, 0x0a, - 0x51, 0xbb, 0x3e, 0xe3, 0x18, 0x4d, 0xc6, 0x01, 0xd9, 0x11, 0x11, 0x98, - 0x02, 0x14, 0xe5, 0xbf, 0xc5, 0x34, 0x6b, 0xa4, 0x62, 0x3d, 0x64, 0x91, - 0x72, 0xe5, 0xf6, 0x4f, 0x07, 0x58, 0x2f, 0x90, 0x55, 0x48, 0x6a, 0x6c, - 0x33, 0x17, 0xd3, 0xba, 0xab, 0xf3, 0x70, 0xd5, 0xf0, 0xc8, 0xa2, 0x83, - 0x8d, 0x2c, 0x5b, 0xa6, 0x9f, 0x79, 0x62, 0xbe, 0xf0, 0x55, 0xa9, 0x4f, - 0xff, 0x61, 0xed, 0x88, 0x39, 0xdd, 0x81, 0x46, 0xd3, 0xf6, 0x40, 0x0f, - 0x7f, 0x29, 0x75, 0x17, 0x55, 0x2b, 0xcc, 0xf3, 0x9f, 0x1a, 0xf9, 0x4b, - 0xb5, 0xd5, 0x19, 0xf1, 0xdf, 0xbe, 0x28, 0xdf, 0xd6, 0x00, 0xe7, 0x71, - 0xdb, 0xaa, 0x0f, 0xb6, 0x75, 0xc1, 0xfa, 0x62, 0x17, 0x16, 0xbe, 0x59, - 0x93, 0x53, 0x28, 0x78, 0x90, 0x5c, 0x94, 0xad, 0x20, 0xe9, 0xad, 0x4d, - 0x91, 0xb9, 0x2f, 0x6b, 0xf7, 0xc8, 0xe7, 0xdb, 0x37, 0x71, 0x2c, 0xbc, - 0x11, 0xb7, 0x1b, 0x2f, 0xbd, 0xa7, 0xaa, 0xed, 0xea, 0xc7, 0x8a, 0x5b, - 0x45, 0xb1, 0x92, 0xe7, 0x0b, 0x51, 0x4b, 0xe0, 0x2d, 0xaa, 0xe8, 0x2f, - 0x7b, 0x2a, 0x5f, 0x01, 0x9e, 0x7a, 0x18, 0x51, 0x56, 0x9a, 0x55, 0x31, - 0x54, 0x2c, 0xdc, 0x95, 0x2d, 0x08, 0xd6, 0x2f, 0x53, 0x74, 0x37, 0x2c, - 0xbc, 0x2a, 0xa9, 0xb2, 0x72, 0xdb, 0x2c, 0x97, 0x1f, 0xc5, 0xf8, 0xfa, - 0x0c, 0xdd, 0x73, 0xbb, 0x53, 0x4d, 0xd4, 0x9a, 0xf4, 0x5b, 0x03, 0x22, - 0x1e, 0xce, 0xbe, 0x71, 0x9b, 0xc6, 0xdd, 0x0b, 0x88, 0x0d, 0xe4, 0xe5, - 0x15, 0x72, 0xda, 0x6d, 0xc1, 0x40, 0xb9, 0x72, 0x35, 0x42, 0x82, 0x6c, - 0x31, 0xfe, 0xba, 0x56, 0x8b, 0xf6, 0x41, 0xae, 0x27, 0x8a, 0x86, 0x54, - 0x5e, 0x60, 0xf3, 0x84, 0xb9, 0x57, 0x62, 0xf8, 0x32, 0x1f, 0xba, 0x28, - 0xb0, 0x15, 0xcc, 0xb1, 0xe4, 0xfe, 0xe1, 0x8a, 0xf8, 0x3f, 0x39, 0xcb, - 0x59, 0x7e, 0xca, 0x12, 0xda, 0xec, 0x2c, 0x54, 0x13, 0xa7, 0xf5, 0x47, - 0xe1, 0x94, 0xc5, 0xb3, 0xab, 0x7e, 0x5a, 0x69, 0x0f, 0xa7, 0x9e, 0x81, - 0x0f, 0x59, 0x6c, 0x15, 0xb0, 0xf7, 0xc4, 0x2e, 0x18, 0xd6, 0x10, 0xc7, - 0x1e, 0x53, 0xee, 0xb1, 0x7d, 0xad, 0xf4, 0xd0, 0x89, 0x4f, 0xa0, 0x1b, - 0x54, 0xd3, 0xdf, 0xd2, 0xc8, 0x8c, 0x7a, 0x2c, 0xee, 0x70, 0x44, 0x5a, - 0x46, 0x3a, 0x55, 0x89, 0x67, 0x86, 0x38, 0xd4, 0xfe, 0x49, 0xb8, 0xb1, - 0xe5, 0x39, 0x04, 0xeb, 0xb9, 0x1f, 0x6e, 0x93, 0xf9, 0x42, 0xcd, 0xa4, - 0x25, 0x5e, 0x2e, 0xd4, 0xd4, 0xd1, 0x2d, 0x3e, 0x42, 0xd2, 0x79, 0x43, - 0x89, 0x4d, 0x2b, 0x7a, 0xb8, 0xa5, 0xd4, 0x3e, 0xc3, 0xb6, 0xe6, 0x13, - 0xcc, 0x3c, 0x54, 0x20, 0xb4, 0x06, 0x45, 0x16, 0x79, 0xb5, 0x73, 0x3a, - 0xdf, 0xce, 0x16, 0x7a, 0xaa, 0x6e, 0xe9, 0x53, 0x0d, 0x82, 0x64, 0x9d, - 0x31, 0xa3, 0xc7, 0x63, 0xf6, 0x3f, 0xeb, 0x5e, 0x68, 0x7b, 0x38, 0x9d, - 0xdf, 0xa1, 0x4c, 0xbb, 0x5c, 0xd6, 0x89, 0xfe, 0xf6, 0x09, 0x05, 0x9d, - 0x40, 0xdf, 0x5c, 0x35, 0xd1, 0xe3, 0x68, 0xf6, 0xe5, 0x86, 0x43, 0xcd, - 0xfd, 0x15, 0x61, 0xfc, 0xda, 0xef, 0x6e, 0x29, 0xfc, 0xdb, 0xe8, 0x29, - 0xa4, 0xf1, 0x98, 0x5f, 0x34, 0x5b, 0x56, 0x80, 0xa3, 0xe4, 0x65, 0x40, - 0x3a, 0x17, 0x6c, 0x40, 0x78, 0x3f, 0xe6, 0xe2, 0x1e, 0x20, 0x31, 0x02, - 0xcf, 0x55, 0x70, 0x81, 0x21, 0xf3, 0x9f, 0x06, 0xa0, 0xfd, 0xe2, 0x89, - 0x18, 0xb5, 0x79, 0x2d, 0x2a, 0x79, 0xdc, 0xcc, 0x0d, 0xf4, 0x53, 0x75, - 0x4c, 0x6e, 0xd0, 0xdc, 0x89, 0x98, 0x3d, 0xa7, 0xe8, 0xa7, 0xc3, 0x54, - 0x64, 0x91, 0x7e, 0x2b, 0xfb, 0xd5, 0x41, 0xdb, 0x02, 0x8c, 0xa9, 0xd4, - 0x1b, 0xf3, 0x06, 0x85, 0xf0, 0xa7, 0x49, 0xb2, 0x3e, 0xf1, 0xd6, 0xb2, - 0x3f, 0x72, 0x6e, 0xe8, 0x65, 0xd6, 0xa1, 0x21, 0xc5, 0x41, 0xef, 0x7d, - 0xdf, 0x51, 0x04, 0x15, 0x68, 0x74, 0x44, 0x24, 0xbf, 0x6d, 0x01, 0x23, - 0x73, 0x0d, 0x64, 0x68, 0x26, 0xbd, 0x95, 0x31, 0x74, 0x30, 0x70, 0x3b, - 0x92, 0x0d, 0xaa, 0x24, 0xfc, 0xf5, 0xea, 0xe8, 0xe5, 0x17, 0x18, 0x4a, - 0xbb, 0x27, 0x66, 0x75, 0x3a, 0xf5, 0x32, 0x60, 0xa8, 0xea, 0xb2, 0x28, - 0xf8, 0xff, 0x21, 0x8a, 0x16, 0x3e, 0x9f, 0x79, 0x10, 0xee, 0x8b, 0xdf, - 0x23, 0x8a, 0x1e, 0xbb, 0x6a, 0x21, 0xe7, 0x83, 0x87, 0x8e, 0x06, 0x8f, - 0x0b, 0xc2, 0xd0, 0xf0, 0x8f, 0x90, 0x80, 0x27, 0x68, 0x48, 0x74, 0xb5, - 0xbc, 0xae, 0x1e, 0x97, 0x75, 0x54, 0x51, 0x1f, 0x57, 0x22, 0xfd, 0xba, - 0x11, 0x15, 0x8d, 0x32, 0xec, 0x18, 0x71, 0x8d, 0x2e, 0x01, 0xc5, 0xa0, - 0x3b, 0x55, 0x66, 0x11, 0xa8, 0x40, 0x26, 0x99, 0x7e, 0x51, 0xa3, 0x36, - 0x8c, 0xf8, 0xaa, 0x85, 0xbe, 0x8a, 0xa4, 0xf8, 0xb2, 0x54, 0x0b, 0x65, - 0x05, 0x38, 0x25, 0x40, 0x02, 0xe7, 0x84, 0x4e, 0x1b, 0x2c, 0x98, 0xe8, - 0x45, 0xf5, 0x98, 0xb9, 0x31, 0xa0, 0xf7, 0x3e, 0xf2, 0x26, 0x4f, 0x8f, - 0xd4, 0x27, 0xe4, 0x4b, 0x70, 0x42, 0x8f, 0xcd, 0x89, 0x6d, 0x24, 0x09, - 0xf8, 0x56, 0xa5, 0x7b, 0xce, 0xb0, 0x19, 0x20, 0x94, 0xa9, 0x60, 0xcf, - 0x8d, 0xcf, 0xf9, 0x31, 0xe0, 0x7c, 0x25, 0x85, 0xda, 0xf1, 0x0d, 0xb5, - 0x18, 0x1c, 0xd4, 0xd4, 0x14, 0x3a, 0xac, 0x30, 0x35, 0x81, 0x22, 0x69, - 0xa8, 0x98, 0xea, 0x99, 0xd7, 0xab, 0x5c, 0xe7, 0x91, 0x78, 0x38, 0x08, - 0x82, 0x91, 0x68, 0xa7, 0x53, 0x89, 0x7b, 0x32, 0xc3, 0x95, 0xd7, 0x05, - 0x46, 0x92, 0x3f, 0x4e, 0x5f, 0xde, 0xa9, 0x10, 0xf8, 0xc0, 0x42, 0x9f, - 0xeb, 0x4d, 0x5c, 0x52, 0xb8, 0xa1, 0x6a, 0x72, 0xc4, 0x44, 0x0b, 0x50, - 0xad, 0xf2, 0xa9, 0x3c, 0xd0, 0x35, 0x55, 0xa5, 0x59, 0x16, 0x70, 0x76, - 0xf0, 0x94, 0xcd, 0x40, 0x61, 0xdb, 0x48, 0xda, 0x8e, 0x21, 0xd2, 0xdf, - 0xb5, 0x45, 0x84, 0x12, 0x0a, 0x69, 0x1f, 0x39, 0x50, 0x79, 0x50, 0x7d, - 0x8a, 0xd2, 0x30, 0x80, 0x9d, 0x0c, 0xf2, 0xca, 0x35, 0x23, 0x66, 0x62, - 0xde, 0x17, 0xd0, 0xb9, 0x5d, 0x87, 0x65, 0xc7, 0x68, 0xe1, 0x65, 0x1d, - 0x8d, 0x94, 0xf5, 0x96, 0xe2, 0xf4, 0x43, 0x09, 0x2d, 0xf8, 0xea, 0x8a, - 0x1c, 0x36, 0x90, 0xc6, 0xcd, 0xfb, 0x94, 0xb8, 0x3d, 0x4c, 0x8b, 0x1f, - 0xd2, 0xcc, 0x4d, 0xde, 0x86, 0x5b, 0xca, 0xb7, 0x33, 0xc4, 0x8c, 0x67, - 0xcd, 0x55, 0xfd, 0x4a, 0x86, 0x8d, 0xea, 0xc5, 0xfa, 0x4d, 0xa9, 0x1d, - 0xb9, 0x7f, 0xdb, 0x8e, 0x54, 0xfa, 0xf6, 0x82, 0x70, 0xe4, 0x38, 0x11, - 0x9b, 0xd9, 0xd5, 0x2c, 0xe4, 0xc8, 0x1b, 0x31, 0x6d, 0xc2, 0x57, 0xbd, - 0xfa, 0x75, 0x21, 0xce, 0xe7, 0x01, 0x2b, 0x9d, 0xef, 0x64, 0x4c, 0x76, - 0x9f, 0xe9, 0xd6, 0xb2, 0x38, 0xe0, 0xbb, 0xb4, 0x10, 0xd9, 0xa6, 0x74, - 0x18, 0xd2, 0x28, 0x9a, 0x90, 0x0e, 0xa6, 0x08, 0x92, 0xf6, 0x93, 0x76, - 0xf0, 0xc8, 0x77, 0xfb, 0x22, 0x46, 0xbf, 0x7c, 0xe3, 0x99, 0x7b, 0x14, - 0x6a, 0x5c, 0x6b, 0x9b, 0xdd, 0xe0, 0x06, 0x91, 0x86, 0x1d, 0x01, 0xde, - 0x20, 0x0e, 0x33, 0x72, 0xcc, 0x2c, 0x4f, 0x90, 0x00, 0xdb, 0xeb, 0x15, - 0x73, 0x96, 0x5e, 0xc7, 0xab, 0xbd, 0x69, 0x61, 0xc1, 0x42, 0xa0, 0x65, - 0x4e, 0x56, 0xb1, 0x7a, 0xe3, 0x03, 0xf8, 0x62, 0x3b, 0xfc, 0x4d, 0x20, - 0x53, 0x1b, 0xb9, 0xe1, 0x8b, 0x41, 0xd9, 0x9c, 0x62, 0xb2, 0x2b, 0x7e, - 0xe7, 0xc0, 0xfa, 0x50, 0xa9, 0xf1, 0x14, 0x82, 0x82, 0x52, 0xc6, 0x92, - 0xc9, 0xef, 0x47, 0x95, 0x7d, 0xbd, 0x28, 0x6e, 0xd3, 0x42, 0xea, 0x30, - 0x55, 0x05, 0x07, 0x9c, 0x7e, 0xbe, 0xea, 0x9a, 0x4d, 0xdc, 0xc8, 0x96, - 0x31, 0x51, 0x6a, 0x18, 0x4e, 0x78, 0xb8, 0xc0, 0xdc, 0x4b, 0x12, 0x01, - 0xc6, 0x80, 0x72, 0x3a, 0x47, 0x36, 0xde, 0x7b, 0x1a, 0xd4, 0x3b, 0x0a, - 0xc9, 0x14, 0x13, 0x37, 0x6e, 0x89, 0xa1, 0xd5, 0x5f, 0x1f, 0xc4, 0x4f, - 0x4b, 0x17, 0xa9, 0xad, 0x78, 0xbb, 0x31, 0x09, 0x1c, 0x19, 0x9c, 0x84, - 0x7b, 0x33, 0x82, 0xcb, 0xef, 0xde, 0xd1, 0x27, 0xf9, 0x46, 0xd4, 0x0e, - 0x1c, 0x22, 0x0d, 0xe5, 0xc3, 0xb5, 0xb6, 0xeb, 0x66, 0xe8, 0x75, 0x48, - 0x93, 0x12, 0x41, 0x7c, 0x9f, 0x82, 0x91, 0xd6, 0xe9, 0xef, 0x92, 0xed, - 0x48, 0xdd, 0xd6, 0x5e, 0xea, 0x13, 0x6d, 0xa5, 0xb6, 0x24, 0xed, 0x08, - 0x70, 0x7f, 0xcc, 0x89, 0x80, 0x7f, 0xcf, 0x7d, 0xd3, 0x01, 0x5b, 0x75, - 0xa9, 0x90, 0x8e, 0x62, 0xe7, 0x5b, 0x92, 0xfe, 0x18, 0x29, 0xb4, 0xc3, - 0x30, 0x11, 0x73, 0xd0, 0x56, 0xba, 0x5d, 0xc6, 0xb9, 0x18, 0x0d, 0x23, - 0xed, 0xd9, 0x81, 0x30, 0x3d, 0xf4, 0x88, 0x36, 0xc7, 0x57, 0xe2, 0xe0, - 0x48, 0xad, 0x9e, 0xd8, 0x0d, 0xfb, 0x17, 0x5e, 0x30, 0xcd, 0xab, 0xd4, - 0xd5, 0x1e, 0x34, 0x65, 0xdb, 0x96, 0xf5, 0x6d, 0xf6, 0x8d, 0x66, 0x37, - 0xd4, 0xfe, 0x19, 0x5a, 0x66, 0x8b, 0x39, 0x98, 0x73, 0x2d, 0x3e, 0x4e, - 0x2c, 0x05, 0x24, 0x5a, 0x5b, 0x97, 0x30, 0xbe, 0x8c, 0xca, 0x1d, 0xf1, - 0xe1, 0x23, 0x36, 0xce, 0x66, 0x5b, 0x7f, 0xe4, 0xeb, 0x9c, 0xed, 0x27, - 0x5d, 0x72, 0x6f, 0xd5, 0x51, 0x77, 0x94, 0x0c, 0xbe, 0x81, 0x49, 0xe3, - 0x7b, 0x92, 0xc5, 0x6a, 0x25, 0xde, 0xd7, 0x89, 0x81, 0x86, 0x3d, 0x02, - 0x89, 0x12, 0x48, 0xaa, 0x13, 0x9a, 0x0f, 0xde, 0x39, 0x85, 0x1b, 0x97, - 0xcb, 0x06, 0xd3, 0xf2, 0xf6, 0x8f, 0xce, 0x8f, 0x64, 0x24, 0xf5, 0xc8, - 0xee, 0xaa, 0x1a, 0x3e, 0x18, 0x04, 0x30, 0xaf, 0xd7, 0x18, 0xe0, 0x44, - 0x4c, 0x86, 0x48, 0xff, 0x0f, 0xc9, 0xaf, 0x55, 0x7d, 0xd7, 0x46, 0x08, - 0x13, 0xcd, 0x90, 0x82, 0x3c, 0x16, 0x19, 0x35, 0xd9, 0x08, 0xe6, 0xbc, - 0xfa, 0x8f, 0x13, 0x7d, 0x7f, 0xb7, 0x7d, 0x38, 0x5b, 0x70, 0x14, 0xef, - 0xb1, 0xb7, 0x56, 0x58, 0x08, 0x12, 0xff, 0xe9, 0x29, 0x90, 0xe5, 0x38, - 0xc1, 0x92, 0xf3, 0x70, 0xf5, 0x42, 0x71, 0xda, 0xa0, 0x01, 0xa5, 0x4f, - 0xc3, 0x20, 0xbe, 0xca, 0x8e, 0xc2, 0xdb, 0x87, 0x57, 0x83, 0x2a, 0xe4, - 0x00, 0xfe, 0x2b, 0xfa, 0x69, 0xe3, 0xfe, 0xc1, 0xa8, 0xe7, 0xc3, 0x67, - 0xd1, 0xfb, 0x87, 0xbf, 0xab, 0xe4, 0xee, 0x74, 0x2e, 0x0b, 0x18, 0xcc, - 0x82, 0xf9, 0xc4, 0xb2, 0x40, 0xab, 0x06, 0xa4, 0xa1, 0x6e, 0xf7, 0x9c, - 0x0a, 0x05, 0xf9, 0x51, 0x9a, 0xf4, 0xb6, 0xe6, 0x9a, 0x6a, 0xf9, 0xc6, - 0x87, 0x17, 0xb8, 0x4e, 0xf9, 0x22, 0x0d, 0xe6, 0x89, 0xf8, 0x93, 0x45, - 0xf8, 0xe8, 0x4a, 0x67, 0x9b, 0x73, 0xf5, 0x7d, 0x34, 0x3e, 0xf6, 0x05, - 0x5a, 0x06, 0xbc, 0x9d, 0x8a, 0x0a, 0x2c, 0x2a, 0x7d, 0x11, 0xd9, 0x6b, - 0xee, 0x56, 0x1c, 0x09, 0xdf, 0x07, 0xa3, 0xce, 0x6d, 0xa7, 0x0d, 0x3e, - 0x8f, 0xc6, 0xb8, 0x7c, 0x99, 0xcc, 0xf3, 0xef, 0x67, 0x93, 0x61, 0x0d, - 0xd5, 0x65, 0x8e, 0x97, 0x02, 0x60, 0x1d, 0xc1, 0x14, 0x4d, 0x0f, 0x6e, - 0xbb, 0x04, 0x17, 0xee, 0x36, 0x32, 0xaa, 0x05, 0xda, 0x25, 0xb4, 0x55, - 0x1a, 0xe3, 0x98, 0x2c, 0xc3, 0xcf, 0xd8, 0x70, 0xe7, 0xae, 0xaa, 0x39, - 0xbb, 0x02, 0x14, 0xf0, 0xb1, 0xcc, 0xa4, 0x6f, 0x94, 0xee, 0xd3, 0x33, - 0xe1, 0x4f, 0x22, 0x6a, 0x6c, 0x32, 0xf9, 0xb7, 0x92, 0x69, 0xd0, 0x95, - 0x5b, 0x9f, 0x0f, 0x0b, 0x89, 0x0a, 0x6d, 0x23, 0x9e, 0xf8, 0x01, 0x51, - 0x25, 0x8d, 0x56, 0x49, 0x9b, 0xcb, 0xa8, 0x8b, 0x16, 0xff, 0x74, 0x9d, - 0xf4, 0x2d, 0xec, 0x59, 0x46, 0xa8, 0x9b, 0x16, 0x2f, 0xd2, 0x09, 0x67, - 0x52, 0x87, 0x00, 0xcc, 0xab, 0xce, 0xf6, 0xf0, 0x49, 0x39, 0x4d, 0x89, - 0x74, 0x8a, 0x93, 0xa9, 0x40, 0x52, 0xe0, 0xa4, 0xbb, 0x96, 0x58, 0xb4, - 0xcb, 0x02, 0x71, 0xfe, 0xd9, 0xcc, 0xf3, 0xfe, 0xe6, 0xc7, 0x52, 0xeb, - 0x9e, 0xa8, 0xac, 0x67, 0xd3, 0x48, 0xcb, 0x2d, 0x64, 0xc4, 0x46, 0x91, - 0xaa, 0x01, 0x2d, 0x5c, 0xe7, 0x2a, 0xf4, 0xa1, 0x6b, 0x5c, 0x3c, 0xd4, - 0xc0, 0xd1, 0x7f, 0xc4, 0x81, 0x80, 0xbf, 0x27, 0xb0, 0xe6, 0xfe, 0x39, - 0xb9, 0xd7, 0x26, 0x8f, 0x22, 0x00, 0xdf, 0x27, 0x3b, 0xd1, 0x82, 0x80, - 0xbe, 0x05, 0x20, 0xff, 0xcb, 0x5f, 0x97, 0x17, 0xb6, 0x40, 0xd7, 0xd8, - 0xdc, 0x04, 0x05, 0xe1, 0xbe, 0xda, 0x70, 0xa7, 0x61, 0x5e, 0x2f, 0x78, - 0xf1, 0xb1, 0xc5, 0x91, 0x87, 0xd6, 0xbe, 0x33, 0x33, 0xe3, 0x65, 0xa3, - 0xae, 0x1a, 0xe5, 0x69, 0xb9, 0xbf, 0x34, 0xf6, 0x52, 0xa0, 0xec, 0x5b, - 0x73, 0x10, 0x71, 0x1d, 0x77, 0x39, 0x0e, 0x92, 0x6f, 0xd4, 0xf9, 0x47, - 0xbf, 0x9c, 0x98, 0x63, 0x78, 0x8a, 0x4c, 0xdd, 0x27, 0x50, 0x24, 0xf8, - 0x24, 0xbf, 0xc2, 0xd7, 0x1a, 0xe4, 0x23, 0x62, 0xda, 0x3e, 0xdc, 0xb0, - 0x7f, 0x63, 0x93, 0xee, 0xd1, 0x17, 0x89, 0x9f, 0x00, 0x5a, 0x9d, 0x03, - 0x57, 0xc2, 0x26, 0x24, 0xcc, 0x4f, 0xae, 0xf4, 0xa6, 0xb5, 0x87, 0x12, - 0x25, 0x87, 0x48, 0x1d, 0x66, 0xff, 0xf1, 0x3a, 0x21, 0x57, 0x48, 0x35, - 0x6d, 0x45, 0xad, 0xff, 0x31, 0x42, 0x2e, 0x9e, 0x01, 0xb1, 0xc6, 0x55, - 0xf1, 0xa6, 0x6b, 0x64, 0x03, 0x68, 0x17, 0x0b, 0x6a, 0x23, 0xd9, 0x78, - 0x40, 0x55, 0x5a, 0x0c, 0x35, 0x05, 0x21, 0x44, 0xe3, 0x80, 0xee, 0xd8, - 0xb6, 0x49, 0xf0, 0x70, 0x4c, 0xeb, 0x89, 0x22, 0x09, 0x67, 0x91, 0xf5, - 0xac, 0xbd, 0x8f, 0xe4, 0xbf, 0x64, 0x4a, 0xf9, 0x28, 0xa8, 0x95, 0x14, - 0x7b, 0xa2, 0x57, 0x4f, 0xf9, 0x99, 0x52, 0x19, 0x08, 0x95, 0x61, 0xc5, - 0x58, 0xf7, 0x28, 0xbf, 0x3b, 0x3b, 0x9f, 0x1b, 0x97, 0xd0, 0x33, 0x79, - 0xf6, 0xff, 0x2f, 0x5a, 0xd8, 0x68, 0xd0, 0xf8, 0x79, 0x60, 0xa3, 0xa8, - 0xa8, 0x83, 0xf7, 0xb3, 0xc3, 0x74, 0xd7, 0x37, 0xb2, 0x18, 0x8f, 0x40, - 0xaf, 0x9f, 0x2c, 0xa4, 0x32, 0xef, 0x93, 0xf4, 0xb4, 0xe3, 0xbc, 0xd0, - 0x4d, 0xb0, 0xac, 0xee, 0x11, 0x26, 0xe2, 0xbd, 0x17, 0x55, 0x7d, 0xa2, - 0x5d, 0xb4, 0x51, 0xd1, 0xfb, 0x01, 0xc6, 0x92, 0xa0, 0x80, 0x13, 0xf2, - 0xa3, 0xe3, 0xbd, 0x92, 0x96, 0x4c, 0x47, 0x21, 0x2a, 0x0f, 0x31, 0xe2, - 0xd6, 0x83, 0xfb, 0xc6, 0x80, 0x0e, 0x62, 0x67, 0x68, 0x39, 0x50, 0x4e, - 0x35, 0x89, 0xf5, 0x32, 0xcd, 0x4f, 0xaa, 0x16, 0x77, 0x4b, 0x23, 0xc0, - 0xe7, 0x4f, 0x5b, 0x76, 0xa6, 0x21, 0x32, 0x4b, 0x3e, 0xcf, 0xac, 0xac, - 0x5b, 0xef, 0x6a, 0x44, 0x2a, 0x7d, 0xba, 0xbb, 0x95, 0x5e, 0xe4, 0x5b, - 0xf4, 0xcc, 0x38, 0x26, 0x87, 0xfb, 0x88, 0x83, 0x5c, 0xce, 0xe8, 0x9f, - 0xdc, 0x4a, 0x91, 0xde, 0x3b, 0x3b, 0x08, 0x85, 0xe6, 0xc4, 0x8f, 0xe2, - 0xea, 0xff, 0x30, 0x62, 0xfc, 0x02, 0x7a, 0xd5, 0x8b, 0xdf, 0x72, 0xb6, - 0xb3, 0x42, 0x35, 0xa6, 0x35, 0x4f, 0x86, 0xdb, 0xb1, 0x4b, 0xb3, 0x29, - 0xeb, 0xd2, 0xb0, 0x7d, 0x0a, 0x1f, 0xb8, 0x30, 0x5a, 0x01, 0x86, 0x49, - 0x5e, 0x23, 0xc6, 0x5d, 0x05, 0x2b, 0xfb, 0x7b, 0x49, 0x99, 0xed, 0x34, - 0x5d, 0xda, 0xf8, 0xa3, 0xc0, 0x47, 0x93, 0x24, 0x67, 0x0f, 0x0b, 0xd1, - 0x6e, 0x76, 0x1b, 0xcb, 0xe8, 0x72, 0x52, 0xb8, 0xf1, 0xb7, 0x75, 0xa6, - 0x08, 0x4e, 0xbb, 0x3a, 0x10, 0xc4, 0xdf, 0x09, 0xa1, 0x4f, 0xe5, 0x28, - 0x69, 0xd9, 0x46, 0x56, 0x53, 0x2f, 0x78, 0xb8, 0x63, 0xd4, 0xc5, 0xe4, - 0xa9, 0x4b, 0x35, 0x95, 0x59, 0xd6, 0xbb, 0xfa, 0x83, 0xdd, 0x75, 0x16, - 0xa5, 0xfc, 0xe0, 0x45, 0xb8, 0x0c, 0x14, 0xb3, 0x06, 0xd4, 0x1a, 0xcb, - 0x32, 0xd5, 0xbe, 0xab, 0x18, 0xe3, 0xa3, 0xfe, 0x5f, 0x99, 0x08, 0x63, - 0x91, 0x0a, 0xf4, 0xe2, 0xe1, 0x13, 0x92, 0x96, 0xbf, 0x95, 0xe9, 0x45, - 0xc2, 0xe5, 0x0c, 0xf7, 0x52, 0xa2, 0x6f, 0x4a, 0xfd, 0x60, 0x20, 0x3b, - 0x7a, 0xa7, 0x1e, 0x10, 0x01, 0xed, 0xcb, 0x98, 0x5c, 0x98, 0x47, 0xad, - 0x3e, 0xae, 0xa0, 0x62, 0x74, 0x95, 0x4b, 0x39, 0xc1, 0x66, 0x8d, 0x97, - 0x66, 0x85, 0xb7, 0x8d, 0x9e, 0xf0, 0x1a, 0x74, 0xe5, 0x2b, 0x6a, 0xc2, - 0x47, 0xe7, 0x2a, 0xd8, 0xec, 0x8a, 0xf5, 0x5a, 0xc3, 0x4c, 0xac, 0x5f, - 0xf6, 0x2b, 0x21, 0xba, 0xb9, 0xd0, 0x17, 0xab, 0xe5, 0x47, 0x8e, 0x2c, - 0xbe, 0xf3, 0xd7, 0x0f, 0x6a, 0x37, 0xfd, 0x14, 0x11, 0xde, 0x4c, 0x64, - 0xa8, 0xd8, 0x15, 0xee, 0x65, 0xb6, 0xce, 0x7b, 0x81, 0x3b, 0xe6, 0x71, - 0xbe, 0x8f, 0x05, 0xf7, 0x0e, 0xb7, 0x71, 0x9a, 0x47, 0x92, 0xcf, 0xff, - 0xf7, 0xa6, 0x2c, 0x95, 0x21, 0x8b, 0x54, 0xce, 0x54, 0xee, 0xcc, 0x42, - 0xc6, 0x1c, 0xdc, 0xf2, 0x09, 0xaa, 0x45, 0x3e, 0x73, 0x3e, 0xf6, 0xaa, - 0x56, 0xf2, 0xd7, 0xda, 0x6a, 0x21, 0x63, 0x07, 0xd3, 0x16, 0x94, 0xc1, - 0x2f, 0xe5, 0x0f, 0x91, 0x9d, 0x4d, 0x49, 0xa2, 0x4d, 0x96, 0xca, 0x3e, - 0xe2, 0x32, 0x45, 0xc2, 0x0d, 0x86, 0x98, 0x82, 0x56, 0x9c, 0xdb, 0xab, - 0x5f, 0x2c, 0xc0, 0x00, 0x72, 0x81, 0x30, 0x93, 0x4e, 0xa7, 0x91, 0xd4, - 0x6c, 0xe3, 0x0a, 0xe5, 0x94, 0x5f, 0x9b, 0xb9, 0x25, 0x43, 0xf6, 0x16, - 0x5b, 0x0f, 0x0b, 0x60, 0x26, 0x28, 0x02, 0x3a, 0xed, 0x65, 0x2e, 0x78, - 0xc9, 0x28, 0x93, 0x50, 0x3c, 0x46, 0xcb, 0x90, 0xb9, 0x82, 0xbe, 0xc1, - 0x35, 0x87, 0x1a, 0x0d, 0x84, 0x76, 0x1f, 0xd5, 0xe8, 0xb2, 0xb0, 0xd2, - 0x55, 0x06, 0x6c, 0xad, 0x28, 0x23, 0x0f, 0xf4, 0x3f, 0x11, 0x98, 0xaf, - 0xde, 0xdc, 0x49, 0x9e, 0x6f, 0xa0, 0x2c, 0x3d, 0xd0, 0x86, 0x0e, 0x6d, - 0x0f, 0x48, 0xf0, 0xa4, 0x5f, 0x92, 0x49, 0x5c, 0x3c, 0x1a, 0x56, 0x41, - 0x4d, 0x40, 0x8a, 0x26, 0x11, 0x85, 0x57, 0xe9, 0x3b, 0xab, 0x19, 0xfb, - 0x95, 0x73, 0x1c, 0x88, 0xe4, 0x6c, 0x21, 0xf2, 0xc4, 0xfd, 0x33, 0xe8, - 0x6b, 0x21, 0x43, 0xee, 0x12, 0x57, 0x6e, 0x77, 0xc1, 0x22, 0xe9, 0x66, - 0x8a, 0xee, 0x33, 0xad, 0x29, 0x81, 0xca, 0x50, 0x3c, 0x43, 0xf0, 0xda, - 0x17, 0x9a, 0xae, 0x9c, 0x29, 0x1a, 0xcd, 0x9e, 0xed, 0x7d, 0xd9, 0x75, - 0xa1, 0x2d, 0x8d, 0xf8, 0xdd, 0x1f, 0x9c, 0x4f, 0x09, 0x45, 0xdf, 0x3e, - 0x73, 0x98, 0xc4, 0x8a, 0xcd, 0xc9, 0x13, 0xb2, 0x4a, 0x98, 0x9b, 0xbd, - 0x7a, 0xf5, 0xe8, 0x41, 0xc9, 0x5c, 0x82, 0xa0, 0xce, 0xb8, 0x5c, 0xbe, - 0x07, 0x24, 0x8f, 0x56, 0x5c, 0x4b, 0xff, 0x0e, 0xbc, 0x51, 0x78, 0xd9, - 0x37, 0xd9, 0x8c, 0x43, 0x8f, 0xa4, 0x47, 0xc0, 0x02, 0x25, 0x73, 0x81, - 0xe3, 0x62, 0x5b, 0xb0, 0x1b, 0xe1, 0xe1, 0x34, 0xe9, 0x53, 0x29, 0xbf, - 0x81, 0xed, 0x7b, 0xe1, 0xe8, 0x2d, 0xbd, 0x2e, 0x91, 0x88, 0x2f, 0x2e, - 0x20, 0x70, 0x08, 0x35, 0x9b, 0xb0, 0xc0, 0xe1, 0xfe, 0xbb, 0xc1, 0x61, - 0x80, 0xa1, 0x52, 0x35, 0xfb, 0xb1, 0x47, 0x52, 0xbf, 0xf4, 0xbb, 0x0c, - 0xa0, 0x19, 0x7d, 0x8b, 0xae, 0xa0, 0x2d, 0x3e, 0xb7, 0xfc, 0x22, 0xac, - 0x7e, 0x28, 0x49, 0xba, 0xb6, 0xc7, 0xdb, 0x31, 0x53, 0x6b, 0x8d, 0x16, - 0xeb, 0x7b, 0xbb, 0x34, 0xc6, 0xb1, 0x66, 0x13, 0x74, 0x87, 0x0e, 0xe2, - 0x44, 0xf9, 0xe2, 0x20, 0x8a, 0xba, 0x14, 0x0a, 0x12, 0x00, 0xd7, 0x0d, - 0xdf, 0x38, 0x91, 0xb1, 0x94, 0x44, 0x5f, 0xa3, 0x09, 0x42, 0x53, 0x36, - 0xc4, 0xb8, 0xb1, 0x4b, 0x3c, 0x91, 0xac, 0xa7, 0xf4, 0xbe, 0xb0, 0x31, - 0x26, 0xa9, 0xb3, 0x42, 0xe4, 0x35, 0x56, 0x45, 0x6d, 0x55, 0x30, 0x52, - 0xbe, 0x17, 0xa8, 0x79, 0xba, 0xf2, 0xd8, 0xe2, 0x11, 0x8a, 0x1d, 0xda, - 0xff, 0x3b, 0xba, 0x47, 0x7a, 0x7d, 0xcd, 0x9e, 0x6f, 0xac, 0x30, 0x5c, - 0x85, 0x26, 0x33, 0x2e, 0x37, 0xdb, 0x74, 0xe0, 0x3e, 0x32, 0x27, 0x29, - 0xba, 0x3b, 0xa3, 0x75, 0x6a, 0x80, 0x85, 0x03, 0x54, 0xdd, 0xec, 0xbd, - 0xfc, 0x70, 0x77, 0x48, 0x73, 0x21, 0xbe, 0xdc, 0x67, 0x33, 0x5a, 0xb4, - 0x5b, 0x50, 0x0d, 0xf3, 0x63, 0x1d, 0x78, 0xe4, 0x29, 0x3c, 0x6f, 0x1a, - 0x37, 0x17, 0xee, 0xd9, 0x13, 0x7c, 0x14, 0x95, 0x09, 0x13, 0x42, 0xe4, - 0xfb, 0x6a, 0xff, 0x25, 0xa0, 0x04, 0xa5, 0xcf, 0xe2, 0xc6, 0x50, 0x51, - 0xf2, 0xd9, 0x2d, 0x9f, 0x63, 0xca, 0x1f, 0x8f, 0x47, 0x29, 0xa8, 0x26, - 0x1d, 0x97, 0x4a, 0xe7, 0x4a, 0xc2, 0xc6, 0x42, 0xbd, 0xa1, 0x8a, 0xf7, - 0xa5, 0x82, 0x8a, 0x73, 0x16, 0x06, 0x66, 0xb4, 0xc7, 0x42, 0x1e, 0x66, - 0x97, 0x05, 0x07, 0x97, 0xc0, 0x7f, 0x64, 0x7b, 0x97, 0x11, 0xa3, 0x53, - 0x94, 0x24, 0x84, 0xc5, 0x9e, 0x69, 0xb7, 0x4d, 0x63, 0x26, 0x63, 0x02, - 0x67, 0x02, 0x25, 0xe3, 0xfc, 0xea, 0x22, 0xcb, 0xbc, 0x8f, 0x2a, 0xc1, - 0x6e, 0x98, 0xc4, 0x4f, 0x70, 0x17, 0x5f, 0x1a, 0x4f, 0xcf, 0x89, 0xc2, - 0x92, 0x32, 0xa1, 0x24, 0xc3, 0xa3, 0x17, 0x7d, 0xee, 0x0f, 0xda, 0x02, - 0x80, 0xff, 0x10, 0xf2, 0xa7, 0xef, 0x11, 0x25, 0x8b, 0x41, 0x93, 0x93, - 0xb1, 0x62, 0x34, 0x7c, 0x44, 0xb8, 0xa3, 0xfd, 0x9a, 0x19, 0xe0, 0x4e, - 0xeb, 0xbb, 0xfd, 0x21, 0xce, 0x60, 0x61, 0x31, 0xc3, 0xa8, 0x7b, 0x8a, - 0xbf, 0x07, 0x8b, 0xd6, 0x88, 0x97, 0xcd, 0x65, 0xa8, 0xe6, 0x06, 0x82, - 0xf3, 0x4d, 0xca, 0x72, 0xd4, 0x7e, 0x0b, 0x32, 0x98, 0x24, 0x9f, 0x86, - 0x8b, 0x6a, 0x1d, 0x4c, 0xca, 0x51, 0x2b, 0x32, 0x4f, 0x40, 0xaf, 0x27, - 0x90, 0x73, 0x28, 0xbd, 0xef, 0xe6, 0x79, 0xd5, 0x96, 0x09, 0xbd, 0x45, - 0xb3, 0x32, 0x1c, 0xa0, 0x74, 0x3c, 0xb1, 0xdd, 0x97, 0xf4, 0xb2, 0xdd, - 0x6e, 0x9f, 0x27, 0xcf, 0xb3, 0x7c, 0xa5, 0xa1, 0x14, 0x08, 0x1a, 0x58, - 0xd8, 0xf3, 0xf4, 0x41, 0x2b, 0x8d, 0xe0, 0x0b, 0xe4, 0x08, 0x21, 0xbf, - 0x01, 0x5a, 0x9e, 0xb0, 0xa9, 0x43, 0xee, 0xba, 0x21, 0xbd, 0x0d, 0xd8, - 0x0d, 0x4f, 0x81, 0x5c, 0x07, 0xe3, 0x49, 0x4b, 0xd7, 0x28, 0x5f, 0xe0, - 0x34, 0x5b, 0xd3, 0x35, 0x80, 0xb4, 0xf9, 0x1e, 0xb7, 0xea, 0x95, 0x20, - 0x40, 0x40, 0x0a, 0xbd, 0xc7, 0x1d, 0xf8, 0xdd, 0xf3, 0xa9, 0x9e, 0x31, - 0x9b, 0xb4, 0x15, 0x0a, 0x94, 0xd8, 0xf2, 0xe8, 0x6b, 0x4a, 0xa5, 0xf5, - 0xbe, 0x6d, 0xb3, 0x61, 0x3a, 0xc9, 0x00, 0x00, 0x23, 0xc1, 0x1b, 0x6e, - 0x01, 0xe2, 0xbb, 0x52, 0x30, 0x6a, 0xdf, 0x32, 0xe5, 0x92, 0x8e, 0x55, - 0xbe, 0xb8, 0x6c, 0x04, 0x57, 0xbb, 0xc4, 0x1e, 0x5c, 0xf3, 0xa4, 0x26, - 0xe7, 0xef, 0xf5, 0xa8, 0x34, 0xff, 0xed, 0xcb, 0x9e, 0xa3, 0x0f, 0xc5, - 0xdf, 0x66, 0xb4, 0x99, 0xf6, 0x10, 0x56, 0xec, 0xb8, 0xcc, 0x2d, 0x6b, - 0xb5, 0x85, 0xe2, 0xfb, 0x47, 0xaf, 0x5f, 0x8a, 0x08, 0x69, 0xc9, 0xc2, - 0x06, 0x04, 0x53, 0x1c, 0xbd, 0xb2, 0xeb, 0x5c, 0x1c, 0x3d, 0x9b, 0x8a, - 0x01, 0x2b, 0x2b, 0xf6, 0xba, 0xc2, 0x2a, 0xf5, 0x50, 0xe3, 0x67, 0x25, - 0xa1, 0x66, 0x08, 0xf2, 0x4c, 0xef, 0xd3, 0xdd, 0xcb, 0x67, 0x87, 0x2b, - 0xa7, 0x01, 0x63, 0x37, 0x63, 0xbc, 0xd9, 0xe3, 0x95, 0x1d, 0x36, 0x0e, - 0x1f, 0xb9, 0xd6, 0x09, 0x86, 0x31, 0x21, 0xac, 0x09, 0x14, 0xa4, 0xbb, - 0x54, 0x81, 0xb8, 0x28, 0xe4, 0x5e, 0x96, 0x53, 0x37, 0x78, 0x6e, 0xfa, - 0xf3, 0xf9, 0xd5, 0x1f, 0xbd, 0xc8, 0xf5, 0x9e, 0x09, 0x43, 0x4c, 0x44, - 0x84, 0x51, 0xc1, 0x51, 0xe1, 0x66, 0x30, 0xd7, 0xfb, 0x41, 0x7b, 0x57, - 0xae, 0x80, 0x41, 0x04, 0xd6, 0xec, 0xc9, 0xb1, 0x1b, 0xdd, 0xb3, 0x6f, - 0x24, 0x38, 0x3f, 0x4f, 0xe5, 0x99, 0x2a, 0x31, 0x20, 0x04, 0x73, 0xa3, - 0xb4, 0x84, 0xc5, 0x21, 0x53, 0x20, 0xce, 0xd6, 0x87, 0x59, 0xfe, 0x5d, - 0x06, 0x26, 0x88, 0x96, 0x34, 0xb3, 0x45, 0x8d, 0xaa, 0x08, 0x87, 0xa0, - 0xc7, 0xa1, 0x5e, 0xde, 0xda, 0xe2, 0xb2, 0x50, 0x04, 0x05, 0x60, 0x50, - 0x7f, 0x85, 0xbc, 0x86, 0xf9, 0xa4, 0x9b, 0xff, 0x2f, 0xd4, 0xdd, 0xdf, - 0xd1, 0x5d, 0xd3, 0x1e, 0xd9, 0x2c, 0xf6, 0x9c, 0x57, 0x8b, 0xa2, 0xd6, - 0x76, 0xe6, 0x02, 0x19, 0x40, 0x9a, 0x8e, 0xf5, 0x6f, 0x7a, 0x26, 0x4a, - 0x01, 0xb1, 0xee, 0xfc, 0x38, 0x56, 0xc7, 0xdf, 0x93, 0x5e, 0x01, 0x07, - 0xd4, 0x4b, 0x89, 0xd5, 0xe4, 0xe3, 0xe6, 0x1b, 0x8c, 0x26, 0xf9, 0xa2, - 0x98, 0x96, 0xca, 0x4e, 0x52, 0x78, 0xa4, 0xb2, 0xa1, 0x21, 0x79, 0xf4, - 0x48, 0x47, 0x6a, 0x89, 0xa0, 0xfc, 0xc6, 0xcf, 0xcc, 0x4a, 0x9f, 0xfa, - 0x5b, 0xca, 0xb8, 0xe6, 0x34, 0xe8, 0x9f, 0x04, 0x3c, 0xf5, 0xc6, 0xd4, - 0xac, 0x94, 0x7f, 0x3c, 0x35, 0xa4, 0x88, 0xf8, 0x4c, 0xdf, 0x03, 0x7e, - 0xb5, 0xe2, 0xd5, 0xc6, 0x0c, 0xef, 0xfc, 0xeb, 0x42, 0xd4, 0x24, 0x34, - 0x01, 0xcd, 0x99, 0x27, 0xa3, 0x2c, 0x76, 0xff, 0x23, 0x96, 0x5e, 0xac, - 0xa5, 0x9d, 0xc4, 0xda, 0xee, 0xf5, 0x03, 0x72, 0xf9, 0x06, 0xdf, 0x2f, - 0x55, 0x0a, 0xca, 0x4d, 0x54, 0xc7, 0x36, 0x20, 0x4d, 0x49, 0x59, 0x75, - 0x4a, 0xcb, 0xfd, 0x55, 0xeb, 0x73, 0xda, 0xc8, 0x76, 0x0b, 0xd5, 0x60, - 0x28, 0x4e, 0xe1, 0xf1, 0xb1, 0xe3, 0xf0, 0x47, 0x6d, 0xf3, 0x8a, 0x88, - 0x63, 0xc3, 0xeb, 0x06, 0x4c, 0x5e, 0x76, 0x2b, 0xe6, 0x14, 0x1b, 0xe7, - 0x33, 0xc0, 0x26, 0x73, 0x71, 0xb8, 0xc0, 0x3a, 0x95, 0x2f, 0x99, 0xf5, - 0x2f, 0x76, 0x64, 0x64, 0xe0, 0x6b, 0xba, 0xde, 0x2e, 0x2a, 0x5a, 0x97, - 0xaf, 0x10, 0x7c, 0xff, 0x90, 0xab, 0xf5, 0x4f, 0x67, 0x36, 0x12, 0xee, - 0x02, 0x6f, 0xec, 0xed, 0x2f, 0x9a, 0x6e, 0x8f, 0x47, 0xb3, 0xef, 0xcd, - 0x72, 0x8f, 0x6f, 0xd7, 0xb7, 0x00, 0x32, 0xfb, 0x8d, 0xc9, 0xc3, 0x17, - 0x59, 0x24, 0x6b, 0x56, 0x7d, 0x9f, 0xa4, 0x66, 0xcb, 0xe2, 0x44, 0x81, - 0x22, 0xcd, 0x15, 0xd5, 0xdb, 0xcd, 0x18, 0x4c, 0xf3, 0x2c, 0x13, 0xf3, - 0xda, 0x19, 0xcb, 0x53, 0x6d, 0x18, 0xbb, 0x20, 0x87, 0xf7, 0x5c, 0x1d, - 0x1a, 0x5e, 0xb3, 0x89, 0x9f, 0x84, 0xa0, 0xad, 0x64, 0x6b, 0xce, 0xaf, - 0x9a, 0x28, 0xa3, 0x18, 0xf5, 0xf4, 0xae, 0xbc, 0xfd, 0x13, 0x27, 0xfc, - 0x93, 0x35, 0xef, 0x63, 0xfc, 0x63, 0x47, 0x1b, 0x1a, 0x27, 0xb9, 0x23, - 0xdf, 0xad, 0x35, 0x07, 0xe8, 0x9f, 0x1c, 0x61, 0xe9, 0xe0, 0xa8, 0x6b, - 0xce, 0xee, 0x49, 0xee, 0x93, 0x44, 0x4a, 0x24, 0x9f, 0xc3, 0xac, 0xe0, - 0x59, 0x9c, 0xc0, 0xa6, 0x16, 0x1d, 0xcd, 0xa2, 0x55, 0xe7, 0x60, 0xc9, - 0xc3, 0x90, 0xdb, 0x76, 0x6a, 0xe8, 0xbd, 0xa7, 0x6d, 0xce, 0xbc, 0xb8, - 0xcd, 0x7f, 0xa7, 0x81, 0xb9, 0x91, 0x50, 0x6b, 0xa5, 0xe1, 0xbd, 0xd9, - 0xe6, 0x2f, 0x86, 0xd9, 0x6a, 0xf3, 0xa6, 0x59, 0x78, 0xde, 0x49, 0x24, - 0xa7, 0xf4, 0x0f, 0x6b, 0x3e, 0x8f, 0x73, 0x7b, 0x9b, 0xa9, 0xba, 0xbf, - 0xaf, 0x97, 0xcd, 0x68, 0x18, 0x1f, 0xfc, 0x4d, 0xaf, 0x64, 0x14, 0x89, - 0x10, 0x93, 0x7c, 0x7c, 0x87, 0xf5, 0x7c, 0xfc, 0x27, 0xf3, 0xf1, 0x25, - 0x5d, 0xa2, 0x3e, 0xbc, 0x21, 0x18, 0x4a, 0x1e, 0x73, 0x42, 0x6c, 0xc8, - 0x97, 0x43, 0x66, 0x22, 0x16, 0x0a, 0x44, 0x2b, 0x64, 0xae, 0xe2, 0xf2, - 0xd5, 0xc2, 0x51, 0x42, 0xd8, 0xc8, 0xee, 0xe5, 0xbe, 0x8f, 0x02, 0x2f, - 0xd5, 0x10, 0xeb, 0xb8, 0x35, 0x42, 0x69, 0x03, 0xff, 0x6a, 0x7d, 0xaf, - 0x50, 0x6e, 0x9d, 0xa2, 0x65, 0x94, 0xb0, 0x3a, 0xe6, 0x0c, 0x0e, 0x87, - 0xaf, 0x9f, 0x11, 0x35, 0x1f, 0x97, 0x25, 0x9e, 0x20, 0x22, 0xe5, 0xfe, - 0x91, 0x9b, 0x71, 0xda, 0xd7, 0x9b, 0x05, 0x11, 0xbd, 0x2d, 0x9f, 0x6d, - 0x96, 0x54, 0xd2, 0x2b, 0xfe, 0x24, 0xa2, 0xa0, 0x25, 0x56, 0xec, 0x0a, - 0xcd, 0x19, 0x23, 0x31, 0x4b, 0x38, 0x69, 0xe0, 0x86, 0x67, 0xce, 0xe4, - 0xf5, 0xdc, 0x46, 0xf5, 0x72, 0x6e, 0xe1, 0x7f, 0x86, 0x01, 0x98, 0xd4, - 0x40, 0xd0, 0x86, 0xc5, 0x67, 0x5e, 0x1c, 0x31, 0xbe, 0xf0, 0x58, 0xe1, - 0x1f, 0x2c, 0xa8, 0xd4, 0x9f, 0x01, 0xf5, 0x7b, 0x14, 0x32, 0xb8, 0x7e, - 0xbf, 0xa7, 0x8e, 0xc6, 0x09, 0xd4, 0x19, 0x3f, 0x88, 0x3d, 0xf8, 0x1b, - 0xe7, 0x5b, 0xb5, 0x7a, 0xf5, 0x0f, 0x2f, 0x17, 0x51, 0xd7, 0x23, 0x02, - 0x87, 0x73, 0x68, 0x0b, 0xdf, 0x84, 0x63, 0xe6, 0xba, 0xb8, 0xc2, 0x88, - 0x9e, 0xcd, 0x5b, 0x25, 0x99, 0x6d, 0x99, 0x1a, 0xcb, 0x49, 0xae, 0x0d, - 0xb1, 0x59, 0x7d, 0x6f, 0x3a, 0x62, 0x0b, 0x20, 0x21, 0xed, 0x40, 0xf2, - 0x50, 0x83, 0xd6, 0x87, 0x00, 0x26, 0x1f, 0x1f, 0x84, 0xf6, 0x2c, 0xb8, - 0x64, 0x25, 0x59, 0x77, 0x7a, 0x41, 0x4d, 0xdc, 0xcd, 0x47, 0x4e, 0x24, - 0x98, 0x88, 0x45, 0x76, 0xee, 0xf7, 0x39, 0xc8, 0x2e, 0xd2, 0x30, 0x04, - 0x17, 0x23, 0x0d, 0xaa, 0xa8, 0x1e, 0x13, 0x77, 0x2e, 0x55, 0x95, 0x8d, - 0x3c, 0x8e, 0x06, 0xe0, 0x98, 0xb3, 0xe4, 0x97, 0xba, 0x9c, 0x28, 0x35, - 0x67, 0xab, 0x6b, 0xcb, 0x40, 0xcb, 0x7a, 0xfe, 0x5a, 0x89, 0xa9, 0x35, - 0x23, 0x2b, 0xad, 0x1a, 0x90, 0xd8, 0x61, 0xcc, 0x05, 0xbd, 0x37, 0x3b, - 0x52, 0x20, 0x28, 0xa0, 0xc6, 0x17, 0xc9, 0x3f, 0x83, 0x42, 0x37, 0x7d, - 0x7d, 0x60, 0x43, 0x1b, 0xbf, 0xba, 0xa3, 0xba, 0x3e, 0x5a, 0xdb, 0x33, - 0x5c, 0x33, 0x36, 0x3b, 0xb3, 0xc1, 0x98, 0x87, 0xe4, 0x0b, 0x94, 0xcc, - 0xc6, 0xcb, 0xd7, 0xe5, 0xd5, 0x31, 0x65, 0xc4, 0xdd, 0x09, 0x48, 0x05, - 0x60, 0x6a, 0xcf, 0x67, 0x37, 0x42, 0x78, 0x67, 0xbc, 0xa9, 0x7a, 0x1c, - 0x7d, 0x98, 0x27, 0x6c, 0x63, 0x31, 0xdc, 0x0f, 0x5d, 0xa8, 0x09, 0x7a, - 0xef, 0x78, 0x8c, 0x13, 0xd5, 0x1a, 0x03, 0xeb, 0x88, 0xcb, 0x01, 0x8f, - 0x73, 0x39, 0x5f, 0x88, 0x94, 0xdd, 0xd9, 0x73, 0xcc, 0x67, 0x1a, 0xa7, - 0x2e, 0x4a, 0xa1, 0x33, 0x7a, 0xf5, 0xcd, 0x8d, 0x36, 0x78, 0xb1, 0x8c, - 0x2d, 0x8e, 0xc7, 0x89, 0x17, 0xa5, 0x3c, 0xf8, 0x67, 0x4c, 0xe4, 0x31, - 0xdf, 0x77, 0xf9, 0x8b, 0xab, 0xb5, 0x80, 0x51, 0x69, 0xc9, 0x30, 0x5d, - 0x00, 0x06, 0x9f, 0xd4, 0xb5, 0x2c, 0x2a, 0xf5, 0x26, 0x6a, 0x5b, 0x92, - 0x3c, 0x6c, 0xae, 0x42, 0x49, 0x5c, 0xd9, 0x5e, 0xb0, 0x63, 0x78, 0x8d, - 0x1f, 0x68, 0x61, 0x05, 0xc8, 0xd0, 0x27, 0xa4, 0x18, 0xdb, 0x27, 0x33, - 0x07, 0xe0, 0x20, 0x4c, 0xf9, 0xc0, 0x91, 0xc7, 0x90, 0xb2, 0x7c, 0x9d, - 0xf6, 0xa0, 0x8d, 0x21, 0xd8, 0x08, 0x8c, 0x16, 0x78, 0x5c, 0xa9, 0x9b, - 0xf8, 0xfb, 0xcb, 0xa7, 0x49, 0x0e, 0xfd, 0xe7, 0x6b, 0x07, 0x6b, 0x08, - 0x7e, 0x88, 0xdc, 0x1d, 0xc5, 0x62, 0xd1, 0x3b, 0x51, 0xb1, 0x0e, 0x12, - 0xf1, 0xa3, 0xba, 0x96, 0xf3, 0x71, 0xe5, 0xe3, 0xf1, 0x07, 0x09, 0x18, - 0xee, 0x37, 0x93, 0x52, 0xf3, 0xf7, 0xc2, 0xa2, 0x36, 0x77, 0x4e, 0x89, - 0xf2, 0x76, 0xcb, 0x96, 0x74, 0x1d, 0x71, 0xe7, 0xb3, 0x51, 0xf2, 0x26, - 0x2f, 0x1e, 0x86, 0x32, 0xe9, 0xb8, 0x45, 0xb6, 0x84, 0xaa, 0x04, 0x23, - 0xd7, 0x92, 0x01, 0x3d, 0x64, 0x06, 0x35, 0xcd, 0x72, 0xc8, 0xbd, 0xb0, - 0x78, 0x3c, 0x2d, 0x83, 0x2b, 0x26, 0x0a, 0xc9, 0x89, 0x27, 0x76, 0x58, - 0xdb, 0xa4, 0x93, 0xea, 0xdb, 0x21, 0xa2, 0x70, 0xa6, 0xb5, 0x78, 0x40, - 0xe9, 0xa7, 0xee, 0xb9, 0x59, 0x19, 0x32, 0x2c, 0xfd, 0xea, 0x1b, 0xdc, - 0x68, 0x49, 0x81, 0x17, 0x9e, 0x94, 0x93, 0x4e, 0x21, 0xc7, 0xe8, 0x1a, - 0x59, 0x2f, 0xe4, 0x02, 0x8f, 0x05, 0xcf, 0x73, 0x0a, 0xd1, 0x0b, 0x2e, - 0x6e, 0xe1, 0x16, 0xa3, 0x2f, 0x1d, 0x6a, 0x64, 0x9d, 0x8a, 0xca, 0xf6, - 0x28, 0x9f, 0x3c, 0x0f, 0x26, 0x8a, 0x82, 0x9b, 0x75, 0xbf, 0x59, 0xd1, - 0xc1, 0xaa, 0x03, 0xaa, 0x5a, 0x37, 0x29, 0xc3, 0x09, 0xb0, 0x7f, 0xe2, - 0xd0, 0xc9, 0x29, 0xc9, 0x01, 0xb0, 0xaa, 0x52, 0xb4, 0x55, 0x42, 0xe9, - 0xe8, 0x65, 0xbc, 0xe0, 0x70, 0x1c, 0x77, 0xf5, 0xa8, 0x03, 0xcb, 0x0d, - 0xd9, 0x0d, 0x24, 0xaf, 0xf9, 0xd7, 0x7e, 0xef, 0x8c, 0xdb, 0x17, 0xef, - 0x5e, 0x1b, 0xb9, 0x2d, 0x8d, 0xc7, 0x37, 0x7b, 0x64, 0x8a, 0xf6, 0x8b, - 0xb4, 0x33, 0x62, 0xf7, 0x7d, 0xe9, 0x0c, 0x22, 0xe6, 0x87, 0xb7, 0xc9, - 0xd5, 0x01, 0x18, 0xb5, 0x78, 0x39, 0x0f, 0x43, 0xfe, 0x3e, 0x8c, 0x64, - 0x7a, 0xbd, 0x56, 0x34, 0x42, 0x6b, 0xf0, 0x63, 0x9f, 0x7e, 0x8b, 0x09, - 0x6a, 0xc6, 0x57, 0x49, 0xc1, 0x66, 0x26, 0x3d, 0xae, 0xba, 0xf7, 0xe5, - 0x68, 0x3f, 0xd3, 0x22, 0x6a, 0xc2, 0xa8, 0x8d, 0xce, 0xc0, 0x5d, 0x64, - 0xf3, 0x06, 0x0d, 0x8e, 0xbf, 0xeb, 0x7e, 0xd4, 0x7d, 0x6d, 0x81, 0xd5, - 0x55, 0xc1, 0x4b, 0x18, 0x11, 0x4e, 0xfd, 0x01, 0xbe, 0xaf, 0x72, 0x7f, - 0xf9, 0xa1, 0x66, 0x08, 0xea, 0x26, 0x17, 0x53, 0x02, 0x4c, 0x25, 0x06, - 0x1a, 0x9c, 0xf7, 0xcc, 0x73, 0x44, 0x73, 0x8a, 0xd1, 0xe6, 0x87, 0x44, - 0xb3, 0x45, 0x98, 0x8a, 0xa8, 0xb2, 0xfa, 0x35, 0x2a, 0x6c, 0x7f, 0x44, - 0x57, 0x2e, 0x0f, 0xef, 0xd3, 0x2d, 0xb0, 0xcc, 0x2d, 0xcc, 0xa0, 0x34, - 0xc5, 0x54, 0xf4, 0xed, 0x1f, 0x07, 0x38, 0x07, 0x8b, 0x39, 0xe4, 0x52, - 0x3d, 0x88, 0x04, 0x2a, 0x15, 0x63, 0xdd, 0xaf, 0x5f, 0x79, 0x01, 0xbd, - 0x9b, 0x86, 0xe8, 0x9b, 0x87, 0x7b, 0x9e, 0x24, 0xd4, 0xd0, 0x1b, 0x7c, - 0x57, 0x0f, 0x2c, 0x9b, 0x6e, 0x40, 0x2f, 0xf6, 0xa5, 0x43, 0x6a, 0x3e, - 0xab, 0x8b, 0x84, 0x28, 0x9a, 0x5d, 0x85, 0x17, 0x47, 0x36, 0x63, 0x1e, - 0xd0, 0x9f, 0x28, 0xf8, 0xfd, 0x8a, 0xc5, 0xf5, 0x0d, 0x76, 0x62, 0x77, - 0x95, 0xf7, 0xbb, 0x2a, 0x5f, 0x87, 0x70, 0x8d, 0xc9, 0xe1, 0xf9, 0x83, - 0x3e, 0xd0, 0xee, 0x97, 0x07, 0x59, 0xcb, 0x25, 0x37, 0x4f, 0x9c, 0x89, - 0xfc, 0x41, 0xea, 0x72, 0x24, 0x12, 0x30, 0xb5, 0x0a, 0xc4, 0x81, 0xd0, - 0x78, 0xd3, 0x0c, 0xc1, 0xd4, 0x0c, 0x57, 0x2b, 0x65, 0xb6, 0x3e, 0xa9, - 0xb7, 0x98, 0xa9, 0x30, 0xc3, 0xac, 0x7b, 0x3d, 0x71, 0x25, 0xc7, 0xe1, - 0x99, 0xc9, 0xff, 0x2d, 0xc5, 0x9f, 0x95, 0x54, 0x98, 0x0c, 0xba, 0x55, - 0xa2, 0xea, 0x87, 0xac, 0xd5, 0xba, 0x63, 0x34, 0x02, 0xbf, 0xc3, 0x96, - 0x8f, 0x84, 0xec, 0x5c, 0xea, 0x49, 0xbe, 0xf9, 0x1e, 0x15, 0x74, 0xc3, - 0x28, 0x22, 0xff, 0xeb, 0xf4, 0x30, 0x67, 0x4a, 0x40, 0x03, 0x30, 0x08, - 0x5b, 0xa4, 0xd2, 0x18, 0xd9, 0xec, 0xdd, 0x14, 0x4f, 0xe3, 0x6c, 0xda, - 0x66, 0x95, 0xd0, 0x32, 0x7b, 0x16, 0x83, 0x1c, 0x6c, 0x6c, 0x66, 0x31, - 0x40, 0x9b, 0xa4, 0x6e, 0x29, 0x39, 0xf2, 0x2d, 0x5c, 0xad, 0x76, 0x04, - 0xa1, 0x50, 0x03, 0x2d, 0x8e, 0xdb, 0xcb, 0x42, 0xb1, 0x9f, 0x98, 0xd9, - 0x5a, 0xf9, 0x14, 0xc4, 0xd1, 0x52, 0x48, 0x9c, 0x2b, 0x7e, 0x3c, 0x12, - 0x5f, 0xa8, 0x56, 0x76, 0x88, 0x2b, 0xb7, 0xfd, 0x16, 0x7a, 0x28, 0xb6, - 0xb3, 0xdf, 0xb0, 0xe8, 0x05, 0x3b, 0x79, 0xdd, 0x73, 0x7f, 0x8e, 0x33, - 0x61, 0x1b, 0xfa, 0x5c, 0x49, 0xc2, 0x21, 0xf6, 0x7c, 0x3b, 0x6a, 0x6f, - 0x08, 0x75, 0x91, 0x74, 0x75, 0xe8, 0x14, 0xea, 0xbe, 0xeb, 0x30, 0x68, - 0x92, 0x3a, 0xb7, 0x25, 0x53, 0x13, 0x0c, 0xc8, 0x17, 0x4d, 0x70, 0xeb, - 0xa8, 0x9d, 0xa1, 0x57, 0xbb, 0x20, 0x0a, 0x0b, 0x01, 0x06, 0x95, 0xd7, - 0x83, 0xe6, 0xe8, 0x58, 0x38, 0x67, 0x17, 0xf8, 0x9a, 0x3e, 0x30, 0xb3, - 0xfa, 0xea, 0xb0, 0x95, 0x12, 0x24, 0x9f, 0x35, 0x8a, 0x9c, 0xbf, 0xdf, - 0x2c, 0xff, 0xce, 0xb1, 0x52, 0x07, 0xc5, 0x3c, 0xaa, 0x6a, 0x2e, 0x9f, - 0x63, 0x7c, 0xbd, 0xd3, 0x0d, 0xe8, 0xf4, 0x9d, 0x0c, 0xce, 0x67, 0xdc, - 0x5e, 0x35, 0xfa, 0x51, 0xae, 0xfe, 0xca, 0x2a, 0x25, 0x83, 0x80, 0xd0, - 0x7e, 0xe0, 0x49, 0x4a, 0x4f, 0xde, 0x97, 0xc0, 0x28, 0x93, 0xd5, 0x03, - 0xf1, 0xcc, 0xc1, 0x25, 0x19, 0xc5, 0xc3, 0xdc, 0x8c, 0xe4, 0x45, 0x19, - 0x1b, 0x8a, 0x79, 0xc8, 0xb5, 0x14, 0x13, 0x8e, 0xe8, 0xef, 0xe0, 0xeb, - 0xff, 0x4c, 0x89, 0x4d, 0x8d, 0xf4, 0xd2, 0x55, 0xca, 0x3e, 0x5b, 0x8b, - 0xd2, 0x12, 0x36, 0x47, 0x88, 0x9b, 0x6d, 0x9d, 0xcd, 0x29, 0x3a, 0x30, - 0x80, 0x89, 0x9a, 0x7c, 0x9c, 0x84, 0xf9, 0x63, 0xae, 0x13, 0x6f, 0x5d, - 0x24, 0xb9, 0x58, 0xd3, 0x16, 0xb8, 0x46, 0xc9, 0xcc, 0x0f, 0xcf, 0xee, - 0x11, 0xfb, 0xfa, 0x8f, 0x4a, 0x3b, 0x4b, 0x29, 0x64, 0x13, 0x20, 0x8b, - 0xe4, 0x96, 0x8e, 0x9a, 0xa9, 0xe2, 0xc8, 0x74, 0x64, 0x21, 0x21, 0x6d, - 0x1d, 0x42, 0xcb, 0x3e, 0xce, 0x07, 0x11, 0x2a, 0xbc, 0x11, 0x4f, 0xfe, - 0xa8, 0x61, 0x80, 0x93, 0xcf, 0x19, 0xac, 0xdb, 0x96, 0xde, 0x59, 0xad, - 0x47, 0x4e, 0x46, 0x83, 0x5f, 0x56, 0x3c, 0x8a, 0xca, 0x01, 0x4d, 0x67, - 0xea, 0x27, 0xa2, 0x41, 0xc4, 0xda, 0x76, 0xf7, 0x00, 0x17, 0x6e, 0x44, - 0x36, 0x30, 0x86, 0x24, 0x4a, 0x5f, 0x03, 0xb5, 0x42, 0xa7, 0xc6, 0xd0, - 0xba, 0x49, 0x43, 0x39, 0x55, 0xc8, 0xa3, 0xf7, 0x85, 0x40, 0xce, 0x34, - 0x26, 0x4e, 0xb8, 0x2d, 0x4f, 0x38, 0xca, 0x7b, 0xe9, 0x30, 0x88, 0xc8, - 0xb5, 0xd0, 0x9a, 0x71, 0x4a, 0x6b, 0x30, 0xf0, 0x3a, 0xca, 0x6f, 0x26, - 0x3e, 0x21, 0x4c, 0x46, 0x91, 0x8f, 0x67, 0xab, 0xbe, 0xf7, 0x1f, 0xeb, - 0xc7, 0x8e, 0x00, 0x5e, 0x29, 0x22, 0x6d, 0x85, 0xe3, 0x08, 0x9f, 0x49, - 0xf8, 0x78, 0xa0, 0xc9, 0x2f, 0x63, 0xf9, 0x3e, 0xab, 0x89, 0x5a, 0x8d, - 0x72, 0xe5, 0x91, 0xd7, 0x6c, 0x39, 0xe6, 0x13, 0x0e, 0xd0, 0xd7, 0x5f, - 0x38, 0x67, 0x87, 0x28, 0x30, 0x2e, 0x5e, 0x7c, 0x69, 0x6b, 0x3b, 0x3d, - 0x3d, 0x49, 0x8e, 0xf6, 0x77, 0xe5, 0xfe, 0xe1, 0x74, 0xf9, 0x46, 0xda, - 0x96, 0x98, 0xac, 0x8a, 0x8f, 0xed, 0x07, 0xdd, 0xea, 0x09, 0xa4, 0x97, - 0x3f, 0x12, 0x40, 0x57, 0xc2, 0xfd, 0x76, 0xe6, 0xd8, 0x81, 0x5d, 0xc4, - 0x54, 0x2f, 0x52, 0x1d, 0x76, 0xeb, 0x83, 0x37, 0x48, 0xca, 0xc3, 0x8e, - 0x9a, 0x87, 0x8a, 0xe3, 0xbd, 0xfe, 0x90, 0x4f, 0x5a, 0xd1, 0xed, 0x44, - 0xe8, 0x1f, 0x2a, 0x1c, 0x5c, 0xd1, 0x37, 0x17, 0x97, 0x7a, 0x91, 0x76, - 0x42, 0x3b, 0xa2, 0x97, 0x8a, 0x45, 0xca, 0xdc, 0x47, 0x22, 0x43, 0xd7, - 0xf6, 0x89, 0x46, 0xfe, 0x9a, 0xbe, 0xe9, 0xbd, 0xb2, 0x91, 0x43, 0x40, - 0x39, 0x98, 0xe2, 0xf9, 0xa7, 0xac, 0x5f, 0x15, 0x80, 0x80, 0x5e, 0xa9, - 0xb1, 0xf6, 0x8d, 0x72, 0xed, 0xb4, 0x24, 0x5a, 0x0d, 0xfe, 0x79, 0x70, - 0x4f, 0xda, 0x98, 0xb1, 0xa8, 0x05, 0xf7, 0x03, 0x39, 0x24, 0x5a, 0x8e, - 0x6c, 0xe0, 0x1c, 0x53, 0xf3, 0xf6, 0x1a, 0x9c, 0x25, 0x53, 0xeb, 0xff, - 0xa9, 0x95, 0x15, 0x79, 0x1c, 0xc7, 0xbe, 0xb2, 0xb0, 0x94, 0xa4, 0x33, - 0xd8, 0x07, 0xfe, 0x0b, 0x3d, 0xfd, 0x91, 0xbe, 0x13, 0x00, 0xa5, 0x6f, - 0x82, 0xe8, 0x4e, 0xae, 0x99, 0xb7, 0xdf, 0x67, 0x58, 0x87, 0xdb, 0x10, - 0xc0, 0x48, 0xf3, 0x51, 0x70, 0x35, 0xc4, 0x0d, 0x81, 0x14, 0xbd, 0x2f, - 0x73, 0x60, 0x2c, 0x39, 0xcc, 0xac, 0xa2, 0x3b, 0x05, 0x5b, 0xde, 0x43, - 0x48, 0xc0, 0x82, 0x2c, 0xf8, 0xc8, 0x3f, 0x5b, 0xbf, 0x8e, 0x3e, 0x7f, - 0x50, 0x65, 0x61, 0x48, 0xb4, 0xc8, 0xa9, 0x4e, 0x4e, 0x42, 0xcc, 0x66, - 0x6a, 0x74, 0x3e, 0x0e, 0x3b, 0x71, 0xbc, 0xf0, 0x66, 0x11, 0x8e, 0xc9, - 0x67, 0x6c, 0xd2, 0x82, 0x36, 0x16, 0xaf, 0x52, 0x8d, 0xbf, 0xbe, 0xbe, - 0x27, 0x32, 0xd1, 0x86, 0xa8, 0x5c, 0xaa, 0xc5, 0xb7, 0x38, 0xb9, 0x8f, - 0x65, 0x88, 0x41, 0x1b, 0xbd, 0x6d, 0xcc, 0x87, 0xa5, 0x0d, 0x31, 0x9b, - 0x1e, 0xa5, 0x1e, 0x01, 0xfe, 0x66, 0x18, 0x4c, 0xcd, 0x35, 0x42, 0xd8, - 0x04, 0x52, 0x31, 0x82, 0x30, 0x7f, 0xb7, 0x18, 0xb0, 0x6b, 0x90, 0xa8, - 0x43, 0x31, 0xa8, 0xca, 0x12, 0xd1, 0xa8, 0x4d, 0x9b, 0x37, 0xf2, 0x31, - 0xb8, 0xf4, 0xfc, 0x9f, 0x47, 0x36, 0xcb, 0x15, 0xc8, 0xb8, 0x31, 0xa4, - 0xb4, 0x1b, 0xa3, 0x94, 0xcc, 0xce, 0x59, 0x6b, 0x6a, 0x7c, 0xb5, 0x3e, - 0x41, 0xfe, 0x93, 0x8c, 0x2c, 0xce, 0x3e, 0xeb, 0x67, 0x8b, 0x06, 0xe5, - 0xd5, 0x86, 0x17, 0x3a, 0x52, 0xd2, 0x7a, 0x70, 0x2f, 0x53, 0x91, 0x2f, - 0x8e, 0x7e, 0x34, 0x65, 0xc8, 0x2a, 0xb0, 0x13, 0xb1, 0x2f, 0x94, 0xab, - 0x1d, 0xfd, 0x47, 0xb1, 0xf9, 0xa2, 0xd1, 0xc4, 0xd5, 0x8a, 0x11, 0xdc, - 0xb9, 0xb8, 0x5c, 0x07, 0x45, 0x01, 0x69, 0x8a, 0x67, 0x7b, 0x1b, 0x74, - 0x5c, 0xb5, 0x61, 0x78, 0x99, 0x07, 0x6b, 0x91, 0x63, 0x29, 0x69, 0x77, - 0xde, 0x23, 0x54, 0x25, 0x95, 0x2f, 0x06, 0x1f, 0x76, 0x3e, 0x99, 0xfd, - 0x98, 0xe2, 0x77, 0x6e, 0x9f, 0x98, 0xdf, 0xc8, 0x8b, 0x70, 0x1f, 0xbe, - 0xdf, 0xea, 0xaa, 0x2b, 0x0e, 0x7a, 0x2c, 0x23, 0xbc, 0x8d, 0xbc, 0x9a, - 0xed, 0x87, 0x7a, 0x7f, 0x59, 0xe0, 0x5b, 0xf6, 0x47, 0x43, 0xec, 0x04, - 0x20, 0x9f, 0x5e, 0xbf, 0x34, 0xac, 0x84, 0x72, 0x98, 0x4f, 0x15, 0x62, - 0x89, 0x5e, 0x40, 0x2a, 0xb5, 0xf2, 0x8d, 0x61, 0xf2, 0x31, 0xfc, 0xea, - 0x25, 0x7d, 0x78, 0xc6, 0xeb, 0x65, 0x83, 0xf9, 0x9c, 0x69, 0x6a, 0x52, - 0xea, 0xb4, 0x27, 0xc8, 0x10, 0x51, 0x11, 0x70, 0xc7, 0x3b, 0xf2, 0xdf, - 0x30, 0x5b, 0x16, 0xee, 0x2c, 0x72, 0x28, 0xa1, 0x18, 0xcf, 0xa3, 0x0b, - 0xd2, 0x20, 0xee, 0xcd, 0x87, 0x5b, 0xd9, 0xe3, 0xe1, 0x13, 0x01, 0x44, - 0x14, 0x05, 0xa6, 0x0a, 0x74, 0x50, 0xc3, 0x8f, 0xc0, 0xcc, 0x98, 0xdc, - 0x78, 0x1c, 0x5b, 0x28, 0x82, 0x39, 0xab, 0x45, 0x45, 0x96, 0xd5, 0xc4, - 0x2e, 0xcc, 0x2c, 0x75, 0xc1, 0x0c, 0xc8, 0x06, 0x3c, 0x28, 0x8c, 0x52, - 0x4d, 0xf7, 0x72, 0x98, 0x88, 0xb4, 0x02, 0x00, 0xd3, 0xd6, 0x62, 0x42, - 0x23, 0x87, 0x55, 0xe9, 0x3c, 0x4b, 0x1f, 0x99, 0xba, 0x01, 0x2f, 0x20, - 0xe4, 0x5e, 0x86, 0x3e, 0xf9, 0x31, 0x74, 0x3a, 0x75, 0x84, 0xeb, 0xa1, - 0x63, 0xfb, 0x9f, 0x8d, 0x8c, 0x16, 0xd4, 0x73, 0x40, 0xdf, 0xc1, 0x46, - 0xb7, 0xbc, 0xef, 0x06, 0x36, 0x23, 0x79, 0x12, 0x84, 0x3e, 0xdb, 0xab, - 0x84, 0x05, 0xd7, 0xe1, 0x64, 0x1e, 0x61, 0x97, 0x77, 0x31, 0x2e, 0x45, - 0xb7, 0x19, 0x07, 0xee, 0x53, 0x4f, 0x44, 0x38, 0x24, 0x05, 0xb2, 0xe9, - 0xa7, 0x10, 0x40, 0x30, 0x85, 0xbc, 0xb8, 0xab, 0xaa, 0xa2, 0x21, 0x2d, - 0xb0, 0x63, 0x02, 0xfc, 0x16, 0x0b, 0x56, 0x2f, 0x86, 0x4d, 0x13, 0x8d, - 0xbd, 0xfe, 0x0f, 0x99, 0xf9, 0x76, 0xc6, 0xfd, 0x6e, 0x74, 0x01, 0x69, - 0x1f, 0x2d, 0xef, 0xb1, 0x76, 0x52, 0x2f, 0x4e, 0x7c, 0x5e, 0x61, 0x06, - 0x87, 0x34, 0x33, 0x8b, 0xd1, 0x40, 0x38, 0xfe, 0x69, 0x9c, 0x92, 0xc9, - 0x60, 0x35, 0xd8, 0xda, 0xee, 0x42, 0x0b, 0x6f, 0x54, 0x93, 0x02, 0xee, - 0x79, 0x5a, 0x2e, 0x56, 0x1c, 0x71, 0x51, 0x22, 0x4b, 0xfa, 0x12, 0x0e, - 0xc4, 0x52, 0x45, 0x17, 0x81, 0xd7, 0xa1, 0x84, 0x50, 0xa4, 0x75, 0xea, - 0xab, 0xbc, 0xc6, 0x8d, 0x6f, 0xfe, 0x1d, 0x24, 0xd4, 0xb8, 0x71, 0x74, - 0x5c, 0x3d, 0x2e, 0x56, 0x8f, 0x23, 0xc5, 0x5c, 0xa2, 0x63, 0x64, 0x6b, - 0x14, 0xf1, 0xff, 0x81, 0x3b, 0xfd, 0x9f, 0x4e, 0x5d, 0xb9, 0x95, 0x9d, - 0xd8, 0x40, 0x45, 0xde, 0xb4, 0x3f, 0xec, 0xdf, 0xe5, 0xf8, 0x5f, 0xd7, - 0x0a, 0x0c, 0x7b, 0x3d, 0xbc, 0xd1, 0x5d, 0xac, 0xc0, 0x30, 0x7e, 0x7c, - 0x1c, 0xd6, 0x8d, 0x87, 0x79, 0x75, 0x87, 0x58, 0xae, 0x4e, 0x1d, 0x7a, - 0x26, 0x7f, 0x8a, 0xe8, 0xbb, 0x37, 0xfe, 0x5c, 0x7c, 0x96, 0x2f, 0x9c, - 0x7e, 0xbc, 0xa6, 0xec, 0x3c, 0x3f, 0x1d, 0xdd, 0x99, 0x8d, 0x35, 0x2d, - 0x1d, 0xe0, 0x26, 0xb5, 0x27, 0x09, 0xf9, 0x45, 0x6e, 0xf4, 0xeb, 0x61, - 0xb5, 0x97, 0x75, 0x2c, 0x8a, 0x3c, 0x19, 0xd5, 0x62, 0xf2, 0xf5, 0x25, - 0xa4, 0x26, 0xc8, 0xdd, 0xee, 0x03, 0x25, 0xcf, 0x0e, 0x8a, 0xdb, 0x85, - 0xe3, 0x09, 0xb9, 0xc1, 0xf6, 0x0d, 0xc4, 0x94, 0x0e, 0x0f, 0x0a, 0xf6, - 0x25, 0x6f, 0x8e, 0xa2, 0x1f, 0x24, 0xfb, 0x93, 0xe3, 0xf0, 0x6c, 0xd9, - 0x1e, 0x4d, 0xee, 0x71, 0x4c, 0xb3, 0x96, 0x64, 0x2c, 0xe1, 0xd8, 0x47, - 0x74, 0x6f, 0x96, 0x63, 0x00, 0x55, 0xac, 0x67, 0x84, 0xca, 0xf7, 0x60, - 0x57, 0x24, 0x13, 0xdb, 0x10, 0x1b, 0x6f, 0xb9, 0x23, 0xff, 0x9a, 0xdd, - 0x15, 0x33, 0x0b, 0xc4, 0xb2, 0x06, 0xd9, 0x31, 0xd1, 0x43, 0x82, 0xf5, - 0x7c, 0x36, 0x9c, 0x22, 0x10, 0x9a, 0x6d, 0xa7, 0x7d, 0xf9, 0x92, 0x76, - 0x53, 0x4e, 0xc4, 0xfc, 0xe9, 0x2d, 0x15, 0x07, 0xdb, 0xcd, 0x0e, 0x63, - 0x04, 0xee, 0xae, 0xbc, 0x6a, 0x60, 0x3a, 0x59, 0x3a, 0x96, 0x0a, 0xcb, - 0x02, 0xd4, 0x5b, 0xc7, 0xd8, 0xf7, 0x0c, 0xcb, 0x70, 0x07, 0xab, 0x9e, - 0x0b, 0x4e, 0x10, 0x0e, 0xf7, 0x8f, 0xb9, 0xc2, 0xd4, 0xbb, 0x4d, 0xe4, - 0x5d, 0x2f, 0x25, 0x7a, 0xd0, 0x74, 0xa5, 0x0e, 0xad, 0x53, 0xcf, 0xa5, - 0x75, 0x7b, 0xd8, 0xd9, 0xaa, 0x79, 0xdd, 0x60, 0x30, 0x9e, 0xc6, 0x84, - 0x49, 0x7c, 0x91, 0x49, 0x48, 0xe1, 0xd9, 0x18, 0xd8, 0x0a, 0x20, 0x4b, - 0xc0, 0xb4, 0x55, 0x92, 0x96, 0x9c, 0x3b, 0x29, 0x6a, 0x91, 0x12, 0x6d, - 0xd3, 0x0f, 0x11, 0xf2, 0x4a, 0x84, 0xac, 0x50, 0x07, 0xac, 0xf4, 0x5b, - 0x48, 0x27, 0x87, 0x95, 0x27, 0x60, 0x71, 0x96, 0x06, 0x34, 0x4b, 0x86, - 0x94, 0x7d, 0xcc, 0x53, 0xf7, 0x9d, 0xa9, 0xd7, 0xd7, 0x97, 0xdf, 0x1a, - 0x58, 0xdd, 0x52, 0x25, 0x67, 0x9a, 0xb6, 0x7e, 0x24, 0x20, 0xfb, 0x3f, - 0x7e, 0x0e, 0xf3, 0xb5, 0x9d, 0xfb, 0x20, 0xaf, 0xf7, 0x74, 0x12, 0xcf, - 0x43, 0x85, 0x67, 0x05, 0xcf, 0x49, 0xf3, 0xf0, 0xd9, 0xd2, 0x9a, 0xcd, - 0xc6, 0x6b, 0x24, 0xcc, 0x2e, 0x72, 0xa4, 0xfd, 0xd3, 0xcf, 0xf6, 0x5b, - 0x16, 0xf2, 0x2e, 0xd1, 0x72, 0xce, 0x73, 0x4c, 0xba, 0xf9, 0xc1, 0xb7, - 0x75, 0xe8, 0x11, 0x3e, 0x26, 0x59, 0x8a, 0xc1, 0x85, 0x84, 0x2e, 0x07, - 0xef, 0xc7, 0xdc, 0x11, 0xb5, 0x94, 0xfe, 0x55, 0x09, 0x52, 0x15, 0x25, - 0x2c, 0x25, 0x02, 0x5e, 0x9e, 0xfc, 0xf1, 0x9e, 0x02, 0x89, 0x4e, 0x72, - 0xc6, 0x85, 0x5d, 0xc1, 0xde, 0x4e, 0x82, 0x6f, 0x65, 0x85, 0x2f, 0xd8, - 0xaa, 0x87, 0x5e, 0xe6, 0xac, 0x4e, 0x97, 0x1f, 0xba, 0x4c, 0x59, 0x70, - 0x0b, 0xd9, 0x9a, 0xac, 0x54, 0x2a, 0xca, 0x38, 0x98, 0xfe, 0x90, 0x5f, - 0x0d, 0x2d, 0xb6, 0x73, 0x08, 0x3c, 0x7a, 0x12, 0xc2, 0x51, 0xcf, 0xa8, - 0x7e, 0x2d, 0xf7, 0x18, 0xcf, 0x61, 0xce, 0x91, 0x07, 0x04, 0xad, 0xd6, - 0x59, 0xb8, 0xf5, 0xac, 0xc5, 0x4b, 0x2f, 0x5e, 0x14, 0xa5, 0xd5, 0x58, - 0x5c, 0x94, 0xc3, 0x7a, 0xfc, 0x17, 0x02, 0x79, 0x5a, 0x06, 0x7f, 0x4b, - 0xc5, 0xb7, 0xc5, 0x26, 0x63, 0x3a, 0x2b, 0x6a, 0xda, 0xa7, 0x67, 0xdc, - 0x1f, 0x34, 0x42, 0xe1, 0x0a, 0xb6, 0xae, 0x2f, 0xa1, 0xf7, 0x28, 0x20, - 0x36, 0xb6, 0xb9, 0xe0, 0xef, 0x74, 0x71, 0x52, 0x66, 0x3b, 0x39, 0xa5, - 0xde, 0x20, 0x37, 0x7e, 0xa1, 0x08, 0x53, 0x44, 0x8e, 0x97, 0x52, 0x22, - 0x9b, 0xa2, 0xba, 0xa1, 0xff, 0x33, 0x26, 0x58, 0xe1, 0x57, 0xf0, 0xbd, - 0xaf, 0x84, 0xf9, 0x9c, 0xb3, 0x5e, 0x7e, 0x17, 0x69, 0xd2, 0xf8, 0x14, - 0xfc, 0x74, 0x22, 0x0d, 0x00, 0xcc, 0x09, 0xba, 0x7f, 0xbd, 0x22, 0xf9, - 0x6b, 0x37, 0x63, 0xe7, 0x64, 0x92, 0xa0, 0xbf, 0x59, 0x5e, 0xd6, 0x41, - 0x53, 0xe7, 0x10, 0x2b, 0xff, 0x8e, 0x9c, 0x7a, 0xf1, 0xa7, 0xd6, 0x89, - 0x24, 0xc9, 0x6a, 0x48, 0xf4, 0x22, 0x4e, 0x7a, 0xcf, 0x04, 0x7e, 0xab, - 0x25, 0x7d, 0x11, 0x78, 0x40, 0x88, 0x05, 0x72, 0x5a, 0x08, 0xe6, 0x0d, - 0xde, 0xff, 0x9e, 0x0c, 0xd8, 0xad, 0x84, 0xa8, 0x8c, 0xd6, 0x8d, 0x13, - 0x8a, 0xe2, 0x01, 0x30, 0x99, 0xd5, 0xec, 0xec, 0xa7, 0x59, 0x2a, 0x02, - 0x06, 0x0e, 0x83, 0x8b, 0x3b, 0xa9, 0xc6, 0xfc, 0xf1, 0x9b, 0x3c, 0xd1, - 0xa1, 0x8a, 0xfe, 0x73, 0x71, 0xae, 0xe9, 0x11, 0x6d, 0x9f, 0x01, 0x41, - 0xf4, 0xb5, 0x16, 0x9b, 0xfc, 0x2b, 0x70, 0x27, 0x51, 0x8e, 0x73, 0x11, - 0xd2, 0xbf, 0x81, 0xac, 0xf6, 0xdf, 0xa7, 0x30, 0xc5, 0x4c, 0xc2, 0x45, - 0xb3, 0x22, 0xd8, 0xad, 0x7c, 0x28, 0x20, 0x1b, 0x86, 0x0d, 0xdd, 0x99, - 0x5b, 0x12, 0x4a, 0x51, 0xff, 0xd8, 0xaa, 0xfe, 0x65, 0x04, 0xe3, 0x65, - 0x96, 0x7c, 0xac, 0x89, 0xc7, 0xf1, 0x7b, 0x81, 0xf1, 0xb3, 0x45, 0x4b, - 0x58, 0x60, 0x50, 0xdf, 0xec, 0x4f, 0xba, 0x03, 0x1b, 0xdf, 0x67, 0xd4, - 0xe0, 0x51, 0xe2, 0xec, 0xde, 0x80, 0x9f, 0x07, 0xba, 0x90, 0xe4, 0x9e, - 0x3a, 0x47, 0x94, 0x6d, 0x5e, 0x00, 0xa9, 0x52, 0x86, 0xac, 0x7e, 0x89, - 0x1f, 0x1d, 0x54, 0xfc, 0x23, 0x55, 0x8d, 0x20, 0xe5, 0x28, 0xdb, 0xc3, - 0xbf, 0x53, 0xb0, 0x21, 0xa5, 0x9c, 0x5d, 0x9c, 0xb3, 0x02, 0x27, 0xc1, - 0xb3, 0xe6, 0x12, 0x3a, 0x80, 0x27, 0xab, 0xc8, 0x78, 0xff, 0x57, 0x46, - 0xfe, 0xf8, 0xfc, 0xdd, 0xdc, 0x13, 0xc9, 0x7a, 0xad, 0x34, 0xcc, 0x35, - 0xf9, 0xf1, 0x13, 0x4f, 0xeb, 0x1a, 0xa5, 0xe4, 0x4c, 0xc0, 0xb6, 0xc9, - 0x86, 0x2c, 0x40, 0xef, 0xcb, 0x6f, 0x38, 0x06, 0x7a, 0x55, 0x16, 0x4f, - 0x9f, 0x78, 0x5d, 0xcc, 0x2c, 0x8a, 0xfe, 0x48, 0x4d, 0xd6, 0x26, 0x9b, - 0x50, 0x98, 0x40, 0x26, 0x40, 0xbf, 0x9a, 0x58, 0x26, 0x57, 0x9d, 0x2e, - 0x8b, 0xdb, 0x8e, 0xe3, 0xdf, 0x90, 0xa2, 0xa0, 0xc8, 0xec, 0xef, 0xf9, - 0xbf, 0x7a, 0xf1, 0x8d, 0x9a, 0x76, 0x19, 0x0e, 0xb0, 0x57, 0xa7, 0xdb, - 0x98, 0x47, 0xc6, 0x6c, 0x81, 0x34, 0x29, 0x9d, 0xe1, 0x60, 0x60, 0xd0, - 0xe9, 0x0b, 0x61, 0x03, 0x19, 0x07, 0x98, 0x2d, 0xed, 0xf0, 0xfd, 0xe6, - 0x24, 0x89, 0x49, 0xe0, 0xb4, 0x63, 0x9d, 0x5a, 0xee, 0xb6, 0x10, 0x0f, - 0xfd, 0x2f, 0x96, 0xa4, 0xde, 0x92, 0xe4, 0x5e, 0x7c, 0x43, 0x69, 0x69, - 0xe2, 0xde, 0xd9, 0x58, 0x76, 0xa0, 0x99, 0xef, 0x86, 0x19, 0x55, 0x13, - 0xc6, 0x40, 0x31, 0xfc, 0x2a, 0x9e, 0x1f, 0x59, 0x3a, 0x77, 0x9e, 0x98, - 0xb1, 0xae, 0xc8, 0x3c, 0x36, 0x9c, 0x41, 0x9e, 0xce, 0x30, 0x06, 0xb6, - 0x0d, 0x0c, 0xe3, 0x3f, 0x54, 0x5b, 0xe0, 0xd6, 0x47, 0x20, 0xbb, 0x4d, - 0x14, 0x61, 0x78, 0x02, 0xa3, 0x38, 0xa5, 0xed, 0xfc, 0x64, 0x84, 0x45, - 0x61, 0xad, 0x02, 0x4f, 0xfb, 0x2e, 0xa5, 0x16, 0x12, 0xac, 0x89, 0xfa, - 0x0b, 0x03, 0x20, 0xc4, 0xf1, 0x74, 0x04, 0x2f, 0x97, 0x48, 0x6f, 0x66, - 0x10, 0xdb, 0xf4, 0x3f, 0x9d, 0x55, 0x98, 0xbc, 0x7b, 0x08, 0xef, 0xaa, - 0x68, 0x3a, 0x6b, 0x29, 0x19, 0x9d, 0xe1, 0x12, 0x06, 0xac, 0xae, 0xe6, - 0xdf, 0x57, 0xf5, 0x6c, 0x87, 0x80, 0x7e, 0x73, 0x16, 0xf1, 0x89, 0x91, - 0x72, 0xda, 0x25, 0xfb, 0xd1, 0x3b, 0xdd, 0x80, 0x14, 0xbe, 0xf6, 0x18, - 0x42, 0x7f, 0x13, 0xf0, 0xeb, 0xe5, 0x44, 0x3f, 0xa6, 0xdf, 0x33, 0xa3, - 0x77, 0xaa, 0x29, 0xff, 0x74, 0x54, 0xdd, 0x1b, 0xab, 0x7e, 0x14, 0x74, - 0x16, 0xe2, 0x68, 0xd3, 0x71, 0x78, 0x91, 0xe9, 0xad, 0x7c, 0x9a, 0x61, - 0xaf, 0x3a, 0xbc, 0xa6, 0xf8, 0x4c, 0x4a, 0xe2, 0x3c, 0x35, 0x40, 0x5e, - 0xbf, 0xcd, 0x6f, 0xaf, 0x13, 0xd2, 0xf1, 0x86, 0x8d, 0xd9, 0x61, 0x20, - 0x9e, 0xa0, 0x49, 0x93, 0x1f, 0x66, 0xd5, 0x10, 0x75, 0x87, 0x4c, 0x5d, - 0x7f, 0xbf, 0xf6, 0xe5, 0x68, 0x48, 0x38, 0x09, 0xde, 0x96, 0xb2, 0xc3, - 0x3e, 0x2f, 0x06, 0xc0, 0x64, 0x28, 0x69, 0x15, 0xc0, 0x10, 0x84, 0xae, - 0x56, 0x7d, 0x21, 0x48, 0xdb, 0xc4, 0x03, 0xb1, 0xd7, 0xd7, 0x39, 0x4d, - 0xad, 0x3d, 0xec, 0x0b, 0xd8, 0x82, 0x2e, 0x38, 0x10, 0x38, 0xa7, 0x74, - 0x19, 0xb2, 0xdb, 0xbe, 0x08, 0xa3, 0x07, 0x41, 0x82, 0x32, 0x15, 0x45, - 0xd1, 0x19, 0xed, 0x87, 0xc6, 0xe7, 0x14, 0x6d, 0x23, 0x92, 0x1b, 0x54, - 0x3a, 0xef, 0x5f, 0x50, 0x91, 0x58, 0x0e, 0x51, 0xa6, 0x61, 0x34, 0x63, - 0x59, 0x0d, 0x56, 0x0c, 0x45, 0x0e, 0xf7, 0xb8, 0xb0, 0x12, 0xc0, 0x8a, - 0xee, 0xea, 0x70, 0x87, 0xaf, 0x99, 0xc8, 0x46, 0x78, 0xd8, 0x7c, 0xc1, - 0xd9, 0x50, 0x97, 0x88, 0x1d, 0x32, 0xe1, 0x4b, 0x8c, 0x36, 0xd5, 0xe2, - 0x2e, 0xae, 0xee, 0xe5, 0x23, 0xbe, 0x5b, 0x38, 0x66, 0xae, 0x0a, 0x32, - 0x16, 0x1c, 0x8a, 0xb2, 0x0b, 0x43, 0x98, 0xcf, 0x69, 0x1b, 0x3b, 0x68, - 0x0e, 0x59, 0xc0, 0x7c, 0x51, 0x31, 0xb1, 0x08, 0x67, 0xb0, 0x2e, 0x3e, - 0xcb, 0x70, 0x00, 0x36, 0xad, 0xd1, 0xaa, 0x8a, 0xfd, 0x73, 0xc6, 0x23, - 0x18, 0xfa, 0x44, 0x2a, 0x76, 0x63, 0x16, 0xf3, 0x91, 0x8f, 0x68, 0xfb, - 0x15, 0x25, 0xa3, 0x3d, 0x28, 0x9e, 0x2c, 0xe6, 0x3c, 0x5e, 0xe2, 0x20, - 0xbc, 0x23, 0x51, 0x13, 0x76, 0x10, 0x5e, 0xae, 0x83, 0x3c, 0xfc, 0xb8, - 0xe9, 0x7a, 0xde, 0x52, 0x0a, 0xbe, 0xf1, 0xe3, 0x6c, 0x7a, 0x9a, 0x7e, - 0x0e, 0xd5, 0xf8, 0xf3, 0xe9, 0x09, 0x8a, 0x46, 0x66, 0x85, 0x4f, 0xa5, - 0xb9, 0xa5, 0xa3, 0x25, 0xb4, 0x57, 0xf1, 0x93, 0x2a, 0x63, 0xcd, 0xa9, - 0xd5, 0xf9, 0x28, 0x87, 0x19, 0x98, 0xda, 0x82, 0x5a, 0xbe, 0x96, 0x6e, - 0x5b, 0x29, 0x67, 0x6f, 0x86, 0x83, 0x60, 0x91, 0xfc, 0xe2, 0x05, 0x9c, - 0x65, 0x96, 0xbc, 0xce, 0xbf, 0x3b, 0x7f, 0xad, 0xe3, 0x84, 0x22, 0x4e, - 0xb0, 0xe9, 0x53, 0xbf, 0xd0, 0x77, 0x06, 0x2b, 0x74, 0x68, 0x8b, 0x61, - 0x59, 0xe2, 0x18, 0x05, 0x38, 0x9b, 0x28, 0xd6, 0x15, 0xea, 0x67, 0xd1, - 0x90, 0x27, 0x50, 0xf7, 0xbf, 0x7a, 0x2a, 0xf5, 0xa2, 0x94, 0x0f, 0x88, - 0x64, 0x1f, 0xfe, 0x39, 0x94, 0x7a, 0xc1, 0x78, 0x89, 0xfd, 0x5e, 0xb1, - 0x5b, 0x27, 0x71, 0x49, 0x0f, 0xb0, 0x7b, 0x56, 0x77, 0x05, 0x17, 0xd7, - 0xbe, 0x71, 0x6e, 0xde, 0xd0, 0x7d, 0x3a, 0x4c, 0xc7, 0x47, 0x57, 0x62, - 0xe6, 0x2a, 0x0f, 0x3d, 0xa8, 0x88, 0xbe, 0x82, 0xc3, 0xef, 0x26, 0x58, - 0x03, 0xff, 0x79, 0x58, 0x34, 0x1d, 0xc3, 0xa8, 0xde, 0x6a, 0xdd, 0xc9, - 0x5a, 0x0f, 0x2c, 0x50, 0x63, 0xbd, 0x3e, 0x5c, 0x9c, 0xb6, 0xb3, 0x9f, - 0x52, 0xa4, 0x88, 0x03, 0x18, 0xc7, 0x77, 0xcc, 0xb9, 0x8a, 0x4c, 0x20, - 0x1c, 0xab, 0xd2, 0x07, 0x76, 0x6f, 0x10, 0xc4, 0x80, 0x9b, 0xf2, 0x99, - 0xd0, 0x1a, 0x18, 0xfc, 0x0d, 0xf9, 0x4a, 0x2e, 0xa3, 0x39, 0x65, 0xef, - 0x6c, 0xe8, 0x74, 0x6f, 0x2e, 0xf8, 0x75, 0x81, 0x0e, 0x51, 0x32, 0xa9, - 0x59, 0x16, 0xc2, 0xb3, 0x75, 0x69, 0xdb, 0x09, 0xbf, 0x83, 0x69, 0x81, - 0x86, 0x8d, 0x35, 0xa2, 0x27, 0x3a, 0xa0, 0x4d, 0xf3, 0x6b, 0xce, 0x3a, - 0x88, 0x19, 0xd7, 0xa8, 0xe4, 0x7d, 0x32, 0xbd, 0xad, 0x8e, 0x95, 0xc1, - 0xc8, 0x12, 0xa6, 0x7c, 0xc7, 0xa6, 0x75, 0xeb, 0x3d, 0xc0, 0xa9, 0x95, - 0x26, 0xc9, 0xf5, 0x01, 0xb7, 0x31, 0xec, 0x9d, 0x3e, 0xdf, 0x4d, 0xde, - 0x1b, 0x8a, 0xf0, 0x5e, 0xd4, 0x80, 0xac, 0x69, 0x79, 0x3e, 0xc4, 0xaf, - 0x8a, 0xf7, 0x63, 0xe1, 0x60, 0xc3, 0x39, 0xb9, 0xd8, 0x3f, 0xec, 0xc2, - 0x38, 0x97, 0xaf, 0xb9, 0x65, 0xbb, 0xce, 0x5b, 0x2e, 0xb3, 0x58, 0xae, - 0x52, 0x34, 0x45, 0x04, 0x69, 0x15, 0xbb, 0x12, 0x5b, 0x10, 0x3a, 0x40, - 0xd7, 0x8b, 0xdb, 0x26, 0xc6, 0xe0, 0xdd, 0xd8, 0xad, 0x98, 0xd5, 0xc8, - 0x8e, 0x35, 0x19, 0xff, 0x4c, 0x55, 0x4b, 0xd3, 0x7d, 0x05, 0x0c, 0x4a, - 0xc7, 0xf5, 0x9a, 0x84, 0xc3, 0x8b, 0x24, 0xdb, 0x31, 0x26, 0x71, 0x8b, - 0x40, 0x7a, 0xe3, 0x31, 0x45, 0x81, 0x42, 0x1b, 0xe9, 0x62, 0x1a, 0xd2, - 0x9c, 0xc0, 0xcc, 0x5e, 0xbc, 0x8c, 0x60, 0x64, 0x02, 0x8a, 0xb8, 0xf7, - 0xb6, 0xf6, 0x36, 0xe1, 0x70, 0xe8, 0xd6, 0x0a, 0xbe, 0xe8, 0x35, 0x61, - 0xe8, 0xbf, 0xcd, 0xa2, 0x31, 0xa1, 0x31, 0x69, 0xfb, 0x3b, 0x9f, 0x0b, - 0x4e, 0x43, 0x37, 0x58, 0xfc, 0xf8, 0xa7, 0xb9, 0x39, 0x4a, 0xdd, 0x65, - 0x2a, 0xac, 0x49, 0x7e, 0xd0, 0x25, 0x6f, 0x21, 0x97, 0x92, 0x9c, 0x74, - 0x45, 0x0e, 0x18, 0xa2, 0x75, 0x42, 0x72, 0xf9, 0x66, 0x19, 0x66, 0xc1, - 0x26, 0x1d, 0x37, 0x2a, 0xcb, 0x31, 0x42, 0x93, 0x4c, 0x30, 0xe1, 0x86, - 0xf8, 0x0a, 0xfc, 0xe6, 0xa1, 0x37, 0x0c, 0xb9, 0xa5, 0xed, 0xc5, 0xda, - 0xae, 0xb5, 0x06, 0x65, 0xa2, 0x71, 0x04, 0x28, 0xbe, 0x36, 0x4c, 0xac, - 0x26, 0x3e, 0x5b, 0xd2, 0x85, 0x89, 0x0c, 0x06, 0xd7, 0xbf, 0x99, 0xa0, - 0xf8, 0xb5, 0x6e, 0x1a, 0x47, 0xf2, 0xf2, 0x54, 0x28, 0x89, 0x94, 0xf3, - 0xa4, 0x02, 0x02, 0xbc, 0x8a, 0xa9, 0x67, 0x5e, 0xbb, 0x0d, 0xd4, 0x34, - 0xce, 0x8f, 0xa2, 0x97, 0x70, 0x59, 0x9e, 0xa1, 0xd9, 0xed, 0x1e, 0x9e, - 0xd2, 0xa8, 0xcf, 0xd7, 0xf8, 0xe4, 0xeb, 0x4f, 0x42, 0xaa, 0x27, 0xd1, - 0xd4, 0xbe, 0xda, 0xdc, 0x23, 0x59, 0xdd, 0x35, 0xfc, 0x4b, 0x1b, 0x1c, - 0xea, 0xb5, 0x86, 0xcd, 0xc5, 0x7c, 0xd9, 0xc3, 0x42, 0xe8, 0xbb, 0x7b, - 0x31, 0x85, 0xec, 0x94, 0x50, 0x4d, 0xe9, 0xad, 0x53, 0x32, 0x59, 0xec, - 0x31, 0xee, 0x6e, 0x19, 0x38, 0x5e, 0xd7, 0x58, 0xee, 0xd6, 0x73, 0xf9, - 0x6f, 0x0b, 0x9a, 0xbb, 0x4a, 0xa1, 0xe4, 0x61, 0x8f, 0xd0, 0xb7, 0x71, - 0x1a, 0x10, 0x17, 0x57, 0x6d, 0xd4, 0xec, 0xb3, 0xb9, 0x44, 0xc7, 0xc9, - 0x15, 0x12, 0xf6, 0xcf, 0x34, 0xbd, 0x69, 0x0c, 0x89, 0x89, 0x59, 0x4d, - 0xc1, 0xe4, 0xad, 0xf4, 0x61, 0xb4, 0xe2, 0xbc, 0xe0, 0xb0, 0x16, 0x42, - 0xb9, 0xd8, 0x94, 0x3e, 0x6d, 0x25, 0xda, 0xb6, 0x06, 0x1c, 0x35, 0x3f, - 0x54, 0x5a, 0x90, 0x12, 0x44, 0x12, 0x71, 0x2f, 0xf9, 0xfa, 0x70, 0x62, - 0x8b, 0x5b, 0x5d, 0x4b, 0x0d, 0xf0, 0x5a, 0x4f, 0xb6, 0x6f, 0x91, 0x29, - 0x1b, 0x74, 0x48, 0xc3, 0x72, 0x78, 0x0e, 0x30, 0x50, 0x8a, 0xd8, 0xc7, - 0x58, 0x74, 0xa4, 0xe8, 0xa5, 0x14, 0x11, 0x7f, 0x76, 0x63, 0x51, 0xe1, - 0xe1, 0x60, 0xb6, 0x5d, 0x6d, 0xa8, 0x1d, 0x74, 0xad, 0x28, 0x6d, 0xb1, - 0x0d, 0xfc, 0x39, 0x5d, 0x08, 0x21, 0x8e, 0x53, 0x87, 0xc4, 0xb6, 0xb4, - 0xf7, 0xb1, 0x61, 0x71, 0x4a, 0x87, 0x10, 0xdc, 0x29, 0x43, 0x03, 0x87, - 0x6f, 0x81, 0x1d, 0x6f, 0xd0, 0xb2, 0x73, 0x7d, 0x61, 0x2f, 0x57, 0x5b, - 0xe8, 0xbd, 0xb3, 0xc8, 0xa6, 0xb8, 0x97, 0xbb, 0xeb, 0xf3, 0x85, 0x27, - 0xe5, 0x18, 0xae, 0xa3, 0xac, 0x58, 0x9a, 0x8a, 0x4b, 0xb3, 0x76, 0xa7, - 0x4a, 0x72, 0x5e, 0x9f, 0x40, 0x36, 0x23, 0xc8, 0x8f, 0x8f, 0xf2, 0x0c, - 0x8f, 0x1f, 0x17, 0x39, 0x3c, 0xe1, 0xbd, 0x6c, 0x26, 0xc0, 0x94, 0x9f, - 0x29, 0xed, 0xbc, 0xcc, 0x16, 0x39, 0xe0, 0xa6, 0x6f, 0x9c, 0x12, 0xa2, - 0x74, 0xab, 0x0f, 0x1d, 0x98, 0x35, 0x7a, 0xe2, 0x50, 0xed, 0x54, 0xeb, - 0x23, 0x5d, 0x10, 0xbd, 0xa0, 0x25, 0x13, 0x37, 0x77, 0x5b, 0x14, 0xf4, - 0x8c, 0x04, 0x50, 0xdf, 0xe3, 0x99, 0x61, 0x34, 0x58, 0xc6, 0x69, 0x54, - 0x08, 0xf1, 0xe0, 0xbb, 0xfb, 0xc4, 0x0a, 0x34, 0xba, 0x50, 0x42, 0xd5, - 0xca, 0xac, 0x1f, 0x40, 0xfe, 0xf3, 0x3e, 0x4f, 0x7b, 0x0c, 0x28, 0xec, - 0x6f, 0x17, 0x1c, 0xe7, 0x70, 0x31, 0x61, 0x7a, 0xd2, 0xee, 0xec, 0x40, - 0xda, 0xa0, 0xa6, 0x6f, 0xf5, 0xd3, 0xdc, 0x62, 0x07, 0xec, 0xd3, 0xb9, - 0x68, 0xb6, 0x71, 0xb2, 0x00, 0xe7, 0xfd, 0x3b, 0x2c, 0x57, 0x0d, 0x79, - 0xef, 0xac, 0x3a, 0x6a, 0xec, 0xc3, 0x1b, 0xa3, 0xfc, 0x63, 0x3c, 0x33, - 0x46, 0x5d, 0xde, 0x0a, 0x4e, 0xc5, 0x50, 0x89, 0xcc, 0xdd, 0x2b, 0xfe, - 0x53, 0xf3, 0x0a, 0x4a, 0x63, 0x43, 0x81, 0xf0, 0xb4, 0x72, 0x0c, 0x9e, - 0xf0, 0xfb, 0xe9, 0xde, 0xb6, 0xe5, 0xfd, 0x41, 0x1c, 0x6c, 0x16, 0xa5, - 0x37, 0xaa, 0x8a, 0xde, 0xa0, 0x26, 0xd8, 0x61, 0x83, 0x07, 0x66, 0x3f, - 0xaa, 0xa4, 0x5b, 0xc3, 0xcf, 0x01, 0xdc, 0xed, 0x9c, 0x98, 0x40, 0x9a, - 0xc0, 0x15, 0x6e, 0xb1, 0x71, 0xef, 0x5f, 0x7d, 0xde, 0xa1, 0xe4, 0x29, - 0xb1, 0xac, 0xa3, 0x79, 0x96, 0xd1, 0x1b, 0xce, 0x0e, 0x65, 0x01, 0x5d, - 0xe7, 0x82, 0xf4, 0xf8, 0x15, 0x51, 0x43, 0x55, 0x9f, 0xb4, 0x8d, 0x3a, - 0x49, 0x6c, 0x61, 0xc0, 0x00, 0x7c, 0x9a, 0xcd, 0x1d, 0x38, 0x42, 0x9c, - 0x1c, 0x51, 0xc0, 0x59, 0x02, 0x7c, 0x40, 0x6d, 0xa4, 0x5e, 0x4c, 0xc9, - 0xd3, 0xd9, 0x09, 0x63, 0x0c, 0xbe, 0x9e, 0xc0, 0xb3, 0x38, 0x5d, 0x20, - 0xec, 0x76, 0x30, 0x85, 0x0e, 0xc8, 0xc4, 0x17, 0x2b, 0xbb, 0x74, 0xa0, - 0x4e, 0x7c, 0x98, 0x86, 0xc6, 0x6c, 0xe4, 0x12, 0x1d, 0x0a, 0xf0, 0x95, - 0x1e, 0xb8, 0xd5, 0x19, 0xcd, 0x15, 0xd7, 0x0c, 0x30, 0xb7, 0x0e, 0xac, - 0x78, 0xd5, 0x6a, 0x83, 0x4a, 0x4e, 0xd5, 0x43, 0x6f, 0x9c, 0x99, 0x08, - 0x04, 0x0f, 0xce, 0x6e, 0x29, 0xf8, 0x0d, 0x09, 0xf6, 0x86, 0x55, 0xb8, - 0xda, 0x28, 0x9e, 0x1e, 0xb7, 0x2e, 0x69, 0x9e, 0x13, 0xcb, 0x3a, 0x1d, - 0x10, 0x89, 0x0c, 0xeb, 0x4c, 0x5f, 0x20, 0x46, 0x5a, 0x70, 0xbe, 0xe9, - 0xa4, 0x0c, 0x55, 0x96, 0x3d, 0x8b, 0x7c, 0xc2, 0xd5, 0x69, 0x5f, 0xd4, - 0xc0, 0x70, 0xc5, 0x27, 0x5e, 0xa6, 0xf3, 0xf3, 0xbe, 0x10, 0x02, 0xba, - 0x48, 0x07, 0x71, 0xe7, 0x7f, 0x11, 0xf0, 0xc9, 0xa5, 0xdf, 0x28, 0xbe, - 0x8c, 0xb1, 0x2b, 0x9a, 0xe1, 0x40, 0x8b, 0xee, 0xae, 0xc4, 0x41, 0x1d, - 0x7d, 0xa1, 0x63, 0xa9, 0x44, 0x1c, 0xa8, 0x38, 0x7d, 0xd5, 0xee, 0x90, - 0xa3, 0x26, 0x46, 0xe8, 0x1c, 0xb6, 0xcf, 0xff, 0x06, 0x6b, 0xc2, 0x91, - 0x2f, 0xe4, 0xc6, 0x8d, 0x7f, 0x82, 0xc6, 0xb1, 0x3f, 0x43, 0x8a, 0xd3, - 0xc0, 0x5a, 0xb5, 0xf9, 0x37, 0x4a, 0x62, 0x10, 0xdd, 0x76, 0x4d, 0x76, - 0x11, 0x9b, 0x59, 0x09, 0xfa, 0xd4, 0x15, 0xe1, 0x55, 0xb5, 0x63, 0x06, - 0xcc, 0xf0, 0xfa, 0x57, 0x6d, 0xbd, 0x49, 0x5c, 0x06, 0xb5, 0x93, 0x8f, - 0x24, 0xb3, 0x58, 0xae, 0x96, 0x35, 0x84, 0xfa, 0xb8, 0x46, 0x69, 0xf4, - 0x52, 0xb5, 0x0a, 0x8d, 0xdf, 0x38, 0xa6, 0xd0, 0x11, 0xd6, 0xc7, 0x00, - 0xa8, 0xe4, 0xe6, 0x79, 0x49, 0xdb, 0xbd, 0x58, 0x70, 0xa8, 0x9e, 0x92, - 0xf6, 0x86, 0xb8, 0x4c, 0x47, 0xb0, 0xc9, 0xaf, 0x27, 0xd5, 0xd1, 0x83, - 0xd4, 0x56, 0x89, 0x95, 0xe1, 0x96, 0x4b, 0x09, 0xd3, 0x8a, 0x45, 0x39, - 0xfb, 0xe6, 0x26, 0x51, 0x42, 0xb7, 0x23, 0xac, 0x2d, 0x07, 0x7d, 0x3f, - 0xe9, 0xa6, 0x08, 0x70, 0x9b, 0xf3, 0xd9, 0x25, 0x91, 0xf6, 0xd4, 0xa8, - 0x2a, 0xf0, 0x20, 0x23, 0x0f, 0xc2, 0xe5, 0x67, 0x1b, 0x04, 0x4c, 0x53, - 0x8c, 0xb3, 0xd2, 0x6b, 0x4c, 0x18, 0x2f, 0x9e, 0xad, 0x6b, 0x65, 0xb7, - 0x64, 0x5b, 0x19, 0x75, 0x39, 0xd3, 0x70, 0xe8, 0x3f, 0x3e, 0xb7, 0x55, - 0xf1, 0xa1, 0x6d, 0x41, 0x45, 0xd4, 0x38, 0xfb, 0x68, 0x27, 0xd0, 0xfc, - 0xf1, 0x98, 0xf8, 0xe6, 0x3d, 0x65, 0x63, 0x77, 0x4e, 0x83, 0x1f, 0xe3, - 0x35, 0xad, 0x5e, 0xe9, 0x31, 0x6a, 0xbe, 0x77, 0xc6, 0x33, 0xbc, 0x8e, - 0x46, 0xc2, 0x5c, 0xf0, 0x7b, 0xad, 0xe4, 0x6c, 0x2f, 0xb0, 0x49, 0xf5, - 0x5f, 0xe5, 0xec, 0x5f, 0x42, 0xec, 0xd7, 0x6e, 0x91, 0xf9, 0x7d, 0xe7, - 0xd2, 0x9b, 0xbd, 0x1c, 0x91, 0x44, 0xc0, 0x95, 0xf9, 0x96, 0xfe, 0x1a, - 0xf2, 0x97, 0x03, 0x85, 0x56, 0x7d, 0x03, 0xb1, 0xc2, 0x75, 0xb3, 0xc6, - 0x8d, 0x75, 0x71, 0x6e, 0x62, 0x38, 0xad, 0xc6, 0x3e, 0xdd, 0x9a, 0x3b, - 0xc2, 0x2f, 0xf7, 0x4d, 0xb3, 0x61, 0x9a, 0xca, 0xf9, 0xe7, 0x69, 0x10, - 0xd0, 0xaf, 0xa7, 0x77, 0x0a, 0x46, 0x1f, 0x88, 0x52, 0x34, 0xbb, 0x9e, - 0xd6, 0x71, 0x22, 0xc2, 0x70, 0xfe, 0x4d, 0x65, 0x13, 0x36, 0x5c, 0x5f, - 0x9d, 0xfe, 0xaa, 0xa6, 0xe7, 0x80, 0x8e, 0x0e, 0x74, 0xf6, 0x2b, 0x7e, - 0xca, 0xc5, 0x88, 0xc6, 0xb4, 0xc3, 0xa0, 0x99, 0xd8, 0x83, 0x8d, 0xca, - 0x35, 0x14, 0x31, 0x39, 0xbe, 0xbf, 0x6b, 0xbc, 0x9a, 0x5d, 0x39, 0x80, - 0xbd, 0x33, 0xe8, 0x19, 0xf5, 0x08, 0x76, 0x60, 0xec, 0xe8, 0x59, 0xcb, - 0xd8, 0x41, 0x74, 0x71, 0x26, 0xe6, 0x41, 0x6e, 0x66, 0x45, 0xda, 0xf2, - 0xc1, 0x47, 0xf1, 0xf5, 0xd7, 0xf0, 0x24, 0x07, 0x37, 0xc4, 0x5b, 0x90, - 0x53, 0x3a, 0x88, 0x35, 0xb0, 0x6b, 0xef, 0xe9, 0x43, 0x69, 0x1f, 0x23, - 0x9d, 0x8b, 0xdf, 0x79, 0x02, 0xc3, 0x83, 0x9c, 0xd7, 0x6a, 0x81, 0x6a, - 0x0b, 0xaa, 0x87, 0xe3, 0xba, 0x2c, 0x8b, 0x03, 0xe6, 0xbb, 0xfd, 0xa4, - 0x7b, 0x66, 0xaa, 0xac, 0x2d, 0x98, 0x6d, 0xa2, 0x93, 0xf6, 0x7a, 0x46, - 0x25, 0x98, 0x10, 0xac, 0xf9, 0x66, 0x75, 0x4d, 0x6d, 0x88, 0xb7, 0xcb, - 0xdd, 0x6a, 0xb8, 0x40, 0x8e, 0xa0, 0x3c, 0xe3, 0xe9, 0x7d, 0x86, 0xad, - 0x0c, 0x80, 0x31, 0x4d, 0x16, 0x69, 0xe9, 0x45, 0xfb, 0x13, 0x94, 0xd6, - 0xc9, 0x91, 0x3a, 0x0d, 0xa0, 0x60, 0xa5, 0xcd, 0x5e, 0xbe, 0xca, 0x93, - 0x7f, 0x47, 0x24, 0xd2, 0x3a, 0xe2, 0xe2, 0x1e, 0x0f, 0x72, 0x93, 0x39, - 0x7d, 0x55, 0xed, 0x51, 0x2c, 0xb6, 0x9b, 0x80, 0xaf, 0x0c, 0x39, 0x5e, - 0x5c, 0x7a, 0x5d, 0x9c, 0x38, 0x74, 0x8c, 0x13, 0xcb, 0xd3, 0x52, 0x5a, - 0x52, 0x22, 0xc5, 0x4f, 0xf0, 0xdb, 0x1d, 0xd2, 0x00, 0xd7, 0x50, 0x29, - 0x6c, 0x61, 0x9e, 0x5f, 0xb8, 0x5d, 0x29, 0x1c, 0xbc, 0x0e, 0x8d, 0x34, - 0x0c, 0x0f, 0x9c, 0xbe, 0x27, 0x1c, 0xe1, 0xf7, 0xb7, 0x48, 0x13, 0x61, - 0x02, 0xc6, 0xfd, 0xcb, 0xc7, 0x8f, 0x25, 0x70, 0xc1, 0x52, 0x10, 0x7b, - 0x02, 0x9b, 0xce, 0x69, 0x4b, 0x97, 0x37, 0x11, 0x1b, 0x53, 0x1f, 0xb4, - 0x45, 0x7c, 0x35, 0xc0, 0x95, 0x6e, 0x6e, 0x98, 0x77, 0x13, 0x2c, 0xb7, - 0xd1, 0x2e, 0x8c, 0xb7, 0xa5, 0xaa, 0x41, 0x2f, 0x54, 0xc4, 0xf2, 0x35, - 0xd3, 0x62, 0x57, 0x6b, 0x40, 0xa3, 0x63, 0xe8, 0x0a, 0x62, 0x18, 0xe6, - 0x8a, 0x80, 0xc1, 0x50, 0xc4, 0xfa, 0x92, 0xbc, 0xed, 0xb9, 0x06, 0xb1, - 0xf8, 0x85, 0xde, 0x9c, 0x1c, 0x22, 0x45, 0xe1, 0xca, 0x6f, 0xbe, 0x7a, - 0x53, 0xf3, 0x72, 0xe1, 0x76, 0x40, 0x91, 0x5e, 0xd1, 0x13, 0x99, 0xa0, - 0x9c, 0xe8, 0x8b, 0x0c, 0x96, 0x60, 0x05, 0xda, 0x51, 0x30, 0x12, 0x67, - 0xed, 0x3e, 0xd6, 0xa7, 0x79, 0x48, 0x51, 0xf7, 0x51, 0xa5, 0xa2, 0xa2, - 0x02, 0x4e, 0xcd, 0x2b, 0x9d, 0x72, 0xdf, 0xeb, 0x8c, 0x40, 0xb9, 0x9b, - 0xc7, 0x71, 0x4a, 0xc4, 0x25, 0x3a, 0x69, 0x34, 0x35, 0x3b, 0x1c, 0xc2, - 0x57, 0xed, 0x52, 0x65, 0x92, 0x14, 0x08, 0x57, 0xc1, 0x17, 0xd7, 0x30, - 0xfd, 0x62, 0xce, 0xf5, 0x94, 0x92, 0x82, 0x12, 0xe7, 0xde, 0x02, 0x9c, - 0xe6, 0xcf, 0xbb, 0x02, 0x5f, 0xfb, 0x23, 0xd5, 0xe4, 0xab, 0x5f, 0x92, - 0x2a, 0x04, 0x1e, 0x47, 0xf1, 0x9a, 0x40, 0x85, 0x71, 0xcf, 0x5b, 0x68, - 0xd6, 0x2a, 0xdb, 0x9a, 0xc8, 0x44, 0xc1, 0xcc, 0xcf, 0x89, 0xda, 0xf1, - 0xe0, 0xbb, 0x67, 0x39, 0xbd, 0xf1, 0xcb, 0x64, 0x93, 0x94, 0x60, 0x1d, - 0xb7, 0x90, 0xc2, 0xb1, 0x2a, 0x0f, 0xdd, 0xc5, 0xd7, 0x5f, 0xad, 0xe6, - 0xea, 0x4e, 0xea, 0xe0, 0xef, 0x78, 0xd8, 0x11, 0x6f, 0x51, 0x70, 0x98, - 0x1b, 0x00, 0xaf, 0x37, 0x01, 0xf2, 0x43, 0x3a, 0x21, 0x48, 0xc7, 0x7a, - 0x0f, 0x42, 0x8f, 0x9e, 0x31, 0x5b, 0x58, 0xc2, 0x81, 0xb2, 0x95, 0xc9, - 0x9e, 0x46, 0xf7, 0xff, 0x74, 0x6d, 0xf6, 0x85, 0xe4, 0xe4, 0x6e, 0x64, - 0xa5, 0x5b, 0xe3, 0x0d, 0x8d, 0xe9, 0x42, 0xe4, 0x05, 0x17, 0x0b, 0x7f, - 0x43, 0x4f, 0x9d, 0x7d, 0xb3, 0xab, 0xad, 0x60, 0x82, 0xa4, 0xd5, 0xb8, - 0xf0, 0x2c, 0xdd, 0x05, 0x67, 0x3b, 0x84, 0x5d, 0x52, 0x65, 0xd4, 0xde, - 0x4e, 0x64, 0x32, 0x2d, 0x37, 0xa7, 0xe3, 0x02, 0x83, 0xf3, 0x98, 0x46, - 0xf2, 0x9d, 0xc0, 0xd5, 0xe5, 0xc7, 0x46, 0xe5, 0xa3, 0xf9, 0xcc, 0xba, - 0xdd, 0xad, 0x6f, 0xea, 0x81, 0xe5, 0x23, 0x0c, 0x11, 0x01, 0x84, 0x47, - 0x7e, 0x22, 0x9e, 0xa1, 0x61, 0x29, 0x12, 0xfc, 0xd4, 0xbd, 0x09, 0xe0, - 0x90, 0x1a, 0x5b, 0x90, 0xb5, 0x33, 0xa1, 0x9b, 0xd6, 0x36, 0xca, 0x56, - 0x65, 0x1c, 0xba, 0xb7, 0x2b, 0x97, 0x82, 0x98, 0xca, 0xbb, 0x39, 0x47, - 0x48, 0x90, 0xef, 0x53, 0x97, 0x21, 0xd2, 0x66, 0x9b, 0x99, 0xc6, 0x5d, - 0xdf, 0x67, 0xb3, 0xa1, 0x92, 0x82, 0xd3, 0x5f, 0x85, 0xa5, 0xa0, 0xe9, - 0x16, 0x89, 0xdf, 0x08, 0x6c, 0x18, 0x03, 0x2c, 0xa8, 0x6c, 0xcf, 0x83, - 0x38, 0x12, 0x85, 0x93, 0xcd, 0xe6, 0x38, 0x93, 0x4b, 0xb4, 0xfa, 0x2b, - 0x2a, 0xa7, 0xae, 0x61, 0xef, 0xa3, 0xfd, 0x9e, 0xa2, 0xf1, 0xe9, 0x47, - 0x6a, 0xa5, 0x2e, 0xae, 0xa4, 0x80, 0xbb, 0x5f, 0x09, 0xe9, 0x84, 0x7a, - 0xf9, 0x60, 0x19, 0x9f, 0xc1, 0xe2, 0x42, 0xca, 0x0c, 0x8f, 0x78, 0xe4, - 0xeb, 0xd0, 0x37, 0x68, 0x8c, 0x23, 0x9d, 0x57, 0xf7, 0xd9, 0x41, 0x3d, - 0xbe, 0xbc, 0x2c, 0xca, 0xd6, 0x27, 0xa6, 0x0a, 0x22, 0x83, 0xcd, 0x10, - 0xa0, 0xfa, 0x80, 0xe7, 0x99, 0xf9, 0x5d, 0xaf, 0x95, 0x45, 0x7c, 0x67, - 0x87, 0x8a, 0x64, 0x6d, 0x53, 0xe5, 0x25, 0x50, 0x47, 0xa2, 0x25, 0xaf, - 0x4d, 0xbc, 0x73, 0x44, 0x6f, 0x8c, 0x06, 0xec, 0xe0, 0xdb, 0x72, 0x5f, - 0x01, 0xa2, 0x66, 0x53, 0x43, 0xcb, 0xd5, 0x42, 0xa4, 0xfc, 0x94, 0xe9, - 0xf1, 0x07, 0xce, 0xeb, 0x3d, 0x84, 0x0a, 0xdc, 0xe3, 0xd0, 0x73, 0x58, - 0xd3, 0x93, 0x67, 0xda, 0x98, 0x7c, 0x83, 0x2c, 0xd9, 0x23, 0x6b, 0x6c, - 0xe1, 0x82, 0x36, 0x1c, 0x43, 0x7c, 0xcf, 0xc5, 0x17, 0xf6, 0x9b, 0xc7, - 0xf3, 0x76, 0x85, 0xd0, 0xef, 0xd3, 0x56, 0x0d, 0xab, 0x47, 0xfb, 0xf7, - 0x62, 0x92, 0xa6, 0x7f, 0x27, 0xc3, 0x8c, 0x97, 0xa4, 0xd6, 0x1b, 0x8f, - 0x75, 0xa6, 0x63, 0x8c, 0xb4, 0x9d, 0xad, 0xa4, 0x39, 0xdd, 0x18, 0x23, - 0xe8, 0x86, 0xed, 0xd4, 0x1b, 0x14, 0x60, 0x71, 0x22, 0x99, 0x84, 0x3e, - 0x93, 0xec, 0x02, 0x47, 0x75, 0x6b, 0x68, 0x4f, 0xdd, 0x8f, 0x83, 0xf0, - 0x8c, 0xc3, 0x76, 0x1c, 0xeb, 0xed, 0x94, 0x3c, 0x3c, 0x1a, 0x39, 0xd1, - 0x6f, 0x02, 0x57, 0xad, 0x61, 0xb6, 0xa5, 0xaa, 0x0e, 0xc0, 0xa0, 0x38, - 0xee, 0x12, 0x82, 0x1f, 0x9e, 0xde, 0x38, 0x46, 0xaa, 0x03, 0x6b, 0x75, - 0x19, 0x4c, 0x2b, 0xfd, 0x3a, 0x0a, 0x3e, 0x6a, 0x00, 0xae, 0x63, 0xe9, - 0x5a, 0xea, 0x7d, 0x9c, 0x5e, 0x01, 0xd3, 0x9d, 0xb2, 0xf1, 0xef, 0xa8, - 0x5b, 0x4c, 0x2a, 0x44, 0x19, 0xce, 0x8b, 0x8c, 0x1f, 0xba, 0xd2, 0x41, - 0xa3, 0x20, 0x72, 0x0b, 0x30, 0x94, 0x58, 0xa9, 0x6d, 0xd2, 0xd5, 0xbe, - 0xb8, 0x20, 0x53, 0x28, 0xd7, 0xa2, 0x10, 0x23, 0x63, 0x32, 0xe7, 0xd5, - 0x3a, 0x00, 0xfe, 0x31, 0x7f, 0xd5, 0xac, 0x94, 0xd5, 0x67, 0x8e, 0x61, - 0x85, 0x42, 0x10, 0x16, 0xa6, 0xd4, 0x08, 0x4d, 0x65, 0x96, 0xf2, 0x85, - 0xfe, 0x52, 0x0b, 0x4d, 0x87, 0x66, 0x4c, 0x4d, 0xb1, 0x81, 0x5c, 0x6e, - 0xee, 0xaf, 0xd7, 0xc5, 0xf0, 0x33, 0xc6, 0x9d, 0x08, 0x3a, 0x2d, 0xbd, - 0x0e, 0x17, 0xc2, 0xa5, 0x31, 0x58, 0xae, 0x46, 0x0f, 0x1d, 0xb4, 0x15, - 0x52, 0xe7, 0xd9, 0x86, 0x88, 0x4e, 0x86, 0x32, 0xb9, 0x95, 0x5d, 0x4e, - 0xa4, 0x18, 0x95, 0x51, 0x6c, 0x58, 0xd4, 0xa7, 0xfe, 0x4d, 0x72, 0x8a, - 0xe7, 0xfd, 0x09, 0x85, 0x2b, 0xb1, 0x22, 0x3d, 0x12, 0xec, 0xa5, 0x5f, - 0xe7, 0x3c, 0xe5, 0x45, 0x7c, 0xd7, 0xa7, 0xd8, 0x9d, 0x78, 0x9f, 0xd5, - 0xb6, 0xf0, 0xc8, 0x0e, 0xd1, 0x7f, 0x8c, 0x12, 0x53, 0x23, 0x12, 0xd8, - 0x2a, 0x24, 0x12, 0xc9, 0x77, 0xa1, 0x07, 0x86, 0x9e, 0xea, 0x47, 0x39, - 0xbf, 0x5c, 0x48, 0xb3, 0xc9, 0x6b, 0xc9, 0x83, 0x8e, 0x3b, 0xbf, 0xa5, - 0x18, 0x8c, 0xc9, 0x78, 0xd6, 0x75, 0x72, 0x3a, 0x96, 0x31, 0xb0, 0x35, - 0x34, 0x31, 0xf4, 0xc1, 0x09, 0xb6, 0xba, 0x26, 0x6b, 0x21, 0xf0, 0xa1, - 0xf0, 0x9e, 0xc7, 0x5b, 0xa3, 0xbc, 0x7c, 0x18, 0x09, 0xf2, 0x26, 0xa5, - 0x81, 0x32, 0x97, 0x0c, 0x1c, 0x06, 0x91, 0x17, 0x7e, 0x13, 0xb9, 0xf4, - 0x65, 0x93, 0xdc, 0x86, 0x2b, 0x3d, 0x20, 0x63, 0xc6, 0x21, 0x93, 0xd5, - 0xbd, 0x50, 0x7e, 0x16, 0x94, 0x69, 0x38, 0x58, 0xcb, 0xe6, 0x86, 0x2c, - 0x0c, 0xd4, 0x78, 0x1f, 0x89, 0x67, 0x30, 0x0e, 0x03, 0x05, 0x31, 0x96, - 0x48, 0xbd, 0x60, 0x19, 0x60, 0xbf, 0x5a, 0xec, 0x31, 0xd7, 0x9b, 0x3e, - 0xc5, 0xb9, 0xc1, 0xf6, 0xbd, 0x2d, 0x9a, 0x7a, 0xdc, 0xd8, 0x43, 0x05, - 0x82, 0xe6, 0x03, 0xaa, 0x82, 0xb3, 0x57, 0x43, 0x14, 0xa2, 0x91, 0x00, - 0xbd, 0xaa, 0x4d, 0xa9, 0x59, 0x05, 0x01, 0x47, 0xd9, 0x04, 0xbe, 0xc0, - 0x1c, 0x6e, 0x18, 0xad, 0xfe, 0xf9, 0xc8, 0x88, 0x24, 0x47, 0x73, 0x9b, - 0xd0, 0xf6, 0xf6, 0xe9, 0xb4, 0x6e, 0xc6, 0x0d, 0x55, 0x71, 0xd2, 0x71, - 0x50, 0xfb, 0xf9, 0x29, 0x2e, 0x6b, 0x06, 0xe4, 0x70, 0xec, 0x36, 0x9c, - 0x62, 0x66, 0x00, 0xb9, 0x0e, 0x29, 0xc6, 0xe4, 0x38, 0xb2, 0xc7, 0x68, - 0x49, 0xd0, 0x88, 0xfc, 0x95, 0xd0, 0x0e, 0x09, 0xa1, 0xfd, 0xfe, 0x8e, - 0x08, 0xd9, 0xd8, 0x65, 0x42, 0xf6, 0x01, 0xc4, 0xc0, 0x8b, 0x72, 0x73, - 0xa5, 0x50, 0xad, 0xa3, 0xe4, 0x0d, 0xa0, 0x9b, 0xd5, 0xba, 0xdc, 0x77, - 0x01, 0x26, 0xac, 0x41, 0x31, 0x2a, 0x66, 0x10, 0x37, 0x94, 0x45, 0x83, - 0x6e, 0xfe, 0xac, 0x74, 0xd1, 0x59, 0x21, 0x58, 0xfd, 0x2c, 0xd6, 0xea, - 0x3e, 0xcc, 0xe3, 0x64, 0x8a, 0x2d, 0x38, 0x5e, 0xaf, 0xa4, 0x6f, 0xc5, - 0x71, 0x29, 0x08, 0x71, 0xb4, 0x39, 0xb4, 0xb4, 0x74, 0xa6, 0xc5, 0xda, - 0x69, 0xda, 0xba, 0x46, 0x08, 0xac, 0x7d, 0x5e, 0x1d, 0x41, 0xb6, 0x73, - 0x07, 0x69, 0x90, 0x93, 0xdb, 0x50, 0x20, 0xe9, 0xa5, 0x74, 0x3e, 0x46, - 0x22, 0x70, 0x3f, 0xad, 0x23, 0xde, 0xf3, 0xe2, 0x2d, 0x34, 0xce, 0xc6, - 0x7a, 0x42, 0x40, 0x03, 0x49, 0xe0, 0x3f, 0xcd, 0x64, 0x17, 0x70, 0xbf, - 0x7b, 0x56, 0xf1, 0xd8, 0x8a, 0x4b, 0xe1, 0x05, 0x5a, 0xd8, 0x23, 0xfc, - 0xd4, 0x1f, 0x4e, 0xff, 0x6b, 0x8a, 0x29, 0x79, 0xda, 0x68, 0x39, 0xd9, - 0xfa, 0x22, 0xf4, 0x10, 0x7c, 0x8f, 0xa6, 0x27, 0xbd, 0x3e, 0xb9, 0xa6, - 0xb2, 0x18, 0x87, 0x1f, 0x3d, 0xea, 0x00, 0xef, 0xba, 0x38, 0x3a, 0x54, - 0xe4, 0xd8, 0x8d, 0x2d, 0x00, 0xda, 0x08, 0xf5, 0x3b, 0x78, 0xea, 0x7e, - 0x45, 0x8f, 0x6a, 0x06, 0x25, 0x0c, 0x8f, 0x85, 0xf2, 0x24, 0xbe, 0xd7, - 0x3b, 0x0b, 0xd5, 0x0e, 0x90, 0xec, 0x68, 0x65, 0x9f, 0xdd, 0x73, 0x23, - 0xba, 0xa4, 0x77, 0x32, 0x69, 0xeb, 0xfa, 0x78, 0xf7, 0xaf, 0xc6, 0x75, - 0x5a, 0xce, 0x74, 0xe7, 0x58, 0xd6, 0xdf, 0xa4, 0xe1, 0x70, 0x15, 0xd1, - 0xca, 0xc8, 0x3f, 0x9e, 0x55, 0xb6, 0x2d, 0xf5, 0xf7, 0xdb, 0x97, 0x6e, - 0x5f, 0xbe, 0x31, 0xdb, 0x6f, 0x10, 0x37, 0xb1, 0x2c, 0x56, 0x43, 0x74, - 0xd4, 0xc8, 0xe7, 0x94, 0x0c, 0x32, 0x20, 0xf3, 0x0a, 0xa6, 0x0c, 0x4d, - 0xed, 0x43, 0x32, 0x62, 0x72, 0x67, 0x4f, 0xc5, 0x42, 0x74, 0x5e, 0xa9, - 0xf8, 0xc0, 0x94, 0x90, 0x2c, 0x03, 0x9f, 0x98, 0x5b, 0x67, 0x60, 0xc7, - 0x29, 0x15, 0x8a, 0x40, 0x03, 0xf1, 0x4d, 0x50, 0x54, 0x7f, 0x69, 0x04, - 0x40, 0xdc, 0x72, 0x9d, 0xe9, 0xef, 0xbf, 0xe3, 0x72, 0xe5, 0xf4, 0x88, - 0x9f, 0x48, 0x97, 0xf6, 0x71, 0x55, 0x2f, 0x17, 0x6a, 0x09, 0x36, 0x39, - 0x9f, 0xdb, 0xa8, 0x2f, 0x65, 0x68, 0x8e, 0x8c, 0x5e, 0xfa, 0x7f, 0x66, - 0xaa, 0xc4, 0xa5, 0xfb, 0xf2, 0x49, 0x90, 0x30, 0x98, 0xd1, 0xb4, 0x4a, - 0x0d, 0xf1, 0x0b, 0xc3, 0x88, 0xa2, 0x00, 0x39, 0x94, 0xfc, 0xdd, 0x14, - 0x71, 0x35, 0xbc, 0x99, 0x79, 0x6d, 0xfc, 0xeb, 0xa9, 0x66, 0x57, 0x25, - 0x1a, 0x4b, 0xdd, 0x8b, 0xb2, 0x0b, 0x8d, 0x7e, 0x1a, 0x11, 0x14, 0x4d, - 0xd6, 0x17, 0x04, 0xdf, 0x2c, 0xac, 0xae, 0xc6, 0x7f, 0xd2, 0x00, 0xf9, - 0x84, 0xb1, 0x99, 0x21, 0xca, 0xe8, 0x42, 0x7d, 0x78, 0x0a, 0xac, 0x12, - 0x99, 0x19, 0x6d, 0x96, 0xcb, 0x19, 0x9f, 0x7f, 0x77, 0xa9, 0x0d, 0xb4, - 0x14, 0x4d, 0xd4, 0x30, 0x57, 0x2f, 0x01, 0x01, 0xf0, 0xc6, 0xf1, 0xf9, - 0xda, 0x35, 0x59, 0x39, 0xa2, 0x56, 0x47, 0xfc, 0x34, 0x1b, 0xc9, 0x33, - 0xbb, 0x70, 0xda, 0x86, 0xac, 0xb9, 0xd6, 0xd3, 0x3a, 0xf1, 0x37, 0x39, - 0x4e, 0xe9, 0x09, 0x85, 0x52, 0x07, 0x7c, 0x2a, 0xf8, 0x17, 0x6c, 0x22, - 0x8c, 0x3a, 0xc7, 0x74, 0x6c, 0x8b, 0x18, 0x6f, 0x6e, 0xcb, 0xd2, 0x08, - 0x44, 0xfa, 0x11, 0xf1, 0xb6, 0xea, 0xdb, 0xe8, 0x5f, 0xc8, 0x89, 0x59, - 0xfb, 0x5e, 0x1d, 0xcd, 0x1c, 0x8e, 0x1b, 0xa9, 0x0e, 0x24, 0x39, 0xd0, - 0xb1, 0x87, 0x1c, 0xea, 0x52, 0xd3, 0xbd, 0x6a, 0x65, 0x2b, 0x7d, 0x01, - 0x8c, 0x4b, 0x91, 0x2f, 0x83, 0x38, 0x77, 0x27, 0x95, 0x2a, 0xec, 0xa9, - 0x38, 0x84, 0x28, 0x5a, 0x9b, 0xbc, 0xea, 0xd1, 0xb2, 0xd4, 0x90, 0xd7, - 0x78, 0xdc, 0x19, 0x5b, 0xbf, 0xa1, 0x5f, 0x35, 0xfa, 0x4c, 0xae, 0x61, - 0x37, 0x7b, 0x7e, 0x55, 0x03, 0x16, 0x74, 0x67, 0x69, 0x29, 0x30, 0x35, - 0x9d, 0xbc, 0xef, 0x77, 0x59, 0x71, 0x77, 0x25, 0x0d, 0x4a, 0x5c, 0x31, - 0x00, 0x24, 0xb5, 0x12, 0x2b, 0xa1, 0x00, 0x5f, 0x0b, 0xd3, 0x79, 0x2c, - 0xc6, 0x09, 0x1d, 0x7b, 0x3d, 0x29, 0xf4, 0x72, 0x56, 0x70, 0x5d, 0xcc, - 0xd2, 0xc4, 0x73, 0xfe, 0xc2, 0xb8, 0xa4, 0x35, 0x64, 0x21, 0x01, 0x9f, - 0xd4, 0x1b, 0x88, 0xb1, 0x7f, 0xd2, 0x3b, 0x36, 0x13, 0x40, 0x4d, 0xc5, - 0x16, 0x7e, 0x88, 0xa6, 0xe1, 0x0f, 0x43, 0x1c, 0x28, 0x60, 0x32, 0x40, - 0x83, 0xad, 0x58, 0x14, 0xb9, 0x2c, 0xf4, 0x7c, 0x50, 0x6f, 0x8b, 0x22, - 0xee, 0x10, 0xb2, 0x69, 0x04, 0x19, 0xfc, 0x50, 0xa4, 0xbe, 0x85, 0x4c, - 0x7f, 0xdd, 0x7b, 0x42, 0x89, 0xd6, 0x76, 0x3c, 0xd0, 0x6e, 0xb1, 0xb6, - 0xfc, 0x97, 0xe9, 0xb1, 0xc4, 0xfe, 0x7a, 0x83, 0x4e, 0x77, 0x82, 0x67, - 0x79, 0xd3, 0xb1, 0x71, 0xbc, 0x62, 0x84, 0xba, 0x18, 0x57, 0xb2, 0x70, - 0x81, 0x14, 0x3d, 0xfd, 0x38, 0x9a, 0x0a, 0x77, 0x0c, 0x0d, 0x1a, 0x69, - 0x02, 0x34, 0x90, 0xf0, 0x3c, 0xbd, 0xc7, 0x0c, 0x30, 0x2c, 0xa1, 0xe5, - 0x6f, 0xf0, 0x58, 0x7d, 0xac, 0x2b, 0xe7, 0xbd, 0x8d, 0xbb, 0x08, 0x8a, - 0x7a, 0x75, 0xe1, 0x2d, 0xa7, 0xf0, 0x9a, 0x7a, 0x1a, 0xbb, 0xae, 0x7a, - 0x20, 0x1e, 0x4d, 0x1a, 0x3d, 0x51, 0x74, 0xb7, 0x77, 0xa2, 0xdd, 0xa8, - 0x20, 0x25, 0xef, 0xd8, 0x4e, 0x4c, 0xe5, 0x69, 0x03, 0x97, 0x14, 0xf6, - 0x54, 0x23, 0xf3, 0x05, 0x4a, 0xad, 0xdc, 0xa0, 0x8f, 0x91, 0x15, 0x66, - 0xef, 0x88, 0x00, 0xac, 0x15, 0x28, 0x48, 0x98, 0x1d, 0x49, 0x90, 0x5b, - 0x2f, 0x53, 0x21, 0x5e, 0x21, 0xa4, 0xd3, 0x9c, 0xf4, 0x67, 0x53, 0x6e, - 0x4e, 0x54, 0xf9, 0x95, 0x4d, 0x3e, 0x77, 0xef, 0x36, 0x14, 0x54, 0x97, - 0x6c, 0x27, 0x53, 0x25, 0x3a, 0x76, 0x34, 0xc5, 0x20, 0x31, 0xd1, 0x5d, - 0x43, 0x65, 0x35, 0x33, 0x0e, 0x22, 0xaf, 0xb5, 0xb0, 0x76, 0xf0, 0x9d, - 0x4f, 0x8e, 0xeb, 0x21, 0xbc, 0xe4, 0xd9, 0x64, 0xf7, 0xb4, 0x5a, 0x0b, - 0xcc, 0xfb, 0x36, 0xb1, 0x71, 0x4e, 0x9c, 0x98, 0x2e, 0xef, 0x0d, 0x09, - 0x51, 0xfb, 0xea, 0x6f, 0x9b, 0xb8, 0x39, 0x0a, 0xbc, 0x89, 0x8d, 0x65, - 0x5a, 0xc3, 0x84, 0xff, 0x5d, 0x0e, 0xc3, 0xad, 0x87, 0x1e, 0xf1, 0x9a, - 0x1e, 0x7a, 0xb6, 0x28, 0x6b, 0xe5, 0x93, 0x0d, 0x54, 0xf5, 0xdc, 0xd3, - 0x6e, 0x78, 0xce, 0x7b, 0x63, 0x7a, 0x8b, 0xf0, 0x8b, 0xbe, 0x52, 0xd9, - 0x7f, 0xe2, 0x92, 0x7e, 0x4e, 0x41, 0xce, 0x16, 0x83, 0xa4, 0xb3, 0x1e, - 0x8d, 0x4e, 0xff, 0x22, 0x77, 0x12, 0x0f, 0x87, 0x80, 0x1e, 0x15, 0x65, - 0xe2, 0xbf, 0xb8, 0xfb, 0x9a, 0x71, 0x45, 0xa9, 0x32, 0x7c, 0x5f, 0x4c, - 0x90, 0x28, 0x76, 0x7a, 0x71, 0x37, 0x99, 0x68, 0x59, 0xc5, 0x1e, 0xcd, - 0x11, 0xc3, 0x50, 0x3f, 0x7a, 0x89, 0xf4, 0x03, 0xb0, 0xcc, 0x44, 0xf4, - 0x22, 0xdc, 0xad, 0x7c, 0xfe, 0x65, 0x08, 0x61, 0x9d, 0xbe, 0xb1, 0x93, - 0xe4, 0x5a, 0x67, 0xd1, 0xd4, 0x7c, 0xe1, 0xf6, 0x33, 0x50, 0xd5, 0x08, - 0x6f, 0xeb, 0xe7, 0x95, 0x75, 0xef, 0xd3, 0xc1, 0x85, 0xbc, 0x6f, 0x08, - 0x28, 0x24, 0xc0, 0x21, 0xa8, 0xb5, 0x7c, 0x3e, 0xdc, 0x59, 0x63, 0x74, - 0xf6, 0xcb, 0xd2, 0x5d, 0x5c, 0xb1, 0x36, 0x7e, 0xb4, 0x6f, 0xb3, 0xd4, - 0xa9, 0x16, 0x85, 0xbe, 0x00, 0xfd, 0xc9, 0xc7, 0x53, 0xfc, 0xdd, 0xc1, - 0xf5, 0x4b, 0x0f, 0x98, 0x2f, 0xb9, 0xa4, 0x97, 0x5d, 0xed, 0xc8, 0xd8, - 0x07, 0xa3, 0xe4, 0xdb, 0x99, 0x17, 0x45, 0xb5, 0x33, 0x3c, 0x50, 0x74, - 0xc0, 0x62, 0x9e, 0x61, 0xc8, 0x45, 0xfb, 0xea, 0x51, 0x2c, 0xa5, 0x41, - 0x56, 0xac, 0xd2, 0x78, 0x13, 0xb8, 0x12, 0x4f, 0x8a, 0xe7, 0xff, 0xb8, - 0x70, 0xaa, 0xe0, 0x56, 0x17, 0xfd, 0xe2, 0x5c, 0xc1, 0xa2, 0xd3, 0xf1, - 0x3c, 0xa9, 0x5a, 0xcc, 0x41, 0x58, 0x9f, 0x7d, 0x5c, 0xe6, 0xe6, 0xbd, - 0x6e, 0x8d, 0xcf, 0xd2, 0xf1, 0x8b, 0x7d, 0xd9, 0x5d, 0xea, 0x7c, 0x61, - 0x69, 0xa5, 0x03, 0xee, 0xf5, 0x87, 0x15, 0x3d, 0xe2, 0xf6, 0xc2, 0x52, - 0xb7, 0xd7, 0x79, 0xd0, 0x18, 0x46, 0x7d, 0xc7, 0xec, 0x11, 0xde, 0x88, - 0x49, 0x02, 0xcc, 0x5a, 0x78, 0xa3, 0x8e, 0x12, 0x0e, 0x64, 0x68, 0x58, - 0x92, 0xd5, 0x89, 0xb0, 0xf3, 0x00, 0x1f, 0xf5, 0xd3, 0x3d, 0x87, 0x50, - 0xd7, 0x52, 0xc4, 0x1c, 0x79, 0x28, 0x22, 0xd2, 0x16, 0xc9, 0xe0, 0x3e, - 0xa5, 0x4f, 0x5f, 0x90, 0x52, 0x40, 0x85, 0x0c, 0xec, 0xde, 0xf0, 0xc0, - 0x7a, 0xf3, 0xa4, 0xf8, 0xf8, 0x37, 0xd6, 0x8b, 0xfb, 0x02, 0x04, 0xc7, - 0xcd, 0xc8, 0xc6, 0x53, 0x92, 0xfd, 0x99, 0xdf, 0x66, 0xf8, 0x15, 0x4d, - 0xc0, 0x8e, 0x4e, 0xbb, 0x64, 0x04, 0xf8, 0xc9, 0x2d, 0xf4, 0x70, 0xfe, - 0xbe, 0x95, 0xcd, 0x8f, 0x25, 0x7b, 0x51, 0xdb, 0x18, 0x4d, 0x78, 0x04, - 0x9a, 0xe1, 0xdf, 0x8e, 0xba, 0x89, 0x42, 0x1a, 0xfc, 0x36, 0x69, 0x1f, - 0x0f, 0xe7, 0x06, 0xed, 0xf7, 0x9d, 0x51, 0x55, 0x62, 0xb7, 0xaa, 0x9c, - 0x34, 0x3c, 0x33, 0x34, 0xbe, 0x70, 0xfe, 0x6e, 0xf2, 0xfd, 0x30, 0xda, - 0xa0, 0xb6, 0x78, 0x44, 0x37, 0x24, 0xb0, 0x86, 0x29, 0xb2, 0xdd, 0x76, - 0xaf, 0x02, 0xcd, 0xec, 0xf5, 0x53, 0x84, 0xc3, 0x92, 0x69, 0xc5, 0xc6, - 0x6e, 0x93, 0xa0, 0xbd, 0x59, 0x9f, 0xe5, 0x23, 0x2c, 0x1a, 0x68, 0x77, - 0x68, 0xd8, 0xa6, 0x7e, 0x3e, 0xc8, 0x0d, 0x47, 0x88, 0xc1, 0x67, 0xfe, - 0x1b, 0xb1, 0x7e, 0xad, 0x5e, 0xb3, 0x28, 0xf1, 0xa6, 0xa0, 0xb6, 0xa0, - 0x84, 0xc9, 0xa5, 0x1f, 0x44, 0x30, 0xef, 0x2f, 0x33, 0xa1, 0xb5, 0xbd, - 0x65, 0x80, 0xb8, 0xf5, 0x7d, 0xe4, 0xd8, 0x27, 0x21, 0x8e, 0x9c, 0x66, - 0x86, 0x1f, 0x00, 0x88, 0xf4, 0xac, 0x15, 0xb7, 0x5e, 0xe8, 0xbc, 0x9f, - 0xf6, 0xa7, 0x6a, 0x22, 0xaa, 0x41, 0xc3, 0x9a, 0x7e, 0x0d, 0x8a, 0xe7, - 0xe6, 0x94, 0xbb, 0xf6, 0x06, 0x4f, 0xfb, 0x4a, 0xc4, 0x45, 0xad, 0xb4, - 0x1b, 0x3e, 0x22, 0x6d, 0xea, 0xa7, 0x4f, 0xa9, 0xa5, 0x3e, 0xda, 0x4f, - 0xf2, 0xff, 0x01, 0xc4, 0x6d, 0xbd, 0x76, 0xce, 0x15, 0xbe, 0x34, 0x33, - 0x9d, 0xb9, 0x10, 0x5e, 0xa8, 0x71, 0xda, 0xf8, 0xc7, 0xce, 0x0c, 0x0a, - 0xa0, 0x5e, 0xd2, 0x2a, 0x77, 0x53, 0xe1, 0x0a, 0x1f, 0x61, 0x31, 0x48, - 0x01, 0xe2, 0x37, 0xdd, 0xfa, 0x56, 0xac, 0xdf, 0x79, 0x88, 0xe9, 0xa0, - 0x31, 0xfd, 0x40, 0xcd, 0xfc, 0x00, 0xe4, 0xae, 0xd1, 0x2e, 0x3c, 0xae, - 0xfd, 0xa3, 0x78, 0x3e, 0x15, 0xcc, 0xa1, 0x34, 0xb2, 0x8b, 0xc3, 0x49, - 0x05, 0xa3, 0x43, 0x75, 0xdd, 0x21, 0x0a, 0xfc, 0xf7, 0xcb, 0xb8, 0x31, - 0x05, 0x44, 0xf6, 0xa0, 0xa7, 0x97, 0x0b, 0xf1, 0x6a, 0x47, 0xc7, 0x9c, - 0x6c, 0x92, 0xfe, 0xcb, 0xf3, 0xab, 0x5a, 0xb1, 0x11, 0xc4, 0x06, 0x58, - 0x79, 0x26, 0xe6, 0xca, 0x12, 0x86, 0xb5, 0xa1, 0x05, 0xfa, 0xeb, 0xa3, - 0xbe, 0x9c, 0xd2, 0x62, 0x26, 0x58, 0x8a, 0x00, 0xfd, 0xf5, 0xe6, 0xac, - 0x92, 0x0d, 0x5f, 0xb0, 0x09, 0xd1, 0xf4, 0xb2, 0x56, 0x61, 0x2f, 0x30, - 0x93, 0x86, 0x6b, 0x40, 0x31, 0x63, 0x7c, 0x10, 0xf4, 0x38, 0x27, 0xca, - 0x35, 0x47, 0x6d, 0x21, 0x30, 0x08, 0xa0, 0xf8, 0x8a, 0x6c, 0x30, 0xf0, - 0xdf, 0x20, 0x56, 0x3a, 0x01, 0xf4, 0x13, 0xb1, 0xe2, 0xf1, 0x5f, 0xf6, - 0x15, 0xf1, 0xe6, 0x3e, 0x4c, 0x00, 0xce, 0xe1, 0xb1, 0x7d, 0xac, 0x9a, - 0x5d, 0xa5, 0xa1, 0xfc, 0x7f, 0xcc, 0x42, 0xc1, 0x65, 0x1e, 0x12, 0xcf, - 0xdd, 0x21, 0x92, 0xb3, 0x33, 0xc5, 0x4c, 0xcb, 0xe2, 0xb5, 0xd1, 0xc6, - 0xa0, 0xaf, 0x60, 0x1c, 0x7d, 0xad, 0x9a, 0x07, 0x22, 0xb9, 0x94, 0x28, - 0x14, 0x73, 0x32, 0x16, 0xed, 0xab, 0x72, 0xf9, 0xf8, 0x63, 0x89, 0xfc, - 0xa7, 0xdc, 0x84, 0x1a, 0xfb, 0xd5, 0x66, 0xfa, 0xc4, 0xa9, 0xe3, 0x47, - 0x0f, 0x0e, 0xc4, 0xc4, 0xf6, 0x49, 0x43, 0x1b, 0x3a, 0xc2, 0xff, 0x5d, - 0x87, 0xf9, 0x4d, 0xc7, 0xdb, 0x8a, 0x0b, 0xe7, 0xc7, 0x66, 0x09, 0x5e, - 0x76, 0xbd, 0xd0, 0xb5, 0x30, 0xc6, 0x92, 0x9f, 0xd4, 0x06, 0x65, 0x1b, - 0x6a, 0x92, 0x1f, 0x2d, 0x7f, 0x6c, 0x54, 0x3f, 0x63, 0x12, 0x73, 0x00, - 0xfc, 0xa1, 0xbb, 0x13, 0xec, 0x7a, 0xb4, 0xc4, 0x94, 0x44, 0x79, 0xe5, - 0x49, 0x85, 0x32, 0x5b, 0x77, 0x11, 0x5e, 0x34, 0x2a, 0x90, 0xec, 0xb8, - 0x66, 0xdc, 0x6e, 0xb9, 0xcc, 0xc9, 0xc7, 0x5d, 0xd9, 0x31, 0xae, 0x41, - 0xcd, 0xb6, 0x65, 0x6e, 0x7a, 0x38, 0x0b, 0xa7, 0x56, 0x7c, 0xe8, 0xf0, - 0x16, 0xd8, 0x0e, 0x12, 0xe3, 0x5e, 0x9f, 0xbf, 0x6e, 0x8c, 0x24, 0x5e, - 0xc7, 0x6a, 0x2e, 0xe0, 0x17, 0xd0, 0xc3, 0x4c, 0x16, 0xd8, 0xb7, 0xb0, - 0x1f, 0x19, 0x0a, 0x11, 0x09, 0x9a, 0x15, 0xd3, 0x41, 0x20, 0x19, 0xac, - 0x74, 0xe4, 0xf5, 0x5d, 0xf9, 0x51, 0xb2, 0x4b, 0xde, 0xe6, 0xbc, 0x8e, - 0x92, 0x12, 0xad, 0x8e, 0x6b, 0x72, 0x51, 0x4d, 0xe0, 0xa4, 0x8d, 0x35, - 0x3f, 0x31, 0x97, 0xfd, 0x1c, 0x51, 0x55, 0x40, 0xd8, 0x3a, 0xa3, 0x1f, - 0x14, 0x0c, 0xd4, 0xe2, 0x4b, 0x14, 0x10, 0x18, 0xfc, 0x70, 0xd0, 0x02, - 0xe7, 0xad, 0xba, 0xa0, 0x84, 0x59, 0x35, 0x1b, 0x06, 0x58, 0x06, 0x10, - 0x72, 0x42, 0x72, 0x47, 0x68, 0xc8, 0x81, 0xad, 0x54, 0x44, 0x4d, 0x26, - 0x06, 0x38, 0x6c, 0x25, 0x37, 0x21, 0xf2, 0xa0, 0x12, 0xf8, 0x48, 0x4f, - 0xe7, 0xf6, 0xd8, 0x60, 0x85, 0xf0, 0x40, 0x6a, 0x11, 0x34, 0x98, 0x0a, - 0x45, 0xdf, 0xbd, 0xe3, 0x22, 0xee, 0xe6, 0x54, 0xb5, 0x64, 0x81, 0x77, - 0x52, 0x9d, 0x2b, 0x1c, 0xf7, 0xa1, 0x78, 0x39, 0xb9, 0x25, 0x74, 0x49, - 0x59, 0x97, 0x78, 0xf9, 0x7f, 0xa1, 0x8a, 0x47, 0x17, 0x1c, 0x03, 0xfb, - 0x9d, 0xe0, 0x7e, 0x61, 0x21, 0x0c, 0xff, 0x73, 0xda, 0x84, 0x54, 0xb5, - 0xa9, 0xda, 0x74, 0xb9, 0xef, 0xbb, 0x91, 0xb4, 0x66, 0xf7, 0x4a, 0xb0, - 0x7e, 0xd4, 0x1f, 0xaa, 0x63, 0xcd, 0xf9, 0xdb, 0x7c, 0xb8, 0xf6, 0x60, - 0x57, 0x58, 0x04, 0x8e, 0x28, 0x6f, 0x4b, 0xa8, 0xac, 0x76, 0x87, 0x22, - 0x10, 0x71, 0x98, 0x0b, 0xde, 0xc4, 0x98, 0x25, 0x58, 0x51, 0x18, 0x2a, - 0xed, 0x45, 0xdb, 0x7b, 0xb5, 0x1c, 0x79, 0xb5, 0x7e, 0xd5, 0x9d, 0x5d, - 0xe4, 0x3f, 0xa3, 0x72, 0x15, 0x7c, 0x73, 0xde, 0x52, 0x77, 0x41, 0x9d, - 0xa2, 0xa7, 0xa2, 0xbe, 0xf5, 0x09, 0x28, 0xc1, 0xfd, 0x01, 0x29, 0x88, - 0x9b, 0xde, 0xd5, 0x46, 0xec, 0xe3, 0xaa, 0xb5, 0xee, 0x8d, 0xf6, 0x7b, - 0xe1, 0x88, 0x0c, 0x18, 0x1b, 0xfa, 0x60, 0x86, 0x64, 0xe4, 0x5b, 0x3a, - 0xa3, 0x10, 0xb1, 0x61, 0x31, 0xdb, 0x20, 0x4c, 0x3d, 0x79, 0x5b, 0xa6, - 0x41, 0xba, 0x90, 0x53, 0x74, 0x35, 0x0c, 0x1e, 0xfd, 0xb3, 0xd2, 0xd9, - 0x20, 0x30, 0xce, 0xbc, 0xbc, 0x6d, 0xbd, 0x9b, 0xfd, 0xf7, 0x82, 0x38, - 0xa9, 0xa7, 0x53, 0x65, 0xa1, 0x71, 0xe2, 0x05, 0xac, 0x56, 0xf7, 0x49, - 0xe5, 0x11, 0x88, 0xac, 0x3b, 0xfd, 0x0a, 0x52, 0xc8, 0x83, 0xf4, 0xeb, - 0xa8, 0x1e, 0xd4, 0xbf, 0x65, 0x43, 0xc2, 0x4f, 0x95, 0xec, 0x7e, 0x93, - 0x54, 0x6f, 0x39, 0x8c, 0x75, 0x53, 0x90, 0x39, 0xb5, 0x8a, 0x7d, 0xb1, - 0xc1, 0x7c, 0x20, 0xdc, 0x02, 0x1c, 0x74, 0x2e, 0x8f, 0x66, 0xbe, 0x0b, - 0x7c, 0xd9, 0x54, 0xd9, 0xfb, 0x2a, 0x3f, 0x97, 0x29, 0x00, 0x2c, 0xfe, - 0x8b, 0xb3, 0x75, 0x69, 0x41, 0x06, 0x08, 0x0e, 0xce, 0xde, 0xa5, 0x97, - 0x7f, 0x3c, 0xdd, 0x82, 0x0e, 0xbf, 0x77, 0xc3, 0xaa, 0xc3, 0xdd, 0x46, - 0x90, 0xda, 0xec, 0xd9, 0x3a, 0x66, 0xc3, 0x01, 0x9f, 0xf3, 0x80, 0xba, - 0x64, 0x46, 0xf8, 0x76, 0x9c, 0x41, 0xee, 0xc6, 0xd3, 0x32, 0x04, 0xff, - 0x5a, 0xde, 0x5b, 0xc0, 0x31, 0x69, 0x74, 0x57, 0x48, 0x79, 0xa1, 0xed, - 0x8d, 0x0c, 0x16, 0xed, 0x0c, 0xc9, 0x31, 0xf4, 0x5c, 0x2c, 0x3a, 0x89, - 0x9a, 0x71, 0xdd, 0x43, 0x1c, 0xbf, 0x48, 0x6a, 0x3a, 0xd4, 0xe4, 0x33, - 0x0c, 0xcf, 0x98, 0xa2, 0x9b, 0x2d, 0x2a, 0x0f, 0xa2, 0xd9, 0xda, 0xdc, - 0x10, 0xa5, 0x25, 0x3f, 0xaa, 0xab, 0x5f, 0x1f, 0xda, 0xed, 0x89, 0x8d, - 0x03, 0x28, 0xe4, 0xd7, 0x36, 0x49, 0xca, 0x57, 0x23, 0x9b, 0x1f, 0x08, - 0xf5, 0x5d, 0xbf, 0x7b, 0x1f, 0x0a, 0x29, 0x7d, 0x0c, 0x97, 0x00, 0x79, - 0x9e, 0x29, 0x73, 0x89, 0x26, 0xe8, 0x76, 0xb7, 0xa5, 0x4e, 0x39, 0x13, - 0x97, 0xfd, 0x1c, 0x6f, 0xec, 0xf0, 0xa9, 0xcb, 0x85, 0x3e, 0x28, 0x37, - 0xae, 0xd4, 0x41, 0x0a, 0xe7, 0x11, 0xca, 0xb8, 0x91, 0x68, 0x65, 0xbe, - 0x64, 0x1c, 0xff, 0xfc, 0xf8, 0x98, 0xe2, 0x5a, 0x6d, 0x4b, 0x6d, 0xfe, - 0xbc, 0x16, 0x96, 0xff, 0xc2, 0x9e, 0xc5, 0x95, 0x85, 0x5e, 0x2d, 0xe2, - 0x91, 0x20, 0xca, 0x89, 0xbd, 0x10, 0x96, 0x90, 0x56, 0x3d, 0xe8, 0xc0, - 0x18, 0xf6, 0x1c, 0x42, 0xc5, 0xa0, 0xdf, 0x17, 0x12, 0x45, 0x53, 0x95, - 0x8a, 0x49, 0x1b, 0x59, 0x96, 0x5d, 0x11, 0xa4, 0x7e, 0x94, 0x4c, 0x30, - 0xec, 0x84, 0x41, 0x08, 0xb8, 0xaf, 0xc7, 0xe1, 0xce, 0x0a, 0xb2, 0x45, - 0x93, 0x66, 0x32, 0xfc, 0x54, 0xe6, 0x75, 0x2a, 0x33, 0x9e, 0x54, 0xb8, - 0x47, 0x70, 0x9a, 0x88, 0x54, 0x92, 0x4a, 0xdc, 0x1d, 0x17, 0xc4, 0x50, - 0x8b, 0xc9, 0x0c, 0x88, 0x12, 0xed, 0x3d, 0x00, 0x17, 0x24, 0x5f, 0x84, - 0xbb, 0xad, 0x2f, 0xa0, 0xb5, 0xea, 0xbb, 0x10, 0x76, 0x22, 0x15, 0x24, - 0x2a, 0xda, 0xa8, 0xdd, 0x24, 0x65, 0xf4, 0x35, 0xb2, 0xf4, 0x58, 0x2c, - 0x98, 0xfa, 0x11, 0x39, 0x37, 0xe5, 0xf8, 0xc1, 0x98, 0xd5, 0xa3, 0x29, - 0xd6, 0x41, 0xf0, 0x16, 0xb9, 0xf3, 0xad, 0xe9, 0x23, 0xba, 0xae, 0x64, - 0xc1, 0x78, 0x3d, 0xb4, 0x3f, 0x63, 0xf1, 0x99, 0x26, 0x30, 0x4d, 0x04, - 0xc8, 0x66, 0x47, 0x7f, 0x91, 0x82, 0x1e, 0x3f, 0xd4, 0xc1, 0x42, 0x98, - 0x41, 0xbe, 0x04, 0x53, 0x26, 0x33, 0xde, 0x92, 0xad, 0x09, 0x1f, 0xc6, - 0xa8, 0x38, 0x31, 0x12, 0x3a, 0xce, 0x60, 0xd6, 0x46, 0x34, 0xd3, 0x8c, - 0xc7, 0x74, 0xb9, 0x7d, 0xba, 0x02, 0xb6, 0xdf, 0x39, 0x6c, 0xfc, 0x88, - 0x97, 0x93, 0xa8, 0xef, 0x9a, 0x5f, 0x95, 0xf6, 0x83, 0xe9, 0xf6, 0x9f, - 0xc3, 0x0a, 0xaf, 0xca, 0xeb, 0x67, 0x6a, 0x26, 0x38, 0x5b, 0xcc, 0x86, - 0xbb, 0x53, 0xd8, 0x40, 0x20, 0x69, 0x4e, 0x02, 0xbc, 0x86, 0x28, 0xd8, - 0xf7, 0x5f, 0x5a, 0x17, 0x8c, 0x6e, 0x44, 0xa3, 0x39, 0xbc, 0x6b, 0x68, - 0x70, 0xcd, 0x28, 0x6c, 0xd4, 0xcb, 0xea, 0xd0, 0x95, 0x0f, 0xde, 0xcc, - 0x4f, 0x64, 0x88, 0x86, 0xcf, 0x17, 0xd3, 0xbb, 0x5b, 0x8e, 0xb9, 0x59, - 0x4a, 0xfa, 0x82, 0xe5, 0x71, 0xd9, 0x4c, 0x1c, 0xcd, 0xfb, 0x10, 0xbb, - 0x17, 0xd2, 0x05, 0x62, 0xc3, 0x58, 0xf7, 0x31, 0x48, 0xe1, 0x85, 0xdb, - 0xdc, 0xd9, 0x7b, 0x93, 0xb7, 0xcb, 0x28, 0x10, 0x0d, 0x84, 0xfa, 0x4b, - 0x86, 0x44, 0x19, 0xa5, 0x3b, 0x27, 0x5f, 0x87, 0x60, 0xce, 0xca, 0xda, - 0xba, 0x61, 0x56, 0x55, 0x1a, 0x61, 0xc8, 0x54, 0x47, 0x89, 0x96, 0xc2, - 0x2e, 0xa7, 0x52, 0x21, 0x46, 0x50, 0xcb, 0x0a, 0x62, 0xb7, 0x8a, 0xa5, - 0xea, 0x6d, 0xe0, 0xbb, 0xd2, 0x85, 0x33, 0xfc, 0xa3, 0xb6, 0xed, 0x63, - 0xd6, 0x31, 0x2a, 0xdc, 0x66, 0x6e, 0xde, 0x68, 0x45, 0x91, 0xef, 0xf0, - 0x96, 0x25, 0x64, 0xfb, 0xee, 0x10, 0x1a, 0xfb, 0xbe, 0x04, 0xc6, 0x20, - 0x37, 0x88, 0x25, 0x97, 0x87, 0x3d, 0xd7, 0x8f, 0x03, 0xd6, 0x58, 0x03, - 0x5f, 0x4c, 0x2c, 0x3c, 0xd8, 0x6d, 0x7a, 0x65, 0x45, 0x79, 0xbc, 0xba, - 0x6d, 0xfa, 0x83, 0x82, 0xc4, 0xca, 0x40, 0x15, 0xdd, 0x4d, 0x7e, 0xc3, - 0x00, 0xbd, 0x28, 0xb5, 0xa4, 0x0a, 0xa7, 0x45, 0xcc, 0xc7, 0xb9, 0x7b, - 0x72, 0xfe, 0x48, 0x9f, 0x50, 0x8c, 0x45, 0x5e, 0x9a, 0x58, 0x01, 0x04, - 0xe5, 0x3a, 0xac, 0x91, 0x2c, 0x05, 0x45, 0xa5, 0xff, 0x38, 0x59, 0xc4, - 0xed, 0x2b, 0x49, 0xa2, 0x3e, 0x63, 0x0e, 0xa4, 0x95, 0xa5, 0x34, 0x1d, - 0x30, 0xc6, 0xb7, 0x3b, 0x00, 0xec, 0x2b, 0xa7, 0x36, 0x36, 0x2c, 0x78, - 0x0e, 0x98, 0x01, 0xd4, 0xe8, 0x70, 0x73, 0xac, 0xb8, 0xd3, 0x9f, 0xe8, - 0xc1, 0x2d, 0xb0, 0x68, 0x1e, 0x2c, 0x22, 0x0d, 0x84, 0x61, 0xb2, 0xdd, - 0x44, 0x31, 0x99, 0x14, 0x21, 0x65, 0x97, 0x94, 0x52, 0x6d, 0xfd, 0x0c, - 0xde, 0x51, 0x07, 0x31, 0x7f, 0xd1, 0xe2, 0x4b, 0xb6, 0x99, 0xc4, 0x9a, - 0xca, 0x3b, 0x10, 0x2c, 0xda, 0xed, 0x51, 0x17, 0xd0, 0xe5, 0x1c, 0x9a, - 0x63, 0xaa, 0x4b, 0x8b, 0x29, 0xe6, 0xbe, 0x0c, 0x04, 0xdb, 0x3e, 0xd9, - 0x58, 0xde, 0x1f, 0x69, 0x91, 0xf4, 0xd9, 0xa3, 0xc8, 0x50, 0x92, 0x56, - 0x4e, 0x57, 0xf5, 0x0b, 0x15, 0x35, 0x5c, 0x82, 0x90, 0x37, 0x08, 0x29, - 0x1b, 0x08, 0x56, 0x37, 0xd0, 0x97, 0x97, 0x75, 0xad, 0x36, 0xf1, 0xd1, - 0x75, 0xfa, 0x4f, 0xa7, 0x77, 0xda, 0x04, 0x55, 0x71, 0x5d, 0xbe, 0xc9, - 0xae, 0xd3, 0x45, 0x70, 0x53, 0xfe, 0x74, 0x12, 0x50, 0x73, 0x50, 0x9a, - 0x16, 0xfc, 0x53, 0x79, 0xf6, 0xf2, 0xc4, 0xa6, 0xb3, 0x2e, 0x0f, 0x32, - 0x62, 0x85, 0xef, 0x05, 0x8a, 0x5c, 0xfc, 0xe0, 0x99, 0x9c, 0x11, 0xbd, - 0xf0, 0xa8, 0xfc, 0x84, 0x86, 0xf2, 0xee, 0x59, 0xfa, 0xa8, 0xae, 0xc8, - 0x54, 0x81, 0xe9, 0x96, 0xcf, 0x91, 0x7e, 0xb0, 0xfb, 0x21, 0xc1, 0x20, - 0x5d, 0x47, 0xad, 0x95, 0x10, 0xf1, 0xe4, 0x2f, 0x15, 0xd9, 0x5d, 0x0c, - 0x64, 0x7f, 0x1e, 0x8d, 0x70, 0xb0, 0x29, 0x21, 0x87, 0xfe, 0x74, 0xf3, - 0x1e, 0x0f, 0xe2, 0xfc, 0xfb, 0xb5, 0xef, 0xbb, 0x32, 0x20, 0xb4, 0xfa, - 0x1a, 0x79, 0xbc, 0x6c, 0xd6, 0x5d, 0xf2, 0xce, 0xf5, 0x0b, 0x02, 0xeb, - 0xf3, 0xb7, 0xbc, 0x77, 0x8e, 0x05, 0x8a, 0x44, 0xac, 0x0b, 0x84, 0x93, - 0x65, 0x2e, 0x7d, 0x3e, 0x39, 0x7b, 0x67, 0xa2, 0xc3, 0x58, 0x83, 0x15, - 0xb6, 0x38, 0xc6, 0x54, 0x34, 0xa0, 0x99, 0xf9, 0x08, 0x5e, 0x7c, 0xb7, - 0x26, 0x12, 0xc0, 0x56, 0x2c, 0x8d, 0x40, 0x72, 0x54, 0xa0, 0x18, 0x7a, - 0x68, 0x82, 0x6d, 0x70, 0xb1, 0xcd, 0x50, 0xb7, 0xd4, 0xcb, 0x88, 0x03, - 0x94, 0xab, 0xdd, 0x4e, 0xaa, 0xd1, 0x43, 0x1a, 0x68, 0x95, 0x41, 0xd8, - 0xc1, 0xb5, 0x36, 0x09, 0x9e, 0x7a, 0xd9, 0x24, 0x83, 0x8d, 0xc6, 0x82, - 0xa8, 0x95, 0x79, 0x27, 0x9d, 0x23, 0x80, 0x65, 0x20, 0x81, 0xb4, 0xfc, - 0x44, 0x05, 0x0c, 0x39, 0xaf, 0x7c, 0xe4, 0xf1, 0xce, 0xb5, 0xdc, 0x50, - 0x08, 0x15, 0x16, 0x34, 0xb2, 0xa7, 0x0c, 0x29, 0x62, 0xc7, 0x51, 0x3e, - 0x33, 0x34, 0x00, 0xfb, 0x3f, 0xf8, 0xe1, 0x28, 0x23, 0xf5, 0x55, 0xd7, - 0xd0, 0xb4, 0xfd, 0x62, 0xfa, 0x08, 0xb9, 0xf6, 0x17, 0x43, 0x60, 0x83, - 0x65, 0xb5, 0x99, 0xe0, 0xc0, 0x39, 0x9d, 0x66, 0x35, 0x2e, 0x2a, 0x59, - 0x7f, 0x9b, 0xce, 0x65, 0x67, 0xf8, 0x26, 0x0f, 0xc0, 0xf9, 0xd3, 0x61, - 0xca, 0x82, 0xc9, 0xf8, 0xd7, 0xa5, 0xb2, 0x3f, 0xf5, 0xe5, 0x10, 0x8e, - 0x9b, 0x23, 0x3c, 0x3d, 0x52, 0x4a, 0xb8, 0xf0, 0x4e, 0xb1, 0x19, 0x63, - 0xf1, 0xa6, 0x5b, 0xc8, 0x47, 0xeb, 0xf3, 0x7b, 0x47, 0xb2, 0x6e, 0xb4, - 0xc9, 0x72, 0xca, 0x9d, 0xd1, 0x3d, 0x27, 0x52, 0xf6, 0x5a, 0xa8, 0xc9, - 0x0e, 0xf0, 0x0e, 0x90, 0x69, 0x6e, 0x49, 0xfc, 0x6a, 0x5b, 0xdc, 0xeb, - 0x5a, 0x3b, 0xc7, 0x32, 0xe1, 0xc0, 0x1c, 0x50, 0xed, 0x13, 0x33, 0x24, - 0xee, 0x1c, 0x47, 0x04, 0x8a, 0x90, 0xe1, 0x49, 0x5e, 0x3a, 0xfc, 0xe6, - 0x24, 0xeb, 0x52, 0xaf, 0x64, 0x18, 0x9b, 0xeb, 0xd7, 0xa5, 0x08, 0xa0, - 0x03, 0x88, 0x76, 0x92, 0x41, 0x52, 0xa4, 0x63, 0xe5, 0x63, 0x49, 0x25, - 0xa3, 0x10, 0xbe, 0x18, 0x56, 0xff, 0x0d, 0xfd, 0x4c, 0xf2, 0xb4, 0x5b, - 0x2c, 0xc3, 0xa8, 0xf0, 0x1f, 0x4a, 0xd3, 0xee, 0xc5, 0x80, 0x1a, 0xc6, - 0xea, 0x73, 0xcc, 0x95, 0xef, 0xd7, 0xa8, 0xde, 0x10, 0xdf, 0xe7, 0xbc, - 0xbe, 0x6e, 0x39, 0x7a, 0xbd, 0x92, 0x01, 0xb6, 0x36, 0x18, 0xd9, 0xe1, - 0x5d, 0xb8, 0x5b, 0xd0, 0x17, 0xbc, 0xcb, 0x7c, 0xa4, 0x3d, 0x82, 0x55, - 0xd0, 0x95, 0x37, 0x1a, 0x4f, 0xe7, 0x47, 0x19, 0x5c, 0x0b, 0x4f, 0x14, - 0x70, 0x47, 0x1e, 0xe0, 0xb6, 0x77, 0x6e, 0x5f, 0xa3, 0x8e, 0x92, 0x32, - 0xb4, 0x1d, 0xbd, 0xc4, 0xca, 0x86, 0xca, 0xd7, 0x34, 0xcd, 0xef, 0x0c, - 0x10, 0xcb, 0x95, 0x58, 0xfc, 0x5e, 0x28, 0x8d, 0x15, 0x4c, 0xaf, 0x85, - 0x72, 0x85, 0x72, 0xc2, 0x86, 0x45, 0x0c, 0xfb, 0x71, 0x2e, 0x69, 0x1c, - 0x38, 0xc4, 0x11, 0xa7, 0x31, 0x7a, 0xe0, 0xab, 0x1f, 0xa9, 0x38, 0xbb, - 0x00, 0x75, 0x4c, 0xf7, 0x38, 0x31, 0xfc, 0x50, 0x76, 0xe3, 0xcb, 0x0a, - 0x68, 0xfb, 0x36, 0x86, 0x2a, 0x1a, 0xde, 0x49, 0xd5, 0x5c, 0xbf, 0xb7, - 0x69, 0x78, 0x29, 0x48, 0x75, 0x51, 0xb8, 0xb8, 0x7b, 0xe6, 0x35, 0xdb, - 0x40, 0xa8, 0x45, 0x26, 0x99, 0x45, 0x81, 0x38, 0xad, 0x64, 0xa0, 0x5c, - 0x37, 0x6e, 0x15, 0xd6, 0xdb, 0x42, 0x85, 0x23, 0x2c, 0x52, 0xc6, 0x2c, - 0x51, 0x30, 0x83, 0x6c, 0xd8, 0xdf, 0x02, 0x77, 0x30, 0xdf, 0xc2, 0xe2, - 0x1c, 0x8a, 0xb1, 0x29, 0xf6, 0x66, 0x48, 0x51, 0x5a, 0x9f, 0xad, 0x79, - 0x76, 0xf1, 0xb4, 0x22, 0xa6, 0xea, 0xfc, 0x8e, 0xcf, 0x0e, 0x72, 0xc3, - 0x40, 0x04, 0x0b, 0x58, 0xec, 0xa4, 0x75, 0x5d, 0x57, 0x57, 0x2e, 0x0a, - 0x5a, 0xdc, 0x63, 0x89, 0xc5, 0x90, 0x54, 0xd9, 0x9b, 0x06, 0x3b, 0x64, - 0x23, 0x18, 0x4e, 0x44, 0xa4, 0xd3, 0x6c, 0xa3, 0x4f, 0x3f, 0xef, 0xf4, - 0xf4, 0xe7, 0x06, 0xf4, 0x29, 0xd8, 0xd0, 0xaa, 0x76, 0x5a, 0x89, 0x3b, - 0xc3, 0x16, 0x47, 0x46, 0xdf, 0xcb, 0x7f, 0x95, 0x90, 0xc7, 0x39, 0x17, - 0xbc, 0x4d, 0x71, 0x64, 0xbd, 0x52, 0xa1, 0x30, 0x6b, 0x79, 0x6f, 0x04, - 0xd1, 0x69, 0xa4, 0xc5, 0xa7, 0x3d, 0x09, 0xa3, 0xc9, 0xca, 0x58, 0x0c, - 0xc2, 0xf4, 0xac, 0xfd, 0xc0, 0xdc, 0xf2, 0x79, 0xcf, 0xe0, 0xda, 0x4e, - 0xe2, 0x87, 0xe5, 0xbf, 0x40, 0x09, 0x6f, 0x1d, 0x65, 0x71, 0xcf, 0xe7, - 0x22, 0x1a, 0x9f, 0xf9, 0xbb, 0x95, 0xdb, 0x88, 0xc9, 0x3f, 0x06, 0x47, - 0x50, 0x4a, 0x1a, 0xd6, 0xa9, 0x3e, 0xa9, 0x7a, 0xdb, 0x5f, 0x98, 0xc6, - 0xee, 0x10, 0xae, 0x93, 0x37, 0x03, 0x94, 0xcc, 0xfd, 0xf8, 0xa9, 0x75, - 0x21, 0xf9, 0x27, 0x5e, 0xde, 0x0e, 0x23, 0x93, 0x48, 0x92, 0x08, 0xf2, - 0x07, 0xed, 0x7b, 0x79, 0x8f, 0x30, 0x14, 0x48, 0x72, 0x68, 0x1e, 0xb7, - 0x53, 0x22, 0xe3, 0x1b, 0xd0, 0x97, 0xf2, 0xd4, 0x37, 0xde, 0xa8, 0x1b, - 0x2f, 0x08, 0x58, 0xcf, 0x29, 0x29, 0x3c, 0x55, 0xf2, 0x46, 0x60, 0xc7, - 0xda, 0xa5, 0xde, 0xaf, 0xd9, 0x1d, 0xf6, 0xa0, 0xf2, 0x39, 0xa1, 0xb1, - 0x41, 0x7c, 0x8c, 0xa8, 0xe3, 0x8c, 0x5f, 0xe1, 0xb7, 0x26, 0x50, 0xae, - 0x7f, 0xcd, 0x7a, 0x00, 0x5f, 0x91, 0xff, 0xe6, 0xb0, 0xa2, 0xeb, 0x58, - 0x64, 0x73, 0x7b, 0xe2, 0xca, 0xcc, 0x4e, 0xfa, 0x4f, 0x7c, 0x33, 0x42, - 0x8e, 0x54, 0x4e, 0x7b, 0xf1, 0xc0, 0x91, 0x90, 0x51, 0x42, 0x17, 0x24, - 0x7b, 0xb4, 0x37, 0x46, 0xaa, 0x10, 0x39, 0x58, 0x51, 0xa5, 0x8f, 0xad, - 0x0c, 0xb6, 0x8d, 0x08, 0xeb, 0xcc, 0x7d, 0xe5, 0x87, 0x20, 0x7f, 0x4d, - 0x68, 0xe0, 0x50, 0x14, 0x4d, 0xbf, 0x79, 0x4b, 0x52, 0x5a, 0x88, 0xae, - 0x3f, 0xb9, 0xec, 0x0b, 0x14, 0x81, 0xc2, 0x8a, 0x06, 0xad, 0xfd, 0x31, - 0x16, 0x60, 0xe7, 0xd1, 0x60, 0x6c, 0x62, 0xcb, 0x17, 0xfd, 0x05, 0x48, - 0xf6, 0x11, 0xf8, 0xaf, 0xd4, 0x6b, 0x1d, 0xab, 0x4a, 0xc5, 0xa2, 0xbd, - 0x63, 0xf3, 0xc0, 0xdd, 0xd6, 0xdd, 0x75, 0x8b, 0x04, 0x10, 0xab, 0x78, - 0x82, 0x31, 0xb8, 0xb9, 0x35, 0x93, 0x8d, 0x31, 0x41, 0x61, 0xc3, 0xb9, - 0x67, 0xc4, 0xb1, 0x34, 0x6a, 0x8f, 0x98, 0x51, 0xb0, 0x77, 0x90, 0x97, - 0x2e, 0xe6, 0xe0, 0xb4, 0xfc, 0xb9, 0xf3, 0x28, 0x85, 0x88, 0xdf, 0x19, - 0x87, 0x95, 0x25, 0x14, 0x4c, 0x91, 0x32, 0x2e, 0x98, 0x1b, 0x92, 0xc9, - 0xb3, 0xb8, 0x3b, 0xb8, 0xef, 0x72, 0x54, 0xa0, 0xd1, 0x25, 0x3d, 0x02, - 0x2e, 0x8f, 0x7c, 0x33, 0x4f, 0x48, 0xfc, 0xbc, 0xac, 0x81, 0xad, 0xa1, - 0x39, 0xc0, 0xbe, 0x10, 0xfd, 0x42, 0x9d, 0x7f, 0x67, 0x53, 0xff, 0x15, - 0xd1, 0xef, 0x26, 0x0e, 0x38, 0x37, 0xbf, 0xe7, 0xb5, 0xc1, 0x0f, 0xc5, - 0x5f, 0x48, 0xbd, 0x07, 0x80, 0xa7, 0x99, 0xba, 0xbf, 0x23, 0xcb, 0xb4, - 0x64, 0x29, 0xf9, 0xa4, 0xf2, 0x58, 0x8f, 0xfc, 0x64, 0x1c, 0xfe, 0x2f, - 0xb0, 0x49, 0x60, 0xac, 0xa7, 0x66, 0xe3, 0x8c, 0x33, 0x12, 0x82, 0x6a, - 0xb4, 0x0d, 0x1c, 0xb2, 0x19, 0x5d, 0x95, 0x10, 0xd3, 0x81, 0x0d, 0x3f, - 0x0a, 0x8e, 0xe4, 0x27, 0x8f, 0xc0, 0x12, 0x08, 0xfd, 0x4a, 0x01, 0xcd, - 0xa9, 0xe0, 0x2f, 0xf1, 0x6c, 0xbb, 0xd4, 0x28, 0x47, 0x10, 0x6f, 0x23, - 0x63, 0x20, 0x27, 0xe0, 0xe2, 0xe8, 0xb7, 0xba, 0x19, 0x07, 0xaa, 0x28, - 0x20, 0x12, 0x29, 0x33, 0x7e, 0x54, 0x6a, 0x76, 0x71, 0xde, 0xc2, 0xdf, - 0xbf, 0x1c, 0xb0, 0x73, 0x01, 0xf5, 0xf2, 0x60, 0x19, 0x7d, 0xf2, 0xd2, - 0xf5, 0x2e, 0x35, 0xa4, 0xb9, 0xff, 0xc6, 0x4c, 0x87, 0xf0, 0x4b, 0xa2, - 0x52, 0x8e, 0xdf, 0x80, 0xf6, 0x82, 0xc3, 0x49, 0x6d, 0x3d, 0xba, 0xf0, - 0x09, 0x75, 0x59, 0x12, 0x69, 0xe8, 0x2d, 0x6c, 0x1c, 0xc7, 0x81, 0x32, - 0xb6, 0xd7, 0x3d, 0x4a, 0x8d, 0x1a, 0xbd, 0x67, 0x29, 0xc3, 0x55, 0x0e, - 0xfc, 0x0a, 0xf0, 0x29, 0xc2, 0x59, 0x30, 0x72, 0x28, 0x01, 0x43, 0xa8, - 0x10, 0x2f, 0x26, 0xbb, 0xf3, 0x7c, 0xf8, 0x78, 0x7b, 0xc0, 0x53, 0x48, - 0xc3, 0x62, 0xa1, 0x27, 0xb7, 0x2a, 0x59, 0xcb, 0xb4, 0x64, 0xcb, 0x57, - 0x3d, 0x74, 0x95, 0xfe, 0x9b, 0xda, 0x29, 0xc7, 0x2a, 0x5b, 0xb1, 0xb0, - 0x9e, 0xbe, 0x41, 0x4e, 0x07, 0x29, 0x02, 0x11, 0xa0, 0xef, 0x06, 0x89, - 0x43, 0x21, 0x77, 0x2d, 0x53, 0xf0, 0xd8, 0xc2, 0xd0, 0x6b, 0x00, 0xbc, - 0x21, 0x98, 0x55, 0x46, 0x70, 0x90, 0x2a, 0xcf, 0xd1, 0x3b, 0x9c, 0xea, - 0x26, 0x49, 0x27, 0x2f, 0x87, 0x80, 0x6c, 0x8f, 0xa2, 0x52, 0xd5, 0xc2, - 0x68, 0x25, 0xe3, 0x2a, 0x27, 0x87, 0x6c, 0x28, 0x75, 0x1a, 0x44, 0x7d, - 0x41, 0x4c, 0x0e, 0x83, 0x01, 0x4c, 0xd2, 0xc0, 0x89, 0x32, 0x61, 0x00, - 0x91, 0x21, 0x1b, 0x06, 0x03, 0x9e, 0xf2, 0xb3, 0x0e, 0x63, 0x1e, 0xe2, - 0x56, 0xf3, 0x6f, 0x38, 0xd0, 0xe3, 0xa0, 0x0d, 0xf2, 0x5a, 0x02, 0x23, - 0x99, 0x9b, 0x61, 0x5e, 0x8e, 0xb4, 0x7e, 0x18, 0xce, 0x7a, 0x6d, 0xcc, - 0x9f, 0x51, 0x38, 0x79, 0xdb, 0xe8, 0x19, 0xd2, 0x23, 0x28, 0xcd, 0x45, - 0x27, 0xcf, 0xdc, 0xc5, 0x67, 0x9f, 0xab, 0x5a, 0xc3, 0x40, 0x85, 0x61, - 0xf3, 0x84, 0x36, 0x2d, 0x25, 0xb3, 0x5b, 0x07, 0x86, 0xae, 0xf9, 0x84, - 0x57, 0xe1, 0x86, 0x69, 0xea, 0x24, 0x44, 0xc9, 0x60, 0x0b, 0xef, 0x6b, - 0x36, 0xb7, 0xd7, 0x7e, 0x15, 0x01, 0x4b, 0x4d, 0x7c, 0xf3, 0x8a, 0x5c, - 0xf9, 0xff, 0x7b, 0x93, 0xa7, 0xf5, 0x72, 0xa6, 0x37, 0x22, 0x67, 0xc8, - 0xf8, 0xbd, 0x9b, 0x7d, 0x05, 0x16, 0xe4, 0x9c, 0xb6, 0xac, 0x7f, 0x5d, - 0xe7, 0x4c, 0x63, 0x6c, 0xe8, 0x9e, 0xac, 0x30, 0x64, 0x52, 0x74, 0x7c, - 0xbb, 0xce, 0x07, 0xc0, 0xde, 0xac, 0x2e, 0x1e, 0x16, 0x3f, 0xea, 0x5b, - 0x96, 0xcc, 0x8f, 0x61, 0xbc, 0x04, 0xb0, 0x21, 0xa3, 0xa2, 0x8e, 0x79, - 0x7f, 0xdc, 0x2f, 0xc2, 0xa3, 0xdf, 0x99, 0x86, 0x61, 0x67, 0xf6, 0x38, - 0x31, 0xe7, 0xbf, 0x3a, 0x22, 0xdb, 0x27, 0xfc, 0x4b, 0x1d, 0xd1, 0xda, - 0x68, 0x15, 0x45, 0x44, 0xfd, 0x61, 0x58, 0x64, 0x98, 0x7d, 0x29, 0x0b, - 0x67, 0x52, 0xae, 0x7a, 0x01, 0xb5, 0x13, 0x89, 0xea, 0xd4, 0xd9, 0xa3, - 0xd9, 0xbb, 0xf2, 0x62, 0x19, 0x2f, 0x39, 0xe5, 0x98, 0xd7, 0x16, 0x5b, - 0x4e, 0x42, 0xa9, 0x81, 0x91, 0x54, 0xe9, 0x80, 0xb9, 0xd9, 0xf6, 0xe6, - 0xe1, 0x83, 0x91, 0x57, 0xd4, 0xe7, 0xe4, 0x69, 0x21, 0xd8, 0xc1, 0x7b, - 0xa3, 0x17, 0x3a, 0x01, 0xf1, 0xab, 0x66, 0xf5, 0xb6, 0xbd, 0x11, 0x09, - 0xbf, 0x75, 0xad, 0xdf, 0x6f, 0x65, 0x82, 0x66, 0x30, 0xfb, 0x5d, 0x25, - 0x01, 0x94, 0x74, 0xab, 0x47, 0xc7, 0x0c, 0x54, 0x2b, 0xdb, 0x7d, 0x41, - 0xd2, 0x20, 0x59, 0xa5, 0xdf, 0xd9, 0xb1, 0x45, 0x09, 0x19, 0x3e, 0xd2, - 0x23, 0xc4, 0x3a, 0xdc, 0xd5, 0xff, 0x6f, 0x27, 0x90, 0x8f, 0x47, 0x76, - 0x37, 0xdd, 0xc6, 0xf0, 0xfd, 0x8d, 0x61, 0x32, 0xf5, 0xfd, 0xf8, 0x28, - 0x03, 0x82, 0xaf, 0x22, 0xbd, 0xe4, 0x2b, 0xa4, 0xde, 0xd4, 0x52, 0x94, - 0x99, 0x9f, 0xda, 0xf4, 0xbe, 0x0e, 0xfb, 0x6b, 0x0b, 0x49, 0x8b, 0x77, - 0xb9, 0x77, 0xee, 0xc3, 0x0d, 0x7e, 0x7e, 0x84, 0xd7, 0xbb, 0x18, 0x1d, - 0x81, 0xf0, 0xf0, 0xbf, 0x9a, 0x9a, 0x41, 0xd2, 0x2b, 0x04, 0x50, 0x27, - 0xb3, 0xf7, 0x9d, 0xd7, 0xb4, 0x99, 0x5c, 0xd9, 0x52, 0xbd, 0xb6, 0x03, - 0x5a, 0xb8, 0x2f, 0x11, 0xc2, 0x18, 0x62, 0x3e, 0xb1, 0x67, 0x9c, 0x50, - 0x30, 0x57, 0xf8, 0x96, 0x57, 0x4b, 0x95, 0x39, 0x37, 0x92, 0xa4, 0xe1, - 0x04, 0x7b, 0x19, 0xcc, 0x47, 0xb6, 0xb5, 0xa7, 0xad, 0x22, 0x46, 0xf8, - 0x32, 0x3d, 0xee, 0xee, 0x82, 0x6e, 0x79, 0xa1, 0x37, 0xba, 0x10, 0x2a, - 0x4b, 0xdd, 0x91, 0xe8, 0xa9, 0x23, 0xaa, 0x40, 0x26, 0x28, 0x6c, 0x3a, - 0x3d, 0x77, 0x1e, 0xc0, 0xdd, 0xe7, 0x40, 0x0d, 0xbd, 0x59, 0x72, 0x32, - 0xd6, 0x9f, 0x8a, 0x19, 0xc7, 0xf5, 0xd4, 0x71, 0x9d, 0xef, 0x44, 0x17, - 0xb4, 0xb7, 0x35, 0x10, 0x11, 0x0b, 0x1a, 0xe2, 0x0f, 0x1f, 0x47, 0xbf, - 0xd0, 0x68, 0x6d, 0x59, 0x27, 0xc9, 0xa6, 0xaf, 0x54, 0x9e, 0x2a, 0x43, - 0x47, 0x60, 0x02, 0x81, 0xda, 0x5f, 0x3a, 0xbc, 0x46, 0x9a, 0x1c, 0x92, - 0x2e, 0xf4, 0x15, 0x06, 0xec, 0xe2, 0x9e, 0x10, 0x03, 0xd1, 0x78, 0x9f, - 0xe0, 0x49, 0xe3, 0xc4, 0x7f, 0x83, 0x12, 0xc6, 0x15, 0xd2, 0xe8, 0x1b, - 0x40, 0x7b, 0x86, 0xaf, 0x86, 0xb3, 0x02, 0xe1, 0x5a, 0x71, 0x57, 0x80, - 0x1d, 0x31, 0x1d, 0xb6, 0x61, 0x7d, 0xc6, 0xde, 0xf8, 0x5c, 0x9f, 0xa5, - 0x3c, 0x30, 0xa0, 0x3c, 0xdd, 0x1f, 0xeb, 0xe6, 0x08, 0x6b, 0x3c, 0xc0, - 0x0e, 0xd1, 0x23, 0x95, 0x45, 0x30, 0xdc, 0x7f, 0x49, 0xfb, 0x61, 0xf4, - 0x5d, 0xe8, 0xdf, 0x35, 0x61, 0x1d, 0xcb, 0x3c, 0x98, 0x75, 0x07, 0x41, - 0xd4, 0xf0, 0xe7, 0x73, 0xaf, 0x0a, 0x89, 0x20, 0xda, 0x54, 0x9e, 0x01, - 0x38, 0xe4, 0x66, 0x3c, 0x2d, 0x5f, 0x43, 0x53, 0x8a, 0xa8, 0x79, 0x41, - 0x93, 0x19, 0x5c, 0x60, 0x3d, 0x65, 0xb3, 0x71, 0x80, 0x42, 0x93, 0x9a, - 0xa4, 0x0c, 0x76, 0xb2, 0xc6, 0x92, 0x10, 0xe8, 0x88, 0xb3, 0x21, 0x8c, - 0x7e, 0xa2, 0xad, 0xdf, 0x41, 0x34, 0xc3, 0x96, 0xe9, 0x94, 0xc9, 0x3a, - 0x50, 0x6e, 0xe5, 0x67, 0xd9, 0x09, 0x5b, 0x11, 0xd9, 0xbf, 0x45, 0x99, - 0xa8, 0x00, 0xfe, 0x02, 0x82, 0x62, 0xfc, 0xea, 0x55, 0x9d, 0x3f, 0x8c, - 0x7e, 0x06, 0xd7, 0x90, 0xd1, 0xc0, 0xcc, 0x4a, 0x98, 0xa2, 0x37, 0x3a, - 0x72, 0xd7, 0xc9, 0xd0, 0xb9, 0x15, 0x55, 0x29, 0xc1, 0xc5, 0x7b, 0x64, - 0xa8, 0x82, 0xac, 0x73, 0x8f, 0x0e, 0xba, 0x75, 0xc1, 0x77, 0x18, 0x27, - 0x03, 0x8e, 0xe0, 0x87, 0xb5, 0x0e, 0x2c, 0xa7, 0x67, 0x83, 0x1f, 0x1e, - 0xb2, 0x6e, 0xd9, 0x61, 0x08, 0x97, 0xf4, 0x94, 0x8c, 0x5d, 0x42, 0x14, - 0x63, 0xd5, 0x04, 0x68, 0x15, 0xc2, 0xdc, 0x80, 0xd9, 0x4e, 0x63, 0xf0, - 0x8f, 0x47, 0xd9, 0xa3, 0xc0, 0xe2, 0x2e, 0x10, 0x81, 0xf8, 0x4b, 0xe5, - 0x61, 0xf3, 0xc5, 0x4f, 0x84, 0x58, 0x98, 0xd2, 0x69, 0xfe, 0x08, 0x79, - 0x85, 0x4f, 0xc8, 0x0e, 0xdd, 0x02, 0xd3, 0xfd, 0x94, 0xa3, 0xfd, 0xb3, - 0x58, 0x0d, 0xa7, 0x72, 0x26, 0x0a, 0xbf, 0x66, 0xcc, 0x71, 0x4f, 0xeb, - 0x26, 0x39, 0x17, 0x52, 0x08, 0x50, 0x64, 0x66, 0x83, 0x7f, 0xd0, 0xc7, - 0x7f, 0xba, 0xe0, 0x18, 0x90, 0x48, 0x19, 0x1e, 0x5f, 0x84, 0xe9, 0x64, - 0x64, 0x12, 0xc2, 0xcf, 0x53, 0x30, 0x44, 0xc0, 0xc8, 0x6c, 0x42, 0xea, - 0xfb, 0x6d, 0x61, 0xda, 0x1f, 0x4a, 0xd1, 0xe1, 0xc6, 0xd4, 0x09, 0x62, - 0xf6, 0xf1, 0xec, 0x64, 0x8a, 0xb7, 0x8a, 0x68, 0x4f, 0xe8, 0x01, 0x4d, - 0x20, 0x29, 0x67, 0x45, 0xe5, 0x4e, 0x6e, 0x49, 0xe0, 0x15, 0x42, 0xbf, - 0xf5, 0x08, 0x3d, 0x79, 0x7b, 0xd6, 0xbe, 0xda, 0x9a, 0x66, 0xa4, 0x12, - 0xb8, 0x32, 0xbf, 0xd0, 0x70, 0xc2, 0xa0, 0xf0, 0xc3, 0xf9, 0x9b, 0xff, - 0x65, 0x32, 0xa7, 0x08, 0xf5, 0x79, 0x1e, 0x15, 0xef, 0x6f, 0x32, 0xe0, - 0xa1, 0xdb, 0x68, 0xdd, 0xa1, 0xd5, 0x14, 0xf6, 0xb0, 0x75, 0x0d, 0x43, - 0xbb, 0x91, 0xd7, 0xf0, 0xb0, 0x8b, 0x17, 0x0d, 0xc7, 0x33, 0x48, 0xeb, - 0x78, 0xac, 0x97, 0xe6, 0x61, 0x55, 0x28, 0xae, 0x5a, 0xa1, 0x0a, 0xb6, - 0x64, 0x8a, 0xf8, 0x40, 0xda, 0xe5, 0x60, 0xf6, 0x45, 0xd8, 0xf0, 0xc8, - 0x7a, 0x9f, 0x77, 0x6a, 0x09, 0x88, 0xd3, 0x1d, 0x40, 0x63, 0xc5, 0x38, - 0x89, 0x6c, 0x0f, 0xe4, 0xc0, 0x1b, 0x2a, 0x56, 0xea, 0xa3, 0xcc, 0xde, - 0x9d, 0x06, 0x29, 0x2a, 0x7e, 0xed, 0x07, 0x9a, 0x43, 0x80, 0xa6, 0xa4, - 0x25, 0x5f, 0x24, 0x91, 0x84, 0xf3, 0xc0, 0x23, 0x06, 0x65, 0xee, 0x6e, - 0xba, 0xa8, 0x80, 0x46, 0xf3, 0x8b, 0xf8, 0xde, 0x3f, 0x47, 0x96, 0x85, - 0x2b, 0x51, 0x03, 0x02, 0xc9, 0x58, 0x6a, 0x33, 0x5c, 0x9a, 0xe2, 0xf9, - 0x6b, 0x1e, 0xad, 0x2f, 0x82, 0x9c, 0xf5, 0x3d, 0xf8, 0x14, 0xbf, 0x96, - 0x80, 0xe0, 0xd0, 0xa5, 0x7a, 0x2e, 0x1e, 0x5d, 0xc3, 0x4f, 0x99, 0xdd, - 0x91, 0x02, 0xad, 0x9f, 0x32, 0x1b, 0xd7, 0xa9, 0x75, 0xdc, 0x3d, 0x11, - 0x6d, 0x18, 0xff, 0xe9, 0x47, 0xe6, 0xc4, 0x63, 0x14, 0xb8, 0xe2, 0x57, - 0x60, 0xbd, 0xb7, 0x2f, 0xb4, 0x57, 0x39, 0xb9, 0x33, 0xa6, 0x4f, 0x16, - 0x14, 0xf2, 0x7e, 0x2c, 0xa0, 0x76, 0xa5, 0xfe, 0x04, 0x2c, 0x53, 0x96, - 0xaf, 0x80, 0xfd, 0xe5, 0xc2, 0x5d, 0x36, 0xcd, 0xec, 0xbb, 0xc0, 0xd1, - 0xeb, 0x10, 0x03, 0xcc, 0xf9, 0x9c, 0xa7, 0xc9, 0xc1, 0x72, 0xb8, 0x72, - 0x3c, 0x58, 0x21, 0x02, 0x7a, 0x25, 0xd8, 0x7b, 0x99, 0x49, 0x8a, 0x10, - 0x9c, 0x1f, 0x9a, 0x89, 0xc4, 0xd0, 0x3f, 0x2a, 0xa9, 0x36, 0x6d, 0x48, - 0x83, 0x2c, 0xbd, 0x62, 0xec, 0x51, 0xfe, 0x53, 0x32, 0x03, 0x61, 0x0c, - 0x85, 0x5b, 0xb4, 0x06, 0x29, 0x27, 0x3d, 0x9c, 0xf2, 0x56, 0x14, 0xc4, - 0xbf, 0x20, 0x5b, 0x56, 0xb2, 0xd9, 0x63, 0xcd, 0x36, 0xd6, 0x17, 0x76, - 0x25, 0x0c, 0xbb, 0x12, 0xa9, 0xe2, 0xda, 0x42, 0x82, 0xef, 0xcd, 0xbf, - 0x02, 0x09, 0x74, 0xaa, 0x2a, 0x89, 0xc6, 0xbc, 0xc1, 0x57, 0x75, 0x17, - 0xbc, 0x93, 0x47, 0x73, 0x2a, 0x99, 0xec, 0xc2, 0x8a, 0xe8, 0xf9, 0x8a, - 0xd9, 0x8b, 0x78, 0x67, 0xf2, 0x6f, 0x83, 0x3d, 0x30, 0xa8, 0xe4, 0xa9, - 0x8a, 0xff, 0x54, 0xf6, 0xa1, 0x9d, 0xe2, 0xbb, 0xcd, 0x03, 0x3a, 0x16, - 0xc3, 0xc3, 0x5e, 0xff, 0x38, 0xb8, 0x67, 0x15, 0x0b, 0x2c, 0xc3, 0xbc, - 0x86, 0xe5, 0x61, 0x8a, 0x0c, 0xd9, 0x23, 0xe1, 0x88, 0xc6, 0x10, 0x89, - 0xca, 0x32, 0x77, 0x41, 0x7d, 0xd9, 0x7a, 0x31, 0x79, 0x42, 0x52, 0x0b, - 0xca, 0x07, 0x9d, 0x74, 0xfd, 0x57, 0xe0, 0xcc, 0xe0, 0x74, 0xc2, 0xde, - 0x57, 0x55, 0x15, 0xa2, 0x28, 0x68, 0x74, 0x8c, 0x05, 0xfa, 0x27, 0x0d, - 0x23, 0x79, 0x7b, 0x59, 0x2d, 0x16, 0xdf, 0x0b, 0xb6, 0xe1, 0x51, 0x48, - 0x84, 0xdf, 0xb2, 0x42, 0x51, 0x56, 0x46, 0xbd, 0x3c, 0x3e, 0xa6, 0x59, - 0xea, 0x27, 0x60, 0xad, 0xb9, 0xd5, 0x8d, 0x90, 0x01, 0x43, 0x57, 0x05, - 0x75, 0xc0, 0xc4, 0xa5, 0x00, 0x6d, 0x56, 0x2e, 0xe6, 0x03, 0x17, 0xbd, - 0x48, 0x78, 0x95, 0x65, 0x96, 0x4a, 0x55, 0x8c, 0xa3, 0x60, 0xea, 0xfd, - 0xd4, 0x3f, 0x07, 0x15, 0x0b, 0xec, 0x37, 0x7c, 0xf5, 0x64, 0x11, 0x94, - 0x2e, 0xdc, 0x17, 0x6b, 0x4a, 0xd8, 0x83, 0xb5, 0xf2, 0xf2, 0x7f, 0x87, - 0x6d, 0x2c, 0xdd, 0x6d, 0x55, 0x6c, 0x95, 0x16, 0x18, 0xe5, 0xe9, 0x7b, - 0x90, 0xa0, 0xd6, 0x1b, 0xce, 0x06, 0xc1, 0x99, 0x84, 0x0f, 0xd6, 0xff, - 0x67, 0x08, 0xe9, 0xc2, 0xd5, 0x7f, 0x0f, 0x1e, 0x75, 0x4a, 0x11, 0x06, - 0xec, 0xc9, 0xe6, 0x4b, 0x2e, 0x87, 0xad, 0x40, 0x80, 0xb6, 0x2f, 0x9c, - 0xd1, 0xed, 0xaf, 0x07, 0x17, 0x6e, 0xe8, 0x3a, 0x47, 0xb0, 0x73, 0x01, - 0x56, 0x9f, 0x70, 0xf5, 0xe3, 0x4d, 0x8a, 0x1b, 0x21, 0x71, 0x3b, 0x09, - 0xf0, 0x34, 0x25, 0xe5, 0x3c, 0x23, 0x3d, 0x67, 0x5d, 0xa7, 0xb1, 0x2d, - 0x3c, 0x15, 0x17, 0x96, 0x25, 0xe0, 0xc8, 0x35, 0xbe, 0x58, 0xe1, 0x0e, - 0xda, 0x73, 0x19, 0x3d, 0x06, 0x0c, 0xf4, 0x26, 0xd0, 0xfb, 0xaa, 0x92, - 0x06, 0xa0, 0x26, 0x94, 0xad, 0x92, 0xe8, 0x80, 0xcd, 0xc0, 0x1a, 0x4b, - 0x70, 0xe8, 0x0d, 0x12, 0xc7, 0xef, 0xc2, 0xd1, 0xc5, 0x9b, 0x77, 0xda, - 0x0f, 0x43, 0xcb, 0x58, 0x09, 0x73, 0xd1, 0x6b, 0x78, 0xbe, 0x76, 0xea, - 0xe6, 0x9f, 0x4b, 0x6d, 0x6d, 0x14, 0x1a, 0x4e, 0x99, 0xb0, 0x13, 0x1b, - 0x18, 0xd4, 0xd7, 0x13, 0x6c, 0x52, 0xcb, 0xb1, 0x66, 0xfc, 0x78, 0x8c, - 0xbe, 0x1c, 0x67, 0xcf, 0x30, 0xed, 0x2f, 0x91, 0x09, 0xf0, 0x89, 0xe6, - 0xe1, 0xff, 0x32, 0x66, 0x20, 0x6f, 0x96, 0x16, 0x57, 0x3b, 0x06, 0x49, - 0xaa, 0xd9, 0x2c, 0xe7, 0xed, 0xdc, 0x9c, 0x27, 0x9a, 0xef, 0x5c, 0xaa, - 0x17, 0xda, 0x31, 0x4c, 0xf9, 0x05, 0x77, 0x72, 0x9a, 0x89, 0xb9, 0xf2, - 0x63, 0x0b, 0x36, 0x48, 0xbb, 0xd1, 0x07, 0x1f, 0x48, 0x7d, 0x99, 0xcc, - 0x7e, 0xbc, 0x2f, 0x20, 0xbf, 0x70, 0xa2, 0xf3, 0xaf, 0xee, 0x56, 0xb8, - 0x24, 0x5f, 0x3a, 0x49, 0x70, 0xfb, 0xd6, 0xc6, 0xf5, 0x47, 0x7d, 0x00, - 0x6f, 0xd6, 0xd0, 0xbb, 0xc3, 0xa0, 0xae, 0x6e, 0x7b, 0x04, 0x19, 0x6f, - 0x27, 0xb3, 0x62, 0x16, 0x64, 0x20, 0xdb, 0x84, 0x1f, 0xd4, 0x0e, 0xb4, - 0xe6, 0x79, 0x8d, 0x7f, 0x09, 0x43, 0xbd, 0xa0, 0x9e, 0xb5, 0xc1, 0xf4, - 0x14, 0xf4, 0x20, 0xae, 0x52, 0x75, 0xf4, 0x7b, 0xde, 0x0e, 0x46, 0x3e, - 0x52, 0xcf, 0x82, 0xc1, 0x6c, 0x38, 0xf1, 0xf8, 0x1d, 0x97, 0xcb, 0x3f, - 0x34, 0x59, 0x6a, 0xfe, 0x9e, 0xe6, 0x36, 0xc7, 0x3e, 0xaa, 0x15, 0xe3, - 0xb4, 0xd5, 0x34, 0x66, 0xfb, 0x97, 0x45, 0x58, 0xa5, 0x4c, 0x47, 0xe5, - 0x21, 0x04, 0x10, 0xc6, 0xea, 0x47, 0x37, 0xa3, 0x85, 0x73, 0xdd, 0x7c, - 0x2f, 0x12, 0xc6, 0xf5, 0x6f, 0x17, 0xd4, 0x44, 0x1f, 0x80, 0x4f, 0xad, - 0x18, 0xf9, 0x83, 0x4c, 0x8c, 0x9d, 0xe3, 0x4c, 0x73, 0x18, 0xe7, 0x81, - 0x08, 0xb7, 0xeb, 0x2e, 0x72, 0xa5, 0xf3, 0x42, 0x51, 0xc4, 0x12, 0xe8, - 0x62, 0xae, 0xb1, 0x1f, 0xe1, 0x78, 0x5b, 0x97, 0x86, 0x3b, 0x6d, 0xf9, - 0x10, 0x78, 0x79, 0xbd, 0xd3, 0x3b, 0xa4, 0xa1, 0x0e, 0xc3, 0x6e, 0xc6, - 0x68, 0x72, 0x53, 0x08, 0xb5, 0xc4, 0xa3, 0x79, 0xe7, 0xf0, 0xfe, 0x14, - 0xc3, 0xf5, 0xfa, 0x0b, 0xc3, 0x88, 0xd2, 0xf6, 0xdf, 0x91, 0x63, 0x4f, - 0x8e, 0xa6, 0xcd, 0x2a, 0xcf, 0xe2, 0x8c, 0x17, 0xa8, 0xe8, 0xb3, 0x20, - 0x84, 0xf6, 0xe0, 0x45, 0x48, 0xbe, 0xa2, 0xa7, 0xbe, 0x82, 0x84, 0x9e, - 0x86, 0x1d, 0x63, 0xd4, 0xc0, 0xb0, 0xf3, 0xb8, 0x65, 0xc3, 0x27, 0xa2, - 0xa4, 0x69, 0xc7, 0x56, 0xe0, 0x95, 0x97, 0xa2, 0xa0, 0xe6, 0xd9, 0x73, - 0x3d, 0x8b, 0xde, 0x38, 0xf5, 0xfd, 0x69, 0xa8, 0x14, 0x9a, 0x71, 0x07, - 0xa7, 0xb6, 0xc4, 0x40, 0xa0, 0x22, 0x61, 0x91, 0x22, 0x62, 0x56, 0xd9, - 0x81, 0x7e, 0x75, 0x76, 0xa1, 0xf6, 0x88, 0x12, 0xf5, 0x5b, 0xbf, 0x88, - 0x1d, 0x1e, 0xc2, 0x3a, 0xd8, 0x76, 0x8d, 0xfb, 0xf1, 0xce, 0xc3, 0x2f, - 0xb2, 0xfb, 0x63, 0xef, 0xf5, 0xc2, 0x8c, 0x0b, 0x85, 0xf9, 0xad, 0x60, - 0x25, 0xf1, 0x71, 0x74, 0x11, 0x9a, 0x3d, 0xff, 0xea, 0xa7, 0x0c, 0x6a, - 0x1b, 0x20, 0x71, 0xfd, 0x89, 0xdc, 0xb4, 0xf0, 0x38, 0x55, 0x79, 0xd3, - 0x66, 0xdd, 0xb4, 0x31, 0xa9, 0x2a, 0xe0, 0x47, 0x7d, 0x8b, 0xa9, 0x9c, - 0x34, 0x4d, 0x93, 0xfe, 0x0a, 0x5e, 0x3b, 0xc7, 0x1d, 0xb5, 0xc0, 0x59, - 0x9e, 0x1b, 0x94, 0x88, 0xdf, 0xe6, 0xef, 0x21, 0x53, 0xfb, 0xb8, 0xa7, - 0x12, 0x18, 0xd9, 0xd2, 0x2f, 0x2c, 0x37, 0xb7, 0x6b, 0x4d, 0x4f, 0x8b, - 0x3f, 0x80, 0xdc, 0xd3, 0x89, 0x2e, 0x2c, 0xda, 0x7e, 0x33, 0x95, 0x00, - 0x1d, 0xa3, 0x1f, 0x73, 0x86, 0x02, 0x8c, 0x7c, 0x1e, 0x09, 0xd1, 0x3c, - 0xef, 0x49, 0xd6, 0xbc, 0x9f, 0x6c, 0x59, 0x0b, 0x53, 0xb5, 0xb1, 0x54, - 0xeb, 0xa5, 0x26, 0xfa, 0x75, 0x77, 0x63, 0x67, 0x97, 0xa8, 0x2a, 0xaa, - 0x05, 0x72, 0x92, 0x04, 0x65, 0x02, 0xd6, 0x08, 0x80, 0xf1, 0x7a, 0xf4, - 0x48, 0x5d, 0x14, 0x55, 0x57, 0xef, 0xdb, 0x90, 0x43, 0x9d, 0xa6, 0x6c, - 0x22, 0xd0, 0x18, 0x68, 0x01, 0x5c, 0x79, 0x1d, 0xda, 0xcd, 0x87, 0x74, - 0xdf, 0x2c, 0xe6, 0x5b, 0x51, 0xf3, 0x8b, 0x8c, 0xf1, 0xe4, 0x2c, 0x83, - 0x6e, 0x30, 0x73, 0xb1, 0x97, 0x0c, 0x56, 0x82, 0xde, 0x6c, 0x44, 0x04, - 0x75, 0x1c, 0xe3, 0x34, 0xaf, 0x04, 0xbb, 0xfd, 0x15, 0xf4, 0xd2, 0x53, - 0x7f, 0x7f, 0xe7, 0xa6, 0x5d, 0x85, 0x18, 0x90, 0x12, 0xb2, 0x6d, 0xcc, - 0xe6, 0x7a, 0x4a, 0xa5, 0xa8, 0x55, 0xc8, 0x49, 0x9a, 0x47, 0x6a, 0xa8, - 0xd6, 0xc2, 0xcf, 0x2a, 0xfc, 0xa0, 0x71, 0x14, 0x9d, 0x96, 0x9e, 0xff, - 0xfc, 0x15, 0x05, 0x8c, 0xdc, 0x50, 0x2e, 0xf2, 0xc0, 0x6c, 0x20, 0x66, - 0x8a, 0xbc, 0x3f, 0x09, 0x10, 0x48, 0x75, 0x15, 0xbb, 0x7c, 0x7b, 0x0c, - 0xc9, 0x0d, 0xb1, 0x45, 0x62, 0x73, 0x2e, 0x09, 0x45, 0x75, 0xc6, 0xf1, - 0x11, 0xf8, 0xeb, 0x84, 0x42, 0x3f, 0xd7, 0x7c, 0x52, 0x08, 0x74, 0x84, - 0x65, 0x82, 0x3a, 0x2d, 0x12, 0x12, 0x57, 0x9c, 0x4c, 0xa8, 0x5c, 0x0d, - 0x90, 0x49, 0x25, 0x65, 0xff, 0x35, 0x47, 0x0e, 0xaf, 0x8c, 0x80, 0xf4, - 0x2d, 0x42, 0xb1, 0x53, 0x4b, 0x5e, 0x90, 0xfb, 0x05, 0x36, 0x2a, 0x26, - 0x8b, 0xec, 0xac, 0x42, 0xa7, 0x44, 0x00, 0xff, 0x47, 0xc8, 0x5a, 0x03, - 0x41, 0xed, 0x6a, 0x4f, 0x6c, 0x68, 0x31, 0x9f, 0x2b, 0x55, 0x98, 0x12, - 0x4a, 0x02, 0x88, 0xe0, 0xe8, 0x94, 0x1d, 0x8b, 0x9e, 0xed, 0x6f, 0xf8, - 0x34, 0xb7, 0x77, 0x26, 0x6e, 0xcf, 0x68, 0x88, 0x72, 0x1e, 0x94, 0x66, - 0x5b, 0x11, 0x52, 0x30, 0x89, 0x5e, 0x38, 0xdf, 0x55, 0x03, 0x68, 0x3f, - 0x5a, 0xae, 0x08, 0x83, 0xa7, 0xa8, 0xbd, 0xd0, 0x62, 0x66, 0x24, 0x02, - 0x9e, 0x6d, 0xcb, 0xab, 0x16, 0xd4, 0x43, 0x3b, 0xdb, 0xd0, 0x83, 0xdc, - 0xb9, 0xa9, 0xce, 0x68, 0x34, 0x07, 0xab, 0x86, 0x09, 0xcd, 0xac, 0xb8, - 0x17, 0x4e, 0xd2, 0x54, 0x71, 0x7d, 0xee, 0x9a, 0x6d, 0xe3, 0x37, 0xb1, - 0x7a, 0xd8, 0x3d, 0xc8, 0x13, 0x08, 0x87, 0x18, 0x3b, 0xb6, 0x13, 0x85, - 0x96, 0x2f, 0x0e, 0xfc, 0xf2, 0xf5, 0xf3, 0xf0, 0xf3, 0xaf, 0x65, 0xa5, - 0xcb, 0x56, 0x69, 0xa3, 0x10, 0x37, 0x39, 0x10, 0x12, 0xa9, 0xe5, 0x5a, - 0xf8, 0xc1, 0x46, 0x2b, 0x04, 0x37, 0xb7, 0x8d, 0xd9, 0xcb, 0x72, 0x8e, - 0xd7, 0x41, 0xcb, 0xf0, 0x0f, 0xa6, 0x1f, 0x4d, 0xaf, 0xe8, 0x58, 0x2f, - 0xe4, 0xea, 0x89, 0x04, 0x50, 0x3c, 0xcc, 0xd8, 0x41, 0x55, 0x48, 0xd0, - 0x57, 0x5e, 0x93, 0xa1, 0x29, 0x79, 0xce, 0xfd, 0x0d, 0xbc, 0xfb, 0xe8, - 0x18, 0x79, 0x31, 0x97, 0xef, 0xc4, 0xf4, 0x46, 0x83, 0x5e, 0xd2, 0x1f, - 0xee, 0xab, 0x3e, 0x6c, 0xa4, 0xb0, 0x79, 0x42, 0xb7, 0xbf, 0x1b, 0xc9, - 0x7e, 0xfc, 0xe2, 0xba, 0xa1, 0x56, 0x0a, 0xc2, 0x60, 0x46, 0x5e, 0xee, - 0x62, 0x5e, 0xd2, 0x17, 0xf0, 0x9c, 0xa9, 0x79, 0xdd, 0xea, 0xea, 0x02, - 0xdd, 0x23, 0xe7, 0x2c, 0x63, 0xfa, 0x38, 0xb5, 0xf4, 0x32, 0x4c, 0x19, - 0x6a, 0x2d, 0x64, 0xcd, 0xc6, 0x37, 0xd0, 0x14, 0xf0, 0xbd, 0xef, 0xb3, - 0xae, 0x8a, 0x98, 0xe7, 0x4c, 0xa3, 0x0b, 0x45, 0x76, 0x25, 0x00, 0xd9, - 0xe6, 0x02, 0xc0, 0x5c, 0x14, 0xf4, 0x5d, 0x70, 0x9c, 0x32, 0x2b, 0xe3, - 0x21, 0xa3, 0x8a, 0x08, 0x50, 0x4e, 0xd5, 0x8a, 0x44, 0x79, 0xe6, 0x57, - 0x89, 0x92, 0x0d, 0x33, 0xe0, 0x10, 0x39, 0x27, 0x62, 0xa9, 0x93, 0x9a, - 0x22, 0x34, 0x03, 0xa8, 0x4b, 0xc1, 0x49, 0xdc, 0x80, 0xa6, 0x92, 0xca, - 0xdb, 0xc2, 0xc6, 0x6d, 0xa4, 0xbd, 0x04, 0x19, 0xae, 0x0c, 0x61, 0x0b, - 0x9b, 0x12, 0xf4, 0x0a, 0x11, 0x89, 0xc6, 0x5f, 0x6d, 0xf8, 0x35, 0x03, - 0xdf, 0x8d, 0xa2, 0x4d, 0xe0, 0x53, 0xda, 0x53, 0x73, 0xa3, 0x6f, 0x89, - 0xc8, 0xf4, 0xfd, 0xbb, 0x1c, 0x0c, 0xc1, 0xef, 0x47, 0xe0, 0x34, 0x15, - 0x0a, 0x47, 0x38, 0xe9, 0x04, 0xe4, 0x6c, 0x8f, 0x4a, 0xb3, 0x67, 0x04, - 0x9a, 0xc3, 0x4b, 0x73, 0x03, 0xac, 0xac, 0xb2, 0x3c, 0xc5, 0x78, 0x27, - 0x05, 0xdc, 0x1d, 0xe5, 0x70, 0x05, 0xbc, 0x9c, 0x43, 0xab, 0xf9, 0x11, - 0x8a, 0xb5, 0x00, 0xc0, 0x7a, 0x3f, 0xa7, 0x39, 0x75, 0xc3, 0x99, 0x05, - 0x69, 0x2a, 0x60, 0xc0, 0x9d, 0x8c, 0x08, 0xd8, 0x60, 0x7b, 0x78, 0x49, - 0x7a, 0xb9, 0x3f, 0xfd, 0x90, 0x92, 0x94, 0xff, 0x73, 0x41, 0x3b, 0xe6, - 0x6c, 0xd2, 0x50, 0xa8, 0x15, 0xab, 0xc7, 0xc8, 0xff, 0xac, 0xf5, 0x11, - 0x66, 0x26, 0xa2, 0xc1, 0x35, 0x11, 0x46, 0x09, 0x62, 0x3d, 0xd5, 0x93, - 0x04, 0x87, 0x99, 0x53, 0x75, 0xe3, 0x61, 0x94, 0x3a, 0xcc, 0xe9, 0xfd, - 0xba, 0xa6, 0xa1, 0x8c, 0x22, 0xf4, 0x1e, 0xcb, 0x3b, 0x76, 0x52, 0x1a, - 0x3b, 0x95, 0x23, 0xd6, 0xf1, 0xbc, 0x52, 0xa9, 0x44, 0x52, 0x15, 0x95, - 0xab, 0xe7, 0x46, 0x25, 0xb5, 0x04, 0x2e, 0xa7, 0xb4, 0x7a, 0xf5, 0x39, - 0x80, 0xd3, 0x77, 0xaa, 0x49, 0x78, 0xf1, 0x5a, 0x4d, 0x3d, 0x50, 0xb9, - 0x67, 0xd5, 0x71, 0x2c, 0x50, 0x0c, 0x45, 0x07, 0x80, 0x3c, 0xbf, 0xa2, - 0xe6, 0x08, 0x32, 0x9f, 0x46, 0x7b, 0x6b, 0xb8, 0x80, 0x1b, 0x10, 0x2f, - 0x96, 0x6d, 0x9a, 0x89, 0x21, 0xad, 0x86, 0xe6, 0x58, 0x76, 0x4b, 0x30, - 0x9f, 0x68, 0xed, 0xee, 0x6a, 0xca, 0x83, 0x00, 0x93, 0x97, 0x9a, 0x62, - 0x46, 0x79, 0x38, 0xa2, 0x8b, 0xed, 0xa1, 0x5e, 0x2f, 0xfd, 0x49, 0x5b, - 0x9a, 0xd7, 0xa9, 0x98, 0xaf, 0x0a, 0x4e, 0x64, 0xfe, 0xfd, 0x33, 0x29, - 0xe0, 0x8e, 0xc1, 0xf2, 0x63, 0x03, 0x12, 0x9f, 0x85, 0x09, 0xd9, 0x36, - 0xac, 0xd8, 0x13, 0xd6, 0xd1, 0x99, 0x0c, 0x61, 0x9c, 0xa0, 0x7b, 0x26, - 0xa0, 0x8d, 0xe3, 0x5a, 0x92, 0x45, 0xf8, 0x94, 0x4a, 0xc3, 0xf1, 0xdf, - 0xf6, 0x40, 0xb1, 0x8b, 0x1a, 0xd1, 0x96, 0x89, 0x8f, 0x80, 0x44, 0xcd, - 0x69, 0x29, 0x0f, 0x21, 0xda, 0x8e, 0xc7, 0x22, 0x10, 0x99, 0x0e, 0xf8, - 0x2f, 0xdd, 0x64, 0x8f, 0xab, 0x81, 0xec, 0x97, 0x8c, 0x53, 0xe2, 0x5f, - 0xd4, 0x37, 0x74, 0xea, 0xd0, 0x78, 0x19, 0xa1, 0x43, 0x48, 0x13, 0x0b, - 0xdd, 0xb9, 0x19, 0xca, 0x37, 0x03, 0x09, 0x03, 0x52, 0xc3, 0xeb, 0x83, - 0x55, 0x00, 0xcc, 0xdd, 0x04, 0x12, 0xae, 0x7f, 0x9c, 0xdf, 0x9b, 0xc5, - 0xc4, 0x5b, 0xcb, 0x9f, 0x6f, 0xcc, 0xf5, 0x27, 0xbb, 0x79, 0x85, 0x10, - 0xa0, 0x15, 0x13, 0x31, 0x85, 0x90, 0x23, 0x81, 0x12, 0x1e, 0xd0, 0xce, - 0xaa, 0x55, 0x3b, 0xe6, 0xd7, 0xe3, 0x86, 0xfd, 0x4f, 0x39, 0x01, 0x00, - 0x4f, 0xa1, 0xd2, 0x2c, 0x61, 0x5c, 0xa4, 0x47, 0x69, 0x8b, 0xfd, 0x18, - 0x6f, 0x48, 0x2e, 0x86, 0x2e, 0x6c, 0xfe, 0xcc, 0x73, 0xe7, 0x41, 0x0c, - 0xd8, 0x64, 0x2b, 0x5e, 0x92, 0x89, 0x8f, 0x30, 0x2e, 0xc6, 0x68, 0xfc, - 0xa5, 0x85, 0xd9, 0x15, 0xa3, 0xc0, 0xce, 0xb1, 0xfb, 0xa0, 0xe7, 0x25, - 0x31, 0x40, 0x47, 0x6d, 0xc8, 0x52, 0x9b, 0x4a, 0xaf, 0x36, 0x33, 0xee, - 0xfc, 0x7f, 0xf1, 0x54, 0x6a, 0x2f, 0xcd, 0xa3, 0x9a, 0x14, 0x47, 0xa4, - 0x47, 0xa2, 0x6a, 0xd2, 0x0d, 0x18, 0x64, 0x1a, 0x21, 0x20, 0x24, 0xfc, - 0xd5, 0xed, 0xf5, 0x55, 0xa2, 0x9a, 0xff, 0xc3, 0x0f, 0x6a, 0x36, 0xe7, - 0xa1, 0x3f, 0xfe, 0x04, 0xf1, 0x00, 0xa2, 0xcc, 0xb6, 0xf0, 0x93, 0x76, - 0xf9, 0x42, 0xba, 0x53, 0x52, 0x54, 0x81, 0x10, 0x7d, 0xa5, 0xec, 0x7f, - 0x63, 0x62, 0x4f, 0xf2, 0xbe, 0xfa, 0x27, 0x6f, 0xbe, 0xee, 0xe6, 0xe7, - 0x39, 0x81, 0x9f, 0x92, 0x60, 0x2f, 0x66, 0x3d, 0x5b, 0xf0, 0x99, 0xc6, - 0x99, 0xb9, 0x17, 0x2e, 0x04, 0xa1, 0x64, 0x71, 0xa8, 0x72, 0x9f, 0x6a, - 0xae, 0x10, 0x58, 0x4d, 0xb4, 0x82, 0x58, 0x02, 0x11, 0x48, 0x34, 0xd5, - 0xb4, 0xdb, 0x98, 0x30, 0xd5, 0x6a, 0x19, 0x23, 0x5a, 0x3d, 0x0b, 0xd0, - 0x92, 0xb4, 0x21, 0xce, 0xe5, 0x53, 0x26, 0xea, 0x56, 0xfc, 0xc7, 0x48, - 0xaa, 0xa1, 0x3b, 0xf7, 0x4e, 0x0c, 0x48, 0x92, 0x33, 0xf7, 0x65, 0x4d, - 0x84, 0xe1, 0xe8, 0x7c, 0x60, 0x7a, 0xab, 0x4b, 0x2f, 0xc9, 0x07, 0xfa, - 0xc2, 0xb0, 0xb0, 0x8c, 0xcb, 0xf5, 0x74, 0x23, 0x01, 0xe4, 0x5b, 0x8b, - 0x32, 0x8d, 0x24, 0x11, 0x09, 0x1f, 0xd3, 0x8e, 0x60, 0x5e, 0xa4, 0xa3, - 0x97, 0xc5, 0x2f, 0xe9, 0xc1, 0x92, 0xab, 0xad, 0xe0, 0x4f, 0x67, 0x34, - 0x8b, 0x3f, 0x9f, 0x8d, 0x49, 0x7b, 0x11, 0x8d, 0x13, 0x41, 0xbf, 0xf5, - 0x89, 0xbf, 0xe6, 0x1d, 0x13, 0xf4, 0xfa, 0xa1, 0x18, 0xfa, 0x49, 0x54, - 0x1e, 0xd4, 0xf9, 0x67, 0x34, 0xec, 0x96, 0x3b, 0xda, 0xb5, 0x97, 0x03, - 0xf7, 0x52, 0x9b, 0x49, 0xf7, 0x37, 0x3e, 0x4c, 0x80, 0x53, 0x40, 0x8a, - 0x1a, 0xf8, 0xb1, 0x81, 0xe2, 0x5a, 0x68, 0x86, 0x24, 0xda, 0xf5, 0x95, - 0x90, 0xee, 0x66, 0x06, 0xf9, 0xaa, 0x58, 0x70, 0xb1, 0xe4, 0x54, 0xe4, - 0xfa, 0x60, 0x95, 0x29, 0x5a, 0xab, 0xb7, 0xd3, 0x11, 0x97, 0xb5, 0xb4, - 0x84, 0x8b, 0xba, 0x75, 0x66, 0xb9, 0x76, 0x12, 0xa5, 0xa2, 0x1d, 0x59, - 0x07, 0x31, 0x83, 0xf2, 0xab, 0x2e, 0x85, 0x30, 0x0b, 0xb4, 0x5f, 0x56, - 0x14, 0x04, 0x2f, 0x55, 0x32, 0x00, 0xc5, 0x0b, 0x13, 0x22, 0x2d, 0xc5, - 0x57, 0x71, 0x29, 0x56, 0xe3, 0xf5, 0xc4, 0xa2, 0x19, 0x4c, 0x2c, 0x0f, - 0x71, 0x55, 0x3a, 0x41, 0x37, 0x5b, 0x18, 0x91, 0x05, 0xb4, 0xbb, 0x3e, - 0xc0, 0x50, 0xb4, 0xec, 0x0b, 0xf6, 0xfd, 0x26, 0x8e, 0xd9, 0x15, 0x76, - 0x27, 0x83, 0x74, 0x10, 0x4b, 0x36, 0xb6, 0xf2, 0x7f, 0xc9, 0xa7, 0x89, - 0x05, 0xe7, 0x68, 0x2a, 0x0c, 0x36, 0x03, 0xd5, 0x07, 0x92, 0x0a, 0x67, - 0xa5, 0xff, 0x4e, 0x0c, 0x08, 0x38, 0x57, 0x28, 0x53, 0x27, 0x4d, 0x27, - 0x1b, 0x18, 0x70, 0x8e, 0x89, 0x46, 0xdf, 0x04, 0x4a, 0xd6, 0x2d, 0x05, - 0x1d, 0x0c, 0xfb, 0xfa, 0x71, 0xd7, 0xba, 0x9a, 0xa5, 0x7a, 0xe6, 0xd8, - 0x4f, 0x34, 0x1f, 0x82, 0x6f, 0x29, 0x40, 0x4a, 0xe3, 0xdf, 0x38, 0x3a, - 0x0f, 0x30, 0xe8, 0xd4, 0xa8, 0xc0, 0x1a, 0x92, 0x27, 0xdd, 0x49, 0x91, - 0x6d, 0x25, 0x56, 0x34, 0xc9, 0x5b, 0x17, 0xcd, 0x57, 0x65, 0x2c, 0x65, - 0xde, 0x2b, 0x68, 0x8d, 0xd5, 0xd7, 0xa8, 0x49, 0x4e, 0x46, 0xd4, 0xa4, - 0x5a, 0x9c, 0xa1, 0x17, 0x25, 0x0a, 0x46, 0xa9, 0x13, 0xa4, 0xa5, 0x02, - 0x1f, 0xd4, 0x36, 0x4e, 0x97, 0xfa, 0x71, 0x9a, 0x52, 0x86, 0xda, 0xff, - 0x07, 0xa4, 0xe3, 0x2b, 0xb8, 0x3f, 0x34, 0xd7, 0x73, 0x75, 0xd1, 0x0b, - 0xf3, 0x77, 0x16, 0x32, 0x18, 0xe4, 0x56, 0xf1, 0xac, 0x84, 0xb1, 0x1a, - 0x9f, 0xbf, 0x7b, 0x34, 0x5b, 0xac, 0x00, 0x05, 0x71, 0x16, 0xa3, 0xe1, - 0xab, 0x66, 0xac, 0x4f, 0xde, 0x76, 0x19, 0x1e, 0x31, 0x31, 0x33, 0x8f, - 0x40, 0xfd, 0x2b, 0xe1, 0x95, 0xde, 0xf6, 0xd3, 0x08, 0x0c, 0x5a, 0x6c, - 0x4c, 0x42, 0x5c, 0x4b, 0x46, 0x79, 0x2a, 0x98, 0xbb, 0x8b, 0x07, 0x43, - 0x4e, 0x8d, 0x6f, 0x21, 0x75, 0x72, 0xde, 0x72, 0x18, 0xbe, 0xb7, 0x34, - 0x21, 0x1b, 0xc0, 0x91, 0xdd, 0x69, 0x42, 0x60, 0xc6, 0x09, 0x5b, 0xe0, - 0x56, 0xf7, 0xd8, 0x39, 0xb9, 0xd1, 0x07, 0x30, 0xf1, 0xc6, 0xc6, 0x50, - 0x7d, 0x27, 0xbf, 0xf6, 0x96, 0x00, 0x29, 0x6d, 0xbc, 0x2f, 0x74, 0xeb, - 0x98, 0x60, 0x32, 0x73, 0xb7, 0x80, 0xf8, 0x3b, 0x8e, 0x30, 0xf1, 0x9d, - 0xa8, 0xa1, 0xb6, 0x3f, 0x7f, 0x09, 0x1b, 0xc3, 0x93, 0xf6, 0xa4, 0x0f, - 0x1f, 0x63, 0x0d, 0xdc, 0x72, 0x3e, 0x82, 0x47, 0x9a, 0x4b, 0x9b, 0x1d, - 0x82, 0x46, 0x99, 0x66, 0x85, 0x3e, 0xd3, 0x84, 0x05, 0x8d, 0xaa, 0x38, - 0x6d, 0x01, 0x6a, 0xa6, 0x8c, 0xf1, 0xaa, 0x8d, 0x0a, 0x98, 0xb9, 0xf0, - 0xd5, 0x7f, 0xe3, 0xd3, 0xa9, 0x94, 0x5d, 0xbc, 0x5b, 0x13, 0x29, 0x15, - 0x89, 0xe9, 0x79, 0x98, 0x3b, 0x74, 0x11, 0x9c, 0x60, 0x19, 0x5b, 0xce, - 0x84, 0x45, 0xe7, 0xdc, 0xd3, 0xd5, 0xd4, 0x3c, 0x5b, 0x54, 0x67, 0xa6, - 0x34, 0x4f, 0xe2, 0x3b, 0xf5, 0xb9, 0x51, 0xf9, 0xfb, 0xe4, 0xe8, 0xb5, - 0x88, 0xe3, 0x36, 0x60, 0xf4, 0x01, 0xac, 0x0c, 0xdd, 0x04, 0x3a, 0x3c, - 0xfc, 0x59, 0xbb, 0xa0, 0xa1, 0xaa, 0x9f, 0x7d, 0xca, 0x1e, 0xf1, 0x2f, - 0x56, 0xa1, 0x37, 0x60, 0x07, 0xf8, 0x20, 0xd3, 0x97, 0x7d, 0x30, 0xdb, - 0x6f, 0x94, 0x3f, 0xf6, 0x4b, 0xe3, 0xd4, 0xb8, 0x7f, 0x89, 0x69, 0xe4, - 0xe6, 0xd1, 0x69, 0xf8, 0xc2, 0xd3, 0xac, 0xc6, 0xae, 0x35, 0x5b, 0x65, - 0x8b, 0xbe, 0x86, 0x20, 0x2f, 0x19, 0xe0, 0xaf, 0xcd, 0x2b, 0x30, 0xe3, - 0xc5, 0x0f, 0x01, 0x18, 0xd5, 0xfa, 0x00, 0xb2, 0xf5, 0xbe, 0xb4, 0x8c, - 0xd3, 0x31, 0x45, 0xbf, 0x0d, 0xa9, 0x87, 0x15, 0x72, 0x1a, 0x26, 0x7b, - 0x2d, 0xbf, 0xee, 0x8e, 0x10, 0xdb, 0x1b, 0xc8, 0xeb, 0x47, 0x07, 0x0f, - 0xba, 0x4a, 0x46, 0xbc, 0xa9, 0x7e, 0xa9, 0x20, 0x11, 0x04, 0xe4, 0x1a, - 0x24, 0x3a, 0xc6, 0x8f, 0x00, 0x87, 0x12, 0xd8, 0x2f, 0xab, 0x2c, 0xea, - 0x83, 0x09, 0x8d, 0x50, 0x54, 0x24, 0x7d, 0x56, 0x37, 0xbb, 0x99, 0xbd, - 0xf6, 0xc8, 0x99, 0x02, 0x0d, 0x8a, 0x06, 0xba, 0xe8, 0x32, 0xf4, 0xd4, - 0xf4, 0x26, 0xf5, 0xcc, 0xc1, 0x8f, 0x8f, 0x48, 0xd7, 0xe3, 0x0f, 0x41, - 0xcb, 0xe0, 0x61, 0x0b, 0x03, 0x0f, 0x7f, 0x31, 0x8a, 0xc9, 0xba, 0x2e, - 0xce, 0x73, 0x1b, 0x7c, 0xbc, 0x19, 0x50, 0x9b, 0xab, 0x0e, 0x42, 0x20, - 0x56, 0x56, 0x99, 0x40, 0xa2, 0xea, 0x45, 0x26, 0x45, 0xf7, 0x15, 0x44, - 0x65, 0xcd, 0x47, 0xbd, 0x82, 0xd3, 0x8a, 0x82, 0x0f, 0x96, 0x82, 0x5f, - 0xeb, 0x7c, 0x1d, 0x43, 0x5b, 0xd0, 0x5b, 0x36, 0xeb, 0xe6, 0x05, 0x7f, - 0x51, 0x6f, 0x16, 0x7f, 0xc4, 0x86, 0xcd, 0x15, 0xa7, 0x44, 0x12, 0x9a, - 0xd6, 0xf3, 0xd2, 0xdf, 0x4d, 0x7a, 0x48, 0x6e, 0xe5, 0x8a, 0x41, 0x8c, - 0xf0, 0x17, 0x38, 0x7d, 0x50, 0x76, 0x2f, 0x42, 0x31, 0x5c, 0xe6, 0x94, - 0x38, 0x40, 0xf8, 0x97, 0x74, 0x88, 0x31, 0xfb, 0x3b, 0xcc, 0xa0, 0x61, - 0x6d, 0xaf, 0x04, 0x51, 0xa9, 0x8a, 0x17, 0x1a, 0x5b, 0x58, 0x16, 0x98, - 0x75, 0xb9, 0xe2, 0xb3, 0x04, 0xd4, 0x03, 0x10, 0x3f, 0x2e, 0x7c, 0x0e, - 0xbb, 0x4f, 0xae, 0xa9, 0xc8, 0xe3, 0xe1, 0x8b, 0x73, 0x54, 0xef, 0xa9, - 0x27, 0xf4, 0x1d, 0xe7, 0xa3, 0x95, 0x9f, 0x52, 0xfc, 0x40, 0xd2, 0x9e, - 0x00, 0x7b, 0xc0, 0x00, 0xbb, 0x5d, 0xcb, 0xac, 0x65, 0x51, 0xc4, 0x1d, - 0x08, 0xed, 0x28, 0xab, 0xe8, 0x59, 0xa8, 0x11, 0x34, 0x51, 0xb7, 0x91, - 0x75, 0x2e, 0x12, 0x94, 0x3c, 0xcc, 0x1b, 0xb7, 0x61, 0x3e, 0x19, 0x2d, - 0x2a, 0x85, 0xc6, 0x4d, 0x81, 0x5b, 0x59, 0xdf, 0x11, 0x61, 0x66, 0x33, - 0xec, 0x8c, 0x4d, 0x14, 0x43, 0x0b, 0x04, 0xf2, 0x44, 0xe7, 0x62, 0xf3, - 0x69, 0xb4, 0x8f, 0x63, 0x9f, 0xd5, 0x2b, 0xd2, 0x53, 0xbd, 0xeb, 0xc2, - 0x1d, 0x59, 0x2f, 0xb2, 0x7c, 0x20, 0x4c, 0x4e, 0x1d, 0x30, 0x6e, 0x67, - 0x3b, 0x5f, 0x85, 0xfa, 0xf8, 0x53, 0xef, 0xbd, 0xc5, 0x66, 0x16, 0x96, - 0x42, 0xec, 0x38, 0xc7, 0xdd, 0x15, 0xcf, 0x87, 0xd7, 0x6a, 0x06, 0x5e, - 0xb3, 0x90, 0x1c, 0x3b, 0x25, 0xc9, 0xb9, 0x10, 0xb6, 0xeb, 0x9a, 0x94, - 0xb2, 0x6d, 0x40, 0xe6, 0x8b, 0x21, 0xf6, 0xb2, 0xbc, 0xc6, 0xef, 0x54, - 0x47, 0x53, 0x7d, 0x36, 0xd1, 0x2d, 0xdb, 0xd1, 0xf4, 0x9a, 0xee, 0xfa, - 0xe9, 0x9c, 0xbb, 0x3c, 0xf4, 0xc1, 0xab, 0x25, 0x4d, 0xab, 0x3c, 0xea, - 0xec, 0x94, 0x2f, 0xff, 0xd3, 0x0b, 0x8b, 0x98, 0x34, 0x7a, 0x4c, 0xbb, - 0x9c, 0x4e, 0x96, 0x75, 0x41, 0xaf, 0xe2, 0xc1, 0x61, 0x05, 0xea, 0xd3, - 0x4b, 0x7d, 0xf0, 0x21, 0xd4, 0x7b, 0xcb, 0x73, 0x84, 0x55, 0x2f, 0x03, - 0xd6, 0x86, 0x99, 0xd2, 0xbc, 0x52, 0xaa, 0x84, 0x20, 0x4c, 0xca, 0x01, - 0xec, 0x3a, 0x44, 0x4a, 0xfb, 0xd9, 0xfc, 0xf7, 0x2f, 0xc6, 0x6a, 0x67, - 0xc3, 0xe5, 0x55, 0x22, 0xae, 0x74, 0xa7, 0x0e, 0x53, 0x7d, 0xb9, 0xbd, - 0x1a, 0x33, 0xf9, 0xcf, 0x07, 0x35, 0xd2, 0xd7, 0xf4, 0x7c, 0xa4, 0x57, - 0x56, 0x11, 0xf7, 0x06, 0x5e, 0xb4, 0xa3, 0xd3, 0x51, 0xc3, 0xff, 0xdb, - 0x20, 0x2e, 0x11, 0xbb, 0x9b, 0x48, 0x2b, 0x63, 0x2b, 0x29, 0xd1, 0xf8, - 0x56, 0xd8, 0xf0, 0x7d, 0x73, 0x6f, 0x47, 0x8d, 0xbe, 0x04, 0xe8, 0xb4, - 0x1b, 0x6b, 0xc7, 0x29, 0x96, 0xc4, 0x9a, 0x51, 0x47, 0x75, 0x95, 0x96, - 0x08, 0x36, 0x76, 0x5c, 0x58, 0x2e, 0xe5, 0x58, 0x7a, 0x1f, 0x7a, 0x57, - 0x43, 0xf2, 0x51, 0x81, 0x29, 0x84, 0x96, 0xcd, 0xbc, 0x58, 0x13, 0x3c, - 0x4d, 0x00, 0x68, 0x7c, 0x44, 0xbf, 0x0d, 0xf2, 0x65, 0x8e, 0x14, 0xad, - 0xf1, 0xed, 0x9e, 0x7d, 0xa3, 0x8d, 0xb6, 0x76, 0x23, 0x0c, 0x0a, 0xc5, - 0x46, 0xd8, 0x9f, 0x88, 0x43, 0x10, 0x4f, 0x74, 0x37, 0xa0, 0xd0, 0x5b, - 0xc9, 0x06, 0x9f, 0xe9, 0x2b, 0x00, 0x98, 0x46, 0xa4, 0x67, 0xc3, 0x9f, - 0xd1, 0x8c, 0x3d, 0x40, 0x0a, 0x37, 0x10, 0xfe, 0xd4, 0xc5, 0xed, 0x8d, - 0x97, 0x78, 0x72, 0x95, 0x55, 0x58, 0x4a, 0x08, 0xa4, 0x5e, 0xbb, 0xee, - 0xe3, 0x2b, 0x49, 0xea, 0x7a, 0x15, 0x1f, 0x90, 0x0f, 0x10, 0x0a, 0xb2, - 0x27, 0x21, 0x31, 0xef, 0x1b, 0xb0, 0xdb, 0xdf, 0x58, 0xe1, 0xf6, 0x40, - 0x52, 0xd6, 0x1b, 0x2c, 0xb1, 0x7a, 0xf1, 0x78, 0x55, 0xb2, 0x75, 0xb3, - 0x64, 0x02, 0xef, 0x3e, 0xc7, 0xeb, 0xa8, 0x9f, 0x96, 0xe1, 0xb3, 0x31, - 0x08, 0x88, 0x12, 0x33, 0x3a, 0xc7, 0x10, 0x2c, 0x3e, 0x9b, 0xa7, 0xfc, - 0xf7, 0x6b, 0xa7, 0xec, 0x67, 0xde, 0x08, 0xe4, 0x56, 0x44, 0x81, 0xd7, - 0x55, 0xda, 0xe8, 0x6e, 0xe1, 0x04, 0x0b, 0x88, 0x9a, 0x97, 0x1b, 0x57, - 0xc6, 0x19, 0x85, 0xb8, 0x05, 0x6e, 0xf9, 0x55, 0x8f, 0x9a, 0x2d, 0x91, - 0x44, 0x1d, 0xca, 0x84, 0x55, 0x2b, 0xa1, 0xbb, 0x1e, 0xf0, 0x11, 0x11, - 0xb3, 0x58, 0xe5, 0x0f, 0x31, 0x39, 0xa8, 0x44, 0xa1, 0xf1, 0x55, 0xb8, - 0x22, 0x0f, 0x60, 0x61, 0x1f, 0xf1, 0xdb, 0xdb, 0x21, 0xa8, 0xcb, 0x90, - 0x36, 0xd8, 0xc4, 0x94, 0xc0, 0xcd, 0xe0, 0xc8, 0xe7, 0x40, 0xa4, 0xa2, - 0x2b, 0xd8, 0x06, 0x62, 0x55, 0x03, 0x54, 0x88, 0x98, 0x52, 0x5e, 0x9c, - 0x51, 0x59, 0x5b, 0x29, 0x4f, 0x84, 0xd9, 0x91, 0x16, 0xc1, 0x02, 0xc7, - 0x17, 0x95, 0x08, 0xe0, 0xe3, 0x6e, 0xd6, 0xf0, 0x73, 0x05, 0x43, 0x15, - 0x8b, 0x33, 0x10, 0x6b, 0xa1, 0x52, 0xa6, 0xfc, 0x78, 0x29, 0x44, 0xbe, - 0x1c, 0xcb, 0x82, 0x91, 0x83, 0x6b, 0xff, 0x6d, 0x2a, 0x9a, 0xdb, 0xf8, - 0x94, 0x45, 0x4b, 0x31, 0xe8, 0x3f, 0x0d, 0xda, 0xcf, 0x5e, 0xf3, 0x6a, - 0x29, 0x8a, 0xdc, 0xed, 0x5b, 0x38, 0xac, 0x69, 0x8a, 0x75, 0x7c, 0xa0, - 0x07, 0x61, 0xdf, 0xb5, 0x58, 0x94, 0x23, 0x82, 0x79, 0x00, 0xbd, 0x5b, - 0x8b, 0x03, 0xf9, 0xb1, 0xac, 0x3a, 0xf3, 0x43, 0x61, 0xef, 0xc0, 0x77, - 0xa7, 0x86, 0x98, 0xf8, 0x86, 0x8b, 0x43, 0x9a, 0xba, 0x11, 0x0c, 0xc8, - 0x33, 0x95, 0x27, 0xe8, 0x87, 0x50, 0x3d, 0x7d, 0xa6, 0x0b, 0xc1, 0xc0, - 0x60, 0x81, 0x4d, 0x27, 0x73, 0xad, 0xdd, 0xb4, 0xa6, 0xc4, 0x70, 0x3d, - 0x3e, 0x88, 0x40, 0x91, 0x8d, 0x80, 0x9f, 0x55, 0x1a, 0x04, 0xeb, 0xb3, - 0xc1, 0x9a, 0x51, 0xae, 0x69, 0x91, 0xab, 0xaf, 0xe0, 0x68, 0xb3, 0x6e, - 0x10, 0xfa, 0xda, 0x3d, 0x1d, 0xe6, 0x24, 0x87, 0x52, 0x44, 0xc9, 0x8c, - 0x36, 0x13, 0xbe, 0x92, 0x45, 0xe4, 0xc2, 0x55, 0x86, 0x6e, 0x3c, 0xd5, - 0x53, 0x3b, 0xe9, 0xe2, 0x65, 0x0e, 0xc1, 0xa6, 0x61, 0xbd, 0x2a, 0x1c, - 0x27, 0x5d, 0x8f, 0xd7, 0xfa, 0x51, 0xec, 0x4e, 0xe3, 0xd4, 0x98, 0x18, - 0xda, 0x0c, 0x36, 0xd5, 0xa4, 0xa3, 0xc8, 0xce, 0xed, 0x16, 0x8d, 0xc6, - 0x7d, 0x88, 0x5c, 0x82, 0x23, 0x1b, 0x50, 0x60, 0xc2, 0xaa, 0xe8, 0x5a, - 0x51, 0x9a, 0x21, 0xfb, 0xd4, 0x83, 0xa2, 0xed, 0x67, 0xe4, 0x8d, 0x7d, - 0x32, 0xdf, 0xff, 0x09, 0x45, 0x35, 0x5c, 0x76, 0x4b, 0x40, 0x8c, 0x69, - 0x83, 0x18, 0x1b, 0x14, 0x82, 0x78, 0xd0, 0xa9, 0x7f, 0x38, 0x16, 0x89, - 0x6e, 0x2d, 0xd7, 0xd4, 0xbe, 0x1d, 0xa3, 0x42, 0x19, 0x7f, 0x27, 0x0a, - 0x14, 0x15, 0x4c, 0xbf, 0x45, 0xd7, 0x05, 0xca, 0x3a, 0x93, 0xba, 0xb4, - 0x80, 0x69, 0xe0, 0x5b, 0xcd, 0x5f, 0xc4, 0x58, 0x6b, 0x53, 0x39, 0x7e, - 0xae, 0x59, 0xd5, 0x35, 0xc4, 0x31, 0xf8, 0x55, 0xe7, 0x55, 0xe0, 0x5c, - 0x3e, 0xc4, 0xfc, 0x07, 0xa1, 0x10, 0xa7, 0x05, 0xa4, 0xbe, 0x37, 0x80, - 0xd6, 0x7d, 0x97, 0x70, 0xc9, 0xae, 0x06, 0x7e, 0x41, 0x92, 0x03, 0xcf, - 0xbd, 0xa2, 0x2d, 0x53, 0x95, 0x26, 0xb9, 0x6e, 0x7e, 0xd6, 0xcf, 0x7e, - 0x57, 0x50, 0x7a, 0x12, 0x37, 0x47, 0xbd, 0x6e, 0xc9, 0x3c, 0x42, 0xb9, - 0x3a, 0xe6, 0x5b, 0x6e, 0x79, 0x8b, 0xb2, 0xad, 0x65, 0x94, 0x0b, 0x48, - 0x46, 0xeb, 0x5e, 0x10, 0xc5, 0x27, 0xd2, 0xc1, 0xda, 0xc4, 0x68, 0xd5, - 0x5a, 0xf2, 0x76, 0xd8, 0xcb, 0x73, 0x42, 0xe4, 0x61, 0xa3, 0x37, 0xbd, - 0xa7, 0x79, 0xec, 0x98, 0x82, 0x69, 0x87, 0x68, 0xd9, 0xa6, 0xb3, 0xa8, - 0xc4, 0xb3, 0x6b, 0x60, 0x4c, 0x1b, 0x6a, 0x66, 0x36, 0x74, 0xc6, 0x5a, - 0x60, 0x38, 0xa2, 0xa9, 0x63, 0x22, 0x6d, 0x37, 0x04, 0xc9, 0x1a, 0x44, - 0x42, 0x4d, 0xaf, 0xdd, 0xf5, 0xd6, 0x4e, 0xe7, 0x11, 0xeb, 0x16, 0x5c, - 0x16, 0x1c, 0xb4, 0x0a, 0xeb, 0xea, 0x2f, 0xd3, 0xa3, 0x1e, 0x18, 0x08, - 0x3b, 0x34, 0x09, 0xe0, 0xab, 0xf0, 0x28, 0xf6, 0x6d, 0x76, 0x8b, 0x26, - 0x9f, 0xda, 0x55, 0xc6, 0x1f, 0x1d, 0x0b, 0xbd, 0xe9, 0x73, 0x77, 0x5e, - 0x4a, 0x43, 0x29, 0x84, 0x25, 0x4c, 0xee, 0x6a, 0x93, 0x7e, 0x30, 0x40, - 0x79, 0x95, 0xa8, 0x2b, 0x9e, 0xe2, 0xf1, 0xf0, 0x22, 0xe0, 0x09, 0xc6, - 0x9c, 0xf2, 0x45, 0xba, 0x04, 0x7e, 0x73, 0x72, 0xfc, 0x90, 0x81, 0x5a, - 0x3e, 0x6e, 0x6c, 0xed, 0x80, 0x33, 0x57, 0x9a, 0xab, 0x7b, 0x90, 0x4c, - 0x5e, 0x83, 0x03, 0x18, 0xf6, 0xfe, 0xe4, 0x85, 0x02, 0x90, 0x64, 0x62, - 0xb2, 0x02, 0xe9, 0xb4, 0x87, 0xbc, 0x2c, 0xda, 0xef, 0x52, 0x47, 0x5b, - 0x83, 0x37, 0x70, 0xac, 0x61, 0xf8, 0x82, 0x92, 0x21, 0xf9, 0x2b, 0x9b, - 0xe8, 0xf8, 0xd6, 0x77, 0x82, 0x26, 0x14, 0x6d, 0x7e, 0xc6, 0x15, 0x66, - 0xe7, 0x30, 0x96, 0x8f, 0xbd, 0xb7, 0xc8, 0x71, 0x5e, 0x84, 0x07, 0x58, - 0xae, 0xcd, 0xf5, 0xed, 0xd4, 0xec, 0x60, 0x87, 0xba, 0x18, 0x9d, 0x6e, - 0x59, 0x93, 0x48, 0x19, 0x03, 0x7a, 0xe9, 0xb4, 0x2d, 0xd6, 0x0f, 0xd4, - 0xa3, 0x38, 0x3b, 0xf2, 0x78, 0xcc, 0x86, 0x68, 0xb2, 0x3f, 0xb9, 0x64, - 0x6c, 0x38, 0xda, 0x08, 0xd8, 0x60, 0x3e, 0xc4, 0x16, 0x1a, 0x1e, 0x59, - 0x73, 0x4f, 0x6a, 0x76, 0x60, 0xbb, 0x35, 0x85, 0x22, 0x71, 0xd5, 0x23, - 0x54, 0x4f, 0xba, 0x6e, 0xbf, 0xab, 0xf0, 0x15, 0xb7, 0x79, 0x24, 0x50, - 0x4d, 0x7e, 0xe2, 0x84, 0x56, 0x58, 0xda, 0x68, 0x44, 0xec, 0x21, 0xe3, - 0x6f, 0xcb, 0x11, 0xc4, 0xd8, 0xeb, 0x0a, 0x0e, 0x31, 0x79, 0x32, 0x39, - 0xc3, 0xad, 0x33, 0xc7, 0x96, 0xaf, 0xb0, 0x12, 0x12, 0x30, 0xe3, 0xdd, - 0x23, 0x08, 0x23, 0x98, 0x31, 0xcd, 0x90, 0x7a, 0xfc, 0xc7, 0xe2, 0x8a, - 0xb4, 0x40, 0x26, 0x89, 0x92, 0xfa, 0x5e, 0xde, 0x7f, 0x2a, 0x67, 0xed, - 0xd4, 0x96, 0xc6, 0xed, 0x6d, 0xc3, 0x06, 0xed, 0xdb, 0xb3, 0x45, 0x85, - 0x85, 0xa9, 0x8a, 0x9a, 0xb1, 0xf5, 0xfa, 0x5d, 0xd6, 0xf4, 0x20, 0xee, - 0xb0, 0x26, 0x8c, 0xee, 0xb0, 0xee, 0x66, 0x82, 0xbd, 0x6f, 0xac, 0xe1, - 0x9d, 0xfa, 0x29, 0xe2, 0x2c, 0x2f, 0x42, 0x97, 0x9f, 0xa0, 0x0e, 0x36, - 0x0a, 0x3e, 0x06, 0x58, 0x74, 0x15, 0x86, 0x25, 0x35, 0x2f, 0x41, 0x1a, - 0x11, 0x2a, 0xdb, 0x1b, 0x02, 0x1c, 0xb0, 0xcb, 0x0b, 0x63, 0xf0, 0x95, - 0x8e, 0xd6, 0xe3, 0x35, 0x8b, 0xe3, 0xdb, 0xdf, 0xb0, 0xab, 0x14, 0xb1, - 0x33, 0xb4, 0x8e, 0xa0, 0xba, 0xc5, 0x71, 0x22, 0xc2, 0xa3, 0x4c, 0x4f, - 0x59, 0x9a, 0xfa, 0xe0, 0x53, 0x54, 0xb0, 0x5f, 0x05, 0xf6, 0x68, 0x3b, - 0x19, 0x56, 0xb5, 0x99, 0xa1, 0x01, 0x46, 0x3d, 0x14, 0x1b, 0x05, 0xa7, - 0xf6, 0xf1, 0xf8, 0xfe, 0x3b, 0x6e, 0x66, 0x78, 0xef, 0x52, 0xd9, 0x4e, - 0xc0, 0x3c, 0x90, 0x68, 0xe6, 0xdd, 0x21, 0x66, 0x3f, 0xb8, 0x29, 0x41, - 0xac, 0x08, 0x5e, 0xad, 0x8a, 0xf5, 0x6d, 0x55, 0x65, 0xa6, 0x8d, 0x6d, - 0x48, 0xa8, 0x25, 0x45, 0x7b, 0x45, 0xab, 0x9a, 0x8d, 0xd8, 0x41, 0x41, - 0x59, 0x37, 0xe7, 0x6b, 0x6a, 0xa4, 0xe5, 0xaa, 0x51, 0x69, 0x14, 0x5a, - 0x4e, 0x20, 0xb4, 0x65, 0x4d, 0xce, 0xa7, 0xa0, 0xae, 0x59, 0xfe, 0x69, - 0xe6, 0x13, 0x85, 0x3c, 0x34, 0x06, 0x5b, 0x72, 0xd9, 0xbf, 0x69, 0x12, - 0x90, 0x51, 0xa4, 0x54, 0x4c, 0x3d, 0xb9, 0xd6, 0x42, 0xb6, 0x6a, 0x15, - 0x27, 0x71, 0x21, 0x1a, 0xe9, 0xc4, 0xda, 0xef, 0xa7, 0x97, 0xa6, 0x1d, - 0x2e, 0x6d, 0xdf, 0xb1, 0x32, 0x24, 0xfa, 0xc6, 0xe9, 0x4b, 0x2f, 0xe0, - 0x1a, 0x93, 0x1b, 0x1e, 0xd6, 0x7e, 0x45, 0xf0, 0x4f, 0xb3, 0x56, 0xa3, - 0x6f, 0x56, 0x71, 0x40, 0x85, 0x77, 0xef, 0x15, 0xab, 0xb7, 0x10, 0x91, - 0x70, 0xc6, 0xe0, 0xc8, 0xf2, 0x5c, 0x0a, 0xbb, 0x33, 0x58, 0x0c, 0x91, - 0x0f, 0x64, 0x45, 0x2a, 0x72, 0x9a, 0xe1, 0xec, 0x07, 0xea, 0xf5, 0xf4, - 0xa8, 0xf5, 0x31, 0x8b, 0xc7, 0xb2, 0x1c, 0x2d, 0xd9, 0x6b, 0x5e, 0x75, - 0xb9, 0x9a, 0xeb, 0x6e, 0x0f, 0x53, 0x28, 0x3c, 0x71, 0xec, 0x04, 0x67, - 0xb2, 0x30, 0x67, 0x1a, 0x4c, 0xe0, 0xcf, 0x46, 0xc8, 0x9b, 0xb9, 0xdb, - 0xad, 0x3f, 0xaf, 0x68, 0x5e, 0xc1, 0x89, 0x1b, 0x7b, 0xb8, 0xc0, 0x04, - 0x6b, 0xf9, 0xc3, 0x58, 0x94, 0xb6, 0xd5, 0x5e, 0x4c, 0xd5, 0xe8, 0x8d, - 0xfe, 0x06, 0xfb, 0x38, 0x3c, 0xb8, 0x2d, 0xf0, 0x09, 0x23, 0x29, 0x4e, - 0x2b, 0x25, 0x0e, 0x74, 0xe8, 0xf3, 0x54, 0xb3, 0xfc, 0xf0, 0xe0, 0x89, - 0x3c, 0x6c, 0x9e, 0x9a, 0xd5, 0x44, 0xe7, 0xf0, 0x3a, 0x70, 0x84, 0x4f, - 0xcd, 0x2d, 0xa2, 0xfb, 0xc7, 0xb2, 0x38, 0x67, 0xb6, 0xc7, 0x55, 0x70, - 0x4c, 0x62, 0xf7, 0x39, 0x59, 0x18, 0x3d, 0x64, 0x44, 0x07, 0xb5, 0x34, - 0x24, 0x7f, 0x9d, 0x90, 0xed, 0xe0, 0x35, 0xb8, 0x76, 0xb0, 0xcc, 0xe6, - 0x2a, 0x50, 0x54, 0x91, 0xaa, 0x02, 0x2c, 0xf6, 0x3f, 0x81, 0x69, 0x41, - 0xd1, 0x5e, 0xb2, 0x94, 0x03, 0x37, 0x07, 0xde, 0x0c, 0x41, 0xf9, 0xbc, - 0x88, 0xcd, 0x0b, 0x1a, 0x11, 0x2c, 0x1d, 0x7c, 0x26, 0xce, 0xc0, 0x99, - 0xd1, 0xd4, 0xca, 0x0a, 0xe8, 0xbf, 0xb9, 0xcb, 0x27, 0x43, 0x40, 0xf7, - 0x34, 0xe6, 0x3c, 0x1b, 0x80, 0xe9, 0x67, 0x77, 0x7e, 0x1d, 0x67, 0xcf, - 0x3f, 0xaf, 0xea, 0x49, 0xf6, 0x8d, 0x33, 0x4f, 0x89, 0xb1, 0x30, 0x6c, - 0x17, 0x0d, 0xa2, 0x8a, 0x16, 0x7e, 0x16, 0x54, 0xcb, 0xef, 0x6c, 0x89, - 0x6b, 0xef, 0xaa, 0x3e, 0x10, 0x46, 0xbc, 0xd5, 0xca, 0xbe, 0xd7, 0x9f, - 0x9a, 0x61, 0xc7, 0x07, 0xfb, 0x2f, 0x3e, 0x94, 0x88, 0x20, 0x97, 0x44, - 0x1b, 0xc3, 0xb4, 0x7a, 0x2b, 0x09, 0xa4, 0x65, 0xb6, 0xe6, 0x0f, 0x7e, - 0x1f, 0x08, 0x85, 0x29, 0x48, 0xb3, 0x7c, 0xfb, 0xd9, 0x8c, 0x13, 0x7e, - 0x8e, 0x51, 0x35, 0xfa, 0x41, 0x8e, 0x4b, 0xab, 0xfe, 0xd8, 0x0c, 0x1c, - 0x2f, 0x38, 0xa4, 0x2e, 0x80, 0x75, 0x85, 0x71, 0xf4, 0x7b, 0xea, 0x12, - 0xe1, 0x7d, 0xce, 0xe9, 0xe4, 0x74, 0xf3, 0x0b, 0xea, 0x77, 0xb8, 0xdf, - 0xf5, 0xaa, 0x90, 0xa1, 0x51, 0xf3, 0x02, 0x8c, 0xb8, 0x40, 0xd4, 0xdd, - 0x87, 0xc3, 0xbd, 0x37, 0x95, 0x2d, 0xd0, 0xa2, 0x5b, 0x00, 0x14, 0xe3, - 0x9b, 0xea, 0x8e, 0xa3, 0xf2, 0xc2, 0x80, 0x0f, 0x8d, 0x1e, 0xc8, 0x4a, - 0x6b, 0x92, 0x21, 0x71, 0x35, 0x84, 0x84, 0x8b, 0x6d, 0x1a, 0x0e, 0xbb, - 0xf9, 0x0f, 0xa2, 0xcf, 0xcf, 0x16, 0x29, 0x38, 0x81, 0xd8, 0x55, 0x10, - 0x2f, 0x29, 0x4d, 0x4a, 0x31, 0x09, 0x60, 0xf9, 0xcd, 0x47, 0xaa, 0x38, - 0x2b, 0x99, 0xf1, 0x3a, 0x34, 0xc4, 0xaf, 0xa9, 0x9f, 0x02, 0xa3, 0xe1, - 0xb8, 0x79, 0x51, 0x49, 0x10, 0xab, 0x8b, 0x1b, 0x2d, 0x7a, 0xa5, 0xd9, - 0x27, 0x8b, 0x26, 0xee, 0x4e, 0xa4, 0xdd, 0x55, 0xe8, 0x62, 0x26, 0x1a, - 0xfc, 0x3e, 0xf0, 0xcf, 0x04, 0x19, 0xdb, 0xfb, 0xc6, 0xc3, 0x62, 0xbc, - 0x24, 0x75, 0xde, 0xc1, 0xd3, 0xc1, 0xe5, 0xd0, 0x23, 0x37, 0xa1, 0xad, - 0x85, 0x41, 0xf3, 0x30, 0x4f, 0xc7, 0x7e, 0xc3, 0x2b, 0xa5, 0xd6, 0x3d, - 0xc4, 0x33, 0xf9, 0x8e, 0xa7, 0xbb, 0x73, 0xaa, 0x2f, 0x0c, 0xa5, 0x74, - 0x3d, 0xe7, 0x88, 0x04, 0x3b, 0x8a, 0xc0, 0x3a, 0xd4, 0x2a, 0x56, 0xd5, - 0x43, 0x3d, 0x4f, 0x7a, 0x0d, 0xb7, 0x44, 0xc9, 0x48, 0xf0, 0x65, 0x21, - 0x94, 0xc8, 0xc8, 0x38, 0x05, 0x7d, 0x55, 0x8e, 0x5b, 0x6f, 0xe8, 0x7f, - 0x1a, 0xf1, 0xc6, 0xd9, 0x3c, 0x63, 0xfd, 0x29, 0xfe, 0x9d, 0xa2, 0xe6, - 0x33, 0x6e, 0xf7, 0x10, 0x14, 0xbc, 0x26, 0x0c, 0xac, 0x22, 0x6f, 0x50, - 0x21, 0x0e, 0x98, 0x43, 0xf7, 0x8a, 0x55, 0xf0, 0x9f, 0xc0, 0xcc, 0xaf, - 0xc5, 0x44, 0xb5, 0xe1, 0x86, 0x8a, 0x62, 0x5e, 0x13, 0x02, 0x1e, 0xd9, - 0xa6, 0xe4, 0x91, 0xea, 0x66, 0xd3, 0x27, 0x46, 0x26, 0x30, 0x12, 0x63, - 0x27, 0x61, 0xd0, 0xab, 0x49, 0x31, 0x92, 0xc8, 0x32, 0xd8, 0x8f, 0x30, - 0x29, 0x33, 0xbb, 0xe2, 0x33, 0xc5, 0x48, 0xc4, 0x3d, 0x4e, 0x44, 0x06, - 0xc7, 0xb8, 0x15, 0x24, 0x12, 0x90, 0x75, 0x63, 0x50, 0xc0, 0x06, 0x7c, - 0x32, 0x14, 0xd6, 0x95, 0xf6, 0x8d, 0x62, 0x2c, 0x54, 0xdb, 0x5d, 0x8c, - 0x36, 0x5e, 0x21, 0x9a, 0xa5, 0xee, 0xc9, 0x2e, 0x75, 0xe9, 0xd1, 0x8b, - 0xc7, 0xb4, 0x52, 0xa0, 0xd1, 0x16, 0xfb, 0x02, 0xd3, 0x35, 0xc7, 0x04, - 0xd5, 0xe3, 0x87, 0x10, 0xd1, 0x0a, 0x38, 0xd5, 0x3d, 0xa1, 0x0c, 0x6d, - 0x56, 0x95, 0xb7, 0xa2, 0x7a, 0x4b, 0x8e, 0x0a, 0x27, 0x9a, 0x0d, 0x01, - 0x72, 0xf7, 0xc2, 0xab, 0x3b, 0x4b, 0xd1, 0x30, 0x71, 0xb3, 0x5f, 0xaa, - 0xf0, 0x87, 0x45, 0x8d, 0xc2, 0xa9, 0x97, 0x03, 0x47, 0x0e, 0xbe, 0xcb, - 0x15, 0x1a, 0x00, 0xa9, 0x1b, 0xf2, 0x16, 0x27, 0x4a, 0x61, 0x87, 0xde, - 0xc4, 0xe6, 0x49, 0x39, 0xec, 0xc7, 0xcb, 0x5a, 0x65, 0x0c, 0x3c, 0xd4, - 0x3f, 0xca, 0x8d, 0xe7, 0x66, 0xe3, 0x93, 0xff, 0xf1, 0xb7, 0x32, 0x54, - 0x1b, 0xc4, 0xc0, 0xcc, 0xc4, 0xca, 0x15, 0x04, 0x2e, 0xf9, 0x12, 0x70, - 0x75, 0x4b, 0xad, 0x22, 0x3c, 0xaf, 0x65, 0x8d, 0xfe, 0x0a, 0x5b, 0x00, - 0x01, 0x07, 0x32, 0xf1, 0x0c, 0xb2, 0x60, 0x24, 0x68, 0xa8, 0x4e, 0xb6, - 0xd0, 0xf5, 0x36, 0x4d, 0xb1, 0xea, 0xdf, 0x8d, 0x0a, 0x71, 0x61, 0x65, - 0x40, 0x25, 0x37, 0x7e, 0x4d, 0x2e, 0x6e, 0x56, 0x71, 0x1c, 0x07, 0xb7, - 0x6f, 0x02, 0x98, 0x33, 0x50, 0x96, 0xba, 0xf4, 0xb9, 0xc0, 0xa3, 0xeb, - 0xbf, 0x71, 0x1e, 0x81, 0x8d, 0x94, 0x58, 0x31, 0xb8, 0x81, 0x26, 0xc7, - 0x59, 0x43, 0xf6, 0x08, 0xb0, 0xbd, 0xae, 0xc4, 0x44, 0xaf, 0x35, 0x76, - 0xf7, 0xfb, 0x1f, 0x29, 0xe6, 0x64, 0xe6, 0x95, 0x21, 0x53, 0xf2, 0x68, - 0x21, 0x41, 0x51, 0x1f, 0x16, 0xfc, 0xeb, 0x7d, 0x29, 0xef, 0xd1, 0xc5, - 0x2c, 0xd6, 0x79, 0xb8, 0xbf, 0x7e, 0xbc, 0x5c, 0x81, 0x97, 0x3b, 0x9e, - 0xb3, 0x9e, 0x9a, 0xf1, 0x93, 0x4f, 0x07, 0x73, 0x64, 0x63, 0x8b, 0x72, - 0x3a, 0xcc, 0x71, 0x2c, 0xfa, 0x09, 0x74, 0x5a, 0x66, 0xaa, 0xb4, 0x3e, - 0x4d, 0xf2, 0x3c, 0x8a, 0x0d, 0xfe, 0x40, 0x72, 0x23, 0x09, 0x7f, 0x40, - 0xd3, 0xc3, 0x1a, 0x14, 0x52, 0x44, 0x3a, 0x48, 0x55, 0x14, 0xef, 0x67, - 0xdd, 0x17, 0x58, 0x50, 0x20, 0x2e, 0x1f, 0x79, 0x83, 0x19, 0x87, 0x5c, - 0x19, 0xc6, 0x3f, 0x12, 0x96, 0xaa, 0x92, 0x19, 0xf3, 0x98, 0xfb, 0x1e, - 0x0d, 0x09, 0xad, 0x89, 0x11, 0x43, 0xda, 0x0e, 0xd7, 0xc4, 0x7e, 0xdc, - 0xf3, 0x22, 0xaf, 0x29, 0xba, 0x08, 0x10, 0xb3, 0xdc, 0x21, 0x7d, 0x7b, - 0x9d, 0xce, 0xeb, 0xc7, 0xbb, 0x66, 0xcb, 0xf0, 0xf0, 0x22, 0x9b, 0x71, - 0x76, 0xbe, 0x6c, 0x42, 0xfa, 0x6f, 0xcc, 0xd3, 0xc6, 0xdb, 0xd3, 0xc0, - 0xac, 0x88, 0xa9, 0xf3, 0x9f, 0x2c, 0x8e, 0xf0, 0xb2, 0x64, 0xe7, 0x0c, - 0x62, 0x5b, 0x57, 0x0a, 0x67, 0x39, 0x3a, 0x8e, 0x14, 0xbd, 0x06, 0x32, - 0x04, 0xcd, 0xb5, 0x46, 0x66, 0x8e, 0xd3, 0x32, 0x44, 0x83, 0x0f, 0xf4, - 0x3c, 0x34, 0x68, 0x14, 0x4e, 0x14, 0x98, 0x72, 0x11, 0xc6, 0xbf, 0x1b, - 0xdf, 0x7e, 0x86, 0x75, 0x8c, 0x34, 0xa6, 0x87, 0x2a, 0x9b, 0x9e, 0xc5, - 0x95, 0x5f, 0x2e, 0x1a, 0x66, 0x25, 0xa4, 0x1e, 0x19, 0x64, 0x63, 0xdb, - 0x4a, 0x5d, 0x98, 0x07, 0x40, 0x43, 0x86, 0x7d, 0x80, 0x44, 0x5d, 0x31, - 0x55, 0xb1, 0xa6, 0x0e, 0x4f, 0xe3, 0xa6, 0x69, 0xa8, 0xfc, 0x64, 0x4f, - 0xd2, 0x04, 0xae, 0x59, 0x51, 0x46, 0xe4, 0xb9, 0x36, 0xd0, 0x5d, 0xa4, - 0x22, 0xcf, 0x63, 0x33, 0x76, 0xd1, 0x0f, 0xff, 0x20, 0x62, 0x8d, 0x7b, - 0xac, 0xe7, 0x3d, 0x19, 0xae, 0x23, 0x28, 0xdb, 0x3c, 0xc6, 0x08, 0xf4, - 0xdd, 0x20, 0x94, 0x53, 0x29, 0x56, 0x0b, 0x83, 0x8c, 0x93, 0xcb, 0xb2, - 0x42, 0xa1, 0xd6, 0x1d, 0x4e, 0xdb, 0xbe, 0x6c, 0x73, 0xc3, 0x45, 0x76, - 0x98, 0x75, 0x8a, 0xc8, 0xd4, 0xc4, 0xd1, 0x5f, 0x63, 0x5f, 0xd9, 0xd7, - 0x74, 0x90, 0x6c, 0xf0, 0xc7, 0x54, 0xfd, 0xa4, 0x70, 0x6d, 0x25, 0xa4, - 0xec, 0x6f, 0xc6, 0xba, 0x38, 0xd3, 0x7e, 0x71, 0x87, 0xc1, 0x0b, 0x79, - 0xa2, 0x54, 0x95, 0x24, 0x27, 0x5f, 0x90, 0x23, 0x42, 0xac, 0x2a, 0x8b, - 0xa6, 0x43, 0xcf, 0x9d, 0xb9, 0x17, 0xe6, 0x4b, 0x44, 0x56, 0x33, 0x11, - 0x6e, 0xf1, 0x69, 0x67, 0xc8, 0xbd, 0x38, 0x33, 0x99, 0xca, 0xdd, 0x6b, - 0x13, 0xf8, 0x33, 0xdd, 0xd6, 0xb0, 0xfc, 0x85, 0x3c, 0x65, 0xcf, 0x42, - 0x64, 0xc9, 0x72, 0x75, 0x45, 0x0e, 0x23, 0xaa, 0xfd, 0xcc, 0x89, 0x1f, - 0x43, 0x74, 0x87, 0x74, 0xb3, 0x0b, 0xc8, 0x69, 0xb3, 0xb9, 0xdd, 0x8c, - 0x0b, 0x00, 0x42, 0xed, 0xd7, 0xcf, 0x7e, 0x70, 0x50, 0xaf, 0xea, 0x21, - 0x6d, 0xca, 0x9e, 0xb7, 0xce, 0x66, 0x6b, 0x1c, 0xbe, 0xb4, 0xbd, 0xdd, - 0x6b, 0x61, 0x71, 0xf5, 0xa2, 0x77, 0x00, 0xc0, 0xb6, 0x5c, 0x7c, 0xe4, - 0x5f, 0x68, 0x6a, 0x46, 0xa2, 0xb7, 0x24, 0x40, 0x3d, 0xd9, 0x50, 0xf6, - 0x8d, 0x5a, 0x2a, 0x39, 0xe4, 0xa2, 0xdb, 0x90, 0xb9, 0xd0, 0x81, 0x52, - 0x70, 0xfd, 0x78, 0xb4, 0x27, 0x08, 0x98, 0x2e, 0x84, 0x81, 0xdb, 0xfb, - 0xa9, 0x64, 0x1d, 0xbc, 0xf4, 0x9e, 0xfd, 0x1d, 0xd0, 0x50, 0x1d, 0x46, - 0x4a, 0x1d, 0x45, 0x22, 0xc8, 0x79, 0x41, 0x34, 0xcb, 0xfe, 0x1c, 0xc8, - 0xa6, 0x99, 0xa1, 0x04, 0x2a, 0x31, 0x68, 0xaf, 0xa4, 0x74, 0x43, 0xb1, - 0x84, 0xb0, 0x82, 0xf6, 0x08, 0x2c, 0x1b, 0x55, 0x09, 0x93, 0x3b, 0xaa, - 0xf8, 0x9d, 0x57, 0x0b, 0x4d, 0xa3, 0x93, 0x78, 0xf6, 0x90, 0x69, 0x7a, - 0x1e, 0x9c, 0x3d, 0x25, 0xcc, 0x90, 0x68, 0xe6, 0x4a, 0xbf, 0xfa, 0xa3, - 0x83, 0x3b, 0x30, 0x56, 0x3c, 0xb6, 0x88, 0x78, 0x98, 0x6c, 0x92, 0xde, - 0x37, 0x26, 0x4f, 0x83, 0x5c, 0xff, 0xdb, 0x69, 0x62, 0x68, 0x4f, 0x1e, - 0x35, 0x8d, 0x12, 0xcf, 0x3e, 0xf7, 0x15, 0x49, 0xc9, 0x88, 0xf2, 0x21, - 0xe1, 0xb7, 0x07, 0xde, 0xb2, 0x5e, 0xa3, 0xa8, 0x93, 0x42, 0x54, 0x7f, - 0x85, 0x07, 0xf4, 0xd3, 0xf7, 0x29, 0x6c, 0x98, 0x45, 0x9c, 0x8f, 0x24, - 0xb9, 0xf8, 0x4a, 0x73, 0x28, 0x3b, 0x8d, 0x92, 0xa3, 0xe2, 0xb0, 0xf9, - 0x65, 0xf6, 0x1f, 0x47, 0xfc, 0x38, 0xfc, 0x7c, 0xea, 0x90, 0xb7, 0xdb, - 0x3b, 0xc7, 0xdd, 0xf7, 0xd0, 0xec, 0xf0, 0xaa, 0x46, 0xf4, 0x83, 0x9c, - 0x54, 0x4b, 0x03, 0xb0, 0x46, 0xd4, 0x71, 0x1e, 0x93, 0x83, 0x41, 0x95, - 0x56, 0x2f, 0x12, 0xde, 0xc3, 0x2e, 0x53, 0xd6, 0x3f, 0x3c, 0xd0, 0x5f, - 0x4f, 0x27, 0x64, 0xdc, 0x6b, 0xd8, 0x8d, 0xb2, 0x2d, 0x32, 0x55, 0xa5, - 0x20, 0x7a, 0x80, 0xc8, 0xca, 0xbe, 0xc1, 0x8c, 0xb3, 0x6d, 0x2a, 0x4e, - 0x94, 0x61, 0x70, 0xcd, 0x3c, 0x4a, 0xbb, 0x6b, 0x5c, 0x00, 0x91, 0xac, - 0xc1, 0x06, 0x0d, 0x87, 0x33, 0x14, 0xe9, 0xd2, 0x91, 0x5b, 0xfa, 0x7e, - 0x3b, 0xc3, 0x44, 0x66, 0x1c, 0xe9, 0x68, 0x5a, 0x43, 0x3a, 0x27, 0xa6, - 0x47, 0x45, 0x0b, 0x59, 0x97, 0xeb, 0xf9, 0x80, 0x0e, 0x93, 0xd0, 0x92, - 0x0a, 0xfc, 0x87, 0x25, 0x91, 0x5d, 0x2a, 0x28, 0x0c, 0x39, 0x19, 0x60, - 0x14, 0x30, 0x6b, 0x01, 0xe6, 0x5b, 0xe1, 0x03, 0xae, 0xe3, 0xbc, 0x6c, - 0xe5, 0x56, 0x1a, 0x0b, 0x50, 0x25, 0x62, 0x0d, 0x8e, 0x2a, 0x00, 0xc8, - 0x57, 0x82, 0x4c, 0xbd, 0x9e, 0x76, 0xef, 0x97, 0xcd, 0xec, 0xe6, 0xa5, - 0x66, 0x5c, 0xd8, 0xb8, 0xc4, 0xad, 0x78, 0xf6, 0x49, 0x16, 0x88, 0x20, - 0x9e, 0xec, 0x2b, 0x2d, 0x3b, 0x2f, 0xd4, 0x32, 0x21, 0xba, 0x19, 0x37, - 0xfe, 0x20, 0x52, 0x09, 0xec, 0x7d, 0x1d, 0x57, 0x19, 0x53, 0xa7, 0x60, - 0x24, 0x07, 0x1a, 0x14, 0xff, 0xed, 0x25, 0xe4, 0x3d, 0x45, 0x53, 0x3c, - 0xe7, 0x16, 0x4f, 0xd7, 0x6a, 0xcd, 0x14, 0x7a, 0xe0, 0xda, 0xbf, 0x66, - 0x06, 0xae, 0x29, 0x29, 0x08, 0x40, 0x8f, 0xf0, 0x38, 0x05, 0xf3, 0xba, - 0x90, 0xe9, 0x0f, 0x38, 0x6f, 0xe3, 0x08, 0xc2, 0x37, 0x3f, 0x8c, 0x7a, - 0x15, 0x8c, 0xb4, 0x5f, 0xdf, 0xb3, 0x0f, 0x14, 0xa3, 0x28, 0x12, 0xac, - 0xe0, 0x9c, 0x81, 0xf1, 0x0d, 0xba, 0x5e, 0xe3, 0x45, 0x9c, 0xdd, 0xc0, - 0x87, 0x7b, 0x4e, 0xd4, 0x67, 0x78, 0xc7, 0x9e, 0x3a, 0x6c, 0x3c, 0x7e, - 0xac, 0x5f, 0xbd, 0x4a, 0x4f, 0xb9, 0xf7, 0xeb, 0xa6, 0x38, 0x1f, 0x76, - 0x25, 0x82, 0x97, 0x41, 0x23, 0xd8, 0x58, 0x52, 0xe2, 0xba, 0x06, 0x70, - 0xf5, 0xe9, 0x7e, 0x7c, 0xf7, 0xf0, 0xb4, 0x7e, 0x81, 0xec, 0xe4, 0xbc, - 0xc7, 0x55, 0x57, 0x63, 0x0d, 0x22, 0x43, 0x82, 0x9b, 0x67, 0x76, 0x77, - 0xb6, 0xca, 0xd8, 0xce, 0x07, 0x33, 0xb9, 0x32, 0x59, 0x61, 0x52, 0x8e, - 0x25, 0x42, 0xbe, 0x91, 0x65, 0x50, 0x93, 0x39, 0xca, 0x94, 0x6a, 0x76, - 0x09, 0x54, 0xfc, 0x46, 0x47, 0x1d, 0x9c, 0xe3, 0x62, 0xfc, 0x5e, 0x65, - 0x5c, 0x89, 0xbd, 0x4d, 0x23, 0xd5, 0x5d, 0x04, 0x29, 0xdd, 0x27, 0xf6, - 0xd8, 0x38, 0x9e, 0xbc, 0xc3, 0xc4, 0xdf, 0xa9, 0xa1, 0xc0, 0x96, 0x1f, - 0x8e, 0xa7, 0xdf, 0xe9, 0x97, 0x2f, 0xe8, 0xca, 0xaa, 0x5e, 0x99, 0x45, - 0x4a, 0xed, 0x09, 0xde, 0x47, 0xfc, 0xbe, 0x4d, 0xda, 0xd8, 0xe3, 0x08, - 0xd8, 0x87, 0xbd, 0x66, 0xc1, 0xa7, 0x1c, 0xf9, 0x2f, 0x60, 0x21, 0x53, - 0xbb, 0xed, 0x59, 0xc2, 0x0c, 0x4d, 0x6e, 0xe8, 0xa4, 0x0a, 0x78, 0x1b, - 0xc3, 0x79, 0x9c, 0xd0, 0xc4, 0xe5, 0x02, 0x5e, 0x7d, 0xad, 0x10, 0x5d, - 0x92, 0x7c, 0x5c, 0xac, 0x3a, 0x7e, 0x89, 0xb4, 0xf3, 0xc2, 0xe6, 0x4f, - 0x10, 0x25, 0x27, 0xa1, 0xb0, 0xd8, 0x72, 0xb8, 0x05, 0x52, 0x47, 0x8c, - 0xa6, 0x16, 0xfe, 0x33, 0x4c, 0x68, 0x73, 0xc0, 0xee, 0xdc, 0x65, 0xd9, - 0xd9, 0xc1, 0x28, 0x9b, 0x77, 0xa1, 0x95, 0x3b, 0xe5, 0x59, 0xa8, 0xbf, - 0x32, 0xce, 0xbb, 0x24, 0x57, 0xb8, 0x2e, 0x3b, 0x59, 0x96, 0x4e, 0xdd, - 0x3a, 0xa8, 0x5a, 0xd3, 0xbf, 0xa1, 0x5a, 0x30, 0x81, 0x91, 0xac, 0xe5, - 0x7b, 0x0d, 0xd7, 0xb7, 0x61, 0x5b, 0xf5, 0x8c, 0xbf, 0x64, 0xb5, 0x5f, - 0x72, 0x4c, 0xfe, 0x56, 0x17, 0xd0, 0x3a, 0xdc, 0x5d, 0x3d, 0x92, 0x4f, - 0xa7, 0x27, 0xe2, 0x68, 0x50, 0x40, 0x19, 0x78, 0x0e, 0x71, 0x55, 0x11, - 0xc6, 0xab, 0x56, 0x8f, 0x04, 0x25, 0x6b, 0x81, 0xb7, 0xf9, 0x6f, 0x4e, - 0x36, 0x74, 0xb1, 0xc8, 0xff, 0xdc, 0x0b, 0x42, 0x34, 0x55, 0x68, 0x46, - 0xe0, 0xf0, 0xf8, 0x08, 0x4a, 0x9a, 0x7b, 0xc4, 0xff, 0x70, 0xf5, 0xc3, - 0x9e, 0xa7, 0x69, 0x51, 0x62, 0x83, 0x0f, 0xbe, 0x35, 0x4a, 0x7d, 0x8c, - 0x8f, 0xeb, 0xf8, 0xe5, 0x30, 0x35, 0x68, 0xb8, 0x5f, 0xa8, 0xbd, 0xa4, - 0x40, 0xd3, 0x2e, 0x83, 0xe2, 0x43, 0xdd, 0xed, 0xf2, 0x79, 0x96, 0x34, - 0x0b, 0xfb, 0x30, 0x9e, 0xe8, 0xe4, 0x06, 0x5b, 0x36, 0xc3, 0x5d, 0x21, - 0xd3, 0xec, 0xe4, 0xf5, 0xab, 0x32, 0xa5, 0x6a, 0x38, 0xc0, 0x22, 0x46, - 0x99, 0xd8, 0xd8, 0x5a, 0x01, 0x37, 0x82, 0x2d, 0x9f, 0x12, 0xee, 0x44, - 0xa9, 0xaf, 0x37, 0x84, 0x4d, 0x63, 0x5d, 0xbc, 0x31, 0x0b, 0x12, 0xee, - 0xfd, 0x6e, 0x41, 0x19, 0x91, 0x01, 0xee, 0x30, 0x27, 0xbe, 0x92, 0xae, - 0x57, 0xff, 0x3d, 0xf6, 0xf7, 0x50, 0x24, 0xed, 0x8a, 0xf2, 0x4c, 0xa3, - 0x4c, 0x12, 0xfe, 0x81, 0x8a, 0xd6, 0x6a, 0x3a, 0x57, 0x71, 0x21, 0x01, - 0xcb, 0xf5, 0xf3, 0x3a, 0x15, 0x58, 0xfb, 0x57, 0x31, 0x1d, 0xed, 0x36, - 0xf4, 0x1f, 0x49, 0xb0, 0x45, 0xd5, 0xd0, 0xc5, 0x79, 0x6c, 0xad, 0x2f, - 0x7c, 0x05, 0x32, 0x27, 0xe6, 0xe6, 0x5d, 0x9c, 0xcd, 0x7e, 0x8a, 0x4e, - 0xc4, 0xe7, 0xfe, 0x5d, 0x70, 0x9e, 0x10, 0x20, 0xda, 0x5f, 0x37, 0x20, - 0xab, 0x5a, 0x61, 0xb5, 0xbe, 0x29, 0xd1, 0xc5, 0x85, 0xff, 0x0b, 0x6a, - 0x16, 0x02, 0xf6, 0x14, 0xbc, 0xe2, 0xa8, 0x32, 0xe6, 0xc2, 0xd3, 0x5b, - 0x1c, 0x33, 0x5c, 0x5a, 0x51, 0x89, 0x17, 0x35, 0x21, 0x1b, 0x20, 0xd8, - 0x0d, 0xb7, 0x4c, 0xdd, 0xaa, 0x17, 0xec, 0xb0, 0xad, 0x87, 0x5e, 0x06, - 0x8a, 0x8c, 0xa8, 0x50, 0x73, 0x65, 0x18, 0xfc, 0xfe, 0x77, 0xa6, 0xcc, - 0x15, 0xbd, 0xfb, 0x76, 0x14, 0x82, 0xb9, 0xab, 0xc1, 0x04, 0xd5, 0x56, - 0x0e, 0xf0, 0xb7, 0xb0, 0x45, 0xa8, 0x0b, 0xa1, 0xcb, 0x12, 0xb9, 0xe8, - 0x35, 0xf9, 0x17, 0xd9, 0x70, 0xc3, 0x9c, 0x50, 0x8e, 0x90, 0x97, 0xcf, - 0xda, 0x50, 0xfd, 0x8e, 0x72, 0xc2, 0x3f, 0x93, 0xfc, 0xe7, 0xdd, 0x79, - 0x6e, 0x23, 0x6e, 0x54, 0xca, 0x8b, 0xc1, 0xb8, 0x05, 0xe8, 0x4c, 0x6c, - 0xe2, 0xbe, 0xf1, 0xa5, 0xb5, 0x25, 0x8f, 0x82, 0xe9, 0xca, 0x0b, 0xc8, - 0x4f, 0xc2, 0xe5, 0xd2, 0x5c, 0xa3, 0xba, 0xbe, 0x08, 0x23, 0xe6, 0x25, - 0x2f, 0x55, 0x29, 0x9c, 0x68, 0x06, 0x93, 0x94, 0xfb, 0xf8, 0xce, 0xce, - 0x72, 0xb9, 0x6c, 0xe2, 0x4a, 0x97, 0xcf, 0xbb, 0xc9, 0xa8, 0x30, 0x0b, - 0x07, 0x98, 0x79, 0xed, 0x27, 0x48, 0x19, 0x19, 0xe3, 0x22, 0xc9, 0x61, - 0x12, 0x2d, 0xbf, 0x89, 0xe5, 0xc1, 0x09, 0xd7, 0xd6, 0x16, 0x38, 0xa1, - 0x7b, 0x23, 0xa4, 0xc7, 0x44, 0x29, 0x90, 0xdf, 0xd9, 0xbb, 0x1e, 0x82, - 0xb7, 0x99, 0x13, 0x39, 0x10, 0x2b, 0x21, 0xd5, 0xd1, 0xd0, 0x89, 0x5d, - 0xac, 0x3e, 0x24, 0xa0, 0xe8, 0xfc, 0xbe, 0xf2, 0x4b, 0x6e, 0x1a, 0x81, - 0x16, 0x3e, 0xc9, 0xf4, 0xdb, 0xa3, 0xe7, 0x71, 0x9e, 0x22, 0xec, 0xa7, - 0x9c, 0x25, 0x07, 0x9e, 0xfa, 0x4a, 0x4b, 0xf1, 0xcb, 0x49, 0x11, 0xb2, - 0xd2, 0x30, 0x94, 0x78, 0x0f, 0x3c, 0x02, 0x8f, 0x26, 0x77, 0xd4, 0x38, - 0x4b, 0x69, 0x9f, 0xc8, 0xb3, 0xf3, 0xd5, 0x62, 0x43, 0xde, 0xdf, 0x07, - 0x5d, 0x9f, 0x7a, 0x19, 0xab, 0x1f, 0xe9, 0xe8, 0x27, 0x6d, 0xad, 0x9f, - 0x06, 0x89, 0x68, 0x47, 0x59, 0xfd, 0xa1, 0xdb, 0x82, 0x7c, 0xad, 0x63, - 0x0d, 0x18, 0x71, 0x72, 0x31, 0x54, 0xf1, 0x5b, 0x16, 0xcd, 0xb0, 0xc9, - 0xde, 0x63, 0xa3, 0xdc, 0x96, 0xfe, 0x66, 0x9a, 0x98, 0xc0, 0xe1, 0x00, - 0x3f, 0x59, 0x4c, 0xdb, 0xbc, 0x55, 0xf8, 0x25, 0x3d, 0x63, 0xcf, 0x99, - 0x9b, 0x1f, 0xce, 0xba, 0x5c, 0xaa, 0xc3, 0x11, 0x0d, 0xdf, 0x1c, 0xfe, - 0x3e, 0x57, 0x08, 0x95, 0xba, 0x02, 0xdf, 0x76, 0x67, 0xe7, 0xe9, 0xeb, - 0xaf, 0x97, 0xb7, 0x22, 0xd2, 0x86, 0x02, 0x3a, 0x74, 0x35, 0x3b, 0xb8, - 0x62, 0xb4, 0xad, 0xd7, 0xf7, 0xcb, 0xca, 0x98, 0xb5, 0xc8, 0x49, 0xfe, - 0x6e, 0xb4, 0x94, 0x34, 0x3e, 0xd7, 0xbc, 0xfe, 0x73, 0x8a, 0xf3, 0x92, - 0x6d, 0x58, 0x43, 0x8e, 0xbd, 0x88, 0xfc, 0xab, 0x65, 0x9f, 0x42, 0x6c, - 0x3f, 0xda, 0x0d, 0x9d, 0x0c, 0x3a, 0x9a, 0xb5, 0xc4, 0x45, 0x6f, 0x8e, - 0x89, 0xff, 0x55, 0xe7, 0xe6, 0x03, 0x48, 0x94, 0x79, 0xf3, 0xd4, 0x24, - 0x0b, 0x71, 0x87, 0x21, 0x08, 0x73, 0x8a, 0xac, 0xe2, 0x9b, 0x3f, 0xc8, - 0xd0, 0x1d, 0xef, 0xdc, 0x05, 0x9a, 0xe1, 0x24, 0x70, 0x35, 0x54, 0x1d, - 0x8d, 0x67, 0x5c, 0x9f, 0x43, 0x29, 0x0d, 0xd8, 0x6a, 0x6d, 0xb4, 0xce, - 0x8e, 0xe5, 0x12, 0x4b, 0x10, 0x98, 0x15, 0xdb, 0x3f, 0x16, 0x86, 0xfb, - 0x83, 0x10, 0x78, 0x3e, 0x76, 0xc7, 0x24, 0x6f, 0xca, 0x7c, 0xf4, 0x0d, - 0xf4, 0xb2, 0xab, 0x64, 0x76, 0xbf, 0x53, 0xed, 0x1a, 0x43, 0xbb, 0x01, - 0x23, 0xef, 0x97, 0xea, 0xa9, 0xb9, 0xda, 0xa7, 0x43, 0x71, 0x86, 0x0c, - 0xe4, 0x30, 0xc8, 0x41, 0x6b, 0xf1, 0x3a, 0xba, 0x98, 0x90, 0x95, 0xf7, - 0x38, 0xe3, 0xe3, 0x81, 0x22, 0x3d, 0x1a, 0x1a, 0x23, 0xb1, 0x8d, 0xc6, - 0xa5, 0xaf, 0x4e, 0x9f, 0xf1, 0x41, 0x5f, 0x8e, 0xbf, 0xe6, 0xa9, 0xb9, - 0x19, 0xba, 0x95, 0x0d, 0xe2, 0xef, 0xf3, 0x85, 0x10, 0xa2, 0x7d, 0x39, - 0xd9, 0x97, 0x72, 0xd1, 0x3d, 0x2a, 0x41, 0xd3, 0xd4, 0x97, 0xfe, 0x79, - 0x76, 0x60, 0xb7, 0xa1, 0xcc, 0x1c, 0x50, 0xa7, 0xcb, 0x17, 0xe0, 0x89, - 0x5e, 0xf1, 0xb3, 0x7c, 0x09, 0x43, 0xd2, 0xe0, 0x9f, 0xaf, 0x15, 0xad, - 0x28, 0x6b, 0x81, 0x06, 0x65, 0x21, 0x26, 0x1a, 0xac, 0xbe, 0x00, 0x17, - 0x4a, 0x06, 0x89, 0x0e, 0x67, 0x6a, 0x53, 0x13, 0x13, 0xc6, 0x66, 0xe6, - 0x3e, 0xe4, 0x90, 0xef, 0xf2, 0xdf, 0xcc, 0xf9, 0x6e, 0x2c, 0xf9, 0x80, - 0xc5, 0x84, 0xd0, 0x29, 0xd1, 0x0b, 0xbd, 0x0a, 0x89, 0x6f, 0xc9, 0x33, - 0xa8, 0x48, 0x2a, 0x27, 0x66, 0x6a, 0xf3, 0x91, 0xe3, 0x66, 0x0d, 0x9a, - 0x20, 0x94, 0x9d, 0x42, 0x15, 0xc4, 0x52, 0x5b, 0x67, 0x0c, 0x18, 0x1a, - 0x6b, 0x14, 0xb6, 0x23, 0xa5, 0x4e, 0x8d, 0xfb, 0x28, 0xf4, 0x9a, 0xf8, - 0x60, 0xa0, 0xbe, 0x09, 0x34, 0x5c, 0xcd, 0xbd, 0x24, 0x66, 0x97, 0xad, - 0x73, 0xdb, 0xad, 0x4b, 0x03, 0x20, 0x85, 0x8f, 0xdb, 0x45, 0xb2, 0xaf, - 0x0d, 0x8e, 0xa9, 0x85, 0xfb, 0xb9, 0xd2, 0x33, 0x18, 0x77, 0x8b, 0x8c, - 0x05, 0x0e, 0x8e, 0x66, 0xb3, 0xa4, 0x76, 0xe3, 0x9b, 0x05, 0x44, 0x17, - 0x74, 0xdc, 0xdd, 0x66, 0xcd, 0x25, 0x9b, 0xe2, 0xef, 0x76, 0x73, 0x28, - 0x8b, 0xfb, 0x04, 0xec, 0x45, 0x6b, 0x8e, 0x9f, 0x27, 0xec, 0x1d, 0x5a, - 0xc2, 0x3c, 0x95, 0x9c, 0xd9, 0x94, 0x3e, 0x05, 0x61, 0xb2, 0x69, 0xcd, - 0xe8, 0xb3, 0x76, 0x26, 0x5c, 0x03, 0x9a, 0x98, 0x67, 0x59, 0xf8, 0x33, - 0x35, 0xe2, 0x44, 0xf4, 0x3d, 0x0d, 0xea, 0x23, 0x7c, 0x55, 0x47, 0x79, - 0x61, 0x5f, 0x08, 0x9c, 0xa8, 0xe3, 0x80, 0x9f, 0xa3, 0xde, 0x35, 0xdb, - 0x2c, 0x49, 0x78, 0xc4, 0xba, 0x6c, 0x62, 0xb7, 0x22, 0x4d, 0x9c, 0x9b, - 0x9e, 0xc1, 0x6e, 0xbf, 0x78, 0xa2, 0x21, 0x94, 0x68, 0x26, 0xb2, 0xf4, - 0x2b, 0x3a, 0x8d, 0xa3, 0xd0, 0x74, 0x52, 0x85, 0xe9, 0xed, 0xd7, 0x4d, - 0x37, 0x0c, 0xd2, 0x21, 0xb6, 0x51, 0x22, 0x71, 0xd2, 0x78, 0xfa, 0x15, - 0x40, 0x9c, 0x0b, 0x0f, 0xa4, 0x04, 0x42, 0x98, 0x4a, 0x86, 0x2d, 0x80, - 0x21, 0xe4, 0x69, 0x02, 0x7a, 0x9c, 0xba, 0x87, 0x1f, 0x94, 0x7e, 0x11, - 0x80, 0x2c, 0x36, 0xfd, 0xc9, 0x34, 0x6f, 0x04, 0x90, 0xe0, 0xbc, 0x45, - 0xe2, 0xde, 0x05, 0x27, 0xcb, 0x05, 0xb4, 0x96, 0x88, 0x69, 0xae, 0x81, - 0x69, 0xaf, 0x54, 0x41, 0x84, 0x73, 0x33, 0x40, 0xf8, 0xf2, 0xf2, 0xe2, - 0xcd, 0xba, 0xe5, 0x5a, 0x30, 0xc6, 0x0a, 0xbe, 0x48, 0x36, 0xc1, 0x47, - 0xa5, 0x66, 0x0c, 0xe9, 0x44, 0xfb, 0xd2, 0x13, 0xed, 0x33, 0x3c, 0x3e, - 0x1c, 0x41, 0x43, 0xa8, 0xb1, 0x68, 0xdf, 0xf8, 0x60, 0x67, 0x4c, 0x38, - 0x11, 0x1f, 0xf6, 0xa5, 0x6f, 0x3e, 0xf0, 0x6c, 0x6e, 0x16, 0x51, 0xcc, - 0x95, 0x2c, 0x9e, 0x17, 0xa1, 0x43, 0x4c, 0xf1, 0xa1, 0x82, 0x24, 0x49, - 0xe0, 0xc3, 0xd3, 0x22, 0x2b, 0x96, 0x0f, 0x0e, 0x33, 0xfc, 0x7b, 0x1b, - 0xf2, 0x8a, 0x23, 0x19, 0x00, 0x66, 0x74, 0x34, 0xc8, 0x50, 0x42, 0x29, - 0xaa, 0x32, 0x50, 0x67, 0xfa, 0x3f, 0x88, 0xcb, 0xe0, 0x32, 0x20, 0x97, - 0x54, 0xd0, 0x7b, 0x38, 0xb5, 0x64, 0xc3, 0x56, 0x5c, 0xcd, 0xcc, 0xcb, - 0x5a, 0xa6, 0x80, 0xf1, 0xc0, 0xe5, 0x48, 0x61, 0xa4, 0xb1, 0x24, 0xc6, - 0x52, 0xc5, 0x59, 0xff, 0xab, 0x64, 0xf5, 0x64, 0xfb, 0x5e, 0xb7, 0xef, - 0x44, 0x75, 0xf1, 0xdf, 0x27, 0x7d, 0x1c, 0x4a, 0x1f, 0x7d, 0xa4, 0x5a, - 0x3c, 0x76, 0x1d, 0xe9, 0x55, 0xbc, 0x16, 0x46, 0x3a, 0x80, 0x69, 0x35, - 0xc0, 0xff, 0x38, 0xba, 0xa9, 0x83, 0x4b, 0x6f, 0xae, 0x23, 0xce, 0x00, - 0x11, 0x48, 0x5b, 0x3d, 0x16, 0x96, 0x9f, 0xec, 0x70, 0x0c, 0x1c, 0x06, - 0xa4, 0xd8, 0xfd, 0x1a, 0xed, 0x66, 0xd2, 0xd8, 0xa6, 0xee, 0x23, 0x25, - 0x4f, 0xb3, 0x60, 0x86, 0x9c, 0xad, 0xe6, 0xc7, 0xe6, 0x44, 0xf2, 0xd8, - 0xd0, 0x10, 0x90, 0xd2, 0xbc, 0xa0, 0xfe, 0xef, 0xe7, 0x74, 0x74, 0x72, - 0x8f, 0x26, 0x44, 0x64, 0x34, 0xb7, 0x01, 0x40, 0xdf, 0xf9, 0xa5, 0x06, - 0xb8, 0x72, 0xb7, 0x89, 0x44, 0xc7, 0xae, 0x54, 0x10, 0xa5, 0x6a, 0x74, - 0x0a, 0x64, 0xd4, 0x19, 0xb2, 0x5c, 0x43, 0xbb, 0x64, 0xc0, 0xc4, 0xd5, - 0x59, 0x3c, 0xf6, 0xf5, 0x7f, 0xce, 0x50, 0xf4, 0x1f, 0x2a, 0x6d, 0x22, - 0xed, 0xe4, 0xd8, 0x90, 0x52, 0xde, 0xfd, 0xc2, 0x95, 0xfb, 0x0c, 0x9b, - 0x8c, 0x9c, 0xa8, 0x25, 0xe2, 0x22, 0xb3, 0xc5, 0xd3, 0x7f, 0x46, 0xb5, - 0xae, 0xe6, 0xa0, 0xb4, 0xd6, 0x68, 0x4e, 0x49, 0xae, 0x95, 0x9a, 0xb7, - 0xd2, 0xc3, 0x17, 0xe8, 0xad, 0x2d, 0xe5, 0xa4, 0xe0, 0x47, 0xcd, 0xed, - 0x6b, 0xba, 0xe8, 0x25, 0x81, 0xf3, 0x8d, 0xde, 0xc5, 0x82, 0x3a, 0xe5, - 0x13, 0x51, 0xdb, 0x9b, 0x80, 0xdd, 0x0b, 0x0d, 0xa0, 0x1d, 0xfc, 0x2a, - 0x03, 0x70, 0x4a, 0xff, 0x99, 0x41, 0xe2, 0xe2, 0xb3, 0xee, 0x11, 0x47, - 0x12, 0xfd, 0xa0, 0xc0, 0xb5, 0xae, 0x08, 0xd6, 0x73, 0xdb, 0x05, 0x0b, - 0xf9, 0x04, 0xe4, 0x4a, 0x75, 0x66, 0x20, 0x8e, 0x0c, 0x5c, 0xe0, 0xa0, - 0x72, 0x36, 0x4a, 0xd2, 0x7a, 0xaf, 0x1f, 0xf4, 0xc5, 0xa9, 0x10, 0x31, - 0x3c, 0x55, 0x15, 0x91, 0x21, 0xa3, 0x27, 0x32, 0x0a, 0x59, 0x00, 0x67, - 0x1d, 0x50, 0x14, 0x7e, 0xa6, 0xed, 0xee, 0xb2, 0x7a, 0xdd, 0x7f, 0x32, - 0x0a, 0x33, 0x3e, 0x4c, 0x3a, 0x90, 0xc8, 0xde, 0xd9, 0x24, 0x44, 0x57, - 0xdd, 0x6f, 0x44, 0x62, 0x85, 0xda, 0xd3, 0x4d, 0x95, 0x7a, 0xaa, 0x66, - 0xe6, 0x07, 0x1d, 0xfd, 0x4b, 0xb3, 0x16, 0x56, 0x75, 0x57, 0x21, 0x12, - 0x04, 0xa4, 0xce, 0x26, 0x9c, 0xc5, 0x5e, 0x4d, 0x86, 0x99, 0xfe, 0xd8, - 0xec, 0xb0, 0xe4, 0xcf, 0x19, 0xb0, 0x8c, 0x3c, 0x52, 0xc6, 0xbd, 0xdc, - 0x93, 0x9a, 0x74, 0x95, 0x2c, 0xa1, 0x83, 0x9b, 0xd0, 0x16, 0xcb, 0x3b, - 0xf1, 0xb2, 0x52, 0xcd, 0xe5, 0x4e, 0xe3, 0xcf, 0xec, 0x48, 0xb0, 0xee, - 0x59, 0xeb, 0x22, 0x02, 0x69, 0xf4, 0x41, 0xbd, 0x00, 0x01, 0xb9, 0x8e, - 0xaa, 0x81, 0x48, 0xe2, 0xcc, 0x16, 0xc1, 0x37, 0x87, 0xdd, 0x3f, 0xf0, - 0x29, 0x81, 0x1e, 0x1e, 0xe8, 0x6c, 0x07, 0x70, 0xc4, 0x2b, 0xc0, 0xd8, - 0xf6, 0x53, 0x2b, 0xe2, 0x14, 0xe5, 0x86, 0xbf, 0xc1, 0x16, 0x2e, 0x0e, - 0x3e, 0x44, 0xf1, 0x59, 0x2b, 0xc3, 0xfe, 0x57, 0xbd, 0xc1, 0x3d, 0x4f, - 0x70, 0xe1, 0xc2, 0xb9, 0xd1, 0x1d, 0xdd, 0x2a, 0x67, 0xe3, 0x7d, 0x89, - 0x1d, 0x4b, 0x54, 0x6d, 0x60, 0xf7, 0x09, 0xb4, 0x6b, 0xd5, 0xab, 0x40, - 0x4e, 0xe9, 0xa4, 0xb2, 0x06, 0x54, 0xcc, 0xd8, 0xb1, 0x00, 0xf9, 0x63, - 0x0c, 0x1f, 0x59, 0xed, 0x25, 0x3e, 0x2b, 0x1c, 0xc1, 0x7a, 0xdd, 0xc9, - 0x8c, 0x64, 0xd5, 0xaa, 0x7c, 0xc2, 0xb7, 0x36, 0xa5, 0xf8, 0x0d, 0x70, - 0x65, 0x74, 0xbb, 0xfa, 0xa0, 0x77, 0x1c, 0x83, 0x0f, 0x11, 0xab, 0x43, - 0xdf, 0xba, 0xdb, 0x14, 0x44, 0x17, 0xb5, 0x25, 0x55, 0xe4, 0xa6, 0x40, - 0x40, 0xac, 0x0e, 0xa0, 0x6d, 0xee, 0x73, 0x76, 0xed, 0x39, 0x98, 0x15, - 0xb2, 0x53, 0x2d, 0x90, 0xaf, 0x9c, 0x87, 0xe3, 0x34, 0xf8, 0x50, 0xda, - 0xd0, 0x17, 0x6f, 0x19, 0x2f, 0x32, 0x4c, 0x5a, 0xe7, 0x7e, 0x9a, 0x8d, - 0x09, 0x92, 0xa8, 0x16, 0xe2, 0xa4, 0x44, 0xf4, 0x8b, 0x1a, 0x19, 0x86, - 0xb2, 0x0c, 0x7a, 0xc4, 0x2b, 0xa4, 0x3a, 0xdf, 0x6f, 0x4c, 0xd1, 0x8a, - 0xb3, 0x9e, 0x32, 0xd5, 0x19, 0x66, 0x9c, 0x3e, 0x41, 0x72, 0xe9, 0x7f, - 0x9a, 0x75, 0xd1, 0xb0, 0x1a, 0x32, 0x8b, 0xab, 0x7b, 0xc6, 0x61, 0x7b, - 0x5f, 0xac, 0x1d, 0x84, 0x5c, 0x12, 0xc7, 0xb4, 0x4c, 0xa0, 0x46, 0x38, - 0x3a, 0x6b, 0xee, 0x37, 0xbc, 0xba, 0x2f, 0xb4, 0x5c, 0x47, 0xbc, 0x6a, - 0x1b, 0x59, 0x65, 0xf0, 0xbe, 0xeb, 0x83, 0xb9, 0x65, 0xb3, 0x23, 0xb8, - 0xc9, 0x9e, 0x38, 0x5b, 0x63, 0xe4, 0x49, 0xef, 0x98, 0x9d, 0xfc, 0xde, - 0x53, 0x1c, 0xee, 0x61, 0xe2, 0x52, 0x66, 0x50, 0xac, 0x5d, 0x26, 0x5a, - 0xa8, 0x89, 0x92, 0x84, 0xde, 0xdf, 0x8e, 0x0c, 0x4a, 0x4c, 0xf6, 0xe3, - 0x76, 0x41, 0x89, 0xfc, 0x6b, 0x05, 0xed, 0x7c, 0xc3, 0xb5, 0x66, 0xa6, - 0xef, 0x8f, 0x10, 0x08, 0x5f, 0xd7, 0xd7, 0x26, 0x8f, 0x97, 0x18, 0xf7, - 0x84, 0x32, 0x6b, 0x1e, 0x37, 0x4d, 0x9f, 0x12, 0x30, 0xcd, 0xd1, 0xa2, - 0xa3, 0x03, 0x6a, 0x65, 0x0b, 0x19, 0xaf, 0x06, 0xd5, 0x2c, 0x0d, 0x5c, - 0x4a, 0x40, 0xe0, 0xb4, 0x00, 0x3a, 0x83, 0xb9, 0x72, 0xd3, 0x93, 0xe7, - 0x12, 0x28, 0x55, 0x63, 0x27, 0x01, 0xda, 0x70, 0xbd, 0x5e, 0xc0, 0xf6, - 0xe5, 0x9e, 0x1b, 0x74, 0x97, 0x52, 0xef, 0xf6, 0x03, 0xd1, 0xe7, 0x3f, - 0xab, 0x55, 0xbb, 0xa3, 0x0e, 0x47, 0x41, 0x8a, 0x4e, 0x1a, 0xd8, 0x40, - 0xdd, 0x0f, 0xe4, 0x05, 0x2e, 0x39, 0x93, 0x2b, 0x4e, 0xd6, 0xa4, 0x57, - 0x61, 0xaf, 0x93, 0x13, 0xb4, 0x3c, 0xad, 0x5b, 0xf2, 0xe8, 0x39, 0x7a, - 0x7c, 0xe1, 0x9b, 0x1c, 0xb6, 0xa8, 0x21, 0x8c, 0x66, 0x8b, 0x11, 0xfe, - 0xc4, 0x89, 0x86, 0xe1, 0xde, 0xaf, 0xee, 0x6b, 0xd2, 0x69, 0xf4, 0xac, - 0x84, 0x06, 0x51, 0x1d, 0xad, 0x4e, 0x89, 0x51, 0x1e, 0xbe, 0x36, 0x42, - 0xac, 0xd9, 0x6f, 0xe8, 0x75, 0x82, 0xf4, 0xab, 0xb4, 0xcc, 0x7c, 0xe9, - 0x66, 0x35, 0x44, 0x10, 0xc1, 0x29, 0xa6, 0xee, 0xb9, 0xd8, 0xc4, 0x04, - 0x5d, 0x38, 0x9a, 0xc3, 0x6a, 0x01, 0x21, 0x64, 0x04, 0x09, 0x6c, 0x8d, - 0xaa, 0x01, 0x71, 0xb8, 0x6c, 0x51, 0xb7, 0xc6, 0x25, 0x52, 0x5b, 0x7a, - 0x80, 0xd5, 0x22, 0x60, 0x13, 0xfe, 0xe7, 0x9c, 0x14, 0xb9, 0x6f, 0xd9, - 0x0b, 0x88, 0x9d, 0x96, 0xaf, 0xc5, 0xc5, 0x41, 0xd6, 0xa5, 0xa0, 0x2d, - 0xd2, 0x75, 0x9d, 0xcb, 0xcd, 0xa9, 0x90, 0x67, 0xad, 0x93, 0x4d, 0x17, - 0x30, 0xc4, 0x8e, 0x58, 0x03, 0xc4, 0xc9, 0x47, 0x99, 0xca, 0x13, 0x36, - 0x09, 0x9e, 0xb1, 0x3f, 0x62, 0x88, 0xa4, 0x1e, 0xec, 0x1e, 0xcd, 0x9b, - 0xdf, 0x24, 0x13, 0x0e, 0x10, 0x6e, 0x82, 0xee, 0x82, 0x8b, 0xe9, 0x55, - 0x56, 0x30, 0x8d, 0x6d, 0x54, 0xd1, 0xd6, 0xce, 0x53, 0xaf, 0xa2, 0xbf, - 0xde, 0x53, 0x7b, 0x45, 0x21, 0x4e, 0x42, 0xc0, 0x0a, 0xc8, 0xea, 0xf0, - 0xbb, 0x37, 0x63, 0x8c, 0xb2, 0xb2, 0xde, 0x57, 0xf9, 0x1a, 0xc5, 0xb8, - 0xcf, 0x3b, 0xf4, 0xb4, 0xd5, 0x7c, 0x77, 0x46, 0x30, 0x6e, 0xed, 0xe1, - 0xab, 0x33, 0x95, 0xca, 0xb8, 0x1b, 0x3a, 0x72, 0x25, 0x56, 0x02, 0x2d, - 0x58, 0x2b, 0xdb, 0x2e, 0x93, 0xae, 0xdf, 0x99, 0xcb, 0x72, 0x01, 0xfb, - 0xdb, 0xd9, 0x35, 0xb3, 0x33, 0xaf, 0x7d, 0x90, 0xce, 0xa2, 0xf4, 0x92, - 0xd0, 0x28, 0xd6, 0x08, 0x98, 0xb9, 0x91, 0xc1, 0x53, 0x1b, 0xcd, 0x55, - 0x8c, 0x4b, 0x71, 0xd0, 0x78, 0xfe, 0x00, 0xa1, 0x22, 0xd4, 0xe2, 0x81, - 0xb3, 0x6b, 0x2a, 0x19, 0xd9, 0x57, 0x1f, 0xa6, 0xbc, 0x55, 0x00, 0x62, - 0x31, 0x67, 0xb3, 0x82, 0x0c, 0xea, 0xc4, 0xbf, 0x5d, 0x7c, 0x42, 0x6a, - 0xe3, 0x46, 0x93, 0x20, 0x34, 0xc8, 0xb0, 0x3c, 0xff, 0x27, 0xdf, 0x51, - 0x29, 0x8a, 0xc4, 0x6c, 0xd6, 0x11, 0x83, 0xa8, 0xe5, 0x6e, 0x96, 0xca, - 0x7a, 0xbc, 0x14, 0xe5, 0x3a, 0x7f, 0x02, 0x25, 0x6e, 0xcf, 0x1d, 0x93, - 0xfc, 0x9b, 0xf5, 0x3a, 0x18, 0xee, 0x97, 0xfb, 0x5a, 0x6e, 0x87, 0xf6, - 0x40, 0x28, 0x9c, 0x87, 0x6c, 0x00, 0xdc, 0x0c, 0x65, 0x9b, 0xbd, 0xad, - 0x44, 0x38, 0x00, 0x8c, 0x6a, 0x42, 0x26, 0xbe, 0x08, 0x96, 0xc8, 0x27, - 0x83, 0xdf, 0xda, 0x6b, 0xc4, 0x16, 0xa4, 0x50, 0x6d, 0x62, 0x9e, 0x16, - 0x1c, 0xb1, 0xeb, 0x61, 0x30, 0xa8, 0x98, 0x89, 0x47, 0xf7, 0xa2, 0x2a, - 0xbe, 0xa6, 0xee, 0x6b, 0x36, 0x77, 0xf1, 0xe9, 0x61, 0x93, 0xfb, 0xfc, - 0x58, 0xe1, 0xe3, 0xc4, 0x37, 0x52, 0x37, 0x27, 0x16, 0x76, 0x20, 0xb3, - 0x92, 0x5b, 0x21, 0xf6, 0xdb, 0x76, 0x32, 0x78, 0x7e, 0xcd, 0xe2, 0x8a, - 0x50, 0x58, 0x2c, 0x29, 0x4b, 0xde, 0xda, 0x07, 0x38, 0x19, 0xd7, 0x69, - 0x4c, 0x00, 0x54, 0x67, 0xf9, 0x69, 0xea, 0x8e, 0xa3, 0xe5, 0x26, 0x8a, - 0x11, 0x2e, 0x86, 0x66, 0x78, 0x0d, 0x8e, 0x7a, 0x75, 0x63, 0x83, 0x32, - 0x1d, 0x61, 0x09, 0x85, 0x18, 0x58, 0xce, 0xfa, 0x8b, 0x7f, 0x23, 0x63, - 0x8e, 0xd2, 0xa2, 0x1e, 0xe7, 0x16, 0xfb, 0x8f, 0x1f, 0x81, 0x29, 0x27, - 0xb7, 0xb6, 0xeb, 0x7c, 0x19, 0xc1, 0x83, 0x8b, 0xa7, 0x6f, 0x9e, 0x8e, - 0x3c, 0x61, 0x4e, 0x9a, 0xc9, 0x3a, 0xcc, 0xd4, 0x86, 0x61, 0xb9, 0xed, - 0xc0, 0xc1, 0x34, 0x08, 0x4a, 0x8f, 0x92, 0x42, 0xba, 0x20, 0x4b, 0x4b, - 0x28, 0x25, 0xd3, 0x07, 0x51, 0x16, 0xdc, 0x03, 0x1a, 0x5a, 0x26, 0xaf, - 0xa4, 0xe9, 0x1e, 0x45, 0xd7, 0x6e, 0x3c, 0x5c, 0x50, 0xdb, 0x65, 0xbc, - 0xb1, 0x74, 0xd2, 0x7f, 0x92, 0x20, 0x98, 0x36, 0xb8, 0x7d, 0xb8, 0x8d, - 0x87, 0x90, 0x84, 0x21, 0x1c, 0x3f, 0x76, 0xb1, 0x1a, 0xa5, 0x6b, 0xba, - 0x42, 0xea, 0xca, 0xd7, 0xf6, 0x9c, 0x63, 0xb6, 0x59, 0xf9, 0x21, 0xf5, - 0x3f, 0x07, 0x03, 0x86, 0xdc, 0xc2, 0x1b, 0xbf, 0xf7, 0x44, 0xc9, 0x04, - 0x4d, 0x94, 0x8e, 0xec, 0xac, 0x23, 0x3c, 0xd1, 0xb6, 0x14, 0xc2, 0x5f, - 0x8b, 0x35, 0x9b, 0x3e, 0xdc, 0x60, 0x11, 0x2e, 0x27, 0x63, 0x2f, 0xb3, - 0xd7, 0x01, 0x6c, 0xa6, 0x09, 0x84, 0xb4, 0x39, 0x48, 0x3a, 0x62, 0x9d, - 0xa8, 0xd8, 0x73, 0xa6, 0xbf, 0x0a, 0x2f, 0x30, 0x8f, 0x9d, 0x08, 0x28, - 0x57, 0x74, 0x72, 0x89, 0xa9, 0x8f, 0x0e, 0xb2, 0x4f, 0xcb, 0x22, 0x29, - 0xe5, 0xd3, 0x2d, 0x93, 0x13, 0xe4, 0xac, 0x07, 0xb3, 0x3d, 0xd7, 0x85, - 0x5e, 0xa3, 0x64, 0x06, 0x19, 0x3b, 0x4f, 0x96, 0xde, 0x7e, 0x35, 0xa7, - 0xe6, 0x54, 0x4b, 0x5d, 0x6e, 0x8c, 0xed, 0x3a, 0x3e, 0x73, 0xb1, 0x48, - 0xab, 0x59, 0x55, 0x66, 0x87, 0xcb, 0x08, 0x45, 0xce, 0x7e, 0x2c, 0x70, - 0x72, 0x03, 0x0c, 0xae, 0x84, 0x66, 0x6f, 0xaa, 0x35, 0xc1, 0xda, 0xad, - 0xfb, 0x46, 0x93, 0xdc, 0x4c, 0x61, 0x90, 0x88, 0x42, 0xac, 0x29, 0x47, - 0x8a, 0xb7, 0x50, 0xb6, 0x32, 0xad, 0x54, 0x69, 0xca, 0x70, 0xad, 0xb9, - 0xfa, 0x04, 0x9a, 0x43, 0x63, 0x0d, 0xab, 0x28, 0x90, 0xc5, 0xd5, 0x88, - 0xaa, 0x3c, 0x9f, 0xc9, 0x9a, 0xa2, 0x54, 0x0d, 0x9d, 0xd4, 0x06, 0xf9, - 0x49, 0xf8, 0x2b, 0x35, 0xac, 0xa9, 0x62, 0xfd, 0xc4, 0x0a, 0x93, 0xcb, - 0x1e, 0xeb, 0xe9, 0xbc, 0xb9, 0xc7, 0x9c, 0xab, 0x06, 0xe9, 0xf2, 0x51, - 0x7d, 0xeb, 0xef, 0x33, 0x5e, 0x74, 0xce, 0x4f, 0x60, 0xad, 0x34, 0x8c, - 0xdc, 0xf2, 0x9d, 0x3a, 0xe4, 0x99, 0xa8, 0xc5, 0x10, 0x19, 0xaa, 0xae, - 0xea, 0x5d, 0x2a, 0xf9, 0x56, 0x67, 0x0e, 0x17, 0x55, 0x6e, 0xa0, 0x9f, - 0x0f, 0xd2, 0x16, 0xbe, 0xa5, 0x1e, 0x02, 0x28, 0x16, 0xa4, 0x1b, 0x0c, - 0xaf, 0x88, 0xc7, 0x8d, 0xb5, 0xc4, 0xf8, 0x2c, 0x0a, 0xee, 0x93, 0xd9, - 0xea, 0x11, 0x50, 0xaa, 0x25, 0x64, 0xf1, 0xaa, 0x5b, 0xcc, 0x4c, 0xf9, - 0x22, 0x11, 0x3d, 0xd7, 0x54, 0x0b, 0x9c, 0x10, 0x40, 0x77, 0x5d, 0x66, - 0x1c, 0x6c, 0xc2, 0xe2, 0x01, 0xef, 0x0c, 0xbd, 0x42, 0x43, 0xf3, 0x24, - 0x8d, 0x8f, 0xdf, 0xa1, 0x1d, 0x04, 0x2f, 0xdc, 0x3e, 0xd8, 0x3c, 0x04, - 0x5f, 0x17, 0x83, 0xa7, 0x18, 0xfc, 0xf6, 0x5f, 0x97, 0x32, 0x5e, 0x80, - 0x05, 0x6d, 0x10, 0x42, 0x35, 0x0e, 0x57, 0xe0, 0x6e, 0x7b, 0x9c, 0xc0, - 0x5b, 0xde, 0x02, 0xc7, 0xc4, 0x9d, 0xba, 0x32, 0x89, 0xc1, 0x7d, 0xdc, - 0x2a, 0xa9, 0x3d, 0xb6, 0xb0, 0x50, 0xd3, 0x99, 0xa0, 0xf5, 0x45, 0x77, - 0x22, 0x08, 0x6a, 0x8e, 0xd3, 0xc8, 0x6e, 0x87, 0xf3, 0xe9, 0xe2, 0x3c, - 0x10, 0x62, 0xfa, 0x25, 0x69, 0xc2, 0x46, 0x0d, 0x6e, 0xf2, 0xaf, 0x7e, - 0x4d, 0x4f, 0x29, 0x4d, 0x13, 0x72, 0x1e, 0x01, 0xe1, 0x10, 0x81, 0x3b, - 0x9d, 0x8a, 0xa8, 0xc6, 0x1a, 0x3b, 0xa3, 0xdb, 0xc7, 0xb0, 0x8d, 0xc7, - 0x2e, 0x1c, 0xc5, 0x95, 0x62, 0xeb, 0x32, 0x81, 0xd1, 0x30, 0x8c, 0x4d, - 0x43, 0x53, 0xaa, 0x32, 0x45, 0xd8, 0xfb, 0x2e, 0x86, 0xe8, 0xa9, 0x55, - 0x08, 0x6e, 0x23, 0x1e, 0x1c, 0x4d, 0xb1, 0x38, 0xa4, 0xce, 0x63, 0xa8, - 0xd1, 0x87, 0x2f, 0xd9, 0xa9, 0x27, 0x36, 0xb7, 0xbf, 0xab, 0xc4, 0x75, - 0xe5, 0xc6, 0x99, 0x6f, 0x1e, 0x1a, 0x7d, 0xd4, 0x86, 0xd7, 0xda, 0x3a, - 0x9f, 0x6e, 0xad, 0xa2, 0xa7, 0x66, 0xdc, 0xc5, 0xdf, 0xc2, 0xe9, 0x29, - 0x8d, 0x48, 0x0b, 0x6d, 0xd3, 0x8c, 0xef, 0x91, 0x19, 0x6d, 0x0e, 0x8b, - 0xdd, 0xe6, 0x51, 0xf9, 0x6c, 0xac, 0x92, 0xf4, 0x41, 0x60, 0x7f, 0x53, - 0x94, 0xe9, 0xbd, 0xbc, 0xc2, 0xfb, 0x3d, 0x20, 0xc6, 0x3e, 0xe3, 0x95, - 0xf1, 0xd9, 0x57, 0x7a, 0x61, 0xc1, 0x50, 0x83, 0xca, 0x82, 0x12, 0x80, - 0xc3, 0xc7, 0xa2, 0xfc, 0x44, 0x9a, 0xe1, 0x13, 0x90, 0x94, 0x5c, 0x94, - 0x8c, 0xfe, 0xcc, 0x29, 0xa4, 0x17, 0x03, 0xdd, 0x5a, 0x7c, 0x56, 0x63, - 0x01, 0x8a, 0x73, 0x26, 0x8d, 0xe1, 0x68, 0x16, 0xc3, 0x2b, 0x35, 0xf2, - 0xad, 0x5a, 0x0c, 0x13, 0x1a, 0x1a, 0x16, 0x31, 0x8f, 0x8c, 0x1d, 0x0c, - 0xb2, 0x87, 0x83, 0x1f, 0xeb, 0xd0, 0xa4, 0xf9, 0xc1, 0x2b, 0x25, 0x64, - 0x32, 0x40, 0xe0, 0x42, 0x4a, 0xfa, 0x4f, 0x70, 0x19, 0x2f, 0x67, 0x62, - 0xc5, 0x87, 0x05, 0xe7, 0xc9, 0x7c, 0xca, 0x57, 0x04, 0xdf, 0xb5, 0xbd, - 0x02, 0xe5, 0x0e, 0x29, 0x9f, 0xf9, 0xdc, 0xa5, 0xf9, 0x1e, 0x26, 0x60, - 0xb4, 0xc1, 0x36, 0xe7, 0xaa, 0x6d, 0xf8, 0xd6, 0x53, 0x96, 0x3f, 0x8f, - 0x54, 0x96, 0xe1, 0x2f, 0xd3, 0xa0, 0x7a, 0xea, 0x67, 0x52, 0x57, 0x6d, - 0x2f, 0x3d, 0xd3, 0x80, 0xfa, 0xd9, 0x00, 0x07, 0x95, 0x17, 0x52, 0xa5, - 0x15, 0x4d, 0x91, 0xec, 0xdc, 0x09, 0x13, 0xad, 0xd5, 0xcc, 0x09, 0xe9, - 0xbd, 0xe1, 0x5f, 0x35, 0x52, 0x48, 0x19, 0xdf, 0x36, 0x40, 0xdc, 0xd9, - 0x03, 0x70, 0x7c, 0xb3, 0xa1, 0x9e, 0x8f, 0x0d, 0x06, 0xb9, 0xbd, 0xb9, - 0x34, 0x72, 0xf6, 0xe2, 0x77, 0xd1, 0x13, 0x4e, 0xe8, 0x61, 0x15, 0x07, - 0x3c, 0x32, 0x17, 0x81, 0x59, 0xa0, 0xa3, 0x21, 0x7f, 0x14, 0x67, 0x2c, - 0xe5, 0x22, 0xae, 0x2e, 0x09, 0xc9, 0x1b, 0xe3, 0x2f, 0xa7, 0x1b, 0x6c, - 0x85, 0x64, 0x3b, 0x27, 0x3a, 0xdb, 0xbe, 0xce, 0x9e, 0xd5, 0xda, 0x9a, - 0xac, 0x07, 0xea, 0xf7, 0x0f, 0xaa, 0x9e, 0xa2, 0xde, 0xf4, 0x71, 0x66, - 0x19, 0xff, 0x8b, 0x9c, 0x95, 0xf1, 0x49, 0x94, 0x14, 0xc8, 0x07, 0x03, - 0x73, 0x38, 0x32, 0xf7, 0xe9, 0x2b, 0x8b, 0x61, 0x06, 0x6d, 0xf2, 0xa0, - 0x26, 0xc5, 0x64, 0xcc, 0x27, 0xa0, 0xa8, 0x11, 0xee, 0x08, 0x2f, 0x6e, - 0xb1, 0x65, 0xbd, 0xdc, 0x97, 0x9e, 0x9c, 0x45, 0x33, 0xeb, 0x39, 0xca, - 0x70, 0x8d, 0x92, 0xc3, 0x0c, 0xd6, 0x84, 0x61, 0x7f, 0xb8, 0xde, 0xe5, - 0x27, 0xa3, 0xab, 0xa9, 0x0b, 0xa5, 0xad, 0x55, 0xc9, 0xcd, 0x46, 0x35, - 0x84, 0xf4, 0x6e, 0x20, 0x2c, 0xa4, 0xa1, 0x1d, 0xd3, 0xf0, 0xc3, 0x36, - 0xcd, 0xa5, 0xe2, 0x3f, 0x44, 0x31, 0x71, 0x2b, 0x96, 0x01, 0x2e, 0x99, - 0x6e, 0x2e, 0x1b, 0xe1, 0x3b, 0xd0, 0xff, 0x9d, 0xf9, 0xdb, 0xb5, 0xb9, - 0x9a, 0x73, 0x8a, 0x20, 0x2e, 0x10, 0xee, 0x5a, 0x15, 0xc3, 0x4b, 0x0b, - 0x09, 0x70, 0xad, 0xb5, 0x00, 0xec, 0xb2, 0xb3, 0x38, 0xbd, 0x77, 0x8b, - 0x10, 0xe5, 0xe2, 0x45, 0x51, 0x50, 0x33, 0x85, 0xa0, 0x5a, 0x0c, 0x1f, - 0x21, 0xa5, 0x07, 0xe9, 0xa3, 0x03, 0xd9, 0x19, 0x85, 0x7b, 0x48, 0xa5, - 0x55, 0x35, 0x9d, 0x02, 0xe7, 0xac, 0xa8, 0x21, 0x0a, 0x3b, 0x48, 0xb3, - 0x33, 0xbb, 0x56, 0xcb, 0xf7, 0xfc, 0xf7, 0x75, 0xde, 0xe5, 0x8a, 0xb6, - 0x8d, 0x55, 0xb6, 0xbf, 0x2d, 0xc1, 0xe1, 0x9b, 0x0e, 0x32, 0xdc, 0x16, - 0x52, 0xf9, 0x09, 0x5e, 0xdf, 0xec, 0x6b, 0x93, 0xe0, 0x57, 0x52, 0x5b, - 0x08, 0xd1, 0xeb, 0x97, 0x78, 0x68, 0xbb, 0x10, 0x39, 0x7d, 0x68, 0x9a, - 0x3b, 0x85, 0xa6, 0x88, 0x41, 0xd8, 0x32, 0x40, 0x3c, 0x29, 0x2d, 0x63, - 0x5c, 0x5d, 0xf4, 0xea, 0x2b, 0xbc, 0x94, 0x37, 0xae, 0x95, 0xed, 0x7e, - 0x4a, 0x39, 0x78, 0x39, 0x6e, 0x2b, 0x8c, 0x91, 0xaf, 0xb7, 0x42, 0xf1, - 0x08, 0xb7, 0x09, 0x9b, 0xa6, 0x4e, 0x67, 0x35, 0x7a, 0x52, 0xaa, 0x83, - 0x2a, 0x6a, 0x7f, 0x34, 0xfb, 0x6f, 0xa7, 0x09, 0x40, 0xd1, 0xa5, 0x48, - 0x66, 0xe7, 0x34, 0xe4, 0xab, 0xa5, 0xf2, 0x72, 0x32, 0xfb, 0xa4, 0x2d, - 0xcf, 0xd7, 0xe4, 0xe2, 0x76, 0x04, 0x58, 0x67, 0x0f, 0x8c, 0x87, 0x29, - 0x6b, 0x7e, 0x27, 0x57, 0x29, 0xaa, 0x94, 0xae, 0x11, 0xe4, 0x89, 0x6e, - 0x23, 0xf7, 0x8e, 0xf5, 0x4c, 0x7d, 0x59, 0x17, 0x43, 0xca, 0xda, 0x66, - 0xc6, 0x39, 0x6f, 0xcf, 0xf0, 0x29, 0xae, 0x1b, 0x69, 0x65, 0x7f, 0x80, - 0x69, 0xaa, 0x4d, 0xda, 0xf5, 0x66, 0x61, 0xa6, 0xef, 0x3b, 0x82, 0x71, - 0xb1, 0xab, 0xca, 0xc9, 0xa6, 0x62, 0x9e, 0xae, 0xf4, 0xdf, 0x2e, 0x27, - 0xcf, 0x88, 0xc2, 0x79, 0xdf, 0x8c, 0x4d, 0xfa, 0x0b, 0xf3, 0xd0, 0xa7, - 0x7a, 0x68, 0xe1, 0xfa, 0x2f, 0xd4, 0xe7, 0x51, 0x2e, 0xb2, 0xe4, 0x1d, - 0xab, 0xf8, 0x70, 0x22, 0xf1, 0xc5, 0x7f, 0xeb, 0x06, 0x44, 0x08, 0x92, - 0x8f, 0x95, 0xe1, 0xc3, 0xdb, 0xf8, 0x78, 0xfa, 0x71, 0x01, 0xb9, 0x47, - 0xfb, 0xb1, 0xe4, 0x81, 0x16, 0x2b, 0x06, 0xbd, 0x7c, 0xce, 0x7a, 0x34, - 0x76, 0x40, 0x86, 0x59, 0xb7, 0x1f, 0xfc, 0x05, 0x93, 0x8d, 0x85, 0x12, - 0x5a, 0x52, 0xf2, 0xb5, 0xe8, 0xa7, 0x9e, 0x08, 0x80, 0xb5, 0xdd, 0x6f, - 0xf4, 0xbd, 0xbc, 0x11, 0x54, 0xb0, 0x11, 0x5a, 0x4a, 0xf8, 0x59, 0x2f, - 0xa1, 0x02, 0x43, 0x65, 0xbf, 0xe7, 0xb2, 0x73, 0x8d, 0xe3, 0xd1, 0xa3, - 0xcd, 0xa4, 0xd9, 0xd2, 0xba, 0xb8, 0x94, 0x2c, 0x6e, 0xa2, 0x0b, 0x41, - 0x3c, 0xab, 0xca, 0xa6, 0x7d, 0x91, 0x8c, 0x8d, 0xdb, 0x3b, 0xe8, 0xb7, - 0xbe, 0x14, 0xf1, 0xdc, 0x31, 0x40, 0xec, 0xbd, 0x4e, 0x6c, 0x94, 0x20, - 0x73, 0x03, 0x1a, 0x1c, 0xad, 0x8c, 0x76, 0x5f, 0x5d, 0x22, 0xc0, 0x17, - 0xd5, 0xea, 0xd8, 0x0c, 0xee, 0xcc, 0x14, 0x20, 0xe0, 0x8e, 0xf7, 0x9b, - 0xcf, 0x88, 0xc7, 0xc0, 0x0d, 0xfc, 0x81, 0xac, 0x58, 0x7a, 0xbe, 0xd3, - 0x8c, 0xe1, 0xaa, 0xab, 0xc3, 0x0f, 0xfd, 0x9c, 0xee, 0x84, 0xc3, 0xd9, - 0x06, 0x84, 0xaa, 0x08, 0x23, 0xd2, 0x6f, 0x4f, 0xfb, 0xd7, 0xf1, 0xa3, - 0xac, 0x74, 0xc3, 0x5d, 0xcd, 0x3a, 0x87, 0xa7, 0x62, 0x16, 0x81, 0xb8, - 0x3b, 0x22, 0xa0, 0xd8, 0x64, 0x1e, 0x92, 0xa3, 0x23, 0xce, 0x3f, 0x50, - 0xc7, 0x0a, 0x22, 0x1f, 0x2e, 0xe3, 0x85, 0xca, 0xb8, 0x2e, 0x04, 0xb8, - 0x8b, 0xbd, 0xe9, 0xc0, 0xc3, 0xd9, 0x8b, 0xe2, 0x69, 0x67, 0x6d, 0x3b, - 0x5b, 0x99, 0xe1, 0xab, 0x2d, 0x59, 0xca, 0xcb, 0x49, 0x3f, 0xcb, 0x59, - 0xa6, 0x33, 0x54, 0x28, 0x4c, 0x6b, 0xad, 0x45, 0xf4, 0x9f, 0x42, 0xe6, - 0x8d, 0xb0, 0x4c, 0x7b, 0x46, 0x69, 0xbc, 0x63, 0xd3, 0x05, 0x2c, 0x62, - 0xe1, 0xb4, 0x42, 0xeb, 0x69, 0xee, 0x92, 0xd9, 0x38, 0xcb, 0xaf, 0x29, - 0x29, 0x5c, 0x40, 0x6b, 0xfd, 0x39, 0x73, 0x59, 0x8d, 0x7a, 0xad, 0xf2, - 0x71, 0xfa, 0x3e, 0xfa, 0x95, 0x34, 0xb5, 0x78, 0xfb, 0x45, 0x59, 0x8e, - 0xd8, 0x9e, 0x94, 0x42, 0x7f, 0xad, 0xa3, 0x80, 0x10, 0xe8, 0xf7, 0x4f, - 0xcb, 0x77, 0x2d, 0xcd, 0xd4, 0x22, 0x63, 0xc8, 0x11, 0xec, 0xea, 0x62, - 0x6f, 0x13, 0x07, 0x1e, 0x40, 0x77, 0xfe, 0xcc, 0x41, 0xb6, 0xc9, 0x59, - 0x5e, 0x26, 0xec, 0x50, 0x06, 0x62, 0x49, 0x9f, 0xc9, 0xfd, 0xb5, 0x7e, - 0xa8, 0x46, 0xb1, 0xcb, 0x23, 0x43, 0xcc, 0x79, 0x49, 0x52, 0x70, 0x32, - 0x87, 0x6a, 0x0b, 0x85, 0x00, 0x0d, 0xbc, 0x7e, 0x65, 0xb6, 0x8f, 0xee, - 0xe5, 0xb4, 0xa0, 0x75, 0xc3, 0x30, 0x21, 0x76, 0x12, 0x53, 0x6f, 0xb6, - 0xf5, 0xf2, 0x82, 0x68, 0xb0, 0x3a, 0xe0, 0xb1, 0x86, 0x00, 0x85, 0x6d, - 0x47, 0x23, 0xd9, 0x43, 0xa8, 0x6c, 0x96, 0xb4, 0xf3, 0xea, 0xdd, 0x1d, - 0x0a, 0x44, 0x0d, 0x5f, 0xde, 0x7c, 0xe7, 0x84, 0x0a, 0xab, 0xa3, 0xd3, - 0xd9, 0x23, 0x69, 0xf8, 0xb0, 0xf9, 0x53, 0x2b, 0x28, 0x11, 0xa2, 0x79, - 0xb9, 0x50, 0x86, 0x59, 0x05, 0x62, 0x23, 0xb3, 0x32, 0x01, 0x6f, 0xc0, - 0xf2, 0xf6, 0x39, 0xca, 0x2e, 0xdc, 0x2f, 0xcc, 0x46, 0xc9, 0x69, 0x32, - 0xc0, 0x13, 0x35, 0xf0, 0xf5, 0xd9, 0xae, 0xfe, 0x70, 0xb5, 0xf1, 0xd9, - 0x82, 0x57, 0x6f, 0x75, 0xfa, 0x52, 0xe9, 0x9e, 0xe6, 0x31, 0xfe, 0xc4, - 0x88, 0x50, 0x27, 0x38, 0xe8, 0x8c, 0x04, 0x3e, 0xe3, 0x35, 0x9f, 0xfd, - 0xff, 0x14, 0x28, 0x0d, 0x73, 0x64, 0xc8, 0x11, 0xb1, 0xa6, 0xcd, 0x8a, - 0x08, 0x60, 0x25, 0xd2, 0x2a, 0xce, 0x1c, 0xe4, 0x96, 0x76, 0xd3, 0x5c, - 0xb7, 0xbf, 0xfe, 0x14, 0xa7, 0xb5, 0xd1, 0x7f, 0x74, 0x21, 0x4e, 0x6b, - 0x4d, 0xf5, 0xd4, 0xdb, 0x75, 0x73, 0xae, 0x24, 0x57, 0x4f, 0x7c, 0xf8, - 0x61, 0x76, 0xc6, 0x6d, 0xa6, 0x17, 0x64, 0xb0, 0x58, 0x57, 0xd5, 0x91, - 0x72, 0x50, 0x78, 0xec, 0x85, 0x1e, 0x8a, 0x73, 0x6c, 0xa1, 0x18, 0x66, - 0x0e, 0x88, 0x9e, 0x81, 0x46, 0x16, 0x0c, 0xd4, 0x28, 0x0c, 0xca, 0x26, - 0x6f, 0x76, 0xfb, 0xd3, 0x48, 0x88, 0x49, 0x5f, 0xae, 0xab, 0xf8, 0x23, - 0x3e, 0x05, 0xbe, 0xa5, 0x33, 0x22, 0x02, 0xc4, 0x42, 0xab, 0x12, 0xff, - 0xba, 0x38, 0x66, 0x08, 0x53, 0xa1, 0x93, 0x29, 0x44, 0xed, 0x2f, 0x11, - 0x38, 0x0f, 0x1f, 0x40, 0x88, 0x86, 0xac, 0x2e, 0x40, 0x3f, 0x6e, 0x11, - 0xbf, 0x06, 0x6a, 0x10, 0x92, 0x8a, 0x9a, 0xfa, 0xfd, 0xa7, 0xef, 0x1c, - 0x07, 0x86, 0x70, 0xbf, 0xd0, 0x24, 0xe5, 0x4e, 0x50, 0x4e, 0xb4, 0xe7, - 0x18, 0x17, 0x26, 0x55, 0x81, 0x9a, 0xb7, 0x0c, 0x02, 0xa5, 0x95, 0x5f, - 0xfa, 0x22, 0x50, 0x5b, 0xe0, 0x20, 0x2b, 0xe8, 0x7a, 0xcb, 0x98, 0xc3, - 0x55, 0xcb, 0x0a, 0xd6, 0x68, 0x93, 0xe2, 0xb7, 0xa7, 0xbc, 0x3a, 0xee, - 0x86, 0x7c, 0x36, 0x88, 0x19, 0x57, 0xb6, 0x89, 0x01, 0x91, 0x3d, 0xf3, - 0xa1, 0xda, 0x31, 0x2e, 0x62, 0x34, 0xba, 0xdf, 0xfd, 0x80, 0x34, 0x75, - 0x35, 0x1c, 0x9d, 0x57, 0x28, 0x42, 0x01, 0xd0, 0x35, 0x0b, 0x41, 0x9e, - 0xce, 0x97, 0xa8, 0x3c, 0xb5, 0x8d, 0x16, 0xe8, 0x91, 0x92, 0xca, 0xd0, - 0x12, 0xde, 0xf2, 0x37, 0x87, 0xde, 0x6b, 0xba, 0xc7, 0x35, 0xce, 0xa4, - 0xa0, 0xbe, 0x75, 0xfe, 0xf0, 0x0a, 0xb4, 0xc2, 0x9b, 0x1e, 0x24, 0x78, - 0xb3, 0xdc, 0xfb, 0x3f, 0x3e, 0xac, 0x7a, 0x09, 0xee, 0x2d, 0x79, 0xc6, - 0x64, 0xb9, 0xb7, 0xb2, 0xb9, 0xfb, 0xa0, 0xff, 0xff, 0x3f, 0x79, 0xa5, - 0xd5, 0x93, 0x26, 0xfa, 0x6b, 0xfe, 0x83, 0x29, 0x6e, 0x8d, 0x9d, 0xe9, - 0x79, 0x30, 0xa5, 0xd7, 0x30, 0x72, 0xc5, 0xa1, 0xb8, 0xf0, 0x52, 0x4d, - 0xca, 0x39, 0x78, 0x24, 0x3c, 0xcb, 0x7c, 0x15, 0xb7, 0x51, 0x39, 0x50, - 0x50, 0x4d, 0x60, 0x91, 0xd9, 0x43, 0xa1, 0x4e, 0xbe, 0x0c, 0xac, 0x86, - 0xf7, 0xb8, 0x6e, 0xbe, 0xe5, 0x79, 0x3b, 0x0c, 0xc2, 0xff, 0xb6, 0xc7, - 0x8e, 0x67, 0xba, 0x44, 0x39, 0xd3, 0xbb, 0x51, 0x0f, 0xc4, 0x3d, 0xe9, - 0x2f, 0xa8, 0xa1, 0x08, 0x90, 0x90, 0x15, 0x28, 0x9a, 0xab, 0xbf, 0x47, - 0x40, 0x3e, 0xe2, 0xd7, 0x9b, 0x59, 0x38, 0xe4, 0x27, 0x52, 0x4a, 0xc7, - 0x78, 0x51, 0xe2, 0xe4, 0xc6, 0x04, 0xb4, 0x5e, 0x0e, 0x6c, 0x4e, 0x31, - 0x30, 0x4e, 0x73, 0x0b, 0xae, 0xe4, 0x68, 0xc0, 0xdd, 0xd1, 0x9f, 0xc1, - 0x67, 0x3d, 0xb5, 0x5a, 0x99, 0x2b, 0x2e, 0xd6, 0x89, 0x01, 0x55, 0x16, - 0x0a, 0x03, 0x79, 0xaf, 0x9f, 0x8f, 0x7a, 0x09, 0xda, 0x20, 0x82, 0xc1, - 0x35, 0xb4, 0x8d, 0x47, 0xb9, 0x69, 0x3c, 0x88, 0x2c, 0xe6, 0x03, 0x98, - 0x23, 0x55, 0x18, 0xe3, 0x9f, 0x55, 0x82, 0xfa, 0x3c, 0xd1, 0xef, 0xa6, - 0x6c, 0xdb, 0xf4, 0x5d, 0xf7, 0x04, 0xf6, 0xb5, 0xa6, 0x80, 0xbb, 0xee, - 0x5b, 0x2c, 0x41, 0x35, 0x36, 0xba, 0xae, 0xb4, 0x2b, 0x25, 0x4d, 0x7b, - 0xd8, 0x68, 0xc3, 0x47, 0x0c, 0xb3, 0x24, 0x04, 0xbf, 0x27, 0x08, 0xe5, - 0x80, 0x86, 0xbf, 0xf2, 0x41, 0x6b, 0xb9, 0x5c, 0xfb, 0xca, 0x29, 0x8f, - 0xf4, 0x14, 0x65, 0xab, 0x27, 0x0d, 0x4c, 0xaf, 0xc5, 0xe4, 0x25, 0x29, - 0x31, 0x42, 0x65, 0x08, 0x34, 0x51, 0xab, 0x44, 0x26, 0x94, 0x0a, 0xfe, - 0x45, 0xf6, 0x9b, 0xc7, 0x9b, 0x9e, 0x21, 0x06, 0x9d, 0x4d, 0xd9, 0x09, - 0x7b, 0xc3, 0x4c, 0xff, 0x62, 0xfe, 0x59, 0x23, 0x51, 0xbc, 0x58, 0x16, - 0x10, 0xea, 0xd6, 0xfd, 0xbd, 0x01, 0x31, 0x0e, 0x9b, 0x1d, 0x4c, 0xb5, - 0x7f, 0x39, 0x28, 0x1d, 0xa7, 0x5d, 0x3f, 0x80, 0x99, 0x0d, 0x7e, 0xd2, - 0xf4, 0x43, 0xf2, 0x91, 0xb9, 0x75, 0x4f, 0x41, 0x80, 0xae, 0x32, 0x9a, - 0x66, 0x2b, 0x4d, 0xa2, 0x84, 0x6a, 0x20, 0x7b, 0xd7, 0xca, 0xc7, 0x22, - 0x46, 0x49, 0xd3, 0x37, 0x69, 0x38, 0xb6, 0xce, 0x33, 0xa1, 0x8f, 0x59, - 0x14, 0x05, 0x00, 0xb9, 0xf1, 0x2f, 0x94, 0x85, 0x52, 0x0c, 0xfd, 0xf0, - 0x43, 0xea, 0x97, 0xc8, 0x88, 0xb0, 0xbc, 0xa5, 0xc3, 0x43, 0x73, 0x30, - 0x34, 0x4e, 0x59, 0x09, 0x6f, 0xf4, 0x14, 0x50, 0x99, 0x9e, 0x29, 0xcb, - 0x10, 0xc6, 0xb1, 0x84, 0x2b, 0x87, 0xb5, 0x96, 0x3a, 0xa8, 0x76, 0xa6, - 0x8e, 0xc8, 0xc9, 0xef, 0xd4, 0xe5, 0x22, 0x0a, 0x17, 0x4c, 0x6c, 0x6b, - 0xa5, 0x18, 0x0f, 0xd2, 0xf0, 0x5c, 0xd0, 0x34, 0x1c, 0xa5, 0xdc, 0xd4, - 0xcb, 0x1e, 0x44, 0xf4, 0x8f, 0xe2, 0x19, 0x06, 0x18, 0xf4, 0xc7, 0x81, - 0x5c, 0x30, 0xcf, 0x4b, 0xed, 0x91, 0x12, 0x91, 0x2e, 0x42, 0x43, 0x47, - 0xe7, 0x0e, 0x33, 0x87, 0x22, 0x5a, 0xf0, 0xeb, 0xc0, 0x55, 0xd5, 0x6a, - 0xd8, 0x61, 0xca, 0x3d, 0x22, 0x6c, 0x0d, 0xaf, 0x11, 0xf3, 0xec, 0x8f, - 0x15, 0x47, 0x27, 0x71, 0x8a, 0x0c, 0x3a, 0x63, 0xa4, 0x53, 0xd9, 0xe0, - 0xcf, 0x99, 0x3d, 0xb4, 0x5e, 0xf3, 0xbf, 0x20, 0x17, 0x52, 0xbd, 0x6c, - 0x26, 0xb9, 0xdb, 0x26, 0x64, 0xc0, 0x69, 0x6b, 0xdb, 0xca, 0xf0, 0xe3, - 0xb5, 0x4a, 0xf9, 0xd5, 0xaf, 0x01, 0xe5, 0x96, 0x52, 0x6f, 0x75, 0xb7, - 0x33, 0x7e, 0xa6, 0x55, 0x68, 0xb6, 0x14, 0x21, 0xcd, 0x65, 0xdb, 0xc9, - 0xbd, 0x56, 0x74, 0x20, 0x88, 0xfb, 0xa3, 0xad, 0xc9, 0x7d, 0xc3, 0xdb, - 0xb6, 0x37, 0xec, 0xc8, 0x0b, 0x3b, 0x46, 0xe3, 0x19, 0xbb, 0x98, 0xdb, - 0x18, 0xfa, 0xf3, 0x05, 0xf3, 0x3c, 0x7d, 0x5e, 0x5c, 0xa1, 0x3a, 0x35, - 0xde, 0x62, 0xcb, 0x13, 0xbd, 0xe6, 0x10, 0xbf, 0x34, 0xd6, 0x8d, 0xa4, - 0x9d, 0xa9, 0x7c, 0xf4, 0x68, 0xda, 0x12, 0xfb, 0xac, 0x5b, 0xf8, 0xdd, - 0x1e, 0xff, 0xdc, 0x7f, 0x0d, 0x39, 0x75, 0x27, 0x18, 0x27, 0x81, 0x83, - 0x66, 0x66, 0x44, 0xf0, 0x5b, 0xb4, 0xff, 0xe4, 0x54, 0x0f, 0x0b, 0xdf, - 0xb4, 0x68, 0xcb, 0x26, 0xca, 0xae, 0xdc, 0x5a, 0xad, 0x0c, 0xe3, 0x2f, - 0x9a, 0xfa, 0xbc, 0x4b, 0x1c, 0x46, 0x08, 0xb8, 0x09, 0x35, 0xdf, 0xde, - 0xcb, 0xf0, 0x78, 0x3d, 0x5f, 0x4d, 0xc1, 0xbf, 0xfe, 0x60, 0xcd, 0xc8, - 0xdf, 0xda, 0x5b, 0x73, 0x65, 0x62, 0x37, 0x0a, 0xe2, 0x42, 0x17, 0xaa, - 0xa7, 0x69, 0x3b, 0x4d, 0xd7, 0x65, 0x79, 0x98, 0xae, 0x7f, 0x75, 0x8f, - 0x62, 0xb4, 0xbc, 0xf2, 0x69, 0xe2, 0x14, 0xd5, 0x6a, 0x68, 0x78, 0xaa, - 0x2c, 0xef, 0x68, 0xbf, 0xc5, 0x13, 0x09, 0xae, 0x79, 0x10, 0x63, 0x4b, - 0x44, 0x4c, 0x9c, 0x4a, 0x88, 0x5f, 0x89, 0x42, 0x40, 0xcb, 0xc8, 0xd0, - 0x9e, 0x54, 0x74, 0x6f, 0xea, 0x69, 0x2f, 0x52, 0x56, 0x13, 0x02, 0x90, - 0xcd, 0xfb, 0x71, 0x90, 0xe6, 0x26, 0x0d, 0x62, 0xa3, 0x26, 0xc3, 0x6d, - 0xbe, 0x3b, 0xe7, 0xac, 0x33, 0xc8, 0x4b, 0xd3, 0x0f, 0xae, 0x4f, 0xf2, - 0x05, 0x02, 0xa0, 0x2a, 0x65, 0xd4, 0x0f, 0xf0, 0xab, 0xb7, 0xfd, 0xc3, - 0xa4, 0xf7, 0xf2, 0x23, 0x59, 0x64, 0xae, 0x6d, 0x6e, 0x36, 0x15, 0xe9, - 0x1c, 0xa9, 0x96, 0x64, 0xc5, 0xcb, 0xa7, 0xb8, 0x26, 0x53, 0x97, 0xbb, - 0x9a, 0x22, 0x8a, 0x6e, 0x1f, 0x68, 0xbc, 0x7a, 0x30, 0x70, 0xea, 0x73, - 0xc7, 0x38, 0x70, 0xf5, 0x21, 0x36, 0x15, 0x63, 0x7a, 0x24, 0x2e, 0x2f, - 0x1d, 0x5d, 0xcb, 0x56, 0x44, 0x90, 0xa3, 0x78, 0x7c, 0x58, 0xc2, 0xf5, - 0x79, 0x3d, 0x99, 0x23, 0xc5, 0x2e, 0x0f, 0x90, 0xd5, 0x61, 0x76, 0x76, - 0x24, 0x2e, 0xbc, 0xfa, 0x9c, 0x7a, 0xad, 0xda, 0x0c, 0x4c, 0x21, 0x16, - 0x84, 0xfb, 0x64, 0xee, 0x18, 0x2e, 0x05, 0xe8, 0xc1, 0x88, 0x0f, 0xac, - 0x97, 0x40, 0x84, 0x94, 0x82, 0xf1, 0xf7, 0x6d, 0x1c, 0x1e, 0x24, 0x07, - 0x7f, 0x5d, 0x26, 0xea, 0xae, 0xbc, 0xc6, 0x3e, 0xe8, 0xdc, 0x4f, 0xf9, - 0x62, 0x96, 0xda, 0xc3, 0x78, 0x72, 0x3f, 0xa7, 0xe5, 0x2f, 0xb4, 0x25, - 0x00, 0x31, 0xd8, 0xa2, 0x65, 0x11, 0x1b, 0xe5, 0x2f, 0x37, 0xb1, 0x36, - 0x0c, 0x13, 0xa0, 0x42, 0x6a, 0xe5, 0x19, 0x55, 0x44, 0xd7, 0xb5, 0x1a, - 0xdd, 0x76, 0x1b, 0x2e, 0xe9, 0x10, 0x7e, 0xfc, 0xe3, 0xa4, 0x8d, 0x4a, - 0x8e, 0x02, 0x0d, 0x6e, 0xe4, 0x44, 0x6c, 0x51, 0x26, 0x7a, 0x30, 0x03, - 0x15, 0xce, 0xc7, 0x24, 0x02, 0xce, 0x7f, 0x9e, 0xed, 0x4b, 0x2a, 0xaf, - 0xab, 0x06, 0x3a, 0x7e, 0x7e, 0xed, 0x10, 0x76, 0xa6, 0x3d, 0xee, 0x11, - 0x8f, 0x7c, 0x15, 0xaa, 0x0a, 0x87, 0x8a, 0x20, 0x26, 0x21, 0xb5, 0x37, - 0xc2, 0x9d, 0xda, 0x61, 0x32, 0xf9, 0x94, 0xc0, 0xfa, 0xca, 0x43, 0x1c, - 0xb3, 0xd6, 0x97, 0x1f, 0xb6, 0xdc, 0xe4, 0xb6, 0x44, 0x00, 0x82, 0xc9, - 0x26, 0xc1, 0xb3, 0xbf, 0x91, 0x45, 0xc9, 0x4c, 0x78, 0x33, 0x9f, 0xe3, - 0xec, 0x5e, 0xe0, 0x2c, 0x0c, 0x4e, 0x88, 0x0a, 0x20, 0x43, 0x10, 0xf0, - 0x1e, 0xeb, 0xea, 0x59, 0x55, 0xa2, 0xc5, 0x7d, 0xbd, 0xcb, 0x12, 0x50, - 0x26, 0xee, 0xda, 0xf9, 0xc4, 0x33, 0xc7, 0x59, 0xbe, 0xb6, 0x7e, 0x7e, - 0x0a, 0x08, 0xd7, 0x6c, 0xab, 0x20, 0x53, 0x68, 0x67, 0x98, 0x88, 0xfe, - 0x0c, 0x10, 0x60, 0x4a, 0x36, 0xf6, 0xef, 0x94, 0xf0, 0x95, 0x53, 0x21, - 0x8d, 0x77, 0x64, 0x54, 0x55, 0x04, 0x72, 0x17, 0xc8, 0x88, 0x4e, 0x04, - 0x34, 0x0a, 0x0d, 0x6b, 0x6c, 0xc3, 0x17, 0x96, 0xb0, 0xc7, 0x3f, 0x93, - 0x1b, 0xa0, 0x92, 0xdf, 0xeb, 0x81, 0xd9, 0xd0, 0x9c, 0x73, 0xa0, 0xde, - 0x3b, 0xa9, 0x49, 0xe7, 0x92, 0x09, 0x49, 0xef, 0x84, 0xc5, 0x7f, 0x61, - 0xcd, 0x21, 0x54, 0x1b, 0xc1, 0x2a, 0xae, 0xc6, 0xf9, 0x43, 0x18, 0xb1, - 0xfc, 0x74, 0xef, 0x22, 0x63, 0x8a, 0x04, 0xbd, 0x4a, 0x2a, 0x32, 0xfc, - 0x97, 0x23, 0x2a, 0xc8, 0x0f, 0x9c, 0x0d, 0xc3, 0x50, 0xbc, 0xdd, 0xa4, - 0x30, 0x62, 0x1e, 0x45, 0x82, 0xe2, 0xd0, 0x98, 0x00, 0x06, 0x9b, 0x5b, - 0x23, 0xf5, 0x1e, 0x48, 0x16, 0x23, 0x6f, 0x3f, 0x77, 0xde, 0x34, 0x18, - 0xd4, 0xed, 0x34, 0x74, 0xac, 0xaa, 0x0f, 0x3f, 0xf1, 0x84, 0x86, 0x30, - 0xc0, 0xee, 0xf5, 0x19, 0x40, 0x36, 0xd7, 0x4c, 0x8f, 0x12, 0x48, 0x28, - 0x05, 0xfb, 0x6e, 0x8d, 0xca, 0x2f, 0xa3, 0x75, 0x39, 0x11, 0x9e, 0xda, - 0x37, 0x6f, 0x7f, 0x70, 0xff, 0x69, 0xc3, 0x6f, 0x1c, 0xe0, 0x32, 0xc0, - 0x8a, 0x9b, 0x5b, 0xac, 0xd5, 0x45, 0x39, 0xca, 0x8b, 0x8e, 0xa4, 0x66, - 0x8f, 0x75, 0x16, 0x30, 0x19, 0x06, 0x15, 0x98, 0xdc, 0xbe, 0xe2, 0x33, - 0x80, 0x66, 0x9b, 0x91, 0xdb, 0x5e, 0xf3, 0xaf, 0xdd, 0xe7, 0x5e, 0x76, - 0x4b, 0xa0, 0x39, 0x1d, 0x03, 0xf2, 0xdc, 0xe6, 0xe3, 0x1a, 0xd9, 0x91, - 0xf2, 0xa4, 0xc4, 0x29, 0xce, 0x15, 0xad, 0xaa, 0x1a, 0x8c, 0x43, 0x39, - 0x84, 0xf7, 0x41, 0xe7, 0xbf, 0x93, 0x39, 0x8e, 0xc7, 0xc1, 0xb2, 0x51, - 0xfe, 0x01, 0x15, 0x3a, 0x47, 0x0d, 0x0b, 0xde, 0xf3, 0x62, 0x85, 0xfc, - 0x20, 0x6c, 0x31, 0x02, 0x30, 0x8f, 0xf7, 0xd6, 0x71, 0x48, 0xb9, 0xe8, - 0x71, 0x7b, 0x98, 0xff, 0x62, 0x11, 0x0d, 0xbc, 0x32, 0x1b, 0x55, 0xe0, - 0x88, 0x0e, 0xe3, 0x90, 0x52, 0x6b, 0x99, 0x35, 0x59, 0x7e, 0x86, 0x62, - 0x44, 0x4a, 0xa9, 0x3b, 0xcf, 0x12, 0x8d, 0x67, 0xde, 0x42, 0xfd, 0xe5, - 0x1a, 0xc3, 0x4c, 0xea, 0x20, 0x92, 0x0f, 0xca, 0xda, 0xc7, 0x15, 0xbb, - 0x8d, 0x05, 0x58, 0xe3, 0x8c, 0x44, 0x44, 0xb9, 0x66, 0x6d, 0x78, 0x43, - 0x9e, 0xc5, 0x27, 0x7f, 0x03, 0x7f, 0x10, 0xd8, 0x8e, 0x4f, 0xc5, 0x45, - 0xc5, 0xb1, 0xf3, 0x11, 0xb4, 0xef, 0x20, 0xcb, 0xd8, 0xbb, 0x5b, 0xd6, - 0x10, 0x8d, 0x55, 0xc7, 0x3b, 0x98, 0xb5, 0x02, 0x60, 0xa4, 0x5d, 0xe7, - 0x93, 0x9c, 0x16, 0x33, 0x06, 0xc5, 0x13, 0x77, 0x9e, 0x50, 0x4a, 0x36, - 0xf1, 0x31, 0x18, 0x94, 0x54, 0x9a, 0xa9, 0x19, 0xed, 0xb9, 0xbb, 0x4b, - 0xd8, 0xb8, 0xd8, 0xc2, 0xee, 0x33, 0x1a, 0x04, 0xc5, 0x73, 0x72, 0xcc, - 0xd0, 0x6e, 0x3d, 0x4d, 0xc9, 0xba, 0x1a, 0xe6, 0x87, 0x4e, 0xb0, 0x57, - 0x98, 0xd9, 0x81, 0xb1, 0x3b, 0xd0, 0x61, 0x4a, 0xbe, 0xc6, 0xb0, 0x90, - 0xeb, 0x52, 0x62, 0x0e, 0x6e, 0xae, 0x1e, 0x95, 0xf1, 0x3f, 0x66, 0xa1, - 0x53, 0x2b, 0x1f, 0x2c, 0x9c, 0x75, 0x98, 0xc5, 0xb2, 0xce, 0xf7, 0x62, - 0xfa, 0x8d, 0x30, 0x79, 0x81, 0x30, 0x4d, 0x16, 0x92, 0x00, 0xff, 0x61, - 0xd1, 0xc5, 0x90, 0xe7, 0xd5, 0x1f, 0x99, 0x60, 0xde, 0x57, 0x83, 0x0e, - 0x37, 0xa9, 0x5b, 0x28, 0x16, 0xaf, 0x8c, 0x3a, 0xe5, 0xaa, 0x20, 0x20, - 0xfb, 0xf7, 0x65, 0x41, 0x4c, 0xae, 0x9d, 0x31, 0x9f, 0x47, 0xe6, 0x76, - 0x49, 0xf3, 0x57, 0x12, 0x2b, 0x25, 0x81, 0x56, 0xca, 0x52, 0xf7, 0x2c, - 0xd5, 0xc0, 0x49, 0x23, 0xaf, 0xd4, 0x43, 0xeb, 0x05, 0xe3, 0xa9, 0x15, - 0xf6, 0xb8, 0x06, 0xc5, 0xfc, 0xd1, 0x32, 0x46, 0x67, 0xf3, 0x08, 0x71, - 0x30, 0xc2, 0x98, 0x7a, 0x51, 0x43, 0x65, 0x6a, 0xf5, 0xe7, 0x88, 0xe0, - 0xb8, 0xf7, 0x2f, 0x43, 0x76, 0xfc, 0x58, 0x38, 0x16, 0xd1, 0x4a, 0x1a, - 0x9d, 0xea, 0x13, 0xb8, 0x11, 0x5b, 0x8d, 0x4d, 0x45, 0x56, 0xca, 0xf8, - 0xec, 0x87, 0xbd, 0x7d, 0x1f, 0x69, 0xbe, 0x5c, 0xc2, 0x27, 0x8d, 0x14, - 0xe9, 0xb3, 0xac, 0x43, 0xfc, 0xf4, 0x41, 0x0f, 0x8b, 0x83, 0x2c, 0xf9, - 0xc9, 0xfc, 0xa9, 0xc9, 0x19, 0xc1, 0xa7, 0x69, 0x25, 0x55, 0xa9, 0x92, - 0x0b, 0x4b, 0x60, 0xbb, 0x59, 0xe6, 0xd8, 0xa4, 0x4c, 0x9f, 0x19, 0x50, - 0xff, 0x49, 0xb6, 0xfa, 0x43, 0xb1, 0xde, 0x3e, 0xc2, 0x4b, 0xf9, 0x1f, - 0xe9, 0xed, 0xd6, 0x32, 0xc1, 0x14, 0xf9, 0x49, 0xb2, 0x47, 0x20, 0x94, - 0xfd, 0xe7, 0x21, 0x9f, 0x26, 0x75, 0xcb, 0xf3, 0x1b, 0x56, 0x83, 0x0e, - 0x51, 0x44, 0x6a, 0xc0, 0x82, 0x67, 0x59, 0x22, 0x0e, 0xa1, 0x37, 0x82, - 0x46, 0x27, 0xcb, 0xcd, 0xd5, 0xc6, 0x70, 0x46, 0x88, 0xf5, 0x03, 0x5f, - 0x1d, 0xfe, 0xeb, 0xa8, 0xe0, 0xd5, 0x17, 0x84, 0x2a, 0xef, 0x10, 0x2e, - 0x0a, 0x5b, 0x98, 0x83, 0xc0, 0x3b, 0x71, 0x7c, 0xfe, 0xeb, 0xc2, 0x42, - 0x9b, 0x13, 0xce, 0xbd, 0x27, 0xdd, 0x23, 0x00, 0x1c, 0x6c, 0x07, 0xbd, - 0xf0, 0x7b, 0xf1, 0x17, 0x11, 0xa7, 0x7b, 0xce, 0xbd, 0x4f, 0x00, 0x4f, - 0xa0, 0x1b, 0xa9, 0xd3, 0xc8, 0x22, 0x6a, 0xe7, 0x1b, 0x4b, 0x88, 0x73, - 0x94, 0x58, 0xe1, 0x01, 0xba, 0x24, 0x53, 0x68, 0x97, 0xbe, 0x91, 0xd3, - 0x22, 0xec, 0x5a, 0xb4, 0x12, 0x1b, 0x2e, 0x33, 0xeb, 0xf5, 0x31, 0xe9, - 0x90, 0xb4, 0xec, 0x7b, 0x83, 0xe5, 0x57, 0x93, 0x15, 0x02, 0xfa, 0xb2, - 0x8d, 0xc8, 0xab, 0xa8, 0xae, 0x20, 0xd2, 0xf1, 0x7e, 0xf8, 0xcc, 0x46, - 0x24, 0x19, 0xf9, 0x17, 0xd7, 0x6b, 0xe0, 0x2e, 0x22, 0xe0, 0x13, 0x35, - 0xf9, 0xfa, 0x21, 0x86, 0x97, 0x6f, 0x69, 0xf1, 0xbc, 0xff, 0x5f, 0x75, - 0xab, 0x50, 0x26, 0xa2, 0x53, 0x62, 0x0c, 0x4d, 0x4b, 0xa6, 0x48, 0xf1, - 0x2b, 0xfa, 0xff, 0x68, 0x85, 0x12, 0xa5, 0x6b, 0xf6, 0xee, 0xd3, 0xec, - 0x37, 0xac, 0xe2, 0xb3, 0x1f, 0xf7, 0xd9, 0xd2, 0x03, 0x1b, 0xf1, 0x9c, - 0x51, 0x03, 0xa3, 0xa0, 0xbb, 0x0e, 0xf4, 0x2a, 0x8c, 0xea, 0xc3, 0x99, - 0x6a, 0x5c, 0x85, 0x9f, 0xb9, 0xfa, 0x7e, 0xc0, 0xed, 0xb8, 0xdb, 0x2a, - 0x72, 0xb4, 0x98, 0xad, 0x6e, 0xbe, 0xe3, 0x61, 0x01, 0xd7, 0xa7, 0xfb, - 0x54, 0xd4, 0x97, 0xa2, 0xd7, 0x2f, 0x66, 0xdd, 0xa9, 0x1d, 0x7c, 0x95, - 0x49, 0x73, 0x50, 0x12, 0x71, 0xf2, 0x3d, 0x1e, 0xad, 0x12, 0xdb, 0xa0, - 0x47, 0x37, 0xf3, 0x72, 0x2c, 0x32, 0x58, 0xe2, 0x38, 0x6d, 0x34, 0x9d, - 0x88, 0x5f, 0xb9, 0xf1, 0x8a, 0x96, 0xe8, 0x1f, 0x85, 0x7c, 0xfa, 0x71, - 0xb8, 0x0a, 0x24, 0xa9, 0xc3, 0xf8, 0xfa, 0x65, 0x87, 0x1b, 0x4b, 0xb9, - 0xf2, 0xf7, 0x2e, 0xb1, 0x5e, 0x30, 0xc2, 0x6b, 0x6c, 0x0a, 0x17, 0x3f, - 0x77, 0x0c, 0xcd, 0x30, 0x73, 0x40, 0xa1, 0xdc, 0x18, 0xd3, 0xd5, 0x56, - 0x07, 0x8e, 0x72, 0xee, 0xea, 0x85, 0x39, 0x0d, 0xa0, 0x23, 0x58, 0x22, - 0x6b, 0x2a, 0x0b, 0x3d, 0xf1, 0xed, 0x5e, 0x96, 0x69, 0x84, 0x37, 0xd9, - 0x99, 0x80, 0x89, 0xcb, 0x59, 0x68, 0xd4, 0x2e, 0x23, 0xdb, 0xfd, 0x0d, - 0xe7, 0xab, 0xc5, 0x98, 0x05, 0x9d, 0xee, 0x8e, 0x5d, 0xfa, 0x2d, 0x0a, - 0xad, 0x6f, 0x80, 0x52, 0xf0, 0x69, 0x91, 0xfa, 0xc3, 0x90, 0x89, 0x11, - 0xd1, 0xe4, 0xa2, 0x1e, 0x75, 0xb8, 0x6e, 0xc4, 0x1a, 0x4d, 0x5f, 0xb6, - 0x39, 0x21, 0xcb, 0xeb, 0xdb, 0x3d, 0x4f, 0x9a, 0x52, 0x4c, 0x9c, 0x51, - 0x52, 0x28, 0xdc, 0x2a, 0xa1, 0xdc, 0xdc, 0x06, 0xae, 0xe6, 0x6f, 0x91, - 0xb8, 0x5b, 0xb2, 0xad, 0x7d, 0xce, 0xec, 0xba, 0xdd, 0xf3, 0x0e, 0x94, - 0xe9, 0x78, 0x72, 0x25, 0x15, 0x21, 0x2c, 0x6b, 0xca, 0xee, 0xb8, 0xfc, - 0x10, 0x73, 0x67, 0x73, 0xbd, 0x4f, 0x6c, 0x06, 0x90, 0xd7, 0xbc, 0xd7, - 0x7b, 0xf8, 0x25, 0xa4, 0x68, 0x94, 0xd4, 0xe5, 0x56, 0xf0, 0xa1, 0xb5, - 0x9f, 0xf7, 0xa5, 0x3a, 0xd8, 0x30, 0xf1, 0xf9, 0x4a, 0x62, 0x14, 0x62, - 0x80, 0x34, 0xcc, 0xbf, 0x8a, 0xbc, 0x86, 0xa7, 0x28, 0x83, 0x21, 0x98, - 0xb1, 0xc9, 0xdb, 0x1a, 0x2d, 0xd0, 0xe9, 0x9e, 0x3c, 0x21, 0xee, 0x6e, - 0x1a, 0x54, 0x25, 0x11, 0x26, 0x9a, 0xb7, 0x6b, 0x44, 0xb8, 0x46, 0xbd, - 0xf0, 0x25, 0x08, 0xbc, 0x75, 0x19, 0xb3, 0x1a, 0xd3, 0x7f, 0x79, 0x4c, - 0x81, 0x23, 0x42, 0x66, 0xb8, 0x64, 0x13, 0xdf, 0x8e, 0xdc, 0xd6, 0x8f, - 0x07, 0xa1, 0xe1, 0x93, 0x87, 0x9f, 0x8f, 0x37, 0x10, 0xba, 0x28, 0x1e, - 0xde, 0xa7, 0xf3, 0x87, 0x89, 0xcd, 0x89, 0xa2, 0x47, 0x92, 0x18, 0x87, - 0x29, 0x69, 0xc1, 0x88, 0x32, 0xdd, 0x42, 0xae, 0x18, 0xb2, 0x37, 0x5a, - 0xf0, 0x69, 0x9d, 0xce, 0x08, 0xfe, 0x19, 0xcb, 0x90, 0x3f, 0x4f, 0x43, - 0x76, 0x57, 0xb6, 0x25, 0xf4, 0x85, 0x18, 0xa0, 0xe9, 0x79, 0x1a, 0xea, - 0xcb, 0x66, 0x0a, 0x92, 0x1d, 0x82, 0xca, 0x50, 0x63, 0xb7, 0x14, 0x45, - 0xfe, 0xf8, 0x21, 0xa3, 0x3e, 0xe1, 0x5d, 0xd8, 0x6d, 0xdc, 0x7f, 0xb8, - 0x77, 0x08, 0x8b, 0x4b, 0x54, 0x2a, 0xa8, 0xd5, 0xa4, 0xc3, 0x13, 0x80, - 0x1e, 0x06, 0xc3, 0xc4, 0x5e, 0x61, 0xe1, 0x9f, 0x5f, 0x70, 0x9e, 0x77, - 0x30, 0x9a, 0x35, 0x36, 0x32, 0x28, 0x8f, 0xa8, 0x8c, 0x30, 0xbe, 0x60, - 0xdc, 0x75, 0x98, 0x54, 0x94, 0x2c, 0xb8, 0x1b, 0xd4, 0xa6, 0x6a, 0x73, - 0xab, 0x7a, 0x27, 0x7d, 0xef, 0x98, 0x9d, 0xe5, 0xd0, 0x8e, 0x2a, 0x08, - 0x28, 0xef, 0x1b, 0x21, 0xe2, 0xb2, 0xca, 0x10, 0x5a, 0x48, 0x21, 0xee, - 0x47, 0x9f, 0x05, 0xf7, 0x7e, 0x03, 0xf2, 0x39, 0x67, 0xb2, 0x3f, 0xec, - 0xcc, 0x85, 0x1e, 0xfa, 0x51, 0x54, 0xbb, 0x4a, 0x21, 0xda, 0x47, 0x0b, - 0x01, 0x59, 0x27, 0xb7, 0xf8, 0x49, 0x89, 0x59, 0xa6, 0xae, 0xc0, 0x96, - 0x51, 0xa9, 0xbb, 0xe2, 0xe1, 0xf0, 0x28, 0x50, 0x9a, 0x50, 0x7d, 0x3b, - 0x08, 0x77, 0xd3, 0xd4, 0xa4, 0x5a, 0x75, 0x89, 0xd0, 0x27, 0x4e, 0xba, - 0x4e, 0x62, 0x6f, 0x74, 0x36, 0x51, 0x26, 0x6b, 0xd1, 0xfa, 0x35, 0x41, - 0x29, 0x59, 0x91, 0xe1, 0xcd, 0x00, 0xc9, 0xfb, 0x85, 0xfc, 0xd0, 0xd6, - 0xc7, 0xc5, 0x5c, 0x5c, 0x53, 0x3e, 0xb2, 0x1e, 0x9a, 0x0f, 0xe5, 0xb7, - 0xdb, 0x26, 0xa3, 0x02, 0x6c, 0xfa, 0xe0, 0x2d, 0xf8, 0x70, 0x37, 0x1a, - 0xdd, 0x11, 0x74, 0xda, 0x16, 0x38, 0x8a, 0xab, 0x2f, 0x4e, 0x7f, 0x8b, - 0xd6, 0x53, 0x13, 0x7e, 0x4b, 0x65, 0x08, 0x11, 0xf8, 0x14, 0x39, 0x94, - 0x45, 0xeb, 0x60, 0xd8, 0x63, 0xb4, 0x55, 0x06, 0x7a, 0xb8, 0xa1, 0x02, - 0x88, 0xe5, 0x82, 0x09, 0x07, 0xa3, 0x62, 0x33, 0x65, 0x25, 0x1d, 0x85, - 0x6c, 0xc8, 0x77, 0xbe, 0xfd, 0xb7, 0xdc, 0x93, 0x3d, 0xc0, 0x49, 0x9c, - 0x8a, 0x3d, 0x47, 0xd8, 0x06, 0xb1, 0x97, 0x03, 0xa1, 0x87, 0xbc, 0x89, - 0x34, 0x64, 0xda, 0xe1, 0x6f, 0xa1, 0x27, 0xf2, 0xa2, 0x14, 0xed, 0x22, - 0xd8, 0x16, 0x79, 0xef, 0x9c, 0xfe, 0x4d, 0xcc, 0x12, 0x80, 0x91, 0x85, - 0xa4, 0x01, 0xf8, 0x29, 0xc1, 0x1f, 0x55, 0x51, 0x1d, 0x45, 0xe6, 0x05, - 0x0e, 0xd2, 0xcc, 0x7f, 0x4d, 0x54, 0xb3, 0x1c, 0x0d, 0xb6, 0x7b, 0x05, - 0xca, 0x19, 0x76, 0x8c, 0xf0, 0xce, 0x6b, 0x7f, 0xe2, 0xc4, 0xb8, 0xcf, - 0x72, 0xda, 0xcf, 0xe0, 0x35, 0x0c, 0xb2, 0xa7, 0x0b, 0xa1, 0xcf, 0x45, - 0x00, 0xc2, 0xff, 0x61, 0x40, 0x65, 0x4d, 0x8b, 0x36, 0xfb, 0x33, 0xae, - 0xef, 0x6e, 0xaf, 0x14, 0xd1, 0x69, 0x2f, 0xda, 0x4d, 0x9c, 0x7b, 0x61, - 0x33, 0xe5, 0x1b, 0x02, 0xff, 0xa3, 0xa1, 0x17, 0xa7, 0xe8, 0xdb, 0x53, - 0xf5, 0x61, 0x1c, 0x07, 0x4b, 0x74, 0x25, 0xbd, 0x79, 0xcf, 0x8d, 0x1d, - 0x06, 0x5c, 0xea, 0xe9, 0x7e, 0xff, 0x00, 0xba, 0xb1, 0x37, 0x86, 0x0b, - 0xbd, 0x04, 0x7e, 0xdb, 0x10, 0xa3, 0x65, 0x27, 0x27, 0x17, 0x9a, 0x95, - 0xef, 0x10, 0x34, 0xfc, 0xf3, 0xb2, 0x70, 0xb8, 0x40, 0x83, 0x0d, 0x9f, - 0x89, 0x97, 0x93, 0x01, 0x2c, 0xaf, 0xea, 0xcb, 0x47, 0xaf, 0x42, 0x6d, - 0x77, 0xa4, 0x33, 0x4b, 0x60, 0x07, 0xaa, 0xd6, 0x2c, 0x1f, 0x23, 0x64, - 0x8f, 0xcc, 0x3e, 0xff, 0xb0, 0x66, 0x2f, 0x3d, 0xf9, 0xff, 0x7d, 0x30, - 0x47, 0x6b, 0xd5, 0x97, 0x37, 0x42, 0xbb, 0xdf, 0xbe, 0x3a, 0x9f, 0x8a, - 0xb8, 0xbc, 0x1b, 0x9b, 0x9a, 0x7c, 0x35, 0xa8, 0x83, 0xad, 0x20, 0xe3, - 0x0d, 0xd5, 0x52, 0x91, 0x6d, 0x2d, 0x9b, 0x9e, 0xa0, 0xc1, 0xa9, 0x36, - 0xb2, 0x23, 0xdc, 0x28, 0x85, 0x0d, 0x43, 0xc5, 0x6e, 0x92, 0xfd, 0x23, - 0x6e, 0x62, 0x59, 0x8a, 0x22, 0x38, 0x55, 0x50, 0xf4, 0xb5, 0x8e, 0x73, - 0x85, 0xe6, 0xca, 0x9a, 0x47, 0xa3, 0x1b, 0x8c, 0x9b, 0x6e, 0x03, 0xd7, - 0xf4, 0x1e, 0x0a, 0xd4, 0x0b, 0x2f, 0xef, 0xc9, 0x3c, 0x73, 0x52, 0x5a, - 0x90, 0x00, 0xa5, 0x69, 0x3f, 0x32, 0x5f, 0x72, 0x32, 0x22, 0xfd, 0xa9, - 0x4a, 0x1f, 0xcb, 0xa1, 0x67, 0x85, 0xbd, 0x0a, 0xa9, 0xf9, 0x40, 0xcb, - 0x57, 0x0c, 0xfc, 0x39, 0x98, 0xd1, 0x26, 0x44, 0xd4, 0xa6, 0x73, 0x6e, - 0x64, 0xc0, 0x0f, 0xd3, 0xc0, 0x35, 0xd4, 0x82, 0xb7, 0xed, 0x30, 0x76, - 0x08, 0xa9, 0x17, 0x3e, 0x52, 0xec, 0xb8, 0x6f, 0x00, 0x10, 0x08, 0x23, - 0xe4, 0xcd, 0x5d, 0xc5, 0x04, 0xe6, 0xdd, 0xa4, 0x6a, 0xf4, 0x26, 0x13, - 0xf6, 0x41, 0x04, 0x3c, 0xfc, 0xd7, 0x13, 0xa5, 0x75, 0x24, 0x94, 0x52, - 0x2d, 0xd8, 0x41, 0xf2, 0x1a, 0x74, 0x6d, 0x2d, 0xf1, 0xd5, 0x8f, 0x5d, - 0x96, 0x11, 0xab, 0x85, 0xce, 0xc7, 0x29, 0x7f, 0x28, 0xf7, 0x08, 0x3a, - 0xdd, 0x22, 0x4c, 0x95, 0xf4, 0xf7, 0xd9, 0x79, 0x1a, 0xea, 0xb4, 0x36, - 0xcd, 0x50, 0x9f, 0xf6, 0x21, 0xe0, 0x8d, 0x57, 0x04, 0x77, 0x78, 0xde, - 0xdf, 0x05, 0x52, 0x67, 0x32, 0x5a, 0xdc, 0xa2, 0xa8, 0xc5, 0xe3, 0xcd, - 0xe8, 0x30, 0x26, 0x5d, 0x65, 0x18, 0xe1, 0x95, 0x0e, 0x3a, 0xaa, 0xb6, - 0xc0, 0x59, 0x7d, 0xed, 0xcf, 0x7f, 0xc4, 0x6d, 0x9f, 0xce, 0x92, 0x22, - 0x23, 0x80, 0xcc, 0x96, 0xd1, 0x70, 0xd6, 0x0a, 0x49, 0x55, 0x02, 0x5e, - 0xcd, 0xc9, 0x43, 0xa5, 0xd2, 0xe4, 0x2f, 0x1f, 0xd0, 0x7d, 0x99, 0x53, - 0xbe, 0xf7, 0xc9, 0x81, 0xc2, 0x95, 0x1b, 0x37, 0x8c, 0x33, 0xe4, 0x65, - 0x0c, 0x9a, 0x83, 0xc6, 0x83, 0xf6, 0xcb, 0x7f, 0x18, 0x38, 0x30, 0x68, - 0xcd, 0x19, 0x60, 0xed, 0x54, 0x0d, 0x23, 0xab, 0x94, 0x4c, 0x95, 0xb0, - 0x7a, 0xb2, 0x08, 0x85, 0xf9, 0x82, 0x8c, 0xf1, 0xa9, 0x4c, 0xb7, 0x8e, - 0x76, 0x0f, 0xab, 0x3a, 0x94, 0x5c, 0xb2, 0x90, 0xdf, 0x54, 0x3a, 0xe0, - 0xe7, 0x8e, 0x65, 0x31, 0x09, 0x2d, 0xee, 0x30, 0x18, 0xf3, 0x50, 0x1b, - 0x7f, 0x4d, 0x9e, 0x1b, 0xed, 0xac, 0x0a, 0xc9, 0x83, 0xe9, 0x17, 0x54, - 0x70, 0x99, 0xcd, 0xde, 0x44, 0xd3, 0xff, 0x8e, 0xdf, 0xf5, 0x7d, 0x65, - 0x7b, 0x58, 0x99, 0x42, 0xb4, 0x8a, 0x94, 0x26, 0x1a, 0x4f, 0x8d, 0x92, - 0xc1, 0x91, 0xb5, 0x95, 0x88, 0x99, 0x58, 0x53, 0x29, 0x73, 0x41, 0x97, - 0x19, 0x36, 0x28, 0xf5, 0x3b, 0x46, 0x83, 0xfa, 0x3f, 0x01, 0x28, 0x8f, - 0x4b, 0xe6, 0x3e, 0x61, 0xec, 0x20, 0xb3, 0xc6, 0xf3, 0x80, 0x03, 0x75, - 0xf5, 0x64, 0x77, 0x05, 0x99, 0x6a, 0x8f, 0xff, 0xeb, 0x2e, 0x7e, 0x5a, - 0x8d, 0xab, 0xbf, 0x6e, 0x3d, 0x55, 0x55, 0x1b, 0xd9, 0x3d, 0xd2, 0x9e, - 0x3e, 0xbb, 0x24, 0x80, 0x71, 0x75, 0xf8, 0xdb, 0xa7, 0xb9, 0x11, 0x06, - 0x92, 0x19, 0x27, 0xe3, 0x0c, 0x00, 0xe5, 0x7b, 0x82, 0x63, 0x20, 0x87, - 0x8a, 0xc6, 0xf3, 0x2b, 0x03, 0xb5, 0x3e, 0x28, 0x67, 0xac, 0x4e, 0x85, - 0xbe, 0xe2, 0x99, 0xe6, 0x01, 0x0b, 0x4c, 0xf2, 0xc8, 0xc9, 0x64, 0x55, - 0xef, 0xd3, 0x53, 0x74, 0x4a, 0x0c, 0xb9, 0xb1, 0x6c, 0xfc, 0xc5, 0x47, - 0x6f, 0x6e, 0x9c, 0xc4, 0x9a, 0x96, 0x80, 0x41, 0x9e, 0x44, 0xa6, 0x30, - 0x2e, 0x49, 0x6c, 0xd4, 0x8e, 0x10, 0x2d, 0x37, 0x1e, 0x8e, 0x83, 0xd6, - 0x12, 0x2b, 0x8d, 0xf9, 0x18, 0xb3, 0xa9, 0xcf, 0xe1, 0x81, 0x54, 0x18, - 0xb1, 0xbd, 0xaf, 0x95, 0xe5, 0x2f, 0x5a, 0xb3, 0x8b, 0xc4, 0xeb, 0xce, - 0x9d, 0x92, 0x6e, 0xd1, 0xdd, 0x4e, 0xbe, 0x58, 0x46, 0x09, 0x23, 0xee, - 0xfa, 0x77, 0x8f, 0x44, 0xc2, 0x4e, 0xb9, 0x41, 0x9d, 0xf7, 0x08, 0x46, - 0xcf, 0xd1, 0xc0, 0xe2, 0x01, 0x96, 0x72, 0x2f, 0x25, 0xd2, 0x6c, 0xda, - 0x51, 0x95, 0x76, 0xab, 0x74, 0x15, 0xb1, 0x5d, 0xe5, 0x5b, 0x19, 0x46, - 0x8c, 0x4b, 0xb0, 0xe4, 0x60, 0xc9, 0x20, 0x42, 0xd3, 0x47, 0x65, 0xfd, - 0xe6, 0xaa, 0x89, 0xe9, 0x62, 0x14, 0xd6, 0xad, 0x67, 0xf5, 0xa0, 0xfb, - 0x96, 0x64, 0x84, 0x07, 0x15, 0x88, 0xe8, 0xde, 0x11, 0x5a, 0x15, 0x01, - 0x34, 0x7f, 0x41, 0x03, 0xbe, 0xf9, 0x3f, 0xf8, 0x7a, 0x89, 0xb0, 0xa7, - 0xcb, 0x81, 0xc8, 0x1e, 0x39, 0xdb, 0xb3, 0x24, 0x85, 0x29, 0xeb, 0x86, - 0xf5, 0xf7, 0xf5, 0xce, 0xf4, 0x66, 0x9a, 0x44, 0x15, 0x41, 0xa5, 0xe7, - 0x71, 0x1f, 0x1d, 0xc9, 0x68, 0xee, 0xdb, 0x01, 0x24, 0x85, 0x73, 0xc0, - 0x2a, 0xd2, 0x5c, 0x8a, 0xed, 0xee, 0xa3, 0x4a, 0xe8, 0x10, 0xe6, 0xf1, - 0x7a, 0x33, 0xa3, 0x80, 0x29, 0x69, 0x77, 0x6a, 0xb3, 0xc3, 0x19, 0x49, - 0xc5, 0xc1, 0xf7, 0xbd, 0xc4, 0x50, 0x69, 0x4c, 0xbf, 0x1a, 0xdb, 0x37, - 0x04, 0xca, 0x70, 0x02, 0xa0, 0x43, 0xb2, 0x1b, 0x66, 0x99, 0x63, 0x84, - 0xe6, 0x91, 0x61, 0xff, 0x2b, 0x00, 0xa4, 0x57, 0xc3, 0xc7, 0xfe, 0xb9, - 0x82, 0xd6, 0x7b, 0xc3, 0xe9, 0xe3, 0x48, 0x5b, 0x27, 0xa6, 0xd3, 0x67, - 0x2b, 0xf7, 0x78, 0x80, 0x04, 0xfe, 0xd1, 0xb2, 0xe7, 0xce, 0x5b, 0xec, - 0x8b, 0xaf, 0x4e, 0x2f, 0x6a, 0xc2, 0x25, 0x60, 0x79, 0x31, 0x04, 0x74, - 0x38, 0x0b, 0x0b, 0xda, 0xbf, 0x63, 0x6f, 0x8b, 0x90, 0x45, 0xeb, 0xf7, - 0x3f, 0x7a, 0xdd, 0x0e, 0x29, 0x82, 0x23, 0xb5, 0x86, 0x24, 0xf1, 0x38, - 0xb0, 0x89, 0x16, 0x74, 0x16, 0xfb, 0x46, 0xbb, 0x90, 0xa3, 0xb7, 0x23, - 0xd3, 0x8c, 0x5c, 0xdb, 0xa6, 0x43, 0x83, 0xdd, 0xeb, 0x69, 0x19, 0xce, - 0x9e, 0x9e, 0x3e, 0x0a, 0x42, 0x7e, 0xfc, 0x1c, 0x92, 0x45, 0xf5, 0x10, - 0x0b, 0xa9, 0x58, 0x05, 0xce, 0xdc, 0x2a, 0x41, 0x45, 0x3f, 0x27, 0x1a, - 0xc8, 0x61, 0x49, 0x53, 0x8e, 0x58, 0x88, 0x8a, 0x45, 0xe7, 0x20, 0xbc, - 0x33, 0xf5, 0x8e, 0x7e, 0x32, 0x8e, 0xa2, 0x15, 0xb4, 0xf4, 0x0e, 0x3f, - 0x98, 0x9b, 0x31, 0x13, 0x54, 0xd0, 0x55, 0xb2, 0x79, 0x8d, 0x47, 0x72, - 0xbf, 0x69, 0x83, 0x24, 0x7f, 0x68, 0x10, 0x39, 0x3e, 0x78, 0x11, 0xee, - 0x8a, 0xfe, 0x1b, 0x47, 0x9f, 0xf8, 0xa4, 0xf6, 0xa1, 0x0e, 0xb8, 0xbd, - 0x15, 0xc8, 0xd7, 0x43, 0x42, 0xc8, 0xca, 0xbc, 0xa4, 0x3c, 0xb3, 0x71, - 0x1d, 0x1a, 0xc6, 0x55, 0xdc, 0x09, 0xa3, 0x22, 0x62, 0x94, 0x0c, 0x35, - 0xc5, 0xab, 0x07, 0x69, 0xb2, 0x18, 0x6b, 0x70, 0xbf, 0xbc, 0x52, 0xaf, - 0xce, 0x47, 0xd9, 0xd2, 0x61, 0x2d, 0x10, 0xc9, 0x84, 0x23, 0x43, 0xc6, - 0xb4, 0x9d, 0x40, 0xc9, 0x8a, 0xc6, 0x07, 0x60, 0x9a, 0x1d, 0x8c, 0xcc, - 0x5b, 0x7f, 0x85, 0x7a, 0x91, 0x5b, 0x6c, 0x0a, 0x8c, 0xfe, 0x96, 0x13, - 0x0e, 0x54, 0xce, 0x17, 0x05, 0x23, 0xec, 0xd9, 0xf8, 0xf0, 0xca, 0x26, - 0xae, 0xe6, 0xc9, 0x73, 0x8d, 0x9c, 0x03, 0xea, 0x70, 0x75, 0x7a, 0xf7, - 0xf1, 0xd4, 0x5f, 0x82, 0x5a, 0xc1, 0x29, 0xbe, 0x74, 0xba, 0xcb, 0x78, - 0x75, 0xc9, 0x2f, 0xf2, 0x6c, 0x57, 0x61, 0xd1, 0x93, 0x89, 0x13, 0xcf, - 0x00, 0x1f, 0xdb, 0x3b, 0xa2, 0xed, 0xf0, 0x60, 0xaf, 0xa8, 0x7d, 0xcc, - 0x24, 0x92, 0xf0, 0x26, 0x4d, 0x7e, 0x7b, 0x7b, 0x21, 0x89, 0x91, 0xf2, - 0x1b, 0xcc, 0x80, 0xf9, 0x54, 0xbe, 0xf6, 0x09, 0x04, 0xb8, 0x10, 0x54, - 0x34, 0xf3, 0xd1, 0x53, 0xd7, 0x4b, 0x9b, 0x58, 0x67, 0x69, 0xc2, 0x72, - 0xdc, 0xd4, 0x3b, 0x11, 0x3c, 0xd0, 0xf4, 0x7e, 0xa5, 0x05, 0x85, 0xb7, - 0x1b, 0x70, 0x83, 0xc5, 0xae, 0xc4, 0x72, 0x20, 0x4b, 0x20, 0x63, 0xd1, - 0x4b, 0xd7, 0x60, 0x77, 0x4a, 0x2c, 0xbb, 0x47, 0x7c, 0xf0, 0x5b, 0xf6, - 0x75, 0x32, 0xdd, 0xcc, 0x64, 0xf7, 0x8a, 0xf5, 0xa2, 0x90, 0xed, 0x4b, - 0x07, 0x80, 0xf5, 0x74, 0x14, 0x44, 0x11, 0x32, 0xa8, 0x68, 0x9c, 0x9d, - 0xc8, 0x7d, 0x83, 0xfb, 0x62, 0x5d, 0x61, 0xda, 0x9e, 0x37, 0x81, 0x18, - 0xf5, 0x14, 0x8c, 0xc0, 0x62, 0x5e, 0xd4, 0x4c, 0xe1, 0x2e, 0x0c, 0x0b, - 0xfc, 0x6f, 0x93, 0x84, 0xf9, 0x6d, 0x08, 0x9f, 0xc6, 0x98, 0x75, 0x10, - 0xee, 0x37, 0x70, 0xc5, 0x95, 0x04, 0xc2, 0x15, 0x6d, 0xd3, 0x69, 0x69, - 0x78, 0x7e, 0xb5, 0x55, 0xa3, 0x87, 0x3c, 0xbb, 0x48, 0xd1, 0x57, 0x12, - 0xb3, 0xd0, 0xd1, 0x33, 0x47, 0x9b, 0x89, 0x2b, 0x3e, 0xd9, 0x31, 0x51, - 0xf1, 0x4f, 0x73, 0xd7, 0x31, 0xf4, 0xb9, 0x15, 0x89, 0xc6, 0xfd, 0xe4, - 0x25, 0x15, 0xc3, 0x28, 0x84, 0x5b, 0x32, 0x03, 0x77, 0xee, 0x01, 0x9e, - 0xbf, 0xf8, 0x7d, 0xa4, 0x4a, 0x6c, 0x39, 0x8d, 0x18, 0xee, 0x61, 0xfa, - 0xfe, 0xa5, 0x5f, 0xbd, 0xde, 0xb1, 0x3d, 0x5e, 0x1f, 0xd3, 0x49, 0x72, - 0x18, 0xb4, 0xb7, 0x87, 0x9b, 0x77, 0x7d, 0x94, 0xa2, 0xe0, 0x72, 0x4f, - 0x69, 0xa1, 0x27, 0x15, 0x0f, 0x91, 0x6a, 0xf6, 0x19, 0x7f, 0x9d, 0xf9, - 0x67, 0x7d, 0x75, 0x15, 0xac, 0x03, 0xba, 0x03, 0xb5, 0x72, 0xa9, 0xcd, - 0x5a, 0x8a, 0x99, 0xe3, 0x4a, 0x47, 0x48, 0x7c, 0x69, 0xb9, 0x79, 0x26, - 0x69, 0xa3, 0x8a, 0x19, 0x88, 0xfa, 0xba, 0x5b, 0x01, 0x08, 0x15, 0x81, - 0xf4, 0x73, 0xd5, 0x44, 0x95, 0x44, 0xfe, 0x5b, 0x01, 0x59, 0x25, 0xf2, - 0x8b, 0x3e, 0x96, 0x77, 0xe9, 0x6e, 0xc0, 0x04, 0xda, 0x2f, 0x28, 0xe5, - 0x94, 0xea, 0x2a, 0xcb, 0x45, 0x74, 0xeb, 0xea, 0x69, 0x9b, 0x76, 0xe1, - 0xed, 0x75, 0xe2, 0xfa, 0x51, 0x41, 0x57, 0xfe, 0x02, 0xaa, 0x9f, 0xda, - 0x41, 0xfa, 0xdd, 0x99, 0x79, 0xfc, 0x23, 0x7f, 0x8e, 0x2c, 0xee, 0x43, - 0x16, 0xa2, 0x9f, 0x7a, 0x6a, 0x68, 0xd4, 0x51, 0xe4, 0x84, 0x52, 0x50, - 0xf6, 0x33, 0x79, 0x30, 0x7e, 0xcd, 0xf0, 0xdc, 0x8a, 0xa6, 0x56, 0x12, - 0x7d, 0x35, 0xcb, 0x94, 0x1e, 0x5f, 0x88, 0x23, 0xe8, 0x92, 0x47, 0x5f, - 0xbd, 0xe1, 0xf4, 0xf8, 0x94, 0x88, 0xf7, 0xf3, 0x56, 0x2d, 0xb9, 0x9d, - 0xc2, 0xaf, 0x01, 0x29, 0xd5, 0xc7, 0x24, 0x2b, 0x65, 0xcc, 0xe6, 0x52, - 0x52, 0xca, 0x92, 0x6b, 0x9e, 0x74, 0x81, 0x1b, 0xb6, 0x63, 0xb6, 0xb0, - 0x3c, 0x11, 0xf5, 0xb0, 0xad, 0x5f, 0x1d, 0x7e, 0xda, 0xba, 0x29, 0x17, - 0xc2, 0x3c, 0xfd, 0x2d, 0x55, 0x43, 0xd9, 0xc1, 0x68, 0xc3, 0xb4, 0x60, - 0x87, 0x11, 0x24, 0x1a, 0x81, 0x59, 0xcd, 0x62, 0xc0, 0x37, 0x5e, 0x44, - 0xbe, 0xd0, 0x08, 0xb0, 0xe3, 0x90, 0x94, 0xd4, 0x35, 0xaa, 0x8d, 0x6d, - 0xaa, 0x08, 0xdd, 0x31, 0x95, 0x61, 0x7e, 0x7a, 0x13, 0x03, 0x23, 0x97, - 0xde, 0xa0, 0x33, 0x1d, 0x17, 0x17, 0x58, 0xba, 0xf3, 0x1a, 0x6c, 0xa7, - 0x7b, 0xff, 0x9a, 0x2a, 0x70, 0x3d, 0x6e, 0xf9, 0x5d, 0x30, 0x54, 0xe8, - 0x58, 0xb2, 0xe5, 0x84, 0x05, 0x9c, 0x43, 0xca, 0x6e, 0x56, 0x57, 0x8d, - 0x2f, 0x6a, 0xaf, 0xa5, 0x3b, 0xba, 0x19, 0x0a, 0x25, 0x92, 0x4c, 0xcd, - 0x20, 0x0a, 0x1c, 0xe2, 0x3d, 0x33, 0x95, 0xe4, 0x43, 0x92, 0xfa, 0x47, - 0xb9, 0x4e, 0x3c, 0x52, 0x47, 0xf7, 0x5f, 0xf8, 0xc5, 0x83, 0xd5, 0xc8, - 0x41, 0xcd, 0xd0, 0x76, 0x0f, 0x4f, 0x63, 0x2e, 0x90, 0xe5, 0xfd, 0xc2, - 0x34, 0x82, 0x7c, 0x90, 0x3e, 0x98, 0x6d, 0x18, 0xc9, 0x6d, 0xb4, 0xcd, - 0x38, 0x81, 0x89, 0xb7, 0xd1, 0x82, 0x9c, 0xb7, 0xb1, 0x92, 0x1e, 0x45, - 0x71, 0x25, 0xd3, 0x99, 0xcf, 0x35, 0xa3, 0x8e, 0xf1, 0x2f, 0x11, 0x90, - 0x3f, 0x23, 0x6c, 0xdc, 0x55, 0x7c, 0x18, 0x01, 0xaf, 0x40, 0xf8, 0x42, - 0xb2, 0x3b, 0x67, 0xe9, 0xac, 0xbc, 0x76, 0x9a, 0xf4, 0x11, 0x35, 0x71, - 0x7d, 0x7f, 0xdf, 0xa0, 0xf2, 0xd5, 0xa7, 0x81, 0x48, 0xa6, 0xf7, 0xf8, - 0xa1, 0xbc, 0x95, 0x78, 0x69, 0x25, 0xe7, 0x9a, 0xb6, 0x4f, 0xfb, 0x64, - 0x86, 0xb3, 0x67, 0x2c, 0x78, 0x75, 0x0a, 0x3b, 0x5a, 0xc8, 0xa2, 0x25, - 0x7f, 0xce, 0xbd, 0xcc, 0x54, 0x23, 0xe7, 0x58, 0x73, 0xee, 0x8e, 0x30, - 0x2c, 0x27, 0x01, 0xa3, 0x3a, 0x8b, 0x64, 0xa8, 0x3c, 0x56, 0x01, 0x63, - 0x91, 0xb4, 0xef, 0xb7, 0x07, 0x2e, 0xc5, 0xcd, 0xfd, 0xe5, 0x62, 0x42, - 0x2b, 0xb3, 0x9e, 0x38, 0x88, 0xd4, 0x74, 0x4e, 0x96, 0xeb, 0x74, 0xc1, - 0x48, 0x9b, 0xe3, 0xbd, 0xcf, 0x5d, 0x27, 0x2c, 0xbe, 0xf1, 0x43, 0xfe, - 0x7c, 0x96, 0x81, 0xf8, 0xfe, 0x8a, 0xbe, 0x00, 0xd8, 0x5f, 0xa4, 0x3a, - 0x61, 0x03, 0x75, 0x91, 0xba, 0x6e, 0x57, 0xfd, 0x4c, 0xa5, 0xe2, 0xc5, - 0x10, 0x3a, 0x64, 0xf9, 0x19, 0x43, 0x18, 0x1b, 0xba, 0xbf, 0x92, 0x3b, - 0x77, 0x04, 0x1d, 0x6c, 0x85, 0xdd, 0xf9, 0xfb, 0x4a, 0xde, 0x04, 0x7f, - 0xdd, 0x4d, 0x14, 0xed, 0x9b, 0x28, 0x3c, 0xb0, 0xc6, 0xca, 0xeb, 0xc1, - 0xbc, 0xf3, 0xd4, 0x65, 0xb3, 0xf1, 0x01, 0x74, 0xaf, 0xec, 0x70, 0x0a, - 0xa5, 0xb8, 0x24, 0x95, 0xba, 0x4b, 0x97, 0xb3, 0x39, 0x25, 0x72, 0xc0, - 0xb9, 0xc0, 0xaa, 0x31, 0xe4, 0x6a, 0xe3, 0x67, 0xe7, 0x55, 0x61, 0x9d, - 0xcf, 0xa7, 0x6a, 0xe8, 0x44, 0xe0, 0x4d, 0x3a, 0x12, 0x22, 0x70, 0xe6, - 0xe8, 0x8f, 0xc2, 0x99, 0xe8, 0x8c, 0xfd, 0x1e, 0xaa, 0x1b, 0x4a, 0x50, - 0x3a, 0x23, 0xfd, 0x84, 0xe3, 0x89, 0x7a, 0x9c, 0x80, 0xe9, 0x18, 0xdc, - 0x90, 0x9d, 0xe6, 0xb9, 0x60, 0x85, 0xe2, 0x9c, 0x2b, 0x31, 0x0b, 0x31, - 0x20, 0x98, 0x13, 0xb9, 0x9a, 0xf9, 0x43, 0x3d, 0x5c, 0xb3, 0xe4, 0xa5, - 0x8c, 0xb5, 0x57, 0x91, 0xa5, 0x72, 0xfd, 0x3b, 0x92, 0x77, 0x4f, 0xde, - 0xba, 0x4e, 0xcd, 0x45, 0x39, 0xf4, 0x87, 0xef, 0x93, 0x3c, 0x57, 0x4b, - 0xbb, 0x46, 0x77, 0x6f, 0x6e, 0xbe, 0x68, 0x1d, 0xa5, 0xe9, 0xcb, 0x3b, - 0x28, 0x3e, 0x93, 0x75, 0x06, 0xa8, 0x26, 0x14, 0x86, 0xf1, 0x7b, 0xdd, - 0xac, 0x0d, 0x99, 0xec, 0x1e, 0x1a, 0xbd, 0xd6, 0xf4, 0x02, 0x51, 0xe1, - 0xb3, 0x53, 0x5e, 0x47, 0xa0, 0x72, 0xf6, 0x46, 0x8a, 0xfc, 0x5e, 0x53, - 0xde, 0xc1, 0x5b, 0x27, 0x0c, 0x10, 0x5e, 0x6c, 0x83, 0xfa, 0x43, 0x8a, - 0xa6, 0xf3, 0xa1, 0xc6, 0xd3, 0xaf, 0x45, 0xee, 0xec, 0x0f, 0xb2, 0xb6, - 0x9f, 0xc5, 0x2f, 0x91, 0xe5, 0xd9, 0x43, 0x50, 0x05, 0x3e, 0xdf, 0x18, - 0xc1, 0x2d, 0xb1, 0xa8, 0x3f, 0x07, 0xa6, 0x07, 0xbf, 0x1a, 0xc1, 0xe9, - 0x49, 0x33, 0x1d, 0x50, 0x08, 0xf5, 0xfe, 0x00, 0xbe, 0x3c, 0xd7, 0x4f, - 0xf0, 0x77, 0x57, 0xb5, 0x05, 0xad, 0xf1, 0xa1, 0xf0, 0xe6, 0xb4, 0xf8, - 0x92, 0xa2, 0xf5, 0xd6, 0x47, 0x5c, 0x92, 0x92, 0x0a, 0x1e, 0xd5, 0x69, - 0xb6, 0xd0, 0x5a, 0x45, 0x0b, 0x3f, 0x91, 0x2e, 0xdf, 0x11, 0xa6, 0x51, - 0xd1, 0x17, 0x44, 0x61, 0x37, 0x60, 0xe5, 0x8d, 0x9c, 0x2a, 0x8b, 0xbb, - 0x86, 0xcd, 0xff, 0x94, 0x61, 0xb5, 0x31, 0xef, 0x52, 0x48, 0x5c, 0xe9, - 0x36, 0x3c, 0x6a, 0x6a, 0xa2, 0xe1, 0xfd, 0x90, 0x37, 0x6e, 0x42, 0xd4, - 0xb7, 0xd9, 0xe9, 0x96, 0xde, 0xb7, 0xa8, 0x47, 0xe3, 0x23, 0x1a, 0x98, - 0x14, 0xd3, 0xc6, 0x1c, 0xe3, 0x5b, 0xae, 0x55, 0x93, 0x7d, 0x35, 0x44, - 0x15, 0xda, 0x0f, 0xb5, 0xca, 0xbc, 0xa2, 0xc6, 0xa4, 0x60, 0xe0, 0xef, - 0x86, 0xd3, 0x71, 0xef, 0x9f, 0xdf, 0xce, 0xa0, 0xac, 0x07, 0xe7, 0x83, - 0x9f, 0x3b, 0xc0, 0x29, 0x66, 0x8b, 0x5a, 0x65, 0x17, 0xb5, 0x86, 0x2e, - 0xfb, 0xb2, 0x49, 0xf3, 0x1e, 0xcc, 0x0b, 0x86, 0xd0, 0x76, 0x78, 0xd9, - 0xf4, 0xe7, 0xbd, 0x85, 0xe4, 0xfc, 0xdf, 0xc5, 0x07, 0x33, 0x58, 0x81, - 0x3d, 0x83, 0x67, 0xfd, 0x34, 0x43, 0x4a, 0x30, 0xac, 0x9d, 0x17, 0xe8, - 0xf1, 0x15, 0xc4, 0xcc, 0xd4, 0x5c, 0x16, 0x79, 0xc6, 0xd2, 0x30, 0xff, - 0x17, 0x13, 0x69, 0xd7, 0x45, 0x63, 0xb1, 0x72, 0x5a, 0x71, 0x02, 0x17, - 0x21, 0x67, 0x1a, 0x69, 0x96, 0x66, 0xb9, 0x02, 0x1a, 0x19, 0x03, 0x1f, - 0xad, 0x9d, 0xa4, 0xa7, 0xf1, 0xcf, 0xd1, 0xf3, 0x50, 0x29, 0xcb, 0x06, - 0xf8, 0xf5, 0x5f, 0x67, 0x6f, 0xd2, 0x2e, 0x3b, 0x07, 0x5f, 0x0e, 0x3b, - 0xb8, 0x3c, 0x70, 0xe0, 0x45, 0x5d, 0xa6, 0x56, 0x4e, 0xfb, 0x1d, 0xbf, - 0x23, 0x8b, 0x08, 0x97, 0xd0, 0x61, 0x83, 0xd0, 0x0a, 0x14, 0xbf, 0xe4, - 0x51, 0x47, 0x93, 0x87, 0x4e, 0x1d, 0x14, 0x80, 0x37, 0xf5, 0x94, 0x85, - 0x8d, 0x26, 0x2f, 0x4f, 0x9a, 0xe8, 0x13, 0xbe, 0xd2, 0x2f, 0x96, 0x78, - 0x00, 0x73, 0xa8, 0x57, 0x26, 0x9f, 0xef, 0xe3, 0x12, 0x0b, 0x39, 0xf5, - 0xa5, 0x2c, 0xec, 0x56, 0xc7, 0xb0, 0x92, 0x1b, 0xfe, 0x07, 0x96, 0xc0, - 0x65, 0x86, 0xf9, 0xae, 0x03, 0x74, 0x97, 0xa0, 0xf5, 0x34, 0x2f, 0x65, - 0x57, 0xa3, 0xa6, 0x76, 0xe5, 0x1d, 0xd3, 0xbd, 0xdd, 0x1b, 0xb4, 0x2c, - 0xeb, 0x7b, 0x6b, 0xfd, 0x85, 0xd6, 0x6a, 0xec, 0x93, 0xb8, 0x9e, 0x81, - 0x21, 0x0b, 0xeb, 0xb5, 0x60, 0x9a, 0x89, 0xb2, 0xcc, 0xc0, 0xd2, 0xd9, - 0x92, 0x47, 0xe5, 0x82, 0xc2, 0xeb, 0x8d, 0xba, 0xee, 0x82, 0xb4, 0xd0, - 0x4c, 0x69, 0x6e, 0x87, 0x53, 0x1e, 0x43, 0x01, 0x55, 0x8a, 0x99, 0x4c, - 0x12, 0xa8, 0x6d, 0x65, 0x95, 0x83, 0xf6, 0xe1, 0xdc, 0xcd, 0x82, 0x73, - 0xed, 0xf4, 0x59, 0x62, 0x35, 0xa7, 0x89, 0x11, 0x0d, 0x35, 0x50, 0x2c, - 0xab, 0xcf, 0x74, 0x6b, 0x75, 0x55, 0x69, 0x75, 0x1a, 0xf1, 0x69, 0x6f, - 0x35, 0xdd, 0x7f, 0x90, 0x9d, 0x49, 0x45, 0xde, 0x74, 0x7b, 0x5c, 0xc5, - 0x8b, 0x74, 0x84, 0xc9, 0x82, 0xad, 0x7e, 0x17, 0x15, 0x98, 0xfc, 0xe9, - 0x47, 0xdb, 0xb3, 0x2c, 0x65, 0x38, 0x49, 0x73, 0xa6, 0xa0, 0x76, 0x53, - 0x51, 0x25, 0x28, 0x14, 0x09, 0xa3, 0x5f, 0x28, 0x0f, 0x37, 0x5a, 0x7e, - 0xe0, 0xa0, 0x4c, 0x7c, 0xb5, 0x93, 0x6a, 0xfd, 0xf4, 0x7d, 0x5a, 0xd2, - 0x5f, 0x7f, 0x9c, 0x55, 0x71, 0x2a, 0x07, 0x66, 0x2a, 0x17, 0x70, 0x46, - 0x7b, 0xcb, 0x28, 0xb9, 0xa1, 0x82, 0x69, 0xec, 0x80, 0xf1, 0x61, 0xa8, - 0xd0, 0xf9, 0x99, 0xd2, 0xf7, 0x15, 0x4d, 0x5d, 0x51, 0x0e, 0xb3, 0xba, - 0x4e, 0x1f, 0xd1, 0x1f, 0xb9, 0xeb, 0x67, 0x97, 0x94, 0xd1, 0xfc, 0x12, - 0x1d, 0xd7, 0x61, 0x63, 0xa5, 0x6b, 0x42, 0xde, 0x5f, 0x92, 0x28, 0x71, - 0x76, 0xff, 0xeb, 0x7b, 0x02, 0x5f, 0xf7, 0x45, 0x04, 0x19, 0x7c, 0xa1, - 0x16, 0x17, 0xa0, 0x79, 0x6f, 0x52, 0xda, 0x23, 0xcf, 0xf8, 0x26, 0xb9, - 0x3c, 0xa4, 0xd8, 0x29, 0x2d, 0xea, 0xee, 0x04, 0xcf, 0xce, 0x7f, 0x4d, - 0xec, 0xb3, 0x64, 0xcb, 0xfb, 0x92, 0x30, 0xf4, 0x64, 0xca, 0x84, 0x60, - 0xfc, 0x82, 0xf4, 0xe9, 0xd8, 0xfc, 0xd2, 0x4b, 0x4d, 0x98, 0x7a, 0x64, - 0x4c, 0xa8, 0x33, 0xd9, 0xc8, 0xbb, 0xb2, 0xa1, 0x35, 0x13, 0xc2, 0x18, - 0x24, 0x91, 0xe7, 0xd1, 0xab, 0x68, 0x34, 0x1c, 0x89, 0xcf, 0x60, 0xba, - 0xcb, 0x74, 0xd5, 0xb8, 0x1e, 0x19, 0xc3, 0x0a, 0x63, 0x66, 0x29, 0x25, - 0x0d, 0x26, 0x93, 0xc0, 0xdd, 0x9f, 0x9e, 0xf5, 0xe0, 0x7d, 0x8c, 0x14, - 0xe8, 0x01, 0xe5, 0xd5, 0x65, 0x1a, 0x47, 0xbe, 0xbb, 0x40, 0x42, 0x6b, - 0xc9, 0x26, 0xc4, 0xab, 0x4a, 0xe6, 0x13, 0xfe, 0x7e, 0x7a, 0xde, 0x98, - 0xbb, 0xd1, 0xe2, 0xdc, 0x28, 0x92, 0x1d, 0x3f, 0x32, 0x0b, 0x19, 0x96, - 0x25, 0x57, 0xe3, 0x80, 0xde, 0xc6, 0xa8, 0x9b, 0x56, 0x48, 0xdf, 0x0c, - 0x4c, 0x21, 0xc7, 0x3b, 0x82, 0x47, 0xd2, 0x79, 0xa8, 0x68, 0x2b, 0xb4, - 0x9d, 0xec, 0x4f, 0x2c, 0xdd, 0xd0, 0x71, 0xca, 0xc3, 0x48, 0x21, 0x7e, - 0x51, 0x2e, 0xfc, 0xca, 0xb1, 0x75, 0x07, 0x14, 0xf5, 0x0b, 0xd8, 0x25, - 0xa9, 0x78, 0x7b, 0x84, 0xf1, 0xe0, 0x61, 0x79, 0x67, 0x44, 0x57, 0x74, - 0x80, 0xfa, 0x03, 0xf1, 0x45, 0xd1, 0xab, 0x4d, 0xc3, 0x59, 0xee, 0x6a, - 0xfe, 0x13, 0xaf, 0x62, 0xbc, 0x23, 0x89, 0xe0, 0x35, 0x8e, 0xa4, 0xc4, - 0x80, 0x4e, 0xa5, 0x68, 0xa6, 0xd5, 0x9a, 0xf2, 0xaf, 0x69, 0x34, 0x5d, - 0x57, 0x5b, 0x4a, 0xcd, 0x59, 0x33, 0x31, 0xb6, 0x27, 0xeb, 0xb6, 0xf5, - 0xed, 0x83, 0x73, 0x3a, 0xe2, 0xd8, 0xc2, 0x7b, 0x29, 0x8a, 0xa2, 0xcf, - 0x82, 0x70, 0xd6, 0x65, 0x7d, 0xfb, 0xb1, 0x55, 0xd2, 0xc2, 0xd1, 0x72, - 0x4c, 0x01, 0x5d, 0x69, 0x22, 0x18, 0x5e, 0xd4, 0x4e, 0xd3, 0x19, 0x30, - 0x91, 0x66, 0x16, 0x4f, 0xe3, 0xbc, 0xb0, 0xf6, 0x7b, 0x31, 0x3c, 0x6d, - 0x0a, 0x52, 0xaf, 0xa7, 0xc3, 0x11, 0xf8, 0x4e, 0xc8, 0xab, 0x82, 0x5c, - 0x4e, 0x16, 0x14, 0x90, 0xb6, 0xd6, 0x82, 0xf0, 0x30, 0x85, 0x0c, 0x73, - 0xf3, 0x32, 0x76, 0x71, 0xdf, 0xa8, 0xb9, 0x1b, 0x3c, 0x71, 0x1d, 0x4e, - 0x2c, 0x2a, 0x09, 0xb8, 0xb1, 0xfe, 0x25, 0x5b, 0x5f, 0x8e, 0x2a, 0x86, - 0xd4, 0xeb, 0x47, 0x57, 0x37, 0x21, 0xcc, 0xfc, 0x0a, 0x1d, 0xae, 0x71, - 0xa3, 0xeb, 0xe1, 0xf8, 0xcd, 0xa7, 0x05, 0x37, 0x6d, 0xcb, 0x81, 0xdd, - 0x7d, 0x10, 0x9c, 0x71, 0x8c, 0xf9, 0xa2, 0xf1, 0xda, 0x09, 0xfe, 0x65, - 0x73, 0x5a, 0x9d, 0xb9, 0xe3, 0x3e, 0x94, 0x29, 0x96, 0xc5, 0xc6, 0x32, - 0x7e, 0x47, 0xc6, 0x35, 0x80, 0x0e, 0xf0, 0x21, 0x6f, 0x3b, 0x3f, 0x80, - 0xb7, 0x66, 0xb3, 0x2e, 0xf4, 0x29, 0x8a, 0xa4, 0xcf, 0x38, 0x8c, 0x0b, - 0xf5, 0x1e, 0x65, 0x4f, 0x6d, 0x3f, 0xd6, 0x9f, 0xa1, 0x79, 0x36, 0x77, - 0xf1, 0x73, 0x18, 0xac, 0x05, 0x71, 0xa6, 0x0e, 0x01, 0xb4, 0xef, 0x3a, - 0x56, 0x14, 0x3e, 0x0a, 0x26, 0x57, 0x9b, 0x56, 0x17, 0x7f, 0xff, 0x17, - 0x68, 0x53, 0xe0, 0x03, 0x07, 0x8e, 0x82, 0xf3, 0x14, 0xcb, 0xe1, 0xe3, - 0xe9, 0xc3, 0x0c, 0xf8, 0xea, 0xd3, 0x9d, 0x84, 0x6d, 0x5c, 0x36, 0xd3, - 0xec, 0x1b, 0xe3, 0xd7, 0xe3, 0x87, 0xcf, 0x10, 0xbf, 0x12, 0xdb, 0x44, - 0x78, 0xf1, 0xc7, 0xb8, 0x31, 0xd4, 0x36, 0x5a, 0x5c, 0xda, 0xeb, 0xf0, - 0xd0, 0xde, 0xd9, 0x51, 0x55, 0x21, 0x2d, 0xd8, 0x4c, 0x1b, 0x7a, 0x83, - 0x7c, 0x6a, 0xb9, 0x88, 0x0e, 0x03, 0x9c, 0xa1, 0x96, 0x90, 0x54, 0x75, - 0x86, 0xf0, 0x9a, 0xad, 0x92, 0x4c, 0xd1, 0x66, 0x4c, 0xcc, 0x3b, 0xf1, - 0x05, 0x91, 0x50, 0x73, 0x99, 0x08, 0x04, 0x8c, 0x1e, 0x3d, 0x54, 0x2d, - 0x8e, 0xf5, 0x52, 0xe8, 0x7b, 0x8f, 0x2a, 0x34, 0xf5, 0xa5, 0x06, 0x53, - 0xa1, 0xd8, 0x35, 0x95, 0xa1, 0xc7, 0xed, 0x82, 0x55, 0x31, 0x0a, 0x8e, - 0x1b, 0x85, 0x6f, 0xc7, 0x75, 0x78, 0xae, 0x3e, 0x7f, 0xe6, 0x12, 0xf5, - 0xf6, 0xfa, 0x32, 0xc3, 0x2b, 0xe2, 0xcc, 0xb1, 0xbe, 0x30, 0xcb, 0xc6, - 0x7a, 0x88, 0x34, 0x03, 0x64, 0xb7, 0xa3, 0x94, 0x4d, 0x67, 0xac, 0x06, - 0xb2, 0xf3, 0x62, 0x00, 0xf2, 0xda, 0xce, 0x4c, 0x70, 0xe3, 0x15, 0x5a, - 0xd0, 0x8a, 0x6b, 0xfe, 0x0f, 0xf7, 0x2d, 0x48, 0x01, 0x8b, 0x3a, 0x63, - 0x2e, 0x8b, 0x79, 0x49, 0xcd, 0x3f, 0xbc, 0x18, 0x52, 0x3f, 0x18, 0xeb, - 0x54, 0x42, 0x8a, 0x2d, 0x43, 0xef, 0xa0, 0x0f, 0x20, 0x2d, 0x7b, 0xa5, - 0xe6, 0x69, 0xb5, 0x16, 0x52, 0xa7, 0xa0, 0xd4, 0xff, 0xf3, 0xe4, 0xc2, - 0x7e, 0xa0, 0x83, 0xee, 0xca, 0x18, 0x29, 0x7e, 0x6b, 0x1f, 0x69, 0xde, - 0x11, 0x46, 0x0f, 0x59, 0x28, 0xcd, 0x4d, 0x88, 0xf7, 0xae, 0xe0, 0x04, - 0xf8, 0x6c, 0xb4, 0x77, 0x02, 0xaa, 0x45, 0xba, 0xfd, 0x2e, 0x70, 0x43, - 0xf9, 0x71, 0x58, 0x3b, 0xb9, 0x18, 0x7d, 0x88, 0xe3, 0x5c, 0x17, 0x37, - 0x3f, 0x9d, 0x0c, 0xfc, 0xb3, 0x4b, 0x40, 0xd3, 0x71, 0xb6, 0x85, 0x2d, - 0x3a, 0x3b, 0xff, 0xfa, 0xe8, 0xe6, 0x49, 0xbb, 0x99, 0x43, 0x2c, 0x7f, - 0xac, 0xaa, 0xc4, 0x06, 0x74, 0x37, 0x78, 0x49, 0x1d, 0x3e, 0x79, 0x91, - 0xd8, 0x7c, 0x80, 0x5a, 0xfd, 0x21, 0xa5, 0xdb, 0x70, 0xe4, 0xfb, 0x76, - 0xbb, 0xaa, 0x4e, 0xa7, 0x3d, 0xb9, 0xab, 0xd7, 0x4d, 0xe9, 0x4f, 0xa2, - 0x51, 0x8b, 0x60, 0x68, 0x0b, 0x50, 0xe3, 0xd6, 0xbc, 0xc7, 0xab, 0x39, - 0x00, 0x2d, 0x54, 0x27, 0x43, 0x42, 0xa7, 0x5b, 0x8a, 0x8c, 0x62, 0xb4, - 0xa3, 0x47, 0x19, 0xd6, 0xf9, 0x6d, 0x4c, 0xae, 0x98, 0xa8, 0x35, 0x9c, - 0x1b, 0x44, 0x84, 0xb3, 0x02, 0x00, 0x97, 0x8c, 0xdc, 0x94, 0xc3, 0x93, - 0xd8, 0x7e, 0x43, 0x27, 0xf0, 0x7d, 0x7c, 0x62, 0x6f, 0x32, 0x60, 0x56, - 0x0d, 0xdb, 0x23, 0x14, 0xed, 0x7e, 0xc1, 0x0d, 0xef, 0x99, 0x45, 0x5a, - 0xb0, 0x30, 0x8d, 0x7d, 0x80, 0x7a, 0x0e, 0x8a, 0x55, 0xbb, 0xbb, 0x64, - 0x89, 0x71, 0xc7, 0x6c, 0xd2, 0x1e, 0x49, 0x08, 0xf8, 0x00, 0xf8, 0x6a, - 0x41, 0x7d, 0x04, 0x40, 0x2e, 0xf0, 0x76, 0xe8, 0xc8, 0x1b, 0x75, 0x1e, - 0xcd, 0x06, 0x4b, 0x18, 0x2f, 0xc2, 0x3f, 0x14, 0x30, 0x8d, 0xb0, 0xd2, - 0xd6, 0xf4, 0x64, 0x50, 0x59, 0x4f, 0x14, 0xd7, 0x59, 0xc3, 0x30, 0xa6, - 0xb1, 0x4f, 0xa8, 0xcf, 0x8d, 0xa0, 0x0d, 0x7f, 0x3c, 0xd0, 0x87, 0x88, - 0x99, 0x07, 0x89, 0xd4, 0xe6, 0xba, 0xe1, 0x4c, 0x5e, 0x1a, 0x11, 0xe6, - 0x8e, 0x77, 0x65, 0xc9, 0x7f, 0x72, 0xff, 0x43, 0xe8, 0xa8, 0x42, 0xc0, - 0xdb, 0x4f, 0xf6, 0xbd, 0x43, 0xa8, 0xa8, 0xd7, 0xbb, 0xfb, 0x51, 0x8c, - 0xd2, 0xc6, 0x1e, 0x82, 0x48, 0x3f, 0x9d, 0xe4, 0x34, 0xc0, 0xdb, 0x71, - 0x4e, 0x49, 0xb5, 0xe0, 0x77, 0x37, 0x79, 0x08, 0xde, 0xad, 0x61, 0x96, - 0x0b, 0x1e, 0x1a, 0x36, 0xb1, 0xe3, 0xa2, 0x29, 0xc9, 0xfe, 0xf1, 0x07, - 0x32, 0x14, 0x20, 0x62, 0xaf, 0xaf, 0xa4, 0x60, 0xeb, 0xaf, 0xc8, 0x9a, - 0x04, 0xf2, 0xfc, 0x4a, 0x05, 0x77, 0xf2, 0x32, 0x89, 0x1c, 0x9d, 0xeb, - 0xed, 0xa6, 0x33, 0xe8, 0xb4, 0x7e, 0x4f, 0xc5, 0x9e, 0xbd, 0x89, 0x7f, - 0xff, 0x75, 0x02, 0x4a, 0x8a, 0xc5, 0x00, 0xe9, 0x30, 0xe6, 0x7d, 0x01, - 0xfa, 0xcb, 0x2f, 0xd5, 0xf1, 0x36, 0xd3, 0x93, 0xf2, 0x35, 0xc9, 0x6a, - 0x60, 0x94, 0x9f, 0x7d, 0x1d, 0x30, 0x3e, 0x2a, 0xd0, 0xe5, 0xef, 0xd7, - 0xa5, 0xe9, 0xcd, 0x95, 0x91, 0xd0, 0xba, 0x10, 0x25, 0x49, 0xe1, 0xba, - 0x01, 0x7c, 0x9a, 0xff, 0x34, 0x03, 0x2c, 0xda, 0xe2, 0x41, 0x45, 0xb1, - 0xcf, 0x87, 0x30, 0xed, 0xd2, 0xae, 0x08, 0xa9, 0x54, 0x69, 0x0b, 0xcc, - 0x91, 0xb8, 0xc4, 0x2e, 0x9d, 0x18, 0x17, 0x83, 0xdf, 0x1f, 0x69, 0x11, - 0x54, 0x23, 0xd4, 0x9c, 0xd5, 0x5b, 0xd5, 0x5d, 0xf2, 0xe8, 0xa1, 0x12, - 0x19, 0x04, 0xe9, 0x43, 0x10, 0x49, 0xce, 0x9b, 0xfa, 0xac, 0x18, 0xeb, - 0x1b, 0x7f, 0xc0, 0x90, 0x5d, 0x88, 0x47, 0xe7, 0x16, 0x0f, 0x46, 0xd4, - 0x14, 0x2d, 0x1d, 0x42, 0xc1, 0x3e, 0x06, 0x81, 0xfc, 0x25, 0xb9, 0xde, - 0x98, 0x5f, 0x2f, 0xcf, 0x9b, 0x43, 0xe8, 0xc4, 0x1e, 0x6d, 0x0a, 0xce, - 0x29, 0x2f, 0x17, 0x17, 0xfd, 0xbc, 0x57, 0x5c, 0x9e, 0xe5, 0x20, 0x8c, - 0x9f, 0xb3, 0xac, 0xd2, 0xb9, 0x24, 0xba, 0x52, 0xe8, 0xef, 0xcc, 0x3c, - 0x6f, 0xa4, 0x5c, 0x32, 0x2f, 0x94, 0x91, 0xe0, 0x4e, 0xd8, 0x02, 0xce, - 0xbd, 0x28, 0xbf, 0xde, 0x9c, 0xe7, 0x2b, 0xf4, 0x11, 0x67, 0x2a, 0xc9, - 0x06, 0x21, 0x85, 0xae, 0xad, 0xf2, 0x76, 0xee, 0xb1, 0x8e, 0xbe, 0xbb, - 0xff, 0x72, 0x64, 0xd2, 0xe2, 0xa3, 0xa3, 0x81, 0xa5, 0xc8, 0x8c, 0xaf, - 0x4e, 0x7a, 0x5b, 0xcf, 0xbb, 0xc8, 0x52, 0x49, 0xea, 0x08, 0xea, 0xe9, - 0x07, 0xab, 0xb6, 0x97, 0xc4, 0x6d, 0x14, 0xc7, 0xd3, 0x76, 0xda, 0xf8, - 0x0c, 0x24, 0x32, 0x70, 0xcd, 0xf9, 0x9b, 0xc2, 0xa9, 0x76, 0x59, 0x34, - 0x49, 0x34, 0x45, 0x03, 0x1a, 0x7b, 0x80, 0x99, 0xfd, 0xfe, 0x87, 0xff, - 0xe0, 0x44, 0xca, 0xbc, 0x7e, 0xc9, 0x9d, 0x91, 0x1d, 0xb7, 0x4c, 0x23, - 0x6c, 0xa9, 0x84, 0x1a, 0xae, 0xba, 0x09, 0x4c, 0x8a, 0x35, 0x79, 0xc5, - 0x33, 0x13, 0x31, 0xa4, 0x3d, 0x8f, 0x9e, 0x90, 0xba, 0x25, 0x29, 0x90, - 0x49, 0x81, 0xed, 0x3e, 0x57, 0x6d, 0x5c, 0x4b, 0xca, 0x44, 0x3d, 0x79, - 0xa7, 0xf1, 0xa5, 0x41, 0xbc, 0xd4, 0xa0, 0x75, 0x0c, 0x8e, 0x52, 0xeb, - 0x1b, 0x1a, 0xa5, 0xf4, 0xea, 0x02, 0xd5, 0x43, 0x19, 0x0c, 0x05, 0x9d, - 0x4d, 0xb3, 0x15, 0x44, 0x4e, 0x39, 0xbb, 0xb9, 0xf4, 0xee, 0x94, 0x7c, - 0x9e, 0x4e, 0x7b, 0x12, 0x75, 0xf8, 0xd4, 0x88, 0x6a, 0xcd, 0xea, 0x91, - 0x7f, 0x11, 0x82, 0x30, 0x37, 0xb2, 0xc5, 0x7f, 0x4e, 0xac, 0xfe, 0x63, - 0x68, 0x81, 0xdf, 0x61, 0xcc, 0xd2, 0xf9, 0x77, 0xfe, 0xb9, 0x2a, 0x54, - 0x66, 0x0e, 0x57, 0x8f, 0xab, 0xb8, 0xc7, 0xd3, 0x65, 0x9f, 0x00, 0xa2, - 0x0c, 0xfa, 0xb5, 0x24, 0x58, 0x2c, 0x98, 0xb2, 0x2b, 0xa6, 0x99, 0x99, - 0x7c, 0xfd, 0x3b, 0x73, 0x4c, 0x22, 0x15, 0x5a, 0x88, 0x92, 0x8d, 0x49, - 0xa2, 0x67, 0x23, 0x66, 0xf6, 0x7e, 0x73, 0x70, 0xec, 0x5b, 0xd8, 0x21, - 0x7a, 0x41, 0x25, 0xaf, 0xda, 0xb2, 0xa4, 0xf9, 0x6a, 0xd7, 0x2c, 0x8d, - 0xaa, 0x48, 0x3a, 0xc0, 0xa3, 0x2c, 0x02, 0xc1, 0xc0, 0x79, 0x71, 0xeb, - 0xc3, 0x5b, 0x50, 0x4c, 0xc2, 0x84, 0x75, 0x4a, 0xce, 0x0a, 0xbf, 0x50, - 0x75, 0x42, 0xfb, 0xa8, 0x2c, 0x81, 0x68, 0x35, 0x65, 0xf5, 0x02, 0x18, - 0xf7, 0x48, 0xce, 0xa6, 0xe8, 0xef, 0xd2, 0x54, 0x2e, 0x98, 0x08, 0xc3, - 0x94, 0x78, 0xd0, 0x44, 0x3a, 0x63, 0x0a, 0x47, 0xb5, 0xfa, 0xe6, 0x2d, - 0xf1, 0xda, 0xa9, 0x85, 0x85, 0xf1, 0x40, 0x3b, 0xca, 0x92, 0x5d, 0x2e, - 0x02, 0x81, 0x8a, 0x11, 0xa9, 0x5b, 0x01, 0xc2, 0x00, 0x98, 0xdf, 0x43, - 0xa3, 0x9e, 0x23, 0x40, 0x26, 0xc4, 0xaa, 0x67, 0x65, 0x9f, 0xb6, 0x62, - 0x91, 0x55, 0x80, 0xf3, 0x1e, 0x60, 0x9b, 0x2e, 0x3a, 0x23, 0x72, 0x00, - 0xca, 0x66, 0xd1, 0x46, 0xbd, 0x4e, 0x6c, 0xb6, 0x2c, 0xac, 0x97, 0x9a, - 0x47, 0xa0, 0x28, 0xc7, 0x67, 0xc5, 0x9f, 0x21, 0x5f, 0x06, 0x9e, 0x18, - 0x6e, 0x42, 0xdf, 0xb7, 0xa1, 0xff, 0x44, 0xa1, 0xb4, 0x0a, 0x55, 0xa5, - 0xa3, 0x08, 0xc1, 0x3c, 0xea, 0x36, 0xfe, 0x43, 0xc8, 0x0d, 0x0a, 0x7d, - 0x62, 0xfc, 0xda, 0xed, 0x3a, 0x90, 0x63, 0x62, 0x4b, 0xcf, 0x7b, 0x76, - 0x48, 0x09, 0x7e, 0x4f, 0x1a, 0x96, 0xef, 0x3f, 0xb6, 0x00, 0x26, 0xcc, - 0x79, 0x8f, 0xda, 0x65, 0x5e, 0x2a, 0x04, 0x0d, 0xb7, 0x97, 0x1a, 0x4f, - 0x2e, 0x49, 0x27, 0x9a, 0xa9, 0x97, 0x14, 0xdd, 0xf6, 0xf2, 0x74, 0x3f, - 0xc7, 0x1c, 0xe1, 0x55, 0x44, 0xdf, 0x1b, 0x79, 0x90, 0x0f, 0x5b, 0x45, - 0x4c, 0x62, 0xcf, 0x5a, 0x0a, 0xe9, 0x4e, 0xd9, 0x40, 0xee, 0x5d, 0x90, - 0xa5, 0x3b, 0x9c, 0x0b, 0x0c, 0x09, 0xd1, 0xb8, 0x77, 0xc8, 0xd7, 0xf4, - 0x97, 0x46, 0x2d, 0x6e, 0x33, 0xa7, 0xd9, 0xba, 0x13, 0x71, 0x3a, 0x0f, - 0x8c, 0xed, 0xa9, 0xce, 0x2c, 0x22, 0xc8, 0xb6, 0xfa, 0x2f, 0xdc, 0x2c, - 0x0c, 0xe4, 0xa6, 0x55, 0x47, 0x6a, 0xca, 0xc9, 0x48, 0x7f, 0x4b, 0x76, - 0x5b, 0xe9, 0x8f, 0xd1, 0x03, 0x67, 0x2d, 0xae, 0x93, 0x34, 0xe5, 0x22, - 0xb5, 0x43, 0xe1, 0xe4, 0x2b, 0xb0, 0xee, 0x60, 0xa9, 0x56, 0xe7, 0x3e, - 0x91, 0xf7, 0x42, 0x3e, 0x7d, 0xd3, 0x0e, 0xa2, 0x4f, 0xe3, 0xd9, 0x0f, - 0xad, 0x1c, 0xa3, 0x08, 0x66, 0x50, 0x10, 0x09, 0x91, 0x68, 0x1d, 0x4d, - 0xfb, 0x90, 0x56, 0x6f, 0xc5, 0xdb, 0x10, 0x10, 0xd4, 0x13, 0x97, 0x6a, - 0x87, 0xa6, 0x12, 0x35, 0x08, 0xa3, 0x53, 0x2c, 0x09, 0xa6, 0x23, 0x49, - 0xc7, 0xcf, 0x1c, 0xeb, 0x2a, 0x15, 0x8d, 0x7e, 0x48, 0xf4, 0xcb, 0x19, - 0xce, 0x13, 0xec, 0xd5, 0xde, 0x34, 0x1d, 0xc0, 0xc0, 0x21, 0x34, 0x3d, - 0x5e, 0x5b, 0x79, 0x0c, 0x37, 0x08, 0xdd, 0xa7, 0x07, 0x54, 0xb4, 0x48, - 0xa7, 0xe4, 0x5c, 0xb8, 0x13, 0xbd, 0x64, 0x54, 0x57, 0x40, 0x27, 0xcb, - 0x19, 0xc8, 0x92, 0x41, 0x9b, 0x43, 0x4b, 0x0c, 0xb8, 0x2e, 0x06, 0x07, - 0xcb, 0x8e, 0xf0, 0x73, 0x08, 0x30, 0x3b, 0xa9, 0xfe, 0xf7, 0xbf, 0x9b, - 0x90, 0x4f, 0xc1, 0xf0, 0x77, 0x21, 0x8b, 0xfb, 0x90, 0x12, 0x0f, 0x14, - 0x8c, 0x5a, 0x2f, 0xd4, 0x8b, 0x00, 0x4b, 0x62, 0x87, 0x4c, 0xbc, 0x01, - 0x6a, 0x79, 0x33, 0xba, 0x3b, 0xea, 0xd6, 0xc8, 0x9d, 0x51, 0x7c, 0x9b, - 0x9f, 0xc3, 0x11, 0x30, 0x9f, 0x0b, 0x7f, 0x66, 0xfc, 0x9d, 0x1c, 0xd3, - 0x1e, 0x3c, 0x68, 0x0c, 0xff, 0x1f, 0xa6, 0xaa, 0xca, 0x0e, 0xb1, 0xe0, - 0x41, 0xd2, 0x1c, 0xf7, 0xfd, 0xb8, 0x71, 0xa0, 0xf9, 0x7f, 0x52, 0x2d, - 0xb4, 0xeb, 0x00, 0xbc, 0xc4, 0x91, 0xc8, 0xb3, 0x88, 0x6a, 0x10, 0xac, - 0xb3, 0x44, 0x14, 0xf4, 0x66, 0x56, 0x09, 0xf0, 0x3d, 0xf7, 0x23, 0x1b, - 0xca, 0xae, 0xd2, 0xde, 0x20, 0xea, 0x2d, 0x14, 0x57, 0xbb, 0x62, 0xaa, - 0x00, 0x5d, 0xa0, 0x8a, 0xf0, 0x9e, 0xc2, 0x0a, 0x57, 0x5d, 0x67, 0x1c, - 0x4a, 0x7e, 0x4e, 0x5c, 0xbc, 0xf3, 0x89, 0x8f, 0x5e, 0xe8, 0x02, 0xac, - 0xe6, 0x48, 0x93, 0xce, 0xbd, 0x3a, 0xe3, 0x69, 0x91, 0x9e, 0xa1, 0xcc, - 0x19, 0x88, 0xb2, 0xa7, 0x38, 0x66, 0xc7, 0x05, 0xa1, 0x78, 0xe2, 0x12, - 0x26, 0x7c, 0x8f, 0x8f, 0xd8, 0x25, 0x4e, 0x4d, 0xc3, 0x6a, 0x0c, 0xa3, - 0xc8, 0x2e, 0xcf, 0xb5, 0xad, 0xfd, 0x6c, 0xb3, 0xca, 0xb6, 0x26, 0x02, - 0xda, 0x6b, 0x09, 0x5b, 0x62, 0xb2, 0x95, 0x92, 0x2f, 0x07, 0xd2, 0x52, - 0x83, 0x1f, 0x88, 0x44, 0x0d, 0x4c, 0xb0, 0x08, 0xf1, 0xd2, 0x40, 0x61, - 0x6c, 0xc2, 0xab, 0x8c, 0x71, 0xb2, 0x39, 0x34, 0x72, 0xad, 0x5c, 0x38, - 0xf9, 0x2e, 0x5d, 0xda, 0x10, 0xef, 0x7b, 0x55, 0x04, 0xce, 0x28, 0x1c, - 0xab, 0xcd, 0x81, 0xa2, 0xbc, 0x59, 0xf9, 0xeb, 0xc5, 0x3b, 0x03, 0xc8, - 0x8c, 0x05, 0x7d, 0x08, 0x49, 0x2a, 0x51, 0x6f, 0x56, 0x3d, 0x30, 0x02, - 0xf3, 0x8d, 0x55, 0x89, 0x8d, 0x6e, 0x56, 0x94, 0xcc, 0xc8, 0x5a, 0x8c, - 0xe8, 0x26, 0x06, 0x2b, 0xa3, 0x3d, 0x59, 0x3c, 0xa2, 0x75, 0x8c, 0xb6, - 0x73, 0xca, 0x0a, 0xb3, 0x67, 0x93, 0xe3, 0xf4, 0x8f, 0xde, 0x38, 0xe2, - 0x73, 0xe2, 0x7f, 0xd2, 0x8b, 0x78, 0x8e, 0x0c, 0x76, 0xc2, 0x0c, 0x85, - 0xa2, 0x28, 0xc0, 0x90, 0xeb, 0xdc, 0x4b, 0x88, 0x40, 0xcc, 0x05, 0x86, - 0xcc, 0x78, 0x5d, 0xd3, 0x78, 0x7a, 0x8a, 0x96, 0x5e, 0x40, 0x4a, 0x75, - 0xe0, 0x82, 0x63, 0x7c, 0x77, 0x1e, 0xc2, 0x9a, 0xef, 0xe9, 0xbb, 0x3b, - 0x0b, 0x8e, 0x5e, 0x3d, 0xe4, 0xc1, 0x23, 0xf5, 0x2d, 0xf7, 0x32, 0xa1, - 0xca, 0x5d, 0xf6, 0x9b, 0x5b, 0x23, 0xe1, 0x2d, 0xf0, 0x30, 0xd0, 0x82, - 0xa3, 0xac, 0x59, 0xf5, 0x7d, 0x75, 0x0f, 0xd4, 0xe2, 0xad, 0x27, 0x6e, - 0xb9, 0x1b, 0x06, 0xe1, 0xb9, 0x85, 0xe4, 0xdb, 0x02, 0x3b, 0xe1, 0x22, - 0x85, 0x58, 0xa4, 0x6f, 0xde, 0x6b, 0x0c, 0x23, 0xc3, 0x55, 0x63, 0x05, - 0x18, 0xf7, 0xc3, 0xe3, 0x4f, 0xbb, 0x1e, 0x2c, 0x7f, 0x6c, 0xc1, 0x9b, - 0x1f, 0x42, 0x18, 0xa6, 0x63, 0x78, 0xa5, 0x79, 0x35, 0x69, 0x92, 0x72, - 0x76, 0xcf, 0x4f, 0xed, 0xc7, 0x56, 0x51, 0x23, 0x06, 0xf9, 0xfe, 0xe2, - 0x65, 0xf2, 0x54, 0x1a, 0x8f, 0x5b, 0x15, 0x9f, 0xa9, 0xe0, 0x5d, 0xbf, - 0x83, 0x78, 0xc9, 0xf7, 0xdc, 0xe9, 0x47, 0x51, 0xe1, 0x38, 0x3b, 0xa6, - 0xbf, 0x6c, 0x3c, 0xd8, 0xfa, 0xf3, 0xaa, 0x36, 0xbb, 0xa3, 0xa9, 0x5b, - 0xd6, 0x17, 0xfe, 0xfa, 0x13, 0x2e, 0x9f, 0x13, 0x0e, 0x18, 0xd5, 0x8a, - 0x34, 0x92, 0x5f, 0x3f, 0x82, 0x94, 0x4a, 0x44, 0xae, 0x1a, 0xac, 0xf2, - 0x56, 0x55, 0xa5, 0x53, 0xd6, 0x6e, 0x67, 0x8e, 0xd1, 0xaf, 0x37, 0x18, - 0x9d, 0xa2, 0x8e, 0x12, 0x7d, 0x2a, 0x05, 0x98, 0xd7, 0x04, 0xc3, 0xb9, - 0xc5, 0xd9, 0x78, 0xbb, 0x37, 0xbf, 0x65, 0x6e, 0xb9, 0xae, 0xd9, 0xd8, - 0x9a, 0x58, 0x78, 0x57, 0xac, 0xc4, 0xb8, 0x73, 0x42, 0x39, 0x3a, 0xb9, - 0x6f, 0x3a, 0xa0, 0x9b, 0xbb, 0xaa, 0x5b, 0x18, 0x0f, 0x3f, 0xe8, 0xdb, - 0x00, 0x27, 0x8d, 0x50, 0x72, 0x3b, 0x9a, 0x0d, 0x92, 0xbb, 0x42, 0x7b, - 0x2b, 0x9c, 0x55, 0x8c, 0x57, 0x32, 0x41, 0x10, 0x6a, 0x53, 0x31, 0xfe, - 0x4e, 0x87, 0xfb, 0xc9, 0x77, 0x3b, 0x48, 0x71, 0x30, 0x42, 0xf2, 0xaa, - 0x08, 0xed, 0x3f, 0xec, 0x64, 0xe1, 0x52, 0x0f, 0xba, 0xce, 0xb3, 0xe6, - 0x64, 0x82, 0x9c, 0x12, 0x70, 0x98, 0xe6, 0xbb, 0xc4, 0x3a, 0xe1, 0xab, - 0x29, 0x98, 0x75, 0xbc, 0x2b, 0xc5, 0xa8, 0x14, 0x69, 0x1a, 0x7b, 0xc4, - 0x97, 0x22, 0xb5, 0xee, 0x64, 0x8e, 0x04, 0x4c, 0x4b, 0x8e, 0x21, 0x8d, - 0x8a, 0xf2, 0xe4, 0xba, 0x76, 0xb6, 0xb7, 0x8d, 0x36, 0x45, 0x47, 0x7f, - 0x58, 0xf6, 0x72, 0x90, 0xe2, 0xa8, 0x32, 0x15, 0x46, 0x52, 0x3d, 0x55, - 0xbd, 0x30, 0xf5, 0x75, 0x90, 0x37, 0xf2, 0x2f, 0x77, 0x0d, 0xac, 0x28, - 0x99, 0xd3, 0xe6, 0x7f, 0x7f, 0x2d, 0xa3, 0x42, 0x86, 0x50, 0x87, 0x73, - 0xc0, 0x59, 0xc4, 0x57, 0x50, 0x0f, 0x70, 0x26, 0x56, 0x24, 0xbc, 0x6d, - 0xdc, 0x57, 0x4c, 0x75, 0xf7, 0xa1, 0x7b, 0x14, 0xad, 0x12, 0xef, 0xfe, - 0x7e, 0x12, 0x7e, 0xe7, 0x56, 0x8e, 0x73, 0x6f, 0x8a, 0xce, 0x63, 0x9b, - 0x19, 0x70, 0xd3, 0x1f, 0xa0, 0x79, 0x8d, 0xc5, 0xc7, 0x61, 0x82, 0xae, - 0x18, 0x16, 0xa1, 0x27, 0xe3, 0xdd, 0x65, 0xa6, 0x7a, 0x0a, 0xed, 0x50, - 0x16, 0x47, 0x9e, 0x35, 0xea, 0x0e, 0xfb, 0x76, 0x1b, 0xfa, 0xfd, 0x96, - 0x92, 0xf5, 0x94, 0x2e, 0x22, 0xe3, 0x43, 0x65, 0x69, 0x0c, 0x15, 0x0d, - 0x19, 0xee, 0xf1, 0x78, 0xca, 0x11, 0xcf, 0x5f, 0x23, 0xc0, 0xc9, 0x0e, - 0xac, 0xe7, 0xe9, 0xfc, 0x6a, 0xb4, 0x29, 0x66, 0x9b, 0xe7, 0xe3, 0x5e, - 0x60, 0x5a, 0x79, 0x85, 0x53, 0x80, 0x78, 0xd8, 0x08, 0x5d, 0x8c, 0x88, - 0x72, 0x1e, 0x92, 0x1f, 0xa8, 0xb2, 0x85, 0xc5, 0x17, 0xb5, 0x9f, 0x65, - 0xea, 0x33, 0xe0, 0xa3, 0x6c, 0x1c, 0xaf, 0xbd, 0x0e, 0x03, 0xcb, 0x75, - 0x46, 0xc6, 0x21, 0x3b, 0x4b, 0xf6, 0x3b, 0xa9, 0x5c, 0x2b, 0xb8, 0x74, - 0x04, 0x0a, 0x66, 0x08, 0xa6, 0x0b, 0x26, 0x5a, 0xdc, 0xd4, 0x93, 0x02, - 0x83, 0x66, 0x78, 0x7e, 0x1e, 0x87, 0x5c, 0xa0, 0x0a, 0xc3, 0x50, 0x90, - 0xce, 0x62, 0x12, 0x08, 0x2b, 0x7c, 0xb7, 0xdd, 0x88, 0xcb, 0xdc, 0xed, - 0x3e, 0x85, 0x25, 0xf8, 0xf3, 0xea, 0x2d, 0x01, 0xf0, 0xfc, 0x9c, 0x19, - 0x08, 0x41, 0x8b, 0x22, 0x94, 0xbe, 0xa8, 0x56, 0x5f, 0xce, 0x1f, 0xce, - 0xe7, 0x74, 0x8c, 0xea, 0x7b, 0x97, 0x49, 0x2b, 0x9d, 0x7a, 0x26, 0xd3, - 0x97, 0x79, 0x81, 0x4d, 0x83, 0x4c, 0x83, 0x33, 0xd5, 0xaa, 0xe2, 0x59, - 0xe9, 0xcc, 0x9f, 0xf9, 0x02, 0xee, 0xab, 0x4e, 0x17, 0x7e, 0xdd, 0x00, - 0xb6, 0x61, 0x2f, 0xc4, 0x27, 0x96, 0x7c, 0xbb, 0x77, 0xcf, 0x68, 0x8d, - 0xac, 0x08, 0xea, 0x38, 0xc8, 0x2e, 0x77, 0x7e, 0xd7, 0x42, 0xb3, 0x56, - 0xf1, 0xba, 0xdc, 0xcd, 0x8d, 0xa4, 0xdd, 0xa0, 0x35, 0x17, 0x84, 0x86, - 0x34, 0xb5, 0xa3, 0xf8, 0xca, 0x8a, 0x0f, 0xc3, 0x91, 0xa1, 0xa7, 0x8a, - 0x52, 0x29, 0x53, 0xe1, 0x4f, 0xd4, 0x9e, 0xd3, 0xee, 0x6d, 0xdc, 0x09, - 0x69, 0xef, 0x07, 0x04, 0x6c, 0x44, 0xe0, 0x67, 0xb5, 0x41, 0x2b, 0x8e, - 0x8a, 0x9b, 0x52, 0xe9, 0x24, 0x44, 0x79, 0x3a, 0xa3, 0x91, 0x18, 0x22, - 0x77, 0x45, 0xb7, 0xe1, 0xc9, 0xdb, 0xd9, 0x2b, 0x1c, 0x21, 0xf4, 0x42, - 0x36, 0x20, 0x4b, 0x97, 0xe7, 0x0c, 0xcd, 0x19, 0xfb, 0x74, 0x68, 0xc9, - 0xd2, 0x95, 0x26, 0x52, 0x2c, 0x29, 0x97, 0x77, 0x78, 0xd2, 0x74, 0xea, - 0x80, 0x17, 0xc2, 0x36, 0x66, 0xa9, 0x3e, 0x93, 0x66, 0x44, 0x08, 0xa9, - 0x1d, 0xa9, 0xd6, 0xf6, 0x53, 0xa0, 0x77, 0xaf, 0x1a, 0x0c, 0x33, 0xb0, - 0xe2, 0x9f, 0x43, 0xcf, 0x6d, 0x66, 0x52, 0xab, 0xf4, 0x86, 0xf3, 0x8c, - 0x88, 0x56, 0xa0, 0xfb, 0xb3, 0xa9, 0x05, 0xbe, 0x98, 0x11, 0xed, 0xea, - 0x8f, 0x49, 0xf3, 0x44, 0x12, 0x6b, 0x4c, 0x8d, 0x36, 0xbe, 0xb5, 0xa7, - 0x38, 0xc8, 0xdc, 0x43, 0x52, 0x99, 0xf5, 0x04, 0x6c, 0x10, 0x3b, 0x7a, - 0xa9, 0xab, 0x75, 0xce, 0x6f, 0x7a, 0x35, 0xcf, 0xc2, 0x7e, 0x81, 0xc6, - 0xe5, 0x93, 0x96, 0x31, 0x4f, 0xa9, 0xbf, 0x5b, 0x67, 0x2a, 0x0e, 0x29, - 0xc7, 0xa1, 0x35, 0x27, 0xc5, 0xb4, 0xc8, 0x18, 0xfa, 0xc4, 0x27, 0x98, - 0x3a, 0xa0, 0x47, 0x49, 0xc2, 0x8b, 0x3d, 0x42, 0xbf, 0x98, 0xa4, 0x35, - 0x63, 0x3f, 0x1d, 0xa3, 0xe5, 0x62, 0xb3, 0x1b, 0x70, 0x61, 0xb7, 0x87, - 0x79, 0x13, 0x87, 0xaf, 0x4e, 0xc5, 0xa2, 0xf4, 0x8e, 0x98, 0x8a, 0xc0, - 0x42, 0x87, 0x1a, 0x55, 0x13, 0x72, 0x89, 0x44, 0xb1, 0x84, 0x76, 0x22, - 0x35, 0x9f, 0xf6, 0x6f, 0x57, 0x2d, 0x4e, 0x79, 0x7a, 0xa4, 0xf9, 0x9d, - 0xf0, 0xf9, 0x81, 0x9e, 0x9f, 0xd4, 0x4b, 0xf0, 0xa0, 0xbb, 0xd3, 0x78, - 0x36, 0x26, 0xda, 0xa7, 0xcc, 0x27, 0xa7, 0x67, 0x15, 0xe4, 0x17, 0x07, - 0x87, 0x88, 0xf5, 0xab, 0x86, 0xb4, 0xae, 0x70, 0x5a, 0x07, 0x47, 0x5f, - 0xf7, 0x50, 0x15, 0xad, 0x79, 0xcc, 0x6f, 0xdd, 0x04, 0x72, 0xad, 0x3b, - 0xc4, 0x48, 0xad, 0x93, 0x4b, 0x5f, 0xbb, 0xb0, 0x65, 0x0c, 0x65, 0x5d, - 0xe4, 0x5a, 0xbf, 0xe1, 0xec, 0x1c, 0x39, 0xfb, 0xda, 0xf3, 0x4b, 0xb4, - 0x84, 0x02, 0x91, 0x12, 0x5b, 0xa4, 0xd5, 0x91, 0x17, 0x86, 0x39, 0xa5, - 0x64, 0xef, 0x81, 0x99, 0x27, 0x02, 0x91, 0x0a, 0xbd, 0xf3, 0xa5, 0x30, - 0xcf, 0x3e, 0xc7, 0x5b, 0xc0, 0x24, 0xa6, 0x54, 0xe7, 0x2e, 0xaf, 0x3c, - 0xcf, 0xfe, 0x95, 0x9f, 0xda, 0xf3, 0x57, 0x85, 0xa1, 0x11, 0x79, 0x78, - 0xc0, 0xd6, 0x11, 0xd9, 0x27, 0x17, 0x27, 0x8b, 0xf6, 0x03, 0x73, 0x0c, - 0x2b, 0x8a, 0x02, 0xeb, 0x9e, 0xc4, 0x17, 0x0e, 0x9c, 0xf8, 0x5d, 0x45, - 0xbf, 0xb2, 0x6f, 0x9f, 0x67, 0x95, 0xad, 0x9c, 0xf8, 0x75, 0xf3, 0x9a, - 0x2c, 0x76, 0x0e, 0xcb, 0x76, 0x00, 0x6b, 0x43, 0xeb, 0x14, 0x42, 0xee, - 0xad, 0x96, 0xf1, 0x9e, 0x6a, 0x77, 0x4c, 0x90, 0x2b, 0x17, 0xa4, 0xdb, - 0xdc, 0x8a, 0x13, 0x4f, 0xe5, 0x54, 0xf0, 0x00, 0xe2, 0x3a, 0x23, 0x93, - 0xbd, 0x51, 0x72, 0xaf, 0x24, 0x75, 0x1a, 0x22, 0x5f, 0x9b, 0xc1, 0x91, - 0x57, 0x86, 0x6c, 0x4b, 0xd7, 0x36, 0x58, 0xc1, 0x52, 0x14, 0x04, 0x85, - 0xd5, 0x40, 0x1f, 0x6a, 0xf9, 0x5b, 0xd3, 0xa9, 0x82, 0x19, 0xfe, 0xa5, - 0x3f, 0xef, 0x37, 0x13, 0xc6, 0xcc, 0x54, 0xb5, 0xac, 0xc1, 0x87, 0xbc, - 0x13, 0xee, 0x17, 0x86, 0x00, 0x1e, 0x37, 0x9c, 0xe1, 0x3e, 0x90, 0x02, - 0x92, 0x12, 0x33, 0x5f, 0x8f, 0x80, 0xb2, 0x06, 0x4e, 0x97, 0x3e, 0x0a, - 0x2c, 0x2f, 0x1b, 0x1b, 0x53, 0xde, 0x64, 0x28, 0x73, 0x0d, 0x87, 0x0f, - 0xa1, 0x8a, 0x4d, 0xb1, 0x1d, 0x5c, 0xb1, 0x58, 0x58, 0x95, 0x3d, 0x30, - 0xf7, 0x34, 0xcc, 0x88, 0x75, 0xb4, 0x7a, 0x6e, 0x51, 0x37, 0x4f, 0xc1, - 0xae, 0xe6, 0xa9, 0x92, 0x7e, 0xc5, 0x1b, 0x57, 0xce, 0xfb, 0xcb, 0x83, - 0x22, 0x75, 0x82, 0x5e, 0x02, 0xae, 0x99, 0x1c, 0xdc, 0x48, 0xcd, 0x4c, - 0xfe, 0x04, 0xf6, 0x73, 0x84, 0xfd, 0x72, 0xff, 0x47, 0x4e, 0xb7, 0x6a, - 0xc2, 0xcf, 0x4c, 0x26, 0x2d, 0x20, 0x63, 0x10, 0x1f, 0xfd, 0x62, 0x86, - 0x3e, 0x22, 0x74, 0xf1, 0xa7, 0x12, 0x2c, 0x6f, 0x4b, 0x51, 0x04, 0xcb, - 0x99, 0x98, 0x66, 0x90, 0xab, 0x7e, 0xd6, 0x99, 0xbc, 0xb0, 0x94, 0x82, - 0x55, 0xa3, 0x9b, 0xf4, 0x78, 0x49, 0xd4, 0x89, 0xc6, 0xd5, 0x57, 0x46, - 0x3f, 0x42, 0xbc, 0x33, 0xd2, 0x31, 0x6f, 0xc9, 0xe3, 0x8c, 0xc9, 0x07, - 0xd0, 0xb6, 0xdd, 0x0b, 0x12, 0xf6, 0xe3, 0x96, 0xf3, 0xcc, 0x67, 0x4a, - 0xa9, 0x5b, 0xcf, 0x92, 0x33, 0x41, 0xd7, 0x21, 0xa1, 0x2c, 0x5a, 0xde, - 0x28, 0x6c, 0x2b, 0x15, 0xb6, 0xeb, 0xc9, 0x10, 0x47, 0x35, 0x6c, 0x1d, - 0xcf, 0x8c, 0x10, 0x6a, 0xc9, 0xb7, 0x40, 0xfb, 0x49, 0xbe, 0xab, 0x92, - 0x60, 0xff, 0xc1, 0x2a, 0x9c, 0xa5, 0x20, 0xd3, 0x15, 0x37, 0xe2, 0xbd, - 0x18, 0xc7, 0x80, 0xac, 0xcf, 0x0b, 0x59, 0x6f, 0x38, 0x52, 0x86, 0x73, - 0x1d, 0xf3, 0x4d, 0x70, 0x57, 0x87, 0xe3, 0xe4, 0x8a, 0xdd, 0xc5, 0x11, - 0x8b, 0xdd, 0x8f, 0xc9, 0x86, 0x4b, 0x4d, 0x20, 0xe2, 0x42, 0x4d, 0x21, - 0x5b, 0x2a, 0xf8, 0x87, 0xcb, 0x43, 0xb1, 0xc4, 0xdb, 0xb3, 0xc6, 0xf9, - 0xca, 0x15, 0x62, 0x83, 0xcf, 0x32, 0x52, 0x9d, 0xc0, 0xc2, 0x0e, 0xcf, - 0xc0, 0x93, 0xc6, 0x51, 0xdd, 0xb8, 0x53, 0xc9, 0x73, 0x2b, 0x54, 0x42, - 0xb8, 0x44, 0x6e, 0x8b, 0x3c, 0xc4, 0x29, 0xb7, 0xba, 0xa4, 0x30, 0x53, - 0x08, 0xd6, 0x66, 0xbd, 0x07, 0xff, 0xec, 0x69, 0x61, 0x38, 0x41, 0xf6, - 0xaa, 0x23, 0xac, 0xbf, 0xd5, 0x5c, 0x37, 0x2e, 0x9b, 0xf9, 0x10, 0xa6, - 0x7e, 0x74, 0x3c, 0x91, 0x75, 0xac, 0x85, 0xa8, 0xb1, 0xbb, 0x43, 0x81, - 0x24, 0xb4, 0x96, 0x31, 0x3a, 0x91, 0x64, 0x74, 0x1a, 0xb4, 0x9c, 0x84, - 0x90, 0xc4, 0x1f, 0x06, 0x8e, 0x70, 0x00, 0x36, 0x01, 0xe6, 0x3f, 0x4b, - 0xc9, 0xf4, 0x02, 0xf7, 0x28, 0xd9, 0x0c, 0xc5, 0x7b, 0x8f, 0x8a, 0x53, - 0x8f, 0x2a, 0xc7, 0x98, 0xb1, 0xd8, 0x3f, 0x85, 0x3f, 0xcc, 0xcd, 0xf1, - 0x71, 0xc5, 0x86, 0x17, 0x48, 0xbf, 0xd5, 0x37, 0x71, 0x55, 0x27, 0xe0, - 0x63, 0x48, 0x7c, 0x5f, 0x7b, 0xb4, 0x90, 0x62, 0xbd, 0x33, 0xd4, 0xa7, - 0xfc, 0x5f, 0x35, 0x36, 0xa0, 0x39, 0x5c, 0x06, 0x59, 0xfd, 0x16, 0x3b, - 0x98, 0xb0, 0xfe, 0x16, 0xc0, 0xb3, 0x3c, 0xaf, 0x90, 0xbe, 0x2c, 0x64, - 0xff, 0xe1, 0xbc, 0xfc, 0x74, 0x48, 0x95, 0xa0, 0xd3, 0x13, 0x10, 0x76, - 0xc9, 0xbe, 0x47, 0x9a, 0xf3, 0xe4, 0xd9, 0x31, 0x88, 0xfa, 0xbd, 0x13, - 0x1e, 0x37, 0x57, 0x1a, 0x06, 0x41, 0x0c, 0xd9, 0x0e, 0x48, 0x4b, 0xed, - 0x81, 0xaf, 0xe9, 0x72, 0x7b, 0x73, 0x44, 0x57, 0x28, 0xaa, 0xe7, 0x57, - 0xd2, 0xad, 0x03, 0xa3, 0xc6, 0xdc, 0xaa, 0x96, 0x4e, 0xe0, 0x55, 0x4d, - 0x0d, 0x21, 0x23, 0x81, 0x46, 0x2d, 0x37, 0x29, 0x7e, 0x31, 0xa8, 0x86, - 0x97, 0x0b, 0x6f, 0xb1, 0x09, 0x5a, 0x84, 0x26, 0x90, 0xa3, 0x19, 0xaf, - 0x9b, 0xb8, 0x3f, 0xf0, 0x2b, 0x14, 0x21, 0x1e, 0xab, 0x8e, 0x58, 0x83, - 0x52, 0x59, 0x5e, 0xd0, 0x2e, 0x27, 0x30, 0x2e, 0xf7, 0xc0, 0x84, 0xa1, - 0x28, 0x62, 0xdb, 0xe2, 0xce, 0xee, 0x05, 0xc9, 0x55, 0x0f, 0x44, 0x3c, - 0xc2, 0x08, 0x06, 0x54, 0x56, 0x5f, 0x1e, 0x8f, 0xc5, 0x52, 0xc1, 0x2b, - 0x65, 0xb4, 0xa0, 0xb4, 0x10, 0xce, 0xe0, 0xdc, 0xf9, 0xc9, 0xfe, 0x3c, - 0x99, 0x3d, 0xe9, 0xf7, 0xc0, 0xbb, 0x16, 0x1d, 0xe2, 0x01, 0xb7, 0x15, - 0x62, 0x44, 0x65, 0x5c, 0x8f, 0x0f, 0xd1, 0x3f, 0xae, 0xc6, 0x7b, 0x2f, - 0xc4, 0x75, 0xc1, 0x44, 0x69, 0x50, 0x11, 0x70, 0x6b, 0xb2, 0x30, 0x59, - 0xa4, 0xc9, 0xb5, 0xe1, 0x44, 0x63, 0xf3, 0x9b, 0x4f, 0xfe, 0xc3, 0xa3, - 0x46, 0xb7, 0x7e, 0x67, 0xac, 0xd3, 0x48, 0x2e, 0x53, 0xd9, 0x37, 0xb3, - 0x6b, 0x1e, 0xd1, 0x74, 0x02, 0xf9, 0xf4, 0xba, 0xd5, 0x46, 0x2e, 0xfd, - 0x7f, 0x4b, 0xbb, 0xb6, 0xc6, 0x16, 0xf0, 0xd5, 0x0b, 0x3b, 0x89, 0xe4, - 0x1b, 0x4b, 0x27, 0x1b, 0xb6, 0x40, 0x0f, 0xe4, 0xa9, 0xe2, 0x4d, 0xcb, - 0x53, 0xe0, 0xd2, 0xf8, 0x6f, 0x5a, 0x32, 0x9d, 0x63, 0x86, 0x96, 0xae, - 0x56, 0x1e, 0xae, 0xf9, 0x97, 0x3d, 0xfb, 0xe2, 0x3d, 0x1b, 0x55, 0xde, - 0xc0, 0x5c, 0xd6, 0x0e, 0x75, 0x1d, 0x7e, 0x1d, 0xd9, 0x9a, 0xb9, 0x37, - 0xeb, 0xe4, 0x96, 0x21, 0xf2, 0xab, 0x62, 0xe1, 0x81, 0x6b, 0x82, 0x04, - 0x90, 0x7b, 0x61, 0x6c, 0xe5, 0x44, 0xce, 0x4e, 0x4b, 0xa5, 0xce, 0xde, - 0x97, 0x41, 0x9c, 0x4d, 0x6b, 0xd1, 0x1a, 0x4f, 0xf7, 0xc5, 0xc8, 0x34, - 0x0a, 0x5f, 0x58, 0xac, 0xc3, 0x85, 0xd5, 0xa1, 0x83, 0xba, 0x7d, 0x4b, - 0xe7, 0x40, 0x27, 0x21, 0x13, 0x59, 0x75, 0x6e, 0x7b, 0x77, 0x36, 0xa4, - 0x7b, 0xfb, 0x27, 0x42, 0xc3, 0xdb, 0xeb, 0x31, 0xfb, 0xb9, 0x78, 0x7a, - 0x94, 0x62, 0x74, 0x20, 0xc3, 0x46, 0x77, 0x3d, 0x5c, 0xa2, 0xd4, 0x90, - 0x24, 0x4d, 0xb0, 0xd2, 0xb6, 0xce, 0xcb, 0x3d, 0x77, 0xdc, 0x35, 0xb9, - 0x53, 0x25, 0xea, 0x40, 0x1f, 0xe4, 0x6a, 0x49, 0x95, 0xb8, 0xc6, 0xaf, - 0x4c, 0xb4, 0xc2, 0x3f, 0x1f, 0x14, 0xc6, 0x94, 0xab, 0xe7, 0xee, 0x6f, - 0x83, 0xe6, 0x2a, 0x41, 0x29, 0x8c, 0x0f, 0xb1, 0x5d, 0xe3, 0xa3, 0x8f, - 0x8b, 0x72, 0xd5, 0x32, 0xca, 0x15, 0xe9, 0x46, 0x32, 0xec, 0xc2, 0x80, - 0x35, 0xaa, 0xa7, 0x86, 0x69, 0x19, 0xdb, 0x12, 0xe2, 0x3f, 0x47, 0xae, - 0x5a, 0xeb, 0xe1, 0xda, 0xce, 0x3b, 0x4c, 0xe5, 0x24, 0xdf, 0xaf, 0x14, - 0x65, 0x31, 0xe3, 0x84, 0x3f, 0xba, 0x5b, 0x8f, 0x5b, 0x44, 0x57, 0x6f, - 0x2f, 0xf4, 0x3a, 0xd9, 0x70, 0x18, 0xb9, 0xcb, 0x34, 0x4a, 0xf9, 0xb0, - 0x3b, 0xf7, 0x8c, 0xf0, 0xa0, 0x67, 0x0a, 0xf4, 0xc0, 0xfa, 0x4c, 0x55, - 0xeb, 0xe5, 0xdb, 0xee, 0x19, 0x51, 0xa4, 0xca, 0x8d, 0xe1, 0x9f, 0x1f, - 0x1d, 0xa8, 0x4c, 0xfe, 0xf5, 0x23, 0xe2, 0x2d, 0x74, 0x6b, 0x73, 0x7f, - 0xea, 0x84, 0x03, 0x55, 0xb6, 0x57, 0xc8, 0x56, 0x17, 0x15, 0x38, 0xd2, - 0xbb, 0xde, 0xe5, 0x95, 0x06, 0xb9, 0xad, 0x22, 0xfb, 0xdc, 0x21, 0x07, - 0x3f, 0x43, 0x38, 0xaf, 0xdf, 0xdf, 0x5b, 0x35, 0xec, 0x43, 0xaf, 0x37, - 0xff, 0x3b, 0x8a, 0x5e, 0x64, 0x93, 0xb4, 0x5e, 0x49, 0x2d, 0x5b, 0x5a, - 0xa0, 0x21, 0xb0, 0x17, 0x00, 0x0b, 0x58, 0x6e, 0xde, 0x4b, 0x42, 0x1c, - 0x3f, 0xc3, 0x53, 0xc1, 0xa7, 0x65, 0xff, 0x9a, 0x28, 0xce, 0xcd, 0xeb, - 0xcc, 0xaf, 0xa1, 0xb0, 0xe6, 0xea, 0x28, 0xdf, 0x93, 0x6d, 0xee, 0xba, - 0x35, 0x96, 0x7d, 0x8b, 0x09, 0x1a, 0xa8, 0x4a, 0x64, 0xaa, 0x39, 0xfb, - 0xcf, 0xcb, 0x80, 0x6d, 0x79, 0xe5, 0x88, 0x9b, 0x62, 0x78, 0x1b, 0x1d, - 0x37, 0xc9, 0x3d, 0x2d, 0xba, 0xe2, 0x8e, 0x9a, 0xd0, 0xba, 0xb2, 0xb5, - 0x5f, 0x58, 0x5d, 0x29, 0x7c, 0xc4, 0xa8, 0x3d, 0xd1, 0x83, 0x33, 0xea, - 0xf4, 0x03, 0x78, 0xac, 0x53, 0x5e, 0x6e, 0x6a, 0x3c, 0x81, 0x6b, 0x83, - 0x22, 0x77, 0xe7, 0x35, 0xe0, 0x16, 0xd5, 0x66, 0xb5, 0x09, 0x40, 0x42, - 0xf6, 0x8c, 0x52, 0x11, 0x37, 0x49, 0x86, 0xf1, 0xf8, 0x9b, 0x3c, 0x18, - 0x07, 0xb4, 0x91, 0x43, 0x74, 0x0c, 0x46, 0xff, 0xda, 0x8f, 0x03, 0xd9, - 0x5b, 0xab, 0x35, 0x78, 0x04, 0xc3, 0xdd, 0xa3, 0xcb, 0xab, 0x33, 0x58, - 0x76, 0x20, 0xc2, 0xb2, 0x37, 0xdc, 0x71, 0x48, 0xc5, 0xc0, 0x13, 0x6a, - 0x8b, 0xaf, 0xaf, 0xaa, 0xb6, 0xb8, 0xa0, 0x44, 0xd9, 0x8b, 0x68, 0x33, - 0xd5, 0xd0, 0xe0, 0x1b, 0x3e, 0x36, 0x47, 0x8d, 0x42, 0xcd, 0x42, 0x8c, - 0x1f, 0x8e, 0x93, 0xae, 0xf7, 0xba, 0x6b, 0xd0, 0x73, 0xc3, 0xa5, 0x83, - 0xb3, 0xfd, 0x88, 0x55, 0x88, 0x43, 0x12, 0x72, 0x42, 0x76, 0xb3, 0xf4, - 0x8a, 0x6e, 0x17, 0x64, 0x5f, 0x08, 0x76, 0xb1, 0xfe, 0x82, 0xa6, 0xff, - 0x38, 0x59, 0x25, 0xa5, 0x30, 0x88, 0x34, 0xe0, 0x4b, 0x32, 0x90, 0x6b, - 0x18, 0x5a, 0x29, 0xd8, 0xc5, 0x17, 0x30, 0xa7, 0xe8, 0x02, 0x56, 0xe4, - 0x07, 0x36, 0xf6, 0x4d, 0x1a, 0x97, 0xd5, 0x66, 0xc4, 0x2c, 0xbd, 0xe5, - 0xf9, 0x09, 0xc5, 0xb8, 0x5c, 0x13, 0x81, 0x99, 0xab, 0x51, 0x0b, 0x36, - 0xe7, 0xf0, 0x37, 0x0f, 0xb1, 0xb4, 0xcb, 0x66, 0xa7, 0x09, 0x8e, 0xbf, - 0xee, 0xdb, 0x6d, 0x53, 0xc0, 0x00, 0x66, 0x8f, 0x67, 0x7d, 0xdf, 0x7b, - 0x5c, 0xf2, 0x38, 0xac, 0x08, 0x59, 0x72, 0x24, 0x7b, 0xd8, 0x2b, 0xa9, - 0x37, 0x1e, 0x10, 0x5a, 0xeb, 0x8d, 0x08, 0x8d, 0xf0, 0x88, 0xac, 0x28, - 0x7c, 0xf6, 0xb2, 0x6a, 0xfd, 0xc3, 0x56, 0xdd, 0xd3, 0xe4, 0xcb, 0xb4, - 0x42, 0x0a, 0x66, 0xc9, 0x4e, 0x97, 0xa8, 0x67, 0xbf, 0xe5, 0x22, 0xb3, - 0x6b, 0x42, 0x1e, 0x46, 0xe4, 0x68, 0x8f, 0xc7, 0xd0, 0xbb, 0x08, 0x0b, - 0x3d, 0xb3, 0xfe, 0x03, 0xe2, 0x79, 0x94, 0x69, 0x45, 0x75, 0xd1, 0x05, - 0x7d, 0xa2, 0x3a, 0x4b, 0xe1, 0x75, 0x37, 0xe1, 0x58, 0xd8, 0x0e, 0xc8, - 0xc7, 0x32, 0xde, 0x9c, 0x0f, 0xb2, 0x15, 0x25, 0x27, 0xa9, 0xf2, 0xd9, - 0xda, 0xe9, 0xe5, 0x00, 0x50, 0xe8, 0x7f, 0x78, 0x8b, 0x49, 0x19, 0xbb, - 0xa5, 0xcb, 0xb8, 0x88, 0x45, 0xcc, 0x4e, 0x79, 0xe2, 0x6b, 0x6a, 0x32, - 0x72, 0x5c, 0xa8, 0xf5, 0x17, 0x1a, 0x19, 0xe8, 0xba, 0xc8, 0x76, 0x8c, - 0xfb, 0x04, 0x00, 0x99, 0x51, 0x53, 0xb2, 0xbb, 0x25, 0x25, 0x39, 0x44, - 0x8a, 0xa6, 0x45, 0x45, 0xb7, 0x1e, 0x60, 0x77, 0x1d, 0x97, 0x78, 0x22, - 0x9d, 0x48, 0x74, 0x60, 0x1c, 0x41, 0xc0, 0x38, 0x42, 0x9b, 0xb4, 0xf9, - 0x4b, 0x5b, 0x39, 0xfa, 0xb5, 0xae, 0xd5, 0x83, 0x87, 0xa6, 0xa6, 0xad, - 0x7a, 0xf1, 0x9a, 0x20, 0xf1, 0x40, 0x24, 0xe9, 0x9f, 0xeb, 0x98, 0x91, - 0x23, 0xe8, 0x3e, 0x6c, 0x54, 0x4c, 0x5b, 0x99, 0xa6, 0x04, 0xb9, 0x07, - 0x0d, 0x9e, 0xdd, 0x24, 0x4f, 0x3a, 0x75, 0x6c, 0xa1, 0x66, 0xe9, 0x99, - 0xea, 0x14, 0x48, 0x78, 0x8b, 0x31, 0x82, 0x02, 0x14, 0x5c, 0xc4, 0x57, - 0xf5, 0x14, 0x37, 0xdd, 0xb1, 0x22, 0x6c, 0xbd, 0xe2, 0x88, 0xe3, 0x3a, - 0x51, 0xde, 0xc5, 0x9a, 0xa8, 0x76, 0x8d, 0xa5, 0x6a, 0x24, 0x9f, 0xaa, - 0x5f, 0xc9, 0x16, 0x63, 0x6d, 0x68, 0x01, 0x7d, 0xee, 0x36, 0xa9, 0xdc, - 0x61, 0x2f, 0x43, 0x86, 0xfe, 0x26, 0xeb, 0xfb, 0xba, 0x6b, 0x8c, 0x3b, - 0x94, 0xec, 0x7f, 0x99, 0x3c, 0x95, 0x4a, 0x69, 0x52, 0x96, 0xcf, 0x81, - 0x49, 0x83, 0x7f, 0xfe, 0xe2, 0xe8, 0xce, 0x0a, 0xdf, 0xd9, 0x6b, 0xcf, - 0x05, 0xbe, 0xfa, 0x98, 0x7f, 0xbb, 0xee, 0xa1, 0x9f, 0x49, 0xf4, 0x64, - 0x2d, 0xc0, 0x4f, 0x3c, 0x8a, 0x98, 0xf3, 0x57, 0x2c, 0x9c, 0x6c, 0x06, - 0x98, 0x44, 0x17, 0xf9, 0x5d, 0xcf, 0x7e, 0xa2, 0xd4, 0xfc, 0xcb, 0x10, - 0x93, 0xe5, 0x6d, 0x89, 0x7f, 0x76, 0x44, 0x19, 0x85, 0x89, 0x89, 0x9c, - 0x77, 0xca, 0x73, 0xea, 0xb5, 0xa8, 0x37, 0x2c, 0xdb, 0x68, 0x6f, 0xb8, - 0xb3, 0x23, 0x42, 0x99, 0x03, 0xb1, 0x6f, 0x09, 0xa0, 0x92, 0x45, 0xff, - 0xee, 0xbb, 0xef, 0x31, 0xfa, 0x0a, 0x13, 0xe6, 0x08, 0x72, 0x11, 0x57, - 0x3a, 0xe7, 0xee, 0x17, 0x06, 0x90, 0xac, 0x26, 0x88, 0x83, 0x43, 0x58, - 0x6e, 0x87, 0x80, 0xd3, 0x5f, 0x0c, 0x12, 0x2b, 0x73, 0x1b, 0x3c, 0xcb, - 0xd2, 0x66, 0x72, 0xf7, 0x05, 0x05, 0x89, 0x2a, 0x5b, 0x60, 0xda, 0x8d, - 0x6c, 0xd4, 0xe2, 0x06, 0xed, 0xe7, 0x8e, 0xb5, 0x31, 0x26, 0x89, 0x03, - 0x53, 0xc9, 0x96, 0xad, 0x88, 0xd9, 0x2e, 0xce, 0x02, 0x19, 0xe6, 0x71, - 0x2f, 0x85, 0xa9, 0x91, 0xc9, 0xaf, 0x9d, 0x3b, 0xc0, 0x51, 0xf2, 0x91, - 0xd6, 0xb4, 0xc4, 0xbd, 0xee, 0x5f, 0x3f, 0xcb, 0x65, 0x0e, 0xd5, 0x23, - 0x35, 0xbc, 0x98, 0x78, 0x34, 0x00, 0x17, 0xf7, 0x43, 0x32, 0x51, 0xdd, - 0x0a, 0x49, 0x2c, 0x80, 0x21, 0xa4, 0x47, 0x26, 0x61, 0x06, 0x75, 0xe4, - 0x53, 0xfd, 0xd6, 0x29, 0x8e, 0xd7, 0x6a, 0x21, 0x5a, 0x63, 0xea, 0x0e, - 0x04, 0xce, 0xc7, 0xb0, 0x8c, 0xe8, 0xbc, 0xbf, 0x1e, 0x1f, 0xc3, 0xca, - 0x1d, 0x21, 0x54, 0x2c, 0xba, 0xeb, 0xa3, 0x5b, 0xa7, 0x93, 0xfc, 0xfb, - 0x6a, 0xe9, 0x36, 0x62, 0xf9, 0xf3, 0x20, 0xe4, 0x85, 0xe7, 0x6b, 0x03, - 0xbc, 0x0b, 0xc7, 0x59, 0x25, 0x19, 0x93, 0xc5, 0x9f, 0xfd, 0x79, 0xa7, - 0xd0, 0xf3, 0xa6, 0x21, 0xac, 0x47, 0xc0, 0x78, 0xb8, 0xa6, 0xee, 0x27, - 0x40, 0xe4, 0x26, 0xe0, 0x05, 0xc2, 0x58, 0x3a, 0xe4, 0x69, 0xdb, 0x97, - 0x7b, 0xa7, 0x38, 0xb7, 0xea, 0xc3, 0xa9, 0x82, 0xc8, 0x26, 0x08, 0x1d, - 0x2b, 0x91, 0x3d, 0x89, 0xdc, 0xe1, 0x7c, 0x4b, 0xb5, 0x26, 0x5a, 0xd5, - 0x29, 0x1c, 0x73, 0xf8, 0x3e, 0x1d, 0xc8, 0xbe, 0xa2, 0x44, 0x06, 0xed, - 0xea, 0x9e, 0x8a, 0xe9, 0x73, 0x21, 0xed, 0x7a, 0x63, 0x81, 0x87, 0x34, - 0x37, 0x65, 0x01, 0xc1, 0x1c, 0x60, 0x03, 0x09, 0x13, 0x91, 0x38, 0xed, - 0x61, 0x54, 0x30, 0xa8, 0x6a, 0xc8, 0x07, 0x23, 0xa4, 0x31, 0x1d, 0xd1, - 0xdc, 0x66, 0x06, 0x1d, 0x82, 0xeb, 0x79, 0xd8, 0x53, 0x9a, 0xfc, 0x54, - 0xa5, 0x3f, 0x77, 0x9d, 0xd7, 0x1c, 0xe6, 0x48, 0xf1, 0xaf, 0x9e, 0x2d, - 0x57, 0xcb, 0xd2, 0x7a, 0xa7, 0x04, 0xc8, 0x00, 0xfe, 0xee, 0x98, 0x5b, - 0x2a, 0x89, 0xd9, 0x3e, 0x51, 0x68, 0x4f, 0xe8, 0xa8, 0x37, 0x69, 0x47, - 0x32, 0xb4, 0x21, 0xc7, 0x66, 0xdb, 0x37, 0xb3, 0x00, 0xd6, 0xdd, 0xd1, - 0x6b, 0x74, 0x3d, 0x9a, 0x39, 0x49, 0xd6, 0x33, 0x4e, 0xca, 0xd5, 0xb4, - 0xdd, 0xd6, 0x25, 0x03, 0xa2, 0xdb, 0x29, 0x30, 0xe5, 0xcc, 0x94, 0xff, - 0x88, 0x8c, 0xb9, 0x3a, 0x77, 0xe2, 0x7f, 0x76, 0x7a, 0x16, 0x63, 0x85, - 0x90, 0x9f, 0xc3, 0xbc, 0x30, 0xee, 0xeb, 0x2e, 0x10, 0x94, 0x88, 0xb9, - 0x97, 0x0b, 0x3d, 0xf5, 0xba, 0xee, 0xde, 0x55, 0x53, 0x05, 0xc5, 0x3a, - 0xed, 0xc8, 0xd1, 0x6b, 0xcd, 0xa9, 0xc3, 0x0a, 0x11, 0xfc, 0xa8, 0x6a, - 0x8e, 0xb1, 0xc4, 0x18, 0x4a, 0x57, 0x80, 0xb6, 0x8a, 0x46, 0x92, 0xa5, - 0x61, 0x66, 0x12, 0x19, 0xd7, 0xbb, 0x75, 0x1c, 0x1d, 0xed, 0xc0, 0x29, - 0x1d, 0xe0, 0x76, 0x61, 0x88, 0x68, 0x03, 0xde, 0x7f, 0xa6, 0x43, 0xb2, - 0xca, 0x0c, 0xb2, 0x7b, 0x13, 0x78, 0xd0, 0xf4, 0x1d, 0x2c, 0xdf, 0x14, - 0xe8, 0xc2, 0x83, 0x8d, 0x89, 0x72, 0x4d, 0x68, 0x71, 0xbf, 0x6d, 0xfa, - 0x7d, 0xdc, 0x1b, 0x58, 0xd3, 0x95, 0xf6, 0xb8, 0x42, 0xa7, 0xdb, 0xa2, - 0x22, 0x02, 0x27, 0xba, 0x39, 0x89, 0x70, 0x7c, 0xd5, 0x9f, 0x4d, 0x9f, - 0x56, 0x94, 0x35, 0x65, 0xc0, 0x13, 0x6e, 0xb9, 0xc8, 0x55, 0xb9, 0x0f, - 0x81, 0xf3, 0x59, 0x03, 0x2c, 0xb7, 0x04, 0x74, 0x8f, 0xb1, 0xa2, 0x98, - 0x68, 0x00, 0xdc, 0x95, 0xa6, 0xa0, 0x2a, 0xe6, 0x2e, 0x04, 0x1a, 0xe8, - 0x4a, 0x7e, 0x08, 0xba, 0xc7, 0x68, 0x0f, 0xb8, 0xe9, 0xba, 0xd3, 0x65, - 0x08, 0x9e, 0x3e, 0x63, 0xee, 0x84, 0x16, 0x4e, 0x21, 0xca, 0xda, 0x8d, - 0xf2, 0x06, 0x34, 0x5d, 0x95, 0x79, 0xad, 0x35, 0x73, 0x28, 0x89, 0x83, - 0xd0, 0x23, 0x12, 0x97, 0xc0, 0x05, 0x69, 0xad, 0x31, 0xdc, 0xe4, 0x04, - 0xc9, 0xda, 0x39, 0x5a, 0x3c, 0xbe, 0xd9, 0xea, 0x8d, 0x4e, 0x2c, 0xa3, - 0xe4, 0x82, 0x98, 0x17, 0x74, 0x6a, 0xf1, 0xca, 0xeb, 0xf6, 0xf3, 0x69, - 0x48, 0xee, 0xe9, 0xca, 0x98, 0xf1, 0xc3, 0x8b, 0x57, 0xf4, 0xdd, 0x3f, - 0x14, 0xed, 0x95, 0xf1, 0xa6, 0x50, 0x1a, 0xe4, 0xce, 0xab, 0x86, 0x65, - 0x27, 0xb0, 0x84, 0xd4, 0x76, 0xf6, 0x03, 0x8d, 0x46, 0xf7, 0x4a, 0xef, - 0xcc, 0x84, 0x4a, 0x2b, 0x85, 0x11, 0x22, 0xd1, 0x35, 0x88, 0xce, 0x6b, - 0x8e, 0xc4, 0xe3, 0x6c, 0x67, 0xae, 0xf1, 0x58, 0xe5, 0x51, 0x1a, 0xdf, - 0x12, 0xd5, 0x44, 0x03, 0x69, 0x77, 0x12, 0x46, 0xbc, 0xfc, 0xda, 0x3f, - 0xc9, 0x88, 0x0f, 0xba, 0x46, 0xf0, 0xbe, 0x27, 0x4e, 0x93, 0xe3, 0xdc, - 0xa5, 0x31, 0xcb, 0xee, 0x8c, 0x7b, 0x41, 0x00, 0xc9, 0x52, 0x94, 0x4a, - 0x5a, 0xac, 0x31, 0xbd, 0xe9, 0xab, 0xb4, 0xd0, 0x17, 0x3e, 0xd3, 0x7a, - 0x45, 0x21, 0x02, 0xfa, 0x17, 0x92, 0x85, 0x6a, 0x9d, 0x5e, 0xa6, 0xc0, - 0xe7, 0x5d, 0x1c, 0x5d, 0xc6, 0x13, 0x92, 0x48, 0x4d, 0x43, 0xe0, 0xbb, - 0x61, 0x7d, 0x02, 0x3b, 0x81, 0x13, 0x88, 0x71, 0x76, 0x84, 0x37, 0x39, - 0x3a, 0x96, 0x2f, 0x37, 0xb2, 0x40, 0x57, 0x1a, 0x95, 0x57, 0xf7, 0x3f, - 0xb6, 0x7f, 0xed, 0x1a, 0xef, 0xf2, 0x9b, 0x0f, 0xe7, 0x02, 0x5a, 0xf2, - 0xad, 0x9d, 0xd3, 0x38, 0x2b, 0x43, 0x43, 0x97, 0x0e, 0x69, 0xbc, 0xaa, - 0x51, 0x23, 0xff, 0x87, 0x7f, 0x59, 0xb4, 0xa6, 0x64, 0xd8, 0xe9, 0xc3, - 0xf5, 0x73, 0x7b, 0x3a, 0xa4, 0x11, 0xb6, 0xa2, 0xf3, 0xa6, 0xf4, 0xe7, - 0xcb, 0x40, 0x3c, 0x2b, 0xa8, 0xa3, 0x68, 0x30, 0x38, 0xe1, 0xc4, 0x94, - 0xdb, 0x25, 0x64, 0xbd, 0xdb, 0x0d, 0x6c, 0xe7, 0x5f, 0xc6, 0x3d, 0xf4, - 0xd3, 0x8d, 0x80, 0x1f, 0x4b, 0x4c, 0xc0, 0xa8, 0x39, 0x1e, 0x58, 0x2e, - 0x56, 0x1f, 0xa9, 0x4e, 0x5d, 0xd9, 0xde, 0x11, 0x9e, 0xe8, 0x08, 0x1a, - 0xca, 0x6f, 0xdd, 0x1c, 0x7a, 0x13, 0x94, 0xe7, 0x5a, 0xf1, 0x91, 0x7b, - 0x7a, 0x07, 0xd7, 0x66, 0x7d, 0x25, 0xc0, 0x57, 0xe7, 0x42, 0x4b, 0x9c, - 0x4e, 0x9f, 0xb4, 0x79, 0xe5, 0xae, 0x18, 0x9d, 0x82, 0x28, 0x84, 0x12, - 0xad, 0x9f, 0x5b, 0xd6, 0xd1, 0xe8, 0xe2, 0x90, 0x1b, 0x40, 0xd4, 0x3d, - 0x54, 0xde, 0x02, 0xce, 0xc9, 0x5d, 0xcf, 0x50, 0x33, 0xa6, 0x84, 0x4d, - 0xb0, 0x3f, 0xbf, 0x77, 0xf6, 0xbe, 0x6a, 0xd5, 0x39, 0xf8, 0xb1, 0xc1, - 0xaa, 0xbc, 0x71, 0x8e, 0x15, 0x78, 0x98, 0x01, 0x85, 0x7c, 0xd6, 0x0c, - 0xe7, 0x63, 0x8b, 0x9e, 0xc0, 0x9e, 0x00, 0xd2, 0xbc, 0xfe, 0x96, 0x41, - 0x56, 0xdd, 0x36, 0x31, 0x2d, 0xb8, 0x04, 0x14, 0x7a, 0x3b, 0x33, 0xf6, - 0x09, 0xd6, 0x11, 0x26, 0x96, 0x0d, 0x75, 0xa5, 0x66, 0xea, 0xed, 0x6e, - 0xe4, 0x3d, 0xca, 0xb4, 0xd0, 0x90, 0x9d, 0xf3, 0x97, 0xad, 0xc0, 0x13, - 0x28, 0xc2, 0xe6, 0x38, 0x1f, 0x17, 0xc4, 0x39, 0x0e, 0x9b, 0xcf, 0x63, - 0x17, 0xb7, 0x8e, 0x62, 0xb5, 0xfb, 0xe4, 0x54, 0xce, 0x18, 0x4f, 0x60, - 0xe4, 0x9b, 0xe3, 0xc6, 0xeb, 0xc3, 0x55, 0x38, 0xcf, 0x14, 0x2d, 0x97, - 0x0b, 0x2f, 0x8a, 0xd6, 0x7b, 0xef, 0x93, 0x7a, 0x3b, 0x85, 0xf1, 0x6f, - 0xcd, 0x2a, 0x72, 0xa3, 0x34, 0xbc, 0x5d, 0x57, 0x6e, 0xff, 0x03, 0x62, - 0x6d, 0xed, 0x79, 0xe3, 0xd7, 0x6d, 0x11, 0xb2, 0x2d, 0x9f, 0xb8, 0x3e, - 0x0c, 0xe7, 0xab, 0xee, 0x5f, 0x04, 0x66, 0x93, 0x09, 0x25, 0xed, 0xdc, - 0x05, 0xa3, 0x98, 0xdc, 0x72, 0x48, 0x0f, 0x21, 0xf3, 0x03, 0x63, 0x86, - 0x39, 0x80, 0x29, 0xd0, 0x1a, 0x05, 0x78, 0x81, 0x1c, 0x10, 0xde, 0x8c, - 0x7e, 0xb0, 0xd6, 0x3a, 0xa5, 0xc5, 0x4e, 0xc9, 0x77, 0x50, 0xed, 0x43, - 0x54, 0x23, 0x5b, 0xe9, 0x62, 0x6b, 0x37, 0x30, 0xff, 0x4c, 0x34, 0x74, - 0x90, 0xb4, 0x01, 0xfc, 0x6e, 0x48, 0x99, 0xdb, 0xc6, 0x66, 0x8f, 0xc0, - 0xd4, 0x25, 0x43, 0xe2, 0x7a, 0x27, 0xce, 0xb8, 0xc6, 0x1f, 0x7d, 0xf9, - 0x31, 0x2c, 0xb9, 0x77, 0x68, 0x4a, 0xc6, 0x17, 0x7e, 0xb4, 0x47, 0x7c, - 0xdb, 0x5d, 0xed, 0x67, 0xdf, 0xf1, 0x00, 0x73, 0x9f, 0xc5, 0x80, 0xd9, - 0x50, 0xb5, 0x04, 0x61, 0x11, 0xe6, 0xe4, 0x4c, 0x3b, 0x7c, 0xf1, 0x03, - 0x76, 0x42, 0x65, 0x5e, 0x89, 0x67, 0x04, 0x67, 0x37, 0x2e, 0x64, 0xde, - 0xbc, 0x38, 0xe2, 0xe4, 0x69, 0x56, 0xcf, 0x22, 0x5c, 0x19, 0xe4, 0x3d, - 0x36, 0x97, 0x6a, 0x43, 0x2b, 0x30, 0x25, 0x39, 0xfb, 0x9f, 0x4e, 0x7d, - 0xb6, 0xbd, 0xf8, 0x00, 0x70, 0xa9, 0x22, 0x5c, 0x0d, 0x3a, 0x71, 0xce, - 0x35, 0x4a, 0xcc, 0xb1, 0xd2, 0xea, 0x3b, 0xd6, 0xb3, 0xce, 0x8e, 0x71, - 0x29, 0x7b, 0xaf, 0x38, 0x1f, 0x71, 0x49, 0x30, 0x50, 0x1b, 0xff, 0xad, - 0x67, 0x32, 0x7a, 0xde, 0xd0, 0x2e, 0x37, 0xef, 0xaf, 0xbe, 0xff, 0x85, - 0x2c, 0x1f, 0x5e, 0xb8, 0xef, 0x32, 0x82, 0x91, 0x3e, 0x91, 0x78, 0x6c, - 0xdb, 0x92, 0xd9, 0xc3, 0x80, 0x37, 0x73, 0x04, 0xc4, 0xcf, 0x82, 0xdb, - 0xff, 0x8f, 0x51, 0x53, 0xda, 0x64, 0x90, 0xd1, 0xca, 0x35, 0x6c, 0x44, - 0x83, 0x3b, 0x68, 0xca, 0xb3, 0x64, 0xae, 0xea, 0x8f, 0x7b, 0xc6, 0xcc, - 0x54, 0x69, 0xc1, 0xf8, 0x69, 0xcf, 0xc3, 0xdc, 0xfb, 0x7d, 0x6b, 0xa8, - 0xb5, 0x76, 0x4c, 0x71, 0x43, 0xcc, 0x6b, 0x1b, 0xfe, 0x96, 0xb2, 0x30, - 0x01, 0xb9, 0x62, 0xab, 0x3c, 0x64, 0x3f, 0x37, 0x05, 0xbd, 0xca, 0x77, - 0x7a, 0x5b, 0xcc, 0xd2, 0xf6, 0xc9, 0x66, 0xbe, 0x89, 0x80, 0xb1, 0x36, - 0xa2, 0xa6, 0xe3, 0x1d, 0xdb, 0x43, 0x40, 0xc7, 0x6f, 0xdf, 0x75, 0x7e, - 0x1f, 0x16, 0xf8, 0x2f, 0xf7, 0xd6, 0x3a, 0x1c, 0x22, 0xd1, 0x3b, 0xc7, - 0xe9, 0x7d, 0x13, 0x57, 0x0c, 0x88, 0x01, 0x70, 0xea, 0x42, 0x3c, 0xd2, - 0x61, 0x29, 0x06, 0xc9, 0x8b, 0xf0, 0x1d, 0x08, 0x4e, 0x7f, 0x59, 0x5e, - 0xa1, 0xf0, 0x1b, 0xb1, 0x38, 0x7b, 0xbd, 0x84, 0x16, 0xad, 0x5d, 0x84, - 0xe6, 0x81, 0x23, 0x24, 0x29, 0x25, 0xfd, 0xb1, 0x57, 0x7f, 0x0f, 0x14, - 0x08, 0x90, 0x31, 0x07, 0x8b, 0xb1, 0x5e, 0x78, 0x0b, 0x88, 0xe0, 0xbe, - 0xd9, 0x75, 0xc9, 0x1d, 0x12, 0x87, 0xbd, 0xee, 0x8d, 0xbd, 0x3a, 0x9c, - 0xeb, 0xf9, 0xe1, 0xe9, 0x6d, 0x4e, 0x9d, 0x34, 0x41, 0xe2, 0xba, 0x67, - 0x3c, 0x35, 0x36, 0x87, 0xa4, 0x63, 0x0f, 0x89, 0xf2, 0x35, 0x26, 0xe5, - 0x7f, 0xb1, 0x1e, 0x61, 0xcf, 0x36, 0x72, 0x1b, 0x8c, 0xd7, 0x4a, 0x40, - 0x70, 0x2c, 0xa0, 0xb7, 0xec, 0xb9, 0x7d, 0x9e, 0x2e, 0x32, 0x20, 0xba, - 0xe8, 0x44, 0x52, 0xd7, 0xf9, 0x79, 0xc9, 0xab, 0x75, 0xbc, 0x9a, 0xaf, - 0x84, 0x96, 0x37, 0x88, 0xe1, 0x1b, 0xf2, 0xc9, 0x70, 0xae, 0x1b, 0xca, - 0x25, 0xfb, 0x6d, 0x85, 0xad, 0xed, 0x49, 0xde, 0x76, 0x29, 0xd3, 0xa6, - 0x3d, 0xdf, 0x26, 0x17, 0xb0, 0x0d, 0x4d, 0xcb, 0x00, 0xc6, 0x71, 0xdf, - 0x10, 0x18, 0x11, 0x7f, 0x49, 0x89, 0x20, 0x88, 0x0c, 0xae, 0xb9, 0xe5, - 0x1a, 0x41, 0x77, 0xec, 0x06, 0x6a, 0x7f, 0x4a, 0xa7, 0x8f, 0x4b, 0x2d, - 0x8e, 0x91, 0x77, 0xb3, 0x87, 0xc3, 0xfd, 0xbf, 0xc4, 0xc4, 0x23, 0x75, - 0x07, 0x4f, 0x83, 0xd0, 0x5e, 0x68, 0x32, 0x7b, 0x7e, 0x70, 0xe8, 0x02, - 0x37, 0xe5, 0x52, 0x9a, 0x66, 0x74, 0xcd, 0xbd, 0xc0, 0xa5, 0xaf, 0x70, - 0x46, 0xae, 0xd0, 0x4f, 0x66, 0xbb, 0x0f, 0xf6, 0x14, 0xd6, 0xa4, 0x17, - 0x84, 0xa1, 0xd1, 0xb8, 0x2e, 0xb4, 0xf4, 0x33, 0x7f, 0xfa, 0xa1, 0x4e, - 0xe2, 0xaa, 0x5b, 0x1a, 0xea, 0x64, 0x41, 0x99, 0x61, 0xc1, 0xe3, 0x6d, - 0xe5, 0xfa, 0x47, 0x4b, 0xeb, 0x6a, 0xeb, 0xad, 0x14, 0xa1, 0xbf, 0xd4, - 0x34, 0xbc, 0x01, 0x98, 0x50, 0xc3, 0x7b, 0xbf, 0x1f, 0x60, 0xff, 0x10, - 0x92, 0x89, 0x68, 0x30, 0x16, 0x18, 0xa6, 0x47, 0xbe, 0xd1, 0x95, 0x6b, - 0xc1, 0x5b, 0xb8, 0x55, 0x78, 0xc9, 0x00, 0xbf, 0x54, 0x55, 0xdc, 0xc6, - 0xd2, 0x4b, 0xf9, 0xff, 0xe4, 0x5b, 0xc4, 0xee, 0xa5, 0x01, 0xd4, 0x60, - 0xcd, 0xb6, 0x3b, 0x44, 0x90, 0x7a, 0x7d, 0xbd, 0x77, 0xe6, 0xe1, 0x07, - 0xef, 0x13, 0x6e, 0xd1, 0xf6, 0x4d, 0xd3, 0xbf, 0xa2, 0x8f, 0x83, 0xf0, - 0xc4, 0x58, 0xf7, 0x13, 0x8d, 0xd4, 0xd8, 0x08, 0xa0, 0x8e, 0x76, 0x2b, - 0x23, 0x73, 0x97, 0xab, 0xe6, 0x1a, 0xda, 0x93, 0xaf, 0x39, 0xde, 0xfb, - 0x10, 0x0a, 0x9b, 0xed, 0x32, 0x62, 0xc5, 0x11, 0xbc, 0x5b, 0x95, 0x89, - 0xc4, 0x10, 0x88, 0x75, 0x5d, 0x23, 0xc3, 0x67, 0xc9, 0x6f, 0x14, 0x20, - 0x83, 0xf0, 0xa3, 0xbc, 0xf6, 0x34, 0x6e, 0xc4, 0x31, 0xad, 0x46, 0xd3, - 0x07, 0x54, 0xef, 0x52, 0x86, 0xe6, 0xea, 0x5b, 0x01, 0xc1, 0x56, 0xa3, - 0x37, 0x2f, 0xb7, 0x4a, 0x21, 0xab, 0x0a, 0x90, 0x32, 0x1a, 0xab, 0xbe, - 0xf8, 0x64, 0x6a, 0xf2, 0xa1, 0x58, 0xbc, 0x59, 0xa9, 0xdb, 0x9d, 0x82, - 0xf0, 0xcb, 0xa3, 0x18, 0xb8, 0x56, 0xa8, 0xbe, 0x25, 0xd0, 0x1b, 0xf2, - 0x28, 0xb5, 0x1a, 0x3a, 0x1b, 0x29, 0x69, 0xe1, 0x9d, 0x36, 0x80, 0x67, - 0x9f, 0xc1, 0x05, 0xdc, 0x49, 0x60, 0xde, 0xed, 0xf2, 0xc6, 0x77, 0xf0, - 0x06, 0x03, 0xb4, 0x2f, 0xc0, 0x3d, 0x54, 0x49, 0xb5, 0xa8, 0x63, 0x2c, - 0x2b, 0x29, 0x2f, 0x12, 0xe4, 0xdb, 0xd6, 0x5e, 0x3c, 0x48, 0x20, 0x1d, - 0xf0, 0x72, 0x47, 0xc3, 0x6b, 0x8e, 0xf5, 0x0c, 0xb2, 0xb0, 0x80, 0x9c, - 0x59, 0x73, 0x75, 0x4a, 0x10, 0xc0, 0x33, 0x68, 0x1e, 0x85, 0x28, 0x98, - 0x96, 0x51, 0xf1, 0x0f, 0xeb, 0x6a, 0x38, 0x75, 0xb7, 0x01, 0x88, 0xa2, - 0xb4, 0x39, 0xeb, 0x00, 0xd5, 0x7d, 0x72, 0x3e, 0xe7, 0x39, 0xb1, 0xcc, - 0x3e, 0x30, 0xdd, 0x15, 0x0b, 0x49, 0xd7, 0x4c, 0x25, 0x97, 0x64, 0x3b, - 0x05, 0x41, 0x57, 0x73, 0x23, 0xe9, 0x95, 0xf7, 0x81, 0x9b, 0xbe, 0x9a, - 0x77, 0x92, 0x58, 0x7e, 0xa4, 0x5d, 0x4a, 0x29, 0x04, 0xf7, 0x2d, 0x10, - 0x11, 0x95, 0x42, 0x40, 0x14, 0x7d, 0x4b, 0x3d, 0xbc, 0xc1, 0x1e, 0xac, - 0x99, 0xa2, 0x76, 0x63, 0x3f, 0xc8, 0xe8, 0xf2, 0x7d, 0xdd, 0x2d, 0xe0, - 0x97, 0xe9, 0x6e, 0x92, 0x32, 0x57, 0xb2, 0x23, 0x5b, 0x22, 0xee, 0x98, - 0xaf, 0x40, 0x88, 0xcf, 0x55, 0xfd, 0x92, 0xfa, 0x53, 0x6c, 0x5d, 0xcb, - 0xf0, 0x0a, 0xfe, 0xe6, 0x39, 0xb5, 0xca, 0xa6, 0x7b, 0x9f, 0xed, 0xea, - 0x20, 0x1a, 0x4a, 0xd9, 0x85, 0x3f, 0xb8, 0x77, 0x65, 0xe5, 0xfb, 0x15, - 0x99, 0xfd, 0x54, 0x62, 0xe4, 0x13, 0x7c, 0xd6, 0x32, 0x93, 0x85, 0x1e, - 0x30, 0xb4, 0xec, 0xaa, 0xa1, 0x6a, 0x4d, 0xc0, 0x02, 0x09, 0x1f, 0x29, - 0x81, 0x00, 0x5a, 0xa7, 0xe5, 0xb2, 0x05, 0xfa, 0x88, 0x98, 0xca, 0xef, - 0x7d, 0x94, 0xc0, 0x34, 0x5d, 0x57, 0xcb, 0xc2, 0x2b, 0x31, 0x21, 0x92, - 0xa9, 0xdf, 0x2c, 0x39, 0x8a, 0xc9, 0x42, 0x72, 0x08, 0x01, 0xfd, 0x46, - 0x3a, 0xad, 0x9e, 0x92, 0x67, 0x20, 0x86, 0xf2, 0x6f, 0x24, 0xd5, 0x4e, - 0x6c, 0x2e, 0x3f, 0xd4, 0xc0, 0x90, 0x08, 0x99, 0x47, 0x52, 0xfe, 0xa7, - 0xbe, 0x01, 0x9e, 0xd8, 0x84, 0x43, 0x97, 0x87, 0xa2, 0xcc, 0xb0, 0x66, - 0x7d, 0xf2, 0xe1, 0x56, 0xc6, 0x57, 0x49, 0xc8, 0x28, 0x94, 0x0b, 0x47, - 0xf6, 0x8f, 0xe1, 0x76, 0x4b, 0xbd, 0xc2, 0x9a, 0x8c, 0x44, 0xb2, 0xb2, - 0x33, 0xbc, 0x19, 0x57, 0x33, 0xd8, 0x64, 0xee, 0x22, 0xf6, 0x41, 0x60, - 0x2c, 0x45, 0x7d, 0xa0, 0x22, 0xee, 0xc3, 0xcb, 0x99, 0x13, 0x10, 0x1d, - 0x63, 0x74, 0xb4, 0x97, 0x70, 0x2d, 0x22, 0x12, 0xbf, 0x60, 0x26, 0x42, - 0xc6, 0x6d, 0xe0, 0xfb, 0x4d, 0x31, 0x10, 0x12, 0x8c, 0x2e, 0x67, 0x57, - 0xdb, 0x99, 0x10, 0x64, 0xe7, 0x6c, 0xaf, 0xa4, 0xa4, 0x65, 0x20, 0xc6, - 0x0c, 0xe8, 0x0b, 0xeb, 0xf6, 0x64, 0x68, 0x1c, 0x65, 0xe4, 0x03, 0x98, - 0x2e, 0x50, 0x0b, 0x44, 0x19, 0xd1, 0xd3, 0x21, 0xbf, 0xb8, 0x6c, 0x2c, - 0x0e, 0x69, 0xb6, 0x81, 0x95, 0x44, 0x5f, 0x1a, 0x12, 0xfc, 0xd4, 0x58, - 0x0c, 0x91, 0x5c, 0xd2, 0x3c, 0x4a, 0x80, 0xd5, 0x1d, 0x8d, 0x9c, 0xc9, - 0x02, 0x0e, 0x72, 0x5d, 0x1a, 0x2f, 0xb1, 0xd0, 0xe5, 0x8a, 0x24, 0x66, - 0xd0, 0xbb, 0x67, 0x85, 0x9e, 0xa3, 0x02, 0xa9, 0x7f, 0x49, 0xb7, 0x07, - 0x40, 0x20, 0xea, 0x3b, 0xea, 0x72, 0x27, 0xab, 0x43, 0x23, 0x54, 0x5d, - 0xa7, 0xac, 0x5f, 0x61, 0x32, 0x6a, 0xf2, 0x56, 0x32, 0xd2, 0xc3, 0x2e, - 0x4e, 0x6c, 0xc5, 0xfe, 0x10, 0x92, 0x27, 0x9c, 0xc2, 0x22, 0x85, 0x46, - 0xfa, 0x15, 0x77, 0x09, 0xeb, 0x13, 0xf4, 0x7a, 0xc1, 0x1d, 0x3c, 0x15, - 0xa8, 0x8f, 0x59, 0x58, 0xd3, 0xd8, 0xbb, 0x7f, 0xca, 0x03, 0xb7, 0x69, - 0xd8, 0x29, 0x09, 0x93, 0x69, 0x4c, 0x4b, 0x08, 0xd3, 0xe5, 0x52, 0x87, - 0xcd, 0x87, 0x8a, 0x55, 0xdb, 0x70, 0x17, 0x97, 0x2c, 0x1b, 0x93, 0x2c, - 0x42, 0xf9, 0x34, 0x7c, 0x26, 0xab, 0x21, 0xac, 0x4b, 0x45, 0xb5, 0xc8, - 0xf5, 0xa2, 0x63, 0x9a, 0x4b, 0xe0, 0x91, 0xb7, 0x51, 0x6c, 0xb5, 0x93, - 0x89, 0x71, 0xc0, 0x2c, 0x99, 0x75, 0xda, 0x8f, 0x0f, 0xa2, 0xdc, 0xd3, - 0x39, 0x32, 0x87, 0x4f, 0x05, 0x16, 0xac, 0xeb, 0x40, 0x44, 0xfd, 0xcd, - 0x54, 0xb1, 0x8b, 0x31, 0x05, 0x96, 0x63, 0x05, 0xd5, 0x49, 0x0e, 0x2a, - 0x88, 0xc7, 0xe8, 0x52, 0xc8, 0x72, 0xcc, 0xc9, 0xc5, 0xc5, 0x69, 0x31, - 0xf3, 0xb5, 0x24, 0x9b, 0xe5, 0x6d, 0x28, 0x1e, 0x9b, 0xfc, 0x10, 0xb3, - 0xa4, 0x71, 0xd7, 0xde, 0xf6, 0xfa, 0xef, 0x2a, 0x3d, 0x7d, 0xf1, 0x76, - 0xb5, 0x55, 0xdd, 0xe8, 0xd0, 0xaa, 0x54, 0x2b, 0x18, 0x68, 0x5a, 0x14, - 0x82, 0x97, 0xaf, 0xb1, 0xbe, 0x0e, 0x45, 0x85, 0x32, 0xc6, 0xfa, 0xa2, - 0x7f, 0xff, 0x2e, 0x6b, 0xc5, 0x69, 0x11, 0x32, 0xc4, 0xf2, 0x07, 0xd9, - 0x73, 0x6c, 0x15, 0x09, 0x71, 0x50, 0xa6, 0xfb, 0x7a, 0x89, 0x6f, 0xf1, - 0x68, 0xa9, 0x81, 0x6b, 0xb3, 0x87, 0xaa, 0xaf, 0x19, 0x1c, 0xd1, 0xe5, - 0x9d, 0x0c, 0xa2, 0xcf, 0xc6, 0xea, 0xc3, 0xff, 0x04, 0xfd, 0xe0, 0x42, - 0x0b, 0xc6, 0xfa, 0x16, 0x61, 0x52, 0xad, 0x80, 0xb6, 0xe1, 0x16, 0x95, - 0x41, 0x5e, 0x10, 0x97, 0xa7, 0xdb, 0x2c, 0xbc, 0x70, 0x07, 0x89, 0x4f, - 0x78, 0x5f, 0x17, 0x49, 0xe3, 0x79, 0xdc, 0x22, 0xc4, 0x0e, 0x42, 0x6a, - 0x59, 0x48, 0x8e, 0x3f, 0x2b, 0x31, 0xab, 0xe4, 0x3d, 0x3d, 0x45, 0xf6, - 0x6e, 0x0f, 0x9d, 0x79, 0xc6, 0x5c, 0x85, 0x70, 0xf6, 0xff, 0xd7, 0xc1, - 0x21, 0xa5, 0xdd, 0x25, 0x7b, 0x72, 0x43, 0xf3, 0x66, 0x39, 0xcd, 0xce, - 0x9e, 0x01, 0xa2, 0xaf, 0xc7, 0xd0, 0x3b, 0x1e, 0x22, 0x01, 0xc2, 0xb6, - 0x76, 0xe3, 0x32, 0x61, 0x8e, 0xea, 0x5a, 0xf4, 0xe7, 0x38, 0x98, 0xcb, - 0x4e, 0x49, 0x41, 0x5e, 0x6d, 0x09, 0xbe, 0x3a, 0x09, 0xfb, 0x97, 0x9f, - 0x30, 0x57, 0x8e, 0x26, 0x9b, 0x85, 0xad, 0x6d, 0xe5, 0xad, 0xe5, 0xc6, - 0xc6, 0xe8, 0x23, 0xe2, 0x26, 0x71, 0x83, 0x4e, 0xeb, 0x08, 0xc9, 0xe4, - 0x6b, 0xb2, 0x51, 0xd7, 0xf9, 0x48, 0x50, 0xc4, 0x41, 0x92, 0xae, 0xa6, - 0x3d, 0xc7, 0xac, 0x35, 0x9e, 0xab, 0x02, 0xe3, 0x35, 0x79, 0x54, 0x22, - 0x45, 0x09, 0xcc, 0x59, 0xb6, 0x5b, 0x07, 0x5e, 0x52, 0xc4, 0xc6, 0x34, - 0xce, 0xa5, 0x5b, 0xb5, 0xdc, 0xd7, 0x89, 0xb0, 0x97, 0x2e, 0x02, 0xaf, - 0x37, 0xb5, 0x1b, 0x0a, 0x87, 0x14, 0xe5, 0xca, 0x98, 0x04, 0xea, 0xad, - 0xec, 0x15, 0x79, 0x26, 0xde, 0xdf, 0x0b, 0x4f, 0xf2, 0x55, 0x2b, 0xc6, - 0xd9, 0x43, 0x4a, 0x11, 0x7c, 0x65, 0x37, 0xab, 0x33, 0x8b, 0x49, 0x0b, - 0xe4, 0xec, 0xae, 0x28, 0x6c, 0x70, 0xa7, 0x5f, 0xbe, 0x04, 0x50, 0x57, - 0xa5, 0xfb, 0x53, 0x93, 0x64, 0xfd, 0x52, 0xb9, 0xa7, 0x9f, 0x66, 0x03, - 0x7d, 0xdf, 0x8c, 0x3f, 0xdc, 0x1f, 0x9d, 0xe1, 0x8c, 0x42, 0xe6, 0x7f, - 0xd5, 0xf9, 0x9a, 0x57, 0x08, 0xb7, 0x98, 0xac, 0x69, 0xad, 0x31, 0xd1, - 0x8a, 0x70, 0x9e, 0x69, 0x26, 0x48, 0xb9, 0x6e, 0xfc, 0x28, 0x35, 0x45, - 0xb3, 0xd4, 0xc3, 0xa3, 0xcc, 0xf0, 0x38, 0x04, 0x55, 0x09, 0xc3, 0x99, - 0xf1, 0xee, 0xd9, 0x0c, 0x90, 0xbc, 0x17, 0x5c, 0xd4, 0x43, 0x8a, 0xdb, - 0xe8, 0x77, 0x6a, 0xba, 0x94, 0x67, 0xb2, 0xd8, 0xb5, 0xf7, 0x11, 0x92, - 0x2a, 0xf3, 0xcc, 0x87, 0xd4, 0x39, 0x38, 0xa2, 0x28, 0x32, 0xbf, 0xa3, - 0xa7, 0xe1, 0xb5, 0xe7, 0x53, 0x51, 0xd2, 0x95, 0x50, 0xe8, 0x99, 0x9d, - 0xf3, 0x76, 0x30, 0x35, 0x62, 0xaf, 0x79, 0x61, 0x7d, 0xee, 0xf7, 0x10, - 0xf5, 0x87, 0x97, 0xa2, 0x8d, 0x1c, 0xb7, 0xb6, 0x54, 0x3f, 0x40, 0xf8, - 0x7d, 0xb9, 0xeb, 0x53, 0x37, 0xd9, 0x60, 0x5d, 0x3e, 0xa9, 0xd3, 0x85, - 0x35, 0x1c, 0x51, 0x25, 0x77, 0x13, 0x0f, 0x24, 0xc4, 0xa3, 0x6a, 0x44, - 0x52, 0xca, 0xb4, 0xc1, 0x00, 0x22, 0x28, 0x68, 0xde, 0xfc, 0xff, 0x62, - 0x37, 0xcd, 0x62, 0x7d, 0x02, 0xe9, 0xc2, 0xa2, 0x6e, 0xdb, 0x04, 0xce, - 0x33, 0xce, 0xc5, 0x1b, 0x05, 0x83, 0x04, 0xd3, 0xdd, 0x15, 0xcb, 0x28, - 0x39, 0x9f, 0xd7, 0xdf, 0x78, 0xbb, 0xc0, 0x84, 0x7d, 0x00, 0xea, 0xb9, - 0xa0, 0xf8, 0x0a, 0x3a, 0x36, 0x2e, 0xbc, 0x6c, 0x1d, 0x61, 0x9a, 0x4a, - 0xbd, 0x4f, 0x52, 0x1b, 0x8e, 0x19, 0x3a, 0xba, 0xf4, 0xc9, 0x01, 0xa3, - 0x09, 0xdd, 0xb9, 0x6f, 0x22, 0x9c, 0x5c, 0x92, 0xc3, 0xe2, 0x28, 0xc2, - 0x18, 0x76, 0xd2, 0x55, 0xae, 0x48, 0xc2, 0xc8, 0xe1, 0x59, 0xf3, 0x45, - 0x3e, 0xb7, 0x55, 0x37, 0xaf, 0xba, 0x58, 0x07, 0xc4, 0x87, 0x7a, 0x78, - 0xa0, 0x2a, 0x7d, 0xf0, 0x0a, 0x3b, 0xd9, 0x57, 0x66, 0x8a, 0x4a, 0x66, - 0x3a, 0xf1, 0xb1, 0x56, 0x9e, 0x2f, 0xe7, 0x73, 0x84, 0xe6, 0xa0, 0x70, - 0xa8, 0x13, 0xf5, 0x51, 0xfc, 0x68, 0xeb, 0xfc, 0xb5, 0x9c, 0x3e, 0x72, - 0x07, 0xd3, 0x20, 0x8f, 0xb3, 0x4c, 0x38, 0x83, 0x16, 0x13, 0x29, 0xa7, - 0x15, 0x6b, 0x1d, 0x0e, 0x53, 0xf5, 0x3e, 0x4c, 0x5b, 0xdd, 0x36, 0xcd, - 0xb9, 0xc8, 0x57, 0x58, 0x1e, 0xbe, 0x49, 0x2a, 0x7c, 0x3b, 0x2e, 0x98, - 0xf3, 0x58, 0xa6, 0xda, 0x58, 0xfd, 0x7b, 0x01, 0x00, 0xb1, 0xd1, 0x0d, - 0x93, 0x1f, 0xa1, 0x72, 0x30, 0x3e, 0x51, 0x2b, 0xa8, 0x5e, 0x67, 0x2c, - 0x08, 0x63, 0x79, 0x95, 0xbc, 0x4c, 0x57, 0x7c, 0x10, 0x47, 0xc9, 0x8f, - 0xfc, 0xba, 0xe0, 0x79, 0x78, 0xe7, 0x55, 0x16, 0xd2, 0xb6, 0x6b, 0xc6, - 0x60, 0xeb, 0xa0, 0x4b, 0x9e, 0x18, 0x70, 0x6a, 0x70, 0x99, 0xbb, 0x24, - 0x14, 0xa3, 0x0e, 0x04, 0xc1, 0xa8, 0x39, 0x5c, 0x1d, 0x2d, 0x09, 0xe8, - 0xf8, 0xfc, 0x41, 0x31, 0x39, 0x54, 0xea, 0x93, 0x31, 0x18, 0x6a, 0xc6, - 0xcc, 0xa0, 0x4c, 0xff, 0xf3, 0xd3, 0x62, 0x51, 0x43, 0xe6, 0x06, 0x54, - 0x37, 0x17, 0x5d, 0x3a, 0x92, 0x1f, 0x48, 0x34, 0x28, 0xf9, 0xdd, 0x51, - 0x75, 0xd7, 0x65, 0x2a, 0xac, 0x88, 0xaf, 0x49, 0x76, 0x39, 0xd0, 0xc5, - 0x16, 0x74, 0xb3, 0xd9, 0x0c, 0x33, 0x11, 0x62, 0x68, 0xa8, 0x43, 0x75, - 0x52, 0x0b, 0xbc, 0x3a, 0xb7, 0xc8, 0xef, 0x19, 0xd3, 0x52, 0xc5, 0x17, - 0xc6, 0x15, 0x97, 0x9f, 0xc6, 0xb2, 0xc5, 0x3f, 0x01, 0xba, 0xe2, 0x32, - 0x21, 0x8a, 0xd8, 0x20, 0x33, 0x6e, 0xdc, 0xf6, 0x60, 0x89, 0x67, 0x11, - 0x59, 0x18, 0xb3, 0x12, 0x01, 0xf4, 0xb3, 0x55, 0xe8, 0x02, 0x4e, 0x2d, - 0x54, 0x97, 0xc3, 0x2e, 0x1f, 0xc1, 0xf1, 0xb8, 0xb0, 0xd9, 0x69, 0x68, - 0xe4, 0x0d, 0x2c, 0xca, 0xe3, 0x70, 0x2c, 0xff, 0x1f, 0x8e, 0x27, 0x3f, - 0x53, 0x1d, 0xe0, 0x9b, 0xb4, 0xd1, 0xcd, 0xb4, 0x3f, 0x01, 0x11, 0x7b, - 0x69, 0xf3, 0x0f, 0x22, 0xde, 0x74, 0x47, 0x45, 0x64, 0xf0, 0xf0, 0xa7, - 0x8b, 0xba, 0xc0, 0xa4, 0xcf, 0xeb, 0xf9, 0x1d, 0x12, 0xcd, 0xdb, 0x2c, - 0x63, 0xc1, 0x86, 0xc0, 0xdf, 0xd2, 0xe2, 0x39, 0x66, 0xe3, 0x31, 0x19, - 0x2f, 0x14, 0x28, 0xf2, 0xb2, 0xb3, 0x6b, 0x5f, 0x31, 0xfb, 0x8a, 0x43, - 0xf4, 0x96, 0x10, 0x2b, 0xaa, 0x24, 0x39, 0x2a, 0x33, 0xa6, 0x5b, 0xae, - 0x30, 0xf9, 0xeb, 0xee, 0xfc, 0x5a, 0x84, 0x98, 0x93, 0x57, 0x9c, 0x08, - 0x97, 0xcd, 0xc6, 0x03, 0x62, 0xdd, 0x6f, 0xb8, 0x14, 0x99, 0x99, 0xa8, - 0x24, 0xaa, 0xc3, 0xee, 0x64, 0xdb, 0x6a, 0xad, 0x09, 0x1e, 0x15, 0xa8, - 0x19, 0x29, 0x68, 0x58, 0x31, 0xa3, 0x0d, 0xa1, 0x35, 0xf5, 0xef, 0x33, - 0xb6, 0x7f, 0xe7, 0x99, 0xc0, 0x96, 0xfb, 0x2c, 0x30, 0x8f, 0x68, 0x71, - 0xae, 0x9d, 0x25, 0x2f, 0xca, 0xee, 0x33, 0x98, 0xbc, 0x01, 0x16, 0x8e, - 0x04, 0x04, 0x80, 0x4e, 0x4f, 0x2b, 0x5b, 0x8b, 0xa1, 0x28, 0x30, 0x7c, - 0xa7, 0x34, 0x39, 0x51, 0x51, 0x98, 0x53, 0xe8, 0x2f, 0x3c, 0x93, 0x76, - 0xe9, 0x28, 0x18, 0x86, 0x2c, 0xd2, 0x2a, 0xff, 0x62, 0x54, 0x13, 0xe6, - 0x02, 0x01, 0xfa, 0x4b, 0x0c, 0x85, 0x43, 0x5f, 0x6f, 0x1e, 0x7a, 0xb2, - 0xed, 0xf2, 0x3d, 0xcd, 0x0e, 0x91, 0x36, 0xcf, 0x88, 0x79, 0xef, 0x1c, - 0x4a, 0xb0, 0x8b, 0x78, 0x0a, 0xa4, 0xcc, 0x83, 0x83, 0x22, 0xef, 0x3f, - 0xa7, 0x0d, 0x7f, 0xfa, 0xbd, 0x6b, 0xd9, 0x3a, 0x58, 0xa9, 0xcf, 0x1e, - 0x69, 0x73, 0xc6, 0x55, 0x24, 0x22, 0x05, 0x69, 0x87, 0xde, 0x55, 0x5f, - 0xd8, 0x6d, 0xef, 0xc8, 0x62, 0xe8, 0xdc, 0x17, 0x94, 0x48, 0xc4, 0x31, - 0x62, 0xd3, 0x63, 0x4b, 0xd7, 0x64, 0x9c, 0xc2, 0x88, 0xd1, 0xce, 0x28, - 0x8c, 0xb4, 0x12, 0xa0, 0xdf, 0xce, 0x1a, 0x0f, 0xc3, 0x8e, 0xf5, 0x35, - 0xa4, 0x64, 0xcf, 0xb2, 0x44, 0xfe, 0x1e, 0x21, 0x71, 0x6d, 0x68, 0x78, - 0x0f, 0x68, 0xe1, 0x62, 0xb4, 0xf3, 0x51, 0x89, 0xd9, 0x2c, 0x7d, 0x3e, - 0xc4, 0xb5, 0xfd, 0x20, 0x98, 0xc9, 0x9e, 0xbd, 0xdd, 0xcf, 0xc6, 0x9e, - 0x5f, 0xbe, 0xbd, 0xd9, 0x87, 0xea, 0xd8, 0x21, 0x1c, 0xe1, 0x7c, 0x40, - 0x29, 0x39, 0x16, 0x56, 0x16, 0xfc, 0x99, 0x03, 0x09, 0xd8, 0x99, 0x4c, - 0x69, 0x4b, 0x0b, 0x22, 0xfe, 0xa1, 0x09, 0x88, 0x64, 0xa2, 0x40, 0x91, - 0xe8, 0xe0, 0x63, 0xea, 0x81, 0x44, 0x80, 0xb3, 0x78, 0x4f, 0xb2, 0x06, - 0x08, 0x19, 0x9c, 0xdd, 0x39, 0x0d, 0xb5, 0xb6, 0xd2, 0xca, 0x55, 0x50, - 0xc5, 0x9f, 0x75, 0x54, 0x53, 0x06, 0x65, 0x78, 0x38, 0xcc, 0xb1, 0xd0, - 0xbd, 0x2c, 0xe9, 0x26, 0xd2, 0x51, 0x05, 0xdc, 0x7b, 0x60, 0x80, 0x7e, - 0x20, 0x02, 0x3d, 0xe8, 0x4a, 0x8d, 0xc9, 0xbc, 0x9c, 0x7a, 0xaa, 0x03, - 0xa3, 0xc4, 0x56, 0x72, 0xb6, 0x77, 0x96, 0x9d, 0x77, 0xe6, 0x68, 0xcb, - 0x79, 0x55, 0x65, 0x0b, 0x03, 0x4a, 0x65, 0x53, 0xe1, 0xaf, 0x6d, 0xc9, - 0x87, 0x84, 0xe6, 0x02, 0x05, 0x2e, 0xcb, 0x02, 0x70, 0x9a, 0xe3, 0xf3, - 0x16, 0x23, 0xad, 0x20, 0x95, 0x0d, 0x8b, 0x74, 0x9a, 0xdc, 0x8e, 0x9d, - 0x00, 0x9c, 0x88, 0x15, 0x3e, 0x8b, 0x6d, 0xb8, 0xce, 0x62, 0xba, 0x49, - 0xe8, 0x53, 0x7a, 0x77, 0x97, 0xc0, 0x08, 0x8f, 0xb0, 0x6c, 0x22, 0x8b, - 0x6e, 0x37, 0xee, 0x87, 0x3f, 0x49, 0xfa, 0xdd, 0x6e, 0x8e, 0xb4, 0x6b, - 0x99, 0x69, 0xf7, 0xff, 0x2e, 0xf6, 0xe1, 0x94, 0x36, 0x95, 0x51, 0x09, - 0xc7, 0x4c, 0xa7, 0xe2, 0x40, 0xe5, 0xd6, 0xe0, 0x67, 0xd6, 0x56, 0x57, - 0xf2, 0xb9, 0x77, 0x2e, 0x22, 0xbf, 0xd2, 0x63, 0xc7, 0xe7, 0x76, 0x88, - 0x68, 0x34, 0x1f, 0xa0, 0xdd, 0x4e, 0x84, 0xe1, 0x1a, 0xca, 0x96, 0x79, - 0xfb, 0x46, 0x05, 0x7b, 0x83, 0xbe, 0x6f, 0x11, 0xea, 0x54, 0x1a, 0x02, - 0x21, 0x1b, 0x85, 0xd7, 0x68, 0xaf, 0x20, 0x01, 0x54, 0x0f, 0xa0, 0x50, - 0x55, 0xfe, 0xea, 0x24, 0xc4, 0x3e, 0xdb, 0xd4, 0x8a, 0x79, 0x14, 0xed, - 0xb0, 0xf5, 0xd5, 0xbd, 0x00, 0x14, 0x8e, 0x57, 0xb8, 0x35, 0xbc, 0x7c, - 0xf1, 0x65, 0xc5, 0xb5, 0x8a, 0x96, 0x0c, 0x08, 0xf8, 0x1d, 0x58, 0xc0, - 0x5b, 0xc2, 0x7d, 0xac, 0xc0, 0xd9, 0xf6, 0x44, 0x34, 0x08, 0x2c, 0x35, - 0x97, 0x6f, 0xde, 0x08, 0xf3, 0xd5, 0xdd, 0x52, 0xf8, 0x72, 0xe1, 0xd8, - 0xef, 0xa1, 0xe2, 0x5f, 0x20, 0x58, 0x5c, 0xc4, 0xb7, 0x17, 0x44, 0xdb, - 0x7b, 0xca, 0x7f, 0x5c, 0xa6, 0x15, 0xf5, 0x2a, 0xb1, 0x41, 0xe1, 0x45, - 0x53, 0x94, 0xaa, 0x35, 0x8e, 0x2e, 0x3b, 0x55, 0xd6, 0x1d, 0x9d, 0xe9, - 0x6a, 0x19, 0xcf, 0xff, 0xa0, 0x34, 0x30, 0x32, 0x6d, 0x81, 0x39, 0xf0, - 0xf5, 0x83, 0xfa, 0xa3, 0x24, 0x43, 0x2b, 0x9b, 0x07, 0x35, 0xff, 0x16, - 0x00, 0xcf, 0xcd, 0x7d, 0x3e, 0xb0, 0xa7, 0xeb, 0xe5, 0x50, 0x97, 0xa9, - 0xae, 0x58, 0x8f, 0x37, 0xc5, 0xc9, 0x27, 0x7b, 0x6f, 0x9b, 0x62, 0xe5, - 0xfd, 0xd8, 0x2a, 0x66, 0x13, 0x69, 0x75, 0x84, 0x7a, 0x7d, 0x8d, 0x07, - 0xba, 0x12, 0x40, 0xa3, 0x09, 0xcb, 0xf1, 0x6a, 0xb8, 0xe2, 0x9b, 0x85, - 0xc4, 0xe6, 0x82, 0x86, 0x67, 0xf1, 0xb2, 0x14, 0x11, 0x9f, 0x49, 0x39, - 0xe9, 0xcb, 0xc5, 0x9a, 0x2b, 0x77, 0x2e, 0x06, 0xf1, 0x75, 0x33, 0x1e, - 0x6f, 0xa9, 0xd7, 0x56, 0xae, 0xd4, 0xc4, 0x1f, 0x5c, 0x93, 0xcd, 0xed, - 0x37, 0xa8, 0xc3, 0x4f, 0x58, 0x1d, 0x81, 0x2a, 0x68, 0x19, 0x28, 0x57, - 0xbf, 0x66, 0xb0, 0x5b, 0x67, 0xca, 0x15, 0xb1, 0x1d, 0x06, 0x54, 0x33, - 0xa5, 0x06, 0x9b, 0xea, 0x42, 0xea, 0x0c, 0xda, 0x9b, 0x0e, 0x4f, 0xff, - 0xb6, 0xc8, 0x9e, 0x38, 0x06, 0xfa, 0xbb, 0x90, 0x41, 0xab, 0x9a, 0xea, - 0xa4, 0x59, 0xfb, 0x91, 0x83, 0x4a, 0x32, 0xff, 0x2e, 0x49, 0x3e, 0x2a, - 0x12, 0xa0, 0x34, 0x65, 0xff, 0xd9, 0x7b, 0x2c, 0x28, 0x77, 0xeb, 0x70, - 0x7a, 0x27, 0x29, 0x60, 0x6c, 0x80, 0xbc, 0x00, 0x7a, 0x15, 0xba, 0xaf, - 0xe8, 0x59, 0xf3, 0x0b, 0x92, 0x67, 0x0c, 0x24, 0xcf, 0xc0, 0x61, 0x38, - 0xaa, 0x00, 0x3c, 0x8d, 0x53, 0xb7, 0x93, 0xe0, 0x25, 0x37, 0x29, 0x91, - 0x5f, 0x79, 0xda, 0xa8, 0x9d, 0x07, 0x1c, 0x1a, 0x6c, 0xb7, 0xdf, 0x2c, - 0xab, 0x09, 0x55, 0x0d, 0x2b, 0xc4, 0x31, 0x27, 0xa2, 0x42, 0xdf, 0x17, - 0x5f, 0xf8, 0x08, 0x65, 0x71, 0xc9, 0x34, 0x8f, 0xf8, 0xa1, 0xd9, 0x23, - 0x93, 0x3f, 0xcc, 0x79, 0x60, 0xb7, 0x66, 0xf3, 0x20, 0x18, 0x72, 0x74, - 0x3f, 0x70, 0xce, 0x12, 0x80, 0x9f, 0xfb, 0xd6, 0xb2, 0x3b, 0x0b, 0xc3, - 0xa5, 0xc4, 0x81, 0xb9, 0xe0, 0x62, 0x1c, 0x5f, 0x68, 0x24, 0x72, 0xf0, - 0x14, 0xda, 0x0f, 0xc9, 0x75, 0xb2, 0x3d, 0xa9, 0x98, 0x90, 0xa4, 0x21, - 0xe1, 0x1f, 0xf4, 0x7a, 0x7e, 0x35, 0xe5, 0x54, 0xa9, 0x8a, 0xa3, 0x72, - 0x41, 0x9f, 0xbd, 0x2b, 0x31, 0x74, 0xd4, 0xa3, 0xb9, 0x40, 0xa2, 0x71, - 0x0a, 0x55, 0x39, 0xf0, 0x90, 0x97, 0x03, 0xb0, 0x6e, 0x93, 0xad, 0x43, - 0xc6, 0x86, 0x5c, 0x1d, 0x4a, 0x21, 0xe0, 0xa9, 0x68, 0x7d, 0x12, 0xee, - 0x7d, 0x33, 0xcc, 0x64, 0x4e, 0x4a, 0xe4, 0x86, 0x12, 0xe8, 0x4f, 0xbf, - 0x18, 0x2d, 0x16, 0xe0, 0xf2, 0xca, 0x22, 0x88, 0x35, 0xcd, 0xf4, 0xab, - 0x67, 0xe8, 0x60, 0x6c, 0xa9, 0x84, 0xa4, 0x51, 0xeb, 0x7f, 0x4f, 0xb8, - 0x70, 0x1b, 0x2f, 0xbf, 0x5b, 0x85, 0xcd, 0x7d, 0xd5, 0xde, 0xe6, 0x64, - 0x6f, 0xd5, 0x7a, 0x6d, 0xec, 0x53, 0x56, 0x61, 0xae, 0xc0, 0x52, 0xe5, - 0x2d, 0xc1, 0xf1, 0xdf, 0x1f, 0x7a, 0x7c, 0x4a, 0x8a, 0x4d, 0x7d, 0xcc, - 0x5b, 0xcd, 0x88, 0xd6, 0x56, 0x25, 0xb1, 0x5e, 0xf5, 0xf8, 0x34, 0x8c, - 0xad, 0x6e, 0x85, 0x6b, 0xd1, 0x86, 0x32, 0xf8, 0x1b, 0xc5, 0x10, 0xd1, - 0xce, 0xdf, 0xd0, 0x74, 0x99, 0x5b, 0x56, 0xab, 0xfb, 0x6e, 0x25, 0x8d, - 0x9a, 0x87, 0xc7, 0x4d, 0x14, 0xc4, 0x58, 0x11, 0x08, 0x71, 0x7f, 0x26, - 0x8c, 0xee, 0x76, 0x16, 0x73, 0x98, 0x8a, 0xf3, 0x58, 0xb0, 0xa8, 0x18, - 0xd5, 0xc3, 0x2a, 0x90, 0xe2, 0x05, 0xb6, 0xe6, 0xa3, 0x34, 0xda, 0x7e, - 0xa0, 0xa1, 0x61, 0x6b, 0xfe, 0x20, 0x49, 0x1f, 0x8e, 0x1d, 0x70, 0x6d, - 0x13, 0x59, 0x78, 0x99, 0xb0, 0x91, 0xaa, 0xc3, 0x53, 0xe0, 0xeb, 0x4a, - 0x0d, 0xeb, 0x08, 0xa2, 0xb1, 0xe4, 0x8f, 0x8b, 0x69, 0x40, 0x21, 0x82, - 0x1e, 0x15, 0x23, 0xb4, 0xce, 0xc4, 0xd2, 0xfe, 0xb0, 0xe6, 0x77, 0xba, - 0xe1, 0x7f, 0x11, 0xb9, 0x4d, 0xfb, 0x0b, 0x86, 0xd5, 0xb1, 0x65, 0x9f, - 0x7f, 0x48, 0xe1, 0x6e, 0x73, 0xa5, 0x00, 0x36, 0xf6, 0x80, 0xfe, 0x98, - 0x0f, 0x62, 0x71, 0xa5, 0x9a, 0x5b, 0x3c, 0x5c, 0xb0, 0x93, 0x9b, 0x46, - 0x9c, 0x0d, 0x3b, 0x4f, 0x64, 0x59, 0x7f, 0x27, 0x76, 0xc5, 0x50, 0x89, - 0x04, 0x64, 0x80, 0xf4, 0xdd, 0x52, 0x40, 0x40, 0x47, 0xc4, 0x43, 0xe3, - 0xbc, 0xd3, 0x2e, 0xab, 0x6f, 0xee, 0xf1, 0xbe, 0x16, 0x73, 0x2f, 0x26, - 0xdb, 0x23, 0x55, 0x9f, 0xbb, 0x0d, 0xb9, 0xae, 0x5c, 0xfb, 0x37, 0x74, - 0xb1, 0x3f, 0x60, 0x39, 0x42, 0xbf, 0x1f, 0xd5, 0x51, 0x9f, 0x3f, 0x59, - 0xf4, 0x10, 0x6c, 0x59, 0x36, 0x68, 0x9e, 0x54, 0xca, 0xc8, 0x7d, 0x6c, - 0x24, 0xc2, 0x78, 0x79, 0x5e, 0x69, 0x22, 0x90, 0x52, 0xa1, 0x42, 0x34, - 0xc0, 0x9c, 0x84, 0x09, 0x26, 0xe1, 0x10, 0x3e, 0x49, 0xcb, 0xea, 0xc6, - 0x5e, 0x1d, 0x47, 0xa5, 0x57, 0xd4, 0x4b, 0x2c, 0xb8, 0x4c, 0xc0, 0xba, - 0x65, 0xe9, 0xc9, 0x55, 0xef, 0x50, 0x65, 0x6f, 0x0f, 0xc6, 0xcf, 0x13, - 0x11, 0x87, 0x6c, 0x68, 0x3f, 0xf9, 0x18, 0x5e, 0x4f, 0xa2, 0x89, 0x84, - 0xae, 0xbd, 0x1b, 0xa5, 0x93, 0xac, 0xab, 0xd7, 0x98, 0xf1, 0x57, 0xc7, - 0xf1, 0xb5, 0xbc, 0x39, 0xff, 0xbd, 0x38, 0xb0, 0x02, 0x44, 0x9f, 0x50, - 0x2d, 0x80, 0xaf, 0xd9, 0xc2, 0xf1, 0x99, 0x7e, 0x0d, 0xea, 0xb0, 0xbd, - 0x49, 0xc5, 0xc5, 0x82, 0xb2, 0x49, 0x24, 0xbe, 0x0e, 0xaf, 0x7e, 0x53, - 0xf5, 0x9b, 0xe4, 0xab, 0xc9, 0x4d, 0xf2, 0x3f, 0x60, 0x5f, 0xec, 0xed, - 0x88, 0xa0, 0x00, 0x43, 0xf5, 0xb5, 0x06, 0xbb, 0x8a, 0xc4, 0x57, 0x6a, - 0xd2, 0xe8, 0xf7, 0xe0, 0x83, 0xb6, 0x7b, 0x1d, 0xf8, 0xd4, 0x85, 0xc0, - 0x2e, 0xac, 0x96, 0x95, 0xcb, 0xd7, 0xf8, 0x9c, 0x54, 0x1a, 0xd3, 0xe6, - 0x02, 0xee, 0x7f, 0x4f, 0x36, 0x6b, 0x82, 0xde, 0x66, 0x03, 0x58, 0xfc, - 0x11, 0x1f, 0x5e, 0x77, 0x02, 0x89, 0x9b, 0x69, 0x6a, 0xb2, 0x97, 0xb1, - 0x14, 0x69, 0xf2, 0x5a, 0xc2, 0x41, 0x5f, 0x16, 0xd7, 0x1b, 0x23, 0xca, - 0xb3, 0x58, 0x2d, 0xe7, 0xad, 0x25, 0x69, 0xc5, 0xdd, 0x70, 0x7b, 0x31, - 0x41, 0xed, 0x27, 0xa3, 0x06, 0xe0, 0xde, 0xb5, 0xc3, 0xe6, 0x90, 0x06, - 0x7a, 0x8c, 0x8a, 0xc4, 0x97, 0x92, 0x46, 0x52, 0x6c, 0xd2, 0x22, 0x68, - 0xf0, 0x64, 0xdd, 0xd0, 0x05, 0x96, 0xcd, 0x94, 0x1c, 0x1c, 0xc3, 0x7b, - 0xfc, 0x5b, 0x50, 0x6a, 0x75, 0x1c, 0x4b, 0x1c, 0x14, 0x02, 0xdf, 0x97, - 0xb0, 0x36, 0x92, 0x3c, 0xa2, 0xfa, 0xe4, 0x8f, 0xe3, 0xc3, 0x48, 0x4d, - 0x68, 0x48, 0x52, 0xd2, 0x64, 0xf0, 0x52, 0x5b, 0xe5, 0x05, 0x53, 0x2b, - 0xb7, 0x30, 0x32, 0xdc, 0x12, 0xb2, 0x16, 0x0e, 0x2f, 0x17, 0xfa, 0x0e, - 0xb3, 0x33, 0xa6, 0xfc, 0xf8, 0xff, 0x03, 0x87, 0x4d, 0xa0, 0x5b, 0x56, - 0x48, 0x34, 0x3b, 0x22, 0x5e, 0x2e, 0xef, 0xbf, 0xdd, 0x23, 0x7a, 0x04, - 0x0c, 0x29, 0x0e, 0x3a, 0xa4, 0x66, 0x16, 0x8a, 0xae, 0x7e, 0x9d, 0x32, - 0xd6, 0x32, 0x5c, 0x75, 0x2c, 0xc0, 0xee, 0xbf, 0xa9, 0xea, 0x73, 0xd4, - 0x74, 0x40, 0xdb, 0x41, 0x3e, 0xdc, 0x87, 0x5e, 0xab, 0xc5, 0xa4, 0xfd, - 0xa8, 0xa6, 0x8b, 0x05, 0x2d, 0x2d, 0x1b, 0x52, 0x27, 0xeb, 0x47, 0x2f, - 0x97, 0xdb, 0x89, 0x6b, 0x65, 0x4d, 0x22, 0x0c, 0x7a, 0x0e, 0x41, 0x8e, - 0xa9, 0x15, 0x14, 0x30, 0x05, 0x5a, 0xac, 0xd5, 0x36, 0x2f, 0x96, 0x9f, - 0xf3, 0xa6, 0x59, 0xa3, 0xbf, 0xcc, 0x3c, 0xe2, 0x9b, 0xd6, 0x3d, 0xfd, - 0xfc, 0x54, 0xb3, 0x17, 0xe1, 0x4f, 0x22, 0x60, 0x79, 0x80, 0xaf, 0xbb, - 0x1a, 0x42, 0x03, 0x74, 0x85, 0x87, 0xb9, 0x9a, 0x10, 0x68, 0x77, 0xe8, - 0x94, 0x67, 0xb7, 0x5e, 0x3f, 0x32, 0x50, 0xf0, 0x7b, 0x41, 0x67, 0x0c, - 0x42, 0x6a, 0xdd, 0xcf, 0x2b, 0x03, 0xb4, 0xa4, 0x60, 0x39, 0x5c, 0x4a, - 0xec, 0xdb, 0xf3, 0x12, 0x12, 0x80, 0x87, 0xdb, 0x23, 0x46, 0xee, 0x64, - 0x1f, 0xc5, 0xfb, 0xf9, 0x49, 0xfa, 0xee, 0x1d, 0x57, 0x79, 0x5f, 0x3f, - 0xd7, 0xb2, 0xa4, 0x42, 0xee, 0xc6, 0x97, 0x87, 0x93, 0x88, 0x66, 0xac, - 0xd7, 0x91, 0xf1, 0xc1, 0xe1, 0xfa, 0x3d, 0x2a, 0xf2, 0x07, 0xc3, 0xc7, - 0xe0, 0x0d, 0xaa, 0x02, 0xd4, 0x7b, 0x78, 0xd2, 0x7f, 0x2f, 0xd9, 0x81, - 0x3f, 0x84, 0x6a, 0xbb, 0xc2, 0x24, 0x62, 0x6e, 0xac, 0x4a, 0x3a, 0x0e, - 0x93, 0x0b, 0x45, 0xb8, 0x75, 0x76, 0xcb, 0xae, 0x55, 0x4d, 0x10, 0x6e, - 0xfa, 0x2f, 0x19, 0xb0, 0x74, 0x04, 0xd0, 0xd7, 0xdb, 0x3d, 0xc2, 0x7e, - 0x73, 0xa4, 0x90, 0x6f, 0x30, 0xab, 0x09, 0x28, 0x28, 0x46, 0x97, 0x46, - 0x04, 0xa1, 0x59, 0x85, 0xc4, 0x1a, 0xbb, 0xdb, 0x8b, 0xbe, 0x22, 0x05, - 0x2e, 0x9f, 0x4f, 0xe7, 0xd9, 0x60, 0x4b, 0xb5, 0x4f, 0xbe, 0xe3, 0x2e, - 0x81, 0xdd, 0x78, 0x96, 0x62, 0xe7, 0xda, 0xce, 0x83, 0x8b, 0x59, 0xdc, - 0x5f, 0x23, 0x2f, 0x79, 0x6c, 0x91, 0x99, 0xc0, 0xc9, 0x6f, 0x34, 0x6c, - 0x83, 0xed, 0x01, 0x9d, 0xc4, 0x5f, 0x08, 0x54, 0xaf, 0xc0, 0x17, 0x93, - 0xb7, 0xa8, 0x66, 0x37, 0xb2, 0xc9, 0xa6, 0x3b, 0x3f, 0xbb, 0x33, 0xe4, - 0xa0, 0x90, 0x26, 0x1c, 0x02, 0x5a, 0x4e, 0xe9, 0x6d, 0x1a, 0x29, 0x34, - 0x7a, 0x81, 0x38, 0x71, 0xb2, 0x69, 0x71, 0xe1, 0xcc, 0xb5, 0x36, 0xaf, - 0x3e, 0xd7, 0x2f, 0x2a, 0x31, 0xf3, 0xa9, 0x5e, 0xf7, 0x14, 0x65, 0xee, - 0x3d, 0xe5, 0x34, 0x8a, 0x28, 0xe5, 0xb3, 0x81, 0x9b, 0xda, 0x9b, 0xa9, - 0xc1, 0xa9, 0xc4, 0x30, 0x0c, 0xc7, 0x1f, 0x3d, 0xf9, 0x62, 0x3f, 0x2b, - 0x86, 0x0c, 0x3e, 0xe9, 0x45, 0xee, 0x85, 0x03, 0xb8, 0x38, 0x8d, 0x6b, - 0x89, 0x45, 0x5d, 0x23, 0x3f, 0x13, 0x33, 0x3a, 0x36, 0x59, 0xe4, 0x85, - 0x4f, 0x10, 0x00, 0xbc, 0x99, 0xeb, 0xf1, 0x60, 0x00, 0xeb, 0x22, 0xd9, - 0x6d, 0xbd, 0xbb, 0xd9, 0x32, 0x59, 0x8a, 0xc9, 0x0e, 0x12, 0x3f, 0x1d, - 0xf0, 0x44, 0xd4, 0xd4, 0x14, 0x07, 0x97, 0x8f, 0xf5, 0xaf, 0xfe, 0xf3, - 0xf4, 0x99, 0x36, 0x0d, 0xb5, 0x7b, 0x95, 0xb2, 0x9e, 0xc9, 0xf0, 0x48, - 0x6c, 0x5f, 0x61, 0x18, 0x44, 0x37, 0x37, 0x96, 0xbd, 0x5b, 0x92, 0xf9, - 0xb3, 0x9d, 0xf6, 0xca, 0x39, 0xe7, 0xcb, 0x2a, 0x9a, 0xe2, 0x87, 0x17, - 0x43, 0xa9, 0xda, 0x67, 0x70, 0xbe, 0xae, 0x00, 0xe2, 0x8f, 0x80, 0xe7, - 0x9a, 0x2e, 0xdc, 0x1c, 0x4a, 0xb5, 0x6c, 0x2a, 0x24, 0x03, 0xd7, 0x7b, - 0xdb, 0x7f, 0x39, 0xd0, 0xdf, 0x86, 0x99, 0xd4, 0x30, 0x88, 0xee, 0xaf, - 0x22, 0x78, 0x8f, 0xd4, 0xf3, 0x20, 0x57, 0x18, 0xfb, 0x62, 0x79, 0x1a, - 0xbc, 0xb2, 0xc7, 0xc1, 0x99, 0x8a, 0xf9, 0x5c, 0x87, 0xfd, 0x2b, 0x0b, - 0x74, 0x72, 0x73, 0x7a, 0x06, 0x02, 0x39, 0x92, 0x64, 0x4a, 0x4d, 0x01, - 0x9d, 0x18, 0x62, 0xfb, 0x29, 0x7f, 0x10, 0x96, 0x2b, 0xf3, 0x3f, 0x1f, - 0xc1, 0xf9, 0x39, 0x76, 0xff, 0x64, 0xba, 0x58, 0x7c, 0x5f, 0x65, 0x44, - 0x6a, 0xb2, 0xe1, 0xaf, 0xb0, 0x4c, 0xe4, 0xe8, 0xe6, 0x12, 0xc7, 0x7c, - 0xd3, 0x6e, 0x74, 0x3a, 0x13, 0x70, 0xac, 0xfb, 0x05, 0xdb, 0x71, 0x46, - 0xd9, 0x47, 0x8a, 0xa7, 0xbd, 0x1d, 0xd4, 0x5d, 0x81, 0x7d, 0x32, 0x51, - 0x88, 0x4c, 0xdd, 0x09, 0x85, 0x6d, 0x28, 0x2c, 0xab, 0x0d, 0x15, 0xe6, - 0x76, 0xdc, 0x91, 0x25, 0xd0, 0xcc, 0x7a, 0xb0, 0x61, 0x23, 0xb4, 0x46, - 0xbc, 0xeb, 0x65, 0xec, 0xe1, 0x60, 0xed, 0x3b, 0x9a, 0xf9, 0xf0, 0x2a, - 0x0e, 0xdf, 0x61, 0x92, 0x91, 0x86, 0xe1, 0x4a, 0x3b, 0x5c, 0x8e, 0x0e, - 0x76, 0x76, 0x3a, 0x62, 0x25, 0x51, 0x71, 0x1a, 0xba, 0xef, 0x7f, 0x80, - 0x28, 0xc1, 0x15, 0x12, 0x9f, 0x5f, 0x0e, 0xbd, 0x82, 0xa2, 0x2c, 0xe3, - 0x9f, 0xb9, 0x72, 0x09, 0x1e, 0x7d, 0x83, 0x88, 0xd3, 0x86, 0x6b, 0x21, - 0x3e, 0x57, 0x46, 0x88, 0xfa, 0x54, 0x08, 0x1f, 0x05, 0x03, 0xa0, 0xbb, - 0x16, 0x3e, 0xe8, 0x92, 0xe4, 0x3d, 0xde, 0x66, 0xcc, 0x6c, 0x11, 0x71, - 0x88, 0x11, 0x02, 0x3e, 0xbd, 0xfd, 0x5b, 0xf2, 0xdd, 0x05, 0x99, 0x31, - 0xc1, 0x82, 0xf6, 0x0b, 0xea, 0x5f, 0x80, 0x84, 0x20, 0xc3, 0x80, 0xa1, - 0x65, 0xb9, 0x8b, 0x18, 0xbe, 0xe3, 0x25, 0x24, 0xc7, 0x28, 0xe2, 0x2f, - 0xe6, 0x72, 0x15, 0x6b, 0x2a, 0x5f, 0x57, 0x5b, 0xed, 0xc4, 0x8e, 0x5a, - 0x29, 0x6d, 0xa5, 0x2a, 0x6c, 0xd8, 0x40, 0x3f, 0x29, 0x87, 0xeb, 0x2e, - 0x52, 0x39, 0x0d, 0x06, 0x30, 0x22, 0xf5, 0x91, 0xfe, 0x80, 0xeb, 0x8b, - 0xfb, 0x4a, 0x0b, 0xdd, 0xbf, 0x88, 0x04, 0x0d, 0xe6, 0x9d, 0x36, 0xc1, - 0xf8, 0xd5, 0x8d, 0x22, 0x45, 0x4b, 0x01, 0xb8, 0xc2, 0xbb, 0x83, 0x29, - 0xc4, 0x53, 0x44, 0x68, 0x1d, 0x5b, 0xaa, 0x28, 0x38, 0xaa, 0x8d, 0x41, - 0xba, 0x0e, 0x43, 0xba, 0x66, 0xc2, 0xc6, 0xd7, 0x77, 0x49, 0x0c, 0x22, - 0x3f, 0xe8, 0x72, 0xad, 0xbd, 0x6d, 0xb5, 0xc7, 0xe9, 0x87, 0x52, 0xfe, - 0x35, 0x11, 0x77, 0x38, 0x15, 0xc5, 0x45, 0xcd, 0x9b, 0x78, 0x57, 0x7d, - 0xb0, 0x3f, 0x43, 0xc1, 0x83, 0x33, 0x01, 0x9d, 0x86, 0x4d, 0xf8, 0xc6, - 0x5e, 0x46, 0x57, 0xb6, 0xbe, 0x86, 0x8f, 0x5a, 0x31, 0xbd, 0x33, 0xa6, - 0x39, 0x01, 0x06, 0xe3, 0x9e, 0x2c, 0x68, 0x25, 0x4c, 0x6b, 0x9e, 0x03, - 0xcf, 0x6a, 0xa6, 0xe0, 0x25, 0xb9, 0x76, 0x79, 0x57, 0x2f, 0xed, 0x25, - 0x74, 0x90, 0xcb, 0x70, 0x22, 0x8f, 0x12, 0xaa, 0x06, 0x33, 0x8d, 0x2e, - 0x8c, 0xe1, 0x4c, 0x98, 0x60, 0x32, 0xe4, 0x84, 0x19, 0xd2, 0x7f, 0x4d, - 0x1c, 0x4c, 0x39, 0xfd, 0x19, 0xe2, 0x00, 0xc8, 0xd1, 0xba, 0x37, 0x04, - 0xa6, 0x44, 0x56, 0xd8, 0x51, 0x27, 0xfe, 0xd9, 0xe2, 0x92, 0xb7, 0xf4, - 0x2d, 0x28, 0x8e, 0xb4, 0x4c, 0x48, 0xb8, 0xf5, 0x2e, 0x4f, 0xd4, 0xc1, - 0x43, 0xac, 0x2e, 0x4a, 0x90, 0x06, 0xae, 0xd9, 0xac, 0x5d, 0xde, 0x80, - 0xef, 0x03, 0xc2, 0x18, 0x35, 0x18, 0x99, 0x86, 0x93, 0x38, 0xdd, 0x7c, - 0xde, 0x48, 0xcd, 0x50, 0xc4, 0xd4, 0xe6, 0xd0, 0xf0, 0xb3, 0x6a, 0xf5, - 0x87, 0x4d, 0xe0, 0x5b, 0x69, 0xac, 0x62, 0x11, 0xac, 0x69, 0x11, 0x1a, - 0xbc, 0xea, 0x26, 0x9f, 0xc5, 0x2d, 0x2d, 0xb1, 0x8a, 0xf3, 0x55, 0xd5, - 0x66, 0x36, 0x21, 0xb7, 0xb9, 0x0b, 0x23, 0x45, 0x86, 0xab, 0x49, 0xee, - 0x26, 0xaa, 0x19, 0x4d, 0x0e, 0xc7, 0x05, 0x13, 0x7a, 0xd0, 0xa5, 0x8c, - 0x24, 0x43, 0x60, 0xfd, 0xaa, 0xcf, 0x01, 0x8e, 0xc5, 0xd4, 0x83, 0x91, - 0x8d, 0x3d, 0xd1, 0xea, 0xba, 0x3d, 0x7a, 0x54, 0x26, 0x01, 0x7d, 0x6b, - 0x99, 0xf0, 0x36, 0x24, 0x11, 0xd9, 0xcb, 0xae, 0x86, 0x48, 0xb6, 0x41, - 0xae, 0x2e, 0x4a, 0x8f, 0xf8, 0x67, 0x8b, 0x56, 0x5a, 0x27, 0xa6, 0xaa, - 0xb9, 0x04, 0xbf, 0x12, 0x11, 0xde, 0x9f, 0x05, 0x90, 0x14, 0x77, 0xcc, - 0x1d, 0x59, 0x93, 0x61, 0xa3, 0x80, 0x93, 0xa1, 0x08, 0x29, 0x47, 0x45, - 0xf5, 0x2a, 0xf7, 0x01, 0xb4, 0x96, 0xe3, 0x36, 0x89, 0x7c, 0xa7, 0xf2, - 0xb3, 0xbd, 0x24, 0x7b, 0x31, 0xe8, 0x25, 0xc2, 0x05, 0x18, 0x9d, 0x39, - 0xa6, 0xb4, 0x7b, 0x4a, 0x75, 0xad, 0x47, 0x19, 0x7f, 0x0f, 0x61, 0xab, - 0x6e, 0x22, 0x93, 0xfe, 0xa2, 0x11, 0x09, 0x12, 0xb3, 0x4b, 0xe2, 0x60, - 0x3b, 0x77, 0x7e, 0x5c, 0xcc, 0x86, 0x2a, 0xe0, 0x77, 0xb0, 0x94, 0xbf, - 0xa5, 0x9f, 0x79, 0x90, 0x7d, 0xed, 0xad, 0x29, 0xf3, 0xfc, 0x50, 0x0b, - 0xda, 0xbb, 0x35, 0xe4, 0x0c, 0x19, 0x28, 0xd7, 0x23, 0x65, 0x29, 0x2d, - 0x5b, 0xbd, 0x9d, 0x8c, 0xe0, 0x17, 0xb3, 0x3a, 0xa7, 0x08, 0xab, 0x90, - 0x27, 0x86, 0x8a, 0x2e, 0x4c, 0xe0, 0x77, 0x18, 0xe3, 0xa3, 0x5a, 0x33, - 0x14, 0x72, 0x10, 0xda, 0x09, 0xe7, 0xae, 0xd1, 0x2c, 0x3c, 0x82, 0x6b, - 0x5e, 0xf5, 0x7e, 0x8d, 0x60, 0xca, 0x75, 0xa1, 0x4a, 0x19, 0x24, 0x8e, - 0x12, 0x23, 0x2f, 0x8c, 0x68, 0x2d, 0xfd, 0xdd, 0xa7, 0xef, 0xaf, 0x9a, - 0x53, 0x9a, 0x0d, 0x5e, 0x84, 0x8e, 0x58, 0xc9, 0x88, 0x83, 0xc2, 0x70, - 0xdc, 0xb1, 0x7c, 0x70, 0xbe, 0x41, 0x3e, 0xb4, 0xea, 0x28, 0x0c, 0xd4, - 0x77, 0x00, 0x52, 0xed, 0xed, 0x07, 0x26, 0x63, 0x1e, 0xf8, 0x7d, 0x6e, - 0x6e, 0x2f, 0x70, 0x96, 0x3f, 0x8d, 0x68, 0x4f, 0x9f, 0x26, 0xa0, 0x15, - 0x1a, 0x1d, 0x51, 0x50, 0x27, 0x40, 0x97, 0xf5, 0xf0, 0x2c, 0x3e, 0x05, - 0xb2, 0x52, 0x52, 0x91, 0x37, 0xe1, 0x19, 0x7f, 0xa2, 0xc7, 0x4e, 0xea, - 0x8b, 0xa5, 0x0e, 0x57, 0x55, 0x17, 0xdc, 0x5e, 0x83, 0x03, 0x09, 0x9f, - 0x93, 0xdc, 0x65, 0x68, 0x1f, 0x19, 0x4b, 0xdf, 0xac, 0x38, 0x4e, 0x40, - 0x5f, 0x85, 0x44, 0x27, 0x97, 0x53, 0x27, 0x18, 0xe4, 0x62, 0x02, 0x34, - 0xbe, 0xa3, 0x3d, 0xfd, 0x2a, 0x1a, 0x82, 0xd9, 0x4d, 0xc2, 0xba, 0x15, - 0x27, 0xb4, 0xb5, 0x93, 0xc7, 0xdf, 0x1a, 0x3e, 0x59, 0x71, 0xb5, 0xbd, - 0x5b, 0x07, 0xff, 0xad, 0x99, 0xd2, 0x72, 0xa0, 0x7b, 0x0c, 0xf4, 0x84, - 0x29, 0x73, 0xdc, 0x7d, 0xaf, 0xa6, 0xb5, 0x62, 0xfd, 0x6d, 0x07, 0xe3, - 0xee, 0x73, 0x88, 0x9d, 0x86, 0xca, 0x9e, 0x9f, 0xb3, 0x97, 0x6e, 0x29, - 0x8a, 0xba, 0xf7, 0x04, 0xe5, 0xff, 0x73, 0x5e, 0x50, 0x62, 0x66, 0xbb, - 0x60, 0x72, 0x11, 0x85, 0x68, 0x4d, 0xc6, 0xaa, 0xd9, 0x09, 0x05, 0x23, - 0x19, 0xf5, 0x21, 0x56, 0xb8, 0xb9, 0x9a, 0xb6, 0xb8, 0xfa, 0x5a, 0xa4, - 0x46, 0xf9, 0x21, 0x60, 0x18, 0x5f, 0x1b, 0xb6, 0xac, 0x86, 0xb0, 0x01, - 0xb7, 0xe2, 0xe2, 0xfb, 0x48, 0xb1, 0x7c, 0x77, 0x43, 0xaa, 0x65, 0xa2, - 0x7d, 0xb5, 0xf1, 0x63, 0x9f, 0x4a, 0xdc, 0xfe, 0x96, 0x70, 0x1d, 0xfd, - 0xf2, 0x88, 0xca, 0x33, 0x73, 0x44, 0x0f, 0x72, 0x38, 0x94, 0x8f, 0xd7, - 0xe4, 0x1f, 0xb5, 0x25, 0x37, 0x7a, 0x8a, 0x47, 0x38, 0xf6, 0x80, 0x6d, - 0xcb, 0xc6, 0x22, 0xcf, 0x63, 0x77, 0x6c, 0xe0, 0x54, 0x34, 0x9c, 0xfe, - 0x39, 0x5d, 0xc1, 0x10, 0xf2, 0x5a, 0x6f, 0xb2, 0xa5, 0x01, 0xf5, 0x66, - 0x43, 0x73, 0x35, 0x1d, 0xa3, 0x70, 0x5a, 0x1f, 0x87, 0x49, 0xe4, 0x98, - 0xd9, 0x1b, 0xd7, 0xe0, 0xf5, 0x22, 0xf2, 0xab, 0xfe, 0x6d, 0xf7, 0xf6, - 0x6f, 0x60, 0x02, 0x32, 0xf9, 0xa7, 0x12, 0xbe, 0xed, 0xc3, 0x43, 0x3c, - 0x48, 0x40, 0x32, 0x60, 0x26, 0x2f, 0x5f, 0x69, 0x66, 0x06, 0x0a, 0xd2, - 0xa8, 0x50, 0x3c, 0xbf, 0x06, 0xae, 0xb0, 0xdb, 0xae, 0x9d, 0x72, 0x95, - 0x9c, 0xad, 0xf1, 0x8b, 0x31, 0x7e, 0xbe, 0x55, 0x7d, 0x01, 0xf6, 0xdf, - 0xf8, 0xc7, 0x9c, 0x03, 0x03, 0x31, 0x1d, 0xa8, 0xd6, 0x64, 0xe3, 0x5e, - 0x6d, 0x92, 0xfb, 0x97, 0x8a, 0xc1, 0x34, 0x8c, 0x45, 0xc5, 0x23, 0x85, - 0x27, 0x19, 0x60, 0xf4, 0xd7, 0x8a, 0x50, 0x58, 0xb3, 0xa9, 0x13, 0x9f, - 0xef, 0xc8, 0x0c, 0xc1, 0x81, 0x4c, 0xf2, 0x42, 0x99, 0x64, 0x2d, 0xb8, - 0xd6, 0xad, 0xd1, 0x59, 0xcb, 0xfa, 0xf1, 0x23, 0x8d, 0x30, 0x7d, 0x86, - 0x73, 0x5c, 0x53, 0x7f, 0xe4, 0x4d, 0x83, 0x10, 0xbb, 0xf2, 0xcf, 0x93, - 0x4e, 0x58, 0x60, 0x85, 0xc4, 0x12, 0x87, 0x7d, 0x4c, 0x4f, 0x6d, 0xa6, - 0x7a, 0x96, 0x02, 0x19, 0xf3, 0xcd, 0x1b, 0x88, 0x66, 0xb1, 0x26, 0x5b, - 0x35, 0x08, 0xc5, 0xdd, 0xf3, 0x16, 0xbd, 0x2b, 0x24, 0x43, 0x8d, 0xd0, - 0x16, 0xb5, 0x02, 0x27, 0xd3, 0xa4, 0xb0, 0x06, 0x34, 0xa0, 0xe8, 0x37, - 0x53, 0xbc, 0xd6, 0x1c, 0x34, 0x4d, 0x06, 0x52, 0x76, 0xb1, 0x27, 0xde, - 0x12, 0x4f, 0x8d, 0xc1, 0xf6, 0x15, 0x3c, 0x8c, 0x0f, 0xab, 0xf9, 0xf8, - 0xab, 0xa1, 0xcc, 0x7a, 0xb6, 0x43, 0x59, 0x0a, 0x22, 0xe5, 0x1b, 0xd8, - 0xd9, 0x3e, 0xd7, 0x8f, 0x38, 0x16, 0x1b, 0x44, 0x91, 0xc0, 0xbc, 0x76, - 0xfc, 0x44, 0x2a, 0x3c, 0xcd, 0x83, 0x6f, 0xba, 0x4a, 0xb1, 0x36, 0x11, - 0xbb, 0xca, 0x4d, 0xc1, 0x1a, 0x65, 0xb4, 0x5a, 0x99, 0xaf, 0x30, 0x54, - 0x52, 0x1f, 0x95, 0xad, 0x73, 0x5e, 0x92, 0x7f, 0x4d, 0x4e, 0xe8, 0x10, - 0x1b, 0xf6, 0x7d, 0x44, 0xef, 0xd1, 0xa1, 0x7c, 0x51, 0x33, 0xfb, 0x18, - 0x90, 0xa2, 0xe2, 0x8e, 0x85, 0xd4, 0xf5, 0x29, 0xc1, 0x2b, 0x81, 0x58, - 0x46, 0x3b, 0xa3, 0x0c, 0xc8, 0x91, 0x0a, 0x35, 0x6e, 0x1c, 0xf7, 0xf3, - 0x2f, 0x30, 0x6b, 0x75, 0xfa, 0xc3, 0x86, 0xb5, 0x88, 0xfc, 0x9d, 0x82, - 0xf3, 0x73, 0xd9, 0xb1, 0xb2, 0x26, 0x45, 0x61, 0xc3, 0x2f, 0xb1, 0x29, - 0xe8, 0xf5, 0x70, 0xa3, 0xda, 0x84, 0xf0, 0xe9, 0xe3, 0xde, 0x09, 0x81, - 0xae, 0x0c, 0xc5, 0xa7, 0x23, 0x58, 0x2e, 0x99, 0xda, 0x3e, 0xbe, 0x62, - 0x09, 0xd0, 0x57, 0xec, 0x37, 0x2c, 0x3f, 0x46, 0x9e, 0xba, 0x1c, 0x52, - 0x93, 0x2c, 0x66, 0xcf, 0x9b, 0xd1, 0x67, 0xac, 0xb2, 0xfd, 0xc8, 0xcd, - 0x47, 0x7e, 0x1f, 0x1e, 0x7e, 0x02, 0x87, 0xcb, 0xf2, 0x93, 0xd7, 0x4e, - 0x5a, 0xf1, 0x15, 0xf4, 0x8d, 0xaa, 0x95, 0x7a, 0xe0, 0x33, 0x70, 0x68, - 0xc7, 0x3f, 0x73, 0xfa, 0xed, 0xc1, 0xd2, 0x24, 0xc3, 0x03, 0x24, 0xc4, - 0xe9, 0x77, 0x6b, 0xc5, 0x2b, 0x8e, 0xfb, 0x8b, 0xae, 0x67, 0x20, 0x57, - 0xa9, 0xf8, 0x61, 0xf1, 0xf4, 0xa2, 0x59, 0xe4, 0xe2, 0xf6, 0xb7, 0x0f, - 0x76, 0x69, 0x33, 0xb8, 0x00, 0x80, 0x4e, 0xbd, 0xb2, 0x20, 0xb4, 0xb4, - 0x80, 0x4a, 0xb9, 0x1c, 0x8f, 0x2f, 0xd4, 0x5d, 0xdf, 0xc1, 0xd9, 0x54, - 0x02, 0xba, 0x4d, 0x24, 0x0d, 0xd5, 0x25, 0x7d, 0x06, 0x50, 0x3e, 0x69, - 0x01, 0x2c, 0xf5, 0xbe, 0x4f, 0x8e, 0x42, 0xfa, 0x5d, 0x10, 0xe3, 0xc1, - 0xaa, 0x45, 0x5c, 0x50, 0xa4, 0xdd, 0x80, 0x3a, 0xc1, 0xab, 0x46, 0x1a, - 0x32, 0x00, 0x2b, 0xf6, 0xdf, 0xb1, 0x3c, 0x6a, 0x77, 0xbf, 0x88, 0xc8, - 0x5e, 0x74, 0x34, 0x0c, 0xfd, 0x21, 0xdd, 0x82, 0x42, 0x34, 0xe4, 0x4f, - 0x68, 0x26, 0xff, 0x52, 0x25, 0x95, 0xfe, 0x23, 0x6e, 0x75, 0xd1, 0x19, - 0xb1, 0x0e, 0xb4, 0xb2, 0x33, 0x96, 0x12, 0x52, 0x7c, 0xc5, 0x11, 0x01, - 0x5e, 0x10, 0x72, 0xfa, 0x96, 0x83, 0x3b, 0x24, 0x7e, 0x91, 0x31, 0x97, - 0xbd, 0x0c, 0x4c, 0x14, 0xf2, 0xad, 0x96, 0x59, 0x6c, 0x90, 0x98, 0x87, - 0x72, 0x38, 0xda, 0xf1, 0xea, 0x9d, 0xc6, 0xd7, 0x30, 0xb7, 0x25, 0x9c, - 0x6d, 0xac, 0x6a, 0xfd, 0xe6, 0xc7, 0x6a, 0xf8, 0xac, 0xc2, 0xa3, 0x91, - 0x37, 0xd4, 0xf7, 0xc3, 0x99, 0xa7, 0x0b, 0xaf, 0xb4, 0x2e, 0x53, 0xd6, - 0x58, 0x52, 0x83, 0xf3, 0xe9, 0x4d, 0xab, 0xef, 0x0a, 0xb7, 0xaa, 0x6c, - 0x26, 0x6c, 0x5f, 0x8c, 0x62, 0x90, 0xd0, 0xc2, 0xad, 0x95, 0x80, 0x10, - 0x0e, 0x71, 0xe3, 0x8a, 0xa1, 0x39, 0x7c, 0xe9, 0x2e, 0xb6, 0x24, 0xd2, - 0xdb, 0xf3, 0x70, 0xd8, 0x5c, 0x24, 0xff, 0x7e, 0x6c, 0xd6, 0x15, 0xfb, - 0x9f, 0xd8, 0x50, 0xc4, 0x97, 0x39, 0x00, 0x8f, 0xea, 0xb5, 0xe6, 0xd3, - 0x41, 0x9e, 0x12, 0x71, 0xa2, 0x92, 0x9b, 0x73, 0x01, 0x73, 0x89, 0x90, - 0xb7, 0x08, 0x1c, 0x96, 0x6d, 0x1b, 0x36, 0xc2, 0xf5, 0xbd, 0xfa, 0x34, - 0x66, 0x52, 0x81, 0xc1, 0x9d, 0x8f, 0x0a, 0x4f, 0x11, 0xde, 0xf7, 0x1f, - 0xac, 0xf7, 0xbb, 0x3e, 0xd1, 0x4f, 0x7c, 0x16, 0x91, 0xf9, 0xc4, 0x1c, - 0xed, 0x2b, 0x8e, 0x84, 0x93, 0xde, 0x23, 0xf5, 0xb7, 0xbf, 0x90, 0xeb, - 0xc3, 0x90, 0x62, 0x38, 0xd6, 0x24, 0x54, 0x19, 0xbb, 0xf4, 0x33, 0xbf, - 0x30, 0x43, 0x3b, 0x0b, 0x38, 0xda, 0x48, 0x12, 0xb7, 0x3a, 0xd5, 0x14, - 0xed, 0x11, 0x23, 0x7b, 0x4e, 0x04, 0xea, 0x7d, 0x63, 0x42, 0xb5, 0x9f, - 0xc8, 0x0c, 0x44, 0x5b, 0x09, 0xdf, 0x42, 0x95, 0x8f, 0x6f, 0x04, 0xb8, - 0x11, 0x8a, 0xc2, 0x2c, 0xd9, 0xf5, 0x69, 0x19, 0xeb, 0x81, 0xd0, 0x86, - 0x87, 0x80, 0xdf, 0x75, 0xfd, 0xd9, 0x6a, 0x6a, 0x6b, 0x1f, 0xcb, 0x45, - 0xf8, 0xe7, 0x4c, 0xcd, 0x8b, 0x54, 0x35, 0x91, 0x9e, 0x27, 0x12, 0x5e, - 0x65, 0x0a, 0xf4, 0xd6, 0xf8, 0xb4, 0x4c, 0xfe, 0xe0, 0x7e, 0x7b, 0xa1, - 0xa1, 0x58, 0xb9, 0x9e, 0x4a, 0xa4, 0xda, 0x18, 0x94, 0xd5, 0x4e, 0x0b, - 0x6d, 0x90, 0x76, 0x6b, 0xb8, 0xab, 0x6d, 0x24, 0x02, 0xc6, 0x3e, 0xd6, - 0xdc, 0x96, 0xab, 0x51, 0x95, 0x98, 0xde, 0x78, 0xd9, 0xda, 0xfe, 0x6f, - 0x69, 0x74, 0xa2, 0x9f, 0x84, 0x6b, 0x8b, 0x8d, 0xa7, 0x76, 0xac, 0xf4, - 0x0d, 0xa3, 0x20, 0x6e, 0x7d, 0xa1, 0x18, 0x48, 0xd4, 0x0c, 0xd1, 0x38, - 0x84, 0x38, 0x14, 0xc9, 0x7c, 0xc5, 0x79, 0x32, 0xaa, 0xcc, 0x4b, 0xee, - 0x5c, 0xab, 0xfb, 0x39, 0x97, 0x8c, 0x15, 0x1b, 0xdc, 0x34, 0x09, 0x61, - 0x71, 0x01, 0x87, 0xe4, 0xb4, 0x63, 0x52, 0x2e, 0x6b, 0xfe, 0xc2, 0x36, - 0x4c, 0x2d, 0xab, 0x42, 0xec, 0xa3, 0xd8, 0x93, 0x47, 0xba, 0x23, 0xd0, - 0x4f, 0xcc, 0x90, 0x03, 0x53, 0xbb, 0x4d, 0x2f, 0x2e, 0x78, 0x9f, 0xcb, - 0x3b, 0x52, 0xd6, 0x2d, 0xc4, 0x11, 0xfd, 0x66, 0xdb, 0xdb, 0x61, 0xc2, - 0x31, 0xbc, 0x42, 0x9c, 0x4c, 0x02, 0xd3, 0x5d, 0x30, 0x3c, 0xf9, 0x93, - 0xa9, 0x42, 0x71, 0x91, 0xbb, 0x90, 0x04, 0x67, 0xc6, 0xe4, 0x2b, 0x76, - 0x86, 0x34, 0xcc, 0xcb, 0x9a, 0xf7, 0xdd, 0x4b, 0x57, 0xac, 0x76, 0x9a, - 0xa9, 0xef, 0x7a, 0x15, 0x85, 0x58, 0xcc, 0xb2, 0x7a, 0x83, 0x7c, 0xd3, - 0x41, 0x0d, 0x46, 0x54, 0x30, 0x1c, 0x68, 0x18, 0x4a, 0x41, 0x77, 0x3d, - 0x50, 0xa8, 0xfa, 0x71, 0x67, 0xcd, 0xfb, 0xf0, 0x1a, 0x7b, 0xee, 0xcf, - 0xea, 0x83, 0x5f, 0x25, 0x0b, 0x91, 0xba, 0x17, 0xd9, 0x47, 0xf2, 0x27, - 0x04, 0xbd, 0x82, 0x3c, 0x27, 0xfd, 0x3a, 0x4c, 0xbd, 0x78, 0x48, 0xe7, - 0x4c, 0x66, 0xdb, 0x9f, 0x8a, 0x81, 0xde, 0x24, 0x44, 0x0a, 0xce, 0xf8, - 0x53, 0x77, 0xf9, 0x11, 0xfc, 0x02, 0xab, 0xbe, 0x82, 0xf5, 0x51, 0x20, - 0x27, 0xe1, 0xae, 0xdd, 0x78, 0x70, 0x33, 0x28, 0xd0, 0x34, 0x80, 0xca, - 0x3a, 0xeb, 0x5a, 0xad, 0x38, 0x3c, 0xa3, 0xce, 0x53, 0xbd, 0x1b, 0x4a, - 0x9d, 0x85, 0x9d, 0xde, 0x66, 0xdb, 0x4c, 0xd3, 0x4a, 0x55, 0xbd, 0x8f, - 0x55, 0xe6, 0x43, 0x48, 0x57, 0xe4, 0xa7, 0xc2, 0x25, 0x0a, 0x31, 0xe0, - 0x0b, 0x7c, 0xf2, 0x24, 0xc6, 0x84, 0xbf, 0x5b, 0x02, 0x84, 0x4c, 0x75, - 0x14, 0x5c, 0x64, 0x5d, 0x1c, 0xe8, 0xc3, 0x3c, 0x6a, 0x8e, 0xf4, 0xee, - 0x45, 0x70, 0x6a, 0x7d, 0x0b, 0x92, 0xab, 0x08, 0xd5, 0x06, 0x77, 0x68, - 0x8e, 0xa4, 0x3e, 0x56, 0xf6, 0xb2, 0xaa, 0xf9, 0x42, 0xf4, 0x99, 0x30, - 0x6b, 0xc1, 0x68, 0x83, 0xd4, 0x01, 0x34, 0xb0, 0xb1, 0x90, 0xe4, 0x67, - 0x22, 0xa4, 0x99, 0xc4, 0x4c, 0xe9, 0x17, 0x1b, 0xf8, 0xb0, 0x8a, 0x02, - 0xe3, 0xf9, 0xc1, 0x16, 0x43, 0xca, 0x79, 0xf3, 0x87, 0xdf, 0x4f, 0x70, - 0x52, 0x87, 0x36, 0xf0, 0xbb, 0xc8, 0x51, 0x1f, 0x24, 0xf2, 0x3d, 0xe5, - 0xd6, 0xb8, 0x3b, 0x51, 0xf6, 0xc1, 0xc9, 0x9a, 0x98, 0x20, 0x4e, 0x19, - 0xb2, 0xb7, 0xdf, 0x4f, 0xf5, 0x8b, 0x38, 0xa2, 0x83, 0xc1, 0x17, 0x2c, - 0xbb, 0x7d, 0x7b, 0x47, 0x9e, 0xee, 0x92, 0x12, 0x2b, 0xa0, 0x99, 0x6f, - 0x69, 0x34, 0x99, 0x6f, 0xc9, 0x7a, 0xa4, 0xbf, 0xa3, 0x53, 0xe3, 0x12, - 0x81, 0xec, 0xac, 0xaa, 0x20, 0x48, 0x32, 0x35, 0xc2, 0x88, 0xda, 0xa7, - 0xad, 0x13, 0xbf, 0x62, 0x7b, 0xf0, 0x2c, 0x08, 0x5f, 0xce, 0xfe, 0xb4, - 0xdb, 0x70, 0xe5, 0x19, 0xd4, 0xf2, 0xf3, 0xeb, 0xfb, 0x2d, 0xbf, 0x26, - 0x75, 0x3b, 0xd5, 0x7a, 0xe6, 0xf5, 0x83, 0xaf, 0xa9, 0xc2, 0x9d, 0x49, - 0xfb, 0x6d, 0xf3, 0x72, 0x7e, 0x8c, 0x0d, 0xb6, 0xf4, 0x4b, 0x96, 0x95, - 0xb2, 0x2e, 0xfd, 0x96, 0x2f, 0xbd, 0xa2, 0x28, 0x21, 0x52, 0x8b, 0xce, - 0x30, 0xf4, 0x17, 0x97, 0xca, 0x2f, 0xa0, 0xd5, 0xb3, 0xdc, 0xbc, 0xaa, - 0x54, 0x46, 0x9c, 0x13, 0xf1, 0x6d, 0xa6, 0xb6, 0x68, 0x69, 0x8b, 0xae, - 0x2b, 0xb6, 0xdf, 0x90, 0x85, 0x4f, 0x2d, 0x8c, 0x6f, 0x52, 0xcb, 0xad, - 0x1a, 0x33, 0x61, 0xbf, 0xd8, 0xce, 0xd9, 0xd2, 0x2e, 0xff, 0x64, 0x08, - 0x93, 0x11, 0x01, 0x87, 0x8f, 0xd2, 0x17, 0x75, 0x8a, 0x99, 0xe8, 0x7f, - 0x4f, 0x1b, 0xf2, 0xb8, 0x96, 0xff, 0x04, 0x8a, 0x64, 0x41, 0x3e, 0xf9, - 0xa4, 0x67, 0xe1, 0x60, 0xea, 0xe0, 0x5e, 0x74, 0xa6, 0x0d, 0xf1, 0x6a, - 0xc3, 0x34, 0x57, 0xd8, 0x29, 0xf3, 0x01, 0x29, 0x86, 0xcd, 0xd9, 0x57, - 0x52, 0xf2, 0xd7, 0x3f, 0x0a, 0x6a, 0xc8, 0x05, 0x6a, 0x01, 0xf9, 0x8f, - 0xd1, 0xdb, 0x22, 0xda, 0xe0, 0x96, 0xdc, 0x62, 0xb3, 0xed, 0x73, 0x42, - 0x6a, 0x7f, 0x7d, 0x5b, 0x30, 0x20, 0xc6, 0xd7, 0xde, 0x59, 0xd0, 0x95, - 0x19, 0xe6, 0x8b, 0xe5, 0x99, 0xdf, 0x55, 0x68, 0xc1, 0x26, 0x58, 0x01, - 0x70, 0x2b, 0x9e, 0x56, 0x1e, 0xbc, 0x4f, 0x1e, 0xa4, 0x83, 0x51, 0x98, - 0xbe, 0x50, 0x9a, 0xeb, 0x1a, 0x52, 0x0a, 0x71, 0xaa, 0xf9, 0xc4, 0x77, - 0xc6, 0x51, 0x01, 0x9a, 0xa6, 0x3c, 0x98, 0xeb, 0x52, 0x4d, 0xc3, 0x10, - 0x5d, 0x4b, 0xad, 0xe4, 0x91, 0xff, 0x7f, 0xde, 0xb2, 0x62, 0xd5, 0xbd, - 0x87, 0xca, 0x91, 0x59, 0xdc, 0x27, 0xd2, 0x8b, 0xad, 0x70, 0xe7, 0x83, - 0xb2, 0x9b, 0xaf, 0x39, 0xa8, 0xf2, 0x0c, 0xd7, 0x48, 0x99, 0x7a, 0x06, - 0x47, 0x39, 0x7a, 0xb4, 0xf4, 0x4b, 0xcc, 0xa7, 0x09, 0xd0, 0xbd, 0x72, - 0x48, 0xcf, 0xd8, 0x58, 0x95, 0x53, 0xe9, 0x9e, 0x7d, 0xc0, 0xc0, 0xfe, - 0x7f, 0x96, 0xf0, 0x52, 0xcf, 0x33, 0xac, 0xe0, 0xe2, 0xde, 0xd8, 0xf6, - 0xfa, 0xfd, 0xa6, 0x92, 0x34, 0x63, 0x6e, 0xec, 0xa4, 0x89, 0xe0, 0x42, - 0x13, 0x43, 0xe6, 0xeb, 0x7d, 0xe4, 0xa0, 0xca, 0xc7, 0x74, 0xea, 0x58, - 0x36, 0x1b, 0x4f, 0x1a, 0xa7, 0x70, 0x53, 0x5c, 0xde, 0xa5, 0xc7, 0x5f, - 0x57, 0xb8, 0x07, 0x52, 0x7e, 0x81, 0xab, 0x4b, 0x9e, 0xff, 0x72, 0x67, - 0xf2, 0xbc, 0xb8, 0x1a, 0xac, 0x23, 0xea, 0xd7, 0x26, 0x46, 0x19, 0xe0, - 0x19, 0xa2, 0xe2, 0x9d, 0x7b, 0x2c, 0x68, 0xe9, 0x88, 0xe9, 0xf2, 0xc5, - 0x78, 0x74, 0x25, 0xae, 0x4f, 0xdd, 0xa7, 0x1d, 0xc4, 0xcd, 0xe3, 0x85, - 0x3a, 0xde, 0x6e, 0x4f, 0x3f, 0x0f, 0xc5, 0xe4, 0x65, 0x35, 0x6f, 0x0b, - 0xa6, 0x64, 0x12, 0x02, 0x08, 0xad, 0x3b, 0x68, 0xe8, 0xa7, 0xe5, 0xc4, - 0x3c, 0x72, 0x0b, 0x6d, 0xd3, 0x95, 0xb3, 0x4e, 0x82, 0xa6, 0xa9, 0x83, - 0xcb, 0xb7, 0x22, 0xeb, 0xe7, 0x29, 0xad, 0xc6, 0xa4, 0x1c, 0x98, 0x0b, - 0x68, 0x2a, 0x04, 0x45, 0xe4, 0xdd, 0xf3, 0x3c, 0x45, 0x04, 0xdf, 0x36, - 0xa4, 0xde, 0x09, 0x17, 0x4a, 0x00, 0xc2, 0x58, 0x7e, 0xce, 0x80, 0x52, - 0xf5, 0xb7, 0xa1, 0x35, 0x56, 0x0d, 0x9a, 0x79, 0x78, 0x9a, 0x2b, 0xbb, - 0x45, 0x0b, 0x6c, 0x38, 0x0b, 0x81, 0x38, 0x37, 0x00, 0xe0, 0x7a, 0x17, - 0x96, 0xe2, 0xcf, 0xb5, 0xc3, 0x27, 0x5a, 0x10, 0x2c, 0xfb, 0x51, 0xc1, - 0x2a, 0x70, 0x86, 0x58, 0x08, 0xca, 0x47, 0xe1, 0xe4, 0x12, 0x23, 0xe4, - 0xcd, 0x08, 0xa0, 0x9d, 0x59, 0xf7, 0xb1, 0x95, 0xe6, 0x60, 0xdf, 0xbe, - 0x1c, 0x8d, 0xa7, 0x9b, 0x32, 0x00, 0xcd, 0x1a, 0xe4, 0x42, 0xba, 0x22, - 0x08, 0x7f, 0x82, 0xff, 0x47, 0x62, 0x44, 0x42, 0x6b, 0x8e, 0x8f, 0x76, - 0x39, 0xfb, 0x50, 0x4d, 0x1c, 0x44, 0x40, 0xc9, 0x22, 0x21, 0xe8, 0xa4, - 0x44, 0x4c, 0x5a, 0x6c, 0x5b, 0x10, 0x9c, 0x34, 0xb1, 0xe1, 0x49, 0x22, - 0xa3, 0x6e, 0xe2, 0xeb, 0x0a, 0x45, 0xd7, 0x62, 0x81, 0x91, 0x4d, 0x28, - 0x45, 0xe6, 0x0c, 0x0c, 0x20, 0xbc, 0x8e, 0x28, 0xa8, 0xa9, 0x07, 0xc2, - 0xaf, 0xcd, 0xde, 0xd8, 0xcf, 0x49, 0x4e, 0x52, 0x8a, 0x23, 0xbf, 0x1d, - 0xaf, 0x5b, 0xfd, 0x08, 0xca, 0x30, 0x4a, 0xca, 0x2f, 0xc7, 0x39, 0x98, - 0x1b, 0xfb, 0x74, 0x6b, 0xc4, 0xba, 0x0b, 0xdb, 0xef, 0x73, 0xb7, 0xad, - 0x5f, 0xe8, 0x47, 0x6e, 0x0d, 0x8e, 0xf7, 0x87, 0x11, 0x4d, 0x3b, 0x1e, - 0x3b, 0xc1, 0xaa, 0x8c, 0x33, 0x73, 0x1e, 0x16, 0x07, 0x1f, 0xd7, 0x53, - 0x14, 0xf9, 0x4c, 0x01, 0x59, 0x66, 0x51, 0x08, 0x22, 0x72, 0x57, 0x87, - 0x70, 0x53, 0x7f, 0x67, 0x80, 0x90, 0x9d, 0x66, 0x42, 0xe8, 0x50, 0xac, - 0x1e, 0x1a, 0x46, 0x00, 0x61, 0x9d, 0x42, 0xd4, 0x0c, 0x93, 0x55, 0xe5, - 0x25, 0x95, 0x3a, 0xb3, 0x87, 0x2c, 0xea, 0x81, 0x64, 0x15, 0x8b, 0x4e, - 0x49, 0x21, 0x12, 0x00, 0x52, 0x3c, 0x9e, 0x6d, 0x0d, 0x1c, 0xe7, 0xcf, - 0x7c, 0x15, 0x72, 0x8a, 0x1f, 0x1d, 0x4d, 0x7c, 0x3b, 0x6d, 0xcc, 0xf3, - 0x64, 0x14, 0x98, 0xfb, 0x15, 0x19, 0x0e, 0xf7, 0x9e, 0xd8, 0x9a, 0x63, - 0xb2, 0x5c, 0xdf, 0x7b, 0x74, 0xd9, 0xfc, 0x05, 0xe0, 0xd1, 0x53, 0xe1, - 0x20, 0xd7, 0xa5, 0x81, 0xe5, 0x4f, 0xfb, 0x08, 0x15, 0x0e, 0xa8, 0xbc, - 0x76, 0x40, 0xf5, 0x7c, 0x39, 0x0f, 0xfa, 0x68, 0xd9, 0x0b, 0x85, 0xb7, - 0x9a, 0x4c, 0x41, 0x06, 0x7d, 0x4c, 0x25, 0x3a, 0xec, 0xba, 0x4a, 0x41, - 0x53, 0x1b, 0xc4, 0xfa, 0xeb, 0x6f, 0x4d, 0x84, 0xf4, 0x2a, 0xd7, 0xbe, - 0x30, 0x21, 0x6c, 0x43, 0x71, 0xef, 0x83, 0x33, 0xca, 0xfa, 0x15, 0x83, - 0x0c, 0xe5, 0x9f, 0x60, 0x34, 0xe9, 0x55, 0x5d, 0x3b, 0xf8, 0x0d, 0x3b, - 0x13, 0xe8, 0x82, 0x16, 0xd7, 0xf1, 0x10, 0x48, 0x77, 0xcb, 0xb1, 0x06, - 0x5a, 0xe4, 0x9d, 0xce, 0x9a, 0x1f, 0x54, 0x87, 0x41, 0xfd, 0xb6, 0x75, - 0xb6, 0x63, 0xba, 0x13, 0x90, 0x4a, 0xed, 0xf0, 0xfc, 0x6c, 0x73, 0x70, - 0x0c, 0xc8, 0x93, 0xc5, 0x4d, 0x48, 0xc0, 0x52, 0xb0, 0x68, 0x32, 0x07, - 0x0d, 0x09, 0x2e, 0x94, 0xe8, 0x48, 0x54, 0x89, 0xcf, 0x61, 0x76, 0x23, - 0x23, 0x35, 0x6e, 0xd4, 0xd9, 0xad, 0x68, 0x1f, 0x4c, 0x89, 0x36, 0xe3, - 0x55, 0xd8, 0xb1, 0xfa, 0xb2, 0x11, 0x31, 0xbd, 0x14, 0x50, 0x3e, 0xb9, - 0xfc, 0xfa, 0x6a, 0x05, 0xa7, 0x80, 0x17, 0x39, 0xfb, 0xeb, 0x71, 0xc7, - 0x85, 0xec, 0x5b, 0x0f, 0xa4, 0xef, 0xf1, 0x46, 0xc9, 0x9e, 0xd2, 0xad, - 0x3a, 0x0c, 0x73, 0xa4, 0x79, 0xd5, 0x1a, 0x8c, 0x92, 0x78, 0x8b, 0xa6, - 0xf0, 0x1a, 0x49, 0xc0, 0xdc, 0x18, 0x91, 0x0d, 0x1e, 0x80, 0xb1, 0x41, - 0x54, 0xef, 0x45, 0xf3, 0x12, 0x65, 0xae, 0x50, 0x89, 0x9e, 0x15, 0x3a, - 0x2d, 0xdf, 0xf6, 0xdb, 0xc2, 0x4d, 0x16, 0xf9, 0x1a, 0x05, 0xe9, 0x1b, - 0xb8, 0x48, 0x45, 0xb7, 0x1d, 0xd7, 0x73, 0x07, 0x76, 0x72, 0x36, 0xeb, - 0x94, 0x3c, 0xac, 0x5e, 0x35, 0x59, 0x5d, 0x09, 0xfa, 0x99, 0xa7, 0xa2, - 0x3e, 0xca, 0xc2, 0xfe, 0xc5, 0x1a, 0x1f, 0xb8, 0xe3, 0x65, 0xf3, 0xb2, - 0x24, 0x8a, 0x4e, 0x8e, 0x19, 0x91, 0x43, 0x8e, 0x1b, 0x05, 0x42, 0x24, - 0x53, 0xc2, 0x65, 0x39, 0x14, 0x16, 0x04, 0xf7, 0xaa, 0xbe, 0x33, 0x31, - 0xfe, 0xcf, 0xe4, 0x77, 0x5e, 0x33, 0x32, 0x52, 0xb7, 0x19, 0x93, 0xed, - 0x82, 0x0a, 0xfb, 0xde, 0xe1, 0xed, 0x32, 0x71, 0x9a, 0x8b, 0x76, 0x29, - 0x53, 0x7a, 0xb6, 0x03, 0x91, 0xd0, 0x75, 0xbd, 0x30, 0x50, 0x27, 0x1b, - 0x49, 0xa0, 0x6c, 0x54, 0x12, 0x36, 0x0c, 0x43, 0x1a, 0xe4, 0x1e, 0x38, - 0x6a, 0xe6, 0x66, 0x68, 0x1d, 0xeb, 0xfc, 0x47, 0x55, 0x25, 0x4b, 0x4a, - 0x23, 0xcc, 0x89, 0x75, 0xa5, 0xa0, 0x74, 0x50, 0xec, 0xfb, 0x01, 0x4f, - 0x23, 0xac, 0x05, 0x5b, 0x89, 0x64, 0x0c, 0x46, 0xce, 0xc5, 0xdf, 0x7f, - 0x2b, 0xd3, 0x3c, 0x7e, 0xcc, 0x71, 0xd0, 0x20, 0x1c, 0x2e, 0xe2, 0x17, - 0xf4, 0xd2, 0xaa, 0xd8, 0x4b, 0x6d, 0x1f, 0x53, 0xa1, 0x7d, 0x49, 0x90, - 0x10, 0xf6, 0x2a, 0x0f, 0xef, 0x36, 0xac, 0xd1, 0xcf, 0x04, 0x8f, 0xc6, - 0x02, 0x7d, 0x8d, 0x8f, 0x4a, 0x9b, 0x72, 0xdc, 0x30, 0x38, 0xeb, 0x66, - 0x8d, 0x8e, 0xc8, 0xc1, 0xb7, 0x21, 0x60, 0x9c, 0xbd, 0xae, 0x93, 0xcd, - 0x63, 0xbc, 0x0d, 0xf9, 0xc6, 0x67, 0x2d, 0x6c, 0x7a, 0x24, 0xbd, 0x31, - 0x69, 0xcb, 0x0e, 0xbd, 0x48, 0x1c, 0x3f, 0x8d, 0xd5, 0x4e, 0xab, 0x10, - 0xc3, 0x47, 0x50, 0x95, 0xf2, 0xa4, 0x13, 0x9d, 0xfd, 0x87, 0x6f, 0x45, - 0x50, 0xf4, 0xbc, 0x5b, 0x50, 0x9b, 0x03, 0xf0, 0x1d, 0x40, 0x64, 0xa8, - 0xe2, 0xcc, 0x95, 0xf8, 0x94, 0x97, 0x5e, 0xf1, 0x6f, 0x9b, 0x82, 0x4d, - 0xe3, 0x68, 0x0c, 0xbb, 0xd9, 0xe3, 0x06, 0xf2, 0x33, 0x19, 0xec, 0x99, - 0x65, 0x3a, 0x7b, 0x44, 0x89, 0xb0, 0x24, 0x73, 0x94, 0xe8, 0x19, 0x67, - 0x05, 0xce, 0x8c, 0x78, 0x44, 0xec, 0x7b, 0x9e, 0x04, 0x18, 0xd9, 0x7e, - 0xfd, 0x51, 0xf6, 0xf0, 0x75, 0xc5, 0x3b, 0xb2, 0x85, 0xa9, 0xea, 0x61, - 0x08, 0xbc, 0xf5, 0x1f, 0xb7, 0xca, 0xb2, 0xf6, 0x9c, 0x14, 0x71, 0xf4, - 0x2c, 0x66, 0xd8, 0x0d, 0x7b, 0xb9, 0x55, 0xb2, 0xd3, 0xb7, 0x08, 0xac, - 0x3b, 0x36, 0x91, 0xe9, 0xf7, 0x30, 0x21, 0x9c, 0xa9, 0xd1, 0xcc, 0x05, - 0x24, 0x61, 0x22, 0x91, 0xc9, 0xce, 0x68, 0x2f, 0xe8, 0x26, 0x26, 0x16, - 0x0b, 0xe2, 0x83, 0xa2, 0x33, 0xd5, 0xfe, 0x0a, 0x06, 0x15, 0xfc, 0x37, - 0xda, 0x9d, 0xc0, 0x5e, 0xad, 0xad, 0xd5, 0xef, 0xd2, 0xa8, 0x11, 0x5a, - 0xf5, 0x22, 0x0c, 0x2c, 0x88, 0xce, 0xaa, 0xa0, 0x73, 0xe9, 0x19, 0xa7, - 0x3e, 0x6c, 0x08, 0x3c, 0x62, 0xe4, 0xb6, 0x9b, 0xc1, 0x2c, 0xc9, 0x97, - 0x06, 0xb5, 0xc9, 0x3c, 0xe8, 0x1e, 0x82, 0x9d, 0x6f, 0x4d, 0xa0, 0xb5, - 0xe8, 0xc2, 0xe9, 0x1a, 0xea, 0x2f, 0x7a, 0xe2, 0x14, 0x29, 0x1f, 0x6b, - 0xe5, 0xcc, 0x31, 0x88, 0x2c, 0x5d, 0xed, 0xc0, 0x21, 0xee, 0xae, 0x16, - 0x90, 0x4c, 0x96, 0x7b, 0x8d, 0x87, 0xe9, 0x39, 0x25, 0x0c, 0xbe, 0x16, - 0xa5, 0x27, 0x03, 0x5c, 0xbc, 0x29, 0xc6, 0xfd, 0x13, 0xe4, 0x65, 0xb0, - 0x97, 0x69, 0x5a, 0x2c, 0x5d, 0x34, 0xb0, 0xfd, 0xd6, 0x7c, 0xac, 0x48, - 0xd5, 0x56, 0x75, 0xb3, 0xf3, 0xe9, 0x55, 0x40, 0xb1, 0x26, 0x74, 0xee, - 0xff, 0xdf, 0xb8, 0x4e, 0x1c, 0x80, 0x14, 0xe3, 0xba, 0x4a, 0x7b, 0xd7, - 0x4f, 0x76, 0x3e, 0x74, 0xa7, 0x41, 0xbd, 0xc8, 0xed, 0xed, 0x99, 0x6e, - 0x38, 0x4e, 0xaa, 0xe0, 0xdd, 0x70, 0x9c, 0xe7, 0xd8, 0x65, 0x43, 0xbd, - 0xfa, 0xa4, 0xa6, 0xd0, 0x8c, 0xcd, 0xba, 0x45, 0xb0, 0x23, 0xf8, 0x79, - 0x0a, 0xfe, 0x46, 0x21, 0x37, 0x48, 0x34, 0x41, 0x5b, 0xd3, 0x2c, 0xdb, - 0x08, 0xf1, 0x5d, 0x52, 0x14, 0x15, 0xff, 0x05, 0xcd, 0xf1, 0x95, 0x50, - 0x3d, 0x16, 0xfe, 0x71, 0x38, 0xe7, 0x28, 0xd2, 0xb8, 0xfd, 0xb7, 0xb7, - 0x2f, 0x27, 0xf9, 0xe7, 0x19, 0xfe, 0x73, 0x4d, 0xa6, 0xc9, 0xf7, 0x39, - 0xdb, 0xf0, 0x8b, 0x28, 0xd1, 0xe4, 0x61, 0x25, 0xe2, 0xb8, 0x33, 0xa6, - 0x9d, 0xd7, 0x2d, 0x3a, 0x5c, 0x82, 0x06, 0xe9, 0x8b, 0x59, 0xcc, 0x80, - 0xf0, 0x1b, 0xec, 0x69, 0xef, 0x2b, 0xc4, 0xa9, 0x01, 0x55, 0x36, 0xd6, - 0x31, 0x97, 0x31, 0x7e, 0x9c, 0x32, 0xb5, 0xa7, 0x4c, 0xc0, 0x69, 0xc0, - 0x2f, 0x27, 0x45, 0x80, 0xca, 0xfc, 0x4a, 0x10, 0x77, 0xce, 0x62, 0xdb, - 0x68, 0x5c, 0xf1, 0x66, 0x37, 0x2f, 0xbe, 0x76, 0x95, 0x0c, 0xdb, 0x87, - 0x81, 0x95, 0x2f, 0x8d, 0x2b, 0x5a, 0xbf, 0xcc, 0x78, 0xb2, 0xee, 0x31, - 0x26, 0x73, 0x07, 0xe6, 0x5b, 0x39, 0x8d, 0x2f, 0x2f, 0x0c, 0x12, 0x47, - 0x95, 0x7f, 0x8b, 0x58, 0x9e, 0xe0, 0x36, 0xb8, 0x6c, 0xe3, 0x52, 0x8c, - 0x04, 0x4f, 0x01, 0x24, 0x41, 0x4c, 0xb1, 0xe6, 0x53, 0xac, 0x82, 0x41, - 0xd5, 0xfa, 0x54, 0x4b, 0xe1, 0x51, 0x8a, 0x74, 0xfd, 0x21, 0xd3, 0xaa, - 0x9e, 0xc0, 0x14, 0x31, 0xa6, 0xa8, 0xfb, 0x10, 0x37, 0x3d, 0x1f, 0x6c, - 0xb9, 0x60, 0x47, 0x88, 0xa5, 0x19, 0x66, 0x0a, 0x96, 0x18, 0x2d, 0x8b, - 0x38, 0xe9, 0x31, 0xf5, 0xfe, 0x1d, 0x5e, 0xde, 0x9e, 0x92, 0x3a, 0x81, - 0xf5, 0x84, 0x27, 0x7f, 0x69, 0x68, 0x98, 0x5b, 0x70, 0x82, 0xa3, 0x3b, - 0x17, 0xd5, 0x02, 0xfe, 0xba, 0xcf, 0xd7, 0x26, 0xf7, 0xc7, 0xc8, 0x48, - 0xb0, 0x0c, 0xe7, 0xb7, 0x5a, 0xad, 0x76, 0x7a, 0xc3, 0x76, 0x42, 0x4c, - 0x7f, 0x90, 0xc4, 0x00, 0x4f, 0x32, 0x2a, 0x64, 0x8e, 0xbb, 0x3a, 0x4c, - 0xe6, 0xaf, 0x6d, 0xcb, 0x6c, 0xec, 0xf0, 0x8a, 0x4d, 0x27, 0x44, 0xc8, - 0x06, 0xfa, 0x8a, 0xfc, 0x0c, 0x47, 0xcb, 0x2c, 0x57, 0x71, 0x96, 0xa3, - 0x74, 0x09, 0x36, 0x39, 0x89, 0x58, 0x08, 0xa3, 0xbe, 0xdf, 0x1e, 0x8b, - 0x6f, 0xca, 0xa4, 0x3c, 0x57, 0x56, 0x0e, 0x47, 0x46, 0x8c, 0x58, 0x1b, - 0xac, 0x6b, 0xd2, 0xe6, 0x27, 0x76, 0xb5, 0xcd, 0xe1, 0xcb, 0x18, 0xdf, - 0x27, 0x85, 0xcc, 0x15, 0xd2, 0xac, 0xe9, 0xfa, 0x5e, 0xde, 0x4d, 0x42, - 0x9c, 0x52, 0xe1, 0x80, 0x02, 0xa4, 0x02, 0xe2, 0xb3, 0x71, 0xe7, 0x8e, - 0xdc, 0x4c, 0x01, 0x13, 0x05, 0x3b, 0x5c, 0x27, 0x3c, 0x19, 0xd4, 0xee, - 0xd0, 0x11, 0xb3, 0xc2, 0x8d, 0xee, 0x33, 0x73, 0x9b, 0xee, 0x44, 0xbe, - 0x3e, 0xf0, 0x4f, 0x55, 0x83, 0x7e, 0x47, 0x73, 0x20, 0xd0, 0xcf, 0x6e, - 0xa8, 0xfd, 0x1e, 0x4f, 0x67, 0x52, 0xeb, 0x2d, 0xa9, 0x80, 0x2b, 0x8a, - 0x27, 0x7f, 0x8b, 0x00, 0xff, 0x28, 0x09, 0xb3, 0x9a, 0xe5, 0x54, 0xec, - 0x4d, 0x00, 0x74, 0xcf, 0x3f, 0x6d, 0x5f, 0xf5, 0xc9, 0x91, 0x81, 0x24, - 0x61, 0xa9, 0x3d, 0x06, 0xf2, 0x40, 0x83, 0x07, 0xce, 0x66, 0xee, 0xa7, - 0xf0, 0xc8, 0xc8, 0x79, 0xab, 0x07, 0x0b, 0x73, 0xe6, 0xe9, 0xef, 0xa1, - 0xdf, 0x94, 0x8a, 0x92, 0xb4, 0x5a, 0x35, 0x95, 0x28, 0x8b, 0x35, 0x43, - 0x12, 0x0a, 0x59, 0x94, 0x22, 0x3a, 0x29, 0xb1, 0xd1, 0x75, 0x19, 0x9a, - 0x78, 0x27, 0xd0, 0x38, 0xe7, 0x7f, 0x90, 0x18, 0xdc, 0xef, 0xff, 0xfa, - 0x0d, 0xe4, 0xf7, 0xb3, 0x7a, 0x5f, 0x15, 0x0a, 0x83, 0x02, 0x62, 0x19, - 0x07, 0xa7, 0x00, 0xcc, 0xc6, 0x53, 0x63, 0x3c, 0x57, 0x01, 0x51, 0x16, - 0x9f, 0x71, 0x5b, 0xc1, 0x5a, 0x4c, 0xd3, 0xd4, 0x74, 0x6c, 0x41, 0x7e, - 0xed, 0x61, 0x09, 0x39, 0x50, 0x10, 0x55, 0xe9, 0x9d, 0x18, 0x1d, 0xc8, - 0x37, 0x27, 0xd9, 0x62, 0x00, 0x7d, 0x20, 0x51, 0x58, 0x6f, 0x9e, 0x52, - 0x5f, 0x9b, 0xd1, 0xec, 0x5c, 0x62, 0x31, 0x8f, 0xc3, 0x83, 0xf7, 0x11, - 0xb2, 0xfa, 0xad, 0x25, 0xae, 0xb0, 0x8b, 0x97, 0x9c, 0xbe, 0x43, 0x53, - 0x71, 0xbb, 0x7f, 0x12, 0x01, 0x99, 0xbd, 0xc9, 0xc0, 0x83, 0x51, 0xf6, - 0xbb, 0x4b, 0x2d, 0xd0, 0xf6, 0x64, 0x7d, 0xa9, 0x0a, 0x9a, 0xc8, 0x67, - 0xf4, 0x89, 0x28, 0x2f, 0x92, 0x50, 0x7f, 0xb0, 0x01, 0x5b, 0x2f, 0xc2, - 0xde, 0x8a, 0xab, 0x78, 0xf5, 0xd4, 0xa1, 0x28, 0x31, 0xb6, 0x55, 0x4f, - 0xed, 0xe2, 0xd4, 0xeb, 0x24, 0xf6, 0xf8, 0x22, 0xa0, 0x3d, 0x78, 0x80, - 0xc1, 0x05, 0xdf, 0x14, 0x7d, 0x29, 0xa0, 0x3b, 0x06, 0x42, 0xd5, 0xd3, - 0x59, 0xf4, 0xe2, 0x68, 0x41, 0xb9, 0x19, 0x6e, 0x3d, 0xc4, 0xd4, 0xe1, - 0xfa, 0x2f, 0x86, 0x41, 0xfb, 0x2b, 0x9d, 0x67, 0x5d, 0xb8, 0x85, 0xbf, - 0x50, 0xc9, 0xf6, 0x5e, 0x7e, 0xf9, 0xbe, 0x49, 0xb8, 0x45, 0x1f, 0x6f, - 0xb9, 0xdb, 0x3d, 0xe1, 0xce, 0x42, 0x16, 0x91, 0x2f, 0x09, 0x98, 0x63, - 0x03, 0xa9, 0x87, 0x4e, 0xf7, 0x1e, 0x26, 0x9c, 0xd4, 0x76, 0x42, 0xae, - 0x56, 0x2f, 0x66, 0x24, 0x14, 0x37, 0xac, 0xa7, 0x72, 0xdc, 0xf2, 0x6e, - 0x29, 0xd7, 0x52, 0xa5, 0x06, 0x5e, 0x6a, 0x10, 0x6e, 0x96, 0xd8, 0x44, - 0x90, 0x5b, 0x44, 0xfb, 0xea, 0x75, 0x15, 0x54, 0x73, 0xc1, 0x81, 0x35, - 0x40, 0x19, 0x44, 0xa7, 0xf1, 0xca, 0x4d, 0xd7, 0x54, 0xb7, 0x34, 0xd7, - 0xd4, 0x2a, 0xcd, 0x60, 0x28, 0xb9, 0x27, 0xea, 0x0d, 0x2c, 0x52, 0xd4, - 0x56, 0x24, 0x81, 0x86, 0x12, 0x5c, 0x81, 0x0e, 0x7e, 0xfd, 0x9e, 0x01, - 0x64, 0x7f, 0x00, 0xf5, 0x23, 0xf9, 0x1f, 0x3e, 0xd5, 0x67, 0xfa, 0x6c, - 0x4e, 0xb3, 0x6e, 0x4e, 0xcc, 0x38, 0xc1, 0xc8, 0x48, 0x5f, 0xe4, 0xbd, - 0xea, 0x46, 0xcf, 0x80, 0x98, 0x60, 0xc3, 0x1e, 0x8c, 0x5e, 0x36, 0x1c, - 0x4d, 0x2c, 0x72, 0x57, 0xad, 0x25, 0x87, 0x2a, 0x63, 0x76, 0xe8, 0x30, - 0x16, 0xff, 0xbb, 0xbd, 0x6e, 0x88, 0xd9, 0xc2, 0x83, 0xda, 0x8a, 0x8e, - 0x2a, 0x42, 0x15, 0x7f, 0x64, 0x7d, 0xb6, 0xfb, 0x82, 0x55, 0xb0, 0x16, - 0x93, 0x60, 0x1c, 0x06, 0xe0, 0xdd, 0x8d, 0xe9, 0x4b, 0x1f, 0x74, 0x98, - 0x1e, 0xfe, 0x1b, 0x8b, 0xbb, 0x36, 0x76, 0x87, 0xda, 0xf4, 0xd2, 0x60, - 0x9b, 0x49, 0x63, 0x3b, 0xc4, 0x88, 0xfc, 0x7b, 0x12, 0xfe, 0xcc, 0xf8, - 0x97, 0x77, 0x80, 0xdd, 0x9d, 0x34, 0x6e, 0xec, 0x18, 0x2b, 0x18, 0xb1, - 0x3b, 0x77, 0xa4, 0x72, 0x20, 0x25, 0x62, 0xbc, 0x4d, 0x53, 0x8e, 0x40, - 0x41, 0xd5, 0x3a, 0x43, 0x52, 0xf7, 0xe2, 0xd0, 0xbf, 0x3f, 0x8f, 0x19, - 0xf6, 0x36, 0x9b, 0x12, 0xc6, 0xe9, 0xc9, 0x78, 0x82, 0x89, 0x6a, 0x64, - 0x7b, 0xda, 0x8e, 0x3e, 0xc6, 0x9a, 0xe9, 0x59, 0x32, 0x31, 0x6b, 0x1d, - 0x7b, 0xd8, 0x13, 0xb6, 0xec, 0x2d, 0x0f, 0xf1, 0x7f, 0x48, 0xf0, 0xfd, - 0x58, 0x06, 0x20, 0xa3, 0x2e, 0x5f, 0x28, 0x0a, 0xe7, 0x52, 0x15, 0x0d, - 0x65, 0x46, 0xd8, 0x84, 0x0e, 0x80, 0x7d, 0x84, 0xb4, 0xd7, 0x5c, 0x3d, - 0xa4, 0x81, 0x5a, 0xcb, 0x11, 0x0e, 0xe5, 0x76, 0x53, 0xc8, 0x35, 0xf5, - 0x44, 0x08, 0xbc, 0x2c, 0x80, 0x99, 0xeb, 0x8b, 0x68, 0xae, 0x78, 0xee, - 0xef, 0xb6, 0x66, 0xe9, 0x31, 0x3d, 0xe8, 0x70, 0xe1, 0x98, 0x03, 0x38, - 0xb5, 0x0b, 0xaf, 0x23, 0xd4, 0x45, 0x14, 0xdb, 0xc3, 0xfe, 0x26, 0xee, - 0x17, 0x14, 0x4f, 0x44, 0x93, 0xa1, 0xe9, 0xad, 0xd6, 0x01, 0x98, 0x76, - 0x6c, 0x86, 0x14, 0xe4, 0x2c, 0x52, 0x74, 0x09, 0x7b, 0x0a, 0x10, 0x90, - 0x79, 0x1c, 0xae, 0xd7, 0x37, 0x9f, 0x3a, 0x89, 0xe9, 0x69, 0x89, 0xda, - 0x5f, 0xf7, 0x93, 0x1f, 0x41, 0x4c, 0x0c, 0xc1, 0x54, 0x53, 0xb1, 0x8a, - 0x89, 0x75, 0x01, 0x83, 0x14, 0x6f, 0x7e, 0xab, 0x6d, 0xad, 0xfd, 0x59, - 0xe5, 0x6c, 0xd8, 0x13, 0x7a, 0xd2, 0x3e, 0xc4, 0x40, 0xca, 0x00, 0x42, - 0x3e, 0x26, 0x4c, 0xb5, 0xe1, 0x2c, 0xa2, 0x1b, 0x80, 0xd3, 0x67, 0x06, - 0x3c, 0xc9, 0xf7, 0x85, 0x9b, 0x2c, 0xd4, 0x01, 0x2d, 0xb1, 0xd1, 0x02, - 0xd9, 0x3e, 0x8b, 0x96, 0x93, 0x25, 0x95, 0x8c, 0x85, 0xc7, 0x92, 0xff, - 0xdc, 0x17, 0xa4, 0xf3, 0x0e, 0xb7, 0x71, 0xce, 0x36, 0x35, 0x56, 0x88, - 0xce, 0x9d, 0x1e, 0xdf, 0x4e, 0xc9, 0x57, 0x3a, 0x11, 0x82, 0xd5, 0x72, - 0x21, 0x41, 0x9b, 0xe5, 0x9b, 0xe7, 0x91, 0x0c, 0x96, 0xf8, 0x67, 0xc4, - 0x1a, 0x4e, 0xf9, 0x7c, 0xdc, 0x4b, 0x9f, 0x1a, 0xe3, 0x18, 0x70, 0xd3, - 0xf4, 0xce, 0x43, 0x3c, 0x28, 0x23, 0xad, 0x10, 0xfe, 0x2c, 0x34, 0x80, - 0xb3, 0x68, 0xf3, 0x3b, 0x58, 0xd0, 0xa8, 0x70, 0xa3, 0x8a, 0x22, 0x47, - 0x40, 0x75, 0x17, 0x42, 0x30, 0x67, 0x17, 0xd5, 0xf5, 0x51, 0xe1, 0x47, - 0xa2, 0xab, 0xad, 0x81, 0x07, 0xea, 0xa5, 0x34, 0x39, 0x83, 0xae, 0x06, - 0x1d, 0x87, 0x03, 0x80, 0xef, 0xd6, 0x28, 0x00, 0x81, 0xa0, 0x67, 0x50, - 0xcd, 0x2f, 0xd1, 0x16, 0x7c, 0x8d, 0x60, 0x20, 0xeb, 0x9d, 0x19, 0x32, - 0x3e, 0x91, 0xbe, 0xf1, 0x92, 0xff, 0x67, 0x87, 0x43, 0x8f, 0x65, 0x15, - 0x5e, 0xb7, 0xc6, 0xea, 0x86, 0x91, 0x9e, 0x51, 0x9c, 0x91, 0xe6, 0xf1, - 0x58, 0xbf, 0x6d, 0xf9, 0x56, 0x6a, 0x17, 0x16, 0xc6, 0xf2, 0xcd, 0x63, - 0xb8, 0xee, 0xee, 0x90, 0xaf, 0x24, 0x41, 0xfe, 0x75, 0xdc, 0x14, 0x3b, - 0xa9, 0xa1, 0x4a, 0x86, 0xbc, 0xb5, 0x30, 0xed, 0x8c, 0xbc, 0xc6, 0x8b, - 0xbc, 0x6e, 0x46, 0xb5, 0x53, 0x3a, 0x00, 0x3c, 0x19, 0x50, 0xf3, 0xcb, - 0x39, 0x39, 0x01, 0x2e, 0x74, 0xfc, 0x6a, 0x68, 0xc3, 0x3a, 0x22, 0x5a, - 0x9b, 0x0a, 0xb0, 0x27, 0x1c, 0x8a, 0x29, 0xda, 0xbb, 0xac, 0xf8, 0x9f, - 0xde, 0x99, 0x38, 0x63, 0x91, 0x0b, 0xe8, 0x49, 0x7e, 0x86, 0x54, 0x42, - 0x33, 0x3b, 0x66, 0xbf, 0x1d, 0x63, 0xcf, 0x32, 0x2d, 0x45, 0x69, 0xa5, - 0x34, 0xa7, 0xcd, 0xd6, 0x9a, 0x42, 0x51, 0x72, 0x8d, 0x24, 0x82, 0xe9, - 0x36, 0xf4, 0x84, 0x23, 0x77, 0x0f, 0x9e, 0x0b, 0xc2, 0xaf, 0x57, 0x28, - 0xe3, 0x18, 0x82, 0x20, 0xe3, 0xf5, 0xb1, 0x5e, 0x7a, 0xb0, 0x1e, 0xe6, - 0x17, 0x1a, 0x9a, 0x25, 0xa8, 0xe2, 0x66, 0xd3, 0xcc, 0x91, 0x8d, 0xf7, - 0xc3, 0xf1, 0x4e, 0xde, 0xc2, 0x8b, 0x11, 0x09, 0xeb, 0x64, 0x0a, 0x08, - 0x2a, 0x4d, 0x35, 0x93, 0x56, 0x43, 0xd0, 0xa5, 0x67, 0x96, 0xa0, 0x36, - 0xdb, 0x6b, 0x4a, 0xcc, 0x2b, 0xd1, 0xc7, 0xa9, 0xaa, 0x33, 0x0b, 0xdd, - 0x39, 0x15, 0x47, 0x10, 0xa6, 0x8b, 0x5d, 0x20, 0x98, 0x4d, 0x19, 0x08, - 0xa6, 0xf8, 0x63, 0xa0, 0xcc, 0xe8, 0x89, 0x2d, 0xf5, 0xfd, 0xb5, 0x74, - 0xf1, 0x70, 0xee, 0x3d, 0x7f, 0x41, 0x6f, 0xa1, 0x32, 0xe2, 0x5a, 0xdb, - 0x36, 0xbf, 0x05, 0x2b, 0xc1, 0xa5, 0x3e, 0x19, 0xc1, 0xf8, 0x13, 0x2c, - 0xaf, 0xca, 0xe8, 0xa1, 0x19, 0x25, 0xb9, 0x93, 0x67, 0x29, 0x74, 0x1b, - 0x82, 0x62, 0x2a, 0xf6, 0xc5, 0x13, 0xdc, 0x6e, 0x4c, 0x4b, 0x24, 0x9a, - 0x8c, 0x7c, 0x2c, 0x0f, 0x84, 0xf8, 0x29, 0x3d, 0xad, 0xe4, 0x71, 0x69, - 0xe2, 0xcb, 0x96, 0x6d, 0x7e, 0x00, 0x4c, 0x3a, 0x4a, 0x04, 0xed, 0xff, - 0xa1, 0x98, 0x1d, 0xd3, 0xff, 0xd6, 0xb0, 0xb2, 0x98, 0x1b, 0xbd, 0xcb, - 0x7f, 0xbf, 0xd2, 0xe8, 0x77, 0x62, 0x24, 0x45, 0x07, 0x40, 0x9c, 0x48, - 0x33, 0x34, 0x05, 0xd5, 0x95, 0xa3, 0xff, 0xbe, 0xaa, 0x3a, 0x3b, 0x3f, - 0x79, 0x4d, 0x13, 0xe9, 0xc1, 0xcb, 0xdb, 0xca, 0x69, 0x05, 0x84, 0x85, - 0xff, 0xf0, 0xfd, 0x81, 0x1e, 0xa0, 0x70, 0x25, 0x36, 0xe2, 0x74, 0x1a, - 0x3c, 0x42, 0x12, 0xa5, 0x84, 0x4a, 0xca, 0x64, 0x0a, 0xa2, 0x02, 0xf1, - 0x30, 0x32, 0x7a, 0x25, 0x46, 0xb7, 0x9d, 0x14, 0xb4, 0xa0, 0x74, 0x00, - 0x37, 0x08, 0x85, 0x2e, 0xd8, 0x40, 0xe7, 0xf4, 0x08, 0x5b, 0xeb, 0x65, - 0xc0, 0x09, 0x66, 0xe8, 0xf1, 0xe8, 0x7e, 0xcd, 0x57, 0xba, 0x5a, 0x53, - 0x4d, 0xa3, 0x73, 0xf7, 0x50, 0x09, 0x31, 0xff, 0xf9, 0x32, 0xf5, 0xf3, - 0x07, 0x24, 0xd8, 0xbd, 0xb0, 0x01, 0xcd, 0x8f, 0xe0, 0x73, 0xd0, 0xa6, - 0x55, 0xc1, 0xbe, 0x5b, 0xaa, 0x64, 0xb8, 0x19, 0xf6, 0xec, 0x38, 0x47, - 0xc0, 0x36, 0x42, 0xac, 0xce, 0x26, 0xad, 0x32, 0xcf, 0x4c, 0xdd, 0xfe, - 0xfd, 0x76, 0xbb, 0x61, 0x3a, 0x4d, 0x2c, 0x8d, 0x8c, 0xf3, 0x2e, 0x19, - 0x13, 0xd1, 0xeb, 0x49, 0x7d, 0xf5, 0x35, 0xcc, 0x2f, 0x00, 0x1b, 0xbc, - 0x67, 0xf8, 0x8e, 0x26, 0x3b, 0xe4, 0x63, 0x61, 0x3b, 0x9d, 0x7a, 0x88, - 0x74, 0x84, 0x4e, 0x4f, 0xd2, 0x68, 0x33, 0x37, 0xe8, 0xd7, 0xcd, 0xb9, - 0xd1, 0x7d, 0x67, 0x56, 0x94, 0x19, 0x0e, 0x68, 0xd9, 0xf2, 0xff, 0x8e, - 0x3d, 0x51, 0xd9, 0x5f, 0x51, 0x21, 0x44, 0xc3, 0x59, 0xce, 0xa8, 0x33, - 0x4d, 0x11, 0x66, 0x51, 0x01, 0x62, 0xe1, 0x0c, 0x7c, 0x9b, 0x52, 0xe2, - 0xdc, 0xef, 0x95, 0xdb, 0x41, 0x49, 0xe9, 0x40, 0x50, 0x8b, 0xc7, 0xc2, - 0x75, 0x17, 0xed, 0xb0, 0xd2, 0xed, 0x96, 0xe1, 0x46, 0x83, 0x94, 0x6b, - 0xd9, 0xb6, 0x6b, 0xa9, 0x36, 0xb1, 0x51, 0x29, 0x3c, 0xed, 0x05, 0xbf, - 0x97, 0x1d, 0x48, 0xb8, 0xaf, 0x77, 0x53, 0xb5, 0xf7, 0x7f, 0x8e, 0xd3, - 0x87, 0xb3, 0xa9, 0xcc, 0xbd, 0x50, 0xe2, 0xa7, 0x77, 0xe6, 0x2c, 0xb3, - 0xaa, 0x2f, 0xf3, 0x69, 0x85, 0x67, 0xcb, 0xe9, 0x12, 0x93, 0x64, 0x41, - 0x05, 0x20, 0xbc, 0x0a, 0x19, 0xec, 0x14, 0xb2, 0xab, 0xbe, 0xb0, 0xad, - 0x6f, 0x55, 0x7d, 0xcb, 0x7b, 0xd1, 0xca, 0xa4, 0x0b, 0xcf, 0xe5, 0x27, - 0x72, 0x96, 0x01, 0xac, 0xc4, 0x85, 0x08, 0x1d, 0x0f, 0x50, 0xe1, 0xe3, - 0x3c, 0xaa, 0x54, 0x4a, 0x1a, 0xc9, 0xb8, 0x5e, 0x0d, 0x89, 0x1f, 0x29, - 0x46, 0x3a, 0x37, 0xcd, 0xf2, 0x72, 0xa0, 0x05, 0x25, 0x2e, 0x53, 0x35, - 0x81, 0x18, 0xa4, 0x4a, 0x33, 0x48, 0xf6, 0x4d, 0xb6, 0x79, 0xd2, 0x68, - 0x7b, 0xd5, 0x26, 0x9b, 0xd9, 0xc1, 0xa8, 0x96, 0x20, 0xa9, 0x79, 0x30, - 0x34, 0xe0, 0x36, 0x85, 0x8c, 0x6e, 0x25, 0x0b, 0x96, 0x14, 0x7e, 0x64, - 0x05, 0x48, 0xcb, 0x8b, 0x7b, 0xbc, 0xf4, 0x5d, 0x52, 0x03, 0x63, 0xb0, - 0x70, 0xde, 0x0b, 0xac, 0x09, 0xe1, 0x0c, 0x53, 0xdb, 0x96, 0x48, 0x78, - 0x3a, 0xcc, 0x10, 0xe0, 0x3c, 0x74, 0x2f, 0x42, 0xa2, 0xc9, 0xec, 0x92, - 0x6e, 0xb9, 0x0e, 0x78, 0x05, 0xb4, 0xc4, 0xcc, 0xa3, 0x13, 0xf3, 0x98, - 0x81, 0x60, 0x95, 0x2a, 0x04, 0x64, 0xb4, 0x88, 0x30, 0x79, 0xb0, 0x11, - 0xb1, 0xad, 0xf4, 0x20, 0x20, 0xf7, 0x71, 0x34, 0x16, 0x36, 0xd8, 0x4b, - 0x4a, 0x3b, 0x7a, 0x75, 0x85, 0xb1, 0x00, 0xbe, 0x2c, 0x5e, 0x20, 0x73, - 0xa9, 0x9e, 0x7d, 0xe5, 0x80, 0x88, 0x74, 0xfd, 0xb7, 0x55, 0x43, 0x18, - 0x99, 0xe2, 0xc7, 0x0d, 0xb1, 0x1e, 0xad, 0x8d, 0x65, 0x26, 0x7a, 0x47, - 0x64, 0x4e, 0x66, 0x26, 0x86, 0x48, 0xb0, 0xb1, 0x09, 0xa2, 0x1a, 0x2b, - 0xb5, 0x21, 0x18, 0xb1, 0x00, 0xfd, 0x07, 0x9d, 0x8d, 0x98, 0x05, 0x1d, - 0x48, 0x44, 0x37, 0xc4, 0x9a, 0xe1, 0x31, 0x9f, 0x05, 0x8d, 0x2e, 0x35, - 0x74, 0x3e, 0xd4, 0xa9, 0xae, 0xf6, 0xf8, 0x3b, 0xc6, 0xa1, 0x30, 0xa9, - 0xde, 0xf4, 0x4e, 0x78, 0xe8, 0x53, 0xf9, 0x53, 0xd3, 0x05, 0x62, 0x1c, - 0x1c, 0xd0, 0xc6, 0x82, 0x0b, 0xb9, 0x46, 0x67, 0x6b, 0xed, 0xaf, 0x5b, - 0xd5, 0x99, 0x65, 0x5b, 0x3b, 0xf1, 0x54, 0x7f, 0xa8, 0x9f, 0xc5, 0x17, - 0x06, 0x5b, 0xef, 0xf0, 0x68, 0xec, 0x6c, 0x2d, 0x93, 0xd8, 0xe6, 0xd2, - 0xd8, 0x2c, 0x50, 0x4e, 0x98, 0xa7, 0x4d, 0x07, 0x3e, 0x2b, 0x67, 0x41, - 0x01, 0x4a, 0x63, 0x59, 0xe3, 0xc2, 0x19, 0x83, 0xb0, 0xc1, 0x1a, 0x79, - 0xec, 0xbd, 0x48, 0x29, 0x87, 0xdd, 0xf4, 0xa8, 0x08, 0x49, 0xcb, 0xd4, - 0x08, 0xbd, 0xd6, 0xd8, 0xfb, 0xb2, 0x92, 0x70, 0xb4, 0x42, 0x23, 0x51, - 0x7c, 0xb3, 0x13, 0xf0, 0x29, 0xe7, 0x68, 0x3a, 0x7e, 0xb5, 0x9a, 0xbf, - 0xa6, 0x7c, 0x0f, 0x81, 0x8e, 0x5c, 0xd8, 0x8c, 0xbe, 0x82, 0xbd, 0x11, - 0x25, 0x55, 0xfb, 0x34, 0xab, 0x93, 0x69, 0xd1, 0x8d, 0xf6, 0x8c, 0x63, - 0x00, 0xbe, 0x42, 0x2e, 0xd7, 0xa3, 0x77, 0x8a, 0x51, 0x7b, 0xfa, 0x31, - 0x6f, 0xbf, 0x25, 0xac, 0xdd, 0x46, 0xce, 0xba, 0x87, 0xe2, 0x00, 0x08, - 0xa7, 0xfe, 0x43, 0x17, 0xa7, 0x13, 0xee, 0x2e, 0x8e, 0x38, 0x17, 0xc2, - 0xe6, 0xc9, 0x7e, 0x71, 0xcc, 0x73, 0x49, 0xc2, 0xb4, 0xe9, 0x08, 0x4d, - 0xe0, 0xf8, 0x49, 0x58, 0x03, 0x58, 0x37, 0x07, 0x46, 0xd2, 0x81, 0xc5, - 0x2f, 0x8c, 0x88, 0x17, 0xb9, 0x78, 0x39, 0x2c, 0x8c, 0x35, 0x4a, 0x43, - 0x79, 0x00, 0x0e, 0x8b, 0xd6, 0x2f, 0x99, 0xb3, 0x5b, 0xec, 0x87, 0x57, - 0x91, 0x50, 0xe2, 0xe0, 0xc4, 0xb3, 0x1e, 0x69, 0x67, 0x36, 0x4a, 0x0c, - 0x22, 0xfc, 0x34, 0x10, 0xa6, 0x62, 0xee, 0x20, 0x5d, 0xa6, 0x8c, 0x65, - 0x82, 0x25, 0x45, 0x84, 0xbd, 0x7d, 0x30, 0x31, 0xe3, 0xb5, 0x34, 0x30, - 0xb5, 0x05, 0xaf, 0x07, 0x56, 0x76, 0xc3, 0x12, 0x1a, 0x36, 0xb2, 0xa2, - 0xa7, 0x34, 0xb0, 0xee, 0xd0, 0x6c, 0x46, 0xa1, 0x70, 0x08, 0x1c, 0x5a, - 0x46, 0x3a, 0x0a, 0xef, 0xa4, 0x5d, 0x9b, 0x70, 0x75, 0x55, 0x47, 0xb5, - 0x82, 0x4e, 0x4c, 0x7a, 0xdd, 0x07, 0x23, 0xb2, 0x04, 0xaa, 0xc3, 0xd0, - 0x18, 0x07, 0xe9, 0xe1, 0xdd, 0x2e, 0xa7, 0xfb, 0xc1, 0x10, 0xd1, 0x88, - 0x30, 0xf9, 0x26, 0x84, 0x68, 0xb4, 0x66, 0x5c, 0x44, 0x0f, 0x5d, 0x12, - 0x09, 0xe1, 0x8c, 0xed, 0xae, 0x09, 0xe5, 0xa8, 0x89, 0x7a, 0x10, 0x50, - 0x7e, 0x22, 0x07, 0x79, 0x58, 0xf0, 0x6e, 0xb6, 0x37, 0xb1, 0xd0, 0xbd, - 0x97, 0x35, 0x93, 0xe6, 0x4f, 0x2f, 0xe7, 0x36, 0x8d, 0x9e, 0x1c, 0x23, - 0xa1, 0xfe, 0xff, 0x7f, 0x3e, 0xd7, 0x54, 0xfb, 0x9c, 0x5f, 0x9c, 0x43, - 0xfc, 0xb5, 0x76, 0x18, 0xd1, 0xc4, 0x4e, 0xdc, 0xb6, 0xc8, 0xc4, 0x44, - 0x2b, 0x74, 0xcf, 0xad, 0xbe, 0x1f, 0xd3, 0x04, 0x0c, 0x97, 0x94, 0x98, - 0x8c, 0x4e, 0x32, 0x51, 0x72, 0xd7, 0xf8, 0x0b, 0x36, 0x4c, 0x7d, 0x05, - 0x8b, 0x71, 0xf7, 0x31, 0xac, 0x3c, 0x17, 0x6b, 0x54, 0x53, 0xfc, 0xf7, - 0xd7, 0x8d, 0x6c, 0x1b, 0xf0, 0x80, 0xb3, 0xa0, 0x1d, 0x9d, 0x9a, 0xbd, - 0x07, 0xa3, 0x13, 0x84, 0xd0, 0x30, 0xd1, 0xbf, 0x19, 0xa6, 0x15, 0xb2, - 0x29, 0x4b, 0x67, 0x69, 0x18, 0x4b, 0xb8, 0x1b, 0xae, 0x1f, 0x2f, 0x6f, - 0x35, 0xd1, 0xaf, 0x76, 0xbd, 0x55, 0x73, 0x04, 0x73, 0x67, 0x7e, 0x58, - 0x75, 0xbc, 0x13, 0x94, 0xe9, 0x6e, 0x1b, 0x81, 0x72, 0x42, 0x33, 0xeb, - 0x9d, 0x3b, 0xae, 0x54, 0xe5, 0xff, 0xe2, 0x85, 0xa9, 0x85, 0x0f, 0x54, - 0xee, 0xff, 0x24, 0xda, 0xcd, 0xba, 0x84, 0xac, 0x40, 0x44, 0x67, 0x55, - 0xfa, 0xa4, 0x77, 0xdb, 0x42, 0xe8, 0x20, 0x52, 0xa6, 0x04, 0xaf, 0xb6, - 0xd0, 0x8d, 0x9c, 0x25, 0x13, 0x1c, 0x15, 0xb1, 0x56, 0xba, 0x36, 0xf4, - 0x39, 0xba, 0x90, 0x5b, 0x8b, 0x40, 0xf7, 0x7b, 0x2e, 0xbc, 0x9b, 0x77, - 0xcd, 0x19, 0x06, 0x7b, 0xae, 0x13, 0xcc, 0x35, 0xda, 0x72, 0x56, 0x11, - 0x3c, 0x1b, 0x48, 0x56, 0xf2, 0x6d, 0x2e, 0x48, 0xb0, 0x50, 0x75, 0xe8, - 0x0f, 0xc0, 0x7c, 0x5c, 0x4e, 0xb2, 0xe8, 0xe1, 0xda, 0x87, 0xa3, 0xb8, - 0xfe, 0x7a, 0x97, 0xc2, 0x32, 0x3a, 0x69, 0x0c, 0xfc, 0x1f, 0x0a, 0x52, - 0xfd, 0x94, 0xc3, 0x04, 0x50, 0x49, 0x69, 0xc3, 0x9a, 0x56, 0xf0, 0x3e, - 0x65, 0xa6, 0xb9, 0x22, 0xd7, 0xbc, 0xfd, 0x7f, 0x40, 0xca, 0xbf, 0xec, - 0x28, 0xf5, 0xc7, 0xb6, 0x4b, 0x6b, 0xe9, 0x96, 0x68, 0x66, 0x8d, 0xfd, - 0x4b, 0xfd, 0x89, 0x32, 0x6f, 0x51, 0x2a, 0x39, 0xbc, 0x85, 0xf0, 0xea, - 0x7b, 0x13, 0xec, 0xab, 0x72, 0x47, 0x16, 0x74, 0xbd, 0x7e, 0x48, 0x53, - 0x57, 0x9a, 0x09, 0x31, 0xf2, 0xc2, 0x4c, 0xb9, 0x38, 0x2d, 0xf9, 0xf3, - 0x34, 0xf7, 0xc5, 0xb6, 0x48, 0x9f, 0x5e, 0xaf, 0x17, 0xe0, 0x4e, 0xfb, - 0xfa, 0xe0, 0x59, 0xd8, 0x61, 0x97, 0x0c, 0x59, 0x23, 0xbf, 0x51, 0x51, - 0xcf, 0x0c, 0x82, 0x39, 0xd1, 0xa5, 0x07, 0x01, 0x40, 0x35, 0x1d, 0x40, - 0xbe, 0x1a, 0xe0, 0x7a, 0xf9, 0xe0, 0x49, 0xa5, 0x4b, 0xf1, 0xb3, 0x5b, - 0x89, 0x4a, 0x56, 0x1b, 0x8d, 0xcd, 0xa5, 0x97, 0xc6, 0x0c, 0xa9, 0xca, - 0x1f, 0x73, 0x9f, 0xdb, 0x34, 0xb7, 0x8a, 0xd3, 0x23, 0x93, 0x50, 0x82, - 0xad, 0x9f, 0xb7, 0xdf, 0x67, 0x3c, 0xa2, 0x45, 0xd8, 0x3f, 0xc5, 0x32, - 0xad, 0x9c, 0x32, 0x72, 0xab, 0x5e, 0x7c, 0x80, 0x1a, 0x6f, 0x95, 0xc0, - 0xce, 0xa7, 0x54, 0x17, 0x72, 0x2c, 0xa8, 0xb6, 0x5f, 0x1a, 0xf6, 0x10, - 0x7e, 0xd7, 0x87, 0x61, 0x8f, 0x67, 0x46, 0xd2, 0x18, 0x9f, 0xb7, 0xee, - 0xbd, 0xef, 0x01, 0x86, 0x14, 0xd7, 0x2d, 0xde, 0x59, 0x4d, 0x83, 0xf3, - 0x13, 0x4f, 0xaf, 0xbe, 0x52, 0x2d, 0x57, 0x61, 0x53, 0x2a, 0x54, 0xeb, - 0x66, 0x83, 0xf6, 0xc7, 0x18, 0x9d, 0x12, 0x69, 0xd8, 0x18, 0xff, 0x89, - 0x62, 0xf6, 0xcb, 0xa7, 0xa3, 0xeb, 0xe9, 0xc3, 0xc6, 0x0c, 0xb9, 0x0d, - 0x93, 0x41, 0xc0, 0x23, 0x8a, 0x28, 0xe4, 0xf5, 0x91, 0x06, 0x40, 0xd8, - 0xc7, 0xf2, 0x8a, 0x1e, 0x2d, 0x37, 0x8b, 0x0d, 0x67, 0x7c, 0x72, 0x82, - 0x15, 0x16, 0x37, 0x45, 0x95, 0x9b, 0xd0, 0xc0, 0x3e, 0x0c, 0xdb, 0xc2, - 0xa9, 0xad, 0x9d, 0x46, 0xe6, 0xa5, 0x8b, 0x56, 0x48, 0x5d, 0x8d, 0x10, - 0xe5, 0x47, 0x10, 0x8d, 0xd5, 0x82, 0x5e, 0x30, 0xb9, 0x7f, 0x5f, 0xbe, - 0x57, 0x00, 0xfc, 0x37, 0xbd, 0x59, 0x04, 0xa4, 0xbb, 0x43, 0x11, 0x4e, - 0x25, 0xa7, 0xf2, 0x79, 0x50, 0xbc, 0x07, 0x0a, 0x3d, 0xe4, 0x1b, 0xc5, - 0xd5, 0x10, 0x95, 0x88, 0x01, 0x78, 0x50, 0x1a, 0xa1, 0x56, 0x97, 0x11, - 0x3d, 0x7c, 0xe4, 0xc4, 0x73, 0x4d, 0x61, 0xcf, 0x01, 0x26, 0x00, 0x15, - 0x61, 0xbf, 0xd5, 0xac, 0xa8, 0x61, 0x77, 0x55, 0xbd, 0xc6, 0xd0, 0xd8, - 0xc0, 0x82, 0xa8, 0x67, 0x78, 0xc8, 0xea, 0x1c, 0x84, 0xf6, 0x82, 0x43, - 0x5f, 0x1c, 0xb9, 0xbc, 0x1c, 0xa0, 0x46, 0x6b, 0xbe, 0x9f, 0xdf, 0x98, - 0x71, 0x00, 0x50, 0xbd, 0x99, 0x57, 0x55, 0xbd, 0x93, 0x61, 0xfd, 0xa0, - 0x12, 0xae, 0x6f, 0x18, 0xdc, 0x59, 0x70, 0xf0, 0x5a, 0x66, 0x99, 0xc0, - 0xbf, 0x59, 0xac, 0x73, 0x52, 0x23, 0x9f, 0x74, 0x2e, 0xfd, 0xf3, 0x90, - 0xe4, 0x85, 0x11, 0x18, 0x3d, 0x64, 0xf7, 0xd5, 0x08, 0xc4, 0x6a, 0xa7, - 0x36, 0x0a, 0xf3, 0xbe, 0x6c, 0xf7, 0x80, 0x4c, 0x82, 0x07, 0xfe, 0xe1, - 0xa9, 0xd6, 0x60, 0x2d, 0xa6, 0xca, 0xa4, 0x18, 0x8b, 0xe7, 0x05, 0xad, - 0xa7, 0x5c, 0xe4, 0xf5, 0x3b, 0x28, 0x0d, 0x62, 0x6a, 0xa5, 0xe4, 0x4c, - 0x97, 0x6a, 0x0e, 0xd7, 0x2c, 0xc6, 0xec, 0x34, 0x79, 0x9e, 0xe7, 0xdd, - 0x5d, 0xb8, 0xfe, 0x47, 0x17, 0x7c, 0x09, 0x79, 0xa5, 0x17, 0xc4, 0xd1, - 0xa6, 0xf2, 0xc3, 0x40, 0x3d, 0xe7, 0x30, 0xb1, 0x33, 0x53, 0xbf, 0xbe, - 0x5d, 0x68, 0xbc, 0xc4, 0x12, 0x82, 0x78, 0x69, 0x1a, 0x4d, 0x27, 0x5d, - 0x79, 0x06, 0x42, 0xff, 0xe1, 0x97, 0x1a, 0x9c, 0xe1, 0x30, 0xa0, 0xe3, - 0x2f, 0x0e, 0xdb, 0x6d, 0xcd, 0x7b, 0x9d, 0x9a, 0xf9, 0x79, 0x6e, 0xa5, - 0x30, 0x11, 0x58, 0x8a, 0x03, 0x28, 0xbe, 0x56, 0xa9, 0x86, 0xca, 0xa8, - 0x59, 0xb3, 0x08, 0x5b, 0x0c, 0x26, 0x8d, 0x08, 0xd3, 0xac, 0xcb, 0x13, - 0x6b, 0x9b, 0xe5, 0x60, 0x51, 0xd9, 0xa6, 0xa0, 0x7e, 0x44, 0x8c, 0x7b, - 0xf6, 0x1d, 0x96, 0xf0, 0x5e, 0x91, 0x16, 0x19, 0x96, 0xdc, 0xd9, 0x33, - 0x16, 0x6a, 0xa4, 0xd9, 0xb5, 0x77, 0xd9, 0xc3, 0x34, 0x21, 0xea, 0xac, - 0xaf, 0x4e, 0x2c, 0xc1, 0x22, 0x3f, 0xfa, 0xd9, 0xc6, 0x31, 0xbb, 0x4b, - 0xb5, 0x60, 0x30, 0xc5, 0xa3, 0xe3, 0xab, 0xb9, 0x48, 0xa9, 0x61, 0x0d, - 0x5d, 0xc0, 0x0e, 0xbc, 0xb5, 0xd5, 0xb9, 0xa1, 0xd8, 0xcb, 0x13, 0x7f, - 0x57, 0xd1, 0x67, 0x29, 0x58, 0x13, 0x27, 0xbc, 0x56, 0x76, 0x5c, 0xbb, - 0x7a, 0x93, 0xbe, 0xb4, 0x31, 0xaf, 0x79, 0xaf, 0xde, 0x41, 0xce, 0x5a, - 0x0f, 0xed, 0x71, 0xc0, 0x3f, 0xb2, 0xa2, 0x1f, 0x62, 0x31, 0x5f, 0x93, - 0xaa, 0x92, 0x0d, 0xc6, 0x26, 0x35, 0x30, 0x73, 0xf3, 0x7f, 0xc8, 0x95, - 0xe2, 0x0e, 0x02, 0xe6, 0xd5, 0xbf, 0xa9, 0x04, 0x65, 0x7f, 0xf1, 0x43, - 0xf9, 0x02, 0x5f, 0xe4, 0xde, 0xe6, 0x8d, 0xee, 0x5c, 0xd8, 0x33, 0x0d, - 0xa8, 0x45, 0xf7, 0x79, 0xe1, 0x96, 0x56, 0xb2, 0xea, 0xd7, 0x6c, 0xaf, - 0x75, 0x46, 0x58, 0x3e, 0xca, 0xb0, 0xbd, 0xad, 0x52, 0xcb, 0xfb, 0x52, - 0x52, 0x22, 0x6f, 0x71, 0x5f, 0x81, 0xeb, 0xe7, 0x75, 0x52, 0x60, 0x97, - 0xb6, 0x6e, 0xa0, 0xac, 0x15, 0xe0, 0xee, 0x06, 0xfd, 0xdd, 0xa1, 0x94, - 0x6e, 0x07, 0x26, 0xcf, 0x70, 0xf2, 0xc5, 0x2d, 0xae, 0x85, 0x57, 0xc4, - 0x3c, 0x26, 0xfd, 0xb7, 0x5f, 0xe9, 0xd2, 0x0f, 0x16, 0xaf, 0x1f, 0xdd, - 0x22, 0x7e, 0xdf, 0xc7, 0x1e, 0x29, 0x97, 0x07, 0x23, 0x0e, 0xed, 0x1b, - 0x66, 0x9f, 0xb2, 0x8d, 0x94, 0x1c, 0x55, 0xeb, 0xa5, 0xb9, 0xa6, 0x0d, - 0x2e, 0xf1, 0xd5, 0x31, 0xbe, 0xeb, 0x9c, 0x4b, 0x07, 0xd4, 0x88, 0x5a, - 0x63, 0xd5, 0x0d, 0x0a, 0x8a, 0x5c, 0x14, 0xf6, 0x40, 0xd3, 0x44, 0xa4, - 0x04, 0xd6, 0x28, 0x02, 0xba, 0x3c, 0x49, 0xac, 0x3f, 0x22, 0x3d, 0x98, - 0xef, 0x23, 0x2a, 0x56, 0x4e, 0xdb, 0xcd, 0xd8, 0x20, 0x00, 0x5a, 0xdd, - 0xe2, 0xcb, 0x7d, 0xd7, 0x56, 0x6a, 0xfc, 0xa1, 0x37, 0xc3, 0x4a, 0x9b, - 0xdc, 0x39, 0x10, 0x2e, 0xb3, 0x9d, 0x0b, 0x38, 0xa2, 0x0a, 0x9c, 0x79, - 0xdc, 0xb7, 0xb5, 0x1c, 0xe6, 0x32, 0x5f, 0x62, 0xbd, 0x3f, 0xa4, 0xd8, - 0xf4, 0x4d, 0x7e, 0xa5, 0x57, 0x4e, 0x29, 0xd0, 0x8f, 0x0c, 0x37, 0xc6, - 0x3b, 0x43, 0x9b, 0xc9, 0x7c, 0xd0, 0xe2, 0x9f, 0x9d, 0x39, 0x4b, 0xd3, - 0x10, 0xaa, 0x8e, 0x50, 0x8b, 0x79, 0xcb, 0x8e, 0xc4, 0x5c, 0xe0, 0x98, - 0x81, 0xf0, 0x77, 0xed, 0x17, 0xca, 0x2f, 0x1f, 0xa4, 0xf7, 0x17, 0xc7, - 0x37, 0x08, 0x55, 0xb8, 0x8c, 0x58, 0xa6, 0x2d, 0x66, 0xf7, 0x12, 0xca, - 0xd2, 0x81, 0xe8, 0xcd, 0x61, 0x6d, 0x5a, 0x8a, 0x87, 0xcb, 0x98, 0x0e, - 0x4c, 0x1c, 0x40, 0x34, 0x2a, 0x9e, 0x3b, 0xe4, 0x0e, 0x3c, 0x2f, 0x18, - 0xd9, 0x91, 0xf6, 0x53, 0xba, 0x2c, 0x8c, 0x39, 0x24, 0x8b, 0xc1, 0xeb, - 0xb6, 0xa3, 0xe0, 0x7d, 0x85, 0xfe, 0x71, 0x47, 0xf8, 0xe8, 0x44, 0x2f, - 0xc0, 0x50, 0xe9, 0x51, 0xc5, 0x70, 0x27, 0xdf, 0xc9, 0x27, 0xf4, 0x6d, - 0x9f, 0x8b, 0x67, 0xf4, 0x35, 0x04, 0x2e, 0xee, 0x7b, 0xf1, 0x26, 0x94, - 0x2c, 0xff, 0xd0, 0x8c, 0x20, 0x6f, 0x33, 0x14, 0x4e, 0xd5, 0x92, 0xc9, - 0x6d, 0x18, 0x6e, 0xc7, 0x7f, 0xd2, 0xf4, 0x5e, 0xf7, 0x82, 0xb4, 0x79, - 0x84, 0x94, 0x4f, 0xaa, 0x58, 0x44, 0xb1, 0xc8, 0x11, 0xcd, 0xe2, 0x17, - 0x37, 0x7c, 0x37, 0xa3, 0x00, 0xb9, 0x7b, 0xf0, 0x39, 0x33, 0xea, 0x89, - 0xda, 0x64, 0xbe, 0xe5, 0x98, 0x6e, 0x4e, 0xef, 0xb9, 0x7d, 0xee, 0x3b, - 0xec, 0x39, 0x34, 0x68, 0x10, 0x93, 0x2b, 0x53, 0xa5, 0xf6, 0x78, 0x50, - 0x19, 0x3c, 0xd0, 0x69, 0xf9, 0x90, 0x2e, 0x53, 0x24, 0x55, 0xbb, 0xf4, - 0x9b, 0x34, 0x94, 0xed, 0xa7, 0x2a, 0xaa, 0x40, 0xd4, 0x41, 0xe5, 0xc7, - 0xa4, 0x12, 0x41, 0x6b, 0xb2, 0x9a, 0x40, 0x51, 0x7f, 0xf2, 0x5f, 0x3c, - 0xb6, 0x51, 0x9a, 0xd3, 0xf6, 0x13, 0xe4, 0xfe, 0x51, 0xc8, 0xe7, 0xb7, - 0xe6, 0x56, 0x6a, 0x1f, 0x4e, 0xbd, 0x5d, 0x89, 0xc7, 0x79, 0x3f, 0x77, - 0xf4, 0xfc, 0x13, 0xff, 0x17, 0x05, 0x18, 0x4c, 0xe6, 0xd8, 0x1e, 0xeb, - 0x0a, 0x4e, 0x78, 0xa2, 0xfd, 0xbf, 0x6d, 0xf4, 0xec, 0xae, 0x88, 0xf0, - 0x8a, 0xbf, 0xad, 0x2d, 0x2e, 0xb1, 0x30, 0xa3, 0xd6, 0x8d, 0x54, 0x45, - 0xbc, 0x13, 0xff, 0x06, 0x64, 0xb4, 0x0f, 0x73, 0x08, 0x2c, 0x78, 0x1e, - 0x3f, 0x2b, 0x2a, 0x65, 0x93, 0x8f, 0xe6, 0x75, 0xf7, 0x7e, 0x26, 0x54, - 0x81, 0x23, 0x2d, 0x4f, 0xc8, 0xe5, 0x8d, 0x7c, 0x88, 0x4a, 0xf0, 0x1d, - 0x30, 0xe2, 0x89, 0x70, 0x1c, 0xb1, 0xc6, 0xe7, 0x19, 0xc3, 0x69, 0x7b, - 0x25, 0x50, 0x16, 0x50, 0x51, 0x48, 0xfe, 0xe4, 0xdf, 0x07, 0xa7, 0x5b, - 0xc2, 0x8e, 0xd1, 0xc9, 0x6d, 0x06, 0x78, 0x46, 0x61, 0x2a, 0x52, 0xda, - 0xf5, 0xe9, 0x08, 0x63, 0x55, 0x66, 0xea, 0xb7, 0x49, 0x9d, 0x3c, 0xc9, - 0x0f, 0xfd, 0xd2, 0xf7, 0x74, 0xf2, 0x88, 0xe9, 0xe9, 0x71, 0x96, 0x70, - 0x89, 0x07, 0x1c, 0xf2, 0x3f, 0xb4, 0x9d, 0x4e, 0x14, 0x50, 0x28, 0xd2, - 0x5f, 0xae, 0x46, 0x2a, 0xfb, 0x8a, 0x8c, 0x27, 0x39, 0xb1, 0x76, 0x79, - 0x3b, 0x95, 0xe9, 0x51, 0x9b, 0x81, 0x3c, 0x02, 0x48, 0xd4, 0x95, 0x13, - 0x5c, 0x61, 0xc5, 0x5d, 0x8f, 0x73, 0xb5, 0xc1, 0xa6, 0xa2, 0x3e, 0x69, - 0x5c, 0xdf, 0xe9, 0x1b, 0x97, 0x57, 0xf1, 0xa9, 0x3c, 0xe5, 0xa4, 0x7f, - 0xaf, 0xf7, 0xfa, 0x51, 0x97, 0x13, 0x65, 0xaf, 0xd1, 0xab, 0xc2, 0x98, - 0x2b, 0xe9, 0xc0, 0x85, 0xc0, 0x46, 0x56, 0x8f, 0xb6, 0xed, 0xdf, 0x2f, - 0xf8, 0x58, 0xc4, 0xad, 0x64, 0x5b, 0x37, 0x23, 0xd1, 0x19, 0x83, 0x2c, - 0x4e, 0x15, 0x0e, 0x1d, 0x15, 0x28, 0xa6, 0x63, 0xbe, 0xd5, 0xb7, 0x88, - 0x0f, 0xcb, 0xbd, 0x31, 0xae, 0x0c, 0x14, 0x8c, 0xc9, 0x23, 0x6c, 0x9e, - 0x07, 0xe9, 0xaf, 0xfc, 0x47, 0x8a, 0xff, 0x3d, 0xcc, 0x9d, 0xe2, 0xb5, - 0x6e, 0x95, 0x3b, 0x0d, 0xd4, 0xf0, 0xc8, 0xa5, 0xfa, 0x49, 0x78, 0x80, - 0x8a, 0x68, 0x1d, 0x73, 0x9a, 0xfe, 0x29, 0x7a, 0x9c, 0x9c, 0xcd, 0xf5, - 0xe1, 0xeb, 0x28, 0xb7, 0xfb, 0x8c, 0xb0, 0x1a, 0xeb, 0x0e, 0xa6, 0x22, - 0x3b, 0xf0, 0xca, 0xfa, 0x84, 0x11, 0xaf, 0x2d, 0x93, 0xd3, 0xb1, 0x1a, - 0x15, 0x97, 0xc6, 0x36, 0x81, 0x03, 0xe7, 0xfa, 0x95, 0x61, 0x0a, 0x21, - 0x79, 0x18, 0x6d, 0x0d, 0x12, 0x30, 0x46, 0x0c, 0x31, 0xee, 0xa5, 0x54, - 0x76, 0x56, 0x8d, 0xaa, 0x35, 0x4f, 0x36, 0xc1, 0x8d, 0xdf, 0xd0, 0xca, - 0x78, 0x49, 0xfd, 0x47, 0x69, 0x4c, 0xd2, 0xab, 0x0d, 0xde, 0xbf, 0x6f, - 0x1e, 0xf5, 0xd3, 0x69, 0x89, 0xa1, 0x87, 0x5b, 0x37, 0xd4, 0xf3, 0xa8, - 0x7d, 0xdb, 0xbc, 0xf0, 0xc2, 0x71, 0xb6, 0x11, 0xb4, 0xdb, 0x8d, 0xae, - 0x71, 0x40, 0x6b, 0x9d, 0x05, 0x9a, 0x5f, 0x60, 0xdf, 0x1a, 0x27, 0xb5, - 0x63, 0xbf, 0xfb, 0xb1, 0xa0, 0x44, 0x70, 0xfa, 0xec, 0xe3, 0xe9, 0x2d, - 0xfb, 0x01, 0x5c, 0xfd, 0xce, 0x01, 0xfb, 0x8e, 0x1b, 0x2e, 0x0b, 0x14, - 0xf1, 0xcc, 0x44, 0xb4, 0x07, 0x7d, 0xda, 0xf1, 0xd5, 0xda, 0x4e, 0x62, - 0x6f, 0xed, 0x16, 0xe8, 0xd1, 0xaf, 0x20, 0xb5, 0x10, 0x1b, 0x3b, 0x9e, - 0x44, 0xf4, 0x0a, 0x8a, 0x3d, 0x73, 0x90, 0xfe, 0x90, 0x16, 0x0d, 0x82, - 0x24, 0x1f, 0xda, 0x73, 0xa6, 0x71, 0xd4, 0x1d, 0x5b, 0xee, 0x70, 0xfe, - 0x23, 0x42, 0x24, 0x70, 0x9d, 0xcf, 0x87, 0x45, 0x2f, 0xe8, 0x1b, 0xd5, - 0xc8, 0xb4, 0xce, 0x1d, 0xb3, 0x3a, 0x55, 0x20, 0x9a, 0x37, 0xcd, 0xe0, - 0x41, 0x1e, 0x9a, 0x77, 0x97, 0x4a, 0x7c, 0x07, 0x73, 0x77, 0x3e, 0xc1, - 0xfe, 0x07, 0x9b, 0x02, 0x99, 0x46, 0x8a, 0x58, 0xb7, 0x0e, 0x2a, 0x6a, - 0xff, 0x5b, 0x7b, 0xf5, 0x8d, 0xb7, 0x1f, 0x02, 0x7f, 0x4e, 0x2a, 0xe4, - 0x85, 0x1e, 0x06, 0xe3, 0x9a, 0xa1, 0x4d, 0x6f, 0x3c, 0xc6, 0xf9, 0x10, - 0x25, 0xfb, 0x7f, 0x2e, 0x04, 0x0f, 0x69, 0x0f, 0xa6, 0x5c, 0x7d, 0xa3, - 0xd2, 0xd5, 0x9a, 0xb5, 0x0c, 0x4a, 0x44, 0xab, 0xe2, 0xfb, 0x58, 0xbe, - 0x9a, 0x45, 0x98, 0x26, 0x93, 0xb8, 0xd8, 0x8c, 0x8e, 0x31, 0x74, 0x33, - 0x9e, 0x7d, 0x10, 0xc5, 0xf2, 0x43, 0x26, 0x9e, 0x82, 0xbe, 0x7a, 0x1f, - 0xbe, 0x00, 0xa2, 0xb6, 0xc4, 0x40, 0xa4, 0xdf, 0x6d, 0x27, 0xab, 0xf3, - 0x71, 0x8b, 0x45, 0xc1, 0xb3, 0x2e, 0xf6, 0x4d, 0x9f, 0xaf, 0xa5, 0x94, - 0x72, 0x25, 0x93, 0xf5, 0xde, 0x09, 0x89, 0x0c, 0x94, 0x9b, 0x9c, 0x0b, - 0x14, 0xb4, 0x17, 0x1e, 0xe8, 0x08, 0x52, 0xfc, 0xf1, 0x0d, 0x79, 0xd5, - 0xf0, 0x18, 0x17, 0xea, 0x6c, 0xde, 0x71, 0x0e, 0xde, 0xf7, 0x80, 0x35, - 0x27, 0xbe, 0x67, 0xa9, 0x45, 0x7d, 0x96, 0x2a, 0x22, 0x6b, 0xc8, 0x06, - 0x6e, 0x90, 0x74, 0xab, 0x1d, 0x6b, 0x65, 0xbb, 0xb1, 0xae, 0x13, 0x6c, - 0x0c, 0xd0, 0xe6, 0xca, 0xbc, 0xf4, 0xf6, 0x8a, 0x61, 0x33, 0x7e, 0x46, - 0x27, 0x27, 0xcd, 0x79, 0x57, 0xb1, 0x58, 0x4a, 0xdc, 0xb9, 0x5e, 0xa0, - 0x43, 0x84, 0x58, 0x89, 0x46, 0x0c, 0x6e, 0x60, 0x43, 0x72, 0x4a, 0x74, - 0xf8, 0x07, 0xaa, 0xed, 0x03, 0x02, 0x86, 0x0b, 0x48, 0x2a, 0x09, 0x6b, - 0x97, 0xa9, 0x4d, 0xe9, 0x53, 0x3f, 0xd2, 0xfb, 0xd6, 0x7f, 0x98, 0x3c, - 0x74, 0x2b, 0x75, 0x01, 0x14, 0xd7, 0x05, 0xd4, 0x42, 0xa3, 0x87, 0xef, - 0x9e, 0x60, 0x46, 0x8c, 0xf9, 0x73, 0x1d, 0x97, 0xb0, 0x31, 0x84, 0xa5, - 0x6f, 0x6d, 0x91, 0x12, 0xaa, 0xd4, 0xfc, 0xf8, 0x84, 0x65, 0x99, 0x3c, - 0x36, 0x09, 0xa6, 0x70, 0x1c, 0x31, 0xa1, 0xa3, 0xc6, 0x58, 0x3f, 0x27, - 0xc4, 0x80, 0x12, 0xbc, 0xd8, 0x61, 0xa3, 0x2c, 0x0d, 0x0f, 0x22, 0xd2, - 0xe6, 0xcc, 0xe5, 0xe4, 0x40, 0x92, 0xeb, 0xe4, 0xab, 0xed, 0xdf, 0x93, - 0x40, 0x41, 0x57, 0x44, 0xe1, 0x3a, 0x02, 0x14, 0x22, 0x30, 0xfd, 0x50, - 0x57, 0xc7, 0xe2, 0x00, 0xd2, 0xe5, 0xb0, 0x2c, 0x1f, 0x3e, 0x9f, 0xde, - 0x77, 0xc3, 0xb0, 0x3d, 0xef, 0x00, 0x57, 0x32, 0xe9, 0x34, 0x51, 0x22, - 0x38, 0xb6, 0xbe, 0x6a, 0x2e, 0xcd, 0xea, 0xbe, 0x5e, 0xc7, 0x45, 0x97, - 0x59, 0x5a, 0x3d, 0xa6, 0xca, 0x9f, 0x07, 0x30, 0x70, 0x76, 0x2c, 0xa4, - 0xbb, 0xf3, 0xe4, 0x45, 0xce, 0x57, 0x74, 0x04, 0xc7, 0x3c, 0x19, 0xa5, - 0x43, 0x9d, 0x0b, 0xce, 0xdb, 0xb5, 0xff, 0xc7, 0x7a, 0xe6, 0x6b, 0xe6, - 0xfa, 0x8b, 0xaa, 0xd7, 0x73, 0x3f, 0x7a, 0x13, 0xbf, 0xc7, 0x2e, 0x11, - 0xea, 0xae, 0x9a, 0xab, 0x44, 0x38, 0xb8, 0x15, 0x06, 0xa2, 0x38, 0xda, - 0x8e, 0x76, 0xf1, 0x7f, 0x0d, 0xce, 0x46, 0x5b, 0xa6, 0xb6, 0x8a, 0x25, - 0xeb, 0x6c, 0xb5, 0x18, 0xb5, 0x08, 0x99, 0x01, 0xc7, 0x61, 0xa3, 0xb4, - 0x2f, 0x06, 0x93, 0x95, 0x2e, 0xc6, 0x65, 0x91, 0x40, 0xa4, 0x7e, 0x4e, - 0x46, 0xe9, 0xb4, 0x6d, 0x50, 0x6f, 0xf2, 0x2e, 0x48, 0x6e, 0x83, 0x23, - 0x44, 0xb4, 0xf8, 0x2d, 0x0f, 0xeb, 0x46, 0x9b, 0x96, 0x61, 0x2d, 0x5a, - 0xbf, 0x01, 0xfd, 0xe4, 0x5a, 0x15, 0x2d, 0x76, 0x1e, 0x97, 0xb3, 0x1f, - 0x0e, 0x8c, 0x83, 0xf2, 0x98, 0x0c, 0x82, 0x56, 0x27, 0x39, 0xaf, 0x77, - 0x3a, 0xdf, 0x4d, 0x43, 0x41, 0xd7, 0x38, 0xc5, 0x87, 0xcd, 0xd4, 0x10, - 0x01, 0x3d, 0x8e, 0xb4, 0x7c, 0x47, 0xe3, 0xa2, 0xb8, 0x41, 0x81, 0x73, - 0x10, 0xd9, 0xfd, 0xe2, 0xe3, 0x94, 0xd0, 0x27, 0xfd, 0x9d, 0xd4, 0x44, - 0x2a, 0x31, 0x3e, 0x01, 0x90, 0x6b, 0xc5, 0x49, 0x85, 0x0e, 0x1a, 0x7f, - 0x5a, 0x89, 0xa7, 0x3f, 0x36, 0xde, 0xe9, 0x06, 0x7f, 0x1a, 0x34, 0x9c, - 0x7b, 0x5d, 0x37, 0x66, 0xc6, 0x5d, 0xa9, 0xac, 0xac, 0x85, 0xdb, 0x21, - 0x1e, 0x57, 0xcb, 0xd4, 0x64, 0xd1, 0xf1, 0x67, 0x4f, 0x38, 0xf5, 0x06, - 0xc9, 0xa0, 0x9c, 0x62, 0x2c, 0x55, 0xa7, 0xf2, 0xf4, 0xdf, 0x56, 0xa3, - 0xd0, 0x96, 0x8b, 0xe8, 0x0b, 0x88, 0xa8, 0x5e, 0x3d, 0xc1, 0xc6, 0x3b, - 0x17, 0x57, 0xe8, 0x46, 0x29, 0xb0, 0xa2, 0x3d, 0xe8, 0x91, 0x02, 0x8c, - 0xcc, 0x70, 0xa6, 0x07, 0xb2, 0xf3, 0xd5, 0xbc, 0x66, 0xb0, 0xe5, 0x10, - 0xd5, 0x8f, 0xd9, 0x9f, 0xec, 0xe5, 0xcc, 0xe9, 0x20, 0xcc, 0x60, 0x3f, - 0xef, 0x4f, 0x0e, 0x9b, 0x66, 0xb8, 0x35, 0x96, 0x9a, 0x27, 0xfb, 0xfb, - 0xe2, 0x61, 0x39, 0x3a, 0x73, 0x12, 0xbc, 0xe4, 0x2b, 0x61, 0x19, 0x2c, - 0x89, 0xb5, 0x72, 0x9d, 0xbd, 0xba, 0x40, 0x89, 0xd3, 0x8b, 0x24, 0x0b, - 0x6d, 0x67, 0x75, 0xf7, 0xd7, 0x9f, 0x7d, 0x99, 0x07, 0xfd, 0xd8, 0x25, - 0x0f, 0x03, 0x6e, 0xc2, 0x66, 0xfc, 0x7b, 0x6a, 0x89, 0x9f, 0x0f, 0xb9, - 0x4e, 0xd0, 0xb7, 0xf1, 0x7a, 0x7c, 0x50, 0x65, 0xcb, 0x80, 0x7f, 0xac, - 0x4d, 0xae, 0xe4, 0x04, 0x5f, 0x9c, 0x50, 0xdb, 0xa2, 0xeb, 0x99, 0x1c, - 0x1d, 0x0e, 0x99, 0x74, 0x8d, 0xd0, 0xc9, 0x8c, 0x9a, 0x20, 0x3f, 0xf4, - 0xb7, 0x63, 0xcb, 0xe3, 0x36, 0x81, 0x3b, 0x64, 0x39, 0xd5, 0x69, 0x0c, - 0xa0, 0x8b, 0xd0, 0x5f, 0xb7, 0xb5, 0xba, 0x37, 0x73, 0xf9, 0x4f, 0x91, - 0xa5, 0x61, 0xff, 0x8a, 0x8d, 0x39, 0x56, 0xdd, 0xd9, 0x33, 0x56, 0xba, - 0x49, 0xe2, 0x22, 0x36, 0xc6, 0xaa, 0xe9, 0x6a, 0xed, 0x2c, 0x5b, 0x6c, - 0xbd, 0x2b, 0xca, 0xae, 0x45, 0x40, 0xb1, 0x04, 0x0d, 0xf9, 0xa0, 0x53, - 0xcd, 0xec, 0x04, 0x3d, 0x1f, 0xb5, 0xab, 0xe8, 0xc8, 0xb8, 0xeb, 0x8f, - 0xa8, 0xa3, 0x47, 0x77, 0x7b, 0xde, 0xd1, 0x4a, 0x00, 0x63, 0x46, 0x92, - 0xad, 0xd7, 0x6d, 0x9d, 0x1a, 0x50, 0x0b, 0x8f, 0x08, 0x24, 0xb0, 0x32, - 0x07, 0xa7, 0x9a, 0xc4, 0x27, 0x77, 0x89, 0xe0, 0xad, 0x91, 0x55, 0x65, - 0x90, 0x80, 0x39, 0x6f, 0xfc, 0x54, 0x00, 0xae, 0xd6, 0x81, 0xe0, 0x45, - 0xa8, 0x02, 0xb8, 0x95, 0xca, 0xe7, 0x74, 0x44, 0x85, 0x8b, 0x6f, 0x95, - 0x44, 0xf5, 0x2c, 0xa7, 0x2f, 0x48, 0x99, 0x32, 0x94, 0xc6, 0xb5, 0x7f, - 0xcd, 0x3c, 0x87, 0x3f, 0x4b, 0xad, 0xc4, 0x66, 0xc9, 0x86, 0xe5, 0x0f, - 0xaa, 0x9c, 0x5f, 0x88, 0x08, 0x56, 0x9a, 0x54, 0xe9, 0xe5, 0x40, 0x46, - 0x12, 0x9b, 0x87, 0xa4, 0x39, 0xca, 0x45, 0x61, 0x7d, 0x4f, 0x03, 0x88, - 0x71, 0xb7, 0x1c, 0x43, 0x66, 0xf7, 0x5b, 0x59, 0xa6, 0xa6, 0x7d, 0x83, - 0x28, 0xb5, 0xf9, 0xd3, 0xec, 0xc8, 0xb5, 0x04, 0x93, 0x9a, 0x27, 0x43, - 0x5f, 0xa2, 0xc8, 0x5b, 0xe1, 0xcf, 0x4b, 0xf5, 0x84, 0x4d, 0x87, 0x3c, - 0x6e, 0x40, 0xa1, 0xa0, 0x27, 0xa7, 0x83, 0xbb, 0x98, 0x0d, 0xf8, 0x26, - 0x02, 0x6b, 0xf3, 0x21, 0x8f, 0xf6, 0x21, 0x6a, 0x68, 0xb2, 0x98, 0xa4, - 0x5d, 0x66, 0x01, 0xe9, 0x28, 0x86, 0x77, 0x2d, 0x5c, 0x3a, 0x6a, 0x52, - 0x46, 0x3e, 0xe9, 0x73, 0x9d, 0x7f, 0x67, 0xd8, 0x2e, 0x30, 0x3c, 0x7e, - 0xc9, 0xeb, 0xdf, 0x99, 0x00, 0xfd, 0xdf, 0x6f, 0x4d, 0x33, 0x40, 0x17, - 0xf5, 0xfe, 0xc2, 0x60, 0xf8, 0x40, 0xd1, 0x49, 0xd7, 0x01, 0xdc, 0x43, - 0xf0, 0x23, 0x40, 0x29, 0xb1, 0x78, 0xe6, 0xfc, 0x6a, 0xe8, 0xda, 0xc0, - 0x3d, 0x8c, 0x7e, 0xe5, 0x54, 0xa3, 0x57, 0xda, 0x05, 0x72, 0xf6, 0xde, - 0xd5, 0x1b, 0xe2, 0xc0, 0x50, 0x67, 0xe1, 0x3b, 0xbd, 0x88, 0x1a, 0x4e, - 0x41, 0xf1, 0x0c, 0xef, 0x9c, 0xed, 0x2b, 0xa8, 0xc7, 0x97, 0xc1, 0x6c, - 0x0c, 0x52, 0x42, 0xc2, 0xb7, 0xcf, 0xe2, 0x99, 0x71, 0x48, 0xa7, 0x92, - 0x4d, 0xf0, 0xf3, 0x33, 0xf7, 0xdb, 0x46, 0xf2, 0x3c, 0x57, 0x6e, 0xf3, - 0x17, 0xb8, 0x68, 0xa4, 0xa6, 0x90, 0x2a, 0xe5, 0x15, 0x7d, 0x0f, 0x87, - 0x0a, 0x33, 0xb7, 0xeb, 0x96, 0x8d, 0xe5, 0xc9, 0xd8, 0x8b, 0x3f, 0x85, - 0x4a, 0xe2, 0x77, 0xa9, 0x2a, 0x24, 0xe0, 0x23, 0x8e, 0x6a, 0xde, 0xf4, - 0xac, 0x6c, 0xff, 0xae, 0x78, 0xb9, 0x21, 0x73, 0x09, 0x13, 0x6f, 0x41, - 0x0a, 0x29, 0x68, 0x74, 0x60, 0x67, 0x5e, 0x51, 0x6f, 0xf8, 0x09, 0x28, - 0xf3, 0x84, 0x51, 0x21, 0x31, 0x2e, 0xfa, 0x3e, 0x5c, 0x29, 0x3d, 0xd9, - 0xb8, 0xc9, 0x72, 0x83, 0x17, 0xb4, 0x5d, 0x60, 0xbe, 0xb2, 0x2a, 0x1b, - 0xda, 0x72, 0xad, 0x93, 0x1e, 0xa8, 0x46, 0x29, 0xe1, 0xde, 0xc3, 0x90, - 0x50, 0x0e, 0xa0, 0xf2, 0xdc, 0xbf, 0x2e, 0x22, 0xbc, 0xc9, 0x00, 0xbd, - 0x1c, 0x6a, 0x34, 0x9f, 0xac, 0x81, 0x2e, 0x3e, 0x4d, 0x86, 0x46, 0xff, - 0x05, 0x8e, 0x50, 0x01, 0x20, 0x2d, 0x81, 0x03, 0xf2, 0x73, 0xb3, 0x46, - 0xb7, 0x79, 0xda, 0x4f, 0x40, 0x6e, 0xbd, 0xdc, 0x43, 0x9b, 0x28, 0x25, - 0x6a, 0x16, 0x37, 0x04, 0x09, 0xf0, 0x40, 0x2b, 0x79, 0x53, 0xd2, 0x2d, - 0xb4, 0x68, 0x19, 0x6e, 0x23, 0x3c, 0xdd, 0x8e, 0x85, 0x31, 0xb2, 0x59, - 0x93, 0xf8, 0xad, 0x79, 0x37, 0xd2, 0xd7, 0x72, 0xcf, 0x4d, 0xb5, 0xec, - 0x3e, 0x71, 0x1c, 0x3f, 0x97, 0x0f, 0xbb, 0x5f, 0x1d, 0xfd, 0xf1, 0x9b, - 0x52, 0x62, 0x8b, 0x1d, 0x72, 0xb2, 0x18, 0xd0, 0x0e, 0x5a, 0xac, 0xa4, - 0xf9, 0xd6, 0xd7, 0xa9, 0x13, 0xd2, 0xb6, 0x6b, 0x20, 0xf8, 0x9f, 0xde, - 0x43, 0x35, 0x31, 0x84, 0xbe, 0xc2, 0xe4, 0x89, 0xfb, 0x2c, 0xbd, 0x15, - 0xd0, 0x79, 0x6b, 0x27, 0x7c, 0x79, 0x10, 0xcb, 0xcf, 0xad, 0x24, 0x1c, - 0xb6, 0x17, 0x5b, 0x76, 0x75, 0x7d, 0xa8, 0xa2, 0x3f, 0xf6, 0x6c, 0xf6, - 0xb5, 0x07, 0xc6, 0xce, 0xfe, 0xdd, 0xb7, 0x65, 0x85, 0x9c, 0xb2, 0x99, - 0xab, 0x96, 0x7e, 0x73, 0x03, 0xbf, 0x01, 0x59, 0xd9, 0x96, 0x0d, 0x08, - 0x25, 0xbd, 0xae, 0x06, 0xe9, 0xd3, 0x82, 0xeb, 0xde, 0x00, 0x2e, 0xc2, - 0xf6, 0x74, 0x2b, 0x70, 0x31, 0xd8, 0x2d, 0x47, 0x7f, 0x09, 0x6f, 0xc4, - 0x91, 0xd6, 0x40, 0x0f, 0x34, 0xcf, 0xc6, 0xf0, 0x54, 0xa0, 0x66, 0x5f, - 0xf0, 0x89, 0x9b, 0x6e, 0x4e, 0xfb, 0x39, 0x93, 0x7e, 0x88, 0xb5, 0xd7, - 0xca, 0xc2, 0x08, 0x5c, 0x4d, 0x83, 0xe9, 0x4c, 0xb7, 0x46, 0xf5, 0x1b, - 0x8c, 0xe0, 0x81, 0x7b, 0x95, 0x06, 0xa0, 0x9f, 0xb7, 0x3c, 0x74, 0x96, - 0x48, 0x30, 0x69, 0x6c, 0x83, 0x0b, 0x1e, 0x9a, 0x40, 0x3d, 0xb3, 0xd4, - 0x85, 0xef, 0xfb, 0x77, 0x37, 0xb0, 0xd8, 0x43, 0xaf, 0x19, 0x65, 0x15, - 0xdf, 0x9a, 0x99, 0xf4, 0x8b, 0x72, 0x15, 0x74, 0xa1, 0xc5, 0xe5, 0x04, - 0x2b, 0x13, 0x91, 0xc0, 0x79, 0xa7, 0xf2, 0x7a, 0xf9, 0x91, 0x07, 0x55, - 0xab, 0xa7, 0xf0, 0x4a, 0x66, 0xfb, 0x25, 0x80, 0x46, 0x3f, 0xc1, 0xee, - 0xaf, 0xef, 0xb2, 0xb1, 0x07, 0x7c, 0x74, 0xd8, 0x94, 0x84, 0x97, 0xc7, - 0x4e, 0x65, 0xdf, 0x2b, 0x07, 0x2a, 0x53, 0x78, 0x30, 0x7d, 0xcf, 0x46, - 0x45, 0x10, 0x34, 0x00, 0xc7, 0xf6, 0xf2, 0x81, 0xd1, 0x61, 0xde, 0x63, - 0x8f, 0x66, 0xb2, 0xff, 0xd8, 0x2e, 0x67, 0x68, 0xe8, 0x1e, 0xe3, 0xbb, - 0x7c, 0x3c, 0xec, 0xb3, 0x07, 0x84, 0x35, 0x31, 0x8a, 0x38, 0x7e, 0xfb, - 0xe7, 0xc1, 0x40, 0x4c, 0xb6, 0xd8, 0x9a, 0xf6, 0x98, 0x01, 0xaa, 0xc4, - 0xf1, 0x5d, 0x34, 0x6f, 0xb8, 0xbc, 0xc1, 0x52, 0xde, 0xa2, 0x0b, 0x5d, - 0x8e, 0x7e, 0xea, 0x67, 0xf8, 0xff, 0xf3, 0x77, 0x81, 0xe0, 0xf2, 0x2f, - 0x84, 0xa0, 0xc4, 0xe8, 0x50, 0x16, 0x3d, 0xab, 0x9d, 0xa1, 0x12, 0x79, - 0x1d, 0xee, 0x09, 0xa2, 0xe2, 0x7c, 0xdb, 0xb2, 0x4d, 0xf4, 0xa3, 0x16, - 0xe3, 0x7a, 0x05, 0x5d, 0xd4, 0x0d, 0xb3, 0x67, 0x23, 0x6a, 0xbd, 0x73, - 0xa6, 0x5f, 0xb8, 0xfd, 0x41, 0x3b, 0x7a, 0x08, 0x77, 0x04, 0xd5, 0x7e, - 0x27, 0x5f, 0x60, 0xb4, 0x12, 0xbb, 0xbe, 0x07, 0xbb, 0x68, 0x43, 0xf4, - 0x7d, 0x50, 0xff, 0x6e, 0x61, 0x4a, 0xd3, 0x4e, 0x41, 0xbb, 0xb9, 0xbb, - 0xa7, 0xfb, 0x39, 0xc5, 0xa1, 0xf3, 0x69, 0xdf, 0x41, 0x2a, 0x16, 0x55, - 0x44, 0x06, 0xe5, 0xa3, 0x6c, 0xaa, 0x20, 0x23, 0x4a, 0xfb, 0x29, 0x39, - 0xe0, 0x47, 0xec, 0x88, 0x6d, 0x1b, 0x6c, 0xfe, 0xcf, 0x17, 0x9e, 0x84, - 0x12, 0xc7, 0xf9, 0x5e, 0x27, 0x35, 0x9e, 0xcf, 0xb4, 0x7a, 0x74, 0x92, - 0x06, 0xa0, 0x95, 0x94, 0x73, 0x4d, 0x0f, 0x80, 0xc6, 0x43, 0x69, 0xd8, - 0xda, 0xa1, 0xc2, 0x9f, 0x27, 0x7e, 0x4d, 0x86, 0x93, 0x0a, 0x75, 0x0e, - 0xf2, 0xa6, 0xaf, 0x16, 0x52, 0xec, 0x16, 0xa2, 0x37, 0x82, 0xfc, 0xed, - 0xb5, 0xd0, 0xab, 0x26, 0xfd, 0xcb, 0x2f, 0x0f, 0x24, 0x13, 0xc7, 0x67, - 0x97, 0x32, 0xc2, 0x10, 0xb2, 0x10, 0xb5, 0x51, 0xe0, 0xb5, 0x6b, 0x28, - 0x6e, 0xb4, 0x3d, 0x97, 0x2d, 0x09, 0xef, 0xf0, 0x36, 0xbb, 0x34, 0x40, - 0x8e, 0x7e, 0x5a, 0xbc, 0x3a, 0xab, 0xd9, 0x78, 0x12, 0xe7, 0xd2, 0x0e, - 0x3f, 0x58, 0x00, 0xa5, 0x68, 0xeb, 0xb8, 0x05, 0xd0, 0x00, 0xc0, 0x5c, - 0xb4, 0x19, 0x79, 0x21, 0xf0, 0x6c, 0x5a, 0xc3, 0xf0, 0xa4, 0x65, 0x08, - 0xf7, 0x27, 0x2d, 0xb6, 0x3d, 0xbc, 0xef, 0x86, 0x53, 0x49, 0x93, 0x3f, - 0x26, 0xb4, 0x49, 0xa0, 0x3c, 0x00, 0xb8, 0xc7, 0x38, 0x13, 0xd9, 0x47, - 0x69, 0x58, 0x9c, 0x45, 0x00, 0xdd, 0x76, 0x64, 0xc5, 0x19, 0xc2, 0x98, - 0x45, 0x6d, 0x2f, 0xf5, 0x18, 0xb3, 0xbd, 0x62, 0x39, 0xb2, 0xbe, 0xd2, - 0x07, 0xd6, 0x89, 0x27, 0x0b, 0xa8, 0xc6, 0xc1, 0xba, 0x41, 0x84, 0x6c, - 0xad, 0x27, 0xb0, 0x9a, 0xc6, 0x33, 0x4c, 0x28, 0x93, 0x25, 0x05, 0x0d, - 0xb4, 0x64, 0xbb, 0xa7, 0x96, 0xbf, 0x8d, 0x2e, 0xe6, 0x01, 0x1b, 0xd7, - 0xff, 0xc8, 0x3b, 0x88, 0xab, 0x89, 0x3a, 0xde, 0xd1, 0x5c, 0xf8, 0x94, - 0xeb, 0x5f, 0x7f, 0xc5, 0x83, 0x96, 0x1b, 0x62, 0x9f, 0x8a, 0xf1, 0x1d, - 0x82, 0x6d, 0x2e, 0xba, 0x09, 0xaa, 0xd7, 0x8b, 0x92, 0x36, 0x55, 0x64, - 0xe1, 0x63, 0xfb, 0x2f, 0x22, 0x78, 0x11, 0x6f, 0xff, 0xaf, 0xa8, 0xbf, - 0x30, 0x99, 0xc1, 0xd4, 0x82, 0x8a, 0xc4, 0x60, 0xa4, 0x34, 0x7d, 0xc3, - 0x6f, 0x12, 0xcb, 0xf6, 0x9e, 0x1f, 0xb9, 0x85, 0xac, 0x33, 0xea, 0x46, - 0x63, 0x30, 0x69, 0xc0, 0x38, 0xfd, 0x13, 0x71, 0xf4, 0x95, 0x15, 0xff, - 0xfb, 0x5b, 0x11, 0xdf, 0xac, 0xd3, 0xa6, 0xa5, 0xda, 0xe5, 0x55, 0x57, - 0x35, 0x25, 0xc6, 0x8c, 0x79, 0xf6, 0x08, 0x74, 0x0c, 0xf8, 0xe9, 0x3b, - 0x51, 0x2e, 0x31, 0x17, 0xed, 0x55, 0xf2, 0x27, 0xf8, 0x5f, 0x53, 0x43, - 0x4e, 0xe3, 0xad, 0x34, 0xe2, 0xc2, 0x04, 0x77, 0x23, 0xff, 0x73, 0xcb, - 0x98, 0x83, 0x07, 0x14, 0x0f, 0x5a, 0xa4, 0xf7, 0x87, 0x5e, 0x2b, 0x44, - 0x5a, 0x22, 0x15, 0xd9, 0x81, 0x7c, 0xa7, 0x26, 0xad, 0xe5, 0x47, 0xd2, - 0xe3, 0x3f, 0x73, 0x18, 0xcd, 0x34, 0x05, 0x29, 0xf2, 0xa3, 0x1e, 0x5d, - 0x64, 0x4c, 0x43, 0x95, 0xc4, 0x7b, 0xa8, 0xc5, 0x9d, 0x08, 0x25, 0xf1, - 0x5c, 0x46, 0xfd, 0x7e, 0xf2, 0xbe, 0xd0, 0xa6, 0x3a, 0xaa, 0x5d, 0x73, - 0x6e, 0x9f, 0xc3, 0xa0, 0xd8, 0x65, 0x64, 0xee, 0x8d, 0xef, 0xca, 0x21, - 0x54, 0xed, 0xd6, 0xd8, 0x50, 0x9c, 0xdd, 0xae, 0x5b, 0x87, 0x0c, 0x1e, - 0xb8, 0x9f, 0xf0, 0x33, 0x38, 0x3e, 0xf6, 0x5e, 0x0d, 0x2c, 0x3c, 0x11, - 0x3d, 0xdf, 0x22, 0x27, 0x37, 0x1c, 0x75, 0x6c, 0x4e, 0x17, 0xff, 0xf9, - 0x71, 0xf5, 0x58, 0x42, 0xa4, 0xf0, 0x62, 0x0b, 0x35, 0xa5, 0xd9, 0x9b, - 0x92, 0xd5, 0x8a, 0x7c, 0xe8, 0x57, 0x5d, 0x0d, 0x66, 0xa6, 0x8a, 0x71, - 0xc3, 0x4b, 0x3e, 0xd6, 0xaf, 0x9c, 0x78, 0xcb, 0xc8, 0x33, 0x06, 0xa3, - 0x72, 0x30, 0x85, 0x2a, 0x28, 0x05, 0x61, 0x4e, 0x35, 0xad, 0xaa, 0xa7, - 0xa6, 0x0f, 0x9a, 0x74, 0x84, 0x80, 0x3d, 0xa7, 0xf2, 0x7e, 0x65, 0x0f, - 0x4b, 0x7a, 0xcd, 0x87, 0x1f, 0x88, 0x04, 0x70, 0x62, 0xcb, 0xe8, 0x58, - 0x2b, 0x63, 0xa1, 0x67, 0x94, 0x89, 0xf6, 0x8f, 0xac, 0xae, 0xb7, 0x00, - 0x4c, 0x7f, 0x42, 0x50, 0x9c, 0x7b, 0x87, 0x07, 0x9e, 0x47, 0x46, 0xf6, - 0x97, 0xea, 0xd9, 0x6b, 0x79, 0x69, 0xb0, 0x5e, 0x65, 0xd5, 0x85, 0x60, - 0x41, 0x27, 0xe7, 0x7a, 0xda, 0x11, 0x46, 0xf9, 0xb4, 0x8f, 0x02, 0x5a, - 0xae, 0x6d, 0x90, 0xeb, 0x7b, 0x42, 0x47, 0x18, 0x5c, 0xe3, 0x21, 0x70, - 0x44, 0x1f, 0xe0, 0xeb, 0x2d, 0xb9, 0xd9, 0x20, 0xbd, 0x56, 0x6c, 0xce, - 0xe0, 0x4f, 0x19, 0xc8, 0x6d, 0xf8, 0xe8, 0x1c, 0x91, 0x6e, 0xf6, 0x70, - 0x22, 0x58, 0xea, 0x09, 0x65, 0x88, 0xe8, 0xe8, 0x21, 0xbe, 0xc8, 0xb4, - 0x2c, 0x2d, 0xed, 0x21, 0x66, 0xee, 0x94, 0xac, 0x43, 0xe6, 0x14, 0x3a, - 0x4a, 0x52, 0xc4, 0xf7, 0x7b, 0x63, 0x4a, 0x59, 0x5b, 0x1a, 0x80, 0xaa, - 0xba, 0x87, 0x0f, 0x20, 0x33, 0x7f, 0xec, 0x7c, 0x31, 0xb0, 0x90, 0x7b, - 0x1d, 0x7c, 0x45, 0x06, 0xd7, 0x7d, 0xed, 0xa7, 0x86, 0x04, 0x39, 0x0d, - 0xd6, 0x12, 0x42, 0xa7, 0x73, 0x3a, 0x19, 0xd3, 0x08, 0xfc, 0xe2, 0x67, - 0xaf, 0xcd, 0xcd, 0x5e, 0x57, 0xe2, 0x84, 0xc3, 0x63, 0x6e, 0xed, 0x06, - 0xe0, 0x21, 0x16, 0xf8, 0x6a, 0x94, 0xc3, 0xb4, 0x2a, 0xac, 0x0e, 0x1a, - 0x12, 0x70, 0x4b, 0x72, 0x01, 0x62, 0x0f, 0x3b, 0x61, 0xcd, 0x5d, 0x10, - 0x66, 0x4c, 0xdd, 0x84, 0xd6, 0x04, 0x5a, 0x02, 0xdc, 0xe6, 0xae, 0x8f, - 0xc7, 0x07, 0xe1, 0xd8, 0x34, 0xd6, 0xf7, 0xce, 0xc7, 0x70, 0xc8, 0x2c, - 0x4e, 0xea, 0x37, 0x9f, 0xab, 0x66, 0xe1, 0x05, 0x25, 0x58, 0xd5, 0xbb, - 0xd3, 0x89, 0xfd, 0x15, 0x20, 0x6b, 0xca, 0xfc, 0x04, 0xb4, 0xe3, 0x44, - 0x3f, 0x67, 0x7c, 0xfc, 0x4d, 0x13, 0xa2, 0x3e, 0x88, 0xb1, 0x9e, 0xca, - 0xaa, 0x5f, 0x87, 0x1f, 0x3f, 0x22, 0xed, 0xa2, 0x6e, 0xb3, 0x59, 0x1c, - 0x8f, 0x28, 0x11, 0xc7, 0x8c, 0xea, 0x84, 0x30, 0x54, 0x41, 0x43, 0xaf, - 0x58, 0x87, 0x95, 0xfc, 0x42, 0x60, 0x6e, 0x08, 0xf5, 0xb0, 0x22, 0xa5, - 0x97, 0x3b, 0x56, 0xfe, 0xe2, 0x97, 0xf2, 0x63, 0xf2, 0x83, 0x26, 0x9e, - 0x53, 0xf8, 0x6a, 0xa8, 0xac, 0xea, 0xb8, 0xc6, 0x0e, 0x00, 0x56, 0xc7, - 0x4e, 0x2b, 0x57, 0x57, 0xc4, 0xaa, 0x2e, 0x7e, 0x54, 0xf5, 0x22, 0x8a, - 0x6e, 0xac, 0xfc, 0x70, 0x39, 0x89, 0x60, 0x15, 0x6a, 0x7e, 0xec, 0x1f, - 0x2a, 0x81, 0x87, 0x9a, 0x31, 0x30, 0x0b, 0x45, 0xd8, 0xf7, 0x28, 0xb0, - 0x7a, 0x58, 0x44, 0x10, 0x0a, 0xd7, 0xf2, 0xc6, 0x99, 0x56, 0x59, 0xb5, - 0x12, 0x5a, 0x94, 0x4c, 0x71, 0x5a, 0xcc, 0xf9, 0xcd, 0xac, 0xd8, 0xe7, - 0x34, 0xf0, 0x68, 0x82, 0x94, 0xd9, 0x3b, 0x78, 0x30, 0x37, 0x9b, 0xd3, - 0xf0, 0x1b, 0xce, 0xf4, 0x9f, 0x1d, 0xce, 0x18, 0x72, 0x7a, 0xc0, 0xe1, - 0x53, 0x66, 0x1c, 0x9a, 0xd3, 0x02, 0xae, 0x2b, 0xed, 0x9a, 0xb7, 0xf5, - 0xc7, 0x6e, 0xba, 0xef, 0x33, 0x1c, 0xaf, 0x6f, 0xf4, 0x18, 0x20, 0x82, - 0x28, 0xf5, 0xde, 0x0d, 0xff, 0x97, 0xa7, 0x83, 0xe0, 0x4b, 0x20, 0x67, - 0x2a, 0xea, 0xc3, 0x12, 0x99, 0x7b, 0x8f, 0xdc, 0x0d, 0x33, 0x74, 0x10, - 0xf9, 0x65, 0x7a, 0x4c, 0x1b, 0x30, 0xad, 0x6c, 0x90, 0xdb, 0x8e, 0xc1, - 0x16, 0xbb, 0x71, 0xaf, 0xb1, 0x15, 0xeb, 0xc9, 0x26, 0x57, 0xf3, 0xd6, - 0x1c, 0x21, 0xdf, 0x58, 0x94, 0xeb, 0x9f, 0x29, 0x9a, 0x98, 0x2d, 0x10, - 0xe4, 0xa2, 0x0b, 0x7f, 0x3c, 0x87, 0x88, 0x6f, 0x10, 0xc5, 0x38, 0x2a, - 0xa9, 0xf3, 0x4f, 0xc9, 0xbd, 0x75, 0xb5, 0x6e, 0x5a, 0xa4, 0x2a, 0xdb, - 0xb9, 0x58, 0x6a, 0xfe, 0x3c, 0x27, 0x30, 0xa3, 0xf1, 0x44, 0x5f, 0xbf, - 0xb3, 0x65, 0x12, 0x71, 0x27, 0x2c, 0x62, 0xe1, 0x22, 0xf2, 0xa1, 0x96, - 0x93, 0xf6, 0x3f, 0x1d, 0x90, 0x65, 0xae, 0x27, 0x1b, 0xdd, 0x50, 0x3b, - 0x4d, 0x87, 0x9a, 0xf3, 0x1a, 0x1a, 0x4a, 0xc4, 0x84, 0xb7, 0xf7, 0xeb, - 0xf6, 0xce, 0x13, 0xb2, 0x19, 0x9a, 0x00, 0xcf, 0x39, 0x14, 0x92, 0xaa, - 0x5f, 0x4a, 0x10, 0x46, 0xd1, 0x02, 0x96, 0x72, 0xed, 0x54, 0x19, 0x40, - 0x0f, 0x46, 0x02, 0x35, 0x12, 0xb2, 0x95, 0xb4, 0xb8, 0x92, 0x4d, 0x8c, - 0xb1, 0x38, 0x1d, 0xb0, 0xe4, 0x33, 0xc9, 0x3f, 0xa6, 0x22, 0xfd, 0x2d, - 0x71, 0x98, 0xf7, 0xd4, 0x60, 0x60, 0x0d, 0xd6, 0x62, 0xc9, 0x76, 0xe1, - 0x58, 0x89, 0x95, 0x42, 0x0d, 0x49, 0x7f, 0x35, 0x83, 0x48, 0x20, 0x9d, - 0xc0, 0x9f, 0xf5, 0xe0, 0x51, 0xbc, 0x01, 0xbd, 0xb1, 0xe5, 0x96, 0xde, - 0xf6, 0x20, 0x0c, 0xf3, 0xa0, 0x16, 0xf4, 0x95, 0xf4, 0x85, 0x92, 0x3e, - 0xcf, 0x3e, 0x2a, 0xc6, 0xed, 0x39, 0x51, 0xb3, 0x14, 0x31, 0x3a, 0xf8, - 0x58, 0x59, 0xc8, 0xf5, 0x72, 0x1f, 0x8c, 0xcb, 0x8d, 0x93, 0x1e, 0xb4, - 0x61, 0x50, 0x58, 0xa4, 0xc0, 0xf3, 0xf8, 0xb2, 0x39, 0x2c, 0x56, 0x39, - 0xb6, 0x87, 0x1a, 0x26, 0x7f, 0x06, 0x2d, 0xdd, 0x70, 0x22, 0xeb, 0x33, - 0x8b, 0x3c, 0xba, 0x21, 0x29, 0x7b, 0x8d, 0xde, 0xf6, 0x8f, 0x69, 0x6c, - 0x98, 0x26, 0xd0, 0xa3, 0xd8, 0xfb, 0xef, 0xab, 0x22, 0x7c, 0x39, 0x85, - 0x82, 0xda, 0xc3, 0xb7, 0xec, 0xe8, 0x75, 0x62, 0xc5, 0x85, 0x31, 0xf6, - 0xe3, 0x8f, 0x98, 0x44, 0x37, 0xd6, 0x29, 0xa0, 0xa9, 0x3c, 0x1a, 0xf0, - 0xb6, 0x53, 0xcf, 0x77, 0x08, 0x62, 0xc2, 0x8a, 0xdc, 0x15, 0x77, 0x18, - 0xe8, 0x29, 0x63, 0xf3, 0xea, 0x48, 0x15, 0x16, 0x34, 0x8c, 0x78, 0xbd, - 0x16, 0xad, 0x9c, 0xf3, 0x38, 0xf3, 0xf7, 0x2b, 0x17, 0x95, 0xc2, 0x2c, - 0xfe, 0x97, 0xd8, 0x49, 0x48, 0x76, 0x2b, 0xdf, 0x7b, 0x55, 0xc3, 0xaa, - 0xdd, 0xaf, 0x72, 0x32, 0xd7, 0x63, 0xf7, 0x8b, 0x34, 0x96, 0x8b, 0x8c, - 0xfb, 0xdd, 0xc7, 0x49, 0x2f, 0x19, 0x57, 0xe2, 0x89, 0x29, 0x97, 0x9c, - 0x84, 0x72, 0x90, 0x4c, 0x87, 0xcb, 0x50, 0xae, 0x05, 0x6e, 0xf5, 0x03, - 0xe7, 0x40, 0x1e, 0x3b, 0x00, 0x8b, 0x32, 0xee, 0x8b, 0x9d, 0x93, 0xa0, - 0xd9, 0x5c, 0xeb, 0x15, 0x09, 0x37, 0x0f, 0x06, 0xef, 0x95, 0x64, 0x4c, - 0xea, 0xb0, 0xe7, 0xb2, 0xda, 0x67, 0x0a, 0x45, 0xbd, 0x8c, 0xbc, 0xfd, - 0xf2, 0xef, 0x64, 0xeb, 0xb6, 0xa6, 0xde, 0x8c, 0x14, 0xfd, 0x8f, 0x8a, - 0x73, 0xa9, 0xf0, 0x66, 0xa6, 0xd5, 0xca, 0x29, 0xac, 0x83, 0x8c, 0xb3, - 0xd4, 0x55, 0x87, 0x54, 0xe2, 0x45, 0xaa, 0x9f, 0x51, 0xa0, 0xc3, 0x37, - 0x04, 0x58, 0xe9, 0x37, 0x92, 0x2f, 0x3f, 0xbc, 0x1d, 0x1a, 0x9e, 0xc0, - 0x9b, 0x9a, 0x80, 0xf4, 0xf1, 0xa6, 0x62, 0x98, 0x26, 0x0a, 0xd2, 0xc1, - 0x0b, 0xf3, 0xb7, 0x5e, 0x71, 0xb3, 0x26, 0x85, 0x6e, 0xca, 0x1a, 0x85, - 0x23, 0x9b, 0xab, 0xb8, 0x4e, 0xd9, 0xef, 0x86, 0x6e, 0x8d, 0x75, 0x1e, - 0x3a, 0x54, 0x8c, 0x2a, 0xd4, 0x53, 0x9b, 0xe4, 0x9b, 0x81, 0x3f, 0x59, - 0x46, 0x58, 0x6b, 0x60, 0xa4, 0x98, 0xb5, 0x70, 0x0c, 0xb4, 0x4a, 0x39, - 0xbb, 0x6c, 0x7f, 0xf7, 0xb4, 0x3a, 0x3c, 0x28, 0x32, 0x5c, 0x63, 0x4b, - 0x9a, 0x85, 0x67, 0xb9, 0xc1, 0x23, 0xe5, 0xa9, 0xb6, 0x8a, 0x89, 0x0d, - 0x5f, 0xb6, 0x1a, 0x10, 0xd7, 0x41, 0xca, 0x4d, 0x32, 0xea, 0xc3, 0x21, - 0x33, 0x69, 0xfb, 0x1b, 0x5a, 0x74, 0x9e, 0x6a, 0xaa, 0x9a, 0x96, 0xad, - 0x0c, 0xcb, 0x9b, 0x77, 0xf3, 0x77, 0x04, 0x49, 0x81, 0xb7, 0x78, 0xca, - 0x5e, 0x0d, 0xd8, 0x70, 0x45, 0x1f, 0xbd, 0xcf, 0x84, 0x49, 0xf5, 0x15, - 0x1c, 0xa7, 0xd4, 0x37, 0x2d, 0xbf, 0xf1, 0x1b, 0x78, 0xb8, 0x14, 0xa1, - 0x42, 0x93, 0xd3, 0x2d, 0x1d, 0x83, 0x35, 0x18, 0xb4, 0x48, 0xce, 0xa5, - 0x4c, 0x10, 0x8d, 0xdc, 0xf3, 0xe8, 0x69, 0x2d, 0x25, 0xfb, 0xf0, 0xce, - 0xb9, 0x09, 0x67, 0x14, 0xce, 0xa1, 0x21, 0x0f, 0xc1, 0x41, 0x39, 0x0f, - 0xe6, 0xe2, 0xd6, 0x1d, 0xb4, 0x36, 0x87, 0xb9, 0x81, 0x93, 0x98, 0x67, - 0x5b, 0x17, 0xbf, 0xad, 0x65, 0xed, 0xb5, 0xcb, 0x2e, 0x35, 0x52, 0x8a, - 0xac, 0x0e, 0xe6, 0xfc, 0x7c, 0x73, 0xcf, 0x25, 0x9a, 0x58, 0x9d, 0xab, - 0x12, 0x38, 0x4c, 0xc6, 0x20, 0xf1, 0xc0, 0x15, 0x3b, 0x6d, 0x84, 0x98, - 0xc5, 0x8d, 0xc5, 0x39, 0x35, 0x83, 0x08, 0x0c, 0xab, 0xb8, 0xb6, 0x2e, - 0xd1, 0x14, 0x7e, 0x51, 0x46, 0x2f, 0xa2, 0x16, 0x9f, 0x14, 0x18, 0xe7, - 0x61, 0xdc, 0xeb, 0xbe, 0x19, 0x2d, 0x32, 0x39, 0x25, 0xcc, 0x31, 0x5f, - 0x48, 0xe2, 0xda, 0x79, 0x97, 0x0f, 0xbe, 0x7f, 0x33, 0x64, 0x17, 0x37, - 0x10, 0x2d, 0xdd, 0x41, 0xa1, 0xe4, 0xd5, 0x19, 0xff, 0xd2, 0x96, 0x5a, - 0xc8, 0xb1, 0x1b, 0xe0, 0x29, 0x53, 0x74, 0xa2, 0x0d, 0xd9, 0xbe, 0x50, - 0x6d, 0x83, 0xf8, 0x5a, 0x61, 0x26, 0x9c, 0xf8, 0x2b, 0x8a, 0xf5, 0x70, - 0x05, 0x09, 0x21, 0xe5, 0x90, 0xa4, 0x4b, 0xfe, 0x4f, 0x23, 0x43, 0x83, - 0xfe, 0xfb, 0x4e, 0xd6, 0x39, 0x39, 0x29, 0x1b, 0x87, 0xdc, 0x84, 0x44, - 0xdd, 0x92, 0x9b, 0xcb, 0x12, 0xc2, 0xbc, 0x15, 0xe8, 0x44, 0x83, 0xea, - 0xcc, 0x1b, 0x90, 0x87, 0xf5, 0x9d, 0x5e, 0x6e, 0xf9, 0xcd, 0xc7, 0x68, - 0xd0, 0x8e, 0x89, 0xdf, 0x64, 0xb7, 0xb6, 0x46, 0xe8, 0x6c, 0x09, 0x22, - 0x1f, 0xda, 0xaa, 0x1d, 0xc8, 0xc5, 0x1d, 0xc1, 0xbf, 0x31, 0xc3, 0x69, - 0x28, 0x36, 0x9f, 0x32, 0x1c, 0x72, 0xd0, 0xd5, 0x6f, 0x53, 0x55, 0xed, - 0xd6, 0xa2, 0xc4, 0x24, 0xc3, 0x8b, 0xd2, 0xf2, 0xa1, 0x29, 0xca, 0xb3, - 0x61, 0xc6, 0xa1, 0xd9, 0x77, 0xb9, 0x6c, 0xa1, 0xde, 0x67, 0x8e, 0x14, - 0x4e, 0x38, 0x75, 0x71, 0x1c, 0xd1, 0xa4, 0x67, 0x4f, 0xeb, 0x6f, 0xf3, - 0x7b, 0x28, 0x4b, 0xa9, 0xa5, 0xcf, 0xe6, 0x4d, 0x39, 0x82, 0x12, 0x87, - 0x88, 0x6a, 0x03, 0x78, 0xfb, 0x6a, 0xd4, 0x75, 0xa1, 0x66, 0x0f, 0xef, - 0xad, 0xbb, 0x28, 0x0b, 0xbe, 0x8e, 0xb2, 0x59, 0x65, 0x9a, 0x5f, 0xb0, - 0xb0, 0x7c, 0xff, 0x36, 0x49, 0x84, 0xb8, 0xd5, 0x4f, 0x4d, 0xf8, 0x69, - 0x26, 0x5e, 0x69, 0x72, 0xc1, 0x36, 0xd3, 0xcc, 0x33, 0xaf, 0x2b, 0xb2, - 0x54, 0x24, 0x04, 0x0b, 0x0d, 0x8d, 0xb7, 0xbf, 0xa1, 0x1a, 0x02, 0xcf, - 0xe2, 0x02, 0xf1, 0xf4, 0x93, 0xc3, 0x11, 0x98, 0x82, 0xaf, 0x6c, 0xf1, - 0xe4, 0xb2, 0xbf, 0xbb, 0x3e, 0x46, 0x96, 0x98, 0xad, 0x2f, 0x95, 0x23, - 0x18, 0x14, 0xf9, 0x66, 0x1c, 0x19, 0x36, 0xa9, 0x26, 0xc3, 0xd7, 0xa6, - 0x29, 0xb6, 0x5a, 0xe4, 0xd6, 0x12, 0x2c, 0xea, 0xab, 0x99, 0x4f, 0x3a, - 0xc0, 0xb9, 0x53, 0x3d, 0x3d, 0x89, 0xcd, 0xca, 0x26, 0xaf, 0x8a, 0x25, - 0xed, 0x7f, 0xa9, 0x20, 0xa4, 0x78, 0xb6, 0x1b, 0xea, 0x7c, 0xa8, 0x8a, - 0x9e, 0x21, 0x81, 0xe3, 0xbf, 0xd8, 0x6b, 0x6b, 0x4c, 0xae, 0xd4, 0xdf, - 0x35, 0x63, 0x1e, 0x79, 0x2d, 0xa9, 0x34, 0xa8, 0x43, 0xb1, 0x34, 0x1c, - 0xf2, 0xdd, 0x37, 0x24, 0x44, 0xf8, 0x2b, 0x92, 0xe0, 0x15, 0x2c, 0x6b, - 0x13, 0xb3, 0x43, 0x35, 0xd3, 0x9f, 0x83, 0xfc, 0x22, 0xbd, 0xef, 0x1e, - 0xc4, 0x1a, 0xf7, 0xdb, 0xb4, 0x2d, 0xb1, 0x71, 0x15, 0x2d, 0x72, 0x20, - 0x9d, 0x58, 0xba, 0xd8, 0xec, 0xf4, 0xa4, 0x25, 0xc0, 0x8e, 0xaa, 0xc2, - 0x02, 0x48, 0x81, 0xf3, 0xbf, 0xee, 0x8f, 0x8a, 0x11, 0x9d, 0xf3, 0x38, - 0x2c, 0x45, 0x38, 0xaa, 0xe7, 0xf3, 0x9d, 0x34, 0x90, 0x63, 0xd1, 0xe5, - 0xa5, 0x7e, 0x62, 0x68, 0x6a, 0x21, 0x21, 0x1c, 0x02, 0xfd, 0x18, 0xc3, - 0x77, 0xa5, 0x2d, 0x57, 0x72, 0xb7, 0x2d, 0x0d, 0x83, 0x45, 0x5d, 0xb1, - 0x70, 0xea, 0x0b, 0x8e, 0x0d, 0x5b, 0x48, 0x95, 0x4a, 0x1e, 0x20, 0x5b, - 0x24, 0x1a, 0x76, 0xbe, 0x69, 0xb0, 0x53, 0xed, 0x03, 0x8e, 0x07, 0xa5, - 0x80, 0x63, 0x46, 0x56, 0x07, 0xa6, 0x13, 0x21, 0x75, 0x43, 0x89, 0xf0, - 0x8c, 0x39, 0x37, 0x2e, 0xe0, 0xed, 0x3e, 0x92, 0xaa, 0x00, 0x73, 0xdb, - 0x13, 0x4d, 0x87, 0xb1, 0x2d, 0x1c, 0x56, 0xf4, 0xdb, 0x8a, 0x48, 0x0d, - 0x2d, 0x66, 0x4c, 0x3e, 0xa3, 0x68, 0x65, 0x83, 0x3d, 0x37, 0x9c, 0xf6, - 0xe9, 0xbc, 0x05, 0x05, 0x75, 0xdb, 0x98, 0x65, 0x7a, 0xc4, 0xab, 0x7d, - 0x77, 0x8d, 0xaa, 0xf7, 0x59, 0x8a, 0xb2, 0x3a, 0x8d, 0xb4, 0xa3, 0xe9, - 0xb1, 0x32, 0xe4, 0x6e, 0x44, 0x1e, 0x56, 0xb6, 0x26, 0x2c, 0xb5, 0xe9, - 0xc5, 0x7a, 0xba, 0x32, 0x7a, 0x10, 0x45, 0x91, 0x96, 0x97, 0xd2, 0xe2, - 0x18, 0x6d, 0x11, 0x5d, 0xb6, 0x45, 0x99, 0x65, 0xf5, 0x50, 0xe0, 0xe9, - 0xc1, 0x6c, 0x57, 0xa0, 0xda, 0x32, 0xd4, 0x93, 0x1d, 0xc4, 0x14, 0x6e, - 0xfa, 0x18, 0xa1, 0x9a, 0x5f, 0x4f, 0x77, 0xe0, 0xb7, 0x3d, 0xc3, 0x05, - 0xa8, 0x95, 0xae, 0x6a, 0xe2, 0xd5, 0x6d, 0x86, 0x6a, 0x5b, 0x34, 0x93, - 0x4a, 0x1f, 0x61, 0x8d, 0x0a, 0x8b, 0x2e, 0x7e, 0xa4, 0x5e, 0xa4, 0xdc, - 0xae, 0x40, 0x5c, 0xb8, 0x1e, 0x9c, 0xc5, 0x53, 0x5f, 0xc5, 0x97, 0xe0, - 0xb0, 0xb8, 0x7e, 0xd2, 0xe9, 0xd5, 0x87, 0xe1, 0x49, 0x8a, 0x54, 0x8a, - 0x1e, 0x31, 0x48, 0x0c, 0x5d, 0x05, 0xbb, 0xa7, 0xba, 0x1c, 0x30, 0xa7, - 0xe5, 0xc2, 0x4a, 0x10, 0xeb, 0xcf, 0xa5, 0x2f, 0xbb, 0xb6, 0xbe, 0x9f, - 0xa4, 0xb5, 0x11, 0x42, 0x11, 0x9c, 0xd6, 0x5b, 0x9e, 0x08, 0xa5, 0x10, - 0x2a, 0x70, 0x73, 0xc5, 0x8c, 0x75, 0xd3, 0xb3, 0x4a, 0xfd, 0x73, 0xfd, - 0xaf, 0xea, 0x56, 0x6d, 0x2d, 0xa7, 0x9a, 0x64, 0x68, 0x80, 0xfa, 0xdc, - 0x00, 0xc8, 0xaf, 0xa2, 0x51, 0xb2, 0x2c, 0x89, 0x21, 0x02, 0xc9, 0x60, - 0x71, 0x71, 0x26, 0xa2, 0xbf, 0x50, 0xf8, 0x08, 0x53, 0x70, 0x26, 0xd5, - 0xe5, 0x9a, 0x60, 0x2a, 0xb4, 0xa2, 0xd6, 0x00, 0x9f, 0xfa, 0x8d, 0xee, - 0x8e, 0xf9, 0x45, 0x72, 0x71, 0xc7, 0x48, 0x7d, 0x79, 0x97, 0x30, 0x1e, - 0x89, 0x24, 0xde, 0xc8, 0xaf, 0x9a, 0x7f, 0x8c, 0x86, 0x2e, 0xde, 0xde, - 0x31, 0xb9, 0x3e, 0x79, 0x8c, 0x99, 0x01, 0xe4, 0x1c, 0x34, 0x6d, 0x88, - 0x5d, 0x27, 0x34, 0x46, 0x2a, 0xf7, 0x68, 0xd2, 0x04, 0xb9, 0x95, 0x1b, - 0x39, 0x5d, 0xd2, 0xfd, 0x2d, 0x0d, 0x1f, 0x6c, 0xd3, 0xdb, 0x81, 0x01, - 0x24, 0x63, 0x05, 0x3a, 0x12, 0x4d, 0x13, 0x4b, 0xd5, 0x21, 0xe2, 0x4c, - 0x52, 0xd9, 0xc1, 0xc5, 0x53, 0x8c, 0xfb, 0x09, 0x3d, 0xfe, 0x37, 0x83, - 0x32, 0x37, 0x0c, 0x50, 0x35, 0x64, 0x90, 0x85, 0x69, 0xa0, 0xb6, 0x47, - 0x0e, 0x34, 0x30, 0xc5, 0x76, 0x4b, 0x3e, 0xf3, 0x6c, 0xf5, 0x41, 0xe9, - 0x78, 0x7a, 0x94, 0x7f, 0x51, 0x42, 0x6a, 0x50, 0x11, 0xd3, 0xf5, 0xc1, - 0x0b, 0x53, 0xca, 0xc4, 0xe5, 0xca, 0xfb, 0x89, 0x0e, 0x19, 0x95, 0x97, - 0xdc, 0xad, 0xf7, 0x04, 0x6f, 0x54, 0xe1, 0x94, 0xd8, 0xa8, 0xf4, 0x81, - 0x17, 0x73, 0xe0, 0xfb, 0xee, 0x94, 0xba, 0x8a, 0xcf, 0xa7, 0xe0, 0x23, - 0x2e, 0x96, 0xca, 0x5b, 0x14, 0x06, 0x77, 0xb4, 0x4c, 0x2a, 0x4e, 0xc5, - 0x4d, 0x53, 0xa7, 0x03, 0x44, 0x81, 0x19, 0x5c, 0xdc, 0x65, 0x8f, 0x62, - 0x3e, 0xfd, 0x91, 0xe9, 0xd4, 0x49, 0x7d, 0x97, 0xd5, 0x22, 0x20, 0x25, - 0x5c, 0xc2, 0xc6, 0xb3, 0xa6, 0xac, 0x22, 0x55, 0xb4, 0xee, 0x96, 0x0c, - 0xf8, 0xb2, 0xec, 0x0d, 0xc7, 0x31, 0x5d, 0x67, 0x24, 0x0d, 0x60, 0xd3, - 0xc8, 0x9a, 0x19, 0xe0, 0xdb, 0x38, 0x72, 0xb8, 0x9d, 0xce, 0xd7, 0x18, - 0x83, 0x2f, 0xa2, 0x30, 0x4e, 0x85, 0x02, 0x90, 0x6e, 0x10, 0x3c, 0x0c, - 0x0d, 0x6a, 0x8e, 0x37, 0x61, 0x3e, 0x78, 0x15, 0xd5, 0x4d, 0xa8, 0xdb, - 0xd4, 0x36, 0x29, 0x55, 0xcb, 0x9b, 0x99, 0x2e, 0x77, 0xe4, 0xaa, 0x1c, - 0x52, 0x56, 0x08, 0xda, 0x87, 0xc5, 0x3b, 0xe2, 0x8c, 0xa2, 0x7a, 0x6c, - 0xb5, 0x19, 0x28, 0x4c, 0xbc, 0xa6, 0xf5, 0x97, 0x80, 0xd0, 0x0f, 0x1e, - 0x81, 0xea, 0xb4, 0x7f, 0x8d, 0x23, 0x8b, 0x05, 0x9a, 0xbb, 0x03, 0x53, - 0x87, 0xa2, 0x84, 0x03, 0x9a, 0xcd, 0xdf, 0xfd, 0x5c, 0xe8, 0x49, 0xd9, - 0x11, 0x40, 0x85, 0x4e, 0x41, 0xe2, 0x1a, 0x9c, 0x7c, 0xc7, 0xa0, 0x65, - 0xfa, 0xd0, 0xbb, 0xc2, 0xd3, 0x94, 0xe1, 0xc3, 0x05, 0x9d, 0x41, 0x1b, - 0x0d, 0x7e, 0x5e, 0x8e, 0xc5, 0xec, 0xb7, 0x64, 0x0c, 0xa9, 0x46, 0xda, - 0x35, 0x09, 0xa5, 0x6a, 0x66, 0xfa, 0x38, 0x3d, 0xa4, 0xe0, 0x10, 0x8a, - 0x9d, 0xa5, 0xe1, 0xd4, 0xad, 0x59, 0xf0, 0x41, 0x09, 0x26, 0x39, 0x22, - 0x6f, 0x18, 0x77, 0x6d, 0x4d, 0x9f, 0x0b, 0x68, 0x0c, 0x72, 0xc2, 0xee, - 0x83, 0x60, 0x80, 0x29, 0x4d, 0x8b, 0x9a, 0xe9, 0x9f, 0x12, 0xf2, 0xae, - 0x7a, 0x3d, 0x4b, 0xea, 0x01, 0xfe, 0x5e, 0xee, 0x84, 0xb8, 0x9c, 0xb9, - 0x14, 0x7e, 0xe7, 0x07, 0xe7, 0x7e, 0x64, 0xf7, 0x54, 0x2c, 0x2c, 0x9c, - 0x48, 0xf8, 0x98, 0xda, 0xc4, 0x44, 0x2a, 0x4e, 0xe2, 0x6a, 0xcb, 0x42, - 0x48, 0xe4, 0xc8, 0xa7, 0x6e, 0x90, 0x60, 0x39, 0xd9, 0xa2, 0x2b, 0xd4, - 0x5c, 0x43, 0xaf, 0xec, 0xd8, 0xe7, 0xce, 0xe1, 0x16, 0x79, 0xc3, 0x61, - 0xee, 0x98, 0xe1, 0x8f, 0x2c, 0xd4, 0xbf, 0x44, 0x6f, 0xd1, 0x8b, 0xad, - 0x78, 0xb6, 0x9d, 0xd7, 0xc5, 0x0d, 0x37, 0xc4, 0x18, 0xb2, 0x90, 0x9d, - 0x77, 0xc5, 0x48, 0x01, 0xce, 0x66, 0x52, 0x65, 0x10, 0x90, 0x91, 0x9d, - 0xcc, 0x6f, 0xae, 0xe9, 0x4b, 0x29, 0x53, 0x1f, 0x56, 0x6f, 0x35, 0x11, - 0x01, 0x28, 0xec, 0x0d, 0x3e, 0x70, 0x12, 0x92, 0x91, 0x37, 0x79, 0x56, - 0x2a, 0x34, 0xb4, 0x79, 0x64, 0x73, 0xe3, 0xa5, 0x96, 0x61, 0xa0, 0xa9, - 0x0c, 0xd0, 0x29, 0xdc, 0xa7, 0x63, 0xba, 0xb5, 0x36, 0x23, 0xf4, 0xf0, - 0xfe, 0xaf, 0xf1, 0x40, 0xa0, 0x69, 0xd4, 0x02, 0x66, 0x5e, 0x05, 0x8d, - 0x1f, 0x03, 0x72, 0xcd, 0x30, 0x91, 0x19, 0x2d, 0xab, 0x24, 0xf4, 0x82, - 0x61, 0x86, 0x8f, 0x40, 0x42, 0x4b, 0xc1, 0x96, 0x6b, 0x81, 0x75, 0x29, - 0x56, 0x49, 0x23, 0x20, 0x8c, 0x23, 0x50, 0xe7, 0xe5, 0xdb, 0x81, 0x6b, - 0x1c, 0x50, 0x32, 0xb9, 0x37, 0x06, 0x89, 0x27, 0x8e, 0x37, 0xb0, 0x4a, - 0x69, 0xe1, 0x11, 0x91, 0xf5, 0x61, 0x47, 0x59, 0x29, 0xe0, 0x23, 0x27, - 0x64, 0x43, 0x52, 0xac, 0xa9, 0x05, 0x90, 0x60, 0x52, 0x2c, 0x53, 0x6b, - 0x6f, 0x19, 0xed, 0x17, 0x35, 0x0d, 0xb6, 0x05, 0x1e, 0x06, 0x91, 0xb8, - 0x48, 0xc9, 0x28, 0x5d, 0x4d, 0x50, 0x66, 0xfe, 0xa4, 0x40, 0x1b, 0xcb, - 0x90, 0xe9, 0x61, 0xbd, 0x8d, 0x4a, 0x31, 0xbe, 0x80, 0xa3, 0x5f, 0xf3, - 0x57, 0x40, 0x68, 0xfc, 0x36, 0x99, 0xc8, 0xb5, 0x4b, 0x04, 0x89, 0x4b, - 0xcb, 0xde, 0x78, 0x3a, 0xd5, 0xd5, 0xd3, 0x72, 0x1d, 0x9d, 0xa0, 0x2c, - 0xe0, 0x99, 0x3c, 0xe1, 0x5f, 0x8d, 0xfb, 0x6f, 0x68, 0x7f, 0xf8, 0x2f, - 0x06, 0x36, 0x79, 0x9d, 0x6e, 0x0b, 0xa9, 0x11, 0x85, 0x6b, 0x73, 0x49, - 0xf9, 0x1d, 0xc8, 0x6a, 0x6a, 0xbc, 0x79, 0xd8, 0x58, 0x68, 0xbf, 0xbf, - 0x83, 0xee, 0x89, 0x8c, 0x5d, 0x41, 0x5f, 0x2e, 0x69, 0x10, 0x36, 0x5d, - 0x41, 0x84, 0x58, 0x4c, 0x38, 0x86, 0xf9, 0xc9, 0xc8, 0x38, 0xe3, 0xdd, - 0x50, 0x2a, 0x45, 0x19, 0x06, 0x98, 0x80, 0x6c, 0xf3, 0xff, 0x05, 0x89, - 0xaf, 0x1b, 0x58, 0x74, 0xf2, 0xac, 0x85, 0xc5, 0xc6, 0xab, 0xd0, 0x07, - 0xc3, 0x65, 0xb9, 0xcb, 0x44, 0x4f, 0xda, 0x6b, 0xef, 0x36, 0x50, 0x6a, - 0x8c, 0xec, 0xd4, 0x74, 0xd4, 0xda, 0x28, 0x51, 0xd9, 0x80, 0xdf, 0xfb, - 0x25, 0x28, 0x15, 0x4b, 0x5d, 0x05, 0xbe, 0x0c, 0x71, 0x2a, 0x22, 0xa7, - 0xee, 0x17, 0xb3, 0x07, 0xcc, 0xa3, 0x67, 0xc9, 0x12, 0x46, 0x7a, 0x74, - 0x84, 0x99, 0xb9, 0x5c, 0x2b, 0x60, 0xd9, 0x47, 0x2a, 0xd0, 0x65, 0x43, - 0xff, 0x58, 0x4b, 0x8a, 0x16, 0xc1, 0x01, 0x2c, 0x72, 0x56, 0xe4, 0x50, - 0xd8, 0x68, 0x0c, 0x3c, 0xfb, 0x53, 0x79, 0xbe, 0xaf, 0xb5, 0xba, 0x6a, - 0x5f, 0x69, 0xa5, 0x24, 0x14, 0xee, 0x0b, 0x92, 0x0f, 0xae, 0xb0, 0x7c, - 0x8c, 0x2b, 0xd1, 0x5d, 0x38, 0x21, 0x9c, 0x57, 0x9e, 0x85, 0xc4, 0x1e, - 0x65, 0x47, 0x79, 0x51, 0xcc, 0x09, 0xac, 0x1d, 0xac, 0x0e, 0x09, 0x49, - 0x2f, 0xd0, 0xc1, 0x0e, 0xc9, 0xce, 0xe0, 0xec, 0x52, 0xb6, 0xf8, 0xcc, - 0x11, 0x06, 0x12, 0xee, 0xfa, 0x0f, 0x11, 0x7e, 0x4b, 0xce, 0x3a, 0x4e, - 0xab, 0x9f, 0xef, 0xa5, 0xea, 0x1d, 0xa2, 0x84, 0x82, 0x53, 0xaa, 0xcf, - 0x8e, 0xed, 0xd2, 0xf5, 0x11, 0x05, 0x55, 0xa9, 0x6a, 0x22, 0xf0, 0xdf, - 0xbf, 0x15, 0xac, 0x38, 0x8b, 0x2e, 0xf6, 0x5d, 0xff, 0x04, 0x20, 0xd1, - 0xc1, 0x3e, 0xc3, 0x8f, 0xa2, 0x3f, 0x19, 0xa9, 0xd4, 0x7f, 0xe5, 0xa4, - 0xd3, 0x4d, 0xae, 0xc6, 0x71, 0xb9, 0x28, 0x0e, 0x53, 0x42, 0x33, 0x9a, - 0xb5, 0x68, 0xa1, 0xc0, 0xe6, 0x17, 0xbc, 0x92, 0x43, 0xaf, 0x77, 0xdd, - 0x6e, 0x6e, 0x53, 0xa1, 0x0a, 0xd1, 0x10, 0xe7, 0x0d, 0x45, 0x45, 0x7d, - 0xe7, 0xc9, 0x73, 0x45, 0xfe, 0x70, 0x6f, 0x13, 0xb1, 0xcf, 0x02, 0x82, - 0xea, 0xde, 0x44, 0x70, 0x18, 0xf9, 0x2b, 0xed, 0x02, 0xef, 0x24, 0x3e, - 0x4b, 0xe7, 0x41, 0x60, 0x2f, 0x32, 0x93, 0x36, 0xd9, 0x9c, 0xae, 0x19, - 0xa6, 0x11, 0x24, 0x2d, 0xc2, 0xa0, 0x2c, 0x17, 0x2d, 0xa5, 0xca, 0x4a, - 0xb5, 0xe3, 0xcb, 0x49, 0xa0, 0x8c, 0x29, 0x8b, 0x8e, 0x8e, 0xa0, 0x1b, - 0x59, 0xf2, 0xb8, 0xa6, 0xf3, 0xd5, 0xa1, 0x7a, 0x36, 0x04, 0x58, 0xb0, - 0x9b, 0x30, 0x13, 0x45, 0x36, 0xde, 0x77, 0xfe, 0xc6, 0x06, 0xc5, 0xbf, - 0x7c, 0x82, 0x5b, 0xc2, 0x84, 0xa9, 0xd8, 0xb9, 0xc1, 0x2a, 0xde, 0x9a, - 0x35, 0x45, 0x1b, 0xc5, 0x9b, 0x9d, 0x9c, 0x4c, 0xd6, 0x7f, 0x4c, 0xb1, - 0xc6, 0xa6, 0x90, 0x3b, 0x33, 0xb8, 0xff, 0xfa, 0xdc, 0x76, 0x37, 0xef, - 0xa2, 0x66, 0x50, 0xdb, 0xfc, 0x71, 0xaa, 0x73, 0x98, 0xed, 0xdc, 0x1e, - 0xe0, 0x6f, 0xe6, 0xdd, 0x72, 0x12, 0xaa, 0x2a, 0x6d, 0xd8, 0xa7, 0x9b, - 0x07, 0x45, 0x26, 0x83, 0xce, 0x9a, 0x34, 0xc8, 0xde, 0xc1, 0x8f, 0xcc, - 0x07, 0x22, 0xa9, 0x22, 0x1d, 0xa8, 0x67, 0x7c, 0xff, 0x0e, 0xc9, 0x10, - 0x4e, 0x89, 0x85, 0x14, 0xf8, 0xd9, 0x4c, 0xc3, 0x64, 0xe3, 0xfd, 0x33, - 0x3f, 0xff, 0xd9, 0xe9, 0x20, 0x9b, 0x76, 0x8f, 0xe6, 0xcb, 0xc6, 0x85, - 0x1d, 0xdc, 0xf9, 0xff, 0x8a, 0x4d, 0xb3, 0x94, 0xe1, 0x9f, 0x71, 0xb4, - 0x5e, 0x69, 0x1f, 0x10, 0x93, 0x11, 0x61, 0x31, 0x77, 0x43, 0x11, 0x8a, - 0xef, 0x3d, 0x77, 0x5a, 0x0d, 0x3a, 0x5c, 0x79, 0xb5, 0x74, 0xce, 0xb0, - 0xa0, 0x56, 0x1f, 0x81, 0x39, 0x36, 0xba, 0x05, 0x73, 0xe7, 0x86, 0xda, - 0x40, 0xd3, 0x17, 0x2b, 0xb4, 0x1d, 0xe9, 0x54, 0x61, 0x91, 0x48, 0x6d, - 0x0d, 0x9a, 0x6e, 0xa6, 0x73, 0xa0, 0x0d, 0x26, 0x94, 0xee, 0x46, 0x7d, - 0xc6, 0x41, 0xf7, 0xe8, 0x14, 0xf2, 0xa6, 0xdd, 0xdb, 0xa0, 0x81, 0x46, - 0x8b, 0xdc, 0xb8, 0x56, 0x5a, 0x49, 0x3e, 0x90, 0x68, 0x7c, 0x8f, 0x6e, - 0xe7, 0x9e, 0xee, 0xa1, 0xce, 0xe7, 0xa6, 0xdd, 0xe1, 0x22, 0xbb, 0x08, - 0x9d, 0xd2, 0xe0, 0xe3, 0x17, 0xa8, 0xc5, 0x91, 0x60, 0x18, 0xd5, 0x30, - 0xe2, 0xc5, 0x63, 0x0c, 0x44, 0x23, 0x2b, 0x14, 0xfa, 0xd2, 0xfa, 0x8b, - 0xe9, 0x51, 0x0d, 0x19, 0xb2, 0xa7, 0xf4, 0x5e, 0x85, 0xa8, 0xd0, 0x79, - 0xd8, 0x44, 0x4f, 0xed, 0x9e, 0x07, 0xa0, 0x1f, 0xd5, 0xd5, 0x27, 0x24, - 0x9d, 0x87, 0x93, 0x30, 0xd0, 0x3e, 0x98, 0x6d, 0x64, 0xab, 0xa2, 0xb0, - 0x42, 0xfa, 0x91, 0x85, 0xe2, 0xcc, 0xfe, 0x29, 0xdf, 0x5b, 0x6e, 0x45, - 0x31, 0x27, 0xd7, 0xe2, 0x24, 0x92, 0x59, 0x3e, 0xe8, 0x2f, 0x3f, 0xc6, - 0xe7, 0xd6, 0xf9, 0xfa, 0x1d, 0x4a, 0x3d, 0xbb, 0x6e, 0x58, 0x4f, 0x81, - 0x01, 0x37, 0x73, 0xbb, 0xb9, 0xd3, 0x8e, 0x7a, 0x8a, 0xd0, 0x39, 0x2c, - 0xfa, 0xb9, 0x08, 0x8b, 0x80, 0x3b, 0x59, 0xec, 0x8d, 0xb5, 0xd7, 0x2b, - 0x03, 0x75, 0xaa, 0xfa, 0xc7, 0xd3, 0xbc, 0x48, 0x6b, 0x12, 0xb1, 0xcb, - 0x01, 0x43, 0x9f, 0x92, 0x41, 0xfe, 0xa3, 0xd5, 0xf9, 0xd4, 0x4a, 0x20, - 0x33, 0xd4, 0xb3, 0x18, 0x88, 0x56, 0xed, 0xb3, 0x2f, 0x16, 0xa5, 0x07, - 0x9a, 0x48, 0xb1, 0x0d, 0x54, 0x50, 0xe4, 0x45, 0x24, 0xf0, 0x76, 0xcd, - 0x0e, 0x5c, 0x4a, 0x7f, 0xa9, 0x7b, 0xbf, 0x5f, 0x6a, 0xa3, 0xa6, 0x5c, - 0xe1, 0xb0, 0xb3, 0xe1, 0xc1, 0xd5, 0x6b, 0x4e, 0xcf, 0x67, 0xd2, 0x36, - 0x88, 0x4d, 0xa5, 0xe9, 0x5f, 0xd0, 0x85, 0xb6, 0x26, 0xe8, 0x0d, 0x11, - 0xc6, 0x7b, 0x7b, 0x62, 0xa7, 0xa0, 0x33, 0x40, 0xad, 0x35, 0x20, 0x49, - 0xf0, 0x27, 0x0a, 0x65, 0x84, 0xc5, 0xd2, 0x4f, 0x3e, 0xcb, 0xe3, 0x04, - 0x03, 0xe3, 0x91, 0x1a, 0x7e, 0x62, 0x96, 0x9f, 0x43, 0x5a, 0xe4, 0xa8, - 0x8b, 0x78, 0x52, 0x3a, 0x29, 0x50, 0x4c, 0xa5, 0x6d, 0xf5, 0x6e, 0x26, - 0x9f, 0x55, 0xc5, 0x10, 0xbe, 0xf9, 0xab, 0x37, 0x36, 0xbd, 0x6e, 0x10, - 0xc4, 0xdc, 0xbc, 0x56, 0x72, 0x6e, 0x68, 0xbd, 0xf8, 0xee, 0xc8, 0xde, - 0x5e, 0xf7, 0x2e, 0x90, 0x05, 0xb4, 0x2b, 0x84, 0x9a, 0x3a, 0x3d, 0x46, - 0xbe, 0xb8, 0xd4, 0xd1, 0xb3, 0x60, 0xc0, 0x40, 0x53, 0x62, 0x28, 0x40, - 0xcc, 0xc7, 0x9b, 0xe1, 0xd5, 0x9a, 0x3f, 0xfa, 0xb9, 0x75, 0x49, 0x15, - 0x57, 0x39, 0xb0, 0x6f, 0x2a, 0x54, 0x80, 0x05, 0x29, 0xbd, 0xb8, 0x92, - 0x91, 0x63, 0xd3, 0x09, 0x93, 0xab, 0x8a, 0x74, 0xf9, 0xc3, 0x63, 0x00, - 0x6c, 0xd5, 0xe3, 0xc1, 0xd7, 0xa0, 0x1d, 0x8d, 0xea, 0x4a, 0xb2, 0x4c, - 0xdb, 0x63, 0x8f, 0x12, 0xf3, 0x9c, 0x90, 0x7d, 0x32, 0xd0, 0xb9, 0x96, - 0xfd, 0x57, 0x58, 0xdc, 0x26, 0xa5, 0x7b, 0x6a, 0xf2, 0x32, 0x79, 0xbe, - 0x0d, 0x21, 0x4e, 0xe6, 0x71, 0xd0, 0x08, 0x2f, 0xb9, 0x13, 0x01, 0x23, - 0xa0, 0xe7, 0x63, 0x99, 0x3f, 0x3c, 0x0b, 0x57, 0x7f, 0x27, 0x7c, 0x4c, - 0x44, 0xa3, 0xae, 0xef, 0xdb, 0xd1, 0xc8, 0xf4, 0xa2, 0xa1, 0xc6, 0x3c, - 0x7d, 0x51, 0xce, 0xff, 0x50, 0xb3, 0x19, 0x60, 0x50, 0xbd, 0x7b, 0x59, - 0x40, 0x1b, 0x73, 0x2d, 0x39, 0xa2, 0xd5, 0xd5, 0x0f, 0x9d, 0xd8, 0x9d, - 0x37, 0xb8, 0x87, 0xc5, 0x28, 0x11, 0x2c, 0x19, 0x97, 0x15, 0x53, 0xfb, - 0x81, 0x46, 0x89, 0x93, 0xf4, 0x58, 0xc0, 0xc4, 0x34, 0xf3, 0x34, 0xa7, - 0x7e, 0xec, 0x57, 0x09, 0x83, 0xf2, 0x6d, 0x2f, 0x54, 0xf6, 0x0b, 0x99, - 0xe1, 0xac, 0x5d, 0x4e, 0xde, 0xdb, 0x15, 0x46, 0x05, 0x18, 0xb4, 0x2d, - 0x4d, 0xca, 0x18, 0xbb, 0x66, 0xa3, 0x49, 0x3a, 0x22, 0x7b, 0x3f, 0x18, - 0x5e, 0x40, 0xe6, 0xd2, 0x42, 0xa1, 0x8e, 0x38, 0x52, 0xb7, 0xc3, 0x53, - 0x33, 0x92, 0xc7, 0xb1, 0x08, 0x61, 0x65, 0x8c, 0xa2, 0xd7, 0x28, 0xb6, - 0x7d, 0xd2, 0xd1, 0xf0, 0xc6, 0xd8, 0x05, 0x74, 0x07, 0xa9, 0x61, 0x18, - 0x7a, 0xb5, 0x03, 0x1d, 0x4d, 0xf9, 0x8a, 0xa9, 0x47, 0xfd, 0x3e, 0xf3, - 0xa0, 0x89, 0x22, 0xf9, 0x8c, 0xe8, 0x3a, 0xdd, 0xb4, 0xca, 0x12, 0x85, - 0x4c, 0xb9, 0x0d, 0x37, 0x0a, 0xe2, 0xe2, 0x2e, 0xa5, 0x93, 0xb4, 0x9a, - 0x16, 0xfc, 0x53, 0x48, 0xed, 0xbc, 0x49, 0xa2, 0x78, 0x3b, 0x90, 0xdf, - 0xa5, 0xdf, 0xc1, 0xba, 0x30, 0x96, 0x5b, 0x97, 0x7a, 0x84, 0x80, 0xa9, - 0xea, 0x99, 0x19, 0xd9, 0x4d, 0x74, 0x0a, 0x63, 0x3d, 0x1c, 0xc9, 0xf8, - 0x66, 0x02, 0x7a, 0xae, 0xa8, 0xdb, 0x8c, 0xc4, 0x39, 0x92, 0x6c, 0xc3, - 0xcc, 0xdb, 0x2d, 0xa3, 0x4d, 0x21, 0xca, 0xee, 0xd4, 0x20, 0x80, 0xd7, - 0xb6, 0x54, 0x10, 0xba, 0x6e, 0x55, 0xe1, 0x02, 0xe0, 0x63, 0x54, 0x3e, - 0xf7, 0xd4, 0x28, 0x7a, 0x54, 0x61, 0xda, 0x2c, 0x87, 0x31, 0x15, 0x0d, - 0xfe, 0x4e, 0x53, 0xf0, 0x20, 0x98, 0xf0, 0x8d, 0x3b, 0x46, 0x19, 0x41, - 0x59, 0xa8, 0x64, 0xac, 0x81, 0x29, 0x62, 0x01, 0xae, 0xd1, 0x4f, 0x02, - 0xef, 0x4c, 0x34, 0xb6, 0xb1, 0xcc, 0x11, 0x98, 0x49, 0xdc, 0xf3, 0xa9, - 0xd4, 0xfa, 0xfc, 0x7f, 0x15, 0xed, 0xd3, 0xea, 0x6d, 0x90, 0x92, 0xb5, - 0x26, 0x6a, 0x34, 0xc7, 0xdd, 0x69, 0x17, 0x04, 0xa6, 0xc3, 0x91, 0x6b, - 0xaf, 0xb7, 0x5a, 0xca, 0x6b, 0x9a, 0x62, 0x0d, 0xfe, 0x2c, 0x2c, 0x82, - 0x6d, 0xc0, 0x5f, 0x15, 0x0e, 0x9f, 0xd6, 0x57, 0x12, 0x83, 0x85, 0x2d, - 0x6a, 0x07, 0x71, 0xba, 0xbc, 0x5a, 0x62, 0x7c, 0x40, 0xca, 0x61, 0x99, - 0x5c, 0x28, 0x23, 0x9d, 0x3b, 0x29, 0x7f, 0x96, 0x2c, 0x9c, 0xcb, 0x9f, - 0xee, 0x06, 0x63, 0xfb, 0xb1, 0x33, 0xc2, 0xec, 0x9d, 0xdd, 0xcb, 0xb1, - 0xd6, 0xd8, 0x8c, 0x35, 0xb4, 0x2b, 0xf9, 0x03, 0x1d, 0x1f, 0xad, 0xf6, - 0x74, 0xba, 0x6b, 0xa8, 0xbb, 0xf3, 0x00, 0x43, 0x2a, 0xa5, 0x16, 0x6b, - 0x3b, 0xb5, 0x3f, 0xac, 0x5e, 0x0c, 0x70, 0x96, 0x80, 0x23, 0x79, 0x15, - 0x6a, 0x87, 0x72, 0xe7, 0xee, 0x57, 0x18, 0x65, 0x91, 0xf6, 0xd0, 0x43, - 0x5a, 0x00, 0xc7, 0xf2, 0xdf, 0xe4, 0xcb, 0xea, 0x20, 0x7d, 0x50, 0xa4, - 0x3b, 0xfa, 0x85, 0xdb, 0x45, 0xe5, 0xd9, 0xb6, 0x48, 0x54, 0x4a, 0xab, - 0x67, 0xf2, 0x68, 0x50, 0x98, 0xb6, 0xdf, 0xa6, 0xbb, 0x3c, 0x39, 0x7b, - 0x09, 0x2c, 0x9d, 0x60, 0xbc, 0x1d, 0xb1, 0x8d, 0x10, 0x39, 0x54, 0x8d, - 0xb2, 0xf1, 0x48, 0xce, 0x54, 0xf6, 0x48, 0x55, 0xab, 0xeb, 0x81, 0x87, - 0xc4, 0x3c, 0xaf, 0x47, 0x1d, 0xb6, 0xd0, 0x08, 0xba, 0x13, 0x46, 0xb2, - 0x50, 0xbd, 0xe2, 0xe5, 0xae, 0xb9, 0x79, 0x47, 0xed, 0x3d, 0x9b, 0x0e, - 0x17, 0x40, 0xab, 0x7c, 0x08, 0xc1, 0x6b, 0x57, 0xa0, 0xba, 0x9b, 0x48, - 0xa7, 0xd2, 0xfa, 0xc3, 0x35, 0xce, 0xbd, 0xc5, 0x77, 0x2b, 0xbb, 0x91, - 0x1a, 0x8a, 0x4a, 0xe8, 0x3f, 0x05, 0xef, 0xf4, 0x6b, 0x2e, 0xac, 0xd9, - 0xc8, 0x9e, 0x30, 0xb2, 0x4b, 0xea, 0x8e, 0x61, 0x98, 0x4f, 0x93, 0x7c, - 0x1d, 0xa6, 0xa0, 0xc2, 0x77, 0xd9, 0xe8, 0xfc, 0x8f, 0x6c, 0xb7, 0xed, - 0xd4, 0x70, 0x26, 0xf5, 0x61, 0x3a, 0xd4, 0x09, 0x07, 0x42, 0x41, 0x10, - 0x4f, 0x4b, 0x2f, 0xc7, 0xec, 0x4f, 0xe4, 0xdc, 0xa6, 0xdb, 0xb3, 0xcc, - 0xfc, 0x0f, 0x3d, 0xba, 0x03, 0x91, 0x3d, 0xac, 0x69, 0xfa, 0x7e, 0x4f, - 0xeb, 0x23, 0x5c, 0x5a, 0x55, 0x7e, 0xaa, 0x36, 0xd6, 0xc9, 0x9d, 0x24, - 0x1f, 0x21, 0x61, 0xe5, 0xfb, 0xde, 0x89, 0x8c, 0x38, 0xb1, 0x86, 0x9a, - 0x88, 0x49, 0x53, 0xcf, 0x14, 0xdf, 0x92, 0x0a, 0xd3, 0x42, 0x67, 0x11, - 0x9b, 0x1c, 0xa8, 0x41, 0x68, 0xda, 0x77, 0x71, 0xb5, 0x6d, 0x47, 0x5f, - 0x25, 0xa1, 0x50, 0xb4, 0xb0, 0x4a, 0x0d, 0x2f, 0x2b, 0x8a, 0x4a, 0x5f, - 0x06, 0x6c, 0x6f, 0x4e, 0x8c, 0x44, 0x69, 0x5e, 0x3f, 0xed, 0x4a, 0x5c, - 0x88, 0x5d, 0x0f, 0x48, 0xea, 0x53, 0x9b, 0x63, 0x2e, 0xf3, 0x78, 0x3e, - 0xa7, 0xb0, 0x12, 0xcd, 0x64, 0xfb, 0x88, 0x24, 0x37, 0x8c, 0xb0, 0x57, - 0x52, 0x20, 0xe2, 0x3e, 0xf8, 0x68, 0x98, 0x6c, 0x40, 0x56, 0x76, 0xfb, - 0xd1, 0xde, 0x18, 0x24, 0xf4, 0x21, 0x65, 0x68, 0xe9, 0x49, 0x0d, 0xdc, - 0xa9, 0x96, 0xe8, 0x1a, 0x48, 0xc0, 0x28, 0x84, 0x56, 0x89, 0x2c, 0xf6, - 0xe3, 0xb7, 0x35, 0xc2, 0xf0, 0x66, 0x78, 0x2c, 0x0e, 0xb5, 0xac, 0xe1, - 0x51, 0xac, 0x78, 0x97, 0xd9, 0xb7, 0xfb, 0x31, 0x0e, 0xee, 0x12, 0xa4, - 0x41, 0x67, 0x28, 0xdf, 0x78, 0xb4, 0x71, 0x10, 0x8b, 0xe6, 0x35, 0x05, - 0x04, 0x57, 0xde, 0xdd, 0x60, 0x9d, 0xaa, 0xd6, 0x07, 0x93, 0x96, 0x96, - 0x1b, 0xf9, 0xe2, 0xf2, 0x23, 0x3e, 0x68, 0x82, 0x99, 0x65, 0x3a, 0x51, - 0x91, 0x51, 0x46, 0x58, 0x4a, 0xf4, 0xd3, 0xa0, 0xc3, 0x21, 0xfd, 0x07, - 0x43, 0x33, 0x03, 0xaa, 0x3f, 0x0c, 0x16, 0x02, 0xb5, 0x2c, 0x8e, 0xe8, - 0xa0, 0x7e, 0x22, 0xd2, 0x0b, 0x80, 0x64, 0xe7, 0x11, 0x6c, 0xfa, 0x20, - 0x17, 0x1c, 0x7e, 0x20, 0x91, 0x17, 0x5e, 0x66, 0xa3, 0xc8, 0x05, 0x66, - 0x5c, 0x96, 0x81, 0xac, 0xc3, 0x54, 0x4c, 0x05, 0xe5, 0x65, 0x21, 0x5a, - 0x87, 0xc0, 0x50, 0x08, 0xaa, 0x9a, 0x4a, 0x22, 0x7b, 0x3b, 0x6c, 0x67, - 0x21, 0xa9, 0x22, 0xef, 0xeb, 0x5c, 0x6d, 0x97, 0xf3, 0x5b, 0x7e, 0x07, - 0xe7, 0x74, 0x1d, 0xd8, 0xf5, 0x14, 0x09, 0x71, 0xa3, 0xab, 0x9a, 0x91, - 0x18, 0xc3, 0x03, 0x03, 0xa2, 0x9d, 0xa9, 0x1a, 0x44, 0x93, 0x50, 0x95, - 0xd0, 0xca, 0x5a, 0xfe, 0xa7, 0x40, 0xf5, 0xae, 0xcc, 0x88, 0x5a, 0xa5, - 0xfe, 0xe4, 0x9c, 0x5a, 0x28, 0x26, 0xe6, 0xb4, 0xb1, 0xa8, 0x80, 0xa2, - 0xe1, 0xbb, 0xe5, 0xa4, 0x2d, 0x7d, 0x9a, 0xfd, 0xcc, 0x66, 0x30, 0xf8, - 0xf5, 0x9a, 0x16, 0xa7, 0x4f, 0xdf, 0x7b, 0x39, 0xdb, 0x8d, 0x21, 0xdd, - 0x05, 0xc7, 0xd4, 0x4c, 0xaa, 0xce, 0x9a, 0xd0, 0x2c, 0xd6, 0x7d, 0xf1, - 0x3b, 0x23, 0x20, 0x50, 0xcf, 0x4a, 0xd9, 0xc5, 0x99, 0xb6, 0xe9, 0xb8, - 0x4d, 0x44, 0x0f, 0x46, 0xe0, 0xe4, 0x11, 0xbb, 0x22, 0xdf, 0x9d, 0xc0, - 0x33, 0x38, 0xaf, 0x0f, 0x3d, 0xf4, 0xe0, 0x4b, 0x49, 0x7f, 0xdf, 0x61, - 0x64, 0x7e, 0x84, 0x7e, 0x07, 0xe1, 0x7a, 0x00, 0x55, 0xf2, 0x80, 0xa9, - 0x2e, 0x29, 0x78, 0x2d, 0xe9, 0x0f, 0x31, 0x21, 0xd8, 0x7b, 0xc0, 0x9c, - 0x74, 0xec, 0x6e, 0xaa, 0xf6, 0x04, 0xb7, 0x67, 0x97, 0xfb, 0x21, 0xc6, - 0x94, 0xcc, 0xdb, 0xe2, 0x9b, 0x59, 0x98, 0x84, 0x6d, 0xc6, 0xac, 0xdb, - 0xc0, 0xed, 0x48, 0x98, 0xc0, 0x7d, 0xa3, 0xe3, 0x96, 0xa6, 0x15, 0xc9, - 0x33, 0x63, 0x28, 0xf4, 0x30, 0x47, 0x75, 0x50, 0xf5, 0xeb, 0x82, 0xd3, - 0xd3, 0xa6, 0x5a, 0xf0, 0x18, 0xd6, 0x19, 0x56, 0xb1, 0x5d, 0x2a, 0x71, - 0x90, 0x41, 0xef, 0xa1, 0x97, 0x97, 0xec, 0x6d, 0x46, 0x79, 0x2c, 0xf0, - 0xc5, 0xe2, 0x81, 0xa1, 0xea, 0xa5, 0x51, 0x06, 0xb0, 0x60, 0x06, 0x34, - 0x82, 0x54, 0x50, 0x4f, 0xa4, 0x0b, 0x3b, 0x6e, 0xf0, 0xe0, 0x4a, 0x90, - 0x48, 0x73, 0x69, 0xe4, 0xb7, 0x0b, 0xdc, 0xa5, 0xd9, 0xf7, 0x4c, 0x7c, - 0x7e, 0xe9, 0x35, 0x97, 0x2a, 0x65, 0x38, 0xee, 0xec, 0x68, 0xa4, 0x17, - 0x1f, 0xa7, 0x95, 0xc8, 0xfd, 0x25, 0x7d, 0x1d, 0xf0, 0xb7, 0x31, 0x5f, - 0xe5, 0xc4, 0x58, 0x61, 0x69, 0x45, 0xac, 0xb9, 0x65, 0xd0, 0xb2, 0x6d, - 0xd9, 0x69, 0xdc, 0x29, 0x17, 0xaf, 0xf0, 0x10, 0x4f, 0xe6, 0xa3, 0x8a, - 0x74, 0x02, 0xd0, 0x1b, 0xbd, 0x33, 0xe2, 0x59, 0xbf, 0x36, 0xca, 0x32, - 0x5c, 0xc4, 0x96, 0x0e, 0x65, 0x3d, 0xc3, 0xbc, 0xea, 0x7a, 0x6c, 0x6b, - 0x6e, 0x82, 0xdf, 0x20, 0x9b, 0x73, 0x2f, 0x24, 0x56, 0x22, 0x47, 0xdb, - 0xba, 0x6d, 0x7b, 0xbc, 0x26, 0x14, 0xfa, 0x16, 0x80, 0xf6, 0x6c, 0x06, - 0x1f, 0x3c, 0x95, 0xfe, 0x6b, 0xe6, 0xd8, 0x12, 0xf0, 0x11, 0x9f, 0xca, - 0x5c, 0xd7, 0x85, 0x14, 0x97, 0x4f, 0xf2, 0x47, 0xd0, 0x30, 0x2e, 0x28, - 0x4d, 0x32, 0xce, 0x74, 0x0d, 0x10, 0xe4, 0xd4, 0x59, 0x5d, 0xa6, 0xc3, - 0x8d, 0x0e, 0x37, 0x27, 0xa7, 0x83, 0x1c, 0x7a, 0xb7, 0x32, 0x1a, 0xf9, - 0x34, 0x2c, 0x26, 0xe9, 0x8b, 0x95, 0xcd, 0x2f, 0x87, 0xa9, 0xcc, 0xb2, - 0x3d, 0x40, 0x96, 0x52, 0x0e, 0x42, 0x07, 0xf7, 0x8d, 0x02, 0x22, 0x7f, - 0x86, 0x79, 0x6f, 0x8c, 0xe8, 0x1f, 0x5e, 0x6c, 0x1a, 0xb2, 0x5b, 0x66, - 0x71, 0x10, 0x3b, 0xac, 0x86, 0x62, 0x09, 0x65, 0x36, 0x52, 0x9a, 0x80, - 0x9d, 0x80, 0x29, 0x4d, 0xf3, 0x0b, 0x47, 0xfb, 0x7c, 0x4b, 0x7e, 0xaf, - 0x39, 0x65, 0x79, 0x9f, 0x33, 0x78, 0xaa, 0x34, 0x65, 0x3f, 0x88, 0x68, - 0x89, 0x31, 0xcd, 0x94, 0xd7, 0x4e, 0xdf, 0xe0, 0x1c, 0x14, 0x8b, 0xa5, - 0xd0, 0x77, 0x0a, 0x46, 0xc0, 0x8e, 0xae, 0x54, 0xa1, 0xa7, 0xdb, 0xfb, - 0x79, 0x9a, 0x14, 0x13, 0x82, 0x76, 0xa3, 0x2c, 0xfc, 0xd4, 0x76, 0x81, - 0x8c, 0x46, 0x1a, 0x97, 0x22, 0x59, 0x42, 0x63, 0x2e, 0x46, 0xdb, 0xfe, - 0x24, 0x36, 0x7b, 0x8d, 0x23, 0x6a, 0x77, 0x83, 0xd8, 0x72, 0xb4, 0x8c, - 0x68, 0x59, 0x87, 0x73, 0xc4, 0xca, 0x24, 0x1f, 0x9b, 0x98, 0xcc, 0x19, - 0xab, 0xc2, 0xa3, 0x84, 0x07, 0x90, 0x2e, 0x45, 0x67, 0x52, 0x50, 0x6e, - 0xed, 0x7e, 0xdd, 0x08, 0x49, 0xcf, 0x9f, 0xfe, 0x1b, 0x3b, 0xa8, 0x8b, - 0xd1, 0x37, 0x4b, 0x4e, 0xda, 0x4e, 0xbc, 0xf9, 0x8d, 0xed, 0x76, 0x96, - 0x72, 0x3e, 0xce, 0x16, 0x2d, 0xcb, 0x20, 0x3e, 0x1c, 0xcc, 0x8f, 0xa5, - 0x1b, 0xd5, 0x78, 0x61, 0x74, 0x49, 0x51, 0x22, 0xf8, 0x78, 0xc2, 0x37, - 0x7d, 0x40, 0x1d, 0xd4, 0x3f, 0xcb, 0x70, 0x95, 0x8b, 0x15, 0xac, 0x00, - 0x2c, 0x44, 0xfd, 0x67, 0xa6, 0x41, 0x63, 0x28, 0x9c, 0x85, 0x99, 0x05, - 0x18, 0xb2, 0x2f, 0x2c, 0xb3, 0xe8, 0x8d, 0xf8, 0x91, 0x22, 0x32, 0x94, - 0xe4, 0x7f, 0xac, 0xb0, 0xf9, 0x6f, 0x5d, 0xa9, 0xda, 0xa2, 0x2f, 0xc4, - 0x36, 0x6c, 0x2c, 0x6f, 0xa5, 0x1d, 0xb5, 0x74, 0x0e, 0x70, 0x09, 0x04, - 0xcb, 0xc2, 0xa4, 0x91, 0x6f, 0x91, 0x8b, 0x4f, 0x99, 0x53, 0xe3, 0x6a, - 0x5e, 0x0f, 0x4d, 0x00, 0xd0, 0x90, 0x8a, 0x00, 0xfb, 0xc7, 0x26, 0x9c, - 0xa5, 0xab, 0x07, 0xd8, 0x09, 0xaf, 0x88, 0xd8, 0x27, 0x22, 0x41, 0x3b, - 0x2b, 0x0f, 0xfa, 0x56, 0x3e, 0x4b, 0xb1, 0x9c, 0x5b, 0xb9, 0xe6, 0xe0, - 0x5f, 0x71, 0x5c, 0x17, 0x6f, 0x37, 0xee, 0x73, 0x9a, 0xe0, 0x43, 0xf6, - 0x40, 0xcd, 0x6d, 0x6d, 0x4f, 0x6d, 0x81, 0xfe, 0x59, 0x51, 0x8e, 0xcc, - 0x58, 0x08, 0x2e, 0x42, 0x50, 0x78, 0x91, 0x6a, 0x7a, 0xec, 0x85, 0xcf, - 0x9d, 0x25, 0x8e, 0xdc, 0x4f, 0x6d, 0xc2, 0x70, 0x83, 0x77, 0xe1, 0x2a, - 0xe4, 0x09, 0x5d, 0xa4, 0x93, 0xcf, 0xcb, 0x65, 0x2c, 0xd1, 0x6f, 0xa3, - 0x55, 0x13, 0x9e, 0x2c, 0xea, 0xbc, 0x0a, 0x79, 0xbd, 0xfb, 0xd0, 0x81, - 0x49, 0x21, 0x64, 0x5a, 0xad, 0xb7, 0x8f, 0x93, 0xd7, 0xe2, 0x50, 0xc3, - 0x03, 0xe3, 0x42, 0xbc, 0xa4, 0x67, 0x84, 0x35, 0x73, 0xca, 0x9f, 0x9a, - 0xce, 0x1e, 0xe1, 0xfe, 0xa5, 0xf4, 0x59, 0xdd, 0xba, 0x08, 0x94, 0x66, - 0x53, 0xb5, 0xd1, 0xc0, 0x27, 0xd7, 0xf1, 0x50, 0x4d, 0x0f, 0x5d, 0xce, - 0x31, 0x9c, 0x10, 0xc8, 0x29, 0x8e, 0x5c, 0x8d, 0x78, 0xc4, 0xad, 0xf6, - 0xbe, 0x5c, 0x71, 0xce, 0xd1, 0xde, 0x90, 0x0c, 0xb2, 0x34, 0x51, 0x01, - 0xbe, 0xe2, 0x24, 0x0f, 0xe0, 0x27, 0x81, 0x13, 0x25, 0xe0, 0x6c, 0x72, - 0x6f, 0x97, 0x06, 0xa8, 0x1a, 0x7d, 0x0b, 0xa5, 0xa6, 0x1c, 0x97, 0xe5, - 0xff, 0x24, 0xc5, 0xca, 0x90, 0xbd, 0x90, 0x7e, 0x4c, 0xb7, 0xcf, 0x6d, - 0x8d, 0x31, 0xe2, 0x4f, 0xd2, 0xc7, 0xb1, 0x5f, 0x7e, 0x1d, 0xb4, 0xd3, - 0x5d, 0x00, 0x1d, 0x68, 0xfb, 0x8d, 0x65, 0xa4, 0x9f, 0x60, 0x47, 0x42, - 0xfe, 0x75, 0x67, 0xb8, 0xb3, 0xe1, 0x4e, 0xa5, 0x04, 0x7c, 0xcc, 0xaa, - 0x2e, 0xf8, 0x89, 0x3f, 0x32, 0x91, 0x18, 0xee, 0x77, 0x62, 0x39, 0xd3, - 0x9a, 0x1e, 0x83, 0x0f, 0xa2, 0x6d, 0xa4, 0x0c, 0x8a, 0xde, 0x4a, 0xf3, - 0x28, 0x19, 0x54, 0x26, 0x1f, 0x86, 0x83, 0x5b, 0xc3, 0xed, 0x3f, 0x57, - 0xab, 0x17, 0x54, 0xab, 0xcf, 0xfd, 0x81, 0x66, 0xe4, 0x28, 0x7e, 0x18, - 0x0e, 0xda, 0x9b, 0xb0, 0x64, 0xcc, 0x85, 0xbd, 0x52, 0xdd, 0x28, 0x73, - 0x64, 0x43, 0x64, 0xe6, 0x1c, 0xdf, 0x2e, 0xae, 0xee, 0xd6, 0x50, 0x92, - 0x08, 0xdf, 0xf8, 0x59, 0xd8, 0xee, 0xec, 0x2f, 0x10, 0x57, 0x8c, 0xa8, - 0xf9, 0xbc, 0x12, 0xdb, 0x0d, 0x1d, 0x1e, 0x49, 0xbc, 0x3c, 0x3b, 0x16, - 0x41, 0xc9, 0x6f, 0x99, 0xa4, 0x57, 0x6b, 0xd1, 0xfb, 0x0b, 0xca, 0xdc, - 0x74, 0x54, 0xb2, 0x7d, 0x68, 0x0b, 0xab, 0xc4, 0x0d, 0x5a, 0xf1, 0x3a, - 0xca, 0xa9, 0x60, 0x7f, 0x62, 0xec, 0x80, 0xed, 0xc4, 0x62, 0xe8, 0xf6, - 0x1c, 0xd1, 0x39, 0x33, 0x2a, 0x24, 0xa7, 0x76, 0x45, 0x1a, 0x30, 0xa9, - 0x07, 0x17, 0x6c, 0xb4, 0x74, 0x57, 0x9c, 0x3c, 0x76, 0x00, 0x8c, 0xfc, - 0xb8, 0x4d, 0x8c, 0x5a, 0x2c, 0x55, 0x9d, 0xcc, 0x04, 0x3d, 0x40, 0x76, - 0xbb, 0x12, 0x83, 0x54, 0x02, 0xb2, 0x87, 0x44, 0x06, 0x11, 0x29, 0xcd, - 0x1b, 0x98, 0x52, 0xf1, 0x72, 0x8d, 0xad, 0xbf, 0xfb, 0x12, 0xc2, 0x89, - 0x93, 0xc8, 0xb5, 0x01, 0xe4, 0xeb, 0x35, 0x3b, 0xde, 0x7f, 0x71, 0x37, - 0xc8, 0xc1, 0xe9, 0x17, 0x76, 0x3c, 0x24, 0xb1, 0x5d, 0x88, 0x28, 0xef, - 0x30, 0xd8, 0xac, 0x69, 0xf8, 0xc6, 0x89, 0xc8, 0xc0, 0xd0, 0x35, 0xf9, - 0x97, 0xa8, 0x71, 0x2e, 0x84, 0x14, 0x26, 0x74, 0x09, 0x31, 0xcd, 0x94, - 0xdb, 0xb7, 0x33, 0xb3, 0xf0, 0x06, 0x3d, 0xff, 0x25, 0xf5, 0xfd, 0x8a, - 0x2b, 0x04, 0x29, 0x58, 0xdd, 0xf0, 0x54, 0x3d, 0xbe, 0x0a, 0x65, 0x29, - 0x1f, 0xf4, 0x06, 0xe4, 0x50, 0x41, 0x4c, 0x93, 0x62, 0x84, 0xbc, 0x85, - 0xe5, 0x8d, 0x40, 0x62, 0x9d, 0x2f, 0xbd, 0xa0, 0xbf, 0xad, 0xf8, 0x53, - 0x3b, 0x35, 0xbf, 0x37, 0x53, 0xc2, 0xa2, 0xf4, 0xe0, 0x22, 0xf6, 0x8d, - 0x7b, 0x15, 0xa9, 0xf8, 0x87, 0xf4, 0x23, 0xc4, 0x4d, 0xf7, 0x6a, 0x24, - 0xa8, 0xcb, 0x6a, 0xb7, 0x11, 0xbb, 0xcb, 0xab, 0x78, 0x08, 0x32, 0x95, - 0xa7, 0xb3, 0x44, 0xc6, 0x4d, 0x9c, 0xa0, 0x64, 0x21, 0x0e, 0x0b, 0x60, - 0x48, 0xd9, 0x26, 0x56, 0x1c, 0x05, 0xa8, 0xf5, 0x79, 0xb6, 0xab, 0xc5, - 0x70, 0xa9, 0xc4, 0x0c, 0x12, 0xf7, 0xcf, 0x05, 0x1d, 0x4e, 0x3e, 0xa5, - 0x08, 0xb0, 0xdc, 0xd6, 0x46, 0x3e, 0xed, 0x1b, 0xef, 0x4e, 0x5b, 0x91, - 0x13, 0x9b, 0x57, 0x67, 0x6f, 0xf2, 0x90, 0x75, 0xce, 0xc8, 0x15, 0xb3, - 0x8a, 0xcb, 0x15, 0xa2, 0x18, 0xa3, 0x79, 0xc0, 0xb1, 0x01, 0x57, 0x79, - 0x77, 0x00, 0x7b, 0x80, 0x1d, 0xc9, 0x9e, 0xa5, 0x61, 0x88, 0x6b, 0x0b, - 0x18, 0x75, 0x08, 0xfe, 0x3c, 0xb3, 0xde, 0xaa, 0x7e, 0x94, 0xeb, 0xb1, - 0x3d, 0x45, 0x17, 0xc7, 0xd5, 0xff, 0xca, 0xa6, 0x8c, 0xc8, 0xaf, 0x4d, - 0xbf, 0x0c, 0xe3, 0x24, 0x54, 0x27, 0x74, 0x11, 0x73, 0xfd, 0x39, 0xd2, - 0xc0, 0x7f, 0x48, 0x78, 0xd9, 0x29, 0xea, 0x47, 0x80, 0x7b, 0x0a, 0x63, - 0x6d, 0x4e, 0x34, 0x28, 0x17, 0xe2, 0xb7, 0x50, 0x2a, 0xac, 0xe0, 0xce, - 0x34, 0xba, 0x95, 0xa2, 0xb0, 0x0c, 0x2f, 0xc8, 0xb1, 0x36, 0x21, 0x77, - 0xeb, 0xa7, 0x9c, 0xa1, 0xea, 0xd8, 0x15, 0xae, 0x16, 0x74, 0x32, 0x06, - 0x27, 0xc2, 0xb9, 0x86, 0x9d, 0x58, 0x9d, 0x25, 0x42, 0x67, 0x81, 0x64, - 0xd6, 0xec, 0x5e, 0xe6, 0x33, 0x58, 0xd0, 0x03, 0x99, 0x05, 0x1b, 0xc6, - 0x77, 0x48, 0x28, 0x6d, 0xa1, 0xcf, 0x5a, 0x59, 0x3b, 0x47, 0xc3, 0xc0, - 0x68, 0x56, 0x96, 0x6b, 0xe6, 0xff, 0xfd, 0xd3, 0xb6, 0x23, 0x9d, 0x51, - 0x8c, 0xbd, 0xbd, 0x39, 0xa6, 0xff, 0xa2, 0x2e, 0x18, 0x98, 0x46, 0x7c, - 0x4a, 0xe0, 0xef, 0xe0, 0xf8, 0x12, 0x70, 0x3a, 0x87, 0x16, 0xa6, 0x36, - 0xb7, 0xca, 0xa4, 0xfb, 0xc6, 0x96, 0x0c, 0xb7, 0x86, 0x8a, 0x95, 0xd2, - 0x52, 0xc6, 0x6b, 0x0b, 0x7e, 0x8a, 0x85, 0x0a, 0xb8, 0xdd, 0xd9, 0xbc, - 0x07, 0x7e, 0x0e, 0x7a, 0x85, 0x3e, 0x28, 0xaa, 0x4e, 0x4d, 0x47, 0x33, - 0xa4, 0x76, 0xe2, 0xd1, 0x45, 0x5e, 0x16, 0x7f, 0x5d, 0xd1, 0x47, 0xba, - 0x88, 0x0c, 0x0c, 0x54, 0xc9, 0x15, 0xe6, 0x2e, 0xd5, 0x26, 0x6f, 0xe8, - 0x37, 0xe1, 0xdc, 0xe2, 0xc5, 0x96, 0x60, 0xd5, 0xff, 0x2a, 0x4b, 0x8e, - 0x5f, 0x95, 0x44, 0x46, 0xe3, 0x62, 0x77, 0xf9, 0x25, 0x9f, 0x26, 0x72, - 0xf1, 0x43, 0xc8, 0x7d, 0xf9, 0xcf, 0x8a, 0xab, 0x16, 0x4d, 0x8c, 0x99, - 0xc0, 0x8f, 0xd4, 0x7f, 0x59, 0x1d, 0xd6, 0x5e, 0x10, 0x12, 0x23, 0x89, - 0xa2, 0x89, 0xf6, 0xdf, 0xe2, 0x33, 0x2a, 0x8f, 0x36, 0x90, 0xc7, 0xb7, - 0xdf, 0xae, 0x1c, 0x58, 0xa7, 0x84, 0x4e, 0x09, 0xbf, 0x7d, 0xda, 0x41, - 0x96, 0xc0, 0x14, 0xa3, 0xe1, 0x8e, 0xd7, 0x80, 0x1e, 0xcd, 0x7a, 0xc1, - 0x8a, 0x41, 0x95, 0xed, 0x36, 0xb1, 0xfc, 0x2b, 0x19, 0xd6, 0x83, 0xe0, - 0xa8, 0x2d, 0x89, 0xb1, 0x04, 0x42, 0xd0, 0x7b, 0xdb, 0x04, 0x8d, 0xcd, - 0xd0, 0xc7, 0xb5, 0x4d, 0x1c, 0x11, 0xd2, 0xbd, 0x57, 0x21, 0xf1, 0x86, - 0xa5, 0x0c, 0x90, 0x02, 0xe2, 0x60, 0x6c, 0x27, 0xf1, 0x88, 0x3d, 0x3d, - 0xba, 0x93, 0xa6, 0x67, 0x8a, 0x13, 0x96, 0x0f, 0x69, 0x29, 0xd7, 0x42, - 0x53, 0x58, 0xae, 0x5c, 0x9c, 0xab, 0x3c, 0xd9, 0x4a, 0x3f, 0x21, 0xc9, - 0x72, 0xee, 0x21, 0x07, 0xfc, 0x50, 0x2a, 0xea, 0x07, 0x47, 0xe2, 0xd3, - 0xf8, 0xf2, 0x1d, 0xd6, 0xec, 0xe1, 0x43, 0xb5, 0xba, 0xc8, 0xe3, 0x97, - 0xa3, 0x70, 0x91, 0xef, 0xfd, 0x0e, 0xf3, 0x7e, 0x1f, 0xe0, 0xc4, 0x24, - 0x77, 0x91, 0x50, 0x39, 0xac, 0x42, 0x2f, 0xff, 0xaa, 0x7a, 0x97, 0x64, - 0xe6, 0x79, 0x00, 0x2b, 0x60, 0x1a, 0x75, 0x9a, 0x7a, 0x4e, 0x1a, 0x55, - 0x54, 0x94, 0xb8, 0x44, 0x58, 0x73, 0x28, 0x80, 0xed, 0x50, 0xa6, 0x10, - 0x16, 0x2d, 0x47, 0x7f, 0x33, 0x03, 0xdc, 0x3b, 0x6f, 0xc1, 0x96, 0xec, - 0xd4, 0x29, 0x67, 0xde, 0xa4, 0x48, 0x17, 0x8c, 0xcb, 0x71, 0x5d, 0x59, - 0x75, 0xa9, 0x48, 0x6a, 0x6d, 0x31, 0x43, 0x9f, 0x39, 0x53, 0x60, 0xee, - 0x67, 0x4b, 0xed, 0x28, 0xfc, 0xd9, 0x46, 0x5f, 0x6f, 0x59, 0x4c, 0x45, - 0x64, 0x89, 0x29, 0x4a, 0x77, 0x98, 0x47, 0xdf, 0xb1, 0x06, 0x1e, 0x9a, - 0x45, 0x39, 0x30, 0xc8, 0x1a, 0xec, 0xdf, 0xbb, 0x06, 0x81, 0xdc, 0xa7, - 0xa0, 0x9f, 0x1d, 0xe2, 0xc3, 0x52, 0x98, 0x85, 0xfa, 0x09, 0x91, 0x25, - 0x56, 0x08, 0x45, 0xda, 0xff, 0x8c, 0x20, 0xa6, 0xed, 0x75, 0x1d, 0x21, - 0x41, 0x43, 0x87, 0x2f, 0xc5, 0xe0, 0xa2, 0x70, 0xb8, 0x93, 0xf7, 0x2d, - 0xe7, 0xd2, 0x64, 0xb4, 0xe9, 0xbb, 0xfd, 0xf0, 0xde, 0xab, 0x0d, 0x05, - 0x84, 0xed, 0x4e, 0x03, 0x4c, 0x46, 0x43, 0x97, 0xfc, 0x3d, 0x69, 0xd0, - 0x23, 0xc8, 0xc4, 0xd3, 0x4d, 0xbd, 0x35, 0x05, 0xc7, 0xa4, 0x5a, 0x24, - 0x9e, 0x9c, 0x51, 0x0e, 0x27, 0x68, 0xfb, 0x97, 0xe0, 0xfe, 0x91, 0x0e, - 0xab, 0x16, 0x96, 0xed, 0x1e, 0xde, 0xb1, 0x25, 0x93, 0xdf, 0xd9, 0xa3, - 0x60, 0x4e, 0xeb, 0x64, 0x4d, 0x25, 0xa2, 0x38, 0x35, 0x3a, 0xc3, 0x79, - 0x87, 0xc2, 0x89, 0x7b, 0x2d, 0x8b, 0x74, 0x69, 0x47, 0xd7, 0x78, 0x8d, - 0xe5, 0x23, 0x08, 0x64, 0x78, 0x49, 0xf9, 0x13, 0x8a, 0xa7, 0x64, 0x9f, - 0x61, 0x0d, 0xa4, 0x79, 0x6b, 0x87, 0xca, 0x2d, 0xd6, 0xee, 0xdd, 0x6f, - 0x82, 0x2d, 0x19, 0xc4, 0x14, 0x9e, 0x80, 0xf3, 0x78, 0xf5, 0x82, 0x88, - 0x93, 0xbf, 0xea, 0xb0, 0xb3, 0xa1, 0x4c, 0xb4, 0xd8, 0xb8, 0x1a, 0xd5, - 0x21, 0x82, 0xc0, 0xd0, 0xf8, 0x67, 0x14, 0xbb, 0xc6, 0x23, 0x60, 0x67, - 0xcf, 0x35, 0xf9, 0x9e, 0x78, 0x85, 0x44, 0x81, 0xf8, 0x51, 0xe0, 0xd1, - 0x2a, 0xe8, 0x75, 0x35, 0x96, 0xf1, 0xac, 0x2b, 0x09, 0x92, 0x30, 0x00, - 0x6c, 0x79, 0x11, 0x51, 0x41, 0x89, 0x34, 0x8f, 0x48, 0x41, 0x61, 0xaf, - 0x4b, 0x8e, 0x44, 0x82, 0x30, 0x30, 0x1b, 0x82, 0x83, 0x04, 0x4e, 0xbd, - 0x23, 0x50, 0x7f, 0xbe, 0x13, 0xdc, 0xc7, 0x80, 0x36, 0xf0, 0xad, 0x85, - 0xae, 0x68, 0xc0, 0xb0, 0x8e, 0x7d, 0x86, 0xea, 0x72, 0x32, 0xfa, 0x82, - 0x09, 0x38, 0x48, 0x8b, 0x60, 0x90, 0x22, 0x54, 0x17, 0xf1, 0x57, 0xbf, - 0xf7, 0x64, 0xc6, 0xbf, 0x5b, 0xb7, 0xa4, 0xa4, 0xb7, 0xd2, 0x2e, 0xe8, - 0xe8, 0x81, 0xda, 0x1f, 0xa7, 0x98, 0xa5, 0xf2, 0x51, 0x58, 0x52, 0xb5, - 0xa1, 0x89, 0xe7, 0x92, 0xdc, 0x76, 0x40, 0x30, 0xcd, 0xcb, 0xf6, 0x9a, - 0x44, 0x3c, 0x44, 0x9d, 0xc8, 0x77, 0xa5, 0x02, 0x8e, 0xae, 0x2a, 0xe6, - 0x7c, 0x50, 0x6a, 0xd9, 0x15, 0x15, 0x81, 0x89, 0xc5, 0x03, 0x6d, 0xe6, - 0x2d, 0x60, 0x2e, 0x48, 0x02, 0x05, 0x71, 0xf7, 0x13, 0x47, 0xd5, 0x97, - 0xda, 0x4a, 0x21, 0xe2, 0xe4, 0x5d, 0x75, 0x3b, 0x8a, 0x8d, 0x45, 0x06, - 0xb6, 0xc3, 0xf9, 0x4e, 0x0d, 0xed, 0xd3, 0x14, 0x75, 0xe9, 0xde, 0x05, - 0xb0, 0x7c, 0x90, 0x87, 0xff, 0xa7, 0x5a, 0xd7, 0x37, 0xf7, 0xd7, 0xc0, - 0xb8, 0x2c, 0x00, 0x0a, 0x4d, 0xd0, 0xdd, 0xfc, 0xd0, 0x61, 0x01, 0x3c, - 0x82, 0x40, 0x59, 0x82, 0x8e, 0xad, 0x4e, 0x63, 0xda, 0xbf, 0x45, 0x8c, - 0xd5, 0x09, 0x58, 0x8d, 0x42, 0x8c, 0x71, 0xf2, 0x0a, 0xde, 0x78, 0xd4, - 0x19, 0x84, 0x6e, 0x61, 0x85, 0xb3, 0x29, 0x03, 0xf0, 0xb1, 0x6c, 0x83, - 0x6b, 0x16, 0xe0, 0x0b, 0xcc, 0x0e, 0xf1, 0xef, 0x83, 0x8b, 0x12, 0x60, - 0xed, 0xef, 0x7a, 0xc5, 0x97, 0x0e, 0x97, 0x17, 0x90, 0xca, 0xce, 0x56, - 0xe8, 0xb2, 0xc5, 0x34, 0x68, 0x6b, 0x3f, 0xaa, 0xc4, 0x0a, 0xf3, 0x7e, - 0x31, 0x33, 0x2b, 0x7b, 0x18, 0xfc, 0x1f, 0x27, 0xb2, 0x8f, 0xf2, 0x9c, - 0x51, 0xd4, 0x8e, 0x1f, 0x2d, 0x4b, 0x3c, 0x4e, 0xf3, 0x42, 0xb6, 0xfb, - 0xbd, 0x5b, 0x35, 0x98, 0x0f, 0x91, 0x4a, 0xd6, 0x21, 0xd6, 0xdc, 0xeb, - 0xc2, 0x77, 0x02, 0x80, 0xba, 0xab, 0xcd, 0x80, 0xca, 0x85, 0xd5, 0xc4, - 0xe0, 0x79, 0x9b, 0x98, 0xed, 0xfa, 0xdd, 0x21, 0x33, 0xf2, 0x74, 0x10, - 0x21, 0x7a, 0xb2, 0xda, 0xb6, 0xbc, 0xe5, 0x09, 0x60, 0x39, 0x93, 0x0e, - 0x4a, 0x6e, 0xd2, 0x30, 0xc2, 0xef, 0x81, 0x9b, 0xde, 0xb4, 0xe3, 0x71, - 0x4f, 0x65, 0x5c, 0x6a, 0x8c, 0xd5, 0xb7, 0x00, 0x75, 0xc8, 0xfe, 0x28, - 0xb5, 0xda, 0xa3, 0x4b, 0x86, 0x0c, 0x66, 0x37, 0x57, 0xea, 0x16, 0x53, - 0xac, 0xdb, 0xd9, 0x46, 0xde, 0xee, 0xe1, 0x75, 0x07, 0x98, 0x53, 0x0d, - 0x91, 0x21, 0x7b, 0xab, 0x49, 0x83, 0x5d, 0x7d, 0x75, 0x04, 0x79, 0xf5, - 0x11, 0x5f, 0x25, 0xb0, 0x83, 0x36, 0x08, 0x0d, 0x82, 0x66, 0x6e, 0x88, - 0xbb, 0x10, 0x29, 0x9b, 0x9c, 0xb0, 0xe8, 0x2f, 0xd3, 0xd2, 0x97, 0x72, - 0x31, 0x5d, 0x80, 0x58, 0xc2, 0xc5, 0x7b, 0xc1, 0x32, 0x74, 0x10, 0x5d, - 0x63, 0x34, 0x04, 0xf3, 0xc8, 0xa8, 0xb3, 0xdf, 0xd5, 0x6d, 0x8b, 0x5c, - 0xd1, 0x76, 0x3e, 0x58, 0x41, 0xac, 0x3b, 0x8b, 0xda, 0x63, 0x43, 0xc4, - 0xbd, 0xd9, 0xf1, 0xfc, 0x0b, 0x1c, 0x0b, 0xe0, 0x44, 0x5e, 0x6c, 0x16, - 0xeb, 0xd4, 0x78, 0xa9, 0x12, 0x2f, 0x83, 0x77, 0xb2, 0xa8, 0xf2, 0xa4, - 0xe9, 0xf3, 0x83, 0x55, 0xe3, 0xab, 0x79, 0xac, 0x2e, 0xf8, 0xe2, 0x0d, - 0xea, 0x49, 0x80, 0xa5, 0x81, 0x30, 0x12, 0xe0, 0x4d, 0xbf, 0xbc, 0x7a, - 0x64, 0x60, 0xc2, 0x38, 0x83, 0x4f, 0x69, 0x50, 0x1a, 0x7f, 0xe4, 0xa4, - 0xad, 0x88, 0x76, 0x16, 0x97, 0x2b, 0x25, 0x63, 0x51, 0x8a, 0xb1, 0xe0, - 0x6b, 0x81, 0xb3, 0x40, 0x50, 0xa9, 0x86, 0x16, 0x2e, 0x7f, 0x1b, 0xab, - 0xa2, 0xed, 0x2f, 0x46, 0x99, 0x91, 0x68, 0x11, 0xe8, 0x3b, 0x73, 0x10, - 0x58, 0x2d, 0xb7, 0x05, 0x4f, 0xc4, 0xb4, 0x70, 0xe3, 0x1d, 0xb2, 0xac, - 0x9c, 0x10, 0x75, 0x18, 0xc6, 0x88, 0x9c, 0x51, 0xfd, 0xfe, 0x6d, 0x2e, - 0x41, 0xc6, 0x84, 0x10, 0xb1, 0x9d, 0x8d, 0xa4, 0xd7, 0x59, 0x57, 0x35, - 0x01, 0x73, 0x11, 0x5e, 0x37, 0x9a, 0x5f, 0x9d, 0x08, 0xc1, 0x25, 0x0a, - 0x78, 0xab, 0x24, 0x11, 0xe2, 0xe9, 0x06, 0x6f, 0xda, 0x66, 0xd3, 0x41, - 0x76, 0x39, 0xa5, 0x6a, 0x10, 0x11, 0x8a, 0x6a, 0x2d, 0xb7, 0x70, 0xb3, - 0x14, 0x5f, 0x56, 0x36, 0x84, 0x0f, 0x0b, 0xd4, 0xf3, 0x42, 0x42, 0xe4, - 0xb0, 0xb8, 0xcb, 0x2d, 0x51, 0xeb, 0x97, 0xaf, 0x89, 0x2c, 0xa2, 0xf3, - 0xc9, 0x5b, 0xb9, 0xf7, 0x59, 0x48, 0x50, 0x48, 0x7d, 0xb7, 0x09, 0xdc, - 0x6c, 0x42, 0x68, 0x21, 0x1d, 0x21, 0x87, 0x90, 0xb1, 0x77, 0x75, 0x84, - 0xdc, 0x2e, 0xeb, 0x08, 0xc9, 0x77, 0x8a, 0x51, 0x84, 0xcd, 0xaf, 0xc2, - 0x1d, 0xbc, 0x5e, 0x97, 0xdb, 0xea, 0x3b, 0x62, 0x93, 0x32, 0x1d, 0x2e, - 0xe7, 0x80, 0x5a, 0xe5, 0x49, 0xf0, 0xc2, 0xa2, 0x5c, 0x53, 0x7d, 0xc8, - 0xf1, 0x93, 0x02, 0x2f, 0x36, 0xa6, 0xdf, 0x7c, 0x3f, 0x56, 0x67, 0x48, - 0x4b, 0x20, 0x3a, 0xef, 0x61, 0xc5, 0x68, 0x67, 0xe8, 0xaa, 0x59, 0xda, - 0xe0, 0x89, 0xf8, 0xf9, 0x0d, 0x79, 0x37, 0xf2, 0xad, 0xeb, 0x72, 0x63, - 0xaa, 0xdd, 0x3c, 0x62, 0xe4, 0x80, 0x3e, 0x91, 0xc6, 0x4a, 0xbb, 0x2c, - 0x63, 0xb3, 0x06, 0x03, 0x73, 0x3a, 0x54, 0xf3, 0x1a, 0xdc, 0x66, 0x01, - 0x16, 0xb8, 0x3b, 0xd6, 0x24, 0x4e, 0x30, 0x3e, 0x7b, 0xf0, 0x4e, 0x37, - 0xb0, 0xce, 0xb9, 0xf9, 0xd4, 0xd5, 0xe5, 0xf3, 0xfb, 0x42, 0xdf, 0xf4, - 0xc5, 0x33, 0xcb, 0x5c, 0xc2, 0x68, 0x6f, 0x7d, 0x56, 0xff, 0xcf, 0x40, - 0x2b, 0xeb, 0x96, 0x8c, 0x66, 0x63, 0xa2, 0x8f, 0xa9, 0xc5, 0x13, 0xaf, - 0xa5, 0x3e, 0x98, 0x51, 0xa8, 0x3e, 0x5b, 0x69, 0xd9, 0x5b, 0x2c, 0xd2, - 0x9b, 0x03, 0x29, 0x8a, 0xf1, 0xf7, 0xae, 0xa6, 0x77, 0x03, 0xf9, 0xe0, - 0x07, 0x66, 0x0c, 0xb1, 0xf8, 0x11, 0x10, 0x0f, 0x3d, 0x69, 0xd5, 0x43, - 0xb1, 0xd2, 0xc8, 0x03, 0x47, 0x8d, 0x5d, 0x7a, 0xf5, 0xfc, 0x2e, 0xed, - 0x1f, 0xcd, 0xb7, 0x0c, 0xe9, 0x19, 0x0f, 0x63, 0x5f, 0xef, 0xaf, 0xe1, - 0x6d, 0x37, 0x74, 0xec, 0xca, 0x79, 0x6d, 0x31, 0x3c, 0x68, 0x01, 0xd9, - 0xcf, 0x76, 0xc6, 0x2f, 0x87, 0xb3, 0x12, 0xe0, 0x1e, 0x64, 0xd3, 0xe4, - 0x94, 0xf9, 0x0b, 0x49, 0x47, 0xd5, 0x36, 0x53, 0xd7, 0xfe, 0x9e, 0x20, - 0x40, 0xea, 0x56, 0x5e, 0xcc, 0x1e, 0x28, 0xc6, 0x24, 0x54, 0xec, 0xd9, - 0xbe, 0xc7, 0x14, 0x84, 0x1a, 0x9f, 0xdc, 0x6a, 0xeb, 0x8e, 0xde, 0x94, - 0xa7, 0xb6, 0x35, 0xa9, 0x93, 0xea, 0x37, 0xa0, 0x86, 0x4e, 0x5a, 0xbd, - 0xaf, 0x2c, 0x73, 0x08, 0x12, 0x76, 0x92, 0x7a, 0x1d, 0x19, 0x25, 0x96, - 0xad, 0xfe, 0xc0, 0xcc, 0x19, 0x8f, 0xc0, 0x21, 0x7b, 0xd6, 0x3e, 0xfe, - 0x76, 0xf4, 0x23, 0x7b, 0x5f, 0x0b, 0xa7, 0x55, 0xe4, 0x17, 0xbd, 0xea, - 0xbd, 0x31, 0x4d, 0x0e, 0x34, 0x01, 0xde, 0xd0, 0xe2, 0xe6, 0xf4, 0x53, - 0x3a, 0x3c, 0x8e, 0x2c, 0x04, 0xbc, 0x48, 0xb5, 0xc0, 0x1e, 0xb7, 0x1f, - 0x77, 0x81, 0xdd, 0x8d, 0x38, 0x19, 0x1e, 0xf4, 0x85, 0xf9, 0x4c, 0x30, - 0xe1, 0x8f, 0xaf, 0x27, 0xab, 0x52, 0x01, 0x64, 0xd2, 0x4c, 0xf8, 0x23, - 0xdf, 0x3c, 0x54, 0x5e, 0x42, 0x3b, 0xbf, 0x38, 0xcb, 0x73, 0x74, 0x00, - 0xa5, 0x24, 0xf5, 0xbb, 0x69, 0x02, 0xf0, 0x1b, 0x39, 0xb0, 0x1c, 0x2a, - 0x57, 0x96, 0xc4, 0x5f, 0xb6, 0x92, 0xb8, 0xbe, 0x40, 0xc2, 0x84, 0x3c, - 0x45, 0xca, 0xe2, 0xd0, 0xdc, 0x8e, 0x32, 0xfe, 0xcc, 0x83, 0x23, 0x6a, - 0xc3, 0x11, 0xe2, 0xa1, 0x25, 0xe2, 0x1f, 0xf6, 0x59, 0xb2, 0x17, 0xbb, - 0x99, 0x44, 0x68, 0xdd, 0x97, 0xc1, 0x12, 0xbe, 0x64, 0x54, 0x4c, 0x2c, - 0x7c, 0x74, 0x68, 0x42, 0xbc, 0x6f, 0x22, 0x4e, 0xa6, 0x15, 0x0b, 0x06, - 0xa7, 0xb0, 0x36, 0xbe, 0x53, 0x13, 0xff, 0x8b, 0x96, 0x3a, 0x21, 0x0d, - 0xaa, 0xa7, 0x39, 0xe1, 0x4a, 0xae, 0xf6, 0xa5, 0x18, 0x1f, 0xf2, 0x34, - 0x8f, 0xde, 0x67, 0x2c, 0xc7, 0xcb, 0xd8, 0xf2, 0x2e, 0x41, 0xe3, 0x11, - 0x59, 0xbf, 0x8f, 0x03, 0x71, 0xae, 0x94, 0xd3, 0x0b, 0x37, 0x81, 0x5d, - 0x70, 0xc5, 0xd9, 0x19, 0x50, 0xf7, 0x94, 0xe6, 0x9f, 0x97, 0x8c, 0x54, - 0x36, 0x49, 0xd0, 0x7b, 0x18, 0x3f, 0x93, 0xbc, 0xf6, 0xc0, 0xec, 0xdc, - 0x53, 0x4f, 0x98, 0xf1, 0x69, 0xda, 0x0f, 0x24, 0xe4, 0x9b, 0x67, 0x8e, - 0x11, 0x9e, 0x73, 0x72, 0x3b, 0x4d, 0x5e, 0x99, 0x84, 0x6c, 0x6b, 0x58, - 0x38, 0x80, 0x63, 0xba, 0x64, 0x87, 0x20, 0x5d, 0x06, 0x6b, 0x74, 0xec, - 0xda, 0x01, 0x65, 0xd1, 0xc1, 0x35, 0x5e, 0xf9, 0x27, 0x5d, 0x0a, 0x31, - 0xa3, 0xa8, 0x7a, 0x25, 0xee, 0x7c, 0x15, 0x2a, 0xb5, 0x6b, 0x24, 0x70, - 0xf5, 0xa7, 0x20, 0x32, 0x10, 0x81, 0xb3, 0x65, 0x7a, 0xfd, 0x54, 0xd7, - 0x2d, 0x7f, 0xb2, 0x1d, 0xcd, 0x20, 0xa2, 0xbf, 0xbc, 0x21, 0xf4, 0xc0, - 0x97, 0x3b, 0x2c, 0xfa, 0x35, 0x14, 0x85, 0xea, 0x1e, 0x29, 0xeb, 0x4e, - 0xa2, 0x13, 0xb0, 0xf9, 0xf0, 0x52, 0xe1, 0x7a, 0xa9, 0x34, 0x67, 0x53, - 0x0e, 0x10, 0xe0, 0x02, 0x92, 0xb1, 0xf3, 0xc1, 0x3e, 0x88, 0xe3, 0x90, - 0xa8, 0x37, 0x3f, 0x31, 0xab, 0x9b, 0x9d, 0x1d, 0x28, 0x56, 0x51, 0x32, - 0xc3, 0xe9, 0x97, 0xf5, 0x92, 0xba, 0x34, 0xa1, 0xa4, 0x57, 0x5a, 0xf2, - 0x89, 0xd6, 0x1a, 0x4b, 0x16, 0xef, 0x06, 0xec, 0x8d, 0x06, 0x02, 0x8d, - 0x2d, 0xfc, 0xe1, 0x8e, 0x81, 0x86, 0xa9, 0x58, 0xbd, 0xd4, 0x10, 0xa2, - 0xab, 0x57, 0x76, 0xba, 0x6b, 0xcc, 0xc5, 0x4c, 0xc2, 0xd0, 0x76, 0xa6, - 0x80, 0x71, 0x76, 0xf7, 0x74, 0x21, 0x9f, 0xb5, 0x16, 0xaf, 0x9a, 0x89, - 0x49, 0xc6, 0x52, 0x85, 0x03, 0x56, 0x05, 0x6f, 0xc6, 0x0c, 0x7f, 0x6c, - 0x06, 0x59, 0xa1, 0xeb, 0x99, 0x9e, 0xe2, 0xd3, 0xcc, 0x8e, 0x70, 0x46, - 0x23, 0x40, 0x9d, 0xb7, 0x0b, 0x01, 0x79, 0x54, 0x74, 0x50, 0xcf, 0xb7, - 0x8c, 0x71, 0x99, 0x1d, 0xe0, 0x9b, 0x1c, 0x65, 0x65, 0x6f, 0xbf, 0x98, - 0xcd, 0x80, 0xc7, 0xe5, 0xe4, 0x72, 0x5d, 0x42, 0x16, 0x4c, 0xc4, 0x1e, - 0x95, 0xbf, 0x3d, 0x8d, 0x4e, 0x0e, 0x51, 0x58, 0xcf, 0xab, 0x96, 0xc0, - 0xbb, 0x0a, 0xca, 0x57, 0xc2, 0x95, 0x02, 0x97, 0x5a, 0xec, 0x05, 0x6c, - 0xff, 0xc6, 0xd4, 0x88, 0x29, 0xe8, 0xb9, 0x79, 0xac, 0x3e, 0x96, 0x7a, - 0xb1, 0x7b, 0x09, 0xca, 0x1c, 0xca, 0xd8, 0x43, 0xbd, 0x57, 0x26, 0xe2, - 0x59, 0x52, 0xc5, 0x1b, 0xeb, 0x38, 0x3e, 0x4b, 0x12, 0x29, 0xc0, 0xb8, - 0x0d, 0x52, 0xb0, 0xab, 0xdd, 0x99, 0x9d, 0x14, 0x37, 0xf7, 0xc6, 0x37, - 0xe6, 0x5d, 0xdf, 0xd8, 0x2a, 0xc0, 0x94, 0xbf, 0x0d, 0x95, 0x4c, 0x46, - 0x46, 0x5f, 0x03, 0xd2, 0xe7, 0x3d, 0x97, 0xae, 0x12, 0x4e, 0xe1, 0x66, - 0x62, 0xb4, 0x84, 0x55, 0x28, 0xdd, 0x53, 0x0f, 0xf4, 0x51, 0xe2, 0x08, - 0x81, 0xd1, 0x0f, 0x23, 0x62, 0x37, 0xf8, 0x08, 0x5f, 0xc7, 0x34, 0xdd, - 0xe9, 0x80, 0x09, 0x7a, 0x0d, 0xde, 0x14, 0xcd, 0xe7, 0x8e, 0xc0, 0xa8, - 0x9f, 0x75, 0x94, 0x47, 0xa5, 0x8a, 0x49, 0x14, 0x98, 0xce, 0x4d, 0xab, - 0xab, 0x65, 0xc1, 0x41, 0x14, 0x9e, 0x8d, 0x8b, 0x41, 0x50, 0x08, 0xa8, - 0x84, 0xf7, 0xd6, 0xf0, 0x07, 0x12, 0x3a, 0x1d, 0x51, 0x7d, 0x13, 0x78, - 0xa4, 0x9e, 0xf5, 0x3b, 0x0e, 0x38, 0x44, 0x34, 0xc2, 0x00, 0x87, 0x30, - 0xde, 0xe2, 0x24, 0x71, 0xcb, 0xd2, 0xb1, 0x09, 0x31, 0xc2, 0xdb, 0x9a, - 0xbe, 0xd6, 0x05, 0x7c, 0xb8, 0xc0, 0xeb, 0x5c, 0x20, 0x14, 0x18, 0x99, - 0xb3, 0xe4, 0x13, 0x90, 0xc3, 0x50, 0xa4, 0xef, 0x23, 0x7a, 0x98, 0x85, - 0x48, 0xa9, 0x55, 0xa0, 0x38, 0xd4, 0xd9, 0xd1, 0x83, 0x7a, 0xae, 0xc2, - 0x29, 0x69, 0x49, 0xf9, 0x4b, 0xba, 0xd0, 0xef, 0x1f, 0x30, 0x64, 0x05, - 0xbe, 0x35, 0x27, 0xb0, 0xc4, 0xfd, 0xfd, 0x8b, 0x82, 0xbc, 0x19, 0x5c, - 0x9b, 0x88, 0x88, 0x93, 0x26, 0xcd, 0xbd, 0x69, 0x6f, 0x07, 0xb1, 0x5f, - 0xae, 0x73, 0x17, 0xb7, 0x5a, 0xf1, 0xec, 0x1e, 0x7e, 0x1d, 0x9c, 0x42, - 0x9b, 0x54, 0xff, 0x0b, 0x26, 0x55, 0x17, 0x2e, 0x8b, 0x81, 0x3a, 0xf8, - 0x78, 0x1c, 0x59, 0x88, 0xff, 0xff, 0xe7, 0x19, 0x37, 0xe1, 0x88, 0x5d, - 0xc3, 0x3c, 0x4f, 0x86, 0x0e, 0xaf, 0xee, 0x46, 0x9a, 0x3c, 0x5f, 0x72, - 0x4d, 0x5e, 0x16, 0x6b, 0x3c, 0x42, 0xba, 0xce, 0x43, 0x10, 0xf8, 0xdc, - 0x08, 0x93, 0xb6, 0x00, 0xda, 0xb3, 0xe2, 0xb4, 0x81, 0x2d, 0x7e, 0x66, - 0x83, 0xf5, 0xe9, 0x63, 0xe0, 0xad, 0xc4, 0xf8, 0x9d, 0xf8, 0xbc, 0xe6, - 0x9e, 0x5f, 0x66, 0xa4, 0x1c, 0x73, 0x90, 0x5e, 0x15, 0x2a, 0xf9, 0xf4, - 0x24, 0xaf, 0xbb, 0xc0, 0x4e, 0x9e, 0x37, 0x5b, 0xc3, 0xc9, 0x86, 0x9b, - 0x8c, 0xac, 0x43, 0x5b, 0x32, 0x93, 0x31, 0x73, 0xb8, 0xd8, 0x39, 0x8a, - 0xe5, 0x86, 0x43, 0xc7, 0xf6, 0xeb, 0x4b, 0xca, 0xf9, 0x41, 0x57, 0x10, - 0x34, 0xd4, 0x57, 0x8c, 0xa4, 0xe0, 0xf6, 0x4d, 0x5c, 0x19, 0x47, 0x05, - 0xfa, 0xa0, 0x8d, 0x3a, 0x9a, 0x9f, 0x98, 0x0c, 0x98, 0xc4, 0x87, 0x11, - 0xa8, 0x63, 0xbb, 0x04, 0x40, 0xb0, 0xe4, 0xbe, 0x2a, 0xb0, 0xc3, 0x0b, - 0xa3, 0x9e, 0x35, 0x6a, 0x18, 0x1a, 0x4a, 0xc4, 0x36, 0x1b, 0xc7, 0x32, - 0xe1, 0x49, 0x6d, 0xd6, 0xb1, 0xf6, 0xba, 0xed, 0x55, 0xd5, 0xde, 0x5a, - 0xc7, 0xb0, 0x9a, 0x6d, 0xdb, 0x1e, 0xac, 0xf6, 0x0d, 0x61, 0xac, 0xaa, - 0x37, 0x0f, 0x0e, 0xa7, 0xaa, 0x75, 0xad, 0x02, 0xe3, 0x13, 0x70, 0x18, - 0x0c, 0x2e, 0x1a, 0xc6, 0x35, 0x73, 0x6f, 0xb5, 0x4d, 0x18, 0x86, 0x0e, - 0x93, 0xdc, 0x6d, 0x75, 0x00, 0xc6, 0x59, 0x48, 0x01, 0x94, 0x9f, 0x1a, - 0x58, 0xd7, 0x35, 0x1c, 0x13, 0xb1, 0x4a, 0x8b, 0xa7, 0x7f, 0x34, 0xff, - 0x4d, 0x62, 0x9a, 0xda, 0xc5, 0x18, 0xac, 0xcc, 0x93, 0x70, 0x7c, 0x26, - 0x6b, 0x0a, 0xc8, 0x2e, 0xbf, 0x85, 0x58, 0x9e, 0x0c, 0x69, 0xcb, 0x5a, - 0x61, 0x34, 0x30, 0x13, 0x44, 0x5e, 0x38, 0x90, 0xa2, 0x94, 0x7c, 0x89, - 0xbf, 0xa6, 0x82, 0xdb, 0xa1, 0x77, 0x06, 0x96, 0x18, 0x05, 0xe7, 0xcd, - 0xef, 0x50, 0x73, 0x34, 0xd4, 0x35, 0xd0, 0x05, 0xbc, 0x8f, 0xd8, 0x52, - 0x9e, 0x0f, 0x9e, 0x1b, 0x3e, 0x78, 0x13, 0x2a, 0xb8, 0x89, 0xe4, 0x4f, - 0x2e, 0x23, 0x56, 0xda, 0xa9, 0x12, 0xd2, 0xce, 0xbf, 0xc8, 0x49, 0xf9, - 0xf9, 0x4e, 0x08, 0xbd, 0x8a, 0xa4, 0x53, 0x29, 0xe8, 0x50, 0x92, 0x67, - 0xf8, 0x01, 0x20, 0x15, 0x8a, 0xd7, 0x87, 0x98, 0x23, 0x36, 0xf8, 0x14, - 0x88, 0xf3, 0x73, 0x3e, 0x1c, 0x50, 0xeb, 0x52, 0xf1, 0xbb, 0xfe, 0xe3, - 0x45, 0x83, 0xe4, 0xcf, 0x80, 0x7a, 0x6a, 0x81, 0xfa, 0x43, 0x43, 0xfa, - 0xf9, 0x45, 0x8c, 0x3f, 0x26, 0x09, 0x1a, 0x8e, 0xbf, 0x2e, 0xd4, 0xe7, - 0x32, 0x7a, 0xde, 0x7b, 0xdf, 0xeb, 0xe1, 0x40, 0xac, 0xa5, 0x62, 0xeb, - 0x00, 0x09, 0x30, 0xf9, 0x62, 0x38, 0x02, 0x8d, 0x56, 0x84, 0x4b, 0xd2, - 0xdc, 0xf9, 0x38, 0xd9, 0xf5, 0x79, 0xc5, 0xb4, 0xeb, 0x8f, 0x6d, 0x37, - 0x39, 0x4c, 0x7e, 0x1b, 0xa7, 0xe3, 0xec, 0xa8, 0x90, 0xbe, 0xc0, 0xfe, - 0x7f, 0xc2, 0x79, 0xd8, 0x76, 0xad, 0x3a, 0xf4, 0xa1, 0x24, 0x03, 0x16, - 0x78, 0x65, 0xc9, 0xf6, 0xe5, 0x4d, 0x2e, 0x2c, 0x4d, 0xcf, 0xb2, 0x34, - 0x70, 0x43, 0xcd, 0xe4, 0xcf, 0x04, 0xa3, 0x05, 0xb9, 0xa6, 0x0a, 0x88, - 0x02, 0x9a, 0x10, 0x4c, 0x23, 0x39, 0x40, 0x75, 0xc5, 0x9e, 0xec, 0xf2, - 0x74, 0xd6, 0xec, 0x0d, 0x97, 0x07, 0xbe, 0x82, 0xbb, 0x4c, 0x20, 0x39, - 0xed, 0xfc, 0xc4, 0x6d, 0x1c, 0x37, 0xbb, 0xe8, 0x3d, 0xbc, 0x0c, 0xcf, - 0x78, 0x5f, 0x5a, 0x13, 0xe4, 0x6b, 0xbd, 0xf8, 0x0f, 0x27, 0x54, 0x11, - 0xd8, 0x1c, 0x5b, 0xa5, 0x7a, 0xaf, 0x5e, 0xbc, 0x8d, 0xe9, 0x9a, 0xc2, - 0x5f, 0x0e, 0x8d, 0x9d, 0xa6, 0x00, 0xf3, 0x09, 0xa9, 0x22, 0xe6, 0x07, - 0x7d, 0xdd, 0x67, 0x24, 0x2f, 0xf8, 0xef, 0xdb, 0x13, 0xeb, 0x86, 0x16, - 0x1e, 0xf3, 0xc5, 0x87, 0xf0, 0x66, 0xa6, 0xbe, 0xd6, 0x4e, 0xa7, 0xb6, - 0x8c, 0x99, 0x1a, 0xc0, 0x32, 0xec, 0x14, 0x17, 0xf8, 0x53, 0x99, 0xc7, - 0x98, 0x4b, 0x86, 0x7b, 0x8b, 0x90, 0x8d, 0x6a, 0xd9, 0xad, 0xb5, 0x3b, - 0xae, 0x32, 0x5d, 0x28, 0x4c, 0xe0, 0xbe, 0x94, 0xe9, 0x11, 0xe5, 0x75, - 0x05, 0x9c, 0xc7, 0x80, 0x0f, 0x07, 0x2f, 0x05, 0x27, 0x22, 0xa8, 0x1a, - 0xec, 0xcf, 0xee, 0xc0, 0x10, 0x9a, 0x95, 0x08, 0x40, 0x36, 0x01, 0xc5, - 0xf4, 0x40, 0x7f, 0xc8, 0x37, 0x9e, 0x91, 0x50, 0x00, 0x5f, 0x9d, 0xf4, - 0x57, 0x99, 0xde, 0xb8, 0x46, 0xfa, 0x77, 0x28, 0xb4, 0x2d, 0x3f, 0xc1, - 0xd5, 0x8c, 0x57, 0x7c, 0xc9, 0x03, 0x7a, 0x10, 0x33, 0xca, 0xf4, 0x82, - 0x62, 0x0d, 0x23, 0x08, 0xae, 0xa5, 0x17, 0x46, 0xa6, 0xf3, 0x19, 0xb3, - 0x53, 0x38, 0x1f, 0xe1, 0x27, 0xc0, 0x57, 0x64, 0x64, 0x55, 0x98, 0xa4, - 0x3a, 0xe3, 0x71, 0x87, 0x29, 0x73, 0xf2, 0xfe, 0x89, 0xe0, 0x27, 0xb4, - 0x44, 0xd3, 0x4c, 0x34, 0x6c, 0x30, 0x88, 0xaf, 0xe0, 0xd1, 0xef, 0x16, - 0x4b, 0xcf, 0x7a, 0xa6, 0x6b, 0xc1, 0x0a, 0xe9, 0xcc, 0xb2, 0x51, 0x8b, - 0x4c, 0x03, 0x56, 0x3f, 0x76, 0x3d, 0xe2, 0xf6, 0xd4, 0x50, 0xf1, 0x01, - 0xb9, 0x7e, 0x56, 0x5d, 0x5e, 0x3d, 0xb6, 0x77, 0x9f, 0xc3, 0xdd, 0xbd, - 0x02, 0x94, 0xeb, 0x89, 0xf5, 0x1f, 0x5e, 0x3e, 0x36, 0x5e, 0xf7, 0xc9, - 0x88, 0x93, 0x02, 0x2e, 0x58, 0x16, 0x42, 0xa7, 0x64, 0x2e, 0x69, 0x6a, - 0x5b, 0xb7, 0xbd, 0x86, 0x75, 0x62, 0x4a, 0x55, 0x0f, 0x39, 0x3d, 0x16, - 0xc9, 0x25, 0xe0, 0x50, 0x85, 0x2c, 0x2a, 0xcb, 0x47, 0x09, 0xf2, 0x61, - 0x68, 0xed, 0xc6, 0xf0, 0xa3, 0x03, 0x2b, 0xc4, 0x14, 0xde, 0x2e, 0x18, - 0x61, 0x9b, 0x54, 0x94, 0x34, 0x91, 0x15, 0xd3, 0x13, 0xba, 0xa7, 0x9c, - 0x72, 0x76, 0x2e, 0x55, 0x11, 0xa0, 0xe1, 0xeb, 0xd0, 0x23, 0xa0, 0x60, - 0x23, 0x1a, 0x36, 0x2f, 0xc4, 0x71, 0x23, 0xfb, 0x9c, 0x87, 0x79, 0x21, - 0x6e, 0xf1, 0x11, 0x6e, 0xd1, 0xd2, 0xbd, 0x1b, 0x17, 0xa1, 0x5f, 0x48, - 0x23, 0x17, 0x18, 0x62, 0x42, 0x36, 0xdd, 0xba, 0xb7, 0x5c, 0x66, 0x92, - 0x61, 0xe0, 0x98, 0x5f, 0xaf, 0x1f, 0x2a, 0xd4, 0x54, 0xb5, 0x02, 0x0c, - 0x29, 0xca, 0x23, 0x6b, 0xbd, 0x1f, 0xbf, 0xf8, 0x1c, 0x6a, 0xc5, 0xac, - 0x8f, 0x1e, 0x73, 0xfb, 0xa4, 0xab, 0xbc, 0x9d, 0xcc, 0xfe, 0xb3, 0x9c, - 0xe5, 0x41, 0xe6, 0x0e, 0x12, 0x34, 0xb5, 0xf4, 0xc4, 0x49, 0x76, 0x64, - 0x35, 0xa3, 0x42, 0xed, 0x43, 0xa5, 0x4a, 0x0a, 0x29, 0xe5, 0x71, 0x23, - 0x2d, 0x80, 0x03, 0x54, 0x8a, 0xff, 0xb7, 0x46, 0x4a, 0x1c, 0x96, 0xc4, - 0x7c, 0xf5, 0x5d, 0x3d, 0xcf, 0xaa, 0xf4, 0x9b, 0x1b, 0xd5, 0x3f, 0xbb, - 0xdc, 0x5f, 0x2f, 0x6b, 0xad, 0xeb, 0x6d, 0x65, 0x64, 0xb2, 0x0b, 0xf7, - 0x7c, 0x6e, 0x3e, 0x1a, 0xbc, 0xa5, 0x41, 0xdc, 0xcc, 0x46, 0xfa, 0x9a, - 0x5e, 0xf1, 0x99, 0xae, 0xd2, 0x6b, 0x79, 0x28, 0xf2, 0x17, 0x92, 0x97, - 0x32, 0x3d, 0x12, 0x4b, 0x35, 0x71, 0x78, 0xe7, 0xf4, 0x56, 0xab, 0x5c, - 0x87, 0x7d, 0x25, 0xb6, 0x6e, 0x43, 0xa3, 0xed, 0x91, 0x45, 0xac, 0x38, - 0x5a, 0xac, 0xed, 0xf2, 0xba, 0xf9, 0x34, 0x12, 0xb5, 0xe9, 0x9c, 0x15, - 0x0c, 0x6b, 0xd5, 0xdb, 0x5e, 0x37, 0xb9, 0x9c, 0x0d, 0x4a, 0xa7, 0x2d, - 0xb5, 0x1b, 0xe3, 0x09, 0x72, 0xdb, 0x2d, 0xd1, 0x4c, 0xc5, 0x5a, 0x33, - 0x70, 0xb9, 0x58, 0xcc, 0x81, 0x40, 0x6a, 0x96, 0xeb, 0x0d, 0x98, 0x2c, - 0x0f, 0xc1, 0xeb, 0x55, 0x34, 0xc7, 0x30, 0xa7, 0x49, 0x3b, 0x51, 0xff, - 0xff, 0xcd, 0x28, 0xe4, 0xb5, 0x41, 0x68, 0x35, 0xab, 0x74, 0x4a, 0x6a, - 0x98, 0xd8, 0x74, 0x5d, 0xea, 0xb4, 0xc5, 0xf3, 0xc1, 0x79, 0xc9, 0x2e, - 0x5d, 0xa6, 0xea, 0x6f, 0xba, 0x52, 0xc4, 0xe3, 0xad, 0x12, 0xba, 0x40, - 0xb9, 0xbc, 0x01, 0x30, 0x9a, 0x24, 0x37, 0x0f, 0x24, 0x36, 0x56, 0x2f, - 0x8c, 0x03, 0xcc, 0x55, 0xdd, 0x2b, 0xb6, 0xe7, 0xed, 0x28, 0xf1, 0xd5, - 0x6a, 0xf7, 0x03, 0xfe, 0x03, 0x1b, 0xd0, 0x6b, 0xde, 0x39, 0x3c, 0x92, - 0xf5, 0x12, 0x12, 0x9b, 0x33, 0xfc, 0xcb, 0xc5, 0x10, 0x85, 0x7a, 0x89, - 0xdd, 0xbe, 0x65, 0x78, 0x76, 0xe1, 0x3b, 0xe1, 0xcf, 0x22, 0xe2, 0x2e, - 0x6e, 0x1b, 0x3e, 0xb9, 0x35, 0x37, 0xca, 0xf6, 0x72, 0x32, 0x6d, 0xed, - 0xa2, 0x46, 0xa2, 0x34, 0x2a, 0xcb, 0x49, 0x9f, 0x4b, 0xc1, 0xa2, 0x18, - 0xc2, 0x34, 0xde, 0x6a, 0x58, 0x2a, 0xf5, 0x66, 0x64, 0x21, 0xbd, 0xc1, - 0x6e, 0x37, 0x84, 0x67, 0x2c, 0x68, 0xae, 0xe1, 0xb6, 0x53, 0xd4, 0xa2, - 0xa3, 0x22, 0xaa, 0x95, 0x7c, 0x21, 0x85, 0xdd, 0x54, 0x9e, 0xe3, 0xd3, - 0xa0, 0xc8, 0x3e, 0x2a, 0xba, 0x72, 0x21, 0xfe, 0x37, 0xcb, 0xb1, 0x96, - 0x92, 0x6a, 0xc6, 0x48, 0x24, 0xbc, 0xc2, 0x50, 0x80, 0x38, 0xdb, 0x6e, - 0x21, 0xdd, 0x7e, 0x2d, 0xf8, 0xe3, 0x39, 0x43, 0x4f, 0x6c, 0xe8, 0x8d, - 0x14, 0x79, 0x1f, 0x0a, 0xbf, 0xae, 0xeb, 0x41, 0xac, 0xc7, 0xf0, 0xb8, - 0x95, 0xe7, 0x9d, 0xd9, 0xf6, 0x39, 0xac, 0xec, 0xe3, 0x40, 0x03, 0x74, - 0xae, 0x12, 0xac, 0x00, 0x60, 0x3f, 0x55, 0xde, 0xc3, 0x10, 0x63, 0xf5, - 0x41, 0xa3, 0x69, 0x38, 0xb1, 0xa3, 0xb3, 0x89, 0x1e, 0xcf, 0x31, 0x75, - 0x33, 0x30, 0xcc, 0x71, 0x05, 0x3c, 0xdd, 0x81, 0xe2, 0xde, 0x2d, 0xca, - 0x9e, 0xa5, 0x07, 0x51, 0xc5, 0x28, 0x09, 0x3c, 0x5b, 0xe8, 0x75, 0xb7, - 0x70, 0xf7, 0x9a, 0x9b, 0xdf, 0xb2, 0x4e, 0xc0, 0x51, 0x1e, 0xa6, 0xd4, - 0x95, 0x9c, 0x70, 0x7d, 0x70, 0xed, 0x23, 0x53, 0xf8, 0xf7, 0x45, 0xf1, - 0x00, 0xc0, 0xef, 0x83, 0x2f, 0xff, 0x4a, 0xde, 0x2a, 0x9b, 0x8f, 0xcb, - 0xc3, 0x4d, 0x47, 0x31, 0xb5, 0x65, 0x34, 0xe7, 0xf0, 0x7d, 0x2a, 0xc3, - 0x72, 0x71, 0xe3, 0xfa, 0x0f, 0x54, 0xfe, 0xc8, 0x68, 0x7c, 0x10, 0xb2, - 0xad, 0x2b, 0x86, 0x12, 0x12, 0x83, 0x53, 0xe9, 0x4c, 0xd6, 0x08, 0xf6, - 0x48, 0xc6, 0xb9, 0x6d, 0xfe, 0xcf, 0x63, 0xcb, 0x01, 0xf9, 0xa3, 0xfb, - 0x4e, 0xdd, 0x98, 0x56, 0x7d, 0x06, 0xdc, 0x23, 0x5d, 0x3d, 0xa8, 0x3d, - 0x99, 0x77, 0x33, 0x9a, 0x89, 0x7b, 0xe7, 0x4f, 0xa5, 0xdc, 0xb3, 0x49, - 0xff, 0x84, 0xdf, 0x92, 0xee, 0x74, 0xda, 0x32, 0x23, 0xb3, 0xf1, 0xf7, - 0xca, 0x8e, 0x30, 0xaf, 0x68, 0xc1, 0xe8, 0xe8, 0x1f, 0x97, 0xa3, 0x7c, - 0x10, 0x67, 0x85, 0x94, 0x60, 0x5b, 0x0e, 0x5a, 0xe7, 0xc4, 0x99, 0x56, - 0xac, 0xba, 0x84, 0x63, 0xc5, 0x49, 0xaa, 0x61, 0x22, 0xd7, 0x4f, 0x4c, - 0x21, 0x10, 0xe7, 0x26, 0x07, 0x55, 0xd1, 0x12, 0x9e, 0x2c, 0xee, 0x83, - 0xb6, 0x79, 0x21, 0xb9, 0xe8, 0xeb, 0x5a, 0x24, 0xda, 0xa7, 0xa0, 0x29, - 0xe4, 0xb6, 0x04, 0x86, 0x71, 0xf6, 0x7e, 0x07, 0xf8, 0x39, 0x2a, 0xd1, - 0x6e, 0x31, 0x0e, 0xdd, 0x71, 0xc9, 0x35, 0x29, 0xaf, 0xed, 0xd2, 0x17, - 0xad, 0x12, 0xce, 0xff, 0x57, 0x83, 0x37, 0x1e, 0x02, 0x9e, 0x19, 0x3b, - 0xce, 0xa2, 0x1d, 0xcf, 0xa2, 0x97, 0x15, 0x94, 0xa5, 0x30, 0xce, 0xe6, - 0x59, 0xff, 0x14, 0x1b, 0xeb, 0xf1, 0x8f, 0x97, 0xe2, 0xc9, 0x61, 0x85, - 0x36, 0x72, 0x5b, 0x36, 0xc9, 0x40, 0x76, 0xee, 0xeb, 0x82, 0x42, 0x2b, - 0xd3, 0x36, 0x4f, 0x66, 0x0c, 0x78, 0x50, 0x70, 0xb8, 0x0a, 0xb3, 0x28, - 0x3e, 0xa1, 0x39, 0x92, 0xf4, 0x89, 0xac, 0x45, 0x69, 0x24, 0xcc, 0x04, - 0x0c, 0xf5, 0x73, 0x33, 0x49, 0x30, 0xc0, 0x0c, 0x06, 0xbf, 0xa2, 0x28, - 0x7e, 0x2a, 0x19, 0xf1, 0x14, 0x33, 0x0a, 0xfa, 0xe8, 0x2b, 0x33, 0x5f, - 0xe9, 0x73, 0x83, 0x29, 0xb0, 0xe5, 0x99, 0xd2, 0x09, 0x78, 0x55, 0x31, - 0x7d, 0x33, 0xda, 0x37, 0xbe, 0x04, 0x95, 0x2b, 0xef, 0x4b, 0x2e, 0xda, - 0x87, 0xdc, 0xa4, 0xf4, 0x25, 0x77, 0xca, 0x7c, 0x0c, 0x85, 0x32, 0xa7, - 0x95, 0x87, 0xe2, 0x9e, 0xe0, 0xba, 0x0a, 0xd4, 0x94, 0x28, 0x05, 0xa8, - 0xdb, 0x48, 0xce, 0x88, 0xd5, 0x0b, 0x1d, 0xfd, 0x18, 0xa7, 0x58, 0x3c, - 0x3e, 0x8f, 0xd6, 0xd5, 0x9f, 0x5f, 0x64, 0xb8, 0x61, 0xb9, 0xd7, 0x78, - 0x21, 0x37, 0x3e, 0x4f, 0x95, 0x38, 0xf4, 0x94, 0xd4, 0x10, 0xc3, 0xb0, - 0x4a, 0xcb, 0x36, 0x6f, 0xa8, 0xbe, 0xe9, 0xe8, 0x6f, 0x6f, 0x64, 0x84, - 0xa5, 0x14, 0x4d, 0x8c, 0xaa, 0xb5, 0x6c, 0xee, 0x45, 0x66, 0x9b, 0xb4, - 0x9b, 0x4c, 0xb5, 0xae, 0x92, 0x5b, 0xe7, 0x63, 0x04, 0x52, 0x0e, 0xcc, - 0xe7, 0x2f, 0x8b, 0x79, 0x64, 0x91, 0xf7, 0xbd, 0x4d, 0xa1, 0x66, 0xa7, - 0x8c, 0x3c, 0x4f, 0x19, 0xaa, 0xe7, 0xa9, 0x18, 0x7c, 0x76, 0x6d, 0xa4, - 0x18, 0x79, 0x72, 0xb5, 0x75, 0x07, 0xf0, 0xaa, 0x55, 0xea, 0x25, 0x68, - 0xe2, 0x42, 0xfc, 0xb4, 0x27, 0x90, 0x0f, 0x70, 0x75, 0xf8, 0xe4, 0xdb, - 0xa6, 0x8b, 0xda, 0xd8, 0x22, 0x88, 0x21, 0x78, 0x55, 0x51, 0x85, 0xd2, - 0x80, 0x37, 0xa1, 0x10, 0x55, 0xd7, 0xc8, 0xda, 0x7a, 0x89, 0x5d, 0x70, - 0xc2, 0x77, 0xc6, 0x06, 0x3f, 0x20, 0x4b, 0xc6, 0xab, 0x54, 0xca, 0xa6, - 0x23, 0xe4, 0x8b, 0xac, 0xbd, 0x21, 0xb0, 0xfe, 0x4b, 0xdb, 0xf0, 0xff, - 0x4e, 0x08, 0xbf, 0xac, 0x12, 0x6f, 0x01, 0x23, 0xda, 0xfc, 0xc8, 0x8b, - 0x74, 0x01, 0x23, 0xfd, 0x3c, 0xe6, 0x31, 0x3e, 0x1e, 0x5c, 0x01, 0xc2, - 0x03, 0x13, 0x43, 0x5a, 0x79, 0x11, 0xb5, 0x3d, 0x0b, 0x19, 0x9b, 0xb4, - 0x78, 0x2c, 0xbb, 0x3e, 0xfc, 0x8f, 0x90, 0x13, 0x85, 0xf1, 0x7c, 0x32, - 0xfa, 0xba, 0xe7, 0x3e, 0x4e, 0x67, 0xed, 0xb9, 0x7e, 0x83, 0xba, 0x2b, - 0xce, 0x83, 0x0a, 0xa7, 0xfe, 0x0d, 0x37, 0x99, 0x61, 0x30, 0x01, 0x1f, - 0x82, 0xd3, 0xf3, 0xce, 0xa0, 0x0b, 0xe6, 0x11, 0x5f, 0xe4, 0x0d, 0xd3, - 0x1b, 0x44, 0xc0, 0xb2, 0x0b, 0x15, 0x3e, 0x18, 0x2a, 0x60, 0xa3, 0xc2, - 0xf8, 0x12, 0x7a, 0xd1, 0xd1, 0x8a, 0x76, 0x89, 0x5d, 0xb0, 0x49, 0xa5, - 0x48, 0x15, 0x25, 0x73, 0x25, 0x5c, 0x4a, 0xc4, 0x7d, 0xdf, 0x71, 0xf9, - 0xdd, 0xbc, 0x50, 0xa4, 0x53, 0xfd, 0xcc, 0x54, 0x19, 0xc6, 0xa8, 0xd3, - 0x19, 0x39, 0xef, 0xd4, 0x64, 0x03, 0xf7, 0xa1, 0xd0, 0x8c, 0x6c, 0xd2, - 0xc5, 0x6a, 0xf0, 0x89, 0x13, 0xf9, 0xbe, 0xba, 0x36, 0xe5, 0x6f, 0x09, - 0x0e, 0xd5, 0x23, 0x1c, 0x71, 0x0f, 0xd2, 0xd4, 0xaf, 0xcd, 0x9a, 0xf4, - 0xc6, 0x90, 0x41, 0x42, 0xc2, 0x3a, 0x19, 0x1d, 0x46, 0xe0, 0x5e, 0x4c, - 0x1b, 0x26, 0x9e, 0x46, 0x69, 0xda, 0xdf, 0x37, 0x16, 0x28, 0x85, 0x4d, - 0x5c, 0x42, 0xd4, 0x18, 0x7c, 0x3c, 0x4a, 0x34, 0x3f, 0x72, 0x15, 0x9a, - 0x21, 0x1c, 0xc7, 0x0d, 0x81, 0x6d, 0x6e, 0x69, 0x2d, 0x08, 0x21, 0x2c, - 0x61, 0xc7, 0x0a, 0xf0, 0xd0, 0x18, 0xe7, 0x50, 0x70, 0x4d, 0x4c, 0xf7, - 0x0d, 0xf2, 0x14, 0x2e, 0x6a, 0x34, 0xd4, 0x01, 0x33, 0xd2, 0x4c, 0x13, - 0xe4, 0x1c, 0xe5, 0xf2, 0x80, 0xaa, 0xfa, 0xf9, 0x8f, 0x91, 0x3d, 0x1f, - 0x89, 0xe6, 0x66, 0x08, 0x3d, 0xeb, 0x9b, 0x8c, 0x22, 0xdb, 0xc1, 0x21, - 0xd2, 0x00, 0xba, 0x5a, 0x18, 0x54, 0xf5, 0x22, 0x07, 0x1e, 0x37, 0xf2, - 0x65, 0x23, 0xe8, 0x62, 0x70, 0xab, 0x17, 0x72, 0x8e, 0x92, 0x3e, 0xe5, - 0x3b, 0x53, 0x06, 0x2b, 0x1d, 0xbc, 0x16, 0xf4, 0x7e, 0xb6, 0x79, 0xa8, - 0x37, 0x66, 0x43, 0x7d, 0xb7, 0xd6, 0xc2, 0xdd, 0xc3, 0x31, 0x2f, 0xf0, - 0x20, 0x6e, 0x04, 0xf8, 0x8f, 0x3c, 0x19, 0xa9, 0x7c, 0x2e, 0x47, 0x14, - 0x59, 0x39, 0x24, 0x5a, 0x7d, 0x09, 0xe7, 0xa5, 0xa2, 0x0e, 0xd9, 0x74, - 0x92, 0x90, 0x6a, 0x25, 0x49, 0xe7, 0x72, 0x2a, 0x76, 0x5b, 0x72, 0x8b, - 0x21, 0xaa, 0x9f, 0xa6, 0xe2, 0x04, 0xcd, 0xec, 0x35, 0x6c, 0xdf, 0x12, - 0x65, 0xad, 0x86, 0x68, 0x03, 0xe7, 0xad, 0x0b, 0x62, 0x29, 0x48, 0xd3, - 0x71, 0xec, 0xf3, 0x5a, 0x75, 0xad, 0x7c, 0x8c, 0xcd, 0x8a, 0xcc, 0x18, - 0x6f, 0xc1, 0x95, 0x08, 0xa8, 0x97, 0x86, 0x00, 0xb2, 0x5a, 0x8a, 0x4d, - 0x8a, 0xc1, 0xb2, 0xb8, 0xde, 0x4a, 0xf0, 0x6f, 0x5e, 0xbe, 0x69, 0x27, - 0x12, 0x1a, 0x17, 0x9c, 0x19, 0x56, 0x08, 0x6b, 0x8c, 0xf3, 0x35, 0xde, - 0xf2, 0xa2, 0xd7, 0x40, 0x0b, 0x89, 0x10, 0x73, 0x09, 0xdd, 0x31, 0x6d, - 0xd3, 0x56, 0x31, 0xda, 0xfd, 0xae, 0x71, 0xa4, 0x08, 0xa0, 0x1e, 0x7c, - 0x81, 0xa0, 0x58, 0xa6, 0xe9, 0x76, 0x79, 0xfa, 0xce, 0x78, 0x8c, 0x04, - 0x66, 0xec, 0x9e, 0x2b, 0x66, 0xa3, 0xdd, 0x7b, 0x40, 0x66, 0x5a, 0xdf, - 0x9b, 0x2d, 0xd8, 0x99, 0xbe, 0x7b, 0xbc, 0x90, 0xdd, 0xa6, 0xbd, 0x49, - 0x0d, 0x7f, 0x18, 0x04, 0xf0, 0x17, 0x41, 0x22, 0xd8, 0x5b, 0xad, 0x01, - 0x03, 0x1a, 0x81, 0xe8, 0x98, 0xfe, 0x8b, 0xd7, 0x60, 0x0a, 0x24, 0x81, - 0x46, 0x70, 0xca, 0x88, 0x0a, 0xfd, 0x84, 0x7e, 0xb2, 0x67, 0xf5, 0xf4, - 0x89, 0x36, 0x64, 0x10, 0xff, 0x71, 0x37, 0x6e, 0x98, 0x7f, 0x03, 0xf9, - 0xee, 0x79, 0xad, 0x8a, 0x60, 0xc4, 0x49, 0x61, 0xe5, 0xba, 0xe6, 0x3d, - 0xc5, 0x35, 0x76, 0xe9, 0x79, 0xde, 0xbd, 0xa2, 0xcb, 0x38, 0x22, 0xd8, - 0x14, 0x4c, 0x9f, 0x06, 0x79, 0x8c, 0xb9, 0x51, 0xfa, 0x3c, 0x4d, 0x1f, - 0xe5, 0x07, 0x81, 0x76, 0xdd, 0x84, 0x03, 0xf3, 0xc8, 0x55, 0xe8, 0xd1, - 0xec, 0x45, 0x6a, 0xde, 0x36, 0x27, 0x38, 0x5a, 0x99, 0x4f, 0x01, 0xac, - 0x0a, 0x50, 0x67, 0x9d, 0x47, 0xa8, 0xdd, 0x30, 0xd7, 0xae, 0xe1, 0x48, - 0x44, 0x13, 0x20, 0x76, 0x06, 0x4f, 0xcd, 0x36, 0x92, 0x56, 0xa8, 0x6a, - 0xfc, 0xe6, 0x72, 0xaf, 0xb1, 0x5b, 0xcf, 0xb0, 0xe3, 0x92, 0x59, 0x0c, - 0xae, 0x42, 0x6b, 0x91, 0xa2, 0x33, 0xd5, 0x59, 0x02, 0xce, 0xf6, 0xc5, - 0xe0, 0x1b, 0xd2, 0x1b, 0x03, 0x93, 0x50, 0x0b, 0xff, 0x0c, 0x64, 0xac, - 0x27, 0xf1, 0xd8, 0x6d, 0x6a, 0x12, 0xa2, 0x5c, 0x35, 0x3d, 0x9b, 0x42, - 0x39, 0x62, 0xb2, 0x65, 0x07, 0x21, 0x80, 0xc2, 0x3e, 0x06, 0xfa, 0xa4, - 0xdc, 0xf0, 0x23, 0xf0, 0x3a, 0x25, 0xb5, 0xbb, 0x44, 0x8b, 0x81, 0x25, - 0x98, 0x2a, 0xfd, 0x5e, 0x0f, 0x35, 0x5c, 0x6e, 0x98, 0xe5, 0x93, 0xab, - 0x46, 0x7d, 0xbe, 0x10, 0x92, 0xf8, 0x21, 0x6d, 0x7f, 0xbb, 0x22, 0x53, - 0x39, 0x95, 0x49, 0x0b, 0x73, 0xcb, 0x43, 0x9e, 0x27, 0x4c, 0xd8, 0x00, - 0x68, 0xea, 0xea, 0xe3, 0xfc, 0xc6, 0x76, 0x70, 0xfb, 0xfe, 0xae, 0x20, - 0xe2, 0x5f, 0x22, 0x1d, 0x26, 0x5e, 0x18, 0xef, 0x25, 0xe7, 0x88, 0x3a, - 0xd9, 0x22, 0xc2, 0x76, 0xb7, 0xfb, 0xb4, 0xfc, 0x38, 0x14, 0xbf, 0x27, - 0x80, 0xc9, 0xac, 0x10, 0x04, 0x7d, 0x17, 0x03, 0x05, 0x6c, 0xb1, 0xa2, - 0x4f, 0x6e, 0xfe, 0x14, 0xd3, 0x9f, 0x1b, 0x53, 0x32, 0xb0, 0x7d, 0x74, - 0x65, 0xee, 0xea, 0x0f, 0x65, 0xf3, 0x33, 0x8f, 0xac, 0xcb, 0xe5, 0xf3, - 0x66, 0xd5, 0x27, 0xb3, 0xa9, 0x5a, 0x96, 0xcf, 0x75, 0x3e, 0x31, 0x22, - 0x92, 0xe9, 0xf3, 0xb5, 0x7a, 0x86, 0xb7, 0xa3, 0x67, 0x20, 0x5a, 0xa9, - 0x39, 0x39, 0x38, 0x9a, 0x0f, 0x9e, 0x9d, 0x23, 0x17, 0x64, 0x29, 0x1e, - 0x5a, 0x66, 0xb8, 0x4a, 0x90, 0xd9, 0x7a, 0xe2, 0xb4, 0xa4, 0x3b, 0xe4, - 0x50, 0x78, 0x6a, 0x5a, 0xaa, 0x7c, 0xc0, 0x91, 0x9b, 0x7f, 0x28, 0x5d, - 0xca, 0x04, 0x3b, 0xeb, 0x3e, 0x8a, 0x09, 0xa5, 0x83, 0x43, 0xb7, 0x7e, - 0xd4, 0x9f, 0xff, 0x5e, 0x03, 0x04, 0xa1, 0xa0, 0xa2, 0x63, 0x2b, 0x7d, - 0x19, 0x9f, 0x29, 0x12, 0x07, 0x59, 0xd4, 0x6b, 0xb6, 0x60, 0xd1, 0x66, - 0xa5, 0x0d, 0x8c, 0xd2, 0x4c, 0x04, 0x78, 0x7f, 0x66, 0x71, 0x68, 0x5a, - 0x88, 0xdc, 0xee, 0xf0, 0x22, 0x20, 0x4d, 0x63, 0x26, 0x11, 0x84, 0x64, - 0xbb, 0x0b, 0x3c, 0x6e, 0xf2, 0xe2, 0x6d, 0xb5, 0x8f, 0x6d, 0x8b, 0x7c, - 0x4a, 0xe4, 0x99, 0xf0, 0x25, 0xe4, 0xdc, 0xaf, 0xfc, 0x67, 0x42, 0xa9, - 0xf8, 0x58, 0x51, 0x2c, 0x47, 0xa5, 0x7a, 0x3f, 0xa0, 0xfe, 0x7d, 0x75, - 0x63, 0x75, 0x59, 0x1d, 0x8b, 0x77, 0xbe, 0x0e, 0x3b, 0x68, 0xd0, 0xa0, - 0xc0, 0x70, 0xe6, 0xee, 0x79, 0x92, 0x58, 0x6f, 0x28, 0xa5, 0x5d, 0xb4, - 0xd0, 0x83, 0x0f, 0x5a, 0xdd, 0xa0, 0x2f, 0xb6, 0xa1, 0xfa, 0xcf, 0x00, - 0xc6, 0x5c, 0x7e, 0xd1, 0x07, 0x85, 0xc4, 0xf0, 0xd3, 0xcb, 0x18, 0x38, - 0xd6, 0x34, 0x10, 0xab, 0x73, 0x38, 0x83, 0xf8, 0xa7, 0x42, 0x11, 0xae, - 0x97, 0xce, 0x18, 0x75, 0xb3, 0x55, 0xf1, 0x3f, 0x65, 0x08, 0xe2, 0x81, - 0x84, 0xc1, 0x88, 0x5f, 0x18, 0x6d, 0x21, 0x07, 0xc7, 0xbf, 0x9e, 0x5e, - 0x89, 0x6f, 0xa9, 0x9c, 0x4a, 0xd2, 0xf5, 0x68, 0x1c, 0xe5, 0xa4, 0xff, - 0x52, 0xfd, 0xed, 0x20, 0xe4, 0x93, 0x0d, 0x91, 0x84, 0x51, 0x18, 0x0a, - 0x7b, 0xaf, 0x70, 0xfe, 0x12, 0x35, 0x25, 0xe6, 0x91, 0x20, 0xf2, 0xd3, - 0x62, 0x19, 0xfe, 0x70, 0x24, 0x06, 0xee, 0xc9, 0x91, 0xec, 0xcf, 0x1a, - 0x00, 0xe5, 0x99, 0x04, 0x6b, 0x7b, 0xc3, 0x9c, 0x07, 0x27, 0xce, 0x5d, - 0xab, 0x6b, 0x36, 0x1e, 0x43, 0xf8, 0x48, 0x24, 0xef, 0x24, 0x2b, 0x70, - 0x49, 0x2e, 0xd2, 0x6f, 0xd1, 0x9b, 0x36, 0x77, 0x85, 0x6c, 0xc7, 0x62, - 0xcf, 0x92, 0x66, 0xd4, 0x98, 0xa4, 0x05, 0x79, 0x1d, 0xb9, 0xf3, 0xf2, - 0x62, 0xce, 0xee, 0x4c, 0x1d, 0xbc, 0x9b, 0x72, 0xea, 0xe3, 0xad, 0x2c, - 0x9f, 0x71, 0x53, 0xb6, 0x5a, 0xd5, 0xdd, 0x46, 0x5f, 0xc6, 0x53, 0x3b, - 0x56, 0xf5, 0x8a, 0x5c, 0x9a, 0x65, 0x8e, 0x2a, 0x3e, 0x7d, 0xa2, 0xb3, - 0x87, 0x34, 0x77, 0xf2, 0xc2, 0x96, 0x7c, 0x99, 0xe0, 0xd0, 0x5b, 0xbe, - 0x57, 0x13, 0x78, 0x18, 0x48, 0x40, 0x85, 0x34, 0x27, 0x8d, 0x0c, 0x78, - 0xce, 0x75, 0x64, 0x7c, 0x1d, 0xd0, 0x23, 0x28, 0x6e, 0x62, 0x21, 0x46, - 0x5e, 0x48, 0x83, 0xcb, 0xb4, 0x7b, 0x16, 0x23, 0xbc, 0xbc, 0xee, 0x43, - 0x3e, 0x43, 0x0e, 0x95, 0x44, 0x55, 0x4d, 0xd4, 0xfa, 0x97, 0xf5, 0x04, - 0x35, 0x38, 0x70, 0xef, 0xd4, 0xc4, 0x66, 0xa6, 0xbc, 0xba, 0x20, 0xc8, - 0x97, 0x63, 0xc9, 0x6f, 0x1d, 0x74, 0xdd, 0x37, 0x49, 0xa9, 0xe6, 0xae, - 0xf2, 0xf3, 0x4f, 0x38, 0x3c, 0x1d, 0x8d, 0x12, 0xe3, 0xf8, 0x7e, 0xc2, - 0x3d, 0xf6, 0x10, 0xcd, 0xc8, 0x67, 0x96, 0xad, 0x41, 0x7e, 0x60, 0xa0, - 0x48, 0x42, 0x22, 0x41, 0x97, 0xc5, 0x76, 0x5a, 0x6a, 0x63, 0x5e, 0xd4, - 0x62, 0xe5, 0xde, 0x20, 0x2f, 0xba, 0x07, 0xbe, 0x33, 0xd3, 0x9b, 0x33, - 0xef, 0x39, 0x0d, 0x79, 0x85, 0x93, 0x91, 0xc4, 0xf1, 0x54, 0x4d, 0xe4, - 0x1c, 0x99, 0xd0, 0x09, 0x52, 0x02, 0xd1, 0x16, 0x22, 0x8c, 0x99, 0xfe, - 0x13, 0x91, 0x1b, 0x43, 0x42, 0xaf, 0xcf, 0x39, 0xf1, 0x2f, 0x27, 0xc8, - 0x31, 0x90, 0xf9, 0x40, 0x5a, 0x26, 0x16, 0xa0, 0x26, 0x57, 0x84, 0x8b, - 0x58, 0xd0, 0xc3, 0x40, 0x6c, 0xed, 0xe8, 0x1d, 0xc2, 0x92, 0xc5, 0x54, - 0x47, 0x27, 0xc1, 0x20, 0x6d, 0xdf, 0xe2, 0x0e, 0xda, 0x68, 0xa0, 0xfc, - 0x23, 0x4b, 0xa1, 0x26, 0x55, 0x4c, 0x57, 0x6f, 0x7a, 0x28, 0xd2, 0x34, - 0x2a, 0x69, 0x0e, 0x68, 0xdd, 0x3f, 0xa2, 0xf1, 0x66, 0x4c, 0x3e, 0x03, - 0x73, 0x30, 0xbf, 0x70, 0x7b, 0xb8, 0x34, 0x8d, 0x47, 0x32, 0x51, 0x88, - 0x91, 0x0b, 0xf1, 0x2f, 0xb4, 0x37, 0xca, 0x86, 0x68, 0x45, 0xbd, 0xb9, - 0x86, 0x41, 0x33, 0x3d, 0xd9, 0xc7, 0x86, 0x9e, 0x0e, 0x5a, 0xc6, 0x8a, - 0xd2, 0xca, 0xe3, 0x09, 0x67, 0x74, 0x08, 0xf7, 0xf0, 0x44, 0x04, 0x15, - 0x31, 0xa3, 0x86, 0x7c, 0xa6, 0x2c, 0x8f, 0x43, 0x18, 0x16, 0x32, 0xdd, - 0xbd, 0x2a, 0x39, 0x6f, 0x9c, 0xdc, 0xac, 0x7f, 0x5c, 0x15, 0xfe, 0xa6, - 0x96, 0xdd, 0x22, 0x2f, 0xae, 0xe4, 0x02, 0xde, 0x3d, 0x8a, 0x50, 0x73, - 0x62, 0xac, 0x04, 0x13, 0x5e, 0x85, 0x40, 0x68, 0x6f, 0x13, 0x64, 0xb7, - 0x64, 0xd0, 0xdd, 0x5f, 0xa6, 0xd1, 0x68, 0x45, 0xf2, 0xef, 0xc4, 0xe9, - 0xfc, 0xae, 0x49, 0x01, 0x07, 0x17, 0x30, 0x23, 0x55, 0x87, 0x01, 0xe3, - 0x6b, 0xa2, 0xc2, 0xa2, 0x3f, 0x8a, 0x62, 0x78, 0xb0, 0xbd, 0xce, 0x92, - 0xb6, 0x35, 0x2f, 0xd9, 0x7b, 0xbd, 0x4c, 0xdd, 0x05, 0x45, 0x92, 0x35, - 0x16, 0xd3, 0xb0, 0x8c, 0xd3, 0x84, 0x1b, 0x5c, 0x20, 0x43, 0xd9, 0x3f, - 0x6c, 0x4c, 0x01, 0x4c, 0x52, 0xf8, 0x42, 0x9e, 0x1c, 0x9f, 0xaf, 0x88, - 0xdd, 0x9a, 0x85, 0xc1, 0x54, 0xd6, 0x79, 0x80, 0x1a, 0x9e, 0xf8, 0xea, - 0xd9, 0x3b, 0xfd, 0x5a, 0xa0, 0x6f, 0x5b, 0xf7, 0x13, 0x00, 0x9e, 0xc0, - 0xee, 0x36, 0x17, 0xc3, 0xa5, 0x5a, 0xe7, 0x19, 0x73, 0xcb, 0x7f, 0x14, - 0xc1, 0x7d, 0x55, 0xe4, 0x20, 0xe6, 0x98, 0xdc, 0x96, 0xe8, 0x53, 0x51, - 0x3b, 0x8c, 0xec, 0xcd, 0x8f, 0x90, 0xd9, 0x3a, 0x35, 0x37, 0xe2, 0x53, - 0x7c, 0x58, 0x7f, 0x57, 0xee, 0xa3, 0x6a, 0x54, 0xc4, 0x48, 0xb4, 0xa4, - 0x75, 0xf4, 0x3e, 0x8e, 0x55, 0x5e, 0x27, 0xc9, 0xb8, 0xc8, 0x44, 0x2a, - 0x97, 0x40, 0x75, 0x23, 0x28, 0x45, 0x1c, 0x00, 0xd2, 0xcd, 0xd9, 0x44, - 0xbe, 0x21, 0x6b, 0xf9, 0x78, 0x87, 0xd4, 0x46, 0x59, 0xf2, 0xbc, 0xd5, - 0xc1, 0x50, 0x87, 0xeb, 0xab, 0x73, 0xd5, 0x04, 0x31, 0x95, 0x14, 0x5f, - 0xd8, 0xe6, 0x14, 0x74, 0x9d, 0xef, 0x0e, 0xee, 0x11, 0xf7, 0x7b, 0xda, - 0xda, 0x97, 0xe6, 0x97, 0xb4, 0xe6, 0x1a, 0xd0, 0xa2, 0x72, 0x77, 0x4d, - 0x86, 0x42, 0x13, 0x75, 0x8b, 0x6c, 0xc7, 0x3d, 0xb2, 0x08, 0xa7, 0x72, - 0x53, 0xb2, 0x3f, 0xee, 0x75, 0x29, 0xcd, 0x6f, 0xba, 0x0c, 0xba, 0x6b, - 0x26, 0xa3, 0xbe, 0xf9, 0x75, 0xcd, 0x33, 0xdb, 0x6a, 0xdf, 0xae, 0xbe, - 0xae, 0x0f, 0xdf, 0x22, 0x37, 0x4b, 0x61, 0x0e, 0x38, 0xe7, 0x61, 0xbb, - 0xe4, 0xc5, 0x29, 0x54, 0x1b, 0x48, 0xa3, 0x27, 0xf0, 0xed, 0x54, 0x9d, - 0x14, 0xf9, 0xb1, 0x27, 0x07, 0x09, 0xc7, 0xa0, 0xf2, 0xe5, 0x6d, 0xb2, - 0x1f, 0x70, 0x0b, 0xd9, 0x52, 0x22, 0xa8, 0x2c, 0x11, 0xfd, 0x63, 0x6b, - 0x88, 0xb8, 0x0d, 0xd5, 0x2f, 0x9a, 0x47, 0x97, 0x44, 0x2b, 0x8a, 0xec, - 0x25, 0x06, 0xe5, 0x3f, 0x5a, 0x0e, 0xe7, 0xd5, 0x7c, 0x4d, 0x34, 0x3e, - 0xdd, 0x95, 0xbe, 0xce, 0xaf, 0x3d, 0xe8, 0xe9, 0x29, 0x5a, 0x90, 0xcf, - 0xc2, 0xc7, 0xd5, 0x97, 0xde, 0xde, 0x15, 0x30, 0xf2, 0x11, 0x2c, 0x6b, - 0x1d, 0x39, 0x25, 0x91, 0x34, 0x58, 0x92, 0xc7, 0x40, 0x23, 0x23, 0x94, - 0x2c, 0xf9, 0x0e, 0xf2, 0x3f, 0x5c, 0xb7, 0xfd, 0x65, 0xd4, 0xc7, 0x56, - 0x93, 0x19, 0xca, 0x2d, 0x31, 0xc1, 0xb4, 0x66, 0xe2, 0x83, 0x4f, 0x9b, - 0xf0, 0x65, 0x4e, 0x8e, 0xe8, 0x7d, 0xf0, 0x34, 0x8b, 0x30, 0xa4, 0x86, - 0xa0, 0xc4, 0xe9, 0x6c, 0xe3, 0x48, 0x04, 0x00, 0x46, 0xf4, 0xe4, 0x89, - 0xad, 0x3d, 0x11, 0x31, 0x4e, 0xe3, 0x2e, 0x4c, 0x7f, 0x98, 0x88, 0x67, - 0xa1, 0xbf, 0x17, 0xe7, 0x37, 0x7e, 0x88, 0x33, 0xd5, 0x35, 0x63, 0xdf, - 0x58, 0xd5, 0x35, 0x0d, 0x22, 0x43, 0x51, 0xe4, 0xf1, 0x17, 0xcb, 0x42, - 0x4f, 0x3c, 0xd1, 0xfc, 0x3d, 0xf2, 0x04, 0xa0, 0x31, 0x92, 0x74, 0x01, - 0x24, 0xc7, 0x4f, 0xd4, 0x25, 0x7b, 0x0a, 0x5c, 0x15, 0x15, 0x86, 0xfb, - 0x67, 0xe8, 0xb1, 0xb3, 0x51, 0x48, 0x07, 0x00, 0xc1, 0xbc, 0x9e, 0x05, - 0xb1, 0xa5, 0x1c, 0x3c, 0x6b, 0x13, 0x1b, 0x6b, 0x86, 0xe7, 0x44, 0x22, - 0x3f, 0x4c, 0x12, 0x7e, 0x18, 0x64, 0x63, 0x13, 0x33, 0xe0, 0xd6, 0x8f, - 0xf7, 0xd3, 0x1f, 0x37, 0xdd, 0xa5, 0xef, 0x98, 0x32, 0x6c, 0x8b, 0x2c, - 0x40, 0x94, 0x0f, 0x82, 0xb6, 0x23, 0x5d, 0xd3, 0xfb, 0x80, 0xbf, 0xf6, - 0x70, 0xaf, 0xa7, 0x1f, 0x16, 0x14, 0x5d, 0x9e, 0x43, 0x3d, 0xc2, 0xf3, - 0x72, 0x0e, 0x6f, 0xd2, 0x2e, 0x4c, 0x5e, 0x05, 0x5c, 0xcb, 0xfb, 0xd9, - 0xac, 0xfe, 0xe9, 0x6d, 0xfb, 0xb1, 0xc1, 0x15, 0xd4, 0x20, 0x46, 0xf1, - 0xd3, 0x8d, 0x6b, 0x36, 0x87, 0x05, 0x33, 0x9c, 0x05, 0x01, 0xfc, 0xcb, - 0xa9, 0xe5, 0x4c, 0xb1, 0xf0, 0x82, 0x43, 0x50, 0xf0, 0x0b, 0x33, 0x79, - 0x4d, 0xde, 0x18, 0x65, 0x54, 0x5b, 0x47, 0xde, 0x8a, 0x28, 0xbe, 0xc3, - 0x85, 0xb1, 0x59, 0xeb, 0xc5, 0x6a, 0x22, 0x4a, 0x8d, 0xf4, 0xbe, 0xb5, - 0x02, 0x48, 0x07, 0xff, 0xb4, 0x2c, 0x39, 0x13, 0x18, 0x58, 0x3e, 0xb5, - 0xda, 0x55, 0xad, 0x1c, 0x5e, 0x80, 0x5e, 0xae, 0x80, 0xc9, 0x1f, 0xf5, - 0xdd, 0xd2, 0x72, 0x5c, 0x75, 0x67, 0x64, 0x74, 0x5b, 0xa9, 0xa3, 0xe5, - 0x53, 0x19, 0x15, 0xb3, 0xeb, 0xb3, 0x80, 0x6d, 0x6c, 0xfd, 0xb3, 0x82, - 0x0c, 0x34, 0x30, 0xae, 0x5f, 0x33, 0xf2, 0x4f, 0x35, 0xee, 0x4c, 0x50, - 0x88, 0x46, 0xa1, 0x65, 0x1a, 0x3f, 0x44, 0x3c, 0x59, 0x75, 0x88, 0x20, - 0x1c, 0x04, 0xc3, 0x47, 0x5d, 0xcb, 0xe8, 0x4a, 0x39, 0x49, 0xcf, 0xfe, - 0xdc, 0xb2, 0xb9, 0x5f, 0x02, 0xc7, 0x31, 0xc6, 0x27, 0x8b, 0x81, 0x8c, - 0xee, 0xe5, 0x1d, 0x21, 0x8a, 0xca, 0xcf, 0x69, 0xc6, 0x45, 0xc2, 0x0b, - 0xd3, 0x45, 0x69, 0x65, 0xf3, 0x0d, 0x1a, 0xf2, 0x73, 0xe0, 0x4c, 0x6e, - 0x5e, 0x33, 0x80, 0x7f, 0x7c, 0xa3, 0x53, 0xf6, 0x57, 0xd2, 0x9f, 0x92, - 0x1c, 0x3a, 0xea, 0xbf, 0xe2, 0x40, 0xc5, 0xae, 0x16, 0xea, 0x61, 0xe6, - 0x0f, 0x5b, 0x89, 0x7e, 0x85, 0xb2, 0x35, 0x72, 0xac, 0xfa, 0xe1, 0x3f, - 0xfe, 0x69, 0x85, 0x84, 0x3a, 0x16, 0xc2, 0x75, 0xb0, 0x33, 0x1f, 0x84, - 0x0c, 0x1c, 0x1a, 0x0b, 0xa6, 0x3c, 0xa1, 0x6c, 0x95, 0x85, 0x4f, 0xe2, - 0xb7, 0x82, 0x3b, 0x66, 0x4b, 0x52, 0xab, 0xd0, 0x3b, 0x50, 0xbb, 0xe3, - 0x8a, 0x05, 0xb8, 0x35, 0xfb, 0x9d, 0xc1, 0xf2, 0x18, 0xfc, 0x94, 0xc0, - 0xb5, 0x8d, 0x31, 0x07, 0x92, 0x37, 0x48, 0xa7, 0x89, 0xe3, 0xe5, 0xde, - 0x7d, 0x64, 0xd5, 0x13, 0xc4, 0x9f, 0x88, 0x67, 0xc1, 0x65, 0x2e, 0x26, - 0xdb, 0x8d, 0xf4, 0x3f, 0xbd, 0x9e, 0x4b, 0x3c, 0x34, 0x6b, 0x2c, 0x3f, - 0x78, 0x2d, 0x8c, 0xf0, 0xf6, 0x7e, 0xf9, 0x15, 0xdf, 0x6a, 0x03, 0x59, - 0xb6, 0xf6, 0x9a, 0xb8, 0x55, 0xa9, 0x70, 0xb3, 0xc0, 0x1b, 0xe7, 0xaf, - 0xbf, 0xd2, 0xdc, 0x4e, 0x9a, 0x93, 0xb9, 0xd2, 0x6a, 0x62, 0xca, 0x64, - 0x34, 0xed, 0x5a, 0x3f, 0x56, 0xa5, 0xc8, 0x4d, 0xd9, 0x2f, 0x33, 0xc2, - 0x44, 0xd6, 0xc4, 0xe8, 0xcc, 0xa1, 0x93, 0xc6, 0xb6, 0x30, 0x21, 0x0c, - 0x44, 0x75, 0xd8, 0x67, 0x68, 0x8f, 0xc7, 0xb3, 0x84, 0xa4, 0x12, 0x53, - 0x74, 0xd9, 0x4a, 0xb0, 0x53, 0xde, 0x78, 0x28, 0x67, 0xf0, 0x08, 0x7f, - 0x96, 0x29, 0x8d, 0x39, 0xb0, 0xcb, 0xb5, 0xa6, 0x91, 0x9c, 0x1c, 0xe9, - 0x39, 0x49, 0xa5, 0x16, 0x16, 0x28, 0xfb, 0xf8, 0xfd, 0x4d, 0x21, 0x0e, - 0xc0, 0x15, 0xcf, 0x7e, 0x2b, 0x48, 0x18, 0x4e, 0xf3, 0xd1, 0xa2, 0x69, - 0x0f, 0x1e, 0x4c, 0x89, 0xf9, 0x2c, 0xff, 0x7d, 0xde, 0x5e, 0x24, 0x59, - 0x57, 0x47, 0xf2, 0x5c, 0x27, 0x82, 0x03, 0xef, 0xb8, 0x5a, 0x86, 0xa6, - 0xf9, 0xb4, 0x44, 0xfb, 0x39, 0x9b, 0xc8, 0xce, 0x9f, 0x36, 0x16, 0x11, - 0x5c, 0x8c, 0x57, 0xef, 0x52, 0xc1, 0x61, 0xed, 0xab, 0x22, 0x93, 0x78, - 0xa5, 0xe7, 0x53, 0x96, 0xdc, 0xcf, 0xe6, 0xab, 0xa7, 0x35, 0x33, 0x58, - 0x2f, 0x6d, 0x0c, 0xce, 0xe0, 0xd5, 0x08, 0x08, 0x2e, 0x81, 0x14, 0x26, - 0x11, 0x19, 0xbe, 0x82, 0x6a, 0x62, 0x35, 0x27, 0x26, 0x2d, 0x14, 0x15, - 0x77, 0xb3, 0xf0, 0x8e, 0x79, 0x20, 0x12, 0xd0, 0xa2, 0xe5, 0x66, 0x46, - 0xe4, 0xe3, 0x9a, 0x13, 0xac, 0x9b, 0x28, 0xd9, 0x92, 0x7e, 0xb9, 0x24, - 0xb5, 0x36, 0x28, 0xcf, 0xeb, 0x6f, 0xb8, 0x70, 0xb6, 0x21, 0x33, 0xb6, - 0xaa, 0x41, 0x94, 0xbd, 0x0b, 0x60, 0xc9, 0x6e, 0x23, 0x12, 0xb4, 0x4c, - 0x8d, 0xba, 0x5d, 0x05, 0xb1, 0xd5, 0x14, 0x1d, 0x98, 0x70, 0x1d, 0x66, - 0xdb, 0x52, 0x98, 0xd0, 0xab, 0xd9, 0xd3, 0xbe, 0x7e, 0x72, 0xd2, 0x02, - 0x05, 0x22, 0xbb, 0x98, 0xca, 0xa2, 0xab, 0x4c, 0x71, 0x1b, 0x27, 0x29, - 0x93, 0xff, 0xd1, 0xb6, 0x8d, 0xa1, 0xe7, 0x09, 0x3a, 0x95, 0x1e, 0x17, - 0x53, 0xe9, 0x13, 0x52, 0x4d, 0x7d, 0xa4, 0x33, 0x47, 0x8c, 0x28, 0x5a, - 0x2c, 0x12, 0x88, 0xb3, 0xf7, 0x1e, 0xdf, 0x93, 0x3a, 0xed, 0xe2, 0xc6, - 0x42, 0xa1, 0x66, 0x58, 0xa9, 0x4a, 0x6b, 0x78, 0xb5, 0x8a, 0x6e, 0x2e, - 0xd1, 0x15, 0x86, 0x51, 0x18, 0x90, 0x50, 0x71, 0xbd, 0x6b, 0xd4, 0x4d, - 0x6c, 0x43, 0xc0, 0x55, 0x88, 0x5a, 0x2d, 0x2d, 0xcc, 0xc6, 0x9e, 0xb8, - 0xcf, 0xf2, 0x9a, 0xd0, 0xbe, 0xf0, 0xb7, 0xa9, 0x5c, 0xb4, 0x1c, 0xd4, - 0xdd, 0x45, 0xe4, 0xfa, 0x59, 0xbb, 0x50, 0x7c, 0xa3, 0x65, 0x9e, 0x3f, - 0x14, 0x34, 0xf4, 0x06, 0x20, 0x5f, 0x96, 0x46, 0x58, 0x78, 0x58, 0x3d, - 0x19, 0x40, 0x13, 0x0b, 0xbd, 0xdf, 0xe4, 0xc0, 0x9b, 0x4d, 0x73, 0xe4, - 0xa3, 0x79, 0x3d, 0xa1, 0x55, 0x47, 0xb3, 0x41, 0x34, 0x61, 0xe3, 0x65, - 0x86, 0xbb, 0x30, 0x8d, 0xc5, 0x3e, 0x3d, 0x14, 0x12, 0x9e, 0x63, 0x99, - 0xb7, 0xc3, 0x36, 0xb0, 0x6e, 0xce, 0x9f, 0xe6, 0xa9, 0x02, 0x11, 0xda, - 0x2b, 0x7c, 0xf5, 0xbb, 0x90, 0xf0, 0xe7, 0x47, 0xba, 0x32, 0x26, 0x96, - 0x56, 0x52, 0x14, 0x2c, 0x26, 0x97, 0xd8, 0xf8, 0x99, 0xea, 0xee, 0x7e, - 0xc2, 0xb8, 0xfe, 0x48, 0xe4, 0xe2, 0x8d, 0x44, 0x42, 0x0b, 0x8c, 0x5d, - 0xe9, 0x67, 0x63, 0x66, 0x5b, 0x38, 0xd4, 0x99, 0x31, 0xeb, 0x66, 0x18, - 0x36, 0x52, 0xca, 0xad, 0x0f, 0x6b, 0x80, 0x94, 0xfa, 0xf6, 0xba, 0x68, - 0x1a, 0xd5, 0xf2, 0x5f, 0x6f, 0x19, 0xff, 0x74, 0x35, 0x1d, 0xe5, 0x6a, - 0x3f, 0xa4, 0x5c, 0x49, 0x0c, 0xa5, 0x6c, 0xce, 0xda, 0xa3, 0xa9, 0x3e, - 0x6e, 0x7a, 0x35, 0xe8, 0x46, 0x3f, 0xab, 0x23, 0x95, 0xba, 0x2c, 0xa9, - 0xdf, 0x78, 0xeb, 0x8b, 0x57, 0x9b, 0xf5, 0x3b, 0x56, 0x3f, 0x80, 0x74, - 0x8d, 0x87, 0x98, 0xe0, 0x63, 0x5a, 0x7b, 0xfd, 0x01, 0x83, 0x25, 0xda, - 0xbc, 0xf4, 0xcf, 0xb7, 0x4c, 0xe6, 0xf5, 0x9c, 0x5c, 0x57, 0xb3, 0xc9, - 0xc6, 0x99, 0x29, 0x40, 0x73, 0xf5, 0x15, 0x02, 0x4a, 0x3c, 0x54, 0xc9, - 0xc5, 0xd1, 0xa3, 0x5a, 0xf7, 0x07, 0xbe, 0xe7, 0x7c, 0x04, 0xf1, 0xb4, - 0x92, 0xce, 0x5a, 0xce, 0xe9, 0x44, 0x9e, 0xb9, 0x36, 0xc7, 0x1e, 0x05, - 0x69, 0xaf, 0xe5, 0x0c, 0x51, 0x7f, 0x3a, 0x86, 0xf3, 0x75, 0xcd, 0x5e, - 0x97, 0x89, 0xa3, 0xb0, 0x98, 0xfd, 0x01, 0xb3, 0xd2, 0x65, 0x1f, 0x6e, - 0x6d, 0x8c, 0x7b, 0x6a, 0xdc, 0x7e, 0x0e, 0xe5, 0x64, 0xdf, 0x7f, 0x47, - 0xce, 0x87, 0xf4, 0xe1, 0x39, 0x78, 0x21, 0xfb, 0x17, 0x30, 0x0c, 0xa3, - 0x4f, 0x92, 0xa8, 0xe8, 0xf4, 0x2a, 0x30, 0xb6, 0xe5, 0xb4, 0x3e, 0x6b, - 0x25, 0x74, 0x3e, 0x50, 0x0a, 0x03, 0xd2, 0x77, 0x5b, 0x3e, 0xc1, 0xee, - 0xd7, 0x59, 0x81, 0x93, 0x83, 0xd5, 0x9f, 0xa0, 0xc5, 0x8c, 0x80, 0x0e, - 0xa4, 0x4e, 0x59, 0xba, 0x1a, 0x95, 0x49, 0xe2, 0x1d, 0x0b, 0xcf, 0xe2, - 0x0b, 0x0a, 0xae, 0x38, 0x61, 0x3c, 0xb4, 0xc7, 0x0a, 0xd3, 0xfa, 0x6e, - 0xe6, 0xc9, 0xf3, 0x95, 0x1f, 0x43, 0x31, 0x0d, 0x0a, 0x2b, 0x2b, 0x9d, - 0xb2, 0x6b, 0xe4, 0xd4, 0x8d, 0x23, 0x77, 0xfb, 0xa2, 0xfe, 0xdc, 0x79, - 0xab, 0x53, 0x39, 0x5a, 0xf0, 0xef, 0xa0, 0xbd, 0xd5, 0xbb, 0x94, 0xea, - 0xe3, 0x5d, 0xa1, 0xf1, 0x65, 0xca, 0x52, 0x26, 0x53, 0x2d, 0xbd, 0x6e, - 0x6f, 0x1d, 0xd4, 0x2f, 0x56, 0x79, 0xf1, 0x71, 0x7d, 0x85, 0xb8, 0x26, - 0xb7, 0x13, 0xbf, 0xa3, 0xd1, 0xe1, 0x65, 0xb7, 0xb7, 0x85, 0x57, 0x09, - 0xc8, 0xde, 0xa3, 0x53, 0x10, 0xa6, 0x53, 0x62, 0xd4, 0x1d, 0xb2, 0xae, - 0xd2, 0x8f, 0x33, 0xc6, 0x6c, 0xcf, 0x96, 0x44, 0x9b, 0xb2, 0xbe, 0x8f, - 0x90, 0xee, 0x7b, 0x59, 0x93, 0x7f, 0x64, 0x5b, 0x49, 0x5f, 0x12, 0x8d, - 0x9b, 0x0b, 0x6d, 0xa9, 0xe8, 0x74, 0xf8, 0x35, 0xeb, 0x55, 0x60, 0x21, - 0x85, 0xde, 0x8f, 0xe5, 0x55, 0x7c, 0x5f, 0x7e, 0xbc, 0x03, 0xc9, 0xbe, - 0xbb, 0xbe, 0x16, 0x57, 0xf8, 0xc0, 0x05, 0x8f, 0xb8, 0x88, 0xc5, 0x9e, - 0xdb, 0x4a, 0x55, 0x77, 0x2d, 0x2d, 0x3b, 0xc4, 0xd3, 0xda, 0x3e, 0x37, - 0x62, 0x2a, 0x53, 0xf0, 0xd0, 0x46, 0x34, 0x8f, 0x71, 0xf6, 0xe0, 0x63, - 0x6d, 0xef, 0x32, 0xe5, 0x2c, 0x67, 0xf5, 0x50, 0x3d, 0xad, 0xad, 0x23, - 0xa9, 0xe9, 0xf8, 0x11, 0x86, 0xde, 0x4e, 0xd6, 0x26, 0xb4, 0x60, 0x19, - 0x88, 0x46, 0x83, 0xbb, 0x85, 0x00, 0x41, 0x5b, 0x4a, 0x80, 0x0a, 0x92, - 0x74, 0xea, 0xa7, 0xcd, 0xc3, 0x84, 0x11, 0x74, 0x4a, 0xb2, 0x24, 0x9b, - 0xbd, 0x61, 0x19, 0x65, 0x87, 0xd9, 0xd3, 0x03, 0xe9, 0x6a, 0xb7, 0x58, - 0xac, 0xc1, 0x75, 0x1c, 0x6e, 0xd9, 0xe5, 0xf5, 0xff, 0x63, 0xf7, 0x4a, - 0x17, 0x12, 0xf7, 0xdb, 0xd5, 0xd8, 0x8d, 0x7c, 0xb7, 0xed, 0x5e, 0xc1, - 0xa6, 0xcf, 0xce, 0x3d, 0x09, 0x46, 0x32, 0x77, 0xff, 0xf2, 0x9f, 0x4a, - 0x6d, 0x29, 0x4d, 0xa8, 0xf0, 0x01, 0x77, 0x13, 0x5d, 0x48, 0xc0, 0x00, - 0x73, 0xa8, 0xe0, 0xf7, 0x46, 0xd8, 0x9e, 0xe4, 0xf3, 0x54, 0xef, 0xfd, - 0xce, 0x49, 0x26, 0x6c, 0xa2, 0xb8, 0xf5, 0x94, 0xed, 0x16, 0x4d, 0xa2, - 0x33, 0x50, 0x91, 0x3a, 0xb5, 0x03, 0x20, 0x15, 0x9e, 0xc0, 0x3f, 0x63, - 0xd3, 0xb5, 0xba, 0xe8, 0x23, 0xb2, 0xff, 0x35, 0xf2, 0x3d, 0x53, 0x58, - 0x6d, 0xb6, 0xd1, 0xd7, 0x37, 0xfd, 0x2d, 0x97, 0x94, 0x3e, 0x0c, 0x4c, - 0xfe, 0xd4, 0xa1, 0xe3, 0x0c, 0x3a, 0xab, 0x91, 0x0d, 0x50, 0x63, 0x34, - 0xb9, 0x0f, 0xf6, 0x4b, 0x9c, 0xf6, 0xb9, 0x3f, 0xc4, 0x01, 0x8c, 0x1a, - 0xd5, 0x25, 0xdd, 0xbe, 0x93, 0x75, 0x5e, 0xc4, 0xf2, 0x8a, 0xb3, 0xc1, - 0x4a, 0xe5, 0x37, 0x53, 0x8b, 0x13, 0x9a, 0x47, 0x6e, 0x4a, 0x14, 0x99, - 0x64, 0x9d, 0x4f, 0xaf, 0xd5, 0x73, 0x57, 0x1e, 0xba, 0xa8, 0x80, 0x4c, - 0xb6, 0xca, 0x37, 0xed, 0x3d, 0xde, 0xbf, 0xc1, 0x7b, 0x34, 0xfd, 0xc4, - 0x37, 0xf9, 0x92, 0x86, 0xfa, 0x7a, 0x29, 0xce, 0xd6, 0x33, 0x09, 0x9c, - 0x89, 0xf9, 0xdc, 0x95, 0x72, 0x84, 0x2e, 0x67, 0x46, 0x42, 0x76, 0xe7, - 0x44, 0x2f, 0xf1, 0xd0, 0xe5, 0x90, 0x43, 0xa2, 0xf7, 0xd1, 0x16, 0x59, - 0xb2, 0xea, 0x12, 0x69, 0x9d, 0xc4, 0x6e, 0xbd, 0xd8, 0x97, 0x34, 0x25, - 0x7c, 0x88, 0x7e, 0x09, 0x09, 0x84, 0x3d, 0x7d, 0xac, 0xff, 0xf6, 0x68, - 0x8a, 0x9b, 0x50, 0xa0, 0x6a, 0x05, 0x91, 0x77, 0xd8, 0x53, 0x73, 0x4d, - 0x50, 0x9f, 0xa1, 0x74, 0x93, 0x36, 0xd2, 0xd9, 0xe5, 0x11, 0x79, 0x05, - 0x5c, 0x32, 0x27, 0x99, 0x3d, 0x78, 0x02, 0x5c, 0x2d, 0x7c, 0xfd, 0x66, - 0x8c, 0xd2, 0xa9, 0x1e, 0x85, 0x23, 0xb7, 0xa6, 0xdf, 0x76, 0x9b, 0x07, - 0x0c, 0xde, 0xde, 0x35, 0x06, 0x4e, 0x29, 0xa8, 0xfc, 0xfc, 0x30, 0x07, - 0xbf, 0xa9, 0xf6, 0x6b, 0x31, 0xff, 0xdb, 0xac, 0x60, 0x80, 0x35, 0x83, - 0x66, 0xb4, 0x3f, 0xef, 0x1e, 0x3a, 0xb4, 0x81, 0x9d, 0xe2, 0x26, 0x66, - 0x5f, 0x3c, 0x8d, 0x07, 0x55, 0x2c, 0x4b, 0xd6, 0xae, 0xa7, 0x70, 0x7b, - 0x7f, 0x97, 0xe9, 0xe0, 0xab, 0x1d, 0xc3, 0x95, 0x9e, 0x79, 0xff, 0xc8, - 0x91, 0x26, 0xd8, 0xb3, 0x7e, 0xbf, 0xa1, 0x16, 0x5c, 0xab, 0x2f, 0xe7, - 0x6a, 0xb5, 0x13, 0x4f, 0xc2, 0x24, 0xc2, 0xb9, 0x6c, 0x4a, 0x46, 0xda, - 0x76, 0x6c, 0x49, 0x7d, 0x3c, 0xbe, 0xe9, 0x92, 0x1c, 0xf3, 0xc3, 0xd6, - 0x8d, 0x2b, 0xcd, 0x17, 0x03, 0x43, 0xe7, 0x1c, 0x14, 0x1f, 0x8d, 0x95, - 0xba, 0xf0, 0x70, 0x24, 0x9e, 0x06, 0x12, 0x14, 0x5d, 0x69, 0x09, 0xef, - 0xde, 0xd9, 0x80, 0xeb, 0x7b, 0x7e, 0x0a, 0x9f, 0x70, 0x9d, 0x1c, 0x1b, - 0xa3, 0xa4, 0x42, 0xa4, 0x09, 0xe9, 0xec, 0xda, 0x6a, 0x90, 0x9c, 0xb1, - 0x55, 0xe9, 0xe8, 0xff, 0x2e, 0xdf, 0x72, 0xb7, 0x1b, 0xe4, 0xa7, 0x5d, - 0x28, 0xd0, 0xc7, 0x53, 0x74, 0x13, 0xd1, 0x5f, 0x2b, 0x21, 0x89, 0xe9, - 0xc5, 0xb7, 0x60, 0x1f, 0xf3, 0x02, 0x63, 0xe1, 0x49, 0x5e, 0x95, 0xd7, - 0xfb, 0xc2, 0xfe, 0x46, 0x1c, 0xea, 0xe2, 0xe8, 0xdd, 0xba, 0x00, 0xc9, - 0x22, 0xd6, 0xfa, 0xd7, 0xc6, 0xee, 0x08, 0xd0, 0xce, 0x5a, 0x24, 0x77, - 0xb2, 0x27, 0xd5, 0x7b, 0xb1, 0x04, 0xd5, 0x91, 0x3b, 0xdb, 0xec, 0x30, - 0xca, 0xb4, 0x65, 0x50, 0xd6, 0xc5, 0xad, 0x3f, 0x97, 0x83, 0xad, 0x8e, - 0xbb, 0x23, 0xdc, 0x06, 0x86, 0xd7, 0x89, 0xd9, 0xae, 0x2d, 0xf2, 0x6b, - 0xb2, 0x4d, 0x74, 0x4c, 0x7e, 0x03, 0xed, 0xe9, 0xed, 0x8b, 0x16, 0x82, - 0xc5, 0x28, 0x33, 0x87, 0xcf, 0x9d, 0xc9, 0x55, 0x8b, 0x83, 0x17, 0x58, - 0xce, 0xca, 0xbc, 0x42, 0x89, 0x97, 0xc5, 0x1f, 0x27, 0x67, 0x9c, 0xf4, - 0x0d, 0xc9, 0xbe, 0x9a, 0x53, 0x14, 0x56, 0x9b, 0xe9, 0xc3, 0x9b, 0x3f, - 0xdd, 0x3e, 0x1a, 0x68, 0x37, 0x57, 0x5a, 0x69, 0x9a, 0xeb, 0xd1, 0x02, - 0x21, 0xc5, 0x7b, 0x7b, 0xd3, 0x95, 0x5a, 0xca, 0xf8, 0x72, 0xaa, 0xe1, - 0x9a, 0x15, 0x5b, 0xa6, 0xf0, 0x06, 0x9d, 0x89, 0xb0, 0xab, 0x6c, 0xfd, - 0xbe, 0x53, 0x6c, 0x1b, 0x7e, 0xc1, 0x5e, 0xb9, 0x4a, 0x2e, 0xe7, 0xba, - 0xf5, 0xad, 0x2b, 0x56, 0x80, 0xd3, 0xdb, 0xc5, 0xee, 0x02, 0x80, 0xa0, - 0xb6, 0xc4, 0x9c, 0xf1, 0x85, 0x03, 0xb9, 0x69, 0xc5, 0x20, 0x14, 0x56, - 0x64, 0xb4, 0xc9, 0xeb, 0x34, 0xf4, 0xb7, 0x60, 0xff, 0xe3, 0x07, 0x6f, - 0xab, 0x98, 0x8b, 0x0e, 0xc2, 0x83, 0x13, 0xff, 0xbe, 0x7e, 0x29, 0x92, - 0x0d, 0xdd, 0x32, 0x72, 0x33, 0x07, 0x08, 0xd2, 0x88, 0xde, 0xbe, 0x2c, - 0xc9, 0x16, 0x9b, 0xa1, 0xe5, 0x02, 0x91, 0x0d, 0xfe, 0x1f, 0x67, 0x67, - 0xd0, 0x4c, 0xb2, 0x2d, 0x60, 0xfc, 0x91, 0x37, 0xe1, 0x30, 0xe2, 0x34, - 0xf2, 0x1a, 0x5f, 0x37, 0x98, 0x1d, 0xdc, 0xda, 0x2a, 0x51, 0xcd, 0xf8, - 0xd8, 0xd7, 0xe8, 0xf3, 0x2c, 0xf6, 0xa8, 0xb4, 0x63, 0x8f, 0x48, 0x01, - 0x85, 0xf0, 0xe9, 0x32, 0x9f, 0x6a, 0xd6, 0xe2, 0xcb, 0xcd, 0xb5, 0xf2, - 0x52, 0x63, 0x92, 0x56, 0xa8, 0x96, 0x18, 0x8c, 0x28, 0xa9, 0x7d, 0x4a, - 0x7e, 0xde, 0x46, 0x9f, 0xd0, 0x3f, 0x9b, 0xb9, 0x9f, 0x01, 0x32, 0xd3, - 0x63, 0x3b, 0x2c, 0xd3, 0x5b, 0x60, 0xf1, 0x85, 0x85, 0xa2, 0x80, 0xc0, - 0x2e, 0xa9, 0x35, 0x23, 0x9c, 0x6b, 0x5f, 0xac, 0xb0, 0xb2, 0x94, 0x5c, - 0x30, 0x74, 0xf3, 0x24, 0xb1, 0x05, 0xb5, 0x4c, 0x6e, 0x97, 0x75, 0x4b, - 0xac, 0x6a, 0xb4, 0x5c, 0x82, 0x22, 0x5e, 0xc5, 0x6f, 0x47, 0x4c, 0x89, - 0xe6, 0xea, 0xfc, 0xf7, 0x87, 0x9a, 0x60, 0xc4, 0x6a, 0x3b, 0x3b, 0xc5, - 0x88, 0xcc, 0xa6, 0x7c, 0xba, 0x3e, 0xcb, 0x32, 0x77, 0x5e, 0x54, 0x3f, - 0x0d, 0x07, 0x1a, 0x6b, 0xce, 0x4f, 0xd1, 0xff, 0xa6, 0x54, 0x19, 0x0a, - 0xc4, 0xcc, 0x0a, 0x21, 0x53, 0x10, 0x9a, 0x3a, 0xad, 0x75, 0x61, 0xbd, - 0xe2, 0x20, 0x11, 0xc4, 0x04, 0x72, 0x15, 0x24, 0x67, 0x2c, 0x9e, 0x3c, - 0x3d, 0x31, 0xe5, 0x18, 0xc0, 0x68, 0x9d, 0x03, 0x89, 0x02, 0x0d, 0x89, - 0x49, 0x92, 0x4f, 0x0e, 0x13, 0x7a, 0x70, 0xd9, 0x77, 0x51, 0x6e, 0xc1, - 0xcc, 0xc5, 0xf8, 0xa1, 0x35, 0x9e, 0xc6, 0xdb, 0xc9, 0x87, 0x80, 0xdd, - 0x94, 0x42, 0x46, 0x4f, 0xfe, 0x7f, 0x0d, 0x05, 0xca, 0x21, 0x33, 0x64, - 0x63, 0xe0, 0x62, 0xde, 0xb3, 0x1e, 0xa3, 0xc5, 0x9d, 0x5c, 0x58, 0x5d, - 0x76, 0x42, 0xcb, 0xda, 0xc6, 0x12, 0x7e, 0x97, 0xa6, 0xf7, 0xcb, 0xed, - 0x5d, 0x3a, 0x87, 0x31, 0x05, 0x1d, 0x8b, 0xba, 0x75, 0x33, 0x8d, 0x86, - 0x04, 0xec, 0xbe, 0x7c, 0xa1, 0x5a, 0x1a, 0x77, 0x79, 0x18, 0x4e, 0x8b, - 0x85, 0xe0, 0xac, 0x0f, 0x71, 0x4f, 0xd1, 0x19, 0xb8, 0x31, 0x3e, 0x8d, - 0x47, 0x86, 0x06, 0x36, 0xa2, 0xde, 0xe1, 0x14, 0x5a, 0xf2, 0xb2, 0xc5, - 0x48, 0x89, 0x69, 0xf1, 0x2f, 0x96, 0x25, 0x44, 0x9c, 0x5e, 0xe6, 0x63, - 0x8c, 0xd1, 0xa6, 0x2f, 0xfc, 0x79, 0xe2, 0xbb, 0x42, 0xde, 0x69, 0x19, - 0x52, 0xda, 0x68, 0xd2, 0x4e, 0xe6, 0xd3, 0x07, 0x1f, 0x8e, 0x48, 0x70, - 0xdb, 0xc8, 0x6d, 0xb6, 0xe4, 0xed, 0x4d, 0x99, 0x19, 0x47, 0x2b, 0x53, - 0xf6, 0x7f, 0xbe, 0x18, 0x8f, 0xe8, 0xa5, 0x70, 0x20, 0xfc, 0x67, 0xee, - 0x6e, 0xbd, 0x4e, 0x3e, 0xc3, 0x35, 0x91, 0x51, 0x9a, 0xdf, 0x45, 0xb0, - 0x67, 0xf4, 0x0b, 0x8c, 0xcd, 0x37, 0xf6, 0xee, 0x96, 0xa0, 0xc1, 0xd3, - 0x3c, 0xa1, 0x6d, 0xbd, 0x50, 0xa6, 0xa8, 0xba, 0x7a, 0xbf, 0x4a, 0x5e, - 0xb3, 0x26, 0x9a, 0xb2, 0x5c, 0xe3, 0xf0, 0x1d, 0x4d, 0x6a, 0xbc, 0xc0, - 0x21, 0xb4, 0x09, 0x54, 0xdc, 0xf1, 0x47, 0x67, 0xc1, 0x8c, 0x95, 0x80, - 0x2b, 0x13, 0x40, 0x9a, 0x67, 0x8e, 0xc1, 0x87, 0xee, 0x4d, 0x80, 0xa6, - 0xe6, 0xfc, 0x4d, 0xc9, 0xf2, 0x33, 0x66, 0x34, 0xda, 0xfe, 0x38, 0x29, - 0x77, 0xc7, 0x8f, 0x4c, 0x4e, 0x36, 0x8f, 0xa2, 0x56, 0x3a, 0xdd, 0xea, - 0xcb, 0x52, 0x49, 0x67, 0xcf, 0xae, 0x71, 0x1d, 0xc2, 0xeb, 0x1f, 0x3b, - 0x99, 0x1e, 0x7c, 0xb4, 0x90, 0xaa, 0xc2, 0x73, 0xc9, 0xbf, 0x72, 0x9a, - 0xb5, 0x94, 0xab, 0x98, 0xfd, 0x3e, 0xb2, 0xb6, 0xf1, 0xb9, 0x12, 0xf2, - 0xa2, 0x5d, 0x28, 0xdd, 0xfa, 0x90, 0x6f, 0xad, 0x86, 0xb7, 0x9c, 0x15, - 0xea, 0xe4, 0x41, 0x8f, 0xff, 0x89, 0x7f, 0xe7, 0xa8, 0xce, 0xf0, 0xaa, - 0x11, 0x57, 0xa3, 0xa6, 0xc8, 0xb7, 0x80, 0x4d, 0x3c, 0xf1, 0xf2, 0x94, - 0xa6, 0x45, 0x57, 0x54, 0xc6, 0x4d, 0x15, 0xd6, 0x67, 0xae, 0x30, 0x8f, - 0x9c, 0x1c, 0x46, 0xa7, 0x8e, 0xf9, 0xe8, 0x4c, 0xd0, 0x0e, 0x81, 0xc3, - 0xf2, 0xee, 0xd1, 0xa5, 0xa7, 0x22, 0xe9, 0xca, 0x05, 0xcb, 0x38, 0x60, - 0x22, 0x1d, 0xb8, 0x7e, 0x4c, 0x8a, 0x18, 0x35, 0xd1, 0x98, 0xfb, 0x2b, - 0x52, 0x15, 0xe7, 0x2b, 0x9a, 0x10, 0x83, 0x4b, 0xa9, 0xfc, 0x9a, 0xd0, - 0xeb, 0x98, 0x56, 0xa9, 0xd2, 0x5d, 0x0f, 0xf4, 0xcc, 0x48, 0xe8, 0x1d, - 0xc4, 0x31, 0x05, 0x91, 0xf2, 0xaf, 0x41, 0x9b, 0xb7, 0xd4, 0xcc, 0x3c, - 0x68, 0x73, 0x24, 0xbe, 0x91, 0x42, 0xab, 0x8e, 0x95, 0x78, 0x15, 0x92, - 0x2b, 0x63, 0x2c, 0x4d, 0xd4, 0xe8, 0x67, 0xe4, 0x3a, 0xbb, 0x08, 0xf2, - 0xe1, 0x25, 0xe3, 0x24, 0x5f, 0x96, 0x26, 0xed, 0x03, 0x9f, 0xe5, 0x3f, - 0x28, 0xf0, 0xea, 0x87, 0xb2, 0x8b, 0x8f, 0xf8, 0x17, 0xf2, 0x3f, 0x83, - 0x59, 0xab, 0xfc, 0x05, 0xab, 0x2a, 0x6f, 0x83, 0x89, 0x82, 0xa1, 0x0d, - 0xb2, 0x00, 0xb1, 0xd1, 0x7b, 0x70, 0xcf, 0x5d, 0xa3, 0x61, 0x11, 0x11, - 0x87, 0x02, 0x51, 0xbe, 0x35, 0xc6, 0x13, 0xe5, 0xc5, 0x3f, 0x9f, 0xe0, - 0x97, 0x4c, 0xd6, 0xaf, 0x37, 0x02, 0x90, 0xa4, 0x79, 0x16, 0x55, 0xad, - 0x74, 0x33, 0x4d, 0x41, 0xdb, 0x93, 0xbf, 0x12, 0xf4, 0xf4, 0x54, 0x85, - 0x6d, 0x49, 0x00, 0x26, 0x36, 0xa5, 0xd6, 0x1c, 0x48, 0x9d, 0x66, 0xcb, - 0xf4, 0x25, 0xf7, 0xbf, 0x16, 0xb9, 0x21, 0xac, 0xb4, 0xcd, 0x67, 0x79, - 0x71, 0x21, 0x48, 0x87, 0x38, 0x25, 0xd6, 0x2c, 0xb7, 0xbf, 0xdf, 0x06, - 0x3d, 0x26, 0x3c, 0x2f, 0x16, 0x30, 0xb3, 0x6b, 0x86, 0xda, 0x52, 0xbb, - 0x3d, 0xe4, 0x46, 0xb7, 0xc7, 0xb7, 0x15, 0xcc, 0x35, 0xdc, 0x32, 0x82, - 0x66, 0xc0, 0x23, 0xf9, 0x61, 0xa8, 0x8d, 0x8e, 0x9d, 0xc8, 0xe7, 0x1a, - 0x2b, 0xf8, 0x2f, 0x4c, 0xc7, 0x05, 0x20, 0xd0, 0x52, 0xb6, 0xea, 0x2f, - 0xc0, 0xc4, 0xe5, 0x22, 0x45, 0x55, 0x29, 0xf2, 0xcb, 0xd7, 0x43, 0x5a, - 0xa5, 0x55, 0xcd, 0x0b, 0x6d, 0x51, 0x26, 0x63, 0xb6, 0xb7, 0xa1, 0x28, - 0xb9, 0xbc, 0xa0, 0x3a, 0xd6, 0xa6, 0xfc, 0xbb, 0xf8, 0x9b, 0xf1, 0x44, - 0x16, 0xe5, 0x6e, 0xd7, 0xc1, 0xdc, 0xfa, 0xe4, 0x57, 0xd2, 0x27, 0x6e, - 0x8f, 0x03, 0xfa, 0xef, 0xd9, 0xf2, 0xb4, 0xe5, 0x68, 0x2b, 0x2c, 0xdd, - 0x07, 0x46, 0x6c, 0xab, 0xc1, 0x4c, 0xe4, 0xac, 0x71, 0xdc, 0x0b, 0x8a, - 0x1d, 0xf3, 0xa5, 0x82, 0x45, 0x5e, 0x20, 0x4a, 0xb1, 0x0c, 0xc1, 0x63, - 0xaf, 0xfa, 0x2d, 0x49, 0x09, 0x65, 0xa1, 0x1a, 0xc7, 0x12, 0xa7, 0x18, - 0xdb, 0xb8, 0x3a, 0xa8, 0x4d, 0x96, 0x88, 0xc3, 0x31, 0x15, 0x04, 0xd0, - 0x30, 0xe2, 0x09, 0xaa, 0x48, 0xf6, 0x0f, 0x20, 0xab, 0x05, 0x41, 0x43, - 0x23, 0x52, 0x28, 0x2f, 0xf9, 0x97, 0x0d, 0x00, 0xcd, 0x74, 0x4d, 0x10, - 0x80, 0x28, 0x79, 0x8b, 0x6d, 0x43, 0xe0, 0x79, 0x2e, 0x3d, 0xd7, 0x81, - 0xf8, 0x64, 0x34, 0x87, 0xbc, 0x00, 0x09, 0x07, 0xbb, 0x19, 0xa2, 0x29, - 0xbf, 0x57, 0xd4, 0x00, 0xe3, 0x20, 0x2e, 0xae, 0xc6, 0xfd, 0x4e, 0x97, - 0xee, 0x97, 0x71, 0x72, 0x8d, 0x81, 0xfc, 0x72, 0xa8, 0x8a, 0x20, 0xef, - 0xcb, 0xa5, 0x4c, 0x26, 0x47, 0xab, 0x17, 0x1b, 0x41, 0xd7, 0xbf, 0x19, - 0x6b, 0xa2, 0x89, 0xcd, 0x58, 0x83, 0x11, 0xb3, 0x42, 0x8e, 0x93, 0xed, - 0x17, 0x1b, 0x14, 0xe6, 0x48, 0xae, 0x88, 0x0c, 0xf2, 0x26, 0x53, 0x20, - 0x67, 0xd7, 0xae, 0x6b, 0xc1, 0x4b, 0x82, 0x5d, 0xec, 0x9e, 0x46, 0xfb, - 0xf1, 0xe8, 0x86, 0x10, 0x83, 0x88, 0x12, 0xf5, 0xb6, 0xdd, 0x00, 0x26, - 0x83, 0xf4, 0x2c, 0x98, 0x7d, 0xbd, 0xda, 0xdb, 0x42, 0xca, 0x37, 0x1b, - 0xd1, 0xe5, 0x85, 0xea, 0x5b, 0x80, 0xcc, 0xc5, 0xe7, 0x03, 0x2a, 0xdb, - 0xbc, 0x26, 0x24, 0xfa, 0xaa, 0xa2, 0x51, 0xbe, 0xd8, 0x5f, 0xfe, 0x09, - 0x06, 0xa0, 0x99, 0x11, 0xeb, 0xf8, 0xa4, 0xaf, 0xec, 0x7f, 0x89, 0x0e, - 0xd6, 0x3d, 0x4e, 0xed, 0xb3, 0x5b, 0xe1, 0x04, 0xd7, 0xdf, 0x5b, 0x56, - 0x4e, 0xc5, 0x34, 0xc5, 0xf5, 0x69, 0x91, 0xe3, 0xb2, 0x11, 0xb8, 0x51, - 0x7c, 0xae, 0x87, 0xeb, 0xb5, 0x73, 0xac, 0xce, 0x90, 0xc3, 0x41, 0x89, - 0x94, 0x0c, 0x6d, 0x3d, 0xe2, 0xfe, 0x80, 0x65, 0x0b, 0xa0, 0x80, 0x99, - 0xaa, 0xa2, 0x9f, 0x73, 0xb6, 0x7a, 0x3b, 0x00, 0x5a, 0xc1, 0x02, 0x4d, - 0x21, 0x2d, 0x03, 0xd1, 0x5e, 0xa6, 0xa8, 0x3c, 0x1b, 0xec, 0x5d, 0xa4, - 0xd7, 0x3d, 0x2b, 0xa6, 0xd4, 0xc0, 0xa7, 0xd3, 0xb9, 0x00, 0xef, 0x10, - 0xd5, 0x2c, 0xbc, 0xa4, 0xa8, 0xe1, 0xb0, 0x24, 0x70, 0xc4, 0x7c, 0x2a, - 0x39, 0xc8, 0xed, 0x68, 0x7e, 0x0d, 0x6f, 0xc3, 0x90, 0x5d, 0x59, 0xe8, - 0x7b, 0x0d, 0xa6, 0x5f, 0x62, 0x2d, 0xfc, 0xad, 0x6e, 0xf2, 0x26, 0x6f, - 0x0c, 0x5f, 0xce, 0x4a, 0xcc, 0x11, 0x1d, 0x91, 0x57, 0x74, 0x68, 0x7f, - 0x01, 0xde, 0x17, 0x2d, 0x70, 0x6c, 0x29, 0x47, 0xc3, 0xea, 0x82, 0x13, - 0x43, 0x3b, 0x2b, 0x3b, 0x60, 0x6e, 0xc2, 0x43, 0xfb, 0x34, 0x68, 0xbb, - 0x93, 0x40, 0xbd, 0xd8, 0xb6, 0x73, 0x66, 0x65, 0x01, 0xff, 0x65, 0xb6, - 0xda, 0xf6, 0xbb, 0xce, 0x2a, 0x78, 0x03, 0xb9, 0x6e, 0xd4, 0xc2, 0xf3, - 0x5f, 0xd4, 0x4a, 0x09, 0xa2, 0x36, 0xd5, 0xac, 0x67, 0x4d, 0xb7, 0xfa, - 0x59, 0x6b, 0xf9, 0x26, 0xd7, 0x9f, 0xbc, 0x1e, 0xba, 0x1b, 0xff, 0xbf, - 0x42, 0xe7, 0x2c, 0x21, 0x79, 0xbf, 0xd6, 0xac, 0xb5, 0x2e, 0x50, 0xa5, - 0x19, 0x46, 0x6d, 0xc1, 0x03, 0x05, 0xe9, 0x36, 0x22, 0x85, 0x8f, 0x46, - 0xba, 0x2a, 0xc4, 0x9d, 0x6a, 0x1f, 0x1d, 0x52, 0xbb, 0xc2, 0x17, 0x39, - 0x59, 0x66, 0x8d, 0x26, 0x89, 0x37, 0x12, 0x9d, 0xd2, 0x2c, 0x05, 0xc4, - 0xaf, 0x73, 0x62, 0xcb, 0xaf, 0xef, 0x20, 0x17, 0xd9, 0x3c, 0x4c, 0xe5, - 0x3f, 0x78, 0x04, 0x81, 0xdd, 0x68, 0x49, 0xc9, 0x26, 0x04, 0x21, 0xf0, - 0x4a, 0x4e, 0x28, 0x96, 0xb2, 0xf8, 0xaa, 0x25, 0x65, 0x85, 0x24, 0xd6, - 0x49, 0x11, 0xf9, 0x40, 0x30, 0x38, 0x9b, 0xc7, 0xde, 0x6b, 0xf6, 0x5d, - 0x06, 0x48, 0x56, 0xab, 0x38, 0x46, 0x65, 0x1a, 0x6c, 0x77, 0x9a, 0x20, - 0x18, 0x95, 0x2f, 0xff, 0x0b, 0xf0, 0x1d, 0xce, 0xb3, 0x89, 0xb4, 0x5a, - 0xbb, 0x2d, 0x46, 0xc1, 0xe0, 0x38, 0xb3, 0x1f, 0xd2, 0xa3, 0x97, 0x86, - 0xb2, 0x79, 0x39, 0xf2, 0x17, 0x53, 0x30, 0x8b, 0xbb, 0x6e, 0x6a, 0x0b, - 0x48, 0x9b, 0xc4, 0x06, 0xea, 0xb9, 0x0e, 0xb4, 0x78, 0xa5, 0x0a, 0x47, - 0x43, 0x78, 0x23, 0xb6, 0x8e, 0xfe, 0xd2, 0xdf, 0xbe, 0xe8, 0xf1, 0x40, - 0x70, 0x50, 0x34, 0x23, 0x2e, 0x60, 0x95, 0x6a, 0x66, 0xfd, 0xab, 0xbf, - 0xe6, 0x66, 0xc6, 0x71, 0xa4, 0x9f, 0x67, 0x80, 0x6e, 0x8c, 0x82, 0x22, - 0xb9, 0xe3, 0xae, 0x35, 0x21, 0x51, 0x02, 0x99, 0x60, 0x3f, 0x67, 0x56, - 0x03, 0x79, 0x2b, 0x37, 0x4f, 0x95, 0x99, 0xc8, 0x73, 0x25, 0x31, 0x64, - 0xf8, 0xb5, 0xb4, 0x65, 0x9e, 0xab, 0x38, 0x95, 0x79, 0x2f, 0xc0, 0xa2, - 0xe8, 0xd5, 0xa7, 0x9f, 0x93, 0x96, 0x6d, 0xda, 0xc6, 0xc6, 0x60, 0x13, - 0xe2, 0xcf, 0x27, 0x06, 0xe6, 0xd5, 0xd9, 0x8b, 0xd5, 0x28, 0xf6, 0xab, - 0x2f, 0x37, 0x57, 0xcc, 0x83, 0x00, 0xaa, 0xdb, 0x57, 0x1d, 0x44, 0x95, - 0x25, 0xcd, 0x6a, 0xcc, 0xa9, 0x9c, 0x67, 0xd2, 0x93, 0x14, 0x40, 0xc5, - 0x4a, 0xbc, 0xab, 0xcf, 0xa9, 0xe7, 0x94, 0x26, 0xb6, 0x28, 0xd1, 0xc0, - 0xf9, 0xc5, 0x66, 0xb0, 0x3a, 0x0f, 0x03, 0x26, 0x3a, 0xc2, 0x8c, 0xf5, - 0x59, 0x5c, 0xd7, 0x03, 0x52, 0xee, 0x05, 0x0b, 0x3e, 0xfb, 0x57, 0xac, - 0x8b, 0xb7, 0x0e, 0x99, 0xa1, 0xed, 0x63, 0x6c, 0x70, 0x45, 0x05, 0x22, - 0xb5, 0x63, 0x31, 0xfc, 0xce, 0xde, 0x7b, 0xe8, 0x15, 0x1c, 0xcc, 0x58, - 0xc1, 0x77, 0x59, 0x74, 0x5c, 0xf9, 0x5f, 0xfc, 0xdd, 0x3b, 0x52, 0x5e, - 0x4b, 0x1d, 0xe9, 0x26, 0x96, 0xff, 0x4d, 0x8b, 0x4b, 0x12, 0x59, 0x3c, - 0x30, 0x07, 0xb4, 0xb0, 0xc7, 0x55, 0x23, 0x21, 0x5c, 0x64, 0x46, 0x96, - 0x1a, 0xbd, 0x6b, 0x64, 0x73, 0x2b, 0xe5, 0xba, 0x96, 0x08, 0x43, 0x61, - 0x4b, 0x2a, 0x9b, 0x4e, 0x23, 0x48, 0xdf, 0x95, 0xe7, 0x81, 0xe7, 0x3d, - 0x03, 0xb3, 0xd7, 0x12, 0xfb, 0xe4, 0x31, 0xcc, 0x58, 0x1c, 0x5b, 0xab, - 0x3e, 0xb0, 0xa8, 0x5a, 0xde, 0xb6, 0x71, 0x42, 0xf2, 0xbd, 0xc9, 0xb8, - 0xfe, 0xc2, 0x2f, 0xc9, 0x3e, 0xfc, 0xce, 0xa8, 0x9c, 0xab, 0x77, 0xf2, - 0x4d, 0x02, 0xe8, 0xa9, 0x06, 0x08, 0xac, 0xf6, 0xf2, 0x70, 0x3f, 0x82, - 0x5b, 0x28, 0xe7, 0x6b, 0xc4, 0x08, 0x3e, 0xa0, 0x32, 0x58, 0x3a, 0xe4, - 0x20, 0x70, 0xfc, 0xce, 0xe8, 0xa3, 0x5b, 0xd8, 0xe3, 0xcb, 0x70, 0xc5, - 0x09, 0x40, 0xb3, 0xf6, 0xc0, 0x52, 0xa9, 0xbd, 0x02, 0xbc, 0x48, 0x0f, - 0x61, 0x1b, 0x3c, 0xb0, 0x90, 0xe1, 0xdc, 0x3c, 0xfd, 0x84, 0xb5, 0xfe, - 0xa8, 0xde, 0x48, 0x55, 0xc6, 0xe4, 0x3f, 0x2b, 0x32, 0xbe, 0xcf, 0xd7, - 0xb1, 0x19, 0x36, 0x3d, 0x18, 0x22, 0xd4, 0xf7, 0xa1, 0x59, 0xd8, 0x0f, - 0xd1, 0x04, 0x9e, 0x13, 0xeb, 0xca, 0x0e, 0x8e, 0x92, 0xe3, 0x1a, 0x70, - 0xac, 0x48, 0x64, 0x27, 0x1e, 0xdb, 0x6e, 0xb0, 0x17, 0xad, 0xb2, 0x51, - 0xc4, 0x76, 0xb0, 0x28, 0x45, 0x0f, 0x47, 0x8e, 0x27, 0x16, 0xc4, 0x4e, - 0xdd, 0x5a, 0x39, 0xdb, 0x80, 0xa9, 0xfb, 0xa6, 0x5f, 0xf5, 0x97, 0xb9, - 0xc3, 0xef, 0xf5, 0xaf, 0x89, 0x83, 0x4a, 0x1a, 0xdf, 0xaa, 0x7f, 0x0e, - 0x89, 0x65, 0xd2, 0x6e, 0xfd, 0xad, 0x14, 0xf3, 0xd7, 0x96, 0x2c, 0x08, - 0xee, 0xc6, 0x53, 0x3e, 0xd9, 0x62, 0x45, 0x3d, 0x3b, 0x27, 0x72, 0x1d, - 0x21, 0x8e, 0x5f, 0x53, 0x86, 0x6a, 0xa9, 0x79, 0xbd, 0x01, 0x68, 0x69, - 0x06, 0xa3, 0xe3, 0x43, 0x24, 0x02, 0x26, 0x6b, 0xe3, 0xab, 0x85, 0x59, - 0x2c, 0x49, 0x3a, 0x32, 0xc7, 0x0c, 0xbc, 0x09, 0x42, 0x4f, 0x37, 0x5a, - 0xcd, 0xc5, 0xa2, 0x4c, 0x4b, 0xd1, 0x05, 0x98, 0xb0, 0x49, 0xe6, 0x08, - 0xbb, 0x82, 0xe8, 0x21, 0x10, 0xd6, 0xbd, 0x11, 0xec, 0x0e, 0xdf, 0x99, - 0x30, 0x9e, 0x55, 0xcc, 0x2d, 0x2b, 0x5d, 0x02, 0xb6, 0x62, 0x76, 0x64, - 0x8a, 0x5c, 0x69, 0xf9, 0xc7, 0x9e, 0x5d, 0x39, 0x7d, 0xea, 0xdd, 0xfd, - 0x70, 0x85, 0x37, 0xb2, 0x2e, 0x21, 0x7f, 0xca, 0x11, 0x68, 0x33, 0xf9, - 0xe4, 0x4b, 0xc3, 0x0b, 0x06, 0xb4, 0xaa, 0x67, 0x57, 0x85, 0xb8, 0x06, - 0xa4, 0x04, 0x3b, 0x9c, 0x17, 0x72, 0x3a, 0x3b, 0x6e, 0x82, 0x5a, 0x2e, - 0x04, 0x62, 0xe9, 0xa1, 0xa3, 0xb6, 0xd4, 0x6e, 0x93, 0xc5, 0xa2, 0x81, - 0xb7, 0xe2, 0x31, 0x42, 0xb6, 0xdd, 0x28, 0x69, 0x10, 0x46, 0x3f, 0x14, - 0x07, 0x99, 0x83, 0xdf, 0x1f, 0x82, 0xc8, 0x2b, 0x5f, 0xcc, 0x49, 0x77, - 0x53, 0xb1, 0xed, 0x75, 0x9c, 0x5a, 0x80, 0x27, 0x18, 0x1f, 0x03, 0xcc, - 0x01, 0x3a, 0x32, 0xea, 0x29, 0x79, 0x16, 0xfd, 0xa9, 0x84, 0xe5, 0xe3, - 0x3f, 0xf6, 0xd7, 0x01, 0x35, 0xb9, 0x54, 0x73, 0xef, 0xdc, 0xc4, 0xb9, - 0xfd, 0xa9, 0xa9, 0xa4, 0x65, 0xba, 0x80, 0xfc, 0x1a, 0x6c, 0x3f, 0xc4, - 0xe1, 0xb3, 0xff, 0x58, 0x5f, 0xcd, 0x53, 0x88, 0xf8, 0xed, 0xa9, 0x91, - 0x00, 0xf0, 0x43, 0x87, 0xa8, 0xec, 0x56, 0x95, 0xad, 0x3e, 0x7c, 0x0a, - 0x73, 0x0a, 0xcc, 0x1d, 0x4a, 0x9a, 0x66, 0x42, 0xb5, 0x33, 0x5f, 0x65, - 0xe8, 0x33, 0x80, 0xc3, 0x9f, 0x36, 0xf3, 0xd3, 0x97, 0x05, 0x59, 0x80, - 0x69, 0x65, 0xd6, 0x6d, 0x9d, 0x84, 0xe0, 0x42, 0xbc, 0x2e, 0x43, 0x63, - 0x90, 0x6d, 0xfb, 0x01, 0x5f, 0xc2, 0xfd, 0xa2, 0xbb, 0x3d, 0x61, 0xe2, - 0xbc, 0x7d, 0xe6, 0x5f, 0x71, 0xf7, 0x63, 0x91, 0x4b, 0x3c, 0x9b, 0x23, - 0x7b, 0xb6, 0x8e, 0x7c, 0x4a, 0x13, 0xa2, 0xdd, 0xa6, 0xd9, 0xfc, 0xbc, - 0x27, 0x1a, 0x4b, 0x98, 0x29, 0x33, 0x84, 0x2e, 0x7b, 0x06, 0x69, 0xef, - 0x7a, 0x6c, 0x4b, 0xcb, 0x9c, 0x45, 0x45, 0x55, 0x2a, 0x18, 0xd0, 0x3a, - 0x54, 0x21, 0x5a, 0x10, 0xb8, 0xe5, 0x5a, 0x16, 0xa0, 0x58, 0xf7, 0x14, - 0x21, 0x8d, 0x70, 0x59, 0xa0, 0xf2, 0x61, 0x4e, 0x5a, 0xb6, 0xec, 0x44, - 0xda, 0xe9, 0x37, 0xf4, 0xa9, 0xee, 0x03, 0x61, 0x11, 0x7d, 0x36, 0x2a, - 0x62, 0xba, 0x43, 0x46, 0x81, 0x82, 0xd7, 0xf0, 0xb5, 0x75, 0x81, 0xed, - 0x4b, 0x83, 0x62, 0xed, 0xa3, 0x91, 0x44, 0x7d, 0x5b, 0x4f, 0x99, 0x65, - 0x96, 0xf6, 0x51, 0x21, 0x2c, 0xa4, 0x4c, 0x0b, 0x6d, 0xb1, 0x37, 0x36, - 0x8f, 0x3f, 0x0e, 0xb6, 0xd2, 0xa6, 0xd1, 0xb2, 0x71, 0xa0, 0x14, 0x7b, - 0x1f, 0xaa, 0xd7, 0x34, 0xd6, 0x20, 0xe1, 0xb0, 0xd4, 0x04, 0x3e, 0xd3, - 0x59, 0x7f, 0x1a, 0x42, 0x7a, 0x81, 0x93, 0x34, 0x1b, 0x49, 0xef, 0xfc, - 0xed, 0x29, 0x24, 0xf8, 0xad, 0xf3, 0x75, 0xe2, 0x45, 0x71, 0xb8, 0xeb, - 0x03, 0xcc, 0x21, 0xde, 0x55, 0x17, 0x02, 0x6b, 0x57, 0xe1, 0xd3, 0x89, - 0x10, 0xb7, 0x1b, 0x43, 0x8b, 0x72, 0xc6, 0xc8, 0x6a, 0x50, 0x1f, 0x33, - 0xec, 0x65, 0x1e, 0x11, 0xeb, 0xb6, 0x32, 0x3e, 0xd6, 0x96, 0x43, 0xd0, - 0xa3, 0x22, 0x72, 0xbb, 0xcb, 0xce, 0x31, 0x32, 0xa6, 0x35, 0x19, 0x8d, - 0x2a, 0xb4, 0xd9, 0x14, 0x07, 0xa1, 0xa8, 0x61, 0x90, 0xd3, 0x83, 0xef, - 0xdd, 0xda, 0x83, 0x94, 0x51, 0x04, 0x43, 0xb3, 0xa8, 0xfa, 0x85, 0xb0, - 0x96, 0xda, 0x71, 0x79, 0x85, 0x1e, 0xe2, 0xd4, 0x5e, 0xa3, 0x6a, 0x96, - 0xc8, 0x4f, 0x99, 0xc8, 0xbd, 0x5a, 0x09, 0xa2, 0x19, 0xda, 0x9b, 0x88, - 0x85, 0xb0, 0x44, 0x83, 0x50, 0x6d, 0x13, 0xa0, 0x7e, 0xaa, 0x33, 0x18, - 0x62, 0x83, 0xa5, 0xf0, 0xc1, 0xdf, 0xe2, 0x09, 0x25, 0x89, 0x30, 0x2a, - 0x68, 0x98, 0xa8, 0xb8, 0x18, 0x3d, 0x0c, 0x43, 0x05, 0xf7, 0x2f, 0xcb, - 0x52, 0xa7, 0xee, 0x0a, 0xe1, 0xc8, 0x82, 0xcc, 0x36, 0x93, 0xba, 0xc8, - 0x3c, 0xa0, 0x77, 0xd8, 0xbf, 0xe8, 0xdc, 0x22, 0x98, 0x16, 0xff, 0x84, - 0xb2, 0x19, 0x7c, 0xd2, 0xdf, 0x8a, 0x35, 0x33, 0xfb, 0x32, 0x47, 0xc5, - 0xc3, 0xc0, 0xb1, 0x77, 0xaa, 0x72, 0x3f, 0x6e, 0xfa, 0x69, 0x1c, 0x98, - 0x94, 0x39, 0x4c, 0xca, 0xc8, 0x80, 0x44, 0x50, 0x77, 0x8d, 0xee, 0xae, - 0x3d, 0x8a, 0xb8, 0x5a, 0xb5, 0x05, 0x04, 0x85, 0x2a, 0xea, 0xc6, 0x4a, - 0xa7, 0xf6, 0xc6, 0xdc, 0x81, 0x60, 0x43, 0xc0, 0xad, 0x74, 0x9c, 0x8b, - 0x98, 0x8c, 0x65, 0x4d, 0xea, 0xce, 0xd5, 0x0c, 0x5c, 0x35, 0xb5, 0x3a, - 0x10, 0x8c, 0xf2, 0x71, 0x4d, 0x86, 0xe9, 0x2f, 0x76, 0xc0, 0xfb, 0x3c, - 0x1c, 0x03, 0x55, 0x4d, 0xac, 0x73, 0xd7, 0xa6, 0xb3, 0xd5, 0xef, 0x21, - 0xb5, 0x0c, 0x05, 0x04, 0x56, 0x38, 0xad, 0xc0, 0x2f, 0x22, 0x90, 0x4c, - 0x05, 0x63, 0xce, 0x02, 0xc3, 0x31, 0x90, 0x65, 0x10, 0xe7, 0xa3, 0x86, - 0xb1, 0x39, 0x3f, 0x59, 0xb5, 0x26, 0xbf, 0x92, 0xdb, 0xa5, 0xa3, 0xa0, - 0xbd, 0x57, 0x91, 0x3e, 0x0a, 0x3c, 0x77, 0x38, 0xd6, 0x85, 0xb9, 0xeb, - 0x18, 0x30, 0x6b, 0xc9, 0x49, 0xb5, 0xb3, 0x88, 0x5e, 0xa6, 0xf8, 0xa7, - 0x90, 0x0f, 0x0a, 0xed, 0xba, 0xbf, 0x51, 0xd1, 0x3a, 0x1a, 0x26, 0x82, - 0xef, 0xac, 0x3f, 0x3a, 0x52, 0xaf, 0x2f, 0x50, 0x4b, 0x01, 0xaa, 0xe1, - 0x5d, 0x71, 0xf4, 0xcb, 0x9b, 0x9a, 0x2d, 0x9a, 0xa5, 0x48, 0x8b, 0xde, - 0x1e, 0xfd, 0xef, 0x8c, 0x74, 0xe9, 0x3a, 0x79, 0x7d, 0x8a, 0x56, 0xb1, - 0x4f, 0x06, 0xa9, 0x6d, 0x65, 0x9f, 0x72, 0xf1, 0xed, 0xfa, 0x8d, 0x65, - 0x52, 0xb0, 0x30, 0xe6, 0x45, 0x31, 0x27, 0x01, 0x34, 0xf2, 0xed, 0xc2, - 0x8e, 0xd4, 0x28, 0x27, 0x5b, 0xd0, 0x6c, 0x2c, 0x2e, 0x70, 0x88, 0xb3, - 0x49, 0x72, 0x3a, 0x50, 0xb0, 0x7a, 0x09, 0xd2, 0x60, 0xb7, 0x28, 0x2b, - 0x09, 0xca, 0x7c, 0x9c, 0xac, 0x0b, 0xdc, 0xf5, 0x08, 0x7d, 0xd4, 0x6f, - 0x86, 0x66, 0xcd, 0xe9, 0x71, 0xa3, 0x1c, 0xf5, 0x62, 0x36, 0x6b, 0xb7, - 0xc1, 0x4a, 0xa6, 0xd5, 0xce, 0x19, 0x5e, 0xbb, 0x70, 0xf6, 0x9e, 0x00, - 0xc9, 0x3c, 0xf7, 0x6b, 0x38, 0xc1, 0x34, 0x9c, 0x31, 0xaa, 0x1a, 0x0e, - 0x72, 0x9a, 0x26, 0xfb, 0xa0, 0x4c, 0x0e, 0xdf, 0x4e, 0x46, 0xb8, 0x6e, - 0x1e, 0xc7, 0x0f, 0x0d, 0x9b, 0x71, 0xbe, 0xc5, 0x97, 0x80, 0x28, 0xa2, - 0x92, 0xa4, 0xe8, 0x7d, 0x02, 0x43, 0x1c, 0x4e, 0x7d, 0xf0, 0xb9, 0x99, - 0x21, 0x8c, 0x96, 0xe4, 0xcd, 0x07, 0xe0, 0x2f, 0x42, 0x1b, 0x5b, 0xa5, - 0x73, 0x3c, 0xe4, 0xae, 0x24, 0xc9, 0x05, 0x5c, 0x64, 0xb7, 0x31, 0x53, - 0x0f, 0xd5, 0x43, 0x4d, 0xc9, 0xbd, 0x42, 0x81, 0xd7, 0x16, 0x0a, 0x18, - 0x55, 0xfb, 0xa9, 0xff, 0x51, 0xf4, 0x25, 0xc1, 0x3c, 0x88, 0x6f, 0x66, - 0x6f, 0x26, 0x6e, 0x3c, 0xe6, 0x3a, 0x5d, 0x35, 0x1f, 0x88, 0x26, 0xdf, - 0xa2, 0x9f, 0xf4, 0x16, 0x22, 0x0c, 0xff, 0xbc, 0xe6, 0x10, 0xa8, 0x60, - 0x3a, 0x36, 0x41, 0xaf, 0x58, 0xb5, 0x26, 0x6e, 0x6e, 0xb3, 0xad, 0x71, - 0xdb, 0xd7, 0x7e, 0x53, 0x8d, 0x89, 0xb8, 0x18, 0x05, 0x63, 0x2e, 0xfd, - 0xfc, 0xb4, 0xa8, 0xeb, 0xc5, 0x30, 0x14, 0x1e, 0xc3, 0x9d, 0xb0, 0x0e, - 0x8c, 0xf3, 0xdc, 0xd8, 0x4c, 0x19, 0x91, 0x88, 0x09, 0xdd, 0x6f, 0xc0, - 0x69, 0x50, 0x36, 0xf9, 0x8d, 0xdb, 0x3a, 0xdf, 0xad, 0x38, 0x05, 0x3b, - 0xcd, 0x97, 0x12, 0xbb, 0xc1, 0xd5, 0xe9, 0x6b, 0x9f, 0xcb, 0x5b, 0xed, - 0xb7, 0xd9, 0x67, 0xa7, 0x5a, 0x33, 0x23, 0x9d, 0xd3, 0xc3, 0x66, 0x8e, - 0x82, 0x3f, 0x04, 0xe8, 0xb7, 0x07, 0xed, 0xaf, 0x54, 0xca, 0x43, 0xe3, - 0xa7, 0x02, 0x3d, 0x60, 0xad, 0xfa, 0x93, 0xaf, 0x75, 0x18, 0x2b, 0x7c, - 0xb0, 0x62, 0x6c, 0xc6, 0xc8, 0xa5, 0x75, 0xe1, 0x3e, 0xa3, 0x80, 0x16, - 0x7d, 0x25, 0x78, 0x56, 0x0a, 0xe8, 0xe2, 0x2d, 0xb4, 0x2c, 0x1c, 0x89, - 0x8d, 0xca, 0x41, 0xfc, 0x28, 0x9d, 0xf3, 0x8d, 0x97, 0x60, 0x54, 0x01, - 0x90, 0xd7, 0x05, 0x30, 0x54, 0x3d, 0xe2, 0x50, 0xac, 0x21, 0x43, 0x21, - 0xe3, 0x82, 0x14, 0xf1, 0x26, 0x79, 0xf3, 0xfc, 0x85, 0x6b, 0x23, 0x2f, - 0xe2, 0xd6, 0x6f, 0x92, 0xcf, 0x1b, 0x9b, 0x5b, 0xe9, 0xec, 0x03, 0x1a, - 0x55, 0x84, 0x4d, 0xc5, 0x1a, 0x75, 0x2f, 0x28, 0x40, 0xc5, 0x10, 0x7f, - 0xa0, 0xe2, 0x55, 0x01, 0xf9, 0x1d, 0x3f, 0x64, 0xf2, 0xa0, 0x27, 0xd8, - 0x9e, 0xd1, 0xe5, 0xe0, 0x06, 0x82, 0x47, 0x40, 0x4f, 0x04, 0x8b, 0x86, - 0x7d, 0xaf, 0x19, 0x09, 0x9c, 0xc1, 0x9e, 0xa0, 0x27, 0xcc, 0xc6, 0x82, - 0x65, 0xc4, 0x00, 0xef, 0xa1, 0x25, 0x4c, 0x9f, 0x36, 0x73, 0x43, 0xb7, - 0x0f, 0xa3, 0x94, 0x47, 0x52, 0xc0, 0x8a, 0x13, 0x2d, 0x96, 0x36, 0x07, - 0x25, 0x20, 0xc3, 0xe4, 0x35, 0xf3, 0x53, 0xd4, 0xbd, 0xf1, 0x32, 0x06, - 0xc5, 0xea, 0xa5, 0x41, 0xa5, 0xe4, 0xa8, 0xb9, 0x47, 0xd7, 0x9c, 0x9d, - 0xa9, 0xee, 0x6b, 0xd6, 0xac, 0x06, 0x53, 0xda, 0x95, 0x80, 0xa5, 0x81, - 0x71, 0x82, 0xf1, 0x07, 0xfe, 0x78, 0x19, 0x0c, 0xa0, 0xa1, 0x4e, 0xfc, - 0x1d, 0xa5, 0x26, 0x84, 0x02, 0x84, 0x9a, 0x5f, 0xf9, 0x92, 0x58, 0x79, - 0x0a, 0x4c, 0xaf, 0xfc, 0x5f, 0x63, 0x79, 0xc6, 0xf5, 0x13, 0xa0, 0x91, - 0x45, 0x64, 0x97, 0xc8, 0xb7, 0x3f, 0x26, 0xc0, 0x99, 0x50, 0x7f, 0xce, - 0x5d, 0xaa, 0xcf, 0x93, 0xff, 0x64, 0x1a, 0x97, 0xe8, 0x09, 0x3a, 0x6f, - 0x41, 0xed, 0x1d, 0x62, 0x30, 0xf8, 0xf7, 0x65, 0x57, 0x79, 0x18, 0x6e, - 0x44, 0x61, 0x97, 0x9f, 0x5a, 0x3c, 0x88, 0xcf, 0xe3, 0xbd, 0xc6, 0x6b, - 0xf6, 0xc6, 0xc4, 0x18, 0x44, 0x3c, 0x41, 0xcb, 0xfa, 0x17, 0x1a, 0xb5, - 0x77, 0xe7, 0x12, 0xaa, 0xc2, 0x7d, 0x65, 0x37, 0x25, 0xc5, 0xcc, 0x86, - 0x69, 0xbe, 0x72, 0x78, 0x35, 0x00, 0xc7, 0x2b, 0xa6, 0x6e, 0xed, 0x86, - 0x2a, 0xcb, 0x88, 0x21, 0x10, 0xd1, 0xbd, 0xa3, 0xe4, 0x9c, 0xe1, 0x18, - 0xf6, 0xb2, 0x9c, 0x99, 0xf6, 0xad, 0x3c, 0x3d, 0xd1, 0xe4, 0x1b, 0xfa, - 0x66, 0x84, 0xc5, 0xb8, 0x01, 0x68, 0x44, 0x2f, 0xa2, 0x00, 0x87, 0x87, - 0xcd, 0xbf, 0x6e, 0xf2, 0xa3, 0x1b, 0x45, 0x8a, 0x25, 0x17, 0xa3, 0xef, - 0x00, 0x17, 0x43, 0xef, 0xe6, 0xc1, 0x36, 0x2b, 0xfe, 0xe8, 0x1a, 0xb3, - 0x34, 0x66, 0x15, 0xe0, 0xe6, 0x4c, 0xa3, 0xc6, 0xe2, 0xa0, 0xd1, 0xdd, - 0x3f, 0x85, 0xd3, 0x5b, 0x24, 0xca, 0xee, 0xc7, 0x10, 0x78, 0xe0, 0x10, - 0x25, 0x97, 0xc9, 0x93, 0xdd, 0xe8, 0x64, 0x08, 0x3c, 0x8c, 0x08, 0x23, - 0xc6, 0x74, 0x6d, 0x14, 0xbf, 0xac, 0x61, 0x4b, 0xe8, 0xdb, 0x51, 0xd0, - 0xa8, 0x85, 0x07, 0x9e, 0x1f, 0x9d, 0x3e, 0x02, 0xdb, 0x36, 0x0b, 0x41, - 0xe1, 0x8e, 0x78, 0xd2, 0x49, 0x9e, 0xaf, 0xdc, 0x81, 0xcd, 0x40, 0x7f, - 0xf6, 0x28, 0xd1, 0x2c, 0xcb, 0x90, 0x69, 0x09, 0x16, 0x1e, 0x7e, 0x9b, - 0x27, 0xb3, 0x9f, 0xbf, 0x50, 0xbe, 0x8c, 0x12, 0xf8, 0xf3, 0x56, 0x6b, - 0xc0, 0x2d, 0x52, 0xe0, 0xb2, 0xa1, 0xb8, 0x77, 0xa2, 0x31, 0x53, 0x21, - 0x1d, 0x80, 0x3a, 0x63, 0x50, 0x9c, 0x3d, 0x49, 0xd9, 0x88, 0x1b, 0x97, - 0x9d, 0x6a, 0x74, 0x50, 0x4b, 0xbe, 0x24, 0xd8, 0x67, 0xac, 0x9c, 0x2d, - 0x0d, 0x8f, 0xdb, 0x7c, 0x9d, 0xe5, 0x92, 0xdc, 0x90, 0x83, 0x04, 0x3d, - 0xe2, 0x55, 0x8d, 0x7a, 0x5a, 0x58, 0xc2, 0x8d, 0x27, 0x53, 0x37, 0x47, - 0x48, 0x17, 0xca, 0xcd, 0x62, 0xe6, 0xb3, 0x86, 0x8a, 0x7c, 0xb0, 0x77, - 0xed, 0xb5, 0x29, 0x7e, 0xe0, 0x66, 0x37, 0xdc, 0x54, 0xa0, 0x16, 0x71, - 0xb7, 0x3e, 0x79, 0xa7, 0xa3, 0x4d, 0x25, 0x03, 0x54, 0xd6, 0x03, 0x71, - 0xda, 0xf0, 0xd9, 0xaf, 0x93, 0x8e, 0x9c, 0x72, 0x31, 0x7b, 0x8d, 0x97, - 0x69, 0x29, 0x21, 0xca, 0x02, 0x1c, 0x1b, 0xed, 0x22, 0x47, 0xce, 0x54, - 0xaf, 0xee, 0x47, 0xdf, 0x9b, 0x95, 0x8b, 0x3a, 0x85, 0xdc, 0x6e, 0x9a, - 0x77, 0xd9, 0x90, 0xc7, 0xea, 0x9c, 0x0d, 0xa2, 0x9b, 0x15, 0x93, 0xe9, - 0x25, 0x14, 0xb7, 0x28, 0x29, 0xaf, 0xdd, 0xbe, 0x15, 0x82, 0xa9, 0x01, - 0xe9, 0xf8, 0x99, 0x4d, 0xa6, 0x4e, 0x1d, 0xc9, 0xd0, 0xf9, 0x13, 0xb9, - 0xd5, 0xc8, 0xd7, 0x97, 0xad, 0xea, 0x0d, 0xad, 0xeb, 0x91, 0xdc, 0x63, - 0x5a, 0x83, 0x14, 0xcf, 0x3b, 0x4d, 0x3a, 0xfe, 0xc3, 0x04, 0xbd, 0xc2, - 0x8c, 0x41, 0x1b, 0xb3, 0xfe, 0xdf, 0xf8, 0xa1, 0xd2, 0xef, 0x0d, 0xb1, - 0xae, 0x1a, 0x69, 0xd6, 0x31, 0x01, 0xd5, 0xf1, 0x54, 0x3a, 0x7a, 0xc8, - 0xc9, 0x21, 0x95, 0x5a, 0xbf, 0x2f, 0x4e, 0x8e, 0x59, 0xb4, 0x25, 0x40, - 0x65, 0x5d, 0xe2, 0xd2, 0x06, 0xb5, 0x3c, 0x0f, 0xcb, 0xe0, 0xea, 0x0f, - 0x0a, 0x37, 0xea, 0xd6, 0x18, 0x09, 0x98, 0xf1, 0x78, 0xc7, 0x69, 0x62, - 0x62, 0x93, 0x61, 0x5c, 0x67, 0x9e, 0xfd, 0xca, 0x60, 0x29, 0x12, 0xcf, - 0xc7, 0x40, 0x40, 0xf3, 0x74, 0x0d, 0xeb, 0xc5, 0x3c, 0xd7, 0xd6, 0x09, - 0x34, 0xf9, 0x3a, 0x10, 0xf7, 0xbd, 0x48, 0xb7, 0x58, 0xc6, 0x3d, 0x32, - 0x61, 0xed, 0x92, 0xa6, 0xca, 0x5b, 0x9e, 0x36, 0x8b, 0x38, 0xe4, 0x3b, - 0x4b, 0x5d, 0x60, 0x43, 0xa1, 0x24, 0xfe, 0x06, 0x7c, 0xa3, 0xbc, 0xcb, - 0x17, 0x81, 0x4b, 0x4b, 0xe9, 0xf8, 0xf2, 0x00, 0x7a, 0x1a, 0x03, 0x88, - 0x4a, 0xb2, 0x53, 0x8f, 0xf9, 0x68, 0xe3, 0x30, 0xb7, 0xa6, 0x3f, 0xc3, - 0x29, 0xc5, 0x6f, 0x9c, 0xa6, 0xf1, 0xa1, 0x50, 0x60, 0x6d, 0xf2, 0x1b, - 0xb6, 0x7f, 0x3f, 0x1c, 0x20, 0xc1, 0x6d, 0xdc, 0x12, 0x5c, 0x09, 0x68, - 0x77, 0x03, 0xea, 0x79, 0xba, 0xc1, 0xf5, 0x23, 0x6b, 0x6c, 0x47, 0x13, - 0xbb, 0x39, 0x28, 0x25, 0x9f, 0x48, 0x42, 0x3c, 0x69, 0xf0, 0xcb, 0xa3, - 0xa9, 0x04, 0xda, 0x97, 0x3c, 0xfc, 0xf4, 0x96, 0x38, 0x37, 0x57, 0x08, - 0x79, 0x72, 0xb0, 0x79, 0xe5, 0x29, 0xd5, 0x6a, 0x6e, 0xf3, 0xf7, 0xcd, - 0xc6, 0x15, 0x77, 0xfe, 0x39, 0xe8, 0x01, 0x24, 0xd4, 0xac, 0x08, 0x91, - 0x05, 0x51, 0xf9, 0x50, 0x46, 0x7c, 0x58, 0x86, 0x94, 0x9c, 0x93, 0x98, - 0x6c, 0x11, 0xf8, 0x2e, 0x6c, 0x62, 0xe7, 0x22, 0x0c, 0x28, 0xb7, 0x0e, - 0x8f, 0xce, 0xf6, 0xd2, 0x47, 0x1c, 0x0d, 0x09, 0xf1, 0xf1, 0xe8, 0xdc, - 0x83, 0x4a, 0xba, 0xb1, 0xcd, 0x79, 0x89, 0x80, 0x17, 0x62, 0x64, 0xbe, - 0x22, 0x42, 0x6d, 0x0f, 0x39, 0x2e, 0x8b, 0xc0, 0xdb, 0x9d, 0xc3, 0x14, - 0x95, 0x6a, 0x6b, 0xeb, 0xe5, 0x13, 0xc9, 0x28, 0x50, 0x03, 0x14, 0x96, - 0x8d, 0x32, 0x83, 0xb0, 0xe7, 0x13, 0x4a, 0x05, 0xf8, 0xd8, 0x7f, 0x3a, - 0x66, 0xcc, 0x6f, 0x80, 0xe2, 0xab, 0xb7, 0x9a, 0xcc, 0x6a, 0x78, 0x70, - 0xeb, 0xed, 0x3f, 0xd0, 0x50, 0xe0, 0x9f, 0x33, 0xd9, 0x60, 0xea, 0x31, - 0xf0, 0xdb, 0x44, 0x16, 0x2e, 0xd3, 0x65, 0x6e, 0xa1, 0x65, 0x1b, 0x10, - 0xfb, 0xba, 0xce, 0xad, 0x00, 0x19, 0x66, 0xf3, 0xf7, 0xce, 0x4e, 0xa4, - 0xc4, 0x8a, 0xb7, 0x70, 0xb8, 0x32, 0xf6, 0xb9, 0x2b, 0x84, 0x2c, 0xbf, - 0x78, 0x5e, 0x60, 0xde, 0xb3, 0x82, 0xa5, 0x7d, 0x55, 0x94, 0x95, 0x56, - 0x69, 0x4f, 0x40, 0x05, 0xf3, 0x0d, 0xde, 0x1b, 0x9a, 0xf0, 0x26, 0x7d, - 0xc5, 0xb6, 0x54, 0x05, 0x32, 0xc7, 0x9d, 0x23, 0x5d, 0x5d, 0x11, 0xa9, - 0xac, 0x82, 0x38, 0x66, 0x9e, 0x19, 0xa9, 0xd2, 0xb6, 0xa2, 0x61, 0xeb, - 0x40, 0xcd, 0x25, 0xd8, 0x1b, 0x28, 0x6c, 0xa3, 0x9a, 0x81, 0xd5, 0x6a, - 0x67, 0x97, 0x8f, 0x7f, 0x9e, 0xa7, 0x3f, 0x20, 0xf5, 0x71, 0x13, 0x49, - 0xa1, 0x3c, 0x0e, 0x84, 0x84, 0x80, 0x83, 0x65, 0xfd, 0x87, 0xe4, 0xd5, - 0xf3, 0xab, 0x37, 0x28, 0xd7, 0xc3, 0x35, 0xcf, 0xc9, 0x63, 0xe8, 0x99, - 0x09, 0xbd, 0x51, 0xaf, 0x93, 0x38, 0xef, 0xdf, 0x1a, 0xc1, 0x00, 0x06, - 0x75, 0x5b, 0xd3, 0x2b, 0xa0, 0xae, 0x2e, 0x8b, 0xa0, 0x79, 0x9c, 0x2c, - 0x88, 0xc3, 0x79, 0x67, 0xf2, 0x9e, 0x20, 0xed, 0xf7, 0x2d, 0x3e, 0x18, - 0x23, 0xd0, 0x24, 0x9d, 0x6d, 0x24, 0x5d, 0x5a, 0x63, 0xfe, 0x74, 0x57, - 0x04, 0xaa, 0x98, 0x3d, 0x86, 0x4b, 0xff, 0x51, 0xd4, 0x4b, 0xbc, 0xa7, - 0x72, 0xc1, 0x46, 0x7e, 0x1f, 0x12, 0xc9, 0x0c, 0x35, 0xba, 0x42, 0x97, - 0x0c, 0xb9, 0x60, 0x8c, 0x3e, 0xe2, 0x66, 0x60, 0x10, 0x94, 0x2f, 0x75, - 0xae, 0x57, 0x1c, 0xe7, 0x5c, 0xe9, 0x19, 0x42, 0x9f, 0x83, 0x29, 0x92, - 0x89, 0x86, 0x6d, 0x8a, 0xd4, 0x11, 0x46, 0x32, 0x85, 0x4f, 0x08, 0x96, - 0x8d, 0x16, 0x1c, 0xdc, 0xa2, 0x70, 0x93, 0x19, 0xa9, 0x15, 0x0e, 0xf6, - 0xf0, 0x86, 0xf9, 0x6e, 0xff, 0xc5, 0xe9, 0xeb, 0xd7, 0x5e, 0x43, 0xe1, - 0x92, 0xdc, 0xe4, 0x44, 0x09, 0xd0, 0xe4, 0x08, 0xd0, 0x5c, 0x3d, 0x44, - 0x1e, 0xdf, 0x53, 0x0e, 0x2a, 0x57, 0x93, 0xa8, 0x61, 0x24, 0xea, 0x3b, - 0x93, 0x52, 0xa0, 0xbf, 0x26, 0x0d, 0xbb, 0x55, 0xd1, 0xbd, 0xf3, 0xb1, - 0x75, 0xa2, 0x71, 0x09, 0xb1, 0x98, 0x7a, 0x21, 0x20, 0x98, 0x65, 0xf2, - 0x4d, 0x3b, 0x5f, 0x7b, 0xd2, 0x34, 0x07, 0x60, 0xcd, 0x1c, 0x6c, 0x44, - 0x0e, 0x6a, 0x6d, 0xc7, 0xe0, 0xfe, 0xb7, 0xfd, 0x78, 0x3e, 0x23, 0x39, - 0x73, 0x38, 0xf1, 0xd4, 0xe3, 0xbc, 0x12, 0x4a, 0x7c, 0xa7, 0x65, 0xe8, - 0xe6, 0xe6, 0x15, 0x35, 0xae, 0x93, 0x9e, 0xf3, 0xb8, 0x6e, 0xc0, 0x16, - 0xc2, 0xfd, 0xee, 0x05, 0xb9, 0x01, 0x9a, 0x79, 0xd9, 0xd8, 0x46, 0xf4, - 0xaf, 0x27, 0x5e, 0xf4, 0x89, 0x11, 0x83, 0x35, 0xe2, 0x50, 0xdb, 0x86, - 0x80, 0x3c, 0x98, 0x0d, 0x47, 0x07, 0xfa, 0xa7, 0xee, 0x08, 0x91, 0x67, - 0xc4, 0x24, 0x47, 0x09, 0x6b, 0xad, 0xa7, 0x88, 0xae, 0xaf, 0x20, 0x4f, - 0x79, 0xc8, 0x6a, 0x9c, 0x59, 0x2f, 0xa8, 0x16, 0x7a, 0xb9, 0x85, 0x62, - 0x16, 0x22, 0x1c, 0xa8, 0x99, 0xb2, 0xbc, 0x2e, 0xe2, 0xe0, 0x19, 0xb3, - 0x09, 0x54, 0x07, 0x62, 0xc6, 0xd3, 0xcb, 0x97, 0xe9, 0x65, 0x4e, 0x4e, - 0x22, 0xc5, 0x4f, 0x91, 0xda, 0xd1, 0x0d, 0x6b, 0x1a, 0x3e, 0x0a, 0x8d, - 0x3f, 0xa2, 0x9e, 0xf1, 0x95, 0xea, 0x50, 0xa5, 0x12, 0xea, 0x4b, 0x66, - 0x46, 0x22, 0x82, 0xff, 0xbd, 0x37, 0x07, 0x94, 0x3c, 0x26, 0x3a, 0x31, - 0x06, 0xc3, 0x39, 0xa3, 0x3a, 0x7e, 0x13, 0xd6, 0xf4, 0x1a, 0x27, 0x67, - 0xe9, 0xc2, 0xf5, 0xd1, 0xf6, 0xce, 0x55, 0xe8, 0xcc, 0x6a, 0x3f, 0x99, - 0xe9, 0xf1, 0xa8, 0x87, 0x07, 0xbb, 0x78, 0xad, 0xcf, 0xd4, 0x8e, 0x91, - 0xdf, 0x41, 0x03, 0xab, 0xae, 0xdd, 0xbe, 0x99, 0x9f, 0x05, 0x29, 0x52, - 0xe1, 0x7e, 0x89, 0x13, 0x0a, 0xf1, 0x0f, 0x87, 0xf4, 0x20, 0xbf, 0xb2, - 0x51, 0x24, 0x59, 0x20, 0x7d, 0xa3, 0xc3, 0x0f, 0xc8, 0xa1, 0xd3, 0x25, - 0x40, 0x03, 0xb4, 0x5d, 0x60, 0x43, 0xb5, 0xa8, 0x00, 0x28, 0x23, 0x08, - 0x0d, 0xf5, 0x04, 0x23, 0x41, 0x48, 0x72, 0x16, 0x23, 0x7b, 0x5b, 0x09, - 0x5e, 0xa5, 0x77, 0x14, 0x1c, 0x99, 0x65, 0xca, 0x00, 0x3e, 0xa2, 0xb3, - 0x2c, 0xf2, 0x2a, 0x18, 0x75, 0x39, 0xe7, 0xc5, 0xd3, 0x52, 0x7b, 0xa8, - 0x1d, 0xa2, 0x9e, 0xc2, 0xe1, 0xa3, 0xba, 0xba, 0xe9, 0x0e, 0x02, 0xa4, - 0xe5, 0x08, 0x1c, 0xce, 0x26, 0x8a, 0xbd, 0x66, 0x8b, 0xad, 0x66, 0x85, - 0x3f, 0x77, 0x86, 0xe3, 0x7a, 0x4f, 0xa6, 0x59, 0x13, 0x75, 0xaf, 0xd8, - 0x53, 0x72, 0x6c, 0x56, 0x5d, 0x94, 0x69, 0x7b, 0x42, 0xe0, 0x25, 0x88, - 0x7c, 0xaf, 0x91, 0x9e, 0xc3, 0xba, 0xb5, 0xe7, 0xfb, 0x8f, 0xbe, 0xd2, - 0x8e, 0xb1, 0xef, 0x27, 0xd1, 0x0c, 0x5c, 0xcd, 0xed, 0x48, 0x1e, 0x53, - 0x0b, 0x28, 0x3d, 0xff, 0x3d, 0x5c, 0xb0, 0x37, 0xca, 0x12, 0x53, 0xaa, - 0x94, 0xd0, 0x21, 0x5a, 0xc1, 0x81, 0xeb, 0x94, 0x3b, 0x6e, 0x9d, 0x74, - 0xba, 0xe8, 0xa0, 0x97, 0xa3, 0xae, 0x90, 0x4c, 0x5a, 0x5e, 0x2c, 0xc3, - 0x53, 0xa9, 0x05, 0x97, 0x69, 0xd7, 0x28, 0xb8, 0xdc, 0xed, 0x57, 0xcc, - 0x58, 0x35, 0x87, 0x6e, 0xe8, 0x42, 0x7a, 0x04, 0x47, 0x5f, 0x3c, 0x5d, - 0x76, 0xc6, 0x2e, 0x24, 0x6e, 0x1d, 0x81, 0xab, 0xd4, 0xf3, 0x6b, 0xf3, - 0xc0, 0x3a, 0xd8, 0x4c, 0x3e, 0x02, 0x41, 0x10, 0x47, 0x29, 0xe3, 0x00, - 0x04, 0x20, 0xfd, 0xe9, 0xa1, 0x1c, 0xab, 0xd6, 0x48, 0xce, 0x11, 0xf6, - 0xa9, 0x67, 0xaa, 0xed, 0x5c, 0xdf, 0x8b, 0x03, 0x95, 0x7a, 0xd2, 0x16, - 0x39, 0x88, 0x3c, 0x84, 0xec, 0x87, 0xfc, 0x53, 0x0d, 0x2d, 0xaa, 0xa1, - 0x3a, 0xec, 0x46, 0x0d, 0x5e, 0xeb, 0x1f, 0x76, 0xc7, 0x0b, 0xa7, 0x49, - 0xad, 0x0f, 0x6f, 0x12, 0x61, 0x5d, 0x06, 0x80, 0x42, 0x0e, 0x4c, 0x79, - 0x19, 0x90, 0x0a, 0x52, 0x88, 0x98, 0xc2, 0x44, 0x46, 0xf3, 0x16, 0x14, - 0x68, 0xd9, 0x8f, 0xd2, 0xd6, 0x3f, 0x74, 0xea, 0x4c, 0xbf, 0x73, 0x2c, - 0xfa, 0xe4, 0x45, 0xec, 0x01, 0x00, 0xaa, 0x76, 0x6d, 0xed, 0x3a, 0x31, - 0x87, 0xf6, 0xd1, 0xfb, 0x67, 0x88, 0x42, 0x64, 0x3b, 0x29, 0x84, 0xfb, - 0x23, 0x85, 0x78, 0x2c, 0x90, 0xa2, 0x4a, 0x3a, 0x54, 0x72, 0x9f, 0x6c, - 0xd1, 0x91, 0xf3, 0xcc, 0x81, 0x42, 0x1a, 0xdd, 0xdd, 0x28, 0xaa, 0x97, - 0xc3, 0x68, 0x35, 0x7b, 0x98, 0xa0, 0xc4, 0x0f, 0x97, 0x4d, 0xb5, 0xe9, - 0xcd, 0xea, 0x25, 0x31, 0x58, 0x2b, 0x50, 0x08, 0x55, 0x11, 0x38, 0x8e, - 0x4b, 0x7e, 0x63, 0x3b, 0xdd, 0x02, 0x4c, 0x3a, 0x97, 0x75, 0xd6, 0x7c, - 0x9e, 0x30, 0xc7, 0xeb, 0xbc, 0xe8, 0x09, 0x01, 0x48, 0xb2, 0xf6, 0xe6, - 0xcb, 0xbe, 0xe1, 0xd3, 0x5a, 0x72, 0xd1, 0xb9, 0x20, 0xc3, 0x35, 0x01, - 0xe5, 0x56, 0x9c, 0xe0, 0x87, 0xc7, 0x9f, 0x4a, 0x33, 0x35, 0xdf, 0x83, - 0x56, 0x34, 0x1a, 0x71, 0x7f, 0x8e, 0xed, 0x5c, 0x87, 0x1a, 0x7d, 0xa2, - 0xb6, 0xf1, 0x6b, 0x0d, 0x92, 0xd1, 0x6f, 0x39, 0xf9, 0xa9, 0xef, 0x64, - 0x41, 0x22, 0xc3, 0xa3, 0x81, 0xef, 0x89, 0xf3, 0x1f, 0x91, 0x3c, 0x2e, - 0x1a, 0xce, 0x77, 0x3a, 0xbc, 0x66, 0x73, 0xc8, 0xb6, 0x78, 0x96, 0xe1, - 0xe5, 0x93, 0xb8, 0x9d, 0xf6, 0x88, 0x6c, 0x6c, 0x61, 0x21, 0x0c, 0x0e, - 0x4e, 0xd6, 0x01, 0x18, 0x03, 0x96, 0x6e, 0xb3, 0x89, 0xc2, 0xff, 0x97, - 0x16, 0xfd, 0xf2, 0x25, 0xc7, 0xb5, 0x93, 0xf1, 0x8d, 0xbe, 0xeb, 0xa4, - 0xe4, 0xcf, 0x3a, 0x5b, 0xaa, 0x6e, 0xf2, 0xea, 0x1c, 0x57, 0xc6, 0x9c, - 0xd5, 0x6b, 0x1e, 0x80, 0x86, 0x89, 0x54, 0xfd, 0xdd, 0x78, 0xd5, 0xb6, - 0x91, 0x1e, 0x13, 0xdb, 0x3a, 0xe1, 0x66, 0xab, 0x51, 0x69, 0x90, 0xf5, - 0x79, 0xba, 0x95, 0x1b, 0xad, 0x6a, 0x05, 0xe6, 0xe0, 0x79, 0x48, 0xd8, - 0x06, 0xe8, 0x6b, 0x36, 0xe5, 0x8a, 0x39, 0x9e, 0x82, 0x41, 0x45, 0x78, - 0x2e, 0x97, 0xe3, 0x4e, 0x2c, 0x96, 0xfb, 0x64, 0xc5, 0x02, 0x7e, 0xee, - 0xf3, 0x49, 0xa9, 0x6c, 0x5e, 0xbd, 0x33, 0x29, 0xd9, 0xa1, 0xe4, 0x2c, - 0x4e, 0x99, 0x13, 0x09, 0x72, 0x09, 0xc9, 0xed, 0x51, 0xf7, 0x88, 0x5e, - 0x16, 0xa0, 0x2d, 0xaf, 0x90, 0xaf, 0xfb, 0xb2, 0xed, 0x1e, 0xe3, 0x2b, - 0xb5, 0xd1, 0xc3, 0xbf, 0x07, 0xf1, 0x93, 0x18, 0x6f, 0xfa, 0xec, 0xf1, - 0xd6, 0x8d, 0xa1, 0x6e, 0x79, 0x4f, 0x9b, 0xfc, 0xaf, 0xd8, 0x41, 0xce, - 0x9e, 0x15, 0x9c, 0xce, 0x30, 0x88, 0xbb, 0x54, 0x61, 0x1f, 0xb5, 0x08, - 0x97, 0x93, 0x18, 0x7c, 0x00, 0x4c, 0xf0, 0x05, 0x03, 0x95, 0x3b, 0xcc, - 0x83, 0xed, 0x0f, 0xd3, 0x56, 0xfb, 0xb8, 0x62, 0xe1, 0xbc, 0x85, 0xeb, - 0x96, 0x9f, 0x54, 0x55, 0x27, 0x38, 0xbd, 0x2c, 0xce, 0xe8, 0x30, 0x46, - 0xdf, 0x0a, 0x1a, 0x59, 0xfa, 0x05, 0xda, 0xf5, 0x80, 0x82, 0x38, 0x22, - 0xa9, 0xe1, 0x42, 0x88, 0x31, 0xdd, 0x20, 0x48, 0x73, 0xed, 0xc8, 0xb8, - 0x90, 0x60, 0xc3, 0xe5, 0x9f, 0x80, 0xe1, 0x42, 0x35, 0x87, 0x06, 0xe2, - 0xfc, 0xdb, 0xa4, 0x38, 0x88, 0x02, 0xdc, 0x5d, 0x45, 0x4f, 0xe8, 0xf0, - 0xaf, 0x11, 0xa1, 0xcc, 0xe3, 0x1b, 0xb0, 0xf5, 0x35, 0x9a, 0x08, 0x79, - 0x5f, 0xe5, 0x7e, 0x94, 0xcb, 0xe5, 0x2d, 0x2d, 0xf6, 0x35, 0x00, 0xb9, - 0x42, 0x94, 0x9f, 0xe9, 0xe7, 0x39, 0x47, 0x31, 0xc6, 0xdf, 0x45, 0xa4, - 0x7c, 0x38, 0xed, 0x3c, 0x15, 0xcc, 0x34, 0xd7, 0xb6, 0x70, 0x4b, 0x00, - 0x9f, 0x7c, 0xf3, 0xe4, 0xba, 0xe9, 0x35, 0x72, 0x71, 0xb6, 0x94, 0xce, - 0xf9, 0xfe, 0x63, 0xbd, 0x30, 0x55, 0x7b, 0x2a, 0xa1, 0x1a, 0xe5, 0xd4, - 0x97, 0x52, 0xd3, 0xfd, 0xb3, 0x58, 0x7b, 0x6b, 0xbc, 0x65, 0x5d, 0xa1, - 0x50, 0x00, 0x79, 0x44, 0x87, 0xe4, 0x73, 0xc4, 0x82, 0x05, 0x14, 0xc8, - 0x22, 0xd6, 0x13, 0x7e, 0x7f, 0x16, 0xf5, 0x92, 0x1e, 0x2e, 0x01, 0x31, - 0x94, 0xb4, 0x6a, 0xbd, 0x45, 0x1d, 0xcd, 0x8e, 0xeb, 0x45, 0xcb, 0x35, - 0x83, 0xa6, 0xa7, 0xd8, 0xb5, 0x41, 0x86, 0x06, 0xbe, 0x00, 0x38, 0x64, - 0x2f, 0xaf, 0xe2, 0xb0, 0x7f, 0xaa, 0x8b, 0x4d, 0xf7, 0x76, 0xa2, 0x95, - 0x20, 0x6d, 0x08, 0xa0, 0xe4, 0xb5, 0x56, 0x91, 0xb3, 0x71, 0xf0, 0x64, - 0x4c, 0x18, 0xec, 0x2f, 0xf0, 0xf0, 0x2d, 0xa6, 0xe3, 0x11, 0x7f, 0xd4, - 0x5b, 0x71, 0x70, 0xe1, 0xce, 0xde, 0xc9, 0x00, 0xe7, 0xf5, 0x4a, 0x3b, - 0x99, 0x3d, 0x18, 0x23, 0xbb, 0xfd, 0x07, 0xbb, 0x59, 0xaa, 0x78, 0x4e, - 0xba, 0xbe, 0x78, 0x10, 0xf2, 0x47, 0x8c, 0x31, 0x4c, 0x16, 0x6b, 0x15, - 0x64, 0x8c, 0x3a, 0x69, 0x26, 0x71, 0xac, 0x92, 0x01, 0x00, 0x1b, 0x2e, - 0xf7, 0x6a, 0xcc, 0x58, 0x0d, 0x05, 0x5f, 0x36, 0x20, 0xdf, 0x5f, 0x18, - 0x10, 0x11, 0x2f, 0x6e, 0x9e, 0x3b, 0x73, 0x16, 0x21, 0xd8, 0x52, 0xc5, - 0x12, 0x28, 0x64, 0xad, 0x1d, 0x0c, 0x1d, 0x72, 0x9e, 0x4e, 0xd4, 0xfa, - 0x03, 0xfc, 0x0b, 0xf2, 0xe3, 0x2f, 0x7e, 0x0f, 0x3a, 0x30, 0xfc, 0x51, - 0x1a, 0x75, 0x47, 0x24, 0xd4, 0x7f, 0x31, 0xc7, 0x4b, 0x1a, 0x55, 0x3b, - 0xba, 0x2e, 0x6f, 0x24, 0x8d, 0xe0, 0x2e, 0x48, 0xf7, 0x28, 0xea, 0xea, - 0x1c, 0x03, 0xb4, 0x1c, 0x4d, 0xe8, 0x44, 0xb5, 0xe9, 0x02, 0x46, 0x14, - 0x7d, 0x48, 0x13, 0x40, 0x74, 0x5d, 0x75, 0x24, 0x9c, 0x97, 0xdc, 0x8b, - 0x15, 0x3d, 0x7d, 0xd3, 0xc9, 0xc2, 0x35, 0x88, 0x5f, 0xb0, 0x35, 0x32, - 0xbb, 0x7a, 0xbf, 0x5a, 0x1c, 0xcb, 0xa8, 0xcb, 0xdf, 0x1d, 0xf1, 0x79, - 0x7b, 0x93, 0x60, 0x4d, 0x98, 0x73, 0x11, 0x92, 0xfc, 0x29, 0xe2, 0x5b, - 0x53, 0xea, 0xe1, 0x0e, 0x13, 0x14, 0x40, 0x28, 0xac, 0xd3, 0x5f, 0x99, - 0x7c, 0x5b, 0x7b, 0xf4, 0x0d, 0x5b, 0xcf, 0x35, 0x49, 0x5d, 0x7d, 0x44, - 0x9f, 0xcb, 0xb2, 0x56, 0x2e, 0x54, 0x40, 0x35, 0x0b, 0x26, 0x53, 0xc8, - 0xd8, 0x79, 0xd4, 0xda, 0x49, 0xd7, 0xc9, 0xf7, 0xaa, 0xcb, 0x32, 0xbe, - 0x6b, 0x40, 0x81, 0x17, 0xdb, 0x07, 0x99, 0xd5, 0x36, 0x97, 0x6e, 0x64, - 0x01, 0x95, 0x9b, 0x22, 0xcf, 0x8a, 0x5b, 0x47, 0xbd, 0x0b, 0x22, 0xec, - 0x1d, 0x35, 0x42, 0xad, 0x09, 0xd2, 0xa5, 0x2b, 0xc4, 0xdb, 0xbe, 0x5a, - 0x3f, 0x82, 0xd4, 0x55, 0x5b, 0xd0, 0xed, 0x7c, 0x15, 0x47, 0xcd, 0xf2, - 0x07, 0xae, 0x0b, 0xe6, 0x06, 0x8f, 0x2f, 0xe7, 0xeb, 0x11, 0xa0, 0x3c, - 0xac, 0x8e, 0xff, 0x7b, 0xd0, 0x67, 0x7f, 0xe6, 0xfd, 0x51, 0x5a, 0x13, - 0xd8, 0xe5, 0xd1, 0x97, 0x02, 0xfd, 0x34, 0x6f, 0x89, 0xa7, 0xc9, 0x35, - 0xd8, 0xa8, 0x62, 0x23, 0xe2, 0xa7, 0x98, 0x7e, 0xed, 0xb7, 0xa5, 0xdf, - 0xa0, 0x85, 0x9a, 0x43, 0xf9, 0x9c, 0x86, 0x89, 0x63, 0xf5, 0x3c, 0x95, - 0xbf, 0x54, 0x6b, 0x2c, 0x4e, 0x50, 0xfb, 0xb7, 0xf9, 0xa5, 0x2a, 0xe8, - 0x00, 0x6a, 0x52, 0x35, 0x92, 0x7b, 0x8b, 0xfc, 0x53, 0xc3, 0x91, 0x6c, - 0x81, 0xae, 0x7a, 0x3a, 0x97, 0xd1, 0x77, 0xac, 0x1f, 0x86, 0xa8, 0xff, - 0x52, 0xf9, 0xc3, 0x4d, 0x14, 0xdf, 0xa2, 0xaf, 0x7f, 0x3e, 0x41, 0xf4, - 0x27, 0xf8, 0x3a, 0xc4, 0x15, 0xde, 0x8a, 0xb7, 0xe3, 0x9b, 0x71, 0x43, - 0x45, 0xfa, 0x18, 0x66, 0x73, 0x35, 0xf3, 0x11, 0x31, 0x5f, 0xa0, 0x62, - 0x24, 0x39, 0xc1, 0xcc, 0x49, 0x19, 0x6f, 0xd3, 0xe1, 0x39, 0x82, 0x9b, - 0x36, 0x71, 0x21, 0xad, 0x2c, 0x60, 0x71, 0xe8, 0x5c, 0x14, 0x9c, 0xdc, - 0xeb, 0x42, 0xdf, 0xcd, 0x6c, 0x85, 0xaf, 0x5c, 0x66, 0x3a, 0x65, 0xb0, - 0xe9, 0x93, 0xb9, 0x0a, 0xb2, 0xeb, 0x57, 0xe8, 0x1e, 0xd3, 0xc2, 0x99, - 0x7e, 0x09, 0xe5, 0x2f, 0x0d, 0xa0, 0x97, 0xbb, 0x10, 0xec, 0xf0, 0xd6, - 0xa6, 0x19, 0xc2, 0x26, 0xc5, 0x6b, 0x76, 0x7e, 0xa1, 0x2a, 0x91, 0xa5, - 0x3c, 0x0d, 0xe5, 0xad, 0xb0, 0x68, 0x61, 0x23, 0x26, 0x90, 0xe3, 0xf6, - 0xae, 0x8a, 0x58, 0xe8, 0x47, 0x67, 0xc0, 0x06, 0x3d, 0xc1, 0x70, 0xc6, - 0x50, 0x43, 0x4e, 0x6e, 0x0a, 0xa0, 0xf5, 0xd1, 0x52, 0x78, 0x49, 0xc0, - 0x82, 0x74, 0xce, 0x7f, 0x4b, 0x61, 0xe6, 0x63, 0x6d, 0xbc, 0x48, 0x8e, - 0xb4, 0x63, 0xff, 0x2b, 0x34, 0x54, 0xd0, 0x0a, 0xd0, 0x1a, 0x20, 0xd6, - 0xd1, 0xf5, 0xd0, 0x8c, 0xfe, 0x22, 0x5f, 0x7c, 0xa8, 0x87, 0xfe, 0x5e, - 0x6b, 0xb0, 0xa0, 0x36, 0x62, 0xfa, 0xdd, 0x1d, 0x84, 0x58, 0xe7, 0x70, - 0x40, 0xea, 0x2c, 0xed, 0xfb, 0x53, 0x73, 0xea, 0xee, 0xe7, 0xdc, 0x10, - 0xa2, 0xd3, 0xf8, 0xc3, 0xba, 0xf1, 0x1d, 0x75, 0x36, 0xff, 0xd5, 0xe5, - 0x20, 0x94, 0x04, 0x21, 0xc9, 0x4a, 0xf5, 0xa2, 0x99, 0x6f, 0x4a, 0x51, - 0x11, 0x0c, 0xde, 0xed, 0xdf, 0xa9, 0xfc, 0xd5, 0xa4, 0x44, 0xdb, 0xa0, - 0x61, 0xb1, 0x8c, 0xc8, 0x1e, 0x8e, 0xb6, 0x51, 0x6d, 0xe2, 0xb7, 0x34, - 0x7d, 0xb9, 0xd2, 0x44, 0xda, 0x8c, 0x01, 0xed, 0x57, 0x9f, 0x10, 0x17, - 0xfc, 0x35, 0xb3, 0xfc, 0x35, 0xe8, 0x21, 0x9d, 0x2d, 0x6b, 0xad, 0xe6, - 0xe5, 0x62, 0xc5, 0xef, 0xe9, 0x49, 0xd9, 0x8f, 0x88, 0x31, 0x44, 0xb7, - 0x99, 0xc9, 0x89, 0xde, 0x55, 0x76, 0x35, 0x76, 0x36, 0xaa, 0x6f, 0x32, - 0x81, 0xbe, 0xd0, 0x09, 0x5a, 0x80, 0x1a, 0x73, 0x61, 0xa2, 0x47, 0xb5, - 0x4d, 0xb3, 0x45, 0x09, 0x2f, 0x39, 0x75, 0x2b, 0x4f, 0x83, 0x72, 0xa5, - 0x67, 0x34, 0x3d, 0xe7, 0x12, 0x37, 0xec, 0x67, 0x80, 0xae, 0xa6, 0xec, - 0x29, 0x98, 0xc5, 0xc5, 0xaf, 0x4a, 0x96, 0x3e, 0x9d, 0xd8, 0x89, 0xdf, - 0x8f, 0x60, 0x0b, 0xcb, 0x1f, 0x8a, 0x68, 0x90, 0x85, 0xc0, 0x46, 0x58, - 0x97, 0x8d, 0x32, 0x06, 0x3c, 0x6e, 0x42, 0x6f, 0x67, 0x4c, 0xc0, 0x82, - 0x53, 0xf8, 0x8b, 0x49, 0x78, 0x41, 0xbe, 0x88, 0x99, 0x79, 0x7e, 0xae, - 0x95, 0x95, 0xb1, 0xaa, 0xd3, 0x74, 0xfa, 0x2e, 0xd7, 0xf5, 0xed, 0xe3, - 0xf3, 0xc0, 0x39, 0x61, 0x01, 0xca, 0x0c, 0x77, 0xb1, 0xa4, 0x36, 0xa8, - 0x0b, 0x29, 0xc0, 0x6a, 0x97, 0x14, 0x5f, 0xe9, 0x39, 0xba, 0xa6, 0x73, - 0xde, 0x8d, 0x1e, 0x41, 0x2f, 0xd0, 0x89, 0x9c, 0x1e, 0x85, 0x8d, 0x32, - 0x88, 0x41, 0x83, 0x85, 0x04, 0xff, 0x4b, 0x55, 0xcf, 0x46, 0x3e, 0x7b, - 0x85, 0x84, 0x1f, 0x9a, 0xf5, 0x2f, 0x20, 0x7a, 0xff, 0x10, 0xb2, 0x81, - 0x3c, 0x70, 0xe4, 0xbe, 0xe1, 0xb8, 0x96, 0x7b, 0x0f, 0x83, 0x68, 0x7c, - 0x4c, 0x40, 0xc1, 0xfa, 0x1e, 0x76, 0x63, 0x3f, 0xd2, 0x7a, 0x02, 0xe0, - 0x51, 0x34, 0xf4, 0xaf, 0x74, 0xe3, 0x43, 0x9e, 0x93, 0xfd, 0x59, 0x51, - 0x76, 0xf0, 0x8c, 0x2c, 0x4c, 0xd5, 0xf5, 0x86, 0x4f, 0x32, 0x33, 0xb3, - 0x82, 0xdc, 0x87, 0x1b, 0x4c, 0xf7, 0x83, 0x54, 0x07, 0xa5, 0x4d, 0xec, - 0xd1, 0x9d, 0x53, 0x42, 0xae, 0x8d, 0xa9, 0xd6, 0xad, 0xe9, 0x0e, 0x6b, - 0x5c, 0x0c, 0x7e, 0x7d, 0xab, 0xc6, 0xe9, 0x1a, 0x85, 0x65, 0x81, 0x92, - 0xf0, 0xa0, 0x71, 0x90, 0xe2, 0x20, 0x83, 0x9c, 0x6d, 0x7c, 0xc0, 0xf7, - 0xa4, 0x02, 0x46, 0xef, 0x3e, 0x16, 0xe7, 0x94, 0x48, 0x85, 0xfb, 0x44, - 0xa3, 0xf5, 0x12, 0x87, 0x01, 0x01, 0x16, 0xbf, 0xa9, 0x09, 0x88, 0xd3, - 0x96, 0x86, 0x67, 0xc4, 0x83, 0x0b, 0xae, 0x6e, 0xe3, 0x9e, 0x31, 0xc6, - 0x7d, 0xf6, 0x59, 0x39, 0xb9, 0x45, 0xee, 0x72, 0xb3, 0x6f, 0x6d, 0xa0, - 0x30, 0xad, 0x3e, 0xe8, 0x4e, 0x70, 0xbd, 0xa1, 0xb3, 0xa6, 0x79, 0xff, - 0x2e, 0xc3, 0xca, 0x90, 0xc6, 0xba, 0xad, 0x72, 0xd1, 0xd9, 0xed, 0x29, - 0x6c, 0x0d, 0x70, 0xa9, 0x86, 0x84, 0xfb, 0x72, 0x79, 0x1e, 0x82, 0x86, - 0xaf, 0x10, 0xdc, 0x56, 0x9f, 0x6c, 0x95, 0x49, 0x43, 0x67, 0xd6, 0xcf, - 0x8e, 0x29, 0x04, 0x5c, 0x92, 0xe8, 0x73, 0x70, 0x8c, 0x03, 0x6d, 0x77, - 0x31, 0xf4, 0x03, 0x8a, 0x5a, 0x4b, 0x1b, 0xc3, 0x13, 0x3d, 0x8b, 0x6c, - 0x5b, 0x94, 0x1c, 0x19, 0xc8, 0x01, 0x3c, 0x5e, 0x5f, 0xdf, 0xab, 0xcd, - 0x04, 0xbc, 0x3d, 0x6c, 0xaf, 0x80, 0xff, 0x18, 0x32, 0x85, 0x13, 0xb8, - 0xa1, 0x38, 0x31, 0xde, 0x11, 0x21, 0xb1, 0xc5, 0x42, 0x6e, 0x2f, 0x65, - 0x37, 0xf3, 0xec, 0xe2, 0x51, 0x5b, 0xdc, 0x4a, 0x15, 0x58, 0xcb, 0x28, - 0x9d, 0x9f, 0x33, 0x09, 0xb2, 0xf9, 0x07, 0x77, 0x42, 0xc4, 0x05, 0x8a, - 0x14, 0xb6, 0xf8, 0xfa, 0xcb, 0x04, 0x76, 0x3c, 0x5d, 0x09, 0xc6, 0xeb, - 0x4e, 0x89, 0x53, 0xce, 0xab, 0x34, 0x1b, 0xa3, 0xe9, 0x03, 0x7a, 0xb5, - 0x6a, 0xfa, 0x82, 0x41, 0xf2, 0x76, 0x03, 0x13, 0x62, 0x0c, 0xfb, 0x46, - 0x8f, 0x7a, 0xd6, 0x89, 0xc4, 0x3f, 0xe1, 0xad, 0xf6, 0x8e, 0xb0, 0xfb, - 0xbd, 0x73, 0x8f, 0xbd, 0x03, 0x22, 0x45, 0xdd, 0xe4, 0x43, 0x5f, 0x37, - 0xa6, 0x96, 0xd1, 0x1d, 0x01, 0x7a, 0x95, 0x13, 0xbb, 0x1b, 0x31, 0x44, - 0x46, 0xe7, 0x29, 0xd2, 0x65, 0x67, 0x09, 0xe4, 0x65, 0x5e, 0x62, 0xbc, - 0x6c, 0x22, 0x7d, 0x1b, 0xf8, 0x7c, 0x59, 0x16, 0x69, 0x0d, 0x13, 0x7d, - 0x54, 0x30, 0x49, 0x1b, 0xf6, 0x41, 0x6d, 0x32, 0x9f, 0xf3, 0x4a, 0x8c, - 0x6f, 0x1e, 0x80, 0x98, 0x25, 0xa9, 0x49, 0x6f, 0xfe, 0xcd, 0xce, 0x01, - 0x2a, 0x4d, 0x92, 0x36, 0x92, 0xcf, 0x44, 0x81, 0xba, 0x93, 0x23, 0x78, - 0xd9, 0x97, 0xa6, 0xec, 0xab, 0x45, 0x8c, 0x9a, 0x75, 0xbc, 0x3f, 0x55, - 0x57, 0x10, 0x31, 0xdd, 0x09, 0x1a, 0xd4, 0x9f, 0x82, 0xdf, 0x00, 0xa4, - 0x59, 0x68, 0xd0, 0x69, 0x8c, 0xf9, 0x6d, 0x95, 0xb5, 0x01, 0x68, 0xe2, - 0xc9, 0x26, 0x61, 0x93, 0xb0, 0x67, 0x3c, 0x47, 0xdc, 0x65, 0xb7, 0xf4, - 0x46, 0xc4, 0x2f, 0x57, 0x4d, 0xcd, 0x47, 0x4c, 0x04, 0x47, 0xde, 0xbd, - 0xf2, 0x66, 0xd6, 0xb3, 0x7d, 0x5c, 0xdf, 0x5d, 0xc3, 0xf9, 0x02, 0x6e, - 0xe3, 0x32, 0x53, 0x30, 0x9a, 0x6a, 0x8e, 0x85, 0x15, 0x4a, 0x0e, 0x79, - 0x1e, 0xd9, 0x9e, 0x4f, 0xd9, 0x2c, 0xfa, 0xaf, 0x98, 0xda, 0x92, 0x03, - 0x3d, 0x12, 0x5f, 0xe1, 0x21, 0xf1, 0xda, 0x63, 0xb3, 0xda, 0x65, 0x15, - 0x47, 0x63, 0x13, 0x8d, 0x91, 0xb1, 0x79, 0xd8, 0x60, 0xaa, 0x31, 0x7c, - 0x4a, 0x38, 0x58, 0xf3, 0x23, 0x4f, 0x30, 0x31, 0x18, 0xb2, 0xcb, 0x85, - 0xf1, 0xac, 0x0b, 0x74, 0xfb, 0x3c, 0x0e, 0x96, 0x60, 0x01, 0xc9, 0x86, - 0xd1, 0x64, 0xab, 0x7b, 0xb9, 0xe8, 0x00, 0x6c, 0x92, 0x47, 0xcd, 0x48, - 0x17, 0x07, 0xf8, 0xd4, 0x5f, 0xd6, 0x9e, 0x8d, 0xff, 0x24, 0xb0, 0x83, - 0xeb, 0x62, 0x5b, 0xf3, 0x7e, 0x0c, 0xdd, 0xcb, 0xf7, 0x9b, 0x68, 0xf0, - 0x39, 0xc0, 0x2d, 0x72, 0x20, 0xf0, 0x44, 0x30, 0x5f, 0x8f, 0x62, 0xcf, - 0x3c, 0xe1, 0xbd, 0x31, 0x93, 0x7e, 0xe9, 0x2f, 0xb4, 0x95, 0x52, 0x55, - 0x8c, 0x98, 0xa8, 0xa8, 0x5c, 0xa0, 0x33, 0x89, 0x06, 0x65, 0x4e, 0xb6, - 0x41, 0xc6, 0x4e, 0xaf, 0xc0, 0xd3, 0xcd, 0xcf, 0x05, 0x44, 0x8c, 0x93, - 0xfc, 0x45, 0xe7, 0x1c, 0x0a, 0x3b, 0x85, 0xd6, 0xb1, 0xeb, 0xa7, 0x54, - 0x07, 0x87, 0x2a, 0x14, 0xca, 0x93, 0x50, 0xff, 0x68, 0xc1, 0xcd, 0x58, - 0x8d, 0xd9, 0xb1, 0x22, 0xed, 0xd2, 0xf0, 0xf2, 0x8f, 0x11, 0xe0, 0xae, - 0x38, 0x38, 0x6d, 0x66, 0xc7, 0xe5, 0xe8, 0x6c, 0xae, 0x5f, 0x38, 0x76, - 0xaa, 0x3f, 0x93, 0x60, 0x58, 0xba, 0x4b, 0x7b, 0xa7, 0xdf, 0x28, 0x71, - 0xe9, 0xb0, 0x30, 0x91, 0x21, 0x90, 0x71, 0x41, 0xd8, 0xbe, 0xf0, 0x82, - 0x8a, 0xc5, 0xe4, 0xf6, 0x0e, 0x3e, 0xb6, 0xeb, 0x75, 0x31, 0xad, 0xa2, - 0xd9, 0x05, 0x80, 0xf2, 0xfc, 0x8c, 0x31, 0xd7, 0x79, 0x34, 0x4d, 0x27, - 0xa0, 0xdb, 0xdf, 0x26, 0x2f, 0x76, 0x3a, 0x7b, 0x71, 0x35, 0xb6, 0x48, - 0x34, 0x24, 0x76, 0xe7, 0x25, 0x8b, 0x20, 0x66, 0xac, 0x17, 0x11, 0xd5, - 0x6c, 0xf7, 0x07, 0xdb, 0x98, 0x1e, 0xe5, 0x3c, 0x90, 0x14, 0x31, 0xdf, - 0xe9, 0x1c, 0x12, 0xa8, 0x23, 0xd4, 0x57, 0xb2, 0xc3, 0x1f, 0x3c, 0xba, - 0x35, 0x08, 0xce, 0xff, 0x89, 0x20, 0xc3, 0x5a, 0x77, 0x30, 0xe6, 0x54, - 0x59, 0xfe, 0x9f, 0x29, 0xd4, 0x65, 0x2d, 0x0e, 0x15, 0x9d, 0xc2, 0x0d, - 0xff, 0x6f, 0x06, 0x66, 0xb3, 0xe5, 0xcd, 0x61, 0xe2, 0x51, 0xbe, 0x5f, - 0xf9, 0x99, 0xd7, 0x26, 0x35, 0xe7, 0x3a, 0x01, 0x8a, 0x0b, 0xf8, 0x60, - 0x70, 0x91, 0xdb, 0xb4, 0x4c, 0xf2, 0xff, 0xfb, 0x79, 0x40, 0x56, 0xa1, - 0x7d, 0xc2, 0x49, 0x27, 0xb6, 0x1b, 0xf5, 0xaf, 0xef, 0x0a, 0xca, 0x8c, - 0xd3, 0x34, 0xf3, 0x36, 0x12, 0xcf, 0x80, 0x3e, 0xf7, 0xc6, 0x0d, 0xf6, - 0x87, 0xc9, 0xd7, 0xf1, 0xd3, 0x6f, 0x59, 0xf8, 0x05, 0x4a, 0x97, 0xfa, - 0x70, 0x39, 0x2c, 0x68, 0x19, 0xee, 0xd1, 0x6d, 0x82, 0xa5, 0xce, 0x08, - 0x6c, 0xf7, 0x9a, 0x0a, 0x0d, 0x78, 0xef, 0xf2, 0x9c, 0x57, 0x72, 0x1f, - 0x1c, 0x3b, 0xf4, 0x3a, 0x56, 0xec, 0x18, 0x44, 0x50, 0xe1, 0x38, 0x02, - 0xe6, 0x59, 0x1e, 0xcd, 0x2c, 0x28, 0xe6, 0x07, 0x9e, 0xd2, 0x1c, 0xa1, - 0xe9, 0x6d, 0x71, 0x5b, 0xa1, 0x85, 0xe8, 0x2b, 0xec, 0x6e, 0x28, 0x65, - 0x6f, 0xf6, 0x14, 0x44, 0x97, 0x13, 0x37, 0xe0, 0xb7, 0x1a, 0x26, 0x8f, - 0xf0, 0x23, 0x77, 0x60, 0x7d, 0x84, 0xb2, 0xc6, 0xab, 0x94, 0x7d, 0x73, - 0x12, 0x25, 0xd1, 0xf9, 0xd0, 0xe9, 0x3f, 0x21, 0x39, 0xd4, 0x0a, 0xa1, - 0x77, 0x6e, 0x26, 0x03, 0x0c, 0xcc, 0x93, 0x7b, 0xf9, 0xbf, 0xa4, 0x2d, - 0xbe, 0x73, 0x28, 0x54, 0xbd, 0x66, 0x93, 0xd2, 0x37, 0x34, 0x7b, 0x8f, - 0x25, 0x0c, 0x9e, 0xee, 0x27, 0x24, 0x9f, 0x07, 0xda, 0xdf, 0x23, 0x61, - 0x7b, 0xc6, 0x81, 0xa5, 0x26, 0x57, 0xd5, 0x08, 0xa1, 0x17, 0x46, 0x48, - 0x6d, 0xcb, 0x34, 0x09, 0x37, 0xe9, 0xa5, 0xa3, 0x90, 0xe6, 0x5c, 0x38, - 0x8a, 0x0f, 0xa0, 0xe1, 0xe0, 0xf6, 0x37, 0xe7, 0x97, 0x96, 0x58, 0x3d, - 0x09, 0x86, 0x92, 0xf4, 0x3e, 0xa6, 0x08, 0x7d, 0x39, 0xad, 0x75, 0x57, - 0x1e, 0x4a, 0xb2, 0x6f, 0xed, 0xca, 0x39, 0xf5, 0xfa, 0x27, 0x42, 0x9b, - 0x4c, 0xd4, 0xcd, 0x8d, 0xc9, 0x3e, 0xd7, 0x42, 0x92, 0x40, 0x54, 0x37, - 0xf1, 0x90, 0x89, 0x7d, 0x6a, 0x63, 0x11, 0x2c, 0xf1, 0xaa, 0x14, 0x0b, - 0x13, 0x6e, 0x70, 0xbf, 0x79, 0x2d, 0xc2, 0xe9, 0xaa, 0x1e, 0x30, 0x9f, - 0x49, 0x0f, 0x1b, 0x79, 0xba, 0x60, 0x3c, 0x80, 0xc7, 0x13, 0x6b, 0x6f, - 0xd1, 0xf0, 0x1d, 0xe9, 0xb5, 0x74, 0x74, 0x24, 0x8a, 0x5c, 0xd8, 0x79, - 0x12, 0xf0, 0x08, 0x61, 0x7c, 0x4a, 0x3d, 0x7e, 0xec, 0xf6, 0x98, 0x91, - 0x22, 0x70, 0x8e, 0x8f, 0xfc, 0x2d, 0xf9, 0x86, 0xee, 0xec, 0xb7, 0x52, - 0xba, 0x7e, 0xe7, 0x51, 0x5a, 0xb9, 0x67, 0x3c, 0x86, 0xd5, 0x1f, 0x4e, - 0xee, 0x4b, 0xa7, 0x0a, 0x2c, 0x35, 0xf1, 0xf2, 0x7b, 0xf4, 0x87, 0x58, - 0x5e, 0xf8, 0x8d, 0x64, 0x8a, 0x03, 0x48, 0x22, 0xb9, 0x56, 0x53, 0x78, - 0xb7, 0xe6, 0xf2, 0xe9, 0x05, 0x9e, 0xf9, 0x07, 0x85, 0x2d, 0xf4, 0x41, - 0x88, 0xeb, 0x09, 0xa2, 0xdc, 0x63, 0x6e, 0xf1, 0x67, 0x63, 0x4b, 0x1f, - 0x9e, 0x9d, 0xb0, 0x47, 0x17, 0x14, 0x9d, 0x60, 0xa5, 0x9b, 0x68, 0x52, - 0x0b, 0x32, 0x4b, 0xdf, 0xb5, 0xbd, 0xa2, 0xb8, 0x52, 0x09, 0x59, 0xf9, - 0x66, 0x55, 0xd8, 0x2b, 0x79, 0x44, 0x7a, 0x5d, 0x3c, 0x72, 0x62, 0x68, - 0x15, 0x48, 0x5c, 0xc2, 0x1b, 0xd7, 0x53, 0x03, 0x7c, 0xc9, 0xe7, 0xd9, - 0x75, 0xcb, 0x6c, 0xe6, 0x30, 0xc1, 0x41, 0x55, 0x8f, 0xd2, 0xec, 0xcf, - 0x36, 0x50, 0x33, 0xd0, 0xb1, 0x5a, 0x6c, 0x5f, 0x2e, 0x61, 0x3e, 0xd1, - 0x15, 0xd7, 0xdf, 0xb9, 0x2d, 0x5c, 0x94, 0x59, 0x64, 0x91, 0x55, 0xaa, - 0x79, 0x67, 0x2b, 0xa2, 0x1b, 0x3e, 0xe5, 0x54, 0x32, 0xf0, 0xda, 0xee, - 0x27, 0xd1, 0x4d, 0x02, 0xaa, 0x86, 0x6e, 0xf3, 0x49, 0x73, 0xfc, 0x95, - 0x7d, 0xfc, 0xed, 0x23, 0xb6, 0x18, 0xe7, 0x00, 0x4e, 0xb3, 0x01, 0x68, - 0x10, 0x2b, 0xc4, 0x5a, 0xad, 0x96, 0xfe, 0xc2, 0xa7, 0x7d, 0x9e, 0xc7, - 0x25, 0x10, 0x83, 0xcc, 0xee, 0x9a, 0x7a, 0x6a, 0x48, 0x8a, 0xd9, 0xaf, - 0x1f, 0xe0, 0x14, 0xde, 0x93, 0x53, 0x63, 0xc3, 0x09, 0x58, 0x79, 0x53, - 0x4c, 0x15, 0x08, 0x9a, 0x1e, 0x9a, 0xca, 0x18, 0x78, 0x0e, 0xb0, 0xe2, - 0x4a, 0x18, 0xb6, 0x50, 0x45, 0x8f, 0xfe, 0x2a, 0xbd, 0x8e, 0xd3, 0xb1, - 0x62, 0x33, 0x96, 0xb6, 0x8f, 0xe6, 0xbb, 0xc4, 0x3c, 0x8e, 0x3b, 0x20, - 0x3b, 0x12, 0xf5, 0xd3, 0x2f, 0xcb, 0x34, 0x3b, 0x79, 0x03, 0xa1, 0x94, - 0xe1, 0xd2, 0x39, 0x25, 0x9a, 0xdb, 0xae, 0xcf, 0x13, 0x2e, 0x7a, 0x4b, - 0xa9, 0xb9, 0x13, 0xb8, 0x1e, 0x40, 0x0f, 0x2c, 0x84, 0x29, 0xdf, 0x19, - 0x3b, 0x5d, 0x1f, 0xd5, 0x2f, 0x15, 0x36, 0x9f, 0x2a, 0xaa, 0xd6, 0xd1, - 0xa7, 0xaa, 0xe4, 0x86, 0x22, 0x7b, 0x2f, 0x60, 0x3a, 0x9a, 0x70, 0x2c, - 0x38, 0x7a, 0xb2, 0x74, 0x0b, 0x69, 0x63, 0x1e, 0xe0, 0x88, 0xdb, 0xa8, - 0x21, 0xf3, 0xa3, 0xa5, 0x89, 0xa9, 0x78, 0xd6, 0x61, 0x16, 0x7a, 0x26, - 0xae, 0xec, 0x74, 0x54, 0x5a, 0x77, 0xf5, 0x08, 0x38, 0x40, 0x88, 0x8c, - 0x46, 0xf4, 0xeb, 0xdd, 0xd1, 0x65, 0x10, 0xb5, 0x31, 0x4f, 0x40, 0x1b, - 0x81, 0x36, 0xa9, 0xfe, 0x6c, 0xc7, 0xc3, 0xb1, 0x7f, 0x0c, 0xd2, 0xce, - 0x06, 0x7e, 0x64, 0xbd, 0x5a, 0xb6, 0x71, 0x53, 0x6d, 0x84, 0x63, 0xb8, - 0x8b, 0xa8, 0x2a, 0x38, 0x92, 0x77, 0x19, 0x6b, 0x00, 0xb7, 0x2c, 0x0f, - 0xbd, 0x5b, 0xc1, 0xea, 0x50, 0x6f, 0xfa, 0x75, 0x7b, 0xec, 0x2b, 0xd7, - 0x99, 0x64, 0x04, 0x29, 0x80, 0xb1, 0x8b, 0x90, 0x72, 0xd2, 0x1f, 0x06, - 0x8f, 0x45, 0x83, 0xeb, 0x8e, 0x9e, 0x75, 0x2a, 0xa2, 0x64, 0x42, 0xb2, - 0x1d, 0x97, 0x8a, 0xe6, 0x4d, 0xed, 0x83, 0x34, 0x59, 0x98, 0xa8, 0x38, - 0x94, 0x07, 0x89, 0x2e, 0x26, 0x15, 0x2e, 0xb5, 0xab, 0xbf, 0x8e, 0xba, - 0xfe, 0x58, 0x0c, 0x03, 0xd6, 0x51, 0x3f, 0x3c, 0xa5, 0xa8, 0x91, 0xaf, - 0x0f, 0xf5, 0x87, 0xc7, 0x98, 0xf1, 0x90, 0xfe, 0xdf, 0xf8, 0x4a, 0xdd, - 0x4b, 0x2e, 0x72, 0xbc, 0x15, 0xcb, 0x94, 0x83, 0x17, 0x23, 0x3e, 0x59, - 0x7b, 0x2b, 0x34, 0xeb, 0x9e, 0x28, 0x48, 0x34, 0x4d, 0x61, 0x07, 0xa0, - 0x5c, 0x63, 0x49, 0x32, 0x55, 0xf2, 0xfc, 0x75, 0x59, 0x72, 0xfe, 0xc7, - 0x17, 0x1e, 0x68, 0x6d, 0x22, 0x08, 0x82, 0xa4, 0xf1, 0xab, 0xc3, 0x89, - 0xa9, 0xa4, 0x65, 0xb3, 0x0c, 0xc3, 0x84, 0x43, 0xd6, 0x24, 0x60, 0x76, - 0x0d, 0x43, 0x9a, 0x7f, 0xa4, 0xca, 0x1d, 0xb9, 0xe2, 0x1b, 0x56, 0x67, - 0xb5, 0xa0, 0x1d, 0x6d, 0xde, 0x8c, 0x21, 0x25, 0x19, 0x9d, 0x33, 0x40, - 0x9e, 0xcc, 0x92, 0xad, 0x9d, 0x1d, 0x39, 0x9e, 0xc3, 0x1f, 0x71, 0x10, - 0xe4, 0xbd, 0x36, 0x28, 0xbc, 0xac, 0x93, 0x61, 0x97, 0x2a, 0x71, 0x00, - 0x74, 0x09, 0x6d, 0x5d, 0x7d, 0x57, 0xaa, 0x69, 0x3c, 0x7a, 0x8c, 0x9b, - 0x06, 0xf3, 0x3b, 0x26, 0xe6, 0x2c, 0x6e, 0x8a, 0x6d, 0x94, 0x96, 0xbf, - 0x01, 0xad, 0xdd, 0xd1, 0x70, 0x4f, 0xb1, 0x70, 0x0f, 0xab, 0xe0, 0xe2, - 0xbf, 0xc5, 0x0f, 0x50, 0xf0, 0x02, 0x4c, 0xd8, 0x0a, 0x27, 0xe6, 0xfb, - 0x17, 0xc6, 0x9f, 0x73, 0x03, 0x53, 0x06, 0xf1, 0xd8, 0x5e, 0x87, 0xb7, - 0x43, 0x72, 0xb6, 0x15, 0x47, 0x8f, 0x05, 0x2c, 0x93, 0x58, 0xdf, 0x3c, - 0xca, 0x00, 0xb9, 0x5d, 0x60, 0x69, 0x87, 0xef, 0x92, 0xa5, 0x3d, 0x3e, - 0x0c, 0x2a, 0x9e, 0x28, 0xab, 0x7e, 0x91, 0x6e, 0xdc, 0x65, 0xe5, 0xac, - 0xfa, 0xba, 0x2f, 0xf1, 0x7c, 0x6e, 0x77, 0x6f, 0x1a, 0xdb, 0x24, 0x4f, - 0x3b, 0x0e, 0xd5, 0x09, 0xb0, 0xed, 0xa3, 0x1d, 0xc1, 0x95, 0xef, 0x86, - 0x83, 0x03, 0xe1, 0x9f, 0x19, 0x6f, 0x36, 0x27, 0x2d, 0x14, 0x0a, 0xe4, - 0xe0, 0x41, 0xc0, 0xb9, 0x64, 0x5b, 0x55, 0x38, 0x01, 0xbb, 0x99, 0x79, - 0xf5, 0x25, 0xdd, 0x13, 0x43, 0x3c, 0xb8, 0xe3, 0x3f, 0xcb, 0xa6, 0x03, - 0x7d, 0x5e, 0x89, 0x90, 0x6c, 0xb7, 0x80, 0x95, 0xbf, 0xe0, 0x53, 0x50, - 0x34, 0x0b, 0x08, 0xcb, 0x59, 0x5f, 0x3b, 0x8e, 0x03, 0x12, 0xfe, 0x25, - 0xa4, 0x2f, 0x0c, 0x07, 0x19, 0x7f, 0x4c, 0xe0, 0x71, 0x97, 0xd6, 0x7e, - 0x4c, 0x0f, 0x25, 0xa8, 0x82, 0x07, 0x31, 0x0a, 0x8d, 0x96, 0x0b, 0x63, - 0x6a, 0x31, 0x8b, 0x0b, 0x49, 0x65, 0x37, 0x17, 0x79, 0x33, 0xa3, 0x6f, - 0xd2, 0xaa, 0x7c, 0x51, 0xeb, 0xf2, 0x3a, 0x14, 0xf7, 0xf0, 0x5c, 0xc5, - 0x36, 0xfd, 0x4d, 0xdf, 0x2b, 0xf3, 0xae, 0x7f, 0xac, 0x90, 0x97, 0x2b, - 0xa0, 0xa7, 0x43, 0xc0, 0x3a, 0x30, 0x91, 0x7f, 0x0a, 0x69, 0x0e, 0x59, - 0x16, 0xd0, 0x64, 0xeb, 0x2c, 0x23, 0xd4, 0x49, 0x76, 0x06, 0xef, 0x05, - 0xb0, 0xb6, 0x7b, 0x51, 0x76, 0xab, 0x32, 0x0a, 0x23, 0x13, 0xaa, 0x89, - 0xd9, 0x39, 0x63, 0xe1, 0xae, 0x7d, 0x66, 0xd3, 0xd0, 0xe9, 0x93, 0xe4, - 0x36, 0x83, 0x65, 0x6b, 0xce, 0x71, 0x06, 0x53, 0x73, 0x0e, 0x55, 0xd9, - 0xb2, 0x10, 0x3f, 0x64, 0xf9, 0xb9, 0x0a, 0x89, 0xae, 0x0a, 0x4e, 0x95, - 0xde, 0x49, 0xf1, 0xf5, 0xf2, 0xea, 0x73, 0x76, 0x3e, 0x47, 0xdf, 0x97, - 0xa4, 0x56, 0x7a, 0xa2, 0x53, 0xe7, 0x31, 0x7a, 0x6b, 0x8a, 0x0f, 0x30, - 0x88, 0xf8, 0x92, 0x6b, 0x29, 0x0c, 0xc5, 0x79, 0x6e, 0x0a, 0x05, 0xd5, - 0x53, 0xf1, 0x36, 0x93, 0xe2, 0xd7, 0xfd, 0xb8, 0x56, 0x6a, 0xd9, 0xc4, - 0x24, 0x51, 0xee, 0xea, 0xdb, 0xb0, 0x35, 0x7b, 0xaf, 0xdd, 0x49, 0xa0, - 0x47, 0x79, 0xb5, 0x8d, 0x2a, 0x91, 0x1c, 0xdb, 0x82, 0xdb, 0x87, 0x54, - 0x0a, 0x94, 0x8c, 0x9f, 0x96, 0xdf, 0x31, 0x30, 0x26, 0x8c, 0xe2, 0x50, - 0x76, 0x7a, 0x48, 0x12, 0xb9, 0x82, 0x79, 0xdd, 0x6e, 0xec, 0xda, 0xc1, - 0x86, 0xf3, 0x37, 0x8f, 0x54, 0x83, 0xb8, 0x1e, 0x26, 0x8e, 0x4b, 0x6c, - 0xef, 0x3e, 0xff, 0x5e, 0x78, 0x8d, 0x14, 0x8b, 0xee, 0x63, 0x8b, 0x89, - 0x72, 0xd6, 0xb7, 0x1d, 0x9d, 0x7f, 0xe5, 0xd4, 0xb6, 0x6e, 0x5c, 0xb1, - 0xd4, 0x72, 0x91, 0xbd, 0x98, 0x66, 0x28, 0xb2, 0x9f, 0xc6, 0xeb, 0x65, - 0xc4, 0x89, 0x29, 0x72, 0xd4, 0xf2, 0x16, 0x9b, 0x96, 0xc5, 0x18, 0x33, - 0xdf, 0x4a, 0x98, 0xfb, 0xff, 0x64, 0x1f, 0xbd, 0x3a, 0x98, 0xec, 0x58, - 0xc8, 0xec, 0xc5, 0xf5, 0x78, 0xfb, 0xa2, 0xf2, 0xa8, 0xda, 0xd7, 0x40, - 0x12, 0xec, 0xf0, 0xdc, 0x6b, 0xe1, 0x1c, 0x9f, 0xaa, 0x2b, 0x0d, 0xe3, - 0x0c, 0xe9, 0xcd, 0x54, 0x20, 0x0c, 0x69, 0xe1, 0x8f, 0x5c, 0x13, 0x6b, - 0x85, 0xf2, 0x87, 0x82, 0xeb, 0x46, 0x0f, 0x37, 0xfe, 0xb5, 0x01, 0x5a, - 0x56, 0x74, 0xa6, 0xc0, 0xdb, 0xf6, 0x15, 0x79, 0xae, 0xb3, 0x8f, 0xd6, - 0xc8, 0xb9, 0x30, 0x7a, 0x9c, 0xef, 0xc7, 0x5f, 0x8c, 0x7d, 0xb9, 0xdf, - 0x72, 0x66, 0xef, 0xf2, 0x58, 0xaf, 0x32, 0xd6, 0x7b, 0xc4, 0xab, 0xbe, - 0x03, 0x1e, 0xba, 0x0b, 0x5c, 0x46, 0xc4, 0x99, 0x9d, 0xfc, 0xc4, 0xd9, - 0x7c, 0xc3, 0x85, 0x84, 0x27, 0xad, 0x06, 0x6b, 0xc7, 0x25, 0xc5, 0xe7, - 0x58, 0x4f, 0x81, 0x66, 0x66, 0xa4, 0x05, 0xe0, 0xa2, 0x8b, 0x09, 0x18, - 0x7d, 0x11, 0x94, 0x2e, 0x37, 0xe8, 0xd2, 0x7f, 0x7f, 0xdc, 0x0c, 0xaf, - 0x35, 0xc7, 0x6d, 0xf9, 0xc6, 0x66, 0xf8, 0x11, 0x34, 0xb7, 0x7c, 0x2f, - 0xd4, 0x80, 0x14, 0x21, 0xc8, 0x13, 0x67, 0x29, 0x64, 0xd9, 0x5d, 0x70, - 0x27, 0x12, 0x4f, 0xfb, 0x55, 0xa8, 0xf8, 0x2e, 0x04, 0xd9, 0x70, 0x43, - 0x36, 0x8f, 0xe8, 0x33, 0xa2, 0xbb, 0x1a, 0xb2, 0x5d, 0xfb, 0x25, 0x00, - 0x36, 0xf2, 0x47, 0x26, 0x24, 0x01, 0xc0, 0x0a, 0xd4, 0x54, 0x84, 0x84, - 0xc8, 0xfb, 0x68, 0x54, 0x1c, 0xb1, 0xa4, 0x58, 0x9b, 0x10, 0xd5, 0xea, - 0xdc, 0x47, 0x5d, 0xc2, 0xa8, 0x31, 0xf5, 0x0d, 0x15, 0xcd, 0x10, 0x13, - 0x5a, 0xad, 0x50, 0x7b, 0x26, 0xea, 0x4e, 0x95, 0xa2, 0xd5, 0x1f, 0x5c, - 0x6f, 0x05, 0x18, 0x8f, 0xf4, 0xb9, 0x7c, 0x73, 0xd9, 0xa5, 0x44, 0xfb, - 0x0e, 0x01, 0xb5, 0x9e, 0xa2, 0xc8, 0xe3, 0x0a, 0x00, 0xda, 0x10, 0xd5, - 0xaf, 0x61, 0x6e, 0xbe, 0xf0, 0x19, 0xdb, 0x4b, 0x04, 0x2a, 0x61, 0xc9, - 0x01, 0x80, 0x45, 0x7d, 0xe9, 0x24, 0x4d, 0x35, 0x8c, 0x78, 0xcf, 0xbc, - 0x6e, 0x29, 0x8e, 0xf1, 0xe1, 0x62, 0x50, 0x33, 0xfc, 0x40, 0x1e, 0xc7, - 0xef, 0x8f, 0x58, 0xc2, 0x29, 0xbd, 0x2b, 0x3e, 0x3e, 0x51, 0x78, 0xb5, - 0xf4, 0x17, 0x45, 0xd3, 0xd4, 0xd0, 0x73, 0x4d, 0xc0, 0x89, 0xf6, 0x26, - 0xf5, 0x4d, 0x9d, 0x71, 0x62, 0x64, 0x77, 0xec, 0x1c, 0x82, 0x16, 0x64, - 0x8c, 0x04, 0x1a, 0x38, 0xc5, 0xb7, 0x33, 0x1b, 0x4d, 0x65, 0x3b, 0x28, - 0x12, 0xb5, 0xfe, 0x6a, 0xa6, 0xae, 0x28, 0xe7, 0xc8, 0xa6, 0x8c, 0xcf, - 0x13, 0x79, 0x71, 0x69, 0xff, 0xc5, 0xeb, 0xd1, 0xf1, 0xaf, 0xf9, 0xb3, - 0xca, 0x52, 0xe9, 0xf5, 0xf1, 0x23, 0x0a, 0x04, 0x2a, 0x7f, 0x89, 0x15, - 0x59, 0x0a, 0x47, 0x68, 0x0f, 0x83, 0x7c, 0xff, 0x66, 0xe1, 0x54, 0x0b, - 0xb9, 0x54, 0x67, 0x66, 0x8e, 0x44, 0x1d, 0xbf, 0x54, 0x08, 0xc8, 0xcc, - 0xd2, 0xb2, 0x73, 0x1e, 0xb8, 0x44, 0x9e, 0xad, 0xd6, 0xe0, 0x32, 0x1c, - 0x12, 0x72, 0x5f, 0x1b, 0x7b, 0xdc, 0x91, 0x60, 0x37, 0x9d, 0xa9, 0xe9, - 0x3f, 0x5e, 0xde, 0x65, 0xde, 0xc6, 0x80, 0x93, 0x3d, 0x7b, 0xdd, 0x43, - 0xf2, 0x99, 0xbf, 0x7e, 0xff, 0xed, 0x05, 0x9a, 0xa1, 0x20, 0x28, 0x9a, - 0x31, 0x5a, 0xff, 0x40, 0x4b, 0xc9, 0x6d, 0xa6, 0x03, 0xab, 0xbc, 0x63, - 0x98, 0x6c, 0x93, 0xe1, 0xf7, 0xed, 0x2e, 0x9d, 0x30, 0x55, 0xab, 0x08, - 0x84, 0x77, 0x11, 0x72, 0xee, 0x85, 0xaf, 0xdf, 0xf2, 0x5c, 0x5d, 0x59, - 0x9f, 0xa1, 0x54, 0x1b, 0x38, 0xf9, 0x51, 0xbd, 0x7a, 0x91, 0x95, 0x68, - 0xc6, 0xec, 0x8a, 0x07, 0x8f, 0x73, 0xf2, 0xbd, 0x42, 0x7e, 0xe3, 0x69, - 0x2d, 0x30, 0x23, 0xe7, 0x7b, 0x50, 0x8e, 0xa7, 0x92, 0xdc, 0x06, 0xa8, - 0xdd, 0xe7, 0x9e, 0xf8, 0x7f, 0xf6, 0x8b, 0xb4, 0x06, 0x4f, 0x28, 0x6b, - 0xd5, 0x4d, 0x32, 0x69, 0x9e, 0x34, 0x8b, 0x3a, 0x05, 0x06, 0x87, 0x40, - 0x7b, 0x79, 0x0a, 0xb6, 0x30, 0x4c, 0x43, 0xc5, 0x13, 0xcf, 0x29, 0xd1, - 0x1c, 0xbb, 0x93, 0xa4, 0xec, 0xe5, 0x3b, 0xe4, 0x01, 0x59, 0x50, 0x24, - 0x6e, 0xc5, 0x13, 0xd1, 0x60, 0x22, 0x88, 0x0a, 0x51, 0xc0, 0xae, 0x97, - 0x9b, 0x14, 0xdf, 0x0a, 0x3a, 0x0c, 0xbf, 0xef, 0x98, 0xd4, 0xee, 0x86, - 0xf6, 0xc9, 0xe0, 0xd8, 0xd7, 0xd0, 0x70, 0x61, 0x11, 0x30, 0xc7, 0xdd, - 0x5f, 0xf6, 0x97, 0x26, 0x9d, 0xcf, 0x1e, 0x23, 0x1d, 0x58, 0xe4, 0xa3, - 0x5a, 0x41, 0x5e, 0x85, 0x08, 0x26, 0x45, 0x6b, 0x8b, 0x4c, 0xba, 0x46, - 0xee, 0x53, 0xba, 0x72, 0x55, 0xa5, 0x29, 0x04, 0x94, 0x05, 0xb7, 0x4e, - 0xe1, 0x04, 0xd0, 0xa2, 0x4d, 0x92, 0xb3, 0x72, 0x96, 0x14, 0x2b, 0x63, - 0xef, 0xdd, 0x9c, 0xc2, 0x16, 0x36, 0xb3, 0x03, 0x09, 0x15, 0x15, 0x33, - 0xeb, 0x16, 0xb9, 0xdc, 0x75, 0x26, 0xfe, 0xf5, 0xd6, 0xe5, 0xa0, 0x02, - 0x58, 0x12, 0x85, 0x8d, 0x2c, 0xad, 0x7b, 0x84, 0x6b, 0xe7, 0xaa, 0x02, - 0x10, 0x21, 0x09, 0x55, 0xdb, 0xfb, 0x95, 0x66, 0x28, 0xa6, 0xc4, 0x8b, - 0x41, 0x60, 0x10, 0xce, 0xe0, 0xf3, 0x93, 0x2e, 0x62, 0xe6, 0xde, 0xf2, - 0xad, 0x61, 0x6e, 0xa7, 0x26, 0x4e, 0xbc, 0x0a, 0xe6, 0xd2, 0xee, 0x0e, - 0x94, 0x1b, 0x85, 0x8f, 0xa7, 0x1d, 0x28, 0x7a, 0xc9, 0x77, 0x43, 0x9b, - 0xfc, 0x9e, 0xb9, 0x79, 0x38, 0x5e, 0xf4, 0xd1, 0x53, 0xd7, 0xe1, 0xec, - 0xa3, 0x31, 0x3c, 0x3c, 0x15, 0x51, 0xb8, 0x79, 0xa0, 0xce, 0x8c, 0x9c, - 0x1d, 0xd9, 0x51, 0x3e, 0xe7, 0x73, 0x03, 0x2e, 0xc0, 0xe0, 0xbc, 0xc6, - 0xbc, 0x94, 0x58, 0x0b, 0xe4, 0x30, 0x4b, 0xfa, 0xfc, 0xe0, 0xee, 0x93, - 0x18, 0x8b, 0x47, 0x1e, 0xd2, 0x12, 0x46, 0x59, 0x02, 0xff, 0xb2, 0x29, - 0xd4, 0xa2, 0x8f, 0xda, 0xc1, 0x1b, 0xf5, 0x85, 0xf4, 0xfb, 0x7d, 0x23, - 0x8f, 0x44, 0x9e, 0x47, 0x9e, 0xae, 0xfa, 0x84, 0xe5, 0x4f, 0xc6, 0x35, - 0xbc, 0xce, 0x33, 0xbd, 0x46, 0x71, 0x2b, 0x88, 0xc9, 0xd4, 0xf7, 0x04, - 0x42, 0xcd, 0xeb, 0xdf, 0x9c, 0x6d, 0x7b, 0x89, 0x3c, 0x52, 0xfd, 0xfe, - 0x38, 0x5a, 0x07, 0x0f, 0x93, 0x98, 0x27, 0xfc, 0x32, 0x75, 0x9e, 0x4d, - 0x3c, 0x73, 0x42, 0x8d, 0x04, 0x40, 0x4b, 0x22, 0x05, 0x65, 0x79, 0x87, - 0xf7, 0x48, 0x65, 0x08, 0xd3, 0xd7, 0x9e, 0xfa, 0xfc, 0x0d, 0x44, 0x2d, - 0xf2, 0xc2, 0x60, 0x13, 0x62, 0xee, 0x17, 0x15, 0x61, 0xae, 0x62, 0xca, - 0xab, 0x66, 0x31, 0xd8, 0xb5, 0xad, 0x36, 0x21, 0x56, 0xb6, 0x42, 0x77, - 0x4c, 0x83, 0xbe, 0xbd, 0x61, 0x8a, 0xbc, 0x3f, 0x45, 0xc0, 0x85, 0x63, - 0x85, 0x99, 0x45, 0x2c, 0x65, 0x13, 0x58, 0xcf, 0xc6, 0xe8, 0x52, 0x64, - 0x0d, 0xbb, 0xdc, 0xec, 0x6c, 0xba, 0x81, 0xf7, 0x5f, 0x24, 0x53, 0x70, - 0xed, 0x31, 0x46, 0x0f, 0xaf, 0x42, 0x03, 0x7e, 0x9e, 0xeb, 0xd6, 0x55, - 0xb0, 0xb7, 0xcf, 0x2f, 0xd2, 0xa7, 0x80, 0xc6, 0xdb, 0xf9, 0x34, 0x9a, - 0xee, 0xf6, 0x13, 0x28, 0xa5, 0x7e, 0xed, 0xb9, 0x95, 0x3d, 0x33, 0xce, - 0x87, 0xba, 0x45, 0xb9, 0x52, 0x7f, 0xc1, 0xe4, 0xd0, 0xd9, 0xc8, 0xcf, - 0xaf, 0x75, 0x8f, 0x9d, 0xf6, 0xa2, 0x81, 0x28, 0x43, 0x29, 0x6c, 0xd5, - 0x1a, 0x3a, 0x20, 0x6c, 0x6e, 0x61, 0x2f, 0x0c, 0x6f, 0xa9, 0x72, 0xc9, - 0x2f, 0xbc, 0x64, 0xb8, 0x08, 0xdb, 0x8a, 0xc5, 0xdd, 0xf6, 0x73, 0x25, - 0x45, 0x5d, 0xb9, 0x23, 0xbe, 0x2f, 0x62, 0xde, 0xa7, 0xe6, 0xb9, 0x78, - 0x31, 0xe1, 0xe0, 0x4c, 0xfe, 0x11, 0x13, 0x61, 0xb5, 0xfc, 0x61, 0x61, - 0xca, 0x30, 0xf5, 0xc9, 0x60, 0x86, 0x6d, 0x1f, 0xfb, 0x5e, 0xb0, 0x5a, - 0x98, 0x92, 0xd2, 0x4a, 0x95, 0xad, 0x9c, 0xca, 0xa3, 0xe1, 0x44, 0xa0, - 0xe3, 0x7a, 0xaf, 0xac, 0x22, 0x23, 0x8e, 0x03, 0x76, 0xe3, 0x60, 0x05, - 0xe8, 0x6b, 0x41, 0x00, 0xef, 0xed, 0x81, 0x9d, 0x0a, 0xb6, 0xd9, 0x14, - 0xd5, 0xfd, 0xcb, 0x9e, 0x14, 0x21, 0x44, 0x8d, 0xe2, 0xc8, 0xcd, 0x8d, - 0x2d, 0xb1, 0x7d, 0xb6, 0x3f, 0xeb, 0x40, 0x6d, 0x5f, 0x17, 0xc5, 0x5f, - 0x8a, 0x32, 0x4a, 0xc6, 0x17, 0x7d, 0x78, 0xb2, 0x50, 0x2f, 0xea, 0x34, - 0x71, 0xbf, 0x6d, 0xf1, 0xb7, 0xd3, 0x64, 0xde, 0xe4, 0xb0, 0x01, 0x87, - 0x63, 0x07, 0x5f, 0x55, 0x63, 0x39, 0x63, 0x9f, 0x65, 0xe0, 0x23, 0x27, - 0xc1, 0xac, 0x94, 0x47, 0x5b, 0x56, 0x49, 0x62, 0x8e, 0xf9, 0x46, 0x79, - 0x9d, 0xad, 0x43, 0xc0, 0x2c, 0x6b, 0xb0, 0xf6, 0x18, 0xa6, 0x15, 0x23, - 0xc6, 0x08, 0x41, 0xb4, 0xdd, 0xab, 0xdc, 0x7e, 0x8b, 0x62, 0xa4, 0xcd, - 0x5f, 0x3c, 0x88, 0x1d, 0x57, 0x9b, 0x0a, 0xbc, 0x1d, 0xd5, 0x89, 0xa7, - 0x05, 0x57, 0x34, 0xd4, 0x77, 0x61, 0x66, 0xc5, 0xb1, 0x08, 0x2b, 0x32, - 0x84, 0xd0, 0x2f, 0x16, 0x88, 0x43, 0x03, 0x55, 0x2d, 0xa2, 0x9b, 0xfa, - 0xe1, 0x4a, 0xf1, 0x0c, 0x86, 0x2d, 0xc7, 0x8c, 0x2b, 0x3a, 0x60, 0xe1, - 0x81, 0xd7, 0xac, 0xb4, 0x42, 0x86, 0xa1, 0x0d, 0x0d, 0x1b, 0x72, 0xce, - 0xe2, 0x52, 0x77, 0xfc, 0xb1, 0x18, 0xf9, 0xe9, 0xc6, 0x6b, 0x19, 0xdb, - 0x14, 0x11, 0x73, 0xe5, 0x88, 0xf8, 0xd9, 0xc8, 0x66, 0xbb, 0xb5, 0xbd, - 0xa4, 0xef, 0xea, 0x6e, 0xfa, 0x36, 0x56, 0xed, 0x9e, 0xcb, 0x63, 0x4b, - 0x1a, 0x32, 0x5a, 0xde, 0x7a, 0xe0, 0xf7, 0xe1, 0x0c, 0x3b, 0xe7, 0x1a, - 0x82, 0x14, 0xc3, 0xa8, 0x2e, 0xf3, 0x77, 0xae, 0x66, 0xae, 0x70, 0x11, - 0xb7, 0xc4, 0xc2, 0x6a, 0x6a, 0x93, 0xae, 0xba, 0xc5, 0x64, 0x84, 0xd9, - 0x49, 0xa8, 0x13, 0xcc, 0x77, 0xc7, 0x0c, 0xed, 0x7e, 0xe1, 0xc2, 0x3e, - 0xe0, 0x72, 0x22, 0x64, 0x82, 0x98, 0xc8, 0x50, 0x60, 0xf4, 0xe5, 0x82, - 0xa7, 0x77, 0x35, 0xcd, 0xff, 0xae, 0x7e, 0xe7, 0x72, 0xa3, 0xad, 0x17, - 0xa1, 0x73, 0x53, 0x50, 0x1d, 0x66, 0x2c, 0x89, 0x68, 0x48, 0x36, 0xa3, - 0xc6, 0x8d, 0xa8, 0x4b, 0x95, 0x8f, 0x76, 0x0a, 0x4a, 0x9f, 0xf8, 0x0a, - 0x20, 0x28, 0xc4, 0x4e, 0x65, 0xe2, 0xf8, 0x83, 0x38, 0xcf, 0xd1, 0xda, - 0xad, 0xb8, 0x8a, 0x55, 0x60, 0x7f, 0xaa, 0xd6, 0x69, 0xef, 0xe1, 0xf2, - 0x7f, 0x3f, 0xe0, 0x3c, 0xfd, 0x00, 0xaa, 0x43, 0xef, 0xfa, 0x6b, 0x7f, - 0x21, 0xc8, 0x11, 0x0b, 0x30, 0x68, 0x9d, 0x22, 0x40, 0x19, 0x81, 0xfe, - 0xbc, 0x79, 0x18, 0x7d, 0x3b, 0x99, 0x06, 0x7d, 0xf8, 0x77, 0xf8, 0x1f, - 0x67, 0x75, 0x28, 0xdf, 0x79, 0x62, 0xf2, 0xe7, 0xed, 0x2d, 0x1e, 0xc9, - 0x2a, 0x0d, 0xb1, 0xa2, 0xc2, 0x67, 0x88, 0xb5, 0x9e, 0x4d, 0x43, 0x72, - 0xae, 0x62, 0x75, 0x9c, 0xb3, 0xe4, 0x9d, 0x14, 0x98, 0x1c, 0x80, 0x11, - 0xc5, 0x01, 0x03, 0x66, 0x90, 0xd1, 0xaa, 0xc5, 0x15, 0x29, 0xd6, 0x57, - 0x23, 0xca, 0x04, 0xd4, 0x43, 0x8f, 0x6d, 0xf0, 0x74, 0x45, 0xc7, 0x1a, - 0x88, 0x2d, 0xe9, 0xf4, 0x38, 0x16, 0x71, 0xa6, 0x70, 0x79, 0x78, 0x54, - 0xb9, 0xdb, 0x51, 0x9b, 0x8d, 0xa7, 0x9b, 0x04, 0xd1, 0x2e, 0x88, 0x8f, - 0x6b, 0xf3, 0xcf, 0xe4, 0x39, 0x60, 0xac, 0x6a, 0x7a, 0x4f, 0x69, 0x17, - 0x3a, 0x95, 0x06, 0x69, 0x7c, 0xa1, 0x75, 0xf8, 0x2a, 0x4f, 0xc0, 0x66, - 0x25, 0x5f, 0x7b, 0x92, 0x34, 0xcd, 0x04, 0x71, 0x68, 0x3c, 0x6d, 0x65, - 0x83, 0x71, 0x7d, 0x66, 0x99, 0x31, 0xf7, 0xde, 0xcd, 0x12, 0xd7, 0xed, - 0xbd, 0x2f, 0x65, 0x4a, 0x4e, 0xf1, 0x9a, 0x8c, 0x9d, 0x0f, 0xe8, 0xf7, - 0x25, 0x2f, 0xd0, 0xf5, 0x59, 0xef, 0x20, 0xfa, 0x9f, 0xeb, 0x68, 0xff, - 0x48, 0xc6, 0xad, 0x5c, 0x53, 0x9f, 0x5e, 0xc3, 0x5c, 0xe8, 0xdb, 0x79, - 0x85, 0x4b, 0x99, 0x87, 0x42, 0xa5, 0xec, 0x2a, 0xf9, 0x9c, 0x91, 0x27, - 0x0f, 0x4c, 0x18, 0x40, 0x70, 0x01, 0x72, 0x84, 0xd8, 0xe3, 0x20, 0x0d, - 0x74, 0xb3, 0x69, 0x4b, 0x45, 0x0b, 0x88, 0x3a, 0x53, 0x97, 0x3b, 0x47, - 0x1c, 0xc4, 0xb7, 0x70, 0xad, 0xab, 0x9a, 0xfc, 0x51, 0xe3, 0x4b, 0x50, - 0x43, 0x7f, 0x2b, 0x74, 0xe8, 0xce, 0x85, 0xe4, 0xe6, 0xe7, 0xa1, 0x57, - 0x13, 0x57, 0xf9, 0x76, 0x11, 0x75, 0x52, 0xd7, 0x00, 0xc0, 0x11, 0x1d, - 0x3e, 0x09, 0xb9, 0x20, 0x44, 0x42, 0xf3, 0x9b, 0x2a, 0xfb, 0x5d, 0x94, - 0xa6, 0xaa, 0x06, 0x8f, 0x8f, 0x6f, 0x45, 0xe0, 0xd4, 0x92, 0xd8, 0x76, - 0x74, 0x0b, 0x22, 0x6f, 0xab, 0x6d, 0x68, 0x13, 0x65, 0xe3, 0x6b, 0x04, - 0xe1, 0xe6, 0xc6, 0x29, 0x1c, 0x38, 0x75, 0x3e, 0xdd, 0x17, 0x9d, 0x6e, - 0x5b, 0x17, 0xaf, 0x48, 0x31, 0x0a, 0x8d, 0xe3, 0x89, 0xe3, 0xf4, 0x19, - 0xde, 0x49, 0xde, 0xd0, 0x46, 0x48, 0xdb, 0x4d, 0x15, 0x36, 0xb9, 0xaf, - 0xa4, 0xe2, 0xa0, 0x26, 0xe2, 0x69, 0x43, 0x7a, 0x22, 0x5d, 0x0f, 0x0d, - 0xa4, 0x57, 0x67, 0x79, 0xea, 0x0a, 0x7f, 0x48, 0xfe, 0x7c, 0xe4, 0xc4, - 0x9d, 0x74, 0xd7, 0xfb, 0x8c, 0x41, 0xc4, 0x6d, 0x96, 0x4c, 0xcb, 0x6e, - 0xf4, 0x18, 0x16, 0x59, 0x62, 0x36, 0x2f, 0x68, 0xd5, 0xb4, 0xbb, 0x71, - 0xa4, 0x6b, 0xd5, 0x7b, 0x45, 0xcb, 0x06, 0x80, 0x99, 0xaf, 0x06, 0x09, - 0x97, 0xab, 0xf5, 0xb7, 0x02, 0x01, 0x81, 0x65, 0x7d, 0xae, 0x09, 0x69, - 0xcb, 0x31, 0x6c, 0x9d, 0x9e, 0x9a, 0x85, 0xc5, 0x3e, 0x21, 0xf3, 0xc3, - 0x73, 0x82, 0x26, 0x5f, 0x58, 0x73, 0x3b, 0xf6, 0xce, 0xf6, 0x83, 0xe1, - 0x30, 0x59, 0xea, 0xc3, 0xfc, 0x9c, 0xa8, 0x28, 0xa4, 0xf5, 0x2f, 0xb1, - 0xcf, 0xaa, 0xa6, 0xb8, 0x6b, 0xcc, 0x10, 0xa0, 0x87, 0x1a, 0xa9, 0x5b, - 0xcc, 0xe4, 0x40, 0xd5, 0x50, 0x12, 0x35, 0x8a, 0x31, 0xf5, 0xd0, 0x5b, - 0x0d, 0x85, 0xd2, 0x59, 0x5f, 0x1b, 0x15, 0x4a, 0x1c, 0x01, 0x3d, 0x03, - 0x40, 0x32, 0xa3, 0xe9, 0x50, 0x96, 0x1a, 0xc6, 0xd6, 0x65, 0x3b, 0x26, - 0xb4, 0x8d, 0x5a, 0xc4, 0x0d, 0xc2, 0x95, 0xa0, 0x67, 0x97, 0xe9, 0x07, - 0x6c, 0x7e, 0x85, 0x6a, 0xc9, 0x38, 0xf3, 0x25, 0xca, 0xd6, 0x8a, 0x49, - 0x16, 0xa5, 0x43, 0x5c, 0x6e, 0xc9, 0xfa, 0x1e, 0x0c, 0x79, 0x3e, 0x2d, - 0x12, 0x37, 0xa9, 0x1c, 0x5b, 0xe5, 0x3e, 0x6e, 0x67, 0x69, 0xcd, 0xac, - 0x59, 0xec, 0x5c, 0x1e, 0x1a, 0xd1, 0x99, 0x7e, 0x68, 0x53, 0xa5, 0xda, - 0x0e, 0xb1, 0x94, 0x04, 0xc2, 0xd6, 0x2f, 0xb0, 0x33, 0x8e, 0xbc, 0x50, - 0x6a, 0x4c, 0x46, 0x76, 0x03, 0x05, 0x3d, 0x21, 0x9d, 0x1a, 0xbd, 0x61, - 0x36, 0x6d, 0xe6, 0x79, 0x00, 0x98, 0xe9, 0xde, 0x33, 0x50, 0xc5, 0x70, - 0xc9, 0x52, 0xc8, 0xf9, 0x21, 0xe7, 0x60, 0xbf, 0x63, 0x0f, 0x9f, 0x31, - 0x5b, 0xdb, 0xb8, 0xe7, 0x31, 0x4c, 0xbe, 0x33, 0x98, 0x50, 0xa9, 0x0a, - 0x91, 0x6c, 0x37, 0xdf, 0xda, 0xa4, 0x51, 0x02, 0x1c, 0x0c, 0x7c, 0x64, - 0x65, 0x90, 0xdf, 0x91, 0x92, 0xd2, 0xee, 0xb0, 0x28, 0x90, 0x3b, 0x3b, - 0x17, 0x75, 0x2d, 0xbc, 0x5b, 0x38, 0x9d, 0x7a, 0x79, 0x86, 0x73, 0x78, - 0x30, 0xbd, 0x23, 0xa3, 0x68, 0xc8, 0x92, 0x60, 0x59, 0xf6, 0x9d, 0xfb, - 0x4c, 0xee, 0x93, 0x15, 0xad, 0x17, 0x27, 0xd7, 0xe4, 0x61, 0xcf, 0xd5, - 0xad, 0xac, 0x3c, 0xc5, 0x38, 0x10, 0x36, 0xeb, 0xb2, 0x4f, 0x01, 0x89, - 0x84, 0xfb, 0x03, 0x2c, 0xf0, 0xeb, 0x09, 0x0b, 0x48, 0xf0, 0x1e, 0x30, - 0x22, 0xcd, 0x40, 0xa9, 0xb9, 0x27, 0x99, 0xc6, 0xc7, 0x7e, 0x69, 0xdd, - 0x58, 0xdb, 0x82, 0x94, 0x26, 0xe8, 0x08, 0x32, 0xc6, 0xe8, 0x6f, 0xbf, - 0xe6, 0x68, 0xb6, 0xdc, 0x20, 0xc8, 0x8f, 0x7d, 0xd5, 0x16, 0xcf, 0x72, - 0x23, 0xd8, 0x81, 0x18, 0x30, 0x31, 0x91, 0xbc, 0xd9, 0xbd, 0xdf, 0x62, - 0xfd, 0x91, 0x14, 0xe4, 0xcc, 0x18, 0xf2, 0x5e, 0x1a, 0xb7, 0x40, 0x76, - 0xed, 0x43, 0x4d, 0xb5, 0x3f, 0xf2, 0xb9, 0x8d, 0x3d, 0xe7, 0x6f, 0x97, - 0x21, 0x4d, 0xec, 0xc0, 0x60, 0x6f, 0x6b, 0x62, 0xc9, 0xed, 0xc4, 0x51, - 0xd7, 0x93, 0xda, 0x35, 0x25, 0x64, 0x3b, 0xd8, 0x25, 0x51, 0xfd, 0x0f, - 0x72, 0x53, 0x09, 0xad, 0x71, 0x7a, 0xf0, 0x5e, 0xdf, 0x3c, 0x1b, 0x57, - 0x77, 0xc1, 0x94, 0x4c, 0xbf, 0xb7, 0x62, 0x77, 0x00, 0x94, 0xf7, 0x00, - 0x64, 0x91, 0xc1, 0x3c, 0xe2, 0x59, 0xe9, 0x08, 0x82, 0xa7, 0x3b, 0x2e, - 0x5f, 0xc0, 0x1b, 0xdf, 0x89, 0xfb, 0xe3, 0x9f, 0x56, 0xc8, 0x65, 0x91, - 0xd8, 0x79, 0xbb, 0x25, 0xcc, 0xd4, 0xc7, 0x2f, 0x1c, 0x25, 0xba, 0x0a, - 0xde, 0x75, 0x1b, 0x05, 0xd5, 0x50, 0xc4, 0x3d, 0xb4, 0x02, 0x6b, 0x5a, - 0x8a, 0x37, 0xee, 0xfb, 0xf0, 0x72, 0x07, 0x5e, 0x5f, 0x2a, 0xd5, 0xb8, - 0xcd, 0xef, 0x36, 0x47, 0x33, 0x58, 0xf6, 0x43, 0xf8, 0xe0, 0xf2, 0x81, - 0x3a, 0xf2, 0x56, 0x69, 0x01, 0xb4, 0xdf, 0x45, 0x8c, 0x42, 0xf8, 0xd2, - 0xd9, 0x47, 0x3b, 0xd1, 0xe8, 0xcf, 0x6e, 0x49, 0xf1, 0x29, 0x23, 0x8c, - 0x78, 0x76, 0x99, 0x19, 0xb9, 0x5f, 0x59, 0x97, 0xce, 0x7b, 0x74, 0x51, - 0xb6, 0x67, 0x89, 0x72, 0x4c, 0xf3, 0x76, 0x00, 0x8e, 0x5b, 0xc0, 0x28, - 0xdd, 0x41, 0xbc, 0x49, 0x04, 0x5c, 0x56, 0xac, 0x93, 0x66, 0x3c, 0x54, - 0x3d, 0xf3, 0x3d, 0xe3, 0x74, 0xa3, 0x7b, 0xbc, 0xc6, 0x1d, 0x53, 0xc9, - 0xcd, 0x45, 0x80, 0x0f, 0xb3, 0x25, 0xdf, 0xaa, 0x22, 0x5e, 0x7d, 0x57, - 0x9f, 0x3d, 0x35, 0x11, 0x91, 0xc9, 0x6c, 0xee, 0x64, 0x92, 0x2f, 0xe6, - 0xdc, 0x6f, 0x9d, 0x78, 0x04, 0xd5, 0xf2, 0xe6, 0x18, 0x90, 0xbb, 0x6d, - 0xaa, 0x54, 0xc4, 0x74, 0x5d, 0xc8, 0x8b, 0x21, 0xb2, 0x03, 0x9a, 0x52, - 0x79, 0x9d, 0x1a, 0x0b, 0x5a, 0x94, 0x76, 0x6c, 0x1d, 0xd2, 0x70, 0xc7, - 0xd4, 0x03, 0x05, 0x7c, 0x06, 0x8d, 0xa4, 0x41, 0xea, 0xa2, 0x8b, 0x5c, - 0xe5, 0x45, 0x9b, 0x33, 0x9a, 0x07, 0x3f, 0x61, 0x67, 0xba, 0x41, 0x64, - 0x36, 0x20, 0xc8, 0x7e, 0xea, 0xb5, 0x44, 0xed, 0xe6, 0xfe, 0xa9, 0xf4, - 0x04, 0x07, 0xc0, 0xd9, 0x29, 0x7c, 0x77, 0x3a, 0x60, 0x41, 0xce, 0x20, - 0x60, 0xfe, 0x3c, 0x29, 0xc1, 0xa2, 0x0c, 0x25, 0xb2, 0x37, 0x69, 0xd0, - 0x2e, 0x52, 0xc0, 0xdf, 0x6b, 0x7e, 0xfc, 0x0e, 0x3a, 0xcb, 0x48, 0x9d, - 0x88, 0x43, 0x50, 0x31, 0x50, 0x53, 0x8d, 0x05, 0xa6, 0xd5, 0xf5, 0x0a, - 0x2f, 0x97, 0x65, 0xe8, 0xb2, 0x5c, 0x52, 0xd2, 0x1a, 0x8e, 0xa9, 0xb4, - 0xae, 0x75, 0x3b, 0xbd, 0x47, 0x3b, 0x1c, 0x5d, 0x38, 0x5d, 0xe8, 0xf5, - 0x66, 0x29, 0xae, 0xd8, 0xda, 0xd9, 0xce, 0x47, 0x54, 0x8e, 0xbc, 0x93, - 0xc4, 0xc0, 0xef, 0x12, 0xbc, 0xc0, 0x3a, 0xbd, 0x2d, 0xf1, 0x7e, 0x98, - 0xf5, 0x6a, 0xe7, 0xc9, 0xad, 0xaa, 0xe7, 0xc9, 0x36, 0x81, 0x33, 0x6e, - 0x24, 0x46, 0xe8, 0xb2, 0x4a, 0x3b, 0x51, 0xb3, 0xfa, 0xd4, 0x2b, 0x1a, - 0x07, 0x6f, 0xfb, 0xe9, 0x2a, 0xc4, 0x15, 0x89, 0x76, 0x35, 0x70, 0xf9, - 0x4e, 0xf3, 0x2f, 0xea, 0x11, 0x8c, 0x94, 0xb6, 0x00, 0x36, 0x2d, 0xba, - 0x72, 0xcc, 0xf5, 0xb4, 0xa5, 0x64, 0xd1, 0xfc, 0x85, 0x2d, 0xce, 0x99, - 0xb3, 0x0f, 0x93, 0x4b, 0xd6, 0xd3, 0xb4, 0xaa, 0xdf, 0xec, 0x2d, 0x13, - 0xeb, 0x80, 0x1e, 0x2f, 0xdf, 0x01, 0x38, 0x6f, 0xa6, 0x06, 0xd7, 0xfd, - 0x61, 0x65, 0xf7, 0x00, 0x93, 0xa7, 0x88, 0x22, 0x8f, 0x3d, 0x1a, 0xdc, - 0x45, 0x5b, 0xea, 0x99, 0x43, 0xd2, 0xda, 0xa0, 0x4c, 0x56, 0xa5, 0xa5, - 0x2b, 0x80, 0xd8, 0x15, 0xbe, 0x0d, 0x1e, 0x19, 0xbe, 0xda, 0x84, 0x7f, - 0xf5, 0x82, 0x87, 0xa1, 0x1c, 0xfe, 0xdc, 0xe7, 0xd1, 0x4f, 0xe7, 0x75, - 0x34, 0x26, 0xe8, 0xdb, 0x6d, 0x5f, 0x1f, 0xea, 0x43, 0x5b, 0x40, 0x35, - 0xd3, 0xb6, 0x89, 0x6e, 0xa8, 0x32, 0x13, 0x66, 0xe4, 0xd4, 0x4a, 0x54, - 0xc6, 0xda, 0x20, 0x4f, 0x6f, 0x94, 0xb3, 0x76, 0xb9, 0x08, 0x16, 0x39, - 0xbb, 0xf8, 0x29, 0x8f, 0xd9, 0x89, 0x3e, 0xa0, 0x50, 0x54, 0x7c, 0x0d, - 0x93, 0x38, 0x18, 0xc7, 0x48, 0x17, 0x2b, 0x03, 0x66, 0x5a, 0x45, 0x3e, - 0x1a, 0xc6, 0xa6, 0xd3, 0x2a, 0xb2, 0xe8, 0x2f, 0xa4, 0xfa, 0xc2, 0x6d, - 0xfd, 0xcd, 0xa9, 0x71, 0xb4, 0x46, 0x85, 0x41, 0xce, 0x10, 0x23, 0xe1, - 0xb9, 0x11, 0xe9, 0xba, 0x85, 0xd4, 0x17, 0xd1, 0x80, 0x5c, 0xbc, 0x7b, - 0x41, 0x21, 0xf2, 0x65, 0x77, 0xb6, 0x06, 0x69, 0x9e, 0x7a, 0x35, 0xf8, - 0xfd, 0x00, 0x4d, 0x0a, 0x27, 0x91, 0x35, 0x16, 0xce, 0xdd, 0xe4, 0xd2, - 0xd3, 0x83, 0xb9, 0x94, 0x60, 0xd1, 0xb9, 0x3a, 0xdd, 0xd0, 0x47, 0x2f, - 0x0a, 0xea, 0x12, 0x33, 0x8f, 0xae, 0x44, 0xc9, 0x80, 0x5a, 0x05, 0x26, - 0x8b, 0xbd, 0xd0, 0x01, 0xe9, 0xbb, 0x3f, 0x6a, 0x80, 0x84, 0x96, 0x1d, - 0x9a, 0x7e, 0xec, 0x64, 0x70, 0x54, 0x5a, 0xe4, 0x7a, 0x91, 0x58, 0x21, - 0xd3, 0xe8, 0xce, 0xe0, 0x2a, 0x43, 0x1f, 0x1e, 0xde, 0xa5, 0xfc, 0xb5, - 0x50, 0x6d, 0xcf, 0x37, 0xec, 0x76, 0xd7, 0xca, 0x52, 0xd0, 0x52, 0x7d, - 0xe7, 0x81, 0x5c, 0xd4, 0xbf, 0x28, 0x7e, 0xa9, 0x02, 0x7f, 0xd8, 0xd1, - 0x60, 0x3e, 0xd1, 0xc1, 0x88, 0xe7, 0x9d, 0x55, 0xde, 0xd9, 0xba, 0xc0, - 0x72, 0x1e, 0xda, 0x22, 0xb0, 0xba, 0xb5, 0xe1, 0xac, 0x48, 0x32, 0xbc, - 0x55, 0xad, 0x66, 0xfb, 0xd2, 0x74, 0xd4, 0x06, 0xbc, 0xeb, 0x42, 0xe7, - 0x94, 0x46, 0x0f, 0xeb, 0xa7, 0xf0, 0xe0, 0xd6, 0xfc, 0x34, 0x82, 0x0d, - 0xd1, 0x8d, 0x4c, 0x70, 0x74, 0x84, 0xdb, 0x2a, 0xb5, 0x88, 0xe4, 0xaa, - 0x0e, 0xc0, 0xc3, 0xc7, 0xf6, 0xa9, 0xa0, 0xab, 0x29, 0xc0, 0x09, 0xe7, - 0x26, 0xad, 0x8b, 0x95, 0x23, 0x47, 0xf9, 0xe6, 0x1f, 0x4a, 0x06, 0x6f, - 0xee, 0x8b, 0xde, 0x79, 0x38, 0x23, 0x19, 0x0d, 0x37, 0xcb, 0xcb, 0xad, - 0x44, 0x7c, 0x53, 0x1d, 0x3e, 0x90, 0x65, 0xdc, 0x8e, 0x06, 0xf6, 0x68, - 0x1d, 0x71, 0x88, 0xa8, 0x5f, 0xbf, 0x0c, 0xd8, 0x6e, 0xc2, 0xe3, 0x52, - 0x5b, 0x2d, 0xe3, 0xec, 0x73, 0x7c, 0x4d, 0x59, 0x64, 0x90, 0xb3, 0x8c, - 0x37, 0x47, 0xf9, 0x53, 0x47, 0x54, 0xad, 0x0b, 0xf8, 0x73, 0xfa, 0x45, - 0x86, 0xf9, 0xd4, 0x1a, 0x57, 0x90, 0x5a, 0x6b, 0x4b, 0x59, 0x87, 0xfb, - 0x38, 0xc4, 0xbf, 0x87, 0xf2, 0x13, 0x13, 0x7c, 0x88, 0xdf, 0x92, 0xae, - 0x3a, 0x08, 0xd7, 0xb5, 0xa7, 0xd9, 0xab, 0x08, 0x34, 0xcf, 0xfd, 0x4b, - 0xbf, 0x92, 0x43, 0x8c, 0x4f, 0x4e, 0xca, 0x70, 0xfb, 0xf0, 0x1c, 0x71, - 0xa0, 0x06, 0xfd, 0xf1, 0xf4, 0x3d, 0xff, 0xc2, 0xc2, 0xfc, 0x5a, 0x23, - 0xe8, 0xc9, 0xde, 0xeb, 0xd2, 0xaa, 0x49, 0x80, 0xe1, 0x17, 0x27, 0x59, - 0x43, 0xa1, 0xbf, 0x62, 0xd3, 0xa0, 0x5e, 0x1c, 0x66, 0x7b, 0xa1, 0x99, - 0x15, 0x7a, 0x9a, 0xb3, 0xe9, 0x8b, 0xff, 0xbb, 0x22, 0x2e, 0x83, 0x03, - 0xe8, 0x8a, 0xa3, 0x94, 0x3e, 0x8f, 0x08, 0x16, 0xe5, 0x43, 0xa6, 0xb7, - 0xc5, 0xd0, 0x08, 0x12, 0x90, 0x46, 0xc9, 0x1b, 0x1b, 0x62, 0x41, 0xaf, - 0x69, 0xd9, 0x93, 0x74, 0x6e, 0x77, 0x94, 0x36, 0x84, 0xd6, 0x34, 0x0d, - 0xa0, 0x78, 0xb6, 0xdc, 0x65, 0x61, 0x5a, 0x58, 0x2a, 0x80, 0xba, 0x58, - 0xff, 0xa5, 0x77, 0x01, 0x50, 0xbb, 0x97, 0x0b, 0x70, 0xef, 0x21, 0x99, - 0x1c, 0xcb, 0xb6, 0x85, 0x75, 0x79, 0xb9, 0xfa, 0x3b, 0xe8, 0xd8, 0x51, - 0xe2, 0xaa, 0xb9, 0x84, 0x62, 0x0e, 0xae, 0xfb, 0xea, 0x34, 0xae, 0x80, - 0xfb, 0x09, 0x41, 0x83, 0x6d, 0x64, 0xa2, 0x38, 0x94, 0x00, 0x60, 0x86, - 0xa3, 0xe7, 0x32, 0xd6, 0xb0, 0x4a, 0xe3, 0x7f, 0xdd, 0x6f, 0x76, 0x98, - 0x86, 0xac, 0xec, 0xc1, 0xec, 0x4c, 0x75, 0xd1, 0x55, 0xd6, 0xc8, 0x18, - 0x1c, 0x31, 0x9f, 0xdf, 0x5b, 0x8e, 0xbb, 0xaa, 0xa6, 0x3e, 0xfc, 0x35, - 0xd1, 0x36, 0x17, 0xa1, 0x38, 0xd4, 0x1d, 0x7f, 0xd4, 0xf6, 0xff, 0x34, - 0x5d, 0xac, 0x5c, 0x87, 0x62, 0xd2, 0x53, 0x19, 0x74, 0xb2, 0x68, 0x84, - 0xe9, 0xc2, 0x88, 0x05, 0x32, 0x11, 0x42, 0x5e, 0x22, 0xaf, 0xdd, 0x81, - 0x80, 0x12, 0x05, 0xf8, 0x88, 0x91, 0x71, 0xd6, 0x6b, 0x85, 0x2b, 0xc2, - 0x5d, 0xfc, 0x16, 0x99, 0x41, 0xaf, 0x27, 0x7b, 0xdd, 0x11, 0x99, 0x3f, - 0x71, 0x95, 0x53, 0x5a, 0x28, 0x0f, 0x8e, 0xd4, 0x09, 0x6c, 0x64, 0x41, - 0x25, 0xd5, 0xac, 0x5c, 0xa4, 0x26, 0x63, 0x1c, 0x5d, 0x04, 0xe4, 0x5c, - 0x73, 0x88, 0x32, 0xd5, 0x02, 0x46, 0x9d, 0xa9, 0xde, 0xf3, 0x67, 0x26, - 0xb2, 0x94, 0xea, 0xce, 0x26, 0x49, 0xcc, 0x78, 0x02, 0x91, 0xb9, 0xcf, - 0x3e, 0xcc, 0xc5, 0xde, 0x76, 0x8c, 0x04, 0x48, 0x5e, 0x4b, 0x55, 0x11, - 0x7c, 0xb2, 0x54, 0xac, 0x71, 0xcf, 0x88, 0xb1, 0x91, 0x84, 0x37, 0xfb, - 0x9f, 0x68, 0xad, 0xf1, 0x65, 0xe9, 0x74, 0xd1, 0xb3, 0x1a, 0xb3, 0xd4, - 0x72, 0x23, 0xe6, 0x82, 0x3e, 0x08, 0x43, 0xb7, 0xa2, 0x29, 0x3f, 0x3c, - 0x06, 0xa0, 0x31, 0xda, 0xee, 0xdd, 0xcb, 0xed, 0x0c, 0xaa, 0x60, 0x7e, - 0x9b, 0xa1, 0x66, 0xf1, 0x0a, 0xcd, 0x5a, 0xc6, 0xa5, 0x24, 0xfb, 0xf4, - 0x88, 0x04, 0xb4, 0x0a, 0xac, 0x41, 0xdd, 0x85, 0xef, 0xe1, 0x9f, 0xc6, - 0x92, 0x14, 0xbc, 0x2f, 0x5e, 0x9b, 0x29, 0x3d, 0xd8, 0x90, 0x4f, 0xa5, - 0xc8, 0x75, 0x0f, 0xb1, 0xce, 0x50, 0x45, 0x4d, 0xcc, 0x23, 0xe5, 0xcd, - 0xef, 0x6c, 0x1b, 0x07, 0x51, 0x76, 0x00, 0x4d, 0xd4, 0xb1, 0xcb, 0x2b, - 0x5b, 0xd2, 0x47, 0xd6, 0x90, 0x13, 0xdb, 0x9c, 0x71, 0x68, 0x25, 0x90, - 0x40, 0x73, 0xfd, 0x6c, 0x19, 0x2f, 0xd2, 0xba, 0x4c, 0x67, 0x75, 0x3d, - 0x67, 0x48, 0xf4, 0xab, 0x1c, 0x9f, 0xc0, 0x91, 0xc5, 0xdf, 0x3b, 0x03, - 0xa4, 0x18, 0x2e, 0xb2, 0x75, 0x80, 0x06, 0xf8, 0xfe, 0x2d, 0xf2, 0x68, - 0x88, 0x7e, 0x6d, 0x03, 0x72, 0x81, 0x41, 0xe3, 0x9f, 0x95, 0xe3, 0xcf, - 0x69, 0x2a, 0x4f, 0x5f, 0x5a, 0x04, 0x9e, 0x22, 0x58, 0x71, 0x76, 0x87, - 0xa2, 0x63, 0x60, 0x9a, 0x85, 0x7f, 0x92, 0x55, 0x45, 0xf4, 0xeb, 0xf0, - 0x89, 0xe8, 0x8f, 0xf5, 0x2a, 0x15, 0x1b, 0x58, 0x30, 0x08, 0xc4, 0x24, - 0xb9, 0x13, 0x09, 0x0b, 0x32, 0x91, 0x9f, 0x81, 0xa5, 0x12, 0x3c, 0x42, - 0xaa, 0x48, 0x57, 0x7c, 0xf5, 0x74, 0x2d, 0x80, 0xc1, 0x0b, 0xe9, 0x92, - 0xb6, 0x85, 0x8c, 0xb8, 0x44, 0x12, 0xf0, 0xe4, 0x76, 0x82, 0xe8, 0x41, - 0x5e, 0x2c, 0xf6, 0x77, 0x0d, 0xc8, 0x5f, 0x9b, 0x4a, 0x7f, 0xa5, 0xfd, - 0x2e, 0xf1, 0x57, 0x39, 0xbe, 0xd1, 0xae, 0x03, 0x27, 0xa4, 0x86, 0xb9, - 0x23, 0xe1, 0xa6, 0xaa, 0x69, 0x42, 0x06, 0x5a, 0x96, 0x50, 0x22, 0x2e, - 0x0b, 0x23, 0x83, 0xe1, 0x3d, 0xa4, 0x44, 0x29, 0x79, 0x98, 0xb7, 0x60, - 0x78, 0x6d, 0xee, 0x84, 0x92, 0x59, 0x54, 0xd6, 0xe5, 0x15, 0x9b, 0xdd, - 0xa3, 0x48, 0x70, 0x67, 0xb1, 0xfa, 0x7e, 0x55, 0x26, 0xee, 0xca, 0x2e, - 0x44, 0xb9, 0x15, 0xa3, 0x21, 0x0e, 0xd5, 0xab, 0x74, 0xdc, 0xa3, 0x4b, - 0x73, 0x37, 0xaa, 0x97, 0x96, 0xf1, 0xc2, 0x91, 0xcd, 0x3f, 0x42, 0xed, - 0x28, 0xf7, 0x65, 0x8c, 0xb7, 0x79, 0x9d, 0x3f, 0x62, 0x38, 0x00, 0x4f, - 0x44, 0xf4, 0xc7, 0xdd, 0x99, 0x2b, 0x7a, 0x4f, 0xc1, 0x1d, 0xdb, 0xec, - 0x23, 0x1f, 0xbb, 0xe2, 0xd2, 0x2c, 0xf6, 0xb4, 0x5c, 0xdc, 0xab, 0xd0, - 0x67, 0x5d, 0x12, 0xf6, 0xf8, 0x5b, 0x94, 0xea, 0x07, 0xff, 0x83, 0x33, - 0x59, 0x83, 0xe2, 0xb8, 0x85, 0x83, 0x35, 0xe1, 0xa8, 0xc5, 0x1d, 0x67, - 0x3b, 0x90, 0x9f, 0x69, 0x2f, 0x35, 0xe4, 0x7d, 0xc5, 0xdb, 0xe0, 0xef, - 0xfc, 0xca, 0x66, 0x10, 0xbf, 0xe7, 0xc3, 0xf2, 0xdf, 0x90, 0x78, 0xda, - 0x41, 0x19, 0xa7, 0xf0, 0x9c, 0x09, 0xb7, 0x36, 0x2f, 0xfc, 0x0f, 0xc5, - 0x76, 0x24, 0xa7, 0x30, 0xd6, 0x69, 0x0b, 0xd4, 0x99, 0x80, 0x03, 0xa6, - 0xaf, 0xac, 0xa7, 0xe9, 0xa9, 0x0c, 0xc3, 0x76, 0x1e, 0x52, 0x3e, 0xff, - 0xba, 0x1c, 0x9e, 0x3a, 0x06, 0xc4, 0x4a, 0x7f, 0x7e, 0x5d, 0x31, 0x83, - 0xaf, 0x0c, 0x76, 0xcc, 0x9d, 0x6a, 0x2c, 0x41, 0x6a, 0xf8, 0x41, 0x68, - 0x51, 0x6b, 0xdf, 0xe8, 0xdf, 0x72, 0x78, 0x43, 0x0b, 0x64, 0xf8, 0x18, - 0xc7, 0x1c, 0x8e, 0x2f, 0x2a, 0x38, 0x5f, 0x16, 0xfb, 0x3c, 0x70, 0x82, - 0xcb, 0x34, 0x83, 0x64, 0x30, 0xaf, 0x85, 0xee, 0x41, 0x54, 0xab, 0x7e, - 0x5d, 0x8f, 0xa9, 0x36, 0x25, 0xda, 0x85, 0x2f, 0xf0, 0x26, 0xb7, 0xd8, - 0x93, 0x39, 0x0d, 0xfa, 0x1a, 0x6d, 0x8f, 0x80, 0x1d, 0x30, 0x84, 0x8b, - 0x78, 0x40, 0x10, 0xae, 0xf3, 0x88, 0x12, 0x7c, 0x93, 0x94, 0x49, 0xdd, - 0x6f, 0x2c, 0x9e, 0x7d, 0x36, 0xf7, 0x33, 0xa6, 0x61, 0x40, 0x14, 0x44, - 0x7e, 0xe6, 0xe9, 0x01, 0xdd, 0x63, 0x7d, 0x6e, 0x51, 0xeb, 0x18, 0xc7, - 0x58, 0xd0, 0x27, 0xab, 0x11, 0x10, 0x97, 0x5e, 0xd4, 0xec, 0xfe, 0x61, - 0xd1, 0x29, 0xc8, 0x50, 0x1c, 0xee, 0xf3, 0xc2, 0x54, 0x24, 0x04, 0xdd, - 0xe5, 0x5a, 0xed, 0x96, 0xb4, 0xaa, 0xb0, 0x69, 0x37, 0x84, 0x48, 0x78, - 0x74, 0xfc, 0x98, 0xd4, 0xe8, 0x7f, 0x26, 0x3c, 0x54, 0x25, 0x4e, 0x74, - 0xed, 0xc3, 0x00, 0x39, 0x7d, 0xeb, 0xf0, 0x64, 0x1f, 0x70, 0x7d, 0xc8, - 0xb8, 0xfe, 0x30, 0x01, 0xa5, 0xef, 0x23, 0x7c, 0x9c, 0x14, 0x9b, 0x21, - 0x5d, 0x09, 0xd2, 0x60, 0x3a, 0x23, 0x72, 0xed, 0x16, 0x03, 0xa5, 0x14, - 0xba, 0x73, 0xf2, 0x89, 0xf6, 0xf5, 0x67, 0x98, 0x8a, 0x65, 0x38, 0xec, - 0xac, 0x5e, 0x2b, 0xe8, 0x31, 0xf6, 0x27, 0xe8, 0xeb, 0x63, 0x01, 0xb5, - 0x2b, 0xd8, 0xd5, 0xe0, 0xfd, 0x03, 0xc6, 0xd4, 0xeb, 0x16, 0x19, 0xee, - 0x35, 0x01, 0xc8, 0x7a, 0x45, 0x06, 0x30, 0xe7, 0x4b, 0x91, 0xad, 0x95, - 0xf1, 0x0b, 0x7a, 0xe9, 0x10, 0xe9, 0x46, 0x1b, 0x8b, 0xa0, 0xab, 0x5d, - 0xd7, 0x83, 0x30, 0x13, 0x65, 0x64, 0x5a, 0x5f, 0xe3, 0xfe, 0x39, 0xdc, - 0xd2, 0x76, 0xac, 0x10, 0x57, 0xa4, 0x3b, 0x3f, 0x67, 0x1b, 0x34, 0x1c, - 0x04, 0xd1, 0x9a, 0xb9, 0xc3, 0x0d, 0x2e, 0xf3, 0x37, 0x0f, 0x26, 0xf1, - 0xe6, 0xae, 0xd7, 0x84, 0x72, 0x68, 0x87, 0xe7, 0xa0, 0x6b, 0xb7, 0x5f, - 0xbf, 0xf4, 0xf0, 0x3d, 0xc9, 0x49, 0x0b, 0xdb, 0x0c, 0xf3, 0xf7, 0xee, - 0x7b, 0x5f, 0xb6, 0x96, 0x56, 0x3c, 0x9f, 0xad, 0x34, 0xef, 0x56, 0x34, - 0x3d, 0xd8, 0xec, 0xe4, 0x76, 0x3b, 0x63, 0x9b, 0x23, 0x43, 0xe5, 0x8c, - 0xb0, 0xa4, 0x40, 0xcd, 0x69, 0x7f, 0x3a, 0xfa, 0xb6, 0x8c, 0xe3, 0x0d, - 0xff, 0x95, 0xa0, 0x06, 0x11, 0xed, 0x34, 0xba, 0xe3, 0xf6, 0x23, 0x1a, - 0x6f, 0xe6, 0xcc, 0xa5, 0x34, 0x5f, 0x0b, 0xa7, 0xcd, 0x00, 0x92, 0xf7, - 0x47, 0x8f, 0x14, 0x84, 0x3d, 0xbc, 0x03, 0x94, 0x3b, 0x30, 0x2a, 0xdc, - 0x4b, 0x0c, 0xbf, 0xe8, 0xcb, 0x53, 0x71, 0xb4, 0xce, 0x92, 0xa9, 0x90, - 0xca, 0x74, 0x69, 0xcf, 0xeb, 0xb1, 0x79, 0x27, 0xbf, 0x12, 0xfd, 0xe9, - 0x85, 0x40, 0x67, 0xbc, 0x49, 0x84, 0x05, 0x5e, 0x5d, 0xea, 0xc7, 0x13, - 0xd3, 0x83, 0x90, 0xa6, 0x33, 0xff, 0x85, 0xc4, 0x59, 0x4a, 0xb5, 0x84, - 0xad, 0x1e, 0xd2, 0xd4, 0xae, 0x00, 0x9a, 0x63, 0x19, 0xe2, 0x4a, 0x6c, - 0x90, 0x5d, 0x02, 0xe1, 0x8e, 0x5c, 0x14, 0xf2, 0x89, 0x9e, 0x1a, 0x59, - 0xd5, 0x86, 0x44, 0xb7, 0x19, 0x63, 0xe5, 0x3d, 0x40, 0x76, 0x9e, 0x8a, - 0xea, 0x80, 0x8e, 0x11, 0xbf, 0x4e, 0xb8, 0xbf, 0xb0, 0xa3, 0xa1, 0x74, - 0x31, 0x8f, 0xe9, 0x88, 0x43, 0xf1, 0x71, 0xd7, 0x01, 0x67, 0x62, 0x84, - 0x1d, 0x92, 0x86, 0xf8, 0xc1, 0xa9, 0x0f, 0x94, 0x7b, 0x97, 0xec, 0x8d, - 0xdf, 0x26, 0x52, 0xb9, 0xc4, 0x79, 0x58, 0x46, 0xf9, 0x3a, 0x2b, 0xd1, - 0x76, 0xd5, 0xbd, 0x4e, 0x37, 0x4d, 0x06, 0x22, 0x45, 0x20, 0xe9, 0xc7, - 0xbd, 0xa0, 0x9e, 0x26, 0xab, 0xaa, 0x2d, 0xa9, 0xd5, 0xfe, 0xcf, 0x6e, - 0x9c, 0x8d, 0xff, 0x57, 0x2b, 0xf0, 0x51, 0x47, 0x00, 0x8e, 0x80, 0x1a, - 0xa6, 0x57, 0x0c, 0xa0, 0x36, 0xdc, 0x51, 0xed, 0x9a, 0x3f, 0xf2, 0xa4, - 0xb6, 0x06, 0x48, 0xf0, 0x7d, 0x18, 0x2a, 0x6c, 0x44, 0x87, 0x23, 0xf1, - 0x35, 0x0c, 0xa2, 0xb8, 0x2a, 0x37, 0xfb, 0x53, 0x64, 0x98, 0xa8, 0x25, - 0x30, 0xb9, 0x98, 0xdd, 0x52, 0x86, 0xbc, 0x63, 0x22, 0xc1, 0xac, 0x7a, - 0x0b, 0x57, 0x1b, 0xf7, 0x2f, 0xc7, 0xe6, 0x62, 0xaf, 0xc9, 0xf2, 0xc1, - 0x72, 0xf0, 0x20, 0x83, 0x57, 0x58, 0xf1, 0xee, 0xcf, 0x2b, 0x32, 0x45, - 0xf7, 0xda, 0x98, 0x54, 0xa6, 0x87, 0xff, 0xed, 0x01, 0x50, 0xea, 0x53, - 0x32, 0xfa, 0xfa, 0xbb, 0x45, 0x5b, 0x78, 0x69, 0xe1, 0xd1, 0x65, 0xea, - 0x80, 0xd0, 0xf3, 0xf2, 0x32, 0x04, 0xe4, 0x3a, 0xcb, 0x49, 0x6c, 0x90, - 0xcc, 0xc9, 0x34, 0xe2, 0x11, 0x94, 0x19, 0x5b, 0xb2, 0xc1, 0x7d, 0x73, - 0xc3, 0x2b, 0x9e, 0x93, 0xc0, 0xf8, 0x90, 0x3b, 0x0b, 0x9d, 0xa7, 0x5f, - 0x16, 0xdf, 0x09, 0xbe, 0x69, 0x32, 0xc6, 0xb6, 0x4f, 0xeb, 0xb5, 0x0f, - 0x4e, 0x28, 0x3d, 0x25, 0x49, 0xcb, 0xfe, 0xd2, 0xef, 0xd9, 0x82, 0xbb, - 0x66, 0x0c, 0xa1, 0xdd, 0x91, 0xa8, 0xd2, 0x33, 0xd9, 0x7f, 0x93, 0xda, - 0x95, 0xa7, 0xe9, 0x3e, 0x07, 0x5a, 0x04, 0xb0, 0xd9, 0xc9, 0xa9, 0x03, - 0x54, 0x20, 0xd4, 0xd5, 0x53, 0xb7, 0x15, 0x02, 0xd5, 0xc6, 0xfa, 0x8f, - 0xe8, 0x76, 0x6a, 0x4c, 0xc5, 0xe3, 0xc7, 0x77, 0x3b, 0xf2, 0xe2, 0x46, - 0x66, 0x93, 0x7a, 0xa9, 0xc1, 0x05, 0x85, 0xc1, 0x4f, 0xd6, 0x40, 0x14, - 0x05, 0x1a, 0xfc, 0x6d, 0x5d, 0xf3, 0xb4, 0x02, 0x7c, 0x0d, 0x86, 0x81, - 0x50, 0x97, 0xdc, 0x41, 0xb7, 0x02, 0xa8, 0x90, 0x11, 0xc8, 0x5c, 0x5d, - 0xa9, 0x09, 0xe6, 0xba, 0xb9, 0x7c, 0xad, 0x58, 0xdb, 0xa0, 0x1c, 0x11, - 0xed, 0x17, 0x48, 0x65, 0x70, 0x09, 0x57, 0x16, 0x69, 0xc6, 0x27, 0x48, - 0x41, 0x47, 0xd9, 0x32, 0x6d, 0xa7, 0x5a, 0x16, 0x86, 0x6f, 0x32, 0x3c, - 0x4e, 0xe7, 0x0c, 0xdf, 0xcc, 0x7a, 0xe2, 0x93, 0x2b, 0x93, 0x95, 0x9d, - 0x92, 0xb3, 0x7b, 0xf9, 0xaf, 0x01, 0xd3, 0x4a, 0x4e, 0x1a, 0xa9, 0xdb, - 0x13, 0x8c, 0x39, 0xe0, 0xc6, 0x90, 0x46, 0x0f, 0xbc, 0x18, 0xb7, 0xee, - 0x1d, 0xfa, 0x66, 0x61, 0xcc, 0x9a, 0x43, 0x4c, 0x1a, 0xe1, 0xee, 0x49, - 0x17, 0x0a, 0xd5, 0x34, 0xcc, 0x1b, 0x5b, 0x2d, 0xa3, 0xac, 0x01, 0x27, - 0xe2, 0xaa, 0x26, 0xa7, 0x7f, 0x25, 0x30, 0x97, 0x81, 0x58, 0xb0, 0xe4, - 0x8b, 0xe1, 0xba, 0x01, 0x6d, 0x69, 0xdd, 0x8b, 0xe7, 0x66, 0x86, 0x4f, - 0x5a, 0x48, 0xea, 0x3d, 0x30, 0x50, 0x40, 0xef, 0xf3, 0x5f, 0x04, 0xbd, - 0x61, 0x14, 0x54, 0x06, 0x9b, 0x8b, 0xf5, 0x44, 0xcc, 0xdd, 0xc0, 0x34, - 0xef, 0x72, 0x2c, 0xc1, 0x70, 0xf4, 0xf0, 0x25, 0xaf, 0xcb, 0x03, 0xea, - 0xe9, 0x33, 0x51, 0x4a, 0xb8, 0xb3, 0xbe, 0x4e, 0x29, 0xe6, 0x43, 0x6b, - 0x98, 0x10, 0xe1, 0x2f, 0x02, 0x75, 0xc1, 0xf5, 0xb0, 0xbc, 0x01, 0xed, - 0xce, 0xa7, 0xf6, 0x56, 0x40, 0x4a, 0xac, 0x92, 0xf1, 0x56, 0x00, 0x48, - 0x49, 0x1b, 0xf1, 0x59, 0xb3, 0xd2, 0xca, 0xd0, 0x91, 0x28, 0xe5, 0xed, - 0x51, 0xbc, 0x48, 0x89, 0x66, 0xea, 0x80, 0xdd, 0x4d, 0x2a, 0xeb, 0xda, - 0x63, 0x35, 0x26, 0x93, 0xe3, 0x28, 0xb0, 0xff, 0x12, 0xa1, 0x82, 0x39, - 0x37, 0xf8, 0x30, 0x9a, 0x84, 0xf6, 0x72, 0xe5, 0xa6, 0x98, 0xde, 0x63, - 0x79, 0xc1, 0x26, 0x85, 0x03, 0x83, 0x7f, 0xf2, 0x8d, 0x26, 0x99, 0x49, - 0x03, 0xca, 0xaa, 0x01, 0x45, 0x93, 0x2e, 0xd4, 0xa4, 0xb4, 0x24, 0xfa, - 0xd1, 0xa4, 0x4e, 0x9a, 0xef, 0xe6, 0xfa, 0xac, 0x1d, 0x2f, 0x96, 0x65, - 0x95, 0x47, 0xc5, 0x1b, 0xad, 0x08, 0x97, 0x5d, 0x0e, 0x72, 0x35, 0x8b, - 0xd5, 0xbf, 0x5c, 0x51, 0x0c, 0x47, 0x24, 0x99, 0x3e, 0x8a, 0x0f, 0xc4, - 0x18, 0xdf, 0x6d, 0xbc, 0x73, 0x02, 0xfd, 0x18, 0x47, 0xff, 0x79, 0xe9, - 0x7b, 0x6a, 0xaf, 0x0f, 0xf8, 0x15, 0x19, 0x06, 0x59, 0x78, 0x44, 0x12, - 0x64, 0x8d, 0xf5, 0xcd, 0x52, 0x3d, 0x84, 0x9d, 0xab, 0xbd, 0x0d, 0x4e, - 0xc6, 0xcb, 0xcb, 0x9a, 0x60, 0x26, 0x0c, 0xf1, 0x87, 0xec, 0xcf, 0x05, - 0x65, 0xc5, 0x3a, 0x4f, 0xfb, 0x57, 0x3d, 0xda, 0x28, 0xaf, 0x23, 0x7a, - 0x29, 0x48, 0xb9, 0xad, 0xa7, 0x91, 0x4e, 0xf7, 0x89, 0xe2, 0x90, 0xa3, - 0xf8, 0x1f, 0x27, 0xb8, 0x71, 0x8f, 0x8c, 0xfe, 0xa0, 0x9f, 0xcf, 0x09, - 0xb5, 0x68, 0x39, 0xcf, 0xc7, 0xd5, 0xb0, 0x6f, 0xbb, 0x85, 0x11, 0x43, - 0xb4, 0xfa, 0xf8, 0xec, 0x3e, 0x81, 0x1a, 0xc6, 0x15, 0x23, 0xe5, 0xe5, - 0x47, 0x3d, 0xd9, 0xef, 0x8e, 0x34, 0x3c, 0xb0, 0x10, 0x45, 0x75, 0xe5, - 0x5c, 0x0a, 0x9c, 0xe5, 0x3c, 0xc2, 0x46, 0x6c, 0x6d, 0xfd, 0x33, 0xc5, - 0x41, 0xd7, 0x55, 0xa8, 0x8c, 0x5c, 0x30, 0xc6, 0x12, 0x68, 0x89, 0x1d, - 0x49, 0x47, 0xed, 0xc3, 0xd3, 0x6f, 0x08, 0xf3, 0xfe, 0x71, 0x4d, 0x69, - 0x83, 0xde, 0x3a, 0xe4, 0xa1, 0xc4, 0xfb, 0xc2, 0x10, 0x95, 0xe0, 0xa4, - 0x31, 0x4d, 0xf8, 0xf4, 0xf7, 0x5c, 0x06, 0x2d, 0x49, 0x44, 0x0c, 0x00, - 0xb7, 0x5c, 0xda, 0x17, 0xcd, 0x68, 0xcf, 0x33, 0x99, 0x03, 0xb4, 0x84, - 0x62, 0x6c, 0x52, 0xad, 0xff, 0x02, 0x55, 0xe4, 0xe0, 0xf6, 0x8b, 0xf3, - 0x19, 0xfc, 0x92, 0x11, 0x55, 0xcf, 0x8a, 0x2b, 0xdb, 0xc6, 0xd5, 0xfb, - 0x26, 0x2e, 0x49, 0xfa, 0x24, 0xaa, 0x65, 0xbe, 0x3a, 0xe6, 0x9a, 0xb1, - 0xd9, 0x0e, 0x72, 0xaa, 0xb3, 0xc6, 0xae, 0xe4, 0x66, 0xc4, 0x70, 0x2c, - 0x15, 0x97, 0xca, 0xbe, 0xcd, 0xee, 0xe8, 0xab, 0xa6, 0xc2, 0x3c, 0xa3, - 0x89, 0x11, 0x56, 0xd4, 0x7a, 0x28, 0xac, 0xec, 0x96, 0x10, 0x15, 0xc3, - 0x4b, 0xa7, 0xe9, 0x70, 0x8f, 0x76, 0x94, 0xf5, 0x1a, 0x30, 0x45, 0x0b, - 0xc6, 0x52, 0x11, 0xe0, 0x4c, 0x80, 0x97, 0x30, 0xbd, 0x6f, 0x7e, 0x8b, - 0xd9, 0x45, 0x0f, 0xa3, 0x4c, 0xdb, 0x44, 0x0f, 0x33, 0x9b, 0x68, 0x54, - 0x22, 0x01, 0xaf, 0x98, 0x71, 0x76, 0xf9, 0xf9, 0x91, 0x6d, 0x7e, 0xcf, - 0xf0, 0x51, 0x04, 0xdc, 0x7d, 0x10, 0x6b, 0x0d, 0x71, 0x23, 0xb8, 0x26, - 0x70, 0x09, 0x12, 0xc2, 0x9b, 0x6b, 0x85, 0xf9, 0x02, 0xa4, 0x4e, 0x16, - 0x43, 0x34, 0x78, 0xbe, 0x2f, 0xd1, 0x44, 0x06, 0xf9, 0x0e, 0x4e, 0x01, - 0x39, 0x2d, 0x17, 0xee, 0x8e, 0x7d, 0xc7, 0x85, 0x63, 0xb5, 0x84, 0x1d, - 0x8f, 0xfc, 0xda, 0xc8, 0x06, 0x46, 0x99, 0x0c, 0xf9, 0xef, 0xd7, 0x6b, - 0x17, 0xa4, 0xa8, 0xed, 0xc8, 0xf4, 0x86, 0x53, 0xea, 0x14, 0xf3, 0x60, - 0xe1, 0xe3, 0xdd, 0xeb, 0xcd, 0x92, 0x54, 0x7f, 0x0a, 0x14, 0x2e, 0x03, - 0x96, 0xda, 0x19, 0x82, 0x19, 0x94, 0x3f, 0xbe, 0xea, 0xcb, 0x55, 0x68, - 0xbe, 0xbc, 0x5c, 0xe4, 0xdb, 0xf9, 0xc0, 0x17, 0x7c, 0xe1, 0x26, 0xe2, - 0xe3, 0x14, 0x13, 0x69, 0x27, 0x68, 0x8e, 0xe3, 0xa0, 0x3a, 0xe5, 0xc9, - 0x48, 0xd2, 0xbc, 0x30, 0xa8, 0xd3, 0xdf, 0x8b, 0x22, 0xcd, 0x41, 0x14, - 0x05, 0xe8, 0x50, 0xd4, 0x3a, 0xdf, 0xce, 0xe8, 0x43, 0xa3, 0x05, 0x8e, - 0xae, 0x36, 0xc8, 0xd2, 0x52, 0x73, 0xa1, 0xaf, 0xc0, 0x3f, 0x0f, 0x59, - 0xe4, 0x98, 0x69, 0xf3, 0xf3, 0x4d, 0x56, 0x45, 0xfd, 0x50, 0x2b, 0xfc, - 0x77, 0xa1, 0xef, 0x73, 0x01, 0x2e, 0x0a, 0x3a, 0x18, 0x02, 0x53, 0x49, - 0x52, 0xaa, 0xf9, 0xb6, 0x54, 0xaa, 0x1b, 0x47, 0x76, 0xee, 0x3f, 0xfb, - 0x53, 0xee, 0xf5, 0x6a, 0xac, 0x94, 0x6b, 0xc6, 0x61, 0x74, 0x69, 0x39, - 0x54, 0x1a, 0xf4, 0x2d, 0x1b, 0xac, 0xbd, 0xbb, 0x06, 0x11, 0xe5, 0x15, - 0x83, 0xaf, 0x47, 0x2a, 0x98, 0x68, 0xdd, 0xa1, 0x7f, 0x8f, 0x5c, 0x7d, - 0x23, 0x8c, 0x28, 0x30, 0x26, 0xbc, 0x02, 0x69, 0x87, 0xd1, 0x89, 0xbc, - 0x2d, 0x9a, 0x29, 0xd9, 0x20, 0x8a, 0x9f, 0xf0, 0x6f, 0x17, 0x66, 0xef, - 0x5a, 0x7d, 0x88, 0x3b, 0xe6, 0x23, 0x87, 0xa2, 0x3f, 0xfa, 0x70, 0x3a, - 0x1d, 0xf0, 0x80, 0xfd, 0xfb, 0x79, 0xcc, 0xc6, 0x5d, 0xd4, 0xc3, 0x5f, - 0xf9, 0xad, 0xed, 0x59, 0x66, 0xcb, 0x37, 0x9e, 0x0b, 0x66, 0xd9, 0x6a, - 0xc8, 0x96, 0x3c, 0x1b, 0x65, 0x07, 0x99, 0x9d, 0x62, 0x6d, 0xca, 0x59, - 0x37, 0x3f, 0x18, 0x4f, 0x04, 0x7e, 0x14, 0x4c, 0xe2, 0x00, 0x3e, 0xa8, - 0x9c, 0x3c, 0x37, 0x59, 0xb5, 0x85, 0x17, 0x51, 0x30, 0x3c, 0x6e, 0xe3, - 0xdd, 0x4d, 0x4a, 0xfb, 0xbb, 0x5a, 0x5c, 0xea, 0x8f, 0x90, 0x27, 0x8d, - 0xb4, 0x08, 0x56, 0x8b, 0x44, 0xa6, 0x52, 0xd6, 0x6c, 0x45, 0xe7, 0x77, - 0xe5, 0xe7, 0xb9, 0xdd, 0x1c, 0x74, 0xfc, 0xe5, 0xb4, 0x8b, 0xcf, 0xaa, - 0xec, 0x77, 0x9c, 0x10, 0xc7, 0x56, 0xd0, 0x0a, 0x2d, 0xec, 0x1c, 0x93, - 0x60, 0x97, 0x19, 0xbd, 0xbc, 0x83, 0x56, 0x3a, 0x81, 0x47, 0x69, 0xe7, - 0x20, 0x54, 0x26, 0x50, 0x3d, 0x37, 0xe9, 0x68, 0x5c, 0x9c, 0x94, 0xab, - 0xd0, 0x08, 0x82, 0x8c, 0xf5, 0x02, 0x9b, 0xc5, 0x19, 0xde, 0x54, 0x80, - 0x6c, 0x39, 0xe8, 0xb1, 0x6e, 0xd0, 0x98, 0x66, 0xb8, 0x21, 0xde, 0x40, - 0x94, 0x79, 0xf3, 0x54, 0x79, 0x05, 0xbb, 0x60, 0x0a, 0x60, 0x34, 0x9b, - 0xde, 0xac, 0x24, 0xce, 0xc3, 0xc5, 0x8f, 0x25, 0x97, 0x7f, 0xae, 0xc4, - 0x5f, 0x94, 0x23, 0x71, 0xaa, 0xeb, 0x58, 0x96, 0xd0, 0x8e, 0xa6, 0x6b, - 0xb1, 0x47, 0x3f, 0xf3, 0xe0, 0xec, 0x50, 0xab, 0xfd, 0xcb, 0x6b, 0x04, - 0x8a, 0xfa, 0x5b, 0x30, 0x1b, 0x68, 0x48, 0xbb, 0x5f, 0x79, 0x83, 0x52, - 0xd3, 0x4a, 0xb5, 0x3c, 0x5e, 0xf6, 0xc5, 0xa3, 0xf8, 0x06, 0x9f, 0x63, - 0xbb, 0x04, 0xfe, 0x66, 0xb5, 0xf5, 0x36, 0xf8, 0xea, 0x0b, 0xcc, 0xdf, - 0x79, 0x34, 0x0b, 0xab, 0x8d, 0xf2, 0xd3, 0x58, 0xb0, 0xc8, 0x38, 0xf6, - 0x07, 0x1d, 0xc0, 0x73, 0x3e, 0xa3, 0x66, 0x21, 0x20, 0xd7, 0xe2, 0xc5, - 0x89, 0x3f, 0xa5, 0xab, 0x15, 0x5f, 0x2f, 0xfc, 0x9f, 0xbf, 0xcb, 0xfc, - 0x00, 0xe4, 0x64, 0xba, 0x14, 0xfb, 0x4c, 0x7e, 0x6d, 0x3c, 0x9b, 0xdd, - 0xa5, 0xe4, 0xa3, 0xb5, 0xd9, 0x98, 0x8c, 0xe8, 0x9f, 0x5d, 0x84, 0xda, - 0x47, 0x7e, 0xe4, 0xaa, 0x21, 0xbd, 0x5c, 0x32, 0x93, 0xdd, 0xc9, 0x7e, - 0xb6, 0x63, 0xbd, 0xde, 0xd3, 0x6f, 0x9a, 0xfe, 0x3a, 0x0f, 0x49, 0x1e, - 0x6c, 0x98, 0x5b, 0xad, 0x21, 0x12, 0xd2, 0xd3, 0x23, 0xda, 0x9e, 0xd9, - 0xd5, 0xca, 0x77, 0x5e, 0x00, 0xea, 0xa5, 0x12, 0x65, 0xc1, 0xf6, 0xdb, - 0x29, 0xbc, 0x0b, 0xef, 0xd5, 0xad, 0x3e, 0x28, 0x08, 0x70, 0x7a, 0x44, - 0xd6, 0xd0, 0x1a, 0x86, 0x5b, 0x8f, 0xb4, 0x81, 0xfe, 0xc1, 0x92, 0xe4, - 0x8a, 0xa1, 0xf5, 0x5d, 0x7a, 0x59, 0xb5, 0x7b, 0xee, 0xb4, 0x03, 0x56, - 0x93, 0xf6, 0xba, 0x28, 0xeb, 0xde, 0x58, 0xe2, 0xff, 0xe0, 0x8f, 0x9a, - 0xc2, 0x02, 0x72, 0x79, 0xc1, 0xa9, 0x69, 0x95, 0x58, 0x09, 0x21, 0x9b, - 0xd0, 0xf7, 0xb5, 0x7c, 0x1b, 0x4b, 0x04, 0x4f, 0x1d, 0x79, 0xa9, 0xf8, - 0xcb, 0x95, 0x77, 0xcf, 0x52, 0x61, 0x3f, 0xf5, 0x6b, 0x11, 0xf2, 0x08, - 0x84, 0xab, 0x53, 0x56, 0x0f, 0x82, 0x7f, 0x86, 0xa4, 0x4a, 0xec, 0x55, - 0x0d, 0xd6, 0x9e, 0x08, 0xc7, 0x38, 0x62, 0xcc, 0xb3, 0xbd, 0x0b, 0x3b, - 0xf7, 0x34, 0x08, 0xcc, 0xa1, 0x55, 0x05, 0xda, 0xbd, 0x02, 0x97, 0x74, - 0xe7, 0xca, 0xca, 0x3e, 0x31, 0x31, 0x98, 0x0a, 0x1e, 0x96, 0x1e, 0xa6, - 0x6e, 0x83, 0x3d, 0x0e, 0x27, 0x6b, 0xf8, 0x49, 0xd0, 0xe8, 0xb3, 0x2d, - 0x50, 0xb5, 0xb0, 0xfe, 0xda, 0xe3, 0x28, 0x03, 0xee, 0x15, 0x64, 0x04, - 0x49, 0xd0, 0xac, 0x90, 0xa5, 0x85, 0xda, 0xd0, 0x4b, 0x0a, 0x1e, 0xcc, - 0x2d, 0xfc, 0x5b, 0x98, 0x9c, 0x71, 0x35, 0x42, 0xbc, 0xb7, 0x27, 0x63, - 0x20, 0xbe, 0x82, 0xe1, 0x43, 0xae, 0x3c, 0xfd, 0x88, 0x95, 0xe6, 0xae, - 0xf4, 0xe4, 0x3d, 0x88, 0xf0, 0x08, 0x3e, 0x7a, 0x73, 0xc7, 0x9b, 0xa6, - 0xd3, 0x3f, 0x2f, 0xef, 0xd2, 0x55, 0x2c, 0x3b, 0xf8, 0xa8, 0x8a, 0x98, - 0x8f, 0xf0, 0xd1, 0x06, 0x88, 0xc1, 0xf3, 0x1c, 0xff, 0x19, 0xcc, 0xd2, - 0x63, 0xfe, 0x4b, 0x9e, 0x60, 0xf5, 0x90, 0xcc, 0xf1, 0x20, 0x64, 0xc9, - 0x3a, 0x1a, 0xf9, 0xc6, 0xd4, 0x13, 0xd7, 0xcc, 0xe1, 0x09, 0xa5, 0x67, - 0xbc, 0xc0, 0x59, 0x4a, 0x32, 0x0e, 0xeb, 0x25, 0x45, 0x6c, 0x38, 0x33, - 0xf4, 0x15, 0x2c, 0xe7, 0x03, 0x63, 0xa5, 0xf5, 0xfe, 0x06, 0x99, 0x64, - 0x5f, 0x8a, 0xd5, 0x10, 0xd8, 0x30, 0x91, 0x85, 0xf5, 0x1e, 0x28, 0x89, - 0x48, 0xd4, 0x78, 0x74, 0x14, 0x59, 0x1e, 0x3f, 0x61, 0x99, 0x1a, 0xba, - 0xfa, 0x4e, 0xd0, 0x68, 0x46, 0x75, 0xd4, 0x06, 0x98, 0x58, 0xe7, 0x2b, - 0xcc, 0xc5, 0xe1, 0xbf, 0x4a, 0xd7, 0x94, 0xc6, 0x95, 0xe1, 0x37, 0x16, - 0x0b, 0x38, 0xf4, 0x89, 0x25, 0x32, 0x56, 0x08, 0x2e, 0x17, 0xc9, 0x71, - 0x53, 0xc5, 0x33, 0x44, 0x6a, 0x2a, 0x24, 0x00, 0x66, 0x11, 0xa2, 0x10, - 0x01, 0x5d, 0x53, 0x69, 0xfb, 0x91, 0x4b, 0x87, 0x8c, 0xb4, 0x29, 0x63, - 0x35, 0x99, 0xf3, 0x59, 0x72, 0x3f, 0x76, 0xbf, 0xe5, 0x27, 0x37, 0xdf, - 0x6f, 0x5b, 0x7d, 0x67, 0x65, 0xd6, 0x0b, 0x08, 0x37, 0xbd, 0xff, 0xf8, - 0xd5, 0x1e, 0x07, 0xcd, 0xf7, 0x1d, 0x2a, 0x86, 0xb0, 0x34, 0xee, 0x62, - 0x45, 0x7a, 0x7f, 0x70, 0x35, 0x3a, 0x96, 0x85, 0xa4, 0x7b, 0x43, 0x5f, - 0x80, 0xd2, 0x00, 0xf8, 0x32, 0x72, 0xe5, 0xde, 0x12, 0x60, 0xec, 0x5b, - 0xe7, 0x9e, 0x40, 0x8f, 0xab, 0xea, 0x56, 0xb8, 0x9b, 0x0f, 0x66, 0x0b, - 0x95, 0x9a, 0x47, 0x06, 0x6a, 0x95, 0x5c, 0x52, 0x1f, 0x8d, 0xf1, 0xcb, - 0xe2, 0x5d, 0x44, 0x01, 0x77, 0xaa, 0xfb, 0x30, 0x46, 0xf9, 0x5f, 0x88, - 0xf7, 0x78, 0x4a, 0xce, 0x1d, 0x14, 0x20, 0xeb, 0x83, 0x1b, 0xc5, 0xf8, - 0x3f, 0xea, 0x85, 0x7c, 0xba, 0x2c, 0x12, 0xd8, 0x7e, 0x7d, 0x3e, 0x0a, - 0x65, 0x66, 0x16, 0xdc, 0x9f, 0x0c, 0x3c, 0x76, 0xd0, 0x06, 0xb4, 0x8d, - 0x0a, 0xbc, 0xfe, 0x4f, 0xc6, 0x57, 0xec, 0x84, 0x9e, 0x56, 0x90, 0xda, - 0x8a, 0x7e, 0x84, 0x67, 0xc8, 0xa5, 0xfd, 0xef, 0xe3, 0xc3, 0x5d, 0xda, - 0xad, 0x03, 0xd9, 0x1c, 0xed, 0xe5, 0x6e, 0xbc, 0xb8, 0xde, 0x77, 0x91, - 0x4c, 0xea, 0x3c, 0xc4, 0xe8, 0x8a, 0xd9, 0x5b, 0xac, 0xdf, 0xa3, 0xb4, - 0x50, 0x64, 0x06, 0x42, 0xe1, 0x8b, 0xae, 0xec, 0xe7, 0x1f, 0xc5, 0x73, - 0xc4, 0x28, 0xe7, 0xd2, 0x1e, 0xaf, 0xfc, 0x7a, 0x41, 0x3a, 0x91, 0xfd, - 0x4f, 0xff, 0x65, 0x04, 0x65, 0x9a, 0xd0, 0x7f, 0xb3, 0x8c, 0x57, 0x18, - 0x05, 0x0b, 0xc4, 0x38, 0x95, 0x16, 0x71, 0x49, 0xb5, 0x33, 0xec, 0xc4, - 0x04, 0x62, 0xee, 0xb5, 0x76, 0x29, 0x6f, 0xeb, 0x8b, 0xba, 0x18, 0x29, - 0xa6, 0x53, 0x81, 0x02, 0x80, 0xdb, 0x58, 0x29, 0x8f, 0xe9, 0x5d, 0x80, - 0x21, 0xe1, 0xcc, 0x2c, 0x4b, 0x64, 0xdc, 0xdc, 0x20, 0xfc, 0x8b, 0x65, - 0x12, 0xe0, 0x87, 0x8f, 0xf8, 0xa9, 0xb4, 0xbf, 0xb0, 0x9b, 0x04, 0xb0, - 0x62, 0x1c, 0x2b, 0x8c, 0x77, 0xb4, 0xc2, 0x54, 0x7f, 0x91, 0x43, 0x1e, - 0xd8, 0x70, 0x32, 0x17, 0x26, 0x3d, 0x2a, 0x05, 0x98, 0x9a, 0x2f, 0xc9, - 0xeb, 0x3f, 0x9f, 0xf2, 0x55, 0x6f, 0x89, 0xa0, 0x23, 0x6b, 0xc2, 0xee, - 0x3c, 0x68, 0x1c, 0x16, 0x84, 0x26, 0x1c, 0xf4, 0xdc, 0xed, 0xc0, 0xbb, - 0x80, 0x64, 0xf9, 0xb1, 0x55, 0x2e, 0x7c, 0x37, 0x35, 0x90, 0x48, 0x19, - 0xaa, 0xf1, 0xc5, 0x83, 0x35, 0xd2, 0x92, 0xa6, 0x6d, 0xe7, 0x01, 0xb5, - 0x61, 0xad, 0xc0, 0x59, 0xac, 0x5c, 0x69, 0xe2, 0x6a, 0x77, 0x87, 0x96, - 0x46, 0x66, 0xab, 0x3b, 0x8a, 0x7a, 0x46, 0xba, 0x7e, 0x42, 0xa7, 0xa6, - 0x72, 0x5c, 0xd6, 0xcd, 0x1c, 0xa7, 0xfa, 0xaf, 0x57, 0x63, 0x51, 0xd7, - 0xec, 0x72, 0x5d, 0x60, 0x1b, 0x2d, 0xd8, 0x08, 0x48, 0x96, 0xac, 0xd4, - 0x38, 0x39, 0xf1, 0x9b, 0xf8, 0x79, 0xe7, 0xf0, 0x7d, 0xe3, 0x44, 0x9e, - 0x19, 0xc5, 0x5f, 0x2e, 0x96, 0x40, 0x09, 0xb0, 0xd2, 0x0e, 0xde, 0x4b, - 0x5f, 0x12, 0x00, 0x55, 0xa2, 0x81, 0x93, 0x3d, 0x11, 0x41, 0x18, 0xf5, - 0x51, 0xbd, 0x12, 0xcf, 0x06, 0x56, 0x0b, 0x34, 0x4e, 0xce, 0x97, 0x93, - 0xf5, 0xed, 0x19, 0x46, 0xa5, 0xaa, 0xbc, 0xab, 0x35, 0x26, 0x77, 0x22, - 0xea, 0x54, 0xa3, 0x0d, 0xc4, 0xf0, 0xa6, 0xae, 0xe3, 0xb3, 0x1d, 0xf9, - 0xa5, 0x9e, 0x01, 0x4f, 0x1a, 0xe9, 0x1e, 0x24, 0xdc, 0xf4, 0x06, 0x3f, - 0x2b, 0x38, 0x5a, 0x49, 0x86, 0x33, 0x93, 0xc9, 0xae, 0x37, 0xf4, 0x39, - 0x9d, 0x6a, 0x09, 0x36, 0xd8, 0x32, 0x89, 0xc6, 0x45, 0xb8, 0x25, 0xd3, - 0x02, 0xcc, 0x22, 0x22, 0x2a, 0x56, 0x6b, 0x6d, 0xce, 0xb8, 0x35, 0x4e, - 0x01, 0x02, 0xa0, 0x61, 0xe6, 0xcc, 0xae, 0x0c, 0x44, 0xc4, 0x88, 0xab, - 0x78, 0x34, 0xbe, 0x5b, 0xc8, 0x8f, 0xe8, 0xce, 0xc0, 0xd6, 0x19, 0xd9, - 0x5a, 0x9d, 0xca, 0xa7, 0xa8, 0x40, 0xaf, 0x01, 0x20, 0x76, 0xc6, 0xf5, - 0xd9, 0x41, 0x97, 0x5f, 0x45, 0x32, 0x45, 0xf5, 0xf0, 0x21, 0x18, 0xcd, - 0x52, 0xbd, 0x98, 0xb4, 0x40, 0xb4, 0xa0, 0xdd, 0x9e, 0x55, 0x9b, 0x75, - 0x78, 0xa5, 0xa4, 0x38, 0x9a, 0xb5, 0x1f, 0xa9, 0x50, 0x90, 0xee, 0x44, - 0xf1, 0xfd, 0x87, 0x7c, 0xb8, 0x82, 0x1d, 0x2d, 0xfd, 0x1d, 0x2e, 0xbb, - 0xac, 0x5a, 0x7f, 0x0b, 0xd2, 0xec, 0x7e, 0x74, 0xe4, 0x55, 0x31, 0xe7, - 0xe7, 0xf0, 0xb3, 0x1e, 0xed, 0x36, 0x1a, 0xec, 0xb5, 0x0c, 0xc2, 0x08, - 0xd8, 0x46, 0xed, 0xed, 0xd9, 0xae, 0x72, 0x27, 0xed, 0x8b, 0xcf, 0x97, - 0x41, 0x54, 0x56, 0xe4, 0xe3, 0xa2, 0x96, 0x17, 0x91, 0x25, 0xa0, 0x7b, - 0x2c, 0x14, 0xc3, 0x7e, 0xd1, 0xb8, 0x0f, 0xc4, 0x0e, 0x5d, 0xd7, 0x7a, - 0x1f, 0x75, 0xf1, 0x56, 0xda, 0x5d, 0x23, 0x8f, 0x99, 0x66, 0xbd, 0xf0, - 0xa5, 0xf6, 0x43, 0xae, 0xb1, 0x23, 0x77, 0x76, 0x4c, 0x19, 0x58, 0x7a, - 0x02, 0xb5, 0x27, 0x5f, 0xa0, 0xa3, 0xec, 0x49, 0x5c, 0xec, 0xd4, 0x25, - 0xfc, 0x23, 0x3b, 0x79, 0xd3, 0x81, 0x3f, 0xa0, 0xa5, 0xc1, 0xe2, 0xac, - 0x6c, 0x7b, 0xa9, 0x5b, 0x11, 0x5d, 0xd0, 0xd4, 0xf6, 0x60, 0x9a, 0x60, - 0x19, 0xa8, 0x94, 0x78, 0x5f, 0x9b, 0xf2, 0x99, 0x12, 0xdd, 0x51, 0x3b, - 0x88, 0xe2, 0x98, 0x1d, 0x08, 0xb8, 0x8e, 0xea, 0x71, 0x98, 0x97, 0x6b, - 0x52, 0x51, 0x97, 0x2e, 0x82, 0x1b, 0xd6, 0x2a, 0xdb, 0x3b, 0x64, 0xc5, - 0x88, 0x8e, 0x13, 0x93, 0xd0, 0x26, 0x8f, 0x69, 0xa2, 0xcf, 0xac, 0xdf, - 0x95, 0x4b, 0xda, 0xfe, 0x30, 0x54, 0x9b, 0xb8, 0xa3, 0xfa, 0x47, 0x40, - 0xeb, 0x90, 0xb1, 0x34, 0x7f, 0x63, 0xdb, 0x52, 0xd2, 0x82, 0x92, 0xcb, - 0xec, 0xee, 0xcc, 0xab, 0x43, 0xbf, 0x6e, 0x7c, 0x29, 0x3a, 0x68, 0x9d, - 0x37, 0x5f, 0x26, 0x99, 0x48, 0x35, 0x1f, 0xe1, 0xb4, 0x9d, 0x5f, 0x6c, - 0x1c, 0x50, 0xf9, 0x2a, 0xaf, 0x0c, 0xfe, 0x63, 0x11, 0xc7, 0xe3, 0x1a, - 0xda, 0x68, 0xd4, 0xee, 0x21, 0xda, 0xef, 0xd0, 0x04, 0x6a, 0x84, 0x63, - 0x94, 0x76, 0x98, 0x9c, 0xb3, 0xe8, 0x20, 0xd9, 0xb4, 0xca, 0x45, 0xde, - 0x50, 0xb0, 0xe7, 0x33, 0x82, 0x17, 0xa6, 0x19, 0x77, 0x42, 0x22, 0xf4, - 0x52, 0xd5, 0x97, 0x5c, 0xbc, 0x58, 0xf8, 0xe9, 0x16, 0xc8, 0xf1, 0xb6, - 0x33, 0x2f, 0xb4, 0x7e, 0x43, 0x80, 0x29, 0xbd, 0x19, 0xde, 0x8d, 0x43, - 0x9c, 0x80, 0xe7, 0xd7, 0x4d, 0x14, 0xeb, 0xb4, 0xb0, 0xdd, 0x61, 0x51, - 0xf2, 0xfe, 0x94, 0x73, 0x44, 0x20, 0xde, 0x76, 0xcc, 0x89, 0xa2, 0x3f, - 0xb0, 0x41, 0x40, 0x9c, 0x71, 0xc6, 0x77, 0x3f, 0xf6, 0xa0, 0x85, 0xd7, - 0x4e, 0x85, 0x38, 0xf8, 0xc5, 0xd0, 0xe3, 0xdb, 0xa1, 0xbc, 0x97, 0xad, - 0x94, 0x50, 0xb0, 0x61, 0xc1, 0x95, 0x2f, 0xff, 0xcd, 0x02, 0x5f, 0x8d, - 0x5b, 0xaf, 0xb8, 0x45, 0x13, 0xb9, 0xf5, 0x57, 0x2a, 0x1e, 0x61, 0x21, - 0xe4, 0xfc, 0xc5, 0xf5, 0x25, 0x31, 0xaf, 0xe3, 0x8e, 0x02, 0x44, 0xd1, - 0x0f, 0x3e, 0x7b, 0xb0, 0xe5, 0x3a, 0x08, 0x78, 0x14, 0x48, 0xe1, 0x96, - 0x38, 0xf3, 0x22, 0x35, 0x66, 0x37, 0x5f, 0x8d, 0xdd, 0x5d, 0x09, 0x9b, - 0xa0, 0xf0, 0xd1, 0xc4, 0x04, 0x76, 0x95, 0x81, 0x52, 0xba, 0x14, 0xdc, - 0x53, 0xef, 0x4c, 0xc9, 0x03, 0xfe, 0x08, 0x35, 0x4a, 0xd2, 0xef, 0x25, - 0x5b, 0xa8, 0x4c, 0xe6, 0x4c, 0x9c, 0x97, 0x47, 0x5e, 0xd9, 0xc6, 0x58, - 0x52, 0xe5, 0xe6, 0x72, 0xac, 0xb5, 0x5f, 0x04, 0x9a, 0x87, 0x88, 0x88, - 0x1a, 0x7c, 0x8f, 0x19, 0xdd, 0x7f, 0xb4, 0x1f, 0xde, 0xc9, 0x1e, 0xce, - 0xcb, 0xdd, 0xb5, 0x64, 0x2d, 0x5d, 0xd8, 0xb5, 0xd2, 0xb1, 0xe0, 0xa6, - 0xd8, 0xde, 0x90, 0x0b, 0x0f, 0xc8, 0xd4, 0xba, 0x26, 0xbe, 0xef, 0x73, - 0x1d, 0x27, 0x8f, 0x36, 0x6d, 0x13, 0x62, 0xfd, 0x16, 0xfb, 0xbe, 0xb0, - 0x03, 0x22, 0xe3, 0x60, 0xca, 0x34, 0xf9, 0xa7, 0xd6, 0x82, 0xd0, 0x5f, - 0x19, 0x14, 0x74, 0xa3, 0x6d, 0xff, 0x06, 0x60, 0x3f, 0xb5, 0x50, 0xf8, - 0x47, 0x2f, 0xc5, 0x9f, 0xbc, 0xcd, 0x8f, 0xd5, 0x7b, 0x33, 0x72, 0xc7, - 0xc6, 0x8a, 0x64, 0x72, 0x4f, 0x3b, 0xfd, 0xf5, 0x62, 0x06, 0xe1, 0x1d, - 0x78, 0x8e, 0x28, 0xe7, 0x43, 0x52, 0x42, 0x5a, 0x93, 0x9f, 0x65, 0xe9, - 0xf6, 0x18, 0x42, 0x45, 0x63, 0xe8, 0x27, 0x44, 0xf4, 0xfa, 0x76, 0x5a, - 0x6b, 0x0d, 0x96, 0x90, 0x7b, 0x3a, 0x40, 0x90, 0xf2, 0x15, 0x9e, 0x81, - 0xa6, 0x39, 0xc2, 0xd8, 0x7c, 0xba, 0xe7, 0xd9, 0x67, 0x73, 0xc8, 0x68, - 0x79, 0xc9, 0xda, 0xb0, 0x5c, 0xa2, 0xbd, 0x0c, 0x50, 0xd3, 0xb4, 0x11, - 0x5d, 0x3c, 0x29, 0xfe, 0xb8, 0x5b, 0xf8, 0x43, 0x87, 0x11, 0x3f, 0x58, - 0x15, 0xac, 0x4a, 0xc4, 0xc6, 0x7f, 0x28, 0xf0, 0x5a, 0x37, 0xe0, 0x93, - 0x2e, 0x51, 0xa3, 0x69, 0x7a, 0x2c, 0x86, 0x43, 0xe2, 0x7a, 0x6e, 0xf9, - 0x90, 0x20, 0x7e, 0xd1, 0x15, 0x41, 0x5a, 0x69, 0xc7, 0xb2, 0x2a, 0x12, - 0x4d, 0x87, 0x76, 0xc0, 0x74, 0xd7, 0x41, 0x4a, 0x54, 0x92, 0xdb, 0x2a, - 0xda, 0x61, 0xbe, 0xa1, 0xe3, 0x76, 0x8d, 0xe4, 0x32, 0x61, 0x8d, 0x1a, - 0xbf, 0xc2, 0xd2, 0x81, 0x72, 0x04, 0xc1, 0x35, 0xdd, 0xa1, 0xdb, 0xa2, - 0xe7, 0xc7, 0xf4, 0xa7, 0xc4, 0x97, 0xbe, 0xec, 0x64, 0x30, 0xb5, 0x54, - 0x74, 0x3f, 0x94, 0x8d, 0xbe, 0x78, 0xd0, 0x86, 0x30, 0x4d, 0x32, 0x03, - 0x46, 0x03, 0x75, 0x00, 0xf0, 0xf2, 0xb6, 0x31, 0x31, 0x66, 0x29, 0xaf, - 0xee, 0xc8, 0xb3, 0x06, 0x01, 0x02, 0x7e, 0x1f, 0x56, 0x6f, 0xec, 0x98, - 0xb6, 0x23, 0x3e, 0x7b, 0xaa, 0xd6, 0xe5, 0xd3, 0x7f, 0x35, 0x79, 0xa5, - 0xf0, 0x97, 0xa7, 0x8a, 0xba, 0x18, 0xba, 0x20, 0x34, 0x4d, 0xe3, 0x98, - 0x42, 0xca, 0xb7, 0xbc, 0xe4, 0x7a, 0xd4, 0x34, 0xef, 0x60, 0xf2, 0x8c, - 0x3c, 0x23, 0x23, 0xeb, 0xdc, 0x85, 0x5d, 0xdc, 0x1b, 0xe8, 0xd0, 0x9d, - 0x77, 0x0a, 0x7e, 0x89, 0xad, 0x22, 0xfe, 0xfe, 0x74, 0x53, 0x5b, 0x97, - 0xcc, 0x31, 0x8c, 0x80, 0x72, 0xe3, 0x66, 0x0f, 0x43, 0xc5, 0x01, 0x11, - 0xd0, 0x70, 0x9e, 0x1b, 0xa2, 0x16, 0xa2, 0xce, 0xb4, 0xd4, 0xfe, 0x89, - 0x1f, 0x42, 0x1e, 0xdd, 0xcd, 0x3e, 0x02, 0x87, 0x70, 0xb5, 0xb1, 0x7d, - 0xe1, 0x20, 0x02, 0xc4, 0x77, 0x20, 0x50, 0x90, 0x35, 0x2a, 0x4d, 0x04, - 0x47, 0x0d, 0x56, 0x0a, 0xf9, 0xe3, 0x0b, 0xfc, 0xae, 0x06, 0x0c, 0x3c, - 0xac, 0x8a, 0xb6, 0x5c, 0xca, 0xbd, 0x86, 0x83, 0xe1, 0x8f, 0xe2, 0x95, - 0xbe, 0x88, 0x31, 0x29, 0x37, 0x3e, 0x8c, 0x11, 0xc1, 0xfd, 0x41, 0x06, - 0x5b, 0xd7, 0xb1, 0x36, 0xbd, 0x9e, 0x09, 0x80, 0x08, 0xd6, 0x31, 0xe7, - 0x43, 0x3d, 0x56, 0x84, 0x12, 0xb5, 0xfc, 0x63, 0x6d, 0x68, 0x6d, 0xcf, - 0xac, 0x2a, 0x02, 0xf6, 0x67, 0x9e, 0x3f, 0xba, 0x47, 0xf9, 0x22, 0x51, - 0x2e, 0x6f, 0xdf, 0x43, 0x4c, 0x97, 0x54, 0xd4, 0xfd, 0xb2, 0x42, 0xa2, - 0x2d, 0x92, 0xbe, 0x4a, 0x00, 0x82, 0x91, 0xea, 0xcc, 0xca, 0x03, 0x0b, - 0xed, 0xee, 0x72, 0x3f, 0xc8, 0x3e, 0xbf, 0xa6, 0x87, 0xdf, 0x63, 0x7a, - 0x83, 0x07, 0x90, 0xdf, 0x47, 0x87, 0x37, 0xc4, 0xbb, 0x10, 0xaa, 0x0c, - 0x53, 0x17, 0x81, 0x75, 0x1e, 0xbe, 0x03, 0xdd, 0x5d, 0xe1, 0x74, 0x72, - 0xcc, 0xb5, 0xb5, 0xbd, 0xd7, 0xd6, 0xf4, 0x3d, 0xfe, 0xd5, 0xd1, 0xa6, - 0xfc, 0x0a, 0xdc, 0x62, 0x18, 0x25, 0xb1, 0x67, 0xbd, 0xed, 0xd5, 0x9a, - 0xaa, 0x89, 0xe8, 0x98, 0x16, 0xfe, 0x41, 0xb5, 0x77, 0xd1, 0x50, 0xfc, - 0x59, 0x4d, 0x04, 0xf0, 0x39, 0x23, 0x97, 0x7e, 0x09, 0x30, 0xaf, 0xf4, - 0x66, 0x6a, 0xc2, 0x54, 0x71, 0x2d, 0x7b, 0x2a, 0xcd, 0x3c, 0x80, 0x79, - 0xc3, 0x3e, 0x5a, 0x1d, 0x4d, 0xfe, 0x92, 0x47, 0x26, 0xa5, 0xfe, 0xfb, - 0xc7, 0xda, 0x3e, 0xc7, 0xa1, 0xe2, 0x0f, 0x91, 0x0a, 0x83, 0xbe, 0x0f, - 0x5c, 0x9a, 0x63, 0x64, 0x7a, 0x5e, 0xb7, 0x5e, 0xad, 0x18, 0xc3, 0x71, - 0x54, 0xc7, 0x53, 0x39, 0xb2, 0x7c, 0xd4, 0x1e, 0x6c, 0xde, 0xeb, 0x62, - 0x5a, 0x3b, 0xdd, 0x15, 0xad, 0xbc, 0x6e, 0x02, 0xb7, 0x21, 0x0e, 0x2f, - 0xcb, 0x3e, 0xad, 0xb2, 0xc4, 0xe3, 0x38, 0x7e, 0x39, 0xf8, 0x1e, 0x28, - 0xe9, 0x6b, 0x89, 0x76, 0xf1, 0xaf, 0xe1, 0x82, 0xe1, 0x58, 0xe5, 0x68, - 0xdc, 0x6e, 0x8e, 0xe0, 0x4a, 0x2c, 0x61, 0x35, 0x11, 0x42, 0xd5, 0x3d, - 0x7d, 0xa0, 0x26, 0x52, 0x59, 0x40, 0xe5, 0xfe, 0x8b, 0x22, 0xe9, 0x3b, - 0x5a, 0x26, 0x5d, 0x9b, 0x93, 0xd0, 0xe6, 0xb8, 0x0a, 0x2e, 0xad, 0xa2, - 0xd2, 0xe9, 0xa4, 0xb6, 0x30, 0xf3, 0x37, 0xb1, 0x19, 0x99, 0xc7, 0x7e, - 0xe5, 0xbf, 0x4a, 0xdb, 0x1d, 0x3f, 0xbf, 0x0a, 0xc9, 0xfc, 0xe3, 0x9f, - 0x00, 0x94, 0xa0, 0x9b, 0xf2, 0x99, 0x1a, 0x1d, 0xe8, 0x93, 0x93, 0xa6, - 0xc4, 0x74, 0x20, 0x3a, 0xf3, 0x5c, 0x9e, 0x8e, 0xba, 0xe7, 0x59, 0xa9, - 0xcd, 0xc9, 0x23, 0x73, 0x44, 0xf0, 0x4b, 0x49, 0xb2, 0xc0, 0xa0, 0xd4, - 0xf2, 0x05, 0xbc, 0xd8, 0x04, 0x1b, 0x6d, 0x6e, 0x6e, 0x25, 0x16, 0xf3, - 0x4e, 0xfc, 0xae, 0x7a, 0xa0, 0x8a, 0x94, 0xbf, 0x0a, 0xe7, 0xd0, 0xca, - 0xa7, 0xa7, 0x4f, 0xc5, 0xbc, 0xe6, 0x5f, 0xec, 0xda, 0x9b, 0xd1, 0xd0, - 0x97, 0x69, 0x8e, 0x0f, 0xea, 0x2c, 0x66, 0x0d, 0x2a, 0x99, 0xb0, 0x4d, - 0x4c, 0x85, 0x55, 0x5d, 0x68, 0xfc, 0x36, 0xce, 0xa7, 0xfc, 0xac, 0x61, - 0x90, 0xf3, 0x88, 0xf4, 0x5d, 0x32, 0x00, 0xae, 0x27, 0xd3, 0xc0, 0xf7, - 0x04, 0xb1, 0x23, 0x66, 0xc2, 0x7e, 0x2b, 0xdc, 0x9e, 0x7f, 0xf6, 0xef, - 0xc8, 0x87, 0x09, 0x56, 0xd7, 0x68, 0x92, 0xef, 0x63, 0x03, 0xb6, 0xac, - 0x14, 0xc3, 0x7d, 0xa8, 0xc1, 0x79, 0x1b, 0xb5, 0x12, 0xa3, 0x30, 0x16, - 0xe4, 0xd3, 0xb3, 0xf2, 0x12, 0xc6, 0x56, 0x7e, 0x54, 0xc9, 0xa9, 0xf6, - 0x84, 0x0b, 0xe2, 0xaa, 0x8c, 0x5e, 0x4d, 0xed, 0x28, 0x97, 0x7d, 0xc2, - 0x28, 0x43, 0xc5, 0x2e, 0xe0, 0x73, 0x16, 0x4b, 0x60, 0x7d, 0x9c, 0x08, - 0x08, 0x46, 0x2f, 0x45, 0x44, 0x79, 0xc8, 0xb7, 0xb8, 0x04, 0x7e, 0x95, - 0x3d, 0x18, 0x6b, 0x89, 0x8f, 0xb0, 0x8e, 0x2c, 0x71, 0x9e, 0x9a, 0xc0, - 0x88, 0x3f, 0x18, 0x4d, 0x25, 0x3e, 0x45, 0x53, 0x2b, 0xad, 0x26, 0x85, - 0xdf, 0x53, 0x4b, 0x58, 0x08, 0x70, 0xd0, 0xfb, 0xd7, 0x57, 0x70, 0x15, - 0x9b, 0x3b, 0xf0, 0xa2, 0x54, 0x41, 0xa4, 0xbb, 0x2e, 0x16, 0xb9, 0x24, - 0x8d, 0x7c, 0xed, 0x39, 0xd9, 0x9e, 0x28, 0x7f, 0xe7, 0x9f, 0x8b, 0xf2, - 0x09, 0x88, 0xdf, 0xdf, 0x32, 0xef, 0xb7, 0x7d, 0x8b, 0xac, 0x9d, 0x82, - 0xcf, 0x82, 0x74, 0x3c, 0x16, 0x9e, 0x9f, 0x39, 0xff, 0x4d, 0x70, 0xce, - 0xa3, 0x16, 0xee, 0x4d, 0xe9, 0x23, 0x75, 0xf7, 0x60, 0x11, 0xa1, 0xcb, - 0x02, 0x3a, 0xa0, 0x4f, 0x12, 0x88, 0x00, 0x00, 0x00, 0x18, 0xe1, 0xb4, - 0x31, 0xe9, 0x60, 0x80, 0x11, 0x4f, 0x1c, 0x1f, 0x3f, 0xa8, 0xbe, 0xc7, - 0x3b, 0xc3, 0x5e, 0xc6, 0x1e, 0x23, 0xbd, 0x5c, 0x99, 0x2b, 0x4e, 0x5c, - 0xac, 0x24, 0xe1, 0x73, 0x4f, 0x24, 0xa3, 0x69, 0xad, 0xa6, 0xe5, 0xff, - 0x02, 0x6a, 0x8c, 0x99, 0x96, 0xa5, 0x8c, 0x35, 0x9e, 0xdf, 0x56, 0xd0, - 0x5f, 0x99, 0xce, 0x32, 0xe2, 0x43, 0x9f, 0xe0, 0x8b, 0x0b, 0xad, 0x05, - 0x8f, 0x0a, 0x1a, 0x0e, 0x04, 0x47, 0x9d, 0x86, 0xd3, 0xdd, 0xd2, 0xd5, - 0x1a, 0xf2, 0x08, 0xe7, 0xfe, 0x99, 0x1b, 0xc7, 0x2d, 0x2b, 0x40, 0x8a, - 0x86, 0xc6, 0x7d, 0x0e, 0x6e, 0xdb, 0x0a, 0xd9, 0x45, 0x5e, 0xd6, 0xc6, - 0x2b, 0x54, 0x97, 0x74, 0xc2, 0xd2, 0xb2, 0x80, 0x04, 0x96, 0x3d, 0x21, - 0x60, 0x3b, 0xf2, 0xc0, 0xda, 0x22, 0xb6, 0x7a, 0x82, 0x7d, 0xd1, 0x53, - 0x7b, 0xd0, 0xd6, 0xb5, 0x97, 0x9c, 0x1e, 0x0e, 0x67, 0xc9, 0x5f, 0x3e, - 0x73, 0x10, 0xc8, 0x43, 0xfd, 0x08, 0x43, 0x03, 0xd3, 0x1e, 0xbc, 0x08, - 0x3f, 0x42, 0xb3, 0x25, 0x9d, 0xa8, 0xed, 0xc2, 0x5b, 0x65, 0x67, 0x11, - 0xc8, 0x9d, 0xd9, 0xab, 0x1e, 0x42, 0x57, 0x18, 0x8d, 0x10, 0x84, 0x65, - 0x36, 0xda, 0x68, 0x03, 0x95, 0xe8, 0x72, 0x01, 0x4f, 0x0a, 0xb4, 0xa4, - 0x2f, 0x4b, 0x84, 0x07, 0x64, 0xdb, 0x77, 0x7e, 0xb8, 0x23, 0x71, 0xef, - 0xae, 0x4f, 0x60, 0x10, 0xc1, 0x31, 0x28, 0x49, 0xdf, 0x32, 0xfb, 0x6a, - 0xd3, 0x9e, 0x29, 0x7e, 0x3e, 0x4c, 0xdf, 0xa7, 0xf0, 0x87, 0x3a, 0x28, - 0xd1, 0xfe, 0xfb, 0x76, 0xf0, 0xd2, 0x25, 0x67, 0x79, 0x55, 0x09, 0x1c, - 0x4e, 0xcb, 0x2c, 0x4c, 0x10, 0xfd, 0x9b, 0x3d, 0x94, 0x90, 0x13, 0xf9, - 0x1c, 0xd6, 0x20, 0x92, 0xc9, 0x4f, 0x1e, 0x84, 0x82, 0x41, 0xbd, 0xc2, - 0x90, 0xae, 0xb4, 0x4b, 0x1a, 0x44, 0xfa, 0x40, 0x6d, 0x4e, 0x0a, 0x01, - 0xe3, 0x8c, 0x35, 0x9a, 0x9f, 0x60, 0xfd, 0x90, 0x40, 0xd8, 0x58, 0x41, - 0xca, 0xa0, 0x70, 0xb6, 0xff, 0xc0, 0x07, 0x92, 0x41, 0xa1, 0x78, 0xc8, - 0x6b, 0x1a, 0x33, 0x88, 0x8d, 0xd1, 0x9c, 0x08, 0x6c, 0xfd, 0x0a, 0x92, - 0x05, 0xdd, 0x4c, 0xae, 0x9d, 0xc2, 0x7d, 0x01, 0x35, 0x6e, 0xa7, 0xf4, - 0x34, 0xa2, 0x11, 0xa8, 0xe9, 0xbb, 0xc5, 0x52, 0x7c, 0x82, 0x42, 0x3e, - 0x41, 0x45, 0x33, 0xed, 0xad, 0xc9, 0x79, 0x14, 0xff, 0xe4, 0x2c, 0x83, - 0xc4, 0xbe, 0x06, 0xfd, 0x06, 0x01, 0x99, 0xf8, 0x0a, 0x53, 0x3e, 0x15, - 0x04, 0x92, 0x56, 0x00, 0xe8, 0x91, 0xbb, 0xb9, 0x9b, 0x00, 0x60, 0xab, - 0x63, 0x54, 0x82, 0x25, 0x63, 0xf1, 0x14, 0x22, 0x58, 0x50, 0x38, 0x7d, - 0x13, 0x60, 0x8f, 0x27, 0x89, 0xc1, 0x9c, 0xa2, 0xd8, 0x0f, 0x9d, 0x0f, - 0x86, 0xf9, 0x8e, 0xa6, 0xb3, 0x3a, 0x3e, 0xce, 0x9f, 0x22, 0x4f, 0x9c, - 0xea, 0x60, 0x25, 0x6f, 0x4e, 0xe0, 0x91, 0x9f, 0x2c, 0x9e, 0x2b, 0x8b, - 0xac, 0xf1, 0x41, 0x6a, 0x82, 0xbc, 0x62, 0x64, 0xda, 0xf1, 0xdf, 0xe2, - 0x23, 0x5d, 0x18, 0x7c, 0xbd, 0x23, 0xfb, 0x67, 0x9e, 0xe4, 0x45, 0x65, - 0x92, 0xec, 0xd4, 0xe3, 0x10, 0x35, 0x84, 0x3b, 0x2d, 0x9c, 0x3f, 0xbb, - 0x50, 0x23, 0xc2, 0x0d, 0xed, 0x2a, 0x34, 0xc9, 0x9e, 0x53, 0x58, 0x8b, - 0x35, 0x1a, 0x81, 0xd9, 0xda, 0xc6, 0x42, 0xbb, 0x8d, 0x56, 0x4b, 0xc1, - 0x70, 0x45, 0x14, 0x75, 0x06, 0xf5, 0x2b, 0xed, 0xeb, 0xce, 0x2d, 0x82, - 0x82, 0x18, 0x19, 0x15, 0xb9, 0x87, 0x40, 0xb7, 0xe7, 0x6d, 0xbc, 0xf2, - 0x41, 0xd0, 0x8f, 0xe0, 0xba, 0x3f, 0x7f, 0xbb, 0x1d, 0xc3, 0xef, 0x5c, - 0xc1, 0xc4, 0x21, 0x90, 0xf2, 0x0c, 0x5d, 0x4e, 0xa9, 0x28, 0x6d, 0x3e, - 0x9a, 0x82, 0x31, 0x52, 0xe4, 0xf9, 0x14, 0x5d, 0x02, 0x0a, 0x22, 0xc2, - 0x63, 0xc0, 0xea, 0x9b, 0x70, 0x2f, 0xa2, 0xb1, 0xc7, 0x31, 0xe1, 0xb0, - 0xd2, 0xe8, 0x14, 0xf8, 0x55, 0x46, 0x22, 0x88, 0x79, 0x89, 0x7a, 0x44, - 0x42, 0xf2, 0xd6, 0x9a, 0xaf, 0x70, 0x86, 0xa5, 0x6b, 0x45, 0x9d, 0xc9, - 0x8f, 0x12, 0xcb, 0x7a, 0xb5, 0x76, 0x46, 0x1f, 0xa1, 0xdc, 0xe1, 0x53, - 0x5e, 0x62, 0xe3, 0x84, 0xf3, 0x5a, 0x00, 0x32, 0xe0, 0x1a, 0x9f, 0x48, - 0x8e, 0x4b, 0x3d, 0xc4, 0x5a, 0xa8, 0x91, 0x49, 0x74, 0xc9, 0x6e, 0x44, - 0x79, 0x5b, 0xf2, 0xc3, 0xb1, 0x58, 0x1f, 0xfc, 0xef, 0x4d, 0x4b, 0x64, - 0x5c, 0xbc, 0x55, 0xfa, 0x76, 0x14, 0x40, 0xdb, 0x60, 0x27, 0x25, 0xfc, - 0x8f, 0xdf, 0x36, 0x74, 0x1c, 0x51, 0x4d, 0xb3, 0x75, 0x13, 0x37, 0xfd, - 0x9b, 0x3c, 0x9f, 0x26, 0x3b, 0xf5, 0xd6, 0x98, 0x9d, 0x23, 0x19, 0x07, - 0xa8, 0xad, 0x69, 0xe9, 0x8a, 0xcb, 0x2f, 0xc2, 0xeb, 0x26, 0x5b, 0x36, - 0xbc, 0x8b, 0xc8, 0x00, 0xdc, 0xf6, 0xba, 0x81, 0xa3, 0xf2, 0xa9, 0x71, - 0x27, 0x43, 0x96, 0x0b, 0x11, 0x91, 0x17, 0x5c, 0x38, 0x74, 0xbe, 0xe1, - 0xb1, 0xbb, 0xec, 0x3b, 0xf2, 0xf4, 0x35, 0xd1, 0x5d, 0x19, 0x0f, 0x6d, - 0xdf, 0x87, 0xf7, 0x44, 0xd8, 0x4d, 0x8a, 0x0f, 0x51, 0x86, 0xca, 0xa3, - 0x2c, 0xa7, 0xad, 0x9b, 0xf6, 0xb6, 0xc4, 0x15, 0xff, 0xf5, 0x33, 0xee, - 0xf5, 0x0d, 0x9d, 0xda, 0x6c, 0xd0, 0xf1, 0xf5, 0x23, 0x08, 0x46, 0x02, - 0x0a, 0x2d, 0xc8, 0x95, 0x56, 0x5c, 0xd4, 0x4a, 0xa1, 0xf2, 0x94, 0xe5, - 0x1e, 0x38, 0xc8, 0x52, 0xfc, 0x46, 0x64, 0xff, 0x24, 0x74, 0xdd, 0x39, - 0x51, 0x98, 0x72, 0x3c, 0xdf, 0xbb, 0x5f, 0x0b, 0x96, 0x63, 0xc0, 0x76, - 0xd8, 0x08, 0xa6, 0xd7, 0x77, 0xd3, 0xd0, 0x9d, 0x7f, 0x76, 0x4d, 0xee, - 0xc3, 0x99, 0xf7, 0x1e, 0x92, 0xf2, 0xe4, 0x85, 0x2c, 0xee, 0x1d, 0xfc, - 0xf6, 0x3c, 0x4b, 0x03, 0x5e, 0xde, 0x17, 0x1b, 0x43, 0xb0, 0xce, 0x0f, - 0x6d, 0x90, 0x42, 0xf2, 0xd6, 0x1d, 0xe7, 0xef, 0xfa, 0x84, 0x44, 0xe5, - 0xaa, 0xf1, 0x32, 0xa9, 0xf1, 0xe1, 0x1f, 0xe3, 0xd2, 0x6d, 0x39, 0x4a, - 0x51, 0xe1, 0x88, 0x38, 0xd2, 0x60, 0xea, 0xf8, 0xf5, 0x9a, 0xa1, 0x69, - 0x5d, 0xa9, 0xdb, 0xeb, 0x1c, 0xc8, 0x90, 0xf2, 0xf7, 0xe7, 0xd2, 0xe2, - 0x2a, 0x23, 0x61, 0x4e, 0xf4, 0x84, 0x71, 0x4d, 0x05, 0xbd, 0x64, 0x29, - 0x6d, 0x76, 0xed, 0x61, 0xfa, 0x92, 0x9d, 0x90, 0x4e, 0x1d, 0xd1, 0x7f, - 0x98, 0xd9, 0x41, 0x04, 0x74, 0x3a, 0x33, 0x5a, 0xcc, 0x1f, 0x3f, 0x25, - 0x72, 0xcc, 0x06, 0xe0, 0x27, 0x86, 0xee, 0xd7, 0x29, 0x14, 0xa5, 0x13, - 0xe9, 0x74, 0x94, 0x62, 0x14, 0x24, 0xe3, 0xa0, 0x2b, 0xc1, 0x48, 0xf6, - 0xb1, 0xd5, 0x74, 0x76, 0x25, 0xef, 0x28, 0x9a, 0x55, 0x2c, 0x4c, 0xfe, - 0xf8, 0x7f, 0xfe, 0x6a, 0x9c, 0xa3, 0xd5, 0x03, 0x5f, 0x71, 0xb2, 0x30, - 0x3a, 0xa7, 0xc4, 0xf2, 0x36, 0x43, 0x01, 0xbd, 0x97, 0xde, 0x8e, 0x4a, - 0x0e, 0x70, 0x41, 0xbf, 0x07, 0xd9, 0x41, 0x11, 0x86, 0x48, 0x66, 0xc1, - 0x95, 0x0f, 0xee, 0x35, 0xdf, 0x13, 0xc0, 0x59, 0xb2, 0x63, 0x28, 0x54, - 0x82, 0xb8, 0xb8, 0xb6, 0xf8, 0xbd, 0xc8, 0xe6, 0x0d, 0xc4, 0xb9, 0xb7, - 0x80, 0x57, 0x56, 0xdb, 0xaf, 0xce, 0x6d, 0x54, 0xb0, 0x62, 0xe1, 0xfd, - 0xab, 0x64, 0xc2, 0x1c, 0x18, 0xd0, 0x7a, 0x3c, 0xfd, 0xa0, 0x98, 0x77, - 0xfe, 0x0f, 0x17, 0x6d, 0x4e, 0x0c, 0x2d, 0x8e, 0x09, 0x97, 0xeb, 0xed, - 0x87, 0xa5, 0x28, 0x7a, 0x9e, 0xc4, 0xd6, 0xfb, 0xd1, 0x2b, 0xd9, 0x60, - 0x56, 0xf9, 0x9a, 0xb7, 0x49, 0xd0, 0xaf, 0xe7, 0xc7, 0x8a, 0xf5, 0x87, - 0x43, 0xc3, 0x85, 0x73, 0xbb, 0x20, 0x2e, 0x99, 0x95, 0xbe, 0xc7, 0xc1, - 0xe2, 0x11, 0x1c, 0xe7, 0x04, 0xe4, 0x70, 0x2e, 0xc4, 0xc7, 0xdf, 0x77, - 0x6c, 0x6a, 0xc5, 0x0b, 0x15, 0x46, 0xee, 0x2d, 0x10, 0x67, 0x3c, 0xc2, - 0x6b, 0xb8, 0x99, 0x8e, 0xc9, 0x33, 0xb3, 0x0c, 0x9f, 0x7b, 0x34, 0x19, - 0xe6, 0x62, 0x85, 0x1e, 0x8c, 0x33, 0x63, 0xb1, 0x38, 0xc4, 0x5c, 0x41, - 0xf5, 0xcc, 0x43, 0xd8, 0xef, 0x26, 0x13, 0xec, 0xf2, 0xd6, 0x71, 0x27, - 0x4b, 0xe1, 0xa9, 0x06, 0xe4, 0x0e, 0xf8, 0xb7, 0x34, 0x4a, 0x14, 0x95, - 0xf8, 0x66, 0xc7, 0xfd, 0xca, 0xd0, 0x2c, 0xcf, 0x24, 0x82, 0x89, 0x96, - 0x3c, 0x6b, 0x34, 0x6b, 0x9a, 0x3c, 0xe3, 0xff, 0x01, 0x01, 0xb2, 0x18, - 0x60, 0x51, 0x30, 0x8c, 0xc6, 0x4d, 0x34, 0x80, 0x17, 0x8e, 0xd3, 0x43, - 0x40, 0x63, 0xab, 0x37, 0x7b, 0x5e, 0x08, 0x15, 0xbb, 0xd1, 0x3a, 0x67, - 0xc3, 0x64, 0x4e, 0x94, 0x0d, 0x6e, 0x12, 0xc9, 0xa8, 0x1c, 0xb7, 0x46, - 0xf8, 0xdf, 0x81, 0xdd, 0xe4, 0xad, 0x39, 0x2a, 0x63, 0xed, 0xad, 0x14, - 0xad, 0xe9, 0x21, 0xfa, 0xe1, 0xf0, 0x78, 0x75, 0xe0, 0xde, 0x7b, 0x6f, - 0xe5, 0x90, 0x52, 0x74, 0x40, 0xc3, 0x87, 0x66, 0x53, 0xff, 0xa0, 0xd1, - 0x79, 0x64, 0xa6, 0x6e, 0x7c, 0xa1, 0x6f, 0xcf, 0x48, 0x91, 0x43, 0xb0, - 0xcf, 0x33, 0x3f, 0x46, 0x40, 0xcc, 0x6d, 0xea, 0x09, 0x09, 0x27, 0xdc, - 0xe5, 0x64, 0x10, 0xca, 0xe1, 0x1f, 0x7e, 0xe4, 0x1f, 0x1e, 0xa2, 0x49, - 0xcd, 0x78, 0x89, 0xb5, 0xf5, 0x26, 0x6b, 0x8b, 0x3e, 0x17, 0x28, 0xe2, - 0xf6, 0xdd, 0xd5, 0xcb, 0x2d, 0x82, 0x8a, 0x3c, 0xbe, 0xba, 0x23, 0x5f, - 0xd5, 0x75, 0x84, 0x77, 0x19, 0xbf, 0xa0, 0xe1, 0x9a, 0x7e, 0x0b, 0xf8, - 0xbd, 0x9f, 0x8a, 0xf8, 0xb5, 0xa1, 0x65, 0x3b, 0xf7, 0x0b, 0x63, 0x53, - 0xf8, 0x7d, 0xa2, 0xe7, 0x41, 0xe3, 0x60, 0xe6, 0xb4, 0x1b, 0xc1, 0x46, - 0x56, 0xad, 0x7c, 0xfb, 0x05, 0x69, 0x33, 0x90, 0xdf, 0x33, 0xef, 0x13, - 0x44, 0x26, 0xae, 0xa1, 0x6b, 0x44, 0xbe, 0x1c, 0xff, 0xed, 0x6b, 0x36, - 0x30, 0x83, 0xce, 0x47, 0x5e, 0xbc, 0x7a, 0x86, 0x84, 0x67, 0x05, 0xf5, - 0x78, 0x95, 0x40, 0x61, 0x55, 0x1b, 0xa2, 0xfa, 0x97, 0x59, 0x54, 0x19, - 0x34, 0x6a, 0xe8, 0xc5, 0xd3, 0x21, 0xb3, 0x11, 0x9d, 0xea, 0x93, 0x01, - 0x96, 0x49, 0xae, 0xa8, 0x15, 0x87, 0xaa, 0xa9, 0xac, 0x38, 0x4a, 0x07, - 0x74, 0xcf, 0x99, 0xc4, 0x58, 0x91, 0xde, 0xc9, 0xec, 0x85, 0xde, 0x1a, - 0x91, 0x04, 0x8c, 0x86, 0xae, 0x29, 0x6e, 0x00, 0x39, 0xa9, 0x1e, 0x8e, - 0x21, 0xba, 0x0f, 0xb3, 0x35, 0xc2, 0xce, 0xfa, 0x93, 0x41, 0x1b, 0xee, - 0x47, 0xf6, 0x09, 0xa1, 0xe9, 0xd9, 0xd0, 0xdd, 0xef, 0xf8, 0x06, 0x3d, - 0xea, 0xaf, 0x7c, 0xff, 0xf2, 0x43, 0x65, 0xd6, 0x81, 0xa8, 0x33, 0xf3, - 0x16, 0x94, 0x46, 0x67, 0xa4, 0x14, 0xbc, 0xe9, 0xd2, 0xd0, 0x17, 0x12, - 0x0a, 0xf8, 0x72, 0x26, 0x66, 0xd6, 0xb6, 0xcc, 0x53, 0x5f, 0x8b, 0x56, - 0xe2, 0x92, 0xba, 0xff, 0x09, 0xf2, 0xe4, 0xc7, 0xd3, 0xd5, 0xb1, 0xf3, - 0x34, 0x8e, 0x60, 0x96, 0x3b, 0x31, 0x00, 0x16, 0x16, 0xac, 0xd8, 0x39, - 0x8b, 0xec, 0xd9, 0x02, 0xfd, 0x3d, 0x7d, 0xe3, 0xda, 0x14, 0x48, 0x17, - 0xe4, 0x95, 0x29, 0xb0, 0x3b, 0x22, 0x96, 0x04, 0x5c, 0xee, 0x17, 0x58, - 0x96, 0x70, 0x77, 0x0c, 0x5e, 0x47, 0x64, 0xe5, 0x42, 0x77, 0xd9, 0x3d, - 0x38, 0xc3, 0xb9, 0x33, 0x6c, 0xff, 0xac, 0x8c, 0x05, 0x4c, 0x42, 0x3d, - 0x13, 0x6d, 0x9c, 0x73, 0x71, 0x60, 0x9f, 0xdc, 0xa4, 0x60, 0x24, 0x7f, - 0x23, 0x01, 0x96, 0x42, 0xb5, 0x04, 0xfe, 0xca, 0xe0, 0x57, 0x73, 0x59, - 0xb4, 0xdf, 0x1d, 0xf0, 0xe6, 0x93, 0x6f, 0x13, 0xd7, 0x66, 0x78, 0xab, - 0xf7, 0xe4, 0xfa, 0xf9, 0x13, 0x5a, 0x68, 0x9f, 0xff, 0x9d, 0xb9, 0xcd, - 0x16, 0x3c, 0x1d, 0x66, 0x7c, 0xb5, 0x91, 0xfc, 0x0a, 0xd7, 0x78, 0x8a, - 0xa1, 0xad, 0xab, 0x7f, 0xd4, 0x63, 0x33, 0x8c, 0x6c, 0xc8, 0x12, 0x10, - 0x78, 0x62, 0x68, 0xf7, 0xba, 0x36, 0xc8, 0x2b, 0x76, 0x72, 0xa3, 0xdc, - 0x8c, 0x03, 0x25, 0x72, 0x97, 0xe7, 0xcb, 0x34, 0xdb, 0x87, 0x2c, 0x34, - 0xa5, 0x92, 0xc0, 0xdc, 0xed, 0xff, 0xf2, 0xca, 0xb6, 0xe7, 0xb4, 0x04, - 0x8d, 0xb0, 0x6a, 0x40, 0x80, 0x14, 0xee, 0xb1, 0x54, 0xb3, 0xf4, 0x6f, - 0x72, 0x1a, 0x91, 0x4e, 0x19, 0x7a, 0x87, 0xed, 0x5a, 0x1e, 0x1c, 0xa4, - 0xc9, 0x59, 0x97, 0x77, 0xc8, 0x36, 0x50, 0x36, 0x0a, 0x8b, 0xd7, 0x89, - 0x14, 0x34, 0xd0, 0xed, 0x88, 0x25, 0x1e, 0x75, 0x40, 0xa1, 0xb5, 0x1a, - 0x9e, 0x5e, 0xd1, 0x65, 0xa7, 0x49, 0x9b, 0xbe, 0xfc, 0xf2, 0xb0, 0xc9, - 0x3d, 0x16, 0x52, 0xc3, 0x0d, 0x51, 0x3d, 0xa4, 0x78, 0x8c, 0x26, 0xb8, - 0x3e, 0xa7, 0x2c, 0xa0, 0x84, 0x69, 0x3f, 0x25, 0x5b, 0xbe, 0x50, 0x8f, - 0x5b, 0x7d, 0xa3, 0xb0, 0xbc, 0xe1, 0xef, 0x6e, 0x86, 0x8c, 0xcb, 0x19, - 0x14, 0x4c, 0x23, 0x4e, 0x35, 0xc6, 0x95, 0x71, 0x1f, 0x1c, 0x68, 0x54, - 0x21, 0x37, 0x08, 0xb1, 0x99, 0xbf, 0x37, 0x42, 0x17, 0x16, 0xff, 0xdd, - 0xe9, 0x42, 0xa2, 0x27, 0x8e, 0x21, 0xdd, 0xd6, 0x6a, 0x3f, 0x80, 0x89, - 0x5a, 0xa7, 0x9c, 0x0f, 0xfa, 0x3c, 0x23, 0x7c, 0xd9, 0x2b, 0xdc, 0xdc, - 0x64, 0x09, 0x7e, 0xab, 0x96, 0x50, 0x53, 0x9c, 0xde, 0xb5, 0x26, 0x3d, - 0x19, 0x48, 0xfb, 0xdd, 0x73, 0x94, 0x7e, 0xcb, 0x84, 0x10, 0xb0, 0xe2, - 0x93, 0xe4, 0x7b, 0x86, 0xc1, 0xbc, 0x55, 0xb7, 0x8d, 0x0e, 0x43, 0xae, - 0x66, 0xec, 0xb6, 0x44, 0xee, 0x5f, 0x16, 0x88, 0x3e, 0xf9, 0xb1, 0xec, - 0x31, 0x24, 0xb5, 0x64, 0x78, 0xb3, 0x24, 0xcf, 0x59, 0x27, 0xac, 0xd0, - 0x53, 0x3a, 0xd3, 0x45, 0xc8, 0x42, 0x97, 0x8f, 0x16, 0x53, 0x5e, 0x0a, - 0xc7, 0x74, 0x82, 0x4f, 0x6f, 0x1e, 0xb2, 0x0d, 0x8e, 0x17, 0xc0, 0xda, - 0xb7, 0xad, 0xc0, 0xf8, 0x87, 0xf4, 0x2d, 0xba, 0xf9, 0x49, 0xcc, 0x40, - 0x4c, 0xac, 0xe5, 0xb2, 0x9e, 0x8f, 0x75, 0xea, 0x0a, 0x0e, 0xf8, 0xf3, - 0xec, 0x0c, 0x26, 0x92, 0x64, 0xeb, 0x83, 0x73, 0xec, 0x76, 0x30, 0x6d, - 0xea, 0xd1, 0x39, 0x84, 0x42, 0x3b, 0xef, 0x86, 0xe2, 0x9e, 0x84, 0xd1, - 0xd2, 0xc6, 0xf7, 0x59, 0x3c, 0xb8, 0x9f, 0xb4, 0x05, 0xc9, 0xe0, 0x0c, - 0x8f, 0x36, 0x82, 0xb4, 0x35, 0x4a, 0x5e, 0x25, 0x38, 0xfe, 0xb3, 0x68, - 0x9a, 0x04, 0xe9, 0x58, 0x6c, 0x93, 0xd3, 0x40, 0xca, 0xf8, 0x8c, 0xb1, - 0x63, 0x0f, 0x03, 0x97, 0x6c, 0x1b, 0x38, 0x71, 0x1b, 0x5d, 0x43, 0xee, - 0xb2, 0xf2, 0x87, 0xe3, 0x97, 0x6e, 0x7c, 0xcc, 0x0c, 0xec, 0xcf, 0x66, - 0xec, 0xd4, 0x64, 0x88, 0xa8, 0xb2, 0x09, 0x2b, 0xae, 0xc1, 0xdd, 0x8b, - 0x90, 0x36, 0x15, 0x53, 0xf3, 0x6d, 0x3b, 0xaa, 0x5f, 0xa7, 0xcc, 0x1c, - 0x0b, 0xde, 0x89, 0xca, 0x71, 0xf2, 0x55, 0xc4, 0xa7, 0xc5, 0xfe, 0x3e, - 0x74, 0xe4, 0xac, 0x9e, 0x47, 0xe8, 0xe2, 0x8f, 0x48, 0x5c, 0x52, 0xf7, - 0x67, 0x18, 0xe1, 0x53, 0x35, 0x45, 0xd4, 0x38, 0x41, 0x34, 0x5a, 0x2b, - 0x55, 0xe7, 0xae, 0x3b, 0x7a, 0xd5, 0x79, 0x34, 0x33, 0x4e, 0xcc, 0x23, - 0x6e, 0x45, 0xe9, 0xd4, 0xf8, 0x84, 0x30, 0x70, 0xa2, 0xc8, 0x30, 0xb7, - 0xdc, 0x8f, 0x93, 0xc3, 0x04, 0x15, 0x50, 0x1e, 0x18, 0x12, 0x28, 0x23, - 0x65, 0xa5, 0x81, 0x0e, 0x52, 0x8a, 0x69, 0x01, 0xa2, 0x29, 0xf5, 0xe4, - 0x36, 0x11, 0x94, 0x1b, 0xc5, 0x5d, 0x6e, 0x3f, 0x1f, 0x16, 0x64, 0x6c, - 0x00, 0x87, 0xfc, 0x05, 0xd1, 0x7a, 0x23, 0xa1, 0xb1, 0xfb, 0x08, 0x24, - 0xa1, 0x61, 0x08, 0x37, 0x44, 0xf2, 0xbf, 0xc1, 0x04, 0x1d, 0x59, 0x16, - 0x67, 0x0a, 0x9c, 0x46, 0x4e, 0x1e, 0xeb, 0x90, 0x09, 0x6c, 0x26, 0xb0, - 0xaa, 0xf8, 0x46, 0xde, 0x3d, 0xac, 0x78, 0x92, 0x3e, 0x20, 0xe0, 0x8b, - 0xad, 0x5e, 0x97, 0xf6, 0x43, 0xb1, 0x99, 0x6c, 0x06, 0x28, 0x71, 0xa5, - 0xad, 0x18, 0xa2, 0x60, 0x5d, 0x37, 0x3f, 0x9e, 0x1f, 0x67, 0xa1, 0x41, - 0x23, 0x44, 0x38, 0x7e, 0x56, 0xde, 0xfd, 0x9d, 0x96, 0x8f, 0x56, 0x20, - 0xe3, 0xa1, 0x67, 0xb8, 0x44, 0xf3, 0xb7, 0x87, 0x47, 0x89, 0x69, 0x90, - 0x5b, 0x9f, 0xbc, 0x51, 0x82, 0x5f, 0x09, 0x30, 0x35, 0x3f, 0xde, 0xda, - 0xef, 0x86, 0x79, 0xb0, 0xf0, 0x9b, 0x32, 0x70, 0x56, 0xdb, 0xfa, 0x7c, - 0xe5, 0x8a, 0xcc, 0xae, 0x0a, 0xef, 0xb8, 0x46, 0x12, 0x0f, 0x5f, 0x75, - 0x0c, 0xf0, 0xb9, 0x94, 0x27, 0x8e, 0x10, 0xc4, 0x61, 0xf3, 0xe9, 0x60, - 0x46, 0x9e, 0x43, 0x33, 0xa1, 0xde, 0xca, 0x43, 0x56, 0x1a, 0x03, 0x1d, - 0x82, 0x69, 0x3f, 0xf1, 0xbb, 0x49, 0x9d, 0x09, 0xb4, 0x17, 0x52, 0x80, - 0x10, 0x23, 0x06, 0xc5, 0xbe, 0x88, 0x39, 0xc1, 0xb2, 0xda, 0x7e, 0xed, - 0x1c, 0x13, 0xc4, 0x38, 0x09, 0xf9, 0x28, 0x31, 0x85, 0xe4, 0x84, 0xc1, - 0x07, 0xb9, 0xea, 0x8c, 0xfa, 0xd9, 0x7f, 0xe4, 0xb9, 0x2f, 0x83, 0x4d, - 0x21, 0xc7, 0x44, 0xe5, 0xa4, 0x96, 0xd4, 0x09, 0xe3, 0xa7, 0xdc, 0x80, - 0x27, 0x50, 0x68, 0x32, 0x27, 0x77, 0xc1, 0x06, 0x69, 0x06, 0xdd, 0x2c, - 0x87, 0x3d, 0xdb, 0xec, 0x5b, 0x4d, 0x31, 0x51, 0x17, 0xbf, 0xf0, 0xbb, - 0x82, 0x52, 0xbf, 0xcd, 0x08, 0x7e, 0x64, 0xeb, 0x5a, 0x3b, 0xfa, 0x26, - 0xc5, 0xcd, 0x25, 0x3a, 0x8d, 0xf2, 0xde, 0x98, 0x50, 0x2e, 0x47, 0x69, - 0x33, 0xaf, 0x79, 0xf9, 0x4b, 0x7d, 0xdf, 0x13, 0xdf, 0x05, 0x94, 0x15, - 0x53, 0x59, 0xce, 0xad, 0xd6, 0xae, 0x05, 0x37, 0x34, 0x5b, 0xc6, 0x11, - 0x19, 0x12, 0xed, 0xd9, 0x3a, 0x72, 0x85, 0xa9, 0x54, 0xab, 0x03, 0xe4, - 0xa4, 0x1e, 0x8b, 0x03, 0x5a, 0x14, 0xa7, 0x52, 0x10, 0x3e, 0x8b, 0xda, - 0x78, 0x3b, 0x09, 0xc9, 0xb3, 0x6f, 0x05, 0x5b, 0xd5, 0x6c, 0x34, 0x3b, - 0xdf, 0x0e, 0xd8, 0x91, 0x4b, 0xd3, 0x87, 0xa1, 0x8a, 0x3e, 0x4f, 0x85, - 0xea, 0x18, 0xa4, 0x6b, 0xe9, 0x90, 0x00, 0xaa, 0x1b, 0x90, 0xfa, 0xe4, - 0x01, 0x8e, 0xb0, 0x86, 0x8e, 0xf6, 0x25, 0xd0, 0x58, 0x77, 0xf1, 0x6e, - 0xd6, 0xe6, 0x82, 0x76, 0xff, 0x8c, 0x56, 0xf4, 0x0f, 0xa9, 0xe6, 0x0c, - 0x91, 0x65, 0xef, 0xd8, 0x23, 0xea, 0x03, 0x80, 0x12, 0xee, 0x1d, 0x9f, - 0xdd, 0xfa, 0xd8, 0x0e, 0x0d, 0x7e, 0x4d, 0x5e, 0xd5, 0x65, 0x15, 0x49, - 0xa8, 0xf2, 0xfd, 0xc3, 0xcc, 0xa4, 0xd9, 0x1f, 0x1f, 0x3b, 0x79, 0x79, - 0xbc, 0x76, 0x23, 0xc8, 0xb9, 0xa1, 0xc9, 0xdc, 0x0f, 0x66, 0x5c, 0x36, - 0x06, 0x95, 0x6e, 0x23, 0x37, 0x4f, 0x8c, 0x84, 0x34, 0x5a, 0x1f, 0x26, - 0x9b, 0xbe, 0xf0, 0xb9, 0x30, 0xff, 0xb8, 0xdd, 0x9a, 0xaa, 0xe1, 0xb2, - 0x85, 0x83, 0x83, 0x77, 0xa7, 0x5f, 0x0c, 0xf7, 0x31, 0x97, 0x70, 0x49, - 0x4f, 0x3d, 0x1f, 0x93, 0x3f, 0x7b, 0x87, 0x56, 0x1d, 0xc8, 0xc6, 0xb4, - 0x75, 0xc4, 0xc5, 0xd5, 0x27, 0xc3, 0xdb, 0xe3, 0x1b, 0xf5, 0xec, 0x83, - 0xb3, 0xa0, 0x2e, 0x25, 0x18, 0x6b, 0x98, 0x21, 0x18, 0x37, 0x09, 0xcd, - 0x03, 0x6a, 0xdd, 0x29, 0x70, 0xf1, 0x13, 0x3f, 0x25, 0x55, 0x75, 0x8c, - 0x2f, 0x3d, 0xec, 0xf1, 0xb3, 0x0c, 0x2d, 0x3e, 0xb3, 0x61, 0x95, 0x0e, - 0xa5, 0xf1, 0xce, 0xd1, 0x75, 0xa2, 0x1b, 0xe8, 0x32, 0x7e, 0xca, 0xc9, - 0x03, 0xb3, 0xd8, 0x99, 0x76, 0xa5, 0xbc, 0xd8, 0xd6, 0x63, 0x28, 0x41, - 0xdc, 0x2d, 0xa2, 0x49, 0x4d, 0x49, 0xe2, 0x7e, 0x36, 0x85, 0x5d, 0x1e, - 0x35, 0xc6, 0x66, 0xdb, 0x61, 0xbc, 0x73, 0xfd, 0x5f, 0xee, 0x3e, 0x95, - 0x01, 0xb0, 0x1d, 0x0a, 0x6b, 0x31, 0x33, 0x6e, 0x27, 0x9b, 0x86, 0x5a, - 0x3f, 0xf6, 0x97, 0xdc, 0x3f, 0x52, 0x5d, 0xec, 0xbf, 0xfd, 0x98, 0xbc, - 0x24, 0x6f, 0x40, 0x37, 0x78, 0x6f, 0x51, 0xe7, 0xa9, 0x9a, 0x02, 0xcc, - 0x5a, 0x93, 0x4f, 0xae, 0x4e, 0xcf, 0xa6, 0x0c, 0x3f, 0x87, 0x4f, 0xf8, - 0x94, 0xa1, 0xa9, 0x5d, 0xa1, 0x40, 0xd8, 0xf5, 0xb9, 0xd6, 0x28, 0x40, - 0x7d, 0xcf, 0x3c, 0x56, 0x36, 0x7f, 0x9f, 0x16, 0x97, 0xb2, 0x30, 0x38, - 0x01, 0x24, 0xce, 0xa1, 0x69, 0x01, 0xf5, 0xbc, 0x82, 0xbe, 0x44, 0xb6, - 0x2b, 0xc4, 0xae, 0x27, 0x2d, 0x91, 0x26, 0x69, 0x39, 0xc3, 0xf0, 0xb7, - 0xb0, 0xaa, 0x9e, 0xad, 0x33, 0xa8, 0x71, 0x76, 0x10, 0xac, 0xa7, 0x24, - 0x97, 0x6c, 0x94, 0x68, 0xff, 0x6a, 0xb4, 0xd0, 0xbf, 0x8c, 0xaf, 0x60, - 0x27, 0x96, 0xbd, 0xfc, 0xec, 0xa6, 0xfb, 0xbd, 0xcf, 0xb5, 0x24, 0xc8, - 0x32, 0xa5, 0x07, 0xce, 0xf3, 0x12, 0x92, 0x9e, 0x2f, 0x94, 0xd9, 0x7b, - 0x43, 0xbf, 0x38, 0x09, 0xff, 0xb5, 0x81, 0xb2, 0x96, 0x3d, 0x1a, 0xfe, - 0x9f, 0x1f, 0x8a, 0x15, 0x5b, 0x97, 0x6b, 0x1f, 0x9b, 0xb2, 0x7c, 0x22, - 0x86, 0xed, 0x85, 0x11, 0xa8, 0x18, 0x3a, 0x52, 0x7a, 0xb5, 0x62, 0xa1, - 0xc4, 0x1a, 0x79, 0x44, 0xc1, 0xd9, 0xb1, 0xc7, 0x6b, 0x36, 0x66, 0xdf, - 0x4a, 0x2a, 0x2b, 0x1e, 0x0f, 0x15, 0x01, 0x63, 0xec, 0x2c, 0x5d, 0x34, - 0x2c, 0x62, 0xb5, 0x6b, 0xcc, 0xe4, 0xcb, 0x2a, 0x11, 0xf7, 0xab, 0x83, - 0xf9, 0x47, 0x69, 0xb9, 0xda, 0x29, 0x75, 0x76, 0x04, 0x4e, 0xe0, 0x11, - 0xd9, 0xea, 0xb7, 0xea, 0x75, 0x92, 0xd6, 0x1b, 0x7d, 0x65, 0xa9, 0x61, - 0x73, 0x2c, 0x08, 0x4e, 0x81, 0x3f, 0x05, 0x8c, 0x96, 0x27, 0x32, 0xdb, - 0x80, 0xbe, 0x2d, 0xa7, 0xb3, 0xcf, 0x49, 0x04, 0xa4, 0x0f, 0x89, 0x61, - 0xf0, 0x5a, 0x85, 0xe1, 0x85, 0x5d, 0x82, 0x39, 0x32, 0x82, 0xf5, 0xb5, - 0x5b, 0x0d, 0x06, 0xcb, 0x30, 0x77, 0x01, 0xfb, 0x36, 0xd9, 0x44, 0x03, - 0xee, 0x89, 0x31, 0xcb, 0x31, 0xa2, 0xd1, 0xcd, 0xbf, 0x52, 0x12, 0x14, - 0xa8, 0xaf, 0xf7, 0x6a, 0xc3, 0x0e, 0x13, 0x20, 0xb6, 0xb3, 0x86, 0xa1, - 0xfc, 0xa8, 0x79, 0x05, 0xe4, 0x3f, 0x5f, 0x30, 0x67, 0x46, 0x01, 0x17, - 0x33, 0xb2, 0xe7, 0x49, 0xea, 0xd9, 0x58, 0xa2, 0xfe, 0x22, 0xcc, 0x53, - 0xd6, 0x76, 0x6b, 0x3c, 0xcb, 0xed, 0x87, 0x53, 0x83, 0xbf, 0x60, 0x5d, - 0x42, 0x8d, 0x28, 0xcb, 0x13, 0x04, 0xd2, 0x0c, 0xde, 0x98, 0xa0, 0x35, - 0xed, 0x63, 0xde, 0x9a, 0xda, 0xf1, 0xce, 0xb1, 0x70, 0xeb, 0xb3, 0x7b, - 0x3c, 0xc9, 0x85, 0xdf, 0x10, 0xbe, 0xf3, 0xbb, 0x42, 0xee, 0x71, 0x60, - 0x76, 0xc7, 0x29, 0x2b, 0xc3, 0xf3, 0x76, 0xde, 0xb1, 0xb7, 0xf2, 0xe2, - 0xf8, 0x37, 0xce, 0x1f, 0x26, 0xf4, 0xc1, 0x0a, 0x2e, 0x33, 0x36, 0x0a, - 0x7a, 0xf9, 0x99, 0x06, 0x61, 0xd5, 0xad, 0xa0, 0x59, 0x64, 0x77, 0x78, - 0x3b, 0xb6, 0x51, 0x2a, 0xc4, 0x7e, 0xe6, 0xc5, 0x17, 0x59, 0x6c, 0x50, - 0x96, 0x06, 0x92, 0x76, 0xa2, 0x11, 0xad, 0xfe, 0xaf, 0x02, 0x9d, 0x70, - 0x46, 0xe3, 0x6d, 0x9c, 0x63, 0xa4, 0x76, 0x23, 0xb2, 0x5f, 0xc0, 0xad, - 0x30, 0x50, 0xad, 0x14, 0x09, 0xc3, 0x4c, 0x72, 0x2c, 0xe5, 0x78, 0xfd, - 0x38, 0x60, 0x8c, 0x98, 0x7d, 0xd8, 0x04, 0xc0, 0xf0, 0xcb, 0x33, 0xc4, - 0xd1, 0x55, 0x97, 0xc3, 0x3c, 0xdb, 0xea, 0x8d, 0x5e, 0xec, 0x48, 0x5d, - 0xbd, 0xc4, 0xae, 0x72, 0xef, 0x5d, 0xf4, 0x7e, 0x4e, 0x3f, 0x5b, 0x16, - 0x84, 0x36, 0x62, 0xce, 0x0e, 0x6a, 0xcb, 0xae, 0x44, 0xdb, 0xf7, 0xa6, - 0xf4, 0x60, 0x99, 0xd2, 0x82, 0x3d, 0xe7, 0xfc, 0xef, 0x38, 0x4b, 0x15, - 0x91, 0x41, 0x34, 0x42, 0x73, 0x2b, 0x8c, 0xd1, 0x76, 0xf8, 0x24, 0x08, - 0x0f, 0x46, 0x7a, 0x73, 0xd3, 0x13, 0xb8, 0x06, 0x2f, 0x1e, 0x3b, 0xe0, - 0x2d, 0xcc, 0xd8, 0x35, 0xa2, 0x55, 0x4f, 0x3c, 0xd7, 0xb5, 0x68, 0x8f, - 0x07, 0x09, 0x7e, 0x1e, 0xd8, 0xa3, 0xe3, 0xb0, 0x0c, 0x58, 0x50, 0xdc, - 0xfc, 0x57, 0xb1, 0xea, 0xab, 0x43, 0x10, 0x78, 0x8e, 0xfb, 0x13, 0xb8, - 0x26, 0x3d, 0xc8, 0xcb, 0x18, 0x29, 0x95, 0x2f, 0x29, 0x12, 0x56, 0x8e, - 0x56, 0xa3, 0xce, 0xdd, 0x25, 0x92, 0x7c, 0x43, 0xce, 0x3d, 0x57, 0xb1, - 0x29, 0xb3, 0x17, 0xd0, 0xf5, 0x8e, 0xf8, 0x64, 0x63, 0x5a, 0xc4, 0x26, - 0xfe, 0x7d, 0xf7, 0x9b, 0xb0, 0x35, 0xb1, 0x5f, 0x1c, 0xf2, 0x5b, 0xec, - 0xad, 0x04, 0x8e, 0xa5, 0x9a, 0xd8, 0x21, 0xe3, 0xdd, 0x4c, 0x59, 0xf0, - 0x9b, 0xcd, 0xaf, 0x4f, 0xc6, 0x8d, 0x11, 0x6a, 0xfb, 0xdf, 0xcf, 0x4a, - 0x7d, 0x30, 0x3a, 0x1b, 0x52, 0xa3, 0x95, 0x0d, 0xc4, 0xce, 0xf4, 0xf8, - 0xff, 0x6c, 0x86, 0xa4, 0x63, 0x79, 0xcd, 0xcd, 0x40, 0xfd, 0xdc, 0x79, - 0x33, 0x97, 0xcc, 0x18, 0xc8, 0x12, 0xa2, 0x0f, 0xf9, 0x34, 0x7b, 0x07, - 0x6c, 0x6b, 0xc8, 0xa3, 0x4d, 0x02, 0x6c, 0xc8, 0x9e, 0x27, 0x62, 0x2d, - 0x90, 0x10, 0x9f, 0x25, 0xe0, 0x4f, 0xeb, 0xaf, 0x14, 0xd0, 0xff, 0x5d, - 0xd4, 0xb0, 0xec, 0x6e, 0x90, 0x78, 0x78, 0x58, 0x5c, 0xaf, 0x06, 0xe0, - 0x8c, 0x8b, 0x44, 0x22, 0x79, 0xc8, 0x97, 0xee, 0x71, 0xb2, 0x6b, 0x7a, - 0x45, 0x6a, 0x4b, 0xfe, 0x3c, 0x51, 0xcf, 0x87, 0x65, 0xd1, 0x51, 0x0c, - 0xed, 0x23, 0xe7, 0x97, 0xd6, 0xb4, 0xad, 0xcb, 0xce, 0x56, 0xb2, 0xb4, - 0x7c, 0x3a, 0x82, 0xef, 0xfb, 0xc9, 0x91, 0xb2, 0x84, 0x5d, 0xfd, 0xac, - 0xd2, 0x30, 0xda, 0xc8, 0x5c, 0x15, 0xfd, 0x91, 0x1f, 0x24, 0xd4, 0x76, - 0xe7, 0xcf, 0x92, 0xfa, 0x9c, 0x13, 0x1c, 0xf8, 0x24, 0x14, 0x62, 0x2a, - 0x5f, 0x40, 0x9f, 0x16, 0x17, 0x05, 0xc0, 0xa7, 0x67, 0x72, 0x82, 0xc2, - 0xda, 0x05, 0x69, 0x56, 0xff, 0xd5, 0x5a, 0xe7, 0xd0, 0xf1, 0x75, 0xeb, - 0xec, 0xf5, 0x2f, 0xb1, 0x5b, 0x27, 0xb3, 0x54, 0x02, 0x41, 0x9f, 0xd4, - 0x50, 0x7d, 0xbf, 0xfa, 0xc9, 0xc8, 0x7a, 0xb8, 0xe6, 0x9b, 0x3b, 0x28, - 0x32, 0x6f, 0x72, 0x09, 0x04, 0x3e, 0xf8, 0xd8, 0xb3, 0xed, 0xa7, 0x25, - 0xf8, 0x90, 0xfd, 0xcb, 0x40, 0xe8, 0x7a, 0x2c, 0x2b, 0xcc, 0x53, 0xd4, - 0xab, 0x2c, 0x83, 0xae, 0x77, 0xf6, 0x9c, 0x48, 0x1e, 0x71, 0x8e, 0x78, - 0x4d, 0x0b, 0x2e, 0x0d, 0x53, 0x71, 0xc6, 0x56, 0x69, 0x83, 0x34, 0xa1, - 0xca, 0x95, 0x93, 0x10, 0x77, 0x3e, 0xc4, 0xac, 0x8e, 0xcd, 0xf0, 0x15, - 0xa2, 0xc5, 0x8e, 0xf1, 0x99, 0xf6, 0x49, 0x62, 0x4c, 0x1a, 0x25, 0x7a, - 0xb0, 0xaf, 0x0a, 0x4f, 0xa1, 0xee, 0x4d, 0xd4, 0x4e, 0x2b, 0x31, 0x77, - 0x86, 0x21, 0xd1, 0xa1, 0xf6, 0x6a, 0x93, 0x48, 0x49, 0xd8, 0x54, 0xe8, - 0x48, 0x28, 0x3f, 0x1c, 0xe6, 0x8d, 0xd6, 0xeb, 0x75, 0xd7, 0xc1, 0x69, - 0x3e, 0xf3, 0xce, 0x4c, 0xb2, 0x03, 0x82, 0x22, 0x91, 0x2f, 0x07, 0x97, - 0x23, 0x67, 0x3d, 0x62, 0xb4, 0x4a, 0xdf, 0xcf, 0x86, 0x10, 0x11, 0x14, - 0x14, 0x2c, 0xa7, 0xaa, 0x26, 0x1d, 0x37, 0xd1, 0x27, 0x85, 0xa8, 0xca, - 0xff, 0x50, 0xff, 0x93, 0x5f, 0x40, 0x5a, 0x4a, 0x02, 0xe5, 0xe7, 0x4b, - 0x56, 0x50, 0x5b, 0x1a, 0x95, 0xbc, 0xa8, 0x91, 0x46, 0x4e, 0x3a, 0xb3, - 0x76, 0xeb, 0xc4, 0x8e, 0x2c, 0x03, 0xe0, 0x4f, 0x3a, 0x01, 0xf5, 0xdf, - 0x84, 0xe9, 0xc8, 0x67, 0xc4, 0x6c, 0x65, 0x09, 0x22, 0x71, 0xf7, 0x6b, - 0xf7, 0x6e, 0xe2, 0xeb, 0xcf, 0x02, 0xd2, 0x3c, 0xac, 0xb1, 0x8b, 0xde, - 0x8e, 0x84, 0xaf, 0x74, 0x52, 0xb1, 0x52, 0xec, 0xab, 0x8d, 0xe3, 0xb0, - 0xd3, 0x25, 0x9b, 0x22, 0x63, 0x39, 0xae, 0x4b, 0xf9, 0x4b, 0x53, 0x2e, - 0x5e, 0xb6, 0xa5, 0xc8, 0x09, 0x03, 0x2e, 0xeb, 0x1e, 0x50, 0xf0, 0xd8, - 0x92, 0x75, 0x3e, 0xf2, 0xb7, 0x24, 0x10, 0x5e, 0xcb, 0x8c, 0x08, 0x1f, - 0x07, 0x5f, 0x2a, 0xef, 0x18, 0xec, 0x7a, 0x6d, 0x38, 0x12, 0x4a, 0xa5, - 0x8e, 0x3d, 0xc6, 0x64, 0x80, 0xfc, 0x2c, 0x2b, 0xb7, 0x08, 0xc0, 0x88, - 0x15, 0xe9, 0xe8, 0x42, 0xbc, 0xbb, 0x40, 0x3f, 0x90, 0xee, 0xa8, 0x98, - 0xda, 0x24, 0x39, 0x4c, 0x1a, 0xe2, 0x85, 0x3b, 0x03, 0x2c, 0x4e, 0x18, - 0xe8, 0xff, 0x37, 0x81, 0xd6, 0x83, 0xce, 0x0a, 0xf1, 0x80, 0xb1, 0x8c, - 0x38, 0x1e, 0xbf, 0x3f, 0xb9, 0x39, 0x43, 0xf4, 0xcc, 0x1b, 0x9f, 0x97, - 0x6b, 0x15, 0xe4, 0x0f, 0x71, 0x66, 0x10, 0xda, 0xe9, 0x2d, 0x27, 0x77, - 0x00, 0x3f, 0x1a, 0xd5, 0xba, 0x3d, 0x39, 0x72, 0xc1, 0xa5, 0xb2, 0xc6, - 0x1f, 0xba, 0x72, 0x07, 0xd4, 0x09, 0xb4, 0x8f, 0x61, 0x04, 0x18, 0xc4, - 0x31, 0xbc, 0x92, 0xce, 0x5d, 0xf1, 0x7a, 0x53, 0xa1, 0xdc, 0xd9, 0xf6, - 0x3b, 0x59, 0xe6, 0xb7, 0x56, 0xcc, 0x98, 0x54, 0xbf, 0x56, 0xf8, 0x78, - 0x4e, 0xf7, 0x48, 0xc4, 0x65, 0x8a, 0xe9, 0x97, 0x83, 0xe0, 0x58, 0xd1, - 0x70, 0x3b, 0xa6, 0x73, 0x1b, 0x00, 0x9a, 0xe9, 0xaa, 0x13, 0x95, 0x83, - 0x85, 0xa8, 0x76, 0x44, 0xcb, 0xbc, 0x9c, 0xce, 0xa8, 0xa8, 0x02, 0x4b, - 0x63, 0x21, 0x56, 0x18, 0x61, 0x3d, 0x5b, 0xad, 0x77, 0x31, 0xc1, 0x68, - 0x10, 0x50, 0x01, 0x80, 0x1e, 0x13, 0x0f, 0x68, 0xae, 0xe2, 0x6a, 0xca, - 0x88, 0x0a, 0xdf, 0x36, 0xfe, 0x96, 0x35, 0x43, 0xc3, 0xfb, 0x9d, 0xdc, - 0x16, 0x7f, 0x28, 0x44, 0xdc, 0xb4, 0x29, 0x13, 0x99, 0xf2, 0xea, 0x1e, - 0x52, 0xcc, 0x2b, 0x25, 0xb1, 0xd4, 0xf0, 0x61, 0x59, 0x1d, 0xc3, 0x22, - 0x0a, 0x2a, 0x92, 0x8b, 0x7b, 0xbf, 0xf6, 0x52, 0x41, 0x10, 0x54, 0x13, - 0xcf, 0x14, 0xf5, 0xea, 0x08, 0x35, 0x35, 0x8e, 0xb4, 0xa3, 0x4e, 0x6d, - 0x3e, 0x9e, 0xc3, 0x2d, 0xff, 0xbc, 0xa3, 0x44, 0xf1, 0xa0, 0xa1, 0x5d, - 0x7d, 0xfe, 0x8a, 0x15, 0xa0, 0xa3, 0x8d, 0x8d, 0xbe, 0x0f, 0x3d, 0x19, - 0x70, 0x9e, 0x7c, 0xbd, 0x63, 0xe7, 0x9f, 0xa9, 0xbb, 0x63, 0x0e, 0x6f, - 0x20, 0x78, 0xac, 0xf9, 0x37, 0x46, 0x39, 0x5e, 0x69, 0xe7, 0xa3, 0xf9, - 0xca, 0xdd, 0xde, 0x10, 0x8a, 0x39, 0xdd, 0x92, 0xb7, 0xf9, 0x17, 0x46, - 0x18, 0xed, 0x84, 0x20, 0xb8, 0x93, 0x36, 0x6e, 0x69, 0x35, 0x0c, 0x3c, - 0x37, 0xf9, 0x65, 0x59, 0x54, 0x2d, 0x70, 0x5b, 0x6f, 0xde, 0xa2, 0x1b, - 0x80, 0x2f, 0xfa, 0x8c, 0x22, 0xb0, 0x66, 0x7c, 0x39, 0xf7, 0x06, 0xcd, - 0xe3, 0x89, 0xa8, 0xc1, 0xe0, 0xc4, 0xdc, 0x79, 0x7d, 0xa0, 0x5d, 0x26, - 0x7c, 0xa8, 0x71, 0x48, 0xc2, 0x43, 0x28, 0x2e, 0xab, 0x02, 0x3a, 0xad, - 0x37, 0xb1, 0xb8, 0x17, 0xa4, 0xaa, 0xdc, 0x20, 0x38, 0x39, 0xb0, 0x82, - 0x80, 0x58, 0x80, 0xd2, 0x2f, 0x10, 0xd5, 0x8b, 0x59, 0xbd, 0x25, 0x7c, - 0x41, 0x5b, 0x0a, 0xdc, 0xde, 0x38, 0xc2, 0x62, 0xdc, 0x77, 0xa3, 0x79, - 0x0d, 0x94, 0xa3, 0x10, 0x4a, 0x39, 0xfb, 0x1b, 0xa7, 0x7f, 0x8c, 0x96, - 0x18, 0xd0, 0x0c, 0x2a, 0x23, 0x78, 0xa9, 0x4d, 0x88, 0x33, 0x58, 0xc8, - 0xfc, 0x25, 0x13, 0x8b, 0x0f, 0x11, 0xf2, 0x83, 0x76, 0xb8, 0x4e, 0xad, - 0x4d, 0x53, 0xdd, 0xbe, 0xed, 0xc8, 0xc2, 0xea, 0x51, 0x7b, 0xd8, 0x38, - 0x73, 0x3a, 0x34, 0x40, 0x38, 0x99, 0x51, 0x7b, 0xa8, 0x05, 0xf0, 0xb6, - 0x70, 0xce, 0x3d, 0xd6, 0x9a, 0x99, 0x1d, 0x3c, 0x96, 0xe6, 0x2f, 0x51, - 0x16, 0xe0, 0xf4, 0xca, 0x1d, 0x39, 0x30, 0xd9, 0x43, 0x33, 0x8d, 0xe1, - 0x47, 0x2e, 0xfc, 0x69, 0xa2, 0x49, 0x8b, 0xb3, 0xb4, 0x86, 0x6d, 0x35, - 0x25, 0xe7, 0xbb, 0xbe, 0x5c, 0x8e, 0x24, 0x18, 0xfd, 0xbe, 0x0a, 0x8b, - 0x7b, 0x59, 0x65, 0x1b, 0x79, 0xf8, 0x9f, 0x31, 0xb8, 0x69, 0xb2, 0x7d, - 0xce, 0x5c, 0x87, 0x0d, 0x76, 0x7a, 0xa7, 0xe8, 0x5a, 0xa8, 0x78, 0x53, - 0x0b, 0xfd, 0x81, 0x5d, 0x97, 0x2a, 0x20, 0xfd, 0xf0, 0x14, 0x2b, 0xd8, - 0x38, 0x09, 0xf9, 0x22, 0xd4, 0x56, 0x3d, 0xca, 0xd6, 0x01, 0x1a, 0x3b, - 0x50, 0x3f, 0x3e, 0x3d, 0x2c, 0x5a, 0x24, 0xd7, 0x2f, 0x60, 0x1e, 0x70, - 0xd5, 0xb6, 0x9f, 0x7e, 0x6e, 0x0f, 0x27, 0x9d, 0x53, 0x72, 0xc6, 0xb1, - 0xf8, 0x6c, 0xb1, 0x0f, 0xd2, 0x53, 0x6f, 0x6b, 0x2f, 0x27, 0x4d, 0x44, - 0x8f, 0xb0, 0x3b, 0xf6, 0xa5, 0xa2, 0xf1, 0x54, 0x9b, 0xad, 0xaf, 0xb6, - 0x01, 0x55, 0x6a, 0xb1, 0x0c, 0xcd, 0x86, 0x53, 0x03, 0x63, 0xaa, 0xa6, - 0x94, 0x3b, 0xb7, 0xc6, 0xb8, 0xde, 0x5e, 0xed, 0xbb, 0x1f, 0x20, 0x86, - 0x6e, 0xd2, 0x36, 0xb1, 0x98, 0x75, 0xeb, 0xde, 0xf6, 0x26, 0x90, 0xbd, - 0x0a, 0xe2, 0x21, 0x23, 0x14, 0x95, 0x0f, 0xfa, 0xf5, 0x8a, 0x5b, 0xaa, - 0x00, 0x51, 0x84, 0x1e, 0x12, 0x02, 0x62, 0x8c, 0x87, 0x40, 0x13, 0x1b, - 0x72, 0x49, 0x1a, 0x07, 0xa0, 0x73, 0xef, 0xc5, 0xfb, 0x44, 0x67, 0xb7, - 0x30, 0x8f, 0x2f, 0xd2, 0x22, 0xfa, 0x07, 0xff, 0x8d, 0xad, 0xd2, 0x6b, - 0x79, 0xf3, 0xdb, 0xcb, 0xc4, 0xf4, 0x19, 0x8a, 0xa8, 0xfe, 0x13, 0x09, - 0xc1, 0xcd, 0x2f, 0x0c, 0x69, 0xb5, 0xf6, 0x2f, 0x8d, 0xb6, 0x6a, 0xb0, - 0x9e, 0x7a, 0xa7, 0x4a, 0x84, 0x53, 0x7d, 0x1c, 0xc9, 0x32, 0x2f, 0xe2, - 0x81, 0x59, 0xe8, 0xf9, 0x53, 0x1e, 0xc8, 0xb4, 0xd8, 0x10, 0xca, 0x23, - 0xc9, 0x3a, 0x02, 0x04, 0xa1, 0x39, 0xc2, 0xa9, 0x30, 0x69, 0x92, 0x0c, - 0x56, 0x8e, 0x48, 0x59, 0x51, 0x9a, 0x25, 0x77, 0x00, 0x15, 0xbe, 0x78, - 0x33, 0x1b, 0x8b, 0x1b, 0xca, 0x78, 0xe1, 0x35, 0x2e, 0x33, 0xa2, 0x75, - 0x72, 0x18, 0x9c, 0x2f, 0xe7, 0xad, 0x1a, 0x3b, 0x23, 0x05, 0xa2, 0xa9, - 0x06, 0x90, 0x89, 0xa9, 0x7d, 0xe2, 0x6f, 0x44, 0xc7, 0x08, 0x91, 0x88, - 0xbe, 0xce, 0x4b, 0xdd, 0xab, 0x25, 0x5d, 0x4c, 0xbb, 0x13, 0x26, 0x73, - 0xc0, 0x95, 0x1d, 0xd1, 0x16, 0x68, 0x00, 0x16, 0x83, 0x65, 0x97, 0xc6, - 0xf3, 0x05, 0x35, 0xf0, 0xcc, 0x01, 0x36, 0xe1, 0x5b, 0xd5, 0xc0, 0x0b, - 0x8b, 0x5b, 0x1f, 0x83, 0x86, 0xda, 0x1e, 0x7d, 0x0c, 0xbf, 0xc9, 0xf1, - 0xa0, 0x21, 0x04, 0xd2, 0x0a, 0x12, 0xce, 0x11, 0x13, 0x73, 0x66, 0x46, - 0x41, 0x2d, 0x1c, 0x93, 0x71, 0xe7, 0x06, 0x67, 0x00, 0x49, 0xcc, 0x57, - 0x86, 0xf8, 0x35, 0x47, 0xe6, 0xe4, 0x0e, 0x78, 0x58, 0xec, 0x52, 0xa0, - 0x2b, 0x2a, 0xbe, 0x4e, 0xd6, 0x6f, 0x3a, 0x19, 0xed, 0x21, 0x78, 0x3b, - 0x27, 0x57, 0x42, 0x0a, 0x3c, 0x01, 0x14, 0x65, 0xb6, 0x61, 0xcf, 0x82, - 0x8a, 0xa7, 0x29, 0x29, 0x53, 0x0d, 0x90, 0x99, 0x3c, 0xf2, 0xc6, 0x10, - 0xb5, 0x5a, 0x86, 0x20, 0x34, 0xfb, 0x70, 0x6d, 0xcc, 0xeb, 0x36, 0xa1, - 0x84, 0xf7, 0x9f, 0x75, 0x1e, 0xb1, 0x7b, 0xe6, 0x99, 0xd0, 0x62, 0xb2, - 0xc3, 0x68, 0x18, 0xcf, 0xba, 0xcb, 0xf2, 0x83, 0x5b, 0x36, 0x7d, 0xc6, - 0x59, 0x09, 0x85, 0xad, 0x52, 0x47, 0x59, 0x28, 0x2b, 0x90, 0x8c, 0x71, - 0x0f, 0x34, 0x80, 0xc4, 0x3a, 0xb4, 0x5f, 0x50, 0xb3, 0x08, 0x47, 0x5f, - 0x81, 0x52, 0x71, 0x78, 0x5e, 0xba, 0x5b, 0x54, 0xc5, 0xa3, 0x9d, 0x55, - 0xb7, 0x86, 0x4e, 0x84, 0x6d, 0x34, 0xdf, 0x29, 0x15, 0x3a, 0x38, 0x77, - 0xab, 0xc4, 0x8e, 0xa2, 0x55, 0xed, 0x2b, 0x83, 0xe9, 0xaf, 0xe3, 0xe3, - 0xc2, 0xc2, 0x46, 0x80, 0xad, 0x54, 0x09, 0x4f, 0x1c, 0x71, 0xa4, 0xf0, - 0x91, 0x01, 0x41, 0x6d, 0xea, 0x01, 0xc8, 0xef, 0xfc, 0x85, 0x1e, 0xff, - 0xef, 0xfc, 0xc6, 0x67, 0x8b, 0x67, 0xce, 0x67, 0xc9, 0x74, 0x3c, 0xd5, - 0x17, 0xc4, 0xd4, 0x67, 0x5f, 0x30, 0xe9, 0x71, 0xa0, 0xd3, 0x13, 0x9b, - 0x65, 0x90, 0x3b, 0xec, 0xac, 0x69, 0xa3, 0x50, 0xa8, 0x6e, 0xc2, 0xdc, - 0x12, 0x21, 0x7e, 0x71, 0xd0, 0xef, 0xaf, 0xec, 0x6d, 0x69, 0x48, 0xed, - 0x6f, 0x8b, 0x87, 0x4b, 0x63, 0x12, 0x30, 0x96, 0x51, 0x12, 0xb8, 0xf8, - 0x27, 0xdc, 0x92, 0x19, 0xaf, 0xc7, 0x70, 0x81, 0xf4, 0xb3, 0xa3, 0xeb, - 0xf5, 0x5f, 0x8a, 0x36, 0x31, 0xe4, 0x08, 0x2d, 0x2f, 0x30, 0x6c, 0xad, - 0x57, 0xb8, 0x1a, 0x47, 0x9e, 0x67, 0x2f, 0x89, 0xb0, 0x93, 0x6e, 0x9f, - 0xeb, 0x62, 0xe5, 0xcc, 0x55, 0xcc, 0xf1, 0x81, 0xcc, 0x94, 0xae, 0x7b, - 0x92, 0x96, 0xb9, 0x5a, 0x85, 0x0b, 0x1f, 0x85, 0xc5, 0x15, 0x0e, 0xff, - 0xbf, 0xd8, 0x18, 0xf3, 0x19, 0xe4, 0x5d, 0x7f, 0xb3, 0xb4, 0x38, 0x84, - 0x99, 0x51, 0xd8, 0x1e, 0x1c, 0x64, 0xbf, 0x01, 0x4d, 0x47, 0x7f, 0x1e, - 0x15, 0xa6, 0x4d, 0xf2, 0xc3, 0xdc, 0xfd, 0xe9, 0x1b, 0x82, 0xd3, 0xb4, - 0xa3, 0x8a, 0x4a, 0x86, 0x7c, 0xe9, 0xa1, 0x17, 0x60, 0xdf, 0x03, 0x83, - 0x34, 0xe9, 0xf0, 0x14, 0xd4, 0x18, 0x0b, 0x32, 0x5a, 0xe6, 0x58, 0xd8, - 0x12, 0xbc, 0xfb, 0xf8, 0x26, 0x01, 0x87, 0x04, 0xcc, 0xc2, 0x8f, 0xa8, - 0x05, 0x3c, 0x12, 0xdb, 0x55, 0xe1, 0x7b, 0x47, 0x8a, 0x41, 0x9b, 0xd4, - 0xf0, 0x33, 0xd5, 0xb7, 0x09, 0xff, 0x28, 0x35, 0x33, 0x34, 0x53, 0xfb, - 0x51, 0x72, 0xc3, 0x77, 0xa5, 0x02, 0xe0, 0x78, 0xc2, 0x4d, 0x0a, 0x10, - 0xbc, 0xf5, 0x80, 0x0b, 0xdb, 0x0c, 0x79, 0x0b, 0xd5, 0xad, 0x1e, 0x3a, - 0x09, 0x5e, 0x17, 0x90, 0x71, 0x70, 0x75, 0x14, 0xa4, 0xd6, 0xdb, 0x5a, - 0x54, 0x5d, 0x84, 0x1a, 0xc6, 0xf0, 0xc6, 0x60, 0xb0, 0x43, 0x71, 0x25, - 0xfe, 0xaf, 0xbc, 0x01, 0xe3, 0x86, 0x56, 0x42, 0x15, 0x6f, 0x27, 0xfd, - 0x28, 0xcb, 0xcb, 0xbb, 0xca, 0x5a, 0xc7, 0x68, 0xb1, 0xd1, 0x53, 0x62, - 0xda, 0x15, 0x01, 0xea, 0x6e, 0x08, 0x8f, 0x3d, 0xcf, 0x9e, 0x2d, 0x88, - 0xd7, 0x0e, 0xb0, 0x13, 0x2b, 0x5b, 0xd3, 0x3f, 0x58, 0x92, 0x5d, 0xb8, - 0xb1, 0x24, 0xeb, 0xa4, 0xaf, 0x71, 0xac, 0x86, 0x1d, 0x20, 0x8f, 0x12, - 0x72, 0x54, 0xac, 0xf5, 0x88, 0x5c, 0xbe, 0xa2, 0xc9, 0xe6, 0x0b, 0x46, - 0xf5, 0x45, 0xd5, 0x2e, 0xc4, 0xc1, 0x8d, 0x4f, 0x2b, 0x7a, 0xc0, 0x0e, - 0xd8, 0xf4, 0x2b, 0x59, 0x64, 0x85, 0xa3, 0x2a, 0xbc, 0xa9, 0xce, 0x79, - 0x68, 0xc8, 0xc1, 0xf1, 0x6e, 0x8d, 0xcb, 0x2a, 0xbf, 0xa8, 0xaf, 0x15, - 0x11, 0x9f, 0x1d, 0xc7, 0xc1, 0x4e, 0x8a, 0x39, 0xfe, 0xb3, 0x5d, 0x6b, - 0x8b, 0xf7, 0x11, 0x99, 0xc0, 0x7a, 0x62, 0x94, 0xd8, 0xbb, 0xe4, 0xe9, - 0xa0, 0xb7, 0x5d, 0x96, 0x3b, 0x48, 0xae, 0x94, 0x4b, 0x2e, 0xba, 0x63, - 0xbc, 0x68, 0x5a, 0xe4, 0xa6, 0x67, 0x0b, 0x7b, 0x0f, 0x60, 0x0f, 0x67, - 0x66, 0x83, 0xb4, 0xab, 0xc9, 0xb4, 0xe4, 0x9a, 0xaf, 0xaf, 0x6d, 0x2c, - 0xa4, 0x0a, 0x07, 0x4b, 0x42, 0xdf, 0x27, 0x9f, 0x52, 0xa9, 0x36, 0x8d, - 0x36, 0x29, 0x7b, 0xb5, 0x1c, 0x4b, 0x8b, 0xae, 0xc4, 0x0a, 0x5e, 0xf7, - 0xd3, 0x82, 0x39, 0x4e, 0x5e, 0x00, 0xc7, 0x05, 0xf2, 0x8c, 0x28, 0x8e, - 0xd2, 0x0e, 0xef, 0x9d, 0xb3, 0x7a, 0x61, 0xdd, 0x43, 0x23, 0xad, 0x6f, - 0x3e, 0xd5, 0x5e, 0x02, 0xc7, 0x99, 0x70, 0x74, 0x30, 0xd5, 0x81, 0x82, - 0xa6, 0x0a, 0x93, 0x77, 0xe7, 0x90, 0x91, 0x06, 0xe7, 0x18, 0x00, 0xcf, - 0x55, 0x1a, 0x6c, 0x5f, 0xa4, 0x4d, 0x35, 0xb9, 0xdc, 0xc2, 0x26, 0x9d, - 0x6c, 0x9d, 0x3c, 0xf4, 0x96, 0x80, 0x00, 0x80, 0x25, 0xf8, 0x12, 0x2c, - 0x3c, 0x39, 0x5d, 0xdb, 0x22, 0x3a, 0x97, 0x3c, 0xc5, 0xea, 0xa5, 0x7d, - 0x36, 0x3d, 0x17, 0x58, 0x56, 0xfe, 0x3c, 0xfd, 0x21, 0xfe, 0xda, 0x35, - 0x4d, 0x3d, 0xc3, 0x97, 0xe9, 0xbf, 0x94, 0xdf, 0x7a, 0xee, 0x44, 0x12, - 0x1b, 0x54, 0x00, 0x77, 0x17, 0xad, 0xc9, 0xd8, 0xce, 0x56, 0x63, 0x1a, - 0xaa, 0xfb, 0x15, 0x0f, 0x2d, 0xbe, 0xc8, 0x7d, 0xea, 0x33, 0x23, 0x17, - 0x03, 0x19, 0x6e, 0x4a, 0x9b, 0x5a, 0xe0, 0x4e, 0x5d, 0x38, 0xba, 0x7e, - 0xe5, 0x8c, 0x40, 0xfa, 0xb0, 0x9f, 0x77, 0xa5, 0xee, 0x66, 0x61, 0x4c, - 0x51, 0x1f, 0x8e, 0x51, 0x70, 0x15, 0x66, 0x80, 0xc3, 0xb9, 0x6c, 0xa2, - 0x90, 0x8e, 0x66, 0x55, 0xd0, 0xc7, 0x10, 0x38, 0x3b, 0x28, 0x0b, 0xdc, - 0xed, 0x02, 0x10, 0x55, 0x32, 0xb0, 0xfa, 0xd9, 0x0f, 0x19, 0xaf, 0xfb, - 0x88, 0x82, 0x9b, 0xc4, 0xa4, 0xee, 0x0f, 0x91, 0xd5, 0x04, 0xa6, 0x37, - 0xa3, 0xd4, 0xb6, 0xf9, 0x97, 0xb7, 0xca, 0xa4, 0x10, 0xb8, 0x46, 0x72, - 0xe6, 0x49, 0x86, 0xee, 0xfd, 0xd2, 0x47, 0xc2, 0x6e, 0x2d, 0x35, 0xd6, - 0x11, 0xd5, 0xd3, 0x3f, 0x70, 0x32, 0x52, 0xda, 0x28, 0xf7, 0x55, 0xd7, - 0x6e, 0xf0, 0x8a, 0x27, 0xb1, 0xce, 0x52, 0xe3, 0xcb, 0x37, 0x8c, 0xfb, - 0x6b, 0xb2, 0x98, 0xbd, 0x39, 0x72, 0x5e, 0xb6, 0x1b, 0x6c, 0xde, 0x25, - 0x25, 0x88, 0x7c, 0xbd, 0x1c, 0x86, 0x88, 0x90, 0x34, 0x6f, 0x35, 0x41, - 0x78, 0x69, 0x4c, 0x27, 0x37, 0x90, 0x97, 0x73, 0x3d, 0x2f, 0x95, 0x1d, - 0x38, 0x3d, 0x76, 0x0d, 0x58, 0x59, 0x90, 0x51, 0xb9, 0x0c, 0xd7, 0x6d, - 0x38, 0x71, 0xf4, 0x0f, 0x48, 0x2f, 0xec, 0xb0, 0xad, 0x39, 0x9a, 0x9b, - 0xd0, 0xad, 0x17, 0x76, 0x30, 0x0a, 0x2f, 0x16, 0xe0, 0x9c, 0x8a, 0xb3, - 0x3d, 0xa6, 0x64, 0x39, 0x91, 0xdc, 0x2b, 0x24, 0xf2, 0x70, 0x1c, 0x57, - 0x8b, 0x5f, 0xa7, 0x3c, 0x4a, 0x4a, 0xdf, 0x21, 0xde, 0x6f, 0xba, 0xc4, - 0xee, 0x14, 0x87, 0x8e, 0xea, 0xaf, 0x74, 0x02, 0x26, 0xb6, 0xde, 0x56, - 0x34, 0x3e, 0xf5, 0x3f, 0x7d, 0xb7, 0x90, 0xf3, 0x82, 0x7f, 0x79, 0x7f, - 0x9e, 0x8e, 0x58, 0x84, 0x4e, 0x0d, 0x16, 0x11, 0x62, 0xa1, 0x51, 0x72, - 0x1b, 0xf8, 0x28, 0xd9, 0x52, 0x93, 0x04, 0x75, 0x7d, 0x0b, 0x92, 0xa7, - 0x39, 0xd5, 0x4b, 0xba, 0x2b, 0x01, 0x72, 0xb0, 0xae, 0x53, 0x0a, 0xa1, - 0xa6, 0x9d, 0x00, 0x47, 0x65, 0x5e, 0x92, 0x9a, 0x69, 0xe8, 0xa1, 0x8f, - 0x42, 0x9f, 0x62, 0x91, 0x46, 0x28, 0x15, 0x00, 0x08, 0x22, 0xd5, 0x65, - 0x1d, 0x27, 0x87, 0x9f, 0x99, 0x9c, 0x4b, 0xad, 0x6d, 0xe0, 0x68, 0xdb, - 0x84, 0xd2, 0x5e, 0xe6, 0x47, 0x97, 0xf9, 0xf7, 0x2e, 0xbc, 0x8c, 0x58, - 0x78, 0x5b, 0xd2, 0x44, 0xfd, 0x46, 0xbf, 0x31, 0xfe, 0xfb, 0xff, 0x09, - 0x1e, 0x08, 0x05, 0xb5, 0x4f, 0xac, 0x5d, 0x0b, 0x1f, 0x5f, 0xad, 0x95, - 0x3f, 0x86, 0x31, 0xcc, 0x3e, 0x8b, 0x04, 0x5f, 0x9a, 0x0a, 0xfc, 0xfe, - 0xdd, 0x9f, 0x0d, 0x9b, 0x06, 0x4f, 0x0e, 0x3b, 0xc3, 0x2b, 0xf4, 0xfb, - 0xa1, 0xc4, 0xdd, 0xc7, 0x5a, 0x05, 0xe8, 0xcb, 0xcc, 0x7a, 0x24, 0xb8, - 0xe4, 0xfe, 0xa0, 0x60, 0x88, 0x05, 0x9e, 0x9a, 0x28, 0x8d, 0x8e, 0x02, - 0x63, 0x69, 0xd5, 0x91, 0xb0, 0x7f, 0x84, 0x0a, 0xf3, 0xe9, 0x3d, 0x70, - 0xa1, 0x6e, 0x9a, 0xeb, 0xea, 0x62, 0x01, 0xa7, 0x7c, 0x76, 0x59, 0x49, - 0x31, 0x89, 0x10, 0x75, 0x87, 0x51, 0x61, 0xe6, 0xee, 0x50, 0x40, 0xf4, - 0x61, 0xe5, 0x48, 0x7d, 0x38, 0x1e, 0xf5, 0xf4, 0xf6, 0x58, 0x50, 0x40, - 0x2c, 0xca, 0x24, 0xc3, 0x46, 0x19, 0x3c, 0x39, 0x0e, 0xd8, 0x59, 0xe1, - 0x16, 0xc6, 0xac, 0xd0, 0xbc, 0x6c, 0x28, 0xd0, 0x18, 0xfe, 0xd7, 0x95, - 0x5f, 0x3f, 0xaa, 0xeb, 0x4a, 0x29, 0x77, 0xc6, 0xf8, 0xbf, 0x4a, 0x39, - 0x65, 0xa9, 0x00, 0x3a, 0x68, 0x81, 0xb5, 0x1e, 0xd3, 0x3d, 0x99, 0xd7, - 0x4d, 0x3f, 0x16, 0xfe, 0xb4, 0x82, 0xd7, 0xe9, 0x50, 0xb2, 0x7d, 0x0b, - 0x28, 0x16, 0xaa, 0x4f, 0x63, 0xd7, 0x0e, 0x6c, 0x35, 0x63, 0xb2, 0xdc, - 0x24, 0xf2, 0x25, 0x79, 0xea, 0xbe, 0x5d, 0xc1, 0xb3, 0x4f, 0xc4, 0x64, - 0x47, 0x9f, 0xea, 0xb1, 0xc8, 0x96, 0x15, 0x3e, 0xb0, 0xba, 0x09, 0xbb, - 0x52, 0xc5, 0xa2, 0x16, 0xff, 0xa3, 0x8f, 0xbf, 0xfe, 0x4d, 0x4f, 0x6d, - 0x80, 0x45, 0xdd, 0x34, 0x12, 0x15, 0x41, 0x32, 0x75, 0x6c, 0xfb, 0x74, - 0x1d, 0x24, 0xfe, 0xc7, 0x7d, 0x6c, 0x78, 0xc9, 0xb9, 0x7b, 0xb0, 0x32, - 0xf2, 0xc1, 0x28, 0xf5, 0x65, 0xed, 0x5e, 0x78, 0x59, 0xdf, 0x2e, 0xc2, - 0x5e, 0x92, 0xe6, 0x99, 0x54, 0x27, 0x78, 0x97, 0x51, 0x9e, 0x24, 0x23, - 0xad, 0x0d, 0x0d, 0xce, 0x15, 0x2e, 0x44, 0x84, 0xd4, 0x2b, 0xf5, 0xee, - 0x85, 0xb9, 0xd0, 0xba, 0xd3, 0x4e, 0x86, 0x4c, 0xc0, 0xc9, 0x16, 0xbe, - 0x62, 0x6b, 0x4b, 0xae, 0xc1, 0x4e, 0x50, 0x0f, 0x41, 0x96, 0xd5, 0x01, - 0x71, 0xcd, 0x8d, 0x40, 0xa6, 0x7b, 0xca, 0xb2, 0x55, 0x33, 0x4b, 0x4d, - 0x8b, 0x89, 0x9c, 0x38, 0x3d, 0x13, 0xa5, 0x31, 0x3e, 0x44, 0xf3, 0x41, - 0xc4, 0x1b, 0x6c, 0x48, 0x59, 0x84, 0x33, 0x1e, 0x27, 0xbd, 0xfe, 0x3c, - 0x71, 0x5a, 0x6b, 0x20, 0x3e, 0x0b, 0xf4, 0x67, 0x09, 0x13, 0x1d, 0x03, - 0x0e, 0x2e, 0x8c, 0xd3, 0x13, 0xcc, 0x0a, 0x6b, 0x34, 0xe4, 0xe8, 0x36, - 0x90, 0xcf, 0x05, 0x5f, 0x80, 0x14, 0x6d, 0x74, 0xac, 0x02, 0x8c, 0xa7, - 0xc5, 0x9a, 0xcd, 0xc1, 0xe3, 0x98, 0x55, 0x67, 0x95, 0xb6, 0xe3, 0xb4, - 0x87, 0x1a, 0x99, 0xaa, 0x40, 0x34, 0xe6, 0xf6, 0xe6, 0xd8, 0xa3, 0xdd, - 0xc8, 0x84, 0x75, 0xc4, 0x07, 0x14, 0x53, 0xf5, 0xba, 0x69, 0xb6, 0x03, - 0x2b, 0xc1, 0x8e, 0x6f, 0xa3, 0x7f, 0x5d, 0x17, 0xec, 0x87, 0xed, 0xbb, - 0x64, 0xfb, 0xaf, 0x81, 0xf2, 0x27, 0xa7, 0x3a, 0x54, 0x93, 0x1d, 0x94, - 0xbc, 0xd6, 0x03, 0xa6, 0x30, 0x71, 0x8e, 0x94, 0xfc, 0x95, 0xca, 0xb2, - 0x73, 0x0f, 0xda, 0x1c, 0xff, 0x82, 0xdb, 0x93, 0x14, 0x48, 0xc6, 0xa1, - 0xb1, 0xb4, 0xaf, 0x84, 0xc8, 0xbe, 0x3a, 0x7b, 0xf6, 0x2f, 0xb0, 0x4d, - 0x1f, 0x46, 0xb4, 0x68, 0x7f, 0xc4, 0x0d, 0x1a, 0xcc, 0xd7, 0xff, 0x66, - 0x2d, 0xfe, 0x7c, 0xb2, 0x3c, 0x74, 0x15, 0xe1, 0x26, 0xbf, 0x90, 0x99, - 0x00, 0xb1, 0x51, 0xc6, 0x7e, 0x0b, 0xec, 0x25, 0x4f, 0x06, 0xa4, 0xa1, - 0x42, 0x8c, 0x02, 0xf0, 0xeb, 0xd5, 0x13, 0xdd, 0xe2, 0xcd, 0xc8, 0x69, - 0x80, 0x4e, 0xdb, 0xf6, 0x42, 0xe0, 0x7b, 0x40, 0xa4, 0x2c, 0xdf, 0x57, - 0xc6, 0x6c, 0xcf, 0x53, 0x0a, 0x1d, 0x5d, 0x97, 0xe3, 0x51, 0x2f, 0x16, - 0x0a, 0x7c, 0x04, 0xa5, 0x52, 0xbc, 0x46, 0x6c, 0x98, 0x8a, 0x06, 0x37, - 0x55, 0xd7, 0x3c, 0xf9, 0xf3, 0xb4, 0xca, 0xc8, 0x63, 0xb2, 0x31, 0xa0, - 0x5f, 0x94, 0xb3, 0x42, 0x00, 0xcd, 0x0e, 0xda, 0xd3, 0xa0, 0x2c, 0xc7, - 0xa5, 0xd3, 0x68, 0xb1, 0xe4, 0x58, 0x5a, 0x44, 0x65, 0x4a, 0xed, 0x73, - 0xbf, 0x5a, 0x2a, 0x7c, 0x20, 0xda, 0x9d, 0x90, 0x3c, 0x32, 0x1b, 0x7b, - 0x1e, 0xd6, 0x78, 0x74, 0x3b, 0x8e, 0x36, 0x78, 0x9c, 0x30, 0x38, 0x1a, - 0x60, 0xac, 0x88, 0xf0, 0xf9, 0x2b, 0xf0, 0xa7, 0xf1, 0x51, 0xb4, 0xa9, - 0x2f, 0x36, 0xdb, 0x4d, 0xa5, 0xee, 0x8b, 0xaa, 0x96, 0xa9, 0x50, 0x37, - 0xb8, 0x4c, 0xb3, 0x7b, 0x49, 0x8c, 0x04, 0x39, 0x98, 0x08, 0xb7, 0xb1, - 0x40, 0xcb, 0x9a, 0x77, 0x7b, 0x45, 0x12, 0x91, 0x2e, 0xf6, 0xea, 0x16, - 0x4d, 0xb6, 0x65, 0x71, 0x3b, 0x3e, 0xf9, 0x61, 0xe6, 0x71, 0x77, 0xde, - 0x67, 0x8b, 0x91, 0x2a, 0x37, 0x30, 0x5f, 0xf4, 0x5f, 0x6e, 0xc5, 0x49, - 0x53, 0x75, 0x90, 0x9c, 0x97, 0x3a, 0xe1, 0x33, 0xd5, 0x85, 0xaa, 0x46, - 0xc7, 0x88, 0xc6, 0x7a, 0x04, 0x95, 0x06, 0x29, 0x35, 0x74, 0xa0, 0x51, - 0x4e, 0xee, 0x78, 0xf3, 0x16, 0xe8, 0x94, 0x16, 0xf5, 0x2b, 0x06, 0x05, - 0xc7, 0x0c, 0xc8, 0xa7, 0x71, 0xae, 0x55, 0xeb, 0x3c, 0x95, 0x9b, 0xbf, - 0xb6, 0xd3, 0x53, 0x37, 0x13, 0x56, 0x19, 0x95, 0x50, 0xa6, 0x9b, 0x88, - 0x62, 0xdb, 0x7b, 0x8d, 0x23, 0x29, 0x28, 0x2c, 0xd8, 0x1f, 0xdf, 0x4c, - 0xf9, 0x6e, 0xc8, 0xc3, 0x1f, 0x84, 0xa5, 0xf3, 0xa1, 0x3d, 0x87, 0x45, - 0xea, 0x6f, 0xdd, 0x64, 0xfc, 0xb4, 0xc2, 0x30, 0x68, 0x5d, 0x8a, 0xee, - 0xca, 0xfc, 0x26, 0x73, 0x3c, 0x25, 0x80, 0x11, 0xe8, 0x11, 0x8f, 0xfa, - 0xe9, 0x20, 0x6a, 0x35, 0x9d, 0x4a, 0x98, 0x94, 0x3a, 0xff, 0xf8, 0x89, - 0xa5, 0xba, 0xda, 0x52, 0x07, 0x99, 0x7d, 0x77, 0xbc, 0xa5, 0xf7, 0xf5, - 0x06, 0x8e, 0x6f, 0x22, 0xd2, 0x4f, 0x95, 0xb1, 0xa5, 0xf1, 0x1a, 0xbf, - 0x40, 0x70, 0x2d, 0xcf, 0xdd, 0xea, 0xdb, 0x56, 0x3b, 0xcf, 0xf4, 0x12, - 0x2b, 0x4e, 0x0e, 0xcb, 0x4c, 0xe2, 0x85, 0xf2, 0x4d, 0xdf, 0xd9, 0x35, - 0x46, 0x21, 0xb9, 0xda, 0x98, 0x69, 0xf9, 0x88, 0x67, 0xcd, 0x41, 0x01, - 0x5b, 0x36, 0x17, 0xb8, 0x3c, 0xdc, 0xa3, 0x1d, 0xb8, 0xba, 0x78, 0x84, - 0x38, 0x28, 0x71, 0x43, 0xbf, 0xdf, 0xc9, 0x97, 0x35, 0x32, 0x77, 0x41, - 0x42, 0xfd, 0xa3, 0xc1, 0x91, 0x54, 0xb3, 0x0a, 0x65, 0xa0, 0xea, 0x6c, - 0x9a, 0x01, 0xa7, 0x89, 0x8c, 0xdd, 0x9b, 0x91, 0x77, 0x98, 0x37, 0x7b, - 0xbd, 0x98, 0xdf, 0x70, 0x8f, 0x3f, 0xc8, 0x3d, 0x2e, 0xb4, 0x5b, 0x00, - 0x57, 0x4b, 0x6b, 0xed, 0x60, 0x79, 0x02, 0x95, 0x11, 0x97, 0x1f, 0xe7, - 0x4e, 0x5a, 0xf0, 0x14, 0x6a, 0x22, 0x6d, 0x6b, 0x64, 0xd1, 0xed, 0x2b, - 0x42, 0x99, 0x2d, 0xf3, 0x25, 0xb8, 0xea, 0x7a, 0x4c, 0x4b, 0xca, 0x64, - 0xc1, 0x39, 0x94, 0x42, 0xfb, 0x4c, 0xde, 0x5c, 0xf4, 0xe0, 0xba, 0x3c, - 0xcb, 0x1b, 0x0e, 0x7a, 0x05, 0xdc, 0x4a, 0x24, 0xe2, 0xe4, 0x72, 0xc1, - 0x42, 0x6b, 0x2c, 0xff, 0x0c, 0x9e, 0x75, 0x96, 0x41, 0x21, 0x61, 0x77, - 0xcf, 0x2d, 0x21, 0xbd, 0xa8, 0xd0, 0x76, 0xbd, 0x1b, 0xb5, 0x7e, 0xd3, - 0xc7, 0x79, 0x6a, 0x19, 0x24, 0xc0, 0x8f, 0x2c, 0x98, 0x0c, 0x7d, 0xdc, - 0x64, 0x0c, 0xae, 0x39, 0x33, 0x24, 0xb7, 0x8f, 0xa3, 0xa3, 0x18, 0xcf, - 0xba, 0x23, 0xcb, 0xfb, 0xd3, 0x89, 0x28, 0xa0, 0x08, 0xd8, 0x5a, 0x7e, - 0x90, 0xd4, 0x21, 0x45, 0xc6, 0xc2, 0xa5, 0x27, 0x1c, 0x86, 0x01, 0x3f, - 0x79, 0xb8, 0xf2, 0x83, 0xb2, 0x67, 0x40, 0xc4, 0xb6, 0x21, 0x14, 0xe9, - 0x5f, 0xa1, 0x9b, 0xd9, 0xc4, 0x26, 0x02, 0x36, 0xa7, 0x20, 0x6c, 0x24, - 0xa2, 0x84, 0x90, 0x99, 0xd2, 0x22, 0xc4, 0x1c, 0x7c, 0xca, 0x5d, 0xc4, - 0x7e, 0x1f, 0x31, 0x41, 0x70, 0xf5, 0x24, 0x36, 0x44, 0x2d, 0x6c, 0x98, - 0x62, 0xa2, 0xe5, 0x7c, 0x1f, 0xd8, 0xa2, 0x8a, 0xbe, 0xba, 0x9b, 0xab, - 0x31, 0x6d, 0xa6, 0xd8, 0x7e, 0xa9, 0xcd, 0xfb, 0xc5, 0xda, 0xe8, 0xc0, - 0x12, 0x0a, 0x52, 0xb1, 0xa1, 0x20, 0x0e, 0xb2, 0xd4, 0xae, 0x55, 0xf2, - 0x32, 0xfd, 0x18, 0x51, 0xe7, 0x97, 0x2c, 0x72, 0x66, 0x45, 0x2f, 0xad, - 0xf5, 0x48, 0xe9, 0xfc, 0x6a, 0x93, 0x5a, 0x9a, 0x8e, 0x8e, 0xa1, 0x2c, - 0xf0, 0x4c, 0xb8, 0x31, 0x8b, 0x48, 0x00, 0x1a, 0xb5, 0xf8, 0xa0, 0x00, - 0xe5, 0xef, 0xc1, 0xa4, 0x21, 0x3a, 0xf2, 0x09, 0xf4, 0x99, 0x5e, 0x68, - 0xe0, 0xa8, 0x3a, 0xf7, 0x3e, 0xd6, 0x24, 0xa8, 0xf8, 0xae, 0x99, 0x38, - 0x6b, 0xd5, 0x14, 0xff, 0xde, 0x34, 0x67, 0xbf, 0x06, 0xa7, 0x5b, 0x1b, - 0xc6, 0x3e, 0xaf, 0x0a, 0x04, 0x5b, 0xf6, 0x4d, 0x24, 0x3a, 0xae, 0x42, - 0xba, 0xc4, 0xbc, 0xe7, 0x72, 0x8c, 0xc0, 0xcf, 0x30, 0x12, 0x0a, 0x66, - 0xb2, 0x2a, 0x39, 0x9f, 0x8a, 0x9a, 0x58, 0x3a, 0xfa, 0xc2, 0xec, 0xe4, - 0x87, 0x33, 0xdc, 0x2f, 0x59, 0x3e, 0xeb, 0xe8, 0x1f, 0xb9, 0x71, 0x3d, - 0x92, 0x53, 0xf8, 0xc0, 0xd1, 0xbf, 0xce, 0xf4, 0x23, 0xb0, 0x35, 0x18, - 0x0d, 0xdf, 0xd2, 0x25, 0x20, 0x71, 0x18, 0x92, 0x9d, 0x68, 0xf6, 0xf1, - 0xad, 0x77, 0x8e, 0xf6, 0xa4, 0x3a, 0xec, 0xfe, 0xb1, 0xf5, 0x9f, 0xfa, - 0x2f, 0xb5, 0xc5, 0xe5, 0x7e, 0xdc, 0xe0, 0x6c, 0xe2, 0x03, 0xdc, 0x0a, - 0x03, 0xdd, 0xf1, 0x11, 0x24, 0xd9, 0xd0, 0x71, 0x39, 0x93, 0x7d, 0x9e, - 0xb5, 0x41, 0xae, 0x22, 0xc3, 0xe1, 0x90, 0x17, 0xd5, 0x00, 0x3c, 0x84, - 0xfe, 0x18, 0x18, 0xf3, 0x80, 0xee, 0x28, 0x0d, 0x9d, 0x58, 0xfe, 0x15, - 0x02, 0xf5, 0x78, 0x9b, 0x21, 0x2b, 0x1f, 0xa9, 0xcc, 0x30, 0xf8, 0xcf, - 0x7d, 0xff, 0x2c, 0xdb, 0x9c, 0xcb, 0x14, 0x5e, 0x54, 0x56, 0x21, 0xb5, - 0x0d, 0x30, 0x93, 0x8e, 0x1d, 0xe4, 0x21, 0x66, 0xab, 0xda, 0x45, 0xc9, - 0xe5, 0xb0, 0x89, 0x88, 0x86, 0xf6, 0x1d, 0xbe, 0x26, 0x59, 0x66, 0xd6, - 0x07, 0x56, 0xbf, 0x33, 0x13, 0x9d, 0x85, 0xb0, 0x14, 0x34, 0x70, 0xac, - 0xc9, 0x5d, 0x11, 0x3d, 0x01, 0xe7, 0xb1, 0x52, 0xb4, 0xbd, 0x77, 0xc7, - 0x12, 0x83, 0x56, 0x69, 0x00, 0x55, 0x35, 0xc1, 0x4b, 0xd2, 0x1e, 0x38, - 0x29, 0x2d, 0x08, 0x57, 0x0b, 0xd9, 0x2a, 0x5a, 0xc7, 0x9c, 0x71, 0x1c, - 0x90, 0xd3, 0x1c, 0xcf, 0x19, 0xf6, 0xe7, 0x31, 0xc4, 0xe0, 0x38, 0xa2, - 0x96, 0xfc, 0x9d, 0x70, 0x22, 0x78, 0x54, 0xd8, 0xca, 0x81, 0xc6, 0xec, - 0x4d, 0x48, 0xe3, 0x78, 0x21, 0xb0, 0xd1, 0xff, 0x60, 0x56, 0x40, 0xbe, - 0xbb, 0xf2, 0x50, 0xdc, 0x04, 0x9d, 0x2c, 0x9a, 0x54, 0x71, 0xab, 0xf5, - 0xc8, 0x18, 0xbb, 0x6b, 0x0a, 0xdb, 0xcf, 0xa4, 0x87, 0x1b, 0xe4, 0xdf, - 0xe8, 0x4e, 0x3e, 0xc4, 0x62, 0x80, 0x61, 0x61, 0x02, 0xa2, 0x89, 0xc5, - 0xfb, 0x4f, 0xcc, 0xa4, 0x5d, 0xbf, 0x22, 0x3e, 0xf9, 0x0e, 0xd2, 0x81, - 0xcb, 0xbb, 0x95, 0xe1, 0xfc, 0x69, 0x26, 0xc1, 0xbc, 0xde, 0x11, 0x19, - 0x2b, 0x9d, 0x1b, 0xe3, 0x8c, 0x75, 0xea, 0x70, 0xd9, 0x50, 0x85, 0xcd, - 0xa9, 0xea, 0x53, 0x84, 0x87, 0xde, 0x13, 0xd1, 0x24, 0xf9, 0x26, 0x42, - 0x92, 0x71, 0x06, 0xbc, 0x50, 0xcd, 0x11, 0x76, 0x3c, 0x6d, 0x16, 0xd1, - 0x15, 0x57, 0x48, 0x09, 0x1a, 0x02, 0xd7, 0x1e, 0xf2, 0x04, 0x38, 0x8d, - 0x3d, 0x90, 0x8b, 0xea, 0xda, 0xf2, 0x96, 0x80, 0x7d, 0x99, 0x3a, 0x0e, - 0xa9, 0x85, 0xda, 0x8b, 0x6c, 0xb5, 0x41, 0x4c, 0x19, 0x10, 0xa7, 0x43, - 0xe0, 0x26, 0x94, 0x9b, 0x32, 0xbc, 0x65, 0x6f, 0x9c, 0xa3, 0x2b, 0x4c, - 0xcd, 0xc3, 0x37, 0xdb, 0x68, 0x30, 0xfb, 0x1c, 0xe9, 0x28, 0xa8, 0x67, - 0x4d, 0x0f, 0xba, 0x25, 0xac, 0x43, 0x91, 0x28, 0xe0, 0x32, 0x9a, 0x41, - 0x76, 0xae, 0xcd, 0x8d, 0xf7, 0x24, 0x92, 0x06, 0x39, 0x12, 0x16, 0x93, - 0x2b, 0x50, 0xbe, 0x60, 0xd5, 0x17, 0xa9, 0xde, 0x4d, 0x0f, 0x7f, 0x03, - 0x46, 0x5f, 0x9b, 0x51, 0x66, 0xb3, 0x57, 0xc9, 0xf1, 0x80, 0xef, 0x27, - 0xa4, 0x48, 0x49, 0x0d, 0x96, 0xed, 0x39, 0x1c, 0x83, 0x8f, 0x40, 0x6f, - 0xcc, 0x74, 0x76, 0x01, 0x21, 0x8d, 0x76, 0x95, 0x0d, 0xbb, 0x03, 0x97, - 0xb7, 0x06, 0x34, 0x65, 0x29, 0x7a, 0xec, 0xfa, 0xb9, 0x18, 0x44, 0x8d, - 0xd8, 0xb5, 0x1e, 0x3d, 0xd8, 0x5f, 0x1c, 0x60, 0xbb, 0x01, 0x26, 0x47, - 0xe9, 0xb8, 0x34, 0x5c, 0x63, 0x13, 0xc0, 0x72, 0x52, 0x02, 0x4d, 0x7c, - 0x29, 0x4b, 0xe4, 0x1c, 0x7f, 0x53, 0x94, 0xbe, 0x97, 0x3d, 0x3d, 0x01, - 0xb6, 0x1f, 0x97, 0xdd, 0xe9, 0xd5, 0x5c, 0x88, 0x23, 0x81, 0x46, 0xea, - 0x43, 0x6e, 0x1f, 0x0a, 0xad, 0xfa, 0x83, 0xe7, 0x9a, 0x3b, 0xca, 0xf9, - 0x9e, 0xe6, 0x01, 0x32, 0x54, 0x3f, 0xfb, 0x7e, 0x14, 0xad, 0xec, 0xc9, - 0x6f, 0xbd, 0x76, 0x46, 0x3a, 0x23, 0x2f, 0x17, 0x41, 0xc8, 0x82, 0x45, - 0x5b, 0xf0, 0xce, 0x3f, 0x86, 0x11, 0x66, 0xfa, 0xf7, 0xe6, 0x58, 0xc3, - 0xd0, 0x2d, 0xec, 0x92, 0xd6, 0xe5, 0xe6, 0xa4, 0x0d, 0x15, 0x84, 0x43, - 0x74, 0x90, 0xea, 0x0a, 0x20, 0x64, 0x94, 0x55, 0xe3, 0x4e, 0x5d, 0xcb, - 0x98, 0xfa, 0x8f, 0xe3, 0xdd, 0xd9, 0xa8, 0xc1, 0xb3, 0x9e, 0xf5, 0x1e, - 0x66, 0xa4, 0x41, 0x46, 0xf8, 0xf9, 0xf8, 0x4f, 0xc3, 0xae, 0x31, 0x05, - 0x22, 0xdc, 0x63, 0x00, 0x2e, 0xdc, 0xe2, 0xc4, 0x07, 0x25, 0xfd, 0xbd, - 0x9b, 0xa5, 0xd4, 0xb4, 0xa8, 0xf7, 0x05, 0x7a, 0xda, 0x35, 0x69, 0x8f, - 0x85, 0x9f, 0xff, 0xce, 0x13, 0x06, 0xf2, 0x8a, 0x04, 0x03, 0xa6, 0x89, - 0x3e, 0x47, 0xcb, 0x6c, 0x0a, 0xb8, 0xe4, 0x1e, 0xad, 0x43, 0x0a, 0xa3, - 0x7a, 0xf6, 0x34, 0x95, 0x53, 0x07, 0x36, 0x07, 0xfc, 0x32, 0x9f, 0xa4, - 0x7c, 0x9a, 0xc3, 0x2d, 0x42, 0x31, 0xd1, 0x4b, 0xfc, 0x78, 0x5c, 0x9f, - 0xd3, 0xb2, 0x3d, 0xd1, 0xa7, 0xe8, 0x23, 0xb7, 0xa6, 0x0c, 0xaf, 0x9d, - 0x89, 0xb8, 0xab, 0x7b, 0x00, 0x0e, 0xd4, 0x4c, 0x6b, 0x61, 0xbc, 0x41, - 0xfa, 0xc3, 0x9b, 0x10, 0x02, 0x64, 0xa0, 0xd4, 0xb3, 0x3a, 0x5a, 0xb3, - 0xc6, 0xe2, 0x6b, 0xee, 0xa8, 0x95, 0xf8, 0x39, 0xf3, 0xf2, 0xb4, 0x3c, - 0xbc, 0xa1, 0xc6, 0x0c, 0xc2, 0x0b, 0x2a, 0xa1, 0x58, 0x95, 0xc1, 0x1f, - 0xa8, 0x5e, 0x30, 0x1f, 0x10, 0x00, 0x69, 0x3e, 0x8d, 0x9c, 0xac, 0xaa, - 0xf8, 0xb7, 0xad, 0xcf, 0x31, 0xbb, 0x81, 0xf9, 0x96, 0x9b, 0xce, 0xf7, - 0x6b, 0xab, 0x52, 0x6d, 0xc5, 0x1e, 0x4f, 0xe3, 0x0f, 0xfb, 0x30, 0xde, - 0x69, 0xa5, 0xd1, 0xf8, 0xc8, 0xa9, 0x70, 0x47, 0x20, 0x6f, 0xa7, 0x46, - 0xba, 0x70, 0xa3, 0xe6, 0xcd, 0xbc, 0xbe, 0xbf, 0xff, 0x6c, 0x44, 0x24, - 0x17, 0x74, 0x24, 0xdb, 0xd4, 0xf5, 0x51, 0xf1, 0xf2, 0x99, 0x68, 0x85, - 0x39, 0x4b, 0xcc, 0xa3, 0xd7, 0xc0, 0x65, 0xfa, 0x61, 0x4a, 0x13, 0x79, - 0x26, 0xe8, 0x75, 0x27, 0xcd, 0x87, 0x13, 0x85, 0x71, 0x90, 0xac, 0x7f, - 0xdd, 0xc2, 0x8a, 0x95, 0xb0, 0xee, 0xf3, 0xeb, 0x76, 0x6f, 0x32, 0xf0, - 0x23, 0xb5, 0x09, 0x6e, 0xb5, 0xe5, 0x5d, 0x84, 0x5c, 0x4c, 0x25, 0xb3, - 0x2a, 0x1e, 0x4f, 0xa1, 0x9a, 0x6a, 0x4f, 0xfc, 0x82, 0x5b, 0xa0, 0xed, - 0x45, 0x99, 0x37, 0x83, 0x51, 0xdf, 0xa0, 0xe5, 0xbf, 0x06, 0xf2, 0x3a, - 0x7f, 0x7a, 0x46, 0x3c, 0x17, 0x60, 0xaa, 0x69, 0x38, 0x26, 0xd1, 0x3e, - 0x47, 0x32, 0xa9, 0x7b, 0x74, 0xa6, 0x8b, 0x34, 0x2b, 0xc5, 0x47, 0x73, - 0x6e, 0x6d, 0x31, 0xc2, 0xf1, 0x33, 0xcc, 0xde, 0xef, 0x06, 0x18, 0x5d, - 0xa9, 0x60, 0xcb, 0x3a, 0x68, 0x27, 0x50, 0xe3, 0x56, 0xc8, 0xe3, 0x69, - 0x7f, 0x02, 0xa8, 0x15, 0x53, 0x46, 0x92, 0x5d, 0xc2, 0x9b, 0x7d, 0x5d, - 0x55, 0x80, 0xa7, 0x48, 0xc4, 0xff, 0x05, 0x76, 0x3f, 0x9e, 0x8b, 0xbe, - 0x84, 0xef, 0x0e, 0x21, 0x14, 0xc9, 0x9b, 0x6c, 0xbb, 0x41, 0x5b, 0xfb, - 0x65, 0x19, 0xd3, 0x24, 0x8b, 0xb3, 0xe6, 0xe2, 0x2a, 0x1f, 0xe3, 0x72, - 0xe8, 0xeb, 0x83, 0x83, 0x63, 0x1a, 0x4d, 0xa7, 0xc9, 0x11, 0xc5, 0xbf, - 0x60, 0xbf, 0x2b, 0x56, 0x30, 0x6e, 0xd0, 0xee, 0xf2, 0x5c, 0x24, 0x1e, - 0xd8, 0xd3, 0xd8, 0x9e, 0xd1, 0x2a, 0xbb, 0x59, 0x99, 0xf4, 0x36, 0xa1, - 0x70, 0xf7, 0xe9, 0xe5, 0x4c, 0x13, 0x53, 0xb7, 0x7c, 0x81, 0x53, 0x12, - 0x75, 0x4f, 0x5a, 0xa1, 0xe8, 0x49, 0xc4, 0x44, 0xe0, 0x2e, 0xcb, 0xcc, - 0x3e, 0xad, 0x65, 0x1d, 0x82, 0x4d, 0x65, 0x7d, 0x6e, 0x7c, 0xd4, 0x09, - 0xc5, 0x4c, 0x43, 0xf2, 0x49, 0xb3, 0x6c, 0x70, 0x77, 0x8d, 0xb3, 0x74, - 0x2a, 0x69, 0xbd, 0xd5, 0x16, 0x76, 0xc3, 0x1d, 0x22, 0x04, 0x63, 0x30, - 0x2c, 0x79, 0x50, 0x3c, 0x7b, 0x08, 0x03, 0xbd, 0x62, 0xfa, 0x11, 0x0b, - 0xfb, 0x3c, 0x40, 0x2c, 0x54, 0xa6, 0x19, 0xff, 0xe8, 0x28, 0x17, 0xb9, - 0x1d, 0xee, 0x3f, 0x40, 0xbd, 0xa1, 0x1e, 0xdc, 0x51, 0x6d, 0xe6, 0x02, - 0x56, 0xe1, 0xc5, 0x46, 0xc6, 0x67, 0x33, 0x01, 0x99, 0xcf, 0x31, 0xe6, - 0x33, 0x56, 0xbd, 0x40, 0x7e, 0x0c, 0x77, 0x1e, 0x2f, 0x72, 0x98, 0xf2, - 0x05, 0xf8, 0x7e, 0x95, 0x92, 0x92, 0x52, 0xff, 0x45, 0xde, 0xa6, 0xee, - 0x70, 0x02, 0x2a, 0x1f, 0x0d, 0xb2, 0x16, 0xee, 0xfe, 0x01, 0x9a, 0x1d, - 0xaa, 0x83, 0xb3, 0x35, 0x55, 0xf7, 0xbb, 0x5f, 0x0b, 0xbe, 0xd5, 0x18, - 0x83, 0x36, 0x13, 0x05, 0x54, 0xca, 0xa9, 0x2c, 0x54, 0x3a, 0x37, 0x91, - 0xf4, 0xa0, 0xb5, 0x55, 0x87, 0xb6, 0x47, 0xd1, 0x92, 0xe8, 0x90, 0x65, - 0xc9, 0x1a, 0x9f, 0x0f, 0x9f, 0x37, 0x48, 0x21, 0x5e, 0x43, 0xe1, 0x36, - 0x9b, 0x5c, 0xc7, 0x9c, 0x74, 0x27, 0x7f, 0xd5, 0x4d, 0xcd, 0xe3, 0xf1, - 0xe2, 0xa3, 0x05, 0x00, 0xa4, 0xad, 0xb3, 0x16, 0xb1, 0x4a, 0xdf, 0x59, - 0xa8, 0x01, 0x91, 0xde, 0x12, 0xc0, 0x11, 0x16, 0x62, 0xc1, 0x27, 0x32, - 0x97, 0x82, 0x50, 0x0f, 0xbf, 0xa1, 0x71, 0x8a, 0x03, 0x19, 0x51, 0x9d, - 0x38, 0x9d, 0x75, 0xe7, 0x18, 0x02, 0xd1, 0x2b, 0x63, 0xa0, 0x74, 0xe8, - 0x66, 0x6a, 0xfd, 0x63, 0x51, 0x09, 0xe2, 0xdf, 0x99, 0xbc, 0x4a, 0xd1, - 0x00, 0x38, 0xf5, 0x6d, 0xb4, 0x63, 0x7f, 0x19, 0xbb, 0xbe, 0x42, 0xcc, - 0xa1, 0x6d, 0x07, 0x08, 0xf3, 0xa2, 0xd2, 0xd4, 0x5a, 0x4c, 0x14, 0xd3, - 0x5b, 0xda, 0x93, 0xc7, 0xab, 0x68, 0x46, 0x87, 0x64, 0xe7, 0x11, 0x76, - 0x8b, 0x11, 0x3f, 0x84, 0x21, 0x35, 0x7d, 0x1d, 0xab, 0x09, 0xa1, 0x2e, - 0x69, 0xb3, 0xf0, 0x53, 0x7a, 0x11, 0x26, 0x7c, 0xe4, 0x2e, 0x7d, 0x4f, - 0xb5, 0x39, 0xf4, 0x9c, 0x13, 0xde, 0xaa, 0xe7, 0x8e, 0x9a, 0x26, 0xd5, - 0xcd, 0x5a, 0x35, 0x69, 0x88, 0xb7, 0x54, 0xf4, 0x46, 0xc7, 0x70, 0x1e, - 0x93, 0xf8, 0xd9, 0x21, 0x63, 0xc8, 0xb8, 0x70, 0x73, 0x01, 0x5f, 0xed, - 0xd3, 0xc7, 0xcb, 0x7f, 0x22, 0xbb, 0x77, 0xb8, 0xbc, 0x99, 0x88, 0xbe, - 0x49, 0x50, 0x52, 0x4f, 0x27, 0x23, 0x29, 0x58, 0xef, 0xbd, 0x65, 0x8e, - 0x19, 0x3f, 0xc8, 0x25, 0x91, 0x8d, 0xb9, 0x2a, 0xe4, 0x43, 0x93, 0x34, - 0x31, 0xfb, 0x8f, 0xf4, 0x6a, 0xde, 0xc1, 0xf0, 0xd1, 0x3a, 0xd2, 0x38, - 0x3b, 0xc5, 0xc6, 0x19, 0x78, 0xb0, 0xc8, 0x42, 0x17, 0xba, 0x03, 0x2a, - 0x6a, 0x9e, 0x5c, 0x4f, 0x65, 0x3f, 0x88, 0x7b, 0xa6, 0x36, 0x09, 0xa1, - 0xbc, 0x44, 0x7a, 0x9f, 0x3d, 0xf6, 0x00, 0x4b, 0xfe, 0x27, 0xd9, 0x1c, - 0x95, 0x39, 0x2a, 0xb3, 0x16, 0xa4, 0x08, 0xf4, 0x42, 0x95, 0x88, 0x8a, - 0x77, 0xd0, 0xcf, 0xa3, 0xe7, 0x51, 0x86, 0x17, 0x20, 0x48, 0x47, 0xef, - 0xbc, 0x1c, 0xa1, 0x22, 0x7c, 0x3f, 0x45, 0x44, 0xb7, 0xba, 0xc7, 0x34, - 0xd2, 0x5a, 0x08, 0x47, 0x4f, 0xcb, 0xa3, 0x7b, 0xb1, 0xf3, 0xed, 0x3a, - 0x43, 0x8e, 0x52, 0x92, 0xc0, 0x5f, 0x9d, 0x0a, 0x76, 0x65, 0xb7, 0xa4, - 0x0e, 0x67, 0xaf, 0x3f, 0xc6, 0x8b, 0x97, 0xcb, 0xe9, 0xfe, 0x59, 0x15, - 0x47, 0x08, 0xc4, 0x11, 0x13, 0x3b, 0x4c, 0xb9, 0xa8, 0x17, 0x3f, 0x7d, - 0x39, 0x92, 0x1a, 0x1d, 0xe7, 0x74, 0x7f, 0x68, 0x0f, 0x8c, 0xcd, 0x2a, - 0x6f, 0xc4, 0xfd, 0xa8, 0x36, 0xb3, 0xc6, 0x69, 0x74, 0xd5, 0xf6, 0x8c, - 0xa2, 0xbf, 0x09, 0x64, 0xd1, 0x17, 0x92, 0x1f, 0x1b, 0x71, 0x37, 0x98, - 0x0f, 0xec, 0x4c, 0xa2, 0x0a, 0x8c, 0x51, 0x0b, 0xa4, 0xc6, 0x33, 0xa0, - 0xba, 0xa7, 0x0f, 0x0d, 0x10, 0xf1, 0xb8, 0xa8, 0x0d, 0x8f, 0xad, 0x7c, - 0x4b, 0xa4, 0x71, 0x45, 0x01, 0x6b, 0xbe, 0x45, 0xb1, 0x03, 0x70, 0x01, - 0xcb, 0x45, 0xd1, 0x57, 0xb7, 0x63, 0xb8, 0x7e, 0x9e, 0xbc, 0x4a, 0x31, - 0xed, 0xe8, 0x82, 0xd0, 0x99, 0x67, 0x02, 0xb9, 0xbc, 0x08, 0x42, 0xc9, - 0x7a, 0xae, 0xfe, 0xce, 0x04, 0x31, 0xc4, 0x73, 0xec, 0x46, 0x1f, 0xde, - 0xca, 0x1b, 0x2d, 0x96, 0xb2, 0x3c, 0x98, 0xd9, 0x24, 0x6a, 0x13, 0x83, - 0x67, 0xbe, 0x10, 0x64, 0x53, 0x79, 0x07, 0xbe, 0xae, 0xdf, 0x81, 0xa2, - 0x7f, 0x18, 0x03, 0xc4, 0xc2, 0x56, 0x0e, 0x57, 0x56, 0x8e, 0xd3, 0xe8, - 0xaf, 0xd0, 0x9b, 0xa5, 0xf9, 0x6e, 0xd3, 0x94, 0xb0, 0x31, 0xe3, 0xd3, - 0x38, 0x62, 0xbc, 0xbf, 0xa5, 0x78, 0xe5, 0xa7, 0x6c, 0x39, 0xd4, 0x85, - 0x7b, 0xaa, 0x32, 0x18, 0x4d, 0xa5, 0x24, 0x01, 0x13, 0xf5, 0x2d, 0x48, - 0x61, 0x85, 0x1c, 0xfc, 0xf4, 0x03, 0xbc, 0xb7, 0xd5, 0x81, 0x9a, 0x4f, - 0xde, 0x08, 0xe7, 0xb2, 0x90, 0xe7, 0x29, 0x26, 0x46, 0x8b, 0xe7, 0xe4, - 0x4a, 0x47, 0xdd, 0xf4, 0x95, 0xeb, 0x31, 0x86, 0x88, 0xa5, 0x7f, 0x0e, - 0x0a, 0x77, 0x97, 0x7a, 0x7b, 0x73, 0xbf, 0x90, 0xdc, 0xf8, 0x1d, 0x15, - 0x44, 0x65, 0x68, 0xd4, 0x6e, 0x25, 0x16, 0x48, 0xfd, 0xc1, 0x08, 0x06, - 0xe9, 0x77, 0x1d, 0x8a, 0x90, 0xf1, 0xcb, 0x98, 0x9b, 0xb1, 0xa0, 0x59, - 0x5c, 0x43, 0xc8, 0x1f, 0x11, 0x2e, 0x74, 0x52, 0xf2, 0x97, 0xa5, 0xbe, - 0xe2, 0x99, 0x0e, 0x0b, 0xb0, 0x9f, 0x39, 0xf6, 0x7b, 0x3c, 0x1d, 0x12, - 0xee, 0x08, 0xf5, 0x5d, 0x55, 0xf2, 0x2d, 0x69, 0xa6, 0xae, 0xfa, 0x03, - 0xfe, 0xe9, 0x0b, 0x68, 0x9d, 0xaa, 0xca, 0x35, 0x60, 0x9d, 0x2c, 0xa6, - 0x29, 0xcb, 0x1d, 0x50, 0xd2, 0xcf, 0x6a, 0x44, 0xdd, 0x4c, 0xe2, 0x5a, - 0x34, 0x91, 0x58, 0xf5, 0xdb, 0x4d, 0xce, 0x74, 0x9a, 0xdb, 0x12, 0x83, - 0xab, 0x50, 0xa8, 0xb2, 0x7a, 0x87, 0xb2, 0x20, 0x3e, 0xba, 0xaa, 0xaa, - 0x88, 0x67, 0x1f, 0x99, 0x64, 0xaf, 0xc5, 0xa1, 0x45, 0x2c, 0x03, 0xda, - 0x08, 0xde, 0xe3, 0x23, 0x71, 0x7e, 0x54, 0xff, 0xfa, 0x09, 0x73, 0x0f, - 0x67, 0x55, 0x4c, 0x8f, 0x83, 0x58, 0x7e, 0xb9, 0x9b, 0x41, 0x70, 0x82, - 0x7e, 0xfc, 0xeb, 0xb4, 0x86, 0xb9, 0xe3, 0x5a, 0xab, 0x92, 0xb0, 0xaf, - 0x94, 0x2f, 0x28, 0xca, 0x38, 0x08, 0xdf, 0xc3, 0x8f, 0x6e, 0x4e, 0xad, - 0x6e, 0x87, 0xa5, 0x2e, 0x4a, 0xaa, 0xbd, 0xc4, 0x86, 0xb6, 0x50, 0xa1, - 0xaa, 0xa0, 0x02, 0x76, 0xd4, 0x89, 0x44, 0x5d, 0x66, 0xa5, 0xf2, 0x2b, - 0x60, 0xe0, 0xc7, 0x25, 0x3d, 0x5c, 0x3c, 0x86, 0xe2, 0xb7, 0x6f, 0x0b, - 0x2b, 0xcb, 0xf7, 0xf5, 0x95, 0x35, 0xa5, 0x38, 0xd1, 0xf5, 0xf8, 0xa8, - 0x72, 0xc7, 0xc0, 0x2f, 0x1e, 0xdb, 0x47, 0xe1, 0xf5, 0xe3, 0x29, 0xb0, - 0x1e, 0xb6, 0x15, 0x96, 0x5d, 0x60, 0x90, 0x1e, 0xd1, 0x5c, 0xa0, 0xf7, - 0x02, 0x8e, 0xfe, 0xef, 0xc5, 0xa4, 0x52, 0xfe, 0x93, 0x6c, 0xb0, 0xac, - 0x1e, 0x33, 0x4f, 0xc5, 0x18, 0x5c, 0xd0, 0x86, 0x00, 0xb2, 0xcc, 0x75, - 0x20, 0x06, 0xf6, 0xd4, 0x58, 0x4d, 0x8e, 0x99, 0x8c, 0x5f, 0xe6, 0xb3, - 0x1a, 0x7d, 0xab, 0x1d, 0x96, 0xdc, 0x64, 0xb9, 0xe5, 0x16, 0xcd, 0xa7, - 0x73, 0x38, 0x43, 0x4b, 0x5f, 0x64, 0x7f, 0x10, 0xd6, 0xa4, 0x45, 0x16, - 0x15, 0xd4, 0x62, 0x3c, 0xea, 0x7b, 0x9c, 0xb2, 0x13, 0x93, 0x18, 0xc8, - 0xfe, 0xfa, 0xa8, 0x71, 0x37, 0xeb, 0x96, 0x1d, 0xdb, 0x50, 0x29, 0xcf, - 0x49, 0x86, 0xd5, 0xa2, 0x1f, 0x38, 0x8d, 0xb9, 0xf6, 0xb6, 0xd1, 0x95, - 0xd9, 0x75, 0x20, 0x02, 0x4c, 0x11, 0xa9, 0xc1, 0x7b, 0x47, 0x16, 0xdf, - 0x70, 0xf9, 0x72, 0x74, 0xc9, 0x28, 0x4d, 0x8a, 0x18, 0xe3, 0xb1, 0x6d, - 0x58, 0xcb, 0x1b, 0x04, 0x7d, 0xda, 0x9f, 0x0d, 0x4e, 0x45, 0x0e, 0x5c, - 0x32, 0xce, 0x1d, 0xba, 0x5a, 0xb8, 0xc9, 0x73, 0x63, 0xf7, 0xae, 0x6b, - 0xfc, 0xd9, 0x86, 0xa6, 0xc8, 0x00, 0x37, 0xcb, 0x02, 0x82, 0x08, 0x1a, - 0x5b, 0xa4, 0x60, 0x55, 0x02, 0x91, 0x69, 0x6b, 0x45, 0x54, 0x2d, 0x1c, - 0xac, 0x53, 0xbd, 0x87, 0x46, 0x67, 0xd4, 0xef, 0xcb, 0x24, 0x28, 0xbd, - 0x9a, 0x6e, 0xd4, 0x7f, 0x0a, 0x16, 0xe3, 0xe7, 0x14, 0xf8, 0x3d, 0xa9, - 0x84, 0x08, 0x50, 0xbf, 0x65, 0xe3, 0x94, 0xe2, 0x3d, 0xe4, 0x25, 0xad, - 0x9a, 0x1c, 0x6e, 0x6f, 0xef, 0xaf, 0x1d, 0xec, 0x86, 0xee, 0x78, 0x3d, - 0x30, 0x7a, 0x7b, 0x56, 0xfc, 0xfd, 0x53, 0xb0, 0x5b, 0x3b, 0x3c, 0xcb, - 0xea, 0xe9, 0xc4, 0x56, 0x82, 0xca, 0xb8, 0xac, 0x3e, 0x6d, 0x50, 0x3c, - 0x04, 0xe6, 0x55, 0x50, 0xde, 0x83, 0x6f, 0x48, 0x74, 0xb5, 0x39, 0x5a, - 0x86, 0xea, 0x61, 0xb6, 0xa0, 0xa3, 0x4d, 0x9b, 0x8c, 0x1f, 0xd7, 0xfb, - 0x5c, 0x12, 0xff, 0xaf, 0xef, 0x94, 0x75, 0x33, 0xbd, 0x42, 0x19, 0x41, - 0x7c, 0xe3, 0x0f, 0x69, 0xae, 0x11, 0x65, 0xfc, 0x42, 0x64, 0xab, 0x18, - 0xe0, 0x10, 0x83, 0x16, 0x80, 0x07, 0x9e, 0x26, 0xb7, 0x55, 0xcc, 0xde, - 0x3a, 0x63, 0xb1, 0x3f, 0x2a, 0x08, 0x1e, 0x40, 0xcb, 0x69, 0xc0, 0x3a, - 0x7e, 0x40, 0xa6, 0xab, 0x1f, 0xf4, 0x79, 0x8a, 0x55, 0x90, 0x26, 0x0c, - 0x72, 0xd9, 0xff, 0x3a, 0xca, 0x31, 0x99, 0x36, 0x98, 0xf2, 0xad, 0x8f, - 0x4d, 0xde, 0x32, 0x22, 0x14, 0xf0, 0x7b, 0xfa, 0xee, 0x91, 0x99, 0x46, - 0x75, 0xf3, 0x5e, 0x99, 0x90, 0x78, 0xf2, 0x07, 0x3d, 0x2d, 0x30, 0x2b, - 0xee, 0x04, 0x3f, 0xc0, 0xe8, 0x88, 0x71, 0xda, 0xcb, 0x7a, 0x46, 0x5f, - 0xd4, 0x12, 0x78, 0xc4, 0x51, 0x6e, 0x80, 0x27, 0x8f, 0xcb, 0x54, 0x2e, - 0xbb, 0x6a, 0x46, 0x63, 0xfb, 0x66, 0x2b, 0x4f, 0xb4, 0x84, 0xc5, 0x28, - 0x8a, 0xdd, 0x4a, 0x3e, 0x47, 0x56, 0xbe, 0x9d, 0x62, 0xf3, 0x6a, 0x76, - 0x71, 0x8c, 0x50, 0x6f, 0x44, 0x2e, 0xf4, 0xbf, 0x9c, 0x64, 0x35, 0xd9, - 0xec, 0x92, 0x71, 0x58, 0xaf, 0xfd, 0xb7, 0xaf, 0x19, 0x26, 0x95, 0x05, - 0x32, 0xe6, 0x09, 0xcd, 0x21, 0x97, 0xe0, 0x01, 0xa7, 0xda, 0x4d, 0x2c, - 0x01, 0xbc, 0x45, 0xd3, 0xe6, 0xb0, 0x87, 0x11, 0x41, 0x8c, 0x14, 0x09, - 0x88, 0x1a, 0x9b, 0xa4, 0x1c, 0x8a, 0x25, 0xb8, 0x82, 0x95, 0xac, 0x28, - 0xa6, 0xeb, 0xf8, 0xe4, 0x44, 0x20, 0xf4, 0x0d, 0xe9, 0x54, 0x04, 0x15, - 0x12, 0xd9, 0xa0, 0xe0, 0xa0, 0x88, 0xf5, 0xd7, 0x97, 0x19, 0xca, 0x8f, - 0xa8, 0x29, 0xca, 0x7f, 0xee, 0x7b, 0xda, 0xda, 0xbe, 0x87, 0xc7, 0x89, - 0x60, 0x24, 0x13, 0xa4, 0xc0, 0x1a, 0x8f, 0x99, 0x75, 0x11, 0x34, 0x5a, - 0xde, 0xf2, 0xa8, 0xda, 0x79, 0x88, 0x97, 0x72, 0xcc, 0xda, 0x71, 0x5b, - 0x97, 0x20, 0xf8, 0x64, 0x2e, 0xaf, 0x9e, 0x4c, 0x6e, 0xa2, 0x28, 0xfe, - 0x6e, 0xe7, 0x89, 0x2f, 0x0c, 0x98, 0x53, 0xb6, 0x12, 0x70, 0x1f, 0x54, - 0xde, 0x17, 0x70, 0x82, 0x0e, 0x95, 0xa6, 0x0f, 0x40, 0x4f, 0xbe, 0xc3, - 0x17, 0xbf, 0x1c, 0xb6, 0x2c, 0xc0, 0x0f, 0x6b, 0x63, 0x61, 0x20, 0x70, - 0x67, 0x75, 0x3c, 0x77, 0x3d, 0x9a, 0xa9, 0xb4, 0x8b, 0x66, 0x15, 0x74, - 0x72, 0xaa, 0xf6, 0x3e, 0xb0, 0xa5, 0x92, 0x18, 0x55, 0x1e, 0x1c, 0x52, - 0xa0, 0xa4, 0xd0, 0x43, 0x78, 0xa2, 0x35, 0xcc, 0x58, 0x96, 0x46, 0x95, - 0xb3, 0x64, 0x30, 0x61, 0x4f, 0x03, 0x23, 0x20, 0x7c, 0x06, 0x6a, 0x22, - 0x29, 0x52, 0xcf, 0x45, 0xfa, 0x87, 0x4f, 0xba, 0x29, 0x40, 0x74, 0x8b, - 0xed, 0xbe, 0x3d, 0x6c, 0xc9, 0xa4, 0xa7, 0x8b, 0x30, 0xf3, 0xd2, 0x5b, - 0x74, 0x22, 0x37, 0xde, 0x67, 0xa5, 0x47, 0x37, 0xc3, 0x5c, 0x7a, 0xb3, - 0xc6, 0x33, 0x73, 0x20, 0xe3, 0xbe, 0x10, 0x07, 0x6f, 0x6e, 0x52, 0x00, - 0xe2, 0xf2, 0x15, 0x6c, 0x44, 0xf3, 0x3f, 0x9e, 0xd6, 0xf8, 0xfa, 0x3d, - 0xa4, 0xc9, 0x60, 0x05, 0xef, 0x4f, 0xd5, 0xd7, 0x35, 0x5f, 0x49, 0xc6, - 0x48, 0x0a, 0x29, 0x37, 0xf3, 0x00, 0x99, 0x63, 0x90, 0x1d, 0xbc, 0x93, - 0x37, 0x36, 0x36, 0x7f, 0x15, 0x73, 0x98, 0x35, 0xe7, 0xee, 0x77, 0x50, - 0xdd, 0xdc, 0x0a, 0x3a, 0x9a, 0x04, 0x2e, 0x71, 0x4c, 0x0a, 0x6a, 0x57, - 0x99, 0x2d, 0x47, 0xe1, 0xb3, 0xec, 0x2d, 0x07, 0xec, 0xee, 0xf2, 0x6a, - 0xe9, 0xbe, 0x78, 0x4d, 0x78, 0x1a, 0xc5, 0x3c, 0x44, 0xb9, 0x19, 0xb7, - 0x88, 0xc7, 0xaf, 0x5e, 0xa3, 0x5b, 0x7e, 0x87, 0x00, 0x41, 0x35, 0x3b, - 0x74, 0x26, 0x6b, 0xe5, 0xfd, 0x3d, 0xf7, 0x52, 0x68, 0x30, 0x80, 0xa0, - 0x65, 0xc2, 0xf5, 0x45, 0xfe, 0x7f, 0xe4, 0x78, 0xd9, 0x11, 0x18, 0x26, - 0xf0, 0x64, 0x8f, 0x1c, 0xe4, 0xa5, 0x3c, 0x14, 0xb6, 0x6a, 0x0e, 0x41, - 0x44, 0x9a, 0x25, 0x23, 0xe6, 0xee, 0x5c, 0x23, 0xb7, 0x42, 0x36, 0x1e, - 0xa2, 0x6a, 0x64, 0x10, 0x4a, 0x77, 0x8e, 0x71, 0xbb, 0x8b, 0x2a, 0x4b, - 0xf3, 0xe7, 0x61, 0x66, 0xa5, 0xa5, 0xa6, 0x48, 0x8a, 0x26, 0xfb, 0x7d, - 0xe7, 0x7c, 0x51, 0xf0, 0xb9, 0xe8, 0xa8, 0x72, 0x8c, 0xa1, 0x79, 0x82, - 0x81, 0x8f, 0x49, 0xfa, 0x86, 0xb5, 0xf7, 0x65, 0x4b, 0x12, 0xfb, 0x2e, - 0xce, 0x2f, 0x6f, 0x39, 0x5d, 0x91, 0x1a, 0xcd, 0x44, 0xc9, 0x61, 0x28, - 0x3f, 0xbc, 0x2e, 0xa5, 0x18, 0xff, 0xc0, 0x5d, 0x7d, 0xab, 0x0f, 0xc4, - 0x98, 0x85, 0xbc, 0x49, 0x9f, 0x5c, 0x14, 0x82, 0xb5, 0x54, 0xf8, 0xd2, - 0xc7, 0xc5, 0xf4, 0x41, 0x82, 0x3c, 0x41, 0xa2, 0x53, 0xf8, 0x06, 0x65, - 0xcd, 0xc5, 0x42, 0x75, 0xd5, 0x18, 0xd1, 0x78, 0xe6, 0x3e, 0x38, 0x00, - 0x2e, 0x4f, 0x6c, 0xd5, 0xcf, 0x2e, 0x24, 0x75, 0xd9, 0x63, 0x85, 0xbc, - 0xd0, 0x2c, 0x13, 0xa4, 0xc2, 0xd5, 0x48, 0x32, 0x0d, 0xdf, 0x90, 0x1f, - 0x14, 0x04, 0xe6, 0x6a, 0x99, 0x5f, 0x7e, 0x3a, 0x13, 0x4c, 0xcf, 0xc6, - 0x8d, 0xf7, 0x71, 0xc6, 0x75, 0x71, 0xd4, 0x5c, 0x5b, 0xa9, 0x0c, 0x9d, - 0x63, 0x0a, 0xe0, 0xa3, 0xc8, 0x04, 0x78, 0x33, 0xf4, 0x66, 0x83, 0xbe, - 0x8c, 0x6c, 0xe8, 0x40, 0xf9, 0xcc, 0x39, 0xd8, 0x19, 0x51, 0xb0, 0xe3, - 0x85, 0x16, 0xfe, 0x43, 0x0a, 0x99, 0x13, 0xef, 0xe7, 0xcb, 0xfc, 0x97, - 0xd6, 0xee, 0x1d, 0xa5, 0x7b, 0xc4, 0x43, 0xf1, 0x20, 0x9a, 0x07, 0x78, - 0x6c, 0x50, 0xb1, 0x02, 0x3e, 0x74, 0xbb, 0x31, 0x3a, 0x1a, 0xa1, 0x37, - 0x9d, 0x50, 0xab, 0x1d, 0x58, 0x00, 0x78, 0xa5, 0x36, 0xbc, 0xb6, 0x6b, - 0x85, 0xbe, 0xde, 0x2c, 0x3c, 0x9f, 0x02, 0x5c, 0x82, 0x49, 0xb3, 0xe0, - 0x94, 0x25, 0xb3, 0x24, 0xf6, 0x8a, 0x7c, 0xb7, 0x26, 0x15, 0x36, 0x35, - 0x23, 0x91, 0x31, 0x10, 0xe1, 0xa8, 0x22, 0xc2, 0xb3, 0x5e, 0x4d, 0x27, - 0xeb, 0x4a, 0xf6, 0x08, 0x87, 0x3d, 0x2b, 0xb3, 0x7d, 0x4c, 0xc8, 0x3b, - 0x9c, 0x59, 0xf2, 0x29, 0x12, 0x6f, 0xf1, 0x30, 0xd5, 0x59, 0x3e, 0x44, - 0xe9, 0x3a, 0xf9, 0x42, 0x43, 0x1c, 0xf6, 0x7d, 0x44, 0x16, 0x57, 0x95, - 0x6e, 0xf3, 0x61, 0xf0, 0x50, 0x89, 0x43, 0xbd, 0x38, 0xc5, 0x6a, 0xd8, - 0x92, 0xff, 0xa5, 0xd2, 0x64, 0x7d, 0x3f, 0x55, 0x19, 0x8d, 0x13, 0xb1, - 0x56, 0x80, 0xb0, 0x89, 0x13, 0xe5, 0x14, 0xc7, 0x84, 0x39, 0x18, 0x60, - 0x92, 0x55, 0x0d, 0x79, 0x72, 0xe1, 0x20, 0xd7, 0x92, 0xfc, 0x3f, 0xa2, - 0x22, 0x79, 0x2c, 0x2c, 0xcd, 0xc1, 0xdc, 0x54, 0x09, 0xa1, 0xf9, 0x98, - 0xb2, 0x07, 0x30, 0x31, 0x74, 0x29, 0xf9, 0x50, 0x87, 0xf4, 0x83, 0x0b, - 0xd9, 0x39, 0x09, 0x95, 0x44, 0xd6, 0xf1, 0xd0, 0xb1, 0x20, 0xc1, 0xa9, - 0x23, 0x6a, 0xb1, 0x35, 0x53, 0x04, 0xbc, 0x0f, 0x6c, 0xb0, 0xae, 0x3b, - 0x9f, 0xc9, 0x5e, 0xd3, 0x92, 0xb5, 0x43, 0xec, 0xdd, 0x3d, 0xcb, 0x7c, - 0xca, 0xa8, 0x7a, 0x49, 0x89, 0x56, 0x96, 0x3b, 0xda, 0x97, 0x93, 0x5f, - 0xca, 0xd6, 0x53, 0xa3, 0xc3, 0x82, 0x78, 0xed, 0x68, 0x09, 0x78, 0x95, - 0x1c, 0x7d, 0x0b, 0xa4, 0xa6, 0xab, 0xaf, 0xaa, 0x78, 0x45, 0x67, 0x34, - 0xc4, 0x4e, 0x23, 0x0f, 0x16, 0x6e, 0xef, 0x22, 0x24, 0xdd, 0xb3, 0x73, - 0x6d, 0x57, 0xcf, 0x8e, 0x38, 0x80, 0x05, 0xb3, 0x4a, 0xa9, 0x5d, 0xd3, - 0x50, 0x8d, 0x6e, 0x2d, 0x93, 0x86, 0x69, 0xeb, 0x46, 0xc1, 0x9e, 0x19, - 0x01, 0xff, 0xbf, 0x08, 0xd8, 0x80, 0x60, 0xc0, 0xd4, 0xaf, 0x49, 0xa1, - 0x41, 0x2b, 0x00, 0x3b, 0xab, 0x21, 0xf6, 0x6f, 0xa4, 0x16, 0x8b, 0x2c, - 0xdf, 0x98, 0xc4, 0x6e, 0x35, 0x47, 0x06, 0x3e, 0x31, 0x81, 0x50, 0xa8, - 0x64, 0x36, 0x04, 0x70, 0x9a, 0x7e, 0x41, 0x66, 0x54, 0x03, 0x6c, 0xc7, - 0x57, 0x1c, 0xac, 0xd9, 0xd6, 0xca, 0xf3, 0x8a, 0x5c, 0xe9, 0x06, 0xd5, - 0x94, 0x72, 0x93, 0x42, 0xdb, 0xef, 0x80, 0xbf, 0x9c, 0x4e, 0x14, 0x6f, - 0xb4, 0x91, 0x58, 0x01, 0x6d, 0x89, 0x62, 0x71, 0xe1, 0x98, 0x9f, 0x69, - 0x7a, 0xca, 0xe4, 0xdb, 0x1a, 0x06, 0x9a, 0x0a, 0x03, 0x4f, 0x07, 0x6d, - 0xe6, 0x37, 0xbf, 0x00, 0x69, 0x26, 0x01, 0x10, 0xa2, 0x6c, 0xf6, 0xe0, - 0x68, 0x8b, 0x1f, 0x31, 0x9d, 0x74, 0xb2, 0xf4, 0x56, 0xc6, 0x02, 0x7b, - 0xd7, 0x9d, 0x38, 0x74, 0x2b, 0x32, 0x4a, 0x88, 0x12, 0xe5, 0x8d, 0xc8, - 0xc6, 0xed, 0x90, 0x5c, 0xd2, 0x76, 0x50, 0xd2, 0x13, 0x61, 0xf8, 0x96, - 0x73, 0xf3, 0x48, 0xa1, 0x2d, 0x6f, 0x3a, 0x9c, 0xf8, 0x3c, 0x06, 0xef, - 0xfc, 0x52, 0xfb, 0xbc, 0xf2, 0x21, 0x15, 0x57, 0xc2, 0x0c, 0x7c, 0x1b, - 0xbd, 0x38, 0xb8, 0x11, 0xbf, 0x25, 0x99, 0x13, 0x5d, 0x0e, 0xd9, 0x2c, - 0x0a, 0x7c, 0x99, 0x72, 0x33, 0xa6, 0x5f, 0xf7, 0xf9, 0xba, 0x1a, 0x78, - 0x37, 0x81, 0x4e, 0x83, 0x92, 0xa9, 0x36, 0x88, 0xf0, 0x19, 0x88, 0xa6, - 0x9e, 0x09, 0xce, 0x61, 0x37, 0x2c, 0xfb, 0xd4, 0x78, 0x41, 0x23, 0x0b, - 0xb8, 0x40, 0x8e, 0xc4, 0x43, 0xa6, 0x19, 0xc2, 0x75, 0xb2, 0x82, 0xa5, - 0x84, 0x70, 0x1d, 0x22, 0x4d, 0x72, 0xfc, 0x37, 0x33, 0xc7, 0x9d, 0xe5, - 0x6e, 0x97, 0xc9, 0x68, 0x7d, 0xf4, 0x17, 0xa9, 0xa6, 0x4f, 0xdd, 0xa2, - 0xf4, 0x4d, 0x02, 0x66, 0x3c, 0x2f, 0x9a, 0x1c, 0x01, 0xdd, 0x2d, 0x2c, - 0xb6, 0xac, 0xfc, 0x21, 0x35, 0x9a, 0xe1, 0x99, 0x2a, 0x5a, 0xc9, 0x81, - 0x5e, 0xb6, 0x9d, 0xe0, 0x85, 0x3a, 0x02, 0xfe, 0x72, 0x42, 0x67, 0xe1, - 0xdb, 0xd2, 0x1c, 0x4f, 0x62, 0x15, 0x83, 0x51, 0xfd, 0x49, 0xc5, 0xb2, - 0x60, 0xba, 0xa3, 0xeb, 0xf7, 0xb4, 0x21, 0x20, 0x4c, 0x14, 0x10, 0x9e, - 0x78, 0xa8, 0xa6, 0x08, 0x7b, 0xf8, 0x1b, 0x88, 0x5f, 0x99, 0xa8, 0x1d, - 0x8d, 0x59, 0x79, 0x04, 0x8b, 0xc4, 0x19, 0x36, 0xd0, 0xa0, 0xc2, 0x66, - 0x1b, 0x86, 0xad, 0x81, 0xbd, 0x22, 0x3d, 0xa7, 0x3f, 0xd1, 0xf7, 0x99, - 0xda, 0x6c, 0xaa, 0xdc, 0xe6, 0x99, 0x27, 0x12, 0x80, 0x01, 0x4b, 0x48, - 0x4e, 0x2a, 0x2e, 0x51, 0x07, 0xc6, 0x24, 0xe2, 0x08, 0x74, 0xfc, 0x43, - 0xb6, 0x15, 0x5b, 0x24, 0x29, 0xef, 0x6b, 0xf1, 0x8b, 0x88, 0x62, 0xb6, - 0x99, 0x91, 0xf1, 0xa8, 0x80, 0x7e, 0x65, 0x74, 0x9d, 0xcf, 0x4b, 0xa9, - 0xba, 0x55, 0x09, 0xfe, 0xe7, 0x1b, 0x17, 0xa8, 0xeb, 0x13, 0xfa, 0x20, - 0x25, 0x37, 0xbc, 0xe1, 0xba, 0x1c, 0x65, 0xbe, 0x3d, 0x9b, 0x78, 0xcd, - 0x03, 0xf0, 0xac, 0xfc, 0x5a, 0x98, 0x30, 0x90, 0xe0, 0x9f, 0xb2, 0x3a, - 0x8f, 0x6e, 0x76, 0x1d, 0x36, 0x35, 0xf7, 0x7f, 0xfa, 0x4d, 0xa0, 0xb5, - 0x4b, 0x0b, 0xc3, 0x45, 0xc3, 0x08, 0x50, 0xfd, 0x6f, 0x18, 0x3d, 0xa6, - 0x3e, 0x57, 0xf8, 0x51, 0x24, 0x26, 0x79, 0x4f, 0x34, 0x0b, 0x4e, 0xd2, - 0xc7, 0x4c, 0x3f, 0x3d, 0x82, 0xdf, 0x0f, 0xa2, 0x94, 0x3f, 0x2f, 0x11, - 0x30, 0x92, 0x56, 0x44, 0x05, 0x82, 0x01, 0x48, 0xfe, 0x1d, 0x5f, 0xbd, - 0x14, 0x5b, 0x27, 0x3c, 0x55, 0x09, 0x02, 0x65, 0x60, 0xad, 0x81, 0xe2, - 0xe4, 0x40, 0x7c, 0xa9, 0xec, 0x2f, 0x72, 0xed, 0x28, 0xb7, 0x4a, 0x0a, - 0x70, 0xaf, 0x14, 0x04, 0xd5, 0xb8, 0xad, 0x16, 0x5a, 0xad, 0xfd, 0xfa, - 0x5e, 0xd5, 0x39, 0x87, 0x08, 0x70, 0x23, 0xce, 0xc3, 0x41, 0xdb, 0x84, - 0x36, 0xd8, 0x9f, 0xb9, 0x2f, 0xa2, 0x89, 0xaa, 0xca, 0x33, 0xcf, 0x4b, - 0x56, 0x20, 0xc0, 0xb2, 0xf6, 0xb4, 0xdb, 0xd9, 0x6c, 0x68, 0xb4, 0xc1, - 0xe9, 0xfb, 0x6e, 0x52, 0x9a, 0x45, 0x33, 0x69, 0x30, 0x9c, 0x4b, 0x40, - 0x09, 0xab, 0xf7, 0x78, 0x1a, 0x99, 0x8e, 0xbd, 0x7c, 0xc8, 0x6c, 0xcb, - 0x3b, 0x67, 0x9a, 0x8e, 0x12, 0x6e, 0x28, 0x05, 0x1b, 0xd6, 0x68, 0xe7, - 0xdb, 0x83, 0x14, 0x16, 0xde, 0x03, 0x04, 0xb2, 0x8d, 0x82, 0x5b, 0x7b, - 0x5b, 0x73, 0xa3, 0xa2, 0xdd, 0x88, 0x44, 0x5f, 0x94, 0xd2, 0xe4, 0xd8, - 0xa5, 0x25, 0xf6, 0x5b, 0x12, 0x09, 0x39, 0x29, 0xf4, 0xa2, 0x84, 0x41, - 0x26, 0x5d, 0x92, 0x00, 0x14, 0x61, 0xd8, 0x33, 0x80, 0x35, 0x75, 0x7c, - 0xe5, 0xb7, 0xaf, 0xa9, 0xe3, 0x0c, 0x50, 0xea, 0xd6, 0xbd, 0x04, 0xc7, - 0x9b, 0x02, 0x3e, 0xb9, 0xf3, 0x24, 0x1d, 0x1f, 0xb7, 0x23, 0x8d, 0x23, - 0x17, 0xd9, 0x24, 0xe4, 0x65, 0xb9, 0x9b, 0x48, 0x5a, 0x6d, 0x24, 0xaf, - 0x66, 0xe7, 0xc6, 0x05, 0x92, 0x3e, 0x15, 0xb5, 0xf9, 0x3d, 0x89, 0xf3, - 0x5a, 0xbd, 0x89, 0x9a, 0x67, 0x40, 0x3a, 0x37, 0xa7, 0x50, 0xbe, 0x56, - 0xd2, 0x70, 0xef, 0xf8, 0x44, 0x76, 0x0b, 0x3c, 0x50, 0x17, 0xd3, 0x23, - 0x63, 0x4f, 0xa4, 0xc1, 0x77, 0x80, 0xcb, 0xa7, 0x5a, 0xe0, 0x97, 0xb3, - 0x88, 0xd5, 0x8d, 0x12, 0xe7, 0x9e, 0x97, 0x74, 0x29, 0xc9, 0xb2, 0xe0, - 0xc6, 0xe7, 0x5f, 0x07, 0x1a, 0x7d, 0xde, 0x1b, 0x56, 0xfd, 0xb2, 0xc2, - 0x83, 0x9a, 0x6b, 0x37, 0x2c, 0x43, 0x6f, 0x39, 0x22, 0x37, 0x81, 0x63, - 0xbd, 0x30, 0xac, 0x4e, 0x80, 0xaa, 0xa7, 0x30, 0x76, 0xa7, 0x6b, 0x72, - 0x72, 0xef, 0xd0, 0xde, 0x15, 0x07, 0xc7, 0xd2, 0xfd, 0x61, 0xb8, 0xd4, - 0x52, 0xd0, 0xa7, 0x46, 0x62, 0x57, 0xc0, 0xda, 0x35, 0x56, 0x1b, 0x0e, - 0x27, 0xe1, 0x4d, 0x41, 0x49, 0x36, 0x9c, 0xcb, 0xc5, 0xe5, 0x23, 0x81, - 0xbe, 0x29, 0x9b, 0x4e, 0x2c, 0x8a, 0xa3, 0x0e, 0x1f, 0x66, 0x44, 0x24, - 0x6f, 0x96, 0x4f, 0xd4, 0xf5, 0xa1, 0xea, 0x4e, 0x0d, 0xe2, 0xe6, 0xd8, - 0x7e, 0x73, 0xf4, 0x3e, 0x56, 0xbf, 0xa6, 0xa7, 0x98, 0x57, 0x88, 0xd8, - 0x68, 0x58, 0xc6, 0x58, 0x65, 0x0d, 0xf7, 0x49, 0x49, 0x37, 0x6e, 0x38, - 0xc7, 0x94, 0xb5, 0x3c, 0x29, 0x30, 0xdd, 0xcf, 0x68, 0x9d, 0x54, 0x04, - 0x6d, 0xd6, 0x43, 0x0f, 0xbd, 0x98, 0x8a, 0xd6, 0x82, 0x03, 0x1d, 0x6d, - 0xea, 0x68, 0xfa, 0xc0, 0x08, 0xd6, 0x4d, 0x52, 0x36, 0x97, 0xd1, 0x68, - 0x9c, 0xe9, 0x2b, 0x21, 0x43, 0x33, 0x7c, 0x46, 0x08, 0x52, 0xd9, 0x25, - 0x38, 0x8c, 0xbb, 0xfe, 0xa1, 0xc6, 0x90, 0xbc, 0xaa, 0x7b, 0xb7, 0x46, - 0x43, 0x59, 0x1d, 0xad, 0xb6, 0xa6, 0xcb, 0x27, 0x5c, 0xbc, 0x12, 0x6c, - 0x82, 0xd2, 0x0e, 0x7b, 0x64, 0xe6, 0x12, 0xa1, 0x0f, 0x23, 0xfe, 0x54, - 0x51, 0xb5, 0x2e, 0x17, 0x7b, 0x8b, 0x66, 0xc2, 0xd3, 0x4e, 0x6d, 0xca, - 0xa5, 0x7c, 0xcb, 0x51, 0x11, 0xc2, 0x61, 0x19, 0x56, 0x73, 0xda, 0x04, - 0x36, 0xe6, 0xd5, 0x38, 0x9e, 0x86, 0x1a, 0x82, 0xd4, 0x9f, 0x13, 0xad, - 0x54, 0x0f, 0x53, 0xf9, 0x59, 0x57, 0xe6, 0x45, 0xc8, 0x96, 0xb5, 0xd7, - 0x36, 0x4e, 0xc7, 0xad, 0xc5, 0xdf, 0xa8, 0xb0, 0x32, 0x77, 0x56, 0x43, - 0x31, 0xd7, 0x28, 0xc3, 0xf2, 0x6d, 0x53, 0x2c, 0x33, 0x7d, 0x6c, 0x0b, - 0xbf, 0x0b, 0xf5, 0x60, 0xad, 0x17, 0x5b, 0xc9, 0x48, 0x15, 0x9a, 0x4e, - 0x3e, 0x75, 0x09, 0xab, 0x6a, 0x89, 0x1e, 0x12, 0x29, 0xf6, 0xc3, 0x1b, - 0x48, 0xb7, 0xf6, 0x28, 0xeb, 0x05, 0x97, 0xdd, 0x0d, 0x45, 0xfc, 0x9a, - 0x71, 0x3e, 0x58, 0x35, 0xd6, 0x79, 0x42, 0xa0, 0xac, 0x97, 0x2b, 0x2d, - 0x62, 0x8a, 0xa7, 0xe1, 0x45, 0x6e, 0x1f, 0xf6, 0x11, 0xa2, 0x58, 0xbe, - 0xfc, 0xb7, 0x94, 0xe7, 0x2b, 0x20, 0xc9, 0x7d, 0xb6, 0xb9, 0x93, 0x43, - 0x5e, 0x20, 0xa8, 0x2e, 0x79, 0x8e, 0xd8, 0x26, 0xc0, 0x5e, 0x46, 0xcd, - 0xaa, 0x6d, 0xb6, 0x6c, 0xa4, 0x77, 0xc6, 0x1f, 0x13, 0x82, 0x20, 0x8c, - 0x4a, 0x72, 0xcd, 0x35, 0xd3, 0x65, 0x98, 0xe8, 0xd8, 0xaa, 0xd1, 0x68, - 0x0a, 0x32, 0x00, 0xad, 0xac, 0xe1, 0x69, 0x51, 0x94, 0xe0, 0xbf, 0x7e, - 0xb6, 0x95, 0xb8, 0xba, 0xe6, 0xdf, 0xff, 0x7a, 0xf0, 0x68, 0xb9, 0x15, - 0x7f, 0x85, 0xe7, 0x0f, 0xff, 0x80, 0xbc, 0x60, 0xf6, 0x8c, 0x66, 0xf9, - 0x3e, 0x0b, 0x91, 0x14, 0x20, 0x2a, 0xd3, 0x88, 0x67, 0x8b, 0xdc, 0x8f, - 0x4e, 0x0a, 0xe9, 0x06, 0x88, 0x76, 0x5f, 0x93, 0xdb, 0x51, 0x4b, 0xa4, - 0x93, 0x64, 0x55, 0xc7, 0x1a, 0xcc, 0x9f, 0x7d, 0x0e, 0x53, 0x22, 0x31, - 0xa5, 0x74, 0x24, 0x4b, 0x2c, 0xf0, 0x22, 0x02, 0xa3, 0x2a, 0xe4, 0x2b, - 0x1a, 0x74, 0x8a, 0xf9, 0x25, 0x9e, 0x60, 0x1a, 0x4f, 0x6e, 0x2d, 0x0a, - 0x77, 0x1e, 0x36, 0x20, 0x22, 0x30, 0x93, 0xc7, 0x65, 0xd0, 0xe5, 0x94, - 0x8c, 0x3c, 0x0b, 0x21, 0x97, 0xd9, 0x0f, 0x08, 0x62, 0x0c, 0x44, 0x41, - 0x4f, 0xd7, 0xee, 0x41, 0xc4, 0xa2, 0xdb, 0xf7, 0x3b, 0x30, 0x70, 0x66, - 0x67, 0xa5, 0x54, 0xaf, 0x6d, 0x21, 0x48, 0x50, 0xc0, 0x57, 0x08, 0xf5, - 0x18, 0xb9, 0xf8, 0xaf, 0x26, 0x33, 0x29, 0x5d, 0x6f, 0x39, 0x63, 0x21, - 0x66, 0x49, 0x48, 0x51, 0xe9, 0xc7, 0xa4, 0x22, 0xa2, 0x59, 0x37, 0x80, - 0x81, 0x45, 0x21, 0x44, 0xb5, 0x7f, 0x61, 0x07, 0xfd, 0xb5, 0xde, 0xbc, - 0xff, 0xd2, 0x25, 0x94, 0x2f, 0x2c, 0xaa, 0xf0, 0x48, 0xe8, 0x21, 0xc5, - 0x9d, 0xde, 0x7a, 0xd5, 0x03, 0x6b, 0x3d, 0x34, 0xfc, 0x60, 0x82, 0xf3, - 0xe9, 0x7b, 0x46, 0xf7, 0x8c, 0x0b, 0x55, 0xdf, 0x66, 0x83, 0xa1, 0xde, - 0x03, 0xda, 0xf2, 0x95, 0xc3, 0x96, 0xfc, 0x06, 0xd1, 0x6e, 0xe0, 0x4b, - 0x6e, 0xd5, 0xae, 0x74, 0xad, 0x59, 0x19, 0x6d, 0xb6, 0x8b, 0xa1, 0xfa, - 0x94, 0x17, 0x00, 0x65, 0x7e, 0xe0, 0xea, 0xa0, 0x56, 0x52, 0x44, 0xc2, - 0x68, 0x86, 0xbe, 0x55, 0xd3, 0x79, 0xb4, 0xb2, 0x80, 0x80, 0xa4, 0xee, - 0x1c, 0x23, 0xe9, 0xbd, 0x1b, 0x23, 0x3a, 0x30, 0xbd, 0x1a, 0x4c, 0x96, - 0x0f, 0xfd, 0x34, 0xe5, 0xa4, 0x08, 0x73, 0x72, 0xa4, 0x73, 0x03, 0xcf, - 0xbd, 0x8c, 0x47, 0x81, 0xc8, 0x8e, 0xa3, 0x21, 0xde, 0x07, 0x00, 0x3b, - 0x5d, 0x4d, 0x1f, 0x6b, 0xb0, 0xf9, 0x78, 0xbf, 0xe3, 0xaf, 0xd6, 0xda, - 0x35, 0x79, 0x0d, 0x52, 0xa3, 0x23, 0x18, 0x25, 0x3d, 0x85, 0xf0, 0x01, - 0xc2, 0x93, 0xbf, 0xdb, 0x43, 0xb2, 0x19, 0x5a, 0xce, 0xd4, 0x3c, 0xbe, - 0x00, 0x94, 0x71, 0xc7, 0xb0, 0x5c, 0xa1, 0xdb, 0x04, 0x4e, 0x89, 0x9f, - 0x53, 0x06, 0xcc, 0x1a, 0xba, 0x82, 0x88, 0x8b, 0xd1, 0x30, 0x3e, 0x03, - 0x59, 0x2d, 0xef, 0x8f, 0x1f, 0x4b, 0x6b, 0x5b, 0xa7, 0xa3, 0xb6, 0xfd, - 0xa9, 0x16, 0x1b, 0xec, 0x70, 0xa8, 0xcb, 0x37, 0x4f, 0x76, 0x6d, 0x5b, - 0x58, 0xf2, 0xcf, 0x02, 0x15, 0x54, 0xa2, 0xd3, 0x86, 0xbf, 0x43, 0x22, - 0xcc, 0x80, 0xfe, 0x95, 0xfd, 0x6b, 0x48, 0xec, 0x10, 0xc8, 0x2a, 0x73, - 0x7d, 0xff, 0xa9, 0xe4, 0x05, 0x64, 0x50, 0xb7, 0xb9, 0x43, 0xbb, 0xa7, - 0xee, 0x6e, 0x1e, 0x99, 0xee, 0x5b, 0x19, 0x29, 0x0d, 0x57, 0x29, 0xe9, - 0xc5, 0x81, 0x92, 0x33, 0x92, 0xfc, 0xdd, 0x80, 0x4e, 0x9d, 0x7f, 0x5a, - 0xd1, 0xbe, 0x02, 0x23, 0x2e, 0x54, 0x17, 0x51, 0x6f, 0xb5, 0x7e, 0xd4, - 0xc4, 0x88, 0xea, 0x38, 0xaf, 0x38, 0xfc, 0xf0, 0x98, 0x2f, 0x00, 0xef, - 0x38, 0x35, 0x29, 0x72, 0xc6, 0xf5, 0x0b, 0xfb, 0xa8, 0x5a, 0xe3, 0x53, - 0xa7, 0xb5, 0x3f, 0x3d, 0x5b, 0xdd, 0xfa, 0x43, 0xe6, 0x7a, 0x23, 0x0e, - 0x43, 0x30, 0x8d, 0x11, 0x02, 0x99, 0x1e, 0x0c, 0x41, 0xd4, 0x07, 0x8d, - 0xaa, 0x03, 0x15, 0x10, 0x06, 0xe2, 0xfc, 0x58, 0x5b, 0x07, 0x5b, 0x3c, - 0x41, 0x84, 0xa4, 0xd2, 0xcc, 0x29, 0xe9, 0xd5, 0xa5, 0xa2, 0xc1, 0x72, - 0xa3, 0x70, 0x43, 0x48, 0x7d, 0x43, 0x64, 0x76, 0x5f, 0xb9, 0x24, 0xe0, - 0x79, 0x8c, 0xf8, 0x21, 0xbb, 0xfe, 0x2d, 0xbe, 0xf3, 0xc3, 0xdb, 0x2a, - 0xfb, 0x77, 0xac, 0x6d, 0xc9, 0xd1, 0x0b, 0xba, 0x8c, 0x91, 0x1e, 0xf4, - 0x9b, 0x73, 0x1e, 0x77, 0x50, 0x29, 0x0a, 0xf2, 0x3d, 0x36, 0x71, 0x9e, - 0xc9, 0xc9, 0x27, 0x5d, 0x8a, 0x12, 0xca, 0x78, 0x51, 0x77, 0xfc, 0x97, - 0xfe, 0xf4, 0x12, 0xce, 0x15, 0xfd, 0x9f, 0xfb, 0x86, 0x3b, 0x5b, 0xbe, - 0x17, 0xa4, 0x80, 0x92, 0x25, 0x41, 0x0b, 0x7a, 0x1d, 0xb5, 0x55, 0x14, - 0xb3, 0x86, 0x3c, 0x1b, 0x9f, 0xc8, 0x7d, 0xbb, 0xaf, 0x00, 0xad, 0x9e, - 0x89, 0x45, 0x7d, 0xfd, 0xc3, 0x65, 0xd1, 0x8d, 0xf2, 0xd6, 0x7b, 0x0f, - 0xea, 0xa9, 0xd3, 0x5d, 0xe8, 0x7e, 0xe2, 0xf2, 0xab, 0x22, 0xa8, 0x9d, - 0x6a, 0x62, 0x65, 0x67, 0x3d, 0x67, 0xf9, 0xdd, 0x53, 0x3f, 0x52, 0x80, - 0xb3, 0xb7, 0x28, 0x12, 0xac, 0x37, 0x7a, 0x6a, 0x49, 0x22, 0x08, 0x2f, - 0x52, 0xbf, 0x6e, 0xec, 0xef, 0xd7, 0x38, 0xc5, 0x59, 0xce, 0x91, 0xfc, - 0xc9, 0x5c, 0x45, 0x46, 0xf3, 0xee, 0xea, 0xae, 0xc6, 0x49, 0x79, 0xf0, - 0x24, 0x35, 0x71, 0x6f, 0xbe, 0x61, 0xab, 0x9c, 0xc8, 0x66, 0xd4, 0x7d, - 0xb0, 0x78, 0xa2, 0x72, 0xad, 0x8a, 0x48, 0x8e, 0xbb, 0x12, 0xa6, 0x7f, - 0xc8, 0x15, 0xec, 0xf4, 0xd6, 0xcd, 0xfc, 0x7b, 0xdf, 0xe1, 0x57, 0xb2, - 0x47, 0x9d, 0x5f, 0x91, 0x08, 0x92, 0xbb, 0x4d, 0x3d, 0x80, 0x96, 0xf8, - 0xb4, 0xf3, 0x6c, 0x3b, 0x8f, 0xb3, 0x68, 0xe2, 0xf2, 0xed, 0xc5, 0x79, - 0xed, 0x7b, 0x6b, 0xcc, 0xe4, 0x26, 0x24, 0x93, 0x87, 0xd8, 0x5f, 0x96, - 0x29, 0x60, 0x42, 0x5c, 0x2e, 0x56, 0xab, 0xad, 0x97, 0x16, 0xab, 0x8b, - 0x75, 0x49, 0xd2, 0xdd, 0xe5, 0xbf, 0xd0, 0x54, 0x83, 0x72, 0x6b, 0x1f, - 0x05, 0x96, 0x9b, 0x1c, 0xac, 0x6f, 0x62, 0xd1, 0x0b, 0xfb, 0x23, 0x21, - 0x98, 0x31, 0x11, 0x6e, 0xf6, 0x6d, 0x77, 0x7f, 0x61, 0x38, 0xc1, 0x4e, - 0x85, 0x83, 0x90, 0xc9, 0x2c, 0x4e, 0x79, 0x6e, 0x28, 0x26, 0xc0, 0xfd, - 0x82, 0xcb, 0xe0, 0x70, 0xbf, 0x4b, 0x0f, 0x31, 0x36, 0xef, 0x93, 0xfd, - 0xf8, 0xf8, 0xa4, 0x25, 0x89, 0x19, 0xcd, 0x65, 0x7f, 0x70, 0x42, 0xe2, - 0xe4, 0xd0, 0x9c, 0x0d, 0x9d, 0xae, 0xab, 0x9f, 0xa4, 0x78, 0x71, 0x48, - 0xdf, 0x3a, 0x6c, 0x1f, 0xad, 0x27, 0x0d, 0x81, 0x4a, 0x0f, 0x3f, 0xcb, - 0x17, 0x1e, 0x89, 0x6c, 0x97, 0x3d, 0xa6, 0x2a, 0x73, 0xff, 0x8a, 0x42, - 0xeb, 0x54, 0x5e, 0xb8, 0xe0, 0x4d, 0x17, 0x58, 0xf3, 0x68, 0xaa, 0xae, - 0x08, 0xef, 0x65, 0x51, 0xfa, 0xa1, 0x92, 0x5d, 0x10, 0x00, 0x75, 0x07, - 0xa9, 0x1f, 0x05, 0xca, 0x58, 0x14, 0xad, 0x7e, 0x36, 0xe7, 0x51, 0xe2, - 0xb6, 0x01, 0x0c, 0xe1, 0xbe, 0x0c, 0x84, 0x88, 0x67, 0x04, 0x40, 0xdf, - 0x70, 0xe0, 0xda, 0x47, 0xc3, 0x1b, 0x20, 0x09, 0x08, 0x8b, 0xf2, 0x6f, - 0x27, 0x1a, 0x19, 0xd7, 0x84, 0x64, 0x58, 0xba, 0xaa, 0xe3, 0xbd, 0xea, - 0xb8, 0xb1, 0xb4, 0x6a, 0x45, 0x94, 0x32, 0xf2, 0x0e, 0x54, 0x9b, 0xb6, - 0xc6, 0xc0, 0x35, 0x9b, 0xb1, 0xdf, 0x60, 0x42, 0xfb, 0x7e, 0xc4, 0x39, - 0x62, 0x9b, 0x99, 0x00, 0x24, 0xa1, 0x95, 0x1f, 0x75, 0x89, 0x34, 0x98, - 0x31, 0x5a, 0xf3, 0x7b, 0x70, 0x1a, 0xdb, 0xc4, 0x46, 0x27, 0xc1, 0x88, - 0xf4, 0x7e, 0x96, 0xcf, 0x39, 0x86, 0xc2, 0x10, 0xf7, 0xb7, 0x73, 0x16, - 0xb0, 0xc2, 0x31, 0x2f, 0xfe, 0x79, 0x0f, 0xd2, 0x2b, 0x34, 0xd5, 0x43, - 0x64, 0x61, 0x2b, 0xed, 0x9b, 0x6a, 0x17, 0x75, 0x1f, 0xa9, 0xdd, 0x10, - 0xf2, 0x28, 0x49, 0xba, 0x9d, 0x3b, 0x8c, 0x65, 0x07, 0x84, 0x9d, 0x93, - 0x6e, 0x9b, 0x47, 0x0f, 0x0d, 0x0f, 0xa7, 0xb0, 0xf6, 0xeb, 0x89, 0x12, - 0x4e, 0xc5, 0x04, 0x8c, 0xf7, 0x86, 0x13, 0x19, 0xff, 0xfc, 0x44, 0x4f, - 0x33, 0xb1, 0x76, 0xe3, 0x44, 0xc5, 0x4e, 0x89, 0x02, 0x40, 0x79, 0x7a, - 0x48, 0xde, 0x41, 0xb9, 0x1c, 0xc6, 0x93, 0xa1, 0x8b, 0xe7, 0x93, 0x6a, - 0x65, 0xf0, 0x66, 0xfa, 0x38, 0x0d, 0xbe, 0xc0, 0x42, 0x09, 0xf0, 0x75, - 0x01, 0xbf, 0x02, 0x05, 0x7e, 0x36, 0x44, 0x8e, 0x28, 0x58, 0xe5, 0x93, - 0xeb, 0xec, 0x83, 0xb0, 0x0a, 0xf8, 0x75, 0xf3, 0xc4, 0x5a, 0x82, 0xfa, - 0x8a, 0x87, 0x0c, 0x39, 0xfb, 0x32, 0xf5, 0xb3, 0x87, 0x74, 0xe1, 0xc2, - 0x76, 0x5f, 0xe0, 0x29, 0x63, 0xcc, 0xd9, 0x9e, 0x54, 0x06, 0xa2, 0x69, - 0x7d, 0xf7, 0x92, 0x7a, 0xc0, 0xb9, 0x38, 0xd2, 0xc3, 0xa9, 0x26, 0x85, - 0xa2, 0x97, 0x0a, 0xeb, 0x93, 0x3e, 0xf8, 0xa4, 0xa1, 0x74, 0xe6, 0x67, - 0xfa, 0x42, 0x03, 0x35, 0x50, 0x60, 0x68, 0x8f, 0x1e, 0x63, 0x70, 0x6a, - 0x43, 0xc8, 0xc8, 0xef, 0xfd, 0xf2, 0x4a, 0xbe, 0x6c, 0x86, 0xfd, 0x0e, - 0xbb, 0x63, 0xc0, 0x47, 0x32, 0x02, 0x45, 0x2a, 0x4e, 0xab, 0x85, 0x5d, - 0x37, 0x87, 0x6b, 0x2d, 0x15, 0x50, 0x7e, 0x33, 0xbe, 0x47, 0x51, 0xba, - 0x2a, 0x08, 0x09, 0xe6, 0xbf, 0x40, 0xc2, 0x2f, 0xb0, 0x3c, 0xef, 0x10, - 0xec, 0x4c, 0x4b, 0xe8, 0xee, 0xa6, 0x40, 0xc8, 0x48, 0xe6, 0xab, 0x11, - 0x0f, 0x5a, 0x8f, 0x35, 0x4d, 0xaa, 0x9b, 0xb6, 0x94, 0xd1, 0x9c, 0xbe, - 0xdd, 0xa3, 0x69, 0xa2, 0x53, 0x44, 0x6a, 0x95, 0xd9, 0xfa, 0x3f, 0x8f, - 0xfc, 0x33, 0x74, 0xbc, 0x3e, 0x7d, 0xeb, 0x2f, 0x65, 0x17, 0xf3, 0xf2, - 0xd7, 0x18, 0xa8, 0xc5, 0x22, 0xf0, 0x55, 0xa8, 0x25, 0x17, 0xf2, 0x57, - 0x73, 0xd7, 0x99, 0xec, 0xdf, 0xb2, 0x39, 0xb9, 0x2e, 0xbe, 0x15, 0x36, - 0xbf, 0xd6, 0x29, 0x8e, 0xdf, 0xa0, 0xf5, 0x9b, 0x29, 0x7a, 0xf8, 0xe5, - 0xf9, 0x59, 0x10, 0xbd, 0x87, 0x28, 0xbe, 0x61, 0xea, 0x32, 0x12, 0x7f, - 0xab, 0xef, 0xf0, 0x2a, 0x0c, 0x2c, 0x88, 0xe5, 0x90, 0xe6, 0xea, 0x44, - 0x36, 0x39, 0xc4, 0x3f, 0x4c, 0x2c, 0x8f, 0x04, 0x85, 0xf9, 0x34, 0x13, - 0x4a, 0x8b, 0xa1, 0x10, 0xf8, 0x44, 0xaf, 0x6b, 0xb2, 0x19, 0x83, 0x5a, - 0x8f, 0x42, 0xd8, 0x10, 0x31, 0x53, 0xe1, 0xe8, 0x93, 0xe9, 0x89, 0x6e, - 0x47, 0x89, 0xc0, 0xf4, 0x0e, 0xb6, 0xad, 0xb8, 0x03, 0x51, 0x0a, 0x7f, - 0xba, 0x1f, 0xab, 0x53, 0xed, 0x70, 0x02, 0x06, 0x51, 0x04, 0x4f, 0xeb, - 0x75, 0xbe, 0xca, 0x9c, 0x11, 0xff, 0x1d, 0xd6, 0xc0, 0xd1, 0xa8, 0x5b, - 0xc5, 0x8d, 0x76, 0xb5, 0xbf, 0x29, 0xf7, 0x08, 0x26, 0x68, 0x50, 0x73, - 0x95, 0x93, 0x28, 0xc0, 0x83, 0x16, 0xf1, 0x8c, 0xa6, 0x51, 0x56, 0xcd, - 0xbe, 0x89, 0x13, 0xa6, 0xbf, 0x0d, 0x75, 0xd1, 0xa5, 0x94, 0xa9, 0xfe, - 0xf9, 0x24, 0x61, 0x87, 0xa6, 0x34, 0x73, 0xf3, 0xe8, 0xcc, 0x66, 0xa1, - 0xb4, 0x63, 0x6b, 0x27, 0xa4, 0x4e, 0x61, 0x30, 0xb5, 0xa8, 0x23, 0x54, - 0xb0, 0x6d, 0x3b, 0x69, 0x23, 0x7b, 0xb4, 0x04, 0xce, 0x16, 0x77, 0x0d, - 0xf3, 0xc8, 0xfe, 0x84, 0xc8, 0xe9, 0x82, 0xdd, 0x18, 0x1e, 0x60, 0x31, - 0x55, 0x91, 0xc5, 0xa3, 0x56, 0xee, 0x00, 0xd5, 0x74, 0x29, 0x17, 0x2a, - 0xfb, 0xbc, 0x80, 0xd3, 0x89, 0xf9, 0xa1, 0x42, 0xc2, 0xe4, 0x40, 0x57, - 0x91, 0x7e, 0x83, 0xe1, 0x34, 0x59, 0xb6, 0x9a, 0x37, 0xb3, 0x28, 0xc8, - 0x90, 0xb8, 0xe1, 0x2b, 0x92, 0x9d, 0x38, 0xe7, 0x0a, 0x4e, 0x81, 0x64, - 0x51, 0x8b, 0x8e, 0x10, 0xa6, 0x08, 0x12, 0xef, 0x9d, 0x6b, 0x0c, 0x17, - 0x32, 0xcc, 0x5a, 0x4d, 0xbe, 0x75, 0x6d, 0x15, 0xdd, 0xab, 0x96, 0x2a, - 0x7d, 0x6d, 0x84, 0x34, 0xe8, 0xd7, 0xc8, 0xfc, 0x74, 0xe0, 0x1a, 0x2c, - 0x39, 0xdd, 0xed, 0x88, 0x8e, 0x73, 0x02, 0xd0, 0x47, 0x4c, 0x5c, 0xfe, - 0x33, 0x12, 0xbc, 0x0f, 0xd3, 0x9d, 0x6d, 0x31, 0xff, 0xb2, 0xf9, 0x05, - 0xac, 0x95, 0xbc, 0x45, 0x34, 0xde, 0x72, 0x82, 0x1c, 0x14, 0x27, 0x1e, - 0xfa, 0x4d, 0x88, 0xa8, 0x1a, 0x67, 0x60, 0x8e, 0xfa, 0xf7, 0x73, 0x15, - 0xf1, 0x27, 0x25, 0x99, 0xaf, 0x84, 0x3f, 0x87, 0x15, 0x11, 0xbf, 0x83, - 0xd9, 0xc8, 0x69, 0xd3, 0xcf, 0x06, 0x0d, 0x21, 0x50, 0x83, 0x60, 0xf2, - 0x14, 0x80, 0x7e, 0x83, 0x03, 0x3f, 0xee, 0x7a, 0xc8, 0x0f, 0xe2, 0xfc, - 0x3a, 0x10, 0x56, 0x39, 0xe3, 0x7d, 0x63, 0xd5, 0x7c, 0x4d, 0xb3, 0x3f, - 0x39, 0xaf, 0xf9, 0x5f, 0x7b, 0xa0, 0xe1, 0xcf, 0xf5, 0x56, 0x23, 0x08, - 0x9c, 0x41, 0x90, 0x6b, 0xfe, 0xac, 0x17, 0x4c, 0xc0, 0xc0, 0x9b, 0xfe, - 0xad, 0x1b, 0xb8, 0x78, 0xf6, 0x20, 0xdf, 0xc4, 0x9d, 0xc0, 0xf1, 0xb2, - 0xc2, 0x8e, 0x65, 0x9f, 0xb4, 0xf0, 0xdf, 0xa2, 0x32, 0x2e, 0x81, 0xe8, - 0x6f, 0x30, 0x9f, 0x67, 0xc3, 0xb6, 0x72, 0x65, 0x26, 0x56, 0x43, 0x66, - 0x1f, 0x6b, 0x9e, 0xc6, 0xec, 0xc2, 0x47, 0x7d, 0xd5, 0x9f, 0x96, 0x6e, - 0xfe, 0x50, 0x71, 0xb0, 0xce, 0x64, 0x25, 0xaa, 0xfe, 0x7c, 0xdb, 0xb0, - 0x98, 0x74, 0xfe, 0xa3, 0xb8, 0x90, 0x47, 0x78, 0x42, 0x7b, 0x78, 0xfe, - 0xf7, 0x2a, 0x83, 0xdd, 0xbd, 0x18, 0x2b, 0x19, 0xef, 0x55, 0x9f, 0x3e, - 0xf6, 0x89, 0xfd, 0x44, 0x11, 0x3e, 0xc9, 0xbf, 0xab, 0x4e, 0x05, 0x1f, - 0x45, 0xf5, 0xa3, 0x60, 0xdc, 0x0e, 0x49, 0x25, 0x0f, 0xea, 0x01, 0x24, - 0x22, 0x69, 0x67, 0x76, 0xfb, 0x8d, 0x33, 0x62, 0xb6, 0x97, 0x2d, 0x97, - 0x6f, 0xe7, 0xce, 0xad, 0x84, 0xa0, 0x94, 0xfe, 0x43, 0xa3, 0xf6, 0x4f, - 0xbc, 0xd1, 0x76, 0x2a, 0x4f, 0x65, 0x87, 0x58, 0xf1, 0xbd, 0x9b, 0xff, - 0x9d, 0x35, 0xa2, 0x5a, 0xee, 0x45, 0x0c, 0x35, 0x20, 0x59, 0xa1, 0x24, - 0xd8, 0xfc, 0x74, 0x80, 0x1f, 0xcd, 0x41, 0x78, 0xf8, 0x60, 0xcc, 0xc4, - 0x54, 0x15, 0xcb, 0x33, 0x1d, 0xd8, 0xef, 0xba, 0xa0, 0x3a, 0x4a, 0xfa, - 0x69, 0xb8, 0x82, 0x86, 0x3e, 0x3f, 0x01, 0xa3, 0x94, 0xc4, 0x42, 0x4c, - 0xf3, 0x5b, 0x3b, 0xe9, 0x76, 0xbc, 0x48, 0xc0, 0xae, 0xbc, 0x2c, 0x67, - 0x6e, 0x93, 0x31, 0x2b, 0x2b, 0x67, 0xd0, 0x22, 0x4b, 0x47, 0x35, 0x5d, - 0xff, 0x9e, 0x4b, 0xfa, 0x54, 0x6d, 0xf3, 0xf5, 0x39, 0x5a, 0x7c, 0x05, - 0x0b, 0x10, 0x28, 0x64, 0x0c, 0xfb, 0xd8, 0x75, 0x34, 0x23, 0x37, 0xda, - 0x82, 0x97, 0x14, 0x5d, 0x27, 0x03, 0xf4, 0xb8, 0xc4, 0x72, 0xd1, 0x51, - 0x8d, 0x5f, 0xd7, 0xba, 0x60, 0x50, 0x94, 0x1c, 0x05, 0xf3, 0x63, 0x61, - 0xb2, 0x1d, 0x64, 0xd0, 0xa7, 0x5c, 0xf1, 0x35, 0x59, 0xfe, 0xed, 0xac, - 0x66, 0x5e, 0x77, 0x5f, 0x68, 0xee, 0x3e, 0xd4, 0x7f, 0xe3, 0x8c, 0xa9, - 0x9e, 0xd2, 0xb6, 0x66, 0x07, 0xdb, 0xe5, 0xd2, 0x14, 0x5f, 0x28, 0x51, - 0xa9, 0xa3, 0xec, 0x93, 0x3a, 0xbc, 0x67, 0xa0, 0xa1, 0x76, 0x98, 0x9b, - 0xbc, 0x0a, 0x35, 0x0d, 0xb6, 0x95, 0x87, 0x17, 0x12, 0x58, 0x3b, 0x28, - 0x24, 0x56, 0x7e, 0x9c, 0x4f, 0xa9, 0x2e, 0xb1, 0xe0, 0x65, 0x5b, 0x3f, - 0x18, 0x2f, 0x92, 0x0a, 0x01, 0x1d, 0x82, 0x92, 0x8b, 0xdf, 0xbe, 0xe3, - 0x57, 0xac, 0xb5, 0xf0, 0x21, 0x7e, 0x13, 0xc6, 0xa6, 0xe8, 0x2e, 0x64, - 0xcd, 0x9a, 0x11, 0x2a, 0xfe, 0x07, 0x46, 0x4b, 0xd8, 0x6b, 0x35, 0x34, - 0x8e, 0x48, 0xce, 0xc6, 0x11, 0x18, 0x68, 0x3d, 0x85, 0xfa, 0x20, 0xf7, - 0xfc, 0x41, 0x34, 0xe4, 0x62, 0x80, 0xf8, 0x6b, 0xe6, 0x13, 0x8c, 0x22, - 0x61, 0x15, 0x8e, 0xd7, 0x21, 0xbb, 0x0b, 0xdd, 0x25, 0xd6, 0x97, 0x07, - 0x21, 0x53, 0x93, 0xa2, 0xab, 0x97, 0x37, 0x96, 0x31, 0x73, 0x09, 0x33, - 0xc0, 0x34, 0x22, 0xc7, 0x16, 0x76, 0x3e, 0x88, 0xf0, 0xc5, 0xb4, 0x2f, - 0x83, 0xd1, 0x46, 0x95, 0x35, 0x31, 0xb0, 0x16, 0xbf, 0x15, 0xba, 0x5b, - 0xb9, 0x92, 0x63, 0x05, 0x42, 0xa7, 0x06, 0x52, 0xf7, 0xb3, 0x5e, 0x17, - 0xd5, 0xef, 0x94, 0x41, 0x38, 0x06, 0x09, 0x0a, 0xe8, 0xc7, 0x3a, 0xac, - 0x06, 0x04, 0xb6, 0xef, 0x40, 0x4a, 0x8c, 0xce, 0xe5, 0x3a, 0x21, 0xd9, - 0x6d, 0x98, 0xbf, 0x4c, 0x41, 0xbf, 0xb9, 0xef, 0x9b, 0xfd, 0x2d, 0xac, - 0x1f, 0x3f, 0xa8, 0x63, 0x60, 0x44, 0xd2, 0x08, 0xe9, 0xac, 0x18, 0x94, - 0x40, 0xb8, 0x56, 0xc4, 0x81, 0x26, 0x30, 0x9a, 0x67, 0x39, 0x37, 0xbf, - 0x64, 0x47, 0xbf, 0xd6, 0x88, 0xae, 0x93, 0x30, 0xa2, 0xc4, 0xb6, 0xa4, - 0x1d, 0xfa, 0x6e, 0x33, 0x83, 0x5d, 0x62, 0x7a, 0x66, 0xb6, 0x3d, 0xbc, - 0x35, 0x7b, 0x01, 0xba, 0x11, 0xac, 0x60, 0x07, 0xc3, 0xc9, 0x12, 0xbf, - 0x3b, 0xb3, 0x4d, 0x3e, 0x98, 0xd9, 0xa1, 0x86, 0x5a, 0x4b, 0x7c, 0x35, - 0x84, 0x9f, 0x29, 0x60, 0xe1, 0xbd, 0xd5, 0x66, 0x32, 0x03, 0xf2, 0x4f, - 0x31, 0xb5, 0xaa, 0x8a, 0xef, 0xd9, 0x51, 0x29, 0xe9, 0x37, 0x9a, 0x36, - 0x29, 0x18, 0xee, 0xe8, 0x17, 0x14, 0xf3, 0x39, 0x1d, 0x4a, 0xb7, 0x56, - 0x18, 0x63, 0x9c, 0x76, 0xe4, 0x75, 0xeb, 0xe7, 0xe8, 0x7c, 0xcf, 0xae, - 0x84, 0xa2, 0xba, 0x3c, 0x3c, 0x02, 0x86, 0xb9, 0x1f, 0x7c, 0x5e, 0xaf, - 0x32, 0x66, 0x62, 0x37, 0x47, 0x9e, 0x70, 0x43, 0xde, 0xb8, 0xe1, 0x94, - 0xc7, 0xc4, 0x31, 0x74, 0x62, 0x22, 0x94, 0xc3, 0x20, 0xfa, 0x93, 0x39, - 0xdd, 0x0a, 0xd3, 0xb4, 0x03, 0xd3, 0x2d, 0x09, 0x19, 0xa5, 0x98, 0xd7, - 0xa4, 0xf4, 0xca, 0x54, 0xd1, 0x27, 0xad, 0x57, 0x40, 0xfc, 0xf4, 0x2d, - 0x9f, 0x3a, 0x89, 0x94, 0x84, 0x7c, 0xee, 0xee, 0x32, 0x13, 0x4b, 0x27, - 0x35, 0xbf, 0x8f, 0x3d, 0x62, 0xf3, 0x7b, 0x4f, 0x9f, 0x12, 0xdd, 0xc4, - 0xb2, 0xe3, 0x84, 0x4d, 0x22, 0x4f, 0x61, 0xf1, 0x45, 0xbb, 0x7e, 0xb1, - 0xe1, 0xa0, 0xe7, 0xf4, 0xfd, 0x18, 0x27, 0x28, 0x3b, 0xfa, 0xd0, 0xf7, - 0xe9, 0xd2, 0xfa, 0x85, 0x7d, 0xfa, 0x5f, 0x86, 0xd3, 0x10, 0xca, 0xde, - 0x88, 0x9f, 0x6a, 0x4e, 0xee, 0x3c, 0x4c, 0xa2, 0x27, 0xff, 0x85, 0x58, - 0x8e, 0x80, 0x08, 0x3a, 0x7e, 0xff, 0x1a, 0x41, 0xc2, 0x1f, 0x7e, 0xd6, - 0xaf, 0x83, 0xce, 0xaa, 0x75, 0xdb, 0xa6, 0x99, 0x3c, 0xa0, 0xd8, 0x6d, - 0xfe, 0x97, 0x60, 0x5b, 0x3d, 0x8a, 0x8e, 0xb1, 0xc2, 0xe9, 0x43, 0x85, - 0x49, 0xce, 0xa0, 0x36, 0x41, 0x93, 0xb9, 0x21, 0x15, 0x20, 0xf6, 0x4b, - 0x3e, 0xbd, 0xee, 0x47, 0x00, 0xd0, 0x9b, 0x99, 0x7a, 0xaf, 0xaa, 0xd5, - 0xf7, 0xd0, 0x79, 0x7e, 0x3f, 0x27, 0x18, 0x6d, 0xeb, 0x03, 0x5c, 0x0c, - 0xef, 0xc0, 0xf2, 0xde, 0xb5, 0x34, 0x00, 0x87, 0x7b, 0x8c, 0x02, 0x09, - 0x3c, 0xf3, 0x28, 0x21, 0x5d, 0x9e, 0x55, 0x1b, 0x85, 0xda, 0x4c, 0x1c, - 0xfc, 0x19, 0x70, 0x9a, 0x63, 0xef, 0x1d, 0xa0, 0x45, 0x0e, 0x99, 0x66, - 0x7e, 0xc7, 0x7e, 0x89, 0x07, 0x5e, 0x4c, 0x57, 0x60, 0xd1, 0xb2, 0x4b, - 0xa6, 0x49, 0x54, 0x8d, 0x66, 0x10, 0x4f, 0x50, 0xb1, 0xc1, 0x98, 0x7a, - 0xaa, 0x49, 0x39, 0x30, 0xa7, 0xe5, 0x09, 0xac, 0x4f, 0x09, 0x53, 0xc2, - 0x34, 0xd2, 0xb2, 0x03, 0xba, 0x33, 0x9a, 0x2f, 0x14, 0x47, 0x33, 0x16, - 0xdf, 0xd3, 0xed, 0x54, 0xb9, 0x98, 0x5f, 0x0b, 0x45, 0xa5, 0xe4, 0x98, - 0xb4, 0xa2, 0xbc, 0xaf, 0x68, 0x35, 0xa4, 0x4b, 0x8f, 0xc4, 0x14, 0x53, - 0x6d, 0x30, 0x8f, 0x84, 0x1b, 0xc5, 0xeb, 0x5f, 0x87, 0xd7, 0x02, 0x7e, - 0x62, 0x72, 0x3d, 0xeb, 0x71, 0x5a, 0xa7, 0x07, 0xbb, 0x32, 0x4f, 0xf1, - 0x61, 0x3f, 0xc5, 0x39, 0x42, 0x2c, 0x2a, 0xf8, 0x5c, 0x3b, 0x7d, 0x6f, - 0x71, 0x6e, 0x64, 0xf7, 0xe5, 0xc5, 0x66, 0x1b, 0xc3, 0x3d, 0xdf, 0xdb, - 0x26, 0x79, 0xd1, 0x1a, 0xc8, 0x1f, 0x61, 0xe5, 0x8e, 0xfd, 0x8e, 0x78, - 0xb4, 0xe7, 0x9f, 0x15, 0x06, 0x21, 0x08, 0x23, 0x4d, 0x4d, 0xa5, 0x3a, - 0xc0, 0xec, 0x5b, 0x15, 0x06, 0xc5, 0xf6, 0xad, 0x97, 0x56, 0x79, 0x42, - 0x50, 0xc1, 0x5f, 0x3d, 0xda, 0x29, 0x22, 0xfd, 0x6d, 0xb3, 0x8a, 0xf0, - 0xad, 0x77, 0xe6, 0x5d, 0xc3, 0x05, 0x47, 0x76, 0x97, 0x38, 0x65, 0xf6, - 0x9b, 0xfb, 0xba, 0x43, 0xb5, 0x1a, 0xdf, 0x31, 0xd2, 0x3e, 0x17, 0x41, - 0x4d, 0x09, 0x95, 0x65, 0x9a, 0x74, 0x55, 0xca, 0x71, 0xeb, 0x33, 0x8e, - 0xcb, 0x86, 0x36, 0x7f, 0xc3, 0xdb, 0xf2, 0x7f, 0xc1, 0xa9, 0x59, 0x53, - 0x4a, 0x0a, 0x63, 0x90, 0xa7, 0xa3, 0x8e, 0x87, 0x65, 0x8a, 0xc6, 0xd3, - 0xf0, 0xd6, 0x0f, 0x44, 0x53, 0x05, 0x11, 0xa4, 0x12, 0x6b, 0xb3, 0x90, - 0x5e, 0x59, 0x76, 0xd8, 0x50, 0x88, 0xa4, 0x16, 0x9a, 0x88, 0xa5, 0x4e, - 0x64, 0x86, 0xa3, 0x22, 0xad, 0xd5, 0xbf, 0x82, 0xe9, 0xd5, 0x00, 0x6d, - 0xca, 0xf5, 0x77, 0x53, 0x59, 0xe0, 0x63, 0x5a, 0xce, 0x3f, 0x72, 0xda, - 0xe7, 0x6e, 0xe6, 0xf1, 0xdc, 0xf5, 0x21, 0xc9, 0x1a, 0xe8, 0x94, 0xc9, - 0x8a, 0x95, 0xce, 0x81, 0x9c, 0xab, 0x2d, 0xe0, 0xce, 0x01, 0x76, 0x33, - 0x64, 0xeb, 0x47, 0x0b, 0xc9, 0x6b, 0x70, 0x97, 0x50, 0x58, 0x21, 0x9d, - 0x26, 0x4b, 0x92, 0x06, 0xb0, 0x98, 0x03, 0x4b, 0xc3, 0x70, 0x64, 0x79, - 0x57, 0xd8, 0xa3, 0x89, 0xad, 0xbf, 0xe1, 0x26, 0x01, 0x8d, 0x90, 0x5c, - 0x1d, 0x34, 0xc1, 0xa2, 0xc8, 0x2a, 0x41, 0xe2, 0x4a, 0x45, 0xa8, 0xa9, - 0x70, 0x8e, 0x49, 0xec, 0x59, 0x92, 0x65, 0x46, 0xe5, 0xe0, 0xe7, 0x80, - 0xec, 0xaa, 0x1c, 0xb0, 0xb2, 0x9a, 0x2d, 0x0a, 0x97, 0x70, 0x9b, 0x73, - 0x15, 0xc3, 0xe6, 0x85, 0x07, 0x67, 0x69, 0xe1, 0x5b, 0x47, 0x2f, 0x01, - 0x9e, 0x83, 0x96, 0xa3, 0x91, 0xfe, 0x0e, 0x8b, 0x78, 0xe9, 0x83, 0xb2, - 0x97, 0xb7, 0xf0, 0xd2, 0xba, 0xea, 0xf4, 0xf2, 0x94, 0x86, 0x3c, 0x9e, - 0xda, 0x8b, 0x91, 0x26, 0x4b, 0x90, 0xb1, 0x10, 0x54, 0xe1, 0x01, 0xbc, - 0x36, 0x73, 0xae, 0xd2, 0x9f, 0x17, 0xce, 0xba, 0x8a, 0x81, 0xc9, 0xef, - 0xaa, 0x9d, 0xdd, 0xbc, 0xbb, 0x4a, 0x96, 0x08, 0xe3, 0xf0, 0xe7, 0x2f, - 0x73, 0x12, 0xe6, 0x96, 0xf4, 0x17, 0x11, 0x7a, 0xd6, 0x39, 0x6a, 0xad, - 0x71, 0x6a, 0xef, 0x5c, 0xe4, 0xb4, 0x19, 0xe9, 0xc3, 0xe2, 0x72, 0x90, - 0xad, 0x16, 0x34, 0x0e, 0xf7, 0x4d, 0x4f, 0x21, 0x65, 0x93, 0x24, 0xa9, - 0x7f, 0xdc, 0xb5, 0x85, 0x36, 0xb3, 0x3d, 0xc9, 0xbf, 0x8a, 0xf2, 0xa8, - 0x09, 0xb5, 0xe2, 0x23, 0x94, 0xa7, 0x40, 0x5a, 0xfd, 0x68, 0xef, 0xa9, - 0x14, 0x70, 0xbb, 0xf1, 0x35, 0x2c, 0xbb, 0xf2, 0xd0, 0x33, 0x4c, 0x07, - 0x09, 0x1d, 0xf0, 0x52, 0x28, 0xe8, 0x7a, 0x06, 0x8e, 0xe2, 0xef, 0x20, - 0xf2, 0xfa, 0x05, 0x04, 0x45, 0xf8, 0x06, 0xcf, 0x9a, 0xde, 0xbb, 0xfb, - 0x56, 0xa4, 0xfc, 0xdc, 0x31, 0x03, 0x88, 0xca, 0x27, 0xb5, 0xab, 0x4a, - 0x35, 0x4a, 0x27, 0x88, 0x5f, 0x7d, 0x81, 0x36, 0xed, 0x15, 0xf8, 0x2b, - 0x98, 0xc8, 0x07, 0xf3, 0x24, 0xee, 0x36, 0x10, 0xed, 0xa6, 0x48, 0xd9, - 0xcd, 0x8c, 0xbc, 0x36, 0x97, 0x6b, 0x45, 0xbc, 0xe3, 0x8f, 0x01, 0xe4, - 0x23, 0xc1, 0x06, 0xb6, 0xed, 0x46, 0x72, 0x49, 0x06, 0xbb, 0x31, 0x4e, - 0x33, 0x31, 0xb9, 0x6a, 0xdf, 0xa9, 0x7b, 0xf8, 0xe5, 0x69, 0x61, 0xe5, - 0x92, 0xd9, 0x24, 0xce, 0xd2, 0xa8, 0x14, 0x59, 0xaa, 0xf7, 0xd2, 0x5a, - 0xe8, 0x40, 0xfe, 0xa8, 0xc9, 0xb6, 0x97, 0x64, 0x0a, 0xba, 0xc6, 0x6e, - 0xe9, 0x46, 0x6d, 0x38, 0x1a, 0xe9, 0xb2, 0x4d, 0xd4, 0x25, 0xe1, 0xef, - 0x47, 0xcf, 0x2d, 0x76, 0x81, 0xab, 0x18, 0x19, 0x5b, 0x3d, 0x18, 0xd5, - 0x58, 0x73, 0x32, 0x3a, 0x0c, 0x03, 0xb9, 0x8b, 0x7b, 0x87, 0xfa, 0xdc, - 0xfb, 0xa8, 0xca, 0x27, 0xba, 0xf0, 0x9f, 0x2c, 0xfd, 0xce, 0x69, 0x51, - 0xf9, 0xb0, 0xae, 0x83, 0x01, 0x58, 0x12, 0x83, 0x02, 0xd3, 0x47, 0xc8, - 0x8b, 0xf1, 0x3f, 0x20, 0xc3, 0x7a, 0x33, 0x53, 0x05, 0x32, 0xc1, 0xfe, - 0x10, 0x66, 0x51, 0x37, 0x6e, 0xb7, 0x00, 0x48, 0x88, 0xa5, 0xe5, 0xc8, - 0xd7, 0x8b, 0x32, 0x37, 0x50, 0x19, 0x44, 0xfd, 0x4c, 0x4c, 0x3b, 0xfd, - 0x6c, 0xd9, 0x37, 0x09, 0x31, 0xef, 0x90, 0x14, 0x8a, 0x21, 0xab, 0xe2, - 0x03, 0x8f, 0x88, 0x72, 0xf9, 0x48, 0xe8, 0x7d, 0xbc, 0x34, 0x56, 0x7e, - 0x3e, 0x31, 0x99, 0x5d, 0x3b, 0x74, 0x78, 0x77, 0x56, 0xf1, 0x08, 0x7c, - 0x07, 0x77, 0x60, 0x9d, 0xd4, 0x0c, 0xc3, 0x25, 0x62, 0x6a, 0xbf, 0x31, - 0xd7, 0x85, 0x67, 0x74, 0x78, 0xb2, 0x44, 0x1e, 0xe1, 0xc5, 0x86, 0xf2, - 0x4e, 0x38, 0x82, 0x17, 0x57, 0xf2, 0xe2, 0x74, 0x6c, 0xcd, 0xe9, 0x15, - 0x05, 0x7d, 0xf6, 0x7c, 0x59, 0x6c, 0x6e, 0x61, 0x7d, 0xc2, 0x1b, 0x2c, - 0x3b, 0x4a, 0xc3, 0x80, 0x3a, 0xe8, 0xde, 0xeb, 0x07, 0x81, 0x22, 0x59, - 0x4e, 0xaa, 0xcc, 0x4f, 0xc8, 0xfe, 0xed, 0x5a, 0xf1, 0xb7, 0x00, 0xcf, - 0x68, 0xd6, 0xca, 0x79, 0xe1, 0x3e, 0x76, 0x3f, 0xb9, 0xf8, 0x3b, 0x78, - 0x6f, 0x4d, 0x11, 0x5f, 0x79, 0x10, 0xe0, 0x75, 0xca, 0x0a, 0xb1, 0x13, - 0xbe, 0x3f, 0x72, 0x16, 0x42, 0xc1, 0x54, 0xbb, 0xf7, 0x98, 0xd2, 0x6b, - 0xc6, 0x0c, 0x4e, 0x73, 0xe1, 0xb9, 0xe5, 0x2b, 0x5a, 0x1d, 0xed, 0xf7, - 0x32, 0xf2, 0x44, 0x92, 0x84, 0x62, 0x8e, 0xcc, 0x6c, 0x18, 0x35, 0x0d, - 0x7d, 0xbd, 0x9f, 0x1d, 0xe9, 0x06, 0xb4, 0xd0, 0x16, 0x56, 0x57, 0xbe, - 0x4e, 0x7d, 0xe0, 0x70, 0xcd, 0xbf, 0xdb, 0xfd, 0x9f, 0x17, 0xe7, 0x3b, - 0x98, 0x4c, 0x6a, 0x46, 0xa4, 0xfb, 0xaf, 0x27, 0xa7, 0x60, 0x20, 0xaa, - 0xae, 0xde, 0xa8, 0x42, 0x07, 0xe3, 0xf0, 0xe0, 0xd0, 0x15, 0xef, 0x8c, - 0x95, 0x73, 0x58, 0x01, 0x40, 0x2d, 0xe3, 0xca, 0x60, 0x8f, 0x5c, 0xc8, - 0x2d, 0xa7, 0xef, 0x2c, 0xfd, 0x70, 0x04, 0xdf, 0x34, 0x90, 0x2b, 0x1a, - 0x12, 0x07, 0xff, 0xd9, 0x7c, 0x5d, 0xf1, 0x5a, 0x62, 0xc8, 0x3b, 0xeb, - 0x04, 0x86, 0x48, 0x89, 0x9b, 0x95, 0xbc, 0x07, 0xc0, 0x14, 0xb9, 0x6a, - 0x28, 0xbb, 0x36, 0x55, 0x0d, 0xe1, 0x8f, 0x02, 0x78, 0x4a, 0x7c, 0x3f, - 0xf6, 0xeb, 0x5e, 0x39, 0x81, 0x7d, 0x36, 0x53, 0xfd, 0xaa, 0x8f, 0xcc, - 0xce, 0x02, 0x17, 0xe6, 0xad, 0xf5, 0x70, 0xc9, 0x58, 0xee, 0xe3, 0xa4, - 0xac, 0xd9, 0x20, 0x7b, 0xc6, 0x6f, 0x81, 0x5a, 0xd1, 0x62, 0x62, 0x76, - 0x1f, 0x22, 0xdf, 0x50, 0xa1, 0xf3, 0x47, 0xcb, 0xff, 0x71, 0xff, 0xab, - 0xef, 0x47, 0xd8, 0xbf, 0x0e, 0x3c, 0xf4, 0xd8, 0x54, 0x47, 0x9d, 0x17, - 0xad, 0xbd, 0xb4, 0x68, 0x0e, 0xf0, 0xcd, 0xad, 0x28, 0xa6, 0xf4, 0x70, - 0xd1, 0x4f, 0xb6, 0x40, 0xab, 0x80, 0xb7, 0x3e, 0x43, 0x12, 0x4a, 0xd1, - 0x10, 0xb4, 0xc2, 0x6e, 0x3e, 0x86, 0x74, 0xb7, 0xd6, 0x8c, 0x3c, 0x12, - 0xbd, 0x92, 0x98, 0xcd, 0xa4, 0xd9, 0xa5, 0xb5, 0xdd, 0x78, 0x47, 0x53, - 0x26, 0xef, 0x44, 0xda, 0x9b, 0x32, 0xb9, 0xd8, 0x36, 0xd8, 0x3a, 0xd0, - 0x2b, 0x16, 0xc5, 0x08, 0x23, 0x2f, 0xa3, 0x77, 0x6b, 0x63, 0x4f, 0xac, - 0x04, 0x43, 0x8c, 0x5c, 0xb3, 0xb8, 0x04, 0xa7, 0x93, 0x99, 0x72, 0x0a, - 0x3a, 0xef, 0xbb, 0x74, 0xb0, 0x8a, 0x3f, 0x60, 0x49, 0x30, 0x6d, 0x1b, - 0xd1, 0x13, 0xd1, 0x85, 0xd0, 0xa5, 0x8f, 0xff, 0xef, 0x2c, 0xe2, 0xc3, - 0x22, 0x25, 0xa8, 0xa4, 0xb0, 0x51, 0x89, 0xee, 0xff, 0x20, 0x0a, 0xf6, - 0x35, 0xa1, 0x76, 0x72, 0x2f, 0x85, 0x10, 0x45, 0xbf, 0xad, 0x00, 0xcd, - 0x80, 0xe2, 0xaf, 0x7a, 0xb6, 0x4d, 0xcc, 0x9f, 0x43, 0xa5, 0x50, 0xc6, - 0xd0, 0xf3, 0xa0, 0xa9, 0x5e, 0x62, 0x48, 0x90, 0x98, 0x14, 0xcc, 0xec, - 0x6c, 0x37, 0xe5, 0x60, 0xc1, 0xde, 0x2c, 0x58, 0xc4, 0x12, 0x87, 0x82, - 0x57, 0xe4, 0xe1, 0x0d, 0x69, 0x71, 0x93, 0x61, 0x03, 0xed, 0x76, 0x6e, - 0xff, 0xcb, 0x71, 0x77, 0x2a, 0x89, 0x91, 0x60, 0xef, 0x6c, 0x6d, 0x6f, - 0x4b, 0xcc, 0x62, 0xa8, 0x29, 0x19, 0x2a, 0x6c, 0x3c, 0x20, 0x7d, 0x4d, - 0x1f, 0x70, 0xbf, 0x0f, 0xc6, 0x61, 0x14, 0x35, 0xb7, 0xc4, 0x5d, 0x4a, - 0x7a, 0xdd, 0xa1, 0x55, 0x54, 0xdc, 0x3f, 0xaa, 0x77, 0x37, 0x5f, 0x42, - 0xd4, 0x45, 0xb8, 0xb6, 0x8d, 0xc9, 0xb8, 0xa5, 0xe2, 0x1d, 0xf0, 0xbc, - 0x2f, 0xef, 0x66, 0xdc, 0xcc, 0x2e, 0x47, 0xc5, 0xc5, 0xaa, 0xa6, 0xdb, - 0xb6, 0x86, 0x3b, 0xd1, 0xbc, 0x38, 0xf9, 0x33, 0x13, 0xc1, 0x38, 0xab, - 0xa6, 0x81, 0xe5, 0xb7, 0x30, 0x90, 0x87, 0x6d, 0x4f, 0x07, 0x95, 0x9b, - 0x4c, 0x63, 0x9f, 0xa7, 0xc0, 0xa0, 0x9b, 0xb5, 0x87, 0xda, 0x5d, 0x75, - 0x49, 0xea, 0x41, 0xac, 0xdb, 0xd2, 0xa9, 0x63, 0x59, 0xb5, 0x36, 0xf8, - 0xec, 0xa6, 0x47, 0xe1, 0x7b, 0x41, 0x69, 0x9c, 0xb4, 0x00, 0x9e, 0x4e, - 0x9b, 0xc3, 0x84, 0x75, 0x84, 0xe1, 0x30, 0x2b, 0xd0, 0xc2, 0x09, 0x6a, - 0x60, 0xc7, 0xed, 0x5d, 0x56, 0xe2, 0x9c, 0x91, 0x56, 0x6a, 0xd9, 0xe7, - 0x69, 0x02, 0x8a, 0x89, 0xe9, 0x40, 0x1b, 0xb3, 0x04, 0x62, 0x5a, 0x9e, - 0x6f, 0x88, 0x09, 0x07, 0xa9, 0xad, 0xd1, 0x71, 0x63, 0x9f, 0x2c, 0x8c, - 0xf2, 0x6f, 0xdf, 0xd7, 0x5f, 0x26, 0x27, 0x49, 0x7b, 0xa8, 0xdd, 0x41, - 0xf5, 0xe8, 0xd4, 0x5f, 0x2c, 0x23, 0x69, 0x75, 0x83, 0xed, 0xc8, 0xef, - 0xa6, 0xd3, 0xa4, 0x15, 0xa3, 0x77, 0xd3, 0xf4, 0xcd, 0xf5, 0xf4, 0xcd, - 0x15, 0x98, 0x79, 0xd9, 0xc7, 0xa2, 0x10, 0xb3, 0xf0, 0x6c, 0x8a, 0x2f, - 0x60, 0x8a, 0x18, 0x53, 0x3e, 0xfc, 0xe6, 0x72, 0x6f, 0xae, 0x4d, 0x53, - 0x5d, 0xbe, 0xef, 0x0c, 0x92, 0xae, 0x6b, 0x3c, 0x00, 0x0c, 0x65, 0x12, - 0x0d, 0xfd, 0x3f, 0x98, 0x84, 0x5c, 0xbf, 0xea, 0x8a, 0x21, 0x27, 0x56, - 0xf3, 0xac, 0xb7, 0x68, 0x08, 0x59, 0xd5, 0x30, 0xc6, 0x51, 0x02, 0x38, - 0xa2, 0x86, 0x25, 0xa3, 0x8b, 0x0f, 0xcf, 0x05, 0xe6, 0x95, 0xbd, 0x34, - 0x97, 0xf2, 0x84, 0xcb, 0x4f, 0x1b, 0xd7, 0xf5, 0x16, 0x39, 0x82, 0x0b, - 0x97, 0xf6, 0xed, 0x54, 0x09, 0xff, 0x76, 0x2d, 0xec, 0xe6, 0x9b, 0x1e, - 0xfc, 0xbb, 0x48, 0x6c, 0x2d, 0xbb, 0xce, 0x41, 0x69, 0xb4, 0x38, 0xf1, - 0x28, 0x6d, 0x0a, 0xe0, 0x52, 0xe2, 0x4a, 0xc4, 0xc0, 0xc6, 0x07, 0xa7, - 0x0e, 0xf0, 0x9e, 0xb0, 0x75, 0xf2, 0xf0, 0xf7, 0xa6, 0x66, 0xe4, 0x2a, - 0xa2, 0x68, 0xab, 0x1f, 0xa2, 0xf3, 0x08, 0xdb, 0xd2, 0xbc, 0x20, 0x5c, - 0x22, 0x7a, 0x31, 0x95, 0x36, 0xd3, 0x01, 0xf2, 0x50, 0x02, 0x29, 0x42, - 0xb6, 0xb8, 0xdd, 0xd6, 0xa0, 0xd4, 0x35, 0x15, 0x56, 0xd9, 0xd9, 0x10, - 0xef, 0x13, 0x75, 0x7a, 0x86, 0xfd, 0x4a, 0x88, 0xc1, 0x0c, 0x18, 0x5f, - 0x9e, 0xd3, 0x3d, 0x77, 0xcc, 0xf3, 0x39, 0xae, 0xfb, 0x47, 0x00, 0xd0, - 0x65, 0x17, 0x4e, 0x24, 0x12, 0x42, 0xd5, 0x74, 0x6a, 0x32, 0x81, 0x12, - 0x78, 0x8b, 0x20, 0xc6, 0x8f, 0x33, 0x65, 0x89, 0xbf, 0xf1, 0x90, 0x77, - 0xdd, 0x48, 0x50, 0x72, 0xdb, 0x10, 0x44, 0x58, 0xb2, 0x2a, 0xcb, 0x83, - 0xfd, 0xe4, 0xe8, 0xa5, 0x1a, 0x58, 0xa7, 0xff, 0xae, 0x19, 0x37, 0xe9, - 0x2c, 0x33, 0x77, 0xd2, 0x9c, 0xa5, 0x88, 0x33, 0x83, 0x0b, 0x89, 0xfb, - 0xa9, 0xc8, 0x5c, 0x5e, 0x58, 0xd9, 0xcd, 0x9c, 0x2f, 0xb2, 0xe0, 0x3d, - 0x6e, 0xfd, 0xe2, 0x80, 0x72, 0xe1, 0x8c, 0x23, 0x74, 0x68, 0x23, 0x13, - 0x56, 0x01, 0x7f, 0xa3, 0x8f, 0xb3, 0x63, 0x1a, 0x65, 0xa6, 0xce, 0xa1, - 0x4b, 0xd4, 0x42, 0xc6, 0xad, 0x76, 0xe7, 0x52, 0xfd, 0x15, 0x87, 0x43, - 0x61, 0x9b, 0x25, 0x15, 0x8c, 0x8b, 0x16, 0xc1, 0xb5, 0x28, 0x71, 0xa3, - 0x6a, 0xcf, 0xd0, 0x56, 0x63, 0xa9, 0xe6, 0x38, 0x74, 0x83, 0xbd, 0xdc, - 0x5b, 0x61, 0x9a, 0xca, 0xca, 0x74, 0x9c, 0x4e, 0x85, 0xd5, 0xc9, 0x3c, - 0x73, 0x24, 0x1b, 0x44, 0xc9, 0xa4, 0xb6, 0xcb, 0x02, 0xd9, 0xc0, 0x55, - 0xe2, 0x43, 0xee, 0x74, 0x54, 0xf2, 0x63, 0x86, 0x44, 0xe9, 0x6a, 0xa9, - 0x9f, 0x1e, 0x5b, 0x8c, 0xbc, 0x7b, 0x90, 0x59, 0x3c, 0x35, 0xa6, 0x58, - 0x7b, 0x76, 0x2f, 0xed, 0xf3, 0xaf, 0x5c, 0x6b, 0xf9, 0x8b, 0x5f, 0x1f, - 0x1a, 0x2b, 0x69, 0x7f, 0xe9, 0x4e, 0x4d, 0x07, 0xe4, 0xe7, 0xe6, 0xf5, - 0x0d, 0xd4, 0x03, 0xab, 0x2d, 0xcd, 0x78, 0x58, 0xfe, 0xf6, 0x94, 0x51, - 0x65, 0xa4, 0xe3, 0x16, 0x93, 0xc1, 0x2f, 0x62, 0xf5, 0xf1, 0xa3, 0x62, - 0x51, 0xbd, 0xe2, 0x1e, 0xd7, 0xfa, 0xd5, 0xb5, 0xae, 0x59, 0x7d, 0x48, - 0x9d, 0x2c, 0xde, 0x83, 0x58, 0x23, 0x38, 0xc8, 0xe0, 0x87, 0x4d, 0x16, - 0x5f, 0x16, 0x71, 0x44, 0x66, 0xe7, 0x1d, 0x30, 0xd4, 0x7b, 0x03, 0xee, - 0x26, 0x11, 0x54, 0x89, 0x62, 0x7e, 0xc3, 0x9b, 0x0d, 0x48, 0x3b, 0xf2, - 0x34, 0x46, 0xf2, 0x1d, 0x2d, 0x98, 0xca, 0xf8, 0x0c, 0x02, 0x56, 0x1d, - 0xad, 0x0a, 0x61, 0xc4, 0x1d, 0x47, 0xac, 0x6b, 0x8a, 0xea, 0x8e, 0x5a, - 0x47, 0x40, 0x87, 0x41, 0x6e, 0xce, 0xa8, 0xc0, 0xba, 0xd2, 0x9f, 0x29, - 0x84, 0xa4, 0xa8, 0xb2, 0xdd, 0xca, 0xd2, 0xfc, 0x52, 0x87, 0xb9, 0x70, - 0xdc, 0x27, 0xb8, 0xb4, 0xa6, 0xc8, 0xa9, 0x7a, 0x2d, 0x5d, 0x77, 0xf1, - 0xa2, 0x36, 0x60, 0x1b, 0xb5, 0x29, 0x0d, 0x0a, 0x3d, 0xa0, 0xda, 0x82, - 0xa2, 0x71, 0x40, 0x5e, 0x2e, 0xd9, 0x6b, 0x1e, 0x0a, 0x98, 0x53, 0x23, - 0x13, 0x13, 0xac, 0x19, 0xe5, 0x9e, 0x0a, 0x45, 0x65, 0xe1, 0xc6, 0x1a, - 0xb1, 0x4f, 0x3f, 0xcc, 0xf5, 0x5f, 0x8f, 0x97, 0x29, 0x6f, 0xa3, 0xc9, - 0x9d, 0x70, 0xd6, 0x64, 0x71, 0x99, 0xb9, 0xcd, 0xa7, 0xc7, 0xa6, 0x8f, - 0xaf, 0xb2, 0x21, 0x61, 0xf7, 0x91, 0x7e, 0x6e, 0x2e, 0x3a, 0x2f, 0x78, - 0xe2, 0xd8, 0x03, 0x2e, 0x31, 0x68, 0xad, 0xf4, 0xa2, 0x8a, 0x17, 0x7e, - 0x31, 0x4b, 0xcd, 0xd6, 0x01, 0x0b, 0x56, 0x29, 0x4a, 0x27, 0x5d, 0xdb, - 0x80, 0xbf, 0x1a, 0x02, 0xd3, 0x6f, 0xd3, 0x6e, 0x2d, 0x14, 0x78, 0xda, - 0x55, 0x1c, 0x7a, 0x4e, 0xb8, 0xa0, 0x5a, 0x5c, 0x1f, 0x5a, 0x48, 0xd1, - 0xdd, 0xae, 0x90, 0xef, 0xe3, 0x9f, 0x42, 0x05, 0x9e, 0x98, 0x8e, 0x60, - 0x87, 0x7a, 0xba, 0xe8, 0xa1, 0xfa, 0x20, 0xec, 0x68, 0xe8, 0xb5, 0x7d, - 0xca, 0x8e, 0xf3, 0x3a, 0x58, 0xbe, 0xa0, 0x7f, 0xd3, 0x46, 0x05, 0x39, - 0xca, 0x80, 0x9e, 0x53, 0x31, 0x11, 0xef, 0xfc, 0xc1, 0xc8, 0xd7, 0x26, - 0x50, 0x12, 0xd1, 0x56, 0xee, 0xf4, 0x4a, 0x39, 0x51, 0x85, 0xa9, 0x60, - 0xc1, 0xfa, 0x69, 0x4d, 0x7d, 0xf2, 0x78, 0xce, 0x90, 0x10, 0xfe, 0xc5, - 0xa0, 0xec, 0x66, 0xc8, 0xe4, 0x99, 0x32, 0xe9, 0x1f, 0x09, 0xe3, 0x47, - 0x3a, 0xc4, 0x0a, 0x80, 0xab, 0x03, 0x32, 0x51, 0x66, 0xb0, 0x3c, 0x92, - 0x05, 0xaf, 0xc8, 0x4c, 0x73, 0x9d, 0x93, 0xa0, 0x6e, 0x25, 0x5e, 0x76, - 0x8f, 0x5a, 0xb6, 0x1d, 0x36, 0xb0, 0xc1, 0xd7, 0x9d, 0xc7, 0x36, 0x26, - 0x18, 0xab, 0x34, 0x79, 0x33, 0xb6, 0xe7, 0x97, 0x81, 0xca, 0x41, 0x36, - 0x57, 0x1f, 0xe1, 0x8d, 0x5d, 0x41, 0xbe, 0x32, 0xfc, 0x85, 0x39, 0x37, - 0x4f, 0xa1, 0x14, 0xae, 0x62, 0x25, 0x73, 0x08, 0xe8, 0x51, 0x5c, 0x5a, - 0xb3, 0x72, 0xb1, 0x77, 0xd5, 0x27, 0x18, 0x24, 0x02, 0x6d, 0xa2, 0x65, - 0x52, 0xff, 0xd3, 0x19, 0x60, 0xc5, 0x36, 0x9b, 0x81, 0x30, 0x53, 0xf1, - 0xca, 0xab, 0xa5, 0xbf, 0xd9, 0xbb, 0x79, 0xb4, 0x8e, 0xa1, 0x83, 0x76, - 0x0e, 0xfd, 0xe2, 0x17, 0x88, 0xb8, 0xbe, 0xd4, 0xf5, 0x21, 0x56, 0x81, - 0xef, 0x33, 0xaf, 0x65, 0x4c, 0x1b, 0x99, 0x37, 0x47, 0x9a, 0x14, 0x41, - 0x72, 0x00, 0x67, 0x59, 0xec, 0xdf, 0xae, 0x76, 0x16, 0x12, 0x1b, 0x57, - 0xa6, 0x8e, 0x5d, 0x7e, 0x82, 0x61, 0x01, 0xe0, 0x2a, 0x1c, 0xbe, 0x9f, - 0x52, 0x2a, 0xa9, 0xe3, 0x42, 0xe2, 0x1e, 0xcd, 0xc1, 0xdb, 0x8d, 0x43, - 0x38, 0x20, 0xe8, 0x3f, 0xe1, 0xbc, 0x55, 0x47, 0xeb, 0xac, 0x02, 0xeb, - 0x75, 0x08, 0x42, 0x39, 0xbf, 0x95, 0x2c, 0x7f, 0x83, 0xd5, 0xc4, 0x3f, - 0x0c, 0x10, 0x1e, 0x5e, 0xe2, 0x42, 0x34, 0x74, 0x6c, 0x58, 0xf9, 0xe9, - 0x94, 0x33, 0x11, 0x85, 0xe2, 0x99, 0x91, 0x09, 0x2c, 0x3b, 0x8d, 0xab, - 0x91, 0xcd, 0xbc, 0x48, 0x64, 0x91, 0xa9, 0x40, 0xbc, 0x5d, 0x63, 0xb1, - 0x3b, 0xb6, 0x08, 0x19, 0xad, 0x04, 0x3c, 0xab, 0x76, 0xc4, 0x1a, 0x79, - 0xa0, 0xab, 0x17, 0xb4, 0xe7, 0xa8, 0x67, 0x64, 0xe1, 0x66, 0x9c, 0x18, - 0xae, 0xe0, 0x6e, 0x31, 0xc2, 0xb1, 0x58, 0x0e, 0xcc, 0x0c, 0x19, 0x9a, - 0x23, 0x3a, 0xc1, 0x3e, 0xd4, 0x97, 0xce, 0x9e, 0x41, 0xc8, 0x4f, 0x95, - 0x22, 0x4d, 0xa9, 0x5c, 0x00, 0x7f, 0xdd, 0xe3, 0xc3, 0x42, 0xdd, 0x43, - 0x5f, 0x00, 0xae, 0xb5, 0x1e, 0xd2, 0xe6, 0xcd, 0xe8, 0x71, 0x4d, 0xe2, - 0x49, 0xdd, 0x41, 0x9e, 0x94, 0xc0, 0xe3, 0xeb, 0x63, 0x8f, 0xd3, 0x63, - 0xff, 0xa2, 0x73, 0x99, 0x81, 0x7b, 0x0c, 0x34, 0x30, 0xc7, 0x4b, 0x92, - 0x88, 0x9f, 0xbb, 0xec, 0x12, 0x9f, 0x8e, 0x59, 0xa4, 0xed, 0xb5, 0xfb, - 0x4c, 0x49, 0xb9, 0xb3, 0xa3, 0xbc, 0x76, 0xd0, 0x22, 0x11, 0x75, 0xd6, - 0x13, 0x58, 0x18, 0x20, 0x47, 0xf6, 0x2f, 0xfd, 0xe9, 0xae, 0xe7, 0x71, - 0x82, 0x2e, 0xd4, 0xaf, 0x35, 0x8a, 0x81, 0xcb, 0x17, 0xfc, 0x0b, 0x4b, - 0x62, 0x61, 0x3a, 0x3c, 0x81, 0x6b, 0x81, 0x65, 0x3d, 0x56, 0xbb, 0x3f, - 0xaf, 0x6e, 0x7f, 0xd0, 0x76, 0x92, 0x30, 0x92, 0x02, 0x87, 0x2e, 0xb8, - 0x26, 0xfd, 0x51, 0x4b, 0xa1, 0xc2, 0xe2, 0x94, 0x8c, 0x37, 0x4a, 0xff, - 0xfe, 0x69, 0xce, 0xc8, 0x65, 0xf3, 0x9c, 0x4e, 0x82, 0xeb, 0x32, 0x14, - 0x6a, 0x97, 0xd5, 0x53, 0xa3, 0x99, 0xf0, 0x88, 0x29, 0x27, 0x5b, 0x57, - 0xa1, 0xce, 0x5e, 0x78, 0xac, 0x90, 0x14, 0x1a, 0x54, 0x38, 0xc2, 0x72, - 0x2b, 0x9e, 0x2a, 0xc1, 0xcd, 0xa6, 0x18, 0x29, 0xcc, 0xb1, 0xe9, 0x5f, - 0x86, 0x6e, 0x0f, 0x51, 0xf7, 0x40, 0xa7, 0x0b, 0x2b, 0xe8, 0x4c, 0x07, - 0xbb, 0xe9, 0x8d, 0x78, 0x04, 0x49, 0xe5, 0xd4, 0xb4, 0xb1, 0x10, 0xf4, - 0x93, 0xe7, 0xfc, 0x92, 0xbb, 0x4e, 0xf8, 0x86, 0xcd, 0x87, 0x9d, 0xb7, - 0xb1, 0x6a, 0xcf, 0x25, 0xe9, 0x6c, 0x99, 0x4e, 0xf6, 0x52, 0xbc, 0x97, - 0xbe, 0xed, 0x4a, 0xbf, 0xf9, 0xc7, 0x18, 0x4b, 0x48, 0xab, 0x9d, 0x47, - 0xf0, 0x09, 0xaa, 0x82, 0x51, 0x74, 0x8a, 0xc8, 0x31, 0x3f, 0x26, 0x93, - 0xd3, 0xe7, 0x54, 0x28, 0xfa, 0x10, 0x55, 0x87, 0x5d, 0x52, 0x09, 0xe6, - 0xa3, 0xfb, 0x4a, 0x8e, 0x2b, 0x99, 0xaa, 0x7e, 0x5a, 0x80, 0x6e, 0x04, - 0xd1, 0x1e, 0xe2, 0x71, 0xd2, 0xc8, 0xb7, 0x4d, 0xda, 0x34, 0x0e, 0x72, - 0x58, 0x4e, 0xd5, 0xca, 0x70, 0x63, 0x2c, 0xb9, 0xd6, 0x26, 0xba, 0x17, - 0x4a, 0xfb, 0x62, 0x0b, 0x83, 0xf9, 0xcb, 0xff, 0x96, 0x18, 0x4a, 0x2f, - 0x3f, 0x08, 0x23, 0xd4, 0x06, 0x35, 0xdd, 0xa8, 0x7c, 0xa2, 0x27, 0x36, - 0x09, 0xaf, 0xc3, 0x32, 0xea, 0x53, 0xb7, 0x4c, 0x09, 0x66, 0xb0, 0x25, - 0x5a, 0xff, 0x43, 0x77, 0x63, 0x86, 0x4a, 0x46, 0xe2, 0xdb, 0x93, 0x35, - 0x50, 0x19, 0xb1, 0xad, 0x7e, 0x1c, 0xad, 0xa0, 0x8c, 0x12, 0xfb, 0x29, - 0x73, 0x31, 0x5f, 0xbf, 0x52, 0xcd, 0x25, 0xf6, 0x66, 0x62, 0x03, 0x90, - 0xca, 0x25, 0x04, 0x8b, 0x16, 0xfc, 0x59, 0xf6, 0x96, 0x8e, 0x57, 0xfb, - 0x04, 0x07, 0xe7, 0x82, 0x51, 0x3b, 0x39, 0x11, 0x2a, 0xc6, 0xdf, 0x94, - 0xbf, 0x69, 0x71, 0xe9, 0xdf, 0x39, 0xc7, 0xbe, 0x0c, 0xf6, 0x4d, 0x06, - 0x2e, 0x10, 0x86, 0xe0, 0x09, 0x9f, 0x88, 0xad, 0xd4, 0x6f, 0x97, 0xbd, - 0x4a, 0xf5, 0x6e, 0x06, 0xc5, 0x42, 0x70, 0x5b, 0x83, 0x91, 0x33, 0xa0, - 0x02, 0x61, 0xdf, 0xf1, 0x2c, 0x3f, 0xd7, 0x1d, 0xe9, 0x7b, 0xfb, 0x70, - 0xcb, 0x8a, 0x06, 0x53, 0x41, 0x6d, 0xa3, 0x4a, 0xbc, 0x2e, 0xf5, 0x74, - 0xeb, 0x30, 0xcd, 0x9a, 0x26, 0xe4, 0xe3, 0xb1, 0x9c, 0x23, 0x68, 0x7e, - 0xbc, 0xbe, 0x56, 0x31, 0x10, 0xfd, 0x14, 0xb2, 0xeb, 0xd6, 0x8b, 0xad, - 0x23, 0x6f, 0xb6, 0xfa, 0xab, 0xe1, 0xb4, 0x92, 0x39, 0x93, 0xae, 0x85, - 0x96, 0x2b, 0xdb, 0x83, 0xf0, 0x49, 0x52, 0x05, 0xdd, 0xd6, 0xe9, 0x9a, - 0x9f, 0xf0, 0xb6, 0x04, 0x40, 0x60, 0xc5, 0x08, 0x96, 0x07, 0x26, 0x9a, - 0x33, 0x4b, 0x2e, 0xbb, 0x5c, 0xf9, 0x5e, 0x8c, 0xb6, 0x3c, 0x2d, 0xf4, - 0xb7, 0x2f, 0xf0, 0x29, 0xa1, 0x6f, 0xd6, 0x10, 0x78, 0x6d, 0x48, 0x0a, - 0xd4, 0xc2, 0x91, 0x68, 0x3d, 0x74, 0x0c, 0xa0, 0xa1, 0x4a, 0x4d, 0x43, - 0x97, 0xe7, 0xc6, 0x41, 0x88, 0x6b, 0xce, 0xb4, 0xf7, 0x23, 0x6e, 0x78, - 0x76, 0x18, 0x54, 0x15, 0x28, 0x2c, 0xae, 0x9f, 0xb8, 0x11, 0x5a, 0xcb, - 0x52, 0xc5, 0xfb, 0x1c, 0xa5, 0x80, 0x68, 0xe4, 0x0e, 0xb6, 0xb8, 0xc0, - 0xd7, 0x33, 0xdd, 0xa0, 0x90, 0x37, 0x80, 0x0e, 0x5f, 0x43, 0xe0, 0xfc, - 0x95, 0xd4, 0x40, 0x8a, 0xcd, 0x32, 0x0c, 0xb0, 0x12, 0x26, 0x50, 0x93, - 0xd2, 0x0c, 0x3e, 0x39, 0x31, 0xc1, 0xdf, 0x33, 0xc9, 0x14, 0x10, 0xdc, - 0x86, 0x72, 0x90, 0xa0, 0xff, 0x07, 0x56, 0xd1, 0x43, 0xba, 0x84, 0xba, - 0x74, 0x60, 0xef, 0x88, 0xb5, 0x68, 0x98, 0x03, 0x84, 0x3e, 0x81, 0xae, - 0x60, 0x6b, 0xe3, 0x50, 0x4f, 0x5c, 0xd3, 0x34, 0xc0, 0xdf, 0x7b, 0xaf, - 0x20, 0xad, 0x76, 0xc9, 0xa5, 0x89, 0x49, 0x00, 0xb7, 0xa3, 0xa6, 0xcc, - 0x85, 0xca, 0x63, 0xc3, 0x92, 0xab, 0xd6, 0x77, 0xa2, 0x61, 0x1b, 0xb4, - 0x54, 0x79, 0x7f, 0x84, 0xf2, 0x31, 0x28, 0x17, 0xe6, 0x81, 0xeb, 0x75, - 0x46, 0x34, 0x9f, 0x15, 0x94, 0xac, 0xa3, 0x78, 0xa1, 0xd5, 0x31, 0x7f, - 0x31, 0x96, 0xa9, 0x51, 0xf6, 0x58, 0x86, 0x16, 0x8b, 0x2b, 0x94, 0x46, - 0x53, 0x9e, 0x8d, 0x96, 0xfd, 0xb6, 0x4b, 0x26, 0x27, 0xd2, 0x52, 0xab, - 0xa9, 0xe1, 0x62, 0x8a, 0x3f, 0x48, 0x16, 0xc6, 0xec, 0x42, 0x4a, 0x90, - 0x69, 0x58, 0x62, 0x91, 0x42, 0x48, 0xe5, 0xf0, 0x22, 0x0e, 0xf9, 0x77, - 0xcb, 0xa2, 0x3e, 0x27, 0x20, 0xe2, 0x56, 0xcb, 0x59, 0x80, 0x0e, 0xf8, - 0x29, 0x66, 0xa6, 0xcf, 0x82, 0x4c, 0xfe, 0x10, 0x95, 0x9c, 0x30, 0x5b, - 0x02, 0xac, 0xcb, 0x86, 0x03, 0x52, 0xed, 0x00, 0xd0, 0xea, 0x29, 0xe8, - 0x1c, 0x81, 0xc4, 0x49, 0x92, 0x64, 0x69, 0x4b, 0x2c, 0x16, 0xe8, 0xda, - 0x23, 0x65, 0x7e, 0xd9, 0x17, 0xbd, 0x17, 0xe1, 0xf3, 0xd1, 0x37, 0x49, - 0xfc, 0x98, 0x12, 0x80, 0x81, 0xd9, 0x4f, 0xd5, 0x0c, 0xbb, 0x64, 0x0d, - 0x7a, 0x3f, 0xc5, 0xa3, 0xc2, 0xa2, 0x85, 0x9c, 0xd0, 0x90, 0x86, 0x88, - 0x80, 0x84, 0xb1, 0xd0, 0xaa, 0xbc, 0x61, 0x91, 0x85, 0x10, 0x6a, 0xfc, - 0x50, 0x57, 0x6d, 0x9c, 0x04, 0x71, 0xb2, 0x62, 0xcc, 0xe6, 0x4b, 0x5e, - 0x09, 0xcc, 0x58, 0xd1, 0xf5, 0xe6, 0xde, 0x61, 0xa4, 0xf7, 0x19, 0x46, - 0x64, 0x3d, 0x6a, 0x37, 0x4d, 0xa5, 0x51, 0x70, 0xaf, 0x05, 0xf7, 0x71, - 0x70, 0x9b, 0x1a, 0x6b, 0xcc, 0xa5, 0x99, 0xce, 0x27, 0x7a, 0x51, 0x76, - 0xec, 0x06, 0xe1, 0xcd, 0x5a, 0xef, 0xa6, 0xdb, 0xc3, 0x58, 0x65, 0x3d, - 0x97, 0xbe, 0x22, 0x07, 0xf7, 0xbd, 0xa5, 0x08, 0x99, 0xd7, 0xe6, 0x74, - 0x6c, 0xe7, 0xac, 0xa9, 0xab, 0x4f, 0xe5, 0x7f, 0x6e, 0xfe, 0x35, 0xfc, - 0xa6, 0xb7, 0x05, 0xab, 0x16, 0x88, 0x2a, 0x20, 0xeb, 0xbd, 0x8a, 0x5c, - 0xc1, 0xa2, 0x0a, 0x25, 0xc6, 0xae, 0x38, 0x58, 0x0f, 0x56, 0xbc, 0xf4, - 0xac, 0x55, 0x7f, 0xa7, 0x8b, 0x70, 0x71, 0xc6, 0x01, 0xa5, 0x55, 0x18, - 0x90, 0xee, 0x75, 0x69, 0xb8, 0x86, 0x76, 0x9a, 0x4e, 0xf8, 0xfe, 0xc5, - 0xed, 0xc3, 0x5e, 0x69, 0xf2, 0x85, 0x16, 0xb5, 0xa8, 0x41, 0x3d, 0x53, - 0x26, 0xfb, 0x6d, 0x20, 0x39, 0x93, 0x75, 0x01, 0xeb, 0xd9, 0x37, 0xd6, - 0xb3, 0xe5, 0x0b, 0xad, 0x96, 0x0e, 0xf8, 0x0b, 0xcb, 0x36, 0x9b, 0x47, - 0xfa, 0x79, 0x1b, 0x16, 0xa9, 0x0a, 0xec, 0x52, 0x9d, 0xa9, 0xef, 0x07, - 0xf0, 0xc9, 0x53, 0xcf, 0x06, 0xb6, 0x7b, 0x3c, 0xc7, 0x75, 0xa3, 0x3d, - 0x34, 0xc0, 0xf0, 0x26, 0x51, 0x5b, 0x88, 0x44, 0x19, 0xbe, 0xd8, 0x7b, - 0x41, 0x10, 0x8f, 0x3e, 0xc7, 0x9b, 0xc2, 0xf0, 0x7c, 0xf1, 0xca, 0x73, - 0x0b, 0x8a, 0xb4, 0x43, 0xa3, 0x7f, 0x2f, 0xb9, 0x1e, 0xcb, 0x7f, 0xab, - 0xad, 0xe2, 0x2c, 0x23, 0xcf, 0xd2, 0x8e, 0x87, 0x3f, 0x07, 0x98, 0xe3, - 0xe2, 0xfd, 0x32, 0x99, 0x7a, 0x91, 0xbc, 0x98, 0x7d, 0x86, 0x9e, 0x14, - 0xfc, 0xcd, 0x1b, 0x41, 0x6f, 0xea, 0x0c, 0xc9, 0x0a, 0xdf, 0xee, 0xcc, - 0x05, 0x13, 0x8d, 0x43, 0x72, 0x1f, 0x6f, 0x9c, 0x5d, 0xe1, 0x49, 0x45, - 0xe5, 0x80, 0xde, 0xac, 0x64, 0x55, 0x97, 0xcc, 0xe4, 0x2f, 0x7b, 0xbd, - 0xec, 0xd1, 0xd2, 0x89, 0x20, 0x65, 0x0f, 0x9f, 0x94, 0x20, 0xb8, 0x77, - 0xd8, 0x93, 0x24, 0x48, 0xd5, 0x29, 0xb0, 0x9c, 0xf3, 0x08, 0xb5, 0xa3, - 0x76, 0x04, 0x74, 0xce, 0xc1, 0xd1, 0x62, 0x78, 0xf0, 0xcd, 0x37, 0x54, - 0x60, 0x28, 0x34, 0x6c, 0x8c, 0x98, 0x95, 0xd4, 0x72, 0x61, 0x66, 0xa3, - 0xba, 0xa9, 0x1b, 0xdd, 0x76, 0x2b, 0x7d, 0xde, 0x3b, 0xb5, 0x9e, 0x23, - 0x10, 0x04, 0x8e, 0x4c, 0x4b, 0xb7, 0x6d, 0x4b, 0x6a, 0x1c, 0x2c, 0x83, - 0x62, 0x54, 0x44, 0xf3, 0x9b, 0x6d, 0xd2, 0x04, 0x11, 0xc4, 0x8a, 0xb4, - 0x96, 0x96, 0xf0, 0xcd, 0xe0, 0x38, 0xc4, 0xf2, 0xac, 0x7c, 0x12, 0x97, - 0x82, 0x6b, 0x4c, 0x6a, 0xc9, 0xfe, 0xe6, 0xe4, 0x08, 0x13, 0x30, 0x99, - 0x1c, 0x19, 0x4e, 0xf6, 0x45, 0x65, 0xc1, 0x1a, 0x5b, 0x1f, 0x75, 0x41, - 0x8d, 0xba, 0x09, 0x05, 0x56, 0xc2, 0x4a, 0xca, 0x6d, 0x66, 0xf3, 0xa5, - 0xa2, 0x7d, 0x9e, 0x69, 0x8f, 0xd1, 0x75, 0x88, 0x08, 0x88, 0xb4, 0x94, - 0x15, 0x84, 0x4b, 0xbf, 0xf4, 0x5e, 0x97, 0xec, 0x2e, 0x1a, 0xe4, 0x40, - 0xda, 0x5e, 0xae, 0x89, 0xc2, 0xb3, 0x7f, 0x59, 0xe3, 0xa9, 0x44, 0xe6, - 0x69, 0x37, 0xba, 0x66, 0xf4, 0xd4, 0x64, 0x0d, 0x3d, 0xd2, 0x6b, 0xf8, - 0xdf, 0x8e, 0x2a, 0x6f, 0x44, 0xa6, 0x7f, 0xc2, 0x0a, 0x66, 0x0c, 0x89, - 0x35, 0xdd, 0x8e, 0x2e, 0x05, 0xe8, 0x9b, 0xd8, 0x97, 0x4f, 0x45, 0xfa, - 0x77, 0x7e, 0x70, 0xd1, 0x56, 0x92, 0xeb, 0x00, 0x95, 0x6b, 0xef, 0x82, - 0x36, 0xbd, 0x14, 0x34, 0x22, 0x15, 0x54, 0x55, 0x15, 0x51, 0xee, 0x77, - 0x5c, 0xb1, 0xb4, 0x21, 0x5e, 0x1e, 0x71, 0xfa, 0xae, 0xb3, 0xca, 0x62, - 0x83, 0x98, 0x05, 0x41, 0x26, 0x06, 0x8f, 0x01, 0x7c, 0xd2, 0x40, 0x0d, - 0x3b, 0x45, 0xc1, 0xbf, 0x49, 0xff, 0xcf, 0x80, 0x1e, 0xb8, 0x19, 0xec, - 0x9b, 0x30, 0xb2, 0x9c, 0xc1, 0x38, 0x9a, 0x3a, 0x42, 0x27, 0xba, 0xa6, - 0x6c, 0x57, 0xad, 0x9d, 0x2c, 0xa6, 0x35, 0xcf, 0x3b, 0x2d, 0x7a, 0xe2, - 0xc4, 0x92, 0x62, 0x62, 0xd4, 0xc0, 0xc1, 0x16, 0x17, 0x75, 0x75, 0x81, - 0xb4, 0x9a, 0x3c, 0x76, 0x26, 0xb9, 0x9d, 0x59, 0x9e, 0xae, 0xbe, 0x8e, - 0x5a, 0x9a, 0xbb, 0x87, 0x0a, 0x46, 0xb4, 0x1e, 0x1f, 0xd0, 0x67, 0x56, - 0x1f, 0x78, 0x64, 0xbe, 0x97, 0x00, 0xeb, 0x9f, 0x43, 0x01, 0x59, 0x56, - 0x71, 0x25, 0x8f, 0x5d, 0x23, 0x2a, 0xac, 0x1e, 0x4f, 0x3a, 0x28, 0x18, - 0xdd, 0x5b, 0x54, 0x68, 0x1d, 0x7a, 0x77, 0xf1, 0xe7, 0xe1, 0x8b, 0x52, - 0xe1, 0x07, 0xab, 0x1c, 0x0c, 0x82, 0x34, 0x5c, 0x94, 0xc8, 0xe1, 0x41, - 0x93, 0xf9, 0x99, 0x75, 0xeb, 0x2c, 0xdd, 0x67, 0x3e, 0x74, 0x22, 0x51, - 0x9d, 0xb6, 0xad, 0x96, 0x25, 0x42, 0x01, 0x82, 0x38, 0x28, 0xab, 0x73, - 0x40, 0xa0, 0x43, 0x6b, 0xdb, 0xb8, 0xe4, 0x90, 0x7a, 0xe6, 0xe4, 0xe6, - 0x2a, 0xe5, 0xe4, 0x60, 0x17, 0xe9, 0x5b, 0xce, 0xcd, 0x5e, 0xbf, 0x76, - 0xa6, 0x80, 0x7a, 0x35, 0x28, 0x6d, 0xb1, 0xc4, 0x61, 0x99, 0xf0, 0xa3, - 0x89, 0x54, 0xf7, 0xe9, 0xde, 0x43, 0xc4, 0xf0, 0xbf, 0x6a, 0xee, 0x0a, - 0xcb, 0xbf, 0xf4, 0x7f, 0x7d, 0xfa, 0x64, 0xfe, 0x7b, 0xd2, 0x53, 0x49, - 0x7a, 0x3c, 0x0d, 0x20, 0xa1, 0x93, 0x55, 0x1e, 0x63, 0x26, 0x65, 0x47, - 0xa1, 0xff, 0xde, 0x73, 0x1c, 0x46, 0x9f, 0x71, 0xce, 0x59, 0x68, 0x0b, - 0x28, 0x81, 0x26, 0xfe, 0xd5, 0x06, 0x1e, 0x73, 0xf7, 0xfe, 0x70, 0x66, - 0xc8, 0xe1, 0x42, 0x02, 0xc3, 0xc1, 0xeb, 0x4e, 0x09, 0x30, 0x3c, 0x2a, - 0xe8, 0xd0, 0xac, 0x38, 0x00, 0x36, 0x4e, 0x15, 0xaf, 0x83, 0x52, 0x99, - 0x73, 0x02, 0x00, 0x0c, 0x7c, 0xc8, 0x56, 0x4b, 0xff, 0xe0, 0x4e, 0x74, - 0xc0, 0x62, 0x2a, 0x3f, 0xa1, 0x07, 0x3a, 0x28, 0xa6, 0x6f, 0x08, 0xf7, - 0x5f, 0x85, 0x30, 0x7e, 0x4b, 0x61, 0xb2, 0xba, 0x3e, 0x2d, 0xfa, 0xba, - 0xef, 0x84, 0x08, 0x9b, 0xe2, 0x36, 0x8d, 0xc2, 0xd1, 0xae, 0x67, 0xe3, - 0xec, 0x37, 0x7d, 0x74, 0x5e, 0x4b, 0x13, 0xe6, 0x46, 0x07, 0xb2, 0x9d, - 0xea, 0xf8, 0x0c, 0x6a, 0x0a, 0x6d, 0xe9, 0xd3, 0xd4, 0x36, 0xbc, 0x2e, - 0x87, 0x00, 0xd1, 0xe9, 0x92, 0x74, 0xc6, 0xc9, 0xc0, 0x0a, 0xb4, 0x6a, - 0x3c, 0xe6, 0x28, 0xac, 0xad, 0x82, 0xe3, 0x1e, 0xbb, 0x8d, 0xa6, 0xd7, - 0xf9, 0xfb, 0xa5, 0xb3, 0xdf, 0x01, 0x4b, 0xd2, 0xcb, 0xc6, 0x33, 0x22, - 0xbd, 0xcc, 0xe0, 0xeb, 0x2d, 0xf6, 0x21, 0x48, 0xb0, 0x00, 0x53, 0xb5, - 0x56, 0x5d, 0x02, 0x6a, 0xea, 0xf8, 0x13, 0x5d, 0x80, 0x5e, 0xbb, 0xbb, - 0x9d, 0x46, 0x2a, 0x1c, 0x00, 0x3a, 0x0b, 0x81, 0xb5, 0xac, 0x57, 0xdf, - 0x0b, 0x1e, 0x85, 0x49, 0x9f, 0x2f, 0x97, 0x81, 0x22, 0x90, 0x10, 0xef, - 0xf0, 0x14, 0xca, 0xb4, 0x11, 0xaf, 0xbe, 0x8d, 0xbc, 0xc1, 0x61, 0xfc, - 0x53, 0xd0, 0x3a, 0xfa, 0x84, 0xd2, 0xa4, 0x5c, 0x0a, 0xee, 0xa5, 0xe5, - 0xe4, 0x53, 0x01, 0x77, 0x49, 0x52, 0xb0, 0x05, 0xb5, 0xdb, 0x5c, 0xf1, - 0xc6, 0x3c, 0xce, 0x3a, 0x07, 0xf4, 0xd8, 0xaa, 0x6a, 0x92, 0xea, 0x3c, - 0x6e, 0xc7, 0xe4, 0xa0, 0xaa, 0x25, 0xdf, 0xc8, 0x5b, 0x3e, 0xd3, 0x57, - 0xc9, 0xfb, 0x21, 0xec, 0x04, 0xba, 0x69, 0x9c, 0x2a, 0x73, 0x86, 0x41, - 0x0e, 0xf7, 0xc0, 0x9b, 0xe1, 0x54, 0xaa, 0xc9, 0x55, 0xf2, 0x46, 0xec, - 0xac, 0xf0, 0xbb, 0x22, 0xca, 0xc1, 0xbc, 0x80, 0x06, 0x32, 0x28, 0x2f, - 0xf5, 0x03, 0x85, 0x72, 0xe7, 0xd5, 0x37, 0xdd, 0x68, 0x73, 0xfe, 0x53, - 0xe8, 0x1c, 0xb7, 0x64, 0x94, 0x36, 0xd5, 0x69, 0x52, 0x46, 0x79, 0x75, - 0x5b, 0xd7, 0x89, 0xaf, 0x9f, 0x00, 0x65, 0x7f, 0x3c, 0x9c, 0x5f, 0xa8, - 0xbb, 0xd7, 0xd8, 0xd8, 0xfc, 0x84, 0x37, 0x07, 0xff, 0xf2, 0x02, 0xd8, - 0x14, 0x61, 0xff, 0x44, 0xc6, 0x91, 0x15, 0xdc, 0xe5, 0x69, 0xe1, 0x80, - 0xd4, 0x37, 0x89, 0x0b, 0x00, 0xdf, 0x77, 0x8b, 0xeb, 0xa2, 0x81, 0xc4, - 0x88, 0x7f, 0x1b, 0x77, 0xba, 0x30, 0xb1, 0xfe, 0x5a, 0x15, 0x1b, 0x66, - 0xac, 0x54, 0x7d, 0x55, 0xa5, 0xdc, 0x6b, 0xaf, 0x8e, 0x67, 0x70, 0xce, - 0x8f, 0x75, 0x2a, 0x58, 0x10, 0xf2, 0x64, 0x0e, 0x4d, 0x71, 0x1b, 0xd3, - 0x29, 0xeb, 0x9a, 0x43, 0xa6, 0xde, 0x89, 0x80, 0x18, 0xb7, 0xbc, 0x88, - 0xa3, 0x31, 0xb1, 0x71, 0x80, 0xed, 0x7b, 0x91, 0x89, 0x8d, 0x82, 0x3c, - 0x4b, 0x0d, 0x74, 0xd2, 0x0c, 0xcb, 0x95, 0x4e, 0x1d, 0xb1, 0xa9, 0x48, - 0xfc, 0x1c, 0xd8, 0x56, 0xf6, 0xa1, 0x27, 0xd1, 0x77, 0xd3, 0x63, 0x42, - 0x96, 0xe8, 0xc7, 0x82, 0x1c, 0xa5, 0xc4, 0x7f, 0xfb, 0xab, 0x87, 0x26, - 0x2e, 0xb5, 0x96, 0x17, 0x0c, 0x7a, 0xc7, 0xb7, 0x09, 0x9a, 0x6f, 0x30, - 0x74, 0x38, 0xbf, 0xad, 0xfb, 0x9d, 0xe8, 0xd7, 0x03, 0x29, 0x87, 0x85, - 0x24, 0x08, 0xc6, 0x5f, 0xda, 0xe0, 0x41, 0x09, 0x54, 0xab, 0x79, 0xd1, - 0x7d, 0x67, 0xfd, 0xc8, 0xa4, 0xbd, 0x77, 0x32, 0xc5, 0xdc, 0xb4, 0x1a, - 0x7b, 0xec, 0xff, 0x3d, 0x1e, 0x83, 0x3b, 0x1a, 0x6b, 0x80, 0x40, 0x29, - 0x8a, 0x35, 0x2e, 0xd4, 0xa0, 0x08, 0x6c, 0x34, 0xd1, 0x43, 0x24, 0xd7, - 0xe6, 0xc9, 0x1a, 0xb2, 0xee, 0x40, 0x49, 0x66, 0x37, 0xaa, 0x08, 0x29, - 0x22, 0x55, 0x13, 0x04, 0xc2, 0xe9, 0xd8, 0xb2, 0xa6, 0x50, 0x6a, 0xbe, - 0x79, 0x41, 0xdd, 0xce, 0x19, 0xf6, 0x54, 0x4b, 0xca, 0xf8, 0xf2, 0x5d, - 0xbd, 0xca, 0xc9, 0x40, 0xec, 0xcf, 0xdb, 0xe8, 0xa9, 0xe3, 0x92, 0x7f, - 0xc8, 0xc1, 0x49, 0x79, 0x9a, 0x80, 0xf8, 0xe3, 0x60, 0xce, 0x7d, 0xf2, - 0x49, 0xbb, 0x80, 0x1f, 0x54, 0x45, 0x0b, 0x90, 0xd7, 0xf9, 0x82, 0xa5, - 0xc7, 0x49, 0xca, 0x1b, 0x12, 0x55, 0x93, 0x6f, 0xea, 0x72, 0xf9, 0x64, - 0xb8, 0xec, 0x6b, 0x78, 0x85, 0xa6, 0xd2, 0x11, 0x71, 0x06, 0x56, 0x5f, - 0xe1, 0x66, 0xea, 0x5d, 0x9e, 0x0d, 0xa4, 0xc3, 0xd6, 0xe8, 0x86, 0xa5, - 0x2a, 0xd8, 0xf0, 0xf9, 0x7b, 0xdb, 0xc1, 0x4f, 0x52, 0xba, 0xff, 0x7f, - 0x1d, 0x8d, 0x9e, 0x5d, 0x39, 0xc4, 0x01, 0xc2, 0xf9, 0x6e, 0xdb, 0x6c, - 0x32, 0x5d, 0x8e, 0xb4, 0x68, 0x88, 0x79, 0x8b, 0x72, 0x30, 0x31, 0xa9, - 0x71, 0xd4, 0xef, 0x1b, 0x69, 0x37, 0x96, 0x3c, 0x4f, 0x8f, 0x54, 0xcf, - 0x1c, 0x4d, 0x37, 0x14, 0x6e, 0x78, 0xb7, 0x20, 0xc4, 0x59, 0x6d, 0x9c, - 0x66, 0x4d, 0x6b, 0x07, 0x6a, 0x0d, 0x5c, 0xda, 0xeb, 0x8a, 0xfd, 0x68, - 0x71, 0x2d, 0x9b, 0xb9, 0xec, 0x3b, 0x72, 0x5d, 0x06, 0x2e, 0x64, 0xbc, - 0xe4, 0xd2, 0xba, 0x96, 0x29, 0x2d, 0xb7, 0xdc, 0x79, 0xbb, 0xbb, 0xd3, - 0x12, 0x20, 0xa4, 0x7c, 0x59, 0xd7, 0xa0, 0xb7, 0xbb, 0x29, 0x62, 0x9a, - 0x86, 0xf4, 0x5d, 0x60, 0x56, 0x4f, 0xf2, 0x2c, 0x2a, 0x23, 0x49, 0x32, - 0x81, 0xea, 0xed, 0x60, 0xf6, 0x9d, 0x80, 0xb6, 0x53, 0xe6, 0x6c, 0xc4, - 0x06, 0xbd, 0xa9, 0x57, 0x00, 0x24, 0x75, 0x4e, 0xdc, 0xd2, 0xc0, 0xb6, - 0x5f, 0xb5, 0xc2, 0x1e, 0x64, 0x9c, 0x9d, 0xae, 0xd3, 0xea, 0xfa, 0x4e, - 0x22, 0x9a, 0x09, 0xc7, 0xee, 0x16, 0xad, 0x16, 0x60, 0x85, 0xba, 0x82, - 0xb8, 0x99, 0xa4, 0x7c, 0x00, 0xd0, 0xe9, 0x54, 0xaf, 0xd3, 0xb5, 0x6e, - 0x21, 0x50, 0x56, 0x8b, 0x77, 0x5e, 0x0a, 0xcf, 0x93, 0xaa, 0x5a, 0xed, - 0x75, 0x9c, 0x99, 0x8c, 0xfd, 0xa8, 0x0d, 0xb4, 0xa3, 0x3e, 0x99, 0x37, - 0xc8, 0x46, 0xd8, 0x01, 0x35, 0xf2, 0xf5, 0x35, 0x46, 0x35, 0x45, 0x96, - 0x37, 0x58, 0x50, 0x4f, 0xd3, 0xdb, 0x7b, 0x8b, 0x67, 0x10, 0x35, 0x01, - 0xc2, 0xb9, 0x04, 0x15, 0x0a, 0xf0, 0xe8, 0xa3, 0xc1, 0x96, 0x7e, 0xa8, - 0xb7, 0x00, 0xac, 0x2c, 0x81, 0x2e, 0x51, 0x2a, 0xec, 0x04, 0xcd, 0xd7, - 0x7c, 0x50, 0x4a, 0x76, 0xff, 0x69, 0x1b, 0x72, 0x49, 0x5a, 0x4f, 0xd7, - 0x3a, 0xad, 0x3b, 0x28, 0x48, 0x29, 0xc8, 0x32, 0x1e, 0xf5, 0x8e, 0x5c, - 0xfd, 0xf1, 0x17, 0xde, 0x63, 0x64, 0x49, 0x03, 0xbe, 0xb7, 0xe6, 0xfa, - 0x3e, 0xbb, 0x48, 0x64, 0x0d, 0x13, 0xf6, 0xcb, 0xbf, 0x84, 0xa5, 0x14, - 0x01, 0xb8, 0x57, 0x25, 0x19, 0xe8, 0x3f, 0x9c, 0xb0, 0x0c, 0xd0, 0xe8, - 0xdf, 0x96, 0x36, 0xcf, 0x80, 0x0e, 0x7b, 0x39, 0xba, 0xbe, 0x53, 0x4b, - 0x35, 0x04, 0x32, 0xf0, 0x8a, 0xa6, 0x0a, 0x89, 0x4b, 0x04, 0x7e, 0x52, - 0x8d, 0x76, 0x01, 0x57, 0x3c, 0x73, 0x08, 0x6a, 0x41, 0x6e, 0xff, 0x67, - 0x1b, 0x62, 0x94, 0x67, 0x21, 0x8c, 0x07, 0xfb, 0x64, 0x4b, 0xee, 0x70, - 0x57, 0x0a, 0xcc, 0x4e, 0x32, 0x08, 0xf1, 0xb1, 0x3b, 0x31, 0x57, 0xd5, - 0x2a, 0x2c, 0x30, 0xa7, 0x64, 0xee, 0x53, 0x0f, 0x8a, 0xe0, 0xd4, 0xaf, - 0x4f, 0xf6, 0x2f, 0x72, 0x19, 0xff, 0x38, 0xcc, 0x7b, 0xd8, 0x39, 0x0c, - 0x18, 0xcf, 0xc5, 0x87, 0x74, 0x93, 0xe0, 0x54, 0x93, 0xd9, 0xdd, 0x69, - 0x10, 0x99, 0x15, 0xed, 0x96, 0x90, 0x83, 0x4f, 0x6a, 0xf4, 0x4a, 0xe6, - 0x8b, 0x33, 0xe1, 0x0e, 0xef, 0xaa, 0xff, 0x9f, 0x5e, 0xc6, 0x0b, 0x6d, - 0xa1, 0x1f, 0x73, 0x64, 0x55, 0x05, 0x3c, 0x2b, 0xca, 0x9d, 0x40, 0xb4, - 0xc1, 0x3b, 0xe3, 0x14, 0xff, 0x61, 0x01, 0x7a, 0x65, 0xbc, 0x49, 0xec, - 0xfc, 0x93, 0xf6, 0x16, 0xd2, 0x71, 0xa4, 0x55, 0x36, 0x4a, 0x2d, 0x5c, - 0x47, 0x27, 0x40, 0xe7, 0x2e, 0x9c, 0xa7, 0x95, 0xe3, 0x74, 0x7f, 0xae, - 0xe0, 0x84, 0x15, 0xab, 0xe8, 0x83, 0x68, 0x34, 0x0c, 0x31, 0x90, 0x54, - 0x19, 0x6b, 0x0b, 0x36, 0x09, 0xdb, 0xc3, 0xea, 0x7c, 0x47, 0x44, 0xcd, - 0x85, 0x7d, 0x04, 0x22, 0x25, 0x54, 0xaa, 0x17, 0x87, 0x66, 0x94, 0x65, - 0x24, 0xec, 0xf5, 0xf9, 0xd2, 0x2f, 0x32, 0xf6, 0xb3, 0xcc, 0xd4, 0x77, - 0x94, 0xc3, 0xbc, 0xc3, 0xfb, 0x69, 0xe8, 0x6a, 0xdd, 0x3f, 0xd3, 0xf7, - 0x6b, 0xf1, 0x7f, 0xe1, 0x88, 0xee, 0x52, 0x34, 0x74, 0xc5, 0xe8, 0x87, - 0x8a, 0x38, 0xb6, 0x47, 0x15, 0x6a, 0xc3, 0x7c, 0x7e, 0x5c, 0x51, 0x00, - 0xf6, 0xbb, 0xc9, 0xc9, 0x69, 0x90, 0xd1, 0x6c, 0x9b, 0x2a, 0x38, 0x14, - 0x05, 0x1b, 0x7a, 0x2e, 0xe1, 0x7d, 0x58, 0xd7, 0xcb, 0x0c, 0xa5, 0xf4, - 0x6f, 0xe0, 0x4d, 0x5f, 0xa5, 0xba, 0xc9, 0x74, 0xeb, 0x8d, 0x0b, 0x0b, - 0x22, 0x9e, 0x65, 0x71, 0xb2, 0xf4, 0x8f, 0x12, 0xbc, 0xff, 0xad, 0x9f, - 0x54, 0xca, 0xce, 0x85, 0xd9, 0x1d, 0x92, 0x8b, 0xf2, 0x07, 0xc4, 0x8d, - 0xef, 0x5d, 0x78, 0xc6, 0xcb, 0x90, 0xba, 0x89, 0xee, 0xae, 0xbc, 0x62, - 0x59, 0xb6, 0x80, 0x08, 0x11, 0x01, 0xc7, 0xf9, 0x57, 0xf8, 0x56, 0xe3, - 0x2f, 0x6d, 0x65, 0x6f, 0xbe, 0x6a, 0xd3, 0x28, 0x1f, 0x98, 0x9b, 0x53, - 0xc8, 0xf3, 0xb7, 0x25, 0xb6, 0x3d, 0xb8, 0xb8, 0x07, 0x64, 0x21, 0xf5, - 0x64, 0x9c, 0x6e, 0x80, 0xe8, 0xb1, 0x43, 0xf7, 0xe3, 0x42, 0xaf, 0x88, - 0x26, 0x15, 0x1e, 0xdf, 0xd8, 0x94, 0x22, 0x29, 0x07, 0x2d, 0x98, 0xa1, - 0x0d, 0x24, 0xcd, 0x70, 0x81, 0x64, 0x8a, 0x53, 0x40, 0xd1, 0x3a, 0x97, - 0x36, 0xe4, 0x03, 0x7f, 0x5d, 0x50, 0x09, 0xfc, 0xca, 0x71, 0xdc, 0x91, - 0x7d, 0xd0, 0x62, 0x16, 0x5d, 0xcb, 0xe9, 0xba, 0x1d, 0x29, 0x34, 0x68, - 0x6c, 0x47, 0x17, 0x25, 0x0b, 0x0b, 0x1a, 0x98, 0x65, 0xa5, 0x57, 0xcf, - 0x4d, 0xac, 0xba, 0xae, 0x97, 0x12, 0xa2, 0xac, 0xaa, 0x8c, 0x0d, 0x2a, - 0x18, 0x12, 0x4e, 0xd7, 0x57, 0x3f, 0x33, 0xba, 0xd3, 0xfc, 0xf0, 0x02, - 0x1c, 0x0d, 0x7b, 0x7a, 0x02, 0x46, 0xab, 0x48, 0x4d, 0x3c, 0xb2, 0xf3, - 0xcf, 0x12, 0x1f, 0x01, 0xb0, 0xc7, 0x5c, 0xf5, 0xf8, 0x46, 0x76, 0xab, - 0x66, 0x32, 0x02, 0x3c, 0x87, 0x01, 0xee, 0xf4, 0xc2, 0x3c, 0x02, 0xf4, - 0x7f, 0x89, 0xef, 0x5a, 0x5b, 0xab, 0x7d, 0xfc, 0x8d, 0x92, 0x6a, 0x0f, - 0x21, 0x9b, 0x6b, 0xc3, 0x6a, 0x31, 0x0f, 0x27, 0xbd, 0xc9, 0xb7, 0x04, - 0x4a, 0xa3, 0xf4, 0x41, 0xf6, 0x45, 0xfd, 0x55, 0xee, 0xbe, 0xf2, 0xe1, - 0x14, 0xec, 0x98, 0x6a, 0x24, 0xcc, 0x26, 0xdb, 0x9a, 0x98, 0x3f, 0xc2, - 0x51, 0x74, 0x70, 0x9a, 0x52, 0x48, 0xac, 0x56, 0x5b, 0x52, 0x8f, 0xb4, - 0x15, 0x08, 0x61, 0xaf, 0x91, 0x6f, 0xe8, 0xde, 0xd6, 0xc4, 0x1d, 0x40, - 0x64, 0x1d, 0x80, 0xc4, 0xcb, 0x24, 0x0f, 0x37, 0xfb, 0xa9, 0xbe, 0xf6, - 0x29, 0xb7, 0xf9, 0x63, 0xf6, 0x8a, 0xb3, 0x56, 0x8b, 0x1b, 0x58, 0x10, - 0xea, 0xb0, 0x7e, 0x10, 0x73, 0x6b, 0xfc, 0x13, 0xc3, 0x5a, 0xb3, 0xd0, - 0x43, 0x51, 0x58, 0x97, 0x92, 0xe6, 0xb9, 0x80, 0x23, 0x5a, 0x3e, 0x42, - 0xc4, 0x08, 0xde, 0xac, 0xf8, 0xb8, 0x63, 0xfd, 0xb1, 0x8f, 0x23, 0xf2, - 0x56, 0x68, 0xf1, 0x05, 0xc9, 0xe9, 0x3a, 0x23, 0xb3, 0x35, 0xc0, 0x59, - 0xba, 0x03, 0x11, 0x2a, 0x0c, 0xaa, 0x7b, 0x81, 0x12, 0x48, 0xab, 0xbd, - 0x76, 0x85, 0x8c, 0xa5, 0x34, 0x0f, 0x89, 0x29, 0x14, 0x32, 0x1f, 0xf1, - 0xca, 0xf6, 0x99, 0x32, 0x2a, 0x49, 0xd9, 0x46, 0x23, 0x06, 0x31, 0x21, - 0x51, 0x1f, 0x09, 0x07, 0x6b, 0xab, 0x8d, 0x6c, 0x3a, 0xa9, 0x1e, 0xd5, - 0x27, 0x64, 0xf8, 0x71, 0x0f, 0x9d, 0x10, 0x9c, 0x83, 0x30, 0x95, 0x8f, - 0xcf, 0xb7, 0xbc, 0x9f, 0xf1, 0x5a, 0x12, 0x47, 0x39, 0xd3, 0xfe, 0x17, - 0x0c, 0x47, 0x87, 0xe4, 0xe1, 0x0f, 0x8f, 0xa5, 0x8a, 0x44, 0x4f, 0x22, - 0x22, 0x4b, 0x55, 0xef, 0x09, 0x39, 0x44, 0x15, 0x0e, 0xda, 0x49, 0xa0, - 0x79, 0x20, 0x29, 0xee, 0x38, 0x68, 0x4b, 0xaa, 0xec, 0x86, 0x85, 0x16, - 0x44, 0x81, 0x36, 0x51, 0xbc, 0x19, 0xae, 0x7b, 0x71, 0x9a, 0xa2, 0x99, - 0xb0, 0xbd, 0x37, 0x7d, 0x0b, 0x1a, 0x7e, 0x51, 0xa3, 0x23, 0xe7, 0x2f, - 0xe7, 0x86, 0x04, 0xe0, 0xa5, 0xbe, 0xdc, 0x25, 0x7c, 0x7b, 0xc6, 0x09, - 0x8e, 0x54, 0x56, 0x49, 0x38, 0xdc, 0xe0, 0x9e, 0x47, 0xe0, 0x27, 0xa3, - 0xa4, 0xcb, 0xc9, 0x63, 0x45, 0x90, 0xef, 0x39, 0xb7, 0x41, 0xe9, 0x47, - 0x3f, 0xa9, 0xd6, 0x3e, 0x22, 0x7c, 0xe3, 0x27, 0x17, 0x27, 0x84, 0x09, - 0x5d, 0xae, 0x41, 0x7e, 0xca, 0x12, 0xf2, 0x3e, 0x5f, 0x07, 0xe7, 0x8a, - 0xf8, 0xa8, 0xc3, 0x48, 0x0f, 0x00, 0x00, 0x52, 0x76, 0x69, 0xa9, 0xed, - 0x83, 0x23, 0x70, 0x36, 0x5d, 0x42, 0x85, 0xc4, 0x7b, 0x82, 0xb5, 0x1d, - 0xb5, 0x72, 0xb9, 0x38, 0x36, 0xef, 0x3d, 0xdf, 0xa6, 0xad, 0x5c, 0xf9, - 0x06, 0x13, 0x2f, 0xff, 0xa9, 0x7e, 0x3b, 0x45, 0x78, 0x3d, 0x32, 0xc8, - 0x79, 0x4f, 0x78, 0x8c, 0x62, 0x63, 0x1f, 0x2f, 0x87, 0x7c, 0x8b, 0x13, - 0xe4, 0x82, 0x22, 0xe7, 0x1e, 0x9a, 0xe9, 0xe6, 0xe7, 0x4b, 0xce, 0x1e, - 0xd6, 0xfa, 0x26, 0xa3, 0x7b, 0x5e, 0x39, 0xba, 0x21, 0xfc, 0xc4, 0x8e, - 0xd3, 0x9a, 0xa9, 0x1f, 0xb0, 0x6c, 0x84, 0x50, 0x8f, 0x9b, 0xf9, 0x2b, - 0x3b, 0x9e, 0xbb, 0x91, 0xda, 0x7e, 0xb7, 0x45, 0x7b, 0x04, 0xc4, 0x23, - 0x17, 0x10, 0xb9, 0x37, 0xab, 0x09, 0x3a, 0x32, 0x90, 0x0a, 0x56, 0x9c, - 0x5a, 0x9d, 0x59, 0x27, 0x20, 0xd4, 0xe8, 0xe1, 0x88, 0xd5, 0x93, 0xea, - 0xec, 0x14, 0x2f, 0x33, 0x3c, 0x0f, 0xc0, 0x02, 0x2f, 0xb2, 0x0b, 0xbf, - 0xa6, 0xa6, 0x3b, 0xc5, 0x85, 0xf1, 0x38, 0xd0, 0x50, 0xfb, 0xa2, 0xc5, - 0xd5, 0xe5, 0x8e, 0x15, 0x97, 0xbe, 0x95, 0xb0, 0x18, 0xc5, 0x35, 0x28, - 0xf0, 0x39, 0xc7, 0xfb, 0xc8, 0xb5, 0x02, 0x22, 0x3b, 0x95, 0x9a, 0x61, - 0x1a, 0x87, 0xfa, 0xbd, 0xdb, 0xd7, 0xba, 0xb9, 0xd0, 0x04, 0xb2, 0xfb, - 0x02, 0x38, 0x2d, 0x24, 0x6e, 0x03, 0x8d, 0xa6, 0x16, 0xec, 0x55, 0xc5, - 0xbc, 0x8c, 0xd9, 0xe6, 0xc7, 0x61, 0x96, 0xdc, 0x45, 0xc3, 0x2d, 0x6b, - 0xeb, 0x8b, 0x29, 0x1c, 0xcc, 0x39, 0x53, 0x03, 0x6f, 0x85, 0x2e, 0x1e, - 0x6c, 0xeb, 0xf8, 0x7d, 0x40, 0x5f, 0xb4, 0x59, 0x97, 0x90, 0x22, 0x2c, - 0xee, 0xc4, 0x0b, 0x15, 0xd2, 0x6d, 0x30, 0xee, 0x30, 0xe0, 0x39, 0xfd, - 0x4d, 0xd7, 0xc5, 0x8e, 0xf3, 0xa3, 0x68, 0x50, 0xe5, 0x91, 0x21, 0x39, - 0x84, 0xec, 0x4c, 0x32, 0x44, 0xb7, 0x2f, 0x53, 0x5b, 0xff, 0xd0, 0x2f, - 0x34, 0xc7, 0x1f, 0x1a, 0xa5, 0x10, 0xf8, 0x5f, 0x3c, 0xa7, 0xa3, 0x24, - 0x49, 0x90, 0x20, 0x4e, 0x89, 0x86, 0x71, 0x3b, 0xd2, 0x53, 0x5c, 0xe4, - 0x7b, 0x83, 0x57, 0xbc, 0x73, 0x0b, 0xd2, 0xeb, 0x36, 0x46, 0x17, 0xd9, - 0x7a, 0x44, 0x2c, 0x1d, 0xa1, 0x3a, 0x8c, 0x1f, 0xaa, 0x7c, 0xc6, 0x15, - 0xc7, 0x67, 0x70, 0x13, 0x1d, 0x08, 0x3c, 0xc4, 0xb4, 0x3a, 0x80, 0x40, - 0xef, 0x98, 0x45, 0x06, 0x66, 0xfd, 0x3f, 0xbb, 0x12, 0x28, 0x02, 0xd1, - 0x6d, 0x3c, 0x3e, 0xda, 0xbe, 0x3a, 0x19, 0x91, 0x8a, 0x05, 0x3e, 0x91, - 0x50, 0x9b, 0x83, 0xaa, 0x55, 0x45, 0x1b, 0xdc, 0x92, 0xde, 0x48, 0x70, - 0xe9, 0x8f, 0x9e, 0x39, 0xa6, 0x14, 0xf4, 0x94, 0x3a, 0xba, 0x6d, 0x11, - 0x60, 0x99, 0x86, 0x80, 0x16, 0x9f, 0xaa, 0x88, 0xfd, 0x97, 0x4b, 0xd4, - 0xca, 0x55, 0x4a, 0x8a, 0x72, 0xf5, 0x9f, 0x63, 0xdb, 0xe0, 0x83, 0x83, - 0x39, 0x4b, 0x85, 0x28, 0x4e, 0xc9, 0x64, 0xa7, 0xad, 0x52, 0xfe, 0x79, - 0xb5, 0x0c, 0x71, 0x05, 0xa2, 0x1e, 0x4d, 0x9c, 0xd8, 0x52, 0x41, 0xf4, - 0x3c, 0xfc, 0x9b, 0x79, 0xc2, 0x58, 0x94, 0x0c, 0xb4, 0x19, 0x8d, 0xd6, - 0x60, 0xf9, 0xff, 0x43, 0xfb, 0x29, 0xf2, 0x8a, 0x3a, 0x27, 0x57, 0x07, - 0x8a, 0xaf, 0x71, 0x8d, 0x47, 0xef, 0x8b, 0x01, 0x2c, 0x79, 0x58, 0xe1, - 0x22, 0x60, 0xc4, 0x21, 0x7b, 0x5e, 0xd7, 0xe1, 0xbd, 0x58, 0x44, 0x07, - 0x9f, 0xf8, 0x30, 0xf8, 0x11, 0x32, 0xc7, 0xa6, 0xe7, 0xab, 0x8e, 0xe1, - 0x74, 0x82, 0xb3, 0xf6, 0x9e, 0x66, 0xbc, 0x24, 0x4c, 0x6b, 0x96, 0x0c, - 0xf2, 0x61, 0xb2, 0x35, 0x27, 0x22, 0x83, 0x7b, 0xb4, 0x10, 0xf1, 0x67, - 0x1e, 0xc0, 0x9e, 0x01, 0xf8, 0x28, 0xc3, 0xd3, 0x9e, 0xa2, 0x8e, 0x79, - 0xe2, 0x39, 0x8f, 0x08, 0x97, 0xd4, 0x30, 0x6e, 0xf3, 0x6f, 0x6d, 0xeb, - 0x85, 0xaf, 0x14, 0x76, 0x92, 0x8f, 0x32, 0x36, 0x06, 0xc1, 0xcd, 0x08, - 0x4b, 0x93, 0xf6, 0x43, 0x0c, 0x03, 0xa8, 0x0f, 0x1c, 0x70, 0xc3, 0x37, - 0x2e, 0x33, 0x37, 0x7a, 0x08, 0x15, 0xd8, 0xac, 0xf6, 0x5a, 0x84, 0xff, - 0xe9, 0x93, 0xa7, 0x95, 0x91, 0x0b, 0x7d, 0x1c, 0xc2, 0x7c, 0xf0, 0x90, - 0xdc, 0x80, 0x54, 0x0b, 0x7b, 0x97, 0x97, 0xe5, 0x0e, 0xe8, 0x9e, 0x5a, - 0x4c, 0x41, 0x14, 0x7f, 0xfe, 0xa9, 0xc9, 0x76, 0x9b, 0x47, 0x99, 0xc6, - 0xfc, 0xfe, 0x05, 0x22, 0xda, 0x74, 0x40, 0x3f, 0xb6, 0xf9, 0x3f, 0xbc, - 0x79, 0x63, 0x91, 0xb1, 0xae, 0x31, 0x36, 0x60, 0x6c, 0x9e, 0x77, 0xbc, - 0xb4, 0xd5, 0xfe, 0xd1, 0xf7, 0xe7, 0xd1, 0x5f, 0xcc, 0xc2, 0xbe, 0x95, - 0x00, 0x9a, 0x78, 0x91, 0xfa, 0x99, 0x52, 0x57, 0x1f, 0x71, 0xb8, 0x1e, - 0x5e, 0xd2, 0x2f, 0x9f, 0x8a, 0x26, 0x0f, 0x85, 0xa5, 0x11, 0x19, 0x18, - 0x47, 0x30, 0x1b, 0xd9, 0xb2, 0x92, 0xf8, 0x1c, 0xba, 0xa3, 0x3a, 0x12, - 0xc6, 0x1f, 0x4d, 0xf0, 0xc1, 0x2a, 0x5b, 0x0c, 0xfe, 0x89, 0x88, 0xec, - 0xd5, 0x63, 0x88, 0x8f, 0x2d, 0x5c, 0x57, 0xe4, 0xc9, 0x4c, 0xc3, 0x55, - 0xbf, 0x01, 0x74, 0xde, 0x5a, 0x5b, 0x98, 0xb9, 0xa9, 0xf5, 0xf1, 0x30, - 0x77, 0x65, 0x0c, 0x76, 0xa3, 0x29, 0xa0, 0xec, 0x1b, 0xbc, 0xdb, 0x47, - 0x7c, 0x01, 0x1f, 0x78, 0x1f, 0x26, 0x09, 0xe0, 0xfa, 0x07, 0xc0, 0xa1, - 0x96, 0x5e, 0xf1, 0x2e, 0x30, 0x55, 0x03, 0xaf, 0xf9, 0x4c, 0xc6, 0x28, - 0x56, 0xfc, 0xab, 0xe4, 0x47, 0x7b, 0x1b, 0x8a, 0x5a, 0xe3, 0x59, 0x94, - 0x03, 0x87, 0x8d, 0xad, 0x0a, 0xaf, 0x40, 0x81, 0x99, 0x5a, 0x81, 0x21, - 0x29, 0xfe, 0x58, 0x0e, 0x86, 0x85, 0xde, 0x9f, 0xa6, 0x7f, 0x90, 0xa6, - 0xde, 0xc5, 0x4d, 0x83, 0x2c, 0x6f, 0xdd, 0x58, 0x32, 0x4d, 0x29, 0x74, - 0xdd, 0x65, 0xf8, 0xea, 0xb3, 0xd3, 0x55, 0x59, 0xd9, 0xed, 0xf3, 0x01, - 0xb6, 0x55, 0x8f, 0x9b, 0x49, 0x01, 0x89, 0xdb, 0x0b, 0xbb, 0xfb, 0x8b, - 0x9d, 0xb2, 0x16, 0x0a, 0xad, 0x6f, 0x07, 0x6b, 0x2b, 0xe9, 0xc5, 0x9b, - 0x60, 0xd4, 0x6d, 0xd1, 0x14, 0xaa, 0x78, 0x7b, 0x64, 0xf7, 0xe6, 0x52, - 0xee, 0xf4, 0x7f, 0xd3, 0x5b, 0x2c, 0xf2, 0xde, 0x12, 0x7b, 0x2d, 0x0a, - 0x9a, 0x1d, 0x62, 0x4a, 0x03, 0x64, 0x66, 0xbf, 0x11, 0xaa, 0x21, 0xe2, - 0xfd, 0xf6, 0x5f, 0x3d, 0x86, 0x3c, 0x04, 0xad, 0xdd, 0x17, 0x0f, 0x68, - 0x85, 0x4f, 0xbe, 0xca, 0x8a, 0x7d, 0xd6, 0xbd, 0x54, 0xce, 0x7a, 0x3c, - 0xf3, 0x90, 0xc7, 0xc9, 0xe8, 0xe3, 0x09, 0xc5, 0x4b, 0xf4, 0xf2, 0xe0, - 0xbe, 0x75, 0x74, 0x26, 0xaf, 0xbc, 0x99, 0xbf, 0xbd, 0x5d, 0xff, 0xe3, - 0x80, 0x20, 0xae, 0x76, 0xf3, 0x0b, 0xa7, 0xab, 0x4e, 0x95, 0x79, 0xf9, - 0xf4, 0xff, 0xf3, 0x3d, 0x96, 0xff, 0x91, 0x18, 0x70, 0x20, 0x32, 0xcb, - 0xdf, 0xaf, 0x8d, 0x6c, 0x08, 0x4b, 0xd7, 0x73, 0xc9, 0xd2, 0x43, 0xeb, - 0x43, 0x2d, 0x60, 0x15, 0x29, 0xb3, 0x86, 0xca, 0xe2, 0x79, 0x8d, 0x76, - 0x93, 0x0d, 0xaa, 0x20, 0x6a, 0xfc, 0x2d, 0x53, 0x27, 0x8c, 0x54, 0x49, - 0xad, 0x26, 0xeb, 0xbe, 0x73, 0x19, 0x17, 0x64, 0xac, 0x45, 0x2c, 0xe6, - 0x54, 0xcb, 0x87, 0x39, 0x13, 0x22, 0xa3, 0x0e, 0x0e, 0x1f, 0x89, 0x4d, - 0x43, 0x91, 0x91, 0xcd, 0x9e, 0xa9, 0x2f, 0x9a, 0x23, 0x80, 0x56, 0x1e, - 0x0b, 0x80, 0xf7, 0x49, 0xad, 0x60, 0xf6, 0x53, 0x42, 0x28, 0x3c, 0x55, - 0xaf, 0xd2, 0xe6, 0xab, 0x61, 0xaa, 0x0e, 0x7c, 0x4e, 0x85, 0x4e, 0x61, - 0xb4, 0xe1, 0x51, 0xec, 0x4f, 0x38, 0x55, 0x68, 0xdc, 0xf9, 0xda, 0x05, - 0xab, 0x09, 0xdd, 0xb2, 0xd9, 0x52, 0x92, 0xce, 0xad, 0xf8, 0x7a, 0xae, - 0xb3, 0x53, 0x7b, 0xae, 0xcb, 0x2e, 0x39, 0xb5, 0xf9, 0x71, 0x78, 0x49, - 0x61, 0xfc, 0xad, 0x5c, 0xdf, 0x63, 0x28, 0x43, 0x27, 0x74, 0xab, 0xf4, - 0x3e, 0x5f, 0x9c, 0x8e, 0x61, 0x17, 0xf3, 0xbb, 0x10, 0xcf, 0x7f, 0x8e, - 0x07, 0xd5, 0xab, 0x94, 0x01, 0x00, 0x67, 0x46, 0x70, 0x4f, 0x5e, 0xd8, - 0xc6, 0x92, 0xf2, 0x2d, 0x6f, 0x46, 0xb6, 0xc2, 0xcd, 0x10, 0x1c, 0x10, - 0x87, 0x1a, 0x27, 0x32, 0xf9, 0x94, 0xf7, 0x59, 0xdd, 0x2f, 0x9f, 0xf0, - 0xba, 0x52, 0xf3, 0xfd, 0xf9, 0x88, 0x85, 0xdb, 0x1b, 0xf7, 0x22, 0xa0, - 0xc0, 0x38, 0xcf, 0x57, 0x89, 0x0a, 0xc0, 0xd2, 0x7a, 0xc5, 0x10, 0x6e, - 0xae, 0x75, 0x60, 0x9b, 0xb3, 0xb3, 0x97, 0x49, 0x95, 0x3d, 0xa4, 0x35, - 0x39, 0xde, 0xa1, 0xfd, 0x7d, 0x8b, 0xff, 0x80, 0x80, 0xfb, 0x79, 0x4d, - 0xeb, 0x66, 0x54, 0x09, 0x92, 0xcc, 0xeb, 0x32, 0x86, 0xa1, 0x96, 0x42, - 0x86, 0xcc, 0x09, 0x02, 0x3d, 0xe2, 0x46, 0x46, 0x1b, 0x6a, 0xd3, 0xf8, - 0x3d, 0x31, 0x22, 0x5b, 0x80, 0x5a, 0x67, 0x07, 0x28, 0x22, 0x01, 0x05, - 0x2d, 0x66, 0xeb, 0x95, 0x8f, 0xd5, 0xf0, 0xea, 0xfb, 0xbf, 0xdc, 0x5d, - 0xe9, 0xac, 0xcc, 0x4e, 0x4a, 0xab, 0x73, 0x16, 0xe0, 0xd3, 0xe9, 0x11, - 0x64, 0xe5, 0xf8, 0x09, 0xf0, 0x24, 0xde, 0x17, 0x1d, 0x31, 0xd2, 0xe5, - 0xfb, 0x74, 0xb7, 0xd3, 0xef, 0x3a, 0x17, 0x9a, 0xb9, 0x8a, 0x1f, 0x61, - 0xdb, 0xc0, 0x2d, 0x93, 0xab, 0xb1, 0xe6, 0x47, 0x7e, 0x1b, 0x2e, 0xa2, - 0xb2, 0x32, 0x69, 0xa3, 0xf9, 0x46, 0x98, 0x89, 0xdd, 0xd7, 0xf9, 0xc6, - 0xf0, 0x4c, 0x9d, 0xe6, 0xa0, 0xb5, 0x4b, 0x03, 0xea, 0x5f, 0x73, 0xb8, - 0x85, 0x12, 0x56, 0xf6, 0xf3, 0x31, 0xf2, 0xc5, 0xff, 0x20, 0x6e, 0x37, - 0x1e, 0x32, 0x2a, 0xf0, 0x15, 0xe7, 0xa2, 0xed, 0xa4, 0x0d, 0x14, 0x44, - 0x49, 0xca, 0x55, 0x5d, 0xe8, 0xf7, 0x86, 0x99, 0xa6, 0x86, 0x94, 0x82, - 0x22, 0x8b, 0xa4, 0x37, 0x91, 0x04, 0x86, 0x26, 0x3d, 0x45, 0x38, 0x37, - 0x05, 0xfe, 0x86, 0xd9, 0x2c, 0xd0, 0xfd, 0x1e, 0x86, 0x42, 0x71, 0xfe, - 0x29, 0xf0, 0x8b, 0xf3, 0x7a, 0x08, 0x9f, 0xa6, 0x8c, 0x43, 0xb1, 0x8c, - 0x0d, 0x07, 0x30, 0x5d, 0x8c, 0x37, 0x7b, 0x8f, 0x7f, 0x45, 0xb8, 0x91, - 0x1b, 0xa4, 0xe1, 0xb5, 0xab, 0x78, 0x70, 0x0a, 0xcf, 0x78, 0xab, 0xbd, - 0x3b, 0xb7, 0x1a, 0xde, 0x5b, 0x76, 0xa2, 0x30, 0x6a, 0x04, 0xc4, 0xac, - 0xc6, 0xfb, 0xa2, 0xb5, 0x8a, 0x84, 0xa7, 0x07, 0x6f, 0x0b, 0x85, 0x3e, - 0xbc, 0xcc, 0x6b, 0x51, 0x13, 0x47, 0x5d, 0x5f, 0xa8, 0xdd, 0xfd, 0xf0, - 0x48, 0x0d, 0x52, 0x4f, 0xad, 0x0d, 0x7a, 0xdd, 0x23, 0x15, 0x48, 0xe3, - 0x83, 0xe3, 0x58, 0x7d, 0x65, 0x8a, 0x5a, 0xb8, 0x8f, 0xdf, 0xd0, 0x15, - 0xd8, 0x80, 0x16, 0x00, 0x96, 0x3d, 0xc9, 0x2e, 0xf1, 0xfe, 0x4d, 0xf9, - 0x68, 0x3d, 0x25, 0xe0, 0x25, 0x46, 0xca, 0x4c, 0xaa, 0x01, 0x34, 0x04, - 0xb9, 0xcc, 0xc3, 0x4f, 0xca, 0xcb, 0x47, 0xf1, 0x6d, 0xb5, 0xb0, 0x9d, - 0x83, 0xe4, 0xf4, 0x0d, 0xbd, 0x76, 0x5e, 0x4a, 0xb2, 0x62, 0xbe, 0x7b, - 0x71, 0x15, 0x1c, 0x0f, 0x22, 0xd1, 0x39, 0xd4, 0x5c, 0x63, 0xec, 0x8d, - 0x98, 0x7a, 0xa2, 0x0d, 0xc1, 0x27, 0xa4, 0x8a, 0x6d, 0xc5, 0x0b, 0xb2, - 0xe7, 0x10, 0x85, 0x62, 0xe5, 0xd3, 0xe5, 0x88, 0x56, 0x1f, 0x17, 0xcb, - 0xd0, 0xde, 0x55, 0x88, 0xb1, 0xf3, 0x49, 0x7d, 0xc4, 0x19, 0x81, 0xa4, - 0xa9, 0x62, 0x9d, 0xa9, 0xe2, 0xf8, 0xcd, 0xcf, 0xeb, 0x15, 0x78, 0x3c, - 0x86, 0x34, 0x85, 0xe9, 0x17, 0xf5, 0xe2, 0xa8, 0xae, 0xc8, 0xf4, 0x13, - 0x3c, 0x06, 0x68, 0x90, 0xba, 0xba, 0xb3, 0x14, 0xe4, 0x54, 0x02, 0x01, - 0x02, 0xac, 0x89, 0xfb, 0xd8, 0x1c, 0x16, 0x67, 0xdc, 0x63, 0x52, 0x48, - 0x4e, 0xd4, 0x34, 0xa7, 0x53, 0xc6, 0x11, 0x94, 0xc7, 0xb0, 0xf8, 0x56, - 0x4e, 0x8e, 0x32, 0x7d, 0xbd, 0xb7, 0x15, 0x2d, 0xd2, 0x18, 0x0d, 0xd5, - 0xd3, 0xe9, 0x96, 0x1d, 0xab, 0xa8, 0xf8, 0x4a, 0x8f, 0x83, 0xb0, 0x85, - 0xfc, 0x8d, 0x64, 0xa4, 0x6f, 0x35, 0x94, 0x22, 0x84, 0xe9, 0x80, 0x07, - 0x59, 0x36, 0x5e, 0xf1, 0x2c, 0xc9, 0x18, 0x1f, 0x98, 0x85, 0x32, 0xb2, - 0xf0, 0xac, 0x09, 0x2d, 0x7b, 0x49, 0x6b, 0x8b, 0xa5, 0xb1, 0x11, 0xd5, - 0x61, 0xfd, 0x52, 0xbd, 0xa3, 0x29, 0x9a, 0x26, 0x10, 0x55, 0x8d, 0x5e, - 0x2c, 0xef, 0x5e, 0x71, 0xd3, 0xbb, 0x99, 0x4c, 0x3b, 0x2d, 0xfc, 0xc5, - 0xb2, 0xae, 0x94, 0x72, 0xb9, 0x0c, 0xd6, 0x69, 0x7a, 0x5f, 0x2b, 0xc1, - 0x13, 0xf5, 0x5a, 0x9d, 0x69, 0x98, 0x83, 0x54, 0x96, 0x1b, 0xba, 0x59, - 0x52, 0xd7, 0x02, 0x28, 0xf9, 0xb7, 0x32, 0x20, 0x6a, 0x46, 0x38, 0xc9, - 0xe8, 0x70, 0x01, 0x87, 0x7c, 0x9d, 0x6f, 0xe8, 0x44, 0x59, 0x3d, 0x47, - 0xd6, 0xc6, 0x9c, 0xff, 0x5e, 0xa1, 0xb7, 0x6e, 0x25, 0x49, 0xa7, 0xca, - 0x25, 0x7a, 0x77, 0x45, 0x27, 0xae, 0xa9, 0xb9, 0x28, 0x62, 0x56, 0x7a, - 0x97, 0x15, 0x30, 0xe2, 0xd8, 0xcd, 0x01, 0xa5, 0x50, 0x85, 0xe7, 0xb9, - 0x80, 0x48, 0x3f, 0x98, 0x55, 0x37, 0x52, 0x1d, 0x9c, 0x7f, 0xe9, 0x5b, - 0xed, 0xd4, 0x9e, 0x34, 0x17, 0xf9, 0x4c, 0x8b, 0x1a, 0xd5, 0x31, 0x78, - 0x52, 0xf8, 0x5e, 0x45, 0xce, 0x74, 0x0f, 0x97, 0xa5, 0x8e, 0x70, 0xc0, - 0x7c, 0xb9, 0xb2, 0x73, 0xbd, 0x9f, 0xfa, 0x5a, 0x15, 0xff, 0x87, 0x6b, - 0x7c, 0x2e, 0xac, 0x64, 0x36, 0x45, 0x88, 0x7c, 0xf7, 0x1d, 0xc9, 0x6d, - 0x76, 0xb2, 0x68, 0xc4, 0x84, 0xbf, 0x72, 0xae, 0x41, 0x03, 0xcb, 0x5d, - 0x0d, 0xc5, 0x64, 0x44, 0xed, 0x93, 0x8e, 0x0c, 0xef, 0xc7, 0x02, 0xca, - 0x34, 0x06, 0xe7, 0x2d, 0xbd, 0x41, 0xa3, 0xc4, 0x6a, 0xee, 0xa6, 0x1a, - 0x92, 0x82, 0x45, 0x74, 0x9b, 0xea, 0x2f, 0xc8, 0x47, 0x1b, 0xa8, 0x7d, - 0x4d, 0x0d, 0x09, 0xc4, 0x3a, 0x83, 0xf6, 0xd7, 0x18, 0x80, 0x11, 0x0d, - 0x7a, 0xdc, 0xb1, 0xaa, 0xb4, 0xe4, 0x93, 0x9c, 0x98, 0xc4, 0xa0, 0x5b, - 0xa4, 0x43, 0xda, 0x49, 0x1a, 0xb8, 0xd1, 0x03, 0xf8, 0xe2, 0x93, 0x70, - 0x80, 0x07, 0xea, 0xc2, 0xb6, 0x45, 0xf2, 0x07, 0xac, 0x74, 0x60, 0x8e, - 0x26, 0x7c, 0xfe, 0xd9, 0x0e, 0x42, 0x78, 0x7c, 0xfe, 0x34, 0x96, 0x89, - 0xed, 0xe2, 0x9d, 0x88, 0x70, 0x72, 0xb0, 0x62, 0xe4, 0xa9, 0x74, 0x77, - 0x45, 0xf0, 0x6e, 0x7f, 0x21, 0x50, 0x92, 0xac, 0x4c, 0x7a, 0xe1, 0x51, - 0x2b, 0x7b, 0x8d, 0xfb, 0x2e, 0xdc, 0xfa, 0x8b, 0xb6, 0x48, 0xe4, 0xcb, - 0x99, 0xf4, 0x29, 0x4b, 0xe8, 0x30, 0x02, 0xb4, 0xef, 0xc1, 0xfb, 0xea, - 0x26, 0x38, 0xf3, 0x2e, 0xbd, 0x4e, 0x16, 0x4e, 0xc7, 0x5c, 0x69, 0x10, - 0x17, 0xe2, 0xcb, 0x89, 0x82, 0x71, 0xbf, 0x65, 0x1c, 0x54, 0xaa, 0xbd, - 0x2b, 0x27, 0xc6, 0xa4, 0xe1, 0xfd, 0xbf, 0xa6, 0xc6, 0x8e, 0x11, 0x20, - 0x23, 0x7e, 0x7c, 0x04, 0x9a, 0xb3, 0x26, 0x91, 0x18, 0x1f, 0x35, 0x01, - 0x78, 0xdc, 0x93, 0xcc, 0x1a, 0xf1, 0x9a, 0x1b, 0x48, 0x43, 0x15, 0x75, - 0xba, 0xd7, 0x3c, 0xf4, 0x50, 0xd0, 0x81, 0x23, 0x37, 0x09, 0xf1, 0x52, - 0xd7, 0x9b, 0x07, 0x19, 0xed, 0x3f, 0xe7, 0xfb, 0xf3, 0x19, 0x9a, 0x3e, - 0x42, 0x1d, 0xa3, 0xf5, 0xb9, 0x8b, 0x34, 0x6c, 0x44, 0xb8, 0x01, 0x18, - 0xa0, 0x05, 0x58, 0xf3, 0x7c, 0x41, 0x51, 0x6a, 0x24, 0x8e, 0x22, 0x6a, - 0x66, 0x8d, 0x3c, 0x15, 0xed, 0x63, 0x3a, 0x33, 0x2c, 0x59, 0x64, 0x45, - 0x3f, 0x78, 0xfa, 0xb5, 0xdc, 0xa6, 0x79, 0xe1, 0xbe, 0xac, 0x57, 0xd9, - 0x45, 0xd3, 0x3d, 0xc4, 0xb7, 0xde, 0xc6, 0x65, 0x26, 0x47, 0xc2, 0xc8, - 0xd2, 0x9c, 0xc9, 0x34, 0xb7, 0x9d, 0x38, 0x54, 0x3f, 0x4a, 0xb5, 0x76, - 0x68, 0xaa, 0xa6, 0x8a, 0x57, 0x57, 0x49, 0x13, 0xf3, 0x6d, 0xb5, 0xbe, - 0xf6, 0x23, 0x74, 0x36, 0x38, 0x7c, 0x18, 0x83, 0x6f, 0xa5, 0xa4, 0xf2, - 0x57, 0xf6, 0x32, 0x2d, 0xdd, 0x76, 0x45, 0xb9, 0x72, 0xb8, 0xaf, 0x73, - 0x6c, 0x35, 0xe0, 0x19, 0x7e, 0x17, 0x05, 0x81, 0xe7, 0xa0, 0x16, 0xce, - 0xf8, 0x68, 0xd8, 0x56, 0xad, 0x52, 0x91, 0x4f, 0x54, 0xe3, 0x50, 0x9c, - 0x24, 0xbb, 0x93, 0x59, 0x59, 0x0a, 0xbf, 0xb6, 0xf7, 0x2e, 0xcd, 0x78, - 0x28, 0xa1, 0x23, 0x03, 0x4a, 0x01, 0x36, 0x67, 0x68, 0xe3, 0x4a, 0xba, - 0x13, 0x49, 0xef, 0xf6, 0x1a, 0x33, 0xe5, 0x42, 0x9a, 0x59, 0x93, 0xe1, - 0x86, 0x60, 0x39, 0x1f, 0x89, 0x18, 0x2f, 0x63, 0xee, 0x14, 0x1b, 0xe4, - 0x33, 0x89, 0x66, 0x25, 0x09, 0xde, 0xf3, 0xb3, 0x8a, 0x47, 0xab, 0x5d, - 0x0f, 0xa9, 0xd8, 0x62, 0xcb, 0x66, 0x64, 0xdd, 0x6e, 0x8f, 0x69, 0x1a, - 0xf1, 0x83, 0xe9, 0x66, 0x66, 0xb0, 0xd6, 0x55, 0x9d, 0x95, 0xc8, 0x8c, - 0xbb, 0xce, 0x78, 0x8c, 0xad, 0x72, 0x0c, 0x60, 0x24, 0x16, 0x3a, 0xa5, - 0x1a, 0xdc, 0xc5, 0xff, 0xe7, 0x2b, 0x4b, 0x69, 0x40, 0x28, 0xae, 0x43, - 0xbb, 0x21, 0x3f, 0x9f, 0x26, 0x05, 0x22, 0x26, 0xb5, 0xc9, 0xc0, 0xf9, - 0xdd, 0x2e, 0x9c, 0x1a, 0x26, 0x60, 0xcf, 0xff, 0x60, 0x7d, 0xf7, 0x83, - 0x56, 0x28, 0x67, 0x66, 0x07, 0xcd, 0x07, 0x36, 0xba, 0x72, 0x50, 0x23, - 0x93, 0x3c, 0xbd, 0x6d, 0x4a, 0xc0, 0xc6, 0xf4, 0xab, 0x51, 0x84, 0x03, - 0x26, 0x18, 0x7e, 0x99, 0xd8, 0xcb, 0x85, 0x7d, 0xa5, 0x19, 0x73, 0x90, - 0xd5, 0x86, 0xf9, 0x65, 0x12, 0xa1, 0xd0, 0x8c, 0xf7, 0x94, 0x0c, 0x1f, - 0xa5, 0x02, 0xe0, 0xbc, 0x53, 0x4b, 0x46, 0x63, 0xa8, 0x72, 0xf0, 0x24, - 0x65, 0x69, 0x13, 0xb6, 0x9f, 0x46, 0xf7, 0x26, 0x03, 0x5e, 0x83, 0x77, - 0x03, 0x32, 0x6c, 0x18, 0xc8, 0x0d, 0x96, 0x93, 0x59, 0x5f, 0xdb, 0x55, - 0x0f, 0xf2, 0x66, 0x6e, 0xf6, 0x2a, 0x3a, 0xba, 0x06, 0x64, 0x6f, 0x90, - 0x77, 0x8e, 0xda, 0xe1, 0x28, 0xb0, 0x02, 0xa5, 0x39, 0xfb, 0xa0, 0x19, - 0xee, 0x40, 0x49, 0x23, 0x6c, 0x66, 0x49, 0x2d, 0x5c, 0xf7, 0x7f, 0x63, - 0x44, 0xb7, 0x9b, 0x56, 0xae, 0xc8, 0x49, 0xbf, 0xde, 0x1f, 0xe9, 0xfc, - 0x37, 0xea, 0x96, 0x53, 0x92, 0xfe, 0x7a, 0x67, 0x3e, 0x7d, 0x2d, 0xb6, - 0x4e, 0xc6, 0x02, 0x2f, 0x13, 0x79, 0x6c, 0x93, 0x93, 0xc0, 0xaf, 0xba, - 0x1f, 0xc3, 0xfa, 0xb4, 0xeb, 0x35, 0x92, 0xdd, 0x8c, 0xdc, 0x46, 0x06, - 0x51, 0x5d, 0xdf, 0x78, 0x3b, 0xa2, 0x0e, 0x0f, 0xf7, 0x40, 0x6e, 0x90, - 0x60, 0xbf, 0x69, 0x80, 0x8c, 0xcf, 0x89, 0x23, 0x5a, 0xf0, 0xae, 0x14, - 0x63, 0x30, 0x70, 0xa8, 0x8a, 0x39, 0x6d, 0x51, 0x6e, 0x7c, 0x50, 0x2f, - 0xec, 0xb7, 0x94, 0x04, 0xdf, 0xfd, 0x56, 0x73, 0xb9, 0x71, 0x3e, 0xdd, - 0x5a, 0x99, 0x30, 0x9e, 0x67, 0x81, 0x7a, 0xd0, 0x2f, 0xd2, 0x9e, 0xbf, - 0x8c, 0x0a, 0x05, 0x05, 0x78, 0x99, 0x87, 0x36, 0xb0, 0xbe, 0xd1, 0x7a, - 0x56, 0x10, 0x9f, 0xf3, 0x5b, 0x7a, 0x0c, 0xcb, 0x43, 0xe6, 0x43, 0x75, - 0xa1, 0x7a, 0x54, 0x28, 0xd6, 0x54, 0x43, 0xaf, 0x52, 0x2f, 0xb5, 0xdf, - 0x9f, 0xcd, 0x37, 0xb9, 0xc0, 0xec, 0x00, 0xda, 0xb5, 0x9f, 0x39, 0x84, - 0x8c, 0x57, 0x59, 0x09, 0xe7, 0x1a, 0x21, 0xeb, 0xad, 0xde, 0x77, 0xe0, - 0xbf, 0x76, 0x57, 0x14, 0x12, 0xc6, 0x42, 0x1a, 0x29, 0x23, 0x57, 0x0c, - 0x03, 0x71, 0xef, 0xf0, 0x77, 0xc4, 0xb2, 0x42, 0x92, 0x12, 0xda, 0x6f, - 0x05, 0x96, 0xca, 0x1c, 0x2c, 0xa3, 0xdc, 0x9c, 0x92, 0x75, 0x44, 0xa0, - 0xbc, 0x6e, 0x19, 0x1f, 0x7d, 0x70, 0xb2, 0x0d, 0x12, 0x56, 0x64, 0xa9, - 0xa1, 0x2f, 0x7e, 0x39, 0x78, 0xf2, 0xec, 0x15, 0x41, 0x18, 0x03, 0x36, - 0x00, 0x3d, 0x61, 0xa6, 0x18, 0x69, 0x1e, 0x84, 0x60, 0x27, 0x45, 0x5b, - 0xe5, 0x2e, 0x56, 0xe6, 0x1a, 0x1c, 0x55, 0x2d, 0xf7, 0x09, 0xa1, 0x31, - 0xf7, 0x25, 0xe0, 0x4f, 0xfd, 0xaa, 0xad, 0xfe, 0xf2, 0x54, 0xc1, 0xd0, - 0x5c, 0xbc, 0xe7, 0x8a, 0x91, 0x6e, 0x9a, 0xd5, 0x85, 0x43, 0x72, 0x82, - 0x79, 0x28, 0x42, 0x35, 0x11, 0x69, 0xf5, 0x65, 0xc1, 0x61, 0xa1, 0x00, - 0x75, 0x87, 0x01, 0x17, 0x8a, 0xba, 0xa1, 0x9d, 0x97, 0x51, 0x9c, 0xdf, - 0x1d, 0xe9, 0xe2, 0x87, 0x22, 0xc7, 0x78, 0x4f, 0x6c, 0xd6, 0x75, 0xeb, - 0x0a, 0x21, 0xee, 0x40, 0x85, 0x5c, 0x60, 0x63, 0x4c, 0x54, 0x0c, 0x9b, - 0x36, 0x99, 0x22, 0xe2, 0x21, 0xb3, 0x88, 0x9d, 0x0d, 0xde, 0x4f, 0x5d, - 0x74, 0x03, 0x66, 0x99, 0x76, 0x9b, 0x87, 0x04, 0x47, 0xaa, 0x24, 0xcc, - 0x83, 0x48, 0x32, 0x17, 0x10, 0x92, 0x83, 0xf9, 0xed, 0xd3, 0xe9, 0xc4, - 0x65, 0xb4, 0xe6, 0x57, 0x1e, 0x9f, 0x69, 0x0f, 0x63, 0x76, 0x86, 0x76, - 0x70, 0xae, 0xb8, 0xd3, 0xbe, 0x94, 0x7d, 0x81, 0x2a, 0xde, 0x15, 0x88, - 0xc2, 0x15, 0xcd, 0x7f, 0xfc, 0x47, 0xd4, 0xe3, 0xfc, 0x2e, 0xa3, 0xac, - 0x62, 0x65, 0xea, 0xd8, 0xef, 0x03, 0x0e, 0xda, 0x89, 0x8c, 0xa2, 0xc3, - 0x49, 0x3e, 0xac, 0x17, 0x5f, 0xea, 0x3d, 0x6e, 0x36, 0x0c, 0x00, 0x09, - 0x2a, 0x65, 0x7d, 0x14, 0x37, 0x3f, 0x5c, 0x74, 0x14, 0x36, 0x28, 0x55, - 0x9f, 0xfc, 0xe2, 0x45, 0xb1, 0x47, 0x87, 0x88, 0x0e, 0x5b, 0xad, 0xe8, - 0x42, 0xbf, 0xd6, 0xc0, 0xbd, 0x7d, 0x1d, 0x93, 0xd1, 0x48, 0x78, 0x09, - 0xe7, 0x49, 0xaf, 0xa0, 0x5f, 0x93, 0x9b, 0xa6, 0xad, 0xa1, 0x1e, 0xf8, - 0xc5, 0x2d, 0x43, 0xb0, 0x1d, 0x71, 0xbf, 0x6b, 0xe4, 0xae, 0xe9, 0x15, - 0x34, 0x22, 0x61, 0xf5, 0x34, 0xa7, 0x7e, 0x54, 0xf1, 0x0e, 0x63, 0x1f, - 0x38, 0x93, 0xd1, 0x3d, 0x1d, 0x2c, 0xc4, 0xc0, 0x28, 0x4a, 0x8e, 0x0b, - 0x3d, 0x40, 0x8f, 0xd3, 0xf5, 0x13, 0x13, 0x6e, 0xb4, 0x5c, 0xe7, 0x38, - 0xd8, 0x60, 0xb3, 0xc1, 0xaa, 0x99, 0x0a, 0x28, 0xc9, 0x3a, 0x44, 0x64, - 0x5e, 0x6a, 0x70, 0x53, 0xd6, 0x0b, 0x71, 0x26, 0x4d, 0x0e, 0x54, 0xa2, - 0x16, 0x9f, 0x1f, 0x4a, 0x84, 0xd1, 0x53, 0xc5, 0xa0, 0xc6, 0xd1, 0x82, - 0x07, 0x8a, 0x2b, 0x32, 0x90, 0x79, 0xa3, 0xd5, 0x58, 0x75, 0x56, 0x82, - 0x10, 0x87, 0x7f, 0x36, 0xa9, 0x61, 0xde, 0xe0, 0xff, 0xcb, 0x07, 0x58, - 0x3f, 0xf1, 0x43, 0xf0, 0xc9, 0xb2, 0xb6, 0xb7, 0xfe, 0x4f, 0xae, 0x93, - 0xed, 0x44, 0xc8, 0x46, 0xa7, 0x2a, 0x0e, 0x3b, 0xc9, 0x2f, 0x61, 0x70, - 0x78, 0x73, 0xde, 0xcb, 0x7c, 0xfd, 0xbf, 0xf3, 0xc5, 0x5f, 0xe8, 0x5b, - 0xb2, 0x54, 0x9d, 0x53, 0x1f, 0x20, 0xc3, 0x2e, 0x55, 0x87, 0x3b, 0x60, - 0x7e, 0x31, 0xb1, 0x43, 0xdd, 0x86, 0x96, 0x67, 0x38, 0x46, 0x10, 0xf5, - 0x29, 0x7a, 0xb2, 0x70, 0x99, 0xf6, 0xaa, 0xd3, 0x45, 0xb8, 0x38, 0xba, - 0xd7, 0x2a, 0xdd, 0xd4, 0xbd, 0x0d, 0x8a, 0xc0, 0xb2, 0xb3, 0x2f, 0xf8, - 0xa7, 0x6d, 0x55, 0x92, 0xc1, 0x14, 0x80, 0xbf, 0xca, 0x22, 0x3f, 0xfe, - 0xf7, 0x8a, 0xa4, 0xb9, 0xb0, 0x18, 0x9d, 0x2a, 0x80, 0x14, 0xa0, 0x1e, - 0x2b, 0xa3, 0xb5, 0xa8, 0xff, 0x5e, 0xc2, 0xf1, 0x11, 0xb9, 0x2b, 0x0c, - 0x0f, 0xe5, 0x88, 0xda, 0x80, 0x8a, 0x44, 0xc3, 0xc1, 0x03, 0xc8, 0x0f, - 0x76, 0x51, 0x90, 0x0c, 0x89, 0x09, 0x70, 0x64, 0x4d, 0x46, 0xf0, 0xb7, - 0x82, 0x27, 0x60, 0x94, 0x6b, 0x58, 0x78, 0x23, 0x8b, 0xf2, 0xfa, 0xe4, - 0x1e, 0x93, 0x44, 0x1d, 0xfd, 0x95, 0xc8, 0xce, 0x78, 0x3b, 0xf4, 0xd3, - 0x38, 0x8a, 0x35, 0x90, 0x89, 0xaf, 0x23, 0x0f, 0x1b, 0x54, 0x99, 0x5a, - 0x3b, 0x4e, 0xc3, 0x5f, 0xc6, 0xc3, 0xb2, 0x97, 0x5b, 0x7a, 0x5f, 0x07, - 0x4c, 0xd1, 0x5c, 0x18, 0xd8, 0x43, 0xa1, 0xd5, 0x8b, 0x3d, 0xbc, 0x97, - 0x6f, 0xe5, 0xbc, 0xb8, 0x2a, 0x67, 0xc2, 0xaa, 0x2b, 0x0d, 0x1f, 0x9d, - 0xde, 0x39, 0xa9, 0x8d, 0xd4, 0xcc, 0xa4, 0x1a, 0xc6, 0xaa, 0x80, 0xf5, - 0x62, 0x22, 0xef, 0x49, 0xcc, 0x20, 0x9e, 0x44, 0xaa, 0x86, 0xb2, 0xcf, - 0x2d, 0x8f, 0x46, 0x15, 0xae, 0xb4, 0xc3, 0xba, 0x52, 0x53, 0x02, 0x63, - 0x1b, 0x47, 0xc8, 0xc2, 0x77, 0xbf, 0xd2, 0xb0, 0x21, 0xb6, 0xe5, 0x48, - 0xf8, 0x8c, 0x75, 0x75, 0xee, 0x82, 0x6a, 0xae, 0x65, 0xef, 0x9a, 0xcb, - 0xb1, 0xb1, 0x64, 0x44, 0xf3, 0x5a, 0xea, 0xdc, 0xba, 0x39, 0x37, 0x25, - 0x50, 0x08, 0x32, 0xbc, 0x61, 0x0b, 0x8a, 0x12, 0x28, 0x15, 0xbb, 0xfe, - 0xc3, 0x5a, 0xd5, 0x71, 0xaf, 0x0b, 0x95, 0xea, 0x3f, 0xa1, 0x09, 0x6d, - 0x02, 0x32, 0xf0, 0x29, 0xbe, 0x9f, 0xd6, 0xfc, 0x07, 0x7f, 0x34, 0xb2, - 0x78, 0xdc, 0x56, 0x3c, 0xf6, 0x31, 0x03, 0x72, 0x2a, 0xb6, 0xb1, 0x4b, - 0x05, 0x0b, 0x57, 0x86, 0x0c, 0x35, 0x9d, 0x3c, 0xca, 0x89, 0xe0, 0x55, - 0xfc, 0xfa, 0x14, 0xb4, 0xd6, 0xf8, 0x34, 0xd9, 0xa9, 0xcf, 0x4b, 0x35, - 0x5d, 0xc1, 0x05, 0x53, 0x0f, 0x9c, 0x0b, 0x10, 0xcd, 0xd4, 0x67, 0x28, - 0xa4, 0x58, 0x00, 0x9d, 0x18, 0xdb, 0x64, 0x2b, 0x6a, 0x24, 0xa3, 0xbb, - 0x90, 0x1c, 0x96, 0xda, 0x77, 0xa8, 0x4a, 0x02, 0xd5, 0x44, 0xf8, 0x58, - 0x48, 0x77, 0xec, 0x9d, 0x34, 0xdf, 0x9e, 0xb7, 0xe4, 0xc7, 0x77, 0x1e, - 0x06, 0x31, 0xdf, 0xcd, 0xdc, 0xc3, 0x6c, 0x53, 0xfe, 0x92, 0x87, 0xfe, - 0x28, 0xc8, 0x97, 0x59, 0x42, 0x42, 0xf0, 0xfd, 0x28, 0x3f, 0x24, 0x7a, - 0x09, 0x24, 0xcc, 0xb8, 0x18, 0x28, 0xa9, 0x6d, 0xa8, 0x87, 0x0f, 0x4d, - 0xf8, 0xb2, 0x92, 0x00, 0xd2, 0x0f, 0x51, 0x31, 0x75, 0xc7, 0x4e, 0x75, - 0x72, 0xb2, 0xe3, 0x2a, 0x49, 0xc7, 0x12, 0x9b, 0xb7, 0xa6, 0xd1, 0x05, - 0x0a, 0x02, 0xdf, 0x7c, 0xf0, 0x4a, 0x20, 0xce, 0x1e, 0x79, 0xae, 0x23, - 0x54, 0xb8, 0xd3, 0x8a, 0xb9, 0x9e, 0x25, 0x81, 0x4f, 0x0c, 0x6f, 0x49, - 0x95, 0xb0, 0x72, 0x5e, 0x37, 0x82, 0x79, 0x04, 0xa0, 0x47, 0x16, 0x7e, - 0x37, 0x16, 0x70, 0xf0, 0xdb, 0xe4, 0x67, 0xcd, 0xed, 0x63, 0x94, 0xe8, - 0x17, 0x20, 0x25, 0xa6, 0xd7, 0xb5, 0x09, 0x92, 0x31, 0xb6, 0x48, 0x0f, - 0x57, 0xef, 0xba, 0xe5, 0x0d, 0x31, 0x4b, 0xf7, 0x7c, 0x86, 0xbf, 0x43, - 0x83, 0xe7, 0xc2, 0xe9, 0xf5, 0xbb, 0x8e, 0xcb, 0xc7, 0xb5, 0x5d, 0xc7, - 0x7c, 0x7b, 0xa8, 0xfc, 0x92, 0x89, 0xcf, 0x5a, 0x85, 0xff, 0x0d, 0xaa, - 0x0a, 0xd8, 0x27, 0xd9, 0xbe, 0x9e, 0x4a, 0xc1, 0x55, 0xe9, 0x49, 0x19, - 0xa2, 0x65, 0xcc, 0xe6, 0x84, 0x0e, 0x0a, 0xe1, 0x70, 0x38, 0x3a, 0x7f, - 0x4f, 0xb5, 0x18, 0xc4, 0x41, 0x5a, 0x51, 0xbd, 0x14, 0xa4, 0xf8, 0xa5, - 0xc5, 0x84, 0xeb, 0x71, 0xce, 0x4c, 0x21, 0x5a, 0x03, 0x88, 0xf0, 0x4e, - 0xc3, 0x36, 0x30, 0x71, 0xf2, 0x33, 0x1e, 0x13, 0x92, 0x57, 0x54, 0x99, - 0xb0, 0xd7, 0xd7, 0x3d, 0x30, 0x90, 0xad, 0xae, 0x40, 0x21, 0xcb, 0xa1, - 0xd5, 0x58, 0x81, 0x36, 0xb9, 0x41, 0xd8, 0xd7, 0x39, 0xd9, 0xa9, 0x4c, - 0xf4, 0x91, 0x8b, 0x50, 0xcf, 0x85, 0x85, 0x54, 0x6b, 0x4c, 0xa1, 0xad, - 0x20, 0x69, 0x47, 0x51, 0xf1, 0xd3, 0x4f, 0xb2, 0xb4, 0xb1, 0x4c, 0xe4, - 0x63, 0x83, 0xd9, 0x70, 0x52, 0x25, 0xee, 0xcc, 0x51, 0xf8, 0x52, 0xd3, - 0xd5, 0x09, 0xa8, 0x5b, 0x2b, 0xad, 0x0a, 0xf3, 0x15, 0x7b, 0xed, 0xcd, - 0x74, 0x3f, 0xa2, 0x83, 0x03, 0x8c, 0x7f, 0xc8, 0x53, 0x5e, 0x6a, 0xd8, - 0x76, 0x20, 0x4e, 0xb1, 0x47, 0x2e, 0x4e, 0xc8, 0x21, 0xdd, 0xa0, 0xf5, - 0x15, 0x72, 0xc8, 0x8e, 0xbd, 0x3a, 0x7a, 0x14, 0x6d, 0xac, 0xd7, 0x0c, - 0x9f, 0x5c, 0x3c, 0xc8, 0x23, 0xe1, 0x60, 0xce, 0x0f, 0x61, 0x1e, 0x74, - 0x79, 0x79, 0x94, 0xa9, 0xf7, 0x73, 0x1c, 0xd3, 0x9d, 0x77, 0x96, 0xea, - 0x51, 0x28, 0xb3, 0xce, 0xd7, 0xcf, 0xfa, 0xca, 0x4a, 0xdc, 0x1a, 0xc5, - 0x83, 0xd0, 0xc2, 0x31, 0xe7, 0x85, 0x6d, 0x7e, 0xcd, 0x0c, 0x2e, 0xde, - 0xa2, 0x3a, 0xdb, 0x75, 0xfd, 0x3b, 0x6c, 0x53, 0x22, 0x8b, 0x63, 0x19, - 0x69, 0x3e, 0xf6, 0x3a, 0xf9, 0xc3, 0xba, 0x24, 0xd2, 0xab, 0x1a, 0xc0, - 0xf9, 0x36, 0x1c, 0xc1, 0xe8, 0x96, 0x21, 0x98, 0xfe, 0x80, 0x51, 0x87, - 0x30, 0x15, 0xaa, 0xca, 0x24, 0x40, 0x30, 0xdf, 0xef, 0x46, 0xcd, 0x5d, - 0x85, 0x84, 0xd7, 0xd9, 0x55, 0x03, 0x9a, 0xcc, 0x8e, 0x5c, 0x8b, 0x09, - 0xea, 0x6d, 0x3d, 0xb5, 0xe6, 0x74, 0xd4, 0x24, 0x31, 0x39, 0x57, 0xa1, - 0x56, 0x19, 0x99, 0x1e, 0x29, 0x7d, 0xd7, 0x98, 0x31, 0xfa, 0x2d, 0x30, - 0xaa, 0x3b, 0x96, 0x57, 0x2a, 0x75, 0xb8, 0x3c, 0xa4, 0x25, 0x20, 0xa2, - 0x95, 0x78, 0x52, 0xc7, 0x1c, 0xcb, 0x3f, 0x30, 0x84, 0xdd, 0x82, 0x70, - 0xdc, 0xbd, 0xff, 0xe4, 0x13, 0xbd, 0x68, 0xac, 0x57, 0x44, 0x45, 0xbe, - 0x34, 0x76, 0x11, 0x96, 0xcc, 0x64, 0x5e, 0x4a, 0xff, 0x21, 0x81, 0xcb, - 0x55, 0x01, 0x20, 0x04, 0x4f, 0x8b, 0x31, 0xee, 0xfc, 0x88, 0x44, 0x2c, - 0xe8, 0x18, 0xfe, 0x2d, 0x5e, 0x37, 0x95, 0x65, 0xbe, 0x37, 0xb2, 0x1f, - 0xfa, 0x0e, 0x79, 0x26, 0x30, 0x26, 0xf3, 0x12, 0xe0, 0x59, 0xfa, 0x7b, - 0xd8, 0x6e, 0x3f, 0xad, 0x76, 0x56, 0x73, 0x83, 0x7b, 0x29, 0x0e, 0xab, - 0x41, 0x99, 0x67, 0xe7, 0xdc, 0x06, 0xa9, 0x74, 0x62, 0xf3, 0x02, 0x32, - 0xaa, 0x97, 0xf4, 0xed, 0xbe, 0x97, 0x72, 0x4f, 0x1c, 0xc0, 0x7b, 0x86, - 0x76, 0x84, 0xe9, 0x21, 0xe1, 0xfd, 0x84, 0xbb, 0x36, 0x91, 0xa0, 0xa7, - 0x31, 0x36, 0xb8, 0x3e, 0x13, 0x21, 0x74, 0xd8, 0xd4, 0xdc, 0xae, 0x34, - 0x97, 0x93, 0x4c, 0x00, 0x6e, 0xee, 0x47, 0xb7, 0x27, 0xea, 0x43, 0x02, - 0x2e, 0xd7, 0xaa, 0x81, 0xfb, 0x46, 0x05, 0xbb, 0xcc, 0xfd, 0xa2, 0x59, - 0x24, 0x59, 0xe8, 0xac, 0x15, 0xda, 0x3c, 0x5b, 0x94, 0xf9, 0x05, 0xd0, - 0x88, 0x0f, 0x9e, 0xde, 0xf5, 0xff, 0x19, 0x6a, 0x6a, 0xce, 0x70, 0xdd, - 0xac, 0x19, 0x21, 0x64, 0xb6, 0x1a, 0x15, 0x36, 0x15, 0x33, 0x03, 0xdb, - 0x37, 0xa5, 0x47, 0x71, 0x77, 0xed, 0x8e, 0x7b, 0xa7, 0xd7, 0x9e, 0x90, - 0xd6, 0x5e, 0x68, 0xd8, 0x52, 0x3d, 0x93, 0x95, 0x70, 0x58, 0x95, 0x08, - 0xfa, 0x0f, 0x83, 0x9d, 0x7a, 0x3e, 0x7d, 0xa2, 0x13, 0xfa, 0x04, 0x42, - 0x06, 0xcb, 0x7f, 0x98, 0x71, 0xc1, 0xd3, 0x85, 0xf1, 0xf0, 0x84, 0x6b, - 0x00, 0x56, 0x45, 0x53, 0xee, 0xdf, 0x2a, 0x83, 0x4a, 0xbc, 0x7a, 0xc4, - 0x04, 0x37, 0x33, 0x1f, 0x97, 0x85, 0xd4, 0x7b, 0xb1, 0xb9, 0x02, 0x96, - 0x59, 0x63, 0x72, 0x1a, 0x56, 0x80, 0x52, 0x46, 0xf0, 0x64, 0x81, 0xcd, - 0xe2, 0x22, 0xe5, 0xd9, 0xe7, 0xbf, 0xa8, 0xa1, 0x73, 0xba, 0x29, 0x41, - 0xed, 0x02, 0x0b, 0xe6, 0x66, 0x4d, 0xf1, 0xd1, 0x9c, 0x8a, 0x31, 0xbb, - 0x79, 0x97, 0xcf, 0x2a, 0x04, 0x97, 0xcd, 0xe3, 0xcb, 0xf4, 0x16, 0x96, - 0x43, 0xc4, 0x6f, 0xbb, 0x37, 0xf6, 0x14, 0x34, 0x30, 0x06, 0xe0, 0xe4, - 0xc4, 0xdb, 0xc1, 0xee, 0xcb, 0x4d, 0x4c, 0xdb, 0x83, 0xdf, 0xde, 0xb5, - 0x85, 0x64, 0x8f, 0xac, 0x1a, 0x4e, 0xfb, 0x7a, 0x33, 0x79, 0xdb, 0x07, - 0xaa, 0x26, 0xcd, 0x13, 0x7d, 0xfa, 0xfd, 0xca, 0xae, 0x39, 0xb2, 0xf0, - 0x9f, 0xd3, 0xb2, 0x4c, 0xd7, 0xd9, 0xe4, 0x78, 0x96, 0xb4, 0xb8, 0x86, - 0xfe, 0xfb, 0xae, 0xee, 0x71, 0xac, 0x55, 0x90, 0xf2, 0x66, 0x60, 0x17, - 0x53, 0x2b, 0x09, 0x06, 0x28, 0x38, 0xdc, 0x62, 0xf6, 0x63, 0xe8, 0xc3, - 0xdb, 0xcb, 0xfd, 0x91, 0xef, 0x2c, 0xa0, 0xcf, 0xba, 0xbd, 0xdd, 0x9b, - 0x14, 0x30, 0x9a, 0x6a, 0x3d, 0xe6, 0xd5, 0x2d, 0xc9, 0x66, 0xbb, 0xd5, - 0xb3, 0x7e, 0x46, 0x83, 0x2f, 0x79, 0xef, 0xb9, 0xec, 0x02, 0x0f, 0x13, - 0x2d, 0x41, 0xe3, 0x54, 0x2d, 0x04, 0xc1, 0x8c, 0xed, 0x6c, 0x50, 0x0b, - 0x64, 0x41, 0x4d, 0x1e, 0x00, 0x02, 0x64, 0x81, 0x7d, 0x4e, 0xd6, 0x6f, - 0xe3, 0x31, 0xdf, 0x68, 0x4c, 0xdd, 0x1f, 0x27, 0x19, 0xfc, 0x01, 0x2b, - 0x31, 0xc4, 0xf1, 0x40, 0x86, 0x81, 0x5c, 0x91, 0x87, 0x51, 0xcc, 0x27, - 0xee, 0xc6, 0xca, 0x4d, 0x67, 0x2d, 0xca, 0xa5, 0x18, 0xd0, 0x9d, 0x97, - 0xf9, 0x34, 0x3c, 0x8e, 0xe4, 0x51, 0xab, 0xa1, 0x8b, 0x7d, 0xa8, 0xfe, - 0xea, 0xc9, 0x31, 0xa1, 0x5a, 0x19, 0x67, 0x55, 0x84, 0xc7, 0xab, 0xac, - 0x34, 0x45, 0x5b, 0x65, 0xb1, 0x8e, 0x20, 0xdc, 0x96, 0xc6, 0x11, 0xc2, - 0x95, 0x89, 0x5a, 0xeb, 0xc5, 0x6b, 0x3e, 0xf3, 0x06, 0xc0, 0x0c, 0x95, - 0x4d, 0xd4, 0x17, 0x4e, 0x0f, 0x7c, 0xd0, 0x38, 0xaf, 0xe8, 0x80, 0xe7, - 0xbb, 0x68, 0x7c, 0x5d, 0x4b, 0x8f, 0x98, 0x45, 0xe2, 0x1a, 0x33, 0x29, - 0xd2, 0x2b, 0xeb, 0xa1, 0x05, 0xa8, 0xca, 0x5f, 0x43, 0x16, 0x84, 0xf5, - 0xbe, 0x29, 0x2a, 0x22, 0x86, 0x7e, 0x50, 0xf5, 0xe9, 0xca, 0x8c, 0x0c, - 0x5a, 0xc9, 0x52, 0xc6, 0x27, 0x20, 0x0f, 0xee, 0xc4, 0xba, 0xa7, 0x63, - 0x55, 0x41, 0xda, 0x2a, 0x83, 0x1e, 0x8f, 0xe5, 0xe8, 0xca, 0x74, 0x9e, - 0x38, 0x8c, 0xb6, 0x70, 0x3e, 0xf2, 0xa1, 0x6d, 0x43, 0xb9, 0xb7, 0x4b, - 0x7e, 0x39, 0x76, 0x78, 0x1c, 0x32, 0x7b, 0xf4, 0xa0, 0x7f, 0x7d, 0xca, - 0x6f, 0xf8, 0x8e, 0xb7, 0xc7, 0x16, 0xb4, 0x83, 0xad, 0x0c, 0x35, 0xc7, - 0x3a, 0x5f, 0xdf, 0x71, 0x2f, 0xc8, 0xa8, 0x08, 0xfb, 0x64, 0x44, 0x94, - 0x6e, 0xca, 0x19, 0x5c, 0x88, 0xc5, 0x20, 0x0f, 0x31, 0x5d, 0x58, 0xf1, - 0x19, 0x4a, 0xcc, 0x9c, 0xf0, 0x52, 0x58, 0x7d, 0x4e, 0xdd, 0x52, 0x6a, - 0x5a, 0x17, 0xb9, 0xf3, 0x3c, 0xcb, 0x88, 0x4a, 0x44, 0xef, 0x3b, 0xce, - 0x9f, 0x0e, 0x75, 0x74, 0x76, 0xd1, 0xea, 0x39, 0xa2, 0x4c, 0xca, 0x56, - 0xc0, 0x7b, 0xa0, 0xad, 0x50, 0xe3, 0xb7, 0xc9, 0x38, 0x76, 0x85, 0x8a, - 0x79, 0x10, 0x38, 0x25, 0xf3, 0x4b, 0xe6, 0x8c, 0x29, 0x71, 0x2d, 0x62, - 0xec, 0x25, 0x59, 0xe6, 0xe4, 0xae, 0xd7, 0xd2, 0x9d, 0x5c, 0x82, 0x43, - 0x3d, 0x92, 0xc3, 0x1e, 0x1b, 0x7c, 0x01, 0xb2, 0x0f, 0xd2, 0x8b, 0x6c, - 0x77, 0xcc, 0xef, 0x20, 0xeb, 0x97, 0x40, 0xd4, 0xf0, 0x47, 0x95, 0x99, - 0x9c, 0x79, 0x67, 0x50, 0xdb, 0x8d, 0x98, 0xc4, 0x8f, 0x8b, 0x00, 0x5b, - 0x4f, 0x7b, 0x29, 0xfd, 0xc3, 0xa8, 0x52, 0xaa, 0xd2, 0xb9, 0x3d, 0xb6, - 0xd9, 0x5b, 0xe2, 0xe6, 0x86, 0x1f, 0x73, 0x6a, 0x92, 0x93, 0x49, 0x45, - 0x7c, 0xd8, 0xb9, 0xa1, 0x4d, 0x58, 0xb1, 0x90, 0x90, 0x36, 0x9d, 0xb1, - 0x25, 0x80, 0x45, 0x5c, 0xc0, 0x91, 0x59, 0xdd, 0x13, 0x22, 0xd2, 0xca, - 0xf3, 0xf9, 0x02, 0x87, 0x7f, 0x76, 0xba, 0x1e, 0x73, 0xe1, 0xfa, 0xcb, - 0x8c, 0x95, 0xf6, 0x21, 0xb2, 0x04, 0x86, 0x7c, 0x5f, 0xe6, 0x88, 0x7c, - 0x19, 0x37, 0x1c, 0xe0, 0x8e, 0xe0, 0x53, 0x83, 0x0b, 0x51, 0x21, 0x79, - 0x73, 0x08, 0x0c, 0x1d, 0xb2, 0x53, 0x1b, 0x11, 0xeb, 0xd1, 0xdd, 0x9e, - 0x65, 0x0e, 0x55, 0xdd, 0xbc, 0x52, 0x9f, 0x50, 0xbb, 0xa8, 0xf3, 0x64, - 0xf2, 0x76, 0x09, 0x9d, 0x27, 0x82, 0xf7, 0xa4, 0xfc, 0x06, 0x04, 0xcb, - 0x3e, 0xa5, 0x01, 0xe7, 0xe6, 0x9e, 0x38, 0x10, 0xbb, 0x24, 0x5d, 0xc6, - 0x05, 0xcc, 0xbf, 0x3b, 0xcb, 0x31, 0x6e, 0x43, 0x5d, 0x0b, 0xd9, 0x45, - 0x53, 0xdb, 0x14, 0x0f, 0x57, 0x42, 0xe1, 0xc6, 0xa5, 0xe6, 0xc4, 0x3c, - 0x02, 0x55, 0x39, 0x76, 0xb1, 0x02, 0xe8, 0x37, 0xdb, 0xa0, 0x5f, 0xc4, - 0x2b, 0x3b, 0x88, 0xfa, 0x62, 0x9c, 0xd9, 0xc5, 0x88, 0x15, 0x34, 0xab, - 0xf5, 0x23, 0x91, 0x21, 0xd1, 0x9d, 0xce, 0x60, 0xa8, 0x65, 0x4e, 0x8f, - 0x1c, 0x5f, 0xea, 0x7c, 0xfe, 0x20, 0xaa, 0xf1, 0x3a, 0x7b, 0x97, 0xc6, - 0x90, 0x93, 0x03, 0x99, 0xd3, 0x01, 0x05, 0x0d, 0x57, 0x99, 0x27, 0xbf, - 0x9b, 0xae, 0x3b, 0x95, 0xe7, 0x6e, 0x49, 0xb9, 0xe7, 0x90, 0x16, 0x65, - 0x21, 0x7b, 0x13, 0xc6, 0xd1, 0xfb, 0x86, 0xeb, 0x6e, 0x4c, 0x6f, 0x6b, - 0x91, 0x97, 0x8f, 0xa4, 0xc6, 0x4c, 0xef, 0xc1, 0x54, 0x95, 0xc6, 0x1e, - 0x62, 0x71, 0x21, 0x35, 0xf2, 0x4d, 0x9d, 0x83, 0x6c, 0xb7, 0x90, 0x19, - 0x83, 0x9f, 0x27, 0x7b, 0x54, 0x4e, 0x46, 0xdf, 0x89, 0xb4, 0xf2, 0xfe, - 0x0e, 0x3f, 0xb8, 0x5d, 0x99, 0x93, 0x92, 0x29, 0xd3, 0x3e, 0x1a, 0x30, - 0x7b, 0x5c, 0x07, 0x36, 0x37, 0x0e, 0x24, 0xd5, 0x7b, 0x9a, 0xc9, 0xeb, - 0xdf, 0x7d, 0xca, 0xd5, 0xdf, 0xb9, 0xb5, 0x8b, 0xf7, 0x4b, 0x43, 0x4d, - 0xc3, 0xf3, 0x60, 0x4e, 0x62, 0x00, 0xe6, 0x65, 0xbf, 0x34, 0xdc, 0xe4, - 0x57, 0xde, 0x3a, 0xa9, 0xc2, 0xed, 0x10, 0x6d, 0xfe, 0xa7, 0x0f, 0x07, - 0x49, 0xe6, 0xaa, 0x9d, 0x92, 0xf7, 0xf4, 0xcc, 0x68, 0xc7, 0x3d, 0x45, - 0xe4, 0x6a, 0x09, 0x87, 0x9d, 0xd4, 0x7e, 0xfa, 0x8d, 0xc6, 0x8d, 0xb8, - 0xc8, 0x71, 0xbf, 0x00, 0xab, 0x79, 0x26, 0xaa, 0x0c, 0x48, 0xe9, 0x5e, - 0x63, 0x52, 0x4f, 0x53, 0x19, 0x46, 0xa9, 0x42, 0xaa, 0xa3, 0x28, 0xf6, - 0xe5, 0xc7, 0xb7, 0x9c, 0x14, 0x6e, 0x3d, 0x03, 0x8d, 0x8f, 0x0c, 0x28, - 0x46, 0x8d, 0xbc, 0x2e, 0xfe, 0xfc, 0x8c, 0xff, 0xaf, 0xae, 0xdf, 0x4f, - 0xc2, 0xc1, 0xdb, 0x45, 0xa6, 0xf3, 0xe8, 0x2b, 0x2b, 0xf1, 0xae, 0x34, - 0x84, 0x66, 0xbf, 0xaa, 0x17, 0x17, 0x22, 0x8a, 0xc9, 0x41, 0x5a, 0x83, - 0x81, 0x11, 0xb9, 0xb5, 0x32, 0xfc, 0xdd, 0x02, 0xbc, 0x25, 0x93, 0x9e, - 0x80, 0x11, 0x1f, 0xc2, 0xc3, 0x4e, 0x7e, 0xb5, 0x1d, 0x23, 0x19, 0x29, - 0xae, 0x40, 0x0d, 0x6b, 0xed, 0x4f, 0x34, 0x49, 0x81, 0x26, 0xd4, 0xdb, - 0x8f, 0x95, 0xfb, 0xd2, 0xe1, 0xe0, 0x29, 0xd0, 0x60, 0xac, 0xb5, 0x66, - 0x2a, 0x8f, 0x9d, 0x9f, 0xe2, 0x8f, 0x6e, 0x47, 0x40, 0xb8, 0x73, 0xe8, - 0x5a, 0x58, 0x20, 0x37, 0x6b, 0x6a, 0xdf, 0xc0, 0x97, 0x36, 0x13, 0xcf, - 0x2c, 0x7d, 0x1f, 0x78, 0x0b, 0x12, 0x67, 0x59, 0xcf, 0x92, 0x99, 0xf3, - 0x4f, 0x87, 0x09, 0x68, 0xcb, 0xec, 0xa3, 0x8b, 0x29, 0x9f, 0x03, 0x18, - 0x45, 0x4e, 0x25, 0xff, 0x42, 0x6c, 0x9e, 0xcc, 0x94, 0x7e, 0x28, 0x79, - 0x43, 0x9d, 0xbb, 0x14, 0x35, 0x47, 0x09, 0xc7, 0x66, 0xd0, 0x9c, 0xfa, - 0x23, 0xa5, 0x36, 0x58, 0x7d, 0x9e, 0xec, 0xa9, 0xd0, 0x25, 0x25, 0x2e, - 0x52, 0xd9, 0x4b, 0xf4, 0xd6, 0xaf, 0x0f, 0xf2, 0xf5, 0xef, 0xd2, 0x91, - 0x85, 0x93, 0x1d, 0x4e, 0x37, 0x9e, 0x88, 0x16, 0x40, 0x43, 0xda, 0x77, - 0x4f, 0x19, 0x62, 0xfc, 0x26, 0x5f, 0xdb, 0xf8, 0x61, 0x0e, 0x7d, 0x47, - 0x08, 0x36, 0x11, 0x95, 0x35, 0xab, 0x2b, 0xa8, 0x52, 0xb7, 0x41, 0xe6, - 0x01, 0x54, 0xb8, 0xbe, 0x3d, 0x7b, 0x29, 0x50, 0x53, 0x7e, 0xf9, 0x0b, - 0xd1, 0x1a, 0x1c, 0xd0, 0x09, 0x27, 0x93, 0x37, 0xc8, 0x71, 0xc4, 0x72, - 0x52, 0xd3, 0x78, 0xbd, 0xde, 0xa7, 0x43, 0xe6, 0xb6, 0xbb, 0x15, 0x01, - 0x60, 0x1a, 0x2a, 0x0f, 0x57, 0x75, 0x6f, 0x6c, 0xc1, 0x64, 0xb0, 0x98, - 0xca, 0xfb, 0x76, 0x9b, 0x79, 0x66, 0x39, 0x87, 0x25, 0xf7, 0x14, 0xae, - 0x5f, 0xf5, 0x35, 0x18, 0x76, 0xf9, 0xb1, 0xaf, 0x12, 0x10, 0x75, 0x65, - 0xc2, 0x83, 0x37, 0x4d, 0x13, 0xbc, 0xc0, 0xad, 0x0b, 0x00, 0xf4, 0x2f, - 0xeb, 0xef, 0xa7, 0xd5, 0xbd, 0x79, 0x10, 0x98, 0x74, 0x86, 0x93, 0x6c, - 0x8c, 0xe2, 0x2e, 0x41, 0xa9, 0xc7, 0x2b, 0x21, 0xf1, 0xf9, 0xd7, 0xfe, - 0xf9, 0xc1, 0xb6, 0x55, 0x74, 0xb8, 0xbe, 0x24, 0x96, 0x32, 0xb6, 0x3f, - 0xca, 0x3e, 0xee, 0x73, 0x46, 0xfd, 0x8a, 0x6b, 0x05, 0x2c, 0xca, 0xea, - 0x95, 0x6e, 0x0d, 0x2b, 0xe3, 0xff, 0x8c, 0xaa, 0xf9, 0x4b, 0x02, 0xcb, - 0x36, 0x47, 0x31, 0x66, 0x5b, 0x2b, 0x49, 0x1c, 0x24, 0xa2, 0xc8, 0xf2, - 0x1f, 0x67, 0x4b, 0x6c, 0x9d, 0x31, 0x07, 0x23, 0x63, 0x21, 0xdf, 0x52, - 0x26, 0x03, 0x6a, 0x42, 0x40, 0x4a, 0x82, 0xc6, 0xee, 0xa4, 0x46, 0xc7, - 0xb5, 0xc7, 0xad, 0xd5, 0x81, 0xbe, 0x2a, 0x53, 0xd5, 0x9e, 0x99, 0x98, - 0xe8, 0xb7, 0x2e, 0x3f, 0xa4, 0x57, 0x46, 0x84, 0x82, 0x40, 0x2d, 0x25, - 0x29, 0x92, 0xa6, 0x5a, 0xc6, 0x45, 0xf9, 0x87, 0xbc, 0xa4, 0xd1, 0xdb, - 0x37, 0x48, 0x41, 0x83, 0xa5, 0xad, 0xc9, 0x67, 0x67, 0x45, 0x10, 0x5e, - 0x1c, 0x16, 0x49, 0x2f, 0x81, 0x99, 0xbd, 0x7b, 0x67, 0x1e, 0xb5, 0xa5, - 0xc0, 0xf1, 0x5c, 0x98, 0x50, 0xf3, 0x79, 0x48, 0x23, 0xf0, 0x0d, 0x5e, - 0x53, 0xf7, 0xcb, 0x13, 0xc5, 0x58, 0x17, 0x6f, 0x88, 0x7b, 0xa7, 0x60, - 0x8e, 0x3a, 0x33, 0xaa, 0x38, 0xcf, 0xe9, 0xe1, 0x6b, 0x2a, 0x02, 0xd9, - 0xeb, 0x74, 0x79, 0x81, 0x12, 0xa6, 0x52, 0x9c, 0x98, 0x52, 0x67, 0xe8, - 0x67, 0x94, 0xae, 0x2b, 0x9e, 0x01, 0x27, 0x90, 0x2d, 0x88, 0x9d, 0xc0, - 0x30, 0xb8, 0xa2, 0x83, 0x89, 0x86, 0x9f, 0x03, 0xa5, 0xad, 0x59, 0x6b, - 0x00, 0xb6, 0xc5, 0x22, 0x74, 0xab, 0x7f, 0x6c, 0xd3, 0x15, 0x6e, 0xe8, - 0x81, 0x4a, 0x66, 0x40, 0x0c, 0x1e, 0x13, 0xaf, 0x81, 0xd0, 0x3d, 0x3e, - 0x74, 0x39, 0xe0, 0x84, 0x52, 0x00, 0xf0, 0xf4, 0x52, 0xdf, 0x99, 0x4d, - 0x4b, 0x1c, 0x3d, 0xf3, 0x71, 0x64, 0xc6, 0x67, 0x9f, 0xec, 0xc6, 0xc5, - 0x29, 0x2c, 0x42, 0x92, 0xa2, 0xc6, 0x72, 0xf3, 0x52, 0x24, 0xc1, 0x89, - 0x4a, 0xaf, 0xbb, 0x1d, 0x6b, 0x9f, 0xc8, 0xc5, 0x31, 0xd2, 0x18, 0xef, - 0x50, 0xeb, 0xc2, 0xf8, 0x31, 0x81, 0x92, 0xd3, 0x32, 0xda, 0xab, 0x41, - 0x51, 0xc9, 0x85, 0xf8, 0x67, 0x90, 0x36, 0xc6, 0xf9, 0xdc, 0x3b, 0x82, - 0x05, 0x1a, 0x0e, 0x7b, 0xe4, 0xdc, 0xbd, 0x6e, 0x7b, 0x47, 0x8f, 0xf4, - 0x7c, 0xd8, 0xed, 0x39, 0x9f, 0x1b, 0x73, 0x49, 0xa6, 0x22, 0xaf, 0xc8, - 0x23, 0xf2, 0x3b, 0xcf, 0xda, 0xee, 0x1d, 0xa9, 0x29, 0xfc, 0x8b, 0xe6, - 0x43, 0xd7, 0xbf, 0x6d, 0xd3, 0x03, 0xee, 0x34, 0xf3, 0x28, 0x70, 0x1f, - 0x9f, 0x0a, 0x49, 0x62, 0xdc, 0x4f, 0xcb, 0x50, 0xce, 0x4f, 0x44, 0x33, - 0x7b, 0xff, 0x6f, 0x77, 0x75, 0xf9, 0x31, 0xb0, 0x14, 0xfc, 0xfe, 0x48, - 0x68, 0xb8, 0xa3, 0xe5, 0x22, 0xaf, 0xee, 0x65, 0x82, 0x0e, 0xb9, 0xb6, - 0xcf, 0x06, 0xdf, 0xab, 0xd9, 0xa4, 0x74, 0xcc, 0x64, 0x0f, 0x5d, 0x14, - 0x11, 0x7a, 0x58, 0x83, 0x2d, 0xdc, 0x26, 0x46, 0x60, 0x74, 0x38, 0xc8, - 0xef, 0xfd, 0xa1, 0x16, 0xcc, 0x05, 0xed, 0xb7, 0xe2, 0xa4, 0x1d, 0x84, - 0xac, 0xfc, 0x3c, 0x43, 0xc1, 0xaa, 0xe5, 0x4e, 0x5d, 0xb4, 0x31, 0x9e, - 0x2d, 0x65, 0xa0, 0xa4, 0xcf, 0x37, 0xbe, 0x5f, 0x6c, 0xc9, 0x46, 0xd9, - 0x35, 0xbc, 0xcb, 0xc4, 0x23, 0xa8, 0x76, 0x6a, 0xb0, 0xa5, 0x11, 0xc4, - 0x84, 0xed, 0x4e, 0xff, 0x3d, 0xaa, 0x60, 0xba, 0xc0, 0x5b, 0x94, 0x80, - 0x3f, 0x57, 0x74, 0x1c, 0x5e, 0x6c, 0xcd, 0x66, 0xfa, 0x74, 0x74, 0xec, - 0x8c, 0xfa, 0xdd, 0x64, 0xa9, 0x35, 0xbd, 0x31, 0xc4, 0xc4, 0x44, 0x7f, - 0x6f, 0xe9, 0x6f, 0x11, 0xd5, 0xc5, 0x74, 0xa8, 0xda, 0x81, 0xb5, 0xb2, - 0xfe, 0x94, 0x3a, 0x75, 0xca, 0x1f, 0x31, 0xa5, 0xe0, 0x1b, 0x74, 0x32, - 0x53, 0xb5, 0x24, 0x35, 0x9f, 0x64, 0x35, 0x5a, 0xe3, 0xe0, 0x66, 0x7e, - 0xc1, 0x82, 0x37, 0xf5, 0x70, 0x6f, 0xf0, 0x77, 0x9e, 0x4b, 0x3a, 0x06, - 0x13, 0x90, 0x4f, 0xb9, 0x16, 0x5a, 0xef, 0xcd, 0xcc, 0x82, 0x5c, 0x26, - 0x46, 0x24, 0xd1, 0x46, 0x4e, 0xb3, 0x7c, 0x80, 0x94, 0xfd, 0x40, 0x0f, - 0x34, 0x5a, 0x83, 0x17, 0x06, 0x02, 0x63, 0x35, 0xf5, 0xe2, 0x17, 0x3a, - 0xd9, 0xd8, 0x8b, 0x56, 0xe3, 0xb6, 0xe7, 0xea, 0x31, 0x96, 0x17, 0xf2, - 0xc5, 0x21, 0x77, 0x22, 0xcb, 0xbe, 0xb3, 0x87, 0x2c, 0x32, 0x40, 0x5c, - 0xf9, 0xf8, 0x48, 0x17, 0x11, 0x30, 0xe4, 0xfd, 0xa1, 0x44, 0xab, 0x00, - 0xfe, 0x0e, 0x2f, 0xa8, 0x32, 0x1b, 0x52, 0xdd, 0x8e, 0x3a, 0x41, 0xa1, - 0x3a, 0x8f, 0xbe, 0x4b, 0xb0, 0x42, 0x1e, 0x38, 0xd8, 0xf5, 0x81, 0x2b, - 0xe0, 0x28, 0xa1, 0x4f, 0x29, 0xa5, 0x49, 0x13, 0x09, 0x7c, 0x71, 0x22, - 0xd3, 0x5b, 0x4b, 0x72, 0x7f, 0x2a, 0xf4, 0x98, 0x9f, 0x17, 0x18, 0x8d, - 0x5d, 0xdf, 0xfa, 0x5c, 0xe3, 0x75, 0x19, 0xd2, 0x0d, 0x08, 0x51, 0xfc, - 0xc1, 0x60, 0x2d, 0xd4, 0xa0, 0x6c, 0xb0, 0xc6, 0x73, 0x31, 0x46, 0x26, - 0x33, 0xb9, 0x51, 0x07, 0x2e, 0x00, 0x8c, 0xe2, 0x8b, 0xc9, 0x96, 0x2f, - 0x6d, 0x01, 0x90, 0x18, 0x19, 0xae, 0x3e, 0xb8, 0xfb, 0x7b, 0xbd, 0xf9, - 0x8f, 0xfc, 0xe4, 0x9e, 0xc2, 0xc5, 0xa0, 0x14, 0x3b, 0xe8, 0x06, 0xc0, - 0xfb, 0xe8, 0xbf, 0x2d, 0x3a, 0x73, 0x0d, 0x2b, 0x66, 0x4e, 0x88, 0x18, - 0x9b, 0x4c, 0x94, 0xf4, 0x04, 0xc4, 0x48, 0xf3, 0x17, 0x83, 0xce, 0x31, - 0x36, 0x63, 0x37, 0x22, 0x7d, 0xd2, 0x9d, 0xe7, 0xd2, 0x3c, 0x77, 0x6e, - 0xb5, 0xc7, 0x42, 0xcf, 0x3b, 0x34, 0xec, 0xac, 0xbc, 0xb1, 0xd0, 0x25, - 0x0d, 0xfe, 0xa2, 0x69, 0x7d, 0x23, 0xdb, 0xab, 0x59, 0x65, 0xc3, 0x3f, - 0x27, 0x40, 0xe5, 0x25, 0x43, 0x2a, 0xc8, 0x2f, 0x11, 0x05, 0x1d, 0x68, - 0xc1, 0x39, 0x85, 0x29, 0xfb, 0x66, 0xb5, 0x68, 0x8a, 0xb6, 0x90, 0x9e, - 0x92, 0xca, 0x11, 0x25, 0x80, 0x82, 0x0d, 0x4a, 0xda, 0xed, 0xb2, 0x65, - 0xdd, 0x33, 0xd5, 0x4c, 0xad, 0xde, 0x44, 0xcd, 0xf3, 0x06, 0xcc, 0x17, - 0x31, 0x9a, 0xec, 0x9f, 0x82, 0x3c, 0x23, 0xeb, 0x62, 0x6d, 0x39, 0xbe, - 0xef, 0x82, 0x91, 0xde, 0xea, 0x85, 0x3e, 0x51, 0x3c, 0x48, 0x81, 0x56, - 0x1c, 0x6d, 0xba, 0x1e, 0x7a, 0xa8, 0xe6, 0x10, 0xc9, 0x37, 0x8d, 0x4f, - 0x8c, 0x20, 0x0b, 0x4c, 0x48, 0x55, 0xb1, 0x38, 0x18, 0xa6, 0xb0, 0x47, - 0xca, 0x7c, 0x62, 0xeb, 0x91, 0x1e, 0x1b, 0x49, 0x60, 0xd8, 0x14, 0x7f, - 0x34, 0x43, 0xe9, 0x03, 0x0e, 0x82, 0x72, 0xa2, 0x55, 0xb2, 0x98, 0x48, - 0x32, 0x2b, 0x97, 0xb0, 0xab, 0xeb, 0xad, 0x03, 0xb6, 0x62, 0xa8, 0xf6, - 0x0c, 0xc5, 0x60, 0x16, 0x3b, 0x59, 0x9a, 0xc1, 0x05, 0xe9, 0x86, 0x1e, - 0x4f, 0x04, 0x69, 0x18, 0x7e, 0xe8, 0xce, 0xd7, 0x9c, 0x5b, 0x6a, 0x2f, - 0x5a, 0xb4, 0x09, 0x89, 0xe7, 0xdf, 0xe6, 0x86, 0x0f, 0xd2, 0xd9, 0x99, - 0x92, 0xc7, 0x0a, 0xa5, 0xb3, 0xd5, 0x2c, 0x7c, 0xfd, 0x31, 0x0b, 0xd5, - 0x37, 0x74, 0x57, 0xcf, 0x1c, 0xc2, 0xe0, 0x78, 0x47, 0x1d, 0x35, 0x68, - 0x0a, 0xdc, 0xa6, 0x89, 0xd3, 0x5f, 0x9f, 0x24, 0xef, 0x61, 0x4f, 0xc4, - 0x76, 0x66, 0x0d, 0xdc, 0xc6, 0x74, 0x39, 0x5d, 0xb4, 0xa8, 0xcf, 0x60, - 0x91, 0x9f, 0xed, 0x1d, 0xc9, 0x13, 0x6c, 0x17, 0xf3, 0xd2, 0x0c, 0xfe, - 0xb2, 0xc2, 0x7f, 0x17, 0xe3, 0x01, 0xd6, 0xf8, 0x06, 0xda, 0x85, 0x26, - 0x52, 0x21, 0x6a, 0x54, 0x71, 0xfd, 0x45, 0xde, 0xb7, 0x14, 0x65, 0xcd, - 0xb0, 0x33, 0xed, 0xff, 0x8d, 0x36, 0x4d, 0xed, 0xe4, 0x39, 0x05, 0x9a, - 0xdc, 0x9b, 0x73, 0xb2, 0x40, 0xd3, 0x24, 0x89, 0x01, 0xeb, 0x85, 0x7f, - 0xf6, 0x9d, 0xdc, 0x5d, 0x6c, 0x46, 0x8f, 0xe9, 0x6c, 0x82, 0x24, 0x01, - 0x2c, 0xf4, 0x37, 0x57, 0xff, 0xa4, 0x43, 0x29, 0xd3, 0xc6, 0xe2, 0x16, - 0xd6, 0x33, 0xf9, 0xb5, 0xf7, 0x92, 0x10, 0x0e, 0xd5, 0x02, 0x07, 0x51, - 0x0c, 0xb7, 0x69, 0x0e, 0x1f, 0xdc, 0x36, 0xde, 0x80, 0xc2, 0x07, 0x61, - 0xb2, 0xcd, 0x02, 0x55, 0x14, 0x91, 0x9d, 0x1c, 0x1f, 0xe9, 0x0b, 0x49, - 0x02, 0x44, 0x6b, 0x2f, 0x1a, 0x51, 0xa2, 0xf2, 0x93, 0x4c, 0x51, 0xca, - 0xe6, 0x65, 0x68, 0x45, 0x59, 0x52, 0xcf, 0x92, 0x48, 0xd3, 0x78, 0x4b, - 0x1f, 0xda, 0xcb, 0x22, 0x19, 0xef, 0x13, 0x86, 0x6c, 0x58, 0x5e, 0x35, - 0x63, 0x65, 0xfb, 0x38, 0x13, 0x24, 0x0e, 0x3c, 0xed, 0x94, 0xb5, 0xcf, - 0xf8, 0x28, 0x3f, 0x25, 0x88, 0xcc, 0x9b, 0x7c, 0x4d, 0x99, 0x42, 0x9f, - 0x82, 0xb4, 0x42, 0xdd, 0xd3, 0x5c, 0xfb, 0x41, 0x77, 0xdc, 0x1d, 0x92, - 0x85, 0xca, 0x62, 0x63, 0x58, 0x36, 0x55, 0x4a, 0xc3, 0x12, 0x27, 0xcd, - 0x69, 0xd6, 0xe6, 0xe2, 0x41, 0x51, 0xc5, 0x97, 0x43, 0x3d, 0x7a, 0xc5, - 0x19, 0xcc, 0xf6, 0x62, 0x08, 0x67, 0x36, 0xdd, 0xda, 0x79, 0xc4, 0xa2, - 0x3c, 0x9c, 0x8c, 0x4d, 0xf9, 0x01, 0x6b, 0xf9, 0x2a, 0x9e, 0x62, 0xa3, - 0x27, 0xe5, 0x2b, 0xc2, 0x38, 0xe4, 0xc0, 0x10, 0x92, 0x39, 0x4a, 0xa1, - 0x65, 0x6b, 0x6f, 0x86, 0x6b, 0xd2, 0x6c, 0xf2, 0x96, 0xde, 0x4b, 0xf9, - 0x41, 0x18, 0xbf, 0x7c, 0xc6, 0x5f, 0x69, 0xfd, 0x20, 0x04, 0xc5, 0xc2, - 0x53, 0xf1, 0xe0, 0xf6, 0x0d, 0xab, 0x1e, 0x6a, 0x6c, 0xbf, 0x28, 0xd0, - 0x44, 0x86, 0x4e, 0x7d, 0xa7, 0x7c, 0xad, 0x05, 0x37, 0x75, 0x9c, 0xd4, - 0x7d, 0xc0, 0xa8, 0x83, 0x57, 0xba, 0xa3, 0xf4, 0x29, 0x8c, 0xac, 0x7f, - 0xf9, 0x4d, 0x66, 0x1e, 0x8f, 0xb7, 0x24, 0x84, 0x28, 0xb8, 0xbe, 0x19, - 0x2b, 0x88, 0xa4, 0x59, 0xc1, 0xae, 0x6a, 0x69, 0x86, 0x59, 0x8c, 0xb8, - 0x2e, 0xf4, 0x91, 0x74, 0xf5, 0xca, 0xa6, 0x52, 0x6e, 0x05, 0xb8, 0x71, - 0x0c, 0xb2, 0x08, 0xde, 0xba, 0xd6, 0xae, 0xcd, 0x38, 0x2f, 0x45, 0x5e, - 0xe8, 0x8d, 0xec, 0x7c, 0xd8, 0x10, 0x18, 0xc9, 0x25, 0x10, 0x90, 0xdb, - 0xac, 0x8b, 0x90, 0x8e, 0x9c, 0xb0, 0x58, 0xfd, 0x55, 0x1b, 0x84, 0x2a, - 0x3a, 0x03, 0x7e, 0x24, 0xe0, 0x6c, 0x74, 0xae, 0x7a, 0x1e, 0x7c, 0xfc, - 0x03, 0x57, 0x56, 0x5e, 0x74, 0xa2, 0x59, 0xe2, 0xe8, 0x22, 0xe2, 0xf0, - 0x71, 0x49, 0x71, 0x48, 0xfd, 0x6d, 0x2a, 0xaf, 0xf0, 0x80, 0xad, 0xcf, - 0x37, 0x52, 0x3f, 0x68, 0x33, 0xf7, 0x07, 0xc2, 0xa2, 0x88, 0x4d, 0x2b, - 0x92, 0x62, 0xdf, 0x19, 0x17, 0x6a, 0x12, 0xca, 0xe4, 0x7c, 0x09, 0x1b, - 0x08, 0x75, 0xb2, 0x95, 0x75, 0xc7, 0x0f, 0x07, 0x2d, 0xc9, 0x78, 0xed, - 0x75, 0x44, 0x31, 0x7e, 0x53, 0x72, 0x89, 0x3f, 0x33, 0x5e, 0xdd, 0x93, - 0xea, 0x48, 0xa7, 0x73, 0x6f, 0x07, 0xae, 0x5b, 0xfc, 0x03, 0xcf, 0x9e, - 0x1c, 0x6e, 0xb3, 0x90, 0x68, 0x36, 0x29, 0x95, 0x26, 0xe9, 0x2f, 0x44, - 0xdc, 0x17, 0x68, 0xa2, 0xc2, 0xf2, 0xf7, 0x96, 0xf6, 0x96, 0x41, 0x0b, - 0x0f, 0xdc, 0xcf, 0xbb, 0x13, 0xd3, 0x54, 0x80, 0x3a, 0x95, 0xe3, 0xd0, - 0xc2, 0x10, 0xf5, 0x8f, 0x4c, 0xc0, 0xbe, 0x2f, 0xf2, 0x1e, 0x6d, 0x2d, - 0x87, 0xb3, 0x1d, 0x75, 0x3a, 0xb2, 0x4a, 0xec, 0x47, 0x0e, 0x13, 0x1a, - 0x97, 0x12, 0xf7, 0x02, 0x6c, 0xda, 0xe2, 0xd5, 0x6d, 0xdc, 0xb1, 0xbc, - 0x25, 0x30, 0xa1, 0xb0, 0x0d, 0xf7, 0x44, 0xb4, 0x67, 0x6d, 0xe0, 0x64, - 0x1d, 0x13, 0x0f, 0xd9, 0x95, 0xa5, 0x4f, 0x2b, 0x3e, 0xfa, 0x7f, 0xd5, - 0x4e, 0xaf, 0xe8, 0x19, 0xb5, 0x40, 0x49, 0xda, 0xc9, 0x69, 0xfa, 0x7a, - 0xe4, 0xa6, 0x00, 0x84, 0x0f, 0xf3, 0x75, 0x11, 0xb2, 0x6d, 0xe8, 0x1e, - 0xd3, 0x8a, 0xac, 0xec, 0x3c, 0xcc, 0x53, 0x65, 0x82, 0x6e, 0x59, 0x3a, - 0xfc, 0x51, 0x0b, 0x16, 0x24, 0xda, 0x26, 0x83, 0x76, 0x01, 0x6b, 0x90, - 0xe1, 0x81, 0xc7, 0xbd, 0x04, 0x9e, 0x97, 0x2c, 0x0e, 0x77, 0x86, 0xf0, - 0x36, 0x7b, 0x10, 0x24, 0x67, 0x09, 0x5d, 0x10, 0x23, 0xd1, 0x44, 0x20, - 0x57, 0x71, 0x85, 0x4a, 0x62, 0x5b, 0x70, 0x23, 0xe5, 0x68, 0x82, 0x5e, - 0x05, 0x9e, 0xd6, 0x82, 0xc2, 0x23, 0x7e, 0xd7, 0xd0, 0x63, 0x33, 0x7f, - 0xe6, 0x51, 0x26, 0x5d, 0xe8, 0xc5, 0x6d, 0xfc, 0xd4, 0xeb, 0x5c, 0xd9, - 0x22, 0x88, 0xaf, 0xea, 0xc8, 0xd4, 0x6e, 0xe3, 0x04, 0xb2, 0xe9, 0x89, - 0x92, 0x93, 0xfd, 0xf6, 0x5b, 0x55, 0xa9, 0x9f, 0xd1, 0xba, 0x85, 0xd6, - 0xce, 0x48, 0x3a, 0xfb, 0x68, 0x41, 0xdd, 0x68, 0x38, 0x6e, 0xd0, 0x6f, - 0x07, 0xc2, 0x3a, 0xaa, 0x68, 0x0b, 0xfe, 0xb8, 0x58, 0xcc, 0xe0, 0xe6, - 0x81, 0x67, 0x55, 0x32, 0x16, 0xed, 0xd2, 0x50, 0x33, 0x25, 0x11, 0xd3, - 0x6d, 0xb7, 0xeb, 0xa5, 0xe7, 0x81, 0xfc, 0x78, 0x31, 0x48, 0x19, 0x31, - 0xb9, 0x77, 0x85, 0x6f, 0x47, 0xd2, 0x64, 0x74, 0x15, 0x98, 0x81, 0xf4, - 0x21, 0x32, 0x8f, 0x39, 0xde, 0x8f, 0x70, 0xec, 0xe3, 0xf4, 0x29, 0x26, - 0x59, 0x7d, 0xc1, 0x66, 0xcf, 0x43, 0xd7, 0x7b, 0x39, 0xf4, 0xf6, 0xf9, - 0xf8, 0x81, 0xa6, 0x83, 0xf9, 0x24, 0x45, 0xab, 0x80, 0x5f, 0x48, 0xbe, - 0x8a, 0x48, 0x30, 0xc6, 0xbe, 0x26, 0xe8, 0x66, 0x01, 0x93, 0x16, 0x76, - 0x0b, 0x59, 0x81, 0x0d, 0xe3, 0xc5, 0x3e, 0xa0, 0xcf, 0x23, 0x74, 0xc3, - 0x06, 0x5d, 0xf3, 0x1d, 0x56, 0xda, 0x6d, 0x66, 0x44, 0x34, 0x42, 0xcc, - 0x87, 0xf9, 0x43, 0x71, 0xbb, 0x99, 0xba, 0x93, 0x96, 0x9c, 0x13, 0x21, - 0xf8, 0x76, 0x30, 0x9e, 0x45, 0xf2, 0xa1, 0x67, 0x6c, 0xe7, 0xcf, 0x1b, - 0x20, 0x80, 0xba, 0xe8, 0x2c, 0x6e, 0x66, 0xe7, 0xe5, 0xa1, 0xe6, 0x65, - 0xcf, 0x87, 0x5f, 0x8f, 0x74, 0xf6, 0xd7, 0xf4, 0x6e, 0x9d, 0xc7, 0x54, - 0xaf, 0x47, 0x6b, 0x9f, 0xf4, 0xd5, 0x7b, 0x45, 0x57, 0x02, 0xd3, 0x87, - 0xc6, 0xd6, 0x23, 0xd1, 0x15, 0x7b, 0x8c, 0x99, 0x8a, 0x9c, 0x57, 0xf2, - 0xf3, 0x3f, 0xc9, 0x56, 0xa4, 0x04, 0xc8, 0x2b, 0xb3, 0xcf, 0xf1, 0x9d, - 0x48, 0xf1, 0x44, 0x99, 0x02, 0x59, 0x0d, 0x8a, 0x91, 0x3b, 0x37, 0x9d, - 0xf1, 0xc9, 0x47, 0x01, 0x04, 0x0a, 0xb6, 0xc5, 0xd5, 0x60, 0xed, 0x6f, - 0xc8, 0x68, 0x35, 0x9e, 0x86, 0xea, 0x75, 0xc9, 0x21, 0x35, 0x6b, 0x02, - 0x45, 0x50, 0x2a, 0x6a, 0x96, 0xc4, 0x0b, 0x4a, 0x36, 0xda, 0x40, 0xb1, - 0x4d, 0xd1, 0x14, 0xca, 0x8b, 0x4c, 0x05, 0xb2, 0x00, 0xfe, 0x12, 0xdf, - 0x8d, 0x41, 0xb5, 0x97, 0xb0, 0x43, 0x08, 0x3c, 0x57, 0x34, 0xeb, 0xac, - 0xfd, 0xa2, 0xd6, 0x64, 0x64, 0xd0, 0x60, 0xe3, 0xf2, 0xfa, 0x43, 0x52, - 0xc7, 0xe4, 0x42, 0x47, 0x80, 0x1e, 0x20, 0x39, 0x24, 0x84, 0x5e, 0xa1, - 0x1c, 0xce, 0x28, 0x4f, 0x31, 0xec, 0xa6, 0x43, 0x71, 0x9e, 0xd2, 0xdf, - 0x9e, 0x66, 0x35, 0xc4, 0x62, 0xcc, 0xce, 0xd2, 0x49, 0xdf, 0x43, 0xb1, - 0x20, 0x27, 0x5e, 0x81, 0x30, 0x52, 0xd0, 0x44, 0x8d, 0xe1, 0x26, 0x9e, - 0xc7, 0x4a, 0x9c, 0xb7, 0x49, 0xe5, 0x29, 0xe8, 0x55, 0xfd, 0x1a, 0x23, - 0xf6, 0xc1, 0x0b, 0x8a, 0x97, 0xdd, 0x50, 0xa0, 0x6c, 0xef, 0x73, 0x40, - 0xe2, 0x3c, 0x10, 0xf5, 0x8a, 0x34, 0xf3, 0xae, 0x83, 0xf0, 0x21, 0x36, - 0x7c, 0x6c, 0xb2, 0xf1, 0x93, 0x43, 0x4d, 0x32, 0x22, 0xe7, 0x26, 0xec, - 0xc4, 0xcc, 0xbc, 0x6a, 0xe0, 0x20, 0x4c, 0xc6, 0x3d, 0x38, 0xa1, 0x0b, - 0x5b, 0x26, 0xb3, 0xbc, 0xe7, 0x41, 0x74, 0x90, 0x2c, 0x4f, 0x1e, 0x82, - 0xf8, 0xe6, 0x2d, 0xda, 0x15, 0x35, 0x32, 0x45, 0xe8, 0x1c, 0x73, 0xa3, - 0x0e, 0xd8, 0x1d, 0x37, 0x73, 0x2b, 0x23, 0x42, 0x18, 0xed, 0x00, 0x41, - 0x9f, 0xbb, 0xd3, 0x4b, 0x16, 0x0b, 0x28, 0x3a, 0x95, 0xab, 0xce, 0x0d, - 0x67, 0x71, 0xec, 0x46, 0x82, 0x1c, 0xc1, 0xd6, 0x27, 0x8c, 0x74, 0xa3, - 0x2f, 0xd4, 0x16, 0x90, 0x2b, 0x3d, 0xee, 0x09, 0x9f, 0xbf, 0x7e, 0x1a, - 0x80, 0x3c, 0x79, 0xdb, 0x13, 0x79, 0x14, 0x02, 0xe5, 0x46, 0xc5, 0x5d, - 0xaa, 0x90, 0x72, 0x00, 0x76, 0xfc, 0xcf, 0x53, 0xfd, 0x1c, 0xb6, 0x0a, - 0x2b, 0xa1, 0x83, 0xa6, 0x75, 0x25, 0x5e, 0x57, 0x8c, 0xfa, 0x7b, 0x17, - 0xc4, 0x19, 0x80, 0x1f, 0xf2, 0x13, 0x56, 0xf8, 0x93, 0xdd, 0x9b, 0x6c, - 0x66, 0xd8, 0x63, 0x40, 0x96, 0xcc, 0xcf, 0xa7, 0x1c, 0x0c, 0x19, 0x8e, - 0x45, 0x81, 0x7c, 0x30, 0xd0, 0x7b, 0xc1, 0x01, 0x63, 0x47, 0xa4, 0x01, - 0x25, 0xa7, 0x81, 0xdc, 0x68, 0x3c, 0xef, 0x7d, 0x6e, 0x73, 0x73, 0x19, - 0xb0, 0xc3, 0xb3, 0x62, 0x11, 0xbb, 0xea, 0x68, 0xb1, 0xc9, 0x63, 0x39, - 0x25, 0xa8, 0xdf, 0xc9, 0x89, 0xbe, 0x2a, 0xd9, 0xaf, 0x49, 0x33, 0xf4, - 0x4b, 0x1c, 0x5a, 0xb5, 0x2a, 0x0d, 0x3b, 0x09, 0x20, 0x43, 0x87, 0xc5, - 0x7b, 0x23, 0x10, 0x8c, 0x3b, 0x61, 0xb5, 0x86, 0xd7, 0xff, 0x4c, 0x18, - 0x23, 0x32, 0x37, 0x35, 0xab, 0xd7, 0x29, 0xf4, 0x7c, 0x75, 0xad, 0x74, - 0xb5, 0xd6, 0xaf, 0xe2, 0xca, 0x21, 0x85, 0x52, 0xff, 0xf6, 0x67, 0x14, - 0xc0, 0x0a, 0xb5, 0xf3, 0xfb, 0xfa, 0x46, 0x72, 0x3b, 0xad, 0xd4, 0xd9, - 0x5d, 0x1c, 0xb3, 0x56, 0x2d, 0x47, 0xf3, 0xb5, 0xa7, 0x47, 0xcc, 0x54, - 0x15, 0x8c, 0xb4, 0xef, 0x91, 0x01, 0xcb, 0xd5, 0x8f, 0x9e, 0xc3, 0x01, - 0x89, 0x36, 0x63, 0xa3, 0x21, 0x0f, 0xf0, 0xf9, 0xb0, 0xb6, 0xd3, 0x4d, - 0xf9, 0x11, 0x1d, 0x8f, 0xb1, 0x43, 0x98, 0x5e, 0x9d, 0xbc, 0x4f, 0x24, - 0xb6, 0xe2, 0x37, 0x9b, 0xc1, 0x6b, 0x2e, 0xe7, 0x46, 0xe6, 0x6f, 0x50, - 0x0c, 0xa9, 0x0e, 0x85, 0xe8, 0xf2, 0xd0, 0x9f, 0x0b, 0x2e, 0x08, 0x2d, - 0x41, 0xe9, 0xe0, 0xab, 0x7a, 0xe9, 0x92, 0xc3, 0x51, 0x27, 0x24, 0x5d, - 0x12, 0x5e, 0xbf, 0x58, 0xe5, 0xd2, 0x02, 0x8c, 0x5d, 0x01, 0x73, 0xfa, - 0x83, 0x41, 0x5c, 0x09, 0xb7, 0xe9, 0x8b, 0x76, 0xd3, 0xa6, 0x27, 0xec, - 0x13, 0x6f, 0xc2, 0x4b, 0xd6, 0xb5, 0x89, 0xeb, 0x44, 0xe5, 0xb0, 0x34, - 0x12, 0x13, 0x43, 0x88, 0xf5, 0xf3, 0x35, 0x21, 0xa8, 0x3d, 0x49, 0xdc, - 0x24, 0xac, 0x00, 0x46, 0xab, 0x6a, 0x78, 0x83, 0xac, 0xe2, 0xe9, 0x0e, - 0x37, 0x41, 0x62, 0x4f, 0x95, 0xea, 0xba, 0xc9, 0x4a, 0xe1, 0x75, 0x4c, - 0xd5, 0x98, 0xa4, 0xeb, 0xcf, 0x50, 0x3f, 0x2e, 0x98, 0xb4, 0x83, 0x63, - 0xb3, 0x87, 0xf9, 0xf4, 0x25, 0xef, 0xf4, 0xfd, 0xc3, 0xdf, 0x5b, 0x75, - 0xb1, 0x87, 0x8a, 0x06, 0xe3, 0xcb, 0xf9, 0xd0, 0x9e, 0x7b, 0x3c, 0x6d, - 0xbd, 0xaa, 0xe1, 0xce, 0x97, 0x92, 0x54, 0x0c, 0xa9, 0xc5, 0x80, 0x3b, - 0x63, 0x17, 0x7f, 0xff, 0xa7, 0xff, 0xf2, 0x7a, 0x2f, 0x55, 0xfd, 0x07, - 0x03, 0x8b, 0x1a, 0xc0, 0x68, 0xc4, 0xc7, 0x3b, 0xfe, 0xfd, 0x19, 0xad, - 0x4b, 0xc7, 0x99, 0x6d, 0x50, 0x2c, 0xb6, 0xb7, 0x34, 0x58, 0x56, 0x9e, - 0x23, 0xfc, 0x7d, 0x06, 0x18, 0xea, 0xd8, 0xf8, 0x32, 0x59, 0xf8, 0x4d, - 0x4d, 0x0f, 0x77, 0x85, 0xfe, 0x5d, 0xcb, 0xd1, 0x82, 0x0e, 0x62, 0xa5, - 0x04, 0xca, 0x90, 0x1c, 0x4b, 0x2e, 0xa8, 0xe1, 0xbf, 0x06, 0x9e, 0x4f, - 0x6e, 0xe4, 0xe3, 0x22, 0x48, 0xcf, 0x04, 0x69, 0x50, 0x95, 0xd8, 0x2e, - 0x17, 0x17, 0xce, 0x8a, 0x07, 0xc7, 0x14, 0x79, 0x49, 0x16, 0x9b, 0x31, - 0xc4, 0x94, 0xc7, 0x49, 0x2f, 0x6a, 0x93, 0x66, 0xab, 0x0b, 0x14, 0x5c, - 0x02, 0x0a, 0xb9, 0xd5, 0xaf, 0x2b, 0xed, 0xbf, 0xa0, 0xfe, 0x37, 0x44, - 0x12, 0x03, 0x7a, 0x7e, 0x8f, 0x8f, 0x77, 0x00, 0x51, 0x3a, 0xfc, 0x3a, - 0x92, 0x4d, 0xee, 0xcf, 0xdb, 0xfc, 0x0e, 0x7d, 0xec, 0xe2, 0x05, 0x25, - 0xff, 0x36, 0x15, 0x15, 0x0f, 0x11, 0x77, 0x84, 0x46, 0xcd, 0xc0, 0x13, - 0xfc, 0x72, 0x73, 0x26, 0x78, 0x4f, 0x1b, 0xa4, 0xc8, 0x82, 0x0a, 0x05, - 0xd0, 0x5d, 0x78, 0x56, 0x20, 0x32, 0xd6, 0xde, 0x68, 0xe6, 0x49, 0xb8, - 0x7b, 0x0b, 0xf6, 0xff, 0x04, 0xdf, 0x54, 0x82, 0x00, 0x8f, 0xde, 0x0a, - 0x3a, 0x56, 0x1a, 0xb8, 0x07, 0xbe, 0x0d, 0xff, 0x16, 0xa9, 0xcf, 0x45, - 0xae, 0xa9, 0x55, 0x0a, 0x03, 0x77, 0x23, 0x05, 0x1a, 0x01, 0xbf, 0x65, - 0x56, 0x45, 0x11, 0x9d, 0x63, 0xb9, 0x9b, 0x15, 0x0c, 0xdd, 0x77, 0x30, - 0x6d, 0x2e, 0x15, 0x27, 0xfd, 0x8b, 0xb5, 0xcd, 0x45, 0xfc, 0x5d, 0xbe, - 0x76, 0x91, 0xcc, 0x7f, 0x93, 0x31, 0x85, 0x83, 0x5a, 0x82, 0x0f, 0x44, - 0x62, 0x40, 0xb8, 0xf5, 0x01, 0x6d, 0xf7, 0x09, 0xa8, 0x97, 0xe9, 0x0b, - 0xa3, 0x7b, 0x46, 0xef, 0xd4, 0xe3, 0xc3, 0xb7, 0x92, 0x22, 0xde, 0x4e, - 0xda, 0x0b, 0x8a, 0x58, 0x2a, 0x8a, 0x42, 0xde, 0xf5, 0x65, 0xc0, 0xd7, - 0x32, 0xef, 0x3e, 0xad, 0xd1, 0xe7, 0xf5, 0xc4, 0x0f, 0x82, 0xbd, 0x13, - 0x67, 0x93, 0x42, 0x1b, 0x16, 0xa9, 0xa1, 0xf3, 0xc1, 0x4a, 0xe2, 0xc1, - 0x9e, 0x06, 0xab, 0x09, 0xd1, 0x43, 0x41, 0xd9, 0x5a, 0x35, 0x36, 0xe0, - 0xd6, 0x89, 0xb3, 0xa2, 0x63, 0xee, 0x97, 0x88, 0x07, 0xe8, 0x34, 0xaa, - 0x34, 0x17, 0x13, 0x90, 0x42, 0xb6, 0xae, 0xf8, 0xef, 0x06, 0xbd, 0xc1, - 0x25, 0x7f, 0x3e, 0x19, 0xa6, 0x60, 0x63, 0xfd, 0xf7, 0xfb, 0x06, 0x90, - 0x8e, 0xb9, 0x78, 0xe4, 0x2c, 0x61, 0x8f, 0x35, 0xe1, 0x9b, 0x88, 0x01, - 0xf6, 0xcc, 0xb4, 0x36, 0x3f, 0x56, 0xbb, 0xc3, 0xdc, 0x6d, 0x10, 0x09, - 0x63, 0xbc, 0x9a, 0xea, 0xa9, 0xa8, 0xc8, 0xc2, 0x01, 0x26, 0x94, 0xfb, - 0x7b, 0x50, 0x1b, 0x28, 0xe2, 0x21, 0xbb, 0x5d, 0x72, 0xbc, 0xb3, 0x74, - 0x61, 0x0a, 0x5a, 0x87, 0x88, 0x39, 0x29, 0xff, 0x3c, 0x9f, 0xf5, 0xbd, - 0x5b, 0x95, 0x03, 0xb8, 0x35, 0x47, 0xf6, 0xb0, 0x03, 0x6c, 0x72, 0x90, - 0xa1, 0x68, 0xde, 0x86, 0xa3, 0x33, 0xaa, 0x87, 0x82, 0x42, 0x40, 0x7d, - 0x35, 0x5c, 0xe3, 0x7b, 0x76, 0x5d, 0x95, 0x36, 0x99, 0xc5, 0x24, 0xe0, - 0xed, 0x92, 0xce, 0x48, 0x4b, 0xdc, 0x86, 0xe2, 0x64, 0x68, 0xee, 0x94, - 0xc8, 0x08, 0xb6, 0x7e, 0x5e, 0xf3, 0x97, 0x7c, 0x0b, 0xf0, 0x13, 0x92, - 0xf5, 0xc6, 0xc4, 0x81, 0xd0, 0x2e, 0xa6, 0x40, 0xf0, 0x08, 0xbe, 0x94, - 0x6b, 0x9c, 0x22, 0x51, 0xea, 0x5c, 0x41, 0x73, 0x3b, 0xd8, 0x18, 0x6d, - 0xae, 0x1c, 0x85, 0x2d, 0x58, 0xae, 0xe1, 0x06, 0xeb, 0x41, 0x34, 0x17, - 0x7c, 0x1c, 0x16, 0xe3, 0xe3, 0x36, 0xb5, 0x9f, 0x04, 0xff, 0xf0, 0x58, - 0xab, 0x4b, 0x8e, 0x0d, 0x6f, 0xe0, 0x61, 0x43, 0xee, 0x65, 0xde, 0x96, - 0xe8, 0xbb, 0x03, 0xa7, 0x10, 0xfc, 0x8b, 0x66, 0xfb, 0xd8, 0x2e, 0xba, - 0x4b, 0xf1, 0x56, 0xdf, 0xa9, 0xfe, 0x24, 0xbc, 0x2c, 0x02, 0xd0, 0x63, - 0xe3, 0xec, 0x74, 0xe2, 0xae, 0x55, 0x86, 0xc2, 0xa3, 0xde, 0x89, 0x75, - 0x6e, 0xcd, 0x1d, 0x3e, 0x5f, 0x21, 0xfa, 0xe9, 0x58, 0xfa, 0x5c, 0x78, - 0x40, 0x4c, 0x36, 0x5a, 0x6a, 0xc9, 0x60, 0xb7, 0xbe, 0xd6, 0x81, 0x4e, - 0xcf, 0xb6, 0xe8, 0x18, 0x9b, 0xbf, 0xa6, 0x7e, 0x6f, 0x12, 0x5f, 0x41, - 0x72, 0xfb, 0xee, 0xdb, 0x50, 0x45, 0x02, 0xe9, 0xd5, 0xbf, 0x7e, 0xd2, - 0x1d, 0x1b, 0xa9, 0x5a, 0x03, 0x8d, 0x21, 0x8f, 0xc7, 0x34, 0x01, 0x5a, - 0xa7, 0x12, 0xbb, 0xa7, 0xd0, 0xdd, 0x88, 0x14, 0x56, 0xec, 0x9e, 0xf0, - 0xec, 0x0a, 0xf8, 0x3f, 0x5d, 0x6d, 0x19, 0x6d, 0xad, 0xa8, 0xfa, 0xc8, - 0x11, 0xdc, 0x4e, 0x20, 0xd5, 0x05, 0xb6, 0x58, 0x87, 0x94, 0x05, 0x22, - 0x8d, 0x51, 0x5b, 0x0e, 0x62, 0xbd, 0xb9, 0x22, 0xa7, 0x83, 0xd7, 0x98, - 0x0c, 0xce, 0xb6, 0xed, 0x0a, 0xde, 0x23, 0xed, 0x79, 0x7a, 0x27, 0xe6, - 0x48, 0x4d, 0xe7, 0xc3, 0x47, 0xab, 0xa2, 0x25, 0x60, 0xea, 0x41, 0x8a, - 0xed, 0x5e, 0x89, 0xce, 0xf5, 0x7f, 0xeb, 0xb2, 0xaa, 0x30, 0x17, 0x91, - 0x72, 0x48, 0x48, 0xba, 0x80, 0xa1, 0x86, 0x26, 0x70, 0xbc, 0x3d, 0xa2, - 0x69, 0xeb, 0x2a, 0x7f, 0x53, 0x9c, 0xec, 0x48, 0x6c, 0x70, 0x60, 0x98, - 0x68, 0x14, 0x06, 0x0e, 0x41, 0x25, 0xba, 0x15, 0xd4, 0xd6, 0x32, 0x72, - 0x5e, 0xb1, 0xad, 0xf0, 0x31, 0xfd, 0xca, 0x1b, 0x52, 0x75, 0xb6, 0x73, - 0xc0, 0xf1, 0x06, 0x98, 0xbe, 0x7f, 0x39, 0xcb, 0x2c, 0x31, 0xd6, 0x1d, - 0xa7, 0x7f, 0x68, 0x43, 0x82, 0x9e, 0x84, 0x06, 0x9f, 0x54, 0xe1, 0xc9, - 0x0b, 0xc5, 0xf2, 0x53, 0x97, 0x89, 0x60, 0xba, 0xfe, 0xb2, 0xbb, 0x6c, - 0x6d, 0xbe, 0xa3, 0xce, 0xcb, 0xc6, 0xe7, 0x19, 0x82, 0xe5, 0x56, 0x33, - 0x46, 0xc6, 0x21, 0xbc, 0xe9, 0x80, 0xd2, 0x2f, 0x51, 0x1a, 0x12, 0x0d, - 0xf4, 0xd7, 0x11, 0x8b, 0xb3, 0x7e, 0xa5, 0xd7, 0x06, 0x01, 0xc9, 0xe0, - 0x48, 0x49, 0xa1, 0x53, 0x0c, 0xe1, 0x42, 0x1c, 0x06, 0x25, 0x5d, 0x83, - 0xec, 0x5d, 0x2d, 0x0f, 0x01, 0xd2, 0x4a, 0x20, 0xd9, 0x3a, 0x68, 0x26, - 0x03, 0xec, 0x4c, 0x4a, 0x9c, 0x78, 0xa6, 0xe8, 0x4d, 0xda, 0x4f, 0x4d, - 0x52, 0xeb, 0x58, 0x8d, 0x88, 0x8a, 0xd3, 0x7e, 0x6f, 0xfa, 0x9d, 0x6d, - 0xf4, 0x1a, 0xc1, 0xa4, 0x68, 0xba, 0x7c, 0x47, 0xd4, 0x86, 0x0d, 0x32, - 0x4b, 0x74, 0x73, 0x28, 0x93, 0x56, 0xa8, 0xd8, 0xd6, 0x5c, 0x40, 0x23, - 0x90, 0xc0, 0x73, 0xd5, 0x67, 0xec, 0x40, 0x5a, 0x72, 0xe3, 0x99, 0xc6, - 0xf1, 0xdc, 0xac, 0x62, 0x9e, 0x30, 0x6f, 0x60, 0x0e, 0xca, 0x47, 0x2e, - 0x14, 0xdc, 0xaa, 0x95, 0x13, 0xb4, 0x2a, 0xa4, 0x66, 0xcb, 0x7a, 0xdc, - 0x9c, 0x38, 0xa0, 0x32, 0x47, 0xc7, 0x16, 0x46, 0xe1, 0xc7, 0x4c, 0x72, - 0x43, 0x21, 0x2e, 0x92, 0x7e, 0x3a, 0x09, 0xb6, 0x6f, 0x56, 0x18, 0x91, - 0xba, 0x08, 0xa7, 0xab, 0x0f, 0x95, 0xfb, 0x3d, 0x69, 0xb9, 0x69, 0x91, - 0x3f, 0xb7, 0x87, 0x2a, 0x0e, 0xe5, 0x16, 0xa5, 0x3a, 0x7f, 0x1a, 0x9e, - 0x8d, 0x58, 0x8e, 0x00, 0xcd, 0x53, 0xf0, 0xfc, 0xd9, 0xa4, 0xa0, 0xf9, - 0xf7, 0x14, 0x82, 0xaf, 0x54, 0x41, 0xfa, 0x98, 0xf5, 0xbe, 0x51, 0x63, - 0xef, 0xd8, 0x04, 0x4e, 0x5d, 0x3a, 0x1c, 0x48, 0x61, 0xa6, 0x70, 0x38, - 0xae, 0x55, 0xdf, 0x5b, 0xc3, 0xa6, 0x9a, 0x30, 0x48, 0x68, 0xa7, 0x42, - 0xc1, 0xe2, 0x2c, 0x46, 0x33, 0x7f, 0x38, 0xf5, 0x66, 0xda, 0xa1, 0xb1, - 0x55, 0x16, 0x2c, 0xc3, 0x57, 0xdc, 0xc9, 0x11, 0x7c, 0x0c, 0x9d, 0xe1, - 0xfc, 0x23, 0x79, 0xa3, 0x5f, 0x14, 0x06, 0x03, 0x50, 0x95, 0x60, 0x0b, - 0xae, 0x9f, 0x20, 0x31, 0xb6, 0xc0, 0xec, 0xf8, 0x4c, 0x16, 0x50, 0x35, - 0x39, 0x48, 0x1b, 0xd0, 0xa9, 0xa1, 0x4c, 0x55, 0x52, 0x38, 0xd1, 0xc4, - 0xcc, 0x88, 0x81, 0xf9, 0xfa, 0xeb, 0x04, 0x53, 0xb5, 0x42, 0x5d, 0x8b, - 0x3d, 0x39, 0x1b, 0x27, 0x73, 0x50, 0x13, 0xc8, 0x9c, 0x54, 0x61, 0x0c, - 0x1a, 0x57, 0xc5, 0x99, 0x45, 0x85, 0xd8, 0x9a, 0x36, 0x07, 0xa3, 0xe1, - 0x25, 0x0e, 0xde, 0xa5, 0xdf, 0xd2, 0xf0, 0xcf, 0x14, 0x08, 0x65, 0x28, - 0x8f, 0xb6, 0x0c, 0x16, 0x64, 0x59, 0x56, 0x42, 0xf7, 0xb4, 0x66, 0x8f, - 0xd7, 0x1d, 0x86, 0xef, 0x9e, 0x8c, 0xb1, 0xdd, 0x7f, 0x5e, 0x6c, 0x31, - 0x1c, 0xe2, 0xd5, 0x97, 0xa8, 0x8b, 0x0f, 0x64, 0x93, 0x7c, 0x91, 0xcd, - 0xc9, 0x61, 0x95, 0xeb, 0xe1, 0x42, 0x9b, 0x54, 0x41, 0x35, 0x90, 0xcb, - 0x26, 0xee, 0xfb, 0x6b, 0x10, 0x42, 0x93, 0x32, 0xcb, 0x4b, 0xd0, 0x8a, - 0xb5, 0xe6, 0x5e, 0xa1, 0x83, 0x07, 0xe5, 0x89, 0x13, 0x4f, 0x18, 0x4c, - 0x69, 0xdc, 0xf9, 0xd3, 0x23, 0x27, 0xfe, 0xeb, 0xad, 0x96, 0x06, 0x12, - 0x42, 0x9e, 0x6d, 0x8c, 0xdf, 0x3d, 0x29, 0x23, 0x88, 0x6a, 0x64, 0x67, - 0xd8, 0x5f, 0x5e, 0xcf, 0x00, 0xfb, 0x7e, 0x6e, 0x07, 0xfb, 0x04, 0x1a, - 0xcd, 0x07, 0x15, 0x86, 0x36, 0x39, 0xa7, 0x2e, 0xa5, 0x6d, 0x49, 0x7b, - 0x8f, 0x5b, 0x84, 0xd4, 0xd4, 0x88, 0x63, 0xcd, 0x96, 0x30, 0x96, 0x88, - 0xba, 0x75, 0xed, 0xd6, 0x0e, 0x24, 0xd7, 0x44, 0xf3, 0xfc, 0xb6, 0x41, - 0x49, 0x5e, 0xf1, 0x84, 0x95, 0xfd, 0x04, 0x2f, 0x86, 0x46, 0x37, 0x53, - 0x9c, 0x70, 0x7f, 0xdc, 0x8f, 0x7b, 0xe8, 0x44, 0xa2, 0x2e, 0xbe, 0xcf, - 0xae, 0xdf, 0x90, 0xf2, 0x6d, 0xb6, 0x0b, 0xc0, 0xe8, 0xb6, 0x64, 0xdf, - 0x4b, 0x3a, 0x1d, 0xb6, 0xf1, 0xed, 0x05, 0x7f, 0x63, 0x1e, 0xa2, 0x66, - 0x24, 0x0a, 0x20, 0xba, 0xe5, 0xa4, 0xbe, 0x4e, 0x23, 0xda, 0xff, 0x54, - 0x3a, 0xe3, 0xd4, 0x28, 0x14, 0x00, 0x74, 0xad, 0x19, 0xa5, 0xe3, 0x85, - 0xb3, 0x45, 0x1d, 0x52, 0x3c, 0x0f, 0x3a, 0x46, 0x4c, 0x29, 0x41, 0xf5, - 0x5b, 0x94, 0xcb, 0x3c, 0x0e, 0x6d, 0x50, 0x95, 0xca, 0x4b, 0x23, 0x1b, - 0x17, 0x96, 0x93, 0x0d, 0xe5, 0x4c, 0xfd, 0x8f, 0x04, 0x91, 0xad, 0x9b, - 0x1e, 0xfe, 0xab, 0xbc, 0xe7, 0x2c, 0x80, 0xe5, 0xdc, 0xf2, 0xc8, 0x8c, - 0x03, 0x74, 0x95, 0xd7, 0xe7, 0x15, 0x90, 0xf4, 0x81, 0x86, 0xb9, 0x09, - 0x98, 0x67, 0xa2, 0xc5, 0x55, 0x08, 0xbf, 0xb2, 0xb8, 0x4a, 0x6b, 0x0b, - 0xd2, 0x35, 0xa1, 0x0a, 0xd2, 0x3d, 0x17, 0x8a, 0x78, 0xd7, 0x01, 0x1b, - 0x68, 0xea, 0x65, 0x07, 0x45, 0xa6, 0xe4, 0x42, 0x1e, 0x7e, 0x6a, 0x63, - 0xb6, 0x1d, 0x30, 0x99, 0x45, 0x28, 0x54, 0x22, 0x27, 0xba, 0x3e, 0x67, - 0xbb, 0x92, 0x1e, 0xb0, 0xba, 0xaa, 0x0b, 0xed, 0x57, 0x1d, 0xf8, 0x37, - 0x85, 0x03, 0x01, 0x81, 0x25, 0xfb, 0xe9, 0xfe, 0x94, 0xef, 0x55, 0x15, - 0xb7, 0xcc, 0x76, 0x21, 0x9e, 0xd2, 0x56, 0x40, 0xf9, 0x02, 0x05, 0x09, - 0x4f, 0x22, 0xea, 0x2d, 0xbf, 0x73, 0x10, 0x0c, 0x8a, 0x82, 0x34, 0x79, - 0x3a, 0x3a, 0xce, 0xe1, 0x97, 0xc4, 0x3b, 0xef, 0xa7, 0xe0, 0x60, 0x59, - 0x27, 0x4b, 0x56, 0xa7, 0x8d, 0xda, 0x36, 0x12, 0x0b, 0x77, 0x9f, 0x83, - 0xb3, 0x4f, 0xad, 0x11, 0x8e, 0x88, 0x9f, 0x64, 0xd7, 0x39, 0x37, 0xc9, - 0xf9, 0xad, 0xae, 0x91, 0xd2, 0x65, 0xf7, 0x40, 0x61, 0x07, 0x9a, 0x21, - 0x05, 0x12, 0x49, 0x53, 0x18, 0xb8, 0xa1, 0x59, 0x1e, 0x58, 0xd7, 0xb7, - 0xe4, 0x36, 0x58, 0x74, 0x95, 0x0f, 0x5a, 0xf8, 0x70, 0xaa, 0xa8, 0x2a, - 0xc5, 0x76, 0xf2, 0x43, 0x11, 0x48, 0x60, 0x7e, 0x66, 0xe0, 0xc1, 0x92, - 0x5f, 0xbf, 0x4c, 0x93, 0xd1, 0x49, 0xf3, 0x8d, 0x2e, 0xbe, 0x59, 0xb4, - 0xa7, 0xbf, 0x5c, 0x62, 0x54, 0xa6, 0x00, 0x64, 0xd8, 0x76, 0x76, 0x84, - 0x61, 0x4f, 0x9f, 0x44, 0xe8, 0xc5, 0xe6, 0xf0, 0x52, 0x58, 0xcc, 0x7c, - 0xb3, 0x54, 0x4d, 0xb5, 0x4c, 0xef, 0x46, 0xad, 0x64, 0x6d, 0x38, 0x4a, - 0x53, 0xde, 0xed, 0xf6, 0x2a, 0x35, 0x2d, 0x17, 0x38, 0x76, 0x34, 0x78, - 0xcf, 0x50, 0x8d, 0x3f, 0x7a, 0x5b, 0x83, 0x0c, 0xbd, 0x09, 0xb2, 0x6a, - 0x11, 0x8f, 0xbe, 0x09, 0x98, 0xdc, 0x6a, 0x66, 0x11, 0x32, 0x7a, 0x68, - 0x0e, 0xd5, 0x84, 0x94, 0x4c, 0xa5, 0x2b, 0x6b, 0x39, 0xe1, 0x84, 0x8d, - 0x79, 0xbd, 0x16, 0x60, 0x26, 0x39, 0x05, 0x59, 0x7b, 0x81, 0x90, 0x73, - 0xaa, 0xaa, 0x27, 0xb4, 0x0b, 0x19, 0x82, 0xb2, 0x16, 0xf1, 0x82, 0xf0, - 0xb3, 0x44, 0x88, 0xf6, 0x05, 0xff, 0x4a, 0x68, 0xa8, 0xf1, 0x0d, 0xd4, - 0xb7, 0x1b, 0xab, 0x8e, 0xf3, 0x5b, 0x5e, 0xde, 0x94, 0x34, 0x3a, 0x92, - 0x9e, 0x7f, 0xd7, 0x98, 0xd8, 0x99, 0x0b, 0x3b, 0x20, 0xab, 0xa9, 0x3e, - 0xaf, 0xd8, 0x15, 0xd3, 0x50, 0x4b, 0x1f, 0x32, 0xfc, 0x39, 0x63, 0xff, - 0x39, 0x01, 0x9c, 0x88, 0xf5, 0x61, 0xd0, 0x7d, 0xe2, 0xbf, 0xd4, 0xcd, - 0xd7, 0xc4, 0x93, 0x76, 0x42, 0x86, 0x8b, 0xe5, 0x98, 0xd7, 0x54, 0x87, - 0xc4, 0x1f, 0x96, 0xe6, 0x5a, 0x7e, 0x44, 0xb2, 0x32, 0x5d, 0x4a, 0xca, - 0x23, 0xe7, 0xe9, 0xfa, 0x5a, 0xa7, 0x9a, 0x06, 0x05, 0x18, 0xb9, 0x20, - 0x05, 0x8b, 0x41, 0x1d, 0x1c, 0x40, 0xd0, 0x6c, 0xe5, 0xe1, 0x0c, 0x1f, - 0xfa, 0xf6, 0xf8, 0xdb, 0x28, 0xa8, 0xf5, 0x51, 0x29, 0xe8, 0x45, 0x5a, - 0x4b, 0xdb, 0x49, 0x18, 0xe8, 0x54, 0xa2, 0x60, 0xb2, 0x95, 0xea, 0x27, - 0x0c, 0x2f, 0xcc, 0x05, 0x81, 0x56, 0x5f, 0x92, 0x6a, 0xba, 0x69, 0x27, - 0x55, 0x93, 0xb0, 0x90, 0x27, 0xab, 0xf3, 0x7f, 0x46, 0x46, 0x10, 0x39, - 0x57, 0x67, 0x5e, 0x7d, 0x52, 0xba, 0x9e, 0x6d, 0x44, 0x1b, 0x22, 0x1a, - 0x7e, 0xb0, 0x13, 0x50, 0x1c, 0x79, 0xa8, 0x6b, 0x34, 0xb1, 0xb0, 0x3c, - 0x03, 0x97, 0xbc, 0xad, 0x98, 0x15, 0x5b, 0x07, 0x94, 0x09, 0xc9, 0x17, - 0x82, 0xd1, 0x5f, 0xe7, 0xd1, 0xb0, 0x22, 0xa9, 0x6c, 0xc0, 0x4f, 0x13, - 0x0c, 0x15, 0x44, 0xda, 0xee, 0x49, 0x45, 0xaf, 0x1c, 0xb8, 0x5a, 0x6d, - 0x12, 0xd9, 0x75, 0x66, 0x03, 0xf0, 0x01, 0x8e, 0xda, 0x78, 0xb0, 0xe5, - 0x54, 0xb5, 0xb3, 0x3e, 0xc9, 0x5a, 0x20, 0x67, 0x44, 0x48, 0x2e, 0x21, - 0x4a, 0xc7, 0xb1, 0x83, 0xeb, 0xbb, 0x33, 0x1a, 0x9b, 0x68, 0x0f, 0x32, - 0x4b, 0x7c, 0x81, 0xe6, 0x09, 0xa3, 0xab, 0xf9, 0xa6, 0x85, 0x70, 0x13, - 0x88, 0xb1, 0x20, 0x0d, 0x6c, 0x2e, 0xbe, 0x42, 0xe6, 0x04, 0x05, 0x3a, - 0x5c, 0x10, 0x93, 0x07, 0x58, 0xe0, 0xb2, 0x0d, 0x5f, 0x9a, 0x9e, 0x77, - 0x7a, 0xaf, 0x53, 0x05, 0xe1, 0xfb, 0x14, 0xfe, 0xf8, 0x7d, 0x91, 0x18, - 0x6e, 0x85, 0xc1, 0x24, 0x9f, 0x67, 0xe7, 0x7f, 0x43, 0xe6, 0x06, 0x35, - 0x4b, 0x83, 0xf9, 0x65, 0xcf, 0x04, 0xdb, 0x4a, 0xc6, 0x71, 0x56, 0xca, - 0xd1, 0xa6, 0xeb, 0x83, 0xa6, 0x92, 0x8d, 0xff, 0x18, 0xa8, 0xda, 0xc9, - 0xf7, 0x95, 0x66, 0x48, 0x40, 0x2d, 0xc7, 0xf6, 0xda, 0x39, 0x0f, 0x2c, - 0xa4, 0x46, 0x36, 0xd7, 0x68, 0x5e, 0x96, 0xdd, 0x6e, 0x2f, 0xbd, 0x2c, - 0x8e, 0x81, 0xde, 0xac, 0xd2, 0x50, 0x5c, 0x15, 0xf1, 0x0e, 0x74, 0xe8, - 0xab, 0x02, 0xe5, 0x26, 0x47, 0x81, 0xa0, 0x14, 0x99, 0x60, 0x0d, 0xbc, - 0x82, 0x58, 0x4a, 0xe9, 0x4b, 0x43, 0xa7, 0x23, 0x81, 0x30, 0xcb, 0xe4, - 0x5d, 0x28, 0x9f, 0x45, 0x44, 0xad, 0x32, 0xf7, 0xac, 0x37, 0xd9, 0xcc, - 0x97, 0x64, 0xeb, 0x42, 0x43, 0xa8, 0xac, 0x36, 0xf8, 0x99, 0x58, 0x16, - 0xaa, 0x0c, 0xca, 0x4e, 0x17, 0x8e, 0x39, 0x20, 0x01, 0xbb, 0xcf, 0xb0, - 0xd7, 0x4c, 0x54, 0x45, 0x0f, 0xde, 0x94, 0xc3, 0x0f, 0x99, 0x98, 0x5c, - 0xe6, 0xf6, 0xdc, 0x73, 0xf9, 0xfe, 0xe3, 0xd9, 0x1c, 0xf8, 0xc6, 0x1b, - 0x11, 0x4a, 0xb9, 0x3d, 0xbf, 0xda, 0x5a, 0x30, 0x21, 0x40, 0xf8, 0x5b, - 0x01, 0x60, 0xe5, 0xe7, 0xbd, 0x91, 0x67, 0xcc, 0x02, 0x4f, 0x0e, 0x76, - 0x5e, 0xc9, 0x61, 0x95, 0x76, 0x3e, 0xb9, 0x8d, 0x87, 0xbd, 0x64, 0x45, - 0x7c, 0xbe, 0xe4, 0x6e, 0x4d, 0x9d, 0x8c, 0xcd, 0x64, 0x6b, 0xdc, 0x9d, - 0xda, 0xdc, 0xb5, 0x95, 0xe3, 0xc1, 0x7a, 0xe6, 0x80, 0x5a, 0xcd, 0x04, - 0xce, 0x8e, 0x65, 0xf1, 0x6a, 0xb2, 0x91, 0x1c, 0x6b, 0x56, 0xeb, 0x55, - 0x95, 0xc7, 0x19, 0x27, 0x57, 0xd5, 0xf2, 0x0f, 0xa5, 0x08, 0x4b, 0xdb, - 0x84, 0xe0, 0xa7, 0x63, 0x8c, 0x5a, 0x87, 0x8d, 0x13, 0x77, 0x54, 0x2d, - 0x37, 0xe5, 0x8a, 0xf3, 0x64, 0x1f, 0xb2, 0xed, 0xc5, 0x57, 0xe5, 0x1c, - 0xf0, 0xc6, 0xd4, 0xb1, 0x57, 0xc5, 0x9e, 0x50, 0x3b, 0xf1, 0xbf, 0x19, - 0x67, 0x77, 0xae, 0x37, 0xc4, 0x31, 0xff, 0xb7, 0x95, 0x49, 0xaf, 0xd0, - 0xdc, 0x95, 0x8b, 0xb8, 0xb2, 0x63, 0x9c, 0x3b, 0x61, 0x27, 0x4b, 0x4c, - 0xc0, 0x9b, 0x3a, 0x73, 0x6b, 0xbc, 0xb5, 0x8b, 0x29, 0x5c, 0xcb, 0xc7, - 0x32, 0x61, 0xb1, 0x25, 0xca, 0x20, 0x75, 0x33, 0xbe, 0x56, 0x27, 0x38, - 0x3d, 0x75, 0x1d, 0x6c, 0x44, 0x65, 0xf0, 0xe8, 0x26, 0xfa, 0x04, 0x5b, - 0x36, 0xe4, 0xc9, 0x19, 0x95, 0x68, 0x06, 0x89, 0x8f, 0xf4, 0x2f, 0x57, - 0x73, 0x8c, 0x7e, 0x77, 0x20, 0xdd, 0x89, 0x1e, 0xbf, 0x58, 0x2e, 0x46, - 0x22, 0xc0, 0x78, 0xcf, 0x1c, 0xd5, 0xb0, 0x49, 0xaf, 0x30, 0xc6, 0x17, - 0x1a, 0xc3, 0xb8, 0xe6, 0x67, 0x1e, 0x55, 0x50, 0xed, 0xce, 0x85, 0x0f, - 0x6b, 0xd9, 0x13, 0xc4, 0x33, 0x82, 0xe6, 0x0e, 0x1d, 0xe0, 0xe7, 0xb8, - 0x62, 0x21, 0x13, 0x8b, 0xcd, 0xb2, 0x98, 0x49, 0x29, 0xb3, 0x4a, 0xa1, - 0xca, 0xba, 0x23, 0xba, 0xf9, 0x6b, 0x0e, 0x7d, 0xed, 0x61, 0x65, 0xf1, - 0x3c, 0x67, 0x51, 0x86, 0x33, 0x39, 0xee, 0x1e, 0xb8, 0xdf, 0xbc, 0x21, - 0x08, 0x11, 0x87, 0x9e, 0xc5, 0xc7, 0xd6, 0x4b, 0xd4, 0x12, 0x91, 0x84, - 0x38, 0xb7, 0x20, 0xf3, 0x3e, 0x1d, 0x50, 0xa7, 0xb2, 0x05, 0xb8, 0xa5, - 0x32, 0xf1, 0xe8, 0x4d, 0x2f, 0x37, 0xf1, 0xa5, 0x44, 0xeb, 0x9d, 0xc6, - 0xa2, 0xb8, 0x7d, 0x26, 0x53, 0x8a, 0xfb, 0x19, 0x3a, 0xb5, 0x49, 0xb7, - 0x43, 0x45, 0x5c, 0xa5, 0xef, 0xe3, 0xed, 0x00, 0x18, 0x3a, 0xcf, 0xd6, - 0xa0, 0x51, 0x42, 0x60, 0x46, 0x7e, 0xa1, 0xf8, 0x94, 0x83, 0xa2, 0x16, - 0x5b, 0xb2, 0x50, 0xb5, 0x2f, 0x73, 0xf9, 0x0e, 0x32, 0xa0, 0x97, 0x01, - 0x04, 0x0d, 0x3b, 0xfb, 0xca, 0x78, 0x06, 0xfb, 0x73, 0x86, 0x4b, 0xf6, - 0xe0, 0x1a, 0x9f, 0x59, 0x61, 0xea, 0x19, 0x70, 0xd3, 0x43, 0xe7, 0xd1, - 0x81, 0xfc, 0x0e, 0x44, 0xbf, 0x7c, 0xb3, 0xcf, 0xff, 0xcc, 0x20, 0x41, - 0xab, 0x36, 0x90, 0xf6, 0x53, 0x2b, 0x38, 0x05, 0x04, 0xbc, 0x98, 0xec, - 0xbd, 0xa6, 0x8e, 0xd2, 0x62, 0xa3, 0xc4, 0x58, 0x96, 0x04, 0x6a, 0x5c, - 0xe5, 0x32, 0x1d, 0x23, 0xb5, 0x8d, 0xeb, 0x5e, 0xcc, 0x38, 0xf4, 0xa8, - 0x99, 0xe4, 0x6e, 0xc7, 0x5a, 0x58, 0xd6, 0xfe, 0xd9, 0x2c, 0x9e, 0x67, - 0x77, 0xfd, 0x9c, 0x2b, 0xa3, 0x42, 0xf6, 0x7d, 0x72, 0x16, 0x18, 0x6a, - 0x96, 0x74, 0x1e, 0x47, 0x84, 0x55, 0x8b, 0x6b, 0x36, 0xd7, 0x91, 0x9c, - 0x43, 0x30, 0xf9, 0x36, 0x98, 0x95, 0x38, 0xfb, 0xe0, 0xab, 0xa3, 0xa0, - 0xc1, 0x74, 0x43, 0x9b, 0xe3, 0x1b, 0x30, 0x53, 0x57, 0xd3, 0x2a, 0x92, - 0x19, 0x11, 0x70, 0x40, 0x7d, 0xba, 0x42, 0x69, 0xdb, 0x96, 0x88, 0x34, - 0x0d, 0xaf, 0xfe, 0xcc, 0xf3, 0xad, 0x55, 0xf2, 0xb1, 0x00, 0xaf, 0x35, - 0x91, 0xa1, 0x85, 0xfd, 0x9a, 0xae, 0xd5, 0x32, 0x5b, 0x8f, 0x00, 0x74, - 0x20, 0xd6, 0x1d, 0x2a, 0xc5, 0x1e, 0x50, 0x62, 0xe9, 0xca, 0xa0, 0xcc, - 0x74, 0x36, 0x4e, 0xd4, 0xb3, 0xf3, 0xb5, 0x41, 0xa3, 0xa9, 0xdd, 0x9e, - 0x89, 0x26, 0xff, 0x5b, 0x75, 0x1e, 0xb0, 0x20, 0x52, 0x7e, 0x65, 0x4c, - 0xc0, 0x4d, 0x58, 0xeb, 0xd6, 0x08, 0x59, 0x1b, 0xf8, 0xfe, 0x87, 0xd7, - 0xcf, 0x8c, 0x6e, 0x85, 0xb4, 0xe8, 0x5c, 0xc8, 0xdb, 0x4e, 0xf4, 0x78, - 0x7a, 0xc8, 0x6f, 0x9a, 0x8b, 0x60, 0xcc, 0xb3, 0x41, 0x4f, 0x47, 0xab, - 0xaf, 0xf2, 0x02, 0xaf, 0x0a, 0xb7, 0xea, 0x4b, 0x35, 0x77, 0xe2, 0x6f, - 0x4d, 0x58, 0x7e, 0xe9, 0x75, 0x02, 0xa3, 0x47, 0x5a, 0x55, 0xa8, 0x2c, - 0x74, 0x2b, 0x0a, 0x26, 0x5b, 0x5b, 0x0c, 0x89, 0xab, 0xa8, 0x88, 0xd0, - 0xbe, 0x42, 0xfd, 0x5c, 0xc1, 0xb0, 0x95, 0x2a, 0x12, 0x41, 0x3e, 0xa8, - 0x11, 0x7e, 0x76, 0x84, 0x46, 0xcb, 0xfe, 0x03, 0x21, 0x57, 0x13, 0x77, - 0x95, 0xa6, 0x7b, 0xe1, 0x75, 0x03, 0x8c, 0x9b, 0x7f, 0xf6, 0x8b, 0x48, - 0x7d, 0xbe, 0x65, 0xb5, 0x80, 0xca, 0x43, 0xae, 0x15, 0xd1, 0x5d, 0x90, - 0x51, 0xff, 0xc9, 0xd9, 0x0d, 0xa7, 0xac, 0xe8, 0x81, 0x89, 0xfa, 0xc5, - 0x96, 0x4b, 0xdf, 0x40, 0xd5, 0x70, 0xf8, 0xa2, 0x03, 0x25, 0x7a, 0x23, - 0x51, 0xdb, 0x02, 0x7e, 0x86, 0xd7, 0xea, 0xe6, 0x85, 0xd1, 0xc9, 0xb9, - 0xa0, 0x0d, 0x49, 0xe3, 0xcf, 0x88, 0xcc, 0xab, 0x01, 0xfb, 0xe1, 0x48, - 0xa0, 0x5e, 0x2c, 0xf3, 0x79, 0x09, 0x88, 0xb4, 0x42, 0xa5, 0x1d, 0xf7, - 0x2d, 0xb8, 0x29, 0x53, 0x34, 0xe0, 0x27, 0xd0, 0xac, 0x91, 0x8d, 0x46, - 0x4f, 0x59, 0x8b, 0x76, 0xe7, 0x57, 0x0c, 0xd3, 0x49, 0x4b, 0x66, 0xbc, - 0xa2, 0x02, 0x7c, 0x4a, 0xce, 0x33, 0xcf, 0x99, 0xf1, 0x48, 0xe4, 0xd0, - 0x12, 0xc0, 0x66, 0x9a, 0x34, 0xb1, 0xc6, 0xc9, 0x65, 0x84, 0x58, 0x20, - 0xda, 0xcb, 0x79, 0x73, 0x56, 0x25, 0x81, 0xef, 0x65, 0x37, 0xa2, 0x7c, - 0x5e, 0xab, 0xbe, 0xd1, 0xfe, 0x0a, 0x31, 0xe9, 0xf4, 0xc0, 0x6f, 0x62, - 0x75, 0xfe, 0x65, 0x08, 0xc6, 0x28, 0x73, 0x9f, 0x3b, 0x66, 0x5b, 0x45, - 0x75, 0x3d, 0x64, 0x4d, 0xe3, 0xd5, 0x5a, 0x85, 0xb8, 0x4d, 0x02, 0x5c, - 0x35, 0x3d, 0xe4, 0xa4, 0x9f, 0x60, 0x5c, 0xf2, 0x31, 0xfe, 0xeb, 0x6c, - 0xb7, 0x89, 0x9c, 0x49, 0x8a, 0xae, 0xbc, 0x63, 0x16, 0x2f, 0x98, 0xd0, - 0xe1, 0x78, 0xdf, 0x9b, 0x03, 0xe2, 0x34, 0x22, 0x34, 0xb2, 0x04, 0x32, - 0xf5, 0x69, 0xbf, 0xfc, 0x68, 0xd1, 0x40, 0xc4, 0x92, 0x15, 0x16, 0x32, - 0x48, 0xba, 0x53, 0x3d, 0xa0, 0xcb, 0x24, 0x7a, 0x12, 0x3c, 0xee, 0x3a, - 0x5f, 0xd2, 0x9e, 0xbc, 0xba, 0xa2, 0xc6, 0x0d, 0x33, 0x2b, 0x3c, 0x43, - 0x0b, 0x05, 0x04, 0x62, 0xd0, 0x3d, 0x9b, 0x14, 0xd9, 0x09, 0x85, 0x1c, - 0xd0, 0x6d, 0x4f, 0x23, 0x9e, 0xff, 0x13, 0x22, 0xb1, 0x84, 0x91, 0x1c, - 0x2d, 0xde, 0xc8, 0x24, 0xe6, 0x29, 0x13, 0x82, 0xa7, 0x64, 0xb7, 0xb6, - 0x3e, 0xf4, 0xfe, 0xa0, 0xed, 0x58, 0x10, 0x90, 0x48, 0x02, 0xba, 0x22, - 0x07, 0xcf, 0x56, 0x79, 0x71, 0xc9, 0x63, 0x9c, 0x67, 0xcd, 0x4a, 0xf7, - 0x58, 0x42, 0x62, 0x95, 0xef, 0xd1, 0x1c, 0x41, 0x6c, 0xdf, 0x84, 0x59, - 0x6f, 0x28, 0xa4, 0x49, 0x19, 0x23, 0x60, 0xf6, 0x89, 0xfd, 0x94, 0x3e, - 0xb2, 0xf3, 0x0f, 0x86, 0x9b, 0x76, 0x6e, 0xc6, 0x48, 0xeb, 0x99, 0x9f, - 0xd9, 0xbe, 0x91, 0x73, 0x14, 0x04, 0x3f, 0x9e, 0x2c, 0x1c, 0x4d, 0x9b, - 0x20, 0xbd, 0xa3, 0x91, 0x7b, 0x3e, 0xe1, 0xe8, 0x83, 0x2e, 0x64, 0xea, - 0xbe, 0xd8, 0xa6, 0xcb, 0xe9, 0x12, 0x19, 0xdd, 0x12, 0x15, 0x81, 0xf6, - 0x02, 0x72, 0x44, 0x39, 0xa4, 0xd3, 0xbb, 0x38, 0xcc, 0xe7, 0xfa, 0x06, - 0x0f, 0x1e, 0x17, 0x34, 0x97, 0x2a, 0x9c, 0xbd, 0x77, 0x6c, 0xc8, 0x35, - 0x9e, 0x85, 0xae, 0x75, 0xc0, 0xf3, 0x80, 0x29, 0x1f, 0xb4, 0x7a, 0x09, - 0xab, 0xcc, 0xfd, 0x1a, 0x65, 0xff, 0xee, 0x2c, 0x8f, 0x97, 0x5e, 0xf5, - 0x52, 0xfe, 0x90, 0xdf, 0x2d, 0x67, 0x59, 0xb2, 0x04, 0x9c, 0x94, 0xa8, - 0xfd, 0xf1, 0x89, 0x25, 0xdc, 0x6e, 0x04, 0x1c, 0xa1, 0xa0, 0x6a, 0xf9, - 0xac, 0x15, 0x3f, 0x83, 0x3d, 0x1f, 0x32, 0x8c, 0x0d, 0x06, 0xcf, 0x6a, - 0x21, 0xab, 0x7a, 0x38, 0xd7, 0xcd, 0x8f, 0x67, 0x89, 0x53, 0x10, 0xb3, - 0xdf, 0x39, 0xbc, 0x53, 0xa0, 0xa8, 0x48, 0xda, 0x2d, 0x61, 0x07, 0x17, - 0x4a, 0xd3, 0xb1, 0x98, 0x8a, 0xf1, 0x61, 0x99, 0x0e, 0x6e, 0x6c, 0x59, - 0x6b, 0xa3, 0xb3, 0x2a, 0x50, 0x12, 0x75, 0xf0, 0xd9, 0xd2, 0xe2, 0x7a, - 0xc1, 0x13, 0x27, 0x52, 0x48, 0x8b, 0xe3, 0x39, 0x06, 0x86, 0x39, 0xd7, - 0x00, 0x6e, 0x00, 0xc6, 0x15, 0x58, 0x3c, 0xb8, 0x3b, 0x14, 0x05, 0xa6, - 0xf1, 0x89, 0x5b, 0x89, 0x84, 0xd0, 0x1b, 0x3c, 0xea, 0x67, 0x98, 0x5b, - 0xa9, 0x7e, 0x90, 0xa2, 0xa2, 0x93, 0x8c, 0x2b, 0xea, 0x4c, 0xa9, 0x71, - 0x33, 0x9f, 0x9a, 0x30, 0xa7, 0xb1, 0x70, 0xf0, 0xc6, 0x23, 0x31, 0xdb, - 0xe4, 0x92, 0x66, 0xce, 0xad, 0x6b, 0xfb, 0x87, 0xb1, 0x6f, 0x89, 0xe8, - 0x64, 0x56, 0xf3, 0xc7, 0x63, 0x5c, 0xd8, 0x5a, 0xbe, 0x38, 0x5c, 0xaf, - 0xd3, 0x60, 0x6d, 0xc9, 0x74, 0xe9, 0xcf, 0x4d, 0x63, 0xbc, 0x88, 0x2a, - 0xce, 0x11, 0x05, 0x7d, 0xcd, 0x96, 0x54, 0x5d, 0xd5, 0x6f, 0x6d, 0x02, - 0xd2, 0x6f, 0xf4, 0x90, 0x9d, 0x37, 0xff, 0x86, 0x0a, 0x16, 0xc6, 0xc9, - 0xe7, 0x13, 0xf7, 0x8c, 0x06, 0x1a, 0x03, 0x89, 0x46, 0xef, 0xc0, 0x44, - 0x7d, 0xab, 0x84, 0x96, 0x02, 0x42, 0x62, 0x90, 0xef, 0x85, 0x9a, 0x55, - 0xba, 0x67, 0xcd, 0x73, 0xd7, 0x0b, 0x42, 0x93, 0xf9, 0xe2, 0xd6, 0xd6, - 0x3e, 0x3f, 0xeb, 0xa4, 0x9f, 0x92, 0xcf, 0xf9, 0xc9, 0xeb, 0x68, 0xd5, - 0x34, 0x35, 0xbe, 0x6b, 0xd1, 0x82, 0x21, 0xa6, 0x7d, 0x44, 0xa0, 0x3a, - 0x62, 0x5c, 0x99, 0xfb, 0xae, 0xe2, 0x34, 0x48, 0x23, 0x0b, 0x5a, 0x98, - 0xf6, 0x75, 0x70, 0xe9, 0x23, 0xdd, 0x56, 0x72, 0x6c, 0x83, 0x20, 0xf0, - 0xd5, 0x63, 0x29, 0x6b, 0xcc, 0xd1, 0x29, 0xc1, 0xa7, 0x2d, 0x4b, 0xf2, - 0xdc, 0xa8, 0x1b, 0x14, 0x85, 0xba, 0x6b, 0xca, 0x30, 0xae, 0xdc, 0xa5, - 0xbd, 0x91, 0x70, 0xd2, 0x1c, 0x3e, 0xff, 0x99, 0x52, 0xb3, 0xae, 0x47, - 0x20, 0xab, 0x06, 0xc9, 0x61, 0x1e, 0x52, 0xbf, 0x08, 0xb4, 0x50, 0x2b, - 0xd7, 0x96, 0x2d, 0x01, 0x89, 0x21, 0xd2, 0x74, 0x22, 0x22, 0xdd, 0x7a, - 0x18, 0x4d, 0x2d, 0x62, 0x07, 0xbd, 0x74, 0x8a, 0xa1, 0x9e, 0x7f, 0xbc, - 0x34, 0x61, 0x8b, 0xe9, 0xf3, 0x73, 0x6d, 0x46, 0xc5, 0x67, 0xea, 0x3b, - 0x5e, 0xbb, 0xb4, 0x6d, 0x19, 0x43, 0x29, 0xe2, 0x34, 0xfc, 0x02, 0x70, - 0x26, 0x17, 0x07, 0x2a, 0x01, 0x82, 0x3e, 0xdf, 0xf3, 0xec, 0xba, 0xd5, - 0x3a, 0x8b, 0x43, 0x59, 0xb7, 0x62, 0xab, 0x3e, 0xfa, 0xf3, 0xc2, 0xc0, - 0xba, 0x07, 0xef, 0x30, 0x93, 0x94, 0xf6, 0x3d, 0xbe, 0x32, 0xa0, 0xe2, - 0x20, 0xd3, 0x1d, 0x5f, 0x68, 0x5d, 0x1b, 0x85, 0x68, 0xee, 0x63, 0x4b, - 0x1f, 0xa8, 0x9e, 0xaa, 0xa2, 0xf1, 0x12, 0x2e, 0x8f, 0x58, 0xc6, 0x37, - 0xc6, 0x4b, 0x18, 0x8f, 0x04, 0x24, 0x1f, 0x08, 0xb0, 0xe5, 0x68, 0x02, - 0x6b, 0x99, 0xe2, 0xfb, 0x0d, 0xfc, 0x3f, 0x61, 0x05, 0xcb, 0x59, 0x99, - 0xc7, 0x67, 0xfe, 0x34, 0x13, 0x3d, 0x7e, 0x1b, 0xb9, 0x57, 0x14, 0x6a, - 0x34, 0x11, 0x05, 0xfa, 0xc7, 0x64, 0x5f, 0x96, 0xe3, 0x9e, 0x23, 0x68, - 0x1d, 0xdb, 0x2d, 0x39, 0x31, 0x56, 0x1a, 0xf9, 0xa2, 0xf2, 0xe8, 0xb9, - 0x30, 0x0e, 0xa9, 0x83, 0x3e, 0xb5, 0xab, 0x70, 0x0f, 0x18, 0x67, 0xe3, - 0x87, 0xda, 0xb9, 0x34, 0xda, 0x58, 0x84, 0x1f, 0xb6, 0x89, 0xe7, 0x81, - 0x44, 0x28, 0xf2, 0xe2, 0x71, 0x02, 0xbd, 0x9b, 0x70, 0x5e, 0x85, 0x3b, - 0x71, 0x5b, 0x6d, 0x80, 0x54, 0xaa, 0xd8, 0xc3, 0x21, 0x00, 0x1b, 0x68, - 0x3a, 0x31, 0xb3, 0x94, 0xae, 0x49, 0x71, 0x9c, 0x7c, 0xec, 0xe4, 0x26, - 0x24, 0xb1, 0xa7, 0x24, 0x4d, 0xcf, 0x18, 0xec, 0x96, 0x5a, 0x5d, 0x47, - 0xea, 0x3c, 0x9c, 0x62, 0x41, 0x5f, 0xe6, 0xd2, 0x92, 0x5b, 0xba, 0x81, - 0x1a, 0x96, 0x58, 0xd8, 0x62, 0x05, 0xa9, 0x9a, 0xbd, 0xc0, 0xd8, 0x6a, - 0xad, 0x23, 0x02, 0x5d, 0xa4, 0xf3, 0x7e, 0xa8, 0x2d, 0xf5, 0xd7, 0x37, - 0xf7, 0x44, 0x53, 0x82, 0x25, 0xb6, 0xc9, 0x10, 0x88, 0xe8, 0xe4, 0x75, - 0x68, 0x4e, 0xc1, 0x25, 0x40, 0x03, 0xab, 0x8c, 0x1a, 0x4a, 0xe7, 0xf3, - 0xe0, 0xac, 0x15, 0xd6, 0x24, 0xc2, 0xb9, 0x6c, 0x22, 0x62, 0xd4, 0xb5, - 0xec, 0xd7, 0x37, 0x33, 0x4a, 0x29, 0x6d, 0xe6, 0x6c, 0xaa, 0x24, 0x03, - 0x4d, 0x42, 0xb4, 0x15, 0x23, 0xb6, 0x0e, 0xeb, 0xe5, 0x4e, 0x79, 0x1c, - 0x9d, 0xc7, 0xd1, 0xad, 0xc0, 0xc6, 0xf5, 0x28, 0x36, 0xa2, 0xfd, 0xd7, - 0x9c, 0x6e, 0x53, 0xc8, 0x15, 0x8a, 0x60, 0x38, 0x8d, 0x97, 0xde, 0xfc, - 0xf9, 0x63, 0x58, 0x32, 0x89, 0x7c, 0xd0, 0x9f, 0x25, 0x51, 0x36, 0xa8, - 0x3f, 0x41, 0xf1, 0xf6, 0x32, 0x74, 0x05, 0x85, 0x60, 0x77, 0xe2, 0xac, - 0xf7, 0x30, 0x5f, 0x46, 0x8b, 0xa3, 0x74, 0x8a, 0x6b, 0x9f, 0xe9, 0x6f, - 0xfd, 0xcd, 0xb7, 0xb4, 0xf6, 0xf8, 0xab, 0x23, 0x64, 0x8b, 0xeb, 0x7c, - 0x95, 0xea, 0x58, 0xd5, 0x61, 0x3a, 0x76, 0x95, 0x74, 0x93, 0x38, 0x01, - 0xf0, 0x14, 0x28, 0x90, 0xd4, 0xeb, 0x30, 0x1a, 0x13, 0x4b, 0xb1, 0xd5, - 0x1b, 0x67, 0x36, 0xc7, 0x43, 0x0d, 0x74, 0x48, 0x30, 0x3f, 0x86, 0x39, - 0x77, 0xf6, 0x29, 0x0a, 0x12, 0x42, 0xc7, 0xb8, 0xa2, 0xd1, 0x73, 0x63, - 0x0f, 0x6f, 0xab, 0xed, 0x7d, 0xeb, 0x2c, 0xf8, 0x29, 0x56, 0x97, 0xe9, - 0x37, 0x89, 0x0b, 0xa7, 0xc9, 0x24, 0xea, 0x9f, 0x88, 0x3d, 0x5f, 0xeb, - 0xd3, 0x2e, 0x7f, 0xd3, 0x82, 0x0b, 0x6f, 0x12, 0xd4, 0x2e, 0x4c, 0xee, - 0xc7, 0xeb, 0xe5, 0x44, 0xef, 0xc7, 0x48, 0xe0, 0x65, 0xb3, 0xc8, 0xa1, - 0x88, 0xfb, 0x83, 0x0e, 0xa4, 0x52, 0x56, 0x24, 0x32, 0xc7, 0xe1, 0xf9, - 0xbd, 0x7f, 0x4c, 0x2c, 0x2d, 0x23, 0xff, 0xcd, 0x52, 0xba, 0xd5, 0x7f, - 0xf3, 0xb0, 0x22, 0x81, 0xb9, 0x65, 0xa1, 0x01, 0xe4, 0x30, 0xc3, 0x6a, - 0x9e, 0xc9, 0x49, 0x52, 0x80, 0x10, 0xee, 0xb7, 0x09, 0x3a, 0x54, 0x35, - 0x44, 0x89, 0x1e, 0x23, 0x38, 0xf6, 0xe7, 0x8e, 0x7a, 0xd0, 0x82, 0x0d, - 0x6d, 0x71, 0x6e, 0x57, 0x33, 0x45, 0x30, 0xb7, 0x59, 0xc0, 0xb8, 0xeb, - 0x80, 0x9c, 0x49, 0x0b, 0x5b, 0x7b, 0xf6, 0x65, 0x1b, 0x3c, 0x39, 0xdd, - 0x9c, 0xdc, 0x98, 0xb0, 0x2f, 0xf2, 0x92, 0x12, 0xe3, 0xc9, 0x2a, 0xa5, - 0x82, 0x4e, 0xe5, 0x27, 0x37, 0xec, 0xef, 0x1b, 0xef, 0x69, 0x0a, 0x50, - 0xcb, 0x5a, 0x94, 0x4a, 0x1e, 0xe9, 0x1b, 0x28, 0x36, 0xc1, 0x73, 0x5d, - 0x0d, 0x20, 0x10, 0x79, 0x30, 0x9b, 0xcf, 0x56, 0x0d, 0x74, 0x43, 0x10, - 0x0c, 0x1b, 0xa5, 0xe6, 0x98, 0x2a, 0x1d, 0x7a, 0xe7, 0xb3, 0x52, 0xd9, - 0xc6, 0xd6, 0xb2, 0x5b, 0x6f, 0x7c, 0xa6, 0x1d, 0x23, 0x1d, 0x1e, 0x00, - 0xb4, 0x42, 0x54, 0xc1, 0xa2, 0xd1, 0xb6, 0xf4, 0x91, 0x4a, 0x05, 0xf2, - 0x99, 0x5b, 0x97, 0xb2, 0x3c, 0xb4, 0xe2, 0xfd, 0x09, 0xd6, 0x92, 0x73, - 0x11, 0x3c, 0x3d, 0x73, 0x49, 0x84, 0x6c, 0x59, 0xd7, 0xb1, 0x91, 0xd4, - 0x68, 0x04, 0x3d, 0xdf, 0xa4, 0x0b, 0xb2, 0xce, 0xf0, 0xc8, 0xcb, 0xda, - 0x85, 0x92, 0x13, 0xa9, 0xee, 0x52, 0x4c, 0x33, 0x1c, 0x45, 0x8b, 0x60, - 0xed, 0x00, 0xcc, 0x4a, 0x5f, 0x45, 0xf5, 0x08, 0x3c, 0x45, 0x18, 0xe8, - 0x87, 0xf7, 0x89, 0x15, 0x7f, 0x02, 0xd9, 0xf8, 0x00, 0x25, 0xe2, 0x87, - 0xc1, 0xc7, 0x09, 0x8d, 0xc2, 0x72, 0x28, 0x07, 0x7a, 0x56, 0xdf, 0x9e, - 0x29, 0x04, 0x7a, 0xc8, 0x39, 0xb3, 0xb9, 0x5b, 0x2f, 0x58, 0xfb, 0xd1, - 0x43, 0xdb, 0x61, 0xa0, 0x4b, 0x1c, 0xfa, 0x16, 0x30, 0x09, 0xde, 0x71, - 0x86, 0x11, 0xb1, 0x08, 0x0f, 0x29, 0x24, 0x62, 0x38, 0x12, 0x92, 0xaf, - 0xdb, 0x2a, 0x2e, 0x96, 0xa7, 0x81, 0xa2, 0x37, 0x1e, 0xec, 0x32, 0xfb, - 0x52, 0x78, 0xd5, 0x46, 0x5e, 0xe8, 0x5f, 0x7b, 0x28, 0xcd, 0xb0, 0xa4, - 0x9f, 0x66, 0xdd, 0x52, 0xb8, 0x3d, 0xec, 0xa2, 0x8c, 0xaa, 0xf2, 0x08, - 0x52, 0x57, 0x89, 0x55, 0x4b, 0xd9, 0x71, 0x70, 0x50, 0xea, 0x71, 0x6f, - 0xfc, 0x61, 0xfe, 0x3c, 0x9e, 0x32, 0x7e, 0x7b, 0x24, 0x9b, 0x1f, 0xdc, - 0xd5, 0x3f, 0x91, 0x0c, 0x01, 0x4c, 0x43, 0xd2, 0x61, 0x34, 0x70, 0x1e, - 0x51, 0x4c, 0xa7, 0xa7, 0x46, 0x15, 0x34, 0x82, 0x7c, 0xa5, 0x82, 0xf6, - 0xed, 0x72, 0x41, 0xc9, 0x5f, 0xbd, 0x9c, 0x19, 0xea, 0x5a, 0x6f, 0x5a, - 0xba, 0xa1, 0x03, 0x52, 0x2d, 0x53, 0xb8, 0xe1, 0x54, 0x59, 0x7a, 0xb7, - 0xa0, 0xbb, 0x15, 0x75, 0xf9, 0xb9, 0xde, 0x93, 0xc7, 0x58, 0x2c, 0x00, - 0xfb, 0x64, 0xe2, 0x22, 0x26, 0x55, 0x46, 0x46, 0xf6, 0x46, 0xd5, 0x21, - 0x09, 0x68, 0x1d, 0x10, 0x21, 0x48, 0x8f, 0x98, 0x68, 0x6b, 0x69, 0xe8, - 0x74, 0xa8, 0x4c, 0xe4, 0x6f, 0x50, 0x40, 0xbe, 0xdb, 0xc1, 0xdc, 0xf5, - 0xfd, 0xd2, 0xf4, 0x54, 0x3c, 0x75, 0xe3, 0xc1, 0x2f, 0x93, 0x88, 0x05, - 0xc9, 0xc0, 0xc1, 0x79, 0xce, 0xf4, 0xab, 0xcc, 0x63, 0x02, 0x23, 0xda, - 0x9c, 0x3e, 0xc5, 0x8e, 0xe3, 0x3c, 0x6a, 0xec, 0x6b, 0xe4, 0x92, 0x01, - 0x23, 0x28, 0x10, 0x25, 0xd5, 0x20, 0xb8, 0xd9, 0xbd, 0xde, 0xa7, 0x7b, - 0x73, 0x38, 0xef, 0x69, 0xa8, 0xc7, 0x66, 0x5b, 0x95, 0xff, 0x52, 0xc8, - 0x14, 0xe4, 0x64, 0x9a, 0xd2, 0x09, 0x6f, 0x79, 0xf6, 0xb0, 0x81, 0x44, - 0x01, 0xf2, 0xd9, 0x7c, 0x56, 0x12, 0x02, 0x50, 0x85, 0xe5, 0x36, 0x95, - 0x8a, 0x39, 0xf5, 0x0e, 0x1b, 0x1e, 0xcb, 0x53, 0x56, 0x92, 0xc8, 0xfe, - 0x1b, 0x85, 0xdd, 0xfd, 0x03, 0x4b, 0x1e, 0x54, 0x95, 0xc8, 0x10, 0xd2, - 0x16, 0xbb, 0x8d, 0x55, 0x12, 0x7b, 0x52, 0x1d, 0xe1, 0xea, 0x75, 0xfd, - 0x22, 0x5b, 0xef, 0x61, 0x25, 0x9c, 0x40, 0xf2, 0x9c, 0x7e, 0x7e, 0x5d, - 0x1e, 0x4d, 0xcc, 0x99, 0x15, 0xba, 0xd8, 0x78, 0xb7, 0x38, 0xe5, 0x62, - 0x66, 0x1a, 0x25, 0xe8, 0xe5, 0x56, 0x81, 0xee, 0x21, 0xea, 0xd4, 0x8e, - 0xa5, 0x51, 0xcd, 0x4e, 0x54, 0x29, 0x09, 0x02, 0x2a, 0x47, 0x46, 0xf3, - 0xb4, 0xad, 0xba, 0x44, 0xb2, 0xfb, 0x3d, 0x33, 0xbb, 0x6f, 0x66, 0xb4, - 0xef, 0xc2, 0x5e, 0xe7, 0xf3, 0x6c, 0x72, 0xa9, 0xfd, 0xb4, 0x71, 0xe3, - 0xb7, 0xff, 0xed, 0x6d, 0xfc, 0xe4, 0x43, 0xb3, 0xb5, 0xc3, 0xf5, 0x79, - 0x97, 0x67, 0x11, 0xa4, 0x35, 0x43, 0x46, 0x64, 0x11, 0x14, 0xf5, 0xbf, - 0xaf, 0x7c, 0xbe, 0xb8, 0x9e, 0x06, 0x9e, 0xe1, 0x6c, 0xbb, 0x0f, 0xb9, - 0xa1, 0x16, 0xcc, 0xbb, 0x83, 0xa2, 0x3c, 0xb3, 0xad, 0x6d, 0x03, 0xad, - 0x43, 0xf6, 0xe4, 0x28, 0x87, 0xa8, 0x0a, 0x53, 0x79, 0x36, 0x91, 0xaf, - 0xb2, 0x67, 0x5a, 0xf1, 0xa2, 0x0d, 0x3c, 0xdd, 0x34, 0x6f, 0x62, 0xb9, - 0xb9, 0x1b, 0xb8, 0x54, 0x0e, 0x70, 0x41, 0x4e, 0x37, 0x5b, 0xbb, 0x51, - 0xc3, 0x72, 0xb0, 0x4a, 0x67, 0x92, 0x3d, 0x9a, 0xec, 0x70, 0x20, 0x21, - 0x7c, 0x5d, 0xb9, 0xd8, 0x67, 0x60, 0xae, 0x8f, 0x2b, 0x2c, 0x2d, 0xb0, - 0x57, 0x3b, 0x6f, 0xa6, 0x75, 0xf2, 0x6a, 0x14, 0x96, 0xbb, 0x6d, 0x81, - 0xad, 0xbe, 0x8d, 0x34, 0x80, 0xe0, 0x39, 0xe3, 0xa4, 0xb1, 0x46, 0xb3, - 0xbb, 0xef, 0x15, 0xf9, 0x16, 0xb2, 0x04, 0xb0, 0x92, 0x9f, 0xca, 0xfb, - 0x82, 0x31, 0x18, 0x2e, 0xac, 0xd1, 0x92, 0x2d, 0x62, 0x80, 0x1b, 0x2e, - 0x72, 0x77, 0xc7, 0xb7, 0xd3, 0xb3, 0xb8, 0x03, 0xc0, 0x04, 0x49, 0x56, - 0xf8, 0xd0, 0x2e, 0x1e, 0x06, 0x5a, 0x6c, 0xa3, 0x5a, 0xb3, 0xd3, 0xdd, - 0x6a, 0xca, 0x6d, 0x90, 0x55, 0xa7, 0x37, 0x1c, 0xe9, 0x53, 0x2b, 0x13, - 0x86, 0xf5, 0xf6, 0x5b, 0xe2, 0x61, 0xf9, 0x3b, 0x78, 0x31, 0x5e, 0xd0, - 0x7d, 0x8e, 0x2e, 0xba, 0x81, 0xca, 0xe2, 0x18, 0x9d, 0x77, 0x3e, 0x2d, - 0x4f, 0x32, 0x9c, 0x85, 0x50, 0xb3, 0x12, 0xf3, 0x92, 0xe0, 0x55, 0x60, - 0xdc, 0x2c, 0x92, 0xc8, 0x39, 0xa3, 0x7c, 0xb7, 0x67, 0x5c, 0x2b, 0xbd, - 0x55, 0x80, 0xcd, 0x24, 0x7d, 0xc5, 0x95, 0x0a, 0x29, 0x06, 0x3f, 0x7c, - 0xac, 0x6e, 0x6b, 0x4b, 0xfd, 0x04, 0x96, 0x22, 0x8a, 0x1e, 0xb0, 0x89, - 0x64, 0x98, 0x7a, 0xba, 0xce, 0x1a, 0x1a, 0xd2, 0x4a, 0x09, 0x14, 0x8f, - 0xe4, 0xd1, 0xeb, 0x6f, 0x36, 0x8a, 0x7e, 0xe5, 0x84, 0x8c, 0xe2, 0xc1, - 0xb4, 0x0c, 0x8b, 0xc9, 0xef, 0x61, 0x2d, 0x23, 0xff, 0xad, 0xfb, 0x40, - 0x02, 0xa0, 0x63, 0xe6, 0x0d, 0x1c, 0xfc, 0xac, 0xad, 0xbe, 0x29, 0x83, - 0x85, 0x68, 0xff, 0xa3, 0x0f, 0x42, 0xee, 0x06, 0x26, 0xd4, 0x78, 0xd6, - 0xeb, 0x1e, 0xe0, 0x35, 0xcc, 0xad, 0xfd, 0xa0, 0xb5, 0x3e, 0x87, 0x86, - 0xa8, 0x4e, 0x5b, 0x4f, 0xdd, 0x57, 0xd9, 0xc3, 0x95, 0x7e, 0xae, 0xcd, - 0x7a, 0xce, 0xf5, 0x37, 0x0f, 0xea, 0x71, 0x55, 0xa8, 0x8e, 0x62, 0xa5, - 0xfe, 0xa1, 0x40, 0xa7, 0xe7, 0x69, 0xaf, 0xe6, 0x24, 0xbd, 0xe3, 0xff, - 0x73, 0xa5, 0x11, 0x8a, 0x5a, 0x50, 0x6f, 0xa6, 0x71, 0x03, 0x13, 0xd8, - 0xaf, 0x8c, 0xfd, 0x1a, 0x38, 0x68, 0x49, 0x0b, 0x44, 0xc6, 0xec, 0xfb, - 0x3b, 0xcf, 0xf9, 0x13, 0xef, 0xed, 0x54, 0xd1, 0xc3, 0x34, 0x07, 0x2f, - 0x00, 0xac, 0x94, 0x25, 0x79, 0x5a, 0xa4, 0xc3, 0x39, 0x8d, 0xdf, 0xdd, - 0xfd, 0x99, 0xb3, 0x94, 0x94, 0xd0, 0x01, 0x92, 0x55, 0x0a, 0x7f, 0xd6, - 0x9d, 0x5c, 0x8a, 0x40, 0x37, 0x91, 0x4b, 0x8a, 0x0c, 0x8a, 0x95, 0x7c, - 0xb8, 0x52, 0x53, 0x3b, 0x19, 0x64, 0x9e, 0x1d, 0xac, 0xbd, 0x86, 0xff, - 0x15, 0x40, 0xb0, 0xaf, 0x0f, 0x90, 0x12, 0x42, 0x7c, 0xa3, 0xca, 0xff, - 0xf7, 0x58, 0x63, 0x5e, 0xa1, 0xcf, 0x97, 0x1c, 0xa2, 0xb0, 0x78, 0xca, - 0x41, 0xdd, 0x52, 0x0b, 0xeb, 0x14, 0xce, 0x49, 0x00, 0x6e, 0x7b, 0x62, - 0x91, 0x85, 0xb7, 0xa6, 0x03, 0xb0, 0xff, 0x41, 0xff, 0x26, 0xfa, 0x76, - 0xb0, 0x7d, 0xe8, 0xd2, 0x5d, 0x14, 0xc6, 0x89, 0xcf, 0x7b, 0xb3, 0xc8, - 0xba, 0xd5, 0x02, 0xcb, 0x2c, 0x7d, 0x02, 0x11, 0xa2, 0x69, 0x9c, 0xb2, - 0xe5, 0xcb, 0x82, 0xa9, 0x3d, 0xc5, 0xb1, 0x92, 0xd2, 0xdb, 0xb5, 0x90, - 0xaf, 0x3f, 0xcb, 0x5f, 0x57, 0x1d, 0xec, 0x89, 0x84, 0x65, 0x67, 0x57, - 0xf2, 0x22, 0xa9, 0x56, 0x4b, 0x12, 0x59, 0x12, 0x3d, 0x01, 0xa1, 0x90, - 0x9b, 0x3f, 0xfd, 0x79, 0x0a, 0x5c, 0x9c, 0x73, 0x01, 0xed, 0x26, 0xf1, - 0x37, 0x9b, 0x2a, 0x38, 0xc1, 0xbf, 0xf4, 0x1b, 0x0d, 0xb8, 0x0d, 0x5c, - 0x9e, 0x8e, 0x01, 0xc3, 0x22, 0xbe, 0x30, 0xa3, 0xe8, 0xbd, 0x7c, 0xc2, - 0xee, 0x3a, 0x12, 0xef, 0xcf, 0xa7, 0xaf, 0xae, 0xad, 0xf5, 0x56, 0x8b, - 0x2b, 0xb2, 0x9d, 0x09, 0x83, 0x38, 0x52, 0xd7, 0x7b, 0xda, 0xbf, 0x8b, - 0x12, 0xed, 0x54, 0x07, 0x2e, 0x81, 0xd5, 0x4f, 0xf3, 0x5a, 0x61, 0xd1, - 0xe8, 0xe5, 0x29, 0xa6, 0x9b, 0x82, 0x91, 0x0a, 0x0e, 0xf4, 0x3a, 0x94, - 0x48, 0x19, 0x50, 0xbf, 0xb5, 0x5c, 0xb5, 0x02, 0x29, 0xfd, 0xbf, 0xf7, - 0x9b, 0x50, 0x04, 0x62, 0x7b, 0x8d, 0x1f, 0xa3, 0x07, 0x54, 0x06, 0x3f, - 0xd6, 0x81, 0x00, 0x88, 0x87, 0x44, 0x16, 0xfb, 0xc1, 0xdd, 0xbc, 0xec, - 0xf6, 0xfe, 0x25, 0x42, 0x0b, 0x11, 0x0f, 0x67, 0x14, 0xee, 0x76, 0xb3, - 0xdf, 0x6e, 0x7a, 0x49, 0x9c, 0x37, 0x7b, 0x59, 0xe0, 0x9a, 0xbe, 0xf5, - 0x96, 0x94, 0x7c, 0xb0, 0x21, 0xde, 0x07, 0x5e, 0x6c, 0x0b, 0xd6, 0x0c, - 0xb4, 0x64, 0x73, 0xcd, 0xca, 0x1f, 0x73, 0x74, 0xb2, 0x49, 0x4c, 0x18, - 0xa2, 0xae, 0xdc, 0xac, 0x21, 0x95, 0xc3, 0x46, 0x82, 0x9c, 0xcf, 0xd4, - 0x89, 0x42, 0x5a, 0xe2, 0xa5, 0x47, 0x88, 0xbe, 0x11, 0x9a, 0x2b, 0xea, - 0x8f, 0x11, 0x8c, 0x81, 0x67, 0xc3, 0xf8, 0x25, 0xb7, 0xc5, 0x5e, 0x7b, - 0x54, 0xa4, 0x28, 0xd5, 0x0a, 0xa3, 0x07, 0x27, 0x8e, 0xb9, 0x35, 0x20, - 0x27, 0xe5, 0x05, 0xbf, 0x63, 0xc3, 0x13, 0x0c, 0x11, 0x2d, 0x5c, 0xb1, - 0x78, 0x9b, 0xc7, 0x6c, 0x00, 0x88, 0xdf, 0x25, 0xc6, 0xa2, 0x6a, 0x6e, - 0xc4, 0x6d, 0xd0, 0x6b, 0x35, 0xe9, 0x80, 0xd8, 0xe3, 0x8d, 0xaa, 0x22, - 0xc6, 0xd8, 0xac, 0x50, 0x0f, 0x43, 0x75, 0x93, 0xc8, 0xdb, 0xcc, 0xab, - 0x34, 0xb9, 0x07, 0x1c, 0x7e, 0xe3, 0xf8, 0x80, 0x5e, 0xf3, 0x38, 0x42, - 0xaf, 0xcc, 0x7e, 0xdc, 0x71, 0x90, 0x21, 0x76, 0xf1, 0xc0, 0xd2, 0x08, - 0x00, 0xbb, 0xcd, 0xcc, 0xe0, 0x5a, 0x90, 0xb1, 0x9d, 0x71, 0x8c, 0x35, - 0x16, 0x38, 0xd9, 0xda, 0x95, 0xe5, 0x31, 0x4d, 0x60, 0x44, 0xda, 0x72, - 0x41, 0xe3, 0xc1, 0xca, 0x6c, 0xe7, 0x11, 0x03, 0x79, 0x1e, 0x41, 0xe2, - 0x5a, 0x34, 0x39, 0x21, 0xd7, 0xbc, 0x33, 0x98, 0x96, 0x39, 0x16, 0xef, - 0x83, 0x6c, 0xa5, 0xce, 0x9f, 0x74, 0x2c, 0x31, 0xae, 0x15, 0xb3, 0x5b, - 0xd7, 0x1c, 0xf3, 0xc9, 0x3f, 0x49, 0xda, 0xb9, 0x0e, 0x19, 0x35, 0x66, - 0x93, 0x75, 0x86, 0x33, 0x9d, 0x60, 0x77, 0x2c, 0x5d, 0x5e, 0xb6, 0x86, - 0xef, 0x54, 0x77, 0xf7, 0x35, 0xe5, 0xea, 0xe6, 0x94, 0xe8, 0xec, 0x00, - 0x80, 0x14, 0x4c, 0xab, 0x74, 0x50, 0x9b, 0xfa, 0x11, 0x22, 0x5c, 0xd8, - 0x87, 0x92, 0xbf, 0xde, 0xbe, 0x63, 0xea, 0x6c, 0x48, 0x57, 0x20, 0xf4, - 0x6c, 0xc4, 0x30, 0xb2, 0x9d, 0x8f, 0x4b, 0x75, 0x98, 0xda, 0xde, 0xf9, - 0x27, 0x84, 0xb3, 0x30, 0x37, 0x95, 0x98, 0xf3, 0x2f, 0x85, 0xd6, 0xad, - 0x16, 0x15, 0x44, 0xb4, 0xfa, 0xaa, 0xf5, 0x90, 0x02, 0x4b, 0xb6, 0x4c, - 0x34, 0xb7, 0x0b, 0x2b, 0x5b, 0xae, 0xaf, 0x97, 0xa6, 0xa9, 0xa2, 0x92, - 0xaf, 0xa5, 0x43, 0x38, 0x29, 0x17, 0xf4, 0x40, 0x74, 0xc4, 0x44, 0xbd, - 0xc6, 0x06, 0x0b, 0xb9, 0x96, 0x01, 0x0f, 0xe8, 0x2b, 0xe5, 0x12, 0xea, - 0xaa, 0x66, 0x7a, 0x8e, 0x15, 0x45, 0xb8, 0x71, 0x72, 0x45, 0x90, 0x8c, - 0x38, 0xf2, 0xc7, 0x2f, 0x03, 0x2e, 0xa8, 0x3a, 0xd3, 0x20, 0xf8, 0x96, - 0x37, 0xc2, 0x8f, 0xc9, 0x7d, 0x71, 0x35, 0x78, 0x99, 0x22, 0xf5, 0xa9, - 0x38, 0x1c, 0x05, 0x9a, 0x5a, 0x97, 0xeb, 0x77, 0x43, 0xb7, 0xa7, 0x6a, - 0x52, 0xd8, 0x58, 0x53, 0x66, 0xf8, 0x9a, 0x24, 0x14, 0xd9, 0xfd, 0xc9, - 0x52, 0x12, 0x33, 0x17, 0x50, 0x5c, 0xd6, 0xb7, 0xd3, 0xff, 0xe4, 0x8c, - 0x01, 0xe7, 0x93, 0xe0, 0x35, 0x8f, 0xd5, 0x45, 0xe6, 0xe7, 0xbd, 0x46, - 0x20, 0x41, 0x90, 0x77, 0xf2, 0x3e, 0xba, 0x06, 0xef, 0x93, 0x59, 0x74, - 0xf5, 0xd1, 0x9e, 0x28, 0xd9, 0x2a, 0x4c, 0xb9, 0xfe, 0x88, 0xd8, 0x77, - 0xc9, 0x1e, 0x90, 0x8b, 0xcf, 0xbb, 0x1c, 0xae, 0x74, 0x53, 0x31, 0x20, - 0x79, 0x2e, 0x70, 0x19, 0x2d, 0x6c, 0x57, 0xbb, 0xba, 0xe5, 0x0c, 0xee, - 0xe2, 0xfd, 0x97, 0xf5, 0x59, 0x4d, 0x63, 0xd7, 0x32, 0x1f, 0x4c, 0x93, - 0xa5, 0xd7, 0x85, 0xd1, 0xf8, 0xb8, 0x5c, 0x06, 0xfe, 0x27, 0xc5, 0x3b, - 0x9f, 0x24, 0xc9, 0x5f, 0x43, 0x1c, 0x13, 0x97, 0xca, 0xfe, 0x23, 0xe7, - 0x3f, 0x7a, 0xb6, 0xd6, 0xdc, 0x56, 0xd6, 0x0a, 0xb0, 0x37, 0x06, 0xa3, - 0x02, 0x36, 0xeb, 0xc5, 0x00, 0x88, 0x42, 0x71, 0xc0, 0xde, 0x79, 0xcc, - 0xdc, 0x8c, 0xf8, 0x04, 0x61, 0x3f, 0x77, 0xbe, 0xcc, 0xdf, 0x4a, 0x7e, - 0x77, 0x47, 0x06, 0xf8, 0xad, 0x29, 0xee, 0xf8, 0x5e, 0xd9, 0xb5, 0xec, - 0xae, 0xf6, 0x02, 0x0a, 0xf2, 0x43, 0xdf, 0xa9, 0xbb, 0xec, 0x77, 0xee, - 0x5b, 0x6a, 0xa6, 0xaf, 0x2e, 0x90, 0x1f, 0xf1, 0xdd, 0x94, 0xb9, 0x56, - 0x17, 0x00, 0xb1, 0xb7, 0x48, 0x88, 0x57, 0xea, 0x5f, 0xbe, 0x99, 0xc0, - 0x1a, 0xfc, 0xb8, 0x59, 0xa2, 0x0b, 0x79, 0x6f, 0x41, 0xa6, 0x16, 0xd4, - 0x2d, 0xd1, 0x32, 0x20, 0x3d, 0x60, 0xb1, 0x6c, 0x1d, 0x78, 0xaa, 0x0e, - 0x35, 0xba, 0xbd, 0x6c, 0x48, 0x7c, 0xac, 0x0d, 0x36, 0x43, 0xfe, 0x3f, - 0x97, 0xaa, 0xb6, 0x6d, 0x07, 0xf4, 0x66, 0x0b, 0x42, 0x24, 0x49, 0xb2, - 0x92, 0x78, 0xea, 0x91, 0xa8, 0xfa, 0xa2, 0xf4, 0x99, 0x51, 0xc8, 0x92, - 0x29, 0x06, 0x8a, 0xce, 0xe6, 0x01, 0xac, 0x5e, 0x3b, 0xbe, 0xe3, 0xfc, - 0xf1, 0x4c, 0x53, 0x49, 0xa0, 0xdf, 0x68, 0xaa, 0xba, 0xf7, 0x51, 0xc2, - 0x31, 0x5b, 0xc7, 0xad, 0xd4, 0xd4, 0x29, 0xaf, 0x07, 0xa0, 0xf2, 0xdd, - 0x20, 0xeb, 0xe7, 0x23, 0x1f, 0x9d, 0xc9, 0xde, 0x56, 0xe9, 0x62, 0xba, - 0xf1, 0xca, 0xb7, 0x7c, 0xf8, 0x25, 0x77, 0x41, 0x48, 0xa7, 0x7e, 0x9b, - 0x8a, 0x81, 0x2f, 0x0a, 0xaa, 0x36, 0xb1, 0xbc, 0xa8, 0x7d, 0x75, 0x73, - 0xa9, 0x08, 0xb5, 0x4b, 0x11, 0x6f, 0xb6, 0xd0, 0x2a, 0x76, 0xc6, 0x1f, - 0x23, 0x71, 0xe9, 0xca, 0xb7, 0x85, 0x96, 0x0b, 0xff, 0x9b, 0x0d, 0x23, - 0x54, 0x53, 0x85, 0xc6, 0x02, 0x47, 0x08, 0x8c, 0x8e, 0xd8, 0xc2, 0xa4, - 0xb5, 0x0f, 0xe9, 0xd4, 0x93, 0x6e, 0x02, 0xb2, 0x8e, 0xda, 0xa2, 0x65, - 0x8a, 0x8d, 0x18, 0x03, 0x7f, 0xb5, 0x0d, 0xbc, 0x60, 0x37, 0xe6, 0x8a, - 0xf3, 0x6e, 0x77, 0x42, 0x7f, 0x35, 0x04, 0xf7, 0x42, 0x64, 0x30, 0xe5, - 0x3d, 0xd8, 0x80, 0xbe, 0x07, 0xcf, 0xf1, 0x68, 0x5b, 0xc9, 0x74, 0x0b, - 0x91, 0xdc, 0x5d, 0x14, 0x7f, 0x38, 0x1c, 0x19, 0x22, 0x69, 0x94, 0x14, - 0x56, 0x9b, 0x8d, 0x08, 0xff, 0x2e, 0xf9, 0xc8, 0xef, 0x49, 0x46, 0x69, - 0x58, 0x5e, 0x9c, 0x13, 0x98, 0x29, 0x9d, 0x48, 0xb0, 0x4c, 0x16, 0xb7, - 0xae, 0x3d, 0x45, 0xd6, 0x04, 0x72, 0xbf, 0xcf, 0x34, 0xff, 0xe4, 0x38, - 0x9e, 0x27, 0x97, 0x66, 0xf2, 0x42, 0x3d, 0xbf, 0x7f, 0xb2, 0xed, 0x68, - 0xf8, 0xb0, 0x98, 0xf1, 0x8e, 0x41, 0x5c, 0x7b, 0x7d, 0xd4, 0xce, 0x18, - 0xc9, 0x70, 0x33, 0x71, 0x35, 0x81, 0x0e, 0x2b, 0x40, 0x76, 0x4b, 0x45, - 0x55, 0xa3, 0x5c, 0xcf, 0xa6, 0x3f, 0x51, 0x09, 0xe8, 0xa4, 0xd7, 0xc2, - 0x46, 0x71, 0x54, 0x92, 0xd8, 0x5b, 0x38, 0x51, 0x63, 0xfb, 0xd7, 0x8e, - 0x2a, 0x01, 0xb0, 0x01, 0x08, 0x81, 0xec, 0xb7, 0xe7, 0x8f, 0x42, 0xc4, - 0x10, 0x2d, 0xe1, 0x9e, 0x88, 0x33, 0xa9, 0x9e, 0x26, 0x2e, 0x96, 0x68, - 0x3e, 0xc9, 0x09, 0x90, 0x38, 0xdd, 0xd3, 0x3c, 0xcb, 0x95, 0x05, 0xc7, - 0xea, 0x04, 0xa0, 0xa6, 0x20, 0x81, 0x0b, 0xb2, 0x16, 0xe0, 0xb8, 0x7a, - 0x22, 0xbb, 0x62, 0x58, 0x21, 0xc3, 0x25, 0x76, 0x2f, 0xa0, 0x39, 0x88, - 0xf3, 0xe6, 0x4c, 0xa9, 0xb5, 0x18, 0x27, 0xd4, 0x34, 0x40, 0xda, 0xcf, - 0x70, 0x6f, 0x9e, 0xcd, 0x19, 0x84, 0xb0, 0x68, 0x8b, 0x4e, 0x77, 0xc6, - 0x7e, 0xf8, 0xe6, 0xf6, 0x32, 0x7b, 0x11, 0xfc, 0x8a, 0x9d, 0x10, 0x2f, - 0x20, 0xb7, 0x13, 0x97, 0xb6, 0xa2, 0xad, 0xab, 0x10, 0xd7, 0x1f, 0xa4, - 0xfb, 0x17, 0x08, 0x33, 0x38, 0x05, 0xe6, 0x86, 0x89, 0xe9, 0x94, 0xb2, - 0x1e, 0x4c, 0xac, 0x12, 0x63, 0xb7, 0xab, 0x7a, 0x14, 0x5c, 0x91, 0xc6, - 0x15, 0xaa, 0x0d, 0x4f, 0x92, 0xa5, 0x46, 0xc6, 0x7e, 0x7a, 0xb8, 0xc6, - 0x34, 0x0f, 0x0d, 0xfb, 0xf8, 0xd0, 0x93, 0x4a, 0x7b, 0x23, 0xac, 0x03, - 0xe7, 0x1f, 0xb6, 0xb4, 0x5e, 0x5a, 0xa7, 0x91, 0x4b, 0xe6, 0x44, 0x5e, - 0x9d, 0xbe, 0x56, 0x58, 0x1a, 0x1f, 0x6d, 0x8c, 0xb9, 0xcc, 0x91, 0x37, - 0x11, 0xe8, 0xbc, 0x5c, 0x51, 0xb9, 0x6c, 0xe6, 0xcd, 0x81, 0x13, 0x0c, - 0xa1, 0x0a, 0xac, 0xc0, 0x83, 0x99, 0x51, 0x63, 0x24, 0x49, 0x21, 0x80, - 0x45, 0x2e, 0xd6, 0x41, 0xdb, 0x5c, 0x90, 0x47, 0xf9, 0x8c, 0x07, 0x36, - 0xaa, 0x50, 0xa8, 0x32, 0xf7, 0xc5, 0x68, 0x48, 0x5b, 0x10, 0xd6, 0x7c, - 0x30, 0x99, 0x8f, 0xb1, 0xe0, 0xf9, 0xc7, 0xd5, 0x8c, 0xd1, 0x0b, 0x1a, - 0x8d, 0x1d, 0xa1, 0x48, 0x09, 0x44, 0x01, 0x9a, 0x6b, 0x24, 0x61, 0x74, - 0x0c, 0x30, 0x7e, 0xe5, 0xe4, 0xba, 0x29, 0xc9, 0x1a, 0xe7, 0x7a, 0xb5, - 0xfc, 0xb3, 0xb4, 0xb6, 0x5e, 0x71, 0x54, 0xca, 0x6e, 0xe1, 0xcc, 0x2f, - 0x25, 0x1a, 0xa0, 0x91, 0xf1, 0x29, 0xfb, 0x23, 0x21, 0xc5, 0x76, 0x88, - 0x0c, 0x03, 0x36, 0xbe, 0x73, 0x23, 0xa9, 0x55, 0xa7, 0x04, 0x4f, 0x12, - 0x0c, 0xdc, 0x70, 0xb1, 0x71, 0xe1, 0xde, 0xf1, 0x1f, 0x10, 0xa1, 0x88, - 0x52, 0x27, 0xce, 0xbe, 0x14, 0x66, 0xca, 0x33, 0x28, 0xbc, 0x76, 0x40, - 0xf8, 0x33, 0x46, 0x25, 0xb1, 0x95, 0x76, 0x9b, 0x02, 0xfc, 0xd4, 0xbf, - 0x9f, 0x57, 0xf8, 0x0c, 0x42, 0x0e, 0x32, 0x67, 0x21, 0x92, 0xec, 0x47, - 0xfc, 0x85, 0xd2, 0x26, 0x98, 0x8c, 0x96, 0x2c, 0x5c, 0x11, 0x94, 0xb9, - 0xac, 0x76, 0x0f, 0x52, 0xf0, 0xed, 0xdd, 0xe2, 0xcc, 0x9d, 0x1a, 0xf7, - 0x42, 0xdd, 0x89, 0x86, 0x41, 0x54, 0xf4, 0xe7, 0xfd, 0x01, 0x79, 0xa0, - 0xc8, 0xee, 0x40, 0x26, 0x71, 0xea, 0x03, 0xe1, 0x00, 0x13, 0x55, 0x67, - 0x03, 0x22, 0xf3, 0xbb, 0x78, 0xdb, 0xc4, 0x2e, 0xd5, 0x55, 0xfc, 0x60, - 0xe5, 0x42, 0x8d, 0x97, 0xa5, 0x98, 0xe8, 0xbf, 0x88, 0x6f, 0x5d, 0xc0, - 0xaa, 0x7b, 0x4a, 0x38, 0x1c, 0x6f, 0xbc, 0xcc, 0x34, 0x5c, 0x33, 0x95, - 0x17, 0x74, 0x3b, 0x8a, 0x8b, 0xfb, 0xd8, 0xe9, 0xbf, 0x69, 0x77, 0xf7, - 0xed, 0x1d, 0x4c, 0x93, 0x3f, 0x60, 0x66, 0xf6, 0x41, 0x66, 0x08, 0x09, - 0xaf, 0x64, 0xa9, 0x85, 0x07, 0x49, 0x4b, 0x3f, 0xa0, 0x56, 0xd7, 0xde, - 0xcb, 0x40, 0x21, 0xa2, 0x81, 0x66, 0x38, 0x58, 0xc0, 0x3e, 0x11, 0x6b, - 0x59, 0xea, 0x0a, 0xdd, 0xa5, 0x72, 0x5e, 0xda, 0xaa, 0x68, 0x27, 0x15, - 0xc4, 0x29, 0xa4, 0x54, 0x48, 0x9f, 0x99, 0x99, 0xba, 0xfd, 0xc5, 0x19, - 0x63, 0xba, 0x6a, 0x72, 0x42, 0xc0, 0xa1, 0xec, 0x3e, 0x21, 0xd9, 0x48, - 0xf5, 0x36, 0x7e, 0x6e, 0x3c, 0x5e, 0x4f, 0x02, 0x9a, 0x5d, 0x97, 0x00, - 0x82, 0x6d, 0xf7, 0x18, 0xf1, 0x6f, 0x90, 0x0e, 0x7e, 0x7f, 0xd0, 0xa5, - 0x30, 0x88, 0xde, 0x82, 0x6a, 0xd5, 0x98, 0xd4, 0xbb, 0xc6, 0x0a, 0x5d, - 0x5f, 0xf8, 0x7c, 0xda, 0xbb, 0x07, 0x36, 0x5a, 0x0e, 0xc3, 0x0d, 0x7b, - 0xcd, 0x7b, 0xf7, 0x8d, 0xeb, 0x63, 0x7e, 0x32, 0xe7, 0x27, 0x40, 0x33, - 0xd6, 0x5d, 0xf9, 0x34, 0x47, 0xa2, 0x6e, 0x0c, 0x0d, 0xb6, 0x14, 0xc8, - 0x29, 0xb7, 0xc9, 0x6e, 0x78, 0x8e, 0xa3, 0xc6, 0x07, 0x49, 0xcc, 0x15, - 0x60, 0x73, 0xd6, 0x62, 0xe3, 0x45, 0x68, 0x73, 0x0c, 0x79, 0x60, 0x51, - 0xd8, 0x0d, 0xb4, 0x0e, 0x4e, 0xa7, 0xdf, 0x1c, 0x84, 0x2e, 0x1c, 0x57, - 0xd2, 0x99, 0x68, 0xcf, 0xaa, 0x2e, 0x8f, 0xed, 0x6b, 0x57, 0x94, 0xbb, - 0x24, 0x0b, 0xd7, 0x3e, 0xc7, 0xf5, 0xbd, 0x93, 0xf6, 0x31, 0x2f, 0xc8, - 0x56, 0x20, 0xb9, 0xeb, 0x95, 0xad, 0x3f, 0x9d, 0xf9, 0xee, 0xdd, 0x7e, - 0x61, 0xc9, 0xb7, 0x67, 0xfe, 0xce, 0xa3, 0x9f, 0xf4, 0x15, 0x6a, 0x9e, - 0x9a, 0xbb, 0xc2, 0x77, 0xc4, 0x86, 0xf0, 0x62, 0xb6, 0xba, 0xf2, 0xdd, - 0xab, 0x79, 0x4a, 0xef, 0x9f, 0x83, 0x68, 0xdb, 0x1c, 0x5b, 0x30, 0xe7, - 0x5b, 0x9b, 0x42, 0x12, 0xe7, 0xd5, 0xce, 0xe1, 0xe6, 0xfa, 0x87, 0x5a, - 0x81, 0x60, 0xbd, 0xb3, 0x69, 0xf9, 0x3d, 0xd3, 0x38, 0x3b, 0x75, 0x95, - 0xe1, 0x5c, 0xe7, 0x2c, 0xd0, 0x18, 0x68, 0xf8, 0x59, 0x05, 0x03, 0xf1, - 0xee, 0x2c, 0x29, 0xb3, 0x22, 0x5a, 0x5f, 0x52, 0x2a, 0xac, 0xde, 0x1e, - 0x1f, 0x91, 0x96, 0x2a, 0x82, 0x0d, 0x76, 0x8d, 0x33, 0x1b, 0x2a, 0x1a, - 0x01, 0xe6, 0x78, 0x3d, 0x13, 0x7c, 0x86, 0x8c, 0x84, 0xc1, 0xc2, 0x82, - 0xac, 0x99, 0x9c, 0xe6, 0x35, 0x8f, 0x93, 0x8d, 0xaf, 0x29, 0xe8, 0xf4, - 0x07, 0x77, 0xb1, 0x19, 0xbf, 0x08, 0x87, 0x67, 0x37, 0x33, 0xd9, 0x38, - 0xae, 0x58, 0xd7, 0x31, 0xc8, 0xc8, 0x53, 0x32, 0x9a, 0x00, 0x23, 0x23, - 0x11, 0x17, 0x5e, 0x56, 0x82, 0x60, 0xf7, 0x87, 0xc1, 0x79, 0x38, 0x0d, - 0x49, 0x73, 0x37, 0x68, 0xb8, 0x67, 0x9c, 0x36, 0x04, 0xf2, 0xf8, 0x93, - 0xe5, 0x28, 0xaa, 0xbb, 0x1f, 0x00, 0x2c, 0x80, 0xa1, 0x18, 0xbb, 0x94, - 0xdf, 0x95, 0x08, 0xb1, 0x27, 0x4c, 0x2b, 0x5b, 0x2e, 0x43, 0xcf, 0x3f, - 0xc6, 0xde, 0xf8, 0xac, 0x1d, 0xa5, 0x37, 0xff, 0x6c, 0xa8, 0xf5, 0xe3, - 0x88, 0xac, 0x37, 0x14, 0x11, 0xb9, 0x5d, 0x0f, 0xdc, 0x39, 0xb7, 0x70, - 0x12, 0x44, 0xa2, 0x7f, 0x0b, 0xbb, 0x19, 0xbd, 0x1b, 0xa1, 0x1f, 0x1b, - 0x6b, 0x68, 0xf1, 0x9c, 0x17, 0x51, 0xf1, 0xd0, 0x1c, 0x6a, 0xd8, 0xf9, - 0x69, 0x48, 0x7b, 0xbe, 0x34, 0x54, 0xc8, 0x6c, 0x8e, 0x5b, 0xb4, 0xb8, - 0xf1, 0x7d, 0xfd, 0xe3, 0xe4, 0xbc, 0xdb, 0x30, 0x47, 0x87, 0x6b, 0xfb, - 0xd6, 0xca, 0x0a, 0xcf, 0xdd, 0x13, 0x15, 0xd4, 0xd4, 0x27, 0xcf, 0xb2, - 0xef, 0xb0, 0x90, 0x5d, 0x7e, 0x32, 0x9d, 0x4d, 0xc1, 0x1d, 0xe0, 0xe1, - 0x25, 0x24, 0xc8, 0xdd, 0x39, 0x85, 0x35, 0xc0, 0xe0, 0xa3, 0x33, 0xd4, - 0x75, 0xeb, 0xef, 0xf2, 0x0a, 0x57, 0x14, 0xc7, 0x94, 0x92, 0x4f, 0x51, - 0x6a, 0xf9, 0xfd, 0x6b, 0x26, 0x95, 0xfe, 0xb6, 0x62, 0x56, 0xc8, 0xfb, - 0x55, 0xa9, 0x1f, 0x10, 0x85, 0xf0, 0xc8, 0x24, 0xf8, 0xa1, 0xd2, 0x15, - 0x2d, 0x5b, 0xa7, 0x96, 0x88, 0x14, 0x55, 0xf4, 0x5e, 0x88, 0xa4, 0xe9, - 0x08, 0x26, 0xb2, 0xdf, 0x8c, 0xaf, 0xc2, 0x8c, 0x81, 0x11, 0x98, 0xd9, - 0xae, 0x69, 0x17, 0x58, 0x8a, 0x50, 0xc4, 0x4d, 0x98, 0x6e, 0x4f, 0x7c, - 0x51, 0x7c, 0x44, 0x2d, 0xf2, 0xaf, 0xc8, 0x8f, 0x38, 0x5c, 0x98, 0x4d, - 0x09, 0x32, 0x6c, 0x37, 0x82, 0xe1, 0x62, 0x2e, 0x1a, 0x2f, 0x23, 0x86, - 0xf6, 0x5d, 0xb7, 0x9a, 0x76, 0x68, 0xaf, 0x56, 0x59, 0x9e, 0x5d, 0x17, - 0xcd, 0xec, 0x03, 0xcb, 0x19, 0x32, 0xe6, 0xce, 0x69, 0x8c, 0xdf, 0x4f, - 0x8e, 0x3b, 0xb0, 0x0f, 0x6a, 0x50, 0xda, 0x24, 0x68, 0x33, 0x40, 0xaa, - 0x14, 0xae, 0x32, 0x82, 0x40, 0xa7, 0x5a, 0x2e, 0xf3, 0xb3, 0xfb, 0x1d, - 0x5e, 0xcd, 0xd0, 0xd8, 0x19, 0xc5, 0x11, 0x47, 0x84, 0x20, 0x7c, 0x47, - 0x81, 0x54, 0x0d, 0xc3, 0xc5, 0x52, 0xb3, 0xc8, 0x68, 0x57, 0x53, 0xc6, - 0x94, 0xdc, 0xd2, 0x3c, 0x12, 0x19, 0x97, 0x13, 0xc7, 0x88, 0x34, 0xfe, - 0xde, 0xd7, 0xdf, 0x8f, 0xf1, 0xef, 0x29, 0xab, 0x9a, 0xe4, 0xb5, 0xb7, - 0x2e, 0xa4, 0x7f, 0x5d, 0xf2, 0x64, 0x70, 0x5c, 0x54, 0xb7, 0xb0, 0x79, - 0x8a, 0xbe, 0x3b, 0x50, 0xf6, 0x5a, 0x6c, 0x46, 0xd2, 0xec, 0x32, 0x2d, - 0x95, 0xc2, 0x10, 0x5c, 0x0c, 0x3c, 0xcd, 0xbd, 0x81, 0xe4, 0xc5, 0xb9, - 0xac, 0xaf, 0x0c, 0x1e, 0xea, 0x28, 0xfe, 0xfb, 0x28, 0xe4, 0x9e, 0x94, - 0x9a, 0xb4, 0x11, 0x22, 0x75, 0xbd, 0x74, 0x3e, 0xbe, 0x35, 0xa0, 0x16, - 0xa4, 0x72, 0x03, 0x80, 0x42, 0x02, 0xae, 0x5c, 0x18, 0x6c, 0xb4, 0x1f, - 0xb7, 0x30, 0x09, 0xda, 0x4e, 0x07, 0xb5, 0x34, 0xad, 0x53, 0x3a, 0xa2, - 0xfb, 0xb0, 0x37, 0xa9, 0x76, 0x6f, 0xd8, 0x5b, 0x26, 0xb0, 0x8a, 0xf3, - 0xc9, 0x45, 0x35, 0x42, 0xc5, 0x4b, 0x29, 0x04, 0xa6, 0x7b, 0x84, 0x32, - 0xc2, 0xd9, 0x5f, 0x86, 0x4d, 0xbd, 0x1f, 0x1a, 0xbf, 0x28, 0x7d, 0xba, - 0xc0, 0x41, 0x59, 0x61, 0x60, 0x51, 0xd5, 0x24, 0x45, 0xdd, 0xed, 0xaa, - 0xb4, 0xf7, 0x01, 0xa5, 0x01, 0x07, 0x1a, 0xe0, 0x8f, 0x04, 0xd0, 0xf0, - 0xd1, 0x7d, 0x39, 0xde, 0xaa, 0x2f, 0x87, 0x0d, 0xce, 0x69, 0x23, 0xcc, - 0x12, 0x4f, 0x01, 0x3b, 0x1d, 0xd2, 0xcd, 0x62, 0xee, 0xc5, 0xc6, 0x4f, - 0xd1, 0xae, 0x27, 0x16, 0x51, 0x2f, 0xc7, 0x50, 0x55, 0x3d, 0xb0, 0x30, - 0x6a, 0x35, 0x86, 0xd2, 0x97, 0x4b, 0xc2, 0x79, 0x50, 0xe1, 0x48, 0xa9, - 0xc2, 0x2b, 0x52, 0x8a, 0xa1, 0x0b, 0x4b, 0x77, 0x43, 0xf8, 0x25, 0xb0, - 0x3c, 0x31, 0x6c, 0x89, 0x62, 0x4a, 0xf9, 0x1f, 0xbc, 0x19, 0x55, 0xa4, - 0x9e, 0x57, 0x4f, 0x08, 0x99, 0x2b, 0x1f, 0xaa, 0x06, 0x17, 0xe4, 0x96, - 0x90, 0x55, 0x0d, 0xd9, 0xee, 0xee, 0xdb, 0x20, 0xe1, 0x9d, 0x6c, 0xbf, - 0xfa, 0x1b, 0xe8, 0xd0, 0x67, 0xb9, 0x56, 0xc5, 0x56, 0x78, 0x19, 0xd7, - 0x48, 0x95, 0x1a, 0x9c, 0x26, 0x2d, 0xe5, 0x4c, 0x01, 0x2f, 0x5e, 0x99, - 0x1a, 0xdd, 0x64, 0xe4, 0x0c, 0x62, 0x72, 0xda, 0x8c, 0x11, 0x54, 0xd5, - 0xdc, 0xc9, 0x3d, 0xaf, 0xf0, 0xb5, 0xb3, 0x7f, 0xb5, 0x36, 0xb8, 0x85, - 0x26, 0xf4, 0xd1, 0x76, 0xd4, 0xd4, 0x55, 0x6b, 0xa7, 0x2f, 0x27, 0xf8, - 0x2d, 0xe3, 0xdd, 0xae, 0xd9, 0x5d, 0x67, 0xeb, 0x95, 0xfb, 0x66, 0x87, - 0xf3, 0xe7, 0x05, 0x03, 0x6e, 0x7f, 0x7f, 0xde, 0x89, 0x0d, 0xcd, 0x32, - 0x04, 0xa3, 0xcc, 0xae, 0xc0, 0x46, 0x2f, 0x55, 0x78, 0x8c, 0x4c, 0x37, - 0x42, 0xc7, 0x6c, 0x65, 0xe2, 0x4c, 0xb5, 0x7e, 0x50, 0x2b, 0xc5, 0xf6, - 0x9c, 0x07, 0x42, 0xf3, 0x49, 0x03, 0x4b, 0x96, 0x21, 0xbe, 0xea, 0xa5, - 0x1a, 0x56, 0x12, 0xff, 0xb8, 0xcb, 0x09, 0x48, 0x4b, 0xad, 0x87, 0x82, - 0x13, 0x7d, 0x5d, 0xd0, 0x0f, 0xea, 0xb3, 0xc7, 0x2d, 0xbb, 0x4c, 0x05, - 0x04, 0xc5, 0x5b, 0x2b, 0x7c, 0x38, 0xeb, 0x44, 0x11, 0xd2, 0xcf, 0xb2, - 0xc7, 0x8a, 0x62, 0x02, 0x52, 0xc4, 0xb3, 0x1b, 0xcf, 0x58, 0xaa, 0xa0, - 0x26, 0xd6, 0x20, 0xba, 0xb0, 0xc4, 0xad, 0x9d, 0xa5, 0x5b, 0x03, 0x0e, - 0x7d, 0x82, 0xa3, 0x5c, 0x21, 0x34, 0x92, 0x60, 0xb3, 0xa7, 0x14, 0xe7, - 0x07, 0x52, 0xfd, 0x06, 0x53, 0x99, 0xa5, 0xdb, 0xba, 0xd0, 0x4d, 0x0c, - 0x8f, 0x1d, 0x47, 0xd9, 0xf8, 0x01, 0x0f, 0x76, 0xd9, 0xd4, 0x1a, 0x77, - 0xdc, 0x95, 0x53, 0x71, 0xbb, 0x82, 0x91, 0x06, 0xf3, 0xbe, 0x60, 0x60, - 0xb2, 0xb8, 0x84, 0x96, 0xc8, 0x2d, 0x44, 0xb1, 0x85, 0x19, 0xde, 0x27, - 0x77, 0xb0, 0xdb, 0x0e, 0x25, 0x47, 0xab, 0x0c, 0x72, 0x6d, 0x62, 0xff, - 0xdf, 0x77, 0xee, 0xab, 0x05, 0xca, 0x17, 0xe1, 0xe6, 0xe3, 0xb8, 0x47, - 0x19, 0x1b, 0x65, 0x2c, 0x0e, 0x66, 0x15, 0xac, 0x10, 0x53, 0xd4, 0xde, - 0x4c, 0x7f, 0x3f, 0xe0, 0x1d, 0x1c, 0x58, 0x3b, 0xfe, 0xf6, 0xdf, 0x38, - 0xb5, 0x57, 0x11, 0xab, 0x88, 0x81, 0x85, 0x29, 0x96, 0x99, 0xa9, 0x46, - 0x81, 0xf1, 0x33, 0xcb, 0x09, 0x01, 0x1b, 0xae, 0x4a, 0x78, 0x9b, 0xe0, - 0x9e, 0x95, 0x32, 0xcd, 0x5f, 0xda, 0xbe, 0x08, 0xcb, 0xba, 0xc6, 0x37, - 0xb8, 0xc6, 0x2d, 0x09, 0xee, 0x1b, 0x83, 0xa3, 0xad, 0xbd, 0xf1, 0x65, - 0xec, 0xd1, 0x8e, 0x69, 0xb7, 0x9a, 0x8f, 0x6a, 0xb6, 0xce, 0x91, 0x78, - 0x8c, 0x57, 0xb7, 0x7e, 0xae, 0x4d, 0x34, 0x52, 0xda, 0xdd, 0x80, 0xa4, - 0x26, 0x46, 0x4d, 0x3f, 0xb8, 0xab, 0x2b, 0xfc, 0x16, 0x96, 0x18, 0x9e, - 0x64, 0x5a, 0x5c, 0xc7, 0x3d, 0x3c, 0x65, 0x20, 0x57, 0x05, 0x86, 0xab, - 0x07, 0x14, 0x52, 0xcf, 0x6d, 0xe2, 0x47, 0x27, 0x93, 0x9b, 0xc8, 0x70, - 0x03, 0x0b, 0x1c, 0x71, 0x60, 0xb8, 0xe0, 0x97, 0x06, 0x69, 0x21, 0x1e, - 0x23, 0xe7, 0xb0, 0x8b, 0xf2, 0x16, 0x70, 0x72, 0xe1, 0x24, 0x53, 0x44, - 0x63, 0x22, 0x11, 0xa6, 0xe0, 0x78, 0x07, 0xb6, 0xa6, 0x20, 0x29, 0x0d, - 0xce, 0xc4, 0xf6, 0x59, 0x80, 0x27, 0xbe, 0x8b, 0x57, 0xe6, 0x15, 0xb6, - 0x86, 0x57, 0xb8, 0x53, 0xff, 0xda, 0xe5, 0xe6, 0x4f, 0x17, 0x3e, 0x4c, - 0xe6, 0xbd, 0x3c, 0xd3, 0x9d, 0xed, 0x2f, 0x32, 0x2c, 0x62, 0x83, 0x12, - 0x55, 0x2f, 0xd3, 0x5d, 0x43, 0xe9, 0xe6, 0x31, 0x32, 0xb3, 0x99, 0x6a, - 0xe4, 0x88, 0xc9, 0xaa, 0x62, 0x34, 0x8e, 0x0f, 0x47, 0xf9, 0xb8, 0x0e, - 0x10, 0x85, 0x92, 0x01, 0x61, 0xfa, 0xde, 0x71, 0x92, 0x65, 0x30, 0x3d, - 0x92, 0xe7, 0xa7, 0xfb, 0x4d, 0x2b, 0x5b, 0x18, 0x30, 0xc8, 0xe0, 0x4d, - 0x39, 0x2b, 0xec, 0xe8, 0x89, 0x60, 0xc6, 0xfa, 0xd5, 0xda, 0xa2, 0x85, - 0xd1, 0xe5, 0x54, 0x5a, 0x8d, 0xaa, 0x6b, 0xdc, 0xd3, 0xc4, 0xa1, 0xa4, - 0x39, 0x64, 0xa2, 0x56, 0x98, 0xdf, 0x97, 0xa5, 0x68, 0xe6, 0xa3, 0xdb, - 0x89, 0x12, 0xaa, 0x1e, 0xaa, 0x5e, 0x74, 0xe9, 0xf1, 0xa7, 0x4a, 0xe6, - 0x13, 0x51, 0x9f, 0xe5, 0x4b, 0x2f, 0xe9, 0xe0, 0x68, 0xbd, 0xdd, 0xa3, - 0x6c, 0x2d, 0x45, 0xf2, 0x46, 0xaa, 0xe0, 0x3e, 0x2c, 0xaa, 0xba, 0x3a, - 0xd9, 0x44, 0x0c, 0xd0, 0x12, 0x11, 0x7f, 0x9b, 0x9b, 0x5b, 0x50, 0xa1, - 0x0c, 0xaa, 0x46, 0x7a, 0xcc, 0x0d, 0x1b, 0xeb, 0xfe, 0xe6, 0xc5, 0x53, - 0x16, 0xa2, 0xa7, 0x47, 0x04, 0x04, 0x2e, 0x08, 0x33, 0x6b, 0xa7, 0xbc, - 0x04, 0x9e, 0xc4, 0xd0, 0x36, 0x67, 0x20, 0x48, 0xd1, 0x30, 0x5c, 0x53, - 0xe3, 0x55, 0xcf, 0x13, 0x79, 0x6d, 0xf2, 0xe9, 0x8c, 0xe5, 0x95, 0xa7, - 0x81, 0x50, 0x58, 0x28, 0x09, 0x97, 0xbd, 0xa8, 0x21, 0x66, 0x91, 0x69, - 0x01, 0xf0, 0x79, 0x81, 0x67, 0xde, 0x96, 0x0c, 0x54, 0x32, 0x32, 0xb1, - 0x9b, 0x77, 0xfa, 0x5b, 0xfd, 0x78, 0x10, 0x7e, 0xdc, 0xae, 0x4d, 0xc0, - 0x18, 0x6a, 0xda, 0xe2, 0xc8, 0x2a, 0xb4, 0x90, 0xc2, 0x71, 0x4e, 0xb7, - 0x8e, 0x49, 0xbb, 0x06, 0x7d, 0x4e, 0x3e, 0x9b, 0xe0, 0xb6, 0xc5, 0x42, - 0x48, 0xf0, 0xc4, 0xd4, 0x7f, 0xbc, 0x9e, 0xd6, 0x4e, 0x7f, 0x06, 0xa8, - 0x03, 0xec, 0xfd, 0xbb, 0x1a, 0x96, 0x44, 0xc5, 0xaf, 0xe9, 0x0e, 0x6c, - 0x29, 0xf5, 0xed, 0x89, 0x79, 0xd6, 0x69, 0x7b, 0xc7, 0x5d, 0xff, 0x3a, - 0x0b, 0x0c, 0x44, 0x72, 0xb6, 0x5a, 0xbc, 0xc0, 0x5b, 0xe8, 0x55, 0x7d, - 0xc9, 0x3d, 0x4c, 0x4a, 0xd1, 0x44, 0xe5, 0xd1, 0x97, 0x0d, 0x44, 0x08, - 0x8d, 0xb9, 0xc3, 0x8c, 0xaa, 0xb2, 0xb7, 0xda, 0x17, 0x56, 0xcc, 0x84, - 0x13, 0xe5, 0x4d, 0x02, 0x43, 0xfd, 0xf9, 0x63, 0x67, 0x3f, 0x63, 0x07, - 0x09, 0x95, 0xb7, 0x43, 0x00, 0x54, 0xd2, 0x9f, 0xb8, 0x98, 0xc0, 0x3c, - 0x13, 0xcb, 0xf6, 0x7f, 0xe5, 0x2d, 0xa3, 0x3c, 0x62, 0xac, 0xeb, 0xb4, - 0x70, 0x3b, 0x20, 0x44, 0xf8, 0x4d, 0x2f, 0x58, 0xe5, 0xd0, 0xb1, 0x01, - 0x53, 0x29, 0xba, 0x11, 0x30, 0x97, 0x2f, 0xd0, 0x44, 0x3c, 0x42, 0x71, - 0xbe, 0x10, 0x21, 0x8c, 0x9f, 0x21, 0x26, 0xcf, 0xf9, 0x24, 0x84, 0x4b, - 0x03, 0x2d, 0x67, 0x8a, 0xf3, 0xc9, 0x96, 0x29, 0x76, 0x3e, 0x8b, 0x46, - 0x93, 0x74, 0x8d, 0xd9, 0xa4, 0x47, 0x4b, 0x3a, 0x20, 0x00, 0x46, 0xd5, - 0x98, 0xa8, 0x01, 0x0a, 0x26, 0xe7, 0x15, 0x3d, 0x62, 0xee, 0xf9, 0xd3, - 0x86, 0x95, 0xd4, 0x72, 0x2f, 0x98, 0x11, 0x43, 0xac, 0xe7, 0xe9, 0x97, - 0x2a, 0x8b, 0xae, 0xac, 0xa8, 0xe9, 0xe7, 0x06, 0xf3, 0x6f, 0xaa, 0x12, - 0x67, 0xca, 0x5e, 0x6c, 0xb1, 0xbb, 0xfb, 0x8d, 0xa7, 0x8d, 0xbd, 0x9d, - 0x5a, 0x25, 0x27, 0x80, 0xe3, 0xd7, 0x7f, 0xec, 0x8e, 0x1d, 0x57, 0xa9, - 0x21, 0x0d, 0xd5, 0x9e, 0x10, 0xfe, 0xb3, 0x2b, 0x81, 0x3e, 0x4b, 0x36, - 0x8a, 0x19, 0x56, 0xb6, 0x8f, 0x34, 0xb7, 0xbe, 0x66, 0xf0, 0x99, 0x3e, - 0xeb, 0x20, 0x7d, 0x58, 0x2b, 0x56, 0x5b, 0xd3, 0x40, 0x32, 0x8a, 0x93, - 0xd3, 0x21, 0xc7, 0x14, 0x10, 0x5d, 0xfc, 0xa5, 0xab, 0xe0, 0xcb, 0xc5, - 0x9c, 0x29, 0xee, 0x01, 0x19, 0x90, 0x9d, 0x95, 0x60, 0xa9, 0x01, 0xac, - 0xa5, 0x47, 0x71, 0x7b, 0x2e, 0x62, 0x3b, 0x85, 0x60, 0x53, 0x11, 0x47, - 0xfb, 0x64, 0xfd, 0x77, 0xf1, 0xb9, 0xae, 0x10, 0x41, 0x7c, 0xf6, 0x5e, - 0x78, 0xb6, 0xaa, 0xec, 0xf1, 0xf4, 0xbe, 0x68, 0x1d, 0x1a, 0x8d, 0x1e, - 0x09, 0xc2, 0x35, 0x07, 0x2f, 0x43, 0x98, 0x96, 0xde, 0x53, 0xb1, 0xdf, - 0x09, 0xe8, 0x32, 0x35, 0x2e, 0x02, 0x47, 0xe0, 0x92, 0x1c, 0xe6, 0x0f, - 0xdb, 0xa9, 0x0a, 0x76, 0xab, 0x2d, 0x9b, 0x71, 0x48, 0x44, 0x7d, 0xed, - 0x76, 0x8c, 0x15, 0x60, 0xaa, 0xef, 0x1f, 0x0d, 0xb9, 0xd2, 0xfd, 0x1c, - 0xcc, 0x20, 0x59, 0xb7, 0x39, 0xe2, 0x77, 0x46, 0x4d, 0x78, 0x53, 0x15, - 0x4a, 0x44, 0x19, 0x7d, 0x71, 0x13, 0x54, 0xd4, 0x62, 0x69, 0x02, 0xcf, - 0xd9, 0x49, 0x8c, 0xbd, 0xe8, 0x4e, 0x0a, 0x29, 0xa7, 0x2e, 0x8f, 0xf7, - 0xf3, 0x18, 0x5c, 0x6b, 0x30, 0x9c, 0x29, 0x0a, 0x20, 0x87, 0x88, 0x8d, - 0x0a, 0x5e, 0x5c, 0x67, 0x5c, 0xd8, 0x0d, 0x49, 0xc6, 0xd7, 0x15, 0x78, - 0x10, 0x78, 0xa1, 0x3b, 0xbb, 0xa4, 0xb2, 0x39, 0x4d, 0xac, 0xf8, 0xb7, - 0x51, 0xc1, 0xd9, 0x7d, 0x4a, 0xb1, 0x2d, 0x95, 0x1b, 0xe2, 0xde, 0xbe, - 0xde, 0xb9, 0x11, 0x4e, 0x66, 0x98, 0x02, 0xcc, 0xd7, 0xfb, 0x0f, 0xab, - 0x61, 0x1b, 0x73, 0x61, 0xdc, 0x7c, 0x51, 0x9a, 0x80, 0x57, 0x1e, 0xab, - 0x04, 0x3c, 0x36, 0x15, 0x87, 0x21, 0x0c, 0xca, 0x1f, 0xa6, 0x70, 0x94, - 0x79, 0x30, 0x8d, 0x33, 0xb7, 0x3b, 0x4d, 0x10, 0x72, 0xa9, 0x50, 0x2b, - 0x7a, 0xaf, 0xca, 0x3f, 0xfd, 0xb8, 0x0b, 0x7c, 0x6c, 0x56, 0xd3, 0x21, - 0x5e, 0x71, 0xb1, 0x6b, 0x90, 0xe0, 0x4f, 0x4f, 0xd1, 0x5a, 0x6c, 0x95, - 0xbd, 0xaf, 0xc8, 0xa9, 0xa4, 0xe6, 0x3c, 0x19, 0x92, 0xea, 0xe0, 0xc1, - 0xf1, 0x53, 0xbe, 0x25, 0xa6, 0x05, 0xf6, 0x4a, 0x77, 0xc0, 0x11, 0x5e, - 0x82, 0x01, 0xb4, 0xac, 0xed, 0xb6, 0x8a, 0x78, 0x40, 0x63, 0x57, 0x49, - 0xad, 0x67, 0x60, 0x10, 0xe5, 0xe2, 0x57, 0xea, 0xd8, 0x99, 0x44, 0x41, - 0xd2, 0xef, 0x7c, 0xf7, 0xe6, 0x42, 0x21, 0x98, 0xc5, 0xe8, 0x0b, 0xf4, - 0x59, 0x4d, 0x2f, 0x05, 0x0e, 0x9d, 0x6c, 0x75, 0xb0, 0xea, 0xdb, 0x67, - 0x39, 0x2a, 0x5d, 0x30, 0xf9, 0x08, 0x47, 0x78, 0x9f, 0xea, 0x2f, 0xb2, - 0x67, 0x5d, 0xbc, 0xfb, 0x9b, 0xcb, 0xf1, 0x95, 0x03, 0xa6, 0x33, 0x85, - 0x0d, 0x44, 0xbd, 0x6c, 0x5c, 0x88, 0x17, 0x70, 0x53, 0x97, 0xe9, 0xc5, - 0x62, 0x45, 0x4f, 0xa7, 0x10, 0x18, 0xb3, 0xcc, 0x51, 0x02, 0x77, 0x36, - 0x4a, 0xd7, 0x55, 0x6d, 0x9b, 0x26, 0xbc, 0x1c, 0xda, 0x2a, 0x60, 0x88, - 0x59, 0xe6, 0x5d, 0x42, 0xea, 0xdc, 0x05, 0xde, 0x77, 0xe3, 0xd5, 0x4f, - 0xc8, 0x75, 0xf0, 0x11, 0xef, 0x97, 0x1e, 0xb6, 0x9b, 0x0c, 0x89, 0x9d, - 0x9a, 0x2b, 0x47, 0xa4, 0x4e, 0x4a, 0xe3, 0x9b, 0xec, 0xd3, 0x70, 0x84, - 0x73, 0x0d, 0x80, 0xb5, 0x06, 0x06, 0xb4, 0x45, 0x40, 0x9d, 0x38, 0x96, - 0xb8, 0xf1, 0x8a, 0x8b, 0xa6, 0xd3, 0x7a, 0x8f, 0x1d, 0x6a, 0xcf, 0xa6, - 0x6b, 0xc1, 0xe5, 0x7c, 0x01, 0x0f, 0x73, 0x99, 0x94, 0x24, 0xb1, 0x25, - 0x1f, 0x27, 0x22, 0xe0, 0xbd, 0xdc, 0x80, 0x9e, 0x1b, 0x0a, 0x07, 0x0e, - 0x51, 0x32, 0xaf, 0x39, 0x33, 0x2d, 0x10, 0xf5, 0xa4, 0x33, 0xda, 0x1f, - 0x2f, 0xa1, 0xd8, 0xea, 0x40, 0x32, 0x2d, 0x33, 0xde, 0xb5, 0x8d, 0x2a, - 0x29, 0x57, 0x6c, 0x4e, 0x47, 0x09, 0x06, 0x16, 0x83, 0x44, 0xcf, 0x37, - 0x7f, 0xe5, 0x47, 0x4f, 0x1c, 0x44, 0xea, 0x10, 0xc0, 0x99, 0x6d, 0x40, - 0xf5, 0x1d, 0x5a, 0x15, 0x80, 0x81, 0x7d, 0xcd, 0x94, 0x38, 0x56, 0xe1, - 0x29, 0x88, 0xc8, 0xc1, 0xf4, 0xd4, 0xa0, 0xa8, 0x01, 0xde, 0x84, 0x17, - 0x9b, 0x09, 0xc8, 0xb2, 0xe5, 0x93, 0x9a, 0x54, 0xc2, 0xe2, 0x52, 0x24, - 0x6f, 0x72, 0xd9, 0x31, 0xd8, 0x29, 0x3d, 0x2c, 0xd5, 0x23, 0xc2, 0xd6, - 0xb9, 0x82, 0xa8, 0x86, 0xa1, 0x3a, 0x60, 0x84, 0x31, 0x88, 0xca, 0x3f, - 0x22, 0x7c, 0x3d, 0x40, 0x05, 0xaa, 0x1e, 0xca, 0x66, 0x54, 0xdb, 0x62, - 0xcb, 0x7d, 0x77, 0x47, 0xb4, 0x53, 0x71, 0xbc, 0x11, 0x08, 0x2c, 0x15, - 0xc0, 0xaa, 0x27, 0xf1, 0x88, 0xc3, 0x25, 0x64, 0xc7, 0x2b, 0xf6, 0x25, - 0x50, 0x07, 0x9e, 0xe4, 0xf8, 0x31, 0xbd, 0xe5, 0xe8, 0x68, 0x30, 0xc6, - 0xc4, 0x65, 0xa0, 0x61, 0xac, 0x3c, 0x38, 0x5e, 0x0e, 0x94, 0xb8, 0x0b, - 0xd4, 0x38, 0xaa, 0xdd, 0xc8, 0xf4, 0x89, 0x08, 0xf7, 0xa7, 0x9f, 0x41, - 0x24, 0xa5, 0x09, 0x33, 0x9a, 0xbc, 0xac, 0xb3, 0xee, 0xfc, 0xbd, 0x0d, - 0x35, 0x91, 0xa2, 0xe0, 0xef, 0x4b, 0x09, 0x7a, 0x67, 0x2e, 0xd4, 0x1b, - 0x2e, 0x29, 0xdc, 0x46, 0xbb, 0xb7, 0xf7, 0x4a, 0xb6, 0x8e, 0x7e, 0xf3, - 0x46, 0x7f, 0xd8, 0x2d, 0x20, 0x75, 0xb7, 0xbf, 0xbd, 0x26, 0x58, 0xfb, - 0xa1, 0x92, 0xa8, 0x74, 0x3a, 0x1c, 0xe7, 0x19, 0x48, 0xf8, 0x9f, 0xde, - 0x46, 0x62, 0xdc, 0x22, 0x33, 0x66, 0xc5, 0x44, 0x93, 0x18, 0x3d, 0xed, - 0x92, 0x01, 0xa4, 0x9c, 0x62, 0xb9, 0xa3, 0xe4, 0x47, 0x78, 0xf6, 0x43, - 0x68, 0xf8, 0x57, 0x5d, 0x46, 0xcd, 0xb6, 0x76, 0x7d, 0x2f, 0x26, 0xf1, - 0x48, 0x84, 0x47, 0x4f, 0x8a, 0x9b, 0x9c, 0xef, 0x72, 0x88, 0xad, 0x7a, - 0x17, 0xc6, 0xeb, 0x31, 0x05, 0x92, 0x9e, 0x06, 0xe3, 0x63, 0x20, 0x01, - 0xcd, 0xe4, 0xb9, 0xb1, 0xc5, 0x82, 0x44, 0x73, 0x60, 0xa1, 0x91, 0xf5, - 0xed, 0xb1, 0x1f, 0x74, 0xae, 0x48, 0xe5, 0x9e, 0x1a, 0x7d, 0xd7, 0x90, - 0x77, 0x55, 0x41, 0x7e, 0xc1, 0x7e, 0xb5, 0x12, 0x35, 0xc4, 0xfb, 0x7b, - 0xa6, 0x09, 0x65, 0x57, 0x4c, 0x3e, 0xec, 0x4c, 0x5c, 0x12, 0x2a, 0x36, - 0xad, 0x23, 0x14, 0x4b, 0x13, 0x0d, 0xbb, 0x72, 0xed, 0x2c, 0x7b, 0xa0, - 0x1a, 0x9f, 0x94, 0xcc, 0xc9, 0x0b, 0x1d, 0x43, 0xfc, 0x20, 0x0a, 0xaa, - 0x79, 0x8a, 0x83, 0x52, 0x6f, 0x1e, 0xf4, 0xe5, 0xf1, 0x69, 0x4c, 0xc6, - 0x1b, 0x2c, 0xa2, 0xd6, 0xd6, 0xa0, 0x21, 0x22, 0x7e, 0x13, 0xa7, 0x26, - 0x7d, 0x7e, 0x88, 0x39, 0x0b, 0x42, 0xa5, 0x30, 0x58, 0xa4, 0xa2, 0xf4, - 0x4d, 0x29, 0x86, 0xda, 0xf6, 0xd0, 0x53, 0x3d, 0xf9, 0x37, 0x4e, 0x9f, - 0xa4, 0xa5, 0xdc, 0xa1, 0x82, 0x3d, 0x85, 0x2c, 0x36, 0x55, 0x0d, 0xd2, - 0x25, 0xac, 0x72, 0xa3, 0x38, 0x76, 0xa7, 0xfe, 0xb4, 0x66, 0xb6, 0x5c, - 0xeb, 0xc1, 0x8f, 0x4d, 0x2c, 0x2d, 0xc5, 0xf2, 0x9c, 0xa2, 0x8d, 0xd4, - 0x9a, 0x3b, 0x22, 0xcd, 0x0b, 0x62, 0x32, 0x02, 0xa8, 0x5c, 0xa6, 0x94, - 0x13, 0xcf, 0xcf, 0x18, 0x6c, 0xef, 0x4e, 0x83, 0x09, 0xad, 0xd6, 0x29, - 0x00, 0xfc, 0x0a, 0xfa, 0xe4, 0x4d, 0x46, 0x1e, 0x6b, 0xd0, 0x7e, 0x7b, - 0xf1, 0x86, 0x45, 0x58, 0x77, 0xd8, 0x51, 0xff, 0xa5, 0xf3, 0xe0, 0x5f, - 0xe2, 0x08, 0x8b, 0xe2, 0x2d, 0x60, 0xde, 0xb5, 0x78, 0xf0, 0x7d, 0x59, - 0x70, 0xaf, 0x95, 0x6f, 0x03, 0x79, 0xa0, 0x76, 0x65, 0x39, 0xb2, 0x16, - 0xad, 0x38, 0xe5, 0xef, 0xa7, 0x83, 0x5b, 0x58, 0xa8, 0x8b, 0x2b, 0x0d, - 0xaf, 0xae, 0x8d, 0xf6, 0x18, 0xe9, 0xc5, 0x0a, 0xf0, 0xfd, 0x6d, 0x0e, - 0x6b, 0xd8, 0x62, 0x09, 0x20, 0xda, 0xe5, 0x45, 0xbd, 0x51, 0x5e, 0x9e, - 0xad, 0xbc, 0x5a, 0xe9, 0x5b, 0x8f, 0xf0, 0x58, 0xb9, 0xb1, 0x86, 0xed, - 0x6e, 0xbf, 0xc2, 0x14, 0x55, 0xdc, 0x50, 0x3f, 0xa3, 0xcb, 0xb0, 0x09, - 0xd9, 0x85, 0x65, 0x0a, 0x68, 0x28, 0x41, 0xa4, 0xb3, 0xcb, 0x6c, 0x58, - 0xb4, 0x6d, 0x57, 0x11, 0xed, 0xda, 0x77, 0x68, 0x18, 0x27, 0x61, 0x7e, - 0x1c, 0x8b, 0xc5, 0x99, 0x77, 0xbe, 0x88, 0x40, 0x89, 0xbc, 0xd3, 0x0e, - 0xa0, 0xd0, 0x1c, 0xcb, 0x75, 0x03, 0x91, 0xaa, 0x47, 0xfd, 0x7f, 0x32, - 0x34, 0xb0, 0xe7, 0xc3, 0xda, 0x2b, 0x06, 0xa9, 0x05, 0x51, 0xa4, 0xfe, - 0xef, 0x42, 0xc1, 0xde, 0x05, 0xea, 0xe2, 0x45, 0x62, 0x36, 0xa3, 0x9e, - 0x36, 0xce, 0xbb, 0xab, 0x48, 0x9c, 0x40, 0x60, 0xee, 0x35, 0x45, 0x7e, - 0x24, 0xe5, 0x16, 0xac, 0xfe, 0x21, 0xe5, 0x45, 0x7d, 0xc0, 0xbd, 0x2d, - 0x1c, 0xf2, 0x29, 0xd8, 0x7d, 0xfa, 0x25, 0x32, 0xe0, 0x63, 0xa2, 0xc9, - 0x02, 0xba, 0x22, 0x18, 0x6e, 0x63, 0xa9, 0xa3, 0x84, 0xc5, 0xab, 0xbb, - 0xf9, 0xa3, 0x8a, 0xef, 0x7e, 0x86, 0x1e, 0x3f, 0x0a, 0x9e, 0x25, 0x20, - 0x14, 0x77, 0xad, 0xae, 0xb1, 0xf9, 0x38, 0x18, 0x99, 0x81, 0xb5, 0x73, - 0xf8, 0x2a, 0x7e, 0x23, 0x76, 0x2b, 0x70, 0xc2, 0x8c, 0x2a, 0x4b, 0x5b, - 0x7f, 0x18, 0x1a, 0xd6, 0xf1, 0x10, 0xa5, 0xf7, 0xf2, 0x8e, 0x84, 0x83, - 0x1b, 0x56, 0x24, 0x5f, 0x11, 0xe9, 0x9a, 0xa8, 0xfc, 0x04, 0xb4, 0x41, - 0xe6, 0x18, 0xfd, 0xf9, 0xd4, 0x14, 0x93, 0x46, 0xe5, 0x43, 0xb1, 0xad, - 0xb6, 0x17, 0x32, 0x95, 0xe5, 0x31, 0xbc, 0xf7, 0xe9, 0x1f, 0x80, 0x52, - 0x6c, 0x49, 0x31, 0xa4, 0x75, 0x0f, 0xca, 0xa8, 0xd0, 0x1c, 0xce, 0xba, - 0x6b, 0x27, 0x82, 0x28, 0x4a, 0x19, 0x4c, 0x9a, 0xcc, 0x97, 0x51, 0xd5, - 0x2b, 0xab, 0xe4, 0x61, 0xf9, 0x32, 0xc6, 0xe0, 0xfc, 0xd1, 0xc8, 0x1f, - 0x5c, 0x16, 0x1f, 0x05, 0x2f, 0xb9, 0x05, 0x4a, 0x34, 0x05, 0x20, 0x8e, - 0x95, 0x0f, 0xd5, 0x07, 0x5b, 0x38, 0x35, 0xc0, 0x12, 0xc2, 0x95, 0x10, - 0xe6, 0xeb, 0x4e, 0x4b, 0x3a, 0x11, 0x38, 0x10, 0x08, 0xac, 0x4e, 0xd9, - 0x7f, 0xf7, 0x41, 0xa2, 0x0f, 0x98, 0x78, 0x2c, 0xf7, 0x0b, 0xdc, 0x5f, - 0x80, 0xb3, 0xf9, 0xd9, 0xf4, 0x1d, 0x78, 0xf6, 0x4f, 0x50, 0xfb, 0x5f, - 0x4a, 0xf5, 0xbb, 0xb0, 0xa5, 0x56, 0xbb, 0x6f, 0xfc, 0x3d, 0x50, 0x53, - 0x2e, 0x60, 0xd0, 0x42, 0x47, 0xd5, 0xb6, 0x4f, 0x39, 0x5d, 0xcd, 0x6b, - 0x3e, 0x1e, 0x36, 0x13, 0xf2, 0xea, 0x35, 0xe9, 0x83, 0xa9, 0xe2, 0x43, - 0x7d, 0xd5, 0x9f, 0xa0, 0x0f, 0x92, 0xb4, 0xe6, 0x70, 0x35, 0x39, 0xe7, - 0x07, 0x9c, 0x0e, 0xa4, 0x5b, 0xc3, 0x33, 0xe9, 0x45, 0x4d, 0x19, 0xa8, - 0x9b, 0xda, 0xa6, 0xdf, 0xf3, 0x91, 0x4f, 0x0f, 0x07, 0x92, 0x04, 0x10, - 0x96, 0xaf, 0x0a, 0x77, 0x56, 0x75, 0xa3, 0x0b, 0x73, 0x4e, 0x1d, 0xc7, - 0x22, 0x48, 0xec, 0x2e, 0xde, 0x36, 0x3b, 0x57, 0x2c, 0x68, 0xa6, 0xc0, - 0x98, 0xa0, 0xa5, 0x1d, 0x39, 0x39, 0x07, 0x50, 0x14, 0x93, 0x04, 0x29, - 0x33, 0xc7, 0x39, 0x4a, 0x6f, 0x13, 0x0d, 0xfb, 0x11, 0x51, 0x0e, 0x0a, - 0xa0, 0xc8, 0xa6, 0x75, 0x9a, 0x2c, 0x0c, 0xbd, 0x66, 0x75, 0xf3, 0x94, - 0xbe, 0xdd, 0xc7, 0xa5, 0xcf, 0xda, 0xaa, 0x65, 0xa8, 0x77, 0xf3, 0xb6, - 0xb8, 0x9d, 0x01, 0x25, 0xc4, 0x87, 0xf6, 0xca, 0x8b, 0x1d, 0x15, 0xb9, - 0x8b, 0xcd, 0x16, 0x80, 0x5f, 0xdd, 0xdc, 0xad, 0x3c, 0x0a, 0x45, 0xb6, - 0xac, 0xdb, 0xc4, 0xba, 0x9f, 0x59, 0x47, 0x55, 0xa1, 0xe4, 0x55, 0x7b, - 0xbf, 0x5a, 0x6a, 0xef, 0x01, 0x1b, 0x69, 0xb8, 0x19, 0x45, 0xda, 0xe9, - 0x95, 0x4a, 0x2e, 0x62, 0x82, 0x7a, 0x63, 0xea, 0x0b, 0x14, 0xc6, 0x0b, - 0xc2, 0x78, 0xce, 0x73, 0x50, 0x4b, 0xd8, 0xee, 0xcc, 0xef, 0xfc, 0x28, - 0xb4, 0x24, 0x7f, 0x36, 0xf5, 0x9c, 0x8c, 0x41, 0x23, 0x7d, 0x10, 0x87, - 0xdd, 0xf1, 0x75, 0xe8, 0x3e, 0x7d, 0x58, 0x23, 0x8e, 0xb6, 0x42, 0x46, - 0xc7, 0x23, 0xfb, 0xee, 0x85, 0xaf, 0x72, 0xbd, 0x62, 0xb3, 0xaa, 0x8e, - 0x44, 0x0e, 0x4a, 0xab, 0x5a, 0x9b, 0x41, 0xc8, 0x67, 0x90, 0x4b, 0xf8, - 0xcf, 0x47, 0x3c, 0x3f, 0x76, 0x32, 0xf9, 0xc5, 0x47, 0x66, 0x7a, 0x93, - 0x1a, 0xeb, 0xe1, 0xe8, 0xf8, 0xb9, 0x9a, 0xa6, 0xa4, 0x11, 0x5d, 0xe5, - 0xec, 0x27, 0xa0, 0x5a, 0x52, 0x96, 0x70, 0xf1, 0x41, 0x11, 0xd1, 0x9f, - 0xe6, 0xbc, 0x3f, 0x2f, 0xfd, 0xa6, 0x5f, 0xd8, 0xd1, 0x36, 0x10, 0x80, - 0x98, 0x6f, 0x1f, 0x00, 0x7e, 0xf2, 0xb3, 0xd8, 0x65, 0x8e, 0xc8, 0x5d, - 0x81, 0xfb, 0xeb, 0x3d, 0xef, 0xea, 0xc1, 0x87, 0x0d, 0x68, 0x29, 0x79, - 0xdd, 0x4a, 0x73, 0x02, 0xcc, 0xe3, 0xed, 0xfe, 0x27, 0xfc, 0x3d, 0x9b, - 0x43, 0x18, 0x13, 0x35, 0xea, 0x18, 0xfe, 0x11, 0xde, 0x8b, 0xf6, 0x4a, - 0x08, 0xc3, 0xe4, 0x39, 0x7e, 0xee, 0x6e, 0xce, 0x41, 0x8b, 0x08, 0x57, - 0xdf, 0x6f, 0x7e, 0x7b, 0x4f, 0xee, 0x48, 0x95, 0x9d, 0x61, 0x95, 0xb0, - 0x8c, 0x2a, 0x55, 0xa3, 0x9e, 0xda, 0xdf, 0x60, 0x67, 0x8a, 0x87, 0xc0, - 0xa3, 0x05, 0xde, 0x79, 0xad, 0xeb, 0x19, 0x74, 0x1b, 0x77, 0x4c, 0x7d, - 0x94, 0x4d, 0xbc, 0x8f, 0x0e, 0x25, 0xe6, 0x2e, 0x9b, 0x14, 0x24, 0x52, - 0x4b, 0x62, 0xbb, 0xbc, 0x69, 0xd2, 0x65, 0x4e, 0x66, 0xdd, 0x3e, 0xe7, - 0x5e, 0xfd, 0xc6, 0xd6, 0x48, 0x56, 0xe8, 0x56, 0x32, 0x2d, 0x63, 0x8f, - 0xab, 0x87, 0x6f, 0x4c, 0x9a, 0x3a, 0xcc, 0x9d, 0xd6, 0x42, 0xec, 0x90, - 0x94, 0x69, 0x05, 0xa5, 0x98, 0x22, 0x4f, 0xb0, 0x14, 0xcf, 0xe2, 0x1e, - 0xe6, 0x24, 0x9f, 0x9d, 0x31, 0x36, 0x6d, 0xce, 0xfb, 0xab, 0xa4, 0x28, - 0xd9, 0x3a, 0x29, 0xad, 0x55, 0xdc, 0x60, 0xc3, 0x76, 0x0b, 0x9d, 0x38, - 0xfe, 0x45, 0xc0, 0xba, 0xb5, 0x1f, 0x78, 0xd1, 0x3b, 0xbf, 0x55, 0xbd, - 0x98, 0xd4, 0xf3, 0xdb, 0x63, 0x20, 0x19, 0x12, 0x8e, 0x11, 0xbb, 0xc6, - 0x63, 0x78, 0x00, 0x1b, 0x83, 0x2c, 0xaf, 0x86, 0xe1, 0x4d, 0x41, 0xb4, - 0x20, 0xf2, 0xc5, 0x44, 0x12, 0xbc, 0xa1, 0x69, 0x69, 0xe6, 0x60, 0x7b, - 0xf1, 0x23, 0xe2, 0x3b, 0x01, 0x61, 0xfe, 0x46, 0x36, 0x07, 0xcd, 0xd5, - 0x54, 0xb8, 0x62, 0xc8, 0x46, 0x81, 0x8c, 0xb7, 0x09, 0xaf, 0x45, 0xfb, - 0x78, 0x2a, 0xab, 0x96, 0x6d, 0xb3, 0x9f, 0x44, 0x4e, 0x92, 0x08, 0xca, - 0x48, 0x0b, 0xf0, 0xb5, 0x8a, 0xd9, 0xbf, 0xad, 0xa6, 0x8d, 0xef, 0x64, - 0x8a, 0xb2, 0x51, 0xb9, 0x18, 0x84, 0xa1, 0xb0, 0x40, 0x01, 0xf2, 0x93, - 0x9e, 0xaa, 0x37, 0xfc, 0xb0, 0x4a, 0x30, 0xe9, 0x3d, 0xbe, 0x92, 0xeb, - 0xf0, 0xc7, 0x95, 0x61, 0x30, 0x63, 0xb9, 0xa2, 0x7e, 0xdf, 0xa2, 0x64, - 0x20, 0xd6, 0xab, 0x3f, 0x68, 0x84, 0x0d, 0x8a, 0xbd, 0x20, 0x68, 0x17, - 0x96, 0x61, 0xd6, 0xdd, 0xa8, 0x4b, 0x33, 0x0c, 0x6b, 0x9a, 0xb7, 0x17, - 0x00, 0x30, 0x5f, 0xd1, 0xcb, 0xad, 0xe7, 0x90, 0x56, 0x63, 0x2e, 0xa6, - 0xd9, 0xf0, 0x4e, 0xbc, 0xd3, 0xe4, 0x53, 0xf1, 0x5c, 0xd1, 0x32, 0xb3, - 0x9a, 0x1c, 0xa7, 0xf7, 0xf9, 0xfb, 0xb5, 0xe5, 0x8b, 0xaf, 0x72, 0xca, - 0xb8, 0x05, 0x45, 0x63, 0xf7, 0x7c, 0x43, 0xd4, 0x26, 0x65, 0x54, 0x54, - 0x5e, 0x9e, 0x8b, 0x9d, 0x84, 0xb8, 0x13, 0xb1, 0xb7, 0xbf, 0xeb, 0xde, - 0x0c, 0x39, 0x79, 0x20, 0x7d, 0x2a, 0xbf, 0x97, 0xf0, 0x3a, 0x96, 0xb7, - 0xf3, 0x43, 0xb6, 0xf9, 0x14, 0xcb, 0x18, 0x96, 0xad, 0xae, 0x0f, 0x8b, - 0x14, 0x03, 0xad, 0x42, 0x0e, 0xee, 0x16, 0x24, 0x61, 0x20, 0xa2, 0x9d, - 0x8f, 0x0d, 0x11, 0x63, 0xb8, 0x5b, 0x10, 0x8f, 0x33, 0x51, 0x80, 0x02, - 0x93, 0x42, 0x30, 0x82, 0x40, 0xce, 0xc0, 0x03, 0x86, 0x42, 0x77, 0x32, - 0xa8, 0xf5, 0xb5, 0x8f, 0x4d, 0xbe, 0x2d, 0x1f, 0x4c, 0xc9, 0xbe, 0xa5, - 0xf0, 0xcc, 0x4e, 0x49, 0x9d, 0x27, 0xc3, 0xa9, 0x09, 0xfe, 0xff, 0xf9, - 0x51, 0xf4, 0xb4, 0x17, 0x71, 0xce, 0xee, 0xc3, 0x77, 0xf7, 0x72, 0x01, - 0x0f, 0xc8, 0xec, 0x5b, 0xd7, 0x31, 0xc7, 0xfb, 0xd7, 0xfb, 0xb5, 0x3b, - 0x06, 0xee, 0x33, 0xc6, 0x81, 0x63, 0x67, 0xed, 0x96, 0x47, 0x43, 0x9d, - 0xb3, 0x76, 0x23, 0x18, 0xfa, 0xc1, 0xbc, 0x99, 0xd4, 0xed, 0x97, 0xcd, - 0xbd, 0x0a, 0x2c, 0xd1, 0x99, 0xb6, 0xc2, 0x5d, 0x3d, 0x1d, 0xf2, 0xe6, - 0xe7, 0xc2, 0x31, 0xd7, 0xad, 0xdc, 0x5b, 0x7f, 0xbf, 0x50, 0xec, 0x70, - 0xb8, 0xb0, 0x51, 0xa2, 0xe9, 0x84, 0x8b, 0x2d, 0x1a, 0xa7, 0xdb, 0x05, - 0xf4, 0x2f, 0x5f, 0x83, 0x7a, 0x28, 0xbb, 0xbe, 0xdb, 0x6f, 0xf0, 0xea, - 0x75, 0x05, 0x50, 0x28, 0x5d, 0x24, 0x07, 0xcb, 0xa7, 0xe1, 0xeb, 0x6e, - 0x06, 0xe8, 0xb7, 0x42, 0x20, 0x8e, 0x23, 0xfe, 0x7b, 0x83, 0x1a, 0xb5, - 0x05, 0x09, 0x76, 0x7d, 0x91, 0x2b, 0x2f, 0x39, 0xdb, 0x47, 0x1d, 0xae, - 0xc9, 0xad, 0x2c, 0x89, 0xc8, 0x18, 0x47, 0x87, 0x95, 0xfb, 0x5d, 0xf5, - 0x5c, 0x95, 0x17, 0xc4, 0x87, 0x38, 0x1c, 0x8c, 0x85, 0x6e, 0xc2, 0x11, - 0xc6, 0x38, 0x97, 0xd3, 0x50, 0x32, 0x10, 0x0d, 0x1d, 0x9c, 0x40, 0x0a, - 0x85, 0xb1, 0xc0, 0xa8, 0x72, 0xd4, 0xfe, 0xe0, 0x6f, 0xc1, 0xcb, 0xe2, - 0x83, 0xfe, 0xe5, 0x57, 0x65, 0x41, 0xd9, 0x41, 0x1a, 0x97, 0x86, 0x24, - 0xaf, 0x46, 0x37, 0x78, 0x64, 0x4d, 0x7c, 0x6b, 0x13, 0xd6, 0xda, 0x3b, - 0xb9, 0xe7, 0x7d, 0x3a, 0x03, 0x77, 0x21, 0x7b, 0xa2, 0x0b, 0xb6, 0x86, - 0x57, 0x14, 0xc0, 0xf5, 0xf9, 0xa2, 0xee, 0xe1, 0x46, 0xb6, 0x46, 0x36, - 0xd4, 0x0b, 0x2c, 0x5e, 0x96, 0xc3, 0x73, 0x65, 0x64, 0x2e, 0x56, 0x22, - 0x76, 0xec, 0xd2, 0x1b, 0xbe, 0x62, 0x62, 0x38, 0xfd, 0x77, 0x6e, 0xa8, - 0x2c, 0x0e, 0xc8, 0x8a, 0xf2, 0x27, 0x09, 0xde, 0x2b, 0x4a, 0x3a, 0x4b, - 0xd8, 0x89, 0xfa, 0x04, 0xbc, 0xaf, 0x0c, 0xe3, 0xdf, 0x59, 0x41, 0xf1, - 0x63, 0xdd, 0xfe, 0x52, 0xe0, 0x84, 0x86, 0x03, 0xf1, 0xbb, 0xb1, 0x16, - 0xa4, 0xee, 0x4c, 0xc0, 0x26, 0x19, 0xd1, 0xe5, 0x76, 0x8d, 0xaf, 0x9d, - 0xb3, 0xd7, 0xcd, 0xf4, 0xde, 0xca, 0x47, 0x43, 0x5e, 0xe3, 0xa2, 0x61, - 0x07, 0x62, 0x8a, 0x0a, 0xba, 0xab, 0x0d, 0xd0, 0x2a, 0xd0, 0x47, 0xf6, - 0x97, 0x46, 0xc5, 0xf1, 0x39, 0xdc, 0x3f, 0x63, 0x6e, 0xc5, 0xee, 0x0d, - 0x39, 0xed, 0x03, 0xe1, 0x29, 0x97, 0x25, 0x4f, 0x22, 0x51, 0xe9, 0xe9, - 0xca, 0xa6, 0xb9, 0x31, 0xef, 0xe4, 0xa6, 0x2a, 0xac, 0x04, 0x85, 0xc9, - 0x1e, 0xb2, 0x9b, 0x35, 0x51, 0xd3, 0xfa, 0x1f, 0x0e, 0x0e, 0xa6, 0xf7, - 0x02, 0xdd, 0xcf, 0xeb, 0x27, 0xad, 0x05, 0x4a, 0x71, 0x9b, 0xcf, 0x2a, - 0x75, 0x40, 0x0a, 0x6d, 0x16, 0x8e, 0x4e, 0x3d, 0x4e, 0x36, 0xb4, 0x3f, - 0xc8, 0x91, 0x86, 0xfc, 0xf8, 0x8d, 0x5b, 0xf5, 0x88, 0x4c, 0x84, 0xe5, - 0xd5, 0xec, 0xce, 0x1a, 0x24, 0x0d, 0xc2, 0x03, 0x89, 0x78, 0xb4, 0x8a, - 0x9c, 0x83, 0xfb, 0x2c, 0x6c, 0x64, 0xd9, 0x3f, 0x45, 0x12, 0x30, 0xbe, - 0x95, 0x5c, 0x59, 0x35, 0x24, 0x6b, 0x56, 0x1c, 0x16, 0xe1, 0xf9, 0x4c, - 0xb9, 0x6c, 0x0c, 0x13, 0x22, 0xf6, 0x33, 0xc6, 0xe9, 0x08, 0x4e, 0xf3, - 0x4a, 0xb2, 0xac, 0xdf, 0xbe, 0x3f, 0x76, 0x2f, 0x9f, 0xef, 0x8a, 0xa9, - 0xc4, 0xe4, 0x30, 0xab, 0x4a, 0xb7, 0xdc, 0xa2, 0x62, 0xf4, 0x66, 0x4d, - 0xa2, 0x11, 0xc6, 0x60, 0x3a, 0x83, 0xa1, 0x09, 0xe2, 0xdc, 0xf6, 0xf9, - 0x19, 0x7a, 0x25, 0xd7, 0x64, 0x96, 0xaf, 0xbe, 0xc4, 0x61, 0x3f, 0x8a, - 0x10, 0x80, 0xae, 0x6e, 0x22, 0x1c, 0xa0, 0x1b, 0x57, 0x93, 0x4f, 0x80, - 0xa1, 0x39, 0x9a, 0xaa, 0x58, 0xe9, 0x04, 0x8f, 0x21, 0xf2, 0x12, 0x0a, - 0xbd, 0x36, 0x63, 0x22, 0x51, 0xe9, 0xfa, 0x0d, 0xb9, 0x59, 0xc2, 0x0f, - 0xa1, 0x9d, 0xcb, 0x7e, 0x58, 0x73, 0x9b, 0x90, 0xd6, 0xe0, 0xa6, 0x2b, - 0x0b, 0x13, 0x7a, 0x10, 0x36, 0x13, 0x09, 0xaa, 0xd8, 0xec, 0x69, 0xdd, - 0x87, 0x7e, 0x7b, 0xeb, 0x51, 0x46, 0x20, 0x87, 0x21, 0xbd, 0x1b, 0x91, - 0x17, 0x12, 0x50, 0x5f, 0xa1, 0xf3, 0x06, 0xa0, 0xc7, 0x65, 0x08, 0x9c, - 0x21, 0x14, 0x20, 0x22, 0xdf, 0xc5, 0xd7, 0x1a, 0xc9, 0xb8, 0xd5, 0xc0, - 0xbb, 0x14, 0x3c, 0x4e, 0xe1, 0xf9, 0x45, 0xe0, 0xc1, 0x8a, 0xcb, 0x28, - 0x37, 0xbb, 0x7c, 0xc2, 0x73, 0x48, 0x7d, 0x42, 0x03, 0xa5, 0x6f, 0x9f, - 0x07, 0x0f, 0xb7, 0x35, 0x01, 0x39, 0xf2, 0x8b, 0x4d, 0x50, 0xbf, 0x6a, - 0xc2, 0x44, 0x27, 0xc2, 0xd1, 0x68, 0x7e, 0x32, 0x3c, 0x48, 0x24, 0x9b, - 0xba, 0x51, 0x43, 0x38, 0xf3, 0x3d, 0x93, 0x3c, 0xda, 0xb5, 0xa9, 0xef, - 0x23, 0xbe, 0x92, 0x7c, 0xc7, 0xf1, 0x37, 0xa7, 0x3c, 0xfe, 0x89, 0xc3, - 0x0b, 0xfa, 0x10, 0xfe, 0xc8, 0x53, 0xcb, 0xfb, 0xe9, 0xeb, 0x05, 0xe6, - 0xd0, 0xe9, 0x96, 0x29, 0x56, 0x61, 0x12, 0x75, 0x91, 0x65, 0x2d, 0x81, - 0xc5, 0x32, 0x50, 0xe4, 0xe2, 0xe8, 0x76, 0xcb, 0xbb, 0x0a, 0x55, 0xdc, - 0x25, 0xa4, 0x42, 0x1d, 0x8f, 0xd4, 0x7f, 0x8c, 0x84, 0xb4, 0xb3, 0xb2, - 0x87, 0xf1, 0x9d, 0x6b, 0x3b, 0x0a, 0xae, 0x20, 0x04, 0x38, 0xb6, 0xea, - 0x43, 0x95, 0x2d, 0xad, 0x60, 0x64, 0x1a, 0x33, 0xd0, 0xfd, 0x04, 0x88, - 0x75, 0xec, 0x0d, 0x45, 0x7f, 0x5e, 0x23, 0x2a, 0x64, 0xb0, 0x26, 0xcc, - 0xb1, 0x46, 0x04, 0xbf, 0x20, 0x59, 0x0c, 0xd5, 0x8f, 0x2c, 0xa9, 0xce, - 0x01, 0x2f, 0x4d, 0x9a, 0xd1, 0xd6, 0xb4, 0xb5, 0xf4, 0xea, 0x5d, 0x11, - 0xfd, 0xe4, 0x7d, 0x51, 0x11, 0x7e, 0xd5, 0x4c, 0x36, 0x12, 0xfc, 0x24, - 0x0a, 0x37, 0x20, 0x3e, 0x5f, 0x0e, 0xdd, 0x83, 0xa8, 0x85, 0xce, 0x2f, - 0xa7, 0xc0, 0x7e, 0xd6, 0x56, 0x21, 0x8f, 0x65, 0x48, 0x0c, 0x25, 0x35, - 0x08, 0xf3, 0x04, 0x84, 0xe2, 0x25, 0x71, 0xc0, 0x13, 0xa9, 0xe6, 0x77, - 0x3f, 0x9b, 0x3a, 0x10, 0xa0, 0x2c, 0x28, 0xdb, 0x70, 0xfe, 0x3f, 0x40, - 0x68, 0x24, 0xfb, 0x3f, 0x3a, 0x76, 0x60, 0x88, 0x6b, 0x4a, 0xda, 0xcf, - 0xdd, 0x97, 0x6b, 0x6a, 0xef, 0x49, 0x16, 0x53, 0xe7, 0x0e, 0xf5, 0x3c, - 0x15, 0x94, 0xe2, 0xce, 0xdd, 0x21, 0x11, 0xbf, 0xd7, 0xf9, 0x9b, 0xa0, - 0x2b, 0xc2, 0x51, 0x7b, 0x79, 0x00, 0x21, 0x5b, 0x48, 0x96, 0xe7, 0x59, - 0x15, 0x40, 0x95, 0x05, 0x93, 0x3a, 0x24, 0x2e, 0x2c, 0x19, 0x6e, 0x42, - 0x9a, 0x1e, 0x7b, 0x8e, 0x96, 0x4e, 0xbb, 0xf1, 0xfb, 0xea, 0x3b, 0xc1, - 0xda, 0x9a, 0x85, 0x97, 0x32, 0xab, 0xd4, 0x06, 0x0a, 0xe8, 0xb7, 0x95, - 0x82, 0x20, 0x18, 0xfb, 0x2c, 0x93, 0x30, 0x42, 0x21, 0xbc, 0xe8, 0xe0, - 0x74, 0x7d, 0xc0, 0xbf, 0xcc, 0xad, 0xad, 0x43, 0xfe, 0x46, 0xec, 0x35, - 0xcd, 0x74, 0xed, 0x23, 0xd8, 0x7a, 0xb8, 0x53, 0xcd, 0x60, 0xef, 0xed, - 0xfe, 0x9a, 0x6b, 0x33, 0x07, 0x8f, 0x6d, 0xde, 0x35, 0xcd, 0xb3, 0xd1, - 0x92, 0x9f, 0x19, 0xaf, 0xfd, 0x0e, 0xab, 0x65, 0x64, 0x7f, 0x0e, 0x16, - 0xd5, 0x3d, 0x4f, 0x72, 0x38, 0x08, 0x47, 0xe5, 0xea, 0xdd, 0xe4, 0xc4, - 0xed, 0x10, 0x4a, 0x83, 0x6d, 0xad, 0x7f, 0xf5, 0x96, 0xd3, 0xc8, 0xee, - 0x1b, 0x30, 0xa4, 0xf7, 0x76, 0x27, 0xae, 0x39, 0x57, 0x62, 0x39, 0x7f, - 0x75, 0x9c, 0xf7, 0x60, 0x4d, 0xa3, 0xdb, 0x70, 0xd0, 0xbc, 0x92, 0x90, - 0x41, 0x54, 0xaa, 0x40, 0x6b, 0xaf, 0x71, 0x1a, 0xc8, 0x58, 0x81, 0xd2, - 0x10, 0xd6, 0x75, 0x2f, 0x22, 0x92, 0xd7, 0x72, 0xda, 0x9b, 0x19, 0x18, - 0x57, 0x1b, 0x0d, 0x69, 0x5e, 0x22, 0x8a, 0x85, 0x00, 0x0b, 0xd7, 0x5c, - 0x16, 0xb4, 0xe4, 0xb7, 0x4f, 0xdc, 0xec, 0x5b, 0xbd, 0x3d, 0x19, 0xfd, - 0x9e, 0x6e, 0x6e, 0x46, 0xf4, 0x86, 0x8c, 0xf7, 0x0f, 0x23, 0x94, 0x5d, - 0xec, 0x2f, 0x67, 0x41, 0xc2, 0x5d, 0x80, 0xaa, 0x2c, 0x36, 0xa9, 0xf2, - 0x46, 0x76, 0x49, 0x54, 0xfe, 0xe0, 0xe6, 0xaf, 0x0b, 0x80, 0xbc, 0xca, - 0xbf, 0x25, 0x6d, 0x45, 0x48, 0xf8, 0xd2, 0xf4, 0xb0, 0x9a, 0xd5, 0xea, - 0x10, 0x06, 0xf5, 0xdd, 0x1a, 0xfa, 0xa2, 0x6a, 0x7c, 0x46, 0x22, 0x58, - 0x26, 0xc8, 0x31, 0x36, 0x73, 0x11, 0x80, 0x88, 0x60, 0xea, 0x67, 0x8f, - 0xb5, 0xd0, 0xef, 0x8c, 0xc1, 0xe8, 0xaa, 0xce, 0xf0, 0xe7, 0x27, 0xf7, - 0xb5, 0xe4, 0xc9, 0xe4, 0x9e, 0x94, 0x90, 0x92, 0xdc, 0x65, 0xcf, 0x7a, - 0x1e, 0xf8, 0x2a, 0x8c, 0x66, 0xa4, 0x17, 0xa9, 0xaa, 0x05, 0xca, 0x90, - 0x00, 0x01, 0xf1, 0xa3, 0x8a, 0xc9, 0x1a, 0x18, 0xc9, 0xc2, 0x2f, 0xf8, - 0x47, 0x21, 0x57, 0x6e, 0xe9, 0x12, 0x9a, 0x9d, 0x92, 0x9b, 0x68, 0xac, - 0x76, 0x88, 0x5e, 0x65, 0x4e, 0x8a, 0xfd, 0x2a, 0x30, 0xe8, 0x9e, 0x86, - 0x9e, 0xf4, 0x7c, 0xc2, 0x1c, 0x6f, 0x6b, 0x06, 0xc7, 0x90, 0x25, 0x35, - 0xd0, 0x6d, 0x32, 0xd7, 0x88, 0x8b, 0x3b, 0x48, 0x49, 0xe9, 0x42, 0x97, - 0x78, 0x1d, 0x6e, 0xbe, 0xe2, 0xf6, 0xca, 0x22, 0x38, 0x19, 0xd5, 0x23, - 0x5c, 0x9e, 0x68, 0x18, 0xbf, 0x3e, 0xcd, 0x9d, 0x58, 0x12, 0xd4, 0xa0, - 0x53, 0x0a, 0x0a, 0x8b, 0x30, 0xd3, 0x8a, 0xf9, 0xc9, 0x4e, 0x57, 0xf7, - 0x31, 0x04, 0xdd, 0x0b, 0xc9, 0xb4, 0xc2, 0x67, 0x64, 0x85, 0x5e, 0xe6, - 0x14, 0xcd, 0x5e, 0xa5, 0x49, 0x3e, 0x83, 0xa9, 0xf1, 0xd3, 0xce, 0x7f, - 0x22, 0x73, 0x93, 0x32, 0x65, 0x81, 0x08, 0xfe, 0x90, 0x02, 0xd8, 0x7f, - 0xe4, 0x9e, 0x51, 0xad, 0x3a, 0x2c, 0x77, 0x07, 0xa3, 0x16, 0xd9, 0x5f, - 0xb6, 0x58, 0x7b, 0xd7, 0x75, 0x91, 0x73, 0xb5, 0x04, 0x73, 0xea, 0x1a, - 0x0f, 0xbf, 0x00, 0x75, 0x43, 0xa1, 0x7d, 0x2c, 0xe8, 0xaa, 0xd0, 0x6d, - 0x49, 0x17, 0x45, 0x5e, 0x63, 0x23, 0x3f, 0x38, 0xcc, 0x27, 0x37, 0x32, - 0xd7, 0x10, 0x71, 0x54, 0x6e, 0xd5, 0xbb, 0x38, 0x61, 0x28, 0xd2, 0x52, - 0xce, 0xd7, 0x4a, 0x4c, 0x69, 0xdf, 0x3d, 0x4f, 0xc9, 0x27, 0x6c, 0x1c, - 0x90, 0x79, 0x5a, 0x5f, 0x0d, 0x2e, 0x30, 0x4e, 0xd4, 0x50, 0x7e, 0x62, - 0x33, 0x14, 0x21, 0xc8, 0xf9, 0xa9, 0x8b, 0xea, 0x2b, 0x0e, 0xee, 0xe4, - 0x3f, 0x22, 0xc0, 0xfc, 0x6b, 0x22, 0x6d, 0x4a, 0x50, 0x53, 0x18, 0xd8, - 0x23, 0x82, 0x91, 0x09, 0x0a, 0x9c, 0x8b, 0x0f, 0xbc, 0x14, 0xa2, 0xad, - 0xa5, 0x38, 0xb7, 0x3b, 0x43, 0xe3, 0xfc, 0x88, 0x87, 0x7a, 0x45, 0x6a, - 0x18, 0xd6, 0x0b, 0xdf, 0x23, 0x55, 0x2f, 0xdb, 0xba, 0x1f, 0x5a, 0xe7, - 0x4b, 0x92, 0xa1, 0x28, 0xd2, 0xcc, 0xa7, 0xaa, 0x3b, 0x67, 0x07, 0x15, - 0x25, 0xb1, 0xef, 0xbf, 0x1f, 0x17, 0x8e, 0xc2, 0xdb, 0x5d, 0x29, 0xb2, - 0xad, 0x4b, 0xc3, 0x03, 0x61, 0x4e, 0x50, 0x36, 0x72, 0xd8, 0x7d, 0xc2, - 0xa2, 0x32, 0x74, 0x2a, 0xe1, 0x79, 0x9c, 0x30, 0x47, 0xde, 0x21, 0x64, - 0x35, 0x0e, 0xcc, 0x1c, 0x6d, 0x0e, 0x1f, 0x49, 0xef, 0x33, 0xd8, 0x01, - 0x5a, 0xec, 0x9d, 0x6f, 0x23, 0x64, 0xdf, 0xbb, 0x02, 0x26, 0x39, 0x8f, - 0xdb, 0xb4, 0xfa, 0x2f, 0x56, 0x7e, 0x30, 0x0f, 0x90, 0x8c, 0x3c, 0xc8, - 0xb0, 0x72, 0x27, 0x81, 0x89, 0x9a, 0xc5, 0x93, 0x77, 0xdc, 0xe3, 0xb9, - 0x16, 0xa8, 0x9c, 0xf5, 0xf4, 0x34, 0x0f, 0x7c, 0x34, 0x37, 0x54, 0x48, - 0x4e, 0x64, 0x55, 0xc0, 0x1f, 0x01, 0xe1, 0x59, 0x70, 0x73, 0x83, 0x07, - 0x19, 0xda, 0xe2, 0x00, 0x82, 0xc0, 0x2d, 0xa6, 0x6d, 0xdf, 0x43, 0x57, - 0x8a, 0x96, 0x5f, 0x71, 0x03, 0xba, 0xf1, 0x9c, 0xfa, 0x26, 0xaa, 0x5e, - 0x40, 0x77, 0xf0, 0x13, 0x40, 0x37, 0x6f, 0xc7, 0xeb, 0x15, 0xb2, 0x80, - 0x53, 0x42, 0x07, 0x04, 0xb5, 0xda, 0xdf, 0x5c, 0xd5, 0x0f, 0x87, 0xd9, - 0x7b, 0xfe, 0x74, 0xfc, 0x37, 0x44, 0x55, 0xe2, 0x81, 0x58, 0x8d, 0x6b, - 0xea, 0x59, 0x9a, 0x5b, 0x84, 0x8e, 0x47, 0x58, 0xda, 0x55, 0x06, 0x14, - 0x69, 0x1c, 0x8c, 0xb9, 0x32, 0x04, 0xc1, 0x92, 0x72, 0x77, 0xb2, 0xc2, - 0x8c, 0x34, 0x87, 0x87, 0x23, 0x2e, 0x30, 0xc1, 0x48, 0xa6, 0x79, 0x87, - 0xdb, 0xe7, 0x20, 0x93, 0x63, 0x48, 0x12, 0xfd, 0xcd, 0xca, 0x09, 0x47, - 0x0e, 0xe2, 0x46, 0x40, 0xa5, 0x2b, 0xda, 0x8e, 0x4a, 0xf0, 0xd6, 0x0a, - 0xa6, 0xf2, 0x67, 0xba, 0xa7, 0xd8, 0xa5, 0x1e, 0x42, 0x3d, 0xea, 0x9c, - 0xd9, 0x59, 0xa1, 0x5d, 0x7b, 0xfb, 0x1a, 0x7d, 0xe7, 0xd6, 0xdd, 0x2a, - 0xbd, 0xf6, 0x84, 0x0f, 0xb9, 0x30, 0xa7, 0xb7, 0x54, 0x1c, 0x39, 0xae, - 0xca, 0x74, 0x99, 0xb1, 0x51, 0xe6, 0x6a, 0x8c, 0x0a, 0xab, 0x6b, 0x31, - 0xd9, 0x26, 0xe8, 0x16, 0xdc, 0xd8, 0x85, 0x1e, 0xf7, 0xe1, 0xbd, 0x23, - 0xe2, 0x3b, 0xa0, 0x0f, 0x4e, 0xc7, 0x18, 0xf1, 0x3f, 0x26, 0xdb, 0x0a, - 0xc6, 0x25, 0x0c, 0x29, 0xca, 0x32, 0xe9, 0x66, 0x26, 0x8d, 0x46, 0xf7, - 0x95, 0x7f, 0x2e, 0x81, 0x8c, 0x4c, 0xf1, 0xa6, 0x48, 0x6a, 0xd2, 0xd3, - 0x84, 0x91, 0x14, 0x27, 0x88, 0x2a, 0x6f, 0x50, 0x1d, 0xe2, 0x1c, 0x3c, - 0x55, 0x6b, 0x24, 0x5c, 0x0d, 0x09, 0x61, 0xa1, 0x7d, 0xe3, 0x8d, 0x6e, - 0xd1, 0x16, 0x36, 0x82, 0xd4, 0x0d, 0xf1, 0xfa, 0xb8, 0x13, 0x27, 0x47, - 0xad, 0x8f, 0xad, 0xe6, 0xff, 0x71, 0x2f, 0x17, 0x58, 0xf6, 0x3a, 0xc4, - 0x21, 0x3b, 0xf9, 0xfe, 0x76, 0x43, 0x0a, 0x8f, 0xb8, 0x3d, 0xa0, 0x81, - 0x48, 0x3a, 0x91, 0x41, 0x82, 0x31, 0xf3, 0x9e, 0x89, 0x26, 0xfa, 0xda, - 0xd0, 0x79, 0xed, 0x52, 0x7b, 0xd1, 0xf1, 0x50, 0xf8, 0xd4, 0x52, 0x13, - 0x75, 0x16, 0x83, 0xe5, 0x03, 0x27, 0xcb, 0x8e, 0x5c, 0x40, 0x1d, 0x91, - 0x75, 0x9e, 0x08, 0x50, 0x07, 0x30, 0x15, 0x12, 0x1a, 0x79, 0x51, 0x38, - 0x03, 0x9f, 0x2b, 0xc5, 0xaf, 0xb3, 0x32, 0xd3, 0xd3, 0xa1, 0xb1, 0x68, - 0x74, 0xe5, 0x85, 0x76, 0x0b, 0x27, 0x3c, 0x02, 0xcf, 0x50, 0xb5, 0x17, - 0xb0, 0x45, 0x15, 0x74, 0x9d, 0x68, 0x63, 0xb2, 0xb8, 0x2d, 0x5d, 0x3d, - 0x90, 0x85, 0xad, 0x7e, 0x3a, 0x7b, 0xdf, 0xfb, 0x0a, 0x38, 0x8f, 0xc3, - 0x06, 0x4e, 0x2a, 0x23, 0x91, 0xff, 0x75, 0x3c, 0xca, 0x1d, 0x23, 0xd6, - 0x9b, 0xcc, 0xd0, 0xae, 0xe6, 0xd1, 0xa6, 0x61, 0xd8, 0x70, 0xbf, 0xdc, - 0xb3, 0x8e, 0xe2, 0x97, 0x39, 0xd2, 0x82, 0xc2, 0xf8, 0x34, 0x8a, 0x90, - 0xec, 0x08, 0x86, 0x88, 0xe5, 0xb4, 0x80, 0x35, 0x27, 0x2d, 0xbb, 0x28, - 0x64, 0x5d, 0xee, 0x15, 0x13, 0x01, 0x6c, 0x78, 0x0c, 0x3b, 0x40, 0x8f, - 0x47, 0x2d, 0xe6, 0xe5, 0x62, 0x07, 0xe6, 0x9f, 0x12, 0x13, 0xde, 0xb0, - 0x94, 0x3c, 0x69, 0x93, 0x52, 0x6b, 0x49, 0x44, 0x6b, 0x50, 0x34, 0xe1, - 0x37, 0x77, 0xa5, 0x48, 0x14, 0xd3, 0x66, 0x63, 0x81, 0xce, 0xb6, 0x0b, - 0x54, 0x3f, 0xf8, 0xe0, 0x42, 0x28, 0x29, 0xe9, 0x01, 0x02, 0xa1, 0x37, - 0x25, 0xef, 0xc3, 0xa1, 0x88, 0xd9, 0x91, 0x64, 0x7f, 0xb7, 0x62, 0xd7, - 0x12, 0x6e, 0x19, 0x51, 0x1a, 0x0d, 0xda, 0x48, 0xfd, 0x57, 0xb4, 0x47, - 0xd6, 0x66, 0xd0, 0xd4, 0x6f, 0x71, 0x62, 0x24, 0x09, 0xb3, 0x98, 0x62, - 0x71, 0x0c, 0x03, 0x33, 0x07, 0x3e, 0x5d, 0x3f, 0x21, 0x5f, 0x22, 0xca, - 0xc2, 0x85, 0xd2, 0xbf, 0x3e, 0x44, 0xdf, 0x98, 0xc8, 0x9c, 0x49, 0xa0, - 0x29, 0x42, 0x1a, 0x00, 0xab, 0x02, 0x0d, 0x69, 0xcb, 0xf9, 0x68, 0x04, - 0x79, 0x50, 0x6a, 0x8a, 0x92, 0xc7, 0x1f, 0xa2, 0x9b, 0x65, 0xe7, 0xc8, - 0xb5, 0x0d, 0xc0, 0xfc, 0x24, 0x05, 0x6f, 0x33, 0xe9, 0xc8, 0x15, 0x73, - 0xe8, 0xcc, 0x94, 0x4d, 0x39, 0x3f, 0xcb, 0xf8, 0xbf, 0xbd, 0x3d, 0xbc, - 0x9a, 0x05, 0x66, 0x48, 0x6f, 0xb8, 0xd9, 0xe2, 0x6a, 0x4a, 0x3d, 0xc8, - 0x2e, 0x0a, 0xdf, 0x90, 0xae, 0x97, 0x6d, 0x9b, 0xbb, 0xe4, 0x3f, 0xf7, - 0xcc, 0xe4, 0xb2, 0x71, 0x70, 0x5d, 0xa9, 0xa0, 0xfc, 0x0e, 0xe5, 0x26, - 0x96, 0x9e, 0xcf, 0xde, 0xc2, 0x04, 0xba, 0x2f, 0xaf, 0x45, 0x3a, 0xe4, - 0x62, 0x04, 0x24, 0x70, 0xcc, 0x6b, 0x1f, 0x0f, 0x09, 0xf4, 0x6f, 0x9d, - 0xf6, 0x6d, 0xbf, 0xcc, 0x6c, 0xc2, 0xa2, 0x8e, 0xd3, 0xb0, 0xcf, 0x4e, - 0x0d, 0x23, 0x8d, 0x86, 0xcd, 0x2b, 0x0b, 0xa6, 0xcf, 0x75, 0x89, 0x4b, - 0xc8, 0x40, 0x16, 0x81, 0xae, 0xf4, 0x2d, 0x37, 0x48, 0x72, 0xc9, 0x69, - 0x57, 0x64, 0x62, 0x13, 0x80, 0x7b, 0x81, 0x9d, 0x54, 0x0d, 0xac, 0x6d, - 0x3d, 0x9d, 0x44, 0x23, 0x1a, 0xb9, 0xd3, 0x2f, 0xd2, 0x99, 0x09, 0x2c, - 0x2d, 0x80, 0x23, 0xf1, 0x65, 0xd9, 0xf7, 0x29, 0x32, 0x52, 0x71, 0x40, - 0x0f, 0xf8, 0xc2, 0x38, 0xac, 0x6e, 0x8d, 0xfd, 0x8d, 0xe4, 0x57, 0xd0, - 0xee, 0xac, 0x95, 0xac, 0x9e, 0x01, 0xc5, 0x49, 0x79, 0x93, 0x87, 0x8c, - 0xcd, 0x02, 0xf0, 0xe4, 0x67, 0x33, 0x87, 0x7a, 0xdd, 0xae, 0x66, 0x5f, - 0x82, 0x14, 0x8a, 0x83, 0x77, 0xa7, 0x76, 0xea, 0x85, 0xda, 0xf3, 0xe6, - 0xca, 0x19, 0xc3, 0xd7, 0xff, 0x07, 0xfa, 0x87, 0x16, 0x51, 0x3d, 0x2e, - 0xe0, 0xd5, 0xeb, 0xba, 0x2c, 0x41, 0xaf, 0x31, 0x5a, 0x98, 0x7d, 0x49, - 0x9a, 0x82, 0x54, 0xbe, 0x2e, 0xfb, 0xfd, 0xe4, 0x82, 0xd5, 0x15, 0x91, - 0x2f, 0xcb, 0x68, 0x39, 0xa1, 0x8d, 0x2f, 0x23, 0xb4, 0x4c, 0x86, 0x73, - 0xf2, 0x57, 0x4b, 0xfb, 0x41, 0x26, 0x5f, 0x2e, 0x53, 0x2b, 0x6e, 0x15, - 0x08, 0xb3, 0x46, 0x9b, 0xd5, 0xb3, 0x88, 0x87, 0x65, 0xe7, 0x2c, 0x54, - 0xa3, 0xc7, 0x05, 0x39, 0xdf, 0x3a, 0x95, 0x8c, 0x6b, 0x5c, 0xaa, 0x25, - 0xc0, 0x3e, 0xc5, 0xbe, 0x1e, 0xe5, 0xe9, 0xdf, 0xf6, 0x81, 0xe3, 0x11, - 0x5e, 0xe1, 0xb5, 0x8d, 0x0a, 0x6f, 0xfd, 0xd2, 0x90, 0x15, 0xc1, 0x1c, - 0x19, 0x53, 0x3a, 0x12, 0xfd, 0xfb, 0xb5, 0xcc, 0x52, 0xdd, 0x74, 0x3e, - 0x5c, 0xc3, 0xf2, 0x12, 0x4f, 0x02, 0x1c, 0xb9, 0x6b, 0x40, 0xd7, 0x52, - 0x0e, 0x5a, 0x47, 0x9b, 0x04, 0xeb, 0x15, 0xa5, 0x9c, 0x68, 0x88, 0x81, - 0x27, 0xc6, 0x2a, 0x3e, 0x6b, 0x4d, 0xfd, 0xb1, 0x76, 0x14, 0x86, 0x92, - 0x37, 0xe2, 0x26, 0x46, 0x58, 0x9b, 0xd9, 0x39, 0xbb, 0xdf, 0x05, 0x18, - 0xc8, 0xaf, 0x8b, 0x5d, 0x96, 0xc4, 0xf8, 0xcd, 0x84, 0x53, 0x82, 0xa9, - 0xbf, 0xe8, 0x73, 0x92, 0x78, 0x1e, 0x7e, 0x68, 0xd0, 0x87, 0x33, 0x6a, - 0x14, 0xbf, 0x79, 0xf2, 0x45, 0x39, 0x8e, 0xd0, 0xce, 0x71, 0xc4, 0x23, - 0x7d, 0x54, 0x90, 0xd3, 0x71, 0xd4, 0x58, 0x8d, 0xbe, 0xf9, 0x91, 0xd1, - 0xa6, 0x22, 0xec, 0xba, 0x56, 0xaf, 0xf6, 0xb7, 0x9d, 0xa0, 0x26, 0x52, - 0xe7, 0xce, 0x3f, 0xe0, 0x18, 0x23, 0xe4, 0x6b, 0xef, 0x23, 0x2d, 0x5d, - 0xbf, 0xc0, 0xe7, 0x0b, 0x9f, 0x8f, 0xde, 0xbe, 0x42, 0x0d, 0x27, 0x07, - 0x02, 0x6b, 0xd7, 0x8b, 0xa4, 0x83, 0x2a, 0x68, 0x4c, 0x9c, 0x68, 0x3d, - 0xdc, 0x88, 0x7e, 0x6c, 0xd5, 0xec, 0x4b, 0x8a, 0xeb, 0x18, 0x94, 0x55, - 0x6d, 0x21, 0x72, 0xff, 0xf0, 0xe8, 0xb3, 0x71, 0xde, 0x5f, 0xf0, 0x55, - 0x9d, 0xd3, 0x50, 0x79, 0xa1, 0xb3, 0x80, 0x8e, 0xf1, 0xfb, 0xce, 0x02, - 0x6d, 0xed, 0x50, 0xa7, 0x6e, 0xac, 0xb1, 0x4a, 0x3e, 0xa9, 0x72, 0xf6, - 0xf4, 0xbe, 0xe5, 0xb6, 0x8d, 0x3f, 0x2a, 0xd6, 0x74, 0x3b, 0xe9, 0x32, - 0x3e, 0x22, 0x6e, 0x87, 0xcf, 0xd2, 0x61, 0x34, 0xbe, 0x5c, 0x3d, 0xac, - 0xf4, 0x49, 0x4c, 0xd1, 0x91, 0xf2, 0x13, 0x5f, 0xb2, 0xea, 0xd3, 0x23, - 0x88, 0xec, 0x88, 0xde, 0x82, 0xef, 0x52, 0x2f, 0xda, 0xb7, 0x34, 0x15, - 0xdf, 0xe9, 0x24, 0x58, 0x2c, 0x00, 0x45, 0x90, 0x5a, 0x92, 0x0b, 0xdf, - 0x0d, 0x82, 0xb0, 0xa0, 0xa0, 0xdf, 0xc9, 0x8e, 0x86, 0xb2, 0x54, 0x32, - 0xc8, 0xf5, 0xff, 0x13, 0x63, 0xf6, 0x77, 0xf6, 0xd0, 0x8e, 0x87, 0x76, - 0x90, 0x7e, 0x2d, 0xf9, 0xa9, 0x22, 0xd9, 0x74, 0xcf, 0x48, 0x00, 0x77, - 0xeb, 0x8e, 0xad, 0x87, 0x8c, 0xdc, 0x0c, 0xcc, 0xc5, 0x9a, 0x7b, 0x4e, - 0xf2, 0x8b, 0xc5, 0xe9, 0xa3, 0xf9, 0x33, 0x08, 0x0b, 0xa0, 0x60, 0x0a, - 0xab, 0xb5, 0x57, 0x48, 0xcd, 0x4a, 0x1e, 0x78, 0x2e, 0x0c, 0xf5, 0x6d, - 0x64, 0x69, 0x8e, 0x78, 0xbf, 0xb9, 0xd6, 0xad, 0x42, 0x2d, 0x0e, 0x97, - 0xc9, 0x1d, 0xc5, 0x03, 0x91, 0x90, 0xec, 0xef, 0x5e, 0x94, 0xdf, 0x77, - 0x01, 0xa3, 0xbe, 0xcd, 0x63, 0xe1, 0x3a, 0x65, 0xee, 0x92, 0x50, 0x17, - 0x7f, 0xed, 0xec, 0xaf, 0x23, 0xd7, 0x2f, 0x8f, 0x73, 0x63, 0x63, 0xb1, - 0x21, 0xd4, 0x9a, 0xf0, 0x3b, 0x1d, 0x1c, 0xd2, 0x3e, 0xa0, 0xd2, 0x4f, - 0x0a, 0x76, 0xef, 0x54, 0x1e, 0x9d, 0x99, 0xc6, 0xe0, 0x53, 0x54, 0xa1, - 0xea, 0x19, 0x3a, 0xe5, 0xb6, 0xc6, 0x53, 0xdf, 0xaa, 0x7e, 0xbb, 0x3a, - 0xd2, 0x60, 0x84, 0x1a, 0x8c, 0xe4, 0xb3, 0x90, 0x4f, 0xe0, 0x50, 0x1c, - 0x17, 0x3a, 0x81, 0x8e, 0x4a, 0x40, 0xdd, 0x8e, 0x57, 0xae, 0xf0, 0xe2, - 0x3f, 0x28, 0x62, 0x9c, 0xf2, 0x7a, 0xf4, 0xa6, 0x3e, 0xa1, 0x9c, 0xf7, - 0x2c, 0x5b, 0x97, 0xd2, 0x5c, 0x6e, 0x73, 0xde, 0x76, 0xf0, 0x66, 0x38, - 0xc3, 0x5b, 0x86, 0x40, 0x7f, 0x14, 0x38, 0x0f, 0x17, 0x37, 0x06, 0x47, - 0x63, 0x4e, 0xf0, 0x43, 0xf5, 0x98, 0xbb, 0xe1, 0x2c, 0x56, 0x48, 0x8d, - 0xf6, 0xe2, 0xa0, 0xd0, 0xa6, 0x54, 0xd1, 0x47, 0x90, 0xd7, 0x23, 0xd1, - 0xd1, 0x67, 0xf5, 0xad, 0x89, 0xf3, 0x56, 0x87, 0x81, 0x80, 0x5e, 0x1a, - 0xaf, 0x80, 0xf9, 0xbe, 0xb5, 0x12, 0xa9, 0x4a, 0xc7, 0xdd, 0x90, 0x1b, - 0xe6, 0xf6, 0xa7, 0x92, 0x1b, 0x28, 0x88, 0xad, 0x05, 0x7b, 0x90, 0x8b, - 0x16, 0x7c, 0xbe, 0xa0, 0x28, 0x1e, 0x50, 0xc8, 0x48, 0xdd, 0x9a, 0xa6, - 0xf5, 0xfc, 0xb3, 0x34, 0x58, 0xfa, 0x2e, 0x97, 0xa7, 0x82, 0x24, 0x43, - 0xf9, 0x00, 0x76, 0x32, 0x08, 0x08, 0xb3, 0xc8, 0x18, 0x6e, 0x61, 0x77, - 0xbf, 0xa0, 0xf9, 0xd5, 0x33, 0x5c, 0x0c, 0xf7, 0xfb, 0x90, 0x23, 0x8a, - 0x37, 0x52, 0x9c, 0x5b, 0x7b, 0x9a, 0x99, 0xf2, 0xcb, 0xdb, 0x89, 0xda, - 0x7f, 0xa0, 0x8d, 0x48, 0x95, 0x8e, 0xd5, 0xe4, 0x44, 0x20, 0xe4, 0x3f, - 0xef, 0xe3, 0x86, 0x4b, 0xdf, 0x62, 0x7b, 0x7b, 0x5f, 0x76, 0x41, 0x7d, - 0xef, 0xab, 0x54, 0x96, 0xae, 0x15, 0x4b, 0x2d, 0x90, 0x13, 0x39, 0x48, - 0x9a, 0x9b, 0xa7, 0x4d, 0x03, 0xd6, 0xf4, 0x73, 0xf9, 0xd1, 0xcf, 0x32, - 0x26, 0xa7, 0x42, 0xad, 0x8d, 0x40, 0x60, 0x19, 0x23, 0x81, 0x05, 0x57, - 0x0b, 0x7a, 0x11, 0x82, 0xea, 0x3c, 0x75, 0xe6, 0xdb, 0x38, 0x8d, 0x8b, - 0x74, 0x50, 0xfe, 0xf6, 0x4e, 0x40, 0x62, 0xb8, 0x0c, 0xff, 0x18, 0x2b, - 0x4b, 0xef, 0x08, 0x71, 0x92, 0xbc, 0x0c, 0x1e, 0x1c, 0xab, 0x36, 0xcb, - 0xf8, 0xea, 0x85, 0xd1, 0x62, 0x6b, 0xe7, 0x7c, 0x92, 0x0a, 0x3d, 0x2a, - 0x78, 0x0f, 0x97, 0xd0, 0x83, 0x92, 0xdb, 0xed, 0xd5, 0xb8, 0xaf, 0x7c, - 0x52, 0x78, 0x5f, 0x64, 0x81, 0x1e, 0x18, 0xf9, 0x5f, 0xe6, 0xbb, 0x22, - 0xd6, 0x00, 0x18, 0x29, 0x09, 0x55, 0x96, 0x27, 0x53, 0x48, 0x5a, 0x11, - 0x85, 0x78, 0xc4, 0x5f, 0x1d, 0x0e, 0x5b, 0x4d, 0x0c, 0x66, 0xcf, 0x14, - 0x26, 0x48, 0x3e, 0x3a, 0xd1, 0x1b, 0xe4, 0xce, 0x8b, 0x08, 0xdd, 0x04, - 0xc6, 0x19, 0x4c, 0x18, 0x92, 0xf3, 0xf4, 0xc8, 0xf0, 0x69, 0x38, 0x22, - 0x97, 0x64, 0x6b, 0x16, 0xcf, 0xea, 0x55, 0x7e, 0x36, 0x18, 0xcd, 0x8d, - 0x95, 0x26, 0x5f, 0x12, 0x42, 0x84, 0xb6, 0x4c, 0x6b, 0xd8, 0x42, 0x97, - 0x4f, 0x5e, 0x84, 0xcb, 0xd6, 0x82, 0x5c, 0x32, 0xd3, 0xf7, 0xb1, 0x71, - 0xae, 0xce, 0x17, 0x2a, 0xc3, 0x89, 0x18, 0x50, 0x1d, 0x82, 0x65, 0x50, - 0x83, 0x7d, 0x92, 0x89, 0x48, 0xd8, 0x2f, 0xe3, 0xa9, 0x4c, 0x02, 0xb0, - 0x32, 0x8d, 0x36, 0x0a, 0x09, 0x4a, 0x3e, 0x86, 0x47, 0xfd, 0x06, 0xf9, - 0xf1, 0xb7, 0x77, 0x52, 0xa5, 0x37, 0x0f, 0x11, 0x93, 0xaf, 0x11, 0x4e, - 0x8d, 0xc7, 0x3c, 0x97, 0x96, 0xfa, 0x73, 0x40, 0xb3, 0xd4, 0x91, 0x4a, - 0x01, 0xfb, 0x29, 0x7d, 0xfe, 0xca, 0xec, 0xa0, 0x1d, 0xbc, 0xff, 0x34, - 0x0d, 0x09, 0x0f, 0xa6, 0xbb, 0x85, 0x17, 0x77, 0xfc, 0x63, 0x8e, 0xb8, - 0x2b, 0x3e, 0x21, 0xd9, 0xd7, 0x4a, 0x15, 0x29, 0x37, 0xf1, 0xfa, 0x29, - 0x1e, 0x6a, 0xca, 0x73, 0xce, 0xd4, 0xb4, 0xd7, 0xae, 0xcd, 0xc4, 0xf2, - 0xa5, 0x28, 0x67, 0xfe, 0x20, 0xab, 0x4d, 0xbc, 0xfa, 0xed, 0xd5, 0x7c, - 0x1a, 0x6d, 0x6f, 0xad, 0x63, 0xc8, 0xbc, 0xe4, 0x77, 0xb3, 0x6b, 0x1a, - 0xef, 0x5e, 0x17, 0xe3, 0xf7, 0x89, 0xfa, 0x02, 0x03, 0x60, 0x8c, 0xd2, - 0x09, 0x2f, 0xeb, 0xe7, 0x0b, 0x63, 0xed, 0x51, 0x6a, 0x6c, 0x58, 0xef, - 0x29, 0xb8, 0x41, 0x4f, 0x89, 0x34, 0x73, 0x64, 0xaf, 0x8a, 0xaa, 0x2f, - 0x0e, 0x67, 0xd4, 0x48, 0x15, 0x97, 0x9a, 0xad, 0xe5, 0x03, 0xa0, 0xfe, - 0xcc, 0xdd, 0xfb, 0xac, 0x34, 0x36, 0x15, 0x60, 0x68, 0x3b, 0x07, 0x0f, - 0x8a, 0x78, 0xa1, 0x33, 0xbe, 0x98, 0x97, 0x5f, 0x4f, 0x29, 0x95, 0x15, - 0x8f, 0xbc, 0xa5, 0x16, 0x2a, 0xc4, 0xe2, 0xd1, 0x6c, 0x08, 0xe2, 0x4e, - 0xf7, 0x63, 0xe2, 0x56, 0x1f, 0x40, 0xd9, 0xe4, 0xbc, 0xf2, 0x85, 0xeb, - 0xa1, 0x1a, 0xbf, 0xdf, 0x3b, 0x5c, 0xbb, 0x0b, 0x31, 0xa4, 0xeb, 0x52, - 0x2e, 0x0f, 0x38, 0x6b, 0xe7, 0xbb, 0x06, 0x66, 0x0e, 0x41, 0xb2, 0xa3, - 0x40, 0x8a, 0xf9, 0x39, 0x9f, 0x1d, 0x75, 0xa9, 0x4c, 0x20, 0x5c, 0x30, - 0x25, 0x0a, 0xac, 0x09, 0xe8, 0x2b, 0x9f, 0x5b, 0x9a, 0x21, 0x3d, 0x5d, - 0xa4, 0x5c, 0x3c, 0x20, 0x1f, 0x19, 0xc7, 0xfe, 0x15, 0x15, 0x49, 0x90, - 0xb3, 0x60, 0x4a, 0xd4, 0xc1, 0x54, 0xcc, 0x75, 0xb7, 0x14, 0x61, 0xc2, - 0x17, 0xcd, 0x0a, 0xc7, 0x70, 0x5f, 0xdf, 0x1c, 0x37, 0x92, 0xea, 0xff, - 0x11, 0x0f, 0x4a, 0x2d, 0x54, 0x4c, 0xd4, 0x83, 0xca, 0x52, 0x3c, 0x1b, - 0xa6, 0x7c, 0xfa, 0x41, 0x77, 0x74, 0x24, 0x1e, 0x9e, 0xfb, 0x04, 0x9f, - 0x71, 0xa3, 0x4f, 0x79, 0x1f, 0x22, 0x0b, 0x7b, 0x2d, 0xdf, 0x5a, 0xc9, - 0x7c, 0x72, 0xa8, 0x10, 0xe3, 0x06, 0xdb, 0x68, 0xa3, 0x90, 0x85, 0x43, - 0x65, 0xdb, 0xb6, 0x3f, 0x80, 0x40, 0x63, 0x87, 0x3e, 0xb2, 0x1c, 0x8e, - 0x55, 0xe5, 0xa9, 0x9f, 0x16, 0x3d, 0x35, 0x1d, 0xd0, 0x8f, 0xd9, 0x9a, - 0xdc, 0x19, 0x25, 0x2e, 0x1f, 0x12, 0xcf, 0xe7, 0x59, 0x9d, 0x8a, 0x39, - 0x8e, 0xf0, 0xba, 0xde, 0x54, 0x61, 0x97, 0x3c, 0x39, 0x6f, 0xb4, 0x0d, - 0x7a, 0x44, 0x6b, 0xa1, 0x59, 0xfd, 0x35, 0x1f, 0xb9, 0xe6, 0xb5, 0x90, - 0x81, 0x34, 0x6b, 0x6c, 0xb4, 0x04, 0xba, 0x78, 0x6d, 0xa9, 0x67, 0xec, - 0xc1, 0x40, 0x52, 0x50, 0x27, 0x7f, 0x57, 0xfb, 0x4d, 0xc8, 0x82, 0x7b, - 0x82, 0xbc, 0x26, 0x8e, 0x3f, 0xc6, 0xae, 0xf3, 0xe7, 0xc8, 0x43, 0x0c, - 0x5a, 0x71, 0xd8, 0x4d, 0x71, 0x5c, 0x43, 0x6f, 0x96, 0x47, 0x59, 0xbd, - 0xba, 0x6a, 0xea, 0x7e, 0x69, 0x41, 0x16, 0x6d, 0x6c, 0x2b, 0x16, 0x3a, - 0x03, 0xc6, 0x85, 0x7f, 0xfd, 0x62, 0xf6, 0x23, 0x5c, 0x09, 0x84, 0x25, - 0x5a, 0x91, 0x68, 0x73, 0x2c, 0x69, 0xed, 0x8a, 0x2f, 0x05, 0x0c, 0x84, - 0xa7, 0x37, 0xea, 0xe6, 0x61, 0xc0, 0xef, 0x96, 0xc7, 0x1c, 0xd9, 0x7a, - 0x1e, 0x37, 0x8c, 0x23, 0x76, 0x5f, 0x06, 0xd9, 0x64, 0xb1, 0x80, 0xce, - 0x0f, 0xa6, 0x44, 0x19, 0xab, 0x23, 0xe6, 0x28, 0x3e, 0x9e, 0x2e, 0xbb, - 0xff, 0x5b, 0xd1, 0x93, 0x42, 0x47, 0xab, 0xad, 0xee, 0x22, 0x93, 0x4d, - 0x37, 0x39, 0x83, 0x95, 0xf5, 0x26, 0xd7, 0x39, 0x93, 0x18, 0xc3, 0xa3, - 0xa5, 0x02, 0x7a, 0xb8, 0x04, 0xd6, 0x36, 0xca, 0x13, 0x1a, 0x3f, 0x47, - 0x07, 0x83, 0x9d, 0x79, 0x69, 0x82, 0x3f, 0x87, 0xc0, 0x3b, 0x22, 0xdd, - 0x9e, 0x36, 0x9b, 0xae, 0xc1, 0xc3, 0xc8, 0xc2, 0xe5, 0x72, 0x73, 0xb5, - 0x2d, 0x64, 0xa9, 0x49, 0x00, 0x4d, 0x24, 0x2f, 0x4b, 0x7f, 0xb2, 0xd8, - 0x17, 0xcd, 0xf4, 0xc9, 0xf0, 0x3b, 0x7e, 0xf8, 0x49, 0x93, 0xb7, 0x9c, - 0xc3, 0xa2, 0x3c, 0x60, 0x62, 0xba, 0xcc, 0x5d, 0xfe, 0x1d, 0x4b, 0xcb, - 0x28, 0x80, 0xf8, 0x3c, 0x8b, 0xb1, 0xbd, 0x9d, 0x73, 0xfb, 0x67, 0x76, - 0xc7, 0x3a, 0xaa, 0x1d, 0x09, 0xca, 0xbd, 0x3b, 0xb9, 0xce, 0xf0, 0x4f, - 0xb0, 0xe5, 0xfd, 0xab, 0x0d, 0xf0, 0x0a, 0x8f, 0x07, 0x55, 0x6b, 0x6f, - 0xd9, 0xc8, 0x4b, 0x32, 0x05, 0x21, 0x21, 0x1e, 0x80, 0x1d, 0x69, 0x2a, - 0xf9, 0x5e, 0x58, 0xcb, 0xc5, 0xc6, 0x27, 0x55, 0x67, 0x16, 0x2f, 0x96, - 0x01, 0xb7, 0x6e, 0x20, 0x7d, 0x9a, 0x02, 0x74, 0xd6, 0xe5, 0x2f, 0xd4, - 0x4f, 0xbd, 0xee, 0x1a, 0xbb, 0x48, 0xc2, 0xbe, 0x79, 0xae, 0x43, 0xd7, - 0x42, 0xae, 0xbf, 0xc8, 0xd4, 0xef, 0x51, 0x37, 0xa8, 0xa2, 0x0b, 0x63, - 0xf2, 0x74, 0xac, 0x32, 0x0b, 0x26, 0x95, 0x9c, 0xe0, 0xf9, 0x64, 0x54, - 0x04, 0x06, 0x99, 0x4b, 0xb3, 0xc9, 0xfe, 0x31, 0xdc, 0x0c, 0xb0, 0x06, - 0x69, 0xaa, 0x7c, 0x00, 0x6b, 0xbf, 0x92, 0x89, 0x4c, 0x6b, 0x9b, 0x4d, - 0xe7, 0x81, 0xfa, 0xbf, 0xd3, 0xc6, 0x09, 0x98, 0xc6, 0x96, 0xa3, 0xf3, - 0x1e, 0x1e, 0x6d, 0x04, 0x0f, 0x6d, 0x7b, 0x98, 0x4a, 0x80, 0x5c, 0x99, - 0x44, 0x43, 0xb6, 0x26, 0x50, 0x0c, 0xc5, 0x26, 0xc4, 0x68, 0x50, 0xca, - 0xdf, 0x0c, 0xcf, 0x46, 0x9a, 0xaa, 0x93, 0x13, 0x80, 0x00, 0x43, 0x34, - 0x2f, 0x8a, 0xf0, 0x86, 0x0c, 0xa2, 0xfc, 0x9a, 0x4f, 0x54, 0x58, 0xb5, - 0xb9, 0x5e, 0xb1, 0x2b, 0xf8, 0xc8, 0x68, 0x0e, 0x05, 0xdf, 0xbb, 0x79, - 0xc8, 0x72, 0xb8, 0x5b, 0x72, 0x47, 0x05, 0xd2, 0x97, 0x9e, 0xa3, 0x39, - 0xeb, 0x8b, 0xfd, 0x99, 0x52, 0xba, 0x67, 0x5b, 0x40, 0x45, 0xde, 0x09, - 0xf4, 0x9f, 0x33, 0xc6, 0x53, 0x68, 0x93, 0xe4, 0xeb, 0x09, 0x97, 0x9d, - 0xec, 0xd0, 0x9a, 0xbb, 0xe6, 0x2b, 0xaa, 0xfe, 0x79, 0xa6, 0x71, 0xe2, - 0xea, 0x2d, 0xdd, 0x66, 0x41, 0xc4, 0xbe, 0xca, 0x62, 0x10, 0xa4, 0x23, - 0xa5, 0xcd, 0x68, 0x70, 0x51, 0xae, 0x8f, 0x4f, 0xe1, 0xa1, 0xa8, 0x35, - 0x4c, 0x37, 0xa4, 0xd6, 0x27, 0x32, 0x52, 0x1e, 0xfc, 0xbc, 0x48, 0x14, - 0x14, 0x1b, 0x05, 0x0d, 0xa1, 0xcd, 0x0b, 0xcd, 0x16, 0xbf, 0x88, 0xe2, - 0x20, 0x3a, 0x93, 0x8c, 0xcb, 0x9e, 0x97, 0x59, 0x36, 0x6b, 0x9c, 0x3f, - 0x71, 0x51, 0xdc, 0xf5, 0x05, 0x29, 0x23, 0x9b, 0x78, 0x23, 0x29, 0x63, - 0x35, 0x82, 0xda, 0x8e, 0xf2, 0xba, 0x2b, 0x61, 0xc7, 0xa4, 0x86, 0xc8, - 0xa2, 0xa3, 0xf4, 0x98, 0x49, 0x1c, 0x18, 0x20, 0x69, 0x98, 0xe4, 0xcf, - 0xc1, 0x98, 0x80, 0x48, 0x4e, 0x2f, 0x29, 0x0e, 0xdb, 0x0c, 0xf2, 0x3e, - 0x2a, 0xb5, 0x8d, 0xfe, 0x9e, 0x92, 0xe8, 0x82, 0xc8, 0x97, 0x16, 0xef, - 0xd1, 0x9a, 0x26, 0x8e, 0xb2, 0xd8, 0x58, 0x07, 0x94, 0x02, 0x66, 0x1c, - 0x7b, 0xec, 0xdb, 0x1b, 0xc7, 0x49, 0xfd, 0xe5, 0x40, 0x36, 0xe3, 0x4d, - 0x04, 0x80, 0x1b, 0xf5, 0xa5, 0x3a, 0x86, 0x66, 0x7f, 0xd5, 0xcf, 0xeb, - 0xc6, 0xf5, 0xa0, 0x6d, 0xe9, 0xef, 0xd4, 0x03, 0xce, 0x90, 0xd0, 0xbb, - 0x9e, 0xa8, 0xb0, 0x30, 0x23, 0xca, 0x4e, 0x59, 0x0d, 0x36, 0xf8, 0xd9, - 0xed, 0x47, 0x86, 0x53, 0x45, 0xa6, 0xb3, 0x27, 0x54, 0x81, 0x37, 0x75, - 0x85, 0xd3, 0x2a, 0x37, 0x60, 0xbe, 0xae, 0x7d, 0x57, 0xf1, 0xed, 0x71, - 0xe3, 0x8b, 0x3d, 0xab, 0x7c, 0x8c, 0xb9, 0xa4, 0xd3, 0x44, 0x14, 0x0c, - 0x4f, 0x9c, 0xf4, 0xfe, 0x62, 0x7f, 0x76, 0x02, 0x4f, 0x88, 0x53, 0xdd, - 0x70, 0x92, 0x00, 0x7f, 0xe4, 0x10, 0x48, 0x45, 0x8d, 0x58, 0xdf, 0x45, - 0x7a, 0x0a, 0x65, 0x80, 0x05, 0xb8, 0x2e, 0x64, 0x46, 0x1a, 0x69, 0x9a, - 0x99, 0xcf, 0x1c, 0x19, 0x87, 0xf2, 0x8e, 0x82, 0x48, 0x39, 0x0a, 0x32, - 0x2a, 0x1f, 0x4d, 0x2f, 0x5e, 0x75, 0x6b, 0x9b, 0x85, 0x7c, 0xf7, 0xc5, - 0x89, 0x5d, 0x1d, 0xc3, 0x0d, 0x99, 0x9c, 0x71, 0x15, 0x33, 0x26, 0x6c, - 0xe5, 0x56, 0xb8, 0xbe, 0x92, 0x6c, 0x4a, 0xcb, 0xe7, 0xbe, 0xad, 0x21, - 0x3b, 0xfc, 0x10, 0xb3, 0x51, 0x71, 0xf2, 0xe3, 0xbb, 0x33, 0x97, 0x2c, - 0x4a, 0x93, 0xbf, 0x8d, 0x31, 0x40, 0x25, 0x92, 0xa5, 0x17, 0x5a, 0xee, - 0xd0, 0xc9, 0xfc, 0xfc, 0x24, 0xc8, 0x54, 0x4b, 0x12, 0x3f, 0xb3, 0x9e, - 0x30, 0x1e, 0xcd, 0xaa, 0xb6, 0xef, 0x50, 0x8a, 0x38, 0x90, 0x73, 0xba, - 0xc1, 0x89, 0x1a, 0xae, 0xc8, 0x3a, 0xda, 0xc0, 0xa0, 0x18, 0xa8, 0x02, - 0x78, 0xc3, 0x15, 0xa2, 0x3c, 0x47, 0xf5, 0x35, 0x1b, 0xc7, 0x4a, 0x4b, - 0x2f, 0xc9, 0xb8, 0xe6, 0xab, 0x21, 0x5f, 0x6c, 0x58, 0x1a, 0xe6, 0xa2, - 0x3a, 0xeb, 0x88, 0xfc, 0x24, 0x82, 0xd4, 0xcf, 0x96, 0x1b, 0x37, 0xd4, - 0x03, 0xba, 0x8c, 0x63, 0x4e, 0x1d, 0xf5, 0x82, 0xbf, 0x07, 0xd2, 0xbb, - 0x30, 0x84, 0x6e, 0x3b, 0x72, 0x29, 0x88, 0xf7, 0x9c, 0x6c, 0xaf, 0x20, - 0x6a, 0x9b, 0x63, 0x85, 0x3e, 0x89, 0x5b, 0x49, 0x07, 0x7e, 0xef, 0xc1, - 0x76, 0xe6, 0x9f, 0x74, 0x60, 0x35, 0xa2, 0x40, 0x41, 0x9d, 0xb9, 0xf8, - 0x01, 0x48, 0xc6, 0x02, 0xab, 0x89, 0xa7, 0xda, 0xff, 0xe0, 0xd9, 0x7b, - 0x1b, 0x68, 0x71, 0x20, 0x67, 0xa5, 0xc5, 0x4c, 0x3b, 0xc6, 0x39, 0x13, - 0xd1, 0x02, 0x77, 0xa7, 0xd9, 0xf6, 0x8b, 0x2f, 0x1b, 0x68, 0xf8, 0xab, - 0x51, 0x9c, 0x7a, 0xa8, 0xd6, 0x54, 0x14, 0xe7, 0xc5, 0x8e, 0xf9, 0x30, - 0x63, 0xa6, 0x70, 0x90, 0xc2, 0x10, 0x07, 0x01, 0x97, 0x1b, 0x9b, 0x3b, - 0xe1, 0x76, 0xdd, 0x53, 0x33, 0xd3, 0xbc, 0x84, 0x95, 0x14, 0xab, 0xe5, - 0xa3, 0xab, 0xe2, 0x4d, 0xb9, 0xc5, 0xfa, 0xcf, 0x4b, 0x19, 0x31, 0xb5, - 0x81, 0x49, 0x81, 0xca, 0x5e, 0x25, 0x00, 0xf2, 0x91, 0x6e, 0x11, 0x01, - 0xb0, 0x83, 0x9e, 0xb6, 0x80, 0xfd, 0x2f, 0x2d, 0xda, 0xf1, 0xa3, 0xa3, - 0xd9, 0x10, 0x2d, 0x22, 0x70, 0x43, 0xc3, 0x8d, 0xee, 0x0b, 0x60, 0x09, - 0x26, 0xef, 0x87, 0x08, 0xad, 0x5d, 0xab, 0xd6, 0xf7, 0xa2, 0xa0, 0x08, - 0xbf, 0xc4, 0xef, 0xb5, 0xb6, 0x69, 0x7c, 0x5d, 0x74, 0x7a, 0xc5, 0x55, - 0xc2, 0xd3, 0x02, 0xfc, 0x4f, 0x85, 0xf0, 0x7b, 0x97, 0x7e, 0xe6, 0x83, - 0xd8, 0x62, 0x14, 0x3a, 0x9d, 0xc2, 0x92, 0x32, 0x7e, 0x1a, 0x7e, 0xf2, - 0x9e, 0xff, 0xe6, 0xe0, 0x31, 0xc8, 0x15, 0x23, 0xea, 0x2f, 0x44, 0x45, - 0x36, 0xe6, 0xf8, 0xe7, 0x06, 0x48, 0xa1, 0xce, 0xfb, 0x2b, 0x70, 0x57, - 0x6a, 0xe7, 0xec, 0x00, 0xae, 0xeb, 0x55, 0x23, 0xef, 0xa2, 0xec, 0xa4, - 0x41, 0xff, 0xf8, 0x17, 0xd3, 0x09, 0x37, 0xc9, 0x29, 0x59, 0xca, 0x54, - 0x14, 0xe7, 0x67, 0x9e, 0x0f, 0xd6, 0x62, 0x86, 0x3a, 0x35, 0x89, 0x01, - 0x72, 0x55, 0x2a, 0xa1, 0xd2, 0xa8, 0xa0, 0x85, 0x06, 0x6a, 0x01, 0xa6, - 0x9e, 0x44, 0xec, 0x3a, 0x29, 0xec, 0xff, 0xb3, 0x5a, 0xf2, 0x7d, 0x61, - 0x65, 0x72, 0xe8, 0x42, 0xe3, 0x96, 0x33, 0x31, 0x4b, 0xa1, 0xa1, 0x40, - 0x41, 0xb1, 0xe4, 0x35, 0xee, 0xe0, 0xcf, 0xe6, 0x30, 0xeb, 0xc2, 0xc8, - 0x53, 0x25, 0x79, 0xf9, 0xd7, 0x62, 0xe0, 0x33, 0x3a, 0x39, 0x8f, 0x71, - 0xd9, 0x13, 0x87, 0xb0, 0xe6, 0xb1, 0x11, 0x91, 0x49, 0xf2, 0x41, 0xd7, - 0xcc, 0xcd, 0x72, 0xae, 0x3b, 0x69, 0xba, 0x16, 0x38, 0x24, 0x40, 0x37, - 0xb5, 0x63, 0xca, 0x1c, 0x62, 0xf3, 0x63, 0x6c, 0xd6, 0xe3, 0x28, 0xb2, - 0x01, 0x70, 0xbc, 0x48, 0x08, 0x80, 0xf9, 0x34, 0xaa, 0xb0, 0xfd, 0xb8, - 0x2d, 0x68, 0x28, 0xb7, 0xad, 0x96, 0x7f, 0x4d, 0xdc, 0x63, 0x1a, 0xfb, - 0x77, 0xcf, 0xcf, 0xc4, 0x28, 0x3a, 0x02, 0x51, 0x61, 0xa8, 0x85, 0x93, - 0xa8, 0x48, 0xf7, 0x24, 0x87, 0x0e, 0xe5, 0x2c, 0x1d, 0x9f, 0x04, 0xee, - 0x13, 0x58, 0x2d, 0x20, 0x70, 0xa0, 0x2b, 0x4a, 0xce, 0xfc, 0xc6, 0x4d, - 0x80, 0x82, 0xd0, 0x24, 0x4c, 0x87, 0x0c, 0x6b, 0x27, 0x1b, 0xc0, 0xe9, - 0x4c, 0x00, 0x37, 0xf5, 0x75, 0x3c, 0xcd, 0x83, 0xba, 0xeb, 0xe7, 0xce, - 0xea, 0x30, 0xa8, 0x80, 0xd6, 0x82, 0x07, 0xc7, 0x25, 0xcc, 0x6d, 0x50, - 0x45, 0x7f, 0x31, 0xed, 0x8d, 0x50, 0x41, 0x3a, 0x83, 0x83, 0x14, 0x8b, - 0xe9, 0x7e, 0x07, 0x75, 0x41, 0x04, 0x2d, 0xe7, 0x70, 0xc8, 0x1f, 0xdd, - 0x89, 0xe3, 0xe3, 0xbe, 0x29, 0xc0, 0x0d, 0x7d, 0xf1, 0x54, 0x44, 0xdd, - 0x60, 0x2b, 0xd9, 0x79, 0x44, 0xf4, 0x4c, 0xaf, 0x5e, 0x2f, 0x0c, 0xd5, - 0x39, 0xe0, 0xf0, 0xa5, 0xf0, 0x25, 0xc9, 0x39, 0x9d, 0x6e, 0x5a, 0x43, - 0x7b, 0xe7, 0xa9, 0x63, 0x74, 0xd1, 0x74, 0x2e, 0x1f, 0x01, 0x2a, 0x5b, - 0x7d, 0xa4, 0xe4, 0x90, 0xb5, 0xc2, 0x55, 0x01, 0x6f, 0x9a, 0xeb, 0x30, - 0x3e, 0xac, 0x34, 0x63, 0x1b, 0x1e, 0x86, 0x9f, 0x0e, 0x14, 0xe4, 0x76, - 0x3c, 0x33, 0x63, 0x4a, 0xe6, 0xf7, 0x1e, 0xec, 0xaa, 0xad, 0x4b, 0x2c, - 0xc4, 0x6c, 0x09, 0x24, 0x94, 0xdb, 0x30, 0x6c, 0xf6, 0x8d, 0x98, 0xb2, - 0xe2, 0x69, 0x40, 0x0a, 0xcf, 0x0e, 0xac, 0x76, 0xbe, 0x71, 0xa7, 0x22, - 0x43, 0xd9, 0xbf, 0xcf, 0x62, 0x34, 0x64, 0x99, 0xc0, 0xcb, 0x10, 0xe4, - 0x4e, 0x37, 0xab, 0x3d, 0x60, 0x18, 0x6e, 0xfd, 0xd2, 0xcb, 0xc6, 0x7e, - 0x7d, 0x3b, 0x4f, 0xcd, 0xd1, 0xc6, 0xf7, 0x22, 0x17, 0xea, 0x09, 0x1d, - 0x51, 0x64, 0x83, 0x0b, 0xa3, 0x6d, 0x16, 0x10, 0xa2, 0x16, 0x8e, 0x2a, - 0x6f, 0xdd, 0xb8, 0xb4, 0xa1, 0x0e, 0xd9, 0x9c, 0x7d, 0x0b, 0x5f, 0xe7, - 0xac, 0x93, 0x4e, 0x9d, 0xe2, 0xab, 0x14, 0x43, 0xdc, 0x3d, 0xe5, 0x5b, - 0xd6, 0x06, 0x64, 0xf4, 0x02, 0x1a, 0x7f, 0x54, 0x3f, 0x36, 0x16, 0xbf, - 0x9a, 0x78, 0x74, 0xa2, 0x02, 0x0b, 0xbe, 0x01, 0xf1, 0x70, 0xa0, 0xd1, - 0x6d, 0x94, 0xec, 0xba, 0x17, 0x6f, 0x56, 0xf7, 0x9e, 0x3e, 0x27, 0x0d, - 0x64, 0xcd, 0x65, 0x6f, 0x2d, 0x26, 0xf8, 0x2b, 0x2b, 0xf3, 0xf0, 0x02, - 0x55, 0xd9, 0xef, 0x06, 0xe2, 0xcb, 0xff, 0x5b, 0xd5, 0x48, 0xa2, 0x5e, - 0xb5, 0x0a, 0x86, 0x72, 0x4c, 0xc4, 0xb7, 0x35, 0xc5, 0xd3, 0xc8, 0x18, - 0xf6, 0x5f, 0x7b, 0x82, 0x77, 0x0f, 0xab, 0x3d, 0xc9, 0xce, 0x9c, 0xd4, - 0xff, 0x38, 0x6c, 0xfb, 0xc3, 0x70, 0xe5, 0xc2, 0xc1, 0xa4, 0x81, 0x6b, - 0x81, 0x98, 0x95, 0xa6, 0xd7, 0x0f, 0x1f, 0x84, 0x58, 0xd8, 0x4a, 0xb5, - 0xc2, 0xcd, 0xa2, 0xe7, 0xb7, 0xbf, 0xd2, 0xc4, 0x71, 0xc7, 0xba, 0x76, - 0x0c, 0xcb, 0xaf, 0x92, 0xde, 0x75, 0x99, 0xec, 0xee, 0xe7, 0x38, 0x7a, - 0x18, 0x2a, 0x39, 0x4f, 0x94, 0x7d, 0xc2, 0xd6, 0xd1, 0x90, 0xcd, 0x4c, - 0xc5, 0x59, 0x78, 0x21, 0x4f, 0xe3, 0x1e, 0xde, 0x06, 0x71, 0x94, 0xdc, - 0xb5, 0x41, 0xd2, 0xe4, 0x7e, 0x24, 0x14, 0xe0, 0xdf, 0x01, 0x9d, 0xb0, - 0xa7, 0x69, 0xdb, 0xb4, 0x74, 0x85, 0xcf, 0x8d, 0xbd, 0x27, 0x09, 0x40, - 0x82, 0xaa, 0x86, 0x68, 0x84, 0xbc, 0x82, 0x44, 0x8f, 0x57, 0x4a, 0x8e, - 0x5d, 0x88, 0x60, 0x8d, 0x14, 0xfb, 0xc3, 0x23, 0x9f, 0x09, 0x5a, 0xa2, - 0x91, 0x32, 0xf4, 0xd1, 0x99, 0xf4, 0x12, 0x6b, 0x00, 0x4d, 0x0b, 0xf9, - 0x14, 0xa0, 0x45, 0x6a, 0x96, 0x72, 0x27, 0xe9, 0x88, 0xd8, 0x88, 0x4a, - 0x71, 0xb2, 0x32, 0x85, 0xf3, 0x55, 0x79, 0xae, 0x07, 0x17, 0x2c, 0x33, - 0x1f, 0x5f, 0xf4, 0xac, 0xb5, 0xaf, 0x80, 0x44, 0x86, 0x61, 0xc2, 0xf9, - 0xb4, 0x03, 0xae, 0x3a, 0x4d, 0xed, 0xa7, 0xcd, 0x45, 0x5b, 0x2b, 0xba, - 0x90, 0x7e, 0x07, 0xd9, 0x30, 0xb0, 0xd3, 0xd7, 0x3a, 0xa3, 0xff, 0xd1, - 0x9a, 0x1e, 0x5b, 0xf0, 0xb2, 0x70, 0x59, 0x37, 0x38, 0xc2, 0x31, 0x1b, - 0x0f, 0xe0, 0xec, 0x80, 0x4f, 0x3b, 0x04, 0x99, 0x2b, 0x88, 0x6b, 0xea, - 0x38, 0xb5, 0x3f, 0xab, 0x26, 0x0a, 0x21, 0x17, 0x96, 0x90, 0xe0, 0x85, - 0x1f, 0xb7, 0x42, 0x98, 0xbb, 0x5b, 0xc1, 0x7d, 0xa1, 0xaf, 0x95, 0x1f, - 0x52, 0x94, 0x77, 0x6f, 0x12, 0xac, 0xd4, 0x22, 0xf5, 0x9f, 0x06, 0x08, - 0x13, 0x44, 0x63, 0x1c, 0x5f, 0x16, 0x64, 0x94, 0xf0, 0xd8, 0x83, 0x6f, - 0x82, 0x6a, 0xe8, 0x93, 0x8e, 0x95, 0xf5, 0x0e, 0x44, 0x46, 0xfd, 0x5b, - 0xf4, 0x4f, 0xed, 0x38, 0xff, 0xef, 0xde, 0x7c, 0x27, 0xa4, 0xf9, 0xfa, - 0x8d, 0xbe, 0x63, 0xdb, 0x61, 0x7d, 0x47, 0xb5, 0x5c, 0x63, 0x32, 0x1a, - 0x41, 0x87, 0x70, 0x7f, 0x54, 0x80, 0x4e, 0x1c, 0x87, 0xa7, 0x14, 0x42, - 0xfb, 0x77, 0x37, 0xce, 0xf4, 0x74, 0xb8, 0x56, 0xcc, 0x73, 0x62, 0xc6, - 0xdd, 0x56, 0x4e, 0x78, 0x30, 0x93, 0x24, 0x31, 0x34, 0x17, 0xe4, 0x9b, - 0xef, 0xec, 0x9f, 0x50, 0x8d, 0x36, 0xa7, 0x6d, 0x20, 0xe6, 0x3a, 0x67, - 0x95, 0x22, 0x3a, 0xf2, 0xdc, 0x16, 0x16, 0x00, 0x3f, 0x31, 0xa8, 0xfa, - 0xd2, 0x79, 0x03, 0xbe, 0x85, 0x1c, 0xe7, 0x1f, 0x11, 0x6f, 0x22, 0x0c, - 0x25, 0xc0, 0xb0, 0x12, 0x02, 0x30, 0xad, 0x89, 0xce, 0xce, 0xe8, 0x0d, - 0xe7, 0x33, 0x42, 0x46, 0x00, 0xea, 0x7c, 0x57, 0x79, 0xf4, 0xe2, 0xe6, - 0xed, 0x4d, 0x76, 0x58, 0x50, 0x5c, 0x44, 0x24, 0x80, 0x48, 0x1e, 0xd8, - 0x64, 0x3a, 0x73, 0xd8, 0x10, 0x4a, 0x0c, 0x2a, 0xbc, 0xd5, 0x75, 0xc8, - 0x92, 0x43, 0xbf, 0x36, 0x22, 0x8e, 0xa2, 0x33, 0xf5, 0x77, 0x1c, 0x93, - 0x4e, 0xc7, 0x48, 0x6c, 0x35, 0x8a, 0x6f, 0xb1, 0xca, 0xcb, 0x89, 0xc7, - 0x5a, 0xa9, 0x5e, 0x45, 0x75, 0x46, 0x35, 0x26, 0x29, 0x51, 0x5f, 0xde, - 0xf6, 0xfc, 0x8e, 0x39, 0x64, 0x1e, 0xd3, 0x66, 0x65, 0xdb, 0x6f, 0x43, - 0xe3, 0xb0, 0xf6, 0xb9, 0x17, 0x5e, 0x46, 0x5e, 0xb6, 0xc6, 0xd4, 0xa6, - 0xc2, 0x00, 0x55, 0x3a, 0x44, 0xe3, 0x32, 0x0b, 0x81, 0x69, 0x75, 0xa2, - 0x74, 0xcd, 0x15, 0x8e, 0x40, 0x46, 0x38, 0x2c, 0xb2, 0x95, 0x4a, 0x67, - 0x0d, 0x73, 0xe1, 0xe2, 0x49, 0xaa, 0xd0, 0x1a, 0xba, 0x9d, 0x3c, 0x43, - 0x4e, 0xb8, 0xf0, 0xcb, 0x20, 0xc5, 0xaa, 0x34, 0xdb, 0x96, 0x8e, 0xf0, - 0xda, 0xc8, 0x1a, 0x93, 0xac, 0x82, 0xb4, 0xf5, 0x22, 0x12, 0xea, 0xf1, - 0x4d, 0x74, 0x27, 0x77, 0x9c, 0x84, 0xae, 0xae, 0x2d, 0x6b, 0x4a, 0xbc, - 0xd9, 0x0d, 0x81, 0xfa, 0x93, 0xea, 0x09, 0x45, 0xa7, 0xb0, 0x06, 0xde, - 0xb0, 0x30, 0xf7, 0xaf, 0x44, 0xef, 0x5a, 0x89, 0x9e, 0x04, 0x23, 0x25, - 0x7e, 0xf1, 0x4d, 0xf1, 0x8f, 0xda, 0x25, 0xd7, 0xed, 0xd8, 0x08, 0x83, - 0x4e, 0xbf, 0x36, 0x98, 0x9f, 0xf7, 0x30, 0x64, 0x48, 0x25, 0xb6, 0xa2, - 0xe0, 0x03, 0x06, 0xeb, 0xb4, 0x00, 0x08, 0x57, 0xef, 0x5f, 0xdf, 0xd0, - 0x02, 0x7d, 0xbe, 0x98, 0x2b, 0x90, 0x16, 0xd4, 0x8f, 0x48, 0x05, 0xe1, - 0x03, 0xd2, 0xba, 0x0e, 0xaf, 0x59, 0xcb, 0xd9, 0x78, 0xae, 0x77, 0xd5, - 0x70, 0x2b, 0x1d, 0x9f, 0x51, 0xcf, 0xbc, 0xb3, 0xce, 0x90, 0x8e, 0xcb, - 0x22, 0x36, 0x43, 0x05, 0x7c, 0x0f, 0x97, 0x67, 0xf4, 0x18, 0x87, 0x32, - 0x55, 0x8a, 0xa7, 0xf0, 0x41, 0x37, 0x3b, 0x02, 0x64, 0x5d, 0x27, 0x27, - 0x25, 0x93, 0x38, 0x94, 0xac, 0xc3, 0x5a, 0x4c, 0x96, 0xec, 0xbe, 0x9c, - 0x9b, 0x18, 0xec, 0xc5, 0x64, 0x4c, 0xc2, 0x3c, 0x5c, 0x04, 0x3f, 0x16, - 0x5e, 0xcd, 0x55, 0x10, 0x3f, 0xbd, 0xd0, 0x7f, 0x74, 0xf0, 0xce, 0xd3, - 0x4a, 0x11, 0xbf, 0xb5, 0xad, 0xf0, 0x93, 0x2b, 0x20, 0x12, 0x45, 0x48, - 0x07, 0x6b, 0x86, 0x92, 0x33, 0x71, 0xbe, 0xcc, 0x5f, 0xbf, 0x4e, 0xe6, - 0xf3, 0xc2, 0x5d, 0x5a, 0xd8, 0x36, 0xe3, 0x98, 0xea, 0xd5, 0x9a, 0xdc, - 0x83, 0x2f, 0x47, 0x90, 0xcb, 0xeb, 0x05, 0x06, 0x56, 0x51, 0x25, 0x48, - 0x01, 0xd7, 0xdb, 0xa0, 0x28, 0x6e, 0x1c, 0xad, 0xd5, 0x3d, 0x5c, 0xc7, - 0x22, 0x13, 0x77, 0xc8, 0xdf, 0xaf, 0x8a, 0x82, 0x04, 0x4d, 0xd2, 0x5a, - 0x48, 0xe4, 0x40, 0xb5, 0xe8, 0x04, 0x87, 0xf2, 0xb0, 0x8d, 0xc1, 0x20, - 0x45, 0xc6, 0x66, 0x07, 0x7c, 0xec, 0x38, 0x21, 0x0a, 0xad, 0x22, 0xb5, - 0xb1, 0xff, 0x92, 0x6d, 0xb1, 0x32, 0x56, 0x2c, 0xa7, 0x7b, 0xc2, 0x77, - 0x6e, 0xfb, 0x9e, 0x6b, 0xb9, 0xfe, 0x42, 0x52, 0xa1, 0x3b, 0x1e, 0xc7, - 0x6d, 0x39, 0x8e, 0x5a, 0x22, 0x16, 0xdc, 0xc2, 0x52, 0x5e, 0x85, 0xb3, - 0x63, 0x33, 0x26, 0xc9, 0x88, 0xee, 0x69, 0x0c, 0x80, 0x37, 0xee, 0x1f, - 0x82, 0x07, 0x78, 0x65, 0x01, 0x4e, 0x59, 0x3d, 0x00, 0x85, 0xb4, 0x77, - 0x39, 0x7a, 0x20, 0x58, 0xd7, 0xd0, 0xee, 0xfb, 0x29, 0xd6, 0x53, 0xef, - 0x01, 0x81, 0x43, 0x53, 0x2d, 0xe4, 0xb5, 0x55, 0xc6, 0x4c, 0x62, 0x75, - 0x67, 0x48, 0x0f, 0x96, 0x1e, 0xd1, 0x51, 0xac, 0x62, 0xff, 0x70, 0x0d, - 0xd4, 0x89, 0x6c, 0x02, 0x5b, 0xc5, 0xb3, 0x42, 0xca, 0x19, 0x50, 0x55, - 0xb1, 0x2e, 0xd4, 0x8e, 0x9b, 0x4d, 0x27, 0x2d, 0x68, 0x55, 0x9a, 0xdb, - 0x8d, 0xfc, 0xbd, 0xcd, 0xf5, 0xd9, 0xcf, 0x08, 0x18, 0xf8, 0x0b, 0x5e, - 0xc8, 0x48, 0xa0, 0xa0, 0xef, 0x66, 0x34, 0xf2, 0x89, 0xb6, 0x8f, 0xbb, - 0xa1, 0x69, 0x77, 0x09, 0xe3, 0xd8, 0x3f, 0x11, 0x1f, 0x9b, 0xad, 0xae, - 0x5c, 0xc8, 0xf0, 0xfa, 0x8f, 0x92, 0x12, 0x7a, 0x78, 0x53, 0xa7, 0xce, - 0x63, 0x2b, 0xf9, 0x7b, 0x15, 0x3c, 0x3e, 0xe6, 0xae, 0x39, 0x09, 0x31, - 0xb7, 0xca, 0x56, 0x4e, 0x0d, 0x7d, 0x76, 0x7a, 0x44, 0x81, 0x5d, 0x04, - 0x1d, 0x3a, 0xfc, 0xeb, 0x7b, 0x89, 0x83, 0x86, 0x82, 0x50, 0xf1, 0x33, - 0xb2, 0xff, 0x8f, 0x00, 0x29, 0x60, 0x95, 0x57, 0xf2, 0x47, 0x07, 0xd7, - 0x56, 0x58, 0x2b, 0x4a, 0x43, 0x84, 0xf8, 0xd2, 0xd1, 0x0a, 0x6d, 0x70, - 0xbe, 0xb2, 0x4e, 0x3a, 0xaa, 0x30, 0xab, 0xad, 0x13, 0xfb, 0x80, 0x89, - 0x13, 0xdd, 0xe4, 0x01, 0x28, 0x04, 0x84, 0x4b, 0xe5, 0x17, 0x16, 0xfc, - 0xe6, 0xb4, 0x9a, 0x4d, 0x35, 0xe2, 0xdd, 0x1c, 0x8e, 0xdc, 0x97, 0xab, - 0xc9, 0x1d, 0x45, 0x32, 0x0f, 0xa5, 0x08, 0xda, 0xf7, 0xe0, 0x64, 0x55, - 0xe5, 0x78, 0xab, 0xe7, 0x6c, 0x6f, 0x5e, 0x56, 0x09, 0x3b, 0x32, 0x75, - 0x17, 0x4b, 0x39, 0x06, 0x9f, 0xfc, 0x40, 0x71, 0xaa, 0x57, 0xb3, 0x36, - 0xca, 0x70, 0xcc, 0xdf, 0xd5, 0xd2, 0xa1, 0xcd, 0x4b, 0xae, 0x58, 0xfe, - 0x12, 0xbf, 0x5f, 0x8f, 0x44, 0x06, 0x08, 0x73, 0xc5, 0x66, 0xed, 0x4a, - 0x70, 0xe6, 0x66, 0x1e, 0x55, 0x2f, 0x0e, 0x65, 0x81, 0xd0, 0xcb, 0x9f, - 0xd4, 0x48, 0xfe, 0x72, 0xc1, 0xd4, 0xa1, 0xc1, 0x05, 0x68, 0x28, 0x0c, - 0xdc, 0xa1, 0x85, 0x8c, 0xac, 0xe4, 0x2e, 0x9d, 0x95, 0xcc, 0x0e, 0xc6, - 0xec, 0xae, 0x7d, 0xe4, 0x0f, 0x02, 0x81, 0x6b, 0x84, 0x02, 0xf9, 0xbb, - 0xb2, 0xb6, 0x30, 0x4d, 0x29, 0xaf, 0x52, 0x31, 0xb7, 0xca, 0xf7, 0x10, - 0xdf, 0xb3, 0x7d, 0xf9, 0x3e, 0x45, 0xc9, 0x97, 0x15, 0xaf, 0xf4, 0x49, - 0x46, 0x52, 0xbe, 0x7e, 0x68, 0x8c, 0xf7, 0x3a, 0x00, 0x9e, 0x56, 0xad, - 0xd0, 0x9b, 0x87, 0x74, 0xf0, 0x25, 0x8e, 0xae, 0x7a, 0xa4, 0x71, 0xfc, - 0x91, 0xec, 0xbc, 0x82, 0x56, 0xdc, 0xb8, 0xb2, 0x20, 0x57, 0x60, 0x8f, - 0x1e, 0xf2, 0x84, 0x94, 0x15, 0xb3, 0x19, 0x47, 0x55, 0x8a, 0xd0, 0xa4, - 0x2b, 0x3d, 0x47, 0x7e, 0x4c, 0xab, 0x36, 0xf0, 0x90, 0x5a, 0x27, 0xca, - 0x0b, 0x23, 0xcc, 0x37, 0x77, 0x21, 0x1e, 0x57, 0xdc, 0xaa, 0x89, 0x73, - 0xf7, 0x26, 0x79, 0x38, 0x37, 0xaa, 0x11, 0x28, 0x8c, 0xa0, 0x33, 0xae, - 0x3d, 0x65, 0x8b, 0x53, 0x47, 0x02, 0x65, 0xa0, 0x8b, 0xd0, 0xad, 0xd1, - 0xa7, 0xe0, 0x46, 0xb3, 0x4d, 0x5b, 0x80, 0x3e, 0xe6, 0x7c, 0x47, 0xe1, - 0x14, 0x74, 0xd2, 0x7d, 0xe6, 0xfe, 0x00, 0x90, 0x57, 0x3f, 0xd6, 0xd1, - 0x05, 0x5d, 0x72, 0xa6, 0x97, 0xf3, 0x41, 0xbe, 0x9a, 0x8d, 0x93, 0x83, - 0x88, 0xdc, 0xf7, 0x68, 0x1a, 0x85, 0x15, 0xf1, 0x0e, 0xca, 0xaa, 0x05, - 0x24, 0xbd, 0xd8, 0x2f, 0xbd, 0xb2, 0x25, 0x26, 0x0c, 0x54, 0xd0, 0x6c, - 0xad, 0xef, 0x46, 0x3c, 0xc7, 0xd2, 0x9a, 0xfa, 0x95, 0x1c, 0x12, 0xd3, - 0x72, 0x3f, 0x3c, 0x23, 0xf3, 0xf6, 0x8a, 0x30, 0x58, 0xa5, 0xd4, 0xfd, - 0x31, 0x2f, 0xaf, 0x2d, 0x83, 0x8b, 0xe0, 0xab, 0x4f, 0x85, 0xe4, 0xfa, - 0xde, 0xa3, 0x52, 0x99, 0x4e, 0x3e, 0xa8, 0x0f, 0x29, 0x9f, 0x65, 0x4d, - 0x96, 0x62, 0x75, 0x53, 0xbd, 0x44, 0x96, 0xa9, 0xe3, 0x6b, 0xb1, 0xba, - 0x70, 0xed, 0x85, 0x35, 0xee, 0x70, 0x5f, 0xab, 0x8a, 0xb0, 0xdf, 0xf9, - 0x2e, 0x34, 0x56, 0xa7, 0x31, 0xd1, 0x10, 0x1b, 0x90, 0x61, 0x96, 0xc4, - 0x62, 0x6a, 0xe8, 0x79, 0x11, 0xf1, 0x99, 0x09, 0xa2, 0x0b, 0xb7, 0x92, - 0xb2, 0xae, 0xdc, 0x4a, 0xe0, 0x2a, 0x63, 0xf0, 0xc8, 0x2b, 0x6f, 0x0b, - 0x2b, 0xc4, 0x37, 0x46, 0x8b, 0xa6, 0xbf, 0x1f, 0x26, 0xd3, 0xe7, 0x25, - 0x95, 0xbd, 0xb8, 0x3f, 0x15, 0x3e, 0x7e, 0xd9, 0x0c, 0x97, 0x08, 0x4d, - 0xcf, 0x14, 0x79, 0x17, 0xfc, 0x3b, 0x9d, 0x80, 0x48, 0x49, 0x28, 0x87, - 0x53, 0xca, 0xad, 0xc3, 0x11, 0xf6, 0x60, 0x0c, 0xf1, 0xd2, 0x35, 0x40, - 0x5c, 0xc2, 0x89, 0xff, 0xf8, 0xb8, 0x2e, 0x29, 0xbf, 0xe6, 0x0f, 0x31, - 0xac, 0x1a, 0xe0, 0x66, 0x12, 0x90, 0x08, 0x8d, 0x28, 0x16, 0xf6, 0x6f, - 0x36, 0x3a, 0xfa, 0xad, 0xe8, 0x6f, 0x4f, 0x3d, 0xc1, 0xda, 0xf9, 0xfa, - 0xa6, 0x85, 0xcf, 0x62, 0x13, 0x23, 0x17, 0xfb, 0x2f, 0xd7, 0x83, 0xbd, - 0x42, 0xbc, 0x66, 0x4e, 0xe8, 0xe1, 0x79, 0x8b, 0x05, 0x47, 0xc3, 0x77, - 0x4d, 0x1b, 0xc1, 0x47, 0xa7, 0xd1, 0x66, 0x82, 0x16, 0x58, 0x8e, 0xb3, - 0x8c, 0xa4, 0x97, 0x31, 0x1a, 0x08, 0x44, 0xdc, 0xc4, 0xa8, 0xd3, 0x57, - 0x4a, 0x33, 0x0e, 0x8a, 0xb6, 0x40, 0x3d, 0x53, 0xdc, 0x6e, 0xa3, 0x8e, - 0x00, 0x01, 0x30, 0xb8, 0x10, 0x90, 0xbb, 0x08, 0xb5, 0xc9, 0x81, 0x41, - 0x21, 0xaf, 0xda, 0x56, 0x3c, 0x05, 0x89, 0x76, 0xde, 0x1d, 0x58, 0xab, - 0xa4, 0x33, 0x29, 0xe6, 0xe3, 0x51, 0xbd, 0x69, 0xe5, 0xbd, 0xd2, 0x29, - 0xb5, 0xad, 0x9b, 0x03, 0xbd, 0x1c, 0x2c, 0x01, 0xc2, 0xf5, 0x05, 0x1a, - 0x30, 0xaa, 0xd5, 0x9e, 0xb9, 0x69, 0x04, 0x05, 0x80, 0x81, 0x7c, 0xba, - 0x6b, 0x5f, 0xa3, 0x7d, 0x95, 0x68, 0x13, 0xcf, 0x4a, 0xdd, 0x55, 0xe1, - 0x2a, 0x03, 0x61, 0x9b, 0x1f, 0xdc, 0x28, 0x92, 0x3b, 0x46, 0x2a, 0x99, - 0x17, 0xfd, 0x45, 0x74, 0x6a, 0x45, 0x13, 0x0d, 0xa5, 0xf1, 0x28, 0xef, - 0x5f, 0x8a, 0x25, 0x60, 0x4c, 0x55, 0xb6, 0xc2, 0xd5, 0x50, 0xa4, 0x1e, - 0x68, 0xcb, 0xcd, 0x4c, 0xcf, 0xf1, 0x1f, 0xd1, 0xcd, 0x16, 0xc0, 0x6f, - 0x5e, 0xab, 0xd2, 0x72, 0xc0, 0xae, 0xe9, 0xb1, 0xfa, 0xb5, 0xae, 0xcd, - 0x9a, 0xca, 0x5b, 0x9c, 0x39, 0x11, 0xf0, 0x46, 0x44, 0xcf, 0x42, 0xa1, - 0x2d, 0x91, 0xcc, 0x4d, 0xb5, 0x98, 0xae, 0x5a, 0x40, 0x96, 0x8b, 0x53, - 0x36, 0x56, 0x21, 0x2d, 0xd8, 0x5d, 0xa9, 0x01, 0x6e, 0xdd, 0x82, 0x19, - 0x0a, 0x1a, 0x81, 0x0b, 0x0c, 0x5f, 0x9b, 0x69, 0x57, 0x77, 0xad, 0x39, - 0x26, 0x16, 0xc5, 0x5c, 0x19, 0x2b, 0x6f, 0x4c, 0x05, 0x83, 0x78, 0xcd, - 0xbc, 0x3c, 0x51, 0x6b, 0x19, 0xe9, 0xb5, 0x5f, 0xf2, 0x07, 0x8d, 0x3d, - 0x53, 0x8e, 0xb6, 0x2f, 0x6a, 0xe9, 0xde, 0x8b, 0xf8, 0x25, 0xc3, 0xbb, - 0x5a, 0x43, 0x93, 0x93, 0x77, 0x3f, 0xa3, 0x1a, 0x5e, 0x07, 0xc8, 0x3b, - 0x74, 0x32, 0x66, 0x03, 0x3f, 0xe4, 0x27, 0x3c, 0x38, 0x44, 0xb4, 0x57, - 0x4d, 0x7f, 0x0b, 0xcd, 0x4a, 0xed, 0x4d, 0x7d, 0x46, 0x59, 0xb7, 0xf1, - 0x6f, 0xa8, 0x4d, 0x22, 0x8a, 0x27, 0x78, 0xda, 0x14, 0x1c, 0xce, 0x48, - 0x6e, 0x7e, 0x95, 0x8d, 0xe1, 0x30, 0x28, 0xd6, 0x4d, 0x77, 0xe7, 0x3d, - 0x71, 0x25, 0x6f, 0xd5, 0xcc, 0xfe, 0x38, 0x1a, 0xa8, 0xfb, 0xbf, 0xaa, - 0x9d, 0x24, 0xba, 0xa7, 0x9f, 0x49, 0x3b, 0xe3, 0x2d, 0x96, 0x22, 0x45, - 0xa9, 0x8e, 0x22, 0x35, 0x89, 0x70, 0xea, 0x81, 0x69, 0x3d, 0x6b, 0xb4, - 0x2e, 0x5a, 0x59, 0xc0, 0x2f, 0xf2, 0x26, 0x49, 0xcc, 0x6c, 0x0c, 0xcb, - 0x7e, 0x76, 0xfb, 0xbf, 0x01, 0x97, 0xa1, 0xfe, 0x7c, 0x41, 0xd8, 0x3c, - 0x5e, 0x30, 0x1a, 0x57, 0x2c, 0xf4, 0x67, 0x94, 0x55, 0x29, 0x16, 0x77, - 0xfa, 0x19, 0xb2, 0x81, 0x10, 0x2f, 0xe6, 0x5b, 0x1e, 0x72, 0x63, 0xa9, - 0x16, 0x01, 0xdb, 0x3d, 0x52, 0x78, 0x88, 0x90, 0x9d, 0x05, 0x6b, 0xd6, - 0xd2, 0x53, 0xdd, 0xbc, 0x38, 0x3c, 0x7a, 0x2d, 0x74, 0x23, 0xb2, 0xfe, - 0x51, 0x51, 0x33, 0x3b, 0x84, 0xb9, 0xce, 0x7e, 0x26, 0x55, 0x49, 0x73, - 0x37, 0x42, 0x05, 0xd4, 0x00, 0x36, 0xb8, 0x2b, 0xab, 0xf4, 0xff, 0x1c, - 0xa7, 0x6b, 0x22, 0x7c, 0x92, 0xf9, 0x18, 0xbf, 0xaf, 0xf5, 0x60, 0x01, - 0x50, 0x4e, 0xe9, 0x97, 0x62, 0x15, 0x3a, 0x7d, 0xec, 0xfd, 0x57, 0x84, - 0x4d, 0x17, 0x92, 0x8e, 0x56, 0x00, 0xaa, 0x4a, 0x57, 0x1c, 0x43, 0x1c, - 0x3a, 0x10, 0xc9, 0xf2, 0x83, 0xac, 0xe3, 0xd1, 0xcd, 0x04, 0x43, 0x98, - 0x07, 0x82, 0x92, 0x10, 0xc1, 0xd8, 0x37, 0x49, 0x4a, 0xce, 0x93, 0xcc, - 0x91, 0x72, 0x8f, 0xd7, 0x18, 0x86, 0x11, 0x8b, 0xa4, 0xd1, 0x58, 0x81, - 0x2c, 0x60, 0x5b, 0x35, 0xf1, 0x0c, 0x75, 0xbb, 0xed, 0xa8, 0x4c, 0xec, - 0xce, 0xd8, 0xc5, 0xee, 0x3a, 0x10, 0xec, 0xc8, 0x1d, 0x88, 0xc1, 0x00, - 0x1f, 0xc8, 0x78, 0xf0, 0xc9, 0x9b, 0x44, 0x36, 0x40, 0x33, 0x0e, 0xcd, - 0x42, 0x25, 0x0b, 0xe4, 0x4a, 0x31, 0x7e, 0x05, 0xf8, 0xd6, 0xe8, 0xdd, - 0x66, 0x55, 0xf8, 0x24, 0x19, 0x07, 0x9b, 0xb5, 0x95, 0x91, 0x99, 0x5a, - 0x36, 0x78, 0xb3, 0x4f, 0x06, 0xe0, 0x39, 0x03, 0x0b, 0x84, 0x3b, 0x4a, - 0xa3, 0x0b, 0x82, 0x0f, 0x55, 0x32, 0x8b, 0xef, 0x7a, 0x03, 0xf7, 0x42, - 0x0a, 0xc2, 0x4a, 0xb6, 0x13, 0x4f, 0xb7, 0x51, 0x36, 0x2a, 0xea, 0x9a, - 0x7f, 0x8a, 0xaf, 0xcc, 0x34, 0xab, 0xf5, 0xc3, 0x4b, 0xb6, 0xc3, 0xe7, - 0x23, 0x6c, 0x33, 0xe1, 0xff, 0x9f, 0xef, 0xf4, 0xe9, 0xac, 0x8e, 0xa9, - 0x72, 0x42, 0x07, 0x63, 0xe8, 0xd2, 0x6b, 0xc4, 0xfb, 0x72, 0x05, 0xc3, - 0xd5, 0x88, 0x82, 0x98, 0x29, 0xf6, 0xfa, 0xe6, 0x91, 0x0e, 0x91, 0xbd, - 0x7b, 0xaa, 0x2c, 0x15, 0xd3, 0xa3, 0xe6, 0x3e, 0x87, 0x8d, 0xbc, 0xf8, - 0x34, 0x2f, 0x5f, 0x63, 0xab, 0x97, 0x2e, 0x34, 0x84, 0x75, 0x29, 0x3c, - 0x66, 0x17, 0x15, 0x66, 0x86, 0xc7, 0x56, 0xa5, 0xba, 0x90, 0x9c, 0x2c, - 0xf7, 0x5f, 0x35, 0x3d, 0x3a, 0xa0, 0x9e, 0xda, 0x6c, 0x22, 0xe2, 0x32, - 0x64, 0x2d, 0xb3, 0xaf, 0xe3, 0xc7, 0x83, 0x24, 0x42, 0x7e, 0x0e, 0xc2, - 0x83, 0x49, 0xef, 0xa6, 0x54, 0xf7, 0xd9, 0x92, 0xb5, 0xf0, 0xa0, 0xf3, - 0x87, 0x82, 0x89, 0xd3, 0xbd, 0xdb, 0x80, 0x43, 0xf7, 0x60, 0xef, 0xca, - 0x92, 0x37, 0x83, 0xc2, 0x9d, 0x20, 0x4f, 0xc3, 0x0c, 0xc1, 0xab, 0xf0, - 0xc8, 0x5b, 0x34, 0x05, 0x46, 0xff, 0xb3, 0x8b, 0x27, 0x00, 0x72, 0x68, - 0xa5, 0x0c, 0xab, 0xb1, 0xef, 0x20, 0xde, 0x3d, 0x68, 0x22, 0xd0, 0x8b, - 0xa7, 0x43, 0x6f, 0x1a, 0xfa, 0x58, 0x7c, 0x0b, 0xc8, 0x59, 0x87, 0x25, - 0xa4, 0x4a, 0x9f, 0x6e, 0xb3, 0x03, 0x55, 0xf4, 0xb0, 0x2a, 0x3e, 0xfc, - 0xd7, 0xeb, 0xcd, 0xc9, 0x3e, 0x43, 0xeb, 0x72, 0x42, 0x19, 0x22, 0x88, - 0xb9, 0xdc, 0x77, 0xe6, 0xc5, 0x63, 0x50, 0x8e, 0xcb, 0x0c, 0xe8, 0x62, - 0x4b, 0x1e, 0x13, 0x17, 0x54, 0x23, 0x95, 0x79, 0xaa, 0x7e, 0x04, 0xdd, - 0x1a, 0x09, 0x73, 0x4b, 0x47, 0x9f, 0x71, 0x11, 0xe7, 0x53, 0x95, 0x01, - 0x9c, 0xc9, 0x7a, 0x6a, 0x2d, 0xa4, 0x0b, 0x64, 0xfb, 0x4f, 0x78, 0x6c, - 0x37, 0xf2, 0xb5, 0x80, 0x62, 0xe0, 0x48, 0x0e, 0x57, 0xfe, 0x6d, 0x49, - 0xd9, 0xdd, 0x64, 0xe2, 0xc9, 0x80, 0xc1, 0x27, 0xed, 0x6b, 0xd6, 0x7c, - 0x52, 0x43, 0xfe, 0x0f, 0xa1, 0x60, 0x3c, 0x74, 0x59, 0x44, 0x22, 0xb4, - 0x7e, 0xde, 0xd9, 0xd6, 0x82, 0x20, 0x18, 0x00, 0x9f, 0x04, 0xab, 0x71, - 0x21, 0x58, 0xd8, 0xfe, 0x2b, 0xfc, 0x82, 0x0e, 0x19, 0x9f, 0x96, 0x03, - 0xc3, 0xf1, 0x0a, 0xeb, 0x1e, 0xa9, 0xf7, 0xfb, 0x1b, 0x9a, 0x8f, 0x94, - 0x8b, 0x6a, 0x92, 0xff, 0xa9, 0xfa, 0x63, 0x32, 0x33, 0x1c, 0xf9, 0xbc, - 0xf2, 0xb0, 0xd6, 0xd7, 0x7e, 0xdb, 0x3c, 0xd5, 0xb8, 0xf7, 0xea, 0x71, - 0xd4, 0x83, 0x2d, 0x8a, 0xc1, 0x86, 0x49, 0x48, 0x6e, 0x92, 0x4d, 0x70, - 0xc6, 0xc7, 0xb5, 0x3b, 0x55, 0xc7, 0xd6, 0xdb, 0x3b, 0x40, 0xc9, 0x0c, - 0xc7, 0x49, 0x41, 0x91, 0xdd, 0xfe, 0x12, 0x25, 0xc9, 0xee, 0x18, 0x2b, - 0x38, 0x72, 0x89, 0x3d, 0x4a, 0xcf, 0xe8, 0xac, 0xcf, 0xfe, 0x7d, 0x1b, - 0x9a, 0xb8, 0xd3, 0xa8, 0x86, 0x7c, 0x38, 0x63, 0x71, 0xc4, 0xdf, 0xe6, - 0x3e, 0xe8, 0x8d, 0xb3, 0xed, 0xec, 0x6d, 0x6d, 0x2d, 0x4a, 0x0d, 0x55, - 0xe8, 0xb7, 0x9a, 0xd7, 0xfb, 0x64, 0xb5, 0x76, 0x03, 0x97, 0xb0, 0x77, - 0x0f, 0xcb, 0x8e, 0xb3, 0x72, 0x33, 0x2c, 0x64, 0xcb, 0x4a, 0x4d, 0x90, - 0xe6, 0xb8, 0xc7, 0xbd, 0x9d, 0x72, 0xca, 0x5c, 0x8f, 0x3b, 0x6d, 0x9e, - 0x37, 0x66, 0xf5, 0x6c, 0x2b, 0x2b, 0xac, 0xb4, 0xef, 0x3d, 0x63, 0x6f, - 0xc3, 0x14, 0x3c, 0xaf, 0xe8, 0xb3, 0x75, 0x0c, 0x68, 0xa1, 0xa4, 0xe8, - 0x7d, 0x1c, 0x3e, 0xbb, 0x8f, 0x81, 0xb3, 0x4e, 0x19, 0xc9, 0xaf, 0xdd, - 0x71, 0x2d, 0xf9, 0x98, 0xe1, 0x70, 0xb8, 0xa6, 0x2a, 0x76, 0xf0, 0xde, - 0xc0, 0xb3, 0xac, 0x92, 0xce, 0x09, 0x66, 0x53, 0xf2, 0x5b, 0x9e, 0x32, - 0x70, 0x51, 0x3b, 0xac, 0x5c, 0x69, 0xf0, 0xdf, 0x14, 0x5c, 0x12, 0x41, - 0x18, 0xe8, 0xd4, 0xa2, 0x50, 0x20, 0x1c, 0xfe, 0x13, 0x70, 0xe7, 0x94, - 0x61, 0xf9, 0x9f, 0x01, 0x4a, 0xb9, 0x16, 0x13, 0x9a, 0x57, 0x9d, 0x86, - 0xed, 0x0c, 0x69, 0x6e, 0x4d, 0x5b, 0x60, 0x71, 0x67, 0xd7, 0x07, 0xb7, - 0x09, 0x05, 0xe5, 0xc5, 0x55, 0x88, 0x39, 0x1c, 0xed, 0xb8, 0xb6, 0x7f, - 0x20, 0x9f, 0x17, 0x47, 0x71, 0xf1, 0x68, 0xb1, 0x5d, 0xe0, 0xeb, 0x18, - 0x90, 0xbf, 0x1c, 0xe2, 0x8b, 0x9f, 0xb8, 0x05, 0x06, 0x52, 0x60, 0x2f, - 0x4e, 0x33, 0x7a, 0x49, 0x84, 0x0c, 0x71, 0x71, 0xb1, 0xe8, 0x77, 0xaa, - 0xf4, 0x7e, 0xb1, 0xf9, 0xd2, 0x29, 0x4d, 0x79, 0x24, 0x12, 0x52, 0xbc, - 0x4f, 0x6b, 0xa8, 0xcd, 0xd0, 0xcf, 0x41, 0xf8, 0x6e, 0xcb, 0x5f, 0xcd, - 0xe8, 0x32, 0x56, 0xb0, 0xcc, 0x3d, 0xf6, 0xd4, 0x4a, 0x68, 0x52, 0x65, - 0x37, 0x68, 0xdf, 0x62, 0x96, 0x83, 0x4b, 0x8c, 0xa4, 0x12, 0x21, 0x3f, - 0x0f, 0xd9, 0x35, 0xb3, 0x11, 0x6e, 0xca, 0xea, 0x90, 0xb6, 0x20, 0x59, - 0x1a, 0x4e, 0xa5, 0xdf, 0x39, 0x26, 0x01, 0x7c, 0x20, 0xc1, 0xde, 0x04, - 0xfb, 0x21, 0xb8, 0xea, 0x6f, 0x56, 0xfc, 0x07, 0xc5, 0x0d, 0x48, 0x28, - 0xa6, 0x06, 0x49, 0x1f, 0x95, 0x7a, 0x69, 0xfb, 0x71, 0x96, 0xe2, 0x65, - 0x15, 0xf8, 0x7b, 0xc1, 0xe0, 0x71, 0xdf, 0x82, 0x35, 0xb8, 0xaa, 0xaa, - 0xa9, 0x78, 0x69, 0xae, 0xe0, 0xc8, 0xb1, 0xf3, 0x9f, 0x8f, 0xab, 0xfe, - 0x04, 0xbf, 0x90, 0x78, 0x7e, 0xc4, 0x22, 0xe3, 0x05, 0xa5, 0x05, 0x0e, - 0xcb, 0x18, 0xd9, 0xde, 0x52, 0x5e, 0xce, 0xb8, 0x40, 0x35, 0xa3, 0x90, - 0xfc, 0x3e, 0x50, 0xe4, 0x78, 0xa3, 0xc1, 0x28, 0x9a, 0x37, 0xa4, 0x75, - 0x86, 0x95, 0x39, 0x9b, 0x5a, 0x46, 0x1c, 0x2f, 0x26, 0x4a, 0x55, 0xa1, - 0x1b, 0x3c, 0xfd, 0x1b, 0x7f, 0x1c, 0x60, 0xc4, 0x5f, 0xe4, 0x1f, 0xb9, - 0x61, 0xa6, 0x5a, 0xbc, 0xd2, 0x5c, 0x92, 0x56, 0xdd, 0xcf, 0xd6, 0x4b, - 0x22, 0x05, 0xc3, 0xf7, 0xfa, 0x9c, 0x95, 0x7e, 0xec, 0x86, 0xa3, 0x8b, - 0x5f, 0x9b, 0xf8, 0xbd, 0xeb, 0x6a, 0xa1, 0xf2, 0x0d, 0x5e, 0x4e, 0x0c, - 0x95, 0x99, 0xa9, 0x69, 0x1a, 0xb4, 0x44, 0x3b, 0x15, 0x38, 0xdb, 0xd9, - 0x7e, 0xb7, 0x59, 0x3c, 0x6d, 0x0b, 0xf5, 0x15, 0x8d, 0x3b, 0x0e, 0x1c, - 0x60, 0x3c, 0x5d, 0xd7, 0xb1, 0x6d, 0xf3, 0xa7, 0x75, 0x5c, 0xf2, 0x3e, - 0xdf, 0x8c, 0xda, 0x7f, 0x15, 0xc1, 0x9e, 0xd6, 0xff, 0xa6, 0x66, 0x33, - 0xd7, 0x6c, 0x5c, 0x4a, 0xbc, 0xc5, 0xc6, 0x6e, 0x88, 0xb7, 0x9b, 0xe3, - 0xcc, 0x9d, 0x89, 0x75, 0x29, 0x1c, 0xac, 0xb3, 0x9e, 0x95, 0x2c, 0x93, - 0xd4, 0xa0, 0x0d, 0xa2, 0xaf, 0xd6, 0x6d, 0x62, 0x84, 0xb5, 0xfe, 0xa4, - 0x2b, 0xb7, 0x9f, 0xc2, 0xe1, 0x32, 0x35, 0x26, 0xce, 0x40, 0xb8, 0x90, - 0x6b, 0xed, 0xa8, 0xea, 0xa1, 0x76, 0xc3, 0xa1, 0x76, 0x5c, 0xb5, 0x96, - 0xc7, 0xcc, 0x61, 0x58, 0x60, 0x5e, 0x70, 0x06, 0x74, 0x85, 0xed, 0x86, - 0xef, 0x50, 0x62, 0xfb, 0x9b, 0xea, 0x0e, 0x66, 0x13, 0xd7, 0x13, 0x24, - 0x9e, 0xce, 0x98, 0x41, 0xa6, 0xbb, 0xed, 0x66, 0x3b, 0x40, 0x68, 0x52, - 0xf1, 0x04, 0x65, 0x4c, 0xac, 0x68, 0x4f, 0x31, 0xe8, 0x08, 0x05, 0x94, - 0x88, 0x88, 0x05, 0x7b, 0xb4, 0xcb, 0x14, 0x48, 0x50, 0xc9, 0x8f, 0x38, - 0x39, 0xea, 0xf2, 0xbd, 0x54, 0x46, 0x98, 0xd5, 0xe0, 0xcf, 0x3a, 0x67, - 0x71, 0xab, 0x34, 0x62, 0x1e, 0x0e, 0xcc, 0x0e, 0xb5, 0xbf, 0xca, 0xd9, - 0x00, 0x5b, 0x1d, 0xb8, 0x9b, 0x46, 0x37, 0xc1, 0xa8, 0x40, 0x36, 0x90, - 0x8e, 0xd5, 0xb7, 0x66, 0x73, 0x7b, 0x3f, 0xf8, 0x72, 0x20, 0xcf, 0x93, - 0x32, 0x62, 0x12, 0xe4, 0xd5, 0x84, 0xa8, 0xcd, 0xe5, 0xc0, 0x8b, 0x57, - 0x34, 0xb0, 0x36, 0x3b, 0x70, 0x66, 0x9f, 0xe1, 0x7a, 0xb9, 0x15, 0xc6, - 0x6a, 0xf1, 0x39, 0xd7, 0xbf, 0xb3, 0x61, 0x10, 0xf7, 0xb4, 0x48, 0x95, - 0xf7, 0xb4, 0x47, 0xac, 0x06, 0xd0, 0xaf, 0x13, 0x37, 0x56, 0x94, 0xa9, - 0x91, 0x3c, 0xb2, 0x50, 0x00, 0x2f, 0xad, 0x40, 0xe9, 0x57, 0xd2, 0xaf, - 0x48, 0xb8, 0xe6, 0x36, 0x05, 0xa0, 0xb8, 0x92, 0x60, 0x46, 0xae, 0xb5, - 0xdc, 0x0d, 0xd7, 0xbf, 0xe2, 0xa5, 0x79, 0x36, 0x5c, 0x5a, 0xe5, 0xf9, - 0xfb, 0x2d, 0x35, 0x42, 0x6b, 0x63, 0x98, 0x69, 0x6f, 0x1d, 0x97, 0xb6, - 0xce, 0xea, 0x45, 0x51, 0x29, 0xd8, 0xb6, 0x8f, 0xae, 0x1f, 0xce, 0x86, - 0x43, 0x18, 0x29, 0xb9, 0x55, 0x38, 0x9c, 0x01, 0xd3, 0xf3, 0x8a, 0x6f, - 0x3f, 0xb7, 0x9c, 0x05, 0xd2, 0x76, 0x65, 0xda, 0x1f, 0x34, 0xc1, 0xda, - 0xb7, 0x85, 0x04, 0x66, 0xe0, 0x28, 0xaa, 0xb0, 0x07, 0x2a, 0x9b, 0x13, - 0x9d, 0x92, 0x29, 0x0d, 0x8b, 0x97, 0x05, 0x40, 0x91, 0x6f, 0xcb, 0x74, - 0xe9, 0x87, 0x89, 0xa4, 0x62, 0x0d, 0x20, 0xa1, 0xb0, 0x4d, 0xa3, 0x87, - 0xf1, 0x4e, 0x05, 0xc1, 0x56, 0x2d, 0xd1, 0xff, 0xbe, 0x04, 0x79, 0x4a, - 0x43, 0xcd, 0x72, 0x84, 0xb6, 0xb6, 0xda, 0x76, 0x98, 0xac, 0x59, 0x12, - 0x91, 0xcb, 0x63, 0xac, 0xd6, 0xcd, 0xd0, 0xf6, 0xb2, 0xc0, 0x23, 0xc7, - 0x2d, 0xf1, 0x32, 0xeb, 0x8f, 0x50, 0x23, 0x0f, 0x8b, 0x69, 0x0e, 0x62, - 0xfa, 0x82, 0xbf, 0x72, 0x24, 0x3e, 0x08, 0xb4, 0x01, 0x66, 0x5f, 0xf8, - 0x9c, 0x33, 0x44, 0xac, 0x3a, 0xaf, 0x1e, 0xdd, 0x1a, 0x58, 0xc5, 0xa5, - 0xa5, 0x58, 0x6e, 0x0a, 0x53, 0xc9, 0xba, 0x60, 0x11, 0x40, 0xf4, 0x6d, - 0x4c, 0x2c, 0xcc, 0xf8, 0xf0, 0xc7, 0x9d, 0xfa, 0x48, 0x92, 0x4c, 0x58, - 0xd4, 0x1c, 0x24, 0x45, 0x00, 0x16, 0xa0, 0xa5, 0x98, 0x58, 0xc3, 0xb6, - 0x86, 0xc6, 0x49, 0xfd, 0xf1, 0x8b, 0xd3, 0x91, 0xa2, 0x73, 0x34, 0x33, - 0x8e, 0xa5, 0xb4, 0xda, 0xc7, 0x9f, 0x5d, 0x6e, 0xb7, 0xe1, 0x77, 0x08, - 0x73, 0xb1, 0xc6, 0x2c, 0x9a, 0x13, 0x72, 0xb5, 0xb0, 0xbb, 0x04, 0xc7, - 0xfc, 0x70, 0x8a, 0x20, 0x31, 0xbd, 0xfb, 0xa7, 0xbe, 0x9e, 0xe4, 0x34, - 0x18, 0x11, 0x0f, 0x92, 0x74, 0xa0, 0x65, 0xaa, 0xe1, 0xfa, 0x8a, 0xa9, - 0x0f, 0xdb, 0x2b, 0x13, 0xb0, 0xc2, 0x08, 0xad, 0x85, 0xb5, 0x66, 0xc4, - 0xad, 0x64, 0xff, 0xc7, 0xf2, 0x00, 0xec, 0xdb, 0x3d, 0xdd, 0xa0, 0x56, - 0xe1, 0xb6, 0xa8, 0xfa, 0x52, 0xfd, 0x08, 0x10, 0xe1, 0x39, 0xb2, 0x7e, - 0xa0, 0xc8, 0x7c, 0xcf, 0x7b, 0xab, 0xa3, 0xa2, 0xda, 0xca, 0x6e, 0x27, - 0x57, 0x1f, 0xfc, 0x46, 0xd2, 0xb2, 0x1d, 0xd8, 0xe6, 0x7a, 0x6d, 0xcc, - 0x87, 0xc2, 0x7f, 0x35, 0xab, 0xbb, 0x05, 0xd8, 0xcc, 0x51, 0xa8, 0x9a, - 0x59, 0x7c, 0x68, 0xbe, 0x28, 0xb6, 0x5d, 0x00, 0x12, 0x4b, 0x30, 0xf5, - 0xab, 0x79, 0x64, 0x51, 0x81, 0xc6, 0x47, 0xe1, 0xa3, 0xbf, 0x31, 0xe4, - 0x06, 0x4c, 0xa8, 0x82, 0x25, 0x40, 0xe4, 0x5e, 0x8c, 0xe0, 0x5c, 0xc3, - 0x10, 0x42, 0x60, 0x0e, 0xe9, 0xa3, 0x17, 0x2f, 0xbf, 0x1b, 0xd8, 0xdd, - 0xf2, 0x99, 0xcc, 0xe1, 0x91, 0x0a, 0xa3, 0x48, 0x5b, 0x60, 0xa8, 0xb0, - 0x70, 0x49, 0xda, 0x61, 0x68, 0x1b, 0xcd, 0xcb, 0xe5, 0xc3, 0xbc, 0x08, - 0x42, 0xaf, 0xfe, 0xb5, 0x30, 0x73, 0xc8, 0x54, 0x1a, 0xdf, 0x0d, 0xb1, - 0x8a, 0x77, 0xe0, 0x3d, 0x76, 0xbb, 0xd6, 0x55, 0xf2, 0x6c, 0x1a, 0xa6, - 0x75, 0xe1, 0xd3, 0x5f, 0x0f, 0xdd, 0x0d, 0x69, 0x59, 0x8b, 0x3b, 0x59, - 0xb5, 0x6f, 0x30, 0x8f, 0xb3, 0xa6, 0x0c, 0x91, 0xb4, 0x98, 0x49, 0x19, - 0x8e, 0xd2, 0xd9, 0x7f, 0xd0, 0x79, 0x32, 0x7e, 0x0c, 0x3f, 0x65, 0x0e, - 0x94, 0xbc, 0x9f, 0x98, 0xba, 0x02, 0x2c, 0xf1, 0xe0, 0xf4, 0xe8, 0x05, - 0x85, 0x9f, 0x8b, 0xfc, 0x79, 0xb6, 0x2b, 0xf4, 0x26, 0x7e, 0xf3, 0x74, - 0x85, 0xa9, 0x18, 0xa1, 0x9e, 0x0e, 0x5e, 0xc4, 0x95, 0x45, 0x1f, 0xa8, - 0xf2, 0xf9, 0x28, 0x33, 0x06, 0x42, 0x5d, 0x86, 0xb8, 0x81, 0x82, 0xbd, - 0x00, 0xf3, 0xfb, 0x9d, 0x8f, 0x0e, 0xf9, 0x0e, 0x55, 0xf8, 0x65, 0xcb, - 0xdf, 0x8c, 0xec, 0xe3, 0x09, 0xa4, 0x67, 0xa2, 0xea, 0x1e, 0xa5, 0xb8, - 0x3e, 0x4d, 0xd1, 0xeb, 0x24, 0xd4, 0x67, 0x52, 0x44, 0xbe, 0x56, 0xbf, - 0xac, 0x76, 0x3c, 0x47, 0x01, 0x86, 0x35, 0x27, 0x95, 0x5d, 0x2e, 0x9d, - 0x0b, 0xa0, 0xe4, 0xc2, 0x69, 0xfc, 0x6c, 0x58, 0x20, 0x92, 0x94, 0x39, - 0xa7, 0x2b, 0x9c, 0x09, 0x1c, 0xed, 0x3c, 0x3a, 0x59, 0xcf, 0x39, 0x85, - 0x43, 0x55, 0xf0, 0x90, 0xe4, 0xae, 0x40, 0x32, 0x1d, 0x73, 0x90, 0x28, - 0xf4, 0xa4, 0xc5, 0x08, 0xfb, 0x62, 0x92, 0xed, 0xcb, 0x41, 0x3f, 0xe5, - 0x7f, 0x07, 0x4d, 0xbd, 0x14, 0x0a, 0xc4, 0xbf, 0xe2, 0x45, 0xfb, 0x9b, - 0x62, 0x78, 0xb3, 0xfc, 0xd1, 0xcf, 0xeb, 0x6a, 0x4e, 0x12, 0xb9, 0x67, - 0x40, 0xdd, 0x6c, 0x84, 0x29, 0xde, 0xcc, 0x18, 0xfb, 0x9c, 0x25, 0x8d, - 0x14, 0xd7, 0x51, 0x32, 0xe7, 0x08, 0x7c, 0x32, 0xc6, 0x66, 0xd0, 0x8a, - 0xad, 0x0e, 0x3b, 0x9f, 0x5a, 0xce, 0x38, 0x2c, 0xcc, 0x47, 0x38, 0x1f, - 0xb1, 0x18, 0xc8, 0x99, 0xdb, 0x6a, 0xae, 0x5d, 0x65, 0xa3, 0x6c, 0x1a, - 0x02, 0x11, 0x4e, 0x5f, 0xb2, 0xa0, 0xeb, 0x3e, 0xc2, 0xef, 0x05, 0x87, - 0xb3, 0x11, 0x23, 0x08, 0x32, 0x5d, 0x41, 0xd4, 0x14, 0xb5, 0x76, 0xea, - 0x06, 0x37, 0xce, 0x23, 0x1c, 0xb0, 0x42, 0xba, 0x63, 0xdb, 0x10, 0xff, - 0xff, 0x93, 0xc3, 0x82, 0x63, 0x12, 0x4d, 0xa1, 0x98, 0xf6, 0xf8, 0xc8, - 0x97, 0x09, 0x58, 0x2a, 0x06, 0x5d, 0xa5, 0xc5, 0x09, 0xfc, 0x45, 0x65, - 0x14, 0x1f, 0x63, 0xa4, 0x7d, 0x98, 0x1b, 0x46, 0xfb, 0x54, 0x42, 0x9f, - 0x35, 0x9e, 0xc4, 0x1f, 0x72, 0xa0, 0x8f, 0x69, 0x14, 0x2c, 0x2d, 0x32, - 0xc3, 0x79, 0xca, 0x16, 0x55, 0x60, 0x0f, 0x8b, 0x05, 0x63, 0x4e, 0x23, - 0x77, 0x23, 0x63, 0xb6, 0x2a, 0x88, 0xfa, 0xd3, 0xcd, 0xd4, 0x85, 0xe2, - 0x34, 0xf7, 0xd8, 0x69, 0xe4, 0x34, 0x5e, 0x37, 0x66, 0xdd, 0x6a, 0x86, - 0x2f, 0xc0, 0x42, 0x0e, 0xba, 0x2f, 0xfa, 0x53, 0xda, 0x4b, 0xce, 0x2a, - 0x0c, 0x58, 0x86, 0xb8, 0xab, 0x5b, 0x15, 0x43, 0xcb, 0xea, 0x71, 0xff, - 0x1f, 0x88, 0x8f, 0x4a, 0x0f, 0xe5, 0x53, 0x8f, 0xc4, 0x63, 0xfc, 0x5b, - 0xca, 0xcb, 0x97, 0x4a, 0x09, 0x37, 0x35, 0xd7, 0xdc, 0x9d, 0xfd, 0xd6, - 0x0d, 0xa8, 0x49, 0xc0, 0x7d, 0x16, 0xff, 0x7f, 0x23, 0xa8, 0xf2, 0x4a, - 0xaf, 0xf9, 0x31, 0x9b, 0x3e, 0x07, 0x3b, 0xf2, 0x2a, 0x42, 0x5a, 0x61, - 0xa2, 0xab, 0xfa, 0xfd, 0xcd, 0x26, 0x54, 0xd6, 0xdc, 0x98, 0x8b, 0xc8, - 0xf4, 0x65, 0x5a, 0x68, 0x59, 0x11, 0x73, 0x3e, 0xbf, 0xbb, 0x57, 0x1a, - 0x64, 0xf5, 0x9e, 0xc8, 0x18, 0xb1, 0x21, 0x73, 0xb5, 0xe1, 0xcc, 0xeb, - 0xdd, 0xb2, 0x63, 0x22, 0x47, 0x0a, 0x10, 0x00, 0x64, 0x36, 0xab, 0x08, - 0x2b, 0x40, 0x23, 0x1d, 0xb0, 0xd5, 0xe0, 0xee, 0xb2, 0x73, 0x7d, 0x6a, - 0x2e, 0x76, 0x45, 0xaa, 0x1b, 0xd9, 0x0e, 0xb2, 0xca, 0xa5, 0x03, 0x0d, - 0x92, 0x57, 0xe8, 0xb6, 0x25, 0x7c, 0x75, 0x16, 0xd1, 0x2b, 0x80, 0xa8, - 0xfb, 0xca, 0x29, 0xbe, 0x31, 0x17, 0x2d, 0x2e, 0xe3, 0xb4, 0xac, 0xb7, - 0xba, 0x29, 0x71, 0x92, 0xaf, 0x45, 0x9f, 0xb4, 0xc6, 0x79, 0xe3, 0xa7, - 0x84, 0x54, 0x3a, 0x56, 0x9e, 0xe7, 0xec, 0x43, 0xb9, 0xd8, 0xa6, 0x75, - 0x5a, 0x90, 0x47, 0x05, 0x90, 0xc8, 0x5b, 0x60, 0x5b, 0x27, 0x58, 0x06, - 0x19, 0x28, 0xc5, 0x48, 0x0a, 0x1a, 0x0a, 0xc5, 0xe6, 0x2d, 0xd1, 0x60, - 0x71, 0xf6, 0xad, 0x5e, 0x21, 0x42, 0x2f, 0xfb, 0x7c, 0x68, 0x5b, 0xd8, - 0x6e, 0x67, 0x60, 0x5e, 0x58, 0xe7, 0x6c, 0x61, 0xd2, 0x87, 0xf7, 0x0e, - 0x61, 0x78, 0xc3, 0xb8, 0x7b, 0xc1, 0x21, 0x8c, 0x77, 0x3e, 0xac, 0x75, - 0x70, 0x21, 0x6c, 0x36, 0x80, 0xa1, 0x03, 0xcc, 0x7b, 0x45, 0xe4, 0x21, - 0x2d, 0x21, 0x34, 0x86, 0xa2, 0xce, 0x71, 0x6e, 0x52, 0x36, 0x54, 0x10, - 0xb5, 0xe0, 0xc0, 0xf6, 0x7e, 0x2b, 0x93, 0x88, 0x99, 0x51, 0x61, 0xa8, - 0xa8, 0x8a, 0xd0, 0xd5, 0x5c, 0x9f, 0x1a, 0x8a, 0xde, 0x69, 0x9e, 0xd2, - 0xe6, 0x58, 0x07, 0x35, 0x01, 0x66, 0x05, 0xe1, 0x69, 0xee, 0x4d, 0x96, - 0xdf, 0x86, 0xb3, 0x15, 0xb6, 0x40, 0x84, 0xc6, 0x1f, 0xd1, 0x8b, 0x94, - 0xf5, 0x43, 0x8e, 0x4c, 0x56, 0x67, 0x6d, 0xad, 0x9b, 0x3d, 0x24, 0x3c, - 0x6e, 0x52, 0x6f, 0x07, 0x7f, 0xc5, 0xb2, 0x86, 0x23, 0xcf, 0x48, 0x41, - 0x4a, 0x86, 0x5a, 0x89, 0xfb, 0x86, 0xc6, 0x6a, 0x00, 0x9a, 0x09, 0xc3, - 0x4d, 0x91, 0x3c, 0xfc, 0x95, 0xba, 0x27, 0x34, 0x61, 0xaf, 0x4d, 0x49, - 0xa8, 0x58, 0xa2, 0x1a, 0xc7, 0xc7, 0x89, 0x7c, 0x2b, 0x13, 0xc7, 0xb0, - 0x60, 0xa9, 0xc5, 0x1f, 0x3a, 0x7d, 0xf5, 0x74, 0xe7, 0xbe, 0x9f, 0x37, - 0x77, 0x53, 0xd3, 0x96, 0x40, 0x56, 0x5d, 0x13, 0x4c, 0xd1, 0x9b, 0x6c, - 0xcd, 0x5e, 0xfd, 0x9b, 0xc2, 0x60, 0x0d, 0x05, 0xa7, 0xc2, 0xea, 0x5a, - 0x64, 0xb4, 0xbc, 0xa3, 0x12, 0xb5, 0x6a, 0x5f, 0x23, 0x83, 0xd9, 0x20, - 0xda, 0x23, 0x08, 0x1f, 0x14, 0x4c, 0x66, 0xb9, 0x33, 0x1f, 0xfa, 0xd7, - 0x8a, 0xde, 0x4e, 0x5d, 0xc1, 0xc8, 0x5c, 0x93, 0x0b, 0xc7, 0x95, 0xa2, - 0x8f, 0x0f, 0xf7, 0xcd, 0xc5, 0xec, 0x1f, 0x6e, 0x4c, 0xc9, 0xb0, 0x6a, - 0xf0, 0x93, 0x0d, 0xa6, 0xeb, 0x82, 0xe0, 0xc5, 0xf2, 0x87, 0xac, 0x40, - 0xe1, 0x04, 0x6c, 0xe9, 0x55, 0xea, 0xe3, 0x33, 0xa9, 0x73, 0x06, 0x78, - 0x36, 0xd7, 0x65, 0xcf, 0xd3, 0x1d, 0xb1, 0x45, 0x4b, 0xce, 0x72, 0x21, - 0x07, 0x41, 0x3a, 0xd6, 0x9c, 0x16, 0x0e, 0xc4, 0x30, 0x84, 0x74, 0x18, - 0x52, 0xeb, 0x63, 0xa2, 0x63, 0xb2, 0x9a, 0x39, 0x73, 0x30, 0x14, 0x36, - 0x6a, 0x8a, 0xae, 0x3e, 0x95, 0x03, 0x31, 0x54, 0xac, 0x4c, 0xeb, 0xbe, - 0x91, 0x19, 0x61, 0x7d, 0xd6, 0xb6, 0xfc, 0xc1, 0x92, 0x26, 0xdb, 0x78, - 0x59, 0xfc, 0x3b, 0x0f, 0x40, 0xda, 0x89, 0x17, 0x58, 0x5e, 0x25, 0x41, - 0x20, 0xfc, 0x3c, 0x72, 0xd8, 0xbd, 0x52, 0x50, 0xe5, 0x51, 0xf8, 0x2d, - 0x12, 0x77, 0xe9, 0xd2, 0xd4, 0xd2, 0x91, 0xdf, 0xac, 0xd4, 0x68, 0xba, - 0x7b, 0x95, 0x33, 0xff, 0x31, 0x4d, 0x58, 0xf0, 0xf3, 0x8e, 0x8f, 0xe0, - 0x20, 0xad, 0x26, 0x8f, 0xa6, 0x23, 0x2f, 0xbb, 0xe8, 0xc9, 0x5b, 0xc0, - 0xcc, 0xe1, 0x89, 0x8a, 0xfc, 0x95, 0x24, 0x1d, 0xe4, 0xe6, 0x2c, 0xc4, - 0xdd, 0xce, 0xe6, 0x6f, 0x00, 0xbf, 0xdc, 0x4c, 0x38, 0x2b, 0xc8, 0x37, - 0xb0, 0xa7, 0x53, 0x56, 0x37, 0x14, 0x91, 0x67, 0xde, 0x09, 0x1b, 0x52, - 0x64, 0xce, 0xc0, 0x93, 0x04, 0x89, 0x19, 0xb5, 0x98, 0xbc, 0x85, 0x45, - 0x5c, 0x63, 0xff, 0x98, 0xb8, 0xd4, 0x37, 0x4a, 0x5c, 0xa1, 0x69, 0x6b, - 0xd8, 0xd6, 0xae, 0xc6, 0x95, 0x86, 0x6d, 0x0d, 0xbe, 0x7b, 0xb0, 0x21, - 0x2d, 0x77, 0x94, 0x10, 0x14, 0x33, 0xc4, 0x9d, 0x1c, 0xfd, 0x9b, 0x21, - 0x1e, 0x56, 0xa1, 0xca, 0x16, 0xd0, 0x01, 0x4a, 0xeb, 0x6a, 0x84, 0x3b, - 0x88, 0x55, 0x56, 0x9b, 0xb8, 0x0b, 0xb5, 0x60, 0xce, 0xe0, 0xc1, 0xea, - 0x7f, 0x78, 0x7c, 0xa5, 0x3d, 0x35, 0xaa, 0xe6, 0xc5, 0x38, 0x74, 0x8d, - 0xcc, 0xa8, 0x9d, 0x80, 0xe7, 0x4b, 0xb7, 0x11, 0xd0, 0x20, 0x36, 0x34, - 0x2d, 0x7c, 0x1b, 0x9f, 0x90, 0xc8, 0x11, 0x5d, 0x35, 0xca, 0x41, 0x19, - 0x67, 0x1c, 0x1d, 0x37, 0xaf, 0x26, 0x87, 0x4c, 0xd2, 0x13, 0x66, 0xe0, - 0x55, 0xed, 0x94, 0xff, 0x4e, 0x8c, 0x54, 0x17, 0xe8, 0xa7, 0x8e, 0x34, - 0xa1, 0xed, 0xf4, 0xca, 0x38, 0x53, 0xce, 0xbe, 0xd4, 0x54, 0xfe, 0xae, - 0x83, 0xb5, 0x32, 0x44, 0x49, 0xfa, 0xd5, 0x1f, 0xc5, 0x05, 0x6c, 0xeb, - 0x9f, 0x47, 0x47, 0xc0, 0x56, 0x1e, 0xf7, 0x89, 0xe5, 0x5f, 0xe0, 0x1a, - 0xae, 0x4d, 0xd6, 0x89, 0xac, 0xdc, 0x1a, 0x07, 0xe1, 0x74, 0xf6, 0x47, - 0x51, 0xa0, 0x0f, 0xe7, 0x61, 0xf4, 0x41, 0xde, 0xf8, 0x7e, 0x42, 0xbe, - 0x5f, 0xfd, 0x1b, 0x74, 0x02, 0x6a, 0xe2, 0xf1, 0x81, 0x94, 0x37, 0x1e, - 0xa7, 0x93, 0x0b, 0xf1, 0xa8, 0xd5, 0x59, 0xd3, 0x69, 0x65, 0x7d, 0xec, - 0x28, 0xb4, 0x4e, 0x7b, 0xd6, 0x08, 0x2d, 0xce, 0x2f, 0xcd, 0xca, 0x89, - 0xe9, 0x72, 0x65, 0x18, 0x4a, 0x88, 0x1f, 0x8a, 0x2d, 0xfd, 0x9e, 0x5c, - 0xe0, 0xc0, 0x74, 0x85, 0x27, 0xb4, 0xee, 0x09, 0xd5, 0xb3, 0xd5, 0xd0, - 0x3b, 0xd8, 0x16, 0xe1, 0x04, 0xb3, 0x31, 0x01, 0x7c, 0x16, 0xc0, 0x28, - 0xd1, 0x45, 0xda, 0xfb, 0xf4, 0xdf, 0xb0, 0x90, 0x24, 0x0f, 0xfc, 0xba, - 0x04, 0xf3, 0x51, 0x27, 0xec, 0xbd, 0x42, 0x2a, 0xb6, 0x0d, 0x45, 0xfe, - 0xab, 0x16, 0x36, 0x59, 0xa4, 0xe1, 0x28, 0xbe, 0xa2, 0xf5, 0xb7, 0xc2, - 0xaa, 0x66, 0x96, 0x07, 0xeb, 0x43, 0xf9, 0x60, 0xd9, 0xdb, 0x4d, 0x1d, - 0x6a, 0x6f, 0xe4, 0x3a, 0x02, 0x5e, 0x68, 0x40, 0xb2, 0x18, 0x35, 0xd8, - 0x15, 0xf2, 0x91, 0x02, 0x2c, 0xbb, 0x9a, 0x5b, 0xff, 0xc8, 0xd9, 0x4f, - 0x88, 0xd6, 0x0d, 0x2d, 0x6b, 0x8f, 0xc7, 0xe9, 0x18, 0x8b, 0x86, 0x5c, - 0xf4, 0xcb, 0xcc, 0xbf, 0xe2, 0xcb, 0x79, 0xf6, 0x8f, 0x56, 0x1d, 0x83, - 0x66, 0x5d, 0xb8, 0x02, 0xd7, 0x9f, 0x48, 0x31, 0x38, 0xb2, 0x27, 0x35, - 0xb1, 0xf4, 0x43, 0x1d, 0x88, 0x22, 0xab, 0x1f, 0x08, 0x20, 0xb3, 0xd2, - 0xbd, 0xf3, 0x14, 0x22, 0x42, 0x58, 0xe1, 0xdc, 0x3d, 0x53, 0x82, 0xbd, - 0x07, 0xb1, 0xbd, 0xb5, 0x76, 0x07, 0xa2, 0xac, 0xf6, 0xda, 0xf5, 0x31, - 0xbd, 0x8b, 0x40, 0x4b, 0xdf, 0xee, 0xb2, 0x0c, 0xfc, 0x2b, 0xd8, 0x4e, - 0xd5, 0x5a, 0x02, 0xa8, 0xaf, 0xe0, 0xf6, 0x34, 0x48, 0x6d, 0xaf, 0x8d, - 0x54, 0x51, 0x5b, 0xf9, 0x6d, 0x40, 0x30, 0xa7, 0xc5, 0x64, 0x5a, 0xb5, - 0xa3, 0xc6, 0x20, 0x3f, 0x94, 0xca, 0x8b, 0xa0, 0xa0, 0xb7, 0x33, 0x0b, - 0x80, 0x67, 0x8f, 0xca, 0x6d, 0xd5, 0xa0, 0x1c, 0xf1, 0xdb, 0x60, 0x2a, - 0xa0, 0x28, 0x2d, 0xa3, 0x77, 0xa1, 0xca, 0xf4, 0x30, 0x8e, 0xde, 0x16, - 0x79, 0xdd, 0xa1, 0x81, 0x99, 0xd2, 0x78, 0x2d, 0xa4, 0x8a, 0x89, 0xa3, - 0xe7, 0x7f, 0x8b, 0x94, 0xe9, 0xe4, 0x6a, 0x0c, 0x1e, 0x18, 0x94, 0x9e, - 0x31, 0xdd, 0x75, 0xf7, 0x92, 0x86, 0x6d, 0x77, 0x96, 0x35, 0x2e, 0x1f, - 0x58, 0xa6, 0xef, 0x38, 0xbe, 0x1c, 0x4c, 0x95, 0xfd, 0x7e, 0x91, 0x90, - 0x97, 0xbb, 0xee, 0xa6, 0xab, 0x3f, 0x9c, 0x96, 0x1b, 0x6e, 0x48, 0x90, - 0xeb, 0x90, 0xac, 0xb8, 0x49, 0xe4, 0x08, 0x88, 0x91, 0x2a, 0x60, 0xf9, - 0xd4, 0x36, 0x05, 0x1e, 0xe3, 0x50, 0x2c, 0x3d, 0x5e, 0xe0, 0xbc, 0xa4, - 0xad, 0xf9, 0xdc, 0x4f, 0x8a, 0xd8, 0x87, 0x6e, 0x43, 0x32, 0x05, 0xac, - 0x95, 0x54, 0x98, 0x00, 0x30, 0x03, 0xbe, 0xff, 0xa9, 0x59, 0x30, 0x14, - 0xfd, 0x73, 0xa6, 0x65, 0x40, 0xd1, 0x0e, 0xfc, 0x5b, 0xb0, 0x24, 0xcf, - 0x37, 0x76, 0x4c, 0xb6, 0xad, 0xd3, 0xd5, 0xbf, 0x70, 0x37, 0xfb, 0x4a, - 0x09, 0xe3, 0xc0, 0x7e, 0xf8, 0xb2, 0xc5, 0xbd, 0x4c, 0x10, 0x8e, 0x4a, - 0xc2, 0xa7, 0x6d, 0x7c, 0x22, 0x96, 0xb1, 0xc1, 0xe3, 0xf1, 0x9e, 0x7e, - 0x4b, 0xd7, 0xb2, 0x07, 0xb2, 0xb8, 0xac, 0x93, 0x59, 0x37, 0xf7, 0x6d, - 0x33, 0xa2, 0x9d, 0xb7, 0xb9, 0x07, 0x7b, 0x97, 0x0a, 0xd6, 0x97, 0xaa, - 0xec, 0x58, 0xb3, 0x93, 0x10, 0x99, 0x7e, 0x45, 0x4a, 0xf3, 0x0b, 0x23, - 0x23, 0xd1, 0x40, 0x1e, 0xac, 0xdc, 0x45, 0x08, 0x16, 0x0b, 0xfc, 0x94, - 0xf8, 0x11, 0x3d, 0xd7, 0xf3, 0xbf, 0x32, 0x38, 0x73, 0x3e, 0x2d, 0xc1, - 0xbe, 0xe6, 0xfa, 0x10, 0xee, 0xc8, 0xf9, 0xaf, 0x5e, 0xcb, 0x8c, 0x62, - 0x0c, 0xf7, 0x5d, 0x2d, 0xf7, 0x31, 0xca, 0xcb, 0x57, 0xd2, 0xc8, 0xd9, - 0xbf, 0x82, 0xb7, 0x32, 0x16, 0xb9, 0x48, 0x80, 0x17, 0x93, 0xc9, 0x16, - 0xe6, 0x10, 0x1d, 0x26, 0x86, 0xc1, 0x2f, 0xb9, 0x6d, 0xb4, 0x6a, 0x7c, - 0x24, 0xc5, 0x07, 0xf7, 0x40, 0x5e, 0xe4, 0xc1, 0xda, 0xb1, 0xcd, 0xcb, - 0xe5, 0x6f, 0x57, 0x0a, 0x11, 0x9c, 0xfb, 0x62, 0xaa, 0x2a, 0xb3, 0xee, - 0x22, 0x15, 0x10, 0x9a, 0xea, 0x9b, 0x54, 0x25, 0xa0, 0x60, 0xdf, 0x4a, - 0x2e, 0x35, 0x15, 0x02, 0x5d, 0x1c, 0x61, 0x4f, 0xaa, 0xd4, 0x47, 0x7c, - 0x0a, 0xcc, 0xb4, 0x6f, 0x5d, 0xd9, 0x86, 0x75, 0x29, 0x4b, 0xfe, 0x1e, - 0xa9, 0x14, 0xfd, 0x55, 0x9e, 0x2c, 0xa2, 0x77, 0xb7, 0xef, 0x58, 0x6d, - 0x7c, 0xce, 0x89, 0xe8, 0xd2, 0x28, 0xdb, 0xef, 0x2e, 0x8c, 0x3c, 0xca, - 0xe6, 0x66, 0x17, 0xf8, 0x3f, 0x14, 0x41, 0x99, 0x9b, 0x00, 0x84, 0x1f, - 0x8f, 0x02, 0x75, 0x5d, 0x90, 0x41, 0x3e, 0x81, 0xbf, 0xa0, 0x0c, 0x66, - 0xdb, 0x44, 0xc6, 0x4e, 0x62, 0x29, 0x9c, 0x70, 0x3c, 0xa9, 0xda, 0x1b, - 0xee, 0xd1, 0xab, 0x5d, 0xb1, 0x5f, 0x84, 0xc5, 0x19, 0x4a, 0xdf, 0x74, - 0xbc, 0xc1, 0xf4, 0x9d, 0x54, 0x5a, 0x34, 0x41, 0xc8, 0x93, 0xe5, 0xc7, - 0x05, 0xe3, 0x83, 0xb7, 0x24, 0x26, 0x6b, 0xaf, 0x77, 0x03, 0xcb, 0x1b, - 0xe0, 0x2d, 0xdc, 0x1c, 0xd9, 0xac, 0xe1, 0xe8, 0x55, 0x3a, 0x53, 0x23, - 0x13, 0xc7, 0x1f, 0xd2, 0x4d, 0xc2, 0x9c, 0xc9, 0x9a, 0xc8, 0x3e, 0xfa, - 0x29, 0xdc, 0xb1, 0xba, 0x9e, 0x7c, 0xef, 0x7d, 0x3c, 0x83, 0x67, 0xff, - 0xf0, 0x73, 0xa5, 0x36, 0xb2, 0xe5, 0x24, 0x8b, 0xe2, 0xe4, 0x1b, 0xf4, - 0xb9, 0xee, 0x11, 0xe7, 0xe6, 0xf3, 0x04, 0x7e, 0x5b, 0x28, 0xdd, 0x19, - 0x4b, 0x8b, 0x03, 0x88, 0xe6, 0x02, 0x42, 0x00, 0xdd, 0xa8, 0xfd, 0x45, - 0xbe, 0x3f, 0x9c, 0x21, 0x60, 0x84, 0x55, 0x61, 0x29, 0x85, 0xca, 0x6b, - 0x3a, 0x09, 0x47, 0x11, 0xbe, 0xa4, 0x31, 0x91, 0xb7, 0x46, 0xc2, 0xc9, - 0xdb, 0x0d, 0x3e, 0x7a, 0x5c, 0xeb, 0xc7, 0x0f, 0xc0, 0x9f, 0xf2, 0xef, - 0xb2, 0x16, 0x09, 0x80, 0xf8, 0xef, 0xbd, 0x10, 0x4c, 0x89, 0x46, 0x8b, - 0x5b, 0x12, 0xcc, 0x77, 0x5d, 0xd8, 0x29, 0xc9, 0xea, 0x99, 0xf6, 0x35, - 0x39, 0x20, 0x0a, 0xe9, 0x94, 0x8c, 0x68, 0xb6, 0x69, 0x32, 0x64, 0xe2, - 0x39, 0xbe, 0x57, 0xb8, 0xf7, 0xe0, 0xb0, 0xa6, 0xef, 0xf7, 0xac, 0x00, - 0xc8, 0xbc, 0xc4, 0x7d, 0x71, 0x42, 0x8f, 0x40, 0xca, 0xf9, 0xea, 0x50, - 0xd7, 0xee, 0x90, 0xaa, 0x2d, 0x20, 0x2a, 0x11, 0x5c, 0x74, 0xa4, 0x09, - 0xde, 0x09, 0xee, 0xb8, 0x66, 0x01, 0x86, 0x32, 0xf4, 0x51, 0x36, 0x28, - 0x69, 0x0a, 0x2f, 0x9d, 0x10, 0xcc, 0x42, 0x33, 0x56, 0xc3, 0x8c, 0x91, - 0x12, 0x3d, 0x09, 0x25, 0x4d, 0x25, 0xc5, 0x68, 0x51, 0x7d, 0x6e, 0x95, - 0x43, 0xbc, 0x19, 0x10, 0x14, 0x23, 0x26, 0x5e, 0x1e, 0x01, 0x6e, 0xb2, - 0x03, 0x5e, 0x52, 0x69, 0xa6, 0xc1, 0xa1, 0xaf, 0x7c, 0x92, 0x44, 0x26, - 0x1c, 0x70, 0x84, 0x64, 0x74, 0x47, 0xd2, 0x29, 0x12, 0x06, 0xb2, 0x43, - 0x95, 0x60, 0x29, 0x74, 0x3a, 0x93, 0x7a, 0xa0, 0x03, 0xf0, 0x37, 0x2f, - 0x93, 0x01, 0xd4, 0xf0, 0xa7, 0xb9, 0xa6, 0x8b, 0x6e, 0x8c, 0x55, 0x79, - 0xd2, 0x0a, 0xba, 0xb4, 0x2d, 0x2b, 0x63, 0xfe, 0xf4, 0xeb, 0x79, 0x0e, - 0xac, 0x7f, 0xbe, 0x17, 0x62, 0xc9, 0xd0, 0x7a, 0x4b, 0x9b, 0x1f, 0x44, - 0x10, 0x17, 0x9d, 0x2a, 0xc6, 0x95, 0xf0, 0x8d, 0x88, 0x25, 0x8a, 0x24, - 0xdf, 0xb7, 0x8c, 0xb1, 0x68, 0x62, 0x5c, 0xf0, 0x25, 0xc3, 0x01, 0x3d, - 0xa7, 0xfe, 0x83, 0x62, 0x8c, 0xf3, 0xbf, 0x59, 0x50, 0x2f, 0x64, 0xbc, - 0x5f, 0xe0, 0x4d, 0xc0, 0xf1, 0x06, 0x13, 0x63, 0xbc, 0x1d, 0x7d, 0x57, - 0x92, 0x5a, 0x0d, 0x7a, 0xc6, 0xa7, 0x25, 0x3e, 0x79, 0x98, 0x2e, 0x68, - 0xfa, 0xbc, 0xf2, 0xa0, 0x6f, 0xe4, 0x4e, 0xbc, 0xae, 0x3f, 0xef, 0x34, - 0x00, 0x3c, 0x87, 0xb5, 0x13, 0x12, 0x22, 0xef, 0xad, 0x0e, 0x6e, 0xb2, - 0x42, 0x81, 0xd1, 0x8f, 0x04, 0x92, 0xc3, 0x73, 0xc2, 0x3e, 0x7d, 0xc3, - 0x9e, 0x28, 0x27, 0xe6, 0x9e, 0xc9, 0x61, 0x16, 0x1b, 0x42, 0xe2, 0xdc, - 0x01, 0x18, 0xf8, 0x20, 0x08, 0xb0, 0xf7, 0x65, 0x6e, 0xdd, 0x9f, 0x5b, - 0xd0, 0x63, 0x98, 0x9b, 0x0c, 0x41, 0xe9, 0x33, 0xf7, 0xd7, 0xef, 0x5b, - 0x3a, 0xfb, 0x8a, 0x6b, 0x6c, 0x15, 0xf0, 0xe0, 0x07, 0x75, 0x58, 0xb9, - 0xf5, 0x30, 0xb5, 0xa3, 0x45, 0x3d, 0x0a, 0x60, 0x22, 0x97, 0x4b, 0x3c, - 0xa4, 0x04, 0xae, 0xe5, 0x0b, 0xa8, 0x56, 0xbf, 0x66, 0x62, 0xdb, 0x9b, - 0x59, 0xfa, 0xe1, 0xc0, 0x89, 0x02, 0xa3, 0x65, 0xd7, 0x83, 0x54, 0xbf, - 0x65, 0x85, 0xea, 0xcb, 0xb0, 0xc7, 0x2d, 0x36, 0xac, 0x06, 0x65, 0xe5, - 0xcd, 0x49, 0xc6, 0x0f, 0xa6, 0x35, 0x8f, 0xa7, 0x46, 0x6b, 0x60, 0x39, - 0xc5, 0x21, 0xbc, 0x22, 0xcd, 0x16, 0x2d, 0xc8, 0x55, 0x7c, 0xa8, 0x36, - 0xaf, 0x63, 0xb1, 0xec, 0xad, 0x44, 0xaa, 0x2f, 0x5c, 0xb0, 0x78, 0x7f, - 0xdf, 0xec, 0x23, 0x23, 0x9e, 0x65, 0x48, 0x90, 0x28, 0x3e, 0x26, 0x78, - 0x0d, 0x08, 0xd8, 0x21, 0x2c, 0x9c, 0x58, 0x94, 0xd3, 0xfc, 0x2b, 0x24, - 0x6e, 0xb4, 0x39, 0x3a, 0x60, 0xc9, 0x51, 0xdb, 0x10, 0x3f, 0x06, 0xff, - 0xd7, 0x07, 0x13, 0xad, 0x18, 0xf5, 0x83, 0x03, 0x49, 0x5d, 0x07, 0x98, - 0xde, 0x78, 0xc8, 0x28, 0x18, 0x5c, 0xa5, 0x3f, 0x43, 0x4e, 0x99, 0xfb, - 0x30, 0x82, 0xba, 0x95, 0x58, 0xd7, 0xfc, 0x79, 0x90, 0x9a, 0x6d, 0xf0, - 0x3d, 0xc7, 0xa4, 0x57, 0x74, 0x29, 0xfe, 0x6e, 0xb1, 0x0e, 0x51, 0x4f, - 0x3e, 0xfd, 0xb1, 0x48, 0xa6, 0x24, 0xb8, 0xbd, 0x45, 0xcf, 0xe9, 0xbc, - 0xa9, 0x99, 0x12, 0x7f, 0xc7, 0xf7, 0xd4, 0xf3, 0x91, 0x36, 0x1f, 0x24, - 0x29, 0x32, 0xf8, 0x8a, 0x2e, 0xf5, 0xe6, 0x71, 0x42, 0x64, 0x3a, 0xf3, - 0x8d, 0xd5, 0xb2, 0x4f, 0x55, 0xc4, 0xe8, 0xa4, 0x70, 0x5e, 0x0f, 0x58, - 0xb9, 0x12, 0xa1, 0x2f, 0xe1, 0x0c, 0x99, 0xac, 0x99, 0x5c, 0x0c, 0xa3, - 0x5c, 0x25, 0x3e, 0xa5, 0x09, 0x76, 0x04, 0x26, 0xcc, 0x1c, 0x68, 0xf6, - 0x32, 0xaf, 0xbc, 0x23, 0x82, 0x0b, 0xd1, 0x84, 0xa9, 0xc6, 0x35, 0xe8, - 0x63, 0xbf, 0x11, 0x06, 0xb2, 0xf1, 0x8e, 0x57, 0x30, 0xd4, 0xd6, 0x9f, - 0x9d, 0xe9, 0xf5, 0x50, 0xf8, 0xc3, 0x5e, 0xec, 0xa6, 0x0a, 0xa9, 0x32, - 0x10, 0xbb, 0x16, 0xe0, 0x65, 0x58, 0x9d, 0xee, 0xea, 0x1d, 0xd8, 0x38, - 0x65, 0xa3, 0xe5, 0x03, 0x9e, 0x9e, 0xb2, 0xaf, 0x22, 0x27, 0xfe, 0x67, - 0x3a, 0xde, 0xea, 0xf2, 0x18, 0x8e, 0x7c, 0x7a, 0xdd, 0x40, 0x95, 0x7e, - 0x77, 0x16, 0x5b, 0xb4, 0x51, 0x6e, 0x7a, 0x0c, 0xa2, 0x17, 0xba, 0x58, - 0x6f, 0xa3, 0xb5, 0xc0, 0x0b, 0x58, 0x0f, 0x11, 0x76, 0xe5, 0x97, 0xb2, - 0xdc, 0x35, 0xe1, 0x36, 0xc0, 0xf2, 0x88, 0xff, 0xc7, 0xcb, 0x9f, 0x83, - 0xa1, 0x8e, 0xdc, 0x9a, 0xf0, 0x70, 0x51, 0x66, 0x63, 0xe1, 0x73, 0x88, - 0x08, 0x84, 0x12, 0xef, 0x6c, 0xef, 0x8d, 0x9a, 0xc3, 0xf3, 0xd9, 0x4a, - 0x5a, 0x94, 0x53, 0xfd, 0x56, 0xba, 0xe4, 0xe9, 0x5d, 0x73, 0x7f, 0x0d, - 0x96, 0xf0, 0xe1, 0x4a, 0x8c, 0x0f, 0xea, 0x8f, 0xdb, 0xc6, 0x59, 0xe7, - 0xc5, 0x62, 0xe9, 0xfc, 0x84, 0xe4, 0x3b, 0x99, 0x0f, 0xbd, 0xd4, 0xe4, - 0xec, 0x3a, 0xa2, 0x81, 0x50, 0xe9, 0xa7, 0xf3, 0x9f, 0xe9, 0xf9, 0x8a, - 0xd1, 0x5a, 0xb8, 0xd5, 0x47, 0x18, 0xdf, 0x3b, 0xaa, 0x9d, 0x33, 0xe0, - 0x00, 0x5c, 0x95, 0x91, 0x88, 0xca, 0xa7, 0xb3, 0x7b, 0xba, 0x8b, 0xd0, - 0x76, 0x59, 0x89, 0xfb, 0x7a, 0x34, 0x08, 0x9a, 0xaf, 0x9a, 0xfc, 0xdb, - 0x1f, 0xe5, 0xcf, 0xf5, 0xc5, 0xcd, 0xcc, 0x4b, 0x78, 0x39, 0xf0, 0x2f, - 0x1e, 0x5e, 0x0e, 0xa0, 0x7d, 0xc6, 0x15, 0xa6, 0xf4, 0xed, 0xb2, 0x34, - 0x42, 0x7f, 0xff, 0x83, 0x33, 0x33, 0x7e, 0xbe, 0x7f, 0x57, 0x3f, 0x3d, - 0x8b, 0x38, 0xbb, 0xfe, 0x7f, 0x2d, 0x92, 0x7b, 0x5b, 0x3e, 0x12, 0x4e, - 0xe7, 0xf0, 0x55, 0x92, 0x2d, 0x2a, 0x39, 0xb9, 0x71, 0x9d, 0xca, 0xa9, - 0x05, 0xc1, 0xb7, 0x32, 0x3a, 0x83, 0xff, 0x89, 0xdf, 0xd0, 0x13, 0x95, - 0xa1, 0x9a, 0xb3, 0x42, 0xe8, 0x8b, 0xaa, 0xcc, 0xa3, 0x47, 0xc1, 0x1c, - 0xb2, 0xed, 0xde, 0x7b, 0x67, 0xab, 0x4c, 0xa6, 0x90, 0x61, 0xeb, 0xd3, - 0x24, 0xef, 0xc8, 0x89, 0xc7, 0xd3, 0x9a, 0x97, 0x27, 0x2d, 0x86, 0xb2, - 0x7e, 0xb9, 0x1f, 0x41, 0xd6, 0x25, 0x7e, 0x39, 0xf2, 0x90, 0xaa, 0x41, - 0x9c, 0x3e, 0xb0, 0xdb, 0x75, 0xcb, 0x94, 0x0a, 0x1b, 0x2b, 0xcd, 0xc7, - 0x11, 0x47, 0xb8, 0xf7, 0x87, 0xf5, 0xb1, 0x16, 0xe9, 0xba, 0x50, 0x67, - 0x52, 0x12, 0x29, 0x27, 0x9f, 0x4d, 0x1c, 0xbb, 0xa3, 0x2c, 0xab, 0x63, - 0x08, 0xd1, 0x38, 0xdc, 0x89, 0x7f, 0x4a, 0x68, 0x9b, 0x70, 0xa4, 0x98, - 0x0a, 0x3a, 0xf8, 0xfe, 0xad, 0x4c, 0x8d, 0x3b, 0x77, 0xa7, 0x9a, 0x43, - 0x1f, 0x72, 0xc0, 0xb0, 0xa8, 0x7c, 0x3d, 0x5f, 0xec, 0xac, 0x19, 0x04, - 0x42, 0x6a, 0xdf, 0x62, 0x6a, 0x33, 0x02, 0x44, 0x45, 0xf5, 0xdf, 0x84, - 0x89, 0x9f, 0x94, 0x1e, 0xc1, 0x87, 0x20, 0x01, 0xfb, 0xc0, 0x53, 0xb5, - 0x3c, 0x90, 0x91, 0xb7, 0xf6, 0xff, 0x47, 0x6d, 0x10, 0xcd, 0xba, 0x94, - 0x66, 0x84, 0xbd, 0xbc, 0x78, 0x27, 0x81, 0xd4, 0x99, 0xbd, 0xf5, 0xea, - 0xf7, 0x68, 0x08, 0x06, 0xfe, 0xde, 0xf0, 0xa6, 0x82, 0x75, 0x8b, 0x79, - 0x9c, 0x10, 0xb2, 0xf2, 0xa5, 0xa1, 0x9f, 0xef, 0x26, 0x0f, 0x0d, 0x15, - 0x12, 0x96, 0xa0, 0x0a, 0x36, 0xc9, 0x97, 0xfa, 0x09, 0x08, 0x3f, 0x9e, - 0x85, 0x21, 0x89, 0xb7, 0xec, 0xc5, 0x28, 0xce, 0x72, 0xfb, 0x0f, 0xeb, - 0xca, 0xfc, 0x88, 0xa1, 0x0f, 0xfd, 0xb0, 0xd2, 0x6f, 0x32, 0xbc, 0x06, - 0x27, 0xc3, 0xce, 0x0d, 0x55, 0xea, 0xc4, 0x56, 0xbc, 0xac, 0x2d, 0x2a, - 0xda, 0x97, 0x76, 0x73, 0x68, 0x7f, 0xd2, 0xb0, 0xbc, 0xa6, 0xc4, 0xad, - 0xb0, 0xad, 0x66, 0xb6, 0xc4, 0x21, 0x71, 0x9b, 0xa2, 0xde, 0xa8, 0x0e, - 0x8d, 0xa6, 0xc5, 0x4a, 0xa5, 0xce, 0xd0, 0x3b, 0xa3, 0xdf, 0x0f, 0xb8, - 0x0b, 0x50, 0x53, 0x53, 0xba, 0x27, 0xd9, 0xc2, 0xd6, 0x1f, 0xd5, 0xd3, - 0x4f, 0x0d, 0x72, 0x5f, 0x9f, 0xdf, 0x8f, 0x98, 0x1a, 0xfc, 0xdf, 0x89, - 0xd6, 0x25, 0xff, 0x56, 0x5b, 0xe0, 0xe4, 0x8e, 0xa4, 0x16, 0x77, 0x7a, - 0xe5, 0x01, 0x94, 0x23, 0xb5, 0xb5, 0xf0, 0x05, 0xf5, 0x0d, 0x87, 0x0f, - 0x9b, 0x4e, 0x5e, 0x3a, 0x1b, 0x83, 0xd2, 0x85, 0xb5, 0xbe, 0x17, 0xf9, - 0xd9, 0x67, 0x00, 0x72, 0x1c, 0x2b, 0xf7, 0xa9, 0x27, 0x2b, 0xf3, 0x18, - 0x70, 0x9a, 0x7d, 0x5a, 0x36, 0x42, 0x6d, 0x16, 0x59, 0x58, 0x3f, 0x1a, - 0x65, 0xeb, 0x16, 0x59, 0xfb, 0xc0, 0xb7, 0x9c, 0xb6, 0x83, 0xd2, 0x2e, - 0xe2, 0x99, 0x8d, 0xd3, 0xd1, 0xfd, 0x55, 0x9f, 0x0c, 0x42, 0x02, 0x9c, - 0x6c, 0x28, 0x51, 0xcf, 0xe2, 0x0a, 0x19, 0x18, 0x3d, 0xf1, 0x32, 0x41, - 0x9d, 0xf1, 0x9e, 0x25, 0xa3, 0x63, 0xc0, 0x50, 0xb0, 0x62, 0x86, 0x1e, - 0x6b, 0xe4, 0x33, 0xe0, 0x16, 0xbd, 0x59, 0xea, 0x32, 0x47, 0x56, 0xf3, - 0x33, 0xd3, 0x4b, 0xb9, 0xf0, 0x1c, 0xbf, 0xdc, 0x47, 0x5c, 0xfa, 0x20, - 0x8a, 0xda, 0x6b, 0x2b, 0x45, 0xdb, 0x36, 0xfa, 0x25, 0x7e, 0xa4, 0x17, - 0x55, 0x7b, 0x60, 0x36, 0x43, 0x57, 0x99, 0x18, 0x1e, 0xfe, 0xdd, 0x98, - 0xcc, 0xf1, 0xf9, 0x53, 0xbb, 0xf8, 0x81, 0x94, 0xcc, 0xa5, 0x1b, 0xd2, - 0x95, 0x6c, 0x25, 0x1d, 0x76, 0x96, 0x83, 0x6a, 0xc8, 0x58, 0x1f, 0x5f, - 0x70, 0x12, 0xaa, 0x4c, 0x09, 0x19, 0xb3, 0xbc, 0x93, 0xcc, 0x9e, 0x8b, - 0x53, 0xab, 0xcd, 0x1f, 0x8d, 0x22, 0xfa, 0x75, 0xb3, 0x77, 0x1b, 0x0c, - 0x37, 0xa8, 0x8d, 0xc5, 0x22, 0x17, 0x49, 0x5c, 0xdf, 0xf2, 0x94, 0x34, - 0x7f, 0x64, 0x94, 0x05, 0x91, 0x5a, 0x16, 0x2c, 0x57, 0xeb, 0x1c, 0x1d, - 0xf8, 0xe4, 0x3a, 0x37, 0x91, 0x5e, 0x84, 0x40, 0x99, 0x1e, 0x22, 0x53, - 0x44, 0xfb, 0x08, 0xce, 0x1c, 0x53, 0xbc, 0xaf, 0x95, 0xef, 0xa8, 0x4a, - 0x40, 0x52, 0xd6, 0xdc, 0xa5, 0xb6, 0x8c, 0xe6, 0xa5, 0x51, 0xcd, 0xa8, - 0xd4, 0x9f, 0x1a, 0x69, 0x2c, 0x38, 0x8f, 0xdf, 0xb0, 0x1e, 0xc9, 0x33, - 0x6a, 0xc3, 0x33, 0x22, 0x0c, 0x75, 0x47, 0xe3, 0x75, 0xba, 0x63, 0xde, - 0x3e, 0x65, 0xf0, 0x4d, 0x6c, 0x00, 0xe7, 0x03, 0x0d, 0x3d, 0x14, 0xcf, - 0xd9, 0x8a, 0xd2, 0x80, 0xcb, 0x01, 0xc9, 0x0a, 0x71, 0x0c, 0xe5, 0xbe, - 0x76, 0xe2, 0xe1, 0xac, 0x2c, 0x1f, 0xf5, 0x92, 0x12, 0xbb, 0xb3, 0x18, - 0x93, 0xdc, 0x63, 0xf0, 0xbc, 0xd5, 0x10, 0x03, 0xc7, 0x39, 0x45, 0x3b, - 0xa1, 0xfb, 0xe8, 0xcc, 0x46, 0xbf, 0x82, 0xa8, 0x77, 0x98, 0xd9, 0x1a, - 0x73, 0xc0, 0x61, 0x80, 0xf1, 0x88, 0x9e, 0xa9, 0x39, 0xa9, 0xd9, 0x85, - 0x61, 0x7e, 0x50, 0xb8, 0x57, 0x2e, 0xb1, 0x73, 0x58, 0xd4, 0xa8, 0x82, - 0x29, 0xc8, 0x5f, 0x8d, 0x97, 0xd5, 0xc2, 0xd7, 0x71, 0xe0, 0xd3, 0x7a, - 0x05, 0x07, 0x22, 0xb1, 0xeb, 0x2c, 0xea, 0x47, 0xdb, 0x55, 0x3e, 0x1b, - 0x4a, 0x42, 0x26, 0xd3, 0x22, 0xea, 0x48, 0x65, 0xaa, 0x53, 0xb9, 0xfa, - 0xd1, 0xa3, 0x4f, 0xb8, 0x0a, 0x23, 0x66, 0x7b, 0x71, 0xfc, 0x1a, 0x5a, - 0x31, 0xfb, 0xc7, 0x35, 0xd4, 0x3f, 0xd7, 0x8a, 0x54, 0xab, 0xee, 0x89, - 0x4b, 0xb8, 0xc8, 0x1c, 0xaa, 0x09, 0x46, 0x2c, 0xad, 0xc3, 0x9e, 0xde, - 0x8f, 0x40, 0xe4, 0xa4, 0x96, 0xe3, 0x51, 0x97, 0xe8, 0x68, 0x5d, 0x13, - 0x49, 0x7f, 0x6f, 0x55, 0x37, 0x65, 0xba, 0xb8, 0x39, 0xbb, 0x3c, 0x2f, - 0x7e, 0x06, 0x9d, 0x18, 0x46, 0xba, 0x1c, 0x09, 0x15, 0x55, 0x36, 0x45, - 0x95, 0xc4, 0x91, 0xcc, 0x86, 0xeb, 0xda, 0x14, 0xc0, 0x99, 0x96, 0xd0, - 0x99, 0xb2, 0x4c, 0xb0, 0x90, 0x82, 0x18, 0x5f, 0xe1, 0x49, 0x77, 0xe4, - 0x24, 0xcf, 0x1e, 0xcd, 0xd3, 0xa8, 0x54, 0x52, 0x6f, 0xe0, 0x58, 0x67, - 0xf3, 0xaf, 0xe1, 0x23, 0x7a, 0xb4, 0xa6, 0x60, 0x3e, 0xb5, 0xe2, 0x42, - 0x54, 0x36, 0xae, 0x1e, 0xc7, 0x01, 0x3e, 0x24, 0xa8, 0x94, 0x92, 0x9a, - 0x71, 0x49, 0x53, 0xb8, 0xa2, 0x8a, 0x03, 0x5e, 0x86, 0x67, 0xa1, 0x9a, - 0x73, 0x87, 0x0c, 0xb0, 0x04, 0xdb, 0x79, 0x46, 0x5d, 0xcd, 0xe0, 0x3f, - 0x7e, 0xd1, 0x8f, 0x6c, 0x3a, 0xd6, 0xc2, 0x07, 0x60, 0x2d, 0x32, 0xe2, - 0xda, 0x58, 0x50, 0xee, 0x3d, 0xce, 0x70, 0xfe, 0xaa, 0x04, 0xcb, 0xde, - 0x46, 0xd9, 0x9c, 0xb2, 0xc7, 0x31, 0xb3, 0xdb, 0x67, 0x1d, 0x23, 0x69, - 0x81, 0x4e, 0x14, 0x65, 0x82, 0xe9, 0x65, 0xd2, 0xaf, 0xa3, 0x57, 0xfe, - 0xa4, 0xb3, 0x81, 0xac, 0xc3, 0x30, 0x3b, 0x95, 0xd8, 0x66, 0x48, 0xae, - 0xd4, 0xff, 0xe8, 0x46, 0x4b, 0x54, 0x03, 0x8c, 0x7b, 0xb5, 0xa6, 0xa3, - 0x1b, 0x3b, 0xc1, 0x0c, 0x91, 0x1b, 0xbf, 0x17, 0x42, 0xfa, 0xb1, 0x3e, - 0xa9, 0x16, 0xe8, 0x72, 0x07, 0x72, 0x58, 0x86, 0x3c, 0x60, 0xea, 0xb4, - 0x27, 0xfe, 0xaa, 0x3d, 0x0d, 0xb5, 0xb9, 0x1f, 0x71, 0x63, 0x48, 0xde, - 0xd9, 0x11, 0xa0, 0x08, 0x71, 0xa8, 0xaa, 0x0c, 0x58, 0x7c, 0x45, 0x08, - 0x28, 0x0b, 0xd5, 0xd6, 0x89, 0xeb, 0xd4, 0xcd, 0xee, 0x7f, 0xb8, 0x0c, - 0x11, 0xc6, 0xcc, 0x26, 0x9e, 0x61, 0x80, 0xcc, 0x8d, 0xd0, 0x62, 0x7a, - 0x23, 0xdf, 0x8c, 0x93, 0xf7, 0x7b, 0x7f, 0x4f, 0x17, 0x27, 0x94, 0x0e, - 0xaa, 0x40, 0x0d, 0x80, 0xf4, 0x41, 0x14, 0xcc, 0x69, 0xa9, 0xd5, 0xe4, - 0x78, 0x99, 0xc8, 0x73, 0x7b, 0x2c, 0x45, 0x7c, 0x35, 0x39, 0xe1, 0xf1, - 0x97, 0x9e, 0x63, 0xc3, 0x86, 0x57, 0xd1, 0xac, 0xec, 0xbc, 0xc9, 0x58, - 0xd4, 0xd6, 0xa0, 0xd3, 0x01, 0xee, 0x60, 0x01, 0x6a, 0xa9, 0x5b, 0xe9, - 0x08, 0x18, 0x5c, 0x2e, 0x72, 0x61, 0x80, 0xf7, 0x33, 0x0b, 0x35, 0x7a, - 0xcc, 0x98, 0xdc, 0x84, 0xf8, 0x78, 0x2b, 0x52, 0x4e, 0x4c, 0xcc, 0xfa, - 0xf1, 0x4e, 0x5b, 0x8b, 0xdd, 0x7c, 0x1e, 0x1d, 0x3b, 0xf3, 0xce, 0x8d, - 0xa5, 0x36, 0x77, 0x8d, 0x24, 0xe9, 0x24, 0x33, 0x21, 0x20, 0x57, 0xbf, - 0xcf, 0xf3, 0x0d, 0x69, 0x52, 0xe3, 0x88, 0x65, 0x9d, 0x66, 0xae, 0x7a, - 0x43, 0x90, 0x37, 0x8b, 0xe1, 0xe7, 0x39, 0x3d, 0x0a, 0x23, 0x1c, 0xee, - 0x3f, 0x66, 0xe5, 0xaf, 0x51, 0x83, 0x2f, 0xbd, 0x37, 0x69, 0xed, 0x15, - 0xc9, 0x07, 0x00, 0x2f, 0x9c, 0xcf, 0x99, 0xfa, 0xfe, 0x4e, 0x41, 0x58, - 0x0c, 0xfd, 0x7b, 0x80, 0xd6, 0x00, 0x7b, 0x5e, 0x1d, 0x87, 0x87, 0x54, - 0xa3, 0x61, 0xb1, 0xb0, 0x23, 0x91, 0x2b, 0x3a, 0x07, 0x41, 0x4d, 0x4b, - 0x7f, 0xbd, 0x8e, 0x6c, 0xa6, 0x46, 0x46, 0x1c, 0xbf, 0xc1, 0x87, 0x74, - 0x9d, 0x1c, 0xca, 0x32, 0x3e, 0x6a, 0x0f, 0xa6, 0xc4, 0x63, 0x38, 0x0d, - 0x30, 0xde, 0x82, 0x77, 0xc7, 0xbc, 0xc1, 0x08, 0xb7, 0x95, 0xf7, 0xfb, - 0x21, 0x00, 0xb2, 0xb9, 0xa1, 0x8c, 0x19, 0xa7, 0x9f, 0x83, 0xba, 0x1c, - 0xe0, 0x2e, 0x09, 0x2d, 0x75, 0xbe, 0x5d, 0x2d, 0xe6, 0x63, 0xd2, 0x7f, - 0xa8, 0xf6, 0x50, 0xa2, 0xe8, 0x74, 0x10, 0xd9, 0x3a, 0x53, 0xf7, 0xce, - 0xf4, 0xaf, 0xab, 0x11, 0xd6, 0x71, 0xd6, 0x61, 0x17, 0xf8, 0xc4, 0x45, - 0x34, 0xf7, 0x00, 0x9a, 0x73, 0xa6, 0x3f, 0x7a, 0x05, 0x06, 0x80, 0x3f, - 0xa5, 0x63, 0x7c, 0xec, 0x12, 0x8b, 0x1e, 0xc3, 0xa2, 0xa1, 0x87, 0x5c, - 0x7d, 0xed, 0x99, 0x19, 0x84, 0xd8, 0xf8, 0x20, 0x55, 0xf6, 0x72, 0x70, - 0x55, 0xb8, 0x2d, 0xdb, 0x8f, 0x15, 0x80, 0x5b, 0x03, 0x2e, 0x0b, 0xac, - 0x7e, 0xdc, 0x4f, 0xdd, 0xb2, 0x48, 0xb5, 0xc3, 0x11, 0x40, 0x8d, 0x19, - 0x1a, 0xfe, 0x76, 0x10, 0xb8, 0xd5, 0xf8, 0x99, 0x2a, 0x54, 0x9d, 0x33, - 0x68, 0xe5, 0xf2, 0x74, 0x2d, 0x09, 0xe1, 0x43, 0x5b, 0x21, 0xfc, 0x8f, - 0x33, 0x4b, 0xfa, 0x40, 0xf8, 0x62, 0xbf, 0x5a, 0xa3, 0x64, 0xf3, 0x48, - 0x4e, 0x79, 0x96, 0x38, 0xf6, 0x74, 0x44, 0xb0, 0x1b, 0x4a, 0xed, 0x6a, - 0xec, 0xb4, 0x2c, 0xde, 0x20, 0x22, 0x28, 0xd4, 0x1e, 0x96, 0x63, 0x86, - 0x23, 0xe6, 0x66, 0x13, 0xbd, 0x0f, 0xfe, 0x36, 0xe8, 0x3a, 0x01, 0x88, - 0x50, 0x30, 0x46, 0x45, 0xa6, 0xed, 0x95, 0xbf, 0x47, 0xe8, 0x7c, 0xbe, - 0x39, 0x2e, 0x95, 0x91, 0x30, 0x1b, 0xc8, 0x9b, 0xce, 0x4c, 0xb0, 0x08, - 0x7b, 0xf4, 0x5e, 0xa1, 0xad, 0x8e, 0x25, 0x96, 0x3e, 0x52, 0x29, 0x5c, - 0xe6, 0xaa, 0x24, 0xf9, 0xef, 0x0a, 0xf3, 0xa6, 0xb1, 0xcf, 0xe4, 0x7a, - 0x27, 0x92, 0x11, 0xd3, 0x40, 0xd9, 0x4c, 0x40, 0xe9, 0x1b, 0x3e, 0x8b, - 0x74, 0xab, 0x6b, 0x7a, 0x86, 0x29, 0x5c, 0x4f, 0xc2, 0xd4, 0x8e, 0xee, - 0xd0, 0x83, 0x6b, 0x71, 0x5c, 0x0d, 0x95, 0x27, 0x09, 0x4c, 0xaa, 0x69, - 0x38, 0x63, 0xd9, 0x14, 0x39, 0x13, 0x1b, 0x4b, 0x56, 0x91, 0x00, 0xd7, - 0xe4, 0x7d, 0x4a, 0xf2, 0x40, 0x7a, 0x46, 0xd2, 0x5a, 0xde, 0x62, 0xc9, - 0x79, 0x24, 0x97, 0x91, 0xc1, 0x51, 0xac, 0x03, 0xe5, 0x5f, 0xd5, 0xd6, - 0xb1, 0xf2, 0x2e, 0xc9, 0x9e, 0xb1, 0x16, 0x18, 0xa5, 0x72, 0xb5, 0xa2, - 0xf1, 0x9f, 0xbf, 0xc0, 0x2b, 0x00, 0x9d, 0x1c, 0x3e, 0x2d, 0x3e, 0x7c, - 0x1c, 0xb0, 0xeb, 0x6f, 0x1b, 0x91, 0x5c, 0x52, 0x56, 0x4a, 0x5f, 0xee, - 0x98, 0x8b, 0x11, 0xfb, 0x6d, 0x7a, 0xa9, 0x84, 0x2d, 0xcb, 0x7f, 0x74, - 0xc3, 0xe7, 0xce, 0xc4, 0x6b, 0x17, 0xd2, 0xb8, 0x9e, 0x4b, 0xdb, 0xee, - 0x94, 0x58, 0x74, 0x90, 0xbc, 0x62, 0xb1, 0xe4, 0xa4, 0xa7, 0x65, 0x80, - 0xcd, 0x30, 0xb6, 0xc3, 0x2c, 0xc5, 0x30, 0xb0, 0x97, 0x39, 0x3a, 0x07, - 0x53, 0x1f, 0x7b, 0xac, 0x0a, 0x8e, 0x5b, 0x4f, 0x31, 0x38, 0xde, 0x6d, - 0x9d, 0xbe, 0x9a, 0x8d, 0x37, 0x2d, 0xcb, 0x99, 0x9d, 0xac, 0x6e, 0xeb, - 0xd7, 0x7d, 0x33, 0x09, 0xc1, 0xd8, 0xe5, 0x01, 0x4c, 0xb1, 0x18, 0x68, - 0x54, 0xbe, 0x95, 0x78, 0x76, 0x7c, 0xf3, 0xc7, 0x40, 0x6d, 0xf3, 0x73, - 0x5b, 0xbb, 0x14, 0xde, 0xf8, 0xd7, 0x7f, 0x41, 0xea, 0xc2, 0x61, 0x54, - 0x63, 0xec, 0x2c, 0x4b, 0x9a, 0x47, 0xd4, 0xea, 0xe4, 0xcf, 0xf8, 0xf9, - 0xe3, 0x6e, 0x0f, 0x54, 0x0a, 0x9c, 0x3f, 0xe7, 0xb0, 0xa7, 0x99, 0xf6, - 0x67, 0xaf, 0x47, 0x1e, 0x49, 0xf0, 0x9c, 0x2d, 0x90, 0xa6, 0x5f, 0xf7, - 0xbe, 0x02, 0x51, 0xab, 0x07, 0x43, 0x48, 0xd1, 0xdc, 0xf9, 0x80, 0x9d, - 0xfa, 0xdf, 0x90, 0x5e, 0xf3, 0xc9, 0xff, 0x77, 0x9a, 0x3d, 0xf9, 0x11, - 0x0f, 0x52, 0x0d, 0x6a, 0x18, 0x17, 0x25, 0x5c, 0x61, 0x34, 0x30, 0xfd, - 0x2e, 0xac, 0xfc, 0xdd, 0xd0, 0x17, 0x8a, 0x44, 0x0a, 0xf7, 0x4e, 0x2e, - 0x3b, 0xdd, 0xaf, 0x66, 0x05, 0x37, 0x90, 0x0c, 0xa1, 0xd8, 0x06, 0xfb, - 0x8e, 0x2d, 0x94, 0x2d, 0x4c, 0xdd, 0x31, 0x72, 0x5c, 0xe4, 0x22, 0xe5, - 0x14, 0x6f, 0x93, 0xa3, 0x21, 0x37, 0xa2, 0x9d, 0xef, 0x92, 0xac, 0x6f, - 0x82, 0x52, 0x3d, 0x0d, 0x2b, 0x3f, 0x37, 0xf6, 0x7f, 0x41, 0x9e, 0xdd, - 0x93, 0xde, 0x89, 0x4c, 0x7d, 0x70, 0x6a, 0xde, 0xe1, 0x78, 0xa1, 0x9a, - 0x69, 0x28, 0x1c, 0xd3, 0xca, 0x13, 0x6a, 0x1f, 0x8b, 0x7a, 0x3e, 0x83, - 0xb8, 0xd0, 0xbd, 0x0b, 0x2d, 0x9e, 0xf8, 0x7e, 0x8a, 0x97, 0x79, 0x0e, - 0x28, 0x7d, 0xd6, 0x9d, 0xdd, 0x16, 0x6a, 0xa8, 0xc5, 0x68, 0x02, 0xd6, - 0x39, 0xd7, 0x48, 0xa8, 0x1a, 0x81, 0xf4, 0xcb, 0x3b, 0x32, 0xc4, 0x96, - 0xc6, 0x4d, 0x1a, 0x8d, 0x04, 0xea, 0xc2, 0xc5, 0xb8, 0x23, 0x32, 0xf0, - 0x59, 0x50, 0x99, 0x76, 0x48, 0x92, 0xeb, 0x30, 0x63, 0xa0, 0xa6, 0xe9, - 0xcb, 0x4a, 0x85, 0x49, 0x52, 0xf2, 0x09, 0x4a, 0x99, 0x31, 0x89, 0x7d, - 0x16, 0xb6, 0xeb, 0xb7, 0xb1, 0x96, 0xaa, 0x36, 0x42, 0xb9, 0x2c, 0x82, - 0x2d, 0x7a, 0xa0, 0x75, 0x46, 0x10, 0x5d, 0xd3, 0x5a, 0x32, 0x7d, 0x07, - 0xcd, 0x6f, 0xe7, 0xef, 0xc8, 0x74, 0x96, 0xc5, 0x84, 0xe4, 0x3b, 0x06, - 0xc2, 0xfd, 0xbc, 0x8e, 0x66, 0x37, 0x28, 0xfe, 0xf1, 0xdc, 0x07, 0x37, - 0x57, 0xd3, 0x08, 0x7c, 0xd2, 0x9f, 0x3c, 0x49, 0x7f, 0xfa, 0xf7, 0xce, - 0xe7, 0x2a, 0x88, 0xb6, 0xc9, 0x1a, 0x9c, 0x62, 0x42, 0x37, 0x93, 0x55, - 0xa0, 0x08, 0x65, 0x28, 0xad, 0xdd, 0x10, 0xa4, 0x23, 0x2b, 0xc8, 0x85, - 0xea, 0x32, 0x37, 0x67, 0x82, 0x37, 0x3c, 0x57, 0x13, 0xa2, 0xd3, 0x26, - 0xf9, 0x2c, 0xc7, 0xe0, 0x28, 0x14, 0x9e, 0x5d, 0x02, 0x24, 0x6a, 0x9c, - 0x6b, 0x89, 0xa6, 0x7c, 0x38, 0xb4, 0x3d, 0x6f, 0x27, 0xd3, 0x25, 0xfd, - 0xf9, 0x30, 0xa9, 0xe8, 0x46, 0xc6, 0xf0, 0xf7, 0x6f, 0x53, 0x57, 0x46, - 0x1d, 0x57, 0x1d, 0x96, 0xa9, 0xdc, 0xfd, 0x2e, 0x39, 0x0a, 0xda, 0x71, - 0xf3, 0x6e, 0x4c, 0x18, 0xc5, 0x75, 0xcb, 0x61, 0x66, 0xc6, 0xde, 0xa3, - 0x6d, 0x99, 0x44, 0xf6, 0xf3, 0x14, 0x6e, 0x90, 0x85, 0xef, 0x32, 0x81, - 0x39, 0x0e, 0xdb, 0xd3, 0xff, 0xc3, 0xbf, 0x2b, 0x53, 0xa5, 0xfa, 0xa3, - 0x77, 0xc3, 0x44, 0x96, 0xdb, 0xf5, 0x06, 0x37, 0xe4, 0x62, 0x3f, 0xaa, - 0xe1, 0x59, 0x75, 0x82, 0xef, 0x0d, 0x72, 0x47, 0x28, 0x73, 0x21, 0x15, - 0x07, 0xe6, 0x14, 0x8f, 0xdb, 0x84, 0x96, 0x9a, 0x54, 0x7a, 0x1d, 0xee, - 0x75, 0x14, 0x22, 0xab, 0xad, 0x37, 0xaf, 0x36, 0x2e, 0x24, 0xf6, 0xd8, - 0x29, 0x94, 0xb8, 0x5b, 0x9a, 0xce, 0xe8, 0xa7, 0xbf, 0xd8, 0x85, 0x8c, - 0x9f, 0x75, 0x99, 0x99, 0x10, 0xde, 0xa2, 0x31, 0x4c, 0x90, 0x16, 0xde, - 0xbc, 0x9b, 0x93, 0xf5, 0x85, 0xd2, 0xfa, 0xba, 0x0a, 0x28, 0xf2, 0x3b, - 0xca, 0x12, 0xc2, 0x9e, 0x2e, 0xa9, 0x81, 0x81, 0xd0, 0x2a, 0xf1, 0xf7, - 0x2b, 0xa0, 0xbb, 0xe3, 0x1f, 0x31, 0x5d, 0xe3, 0xc1, 0x4b, 0xc9, 0x5c, - 0x59, 0x47, 0x38, 0x1d, 0xda, 0x6a, 0x44, 0xc3, 0x08, 0x89, 0x35, 0xda, - 0xd1, 0x88, 0x42, 0xa4, 0x0f, 0xbd, 0x80, 0xd1, 0x95, 0x42, 0x65, 0xfa, - 0xd7, 0x81, 0x08, 0x9e, 0xd1, 0xd5, 0x15, 0x52, 0x57, 0x5b, 0x3b, 0x9e, - 0xa6, 0x20, 0x14, 0x1a, 0x81, 0x0c, 0x66, 0x22, 0x1c, 0x7e, 0x44, 0x9a, - 0xb7, 0xb2, 0xc2, 0x55, 0x75, 0x97, 0xe8, 0x40, 0x98, 0xfb, 0x50, 0x6c, - 0x8d, 0x24, 0xd3, 0x3c, 0x75, 0xce, 0x8a, 0x03, 0xb6, 0x68, 0x20, 0x9d, - 0xe5, 0x91, 0xe0, 0xaf, 0xc9, 0xc8, 0x7d, 0x6f, 0x3f, 0x69, 0xb2, 0x88, - 0x83, 0xcc, 0xfb, 0x5c, 0x62, 0xcd, 0x9d, 0x12, 0x63, 0xa6, 0xb4, 0x43, - 0x2f, 0xd7, 0x27, 0x28, 0x4e, 0x6b, 0xde, 0x45, 0xe6, 0xe1, 0xae, 0x83, - 0x59, 0x8c, 0x68, 0x56, 0x4c, 0x91, 0xa6, 0x44, 0xe7, 0xeb, 0xf1, 0x9e, - 0xbe, 0xd3, 0x89, 0x50, 0x67, 0x35, 0x3c, 0x3e, 0x3d, 0x94, 0xb9, 0xd1, - 0xb2, 0x84, 0x03, 0xb2, 0x7b, 0xa7, 0x83, 0x5e, 0x96, 0x96, 0xdf, 0x90, - 0x5b, 0x6a, 0x4a, 0x75, 0x05, 0xab, 0x31, 0xcf, 0x45, 0xfa, 0x88, 0xc7, - 0x6c, 0x02, 0x96, 0xbe, 0xdc, 0x59, 0xdc, 0xf5, 0x05, 0x25, 0x4f, 0x8b, - 0x3a, 0x79, 0xfd, 0x8f, 0xbf, 0x9b, 0xdd, 0x4a, 0x2a, 0x39, 0x87, 0x54, - 0xc8, 0x03, 0x40, 0xea, 0xb9, 0x38, 0x56, 0x8d, 0x5f, 0x4f, 0xe5, 0x29, - 0x35, 0xb1, 0xc0, 0x80, 0x77, 0x4e, 0xe9, 0x6a, 0xba, 0x86, 0xdd, 0xb5, - 0x7a, 0x6f, 0x64, 0xd5, 0xf0, 0x66, 0x65, 0xbf, 0xbf, 0xdf, 0x22, 0x49, - 0xb7, 0xa7, 0xd3, 0xab, 0xb6, 0x76, 0xec, 0xe9, 0xc9, 0xb9, 0xca, 0x9f, - 0x6a, 0xb4, 0xd7, 0xdf, 0xb3, 0x84, 0x21, 0x31, 0x17, 0xe9, 0x40, 0x79, - 0x1a, 0x65, 0x76, 0x64, 0xb6, 0x73, 0x3c, 0x76, 0x47, 0x00, 0xf5, 0x21, - 0x76, 0x6e, 0x20, 0xc4, 0x52, 0x9d, 0x2e, 0x03, 0x60, 0xe2, 0xb5, 0x16, - 0xa3, 0xd8, 0x9b, 0x1f, 0x4f, 0xfa, 0x24, 0x0b, 0xdc, 0xe7, 0x89, 0x24, - 0x2c, 0xb0, 0xe9, 0x30, 0x45, 0x5a, 0x27, 0x7b, 0x6d, 0x5b, 0x0f, 0xf5, - 0xa2, 0xa6, 0xe5, 0x7c, 0x49, 0x1b, 0xa6, 0xcb, 0xdd, 0x15, 0x95, 0xa1, - 0xb9, 0x7b, 0x1d, 0x70, 0xef, 0xd9, 0xe3, 0x26, 0x51, 0x03, 0xc0, 0xda, - 0x6c, 0x6c, 0xbf, 0x29, 0xc7, 0x7f, 0xc4, 0x58, 0xa8, 0x26, 0x9c, 0x67, - 0x80, 0x1c, 0xc2, 0x06, 0xab, 0x78, 0x41, 0xbb, 0x0a, 0x51, 0x49, 0x54, - 0x75, 0xf3, 0xd6, 0x22, 0xb1, 0x22, 0xd4, 0x2b, 0x0d, 0xf3, 0x19, 0x0c, - 0xfc, 0x54, 0x4d, 0x75, 0xe5, 0xfa, 0x3b, 0x97, 0x61, 0x65, 0x46, 0x07, - 0x27, 0x4e, 0x29, 0x76, 0x3d, 0x97, 0x33, 0x2d, 0x12, 0xee, 0x03, 0x90, - 0x52, 0x73, 0x67, 0x96, 0x9d, 0x5f, 0x1f, 0x95, 0x07, 0x04, 0xc2, 0xb0, - 0x7a, 0x30, 0x2e, 0x63, 0x7e, 0x57, 0x92, 0xfc, 0xc0, 0xbb, 0x4e, 0x33, - 0x7d, 0x49, 0xfb, 0x15, 0x7a, 0x3f, 0x8a, 0x56, 0xac, 0x55, 0xbe, 0x39, - 0xf2, 0xd6, 0x68, 0xe7, 0xf2, 0xff, 0x70, 0xf5, 0x86, 0xb7, 0x32, 0x1e, - 0x55, 0x87, 0x1c, 0xd6, 0x8f, 0x77, 0x8b, 0x99, 0xb9, 0x46, 0xbd, 0xde, - 0xfe, 0x81, 0x28, 0xde, 0x68, 0x7c, 0x46, 0xb1, 0x1f, 0xd4, 0xfb, 0x24, - 0xc6, 0x5c, 0xc0, 0x7f, 0x1d, 0x0e, 0xf0, 0x09, 0x4e, 0xd8, 0x9b, 0x0d, - 0x27, 0xec, 0xe8, 0x97, 0x3a, 0xe2, 0xaa, 0x77, 0x44, 0xa9, 0xd0, 0xad, - 0x4f, 0x0f, 0x09, 0xff, 0x83, 0x1c, 0x87, 0x86, 0xbe, 0x9e, 0x95, 0x8d, - 0x60, 0xf1, 0x9e, 0xf6, 0xea, 0x8c, 0x23, 0x16, 0x20, 0x86, 0x46, 0xd0, - 0x7c, 0xbe, 0xa5, 0xea, 0xe6, 0x63, 0x75, 0x4a, 0x32, 0x5f, 0x94, 0x9f, - 0x8f, 0x42, 0xb0, 0xd9, 0xb9, 0xce, 0x92, 0x9b, 0x59, 0x8d, 0x41, 0x89, - 0x51, 0x5c, 0x0d, 0x9d, 0xac, 0x81, 0x49, 0x60, 0xdf, 0xd5, 0x0d, 0x69, - 0x69, 0x5c, 0x62, 0x3f, 0xd0, 0xce, 0x5a, 0xbb, 0x70, 0x5f, 0x7d, 0x9d, - 0xd9, 0xad, 0x26, 0x1c, 0xce, 0x0d, 0x7d, 0x42, 0x6d, 0x1f, 0x36, 0x10, - 0xc7, 0x5a, 0x24, 0xf1, 0xf4, 0x00, 0xea, 0xfb, 0x09, 0x69, 0x26, 0x76, - 0x55, 0x3b, 0x39, 0x00, 0x90, 0x2c, 0x45, 0x83, 0xb7, 0xd0, 0x50, 0xc2, - 0x6a, 0x6d, 0x7a, 0x1b, 0x9b, 0xfc, 0x62, 0x06, 0x26, 0x39, 0x35, 0x93, - 0x12, 0xf2, 0x36, 0xbe, 0x64, 0xd9, 0x90, 0x3b, 0x01, 0xfa, 0xa6, 0x26, - 0x00, 0x85, 0xa1, 0xac, 0xeb, 0xec, 0x43, 0x14, 0x90, 0xd5, 0x71, 0xf4, - 0x09, 0xee, 0x84, 0x0e, 0x03, 0x8e, 0x44, 0x96, 0x49, 0xd3, 0x00, 0x80, - 0xb1, 0x8d, 0x16, 0x02, 0xb8, 0xce, 0x56, 0x76, 0x66, 0xe8, 0x06, 0xec, - 0x14, 0x1b, 0x12, 0x11, 0x61, 0x0f, 0xf9, 0x13, 0x6f, 0x10, 0x6d, 0xe9, - 0x5f, 0x0d, 0xe0, 0x39, 0x88, 0xe5, 0xf7, 0x0c, 0x5f, 0xa3, 0x19, 0x6a, - 0x1d, 0xb6, 0x4b, 0x5f, 0xc8, 0x74, 0x0e, 0x20, 0x70, 0x4f, 0x41, 0xd6, - 0x03, 0xe2, 0x3a, 0xa0, 0x58, 0x4b, 0x91, 0x6c, 0xb4, 0x56, 0xcd, 0xe5, - 0x7c, 0x8b, 0x72, 0x60, 0x76, 0x99, 0xbe, 0x26, 0x34, 0x70, 0x4f, 0x85, - 0x1b, 0x24, 0xd8, 0x93, 0x56, 0x4d, 0xe2, 0x05, 0xa6, 0x31, 0x0f, 0x40, - 0x23, 0x4f, 0x1f, 0xa3, 0xca, 0xde, 0xb0, 0x18, 0xbd, 0x01, 0xcf, 0x19, - 0x5a, 0x76, 0x9d, 0x55, 0x32, 0x18, 0x08, 0x0c, 0x0a, 0x9b, 0xda, 0xac, - 0x32, 0x80, 0x17, 0x7e, 0x18, 0xb4, 0xca, 0xd7, 0x80, 0xb1, 0x7f, 0x67, - 0x86, 0xb0, 0xba, 0x7b, 0xe2, 0xe8, 0xee, 0x93, 0x4b, 0x2b, 0xb1, 0xe5, - 0x82, 0x95, 0x16, 0xe6, 0x27, 0x7f, 0xa3, 0xca, 0x91, 0x57, 0xb4, 0x5b, - 0x4f, 0x33, 0x14, 0xba, 0x8e, 0x7b, 0xb4, 0x02, 0x92, 0x0a, 0x0b, 0x6c, - 0xd3, 0x54, 0xcc, 0x27, 0x7c, 0xd9, 0x53, 0x1a, 0xac, 0xa1, 0xef, 0x00, - 0x8f, 0xa3, 0x01, 0x54, 0xf3, 0xc3, 0x9c, 0xa0, 0x1f, 0x7a, 0x61, 0xf1, - 0x44, 0xad, 0x86, 0xb6, 0x31, 0xfe, 0xc7, 0x10, 0x6c, 0x93, 0x74, 0xe7, - 0x60, 0xc0, 0x5a, 0x0d, 0x00, 0xe5, 0x1c, 0xd7, 0x01, 0xd0, 0x65, 0x66, - 0xce, 0xc9, 0xa0, 0x48, 0xa6, 0x45, 0x85, 0xe3, 0x42, 0xf3, 0x40, 0x85, - 0x0b, 0x86, 0x4f, 0x2f, 0x64, 0xac, 0x1a, 0x3c, 0x05, 0xc8, 0x58, 0x4a, - 0x2e, 0xe2, 0x15, 0xc2, 0xe0, 0x6e, 0x00, 0xa9, 0x73, 0x63, 0xba, 0x0a, - 0x17, 0xa2, 0xfe, 0x3c, 0x50, 0x84, 0x44, 0x9b, 0x7e, 0xa4, 0xa9, 0x08, - 0xcc, 0x24, 0xd4, 0x57, 0x27, 0x67, 0x2d, 0xbd, 0x64, 0x94, 0x28, 0x27, - 0x1c, 0xa9, 0xa9, 0xab, 0x0c, 0xbd, 0xb3, 0x48, 0x9e, 0xd0, 0x6f, 0xa6, - 0x37, 0x25, 0xb5, 0x85, 0x26, 0xc6, 0xf3, 0xf1, 0x3c, 0xe5, 0xf1, 0xa3, - 0x6e, 0xac, 0x91, 0x7f, 0xba, 0xac, 0xef, 0x97, 0x40, 0x5a, 0x5f, 0xcb, - 0x2c, 0x07, 0x4b, 0x35, 0x82, 0xf5, 0xea, 0x9b, 0x6b, 0x6d, 0x8a, 0x33, - 0x3a, 0xb2, 0x37, 0xe1, 0x57, 0x09, 0x27, 0xc2, 0x94, 0x14, 0xa4, 0x8d, - 0xde, 0x2b, 0xcb, 0xd7, 0x9b, 0x8e, 0x3d, 0xb2, 0x88, 0x3e, 0xa7, 0x93, - 0xba, 0x7f, 0x7f, 0x18, 0x28, 0x72, 0x82, 0x48, 0x5f, 0x88, 0x41, 0x8e, - 0x24, 0x60, 0x97, 0xbd, 0x0d, 0xba, 0xe9, 0x5d, 0xb6, 0x61, 0x50, 0xb2, - 0x62, 0x56, 0xea, 0x2e, 0x2d, 0xc6, 0xa5, 0xda, 0x94, 0xd8, 0x8d, 0x5a, - 0xbd, 0x3e, 0x0a, 0x3d, 0x65, 0x95, 0x85, 0x85, 0xb3, 0xd9, 0x12, 0x91, - 0x1a, 0xce, 0xdb, 0x39, 0xbd, 0xaa, 0x6c, 0xc8, 0x08, 0xb3, 0xa6, 0x95, - 0x51, 0x17, 0x91, 0xa7, 0xe7, 0xd1, 0xb6, 0xec, 0x61, 0x08, 0xc5, 0x4e, - 0x96, 0x41, 0x93, 0xed, 0xf9, 0x51, 0xb3, 0xde, 0x87, 0x58, 0x11, 0xb1, - 0x3e, 0x5a, 0x61, 0x81, 0x00, 0x05, 0x0a, 0xd9, 0x1b, 0xbe, 0xaa, 0x1d, - 0x69, 0x78, 0x7d, 0x47, 0x98, 0xca, 0x60, 0x57, 0x7c, 0x41, 0x54, 0x49, - 0xfb, 0xad, 0x6b, 0x94, 0x7b, 0x09, 0xf6, 0x8d, 0x3f, 0x24, 0xa3, 0x8b, - 0x1c, 0xd5, 0x85, 0xbc, 0x43, 0x50, 0xeb, 0xe4, 0x84, 0x72, 0x50, 0x85, - 0x1a, 0xf3, 0x56, 0x46, 0x01, 0xd1, 0xf0, 0xe2, 0xfc, 0x66, 0x2c, 0x55, - 0x1b, 0x7c, 0x97, 0xe0, 0x49, 0xbe, 0xb2, 0x45, 0xce, 0xfe, 0xf6, 0xf0, - 0x41, 0xbe, 0xdd, 0x63, 0x9c, 0x6d, 0xe4, 0x0a, 0x40, 0x04, 0xcb, 0xb6, - 0x85, 0xcd, 0x97, 0x4e, 0xe2, 0x98, 0x4c, 0x4c, 0xe5, 0x2c, 0x29, 0x41, - 0xb2, 0x79, 0x86, 0xa1, 0x75, 0x94, 0xe5, 0x0a, 0x2b, 0x17, 0xb7, 0xa8, - 0xe5, 0x7c, 0xac, 0x57, 0xd6, 0x12, 0xde, 0x0c, 0x41, 0x4f, 0x35, 0x63, - 0x49, 0xa8, 0xd5, 0x0e, 0xa7, 0x86, 0x5e, 0x85, 0x96, 0x7b, 0x34, 0x07, - 0x3c, 0xd0, 0x44, 0xa3, 0x85, 0x85, 0xe5, 0x7f, 0x0b, 0x56, 0x5b, 0x2a, - 0x28, 0xd3, 0x00, 0x33, 0xe4, 0xef, 0xb9, 0x37, 0xac, 0x68, 0xea, 0x95, - 0xe0, 0x8c, 0x97, 0xe7, 0x17, 0xf2, 0x4f, 0x9f, 0x6d, 0x8a, 0x0c, 0xfd, - 0x84, 0x17, 0xc8, 0x46, 0x86, 0xe0, 0x0d, 0x89, 0x7a, 0xa7, 0xca, 0x68, - 0x53, 0x77, 0xb3, 0x75, 0xb0, 0xc6, 0x9b, 0x8f, 0xf7, 0x3a, 0xdc, 0xee, - 0x17, 0x14, 0x58, 0x87, 0xc0, 0x87, 0xba, 0x95, 0x6c, 0xef, 0x81, 0xb2, - 0x11, 0xe8, 0xf7, 0x1b, 0x4f, 0x77, 0x21, 0xfe, 0x10, 0x69, 0x2a, 0x3c, - 0x9b, 0xc1, 0x9b, 0xa0, 0x6b, 0xe6, 0x47, 0x83, 0x28, 0xe7, 0x5d, 0xff, - 0xa3, 0x56, 0xac, 0x14, 0x47, 0x42, 0x43, 0x3f, 0x89, 0xa6, 0x5a, 0xde, - 0x0e, 0x2b, 0x7c, 0x89, 0xcf, 0x72, 0x25, 0x6b, 0x1b, 0xfc, 0x02, 0x91, - 0x55, 0xc8, 0x84, 0x68, 0xd7, 0x93, 0xec, 0xc5, 0xc0, 0x5d, 0x92, 0x2c, - 0xc0, 0xbd, 0xcd, 0xcf, 0x48, 0x0a, 0x09, 0x41, 0x60, 0x25, 0x4c, 0x8e, - 0x23, 0xc1, 0xbf, 0x68, 0x37, 0xe4, 0x3b, 0xcd, 0x0d, 0x78, 0xef, 0x77, - 0xba, 0x2c, 0xc9, 0xe7, 0xfb, 0xc6, 0x15, 0x5d, 0x83, 0x62, 0x75, 0xc1, - 0xca, 0x1e, 0xf4, 0x96, 0x02, 0xb6, 0x24, 0xc0, 0x97, 0xb3, 0x00, 0x0e, - 0x8d, 0x8f, 0x5d, 0xc4, 0x3f, 0x29, 0xec, 0x5e, 0x55, 0x39, 0xf2, 0x07, - 0x9d, 0xea, 0x57, 0x2b, 0xa4, 0x27, 0x68, 0x7f, 0x42, 0x47, 0x13, 0xbf, - 0x64, 0x5c, 0xfb, 0x84, 0xb6, 0x6d, 0xb9, 0xa0, 0x59, 0x9d, 0x03, 0x19, - 0xe9, 0xaa, 0x5f, 0x12, 0x6f, 0xca, 0x45, 0x56, 0x38, 0x6b, 0x9d, 0x6b, - 0xda, 0xcf, 0x33, 0xbb, 0x49, 0xad, 0x94, 0x9c, 0xab, 0x8e, 0x45, 0x97, - 0x3d, 0x0b, 0x51, 0x37, 0xd2, 0xed, 0x98, 0xc0, 0xbb, 0xaf, 0x22, 0x19, - 0x0f, 0x80, 0xb5, 0xf5, 0x93, 0xa2, 0xd0, 0x6b, 0xb3, 0x32, 0xd0, 0xd6, - 0xea, 0x2c, 0xe3, 0x36, 0x4c, 0xc5, 0x3f, 0x12, 0x66, 0x6c, 0x72, 0x57, - 0x98, 0x20, 0xc9, 0x23, 0x83, 0xfa, 0xe9, 0xea, 0xf6, 0xc4, 0xfc, 0x07, - 0x53, 0x01, 0x6f, 0x01, 0x26, 0xb3, 0xa4, 0x86, 0x3f, 0x14, 0xab, 0x2b, - 0xd5, 0xd9, 0x0e, 0x8f, 0xff, 0xf0, 0x8a, 0xdb, 0xd4, 0x6c, 0x47, 0x54, - 0x76, 0x59, 0x73, 0x1e, 0xc8, 0xd0, 0x8a, 0xa3, 0xbf, 0x4d, 0x92, 0x85, - 0x15, 0x50, 0x69, 0xeb, 0x22, 0xd1, 0x98, 0x3d, 0x05, 0xb2, 0x38, 0x87, - 0x9e, 0x75, 0xfd, 0x3b, 0xce, 0x66, 0x09, 0x49, 0x6a, 0xb0, 0xdf, 0xe3, - 0x4d, 0x41, 0x97, 0xe4, 0xe8, 0x02, 0x68, 0x29, 0x45, 0x9e, 0x4a, 0x7b, - 0x21, 0x5f, 0xbc, 0x3c, 0xdd, 0x59, 0x4f, 0x7c, 0xdc, 0xff, 0x91, 0x85, - 0x14, 0x37, 0xf9, 0xd4, 0xf8, 0x0e, 0xfc, 0x61, 0x93, 0x69, 0xa6, 0xfa, - 0x12, 0x8a, 0x97, 0x1d, 0x48, 0x52, 0xbf, 0xf0, 0x85, 0xe9, 0xe1, 0x52, - 0x69, 0xed, 0xf7, 0x2c, 0x76, 0x01, 0xfe, 0xdf, 0x37, 0x50, 0x82, 0x40, - 0xe8, 0xa4, 0x5d, 0xfb, 0xb6, 0x8f, 0x70, 0xdb, 0x27, 0xce, 0x51, 0x9c, - 0x24, 0xde, 0x84, 0x47, 0x67, 0xa8, 0x17, 0x4e, 0x28, 0x17, 0x42, 0x4d, - 0xb0, 0x5d, 0x13, 0x32, 0x18, 0x94, 0x16, 0x99, 0x76, 0x29, 0x34, 0xe0, - 0x1a, 0x77, 0xbf, 0x1a, 0xef, 0x8c, 0x2a, 0xcb, 0xbf, 0x36, 0xb8, 0x62, - 0x8e, 0x9c, 0xf5, 0x59, 0xcb, 0xf9, 0x1d, 0x26, 0x59, 0x88, 0xc9, 0x08, - 0xf6, 0xf0, 0x08, 0xab, 0xab, 0x9d, 0xb3, 0xfd, 0x37, 0xff, 0xe5, 0x59, - 0x55, 0xa4, 0xaa, 0x28, 0x6b, 0x8a, 0x45, 0x41, 0x47, 0x5a, 0x68, 0xd3, - 0xff, 0x93, 0x9a, 0x00, 0x71, 0xe9, 0x5a, 0x7c, 0x04, 0x4a, 0xed, 0x54, - 0x88, 0x04, 0xd9, 0x95, 0xa3, 0x65, 0xcd, 0x6a, 0xf4, 0x48, 0x1e, 0xed, - 0xef, 0xc6, 0x62, 0x26, 0x00, 0xa6, 0x1f, 0xae, 0x97, 0xa2, 0x50, 0xf5, - 0xb1, 0x21, 0x12, 0x43, 0x1f, 0x6a, 0x09, 0x74, 0xb8, 0xb6, 0xe3, 0x37, - 0x60, 0x88, 0xcf, 0x49, 0x50, 0x92, 0xac, 0x66, 0x9a, 0xe0, 0x5c, 0x66, - 0x3b, 0x0c, 0xfe, 0x75, 0x34, 0x72, 0xc6, 0xd6, 0x28, 0xe6, 0x05, 0xee, - 0x31, 0x37, 0x86, 0xae, 0x3c, 0xb4, 0x18, 0x7d, 0x6a, 0x9b, 0x32, 0x3f, - 0x39, 0x37, 0xb9, 0xe0, 0xa9, 0xb5, 0x75, 0x9a, 0x3a, 0xb9, 0x69, 0x1a, - 0x51, 0xe4, 0x08, 0x28, 0x88, 0x08, 0xd0, 0xf5, 0xdf, 0xb2, 0x3b, 0x44, - 0x72, 0x04, 0xde, 0xcd, 0xd8, 0xa2, 0x9e, 0xd2, 0x2d, 0x85, 0x47, 0x2f, - 0x5b, 0x2d, 0xb8, 0xa9, 0x3d, 0x6b, 0xee, 0xbb, 0x2b, 0x9a, 0xb8, 0xcd, - 0x6c, 0xec, 0x96, 0xf2, 0x54, 0xa2, 0x55, 0xc8, 0x04, 0x48, 0x7f, 0x41, - 0xbe, 0x47, 0xd0, 0x3d, 0xee, 0x5f, 0x62, 0x76, 0x57, 0x4e, 0x03, 0xb9, - 0xbf, 0xc1, 0x73, 0x33, 0x90, 0x16, 0xf8, 0x95, 0xe2, 0xca, 0xad, 0xe4, - 0xb5, 0xf0, 0x41, 0x44, 0x07, 0x39, 0xa0, 0x11, 0x39, 0x37, 0x62, 0x81, - 0x4f, 0x7b, 0x46, 0x73, 0x76, 0x3e, 0x6e, 0x22, 0x4b, 0x09, 0xa0, 0x2a, - 0xfd, 0xd2, 0x83, 0xc0, 0x82, 0x91, 0x19, 0x99, 0xda, 0x7e, 0x93, 0x62, - 0x21, 0x83, 0xe1, 0x2c, 0xb1, 0xb2, 0xe3, 0x9a, 0xd4, 0xb7, 0xcb, 0xb2, - 0xa0, 0x49, 0xbe, 0x57, 0x52, 0xd1, 0x30, 0x4a, 0x2f, 0x66, 0x7e, 0x2d, - 0x33, 0x52, 0xa2, 0x2a, 0xcf, 0x6b, 0x1b, 0x35, 0x63, 0x43, 0x0e, 0xc8, - 0x2a, 0x95, 0xec, 0x7e, 0xb2, 0x14, 0xf5, 0x1d, 0x89, 0x84, 0xf1, 0x03, - 0x1c, 0x1b, 0x66, 0xfc, 0x7c, 0xa2, 0x2d, 0x8d, 0x2f, 0x05, 0x3e, 0x37, - 0xbe, 0x61, 0xcb, 0x83, 0xe0, 0x8c, 0x35, 0x63, 0x57, 0xd6, 0x84, 0x57, - 0x34, 0x4b, 0xd8, 0x2e, 0xe1, 0x4f, 0x37, 0x91, 0x3d, 0xf3, 0x93, 0xee, - 0x29, 0x78, 0x6d, 0x1e, 0x6b, 0x72, 0x81, 0x21, 0x2d, 0x55, 0xa6, 0xaa, - 0xb5, 0x56, 0x9f, 0xbd, 0x93, 0x5c, 0x88, 0x74, 0xb5, 0xf9, 0xf6, 0xa7, - 0x9d, 0xa7, 0x56, 0x02, 0xa8, 0x5b, 0x68, 0x1a, 0x87, 0xcb, 0x3a, 0x2c, - 0xf7, 0x94, 0x8e, 0xf5, 0xbe, 0xb6, 0x06, 0x3d, 0xfc, 0x88, 0x9d, 0x50, - 0xd5, 0xdb, 0x79, 0xfb, 0x85, 0xbb, 0x25, 0xa1, 0x22, 0xf5, 0xc7, 0x2d, - 0x33, 0xe7, 0xe1, 0x3f, 0x41, 0x28, 0x56, 0x57, 0x4c, 0x21, 0x7c, 0x9c, - 0xaf, 0x73, 0x13, 0x37, 0x56, 0xde, 0x98, 0x6a, 0x86, 0xbf, 0x86, 0x8c, - 0xa8, 0xfe, 0xb7, 0x84, 0x68, 0x03, 0x26, 0xa0, 0xc8, 0x8d, 0x65, 0x3e, - 0xa8, 0x67, 0x3b, 0xd8, 0xb4, 0x53, 0xc4, 0xe5, 0xee, 0x17, 0x3c, 0xdf, - 0xae, 0xa1, 0xea, 0xa5, 0x52, 0x40, 0xad, 0x95, 0x40, 0xcc, 0xf8, 0xba, - 0xab, 0x88, 0xc5, 0x8f, 0xd1, 0x45, 0x47, 0x15, 0x68, 0x9c, 0x85, 0x38, - 0x86, 0x96, 0x51, 0x62, 0x97, 0xdf, 0x2e, 0xda, 0x5c, 0x89, 0xf7, 0xb7, - 0x5b, 0x75, 0x5f, 0xac, 0xe7, 0xf7, 0x57, 0xbd, 0x36, 0x68, 0xcc, 0xdb, - 0xab, 0x58, 0x5c, 0xd2, 0xc8, 0x80, 0x93, 0x6c, 0xd6, 0x80, 0xdf, 0x23, - 0xd1, 0x2e, 0xd0, 0xea, 0x6b, 0x17, 0x3d, 0x9d, 0x08, 0x3c, 0x37, 0xff, - 0xef, 0x9c, 0xd2, 0xc8, 0x88, 0xbb, 0x80, 0xdd, 0x4c, 0x11, 0x63, 0x03, - 0x41, 0xeb, 0x77, 0x80, 0x69, 0x56, 0x8b, 0x5a, 0xda, 0xcd, 0x8e, 0x61, - 0x15, 0x63, 0x09, 0x75, 0x06, 0x93, 0xe9, 0x2c, 0xd4, 0x42, 0x1f, 0x4c, - 0x0f, 0x77, 0xfe, 0xc7, 0x59, 0xf8, 0x25, 0x3b, 0x84, 0xd1, 0x9d, 0x3b, - 0xc1, 0xca, 0x00, 0x70, 0xfc, 0xec, 0xf8, 0xb4, 0x6b, 0xac, 0xaa, 0x6c, - 0x8f, 0x37, 0xfd, 0x1a, 0x80, 0x8c, 0x66, 0x23, 0x4b, 0x11, 0x39, 0xca, - 0x71, 0x62, 0x7c, 0x05, 0xdc, 0x69, 0x5a, 0xf7, 0x7d, 0x07, 0x07, 0x83, - 0xb9, 0xc0, 0x56, 0xfa, 0xea, 0x26, 0x4a, 0x70, 0xe6, 0x77, 0xdd, 0x70, - 0xca, 0x2d, 0x64, 0x50, 0xe7, 0x8c, 0xdc, 0xe7, 0x45, 0x23, 0xe3, 0x08, - 0x24, 0xb8, 0xae, 0x2b, 0x0c, 0x18, 0x34, 0x03, 0x95, 0xbb, 0x4c, 0x24, - 0xaa, 0xe5, 0x15, 0xca, 0xe0, 0xcb, 0x16, 0xaf, 0xdf, 0x7b, 0x3e, 0x0c, - 0x8f, 0x56, 0x1d, 0x8c, 0x7a, 0xae, 0x18, 0xdd, 0x16, 0xfa, 0xb1, 0x97, - 0xac, 0x59, 0xac, 0x8d, 0x57, 0x9b, 0x61, 0x78, 0x89, 0x53, 0x73, 0x8a, - 0x56, 0x8d, 0xd4, 0x65, 0x20, 0x55, 0xc2, 0x50, 0xdd, 0x76, 0x6e, 0x47, - 0x5e, 0x22, 0x78, 0x66, 0xa5, 0xf9, 0x49, 0xe6, 0xf9, 0xbd, 0x4f, 0x6e, - 0xad, 0x66, 0x84, 0x73, 0x7e, 0xef, 0x27, 0xeb, 0x7c, 0x0e, 0x5a, 0x0a, - 0x91, 0x2f, 0x34, 0xe0, 0xbf, 0xb1, 0x97, 0x1a, 0x4d, 0xf1, 0xe1, 0xef, - 0xee, 0xfb, 0x53, 0x4a, 0x41, 0xd9, 0x0f, 0xf8, 0xa5, 0xd6, 0x68, 0x7a, - 0xdd, 0xd2, 0x09, 0x0e, 0xd9, 0xc2, 0x7d, 0xa4, 0xc9, 0x8e, 0x9d, 0x50, - 0x45, 0xc7, 0xc5, 0xf4, 0x96, 0x79, 0x77, 0xf8, 0x80, 0x3b, 0xb0, 0x37, - 0x32, 0x89, 0xe2, 0xc2, 0x7c, 0x95, 0x01, 0x34, 0x5b, 0x43, 0xed, 0x38, - 0x53, 0x04, 0xc3, 0xa2, 0x52, 0xfe, 0x54, 0xc6, 0x52, 0x90, 0x3a, 0x23, - 0xfb, 0x10, 0x1d, 0x71, 0x2e, 0xc4, 0x8b, 0xe9, 0xdb, 0x15, 0x00, 0x7f, - 0xea, 0x37, 0x1a, 0x0e, 0xfc, 0xb4, 0x35, 0xb7, 0x90, 0xbf, 0x12, 0x68, - 0x93, 0x7a, 0x07, 0x07, 0x67, 0x1b, 0xc5, 0x6f, 0x91, 0xea, 0x19, 0xdc, - 0x59, 0x68, 0x8b, 0xf8, 0x42, 0xb5, 0xd7, 0xa0, 0x22, 0x7a, 0xab, 0x04, - 0x67, 0x9a, 0x76, 0x49, 0xab, 0x00, 0x9d, 0x37, 0x11, 0xfb, 0xf9, 0x1f, - 0xd0, 0x59, 0xec, 0x27, 0xd2, 0xc3, 0x62, 0x95, 0xaa, 0x78, 0xbe, 0xbb, - 0xf1, 0xe6, 0x01, 0xa1, 0xf5, 0x42, 0xcd, 0xd9, 0x78, 0x25, 0xa2, 0xf8, - 0x31, 0x57, 0x0c, 0xed, 0xe3, 0x22, 0xf0, 0xa9, 0xd7, 0xee, 0xb4, 0x1f, - 0xc5, 0x1c, 0xb8, 0xd9, 0xd3, 0xae, 0x49, 0xed, 0x49, 0xf7, 0x54, 0xe5, - 0x00, 0x6b, 0x78, 0x84, 0x49, 0xa7, 0x10, 0xe4, 0x2f, 0xca, 0xb1, 0xb4, - 0x90, 0x6e, 0xd6, 0x81, 0xa4, 0x01, 0x7d, 0x38, 0x9d, 0x38, 0x4d, 0x52, - 0x43, 0x81, 0x47, 0x4f, 0x6c, 0xc1, 0x14, 0x0e, 0x14, 0xf7, 0x43, 0xf7, - 0xfe, 0xdb, 0x72, 0x97, 0x39, 0x46, 0xca, 0x9e, 0xa8, 0xca, 0x7e, 0x69, - 0xac, 0x84, 0xaa, 0x87, 0xc4, 0xd4, 0xc3, 0xa4, 0x1c, 0x57, 0xd3, 0xbe, - 0xf8, 0xde, 0xf4, 0xf3, 0x08, 0x54, 0x07, 0xf3, 0xfa, 0x0d, 0x98, 0xa4, - 0x88, 0xde, 0x7b, 0xd9, 0x85, 0x6e, 0x60, 0x62, 0x17, 0x9a, 0x3a, 0x9b, - 0x82, 0x59, 0x97, 0xb7, 0x52, 0xb6, 0x7e, 0x87, 0x3c, 0x5d, 0x3f, 0x64, - 0xda, 0xee, 0xac, 0x46, 0xb6, 0x04, 0x4e, 0x27, 0x21, 0xf0, 0x88, 0xb9, - 0xbd, 0xab, 0xd5, 0x98, 0x7a, 0xf9, 0x0f, 0xdc, 0x5c, 0xa3, 0xc7, 0x8c, - 0x47, 0xa1, 0x70, 0xef, 0x2c, 0x72, 0x88, 0xde, 0xde, 0x38, 0x46, 0xdc, - 0x88, 0xbc, 0x82, 0xce, 0x9c, 0x19, 0x73, 0xab, 0xa5, 0x9a, 0xa7, 0x4f, - 0xe9, 0xc6, 0xc1, 0x49, 0x0f, 0xac, 0x89, 0x77, 0x0f, 0x3a, 0xe9, 0xae, - 0x47, 0xf4, 0x28, 0x09, 0xec, 0xff, 0xe6, 0xce, 0x2f, 0x8b, 0x73, 0x53, - 0x19, 0x12, 0xde, 0x1f, 0xf2, 0xeb, 0xc5, 0x03, 0x3f, 0xee, 0xf1, 0x1e, - 0xb8, 0x56, 0x96, 0x28, 0x2e, 0xee, 0x99, 0x15, 0x5d, 0x40, 0x19, 0x93, - 0xfb, 0xba, 0xdc, 0xe4, 0xc2, 0x6e, 0x30, 0x23, 0xaa, 0xcb, 0xdd, 0x68, - 0x84, 0xce, 0x91, 0x7a, 0x41, 0xa3, 0xa8, 0x63, 0xe4, 0x2b, 0x1e, 0x53, - 0xb5, 0x22, 0xa7, 0x98, 0x65, 0x91, 0x62, 0x87, 0x77, 0x64, 0x78, 0xb2, - 0xe2, 0x1e, 0x4a, 0xdb, 0xbd, 0x9c, 0x3b, 0xae, 0x7a, 0x15, 0x1c, 0xc3, - 0x24, 0x23, 0x4d, 0x2d, 0x6e, 0xc5, 0x5e, 0xf7, 0x0b, 0x56, 0xd9, 0xe7, - 0xc3, 0x7d, 0x26, 0xc0, 0x53, 0x5a, 0x6e, 0xb4, 0x2a, 0x82, 0x4e, 0xf7, - 0x23, 0x2f, 0xa8, 0x62, 0x59, 0x94, 0x89, 0xec, 0x1f, 0x4e, 0x3c, 0x35, - 0x41, 0x6d, 0x03, 0xd8, 0x10, 0x9f, 0xb9, 0xd7, 0x42, 0x5d, 0x23, 0x85, - 0xb0, 0xfe, 0x98, 0x4f, 0x70, 0xba, 0xe2, 0x99, 0x6b, 0x6b, 0x47, 0x25, - 0x72, 0x87, 0x81, 0xc8, 0x01, 0x90, 0x44, 0xaf, 0xbf, 0x14, 0x7d, 0x99, - 0x93, 0xb1, 0x74, 0x35, 0x56, 0x55, 0xa7, 0xc0, 0x46, 0x0d, 0x6a, 0xd0, - 0x06, 0x4f, 0x8f, 0xab, 0xc3, 0xe1, 0x79, 0x90, 0x61, 0x7b, 0x2c, 0x6c, - 0x28, 0xd5, 0xc2, 0x5f, 0x8c, 0x30, 0x43, 0xbe, 0x34, 0x12, 0x8e, 0x85, - 0x41, 0x96, 0xf5, 0x4f, 0xc3, 0x6e, 0x76, 0x61, 0x54, 0xdb, 0xc5, 0x1b, - 0x65, 0x3b, 0xaf, 0xd5, 0xa2, 0x25, 0x4a, 0xe2, 0x76, 0xeb, 0x0e, 0x04, - 0x28, 0xed, 0x21, 0xa5, 0xa0, 0x4e, 0x0d, 0xd0, 0xc7, 0x0f, 0x19, 0xb9, - 0xa7, 0x97, 0x2e, 0x85, 0x03, 0x94, 0xae, 0x75, 0x60, 0xef, 0x68, 0x5d, - 0xed, 0x39, 0x2e, 0xed, 0xe4, 0x8e, 0x26, 0x46, 0x50, 0x4a, 0xc1, 0xeb, - 0x8f, 0x91, 0x49, 0x1d, 0x1e, 0x80, 0x0f, 0x19, 0x27, 0xbf, 0xc0, 0xb6, - 0x1e, 0x2d, 0x42, 0x96, 0xdc, 0xdd, 0x4a, 0x05, 0x53, 0xab, 0x22, 0x20, - 0x54, 0xc5, 0xe2, 0x5c, 0x86, 0xcd, 0x53, 0xf9, 0x55, 0x4d, 0x1c, 0x44, - 0x7c, 0x7c, 0xc9, 0xbb, 0xe7, 0x5c, 0x8e, 0x59, 0xc1, 0x04, 0xe1, 0x53, - 0xe8, 0x7c, 0x04, 0x6d, 0xa9, 0x23, 0x58, 0x6d, 0x41, 0x11, 0xd4, 0xb7, - 0x74, 0x33, 0xde, 0x01, 0xbc, 0x40, 0x11, 0x49, 0x61, 0xf9, 0x37, 0x89, - 0x7c, 0x30, 0xff, 0xee, 0x9d, 0x4f, 0x57, 0xd6, 0x8d, 0x58, 0xbc, 0xc9, - 0x81, 0x72, 0x4d, 0xac, 0xac, 0x82, 0x92, 0xca, 0xed, 0x7a, 0x8d, 0x46, - 0x40, 0x92, 0x4f, 0x5d, 0xcf, 0x6f, 0xe5, 0x84, 0x03, 0x85, 0xf5, 0x93, - 0xb4, 0xd1, 0xd6, 0x8d, 0x28, 0x3a, 0x8b, 0xdf, 0xcd, 0x5e, 0xbf, 0x0e, - 0xd8, 0xdb, 0x1c, 0x28, 0x59, 0x62, 0x4f, 0x87, 0x10, 0x80, 0xee, 0x52, - 0xc9, 0x3a, 0x17, 0xa6, 0xeb, 0x43, 0xda, 0x01, 0xda, 0x68, 0xf2, 0x79, - 0x1a, 0x51, 0xee, 0x32, 0x0b, 0x93, 0x39, 0x8f, 0x45, 0x79, 0xfc, 0xf1, - 0x41, 0x43, 0x43, 0xa2, 0x09, 0xbd, 0x18, 0xc9, 0x09, 0x0e, 0x71, 0xea, - 0xaf, 0xb0, 0xcf, 0x1d, 0xf5, 0x7a, 0x78, 0xa3, 0x95, 0x51, 0x59, 0x8d, - 0x9a, 0xce, 0xeb, 0x2e, 0x95, 0xad, 0x11, 0xd6, 0x69, 0x42, 0xcd, 0x64, - 0x19, 0x7e, 0x88, 0x87, 0x5e, 0xd2, 0x3f, 0x65, 0x22, 0x47, 0xc9, 0x3a, - 0x4c, 0x8e, 0xa8, 0x53, 0xed, 0xaf, 0x71, 0x71, 0x40, 0x6a, 0x04, 0xaf, - 0x8f, 0x36, 0xeb, 0x62, 0xc2, 0x9e, 0x1d, 0x87, 0xb0, 0x83, 0x37, 0x0b, - 0xfc, 0xcb, 0xc2, 0xed, 0xb3, 0x86, 0xce, 0x79, 0xd2, 0x1b, 0x74, 0x2a, - 0x31, 0x95, 0x23, 0xf9, 0xdb, 0x13, 0x4e, 0x04, 0x8e, 0xeb, 0x23, 0xff, - 0x9f, 0xe4, 0xf6, 0x08, 0xa5, 0x92, 0xa5, 0xfc, 0xdb, 0x7d, 0x8b, 0x59, - 0xd0, 0xb5, 0x76, 0x5f, 0x23, 0x98, 0xf2, 0x5e, 0xc2, 0xf1, 0x3c, 0x0d, - 0x0b, 0x5a, 0x3b, 0xd8, 0xe6, 0x76, 0xa6, 0xba, 0xfd, 0x09, 0xe8, 0x1c, - 0xa6, 0x10, 0x07, 0x8c, 0x8a, 0xdb, 0x6d, 0x31, 0xd6, 0x29, 0x84, 0x80, - 0x69, 0x12, 0x20, 0xa7, 0x61, 0x5b, 0x8c, 0x24, 0x51, 0xd3, 0x6b, 0xd3, - 0xcf, 0x06, 0xce, 0x2e, 0xca, 0xb1, 0xfb, 0xd5, 0xe2, 0xb0, 0xbc, 0xf5, - 0x8d, 0xde, 0xdf, 0xb1, 0x13, 0x77, 0xbc, 0x22, 0xca, 0x12, 0x99, 0x71, - 0x0d, 0x56, 0x79, 0x1a, 0x71, 0x0f, 0x69, 0xed, 0xd1, 0x15, 0x94, 0xe9, - 0xf2, 0x9a, 0xc2, 0x2a, 0xac, 0xaa, 0x7c, 0x2b, 0xce, 0x91, 0x5b, 0x9e, - 0xde, 0x7a, 0x6b, 0x2d, 0xbd, 0x2c, 0x5f, 0x2d, 0xba, 0xc8, 0xbd, 0x07, - 0xa6, 0xd3, 0xa0, 0xf2, 0x0e, 0xa2, 0x92, 0x59, 0xb6, 0xc8, 0xfc, 0x40, - 0x2d, 0x1c, 0xef, 0x1f, 0xdc, 0x96, 0x2f, 0x95, 0x2d, 0x32, 0x86, 0x36, - 0x08, 0x9b, 0xd7, 0x6f, 0xe0, 0x75, 0x52, 0x9a, 0x29, 0xa7, 0x29, 0x96, - 0x5d, 0x01, 0x26, 0x23, 0xac, 0x80, 0x95, 0x58, 0x9c, 0x5d, 0x8c, 0xbe, - 0xfd, 0x66, 0x56, 0xfb, 0xb4, 0x0a, 0xd0, 0x89, 0xea, 0x4a, 0x07, 0xd1, - 0x58, 0x99, 0x75, 0x07, 0x4d, 0x64, 0xd2, 0x7d, 0x0d, 0xfc, 0x92, 0xc8, - 0x7a, 0x09, 0xcf, 0x7e, 0xb7, 0x5e, 0x6b, 0x1c, 0x1c, 0x3b, 0x9e, 0x84, - 0x87, 0x94, 0x57, 0x06, 0xd1, 0x9f, 0x9c, 0x0c, 0x0b, 0xae, 0xea, 0x56, - 0x9f, 0x89, 0x8a, 0xa2, 0xfa, 0xdc, 0xb3, 0x1f, 0x0c, 0x44, 0x60, 0x78, - 0xad, 0x38, 0xc0, 0xc6, 0x7d, 0xb3, 0x09, 0x48, 0x6e, 0x7e, 0x90, 0x9f, - 0xd7, 0x26, 0xd3, 0x95, 0x15, 0xc9, 0x3f, 0x7c, 0x2f, 0x4b, 0x9d, 0x55, - 0x6b, 0x24, 0xad, 0x02, 0x8e, 0x28, 0x19, 0x43, 0x9d, 0x75, 0xdc, 0xac, - 0x01, 0x76, 0x52, 0x93, 0x58, 0x9b, 0x49, 0x3b, 0xb8, 0xfa, 0x5b, 0x4e, - 0xb5, 0xdc, 0xc5, 0xb8, 0x00, 0x7a, 0x83, 0xf1, 0x71, 0x05, 0xac, 0xa6, - 0xa5, 0x4c, 0x8a, 0x0d, 0xbb, 0xc0, 0x1b, 0x1d, 0x4d, 0xd2, 0x1b, 0xfa, - 0xf9, 0x4b, 0x36, 0xa4, 0x67, 0xf4, 0xc6, 0x37, 0xee, 0x90, 0x40, 0xcc, - 0x4c, 0x2d, 0x03, 0xd2, 0x1f, 0xff, 0x77, 0x31, 0x84, 0x2a, 0xae, 0x21, - 0x99, 0x42, 0x28, 0x36, 0x0d, 0xba, 0x8c, 0xd5, 0x1b, 0x37, 0x9f, 0xfb, - 0x11, 0x6b, 0x34, 0xa1, 0xf5, 0x94, 0x8b, 0xeb, 0xb4, 0x3d, 0x21, 0x16, - 0xde, 0x70, 0x0e, 0x0c, 0x5b, 0x70, 0x83, 0x97, 0x36, 0xd3, 0x0b, 0x29, - 0x7e, 0x6b, 0x7c, 0xfd, 0x74, 0xdc, 0x24, 0xb3, 0x9e, 0x59, 0x76, 0x10, - 0x25, 0x73, 0x38, 0xe8, 0x28, 0xff, 0x74, 0x7d, 0xf0, 0xfc, 0xb0, 0x33, - 0x92, 0xbb, 0x67, 0xcc, 0x8b, 0x66, 0x06, 0x0c, 0x0c, 0xa3, 0x27, 0x53, - 0xf3, 0x05, 0x6f, 0x54, 0xe4, 0x20, 0x9b, 0x39, 0xaa, 0x2f, 0x8a, 0x56, - 0xd8, 0xec, 0x4b, 0x05, 0xb1, 0xbb, 0x91, 0xa3, 0x4f, 0x43, 0xc1, 0x41, - 0x93, 0x38, 0x2f, 0x1e, 0x17, 0x3f, 0x89, 0xc3, 0xd0, 0xd7, 0xf7, 0x1b, - 0x0c, 0xc4, 0x65, 0xb6, 0x8f, 0x9e, 0x5f, 0xba, 0x52, 0x19, 0xaf, 0x84, - 0xda, 0xd4, 0xab, 0xf1, 0x38, 0xe5, 0xb9, 0x2b, 0x53, 0x08, 0x67, 0xb2, - 0xb9, 0x75, 0x12, 0xe9, 0x39, 0x18, 0xd9, 0x13, 0x31, 0xf4, 0x35, 0xf2, - 0x21, 0xb4, 0xa5, 0xe9, 0x47, 0x0e, 0x83, 0x04, 0x29, 0x20, 0xb0, 0xde, - 0xd6, 0x74, 0x2b, 0x9d, 0x8e, 0x0e, 0x43, 0x16, 0x5d, 0xa9, 0x37, 0x43, - 0xf7, 0xa3, 0x37, 0xd0, 0x34, 0xa3, 0x85, 0x2f, 0x37, 0x7d, 0x35, 0x26, - 0x98, 0xa4, 0x65, 0xa5, 0x2f, 0xb6, 0xe6, 0x9c, 0xc6, 0xf8, 0x6d, 0x55, - 0x84, 0xe7, 0x3e, 0x5e, 0xc6, 0x1e, 0x56, 0x72, 0xf2, 0x85, 0x28, 0x3e, - 0x5f, 0x87, 0x0c, 0x1d, 0xea, 0xb6, 0xed, 0x1c, 0x32, 0xa3, 0x96, 0xa8, - 0x5c, 0x17, 0x09, 0xa0, 0x1d, 0x42, 0xf4, 0x5e, 0x8e, 0x5a, 0x49, 0x13, - 0xb4, 0x66, 0x0a, 0xe0, 0x2d, 0x51, 0xcb, 0x83, 0xb4, 0x64, 0xc9, 0x8e, - 0xe9, 0xf5, 0xb0, 0x49, 0x57, 0xd0, 0x4a, 0xd1, 0xc0, 0x23, 0xc0, 0x30, - 0x7a, 0x3e, 0xf5, 0x32, 0x3b, 0xd6, 0xa3, 0x80, 0x40, 0x3a, 0xa1, 0x96, - 0x0e, 0xbb, 0xbb, 0xfd, 0xa2, 0x91, 0x04, 0x6f, 0xbf, 0xff, 0x62, 0x81, - 0x74, 0x51, 0xff, 0x5f, 0xba, 0x38, 0x4b, 0x0f, 0x58, 0xa1, 0x15, 0xc6, - 0xd2, 0x20, 0x60, 0x01, 0xf7, 0x47, 0x1c, 0xdc, 0x77, 0x90, 0xe2, 0xa2, - 0xe3, 0xeb, 0x75, 0x19, 0x59, 0x1b, 0x7c, 0x89, 0x42, 0x42, 0xaf, 0x86, - 0xb2, 0x19, 0xce, 0xfa, 0x3f, 0x69, 0x1c, 0xa6, 0xe7, 0xa5, 0xf3, 0x6e, - 0x6a, 0xa0, 0xed, 0x16, 0xac, 0x45, 0xaf, 0x32, 0xc2, 0x76, 0x82, 0xaa, - 0xc0, 0x42, 0xed, 0x53, 0x4e, 0x53, 0x2a, 0x8e, 0xb4, 0x55, 0x65, 0x77, - 0x20, 0xd7, 0xd9, 0x0e, 0xc9, 0x22, 0x9c, 0x3a, 0x4a, 0xa3, 0xb4, 0x49, - 0x72, 0x46, 0x26, 0xd1, 0xeb, 0x2e, 0x05, 0xfe, 0x1e, 0x2c, 0xe0, 0x35, - 0x44, 0x1f, 0x51, 0xbf, 0xbb, 0x2c, 0x78, 0xb5, 0x27, 0x65, 0x7d, 0xe2, - 0xe1, 0x1c, 0x11, 0xd0, 0xb6, 0x04, 0x8b, 0xbf, 0x93, 0xd5, 0xa9, 0x25, - 0xdc, 0x7f, 0xff, 0x9c, 0x29, 0x62, 0x43, 0x32, 0x1e, 0x4a, 0xea, 0x30, - 0x6b, 0xe6, 0x12, 0x69, 0xf4, 0xc7, 0x95, 0x95, 0xd4, 0x4d, 0x83, 0xb3, - 0xfb, 0x53, 0xd8, 0x01, 0x1e, 0x8f, 0x2c, 0x8c, 0xde, 0x9d, 0xfc, 0x60, - 0xe0, 0x7b, 0xa0, 0x65, 0xc4, 0xd2, 0x75, 0x24, 0x78, 0x4f, 0xb4, 0xe3, - 0xb3, 0xb2, 0x7d, 0xbc, 0xad, 0x49, 0x97, 0x12, 0xf0, 0x8d, 0xc4, 0x6b, - 0x54, 0xc1, 0x82, 0x62, 0x02, 0x27, 0x1f, 0xe3, 0xd6, 0x4a, 0xcd, 0x38, - 0x97, 0x97, 0xd9, 0xeb, 0x65, 0xf9, 0xa7, 0xcf, 0xcb, 0x02, 0xb9, 0xea, - 0x8a, 0x84, 0xfe, 0x4d, 0xef, 0x21, 0x29, 0xff, 0xba, 0xd1, 0x5d, 0xec, - 0xea, 0x1d, 0x08, 0x57, 0x6f, 0x1d, 0x77, 0xa7, 0x18, 0xcc, 0xff, 0x2a, - 0x70, 0x2f, 0xfe, 0xd2, 0xfc, 0xaa, 0x9b, 0xff, 0x69, 0x3d, 0xf9, 0xe0, - 0x95, 0x51, 0x22, 0x9b, 0x1f, 0xc7, 0x98, 0xb2, 0xeb, 0x7b, 0xd9, 0x72, - 0x6e, 0x2e, 0x19, 0xcb, 0xa4, 0x55, 0x99, 0x3a, 0x98, 0xe8, 0x13, 0x71, - 0x3a, 0x0e, 0xf5, 0xd5, 0x71, 0x41, 0xcc, 0xf9, 0xe4, 0x1a, 0x5a, 0x46, - 0x03, 0xa8, 0x8d, 0x12, 0x95, 0x60, 0xee, 0x12, 0x89, 0xf6, 0xe7, 0xb4, - 0xf7, 0x6c, 0xaa, 0x93, 0x93, 0xc9, 0x7d, 0x13, 0x46, 0x64, 0xed, 0x88, - 0x31, 0x04, 0x6f, 0x4f, 0xc3, 0xe3, 0x3c, 0x3b, 0x95, 0x54, 0x29, 0xc9, - 0x15, 0xf1, 0x05, 0xdc, 0x8c, 0x08, 0xbc, 0x5c, 0x9c, 0xf1, 0x7f, 0x5d, - 0xbd, 0x7c, 0xf0, 0xc0, 0x30, 0xaf, 0xae, 0x23, 0xdc, 0x4f, 0x46, 0x6c, - 0x1c, 0x20, 0xb1, 0xc7, 0x87, 0xd9, 0x2c, 0xe2, 0x05, 0x43, 0xf3, 0x2e, - 0xc5, 0x4b, 0x51, 0x04, 0xbb, 0x93, 0xeb, 0x30, 0x06, 0xfd, 0x85, 0x1e, - 0x59, 0x3c, 0x80, 0xb7, 0x0a, 0x8a, 0x57, 0x76, 0x1a, 0x85, 0xff, 0xc2, - 0x5d, 0xb5, 0xc4, 0xa1, 0xf7, 0x35, 0x86, 0xfe, 0xe8, 0x4b, 0xef, 0xb4, - 0x24, 0x29, 0x76, 0xeb, 0x85, 0x2d, 0x59, 0xa9, 0xdd, 0xab, 0xd2, 0x01, - 0x2b, 0x73, 0x23, 0x6c, 0x2f, 0x19, 0x40, 0x27, 0x35, 0xba, 0x56, 0x44, - 0x38, 0x7c, 0x0d, 0x63, 0x76, 0x97, 0xe6, 0xce, 0x12, 0x52, 0x42, 0x26, - 0x59, 0x9e, 0xf9, 0xa6, 0x28, 0xdf, 0x19, 0x08, 0xee, 0x04, 0x5e, 0x25, - 0xbd, 0x58, 0x10, 0x7f, 0xa8, 0x54, 0xa6, 0x25, 0x1a, 0x0c, 0xde, 0xe2, - 0xa4, 0x1f, 0x78, 0x3a, 0xd7, 0xfb, 0x5f, 0xdc, 0x92, 0x07, 0x26, 0x43, - 0x9a, 0x0f, 0xfe, 0xda, 0x11, 0x4e, 0x15, 0x2a, 0x13, 0xcd, 0x2f, 0x9f, - 0x0c, 0x27, 0xa6, 0xca, 0xc1, 0xa0, 0xce, 0xb6, 0x49, 0x01, 0x25, 0xc4, - 0x15, 0x81, 0xa8, 0xc3, 0x68, 0xef, 0x41, 0xe2, 0x9f, 0xd8, 0xe3, 0xa6, - 0x7a, 0xd6, 0xa6, 0x67, 0x2d, 0x6b, 0xec, 0x02, 0x5c, 0x5f, 0x9c, 0xa5, - 0x2d, 0xf6, 0x45, 0xd8, 0x60, 0xe9, 0x7b, 0x51, 0x63, 0x1b, 0xf0, 0xfb, - 0x97, 0xc5, 0x1e, 0x6b, 0x7c, 0xca, 0x11, 0xa8, 0x6f, 0xd2, 0x3c, 0x34, - 0xc2, 0x83, 0x4d, 0x18, 0x30, 0x7d, 0x59, 0xcc, 0x0d, 0xad, 0xa4, 0x64, - 0xcd, 0x63, 0x89, 0xe9, 0xeb, 0x1d, 0x47, 0x79, 0x68, 0x86, 0xd0, 0x7f, - 0x01, 0x90, 0x02, 0x7f, 0xb4, 0x24, 0x78, 0x95, 0x68, 0xc2, 0xe0, 0xa3, - 0x07, 0x44, 0xfe, 0x20, 0x52, 0x37, 0x3d, 0xb6, 0x1e, 0xd6, 0x6b, 0x70, - 0x85, 0x3b, 0x1b, 0x6d, 0x89, 0x39, 0x70, 0xbd, 0x3d, 0xe4, 0xcb, 0xb6, - 0xc5, 0xe5, 0xdd, 0x6f, 0x94, 0xe4, 0x5d, 0x45, 0x4f, 0xbb, 0x56, 0xb1, - 0xff, 0x8a, 0x05, 0x16, 0xbd, 0x5f, 0x9b, 0xab, 0xe6, 0x2f, 0x34, 0x10, - 0x8b, 0x3b, 0xda, 0x98, 0x61, 0x41, 0x5e, 0xf3, 0x3a, 0x92, 0xa4, 0xe4, - 0xbb, 0xd9, 0xd6, 0xfc, 0x1d, 0xf9, 0xda, 0xdb, 0x20, 0x4a, 0xe4, 0x0a, - 0x88, 0x5b, 0x15, 0x93, 0x12, 0x56, 0x65, 0x5f, 0xcc, 0xac, 0x18, 0x9f, - 0xef, 0xdd, 0xf4, 0xaf, 0xa0, 0xc4, 0xf3, 0xee, 0x4d, 0xe5, 0x8d, 0x91, - 0x80, 0x62, 0x19, 0x0c, 0x17, 0x8e, 0xd3, 0xb9, 0xd2, 0xea, 0xf8, 0xcf, - 0x9d, 0x96, 0x0a, 0x6d, 0xcc, 0x87, 0xfc, 0x28, 0xbe, 0xf4, 0xea, 0x98, - 0x6f, 0x12, 0x11, 0xee, 0xbe, 0x6a, 0x4e, 0x7a, 0x33, 0xc9, 0x60, 0x37, - 0x7f, 0xf3, 0x2c, 0xdf, 0x77, 0x4f, 0xbc, 0x38, 0x9f, 0xda, 0xa6, 0x92, - 0xf3, 0xa1, 0x44, 0x08, 0x23, 0x0a, 0x29, 0xf5, 0x2d, 0x27, 0xeb, 0x66, - 0x1b, 0x9a, 0xd1, 0x8a, 0xf9, 0x19, 0x33, 0xd4, 0x58, 0xa5, 0x86, 0x4e, - 0xd3, 0xa8, 0x59, 0x07, 0x7d, 0x0d, 0xaa, 0xb3, 0x17, 0x13, 0x80, 0x57, - 0x8a, 0x17, 0x20, 0x34, 0xc3, 0x81, 0x94, 0xd6, 0x6e, 0xa7, 0x9e, 0x3c, - 0xbc, 0xc0, 0xfb, 0x6a, 0x57, 0x9f, 0xa2, 0x44, 0x04, 0x4b, 0xff, 0x27, - 0xdb, 0xa0, 0xab, 0x40, 0xf6, 0x05, 0xed, 0x2d, 0x7d, 0x6b, 0x60, 0xba, - 0x36, 0x53, 0xb8, 0x70, 0x4e, 0x8c, 0x51, 0x3b, 0xf3, 0x2e, 0x5a, 0x20, - 0x53, 0x2d, 0x11, 0xd1, 0x3c, 0xba, 0x6e, 0xf5, 0xce, 0x52, 0x0d, 0x34, - 0xa9, 0x75, 0x7c, 0xbe, 0x1f, 0xfe, 0xf6, 0xdc, 0xf8, 0x01, 0x64, 0xad, - 0x4c, 0xc7, 0x40, 0x6b, 0x88, 0x79, 0xc9, 0x1b, 0x4d, 0x98, 0x75, 0xa4, - 0xa7, 0x2a, 0xfc, 0x39, 0x7e, 0xca, 0x37, 0xf7, 0x83, 0x68, 0x71, 0xda, - 0xc9, 0xb1, 0xaf, 0xbe, 0xb7, 0x2f, 0xdb, 0x7f, 0x52, 0x95, 0x37, 0x36, - 0xd5, 0x01, 0x9c, 0x46, 0x5d, 0x20, 0xee, 0x40, 0xdd, 0x2f, 0x2d, 0x96, - 0x2d, 0xd5, 0x69, 0x39, 0xe0, 0xd5, 0x3d, 0x3b, 0x9a, 0xae, 0xe1, 0x6a, - 0xc7, 0x3d, 0x41, 0x49, 0xcc, 0x18, 0xf5, 0x49, 0x67, 0x08, 0xc0, 0xab, - 0x4c, 0x9d, 0x57, 0xb0, 0xe2, 0x66, 0xbd, 0xcb, 0x03, 0x0c, 0xb1, 0x98, - 0xb0, 0x35, 0x33, 0xab, 0xc3, 0x47, 0xbe, 0x75, 0xa9, 0xcf, 0x5e, 0x6a, - 0xb8, 0x9c, 0x93, 0x77, 0x4c, 0xb0, 0x55, 0xab, 0xe4, 0xa2, 0x83, 0xc7, - 0xf0, 0x0a, 0x87, 0x8e, 0xe3, 0x38, 0xa2, 0xe4, 0x72, 0x1c, 0x86, 0xaf, - 0x51, 0x1e, 0x18, 0x8c, 0x5f, 0xd1, 0x04, 0x06, 0x4b, 0xbe, 0xb4, 0x74, - 0x59, 0x2c, 0x35, 0x15, 0x92, 0xa7, 0x9d, 0x3d, 0x34, 0x8c, 0x19, 0xea, - 0xbc, 0x06, 0x47, 0xd6, 0xf1, 0x8e, 0x72, 0x69, 0x44, 0x3c, 0xe1, 0x34, - 0x4b, 0x97, 0xae, 0x03, 0x79, 0x70, 0x90, 0xe5, 0x11, 0x95, 0xa7, 0xe0, - 0x17, 0x3f, 0x50, 0xc8, 0xbb, 0x83, 0x13, 0x80, 0xb4, 0x1a, 0x43, 0x2d, - 0x75, 0x09, 0x5d, 0x25, 0xeb, 0x53, 0x1b, 0xd6, 0x21, 0x9a, 0x36, 0xa2, - 0x7a, 0xa5, 0x3b, 0xd6, 0x9b, 0x5e, 0xf3, 0x30, 0xa7, 0xf4, 0x10, 0x7d, - 0xdc, 0x29, 0x7a, 0x53, 0x6e, 0xdd, 0x01, 0xd1, 0x2b, 0xf9, 0xe6, 0x17, - 0x91, 0x40, 0xc9, 0x81, 0xb8, 0x7d, 0xa0, 0x23, 0x1f, 0x8b, 0x6a, 0x2d, - 0x90, 0xbe, 0x47, 0x9c, 0x40, 0x7b, 0x0b, 0xdf, 0x11, 0xaf, 0x0f, 0x1d, - 0xac, 0xb2, 0xbf, 0x09, 0x94, 0x23, 0x87, 0xd0, 0x3c, 0xd1, 0xf1, 0x24, - 0xa5, 0x16, 0xf7, 0xb6, 0x51, 0x11, 0x7f, 0xa1, 0xba, 0xdf, 0xbc, 0x3f, - 0x09, 0xa7, 0xff, 0x36, 0x21, 0xe8, 0x34, 0x66, 0xda, 0xde, 0xfa, 0x44, - 0x17, 0xf4, 0x2c, 0xb2, 0xee, 0xf6, 0x8f, 0x87, 0x66, 0x41, 0x15, 0x20, - 0x7c, 0xf4, 0xe2, 0xda, 0x40, 0x38, 0x9d, 0xcf, 0x9f, 0x66, 0xb9, 0x5b, - 0x92, 0xaa, 0x64, 0x79, 0x23, 0x04, 0xe0, 0x2a, 0x26, 0x06, 0x37, 0x9e, - 0xab, 0x41, 0x06, 0x15, 0x79, 0x7b, 0x70, 0x5c, 0x2d, 0xd7, 0x28, 0x2e, - 0x79, 0xd6, 0x23, 0x2c, 0x78, 0xf0, 0xe0, 0xc1, 0x25, 0xba, 0x74, 0xba, - 0x61, 0x2b, 0x76, 0x74, 0xf7, 0x7d, 0xaa, 0x85, 0xb7, 0x1f, 0x7c, 0x05, - 0x39, 0x36, 0x48, 0xc0, 0x66, 0xca, 0x05, 0xb2, 0x73, 0x2c, 0x34, 0x41, - 0x91, 0x0d, 0x24, 0x5d, 0x5d, 0xb0, 0xde, 0xba, 0xb2, 0x44, 0xd5, 0xaf, - 0x86, 0x72, 0x06, 0x2a, 0xae, 0x35, 0xca, 0xaa, 0xac, 0xa5, 0x92, 0x80, - 0x93, 0xf5, 0x2d, 0x6d, 0xde, 0x0c, 0x19, 0x63, 0x19, 0x6e, 0x56, 0x3d, - 0xf4, 0x42, 0x36, 0x89, 0x8f, 0xe8, 0xd9, 0x57, 0x51, 0x77, 0xcb, 0xc5, - 0x82, 0x01, 0xb5, 0x1a, 0x81, 0x77, 0x5f, 0xc4, 0x9c, 0xc2, 0xbf, 0xd3, - 0xbc, 0x39, 0xca, 0x48, 0x4f, 0xc8, 0xb7, 0x84, 0xb4, 0xa9, 0xfc, 0x67, - 0x67, 0x3e, 0xdd, 0x1d, 0xa4, 0xac, 0xbe, 0x71, 0x75, 0x43, 0x52, 0xec, - 0x8a, 0x52, 0x74, 0x5d, 0x1d, 0x40, 0x3e, 0x2c, 0xda, 0xad, 0xb9, 0x8f, - 0x78, 0x55, 0xbf, 0xef, 0x73, 0x25, 0xc6, 0x09, 0xd5, 0x0b, 0xb7, 0xba, - 0x75, 0x85, 0xea, 0x05, 0x01, 0xbd, 0x5a, 0x61, 0x91, 0xd9, 0xbb, 0x82, - 0xbf, 0xd4, 0x1b, 0xf7, 0xcd, 0xd2, 0x44, 0x14, 0x15, 0xc8, 0xa3, 0x5d, - 0x4d, 0xca, 0x79, 0x28, 0x57, 0x09, 0xe0, 0xe3, 0x36, 0xc6, 0x16, 0xee, - 0x76, 0x6c, 0x36, 0xda, 0xcc, 0x0f, 0x68, 0x4e, 0x0e, 0x95, 0x6f, 0xb4, - 0xe3, 0x18, 0xe5, 0x8c, 0xf2, 0x24, 0xeb, 0x6c, 0x21, 0x46, 0x1e, 0xcf, - 0x0b, 0x35, 0x1b, 0xc6, 0x30, 0xee, 0x36, 0xc2, 0x6c, 0xcc, 0x7f, 0xf8, - 0xd5, 0xfa, 0x23, 0x07, 0x85, 0x65, 0x3f, 0x58, 0x7a, 0x70, 0x5d, 0x70, - 0x88, 0xbf, 0xf1, 0xdd, 0xb8, 0xec, 0x7c, 0x50, 0xa2, 0xac, 0x80, 0x9b, - 0x5c, 0xa5, 0xa9, 0xf2, 0x81, 0x16, 0x64, 0xd7, 0x7a, 0xef, 0xac, 0xff, - 0x29, 0x9e, 0xac, 0x81, 0x57, 0x4d, 0x43, 0x0d, 0x5d, 0x55, 0x1a, 0xf4, - 0x0c, 0xca, 0x4c, 0xdf, 0x7e, 0x67, 0x76, 0x0b, 0xd5, 0x82, 0x6f, 0x2d, - 0x46, 0xf7, 0x70, 0x7b, 0x9d, 0x96, 0xba, 0x63, 0xc8, 0xae, 0x04, 0xba, - 0xd9, 0x5e, 0xcc, 0x82, 0xf7, 0xc3, 0x64, 0x7a, 0x8a, 0x07, 0x7f, 0x43, - 0x76, 0xb3, 0xd0, 0xf9, 0xbf, 0x1a, 0x34, 0x0e, 0xba, 0x4e, 0x32, 0xa7, - 0xb6, 0x6c, 0x61, 0xa1, 0xfb, 0x96, 0xfe, 0x9a, 0xd6, 0xe8, 0x76, 0xa6, - 0xf7, 0x68, 0x2f, 0xe2, 0x9a, 0x56, 0x13, 0xf6, 0xf4, 0x89, 0xa1, 0xf4, - 0x19, 0x49, 0x01, 0x95, 0xbe, 0x51, 0x2e, 0x01, 0xab, 0x25, 0xd0, 0xad, - 0xa2, 0xdf, 0xf5, 0x99, 0x29, 0xdc, 0xc4, 0x73, 0xa7, 0x31, 0x49, 0xbf, - 0x37, 0x34, 0x42, 0xf5, 0x38, 0xe3, 0xe6, 0x52, 0xa0, 0x87, 0x95, 0x14, - 0xf3, 0xdc, 0xa7, 0x64, 0x5f, 0x73, 0x21, 0xfa, 0x6b, 0x7b, 0x75, 0xa5, - 0xe6, 0xec, 0x40, 0x04, 0x8a, 0x3e, 0xf3, 0xf0, 0x6b, 0x72, 0xea, 0xab, - 0x56, 0xd0, 0x30, 0xbf, 0x7a, 0x9f, 0xce, 0xdc, 0xbb, 0x1e, 0x0e, 0x79, - 0xd6, 0x77, 0x75, 0x82, 0x1c, 0x37, 0x5a, 0x11, 0x8e, 0x15, 0x0b, 0x53, - 0xbd, 0xdb, 0x49, 0x73, 0x14, 0x9c, 0x18, 0x24, 0x39, 0x2a, 0x73, 0x2e, - 0x15, 0x8a, 0x88, 0x21, 0x23, 0x09, 0x00, 0x01, 0x4e, 0xd3, 0xf9, 0xd0, - 0x2d, 0x57, 0x36, 0xed, 0x3e, 0x48, 0xd7, 0x08, 0x2d, 0xd4, 0xa5, 0xd8, - 0xdc, 0xef, 0xe9, 0x05, 0x31, 0x8b, 0x2b, 0xe7, 0x0d, 0x14, 0x1f, 0x7c, - 0x22, 0xf1, 0xdf, 0xd9, 0x66, 0x63, 0xba, 0xc3, 0x0f, 0x21, 0x15, 0xbd, - 0x16, 0x04, 0x4f, 0xd3, 0x6f, 0xb5, 0xb2, 0xe7, 0x24, 0xd3, 0x21, 0x94, - 0xd9, 0x9c, 0x21, 0x1a, 0xc3, 0x37, 0xb4, 0x35, 0xdf, 0x34, 0x54, 0x5d, - 0xbf, 0x14, 0xb2, 0xae, 0x87, 0x1b, 0x5a, 0x4e, 0x7f, 0x5d, 0xa6, 0xb3, - 0x7b, 0x6e, 0xd0, 0xfa, 0x62, 0xfe, 0xf2, 0xb3, 0x86, 0xed, 0x0c, 0xd9, - 0xb2, 0x4d, 0xd7, 0xc5, 0xe4, 0x2a, 0x00, 0x8e, 0x5b, 0x42, 0x34, 0x0b, - 0xf3, 0xbb, 0xeb, 0x13, 0xaf, 0x1f, 0xb1, 0xb4, 0xfc, 0x18, 0xd3, 0x47, - 0x75, 0x86, 0x2c, 0x73, 0x9c, 0x7d, 0xad, 0x41, 0xa1, 0x0e, 0x40, 0x12, - 0xa8, 0x6b, 0x0b, 0x0a, 0x93, 0x98, 0xab, 0xee, 0x5f, 0xbb, 0xa3, 0x73, - 0x7a, 0x45, 0xea, 0xe5, 0x2f, 0x7b, 0x73, 0xda, 0x9d, 0x13, 0x56, 0x59, - 0x7a, 0xb9, 0x3f, 0xf4, 0x58, 0x81, 0x37, 0x34, 0xcf, 0xd2, 0xb2, 0x63, - 0x4b, 0x52, 0x8c, 0xe5, 0x6c, 0x35, 0x9c, 0xe5, 0x32, 0x7f, 0xa7, 0x47, - 0xe3, 0x0b, 0x2f, 0x98, 0xf9, 0xa1, 0x1d, 0xfc, 0x7d, 0xe4, 0x02, 0x0e, - 0x7a, 0x2b, 0x5c, 0xa9, 0x8e, 0xe3, 0x5c, 0x2c, 0x82, 0xae, 0x69, 0xef, - 0x42, 0xe5, 0x06, 0xc2, 0xe7, 0xfd, 0xb8, 0x73, 0x60, 0xba, 0x76, 0xd6, - 0x5b, 0xf6, 0x5f, 0x7b, 0x5f, 0x6f, 0xa0, 0x54, 0xd8, 0x98, 0xb9, 0x6a, - 0xf7, 0x3d, 0x10, 0xda, 0x29, 0x2d, 0x76, 0xc3, 0x59, 0x71, 0x33, 0x2c, - 0xc2, 0xdd, 0x2f, 0x7f, 0xfd, 0xb6, 0x41, 0xb3, 0x5a, 0xf1, 0x9b, 0x50, - 0x4e, 0x1e, 0x54, 0x84, 0xdd, 0xbf, 0x26, 0x01, 0x54, 0x29, 0xc1, 0xe1, - 0x26, 0xc8, 0xfd, 0x20, 0x0e, 0x6d, 0x44, 0xea, 0x97, 0x62, 0x32, 0x20, - 0x31, 0xe7, 0x75, 0x37, 0x28, 0x27, 0x74, 0x01, 0xd0, 0x29, 0x33, 0xb1, - 0x71, 0x3a, 0x46, 0xbb, 0x28, 0x9b, 0xea, 0x66, 0x76, 0x00, 0x89, 0xfb, - 0x8c, 0xf5, 0x79, 0x57, 0x44, 0xfd, 0x52, 0x68, 0x48, 0x60, 0xd0, 0x2d, - 0xa2, 0x0f, 0xd7, 0x69, 0x2b, 0x76, 0xc7, 0xdc, 0x7c, 0x84, 0xa9, 0xd3, - 0xa3, 0xde, 0x3d, 0xfc, 0xbc, 0x1a, 0xcf, 0x00, 0xf0, 0x60, 0x05, 0xa1, - 0x16, 0xbd, 0xad, 0x51, 0x4b, 0x0c, 0x35, 0x66, 0x24, 0xee, 0x20, 0xdf, - 0x36, 0xed, 0xf1, 0xf4, 0xf8, 0x76, 0xfc, 0x84, 0x33, 0xff, 0xad, 0x1d, - 0x92, 0xe0, 0x94, 0xd7, 0x69, 0xe0, 0xef, 0x72, 0x3a, 0x6e, 0x42, 0xce, - 0xa0, 0xa0, 0x33, 0x06, 0xf5, 0x88, 0x76, 0x35, 0xf6, 0x24, 0x6d, 0x96, - 0xe8, 0x27, 0xb4, 0xc4, 0x79, 0x48, 0xf5, 0xa8, 0xe1, 0x64, 0x40, 0x2f, - 0xe2, 0x4d, 0x2f, 0x11, 0xba, 0xd8, 0xa2, 0x5a, 0x0f, 0x03, 0x74, 0x59, - 0x49, 0x81, 0xde, 0x8e, 0x1a, 0x7a, 0x7b, 0x12, 0x3b, 0x20, 0x38, 0x87, - 0xc2, 0xb8, 0x3d, 0xcc, 0x8f, 0x68, 0x5d, 0x38, 0x7d, 0x23, 0x12, 0xbe, - 0x66, 0xed, 0xc5, 0x8e, 0x06, 0x30, 0xc6, 0x66, 0xeb, 0x95, 0x8f, 0xed, - 0x33, 0x93, 0x31, 0x93, 0xb5, 0xe4, 0x6c, 0x55, 0x25, 0x65, 0xd2, 0x1b, - 0xcf, 0x8c, 0x90, 0x44, 0x40, 0xf8, 0x5c, 0x5e, 0x89, 0x99, 0x1f, 0xe3, - 0x4b, 0x30, 0xf7, 0x75, 0x1b, 0x2a, 0x8f, 0x0d, 0x12, 0xe3, 0x46, 0xce, - 0xe0, 0xac, 0xf4, 0x9a, 0xe5, 0xaf, 0xfb, 0x5b, 0x64, 0x35, 0x7a, 0x88, - 0xf1, 0x6f, 0x47, 0x6b, 0x38, 0xd5, 0x70, 0xb4, 0x07, 0xeb, 0x2d, 0x99, - 0x83, 0xb7, 0x39, 0xdd, 0x22, 0xc9, 0xc3, 0xee, 0x3e, 0x93, 0x82, 0x62, - 0x52, 0xe9, 0x99, 0x42, 0x18, 0x6d, 0xd8, 0xe2, 0x99, 0x2a, 0x3f, 0xc5, - 0xc4, 0x09, 0xfd, 0x33, 0xd4, 0xd7, 0x06, 0x60, 0xb1, 0x44, 0x9f, 0x08, - 0x0a, 0xfa, 0x5b, 0x17, 0xa9, 0x07, 0x51, 0xd8, 0xa3, 0x92, 0x7f, 0x98, - 0x32, 0x73, 0xdc, 0x00, 0xf8, 0x64, 0x42, 0x88, 0x2e, 0xc1, 0xe3, 0x73, - 0x6b, 0x33, 0xd6, 0xde, 0x8e, 0x66, 0xb6, 0x66, 0x3b, 0x25, 0x77, 0xae, - 0xcc, 0x21, 0x95, 0x0a, 0x1b, 0x5e, 0x86, 0x1e, 0x2e, 0x7a, 0xd1, 0x2f, - 0xf9, 0x29, 0xd8, 0x07, 0x80, 0x74, 0x18, 0x20, 0x28, 0x64, 0x32, 0x38, - 0xc7, 0x02, 0x81, 0x63, 0x2f, 0x15, 0x5a, 0xce, 0x15, 0xa2, 0x0e, 0xd5, - 0xc1, 0x49, 0x7f, 0x4d, 0xf6, 0xa0, 0xb1, 0x47, 0xd3, 0x66, 0x97, 0x61, - 0x7e, 0xa7, 0x38, 0xc5, 0x46, 0x0e, 0x67, 0x1e, 0x71, 0xea, 0xed, 0x07, - 0x84, 0xd8, 0x63, 0x5d, 0x64, 0xa3, 0x33, 0x0a, 0x7b, 0xe2, 0x69, 0x8d, - 0x46, 0x49, 0x07, 0x14, 0x3e, 0x24, 0x34, 0x0d, 0x19, 0x20, 0xfc, 0xaa, - 0x45, 0xe1, 0x6c, 0x46, 0x6d, 0x48, 0x29, 0xdc, 0x37, 0xd0, 0xb4, 0x25, - 0xf4, 0x71, 0x31, 0x1b, 0x5e, 0x28, 0x74, 0x8a, 0xc7, 0xef, 0x22, 0xe7, - 0xa5, 0x6c, 0x70, 0x1a, 0xe5, 0xd8, 0x13, 0x0a, 0x53, 0x89, 0x6f, 0xe1, - 0x56, 0x4e, 0x83, 0x9c, 0xf2, 0xa4, 0x1d, 0xd8, 0xf2, 0xb3, 0x27, 0xc5, - 0x3f, 0x40, 0x7d, 0xa1, 0x8d, 0x47, 0x54, 0x31, 0xfa, 0x8c, 0x72, 0x5c, - 0x71, 0xa1, 0x3d, 0x46, 0x14, 0xb4, 0xb6, 0x63, 0x55, 0x3b, 0xfd, 0x8d, - 0x37, 0x32, 0xc9, 0xcb, 0x8e, 0xfb, 0x99, 0x08, 0x58, 0x27, 0x86, 0xd2, - 0xcb, 0x14, 0x4a, 0xb1, 0x61, 0xef, 0x7d, 0x34, 0x2a, 0xf6, 0x11, 0xbc, - 0x9a, 0xee, 0xee, 0x6f, 0xf6, 0x70, 0x58, 0xa4, 0x23, 0x7a, 0xd9, 0xac, - 0xdf, 0x3d, 0x52, 0x7c, 0x57, 0x64, 0x1a, 0x13, 0x1c, 0x78, 0x52, 0x69, - 0x70, 0x3d, 0x67, 0x91, 0x00, 0x92, 0xc6, 0xf4, 0x55, 0xb4, 0x4e, 0xb0, - 0x74, 0x8a, 0x8f, 0x46, 0x43, 0x4e, 0xf3, 0x66, 0x2f, 0x42, 0x7c, 0xba, - 0x99, 0xd2, 0xd3, 0x66, 0x94, 0x44, 0x57, 0x71, 0x23, 0x6c, 0xd4, 0x80, - 0xb2, 0x0d, 0x15, 0x0b, 0x40, 0xed, 0xcc, 0xd6, 0x48, 0x0d, 0xb6, 0x25, - 0x41, 0x4e, 0x22, 0xc9, 0x28, 0x33, 0xf5, 0x5e, 0x6c, 0x0d, 0x9f, 0xfb, - 0x5e, 0xd0, 0x19, 0x18, 0xf7, 0x62, 0xfb, 0x99, 0x6f, 0x9b, 0xe0, 0x3e, - 0x95, 0xa7, 0x15, 0xd8, 0x2c, 0x47, 0x44, 0x0e, 0xab, 0x49, 0x45, 0xb8, - 0x2b, 0x05, 0xb4, 0xf1, 0xe9, 0xcd, 0xe0, 0x23, 0x00, 0x11, 0xdf, 0xe6, - 0x0b, 0xab, 0x7b, 0xcd, 0xa8, 0xec, 0xbf, 0x82, 0x2b, 0x88, 0x07, 0xad, - 0xa2, 0x1e, 0xda, 0xab, 0xf6, 0xe1, 0xfb, 0xc4, 0x57, 0xd1, 0xe1, 0x50, - 0xa1, 0xda, 0xde, 0xb2, 0x5f, 0xfa, 0xbe, 0xa6, 0xff, 0x68, 0x57, 0x85, - 0x3d, 0xd6, 0x41, 0x22, 0x3e, 0x18, 0x9b, 0xf7, 0x45, 0xa3, 0xd2, 0x1b, - 0x5a, 0x0f, 0x75, 0x01, 0x25, 0xbf, 0xb3, 0x7d, 0x61, 0xa9, 0x74, 0x6f, - 0x8d, 0xd2, 0x52, 0xb4, 0x84, 0x4a, 0x64, 0x22, 0x27, 0xcb, 0xdd, 0xfe, - 0x5d, 0xfc, 0x4a, 0xd1, 0xe9, 0x22, 0xa3, 0x83, 0x6c, 0x6f, 0x19, 0x82, - 0xb7, 0xbf, 0x3f, 0xeb, 0xad, 0x8c, 0x98, 0x74, 0x3d, 0xb5, 0x92, 0xb2, - 0x60, 0xff, 0x81, 0xf8, 0x9f, 0x75, 0x31, 0xe8, 0xda, 0x67, 0xfc, 0xf5, - 0x2c, 0x46, 0x86, 0xbb, 0xf8, 0x40, 0x6c, 0x9b, 0x66, 0x0d, 0xde, 0x55, - 0xf4, 0x3a, 0x41, 0x56, 0xbc, 0x26, 0x64, 0xf6, 0xa5, 0xd4, 0x4d, 0x6b, - 0x5d, 0x84, 0x2e, 0x87, 0xc3, 0x44, 0x30, 0xbc, 0xf6, 0x4b, 0x2b, 0x19, - 0x5e, 0x53, 0xc6, 0x25, 0x58, 0x21, 0x00, 0x56, 0xcb, 0x49, 0x3d, 0x0c, - 0x00, 0xbe, 0x1c, 0xf2, 0x1d, 0xfe, 0x60, 0x95, 0x76, 0x63, 0x13, 0xc8, - 0x25, 0x1f, 0x1f, 0x61, 0xe4, 0xde, 0x84, 0xb7, 0xb4, 0x11, 0xbb, 0xc0, - 0x1d, 0xca, 0x1f, 0x1b, 0x80, 0xd8, 0xfe, 0xb9, 0xa3, 0xa8, 0x19, 0x0b, - 0x95, 0x53, 0x8c, 0x53, 0x9e, 0xbc, 0x81, 0xc2, 0xc7, 0x0f, 0x2b, 0xe0, - 0x56, 0xf6, 0x51, 0x34, 0xcc, 0x0b, 0x07, 0x29, 0x0b, 0x55, 0x69, 0x81, - 0x7d, 0x19, 0x4f, 0x46, 0x57, 0x2c, 0x28, 0xa0, 0x6e, 0x09, 0x1f, 0xf7, - 0x85, 0xc0, 0x75, 0x27, 0xa1, 0x7c, 0x6a, 0x3c, 0xe1, 0x5c, 0xa1, 0x2a, - 0x66, 0x5b, 0xb9, 0x7d, 0xc8, 0xe3, 0xee, 0x59, 0x94, 0xb0, 0x11, 0x23, - 0x75, 0xbc, 0xe4, 0x5f, 0x9d, 0x25, 0x02, 0x35, 0x70, 0xee, 0x3f, 0xe3, - 0x3d, 0x21, 0x66, 0xcd, 0x6a, 0x7d, 0x7b, 0xde, 0xa3, 0xea, 0x27, 0x5b, - 0x51, 0x9d, 0x94, 0x78, 0xcb, 0xe7, 0x3a, 0xa1, 0x6c, 0x5b, 0x97, 0xc7, - 0x98, 0x5c, 0x3a, 0x29, 0x2a, 0x2a, 0x61, 0x30, 0x6a, 0xdf, 0xf2, 0x82, - 0xa5, 0x76, 0x5c, 0xa3, 0x40, 0x87, 0x44, 0x77, 0xf1, 0x9c, 0x2b, 0x91, - 0x53, 0x48, 0x67, 0x29, 0xf4, 0xb7, 0x47, 0xef, 0xa7, 0x31, 0x26, 0xb6, - 0xc5, 0xc8, 0xd1, 0xac, 0xf9, 0x6a, 0x88, 0x39, 0x9a, 0x37, 0xd5, 0x1e, - 0xeb, 0x11, 0xe2, 0xd4, 0x55, 0x7f, 0x6c, 0x08, 0x77, 0xcf, 0xa2, 0x93, - 0x15, 0x9b, 0xf8, 0xf9, 0x46, 0x2b, 0x0e, 0xc2, 0xa9, 0xcf, 0xc3, 0x31, - 0x73, 0x71, 0x57, 0x1a, 0x66, 0x95, 0xde, 0x51, 0x64, 0x7d, 0x14, 0x9b, - 0x8d, 0xe6, 0x11, 0xce, 0xd5, 0xa2, 0x49, 0x5f, 0x0b, 0xa6, 0xf9, 0xda, - 0x48, 0xa2, 0x50, 0x2e, 0x39, 0x89, 0x04, 0xcf, 0x20, 0x63, 0xf4, 0xc8, - 0x7a, 0xa4, 0x48, 0x0d, 0x58, 0x5d, 0x30, 0xe4, 0x4d, 0x06, 0x02, 0x87, - 0xe4, 0x5e, 0x66, 0xf2, 0xe8, 0xeb, 0x38, 0x00, 0x7a, 0xdf, 0xc1, 0xc5, - 0x97, 0x63, 0xbf, 0xe0, 0xdf, 0x0c, 0xcc, 0xbb, 0x47, 0xa5, 0x24, 0x14, - 0x29, 0xc8, 0x28, 0x8b, 0xe3, 0x57, 0x45, 0xd5, 0x8d, 0xe4, 0xd9, 0x7b, - 0x4a, 0x7f, 0x3a, 0x5c, 0xf1, 0x25, 0xe2, 0x27, 0x5a, 0xe2, 0xed, 0x7a, - 0x5b, 0x5a, 0x26, 0x2c, 0xa4, 0xdc, 0x8d, 0x0b, 0xc0, 0x89, 0x98, 0xff, - 0x55, 0x1d, 0x4b, 0xa1, 0x5d, 0x2a, 0x6b, 0x4f, 0x10, 0x91, 0x7d, 0xd5, - 0x9f, 0x33, 0xa5, 0x08, 0x9d, 0x7f, 0x0e, 0x6f, 0x36, 0xa6, 0x13, 0x4f, - 0x05, 0x7f, 0x47, 0xf3, 0x23, 0x27, 0x70, 0xe6, 0x3a, 0xd1, 0x9e, 0x25, - 0x17, 0xf8, 0x77, 0x68, 0xec, 0x91, 0x43, 0x30, 0x75, 0xdd, 0x4b, 0xdc, - 0x49, 0x34, 0x7b, 0x49, 0x67, 0x0c, 0x56, 0xc5, 0x49, 0x5d, 0x31, 0xad, - 0xfd, 0x6b, 0x94, 0xe9, 0x42, 0x33, 0x9d, 0xd7, 0x38, 0xec, 0xc5, 0x6b, - 0xff, 0x64, 0x77, 0xa2, 0xd4, 0xfb, 0x89, 0x97, 0x99, 0x7c, 0x38, 0x96, - 0xc4, 0xa0, 0xc5, 0x79, 0x37, 0x4c, 0xfa, 0xb7, 0xf5, 0x18, 0x20, 0x99, - 0x8f, 0x8d, 0x33, 0x54, 0xe9, 0xed, 0x45, 0x6e, 0x49, 0xad, 0x74, 0xe6, - 0x0f, 0x7d, 0xbe, 0x79, 0x8f, 0xce, 0xac, 0xea, 0xf6, 0x20, 0xf0, 0x39, - 0x8b, 0x1d, 0x63, 0x13, 0xad, 0x2a, 0x16, 0xc0, 0xab, 0x4f, 0x59, 0x00, - 0x3e, 0xe2, 0x5a, 0xd1, 0xd1, 0xd5, 0xbd, 0xc9, 0x0f, 0x23, 0x3c, 0xe5, - 0xc4, 0x22, 0xb6, 0xbd, 0x66, 0x6d, 0x0c, 0x2d, 0x37, 0x6f, 0x77, 0x96, - 0xf7, 0x89, 0xe8, 0x95, 0x82, 0x4c, 0x4c, 0x7f, 0x5d, 0x1b, 0x2a, 0x5e, - 0x6d, 0x4a, 0x85, 0xb7, 0x0b, 0x70, 0x50, 0x10, 0xd5, 0xa3, 0xb5, 0x10, - 0x43, 0x1a, 0x34, 0x32, 0x71, 0x55, 0xca, 0x41, 0x7d, 0x05, 0x46, 0x92, - 0x83, 0x78, 0x84, 0x45, 0x69, 0xb0, 0x9c, 0x75, 0x75, 0xe5, 0x18, 0x22, - 0x52, 0xf9, 0x0b, 0x44, 0x6f, 0x78, 0x79, 0x0a, 0xf8, 0x1c, 0x06, 0x73, - 0xe1, 0x97, 0x5f, 0xca, 0xf5, 0x33, 0x4a, 0x76, 0x25, 0x5f, 0x91, 0xb0, - 0x44, 0x67, 0x0b, 0xb0, 0xc4, 0x4c, 0x46, 0xde, 0xe0, 0x20, 0x93, 0xb8, - 0xe3, 0x99, 0x7a, 0x84, 0xeb, 0x3e, 0x5a, 0xdb, 0xa6, 0x88, 0x0a, 0x9b, - 0xf8, 0xf5, 0xa4, 0xdd, 0x95, 0xb5, 0x74, 0xbd, 0x4d, 0x83, 0x2f, 0xe9, - 0x86, 0x16, 0xd8, 0x37, 0xdb, 0x26, 0x87, 0x1e, 0x63, 0xd3, 0xd1, 0x30, - 0x5b, 0xea, 0xc0, 0xa1, 0x5b, 0xa6, 0xb2, 0x8c, 0xf0, 0xf8, 0xd5, 0x21, - 0xda, 0xde, 0xd8, 0x59, 0x4c, 0x80, 0x57, 0x27, 0xf2, 0xb5, 0x44, 0xe4, - 0xe5, 0xca, 0x6d, 0x30, 0x9d, 0x9a, 0x79, 0xda, 0xa6, 0x9e, 0xa1, 0x6b, - 0x40, 0x22, 0x93, 0x0a, 0x11, 0xe6, 0x68, 0x13, 0x36, 0xf2, 0x09, 0xc5, - 0x31, 0x44, 0x7d, 0x6b, 0x41, 0xbf, 0x94, 0x9e, 0xd5, 0x2f, 0x5a, 0xbd, - 0x89, 0x82, 0x20, 0x5a, 0x67, 0x84, 0x0c, 0x57, 0xa5, 0x33, 0xf3, 0x30, - 0x09, 0x69, 0xcd, 0xe9, 0x29, 0x15, 0xca, 0x73, 0x78, 0xea, 0xa2, 0xbd, - 0x6d, 0xcc, 0xb4, 0x3c, 0xe6, 0x33, 0x90, 0xd8, 0x9e, 0xfa, 0x8c, 0x49, - 0x78, 0x09, 0x71, 0x0c, 0x3d, 0xda, 0xb8, 0xf3, 0xbf, 0x77, 0x6a, 0xa8, - 0x4a, 0x99, 0x40, 0xb3, 0x11, 0xf4, 0x50, 0xfd, 0x43, 0xae, 0x95, 0xf4, - 0xfd, 0x9b, 0x2a, 0xd0, 0x18, 0x06, 0xc6, 0xc2, 0xa8, 0x59, 0x79, 0x66, - 0x55, 0xdc, 0xbc, 0x6b, 0x2c, 0x89, 0x95, 0xaa, 0x6d, 0x96, 0x9e, 0x73, - 0x0e, 0xbe, 0xc4, 0xe4, 0x54, 0xc8, 0xc1, 0x3b, 0x7b, 0x0f, 0xc8, 0x3a, - 0x19, 0x48, 0xce, 0xf2, 0x1b, 0xd4, 0xb5, 0x78, 0xa5, 0xfb, 0x5a, 0xe7, - 0xc1, 0xd5, 0xbd, 0x9c, 0x1d, 0x7d, 0x9c, 0xb9, 0xfb, 0x94, 0x12, 0xe4, - 0x4d, 0xbf, 0x9e, 0xee, 0x53, 0x32, 0x97, 0x0e, 0x35, 0xf7, 0x88, 0x3c, - 0x05, 0xa9, 0x67, 0xc3, 0x7d, 0x0e, 0x30, 0xb7, 0x1e, 0xa8, 0x50, 0x94, - 0x31, 0x51, 0x49, 0x97, 0x8f, 0x7b, 0x2f, 0x52, 0x70, 0x7f, 0x7c, 0xaf, - 0xf8, 0xa6, 0x20, 0x8b, 0x3e, 0xf1, 0x3c, 0xf4, 0xab, 0xe4, 0x18, 0x1d, - 0x45, 0xeb, 0xb8, 0x88, 0x2f, 0x8a, 0x90, 0xd1, 0xb8, 0xc5, 0xab, 0xe6, - 0x9e, 0x53, 0x74, 0x66, 0x7e, 0xc2, 0x28, 0x78, 0x1b, 0x13, 0x0b, 0x36, - 0x73, 0xe9, 0x98, 0xc9, 0xdd, 0xe6, 0x71, 0x84, 0x77, 0xeb, 0x8c, 0xeb, - 0x65, 0x76, 0x55, 0xf6, 0xf2, 0xaf, 0xb0, 0x05, 0xd2, 0xc3, 0x2a, 0xc9, - 0x37, 0xd9, 0x34, 0x51, 0x16, 0xa1, 0x1b, 0x85, 0x14, 0x73, 0x74, 0x2a, - 0x97, 0x2f, 0x5b, 0x14, 0x53, 0x51, 0xad, 0x74, 0x1f, 0xf7, 0x3b, 0x81, - 0xad, 0x46, 0xec, 0x43, 0x91, 0x0c, 0x40, 0x93, 0xe3, 0x61, 0x0a, 0xd1, - 0x6b, 0x0d, 0xb2, 0x66, 0x0e, 0x25, 0xd9, 0x54, 0xa4, 0xed, 0xd5, 0x29, - 0xde, 0x3e, 0xfb, 0xee, 0x25, 0x28, 0x7b, 0xb2, 0xf6, 0x2e, 0xfc, 0x65, - 0xbf, 0x06, 0xf0, 0xae, 0xa5, 0x0e, 0xf1, 0xea, 0xcc, 0x5d, 0x9c, 0x8f, - 0xd2, 0x44, 0x1f, 0x7f, 0xe4, 0x50, 0x27, 0x03, 0x17, 0x54, 0xf3, 0x37, - 0xcf, 0x7b, 0x2d, 0xda, 0xe5, 0xb5, 0xdd, 0x3d, 0xae, 0xa2, 0x95, 0x9c, - 0x58, 0xbc, 0x5f, 0x24, 0x39, 0x96, 0x1b, 0xf6, 0xdc, 0x3a, 0xf7, 0xf8, - 0x6d, 0xef, 0x6b, 0xd6, 0x68, 0x05, 0x2f, 0x01, 0xfa, 0x0d, 0x4f, 0x35, - 0x3f, 0x17, 0x49, 0x03, 0xb2, 0x25, 0x71, 0xbf, 0xa3, 0xa4, 0xa2, 0xe2, - 0x16, 0x8c, 0x02, 0xe0, 0x99, 0x68, 0x87, 0x16, 0x22, 0x61, 0xce, 0xd2, - 0xc0, 0xc9, 0x67, 0xb9, 0x7c, 0xb6, 0xc4, 0x58, 0xc5, 0x0a, 0xae, 0xcc, - 0x38, 0x52, 0xae, 0x0b, 0xc0, 0xc8, 0xad, 0x14, 0xaa, 0x58, 0xb4, 0x5f, - 0x1e, 0xc0, 0xef, 0xfa, 0x08, 0x5a, 0x28, 0x2b, 0xae, 0xb3, 0x77, 0x2b, - 0xf3, 0x9d, 0xfd, 0xb4, 0xdf, 0x09, 0x46, 0xba, 0x59, 0xa6, 0xc4, 0x80, - 0xb1, 0x80, 0x91, 0xac, 0x5e, 0x47, 0x2f, 0xc8, 0xa8, 0x96, 0x26, 0x54, - 0xb6, 0xe9, 0x97, 0x3c, 0x50, 0x69, 0x5d, 0x7f, 0x15, 0xfb, 0x78, 0x5b, - 0x33, 0xcd, 0x39, 0x38, 0x6e, 0xb4, 0x08, 0xac, 0x2a, 0xcf, 0xc5, 0x8a, - 0x69, 0x73, 0xe7, 0xab, 0x5a, 0xb4, 0xca, 0x63, 0xf8, 0xe5, 0x77, 0xf8, - 0xeb, 0x06, 0xff, 0xf1, 0x6a, 0x1d, 0xdc, 0x02, 0xb9, 0x98, 0x66, 0x05, - 0xb1, 0xc6, 0x35, 0x7f, 0xce, 0xcb, 0x13, 0x4f, 0x99, 0x39, 0x76, 0x9b, - 0xe5, 0x8f, 0xed, 0x8a, 0x44, 0x82, 0xd4, 0x79, 0xee, 0x75, 0x0e, 0x11, - 0x3b, 0x35, 0xab, 0xf1, 0xa1, 0x6a, 0x4b, 0xa4, 0x89, 0x86, 0x2f, 0x14, - 0xcc, 0xd0, 0x68, 0x91, 0xb3, 0x41, 0xc4, 0x5a, 0xc0, 0x4e, 0x67, 0x55, - 0x65, 0x8f, 0xc4, 0x56, 0xf9, 0xb8, 0x63, 0x75, 0x17, 0x0f, 0x9c, 0xd8, - 0xeb, 0xe3, 0xda, 0x0a, 0xd6, 0x8c, 0xcb, 0x4f, 0x62, 0x9a, 0x07, 0xad, - 0x71, 0x2b, 0xc3, 0x08, 0xaf, 0x26, 0x05, 0x8f, 0x8f, 0x67, 0xaf, 0x68, - 0x8e, 0xb1, 0xca, 0x19, 0x83, 0x96, 0xc5, 0xed, 0x4a, 0xe1, 0xc6, 0x22, - 0x7c, 0xf4, 0xe2, 0x13, 0xc8, 0x13, 0xcc, 0x35, 0xbe, 0x40, 0xc4, 0xfb, - 0xfa, 0xdc, 0xf8, 0x26, 0xe7, 0x6d, 0xa3, 0x7a, 0x9f, 0x39, 0x84, 0x2c, - 0x4a, 0x74, 0x34, 0x4d, 0x2c, 0x43, 0x62, 0xb9, 0xb4, 0x32, 0x9a, 0x38, - 0x29, 0xdb, 0xa6, 0xc6, 0xee, 0x1f, 0x46, 0xff, 0x81, 0xcf, 0x9d, 0x8d, - 0xb4, 0xb1, 0xf9, 0x5b, 0xb1, 0x83, 0xc0, 0xc6, 0x50, 0xb2, 0x17, 0xd6, - 0x5a, 0x9d, 0xcf, 0x16, 0xee, 0x03, 0xd0, 0x28, 0xde, 0xb9, 0x2e, 0x1f, - 0x6b, 0x90, 0xf0, 0x03, 0x5a, 0x11, 0xcf, 0x1c, 0x9a, 0x1f, 0x9f, 0x1f, - 0xce, 0x49, 0x7d, 0x67, 0xec, 0x30, 0x8d, 0x13, 0x5e, 0x3f, 0x19, 0x14, - 0x17, 0xf9, 0xb9, 0x6d, 0xf2, 0x2c, 0xfc, 0xe1, 0x91, 0x61, 0x51, 0x6b, - 0x2d, 0x42, 0x8a, 0x00, 0xad, 0xc9, 0xd2, 0x90, 0x29, 0x00, 0xe1, 0xf2, - 0x4a, 0x51, 0x60, 0x69, 0x31, 0x0a, 0x45, 0x14, 0xd5, 0x15, 0xc9, 0x74, - 0x64, 0x42, 0xaf, 0x2a, 0x6c, 0x5e, 0xaf, 0xc6, 0x85, 0x41, 0x2b, 0xdb, - 0x93, 0x7a, 0xbd, 0xa0, 0x06, 0x32, 0xcc, 0x73, 0xd8, 0xcc, 0x25, 0x44, - 0x0b, 0xae, 0x67, 0xa4, 0x72, 0x64, 0x3d, 0x65, 0x5e, 0xa3, 0xa4, 0x90, - 0x3d, 0x91, 0x9e, 0xf9, 0x8e, 0xcc, 0x67, 0x60, 0xda, 0x06, 0xc6, 0x41, - 0xb9, 0x7b, 0x0c, 0x09, 0x42, 0xef, 0x66, 0x39, 0x77, 0x11, 0xfd, 0xef, - 0x7f, 0xa8, 0xed, 0xc9, 0x21, 0x86, 0x97, 0xaf, 0xcb, 0x4f, 0x4c, 0xfb, - 0xd6, 0x8f, 0xc5, 0x70, 0xa5, 0x5e, 0xdb, 0xad, 0xd2, 0xef, 0xaf, 0x9d, - 0xef, 0xeb, 0x21, 0xe2, 0x9c, 0x28, 0x4d, 0xfd, 0x8d, 0xef, 0x74, 0x5e, - 0x2e, 0xec, 0x39, 0x59, 0x87, 0x87, 0xcd, 0x86, 0x22, 0x94, 0xc6, 0x0a, - 0xcb, 0x67, 0x29, 0x8a, 0xf9, 0xac, 0x89, 0x6f, 0x86, 0x15, 0x29, 0x9b, - 0xfa, 0xf5, 0x32, 0xac, 0x7f, 0x70, 0xe8, 0x64, 0xbe, 0x1c, 0xba, 0xdb, - 0xc9, 0x72, 0xac, 0xaa, 0x2b, 0x6e, 0x72, 0x67, 0x31, 0xf3, 0xa9, 0x6d, - 0x1d, 0xd6, 0xbb, 0x48, 0xd4, 0x84, 0x6e, 0x37, 0xb5, 0xa5, 0x51, 0x92, - 0xb0, 0x09, 0xff, 0x1e, 0x36, 0xcc, 0xa2, 0x00, 0xc9, 0x74, 0x0f, 0x3b, - 0x65, 0x73, 0x5c, 0x29, 0xf7, 0x7a, 0xae, 0x8c, 0x18, 0xf9, 0x32, 0xf9, - 0xd9, 0x86, 0x50, 0x66, 0xa9, 0x2b, 0xa4, 0x16, 0xde, 0x40, 0x1a, 0xdd, - 0x57, 0xd7, 0x3f, 0x2b, 0xed, 0x4d, 0x67, 0x3c, 0x9d, 0xee, 0x96, 0x27, - 0xf8, 0xa2, 0x05, 0xe6, 0xaf, 0xdb, 0x21, 0x12, 0x1e, 0x8b, 0x9f, 0xba, - 0x48, 0x1a, 0xe5, 0x25, 0xf6, 0xd8, 0x1c, 0x80, 0x49, 0xd0, 0xb5, 0x96, - 0x21, 0x18, 0x30, 0x9c, 0x3a, 0x1f, 0x0c, 0xec, 0x50, 0x1f, 0x3d, 0x02, - 0xf9, 0x82, 0x87, 0xaa, 0xac, 0xbc, 0xe6, 0x95, 0x20, 0x17, 0x99, 0x01, - 0x91, 0x9b, 0x15, 0x4a, 0x76, 0x74, 0x8f, 0xa2, 0xe3, 0xf5, 0x33, 0xd8, - 0xb2, 0x45, 0xaf, 0x7a, 0x0e, 0x66, 0x30, 0x1e, 0xe7, 0x21, 0xa9, 0x5a, - 0xd6, 0x3e, 0x40, 0x20, 0x38, 0xc0, 0x12, 0x48, 0xba, 0x17, 0xcc, 0x16, - 0x08, 0x30, 0xe5, 0x1c, 0xbc, 0x10, 0x2e, 0xbc, 0x56, 0xfb, 0x2a, 0x95, - 0xc8, 0x94, 0xb9, 0x65, 0x3d, 0x9c, 0x68, 0x59, 0x97, 0x53, 0xc1, 0xc5, - 0x30, 0x3f, 0x60, 0xfc, 0x07, 0x79, 0xe8, 0x3e, 0xb6, 0x6d, 0x5a, 0x64, - 0x2d, 0x9e, 0x8f, 0xf3, 0x11, 0xc1, 0x2d, 0xa1, 0x38, 0xfa, 0x46, 0x37, - 0xf8, 0x4f, 0x5b, 0x29, 0xc9, 0xb9, 0xe2, 0x0a, 0xf8, 0xea, 0xd8, 0xe7, - 0xc9, 0xe8, 0x32, 0xdf, 0xfe, 0x2a, 0x9b, 0xa4, 0x39, 0x7a, 0x91, 0x84, - 0x5e, 0xd3, 0x3d, 0xa3, 0x2a, 0x82, 0x3c, 0x1f, 0xe7, 0x96, 0x87, 0x7a, - 0x27, 0xa7, 0xa1, 0x34, 0x1c, 0x48, 0x76, 0xa6, 0xb2, 0x8c, 0x04, 0xd5, - 0xb9, 0x05, 0x3a, 0xa6, 0x91, 0xd3, 0xce, 0xf0, 0xcc, 0xb9, 0x2d, 0x14, - 0xb3, 0x90, 0x4b, 0xaf, 0x44, 0x18, 0x6c, 0x4a, 0x94, 0xd2, 0x33, 0x90, - 0x62, 0xe0, 0xe0, 0xf7, 0x4c, 0x66, 0x84, 0x95, 0x09, 0x00, 0xc4, 0xbf, - 0xdd, 0x7a, 0x3b, 0xf1, 0xec, 0xde, 0x0c, 0x9b, 0x41, 0x8c, 0xbf, 0x9a, - 0x2d, 0x16, 0x1f, 0x0f, 0xb3, 0x32, 0x55, 0x37, 0x3f, 0xbb, 0x4d, 0x9e, - 0x1c, 0x9f, 0x7f, 0xf4, 0xcd, 0xf0, 0xfd, 0xa9, 0xa1, 0x1d, 0x0c, 0xa8, - 0xee, 0x03, 0x0e, 0x86, 0x8e, 0x62, 0xba, 0xcf, 0x58, 0x96, 0x66, 0xa1, - 0xf9, 0xd3, 0x61, 0xce, 0xd6, 0xe1, 0x40, 0x3f, 0x88, 0x66, 0x33, 0xed, - 0x5a, 0x90, 0x10, 0xac, 0x7d, 0x9b, 0x04, 0xcd, 0x03, 0x42, 0x25, 0xa2, - 0xc2, 0xf2, 0xf2, 0x40, 0xf0, 0xb9, 0x82, 0x66, 0xa1, 0xa8, 0x6e, 0xe5, - 0xa2, 0x68, 0xd7, 0x92, 0xc9, 0x74, 0xa1, 0x43, 0x3d, 0x88, 0x6b, 0x89, - 0xf6, 0x96, 0x3a, 0x8d, 0x4f, 0xb7, 0xbe, 0x10, 0x4c, 0x7f, 0x0f, 0xc9, - 0x87, 0x0c, 0x63, 0x11, 0x31, 0xb0, 0xe4, 0x07, 0x84, 0x56, 0x35, 0xed, - 0x9d, 0xf1, 0xf4, 0xcd, 0x5a, 0x8c, 0xb7, 0xac, 0xaa, 0x79, 0x80, 0x7e, - 0x35, 0x25, 0xb8, 0x79, 0xbb, 0x26, 0xce, 0x16, 0x12, 0x21, 0x90, 0xd9, - 0xde, 0x19, 0x12, 0x98, 0xff, 0x8d, 0x8e, 0xd7, 0x41, 0x06, 0x42, 0xa2, - 0x58, 0x6d, 0x32, 0xa5, 0x86, 0x0c, 0x58, 0x81, 0x00, 0xac, 0x86, 0xc7, - 0x65, 0xef, 0xb8, 0x00, 0x8b, 0x90, 0xbe, 0xd9, 0x20, 0x83, 0x27, 0xd1, - 0xc1, 0xb6, 0x18, 0x4f, 0x11, 0x8c, 0x04, 0x0a, 0x5b, 0x7e, 0x72, 0xa7, - 0x50, 0x08, 0x51, 0x12, 0x7a, 0x45, 0x87, 0x01, 0xb1, 0x2d, 0x8b, 0xf2, - 0x12, 0x13, 0xfa, 0x05, 0x90, 0xd4, 0x03, 0x9e, 0xca, 0x4f, 0xc7, 0x8e, - 0x82, 0x4f, 0x40, 0x83, 0x8c, 0x27, 0x23, 0x0c, 0xab, 0x7f, 0x0d, 0x24, - 0x9a, 0xad, 0x91, 0xcc, 0x58, 0xbd, 0x37, 0x23, 0x0a, 0xa9, 0xab, 0x25, - 0x72, 0x0a, 0x16, 0x82, 0x9e, 0x38, 0xd7, 0x75, 0x69, 0xab, 0xc3, 0x42, - 0xc4, 0x4c, 0xd6, 0xd9, 0xe3, 0xfe, 0x57, 0xed, 0xa0, 0xcc, 0x59, 0xd9, - 0x0e, 0x82, 0x7a, 0x29, 0x7e, 0xad, 0x6b, 0x7c, 0xf9, 0x74, 0x40, 0x74, - 0xdd, 0xe4, 0x85, 0x31, 0x65, 0x31, 0x6c, 0x0c, 0x0a, 0xe0, 0x62, 0x1a, - 0x19, 0x40, 0xcc, 0x27, 0xd0, 0x22, 0x4d, 0xfe, 0x68, 0x3e, 0xc0, 0xb2, - 0x64, 0xbf, 0xb2, 0x4b, 0x13, 0x94, 0x10, 0x51, 0xa6, 0x97, 0x68, 0x03, - 0x53, 0xa3, 0x9f, 0x45, 0x42, 0x5e, 0x57, 0x6b, 0x8c, 0xdb, 0x2f, 0x81, - 0xcd, 0xa4, 0x89, 0x32, 0x08, 0x0e, 0x3c, 0x97, 0x52, 0xeb, 0xf0, 0xa2, - 0x9a, 0xeb, 0x30, 0xae, 0xc8, 0x18, 0xa0, 0xc1, 0xbb, 0x78, 0x10, 0x89, - 0xff, 0xeb, 0x20, 0xa0, 0xdb, 0x3d, 0xa8, 0xd8, 0xf2, 0x03, 0xda, 0x9d, - 0x8f, 0x31, 0xfe, 0x51, 0x53, 0x95, 0x78, 0x09, 0xbf, 0x75, 0x53, 0xb1, - 0xc2, 0xa3, 0x86, 0x4e, 0xca, 0x06, 0x24, 0x85, 0xcb, 0xd0, 0xe5, 0xe5, - 0xaa, 0x13, 0xde, 0xec, 0x9a, 0xb1, 0x9b, 0x10, 0x27, 0xd3, 0x72, 0xaf, - 0x6a, 0xa1, 0x68, 0x6f, 0x0e, 0x0b, 0x14, 0x24, 0x94, 0x57, 0x01, 0x77, - 0x5b, 0x8d, 0xdb, 0x6d, 0xba, 0xb8, 0x4a, 0xc8, 0xaa, 0x6d, 0x6c, 0xb9, - 0x72, 0x43, 0x23, 0xb3, 0xb0, 0x42, 0x87, 0x91, 0x56, 0x0e, 0x7b, 0x26, - 0xf7, 0x92, 0x97, 0x5c, 0x1e, 0x0d, 0xd9, 0x1a, 0x12, 0xe7, 0x8d, 0xce, - 0x0e, 0xf2, 0xd0, 0x13, 0xac, 0xf6, 0x5f, 0x60, 0xc4, 0x7e, 0x26, 0x10, - 0x19, 0x4b, 0xdd, 0x7f, 0x42, 0x1b, 0xfa, 0xee, 0x72, 0xbe, 0x44, 0xa6, - 0xe3, 0x4d, 0x65, 0xcc, 0xb1, 0xd8, 0xa1, 0x44, 0x04, 0xff, 0xaf, 0xe8, - 0x5e, 0xdc, 0xa8, 0x4a, 0x47, 0x8d, 0x00, 0x43, 0x6e, 0x91, 0xff, 0xed, - 0x22, 0xe5, 0x6e, 0x85, 0x15, 0x3f, 0x01, 0x41, 0xda, 0x2f, 0xaa, 0x1c, - 0xbe, 0x48, 0x4c, 0x0c, 0x48, 0xf3, 0xb2, 0x6d, 0xce, 0xdd, 0xa3, 0x41, - 0x8f, 0x4d, 0x67, 0x20, 0x16, 0xb6, 0x86, 0xcd, 0x05, 0x68, 0xf4, 0x74, - 0x93, 0x3f, 0xdb, 0xc9, 0x15, 0x04, 0x85, 0x23, 0xc7, 0x34, 0xa5, 0x05, - 0xa3, 0x27, 0x08, 0x5e, 0xf1, 0x87, 0xc7, 0xcb, 0x07, 0xec, 0x5e, 0xc4, - 0x0e, 0xef, 0x23, 0x0f, 0xcf, 0x51, 0xd2, 0x9a, 0xe1, 0xb2, 0x58, 0x31, - 0x29, 0xa9, 0xe3, 0x33, 0x11, 0xd2, 0x31, 0x6c, 0x7c, 0x0c, 0x2f, 0xcb, - 0x58, 0x30, 0xc8, 0x25, 0xed, 0x03, 0x7a, 0x70, 0xe3, 0x6a, 0x91, 0x4b, - 0xd4, 0x13, 0x4d, 0x6a, 0x2b, 0xfb, 0x2c, 0xc7, 0x0e, 0x0c, 0xd6, 0x92, - 0x8e, 0x83, 0x6a, 0x9e, 0xe1, 0x79, 0x85, 0xf1, 0x6a, 0x91, 0xcd, 0xc7, - 0x4d, 0x20, 0x22, 0x39, 0x40, 0xcb, 0x11, 0x36, 0x4c, 0xd0, 0xbe, 0x5f, - 0xaf, 0xc0, 0xb6, 0x64, 0x94, 0xec, 0x90, 0xe3, 0x23, 0x77, 0xdf, 0x46, - 0x54, 0x84, 0xc8, 0xd3, 0xfc, 0xe8, 0x87, 0xd4, 0xf4, 0xd1, 0xa8, 0x54, - 0xa3, 0x5c, 0x06, 0xa5, 0xea, 0x05, 0xb3, 0x62, 0x6d, 0x82, 0x30, 0xe8, - 0xd4, 0x3f, 0xca, 0xaa, 0x54, 0xc5, 0x36, 0xa3, 0x8e, 0xe8, 0xa0, 0x17, - 0x38, 0x72, 0x4f, 0xc7, 0xaa, 0x85, 0x33, 0x08, 0x75, 0x7e, 0x1a, 0xc2, - 0x41, 0x8b, 0x3f, 0xa5, 0x97, 0xb1, 0x3b, 0x52, 0x64, 0x46, 0x66, 0x6b, - 0xf4, 0x8d, 0xf3, 0xe3, 0x16, 0x26, 0xf0, 0xc2, 0x8a, 0xee, 0x35, 0x1d, - 0x68, 0x2a, 0x24, 0x58, 0xcf, 0x92, 0x6a, 0xd3, 0x7e, 0x26, 0xc6, 0xf6, - 0xec, 0x47, 0x08, 0x69, 0xf6, 0x1e, 0x9b, 0x7b, 0x59, 0x2c, 0xac, 0x98, - 0x24, 0x7b, 0x68, 0x98, 0x95, 0x6e, 0xd9, 0xe2, 0x8d, 0xc6, 0x40, 0x6b, - 0xd5, 0x1e, 0xcd, 0x07, 0x16, 0xa7, 0x4f, 0x3c, 0x48, 0xb0, 0xc3, 0x2d, - 0xbb, 0xe0, 0x39, 0x11, 0xe3, 0x88, 0xd5, 0x7b, 0x8c, 0x25, 0xc2, 0x56, - 0x01, 0xb5, 0x45, 0x2f, 0xa9, 0x41, 0x1c, 0xc7, 0x4d, 0x94, 0x65, 0x62, - 0x3f, 0x07, 0xf0, 0x2e, 0x9a, 0x09, 0xf0, 0xe1, 0x3a, 0xf7, 0x7e, 0x16, - 0x23, 0x0f, 0xf6, 0xd1, 0x6b, 0xce, 0xde, 0x0b, 0x8b, 0xf8, 0xa9, 0x2f, - 0x7b, 0x94, 0x30, 0x10, 0x13, 0x3d, 0xa0, 0x39, 0x61, 0xcf, 0xba, 0xbc, - 0x4c, 0x22, 0x4f, 0x0d, 0xaa, 0x83, 0x24, 0x7c, 0x7c, 0x65, 0xcc, 0x92, - 0x84, 0xb8, 0xa8, 0x21, 0xb6, 0x0f, 0xd2, 0x5a, 0x63, 0xa5, 0x82, 0xcd, - 0x2d, 0x0f, 0x1e, 0x44, 0x97, 0xea, 0x0a, 0x0c, 0x76, 0x8b, 0x9b, 0x53, - 0xb2, 0x7d, 0xcb, 0xe4, 0x44, 0xf8, 0x95, 0x72, 0x09, 0x0b, 0xfd, 0x1f, - 0x44, 0x3d, 0xa5, 0xaf, 0xa8, 0xd5, 0x48, 0xe8, 0x38, 0x3e, 0x36, 0x91, - 0x8c, 0x99, 0x3c, 0x02, 0x35, 0xd8, 0x6b, 0xa8, 0x9e, 0xeb, 0x4a, 0x57, - 0x08, 0x40, 0x30, 0x69, 0xa4, 0x01, 0x5a, 0xf3, 0xeb, 0xa7, 0x08, 0xf1, - 0x40, 0xcb, 0x18, 0xe2, 0x7a, 0xfc, 0x60, 0x22, 0x16, 0x22, 0xfc, 0x2d, - 0x65, 0x98, 0x1e, 0xdb, 0xe7, 0xd9, 0xfe, 0x49, 0x40, 0x6e, 0xc4, 0x38, - 0x43, 0x36, 0x16, 0x74, 0x66, 0x9b, 0x03, 0xe1, 0xb8, 0x9e, 0x0d, 0x09, - 0x84, 0x8d, 0x72, 0x92, 0x22, 0xb8, 0xb1, 0x6b, 0xc1, 0x20, 0x66, 0xeb, - 0x83, 0x70, 0xc8, 0x49, 0x08, 0xa8, 0x20, 0x28, 0x05, 0x6c, 0xd0, 0xe3, - 0xf3, 0xed, 0xc1, 0x3e, 0x7e, 0xf0, 0x20, 0x4e, 0x65, 0x1e, 0xd6, 0x75, - 0x28, 0x50, 0x3e, 0xfc, 0x52, 0x12, 0x78, 0xdc, 0x40, 0x43, 0x6d, 0xb6, - 0xfa, 0x2f, 0x80, 0x86, 0x24, 0x5a, 0x57, 0x67, 0x2b, 0xef, 0xda, 0x77, - 0x52, 0x1d, 0x46, 0xf1, 0x55, 0x57, 0xd0, 0xb9, 0x56, 0xce, 0x63, 0x59, - 0xe0, 0x22, 0xa2, 0xe7, 0xa9, 0x50, 0xec, 0x10, 0x6c, 0x14, 0x1c, 0x08, - 0x28, 0x6a, 0x3c, 0x50, 0x45, 0xb0, 0x5d, 0xc7, 0x2a, 0x00, 0xcd, 0x91, - 0x7f, 0x62, 0xbc, 0x65, 0x9e, 0x22, 0xbb, 0xcf, 0x02, 0x6a, 0xe4, 0xda, - 0xa6, 0x51, 0xc1, 0x99, 0xa5, 0xa7, 0x23, 0x80, 0xde, 0x4d, 0xc5, 0xdf, - 0x6d, 0x31, 0xf9, 0x84, 0x2b, 0xff, 0x06, 0x00, 0x9b, 0x9f, 0xd0, 0x32, - 0x0b, 0x03, 0xdc, 0xce, 0x37, 0x11, 0x84, 0xc5, 0x56, 0xd1, 0x87, 0x9c, - 0x80, 0xf2, 0xe1, 0x76, 0x86, 0x55, 0x60, 0xf0, 0x03, 0x06, 0xe9, 0x13, - 0x8f, 0x6c, 0xdd, 0xf3, 0x63, 0x25, 0x19, 0x65, 0x03, 0xdb, 0x69, 0x2e, - 0x33, 0x1b, 0xf3, 0xe6, 0xa8, 0x4d, 0x20, 0xb7, 0x61, 0x4b, 0x89, 0xe3, - 0x14, 0xa7, 0x6c, 0xa0, 0x74, 0x30, 0x5d, 0x77, 0x10, 0xb6, 0x13, 0xd8, - 0xfd, 0x71, 0x5b, 0x71, 0x98, 0xc8, 0xac, 0xd2, 0x1c, 0xb9, 0xc5, 0x5d, - 0xf0, 0x5d, 0x83, 0xe4, 0xde, 0x4f, 0x83, 0xe5, 0x9a, 0xca, 0x2f, 0xb4, - 0xb5, 0xbb, 0x72, 0x0f, 0x5d, 0xf7, 0xe2, 0x6d, 0xd7, 0x54, 0xd5, 0xa0, - 0x6f, 0x07, 0xab, 0x41, 0x86, 0x7b, 0x7e, 0xd1, 0x5a, 0x38, 0xee, 0x54, - 0x13, 0x5e, 0x0d, 0x68, 0x10, 0xe0, 0x7f, 0x35, 0xe9, 0x52, 0x36, 0xb3, - 0x84, 0x38, 0xa1, 0xa5, 0x65, 0xed, 0x2f, 0x21, 0xfc, 0x08, 0x62, 0x21, - 0xc8, 0x17, 0xc6, 0xd4, 0x9e, 0xe7, 0x48, 0x12, 0x41, 0xc2, 0xbf, 0x6c, - 0xce, 0xb5, 0xe8, 0x8e, 0x61, 0x0d, 0x6c, 0xdd, 0x52, 0x2c, 0x47, 0xa5, - 0x2e, 0x0b, 0x64, 0x8c, 0x1f, 0xde, 0x21, 0xd7, 0x9f, 0x8c, 0xa7, 0x4d, - 0x4c, 0x74, 0x09, 0xb3, 0x6c, 0x93, 0xe7, 0x51, 0xbe, 0xb2, 0x61, 0x35, - 0xbc, 0x13, 0xee, 0x71, 0x7b, 0x6b, 0xbf, 0xf9, 0x6e, 0x8c, 0x87, 0x04, - 0xdb, 0x03, 0xa4, 0xb5, 0x00, 0x8a, 0x4e, 0xb1, 0x7f, 0x19, 0x35, 0xc0, - 0xf3, 0x25, 0xe1, 0xcb, 0x7f, 0xf9, 0x83, 0xcf, 0xba, 0xf8, 0x51, 0x83, - 0x56, 0x06, 0x02, 0x8d, 0x24, 0xc7, 0x44, 0xc1, 0xaf, 0x07, 0xe2, 0x65, - 0xee, 0x54, 0x3e, 0xc7, 0x88, 0xce, 0x57, 0xaf, 0x8e, 0xf8, 0x01, 0x17, - 0x35, 0x69, 0x70, 0xd4, 0xc2, 0x35, 0x5b, 0x74, 0x77, 0xaf, 0x8e, 0xb1, - 0xe3, 0x60, 0x91, 0x6b, 0x23, 0xe3, 0x04, 0x1f, 0x02, 0xf7, 0x89, 0xee, - 0x48, 0x1a, 0x94, 0x1f, 0x32, 0x86, 0xb7, 0xaf, 0xc4, 0xc9, 0xac, 0x90, - 0x8c, 0xf7, 0x7d, 0x76, 0xb1, 0x8a, 0x44, 0xf2, 0x6f, 0xc9, 0xfc, 0x46, - 0x6f, 0xad, 0x2c, 0x56, 0x2a, 0x62, 0x5e, 0x6f, 0x51, 0x9e, 0xe9, 0xf8, - 0xb4, 0xdc, 0x33, 0xa0, 0xea, 0x70, 0xbe, 0x40, 0x7b, 0x6c, 0x07, 0x55, - 0x02, 0x08, 0x9a, 0x61, 0x10, 0x23, 0x8d, 0xea, 0xe9, 0x4f, 0xf3, 0xf9, - 0x83, 0xf3, 0x8c, 0xdd, 0x75, 0xfa, 0x74, 0x3f, 0xc5, 0xb9, 0x0a, 0x59, - 0x6d, 0xe8, 0x59, 0x13, 0xac, 0x75, 0x76, 0x6e, 0x77, 0x07, 0x92, 0x78, - 0x79, 0x73, 0x12, 0x41, 0x48, 0x64, 0x11, 0x70, 0x65, 0xd2, 0x87, 0x90, - 0xa3, 0xf8, 0x20, 0x79, 0xbb, 0x61, 0x4b, 0xa9, 0x8a, 0xd1, 0x38, 0x15, - 0xb5, 0x6d, 0x16, 0x3d, 0xc9, 0x6d, 0x42, 0x81, 0x26, 0x8b, 0x46, 0x65, - 0xd6, 0xf2, 0x81, 0x9b, 0xb0, 0x3d, 0x49, 0x4e, 0x10, 0x8a, 0xb7, 0x32, - 0x4b, 0x14, 0xd3, 0x43, 0xf5, 0xf1, 0xf1, 0xac, 0x04, 0x7d, 0x3a, 0xd8, - 0x44, 0xeb, 0x3c, 0xb4, 0x28, 0xf5, 0x7e, 0x00, 0xad, 0x85, 0x17, 0x20, - 0x8d, 0xb8, 0xac, 0x51, 0x0e, 0xe7, 0x08, 0xb0, 0x1d, 0xc3, 0x1c, 0x23, - 0x89, 0x72, 0x2b, 0x91, 0xed, 0x58, 0x39, 0xbf, 0x3c, 0x49, 0x38, 0xbc, - 0xff, 0x7d, 0xbf, 0x74, 0x2a, 0x86, 0x81, 0x71, 0x4b, 0xea, 0x03, 0x76, - 0xfa, 0x0b, 0xa4, 0x40, 0xee, 0xc0, 0x9c, 0x8b, 0x7b, 0x7b, 0x4a, 0x6e, - 0xf2, 0xbf, 0xbb, 0x40, 0x11, 0x20, 0x0b, 0x71, 0x30, 0x2f, 0xed, 0x52, - 0x78, 0xf3, 0xbb, 0x3c, 0xb0, 0x40, 0xe5, 0xb1, 0xde, 0x45, 0x33, 0x3f, - 0xef, 0x40, 0x0f, 0xe0, 0x57, 0x44, 0xae, 0x32, 0x21, 0xce, 0x0c, 0xf7, - 0xa7, 0x66, 0x0c, 0xb0, 0x1e, 0x6f, 0x91, 0xbb, 0x8c, 0x1f, 0x1c, 0x55, - 0x11, 0x84, 0x26, 0x3c, 0xe5, 0x94, 0xd9, 0x93, 0x95, 0xfd, 0x65, 0x04, - 0xd9, 0xaa, 0xeb, 0xf0, 0x12, 0x3e, 0x73, 0x9c, 0x02, 0x4c, 0x1e, 0xc9, - 0x6f, 0x29, 0x84, 0xe0, 0xe8, 0x8b, 0xc1, 0xa7, 0xea, 0x05, 0x70, 0xc5, - 0x59, 0x8d, 0xa5, 0x22, 0xf0, 0x9d, 0xbc, 0x68, 0x84, 0xe2, 0xe9, 0x99, - 0xa2, 0x80, 0xce, 0xeb, 0x47, 0x70, 0x2e, 0x4c, 0x57, 0x86, 0xbd, 0xbf, - 0x1e, 0xb6, 0x17, 0xca, 0xe4, 0xf4, 0x30, 0x19, 0x27, 0x9b, 0xab, 0x3f, - 0xd1, 0xa6, 0x4a, 0x9e, 0x49, 0xd8, 0x91, 0xcf, 0xd4, 0x6d, 0x28, 0x1c, - 0xfe, 0xdb, 0xd3, 0x4b, 0xbb, 0xa4, 0xb0, 0xb9, 0x19, 0x20, 0x2a, 0x29, - 0x69, 0x7e, 0xda, 0x7e, 0x78, 0xc9, 0xe6, 0x12, 0xcb, 0x00, 0xd3, 0x51, - 0xe9, 0x65, 0x75, 0x9f, 0xfb, 0xfe, 0xcb, 0x81, 0xe0, 0x32, 0x4d, 0x52, - 0x44, 0xd2, 0xd0, 0x4c, 0x30, 0xe3, 0xa4, 0x1c, 0x6b, 0xd2, 0x98, 0x78, - 0x34, 0x63, 0x11, 0x1b, 0x06, 0x3a, 0xa1, 0x69, 0x76, 0x5a, 0x58, 0x9e, - 0x30, 0x61, 0x07, 0x68, 0x84, 0x7f, 0x8f, 0x9e, 0xdb, 0x75, 0xac, 0xc8, - 0x4f, 0xba, 0xbb, 0x8d, 0xd8, 0xc5, 0xaf, 0xa3, 0xc3, 0x3f, 0x4e, 0x85, - 0xc4, 0x9a, 0x74, 0x70, 0xfc, 0xca, 0x61, 0xf2, 0x5b, 0xa7, 0x79, 0x1e, - 0x4e, 0x27, 0x21, 0x6e, 0x1d, 0xf0, 0xbd, 0x95, 0xf7, 0x1f, 0x7c, 0x28, - 0xa3, 0xf4, 0x18, 0x68, 0x8b, 0x81, 0x29, 0x98, 0x10, 0xb6, 0xb9, 0x29, - 0xc2, 0xa4, 0x0d, 0x8a, 0xb7, 0x91, 0xbd, 0xa9, 0xa7, 0x52, 0xb5, 0xea, - 0x59, 0xf7, 0x7b, 0x17, 0x75, 0xa9, 0x8a, 0x16, 0x72, 0xa5, 0x58, 0x8b, - 0xcd, 0xdf, 0xe0, 0x15, 0xe4, 0x85, 0xcc, 0xc5, 0xca, 0x44, 0x36, 0x45, - 0x99, 0x4b, 0xd0, 0xf5, 0xd0, 0xa6, 0x9b, 0xeb, 0x79, 0x33, 0x08, 0x47, - 0x64, 0x7e, 0x7a, 0x9c, 0xf1, 0x66, 0x5f, 0x6a, 0x07, 0x78, 0xf8, 0x22, - 0x60, 0x7c, 0x32, 0x72, 0xe7, 0x1c, 0xfe, 0x9e, 0xd4, 0x90, 0x36, 0x63, - 0x06, 0x67, 0x81, 0xc2, 0x82, 0xbd, 0x22, 0x75, 0x23, 0x90, 0x0a, 0x13, - 0x20, 0xf9, 0x2e, 0x16, 0xa8, 0x8a, 0xc5, 0xab, 0x2b, 0x87, 0x64, 0x0d, - 0x91, 0xa4, 0x44, 0xc2, 0xb3, 0xe6, 0x1e, 0x27, 0x44, 0x46, 0xa3, 0x09, - 0x9f, 0xaa, 0x55, 0x79, 0x4e, 0x27, 0xaf, 0x3f, 0xee, 0xd0, 0xc3, 0xef, - 0xc0, 0x69, 0x4c, 0xb9, 0xd7, 0xbc, 0x45, 0x1f, 0x39, 0xd7, 0xa6, 0x0b, - 0x97, 0x0c, 0x87, 0x8e, 0xce, 0x68, 0x50, 0x2c, 0x45, 0x76, 0x10, 0x38, - 0x4b, 0x39, 0x3d, 0x7b, 0x32, 0x01, 0x69, 0xda, 0xf6, 0x6f, 0x60, 0x8f, - 0xfa, 0x65, 0x07, 0x22, 0xd8, 0xd0, 0x36, 0x4c, 0xb0, 0x6b, 0x09, 0x4b, - 0xb7, 0xe1, 0x9f, 0x51, 0x03, 0x35, 0x14, 0x70, 0x7a, 0xa8, 0x83, 0x33, - 0x10, 0x95, 0x89, 0x15, 0x54, 0x9f, 0x72, 0x46, 0x4f, 0xca, 0xef, 0xa4, - 0xb7, 0x1a, 0x07, 0xe5, 0x73, 0x2e, 0x33, 0x3a, 0xe1, 0x40, 0xfc, 0x69, - 0x72, 0xc2, 0xff, 0xb6, 0xd5, 0x38, 0x11, 0x55, 0xa9, 0x44, 0x8c, 0xe4, - 0xe0, 0x99, 0x35, 0xc5, 0x83, 0xbf, 0xef, 0xf5, 0x42, 0x17, 0x2f, 0x1f, - 0x27, 0xcd, 0x7d, 0x8e, 0xac, 0xdc, 0x0d, 0x50, 0x89, 0x32, 0x95, 0x25, - 0x1d, 0x06, 0xab, 0xb4, 0x78, 0x5b, 0xed, 0x0e, 0x2b, 0xd0, 0x62, 0xe5, - 0x61, 0x39, 0x4c, 0x95, 0x84, 0x94, 0xad, 0x73, 0xa8, 0x5b, 0xed, 0xa5, - 0x97, 0xf0, 0xdc, 0xb0, 0xb8, 0x7c, 0x8b, 0x36, 0x8d, 0x32, 0x81, 0xd7, - 0xf4, 0x13, 0x03, 0xd3, 0xa0, 0xff, 0x6c, 0xad, 0x53, 0x6d, 0x64, 0x9c, - 0x5f, 0xb0, 0xb9, 0x72, 0x73, 0xba, 0x0e, 0x81, 0xd8, 0x89, 0x94, 0x90, - 0xac, 0x45, 0xc7, 0xb4, 0x78, 0x53, 0xf9, 0x59, 0xc7, 0x13, 0x42, 0xd4, - 0xc6, 0xd8, 0x06, 0x6a, 0x2c, 0x8b, 0xa1, 0xc0, 0x7b, 0x33, 0x6f, 0x5b, - 0x28, 0x56, 0x3a, 0xf0, 0xa6, 0xf8, 0x77, 0x6a, 0xfc, 0xe1, 0xa9, 0x3b, - 0x2d, 0x2d, 0x43, 0x1d, 0xdb, 0x9d, 0xd4, 0xb4, 0xe4, 0x0e, 0xf9, 0xd8, - 0x4a, 0xca, 0x03, 0x79, 0x64, 0x6a, 0x44, 0x7d, 0x63, 0x46, 0x38, 0x9b, - 0x5d, 0xdd, 0xb0, 0x77, 0xd6, 0xad, 0xa3, 0xf0, 0xc0, 0x07, 0x1e, 0x0f, - 0x8e, 0xca, 0xd6, 0x81, 0x95, 0x53, 0x09, 0x5c, 0x7c, 0xac, 0xaf, 0x61, - 0x21, 0x6c, 0xf2, 0xad, 0x1b, 0x87, 0xd1, 0x4e, 0x3a, 0x55, 0x77, 0xed, - 0x3c, 0x2f, 0xa9, 0xe1, 0x0c, 0xdf, 0x48, 0xfe, 0x72, 0x91, 0xf2, 0x69, - 0x4e, 0xeb, 0x92, 0x7f, 0x94, 0xe6, 0x33, 0x16, 0x2f, 0x97, 0xcf, 0x08, - 0x95, 0x24, 0x08, 0xd0, 0x1b, 0x38, 0x9a, 0x8c, 0xff, 0x6e, 0x58, 0x16, - 0xca, 0x88, 0xfc, 0x01, 0x6a, 0xf1, 0xd9, 0xf3, 0x55, 0xd5, 0x60, 0x23, - 0x03, 0xa5, 0x66, 0xb8, 0x41, 0xa5, 0x02, 0xab, 0xa4, 0xcc, 0xfe, 0x64, - 0x48, 0x49, 0x4d, 0xec, 0x13, 0x41, 0x35, 0x51, 0x04, 0x15, 0x59, 0xd2, - 0xf9, 0x91, 0x62, 0x1f, 0x86, 0x9d, 0x35, 0x03, 0x1e, 0x45, 0xfd, 0xb4, - 0xa4, 0x46, 0x98, 0x30, 0xc4, 0xa0, 0xa6, 0x06, 0x56, 0x83, 0x98, 0xbc, - 0x08, 0xbe, 0x3e, 0x40, 0xf2, 0x64, 0x41, 0xa2, 0xdc, 0xec, 0x90, 0x20, - 0xfa, 0x45, 0x44, 0x72, 0x21, 0xc9, 0xa4, 0x3b, 0xb2, 0x97, 0xab, 0x42, - 0xb2, 0x96, 0xbe, 0x75, 0x50, 0x1d, 0x75, 0x94, 0xec, 0xf8, 0xcc, 0x02, - 0x99, 0x2d, 0xcb, 0x10, 0x4a, 0x6e, 0x6c, 0x4c, 0x3d, 0x36, 0xc5, 0x55, - 0xca, 0x82, 0x35, 0x21, 0x94, 0x92, 0x7d, 0x7d, 0xcd, 0xa7, 0x63, 0xc2, - 0x35, 0x23, 0x54, 0xb9, 0x79, 0xe3, 0xf3, 0xd7, 0xaf, 0x9f, 0x3f, 0x21, - 0x4e, 0xb7, 0xc2, 0x89, 0x61, 0x62, 0xd8, 0xe6, 0xd7, 0x37, 0x6e, 0xcb, - 0xc7, 0x87, 0x1c, 0xd7, 0xbd, 0xa5, 0x50, 0x83, 0xaa, 0xa3, 0x2d, 0xf5, - 0x93, 0x6c, 0xa0, 0x91, 0xd5, 0x70, 0x56, 0xdf, 0x6c, 0x13, 0x07, 0xfa, - 0xa6, 0x38, 0x08, 0x00, 0x4c, 0x5b, 0xf5, 0x88, 0xa5, 0x46, 0x37, 0x9e, - 0xdf, 0x8e, 0x67, 0xac, 0x29, 0x4d, 0x94, 0xcb, 0xe9, 0x15, 0xd1, 0x03, - 0x45, 0x45, 0xd6, 0x5e, 0x3c, 0x0b, 0x4d, 0xe8, 0xc1, 0x31, 0xe8, 0x15, - 0xee, 0x16, 0x29, 0x0c, 0x82, 0x62, 0x3f, 0x13, 0x52, 0xa9, 0x6d, 0xd8, - 0x1b, 0x06, 0xbb, 0x3c, 0xd7, 0x8d, 0x57, 0x08, 0xbe, 0x76, 0xe0, 0x42, - 0xa1, 0xd5, 0x61, 0x6c, 0xd0, 0x38, 0x52, 0x1f, 0xa4, 0xfb, 0xf5, 0xac, - 0x0a, 0xcd, 0x1f, 0xa3, 0xb6, 0x3f, 0xe4, 0xdf, 0x73, 0x42, 0x43, 0x8f, - 0x76, 0x11, 0x29, 0xb8, 0xc1, 0x83, 0x11, 0x90, 0x5c, 0x81, 0x30, 0xd7, - 0xc2, 0x59, 0xb7, 0x73, 0x4a, 0x2a, 0x81, 0x67, 0x8e, 0xf4, 0x22, 0x8f, - 0x85, 0x18, 0x96, 0x58, 0xd6, 0x83, 0x5d, 0xf2, 0x8a, 0x9a, 0x23, 0xd8, - 0xa0, 0x00, 0xc0, 0xc7, 0xc0, 0x52, 0xc8, 0x6e, 0xbe, 0x06, 0xff, 0x63, - 0x39, 0xff, 0x1f, 0xa5, 0x03, 0x64, 0xaa, 0xfd, 0x71, 0x96, 0x11, 0x1a, - 0x87, 0xd3, 0x4c, 0xd2, 0x2d, 0xd4, 0x7c, 0xa6, 0x98, 0x91, 0x5b, 0x8c, - 0x40, 0x98, 0x26, 0xf2, 0x5c, 0x48, 0x73, 0x91, 0xad, 0x19, 0xc2, 0x42, - 0xe8, 0x29, 0x9b, 0x97, 0xe6, 0x00, 0xf0, 0xb8, 0x1d, 0x1c, 0x33, 0x7d, - 0x60, 0x05, 0x8b, 0xeb, 0xac, 0x2e, 0x92, 0xc4, 0x97, 0x0a, 0x94, 0x12, - 0xd9, 0x63, 0xf4, 0xff, 0x1c, 0xc3, 0x7b, 0x5b, 0xca, 0x54, 0x8e, 0x7b, - 0x65, 0x44, 0xa3, 0x49, 0x85, 0x7d, 0x17, 0x68, 0xf7, 0x22, 0x76, 0x65, - 0xf1, 0xf9, 0x8e, 0x8c, 0x05, 0xb4, 0xfe, 0x01, 0x6a, 0x97, 0x86, 0xcd, - 0x80, 0xea, 0x69, 0x26, 0x41, 0x31, 0x12, 0x2e, 0x6c, 0x3d, 0xa7, 0x11, - 0xc6, 0xe5, 0xda, 0x13, 0x57, 0x2d, 0xe7, 0x51, 0xf4, 0xf9, 0x02, 0x20, - 0x6a, 0x54, 0x2a, 0xa2, 0x01, 0x03, 0x15, 0x3f, 0xb3, 0xdb, 0xe5, 0x8d, - 0x1c, 0xac, 0x67, 0xfb, 0x43, 0xfd, 0x11, 0xb9, 0xdd, 0xde, 0x40, 0x43, - 0x9e, 0x6c, 0x0a, 0x8e, 0x10, 0xcb, 0xff, 0xd2, 0xf9, 0x32, 0x61, 0x6f, - 0xcc, 0x87, 0xcc, 0x65, 0xce, 0xfa, 0xce, 0xb0, 0xc0, 0xc4, 0xc6, 0xdf, - 0xaa, 0x18, 0x5d, 0x26, 0xc7, 0x18, 0xbc, 0xbd, 0x2f, 0x92, 0xff, 0xfb, - 0xe8, 0x88, 0xc3, 0x89, 0x67, 0xec, 0x07, 0x8f, 0x02, 0x31, 0x7c, 0xa2, - 0xbc, 0xe2, 0xf8, 0x9d, 0xad, 0xc5, 0xd7, 0x9b, 0x1a, 0x37, 0xf8, 0x0f, - 0xbb, 0x8b, 0xbe, 0x2e, 0x8e, 0x7e, 0x03, 0x06, 0x95, 0x03, 0x83, 0x7a, - 0xb9, 0x63, 0x6d, 0x65, 0x61, 0xfb, 0x0b, 0xcb, 0xb4, 0x47, 0x65, 0x5e, - 0xdb, 0xff, 0xc3, 0xf4, 0x6a, 0x52, 0xc0, 0xc2, 0xb2, 0x7f, 0x66, 0x79, - 0x2a, 0xbe, 0xd1, 0xe9, 0x80, 0x82, 0xfe, 0x6f, 0x00, 0x7f, 0x2f, 0xf4, - 0x78, 0x52, 0xb6, 0x7c, 0xf7, 0x84, 0x0b, 0x96, 0x53, 0x78, 0xf8, 0x50, - 0x1a, 0x89, 0x1b, 0x71, 0x89, 0xd5, 0xbf, 0xd1, 0x81, 0x14, 0x6f, 0x75, - 0x1c, 0xf9, 0x19, 0x8e, 0xb7, 0x45, 0x97, 0xbc, 0x45, 0xa1, 0x3d, 0xa2, - 0xe6, 0x50, 0xc1, 0x19, 0x09, 0x44, 0x31, 0xce, 0x10, 0xfa, 0xd9, 0x7a, - 0x17, 0xf4, 0x3a, 0xe7, 0x9f, 0x9e, 0xc6, 0xbd, 0xe4, 0x23, 0x90, 0x8a, - 0xb6, 0x72, 0xa0, 0xe3, 0x7d, 0xca, 0xc9, 0xaf, 0x04, 0xde, 0x76, 0x40, - 0xe5, 0xb4, 0xda, 0xb4, 0xf9, 0x98, 0xc6, 0x14, 0xe0, 0x61, 0xa4, 0xbe, - 0xa8, 0x1d, 0x11, 0xb8, 0x6e, 0x7b, 0x71, 0xec, 0xf4, 0xe8, 0x1a, 0x75, - 0x24, 0x67, 0x0f, 0xb5, 0x24, 0xb6, 0x04, 0x96, 0xa4, 0xa4, 0x0c, 0x7e, - 0xce, 0xba, 0x8e, 0xbc, 0xde, 0xf1, 0xfd, 0x39, 0x2a, 0x99, 0x35, 0x2e, - 0x04, 0x96, 0xf6, 0x7d, 0x10, 0x52, 0xeb, 0xaa, 0x85, 0xdf, 0xdb, 0x0d, - 0x5b, 0x0f, 0xe0, 0xe4, 0x2b, 0x3b, 0xc7, 0xb5, 0x76, 0x1c, 0x64, 0xc8, - 0x33, 0x3b, 0xc3, 0x6e, 0xe7, 0xd3, 0x76, 0x9b, 0xe4, 0x4b, 0x29, 0x3a, - 0x04, 0xfa, 0x15, 0x9b, 0x33, 0x65, 0xfd, 0xb2, 0x80, 0x4e, 0x74, 0x38, - 0x9e, 0x64, 0x82, 0x23, 0x1a, 0xb5, 0x3e, 0x5a, 0xaa, 0xd8, 0x22, 0x83, - 0x6b, 0x1f, 0x62, 0x73, 0x2d, 0x74, 0x7b, 0xda, 0x64, 0xbd, 0xac, 0xcd, - 0x34, 0xe8, 0x33, 0xad, 0x5b, 0x99, 0x1d, 0xd8, 0xe4, 0x6e, 0x68, 0x40, - 0x8c, 0x99, 0xdf, 0xa2, 0xd7, 0x0a, 0x66, 0xbb, 0xd8, 0x0d, 0xa3, 0x2d, - 0xe3, 0x2e, 0x6d, 0x45, 0x39, 0x77, 0xca, 0xf4, 0x7f, 0x89, 0x83, 0x2c, - 0x15, 0xe6, 0x40, 0xb9, 0x0d, 0x7b, 0x1b, 0x6e, 0xa3, 0xc7, 0xfe, 0x5b, - 0x90, 0x1b, 0x3c, 0x91, 0xa2, 0x53, 0x0f, 0x1b, 0x3a, 0xde, 0x72, 0x72, - 0xa3, 0x26, 0x27, 0xa5, 0xa7, 0x12, 0x6b, 0x0e, 0x2e, 0xe3, 0x36, 0xcc, - 0xeb, 0x00, 0x56, 0xe9, 0x44, 0x48, 0x4a, 0x89, 0x43, 0x65, 0x45, 0x60, - 0x74, 0x1e, 0x18, 0x08, 0x68, 0xe4, 0x79, 0xc1, 0x89, 0xad, 0xaa, 0xaa, - 0x27, 0xe6, 0x3f, 0xfe, 0x5e, 0x86, 0xa7, 0x5e, 0x9f, 0x58, 0xc8, 0xe6, - 0x85, 0xd8, 0x43, 0xb0, 0x3f, 0x06, 0xd0, 0x3e, 0x9d, 0x85, 0x27, 0xe1, - 0xe3, 0xb6, 0x81, 0x89, 0xbd, 0x38, 0xec, 0xfd, 0x96, 0xcd, 0x9d, 0x3a, - 0xe1, 0x33, 0x65, 0xb2, 0x86, 0xee, 0xa5, 0x50, 0xe6, 0x15, 0x85, 0x70, - 0xa3, 0xf9, 0xd3, 0xd3, 0x49, 0x85, 0xa7, 0x41, 0x22, 0xda, 0x07, 0x27, - 0x23, 0xd5, 0xf4, 0xc0, 0x07, 0x86, 0x65, 0x45, 0xa0, 0xf7, 0x35, 0x46, - 0x12, 0x25, 0xd6, 0x95, 0x5a, 0x72, 0x59, 0x0a, 0xb6, 0xae, 0x21, 0xaa, - 0xf0, 0x9b, 0x40, 0x9a, 0xbe, 0x78, 0x82, 0x19, 0xbb, 0x11, 0x1a, 0xb6, - 0x18, 0x86, 0x74, 0xa4, 0x20, 0xd4, 0x40, 0xe7, 0x72, 0x72, 0xe6, 0x27, - 0x6e, 0x31, 0x20, 0x64, 0x50, 0x14, 0xe8, 0x55, 0x16, 0xc6, 0x10, 0xa1, - 0x8f, 0x00, 0xdc, 0x3c, 0x28, 0x21, 0xdb, 0xe5, 0x9c, 0xba, 0xe1, 0x0a, - 0x13, 0x8c, 0x02, 0x0c, 0xea, 0xe6, 0x88, 0x0a, 0xf9, 0x40, 0xb3, 0xda, - 0x63, 0x22, 0x82, 0x8a, 0x67, 0xfd, 0x65, 0x9a, 0xd1, 0x7e, 0x1d, 0xa1, - 0x94, 0xc7, 0x9b, 0x1f, 0x0a, 0x2d, 0xda, 0x1f, 0x43, 0x74, 0xc2, 0x25, - 0x29, 0x18, 0xba, 0x1a, 0x6e, 0x2d, 0x04, 0x7c, 0x60, 0x7e, 0x05, 0xd3, - 0x3e, 0x9c, 0x27, 0x5b, 0x17, 0x90, 0x42, 0x61, 0xeb, 0xd9, 0xb8, 0x4e, - 0xbd, 0x38, 0xd0, 0x23, 0x2f, 0x4e, 0xaf, 0x6b, 0x61, 0x37, 0x05, 0x7f, - 0x1d, 0xc8, 0x32, 0xc5, 0x01, 0x09, 0xf9, 0x9c, 0x73, 0xd6, 0xf1, 0x4a, - 0xf9, 0x6b, 0xc8, 0xfb, 0x6a, 0x4a, 0xb3, 0xab, 0x26, 0x98, 0xd4, 0xe2, - 0x9b, 0x1c, 0xae, 0xdb, 0x86, 0x54, 0xa5, 0xc6, 0xba, 0x01, 0xa6, 0x14, - 0x6b, 0x25, 0x81, 0x59, 0xc3, 0xee, 0x86, 0xb6, 0xa7, 0xa7, 0xb0, 0xe3, - 0xba, 0x3d, 0x92, 0x2a, 0x25, 0x4e, 0x17, 0x72, 0xa8, 0x01, 0x44, 0xc8, - 0x44, 0xc2, 0x7e, 0x45, 0xa2, 0xd3, 0xfb, 0x53, 0x59, 0xb5, 0xaa, 0x45, - 0xfc, 0xc0, 0x51, 0x9b, 0xe2, 0x33, 0x83, 0x71, 0x6e, 0x88, 0xbb, 0xab, - 0x38, 0xac, 0xd6, 0xd8, 0xf3, 0xa4, 0xbd, 0x17, 0xcd, 0x15, 0x2e, 0xdb, - 0x39, 0xb3, 0x9d, 0x3f, 0x85, 0xfd, 0xea, 0x1c, 0xab, 0xd0, 0x39, 0x45, - 0x3d, 0x0e, 0x15, 0x8f, 0xef, 0xd5, 0x15, 0x2b, 0xaf, 0x29, 0xb4, 0x9d, - 0x0d, 0xcd, 0x24, 0x88, 0x65, 0xd6, 0xcf, 0xd9, 0x51, 0x5a, 0x70, 0x87, - 0xc8, 0x03, 0x63, 0xb5, 0xca, 0xc4, 0x86, 0x6d, 0x08, 0x12, 0xda, 0xcc, - 0x29, 0x74, 0xe2, 0xec, 0x9e, 0xcd, 0x84, 0x33, 0x12, 0xd7, 0x1d, 0x08, - 0x54, 0xa4, 0x16, 0xb5, 0x32, 0x88, 0x14, 0x0e, 0x3a, 0x3c, 0x37, 0xa2, - 0x68, 0x83, 0x4a, 0xe6, 0xf2, 0xbe, 0x54, 0xa9, 0x9a, 0x5c, 0xe1, 0x93, - 0x33, 0xc3, 0x52, 0xae, 0x08, 0xf8, 0x87, 0xae, 0x23, 0x83, 0xe1, 0xb2, - 0x8d, 0xf2, 0x8a, 0x7a, 0x53, 0x35, 0x2c, 0xc1, 0x80, 0xad, 0x31, 0x7e, - 0x7c, 0xbf, 0xf8, 0x24, 0x31, 0x39, 0x36, 0x3f, 0x14, 0xce, 0x56, 0xc7, - 0x25, 0x97, 0xa5, 0x4a, 0x2e, 0x12, 0xdb, 0x3c, 0xd3, 0x7f, 0x44, 0x91, - 0x73, 0x1c, 0xe9, 0xe8, 0xa8, 0xb2, 0x46, 0xb5, 0x3a, 0x62, 0xaa, 0xa1, - 0x45, 0x1c, 0x10, 0xbc, 0xec, 0xe6, 0x11, 0x68, 0x46, 0x64, 0x96, 0x77, - 0x34, 0x00, 0x8e, 0x3a, 0x5c, 0xef, 0xba, 0x26, 0xff, 0x8e, 0x7a, 0xa0, - 0x0d, 0xe5, 0xee, 0x08, 0x12, 0x56, 0x68, 0xcd, 0xe4, 0x58, 0x71, 0x28, - 0x74, 0x91, 0xe6, 0x43, 0xb8, 0x3a, 0x44, 0x1b, 0xda, 0x66, 0x40, 0x45, - 0xb1, 0xf6, 0x75, 0xbf, 0xa1, 0x6f, 0xfa, 0x13, 0xd5, 0x8a, 0x8f, 0x88, - 0xfa, 0x46, 0x27, 0x02, 0xc6, 0x50, 0xf2, 0x51, 0xf9, 0x6a, 0x75, 0x76, - 0x21, 0x55, 0x55, 0xc7, 0x04, 0xe9, 0x68, 0x41, 0xc7, 0xb8, 0x6b, 0x32, - 0xa0, 0xba, 0x83, 0x2a, 0x1a, 0xf1, 0x31, 0xc7, 0x7f, 0xa5, 0xb5, 0xe6, - 0x3a, 0x08, 0xdc, 0x4d, 0x88, 0x72, 0x1f, 0x11, 0x9b, 0x78, 0xa3, 0x16, - 0x5e, 0xe1, 0xf3, 0xbc, 0x32, 0x5d, 0xfb, 0xb4, 0x63, 0x03, 0xa5, 0xc6, - 0xd7, 0x88, 0xd2, 0x42, 0xa8, 0xd2, 0x9d, 0x95, 0x76, 0xb2, 0x49, 0x67, - 0x01, 0x7f, 0xd7, 0x2c, 0x49, 0x13, 0xdc, 0x98, 0x36, 0x0e, 0xa4, 0xe1, - 0x58, 0x23, 0x7a, 0xd8, 0xc1, 0x43, 0xb9, 0x8f, 0xef, 0x18, 0x5e, 0x05, - 0x86, 0x55, 0x9b, 0x98, 0xbb, 0x30, 0x5c, 0x4c, 0x41, 0xf0, 0xe5, 0x15, - 0x41, 0xf0, 0x14, 0x4d, 0xa3, 0x40, 0xed, 0xc9, 0x18, 0x14, 0x1c, 0xc9, - 0x33, 0xdc, 0x59, 0x1d, 0x4c, 0x65, 0x99, 0xc3, 0x36, 0x9d, 0x8e, 0x58, - 0x1d, 0x0d, 0xc8, 0x1f, 0x89, 0xf0, 0x95, 0xaf, 0x6d, 0x5f, 0xfb, 0x2b, - 0x39, 0x04, 0x9f, 0x20, 0x32, 0xd5, 0x2f, 0x28, 0x4b, 0xdb, 0x49, 0x80, - 0xff, 0x78, 0x11, 0x72, 0xbe, 0x9c, 0x84, 0xcb, 0x12, 0x12, 0x7d, 0x95, - 0x68, 0x1d, 0xad, 0xa6, 0xfa, 0x24, 0xd5, 0x84, 0xe9, 0x9b, 0x97, 0xf1, - 0xfe, 0x0a, 0x82, 0xde, 0xf7, 0x6a, 0xf4, 0x86, 0x2c, 0x73, 0x41, 0x4d, - 0x63, 0xdc, 0xd2, 0x6e, 0xc3, 0x0b, 0x09, 0x63, 0x18, 0x8f, 0x62, 0x63, - 0x41, 0xb0, 0x6d, 0x20, 0xa9, 0x00, 0xb1, 0x78, 0x60, 0xf4, 0xbb, 0xa0, - 0x16, 0x8d, 0x3d, 0xb0, 0xbe, 0x44, 0x2f, 0xc5, 0xa6, 0x08, 0x93, 0xcb, - 0x86, 0xa6, 0x19, 0xff, 0x51, 0x7e, 0xf5, 0xea, 0x5f, 0x36, 0xa6, 0x7c, - 0x3f, 0x33, 0x3e, 0x08, 0xb0, 0x22, 0x10, 0xea, 0xfd, 0x09, 0x94, 0xc3, - 0xb7, 0xd7, 0xb7, 0x0e, 0x16, 0xe0, 0xb0, 0x7c, 0xe0, 0x7a, 0x87, 0x4c, - 0x27, 0x70, 0x2a, 0x56, 0x46, 0xb7, 0x76, 0x90, 0xb3, 0x1e, 0x74, 0x71, - 0x9b, 0x95, 0x7b, 0x7b, 0x9e, 0x9c, 0x8b, 0xcc, 0x8b, 0x14, 0x68, 0x46, - 0x3b, 0x83, 0x30, 0xb6, 0xc4, 0x49, 0xb2, 0x25, 0xd3, 0xae, 0x29, 0x7f, - 0x6d, 0x93, 0x1d, 0x8a, 0x68, 0x63, 0x52, 0x9f, 0x40, 0x16, 0xec, 0xeb, - 0x92, 0x85, 0xc9, 0xd4, 0x3c, 0xbe, 0x58, 0x15, 0x3f, 0x6b, 0xc5, 0xba, - 0xc0, 0x4e, 0xb6, 0x51, 0xa3, 0x52, 0xb6, 0x2a, 0x8f, 0x2a, 0xa6, 0x53, - 0xfe, 0x04, 0x0d, 0x81, 0x9c, 0x88, 0xe8, 0xf1, 0xab, 0xab, 0x0d, 0xc5, - 0x9a, 0x58, 0xdd, 0xbc, 0xc3, 0xae, 0x42, 0x90, 0x84, 0xc3, 0x30, 0x28, - 0x65, 0x52, 0xa9, 0xf4, 0xcc, 0xd7, 0xb9, 0x7d, 0xed, 0x87, 0x76, 0x4c, - 0xf9, 0x66, 0x6f, 0x7e, 0xac, 0x48, 0x7d, 0x70, 0x3b, 0x5c, 0x40, 0x65, - 0xa0, 0x85, 0xf5, 0x1f, 0x2e, 0x7b, 0x1a, 0xd1, 0xd9, 0x22, 0x64, 0xf3, - 0x68, 0xa0, 0x2f, 0xbb, 0x5e, 0x3c, 0xe4, 0xdd, 0x7a, 0xd4, 0x99, 0x98, - 0xc9, 0x41, 0x13, 0x6f, 0x40, 0x47, 0x05, 0x9f, 0x89, 0x01, 0x80, 0xb5, - 0xeb, 0x79, 0x85, 0xa6, 0xb6, 0xf6, 0xc2, 0xbc, 0x83, 0xe8, 0x47, 0x19, - 0x9e, 0x46, 0x97, 0x4c, 0x62, 0x04, 0x44, 0x59, 0xb5, 0xef, 0x19, 0x05, - 0xeb, 0xea, 0x48, 0x69, 0xaf, 0x31, 0x69, 0x25, 0xa2, 0x8d, 0x82, 0x47, - 0xd2, 0x09, 0x1c, 0x71, 0x32, 0x9d, 0xc7, 0xf2, 0x2b, 0x29, 0xb4, 0x7c, - 0x13, 0x05, 0x1c, 0x49, 0x6d, 0xb8, 0x2c, 0xff, 0x37, 0x18, 0x45, 0x2e, - 0x83, 0xbc, 0x66, 0x85, 0xc8, 0x03, 0xe1, 0x60, 0x6a, 0x18, 0x87, 0xa7, - 0x61, 0xc5, 0xac, 0x7d, 0xfe, 0x9f, 0xec, 0x78, 0x04, 0x44, 0xdb, 0xef, - 0x77, 0xeb, 0x3a, 0x6f, 0xe9, 0x11, 0x0b, 0x69, 0x94, 0x3c, 0x9c, 0x6c, - 0x81, 0x9d, 0x4f, 0xc1, 0x44, 0xf4, 0xdd, 0xef, 0x68, 0x43, 0x16, 0x1e, - 0x27, 0xf3, 0x87, 0x62, 0x30, 0x17, 0x5e, 0x4d, 0x31, 0x0d, 0xd4, 0x14, - 0x13, 0x19, 0x61, 0x01, 0xea, 0x2b, 0x81, 0x2a, 0xeb, 0xd6, 0x55, 0x8b, - 0xa7, 0x94, 0x7b, 0x78, 0x37, 0x68, 0xe3, 0x6e, 0x76, 0x8d, 0x89, 0xb1, - 0xa0, 0x10, 0xc2, 0x3e, 0xb9, 0x0a, 0xe7, 0xfb, 0x2b, 0xf5, 0xe3, 0xa9, - 0x84, 0x5a, 0x69, 0x02, 0x33, 0x38, 0x07, 0x23, 0x3c, 0x37, 0xc2, 0x83, - 0xde, 0x26, 0x67, 0x10, 0x16, 0x14, 0xa4, 0x39, 0xbf, 0x76, 0x52, 0x99, - 0x0d, 0x80, 0x11, 0x22, 0xb3, 0xaa, 0x08, 0xfd, 0x04, 0x90, 0x94, 0x85, - 0x58, 0x85, 0xd8, 0xdd, 0xd9, 0x23, 0x56, 0x1b, 0x69, 0xb7, 0xfc, 0xf4, - 0x50, 0xdf, 0xab, 0xd3, 0xad, 0x10, 0xd6, 0xbd, 0x3d, 0x1b, 0x18, 0xab, - 0x4d, 0x06, 0x81, 0x6e, 0x0d, 0xce, 0x85, 0x7c, 0x85, 0x54, 0x08, 0xf4, - 0xfd, 0x1e, 0xb6, 0x6e, 0x96, 0x4d, 0x86, 0x6e, 0xf2, 0x28, 0xd7, 0x10, - 0xe6, 0x59, 0xb2, 0xb8, 0x90, 0xf0, 0xbc, 0x49, 0x84, 0xe0, 0xe5, 0x60, - 0x62, 0x61, 0xaf, 0x44, 0x6d, 0x4f, 0xdd, 0xd2, 0xaa, 0xc8, 0x2f, 0x4a, - 0x59, 0xdc, 0xbd, 0xb5, 0xe4, 0xba, 0x82, 0x6e, 0x1d, 0x95, 0x05, 0xfe, - 0xaa, 0xa6, 0x67, 0x38, 0xe6, 0x5c, 0xe6, 0x50, 0x49, 0x3e, 0xc0, 0xa6, - 0x40, 0xd4, 0xca, 0x29, 0x55, 0x0c, 0xbf, 0x76, 0xcb, 0x8e, 0x90, 0x6b, - 0x37, 0x32, 0xe0, 0x43, 0x7e, 0x19, 0x7f, 0x93, 0x5f, 0x46, 0x4f, 0x22, - 0x1a, 0xac, 0x56, 0xf1, 0x96, 0x63, 0x4b, 0x75, 0xbc, 0x5c, 0x9f, 0x32, - 0xd9, 0x6a, 0xdc, 0xfe, 0x88, 0x82, 0x5f, 0x0b, 0xc4, 0xb3, 0xb3, 0x8d, - 0x6e, 0x09, 0x94, 0x84, 0xf8, 0x91, 0xfb, 0x39, 0x90, 0xe5, 0x78, 0xd6, - 0xa8, 0xbf, 0x0a, 0x54, 0x5c, 0xdd, 0x1c, 0xa5, 0xa2, 0xf8, 0x91, 0x13, - 0x6d, 0xac, 0xa9, 0xfd, 0xdb, 0xf3, 0x0d, 0x64, 0xe4, 0x25, 0xc9, 0x8f, - 0x71, 0xfe, 0x88, 0x0a, 0xde, 0x7e, 0x9d, 0xc8, 0x0d, 0x75, 0xc9, 0x1b, - 0x8f, 0xd0, 0x70, 0xf8, 0xf8, 0xdb, 0x27, 0x36, 0x2a, 0x4e, 0xcf, 0x02, - 0xd1, 0xb1, 0xd0, 0x56, 0x57, 0x87, 0x90, 0x47, 0xb0, 0x42, 0x82, 0x3d, - 0xa5, 0x2b, 0xf0, 0x25, 0x14, 0x15, 0x4d, 0xd3, 0x72, 0xa4, 0x1e, 0xda, - 0x59, 0x8a, 0xed, 0xf1, 0x03, 0x87, 0x7b, 0x9e, 0x66, 0x77, 0xe9, 0xec, - 0x42, 0x0f, 0xd4, 0x3c, 0xf8, 0x0c, 0xd4, 0x93, 0x00, 0xcd, 0x57, 0xe4, - 0xce, 0xc7, 0x08, 0xe0, 0x70, 0x9c, 0x70, 0x6b, 0x2d, 0x0c, 0xed, 0x89, - 0x41, 0x7f, 0x02, 0xe3, 0x80, 0xf2, 0x9e, 0xa8, 0x07, 0xd6, 0x7f, 0xd5, - 0x3b, 0x2e, 0x19, 0xd3, 0xad, 0x16, 0x1b, 0xad, 0x0e, 0x39, 0x53, 0xe7, - 0x50, 0x53, 0x39, 0xe2, 0xc6, 0xea, 0x62, 0xd4, 0x22, 0xf0, 0xb8, 0x0d, - 0x98, 0xac, 0x15, 0xda, 0x2b, 0x00, 0x78, 0x99, 0x77, 0x65, 0xe0, 0x7e, - 0x2e, 0x63, 0xd7, 0x1c, 0x42, 0x16, 0xa6, 0x57, 0xfd, 0xe8, 0xe9, 0x0d, - 0xef, 0xa5, 0x08, 0x38, 0xf9, 0xb8, 0x86, 0x0a, 0x5d, 0xbb, 0xbf, 0xed, - 0x62, 0xcd, 0xce, 0xbc, 0x4d, 0x8f, 0xd8, 0x3d, 0x11, 0xb9, 0xf4, 0xe4, - 0xaf, 0x10, 0x78, 0xe1, 0x6c, 0x2a, 0x76, 0x73, 0x5f, 0x40, 0xad, 0xeb, - 0xb2, 0x0a, 0x52, 0x62, 0x81, 0x7f, 0x47, 0x09, 0x70, 0x2c, 0x8f, 0xc3, - 0x10, 0x5a, 0xe9, 0x00, 0x9c, 0xb9, 0x70, 0xe8, 0x19, 0xda, 0x25, 0xe0, - 0x80, 0xed, 0xb5, 0xf7, 0x53, 0x35, 0xea, 0xf7, 0x50, 0x67, 0xfa, 0xfa, - 0xd2, 0xe8, 0x0b, 0xd0, 0x9f, 0xa9, 0x08, 0x57, 0x5a, 0xd9, 0xfc, 0xfb, - 0x6c, 0x8c, 0x6e, 0xfd, 0x19, 0x8f, 0x9d, 0x74, 0x02, 0x82, 0xb4, 0x19, - 0xdf, 0x6e, 0x25, 0x8f, 0xe8, 0xaf, 0x3b, 0x62, 0x3f, 0x0b, 0x63, 0x11, - 0xf2, 0xcf, 0xeb, 0x95, 0xa3, 0x05, 0xd4, 0x58, 0xc9, 0xd3, 0x10, 0xa0, - 0x2c, 0x8c, 0x4b, 0x54, 0x91, 0x42, 0x16, 0x95, 0xbb, 0x0d, 0xd7, 0x53, - 0x94, 0xe6, 0x9f, 0x9c, 0xc2, 0x57, 0xeb, 0xc0, 0xef, 0xd2, 0x6e, 0x97, - 0x5d, 0xab, 0xf0, 0x9c, 0x5a, 0x3d, 0xb4, 0xec, 0x8a, 0x4f, 0x06, 0x49, - 0x67, 0x2d, 0xd3, 0x79, 0x5c, 0x28, 0xdb, 0xc1, 0x12, 0xa3, 0x36, 0xb3, - 0x28, 0xaa, 0x14, 0xbc, 0x12, 0xbd, 0xfc, 0xa5, 0xd7, 0x68, 0xd8, 0x76, - 0xa1, 0xb8, 0x24, 0x20, 0xd7, 0x7a, 0x3d, 0xb0, 0x67, 0x4e, 0x51, 0x48, - 0xb1, 0x80, 0x69, 0x7b, 0xec, 0x42, 0x32, 0x99, 0xef, 0xf8, 0x91, 0x9f, - 0xce, 0x99, 0xd2, 0xf7, 0xd1, 0x06, 0x84, 0x4f, 0xce, 0x88, 0xa0, 0x04, - 0x36, 0xcf, 0x2b, 0x15, 0xe7, 0x57, 0x80, 0x5a, 0xeb, 0xc4, 0xe6, 0x7c, - 0x43, 0x35, 0xbb, 0xae, 0xf9, 0xb2, 0x93, 0x7a, 0xc1, 0xbd, 0x2c, 0xae, - 0xe6, 0xa2, 0x46, 0x32, 0x12, 0x66, 0xcf, 0xcb, 0x19, 0x9c, 0x53, 0x81, - 0xa2, 0xa2, 0x98, 0xe8, 0x97, 0x44, 0xfe, 0x00, 0x3a, 0xcb, 0xf2, 0x9b, - 0x93, 0x9c, 0x9d, 0xb7, 0xaf, 0xce, 0x7a, 0x42, 0x6c, 0xae, 0xac, 0xd0, - 0xe0, 0x0a, 0x02, 0xb4, 0xa5, 0xa0, 0x89, 0x1f, 0x47, 0xc4, 0x9c, 0x12, - 0x84, 0x6a, 0xa3, 0x86, 0x2d, 0x0a, 0x22, 0x8a, 0xa7, 0x20, 0x3a, 0x89, - 0xb9, 0x3c, 0x05, 0xac, 0x0d, 0x87, 0xbe, 0x73, 0xbf, 0x14, 0xd6, 0xf0, - 0xf4, 0x88, 0x78, 0xde, 0xdb, 0x3c, 0x20, 0x1a, 0x87, 0xd5, 0x75, 0xe3, - 0xa2, 0x35, 0x71, 0x3b, 0x8b, 0xf9, 0x8e, 0x57, 0xcb, 0x0e, 0x9d, 0x75, - 0xc3, 0x49, 0x09, 0xa0, 0x4f, 0x97, 0x9c, 0x2c, 0x20, 0x1b, 0x4d, 0x28, - 0x32, 0x44, 0xdc, 0xeb, 0x5d, 0x5f, 0x9d, 0x18, 0x91, 0xfb, 0xc8, 0x82, - 0xe7, 0xc2, 0x31, 0x9c, 0xf4, 0x01, 0xe6, 0xb1, 0xe8, 0x36, 0xfc, 0x16, - 0xc3, 0x3e, 0x53, 0x1d, 0xba, 0x54, 0xa5, 0x6a, 0xfc, 0x2a, 0x07, 0xff, - 0xdd, 0xee, 0x5b, 0x2c, 0x35, 0x3d, 0x8f, 0x16, 0xd4, 0xc2, 0x94, 0x8c, - 0x92, 0x1c, 0x9a, 0x27, 0xc9, 0xab, 0x09, 0x88, 0x60, 0xbe, 0x1d, 0xa0, - 0x3f, 0x3c, 0xe4, 0xdc, 0xbc, 0x4c, 0xb8, 0x77, 0xf4, 0x59, 0x35, 0x04, - 0x3b, 0x4d, 0xe1, 0xb3, 0x80, 0x74, 0xf5, 0x65, 0xc2, 0xbe, 0x43, 0xe1, - 0x9a, 0x3a, 0x59, 0x2e, 0xb3, 0x9a, 0x56, 0x89, 0x69, 0x77, 0x04, 0xfe, - 0xd2, 0x0c, 0x21, 0x79, 0xa2, 0x60, 0x1e, 0x9b, 0xd7, 0xa1, 0x19, 0x31, - 0xc2, 0x9a, 0xc6, 0xf0, 0x1d, 0xb4, 0x80, 0x76, 0x56, 0xe4, 0xbb, 0x5a, - 0xce, 0xdb, 0x75, 0xe3, 0x65, 0xf4, 0x9b, 0xb8, 0x4a, 0x10, 0xe9, 0xa1, - 0x91, 0x79, 0x34, 0x3f, 0x52, 0x47, 0x63, 0x4c, 0x0d, 0xbd, 0x46, 0xf1, - 0xf2, 0xe1, 0x15, 0x65, 0xac, 0x63, 0x2d, 0x45, 0x30, 0x3b, 0xf7, 0xbd, - 0x94, 0x1c, 0x63, 0xff, 0x73, 0x9c, 0xd6, 0x4f, 0x39, 0x34, 0xc0, 0x35, - 0xa6, 0xd3, 0x5c, 0x2d, 0x1b, 0xd7, 0xe8, 0x9d, 0x52, 0x68, 0x7d, 0x6b, - 0x59, 0x24, 0x70, 0xe7, 0x8a, 0x37, 0x60, 0x8a, 0x69, 0x95, 0x18, 0x1b, - 0x00, 0x9c, 0x5a, 0x07, 0x2b, 0xb1, 0xbf, 0xc0, 0x21, 0x4b, 0x45, 0xab, - 0x3e, 0xe1, 0x73, 0xf7, 0x4a, 0xc1, 0x45, 0x8a, 0x6e, 0x28, 0x45, 0x4d, - 0x6a, 0xad, 0xfb, 0x82, 0xf8, 0x4a, 0xfd, 0xed, 0x9d, 0x21, 0xbd, 0x0c, - 0xe3, 0x5f, 0xd6, 0xd7, 0x21, 0x12, 0xeb, 0x88, 0xfe, 0x87, 0x2b, 0x80, - 0xbf, 0xbc, 0x62, 0x89, 0xbe, 0x90, 0xec, 0x4b, 0xb7, 0x2e, 0x95, 0xb0, - 0x61, 0x92, 0x5b, 0x63, 0x93, 0x7c, 0x22, 0x59, 0x3d, 0x6a, 0x78, 0x50, - 0x98, 0xd0, 0x65, 0x3a, 0x19, 0xc2, 0x04, 0xeb, 0xd8, 0x3f, 0xb4, 0xe7, - 0x26, 0x4e, 0x54, 0x4c, 0x00, 0x0c, 0x86, 0xd5, 0x6e, 0x95, 0x2f, 0x2a, - 0x13, 0x8c, 0x81, 0x60, 0xb4, 0x15, 0x81, 0x7f, 0xe0, 0x3f, 0xe7, 0x52, - 0xe0, 0x34, 0xc2, 0x47, 0x4b, 0x54, 0xd7, 0x33, 0x20, 0x7f, 0x87, 0x8a, - 0xce, 0xb2, 0x31, 0x02, 0x9c, 0xf4, 0xbb, 0x79, 0x81, 0x19, 0x0d, 0xb9, - 0xc9, 0xee, 0x6e, 0x49, 0x5d, 0x24, 0x2d, 0xb4, 0x5a, 0xca, 0x96, 0xb2, - 0x7d, 0xd0, 0x23, 0xb0, 0x85, 0x30, 0x96, 0x1e, 0x2a, 0x25, 0x97, 0x04, - 0x96, 0x9a, 0x76, 0x42, 0x63, 0x02, 0x19, 0x21, 0x0d, 0x3b, 0xc0, 0x23, - 0x56, 0x79, 0x46, 0x6f, 0x0e, 0x2a, 0xe5, 0xef, 0x6b, 0xda, 0x61, 0x27, - 0xfb, 0x02, 0xf6, 0x4f, 0xec, 0x41, 0xef, 0x7c, 0xe0, 0xa2, 0xa4, 0x84, - 0x24, 0x9d, 0x5b, 0x83, 0x25, 0x6e, 0x0e, 0x00, 0xc1, 0x7d, 0x13, 0x34, - 0xf5, 0x37, 0x6c, 0x7b, 0x93, 0xb4, 0x38, 0x20, 0xae, 0x32, 0xd1, 0xf6, - 0x6b, 0xec, 0x51, 0x32, 0xc8, 0x14, 0x26, 0x03, 0x31, 0x68, 0xd8, 0x0e, - 0xf9, 0xcc, 0x0e, 0xea, 0x63, 0xe5, 0xf5, 0x62, 0x4e, 0x3b, 0x41, 0x03, - 0xab, 0x1e, 0x15, 0x02, 0x44, 0xef, 0xc7, 0x26, 0xd7, 0x1f, 0x18, 0x03, - 0x21, 0xb7, 0x42, 0xfe, 0x49, 0x5d, 0x53, 0x7a, 0x45, 0x9d, 0xfe, 0x85, - 0x60, 0xc0, 0xd9, 0x42, 0x59, 0xd9, 0xa9, 0xfb, 0xe6, 0x84, 0x1d, 0x33, - 0xe5, 0x41, 0xcd, 0x08, 0xf9, 0x35, 0xdd, 0xd5, 0xaa, 0x5a, 0x6d, 0xa7, - 0xe3, 0x09, 0x3e, 0x7f, 0x54, 0xc7, 0x6c, 0x26, 0x45, 0xa3, 0x23, 0x05, - 0x37, 0x04, 0x50, 0x3c, 0x23, 0xc9, 0xaa, 0x50, 0xde, 0x0e, 0xb0, 0xbc, - 0xce, 0xc9, 0x87, 0xf4, 0xaf, 0x0d, 0x93, 0x9e, 0x28, 0x5e, 0x6d, 0x11, - 0x74, 0x87, 0x7b, 0x06, 0xe7, 0xc0, 0xdf, 0x38, 0xd9, 0x8e, 0xd1, 0x15, - 0xdf, 0xd6, 0x7f, 0x2d, 0x11, 0x21, 0x60, 0xcd, 0xa8, 0x9c, 0xaf, 0x60, - 0x34, 0xd1, 0x51, 0x9a, 0x2f, 0x8a, 0xa9, 0x24, 0xa1, 0x74, 0x9b, 0xf7, - 0x88, 0xce, 0x4c, 0xe3, 0x64, 0x0a, 0xe5, 0xf3, 0xc3, 0x99, 0xfa, 0x79, - 0x88, 0xdd, 0x60, 0x47, 0x8c, 0x5e, 0x6d, 0x9f, 0x20, 0x13, 0x2a, 0x29, - 0x25, 0xfb, 0x32, 0xdb, 0x1c, 0xeb, 0x1b, 0xbf, 0x46, 0xbc, 0x29, 0xb4, - 0x41, 0x83, 0xf6, 0x53, 0x4c, 0x01, 0xa4, 0x66, 0xbe, 0x31, 0x93, 0xdc, - 0x06, 0xb6, 0xcf, 0x45, 0x9f, 0xb4, 0xf1, 0x7a, 0x40, 0x30, 0xb1, 0x44, - 0x8c, 0x1f, 0xe2, 0x52, 0x07, 0x57, 0xf4, 0x30, 0x08, 0xbf, 0xec, 0x52, - 0x54, 0x16, 0x77, 0xd4, 0x15, 0xce, 0x66, 0xea, 0x6b, 0x54, 0xec, 0xd3, - 0x7d, 0xa7, 0xdc, 0xef, 0xee, 0x61, 0x72, 0x59, 0xc0, 0x82, 0x7f, 0xe2, - 0xb2, 0x8c, 0x12, 0x9b, 0x16, 0xe0, 0xe5, 0x21, 0x45, 0x0e, 0x23, 0xb1, - 0xc4, 0x8f, 0x4a, 0x53, 0x6d, 0x00, 0x6f, 0xea, 0x74, 0xda, 0xe1, 0x79, - 0xc7, 0x21, 0x98, 0x7e, 0x9b, 0xe3, 0xf6, 0x8f, 0xf5, 0x1d, 0x7f, 0x6d, - 0x7a, 0x49, 0x67, 0x13, 0x20, 0x8a, 0x61, 0x2a, 0xb3, 0xbd, 0xd2, 0xdb, - 0xb1, 0x9f, 0x25, 0x07, 0x4f, 0xac, 0x32, 0x6a, 0x70, 0xe0, 0x3f, 0xcd, - 0x9e, 0x8e, 0xcb, 0xa7, 0x59, 0xee, 0x54, 0xec, 0xc4, 0x00, 0x87, 0xb6, - 0x0d, 0x50, 0x2e, 0x45, 0xba, 0xbc, 0x29, 0x5f, 0x57, 0x79, 0x3d, 0xec, - 0x55, 0x25, 0xc0, 0x0b, 0x3f, 0xe9, 0x51, 0x27, 0x95, 0x17, 0x0e, 0xa1, - 0xdc, 0xb1, 0x79, 0x6a, 0xf4, 0x87, 0xd9, 0x7d, 0x31, 0x1f, 0xd6, 0x58, - 0x25, 0xb8, 0x4f, 0x2a, 0x3a, 0x0b, 0xc4, 0x49, 0xd9, 0xcd, 0x0f, 0xff, - 0xa8, 0x74, 0x60, 0x59, 0x1d, 0xea, 0x38, 0x6b, 0xd5, 0x41, 0x08, 0x75, - 0xa1, 0x14, 0xe5, 0x9c, 0xd5, 0x72, 0xff, 0x61, 0xea, 0x6c, 0xe5, 0x91, - 0x0a, 0x0e, 0x81, 0xb5, 0x38, 0x57, 0x21, 0x9f, 0x37, 0x09, 0x86, 0x1f, - 0xd0, 0x0d, 0xce, 0xa6, 0xab, 0xfd, 0xb2, 0xdf, 0x21, 0x7a, 0x06, 0x8f, - 0x76, 0xc1, 0xe0, 0x88, 0x8e, 0x95, 0xca, 0x04, 0x33, 0x05, 0x18, 0xb9, - 0x82, 0x58, 0x85, 0x99, 0x6a, 0x42, 0x8e, 0x06, 0xc8, 0x50, 0x1b, 0xe3, - 0x02, 0x73, 0xf3, 0x82, 0x8e, 0x22, 0x71, 0x9c, 0x13, 0xaa, 0xd1, 0x80, - 0x0d, 0x94, 0xb0, 0xb0, 0x8e, 0x78, 0x7b, 0xfb, 0x70, 0x64, 0x78, 0x72, - 0xbf, 0x18, 0x7e, 0x37, 0x29, 0xa1, 0x43, 0x86, 0x75, 0x79, 0xda, 0xa6, - 0xbe, 0x09, 0xd7, 0xd1, 0xca, 0x92, 0xbe, 0x07, 0xe6, 0x8a, 0x16, 0xf4, - 0x2b, 0x6c, 0x11, 0x4b, 0xa2, 0x25, 0x47, 0x86, 0x98, 0x2b, 0x78, 0xdd, - 0xaf, 0xef, 0xab, 0x9c, 0x43, 0xe7, 0x5c, 0x94, 0x3b, 0x41, 0xf2, 0xa4, - 0x21, 0x46, 0xc1, 0x4f, 0xa9, 0x64, 0x09, 0x55, 0x5d, 0xb7, 0xf2, 0x10, - 0xca, 0xdc, 0xfa, 0xd9, 0xf6, 0xd8, 0x47, 0xf9, 0xda, 0x1d, 0xd4, 0x3b, - 0xa0, 0xbf, 0x7c, 0x1c, 0x0a, 0x01, 0x3d, 0x3f, 0xb2, 0x71, 0x98, 0xe3, - 0x25, 0x38, 0x09, 0x2a, 0x30, 0xcf, 0xac, 0xc5, 0x3d, 0x20, 0xcf, 0x5c, - 0x0c, 0xfb, 0x0c, 0xe2, 0xe6, 0x0b, 0x53, 0x34, 0xf5, 0x1d, 0xb8, 0x08, - 0x69, 0xcf, 0xac, 0x47, 0x2a, 0xd5, 0xe8, 0x83, 0xa1, 0x69, 0xf9, 0xb5, - 0xe2, 0xc1, 0x4e, 0x68, 0xae, 0x7d, 0x20, 0x9b, 0xbc, 0x6d, 0xf2, 0x65, - 0x70, 0x3a, 0x09, 0x17, 0xfa, 0xa3, 0x24, 0x47, 0x4a, 0xaf, 0x74, 0x0c, - 0xd1, 0x1f, 0xd3, 0xd6, 0xb0, 0x21, 0x67, 0xb9, 0x58, 0xdb, 0xc3, 0x5f, - 0x95, 0xc1, 0x4c, 0x80, 0x2a, 0xc2, 0xa9, 0x2a, 0x69, 0x0d, 0x9d, 0xd6, - 0xff, 0xc2, 0x32, 0xcd, 0x4c, 0x99, 0x48, 0x50, 0x8a, 0xe8, 0x7e, 0x88, - 0xb8, 0x69, 0x63, 0xea, 0xbc, 0x04, 0xf8, 0xc6, 0x8e, 0x16, 0xe9, 0x9a, - 0x5f, 0x6c, 0x95, 0xf4, 0xb1, 0x0a, 0x4b, 0x0a, 0x16, 0x18, 0x3a, 0xbb, - 0xf1, 0x0c, 0xd7, 0x64, 0xb8, 0xb0, 0xcb, 0xc5, 0xd0, 0x57, 0x0b, 0x92, - 0xec, 0x3c, 0x97, 0xa1, 0x57, 0x54, 0x66, 0xce, 0xc5, 0x4f, 0xcc, 0x28, - 0xbe, 0xe8, 0xfb, 0x12, 0x52, 0x61, 0x4f, 0xa2, 0x0f, 0x56, 0xc4, 0x16, - 0xb8, 0xb6, 0xa0, 0xaa, 0x4a, 0x43, 0x0e, 0xb5, 0x32, 0x97, 0x03, 0xcf, - 0x6a, 0xe7, 0xb7, 0xc2, 0x51, 0x08, 0x7c, 0xb1, 0xdb, 0x05, 0x70, 0xdc, - 0xa1, 0x92, 0x0b, 0x06, 0x3e, 0xeb, 0x02, 0x20, 0x43, 0x73, 0xa9, 0x2f, - 0x62, 0x85, 0x30, 0x15, 0x9f, 0x13, 0x43, 0x00, 0xf3, 0xb4, 0xb0, 0x8b, - 0x53, 0x20, 0x32, 0x7b, 0x04, 0x4c, 0xa8, 0x36, 0x82, 0xbc, 0x5c, 0x7d, - 0xde, 0xd2, 0x81, 0x2c, 0x9a, 0x26, 0x94, 0x45, 0xfd, 0x6d, 0xce, 0xe9, - 0xb9, 0xeb, 0xae, 0xbc, 0xd7, 0xfc, 0xdb, 0x1b, 0xdc, 0x11, 0xcd, 0xb4, - 0x1c, 0xff, 0xed, 0xdf, 0xbb, 0x31, 0x21, 0x15, 0xa3, 0x7a, 0x87, 0x9e, - 0x5c, 0x34, 0x5e, 0x2e, 0x36, 0x9f, 0xce, 0x63, 0xfe, 0x53, 0xbd, 0x4b, - 0x9f, 0xe9, 0xf1, 0x51, 0x5d, 0xe3, 0xb7, 0x7f, 0xc3, 0xe6, 0xfd, 0xff, - 0x3e, 0x7d, 0x69, 0xed, 0xfe, 0x25, 0x2d, 0x27, 0xec, 0x72, 0x90, 0x15, - 0x6e, 0x91, 0xfa, 0x7f, 0x99, 0x97, 0x09, 0xf2, 0x13, 0x80, 0xe3, 0x88, - 0x94, 0x2a, 0x33, 0x84, 0xe7, 0x96, 0xa0, 0x06, 0xc7, 0x11, 0x18, 0x8f, - 0xc7, 0xb3, 0xfc, 0x25, 0xaf, 0x8d, 0x60, 0xc5, 0x09, 0x6b, 0x9a, 0x7f, - 0xa5, 0xeb, 0x06, 0xf7, 0x09, 0x52, 0x7d, 0x33, 0x8d, 0x13, 0x5a, 0x73, - 0x7c, 0xe6, 0x41, 0x41, 0x25, 0xc9, 0xd3, 0x0b, 0x02, 0x45, 0xe8, 0xbd, - 0xc7, 0x04, 0xd8, 0x85, 0xb4, 0x49, 0x27, 0xcb, 0x81, 0x59, 0xc2, 0xb5, - 0x5f, 0x6f, 0xff, 0xe6, 0xed, 0xb1, 0x9f, 0x23, 0x3b, 0xf3, 0xeb, 0x34, - 0x0e, 0x90, 0xc8, 0x53, 0x5c, 0x67, 0xe6, 0x40, 0xce, 0x48, 0x54, 0xd5, - 0x76, 0x9e, 0x07, 0x2d, 0x8c, 0xfa, 0xf0, 0x7e, 0x46, 0x7d, 0xf7, 0xa6, - 0x15, 0xf0, 0xe5, 0x42, 0x4b, 0xcd, 0x08, 0x93, 0x4a, 0x8c, 0xdb, 0x64, - 0xd4, 0x47, 0x65, 0x0b, 0xc2, 0x36, 0xe6, 0x85, 0x8b, 0x6e, 0xd6, 0xc3, - 0x48, 0x77, 0x09, 0x1f, 0xc2, 0xe2, 0x4a, 0x71, 0x4b, 0xf7, 0xf4, 0xbe, - 0xe7, 0xc5, 0x69, 0xf8, 0x7e, 0xd4, 0x68, 0x5a, 0xa2, 0xa1, 0xe5, 0x84, - 0x8e, 0x18, 0xa7, 0x36, 0x4d, 0xc5, 0x35, 0x05, 0x4a, 0x13, 0x8c, 0x53, - 0xd8, 0x70, 0x8c, 0x37, 0x0a, 0x19, 0xec, 0x5f, 0xd8, 0x0f, 0x68, 0xcb, - 0xd9, 0xa6, 0x8f, 0xbb, 0x49, 0x56, 0x40, 0x3b, 0xf2, 0xf1, 0x69, 0x46, - 0xab, 0x71, 0xf9, 0x00, 0x0e, 0x01, 0x44, 0xdc, 0x29, 0x0c, 0xee, 0x09, - 0xb8, 0x99, 0xe5, 0xf2, 0x4b, 0x57, 0x22, 0x9d, 0xfa, 0x1d, 0x0f, 0x5b, - 0x05, 0x6c, 0xe0, 0x19, 0xb9, 0x0f, 0x80, 0xb5, 0x33, 0x5f, 0xf8, 0x55, - 0x84, 0x98, 0xb9, 0x5e, 0x3b, 0x70, 0x04, 0xfb, 0xfc, 0x7a, 0x5d, 0x02, - 0x02, 0x3b, 0x0c, 0xec, 0xa4, 0x0c, 0x70, 0xba, 0x53, 0x2c, 0xeb, 0x2b, - 0x7d, 0xda, 0xb5, 0xb1, 0xc1, 0xf9, 0x4f, 0xf4, 0xa6, 0xf2, 0xf7, 0xe2, - 0x19, 0xd5, 0x38, 0xb8, 0xbe, 0x07, 0x72, 0xb4, 0x2d, 0x7f, 0x32, 0xac, - 0x3c, 0x7a, 0x18, 0x64, 0xde, 0x99, 0x13, 0xf2, 0xa0, 0xde, 0x70, 0xc5, - 0xcb, 0x72, 0x7a, 0x2c, 0xf7, 0xb7, 0x3b, 0xdb, 0x8a, 0x2d, 0x98, 0xbf, - 0xc9, 0x77, 0xd8, 0x39, 0x33, 0x9f, 0x6f, 0xc3, 0x16, 0xe7, 0x09, 0x59, - 0xc4, 0x32, 0xfa, 0x89, 0xdc, 0xf2, 0x47, 0xb1, 0x92, 0x78, 0xb9, 0x61, - 0x7f, 0x11, 0xb9, 0xbb, 0xb7, 0xce, 0x40, 0xeb, 0x50, 0x1b, 0x36, 0xab, - 0xc4, 0xd3, 0x96, 0x50, 0xc4, 0x22, 0x5c, 0xc5, 0x4f, 0x93, 0x83, 0x8c, - 0xab, 0xa1, 0xe4, 0x02, 0x7b, 0x6d, 0xe7, 0x86, 0x94, 0x7f, 0x18, 0x22, - 0x1f, 0x46, 0xfd, 0x89, 0x27, 0xa4, 0xd9, 0x15, 0x9a, 0x99, 0xc3, 0x82, - 0x96, 0x95, 0x23, 0x23, 0x7f, 0xf6, 0x0a, 0x42, 0x16, 0x70, 0x9c, 0x09, - 0xde, 0x92, 0x5c, 0x9f, 0x17, 0xf4, 0xb1, 0x91, 0x11, 0x8f, 0x00, 0xb4, - 0x03, 0xba, 0xd1, 0xb9, 0x7b, 0xe5, 0x22, 0x41, 0x32, 0xc9, 0x6f, 0xe1, - 0xb5, 0xb3, 0x6a, 0xed, 0x12, 0x07, 0xe6, 0x6e, 0x4c, 0x02, 0xd3, 0x16, - 0xd5, 0x0f, 0x01, 0x15, 0x02, 0x58, 0x75, 0x0c, 0xab, 0x84, 0xb2, 0x33, - 0x4b, 0x62, 0x1d, 0x00, 0x71, 0xf7, 0x37, 0xef, 0xeb, 0x1d, 0xab, 0xa9, - 0x92, 0x1a, 0x8c, 0xd7, 0x44, 0x37, 0x75, 0x24, 0x28, 0xd3, 0x5c, 0x5f, - 0xd7, 0xd5, 0x71, 0xad, 0x93, 0x97, 0x31, 0x2d, 0x3e, 0x21, 0x72, 0xd9, - 0xa7, 0xb0, 0xfc, 0x8b, 0xee, 0x5d, 0x68, 0x82, 0xa4, 0x7b, 0xa7, 0x29, - 0x5d, 0x2e, 0x60, 0x13, 0xfd, 0xc3, 0x8c, 0xa5, 0x7e, 0xe3, 0x27, 0xfa, - 0x3d, 0x98, 0x3a, 0x80, 0x14, 0x1c, 0xfd, 0x3e, 0x9f, 0xf2, 0x7f, 0x37, - 0x89, 0xeb, 0xde, 0x14, 0xce, 0xdf, 0xdc, 0xf4, 0x6f, 0x11, 0x0c, 0xf9, - 0x4f, 0xd9, 0xdd, 0x08, 0xd6, 0xdd, 0x64, 0x1e, 0xea, 0x4a, 0x0f, 0x33, - 0x08, 0xb2, 0x0f, 0x0f, 0xaf, 0xba, 0x74, 0xa6, 0x7d, 0xb5, 0x85, 0x81, - 0x69, 0x67, 0x6e, 0x5f, 0xec, 0x9f, 0xdd, 0x21, 0xd3, 0xc4, 0x94, 0x81, - 0xd4, 0xbb, 0x89, 0xa9, 0xa1, 0x84, 0xc7, 0x73, 0x2c, 0x14, 0x74, 0xc2, - 0xf5, 0xfd, 0x5c, 0x1f, 0xd7, 0xc2, 0xa8, 0x2a, 0xa7, 0x31, 0xd1, 0xaa, - 0x74, 0x9d, 0x37, 0x07, 0xdb, 0x9d, 0x1c, 0xec, 0x26, 0x7d, 0x11, 0x6c, - 0xa1, 0xf9, 0x22, 0xaa, 0xbe, 0xc5, 0xa4, 0xb4, 0x9c, 0xcf, 0x65, 0x77, - 0xe7, 0x03, 0xf9, 0x34, 0x5c, 0x7f, 0x40, 0x22, 0x0e, 0x67, 0x36, 0x54, - 0x16, 0xd8, 0x34, 0xca, 0xa6, 0xa3, 0x62, 0x64, 0xc5, 0x3b, 0x1c, 0x79, - 0xab, 0xb0, 0x92, 0xd9, 0xc3, 0x07, 0xaa, 0xfb, 0x0d, 0x41, 0x22, 0x88, - 0xfd, 0x06, 0x97, 0x92, 0xb9, 0x2c, 0x1c, 0x3b, 0x9d, 0xf2, 0x17, 0xc3, - 0x85, 0xb3, 0xf8, 0x10, 0x41, 0x1e, 0x5f, 0xdd, 0xaa, 0x23, 0x1c, 0xc1, - 0xd5, 0x9f, 0x54, 0xfb, 0x48, 0xf2, 0x41, 0xd5, 0x78, 0x09, 0xb5, 0xf9, - 0xc7, 0x90, 0x6d, 0xcb, 0x75, 0x85, 0x20, 0x67, 0xda, 0xa0, 0x6c, 0xf9, - 0x57, 0x76, 0x39, 0x26, 0xd1, 0x35, 0x60, 0xe0, 0xd1, 0x19, 0xee, 0xb4, - 0xf4, 0xe6, 0x83, 0xbf, 0xfd, 0x54, 0x7e, 0x42, 0x40, 0x0f, 0xd3, 0x59, - 0xa7, 0x0f, 0x39, 0x23, 0x9f, 0xda, 0xd5, 0x5c, 0x7a, 0xb5, 0xac, 0x1e, - 0xde, 0xf8, 0xff, 0xcd, 0xe3, 0x5c, 0x6e, 0x03, 0xb2, 0x14, 0x2a, 0x9e, - 0x78, 0x4d, 0x3e, 0xe4, 0xd0, 0x9b, 0x68, 0x3b, 0xb1, 0x72, 0xef, 0xf7, - 0xf8, 0x8e, 0xc8, 0x6c, 0x62, 0x42, 0x5f, 0xb4, 0xdb, 0x0e, 0xab, 0x68, - 0xc9, 0x9d, 0xb4, 0xd1, 0xa8, 0x29, 0xce, 0x9b, 0x2a, 0xb8, 0x54, 0x03, - 0x42, 0x22, 0x9a, 0xb2, 0x78, 0xe8, 0x57, 0x4e, 0x6d, 0x8a, 0xe8, 0x08, - 0xef, 0x04, 0x1d, 0x3a, 0xb1, 0x67, 0x51, 0x67, 0xbf, 0xe6, 0x0c, 0xcc, - 0xfb, 0x28, 0x8e, 0x59, 0x69, 0x54, 0x0e, 0x5e, 0x3e, 0x99, 0x15, 0x67, - 0x1c, 0x16, 0x33, 0x33, 0x32, 0x84, 0xe4, 0xf8, 0x70, 0x5d, 0xcb, 0xd7, - 0x0f, 0xa4, 0xf2, 0x86, 0xcb, 0xc6, 0x25, 0xd9, 0x03, 0x87, 0xae, 0x9d, - 0x23, 0xd5, 0xc7, 0x26, 0xca, 0xc6, 0xa3, 0xba, 0xca, 0x6b, 0xcf, 0x04, - 0xa8, 0xbb, 0x07, 0x0c, 0xe6, 0xb5, 0x87, 0x44, 0x94, 0x6b, 0xb5, 0x2e, - 0x16, 0x66, 0x19, 0x25, 0xb9, 0x42, 0x79, 0xce, 0x46, 0xc8, 0x3a, 0xdd, - 0xec, 0x11, 0xa7, 0xe1, 0xae, 0x4f, 0x91, 0x67, 0xf7, 0xee, 0x67, 0xc1, - 0xa4, 0x52, 0xe3, 0x59, 0xb8, 0xff, 0xd3, 0x4c, 0xaf, 0x6b, 0x31, 0x01, - 0x96, 0x30, 0x14, 0x74, 0x7e, 0xf4, 0x21, 0x31, 0x84, 0x68, 0x87, 0x32, - 0x84, 0x10, 0xad, 0x4c, 0x41, 0x80, 0xa3, 0xfb, 0x55, 0x1c, 0x49, 0x2e, - 0x9a, 0x59, 0x84, 0x9d, 0x36, 0x3a, 0xea, 0x55, 0x0a, 0xd8, 0x00, 0xb1, - 0xf9, 0x7e, 0xb3, 0xeb, 0x7e, 0x87, 0xd5, 0x38, 0x59, 0x97, 0x40, 0xec, - 0xcd, 0x5c, 0xb3, 0x6a, 0x76, 0x0d, 0xad, 0x1f, 0x6e, 0x60, 0x5a, 0x2d, - 0x21, 0xf4, 0x36, 0x96, 0x32, 0x46, 0xc9, 0x84, 0x9f, 0x24, 0xe4, 0x86, - 0x6c, 0xab, 0x37, 0x15, 0x45, 0x77, 0x0d, 0x1e, 0x89, 0xe1, 0xac, 0xda, - 0x5b, 0xf7, 0x83, 0xec, 0xea, 0xa5, 0x9c, 0xa3, 0xe5, 0x15, 0x7c, 0xf8, - 0x39, 0xf9, 0xd5, 0x27, 0x9a, 0xce, 0xb2, 0xc2, 0x6c, 0xd3, 0xf1, 0xf6, - 0x52, 0xe8, 0x50, 0xcb, 0xf6, 0x06, 0x10, 0x3e, 0xd2, 0x8c, 0xcc, 0x31, - 0x24, 0x9c, 0x96, 0x81, 0x5e, 0x28, 0xc7, 0x70, 0xd5, 0xa8, 0xb7, 0xfe, - 0x40, 0x83, 0xdb, 0xfd, 0x92, 0x95, 0xf4, 0x2d, 0x4c, 0xff, 0x49, 0x2e, - 0x76, 0x4d, 0x6b, 0x78, 0x4f, 0x74, 0x48, 0x5a, 0xc5, 0x14, 0x18, 0x64, - 0x25, 0x74, 0x7a, 0x9a, 0xaf, 0x9b, 0x24, 0xfa, 0x3f, 0xfc, 0x0e, 0x6e, - 0x87, 0x60, 0x4b, 0xa2, 0x0a, 0x74, 0x36, 0xfd, 0xfa, 0x9e, 0x68, 0x4a, - 0x0e, 0x81, 0xc1, 0xad, 0xe0, 0x11, 0x8d, 0x9a, 0xb2, 0xdd, 0xf3, 0x4b, - 0x54, 0x68, 0x92, 0x4d, 0x3e, 0x8b, 0xcc, 0x64, 0x61, 0x99, 0x11, 0x3a, - 0x7a, 0x3e, 0x53, 0x7d, 0x93, 0x9e, 0xea, 0x35, 0x6a, 0xc2, 0x67, 0x0b, - 0xa8, 0x82, 0x57, 0x94, 0x59, 0xac, 0x37, 0x64, 0xed, 0x9b, 0x1d, 0x8f, - 0x41, 0xca, 0x57, 0xb5, 0x56, 0x6e, 0x7c, 0x81, 0x22, 0x86, 0xa3, 0xe6, - 0xf6, 0x5f, 0x66, 0xba, 0xba, 0xd1, 0xf5, 0x74, 0x9b, 0x75, 0xe6, 0x6d, - 0x52, 0x9a, 0x44, 0x46, 0xea, 0x35, 0xf7, 0xb2, 0x35, 0x52, 0xc3, 0x88, - 0x2b, 0xa5, 0xd9, 0x95, 0xc1, 0x8c, 0xb2, 0x88, 0xbf, 0xf0, 0x8d, 0xdb, - 0xee, 0x85, 0xbc, 0x89, 0x4e, 0xb8, 0xde, 0xda, 0x60, 0x16, 0xdd, 0xb1, - 0x77, 0xf8, 0x76, 0xa0, 0x75, 0xb6, 0x0b, 0xea, 0x1e, 0x69, 0x71, 0x52, - 0x23, 0xf4, 0x6e, 0x4d, 0xcc, 0xc9, 0x3a, 0x3b, 0xea, 0xc4, 0xdb, 0xc2, - 0xb2, 0x5d, 0x58, 0xc1, 0x82, 0xf8, 0x6f, 0x11, 0x67, 0x89, 0x7d, 0x46, - 0x27, 0x00, 0x92, 0x0e, 0x35, 0xec, 0x15, 0xc8, 0x0c, 0x4a, 0x7d, 0xf0, - 0x56, 0x87, 0xd7, 0x72, 0x13, 0x83, 0x29, 0x21, 0xed, 0x5d, 0x50, 0xcb, - 0x35, 0x5d, 0xe4, 0x8e, 0xf6, 0xbf, 0x8a, 0x71, 0xaa, 0x80, 0xd7, 0x3a, - 0x55, 0xae, 0x54, 0x9e, 0x94, 0xa2, 0xe9, 0xba, 0xfd, 0x80, 0x65, 0x2a, - 0x89, 0x72, 0x39, 0x0a, 0xa1, 0xdf, 0xe3, 0xa3, 0xcc, 0x50, 0x49, 0x48, - 0x07, 0xea, 0xaa, 0xd4, 0x08, 0xc6, 0xae, 0xcd, 0x44, 0xec, 0x56, 0x8d, - 0x71, 0x60, 0xd8, 0x9f, 0x17, 0x95, 0xfb, 0xf4, 0x46, 0x50, 0x44, 0x7c, - 0xa4, 0xe3, 0xe3, 0xe4, 0xf7, 0x0f, 0xb3, 0x79, 0x0e, 0xfd, 0xb9, 0x2e, - 0x08, 0x41, 0xce, 0xe2, 0x8e, 0x2e, 0x0f, 0x1f, 0xbc, 0x15, 0x22, 0x61, - 0x88, 0xe5, 0xc1, 0x4b, 0x75, 0x43, 0xeb, 0x9c, 0xab, 0x3e, 0xdb, 0x8a, - 0xdc, 0x8d, 0x07, 0x78, 0xb4, 0xbc, 0xaf, 0xe3, 0xb3, 0x3d, 0x52, 0xde, - 0x1f, 0x66, 0x32, 0xe7, 0x6c, 0x85, 0x3b, 0x7a, 0x9a, 0xdb, 0x33, 0xce, - 0xbd, 0x8d, 0xbf, 0xb6, 0xa8, 0xbd, 0xe1, 0xa0, 0xd5, 0xe7, 0xdb, 0x38, - 0xfa, 0x39, 0x96, 0xae, 0x99, 0x42, 0x4a, 0xc1, 0x2a, 0x2d, 0x37, 0xca, - 0x03, 0xd1, 0x75, 0x31, 0x5e, 0x9c, 0x77, 0x0f, 0xf0, 0xf7, 0x6c, 0x33, - 0xf9, 0xf9, 0xa6, 0x76, 0x49, 0x5b, 0xff, 0xcf, 0xa9, 0x46, 0x82, 0x60, - 0x3b, 0x7f, 0xaa, 0x8f, 0x11, 0xd2, 0x04, 0xd2, 0x68, 0xe9, 0xe1, 0xa3, - 0x69, 0x19, 0xe6, 0xb0, 0x60, 0xf1, 0xd0, 0x02, 0xd1, 0x08, 0xf5, 0x1c, - 0x13, 0xfa, 0xe0, 0x13, 0x51, 0x14, 0x24, 0x05, 0x20, 0x16, 0xd0, 0x42, - 0x3f, 0x06, 0x5a, 0x66, 0x48, 0x16, 0x91, 0x8b, 0xb6, 0x58, 0xc5, 0x01, - 0x4d, 0xcb, 0x09, 0x53, 0x32, 0x3b, 0x2e, 0x60, 0x5f, 0x96, 0x4a, 0x93, - 0xed, 0x7b, 0xba, 0x48, 0xf6, 0xcf, 0xce, 0xe4, 0xc2, 0x1f, 0x57, 0x5b, - 0xd0, 0xfb, 0x4c, 0x98, 0x44, 0x23, 0x33, 0xc0, 0x98, 0xa8, 0x06, 0x17, - 0x08, 0x3d, 0xd4, 0xd3, 0xb4, 0xf0, 0x21, 0xd9, 0x8c, 0x21, 0x66, 0x5e, - 0xc1, 0xcb, 0x19, 0xe3, 0x83, 0xe0, 0x87, 0xcc, 0x9f, 0x41, 0xa9, 0xeb, - 0x60, 0x32, 0xce, 0xd8, 0xb7, 0x03, 0x23, 0x2e, 0x4d, 0x74, 0x31, 0x82, - 0xee, 0xc2, 0xee, 0x20, 0x8b, 0x36, 0x10, 0x60, 0xc8, 0x03, 0xb0, 0x06, - 0x55, 0x9c, 0x8b, 0x8b, 0xdd, 0x67, 0x76, 0x56, 0x86, 0xb8, 0xe2, 0x4f, - 0x6c, 0xf0, 0x5a, 0xf1, 0x7c, 0x8d, 0x00, 0x18, 0xff, 0x61, 0x5e, 0x42, - 0x2a, 0x60, 0xa3, 0x41, 0x35, 0x74, 0x3b, 0x8d, 0x07, 0x42, 0x9d, 0x5b, - 0x59, 0x14, 0x6e, 0x92, 0x32, 0x68, 0xe4, 0xfa, 0x63, 0x8b, 0x68, 0xe9, - 0x7c, 0x92, 0xa5, 0x85, 0xa2, 0xb9, 0x5d, 0xa5, 0x82, 0x50, 0x18, 0x3a, - 0xc3, 0xdc, 0xb2, 0x47, 0x7e, 0x75, 0xbd, 0x87, 0x73, 0xce, 0x09, 0x22, - 0xa6, 0x61, 0x61, 0xe5, 0x6f, 0xd6, 0xaa, 0x60, 0xc2, 0x6b, 0xf0, 0xe3, - 0x02, 0xd6, 0xce, 0x8f, 0x57, 0xc8, 0xdc, 0x3f, 0x84, 0x56, 0xb8, 0xbb, - 0x47, 0x50, 0x84, 0x51, 0xa6, 0xfa, 0x6f, 0x8e, 0xed, 0xe1, 0x20, 0x18, - 0xbb, 0x45, 0x32, 0x3a, 0x14, 0xeb, 0x0b, 0x44, 0x3a, 0xc6, 0x30, 0xfb, - 0xa8, 0x1c, 0x46, 0x7c, 0xa8, 0x1f, 0x2d, 0xee, 0x6b, 0x11, 0x07, 0x41, - 0xfa, 0xf3, 0xa2, 0x54, 0xaf, 0x04, 0x0f, 0x22, 0x2e, 0x4e, 0x8e, 0xeb, - 0x58, 0xf1, 0x90, 0xf5, 0xe4, 0xa0, 0x3f, 0x3b, 0xe6, 0xe6, 0xc9, 0xfd, - 0x9f, 0x09, 0xc5, 0x04, 0xa8, 0x53, 0xaf, 0xdc, 0x5f, 0xb2, 0x1e, 0xbb, - 0x45, 0x52, 0xb4, 0xb8, 0x12, 0xa6, 0xec, 0x27, 0x13, 0x9d, 0xb7, 0x09, - 0xd5, 0xec, 0x35, 0xf2, 0xbc, 0x47, 0x02, 0x5b, 0xac, 0x0d, 0x7d, 0x38, - 0xa3, 0xf7, 0xa8, 0x1d, 0xd4, 0xb8, 0xb7, 0x1f, 0xac, 0x8b, 0xbb, 0x61, - 0x1b, 0xe7, 0x01, 0x37, 0x4e, 0x50, 0x79, 0x33, 0xdc, 0xbd, 0x8d, 0x48, - 0x1b, 0xbb, 0x4c, 0xed, 0x9c, 0xc9, 0x07, 0x8c, 0x89, 0x0c, 0x44, 0x68, - 0xbb, 0xbe, 0x97, 0xe4, 0x79, 0xb6, 0x99, 0x5f, 0xe4, 0xeb, 0xb2, 0xc5, - 0xf2, 0xca, 0x8a, 0xf5, 0xa0, 0x44, 0x2c, 0x65, 0xff, 0xf7, 0x26, 0x56, - 0xdc, 0x81, 0x9c, 0x77, 0xee, 0xfb, 0x7a, 0x10, 0xbe, 0x96, 0x08, 0x51, - 0x4d, 0x5a, 0x2e, 0xab, 0xed, 0x21, 0x3a, 0x62, 0xa8, 0x82, 0x60, 0x48, - 0x25, 0x83, 0xbc, 0x8a, 0x6f, 0xe2, 0xa4, 0x89, 0x4a, 0x3a, 0xbd, 0xbd, - 0x47, 0x98, 0x9f, 0x1f, 0x93, 0xfc, 0x75, 0x7c, 0x43, 0x80, 0x1f, 0x7a, - 0xed, 0x2b, 0x63, 0x27, 0x5f, 0x94, 0x5b, 0xab, 0xba, 0xbb, 0xef, 0x6f, - 0x73, 0xb7, 0xa1, 0x1b, 0x70, 0xd8, 0xbe, 0xc9, 0x1f, 0xf4, 0x1e, 0x88, - 0x66, 0xe3, 0xa7, 0x28, 0x5e, 0x04, 0x18, 0x83, 0x6b, 0xe9, 0xc2, 0x42, - 0x44, 0x7d, 0x80, 0xaa, 0xf1, 0x1a, 0x41, 0x13, 0xa6, 0x59, 0x7e, 0x84, - 0xf9, 0x34, 0x0f, 0x20, 0x0c, 0x9f, 0x5c, 0x5a, 0xf7, 0xd0, 0xb4, 0x2e, - 0x1e, 0xf4, 0xef, 0xc8, 0x02, 0xcd, 0x53, 0xeb, 0x48, 0xc0, 0xb2, 0x3b, - 0x44, 0xa2, 0x48, 0xd4, 0x45, 0x89, 0xc6, 0x1d, 0x0a, 0x76, 0x7d, 0x8a, - 0x42, 0xe4, 0xcd, 0xcb, 0x74, 0x98, 0x10, 0x59, 0xea, 0x68, 0x5b, 0xca, - 0x5f, 0x66, 0x23, 0x90, 0xd3, 0xbc, 0x30, 0x70, 0x0e, 0x21, 0x23, 0x67, - 0xe6, 0x4a, 0x1e, 0xeb, 0xda, 0xbc, 0xb9, 0x44, 0x3f, 0xd3, 0xc1, 0xaa, - 0xa0, 0x4d, 0x40, 0xc9, 0xdb, 0x05, 0x68, 0x0b, 0x2a, 0x34, 0x0e, 0xd5, - 0x6d, 0xe8, 0xb1, 0xfe, 0x31, 0x42, 0xfb, 0xfb, 0xb4, 0x87, 0x45, 0x24, - 0xc1, 0x80, 0xd0, 0x3b, 0x4e, 0x0d, 0xa9, 0x34, 0x2b, 0xc9, 0xe3, 0x2f, - 0xf9, 0x73, 0xd3, 0x2f, 0x27, 0xa2, 0xd1, 0xa4, 0x00, 0x73, 0xd3, 0xe6, - 0x2d, 0xdf, 0x7f, 0xcf, 0x32, 0xc9, 0x9a, 0xfa, 0xf0, 0x48, 0x52, 0x32, - 0x03, 0xbe, 0xee, 0x7b, 0xd5, 0x3a, 0x7c, 0x23, 0xcf, 0xca, 0x93, 0xb9, - 0xca, 0x4d, 0xdc, 0x3a, 0x51, 0xae, 0x7e, 0xd7, 0x1c, 0xf0, 0xc8, 0x2f, - 0xb6, 0x59, 0xe6, 0xdd, 0xb1, 0x74, 0x0c, 0xf0, 0xf1, 0xbe, 0x2d, 0xc9, - 0xb4, 0xbd, 0x56, 0x89, 0x64, 0x83, 0xad, 0x6d, 0xa9, 0x14, 0x7c, 0x74, - 0xb8, 0x7d, 0x5d, 0x71, 0x98, 0x0c, 0x72, 0x84, 0xac, 0x32, 0x8f, 0x8f, - 0x49, 0x1a, 0x23, 0x9a, 0xdd, 0xae, 0xc8, 0x1c, 0xdd, 0xcd, 0x45, 0x1a, - 0x20, 0xca, 0x7d, 0xd1, 0x04, 0xd3, 0x03, 0x5c, 0x1c, 0xdd, 0x29, 0x02, - 0xfd, 0x2b, 0x4e, 0x33, 0x89, 0x89, 0xe4, 0x68, 0x83, 0x88, 0x7c, 0xd0, - 0xc4, 0x85, 0x44, 0xa3, 0x97, 0xe9, 0x2b, 0x27, 0x77, 0x0c, 0x46, 0xdc, - 0x0e, 0x7d, 0xf5, 0x4c, 0x23, 0x26, 0x71, 0xbe, 0x67, 0x68, 0x22, 0xc9, - 0xff, 0x24, 0x80, 0xa0, 0xf3, 0x17, 0xc5, 0x15, 0xaf, 0x58, 0x24, 0x68, - 0xa7, 0x19, 0x5d, 0xf0, 0x3a, 0xb8, 0xdb, 0x9a, 0x05, 0xc9, 0xb4, 0x32, - 0x66, 0x91, 0x4e, 0x13, 0x00, 0xee, 0x17, 0xd4, 0x08, 0x15, 0x57, 0x73, - 0x73, 0xa7, 0x55, 0xff, 0x08, 0x13, 0xc4, 0xdb, 0x48, 0x8f, 0xed, 0xa6, - 0xd3, 0x0e, 0x7a, 0x64, 0xa1, 0xb7, 0xba, 0xdb, 0xd1, 0x80, 0x40, 0x86, - 0x81, 0x9d, 0xe6, 0x9c, 0x54, 0xdc, 0x35, 0x00, 0x10, 0xb0, 0x0f, 0x0e, - 0x68, 0x41, 0x5f, 0x32, 0x8f, 0xae, 0x75, 0x5b, 0xb5, 0x6c, 0x79, 0xb4, - 0x73, 0x88, 0xde, 0xdf, 0x73, 0xa5, 0xf8, 0xa9, 0xba, 0xcf, 0xe1, 0x9e, - 0x37, 0x67, 0xcc, 0x52, 0x42, 0x12, 0x7e, 0xce, 0x47, 0xd0, 0x6c, 0x26, - 0x49, 0x24, 0xff, 0xb0, 0x4b, 0x79, 0x10, 0x25, 0x8e, 0x91, 0x5a, 0x5d, - 0xd1, 0xad, 0x32, 0x9c, 0x38, 0xfd, 0xd4, 0x6c, 0xe8, 0x07, 0xda, 0x7d, - 0x42, 0xc8, 0x28, 0x46, 0xb2, 0xfc, 0x80, 0x83, 0x1b, 0x3e, 0xf7, 0xe2, - 0xc2, 0xfd, 0xa0, 0xc0, 0x35, 0x9e, 0xec, 0x3f, 0xfd, 0x00, 0x3e, 0xf3, - 0xd7, 0x34, 0x86, 0x9c, 0x55, 0x92, 0x20, 0x88, 0x7a, 0x65, 0x74, 0x9c, - 0x36, 0x74, 0x76, 0x88, 0x6d, 0xc7, 0xba, 0x4b, 0xe7, 0x05, 0xa8, 0xc5, - 0xf1, 0xe4, 0x50, 0x97, 0x11, 0xf4, 0xf2, 0x51, 0x73, 0x40, 0xb5, 0x18, - 0x89, 0xe1, 0x1c, 0x08, 0xf6, 0x7e, 0x41, 0x43, 0x16, 0x4a, 0x55, 0x35, - 0xfc, 0x48, 0xee, 0x04, 0x05, 0x0a, 0xcd, 0xdc, 0xbf, 0xe9, 0xd7, 0xbf, - 0x68, 0x63, 0xc8, 0x28, 0xee, 0xaa, 0xbc, 0xc3, 0x38, 0x00, 0x64, 0xff, - 0xc6, 0x17, 0x49, 0xc6, 0xbb, 0xc0, 0x06, 0x76, 0x9e, 0xdb, 0x87, 0xa0, - 0x4e, 0x15, 0xa3, 0x53, 0x13, 0x55, 0xb9, 0xf0, 0x5c, 0xa8, 0x6b, 0xcd, - 0x4e, 0x95, 0x19, 0xb0, 0x0e, 0x27, 0xda, 0xb9, 0xa5, 0x05, 0x5f, 0x58, - 0x59, 0xf6, 0x0f, 0x29, 0xc1, 0x3d, 0x89, 0x3f, 0x45, 0x47, 0x58, 0x3b, - 0x9a, 0x9a, 0x52, 0xff, 0x0d, 0x95, 0xe8, 0xc5, 0xc1, 0xfe, 0xd8, 0x66, - 0xca, 0xc7, 0xb7, 0xa4, 0x1e, 0x86, 0x96, 0xdb, 0x9e, 0x6a, 0x1b, 0x90, - 0x17, 0x68, 0x2e, 0x5f, 0x39, 0x44, 0x07, 0x97, 0x5b, 0x8a, 0x0c, 0x11, - 0x06, 0x85, 0x08, 0x60, 0xb4, 0x28, 0x8d, 0xb5, 0x67, 0xda, 0x92, 0x4a, - 0x30, 0xc8, 0xf1, 0x75, 0xc7, 0xe9, 0xf7, 0xab, 0x66, 0x41, 0x79, 0x72, - 0xe7, 0xf4, 0xfa, 0x0f, 0x5c, 0xaa, 0xc0, 0xe4, 0xb9, 0x4c, 0x0c, 0x6d, - 0x63, 0x4d, 0x6f, 0xf6, 0x82, 0xf2, 0x47, 0x70, 0x8b, 0x55, 0x83, 0x3b, - 0x60, 0x3d, 0x94, 0x09, 0x76, 0xf0, 0x13, 0xf4, 0x15, 0xf3, 0x42, 0x13, - 0xfc, 0x9b, 0x62, 0x11, 0x5a, 0xf7, 0x85, 0xdf, 0xcc, 0xd2, 0x21, 0xee, - 0xbd, 0xc2, 0x32, 0x33, 0x7a, 0x49, 0x5e, 0x90, 0xff, 0xfd, 0xfa, 0x03, - 0xb0, 0x03, 0x3d, 0x1b, 0x6a, 0xad, 0x17, 0xe3, 0xb4, 0x76, 0xce, 0x96, - 0x90, 0x17, 0x44, 0x1a, 0x6f, 0xb4, 0x04, 0xdc, 0x05, 0x11, 0x54, 0x8f, - 0xf0, 0x0f, 0xef, 0xcd, 0xae, 0x77, 0xa5, 0xa2, 0x10, 0x45, 0x3f, 0x89, - 0x05, 0x93, 0xfe, 0x7b, 0xe3, 0x06, 0x2f, 0x0b, 0x34, 0x6d, 0x97, 0x85, - 0xad, 0x7e, 0xd5, 0xb5, 0x6a, 0xd7, 0x72, 0x8b, 0x3e, 0x70, 0x09, 0xb7, - 0x44, 0x44, 0x76, 0xd7, 0xc5, 0x7d, 0x43, 0xc0, 0x4d, 0xd9, 0x84, 0xe8, - 0xb2, 0x71, 0xf6, 0xd6, 0x37, 0xc0, 0x50, 0x26, 0xb9, 0xa3, 0x76, 0xc1, - 0x87, 0x6c, 0x39, 0x7c, 0x61, 0xa9, 0xaa, 0x0d, 0xd9, 0x08, 0xcb, 0x01, - 0xf1, 0x4f, 0x31, 0x39, 0x4b, 0x45, 0xd7, 0xd6, 0xb0, 0x3d, 0x84, 0x7b, - 0xe4, 0x9c, 0xb8, 0xee, 0x4a, 0x60, 0x3b, 0x4e, 0xda, 0x32, 0xca, 0xdd, - 0x81, 0x83, 0xce, 0x2e, 0xcd, 0x77, 0x37, 0x7c, 0x95, 0x81, 0x38, 0x86, - 0x20, 0x4c, 0x78, 0xce, 0x66, 0x70, 0xd9, 0x22, 0xc4, 0x57, 0x50, 0x3d, - 0x49, 0x1d, 0xe0, 0x81, 0x6e, 0x63, 0x01, 0xba, 0xc5, 0xfe, 0x75, 0x5e, - 0x20, 0x74, 0xf0, 0x09, 0xa6, 0x60, 0x4b, 0xfc, 0xb0, 0xde, 0x26, 0x34, - 0xa5, 0xf2, 0xd1, 0xd1, 0x46, 0x21, 0x9a, 0x1a, 0xeb, 0x5b, 0x62, 0xb8, - 0x8b, 0x3c, 0x29, 0xe2, 0xe1, 0x4a, 0xaa, 0x67, 0xce, 0x82, 0x8f, 0x8f, - 0x63, 0x56, 0x38, 0x7e, 0x61, 0x83, 0x20, 0x91, 0x1b, 0x44, 0x2b, 0xac, - 0x57, 0xaf, 0x7f, 0xed, 0x9a, 0xbf, 0xd0, 0x09, 0x53, 0xa3, 0xb4, 0x02, - 0xb2, 0xcc, 0x8d, 0x61, 0xf4, 0x6a, 0xd8, 0xea, 0xc7, 0x6d, 0x30, 0x7a, - 0x90, 0x31, 0xe9, 0xf4, 0xee, 0x7d, 0x98, 0xab, 0x6a, 0x19, 0x19, 0x67, - 0x10, 0x57, 0xf0, 0x74, 0x43, 0x27, 0xa1, 0xc0, 0xb2, 0xad, 0x74, 0xf3, - 0xaa, 0x4a, 0xf4, 0xa2, 0x55, 0x30, 0x5e, 0x6b, 0xeb, 0x4c, 0x05, 0x72, - 0xab, 0xf6, 0x95, 0x19, 0x96, 0x3c, 0xf3, 0xb2, 0x17, 0xff, 0x7d, 0x91, - 0xdf, 0x0c, 0xdd, 0xd0, 0x51, 0xe7, 0x67, 0x5b, 0x77, 0x07, 0x2c, 0xff, - 0x3b, 0x74, 0xcd, 0x27, 0xef, 0xb6, 0x2d, 0x26, 0x65, 0x63, 0xd4, 0xb6, - 0x01, 0xa5, 0x3e, 0x1c, 0x82, 0xa0, 0x63, 0x10, 0xf0, 0x2e, 0xbf, 0xd5, - 0x18, 0xf1, 0xb9, 0x44, 0x41, 0x76, 0xbc, 0xb1, 0xab, 0x15, 0x21, 0xbb, - 0x99, 0x81, 0x76, 0x69, 0xd1, 0x37, 0xa3, 0x79, 0xe2, 0x2b, 0x98, 0x5d, - 0x55, 0x11, 0x0c, 0xfb, 0xa1, 0xc9, 0xfe, 0x8a, 0x4b, 0x7a, 0x02, 0x96, - 0x1f, 0xc2, 0x71, 0xc9, 0xf6, 0x7a, 0x65, 0x97, 0xf7, 0x8b, 0xc7, 0x15, - 0xab, 0xca, 0x2a, 0xc7, 0x8d, 0x2b, 0x15, 0x63, 0x8f, 0xb8, 0xb6, 0x4d, - 0xe5, 0xe6, 0xcc, 0x26, 0x8c, 0x4e, 0x17, 0x67, 0x95, 0x99, 0x91, 0xec, - 0xfd, 0x55, 0x9f, 0x64, 0x34, 0x8c, 0x3c, 0x21, 0x08, 0xf4, 0x97, 0x42, - 0xda, 0x11, 0x5f, 0xa4, 0x46, 0xd7, 0x88, 0x59, 0x44, 0x25, 0x1f, 0x7b, - 0x71, 0x59, 0x5b, 0x59, 0x06, 0xb1, 0x14, 0xc1, 0x92, 0x38, 0xb8, 0xe5, - 0x3e, 0x0c, 0xf8, 0x9b, 0x8f, 0x64, 0x56, 0xf0, 0x95, 0xee, 0x50, 0x76, - 0xd1, 0x31, 0x7c, 0x0d, 0x72, 0x24, 0xcd, 0x0c, 0x96, 0xfc, 0x96, 0x50, - 0xcf, 0xce, 0xdb, 0xfa, 0x98, 0xaf, 0x6b, 0x85, 0x51, 0x35, 0x94, 0x6f, - 0x5d, 0x96, 0x1d, 0xc8, 0xc1, 0xf5, 0x66, 0x8b, 0x46, 0x58, 0x24, 0xad, - 0x8b, 0x0d, 0x61, 0x05, 0x57, 0x29, 0x03, 0x40, 0x96, 0xa2, 0x69, 0x6c, - 0x41, 0xa4, 0x4e, 0x21, 0xb9, 0x36, 0x99, 0xd7, 0x86, 0x4e, 0x8f, 0x4a, - 0xca, 0x4b, 0xb4, 0x10, 0xf5, 0x9d, 0x71, 0x96, 0x9e, 0x7b, 0x08, 0x34, - 0x36, 0x5c, 0xaf, 0x89, 0xb7, 0x7b, 0x93, 0x69, 0x57, 0x2b, 0x0b, 0xa1, - 0x7d, 0x75, 0xce, 0x93, 0x20, 0x89, 0x4a, 0xa7, 0xe8, 0x16, 0xc8, 0x53, - 0xf9, 0xa9, 0xd4, 0xbe, 0x0b, 0x49, 0x5a, 0xe4, 0x65, 0x17, 0xb9, 0x9a, - 0xe0, 0xdd, 0x57, 0x83, 0x1e, 0xce, 0xda, 0x1b, 0x4b, 0xf7, 0x62, 0xd3, - 0x61, 0xec, 0x3a, 0x4c, 0x20, 0x63, 0xd1, 0x86, 0x29, 0x77, 0x2d, 0x78, - 0x23, 0xb3, 0x2e, 0x9f, 0xab, 0x5c, 0x7f, 0x91, 0x26, 0x48, 0x48, 0x1c, - 0x7a, 0x36, 0xd2, 0xe1, 0x99, 0x89, 0xc8, 0xf9, 0xaf, 0xbb, 0x11, 0xbd, - 0xbd, 0x65, 0xc3, 0xbf, 0xda, 0x8b, 0xbf, 0xd7, 0x14, 0xf7, 0x2d, 0x9e, - 0xde, 0xdf, 0x98, 0x98, 0xe3, 0x5b, 0xb4, 0x39, 0xf5, 0xe9, 0xaa, 0xd0, - 0x0c, 0xfe, 0x70, 0x7b, 0x76, 0x60, 0x51, 0x21, 0xda, 0xe9, 0xe4, 0x91, - 0xca, 0x99, 0xbe, 0x31, 0xc7, 0xda, 0x90, 0xb8, 0x91, 0x3a, 0xfd, 0xfd, - 0x50, 0x0f, 0x30, 0x43, 0xd2, 0xa9, 0xac, 0xb4, 0x1b, 0x48, 0xb7, 0x7b, - 0x24, 0xfb, 0xa7, 0x5a, 0x86, 0x2c, 0x0a, 0xee, 0xb4, 0x8b, 0x07, 0x8d, - 0xbd, 0x01, 0x65, 0xf8, 0x65, 0xaf, 0xdf, 0x6d, 0x53, 0xff, 0x0c, 0xda, - 0x7f, 0x3f, 0xa4, 0x39, 0x92, 0xe4, 0x3c, 0xc7, 0xab, 0x54, 0xba, 0x5e, - 0x6c, 0x66, 0x3b, 0xd6, 0xdd, 0xdc, 0xef, 0x50, 0x2d, 0xbb, 0x66, 0xb4, - 0xa9, 0x64, 0x7d, 0x29, 0x90, 0x1f, 0xc9, 0x07, 0xbc, 0xd4, 0x48, 0x35, - 0x3e, 0x0d, 0xf0, 0xf6, 0x78, 0x81, 0x67, 0xeb, 0x71, 0xfe, 0xd5, 0x8c, - 0x22, 0xa9, 0x1a, 0x35, 0x1b, 0x7c, 0x0d, 0x15, 0x84, 0xa4, 0x5e, 0x91, - 0xdf, 0xe8, 0x06, 0x0f, 0xae, 0x17, 0xdd, 0x33, 0x39, 0x4a, 0x7b, 0xe8, - 0x07, 0xcb, 0xd3, 0xbf, 0xf0, 0x11, 0x98, 0x11, 0xf3, 0x74, 0x2a, 0xb7, - 0x81, 0xf8, 0x51, 0xc5, 0xcb, 0xa6, 0xe5, 0x9e, 0x74, 0x2e, 0x10, 0xe7, - 0x82, 0xaf, 0x67, 0x76, 0x18, 0x2a, 0x06, 0x1e, 0xc7, 0xed, 0x02, 0x9e, - 0x73, 0x65, 0x25, 0x77, 0x57, 0x3a, 0x7e, 0x4f, 0xa2, 0xd2, 0x33, 0xe7, - 0x22, 0x54, 0xf0, 0x60, 0x6e, 0x63, 0xd7, 0x32, 0x4f, 0x19, 0xa1, 0x20, - 0x72, 0x43, 0x34, 0xbb, 0x02, 0x83, 0xd5, 0xc0, 0xc1, 0x59, 0xcd, 0x3a, - 0x39, 0x8a, 0x7b, 0x5e, 0xba, 0xf0, 0x00, 0xd7, 0x0a, 0x16, 0xe0, 0xdc, - 0xcb, 0x0d, 0x93, 0xf4, 0xdc, 0xa7, 0xfb, 0x1a, 0x4d, 0x90, 0xe8, 0xbc, - 0x45, 0x03, 0x1f, 0x07, 0x97, 0x02, 0x8e, 0xac, 0x3e, 0x6e, 0xe0, 0x80, - 0xaf, 0xf1, 0x06, 0xac, 0x4a, 0x73, 0x75, 0x8c, 0x04, 0x74, 0x75, 0x52, - 0x07, 0x54, 0x34, 0x72, 0x0d, 0xe4, 0xbb, 0x1f, 0xdf, 0x60, 0x6a, 0x39, - 0x74, 0x4e, 0x95, 0x96, 0x26, 0xe9, 0xe5, 0x18, 0xda, 0x3c, 0x25, 0x7d, - 0xd0, 0xd8, 0x4a, 0x13, 0x5f, 0x32, 0x18, 0x2a, 0xc5, 0x57, 0x52, 0x36, - 0xd6, 0x9d, 0x25, 0x3c, 0x5f, 0x45, 0x45, 0xa1, 0x19, 0x11, 0x3d, 0xc6, - 0x3f, 0xa7, 0x5a, 0x0e, 0x0f, 0x4f, 0x42, 0x5a, 0x03, 0xb7, 0x3f, 0xbf, - 0x6b, 0x7e, 0x4a, 0x43, 0x1c, 0xf7, 0x2b, 0x44, 0x27, 0x3d, 0xbc, 0x52, - 0x04, 0x49, 0xb0, 0x16, 0x29, 0xc8, 0x68, 0xff, 0x50, 0xa6, 0x00, 0x3a, - 0x53, 0x19, 0x71, 0x3e, 0xc4, 0xb6, 0x36, 0x9d, 0xc3, 0x1e, 0x7a, 0xde, - 0x45, 0xbc, 0x2b, 0xc4, 0x25, 0xe2, 0x04, 0x12, 0xff, 0x00, 0xd0, 0xaf, - 0x3d, 0xa1, 0x49, 0x12, 0x3a, 0x92, 0x42, 0x71, 0xfc, 0xcd, 0x6a, 0x8d, - 0xbb, 0x0f, 0xd6, 0xe2, 0x09, 0x81, 0x51, 0x61, 0x87, 0xb6, 0xc8, 0xc4, - 0xfe, 0xe1, 0xd3, 0xef, 0xd3, 0x25, 0xd4, 0xf9, 0x00, 0xa8, 0xdc, 0x58, - 0x84, 0xe5, 0x3c, 0x68, 0xb0, 0x27, 0xd5, 0x21, 0x48, 0xad, 0x2c, 0x39, - 0x73, 0x3d, 0x24, 0xb6, 0xfa, 0xe6, 0x0e, 0xa3, 0x47, 0x5a, 0x5b, 0xc5, - 0x83, 0x03, 0xc3, 0x02, 0x7c, 0x5a, 0x30, 0xe2, 0x13, 0xef, 0x05, 0x5b, - 0xc0, 0x17, 0x3c, 0x95, 0xe6, 0x63, 0x8d, 0x00, 0x1d, 0x60, 0xf2, 0xb3, - 0x19, 0xb5, 0xc4, 0x6f, 0xe9, 0x8b, 0x9d, 0xab, 0x55, 0x52, 0x17, 0x7b, - 0xa7, 0x45, 0x5d, 0x7f, 0xe7, 0x58, 0xc9, 0x1c, 0xd7, 0x4e, 0x68, 0x1c, - 0xaa, 0x25, 0x30, 0x60, 0x27, 0x38, 0xc5, 0xfb, 0x5e, 0x67, 0x95, 0x77, - 0xd8, 0xe3, 0x24, 0x0d, 0xf3, 0x58, 0x49, 0x72, 0x5c, 0x0b, 0x9e, 0x41, - 0x7d, 0x5c, 0xbd, 0xad, 0xdb, 0x5d, 0x86, 0xbd, 0xe9, 0xd7, 0x13, 0xb3, - 0x34, 0x14, 0xd4, 0x03, 0xc0, 0x5f, 0xa8, 0x5d, 0xfc, 0x63, 0x2c, 0x4d, - 0xaa, 0x9c, 0x42, 0xaa, 0xde, 0x4e, 0xd6, 0x16, 0x8c, 0xc8, 0x85, 0x23, - 0xbe, 0x65, 0x90, 0x5d, 0xf0, 0x68, 0x47, 0x18, 0x65, 0xc2, 0x1a, 0x2b, - 0x7d, 0x8e, 0xea, 0xe2, 0x21, 0xf9, 0x66, 0xfd, 0x37, 0x16, 0xec, 0x9b, - 0x60, 0xf5, 0xcb, 0xb3, 0xe5, 0x13, 0xe1, 0x86, 0xc0, 0x40, 0x0d, 0xfd, - 0x2a, 0x6d, 0xc2, 0xd6, 0xef, 0xa0, 0x1d, 0xcf, 0xd8, 0x50, 0xd1, 0x09, - 0x59, 0x46, 0x3d, 0x92, 0x39, 0x0a, 0x3b, 0x0f, 0x2c, 0xa0, 0x28, 0x4f, - 0xf6, 0x62, 0x2b, 0x45, 0x18, 0x8b, 0xff, 0x68, 0x91, 0xec, 0xa7, 0x59, - 0x19, 0x2a, 0xeb, 0x3c, 0xe3, 0x03, 0xe7, 0x6d, 0x60, 0xc2, 0xd9, 0xf2, - 0x4a, 0x0a, 0x1f, 0xb6, 0x5b, 0x74, 0xba, 0x0b, 0x85, 0x1e, 0xe7, 0x3e, - 0x19, 0x3c, 0x69, 0x3a, 0xc6, 0x3c, 0xfc, 0x50, 0x6f, 0x13, 0x7d, 0x92, - 0xe7, 0x98, 0x73, 0xb4, 0x86, 0x41, 0x04, 0x93, 0x70, 0x81, 0x3f, 0x62, - 0x55, 0x04, 0xbd, 0x74, 0x81, 0x02, 0x60, 0xa5, 0x62, 0x8a, 0x8d, 0xd0, - 0x04, 0x03, 0x6d, 0x3e, 0x7a, 0xd8, 0xf3, 0x2f, 0x56, 0x0d, 0xab, 0x5f, - 0x57, 0x0e, 0xd1, 0x3c, 0x43, 0x93, 0x7f, 0xe6, 0x38, 0x1d, 0x6d, 0xe4, - 0x19, 0xc4, 0x11, 0xe4, 0x37, 0xeb, 0xcb, 0x06, 0xfe, 0x6e, 0x86, 0x8f, - 0x67, 0x80, 0x5f, 0x7b, 0x71, 0x69, 0xc6, 0x12, 0x22, 0xb7, 0x14, 0x4f, - 0x44, 0x54, 0xe0, 0x0a, 0xc1, 0x62, 0x6b, 0x54, 0xcf, 0xf1, 0xaf, 0x76, - 0x98, 0x59, 0x95, 0xfd, 0xc6, 0xf3, 0xfe, 0x77, 0x9b, 0x6a, 0x8c, 0x29, - 0x31, 0x82, 0xd9, 0x70, 0xee, 0xab, 0x1c, 0x91, 0x1c, 0x94, 0xa5, 0x5b, - 0x81, 0x8e, 0x62, 0x8a, 0x2c, 0xbb, 0x73, 0xbd, 0x85, 0xf8, 0xef, 0xaf, - 0xff, 0x84, 0xfd, 0x7a, 0xd1, 0x73, 0x58, 0xa9, 0x3c, 0xb1, 0x28, 0x47, - 0xcc, 0xc8, 0xf9, 0xcf, 0x29, 0xb5, 0xc8, 0x02, 0xcc, 0xda, 0x4b, 0x56, - 0x09, 0xf3, 0xfc, 0x6e, 0x5f, 0xd1, 0xe1, 0x5e, 0x7b, 0xc6, 0xc7, 0xa1, - 0x03, 0xe8, 0xdb, 0xcf, 0xfe, 0x82, 0xf2, 0x27, 0x72, 0x78, 0x21, 0x21, - 0xe6, 0xcb, 0x76, 0x04, 0x6f, 0x5f, 0x74, 0x77, 0x8a, 0x9d, 0x40, 0xbc, - 0x8c, 0x97, 0x91, 0x64, 0x20, 0x99, 0xf5, 0xee, 0xb1, 0xc4, 0xcd, 0x12, - 0x07, 0x61, 0x7f, 0xe7, 0x7d, 0x62, 0x25, 0xb8, 0x7d, 0xb3, 0xbd, 0x12, - 0x1e, 0x78, 0xc6, 0xfa, 0xbe, 0xd0, 0xa6, 0x0c, 0x88, 0xe7, 0x40, 0x33, - 0xd8, 0x19, 0xfa, 0x10, 0x75, 0x97, 0xd0, 0xa3, 0x11, 0xf3, 0xca, 0x4f, - 0x33, 0xfe, 0x1f, 0x6c, 0x06, 0x1d, 0x1c, 0x5a, 0x7f, 0x5d, 0x14, 0x71, - 0x2a, 0xc2, 0x19, 0xcc, 0x19, 0x85, 0x33, 0x00, 0x5b, 0x66, 0x35, 0xdf, - 0x3e, 0x0f, 0x28, 0xdd, 0xd8, 0x05, 0x3a, 0xc5, 0x1e, 0x4f, 0xc0, 0xb7, - 0x57, 0x16, 0x88, 0xcb, 0xdd, 0xaa, 0xcc, 0x95, 0x9f, 0xde, 0xb1, 0x05, - 0x03, 0x65, 0xf4, 0xad, 0x3d, 0x17, 0x80, 0x08, 0x33, 0x47, 0x79, 0x8c, - 0x74, 0x9b, 0x44, 0xd0, 0xe1, 0x6b, 0xd8, 0x77, 0xc6, 0xed, 0x29, 0x62, - 0xc1, 0x39, 0xdc, 0xd7, 0x8d, 0x5c, 0xb8, 0xbd, 0x3d, 0x83, 0xea, 0x4e, - 0x7d, 0x6f, 0xe5, 0x93, 0xc1, 0x6d, 0x68, 0xa0, 0x36, 0x4d, 0xca, 0xcb, - 0xd1, 0xba, 0xc9, 0x4c, 0x03, 0x52, 0xbc, 0x33, 0xed, 0xd1, 0x81, 0x28, - 0x55, 0xa6, 0xbf, 0xd5, 0x7b, 0xd4, 0x8a, 0x86, 0x59, 0x84, 0x1f, 0x0a, - 0x2b, 0x8d, 0xb7, 0x14, 0x67, 0x49, 0x4e, 0xd9, 0xc4, 0xa6, 0xee, 0xdc, - 0x6e, 0x48, 0x2d, 0xe0, 0x17, 0xc8, 0x77, 0x75, 0x28, 0x0f, 0xb6, 0x72, - 0x22, 0x61, 0x59, 0x25, 0x43, 0xcd, 0xcb, 0x74, 0x6a, 0xdd, 0x5c, 0x0d, - 0x37, 0xd9, 0x1d, 0xd6, 0xd1, 0x38, 0x7f, 0x27, 0xe4, 0xc9, 0x2f, 0x35, - 0x5f, 0x05, 0x45, 0x4b, 0x7b, 0x2d, 0x15, 0x89, 0xb2, 0xdf, 0x3d, 0x29, - 0xea, 0x40, 0xe4, 0x7f, 0x10, 0x58, 0xc0, 0x4f, 0x98, 0x78, 0x01, 0x47, - 0x2f, 0xf1, 0x5f, 0xe0, 0x8a, 0x54, 0x0a, 0x86, 0x89, 0xbb, 0x6e, 0xd8, - 0x4a, 0x11, 0x0a, 0xce, 0x8c, 0x70, 0x10, 0x0f, 0x76, 0xb1, 0xf4, 0xad, - 0x4e, 0x0f, 0xf4, 0xf7, 0x02, 0xe2, 0x37, 0xb9, 0x9d, 0x85, 0x19, 0x0a, - 0x83, 0xf4, 0x0a, 0xd6, 0xbf, 0x2c, 0x3c, 0xd5, 0x85, 0x3a, 0x31, 0x48, - 0xa5, 0x8d, 0x3f, 0x1f, 0x14, 0xc1, 0xbc, 0x6c, 0x98, 0xdf, 0x60, 0xed, - 0xf8, 0x79, 0x5f, 0xba, 0xa8, 0x05, 0x2f, 0x38, 0xf9, 0x1f, 0x0a, 0x47, - 0x26, 0x93, 0xf1, 0x90, 0xcb, 0x87, 0x95, 0x79, 0x0f, 0x7e, 0x54, 0x95, - 0x93, 0x8e, 0xdf, 0xa9, 0x43, 0xdf, 0x9c, 0x83, 0x97, 0xac, 0x48, 0xa5, - 0x79, 0xb7, 0x6d, 0xaf, 0xb8, 0x4c, 0xa5, 0xe6, 0x57, 0x9a, 0xb8, 0xd3, - 0x41, 0x0f, 0xac, 0x1b, 0x36, 0x18, 0xbd, 0xaa, 0xd2, 0x1b, 0x07, 0x96, - 0x7e, 0xfe, 0xf9, 0xf8, 0x8a, 0x16, 0xba, 0x1d, 0xdc, 0xcc, 0x89, 0x4d, - 0x78, 0x74, 0xd1, 0x7c, 0x68, 0xde, 0xfc, 0x55, 0x7f, 0xa9, 0xd8, 0xf8, - 0x8e, 0xeb, 0xa8, 0x87, 0x49, 0x29, 0x23, 0xae, 0xfb, 0xa8, 0x74, 0x5e, - 0xce, 0x8a, 0xe8, 0x2e, 0xc1, 0x9b, 0x17, 0xeb, 0xda, 0x1a, 0xe4, 0xca, - 0xe9, 0x0f, 0x89, 0xc9, 0xfb, 0xf4, 0x64, 0x61, 0x84, 0x59, 0x91, 0x9e, - 0x47, 0xb2, 0x83, 0x62, 0xea, 0x65, 0xee, 0x79, 0xd6, 0x12, 0xd1, 0xdd, - 0x29, 0xfa, 0x93, 0xfb, 0x34, 0x7a, 0x7c, 0x04, 0xfa, 0x63, 0xa8, 0x6c, - 0xcb, 0x0b, 0x9d, 0xfc, 0xc5, 0x1f, 0xe6, 0x37, 0xd3, 0x01, 0x37, 0xc1, - 0xd7, 0xac, 0xd2, 0x15, 0xc9, 0xd5, 0x8d, 0xf8, 0x33, 0xa0, 0xff, 0x6a, - 0x78, 0xc2, 0xa3, 0xcf, 0xc1, 0x9f, 0xed, 0x2a, 0x5c, 0x8f, 0x56, 0xd7, - 0xc3, 0xe6, 0xcb, 0x19, 0x60, 0x64, 0xb4, 0x0e, 0x0e, 0xd2, 0x9c, 0xab, - 0xcd, 0x79, 0xa6, 0x68, 0xd8, 0x21, 0x2f, 0xb4, 0x1c, 0x4d, 0xc6, 0xdf, - 0xb2, 0xd7, 0xae, 0xc6, 0x2a, 0xf7, 0x2d, 0x59, 0x0d, 0xe8, 0x90, 0x06, - 0x4e, 0xfc, 0x30, 0x4b, 0x44, 0x7c, 0x59, 0xfa, 0xfd, 0x8e, 0x04, 0x54, - 0x93, 0x48, 0x0c, 0x30, 0xa9, 0x1c, 0xf5, 0xe6, 0x36, 0x66, 0x45, 0xdb, - 0xc2, 0x55, 0x24, 0x3e, 0xc5, 0x73, 0x83, 0x19, 0xcb, 0x7d, 0x54, 0x55, - 0x05, 0x44, 0xb3, 0x51, 0x58, 0xde, 0x5c, 0xca, 0xda, 0x37, 0xe8, 0x77, - 0xcb, 0xf4, 0xe7, 0xf7, 0x5c, 0xfc, 0x05, 0x97, 0x9d, 0xc0, 0x37, 0xb3, - 0x38, 0x2b, 0x66, 0x05, 0xe3, 0x3f, 0xb2, 0x59, 0x07, 0x60, 0x43, 0xcd, - 0x71, 0xdb, 0x83, 0x90, 0x19, 0x7e, 0xf8, 0x2e, 0x31, 0xdf, 0x74, 0x73, - 0xda, 0x5a, 0x89, 0x90, 0xb5, 0x94, 0x7e, 0x84, 0x73, 0x62, 0xc0, 0xb1, - 0x53, 0x07, 0xc6, 0x9e, 0xbe, 0xc6, 0x2d, 0x16, 0xf6, 0xf0, 0xf4, 0x3e, - 0x3e, 0xa5, 0x85, 0xe5, 0x40, 0x74, 0x41, 0xf2, 0x33, 0xf6, 0x1d, 0xf8, - 0x30, 0xc1, 0x60, 0x17, 0xda, 0xc4, 0x05, 0x02, 0xe7, 0x72, 0x77, 0xfc, - 0xad, 0x5d, 0x01, 0x45, 0x7c, 0xfc, 0xdc, 0x0d, 0x58, 0x53, 0x14, 0x34, - 0x80, 0x78, 0x93, 0xd6, 0x5b, 0x53, 0xee, 0xc2, 0xce, 0x09, 0x13, 0xb3, - 0x61, 0xa7, 0xe8, 0xd4, 0xf6, 0x61, 0x88, 0x42, 0x30, 0xd3, 0xb4, 0x76, - 0xab, 0x17, 0x8e, 0xcd, 0xbf, 0x39, 0xff, 0xe4, 0x4a, 0x36, 0xf6, 0xfd, - 0xa8, 0xa3, 0x91, 0x48, 0xa2, 0x32, 0xd0, 0xbb, 0x4e, 0xea, 0x58, 0x18, - 0xeb, 0xa6, 0x13, 0x74, 0xe0, 0xb2, 0x27, 0xfc, 0x65, 0xd4, 0xf2, 0x0f, - 0xdf, 0x6a, 0x6c, 0xde, 0xd0, 0x38, 0xc4, 0xdf, 0x44, 0xc9, 0xcd, 0x62, - 0x43, 0x47, 0x6b, 0x2e, 0x2b, 0x4b, 0xc7, 0x05, 0xad, 0xcb, 0x26, 0xac, - 0x3a, 0xa7, 0x9d, 0xf4, 0xd6, 0xc7, 0x00, 0x05, 0x4c, 0xe4, 0xb4, 0xa1, - 0xb2, 0xbd, 0x50, 0x9a, 0xd2, 0xcb, 0xfa, 0x77, 0x52, 0x5b, 0x9f, 0xd9, - 0x90, 0x9f, 0x6e, 0x27, 0x2f, 0xc7, 0x06, 0x48, 0xac, 0x89, 0x31, 0x48, - 0xa0, 0x66, 0x25, 0x03, 0x26, 0xc5, 0x64, 0xbc, 0x8a, 0xd2, 0x78, 0x9f, - 0xb0, 0x8e, 0x7d, 0x41, 0x30, 0xc5, 0xa5, 0xca, 0x40, 0x48, 0x97, 0x3d, - 0x5a, 0x18, 0x73, 0x03, 0x73, 0xf7, 0xa3, 0x50, 0xde, 0x6d, 0xbb, 0x46, - 0x89, 0x5e, 0xae, 0xc6, 0x4b, 0xc3, 0xc4, 0x08, 0x6e, 0x54, 0xc9, 0x9d, - 0x83, 0x68, 0xbf, 0x08, 0x66, 0x0d, 0xff, 0x56, 0xf5, 0x02, 0xcf, 0x80, - 0xe5, 0xf7, 0xaf, 0xfc, 0x7f, 0x7f, 0xbc, 0x58, 0x08, 0x6b, 0xf8, 0x27, - 0x0f, 0x2c, 0xde, 0xc5, 0xb8, 0xf3, 0x0a, 0x01, 0xba, 0xe2, 0x7c, 0x5b, - 0xdd, 0xaa, 0x20, 0xc1, 0xe4, 0x8c, 0xfd, 0x77, 0xc3, 0xa6, 0x97, 0x0f, - 0xb0, 0x19, 0x53, 0x0c, 0xd0, 0xac, 0xc9, 0xba, 0x74, 0x93, 0x82, 0x6e, - 0x3a, 0x94, 0x11, 0x02, 0x74, 0x03, 0xeb, 0x09, 0x0e, 0xe5, 0x41, 0xdf, - 0xa0, 0x93, 0x49, 0xae, 0x8a, 0x30, 0xa3, 0x59, 0x3f, 0x81, 0x40, 0xe2, - 0xca, 0xac, 0xda, 0x38, 0x13, 0x37, 0xca, 0x95, 0xf0, 0xe7, 0x39, 0xa2, - 0x7f, 0x77, 0xb9, 0x9d, 0x4d, 0xe0, 0x9b, 0x2c, 0x7c, 0xc5, 0x73, 0xd0, - 0xe2, 0x98, 0x87, 0x3f, 0x9b, 0x97, 0x0d, 0x26, 0x6b, 0x06, 0x38, 0x61, - 0x25, 0xaa, 0x8d, 0x2e, 0x88, 0x7c, 0x14, 0xbe, 0x80, 0xad, 0x57, 0xbe, - 0xc6, 0xc5, 0x3e, 0xfa, 0x73, 0x0f, 0x0a, 0x68, 0x70, 0xe5, 0xed, 0x2c, - 0x08, 0x15, 0xcb, 0xbb, 0x04, 0xed, 0x9b, 0xb5, 0x87, 0x01, 0xcc, 0x07, - 0x37, 0xd6, 0x15, 0xea, 0xe0, 0x3f, 0x8d, 0x78, 0xd8, 0xbd, 0xb8, 0x94, - 0x44, 0xab, 0xdc, 0x4a, 0x03, 0xc1, 0x85, 0xe7, 0xea, 0x12, 0x0f, 0x42, - 0x2a, 0x2e, 0x32, 0xbd, 0xef, 0xce, 0x25, 0xea, 0xa8, 0xcd, 0x02, 0x33, - 0x8f, 0xf9, 0xf2, 0x87, 0x69, 0xc6, 0x76, 0xe9, 0x4b, 0x8c, 0x72, 0x94, - 0xf7, 0x35, 0xb8, 0x55, 0x88, 0xe4, 0x23, 0x5f, 0xe4, 0xa2, 0x87, 0x07, - 0x12, 0x29, 0x00, 0x8d, 0x34, 0xab, 0x38, 0xa6, 0xf4, 0x74, 0xf3, 0xb3, - 0x4a, 0x8b, 0x77, 0x40, 0xc2, 0xfd, 0x80, 0xcf, 0xad, 0x8f, 0xdb, 0x92, - 0x26, 0xc3, 0xa0, 0xaa, 0x44, 0x04, 0x59, 0xf4, 0xc8, 0x77, 0x6a, 0x80, - 0x25, 0xcf, 0xae, 0x73, 0xb9, 0x19, 0xbe, 0xeb, 0xac, 0x5a, 0xef, 0xcf, - 0x83, 0x30, 0x3d, 0x74, 0xc7, 0x53, 0x24, 0x75, 0xab, 0x8b, 0x85, 0x5b, - 0xfd, 0xa4, 0xf4, 0x5e, 0xfe, 0x2a, 0xf4, 0x9f, 0xeb, 0x82, 0x51, 0x2b, - 0x77, 0x9e, 0x8d, 0x16, 0xff, 0x3f, 0xf1, 0x27, 0xf0, 0x34, 0xd3, 0x0e, - 0x1b, 0x2a, 0xec, 0xe1, 0x88, 0x72, 0x76, 0x80, 0xfb, 0xf5, 0x9f, 0xae, - 0xc4, 0xb1, 0xa2, 0x60, 0xe3, 0xfc, 0xb3, 0x76, 0x3c, 0xec, 0x5b, 0xe2, - 0xfb, 0x1c, 0x1b, 0x33, 0x34, 0x8f, 0x31, 0x6a, 0xc3, 0x6f, 0x5d, 0xa1, - 0x1d, 0x1e, 0x56, 0x03, 0xe2, 0xbb, 0xf6, 0xaf, 0x91, 0x5a, 0x58, 0xf2, - 0x89, 0x7e, 0xcb, 0xee, 0x46, 0x5d, 0x6e, 0xa7, 0xcb, 0xf1, 0xf2, 0x12, - 0x6c, 0x65, 0x2c, 0x2e, 0xc6, 0xb2, 0x03, 0x93, 0x1f, 0x7e, 0xb7, 0x88, - 0xd9, 0x07, 0xe0, 0x7f, 0xb4, 0xfd, 0xf4, 0x63, 0x3c, 0xd7, 0xd5, 0xec, - 0x3b, 0xc7, 0x9a, 0xd4, 0xb8, 0x58, 0x38, 0xa7, 0xe0, 0x28, 0x01, 0x96, - 0xb2, 0xa5, 0x5b, 0xe2, 0x7d, 0x07, 0xa3, 0x38, 0xa7, 0xb3, 0xda, 0xfe, - 0xed, 0xfc, 0xd8, 0x54, 0x71, 0x44, 0x19, 0x49, 0xe3, 0x88, 0xe4, 0x34, - 0x65, 0x46, 0x28, 0x06, 0x1e, 0x27, 0x56, 0x74, 0xe6, 0x7d, 0x7d, 0xa7, - 0x8f, 0x4d, 0x39, 0x82, 0xa2, 0x5a, 0x85, 0xc6, 0xb0, 0xb7, 0x43, 0x24, - 0x5a, 0x21, 0x26, 0xfb, 0xd7, 0x3e, 0x22, 0x0e, 0x96, 0x57, 0xf3, 0x9d, - 0x2f, 0x70, 0xcb, 0x60, 0x70, 0xda, 0x4b, 0xf6, 0xcc, 0x96, 0x3e, 0x36, - 0x33, 0xd9, 0xde, 0xf9, 0xca, 0xb1, 0x8a, 0xd1, 0x04, 0xc2, 0x76, 0x27, - 0x12, 0x6a, 0x72, 0xf3, 0x69, 0x92, 0x26, 0x2e, 0x05, 0x05, 0x33, 0xa4, - 0x40, 0xca, 0xbe, 0x3f, 0xd4, 0x42, 0x27, 0x4c, 0xd8, 0xbb, 0xfe, 0x1a, - 0xde, 0xa3, 0xf9, 0xdf, 0x76, 0x31, 0x9f, 0x7d, 0xf9, 0x44, 0x98, 0x5e, - 0xd2, 0x3a, 0xba, 0x2c, 0x13, 0xbb, 0x90, 0x20, 0x86, 0x01, 0x18, 0xb5, - 0x8f, 0x84, 0x5a, 0xa5, 0xc7, 0x30, 0xdf, 0x69, 0xc6, 0xec, 0x82, 0xc4, - 0xa8, 0xc2, 0x08, 0x3a, 0xe4, 0x53, 0x83, 0x7b, 0x6d, 0x0d, 0xb0, 0xfd, - 0xca, 0x2b, 0x59, 0x8d, 0xcd, 0xc1, 0xab, 0xa7, 0xf1, 0x00, 0x14, 0x27, - 0xa4, 0x72, 0xa2, 0xa8, 0xfb, 0x89, 0x5f, 0xce, 0xc1, 0x79, 0x6d, 0x06, - 0x5f, 0xc6, 0x85, 0xc6, 0xa4, 0x05, 0x04, 0x66, 0xaa, 0xf5, 0x6f, 0x51, - 0xf0, 0x9b, 0xe4, 0xaf, 0x2f, 0xf5, 0xdb, 0xf2, 0xed, 0x4e, 0xfc, 0x70, - 0x04, 0x30, 0x44, 0x2f, 0x42, 0xb8, 0xa7, 0x07, 0x20, 0x19, 0xae, 0x61, - 0xeb, 0xc7, 0x0d, 0x90, 0x04, 0xa2, 0x97, 0x84, 0x0a, 0xe5, 0x44, 0x0f, - 0x9d, 0x05, 0x4e, 0x1d, 0xa3, 0x8d, 0x8e, 0x2c, 0x60, 0x47, 0xa1, 0x91, - 0x8c, 0x69, 0x0b, 0x96, 0x5d, 0x98, 0xa6, 0x99, 0xae, 0x5e, 0xb1, 0xa6, - 0xc0, 0x58, 0x38, 0x48, 0x39, 0x4f, 0x9d, 0x5f, 0x62, 0x2f, 0xa9, 0x2d, - 0xbd, 0x22, 0x17, 0x27, 0xf9, 0xa3, 0xa3, 0x9d, 0x4b, 0xc9, 0xeb, 0x31, - 0xd5, 0xd8, 0x10, 0x62, 0xf6, 0xc1, 0xbf, 0xa4, 0x1d, 0x02, 0x8b, 0xb1, - 0xb8, 0x57, 0xc2, 0x39, 0x73, 0xc7, 0x01, 0xe0, 0x66, 0xd0, 0xed, 0x86, - 0xb1, 0x31, 0x67, 0xa7, 0x57, 0x15, 0xd9, 0x21, 0xdb, 0x89, 0x8d, 0x31, - 0x4d, 0x25, 0x10, 0x04, 0x82, 0x0d, 0xd1, 0x23, 0x29, 0x95, 0x2f, 0xea, - 0xbb, 0xfa, 0x45, 0x41, 0xd5, 0x87, 0xd3, 0xf8, 0x4a, 0x74, 0x7c, 0xa9, - 0xbd, 0xe6, 0xff, 0x59, 0x60, 0x8a, 0xf5, 0x48, 0xed, 0x05, 0x26, 0xe7, - 0x93, 0xb2, 0x76, 0x11, 0x1d, 0x60, 0x87, 0x96, 0x4a, 0xc0, 0xa1, 0x98, - 0x32, 0x78, 0x1c, 0xfa, 0x9a, 0x66, 0x94, 0x9f, 0x7e, 0xc5, 0x6d, 0xad, - 0x48, 0xa2, 0x72, 0x9d, 0x81, 0x06, 0x20, 0x0b, 0x62, 0x06, 0x74, 0x96, - 0x68, 0x26, 0x57, 0x5d, 0x84, 0xa2, 0xd6, 0xb1, 0xb4, 0x69, 0xa8, 0x77, - 0x21, 0x73, 0x7b, 0x71, 0xdf, 0xbb, 0x8e, 0xed, 0xca, 0xaf, 0x26, 0xec, - 0xd7, 0xb9, 0xd5, 0x88, 0x15, 0x5e, 0x1e, 0xa3, 0x19, 0xfb, 0x59, 0xcb, - 0xa7, 0xae, 0x74, 0x71, 0x7b, 0x51, 0x21, 0xe5, 0xcc, 0xda, 0xde, 0xb8, - 0xfd, 0x85, 0xcd, 0xf6, 0xed, 0x3f, 0xa1, 0xb5, 0xfb, 0x66, 0xb5, 0xfc, - 0x86, 0x38, 0xfc, 0xa3, 0x60, 0x8c, 0xe3, 0xa6, 0xe2, 0x3d, 0xd1, 0x84, - 0x82, 0xa1, 0xc7, 0x94, 0xaa, 0xd6, 0x2b, 0x90, 0xf7, 0xf5, 0x63, 0x3f, - 0xfd, 0xe5, 0x60, 0x36, 0xfe, 0xad, 0xbf, 0xf1, 0x7c, 0x68, 0x61, 0xb3, - 0x82, 0x9b, 0xe2, 0xcc, 0x31, 0xd9, 0x8b, 0xe7, 0x73, 0xa3, 0x71, 0x0f, - 0x93, 0x61, 0xd1, 0xfd, 0x16, 0xb2, 0x8c, 0xb2, 0x7c, 0x60, 0x61, 0x32, - 0x1b, 0x07, 0xdd, 0xf1, 0xd7, 0xb9, 0x22, 0x86, 0x54, 0x25, 0x69, 0xc6, - 0x5e, 0x1b, 0x9d, 0x55, 0x25, 0x1b, 0xc7, 0x2c, 0xdf, 0x77, 0xf9, 0xb7, - 0x67, 0xf0, 0xa2, 0xa6, 0xb6, 0xb9, 0xdc, 0x8c, 0x6c, 0x7e, 0xe3, 0x75, - 0x09, 0x54, 0x0f, 0xec, 0xc0, 0xa6, 0xe5, 0x1e, 0x0b, 0x50, 0xc2, 0x6e, - 0xe4, 0xd4, 0x0e, 0x89, 0x83, 0xc2, 0xed, 0xfa, 0x59, 0x40, 0x2c, 0xdc, - 0xe1, 0xc0, 0x05, 0x12, 0xc5, 0x0c, 0x91, 0xb1, 0x23, 0x97, 0x9e, 0xc8, - 0x3d, 0xb4, 0xbd, 0x6f, 0x13, 0x07, 0x1b, 0xed, 0xd4, 0x32, 0x40, 0xb9, - 0x35, 0xb8, 0x1b, 0x05, 0x50, 0x1b, 0xcb, 0xd8, 0x9a, 0xf7, 0x70, 0x08, - 0xd2, 0x46, 0xff, 0xa4, 0xad, 0xe2, 0x46, 0xc7, 0x65, 0x1e, 0x1f, 0x55, - 0x2e, 0xab, 0x95, 0xcf, 0xa6, 0xe7, 0x2e, 0x04, 0x5b, 0x55, 0xe2, 0xa9, - 0xef, 0xba, 0xbb, 0xc9, 0xf8, 0x05, 0x14, 0x74, 0x9c, 0x69, 0x89, 0x36, - 0x48, 0xaf, 0xba, 0x0f, 0x63, 0x35, 0xe7, 0x19, 0x47, 0xa7, 0x4e, 0xbd, - 0xf2, 0x4d, 0xd3, 0x16, 0xe1, 0xa8, 0x56, 0x82, 0x84, 0xe3, 0x60, 0x06, - 0x6a, 0x5d, 0x29, 0x4c, 0xb2, 0xaa, 0x71, 0xda, 0xe2, 0x3f, 0x7a, 0xbf, - 0x31, 0xd6, 0x11, 0xaf, 0x84, 0x2d, 0xf6, 0xab, 0x0a, 0xa6, 0xc4, 0xf9, - 0x10, 0x59, 0x93, 0xa8, 0xc7, 0x51, 0x63, 0xd1, 0xc0, 0xac, 0xf5, 0x19, - 0x6c, 0xf4, 0x7b, 0x30, 0xf5, 0xb4, 0x36, 0x35, 0xb6, 0xda, 0x8b, 0x1c, - 0xcd, 0x39, 0xca, 0xad, 0xb0, 0x79, 0x9c, 0xdd, 0x3c, 0x5c, 0x17, 0x07, - 0x32, 0x42, 0x1a, 0x5a, 0x14, 0xcf, 0x66, 0x76, 0x7a, 0x6a, 0xf2, 0xd9, - 0x72, 0x61, 0x05, 0x9f, 0x38, 0xa7, 0x82, 0xc6, 0x64, 0xaf, 0x84, 0x0d, - 0x21, 0xf9, 0x4b, 0x2b, 0x08, 0x83, 0x40, 0xba, 0x4c, 0x72, 0x64, 0x43, - 0xce, 0xd6, 0xfb, 0x51, 0x48, 0x92, 0x70, 0x1e, 0xaa, 0x01, 0x40, 0xcf, - 0x56, 0xd9, 0x13, 0x30, 0xf2, 0x6e, 0xb0, 0x8f, 0x7d, 0x46, 0x0c, 0xdc, - 0x4c, 0xd7, 0xed, 0x25, 0x76, 0x52, 0x57, 0x42, 0x81, 0xc8, 0x80, 0xea, - 0x34, 0x61, 0x00, 0x13, 0xd6, 0xe0, 0x0a, 0x7f, 0x92, 0xdd, 0xe7, 0x19, - 0x69, 0x1e, 0x1b, 0x46, 0x5b, 0x3e, 0x3e, 0xdb, 0xbf, 0x07, 0x95, 0xd6, - 0x54, 0x2c, 0xcc, 0xc7, 0x69, 0x9f, 0xde, 0xda, 0x4d, 0x78, 0xd9, 0x6e, - 0xa6, 0xdd, 0x9f, 0x9a, 0x40, 0xa7, 0x38, 0x94, 0x7f, 0x66, 0x37, 0x7d, - 0x6b, 0x75, 0x14, 0x30, 0x28, 0x42, 0x0d, 0xe2, 0xc9, 0x6e, 0x2f, 0xc2, - 0xd5, 0xef, 0xe5, 0x93, 0x00, 0xdb, 0x90, 0x8b, 0xf4, 0xa1, 0x86, 0x97, - 0xc7, 0xba, 0x9d, 0xe6, 0x0a, 0x3c, 0x7e, 0x29, 0x57, 0x15, 0xf9, 0x7a, - 0xa0, 0x97, 0xcf, 0x0a, 0x9f, 0x20, 0xe8, 0xdf, 0xc9, 0xff, 0x5a, 0xca, - 0xc9, 0xa9, 0xad, 0xe9, 0x00, 0xf9, 0xca, 0x48, 0xc6, 0x88, 0x64, 0x6f, - 0x53, 0x08, 0x53, 0xf4, 0xe2, 0x16, 0x28, 0xb8, 0x31, 0x29, 0x8e, 0x19, - 0xe7, 0x48, 0x26, 0xe4, 0x01, 0xe5, 0xc0, 0xa7, 0x47, 0x21, 0xba, 0x1a, - 0x54, 0x65, 0x89, 0x3e, 0x2a, 0x97, 0x36, 0xd1, 0x69, 0x08, 0x42, 0xd5, - 0x3a, 0x1a, 0xe4, 0x59, 0xa9, 0xdb, 0x77, 0x06, 0x87, 0xed, 0xcd, 0x87, - 0xfe, 0xcf, 0xc5, 0x55, 0xf3, 0x69, 0x07, 0x35, 0x46, 0x02, 0x0b, 0x0e, - 0x99, 0xfb, 0x39, 0x58, 0xe2, 0x53, 0x6b, 0xbe, 0xde, 0xc7, 0x64, 0x30, - 0x33, 0xbe, 0xd9, 0xdf, 0x74, 0xe9, 0x75, 0x31, 0x24, 0xb3, 0x09, 0x35, - 0xf0, 0xa9, 0x30, 0x32, 0x53, 0x0c, 0x35, 0x72, 0xa4, 0x46, 0x95, 0x15, - 0xae, 0xce, 0x76, 0x19, 0x88, 0x1f, 0x38, 0xa5, 0xb4, 0x48, 0x9b, 0x04, - 0xd8, 0xe4, 0x07, 0xe3, 0xaa, 0xab, 0xed, 0x6b, 0x7a, 0x08, 0x1b, 0x38, - 0x3d, 0x78, 0x16, 0x02, 0x2e, 0x7c, 0x27, 0xa8, 0xea, 0xa9, 0xb6, 0x89, - 0x75, 0x67, 0xa9, 0x4c, 0x5c, 0x24, 0xf7, 0x1b, 0x9c, 0x26, 0x16, 0xd0, - 0x91, 0x46, 0x84, 0x18, 0x35, 0xb0, 0xe4, 0xd7, 0x11, 0x6e, 0x59, 0x5e, - 0x00, 0x2f, 0xe2, 0xd6, 0xf9, 0x36, 0x12, 0xeb, 0xab, 0xcd, 0x75, 0x71, - 0xa8, 0x0a, 0x22, 0xc3, 0x4b, 0x58, 0xde, 0xf0, 0xba, 0xd4, 0x80, 0x28, - 0x69, 0x83, 0xbd, 0x7b, 0xc7, 0x87, 0x52, 0xe5, 0x48, 0xf7, 0x76, 0xb8, - 0x89, 0xda, 0x83, 0xe5, 0x8c, 0x58, 0x39, 0xa4, 0x6d, 0xc6, 0xff, 0xd2, - 0xff, 0xf5, 0x9e, 0xd6, 0x6e, 0x1a, 0xda, 0x98, 0x1a, 0x2f, 0xf1, 0x6d, - 0x77, 0x0d, 0xe9, 0xf7, 0xd0, 0x70, 0x20, 0x1a, 0x67, 0x79, 0xba, 0x60, - 0x6b, 0xff, 0x2c, 0x3c, 0x1e, 0x39, 0xc4, 0xf6, 0x2f, 0x77, 0xde, 0x82, - 0xa2, 0x39, 0x72, 0x4e, 0xb9, 0x07, 0xa6, 0x91, 0x2b, 0x5a, 0xab, 0x46, - 0xaa, 0xed, 0x0a, 0xc3, 0x39, 0x23, 0x5a, 0x08, 0xa0, 0xa1, 0xad, 0x2f, - 0x73, 0xb7, 0x36, 0x47, 0x0b, 0x3f, 0x6c, 0xf2, 0xf0, 0xd2, 0x9b, 0x17, - 0x5c, 0x88, 0x87, 0xd6, 0x5c, 0x83, 0xb0, 0x77, 0xe6, 0xa4, 0x88, 0xc7, - 0xbe, 0x9f, 0xb9, 0xcf, 0x05, 0x37, 0xce, 0x69, 0xd8, 0x8d, 0xcc, 0xf8, - 0xf0, 0x04, 0x53, 0x15, 0x06, 0x30, 0xa2, 0xb5, 0x2d, 0x96, 0xd0, 0x57, - 0xe5, 0xa0, 0x3e, 0xde, 0xfc, 0x36, 0x9e, 0xf4, 0x14, 0xfd, 0x6c, 0xaa, - 0x57, 0xdd, 0x18, 0xf1, 0xca, 0xef, 0x79, 0x27, 0xca, 0x5a, 0xef, 0x8f, - 0xc5, 0x50, 0x3f, 0x18, 0xc2, 0x66, 0x0a, 0xe8, 0xb8, 0x3e, 0xfe, 0xab, - 0xf4, 0x16, 0xdb, 0xbf, 0xdd, 0x5c, 0x49, 0xb3, 0xbb, 0x18, 0xbc, 0xd0, - 0xdd, 0x00, 0xd0, 0xee, 0xed, 0x4f, 0x58, 0xf6, 0x10, 0x50, 0x6e, 0x27, - 0x08, 0x8d, 0x08, 0x1d, 0x98, 0x74, 0xad, 0x59, 0x3a, 0x1f, 0x65, 0xc8, - 0xc6, 0x2d, 0xd7, 0xf9, 0x43, 0x3a, 0xd3, 0x5d, 0x54, 0x2a, 0x38, 0xc4, - 0x98, 0xe7, 0xc9, 0x22, 0xdf, 0x4b, 0x2a, 0x08, 0x62, 0xea, 0x91, 0xed, - 0x4f, 0x99, 0x90, 0xa8, 0x0a, 0x01, 0xcd, 0x1a, 0xd3, 0xbf, 0x83, 0x9c, - 0x08, 0xd7, 0x20, 0x0a, 0x43, 0x1c, 0x3a, 0x6a, 0x08, 0x7f, 0xa0, 0x4a, - 0xbe, 0x73, 0x2f, 0xcb, 0x91, 0x46, 0xa1, 0xf3, 0x50, 0xe0, 0xff, 0xd6, - 0xd4, 0x4a, 0xe3, 0x06, 0xd3, 0x01, 0xaf, 0x4b, 0xaa, 0xc1, 0xdf, 0xbe, - 0x90, 0xaf, 0x39, 0xe0, 0x20, 0x67, 0x55, 0x34, 0xb6, 0x85, 0x23, 0x7d, - 0x71, 0x5a, 0x86, 0xbd, 0xe8, 0xec, 0x66, 0x08, 0x08, 0x87, 0xbd, 0xd1, - 0x18, 0x4e, 0xb0, 0x19, 0x23, 0x6a, 0x05, 0xa5, 0x6c, 0x35, 0x08, 0x97, - 0x03, 0x1a, 0x5e, 0x40, 0x8d, 0x04, 0x55, 0xd3, 0xe7, 0x61, 0x15, 0xc8, - 0xab, 0x4f, 0x7d, 0xf6, 0xb1, 0xa5, 0x47, 0xe9, 0xa7, 0xb1, 0xd3, 0x03, - 0x03, 0xe2, 0x01, 0x7f, 0x23, 0xea, 0xc1, 0x41, 0xa4, 0x62, 0x79, 0x01, - 0xcb, 0x76, 0xbc, 0x26, 0x64, 0x02, 0x06, 0xdf, 0xfc, 0x54, 0x04, 0x84, - 0x73, 0x68, 0x1f, 0x83, 0xab, 0x84, 0x8e, 0x24, 0x77, 0xd7, 0x7d, 0xfc, - 0x53, 0xe5, 0x25, 0x0d, 0x31, 0x04, 0x16, 0xba, 0x63, 0x2e, 0xa9, 0x8b, - 0xf6, 0x6d, 0x31, 0xd6, 0x6a, 0x47, 0xa9, 0x4e, 0xd9, 0x09, 0x36, 0x50, - 0xdc, 0x22, 0xc7, 0xd2, 0xda, 0xf7, 0xe8, 0x2a, 0x6a, 0x04, 0x71, 0xb2, - 0x5d, 0xf4, 0xe7, 0x3c, 0x97, 0x42, 0x35, 0x22, 0x15, 0x05, 0x0e, 0x93, - 0x94, 0xb5, 0xad, 0xac, 0x01, 0x44, 0x91, 0xe4, 0xaf, 0xc0, 0x76, 0xdf, - 0xb1, 0xb4, 0x12, 0xaf, 0xa7, 0x86, 0xcd, 0xac, 0x2d, 0x9e, 0xfa, 0x3d, - 0x11, 0x57, 0x73, 0x97, 0x03, 0x2c, 0x76, 0x82, 0x15, 0x85, 0xca, 0x47, - 0x91, 0x8b, 0xcf, 0x77, 0x13, 0xf1, 0xc6, 0xe6, 0x0f, 0xc6, 0xa6, 0xd0, - 0x29, 0xc3, 0x1a, 0x75, 0xfc, 0x61, 0x32, 0x83, 0xc6, 0x47, 0x45, 0x8e, - 0xb6, 0xf1, 0x78, 0x9b, 0x26, 0x15, 0xa3, 0x5f, 0x08, 0x7a, 0x3d, 0xd3, - 0x4f, 0xf6, 0xd3, 0x55, 0xfa, 0x9a, 0x2a, 0x3c, 0xe3, 0xfb, 0xa4, 0x87, - 0xd9, 0x1f, 0x98, 0xfb, 0x0e, 0xc5, 0xa3, 0x01, 0x04, 0x57, 0xc1, 0x1d, - 0x7f, 0x58, 0x28, 0x34, 0x05, 0x6c, 0x96, 0x92, 0x44, 0x3d, 0xe0, 0xe2, - 0x88, 0x28, 0x61, 0x53, 0xff, 0x7e, 0xe0, 0x9f, 0x30, 0x9d, 0xcd, 0xf4, - 0xa6, 0x99, 0x22, 0x3c, 0x1f, 0xef, 0x18, 0x21, 0x87, 0xd3, 0x41, 0x81, - 0xfa, 0xb2, 0xdc, 0x49, 0x42, 0xce, 0xd0, 0x64, 0x8b, 0x75, 0x1d, 0x7f, - 0xdc, 0x42, 0xc1, 0x98, 0x65, 0x31, 0xeb, 0x5e, 0x24, 0x65, 0xc2, 0x4c, - 0xcb, 0x28, 0x29, 0x4b, 0xdb, 0x51, 0x30, 0x8c, 0xde, 0x82, 0xd6, 0x94, - 0x50, 0xce, 0x4e, 0x9c, 0xa7, 0xa9, 0xab, 0xc1, 0x0e, 0x76, 0x7b, 0x25, - 0x05, 0x43, 0x5d, 0x33, 0xe6, 0x0f, 0x92, 0x20, 0xc0, 0x46, 0x65, 0x11, - 0x0b, 0xf2, 0x97, 0x7b, 0xcb, 0x61, 0x7e, 0x50, 0x13, 0x55, 0x27, 0xae, - 0x21, 0xd9, 0xcb, 0xe2, 0x99, 0x49, 0x97, 0x14, 0xc8, 0xd3, 0xef, 0x05, - 0x56, 0x3f, 0x1c, 0x54, 0xb0, 0xa5, 0xcf, 0xf6, 0x2a, 0xc0, 0x60, 0x51, - 0xfb, 0xee, 0x91, 0x49, 0x17, 0xdb, 0x1c, 0x66, 0xac, 0x8d, 0xa6, 0x46, - 0xc8, 0xad, 0xe0, 0xb4, 0x14, 0xad, 0x24, 0xe0, 0x43, 0x7c, 0xce, 0xd3, - 0x14, 0xd9, 0x47, 0xb0, 0xca, 0xed, 0x30, 0x7c, 0xe0, 0xe8, 0xe2, 0x91, - 0xa5, 0xf0, 0x31, 0x3e, 0x48, 0xb7, 0x87, 0x99, 0x8e, 0x6c, 0x4b, 0x48, - 0x91, 0x5a, 0x41, 0x05, 0x3e, 0x8f, 0x1d, 0x4b, 0x73, 0x50, 0x0a, 0xfc, - 0xcf, 0x79, 0x7c, 0xab, 0x2b, 0x60, 0xa4, 0x5b, 0x66, 0x0c, 0x8a, 0xc4, - 0x04, 0xdf, 0x44, 0x41, 0xe7, 0x59, 0xc2, 0x78, 0x3a, 0xfa, 0x05, 0x9b, - 0x49, 0xf7, 0xbf, 0x7c, 0x61, 0xa6, 0xf0, 0xcc, 0x88, 0x45, 0x4b, 0xab, - 0x81, 0x8e, 0xdb, 0xa1, 0x12, 0xa2, 0xac, 0xba, 0xeb, 0xbf, 0xa9, 0xbd, - 0xa0, 0xcd, 0x64, 0x72, 0x0b, 0x94, 0x48, 0xe4, 0x6e, 0x50, 0x3b, 0xaf, - 0x00, 0x03, 0xbf, 0x89, 0xcd, 0xdd, 0xbb, 0x9f, 0xfc, 0xee, 0xa0, 0x79, - 0x22, 0x11, 0x62, 0x75, 0x4c, 0x53, 0x50, 0x29, 0x61, 0x03, 0xc7, 0x94, - 0xa3, 0xfc, 0x61, 0xda, 0x2b, 0x86, 0x35, 0xaa, 0xd3, 0x33, 0x9a, 0xeb, - 0xcb, 0x8d, 0x3a, 0x85, 0x44, 0xd8, 0xc7, 0x3c, 0x0f, 0xfb, 0x3b, 0x61, - 0x0c, 0x7a, 0x28, 0xd7, 0xea, 0x2c, 0xf5, 0xef, 0x20, 0xff, 0xed, 0x57, - 0xdb, 0xee, 0x13, 0x2a, 0x29, 0xef, 0xce, 0xbc, 0xfd, 0x0b, 0x73, 0x07, - 0x93, 0xfb, 0xad, 0x02, 0xd1, 0xd5, 0xcc, 0x48, 0x6c, 0x2c, 0x2f, 0x02, - 0xea, 0x1f, 0xf1, 0xb0, 0x56, 0x4b, 0x50, 0xcf, 0x15, 0xe1, 0xf6, 0xfb, - 0x1f, 0x1f, 0x81, 0xc3, 0x65, 0x36, 0xe2, 0x3a, 0x7b, 0xaf, 0xe3, 0x33, - 0xbe, 0x88, 0x8f, 0x35, 0x56, 0x54, 0xf6, 0x6b, 0x7a, 0xc5, 0xd7, 0x65, - 0x7a, 0x2e, 0xd9, 0xcf, 0x17, 0xba, 0xf4, 0xb0, 0xd1, 0x6e, 0x90, 0x39, - 0xd1, 0x20, 0xdc, 0x06, 0xcd, 0x01, 0xf5, 0xe0, 0x8a, 0x3a, 0x79, 0xb0, - 0xb8, 0x42, 0xf9, 0x80, 0x91, 0xc2, 0x71, 0x9b, 0x34, 0x76, 0x16, 0x15, - 0xcb, 0xb0, 0x47, 0xab, 0x67, 0x03, 0x66, 0x7a, 0x64, 0xf2, 0xea, 0x26, - 0x86, 0xbe, 0x79, 0xb1, 0x5b, 0xd3, 0x86, 0x6d, 0x67, 0xa9, 0x3b, 0xfa, - 0x52, 0xad, 0x20, 0xea, 0x91, 0xf9, 0xea, 0x1d, 0xe1, 0x23, 0xab, 0xff, - 0x9d, 0x75, 0x86, 0xf2, 0xfc, 0x85, 0x95, 0x32, 0xec, 0x61, 0xaa, 0xab, - 0x04, 0x1e, 0xc3, 0x43, 0xb7, 0xc4, 0x8a, 0x10, 0x99, 0xf2, 0x14, 0xae, - 0xab, 0x1c, 0x36, 0x88, 0x67, 0x6f, 0xb9, 0x32, 0x18, 0x8a, 0x02, 0xa7, - 0x18, 0xc2, 0x48, 0xb9, 0x99, 0xcf, 0x5a, 0xea, 0x55, 0xcc, 0x86, 0x70, - 0x9b, 0xfc, 0x43, 0x39, 0x8d, 0xa7, 0xd4, 0xd8, 0xf6, 0x07, 0x35, 0x96, - 0xc0, 0x30, 0xf4, 0xf2, 0x15, 0xc7, 0x49, 0xc6, 0x94, 0x5a, 0x0c, 0xfc, - 0x8f, 0x6c, 0xd7, 0x95, 0xd5, 0xcf, 0xd3, 0x11, 0xa4, 0x37, 0x47, 0xae, - 0xfb, 0x44, 0x64, 0xba, 0x6d, 0xb5, 0xd1, 0x2c, 0x5c, 0x8d, 0x56, 0x07, - 0xc5, 0xd8, 0x99, 0x3f, 0xd4, 0x04, 0x01, 0x1e, 0xfd, 0xcf, 0x0d, 0xbf, - 0xe2, 0x32, 0x99, 0x47, 0x16, 0xc9, 0x46, 0x74, 0xfb, 0x0c, 0x44, 0xdc, - 0x20, 0xb7, 0xe8, 0x63, 0x73, 0x26, 0xe2, 0xa9, 0x55, 0x0b, 0xc0, 0x4c, - 0x1f, 0x46, 0x69, 0xe1, 0x06, 0xd3, 0xf1, 0x8e, 0x5b, 0xb5, 0x0d, 0x08, - 0xc0, 0x20, 0x7f, 0xec, 0xd8, 0xa6, 0xd9, 0x4c, 0x32, 0x77, 0x64, 0xc1, - 0xf9, 0x79, 0xcf, 0x65, 0xca, 0xcf, 0xcd, 0x4e, 0xbd, 0xa6, 0x97, 0xfa, - 0x19, 0x71, 0x9e, 0xfa, 0x1b, 0x94, 0x63, 0x01, 0xce, 0x50, 0xec, 0x5f, - 0x23, 0x13, 0x10, 0xdd, 0x4e, 0xd0, 0x41, 0x3a, 0xbd, 0xbb, 0x13, 0xe3, - 0xba, 0x2d, 0x11, 0xaa, 0x64, 0x7a, 0x17, 0xf7, 0x51, 0x91, 0x36, 0xa3, - 0x84, 0xeb, 0x30, 0x04, 0x9a, 0xd0, 0xb1, 0xe1, 0xe3, 0x11, 0x13, 0x67, - 0xf7, 0x31, 0x21, 0xf0, 0xa0, 0x9d, 0x03, 0x9b, 0xc2, 0x3a, 0xdb, 0xff, - 0xa3, 0xf0, 0xcb, 0x48, 0x01, 0x5f, 0xa9, 0xdf, 0xa2, 0xd3, 0xb5, 0xfc, - 0x6f, 0x61, 0xca, 0x1b, 0x5a, 0xf1, 0x25, 0xc6, 0x6a, 0x3f, 0x0c, 0x20, - 0xee, 0xb7, 0x84, 0x17, 0xdf, 0x4b, 0x39, 0x33, 0xcd, 0xde, 0x0a, 0xaf, - 0xd7, 0x65, 0x57, 0x3d, 0x67, 0x26, 0x99, 0x62, 0xc8, 0x14, 0xbf, 0xce, - 0x5f, 0xa0, 0xc2, 0x1f, 0x1c, 0x72, 0x33, 0xbd, 0x10, 0x78, 0xe9, 0x75, - 0x66, 0x1a, 0x13, 0x51, 0x6b, 0xd4, 0x81, 0xce, 0x04, 0xbf, 0x08, 0x68, - 0xd3, 0x11, 0xb3, 0x8d, 0xd5, 0x8f, 0x5b, 0x84, 0x37, 0xf9, 0x84, 0xe5, - 0x50, 0x9c, 0xee, 0x86, 0xcb, 0xc7, 0xa6, 0x6a, 0x88, 0x8a, 0x22, 0x37, - 0x34, 0xfd, 0xf5, 0x36, 0x17, 0xd9, 0xc1, 0x01, 0xad, 0xd5, 0x97, 0x7e, - 0xc6, 0xb2, 0x58, 0x3c, 0xc6, 0x6e, 0xe0, 0x60, 0xb5, 0xa2, 0x6f, 0x96, - 0xbc, 0x0f, 0x9f, 0x73, 0x71, 0xc8, 0x5f, 0x1c, 0x5e, 0x5f, 0xfa, 0x99, - 0x5e, 0x2b, 0x40, 0xc6, 0x89, 0x73, 0xd1, 0xb6, 0x3a, 0xd5, 0xd9, 0x3d, - 0x03, 0x26, 0x05, 0x29, 0xf0, 0x91, 0x30, 0xd3, 0xfc, 0xf3, 0xd8, 0xf0, - 0x76, 0x3a, 0x72, 0xa8, 0x17, 0xe3, 0x97, 0x61, 0x99, 0xbf, 0xb8, 0xc3, - 0x86, 0x81, 0x64, 0x91, 0x39, 0xbb, 0xe3, 0xd2, 0x62, 0x1a, 0x9f, 0x9f, - 0xf1, 0x78, 0x6d, 0x2b, 0xd6, 0xe3, 0x4f, 0x47, 0x73, 0x47, 0x60, 0xbf, - 0x8a, 0xcc, 0xb5, 0x12, 0x17, 0x8c, 0x49, 0x71, 0xf1, 0x4b, 0x92, 0xdc, - 0x00, 0x64, 0x2b, 0x73, 0x6b, 0x0a, 0x3d, 0x3e, 0x15, 0x5c, 0x7c, 0xe7, - 0x8e, 0x50, 0x39, 0xf2, 0x5b, 0xd4, 0x5a, 0xe8, 0x90, 0x8d, 0xb9, 0x9a, - 0x5f, 0xad, 0xb4, 0x68, 0xb1, 0x19, 0xb3, 0x74, 0x58, 0xc7, 0x03, 0xb0, - 0xb0, 0x16, 0x9f, 0x26, 0x89, 0x8a, 0xdb, 0xf8, 0x3d, 0x3f, 0xf5, 0xdc, - 0xd4, 0x28, 0x0a, 0x1a, 0x65, 0x16, 0x66, 0x72, 0xec, 0x02, 0x14, 0x9b, - 0x34, 0x43, 0xe3, 0xae, 0xb0, 0xec, 0xc9, 0xae, 0xae, 0x7e, 0x8b, 0x8e, - 0x19, 0xae, 0xed, 0x20, 0x22, 0xe2, 0x08, 0x95, 0xd1, 0xc1, 0xf8, 0xd6, - 0xaf, 0xf4, 0xf5, 0xa1, 0xf6, 0x7a, 0x39, 0x2c, 0x20, 0x5b, 0xb0, 0xf3, - 0xde, 0x9c, 0x9b, 0x73, 0x47, 0x1a, 0x59, 0x69, 0x5f, 0x42, 0x4a, 0xcc, - 0x21, 0x54, 0xce, 0x69, 0x8c, 0xe1, 0x6b, 0x5a, 0xea, 0xee, 0xdd, 0x57, - 0xae, 0x1f, 0x28, 0x1d, 0x8e, 0x74, 0xcc, 0xc9, 0x2e, 0x3e, 0x7b, 0xa3, - 0xff, 0x93, 0xaa, 0xb0, 0x5b, 0xa4, 0xad, 0x86, 0x45, 0xf5, 0x17, 0x64, - 0x0f, 0xdf, 0x49, 0xa8, 0x98, 0xc2, 0x4f, 0xdf, 0xf4, 0x4d, 0x18, 0x24, - 0x12, 0x60, 0x68, 0x86, 0x4f, 0x96, 0x9d, 0xa6, 0xfb, 0xe8, 0x9d, 0x99, - 0xd2, 0x2c, 0x30, 0x6f, 0x59, 0x2d, 0x76, 0x56, 0x3b, 0x78, 0x99, 0x0b, - 0x6f, 0xdf, 0x8e, 0x04, 0x6a, 0x34, 0xea, 0x3f, 0x3a, 0x56, 0x67, 0x71, - 0xe1, 0x19, 0xbf, 0x98, 0x55, 0x9a, 0x9d, 0xf3, 0x6e, 0xd6, 0x71, 0x2b, - 0xde, 0xd5, 0xb2, 0xe9, 0xce, 0x43, 0x11, 0x4c, 0x8e, 0x5a, 0x6a, 0x5b, - 0x3f, 0xb9, 0xec, 0x1c, 0x15, 0xbb, 0xda, 0x49, 0x51, 0x36, 0x47, 0x94, - 0x40, 0x8c, 0x3d, 0xb0, 0xff, 0xed, 0xd0, 0x32, 0x00, 0xa6, 0x73, 0x7b, - 0x2b, 0x00, 0x02, 0x89, 0xb0, 0x05, 0xfe, 0x31, 0x17, 0xa7, 0xf8, 0xea, - 0x16, 0xe0, 0x50, 0x62, 0x34, 0xae, 0x6a, 0xa2, 0x2c, 0x80, 0xe9, 0x05, - 0xcd, 0x2f, 0x32, 0x15, 0x32, 0xe2, 0xe1, 0x07, 0xae, 0x48, 0x67, 0x75, - 0x68, 0x42, 0xaf, 0x17, 0x1e, 0x6c, 0xe1, 0x93, 0x61, 0x38, 0x7d, 0x52, - 0x05, 0x0d, 0x9e, 0x03, 0x99, 0x94, 0xe4, 0x57, 0x33, 0x2a, 0x3c, 0x04, - 0x58, 0x3d, 0x34, 0xda, 0x42, 0xd8, 0x05, 0x47, 0x72, 0x75, 0x97, 0x38, - 0xbd, 0xb2, 0xe9, 0x5d, 0xd6, 0xa9, 0x82, 0x1a, 0x2a, 0x0b, 0xf9, 0xdf, - 0x06, 0xc3, 0x24, 0x56, 0x6f, 0xaf, 0x31, 0x0f, 0x6f, 0x1e, 0x15, 0xe4, - 0x91, 0xed, 0xca, 0x70, 0x57, 0x1e, 0xbf, 0x74, 0x2c, 0x7b, 0xc7, 0x8a, - 0x72, 0xa8, 0xad, 0x71, 0xf9, 0xa7, 0x4a, 0x59, 0xba, 0x9f, 0x8d, 0x8c, - 0x4a, 0xee, 0x3f, 0xe4, 0xe3, 0x84, 0xc1, 0x45, 0xb7, 0xe8, 0xbe, 0x92, - 0x93, 0xf3, 0x05, 0x6f, 0x00, 0x06, 0xa0, 0x4c, 0x4b, 0x7e, 0x3e, 0xe9, - 0x3d, 0x40, 0xaa, 0x08, 0x9a, 0xf9, 0x59, 0x10, 0xb8, 0x49, 0xce, 0x9c, - 0xae, 0x2d, 0x48, 0x5b, 0x40, 0x75, 0xb3, 0x8d, 0xd5, 0x01, 0x3e, 0xd9, - 0xb7, 0xef, 0x3e, 0x4d, 0x23, 0x6d, 0x01, 0x43, 0x74, 0xbb, 0x07, 0x7f, - 0x25, 0x35, 0xb5, 0x7f, 0x04, 0xe9, 0xe8, 0xe3, 0xa2, 0x41, 0x5f, 0x81, - 0x9a, 0x5c, 0x47, 0xd8, 0x5e, 0x56, 0xdd, 0xae, 0xc6, 0x0d, 0x3c, 0x9f, - 0x19, 0xbb, 0x1b, 0x5e, 0x08, 0xdc, 0xb3, 0x13, 0x96, 0x25, 0x40, 0x5c, - 0xe3, 0x3d, 0x50, 0xc7, 0xd1, 0xbb, 0x85, 0x52, 0x11, 0x3d, 0xe6, 0xfd, - 0x96, 0x2b, 0xf3, 0xd9, 0xff, 0x08, 0x1a, 0xc9, 0xb2, 0x56, 0x77, 0xe1, - 0x57, 0x3e, 0x20, 0x21, 0x2f, 0xfd, 0x1e, 0xff, 0x43, 0x2d, 0xaa, 0x10, - 0x8d, 0xa2, 0x51, 0x1b, 0x1a, 0x3d, 0x70, 0x4d, 0x15, 0xbf, 0x26, 0xb8, - 0xdb, 0x08, 0xa8, 0xb0, 0x74, 0x11, 0x87, 0xc8, 0x91, 0xf0, 0x9e, 0x41, - 0xdd, 0xb4, 0xc5, 0x1a, 0x3b, 0x74, 0x9a, 0xbe, 0xe5, 0xfa, 0xc3, 0xf0, - 0x46, 0x5e, 0x0e, 0xb7, 0x11, 0xa2, 0xc9, 0x50, 0x5b, 0x89, 0x80, 0xb6, - 0x2a, 0xeb, 0x46, 0x18, 0x15, 0x85, 0x3e, 0x10, 0xcc, 0xeb, 0x84, 0x78, - 0xed, 0xed, 0x0f, 0x76, 0xfe, 0xe8, 0xe4, 0x52, 0x47, 0xef, 0x7a, 0x5f, - 0x20, 0x77, 0x7f, 0x7b, 0xad, 0x8e, 0x6e, 0x5b, 0x02, 0x80, 0x31, 0xe0, - 0xc1, 0x65, 0xbe, 0x46, 0x6f, 0x0e, 0xa0, 0x6d, 0xfb, 0xb0, 0x33, 0xd4, - 0xf8, 0x8b, 0x59, 0xba, 0xeb, 0xd9, 0x12, 0xa3, 0xa4, 0x43, 0xfb, 0x4d, - 0x19, 0x03, 0x71, 0xd5, 0x08, 0x10, 0x95, 0x75, 0xeb, 0x47, 0x2e, 0x4a, - 0x4e, 0x20, 0x79, 0x7c, 0x49, 0x8b, 0xde, 0xc8, 0xe2, 0x6b, 0x83, 0xa8, - 0x1b, 0xb4, 0x62, 0xae, 0xef, 0xef, 0xa4, 0x33, 0x5b, 0x7e, 0x44, 0xa2, - 0xbd, 0xe5, 0x08, 0x0d, 0x88, 0x28, 0x65, 0x93, 0x88, 0xc1, 0xe5, 0x3e, - 0x1e, 0x94, 0xf0, 0x57, 0x29, 0xf8, 0x45, 0xfb, 0x90, 0xa5, 0x41, 0x7b, - 0xa1, 0x94, 0xda, 0x37, 0xee, 0xfb, 0x93, 0xd3, 0xcc, 0x71, 0x46, 0x60, - 0xf2, 0x21, 0xfd, 0xd4, 0xfc, 0xec, 0xf7, 0xe9, 0x68, 0xc1, 0x3a, 0x3e, - 0x66, 0x38, 0x49, 0x65, 0x26, 0x2c, 0x33, 0x48, 0x6c, 0x3b, 0x5e, 0x4d, - 0xa8, 0x8d, 0xcd, 0xa6, 0xc7, 0xbe, 0x56, 0x4c, 0xfc, 0xd3, 0xb2, 0x63, - 0x98, 0xa3, 0x2d, 0x44, 0x12, 0xb6, 0x85, 0xfa, 0x18, 0xec, 0x52, 0x2c, - 0x43, 0xe5, 0x82, 0xaf, 0xd1, 0x0e, 0x5a, 0x30, 0x09, 0x2f, 0xc1, 0x1c, - 0x3f, 0xc6, 0xf8, 0xec, 0xb8, 0xbb, 0x19, 0x0d, 0x16, 0x8e, 0xcf, 0xa8, - 0xb5, 0x15, 0xfd, 0xcc, 0x34, 0xa1, 0x66, 0x1a, 0xb4, 0x87, 0x7c, 0x5f, - 0x7f, 0xb4, 0x18, 0x44, 0x7c, 0xe3, 0x57, 0x2a, 0x36, 0xd7, 0x37, 0x18, - 0x6e, 0xe5, 0xf7, 0xf6, 0xa1, 0x48, 0xbc, 0xf6, 0xd3, 0x64, 0x75, 0x6f, - 0xee, 0xf6, 0x79, 0x46, 0x9a, 0xd5, 0x53, 0xe4, 0x15, 0x7e, 0x05, 0x93, - 0x60, 0xa6, 0x8c, 0x21, 0x77, 0xca, 0x3c, 0xdc, 0x22, 0x19, 0x02, 0x89, - 0xb7, 0x9d, 0x5a, 0xde, 0xef, 0xdc, 0xf5, 0xd6, 0x4c, 0xf9, 0x0b, 0xf4, - 0x41, 0xb5, 0x30, 0x2a, 0x8f, 0x72, 0xa7, 0x9b, 0xf5, 0x37, 0x58, 0xb1, - 0x18, 0x35, 0xf1, 0x1d, 0x25, 0x35, 0xfa, 0xb7, 0x01, 0x44, 0x80, 0x3f, - 0x3d, 0x1f, 0xe1, 0x93, 0x96, 0x89, 0x7f, 0xd7, 0xf7, 0x75, 0x69, 0x03, - 0x6f, 0x4c, 0xca, 0x81, 0x71, 0xd0, 0xbd, 0x6c, 0x78, 0x0b, 0xf8, 0xca, - 0xe1, 0x4c, 0x8b, 0xf8, 0xc7, 0xb5, 0x26, 0x1a, 0x05, 0x6f, 0x77, 0x55, - 0xc3, 0xfa, 0x76, 0x6b, 0x36, 0x6d, 0xea, 0x36, 0xdf, 0xcf, 0x1f, 0x8b, - 0x9e, 0x9f, 0x58, 0x0d, 0x87, 0x85, 0x7b, 0xe4, 0xe1, 0x0e, 0x65, 0x8b, - 0x51, 0x20, 0xe6, 0x2c, 0x77, 0xcb, 0xed, 0x54, 0xb4, 0x2a, 0x73, 0x7e, - 0xe3, 0xb0, 0xfe, 0x64, 0x25, 0x98, 0xe8, 0xb8, 0xcf, 0xae, 0x46, 0x06, - 0x7c, 0x50, 0xc2, 0x69, 0x4a, 0x0e, 0xf0, 0x66, 0xdf, 0x7b, 0x81, 0x5f, - 0x32, 0xbc, 0x1e, 0x84, 0x0d, 0x0d, 0x5c, 0xd2, 0x9a, 0x2e, 0xc6, 0x42, - 0xfe, 0x31, 0x28, 0x7e, 0xc6, 0x92, 0x1c, 0xee, 0x0b, 0xeb, 0x5e, 0x41, - 0x76, 0x80, 0xaf, 0x81, 0x41, 0x03, 0x0b, 0x14, 0x84, 0x37, 0x1c, 0x1f, - 0x0d, 0xb8, 0xb3, 0xa3, 0x40, 0xc7, 0x25, 0x94, 0xf1, 0xf6, 0x7a, 0x1e, - 0x8f, 0x74, 0x0c, 0x74, 0x6a, 0x9a, 0x7f, 0x89, 0xa3, 0x28, 0x6b, 0xbb, - 0x6d, 0xa0, 0x82, 0xa9, 0x0e, 0x33, 0x41, 0x41, 0x21, 0x9e, 0x1e, 0xe2, - 0x4f, 0x0a, 0x7b, 0xcc, 0xa8, 0xd5, 0x2d, 0x28, 0x43, 0x3a, 0x2d, 0x96, - 0xea, 0xb0, 0xd1, 0x21, 0xf5, 0x25, 0x77, 0x4b, 0x77, 0xae, 0x9d, 0x13, - 0x18, 0x62, 0x52, 0xc4, 0xd1, 0xe1, 0xe0, 0xb0, 0x32, 0x2a, 0x5a, 0x20, - 0xba, 0x25, 0x6b, 0xfa, 0x5f, 0xa3, 0x42, 0xde, 0x93, 0x26, 0x9f, 0x0e, - 0x2c, 0xee, 0x95, 0xfb, 0x2d, 0xa8, 0xd5, 0x3f, 0x7b, 0xf9, 0xd8, 0x81, - 0x96, 0x59, 0xd3, 0x05, 0xb0, 0x31, 0xfb, 0xf3, 0x2c, 0xf3, 0xb5, 0x16, - 0x17, 0x35, 0x1e, 0x80, 0xb0, 0x0e, 0xeb, 0xe4, 0x30, 0xe1, 0xce, 0xd5, - 0xc3, 0x01, 0xae, 0x11, 0xf8, 0x7b, 0x9d, 0x33, 0x8e, 0xed, 0x22, 0xfa, - 0x4e, 0x2a, 0xf9, 0x1c, 0x34, 0xa3, 0xd5, 0x39, 0x2e, 0xb9, 0x47, 0xdf, - 0x02, 0xcc, 0xd6, 0xd7, 0xf9, 0x1e, 0x33, 0x74, 0x04, 0xcc, 0x83, 0x63, - 0x17, 0x7a, 0x96, 0x3a, 0xf3, 0x87, 0xaa, 0xcd, 0xe0, 0x5f, 0x3a, 0xbc, - 0x99, 0x6f, 0x6c, 0x48, 0xb0, 0x8c, 0x28, 0x3a, 0xd1, 0xc4, 0x88, 0x86, - 0x86, 0x36, 0x93, 0x1c, 0x35, 0x4a, 0x18, 0xb3, 0xd1, 0x00, 0x0a, 0x44, - 0xb5, 0x1f, 0xc9, 0xf7, 0x56, 0xe1, 0x6e, 0xb8, 0xb1, 0xb2, 0xdd, 0x54, - 0x99, 0xdd, 0x90, 0xa8, 0xd4, 0xde, 0x8c, 0x78, 0x93, 0xfd, 0x4b, 0x4a, - 0x04, 0x51, 0xdc, 0xc6, 0x82, 0xe7, 0xba, 0x2c, 0x5d, 0x4f, 0xd6, 0x44, - 0x01, 0xfd, 0x99, 0xc6, 0x37, 0xe3, 0x23, 0x9c, 0x41, 0x2d, 0x17, 0x74, - 0xc6, 0x63, 0x3a, 0xa8, 0xb5, 0xf1, 0x48, 0x70, 0x2a, 0x7e, 0xea, 0xbe, - 0x8b, 0x34, 0x4b, 0x75, 0x1d, 0xa2, 0x7c, 0x7d, 0xe1, 0x2f, 0xe0, 0xac, - 0x56, 0xb5, 0x4c, 0x65, 0x25, 0x0a, 0xa9, 0x11, 0x7c, 0x48, 0x58, 0x6a, - 0x74, 0x4b, 0x61, 0x66, 0xd6, 0x9e, 0x0f, 0x30, 0xa4, 0x38, 0xbb, 0x4b, - 0x26, 0xce, 0xbf, 0x43, 0x3c, 0x66, 0xa6, 0xdc, 0xaf, 0x89, 0x8b, 0x5d, - 0xab, 0x86, 0xb8, 0xfa, 0xe9, 0x69, 0x38, 0xc4, 0xd7, 0x64, 0xdd, 0x37, - 0x99, 0x10, 0x8b, 0xcb, 0xa8, 0xc5, 0x3d, 0x46, 0x0c, 0xd4, 0x4c, 0x07, - 0xb6, 0x32, 0x8c, 0x64, 0xb8, 0xe1, 0x1b, 0x15, 0x63, 0x9b, 0x2f, 0x5c, - 0xe8, 0x85, 0xd7, 0xe9, 0xde, 0x87, 0xa0, 0x49, 0xf2, 0x14, 0x86, 0x7a, - 0x86, 0x47, 0x5a, 0x53, 0x0a, 0xd0, 0x88, 0x39, 0xbb, 0x28, 0x4a, 0xaa, - 0xcf, 0x77, 0xc2, 0x26, 0x14, 0x4c, 0xc1, 0x30, 0x06, 0x33, 0x36, 0x7d, - 0xdd, 0x29, 0xff, 0x53, 0x32, 0x6b, 0x54, 0x2f, 0xc9, 0x52, 0x02, 0x8f, - 0x5c, 0x13, 0x49, 0x73, 0x63, 0xcf, 0x1b, 0x65, 0xbb, 0x2c, 0x78, 0x20, - 0xd8, 0xbf, 0xcf, 0x51, 0xdb, 0xc0, 0x5b, 0xb2, 0x50, 0x25, 0xb1, 0x4e, - 0x69, 0x37, 0xec, 0xfb, 0x88, 0x53, 0x35, 0x6c, 0x1f, 0xb7, 0x7b, 0x23, - 0xcb, 0x13, 0x6f, 0x6a, 0xcf, 0x0a, 0x10, 0xc5, 0xce, 0x2c, 0xb5, 0x65, - 0xf7, 0x07, 0x3f, 0x81, 0x41, 0xee, 0xb7, 0x9d, 0xf6, 0xd8, 0x31, 0xab, - 0x44, 0x28, 0xbb, 0xf1, 0xf7, 0x52, 0x12, 0xee, 0x2a, 0x51, 0x33, 0xb5, - 0xe3, 0x8b, 0x05, 0x50, 0x58, 0x34, 0x6e, 0xc5, 0x9f, 0x69, 0x23, 0x68, - 0x05, 0x2b, 0xce, 0x98, 0x70, 0x18, 0x04, 0x87, 0xf7, 0x36, 0xb4, 0xfc, - 0x8f, 0xd7, 0xd6, 0x86, 0xf3, 0x32, 0x72, 0x07, 0x16, 0x5f, 0x54, 0x1d, - 0x51, 0xee, 0x15, 0x76, 0x01, 0xb4, 0x0c, 0x09, 0x73, 0x7a, 0xa1, 0xf6, - 0xe8, 0x12, 0xe0, 0xaf, 0xb0, 0xfc, 0xbb, 0x3e, 0x67, 0xd5, 0x51, 0xc7, - 0x68, 0x75, 0x78, 0x2b, 0x81, 0x3b, 0xb4, 0x1d, 0xa0, 0x20, 0xaf, 0x23, - 0x3e, 0x3f, 0x33, 0x62, 0xff, 0x45, 0x09, 0xeb, 0x1e, 0xcd, 0x28, 0x76, - 0xde, 0xf6, 0xea, 0x51, 0x10, 0x8d, 0xe6, 0x6f, 0x39, 0x7c, 0xe5, 0x7e, - 0x71, 0x2c, 0x2b, 0xb3, 0x04, 0xd1, 0x6c, 0x0f, 0x48, 0xf4, 0x68, 0x0f, - 0x38, 0x07, 0x59, 0xc4, 0xd9, 0x40, 0xb8, 0x8d, 0x48, 0xad, 0x2f, 0x27, - 0x23, 0xd0, 0xc0, 0x2f, 0x00, 0x6b, 0x79, 0xd0, 0xe4, 0x21, 0x59, 0x95, - 0x97, 0x54, 0x71, 0x38, 0x6c, 0x52, 0x3d, 0x08, 0xdf, 0xaa, 0x3c, 0x2c, - 0xcd, 0xac, 0xbb, 0x13, 0x7f, 0x23, 0xcb, 0x16, 0x50, 0xda, 0xba, 0x99, - 0x2f, 0xea, 0x01, 0xb2, 0xe2, 0x3c, 0x87, 0x09, 0x67, 0x6a, 0xef, 0x3d, - 0x3b, 0x1b, 0x80, 0x1e, 0xe9, 0xae, 0x6c, 0x6d, 0xdc, 0x1d, 0x56, 0x8a, - 0x3b, 0x59, 0xee, 0xb7, 0xaa, 0x09, 0x05, 0xa8, 0x3f, 0xce, 0x4e, 0xbb, - 0x71, 0xa8, 0xff, 0xe2, 0xf6, 0xb8, 0x5f, 0xd9, 0x1b, 0x73, 0xf8, 0x51, - 0x18, 0x75, 0xbc, 0x37, 0x1c, 0x9f, 0x06, 0xf4, 0xa7, 0x31, 0x00, 0xa4, - 0x8d, 0xfa, 0x4a, 0x41, 0xa7, 0x9e, 0x22, 0x72, 0xa9, 0x23, 0x0b, 0xc8, - 0xa6, 0xcb, 0xa5, 0x32, 0x36, 0x22, 0x53, 0x21, 0x67, 0x3e, 0x70, 0x10, - 0x58, 0xc1, 0x33, 0x04, 0xb3, 0x85, 0xe0, 0x42, 0xfd, 0x81, 0x7b, 0xbb, - 0xd4, 0xea, 0x23, 0xbb, 0xe2, 0x3e, 0xe0, 0x8b, 0xaa, 0x54, 0x5d, 0x6b, - 0x4c, 0xff, 0xdf, 0xc6, 0x19, 0x44, 0x7c, 0xe5, 0x04, 0x83, 0xbf, 0x0e, - 0x10, 0x72, 0x2e, 0x4c, 0x4d, 0x16, 0x37, 0x73, 0x25, 0x9c, 0xf7, 0x3a, - 0x3b, 0xc1, 0x73, 0x33, 0x40, 0x98, 0xb1, 0x0b, 0x5a, 0x50, 0x9f, 0xa5, - 0x9b, 0xc3, 0x1b, 0xbf, 0xba, 0x8d, 0x3b, 0xf7, 0xd9, 0xec, 0xcc, 0x45, - 0xf6, 0xef, 0xbd, 0x2e, 0xf0, 0xac, 0xf9, 0x41, 0x4f, 0x6d, 0xd4, 0xa1, - 0x89, 0xc5, 0x2b, 0xc7, 0x3a, 0x2f, 0xc7, 0x01, 0xc8, 0xe0, 0xe5, 0xe1, - 0xc1, 0x4e, 0x4e, 0xc0, 0x06, 0x80, 0x92, 0x74, 0x12, 0xcb, 0xf6, 0x3a, - 0xf8, 0x93, 0x0b, 0x1f, 0x4f, 0xac, 0xe5, 0xe7, 0xb8, 0x44, 0xce, 0x82, - 0x42, 0x9b, 0x93, 0xda, 0xb3, 0x1c, 0x2c, 0x49, 0x7b, 0x81, 0x39, 0x26, - 0x79, 0xfa, 0x5f, 0x84, 0xd3, 0xcd, 0x35, 0xbc, 0x92, 0x63, 0xab, 0xf5, - 0xc7, 0x56, 0x45, 0x8f, 0x33, 0xc5, 0x41, 0x63, 0x5c, 0xba, 0x75, 0x22, - 0xdb, 0xa4, 0xdd, 0x19, 0x95, 0xbc, 0x67, 0x54, 0x1f, 0x1e, 0x3b, 0xfa, - 0x5a, 0xa0, 0x2d, 0x50, 0xf7, 0x8e, 0xe5, 0xb5, 0xfe, 0xa8, 0x67, 0xf7, - 0x11, 0x6d, 0xb0, 0x85, 0x9f, 0x7a, 0x67, 0xad, 0x1c, 0x6f, 0x73, 0x1c, - 0x7c, 0x2b, 0x6b, 0x5e, 0xc4, 0xb8, 0x68, 0x6e, 0x65, 0x20, 0x21, 0x6a, - 0xd2, 0x4a, 0xc7, 0x51, 0xd4, 0x25, 0x3e, 0x1f, 0x26, 0xdc, 0x2c, 0x4d, - 0x62, 0x01, 0xf8, 0x98, 0x1d, 0xa5, 0x4c, 0x82, 0xa4, 0x3f, 0xf7, 0xf0, - 0xa2, 0x9a, 0x02, 0x56, 0xcd, 0x87, 0xbe, 0xa3, 0xe8, 0xf2, 0xd1, 0x00, - 0x74, 0x7b, 0x8e, 0xe4, 0xbf, 0x2b, 0x0d, 0x19, 0xee, 0xf8, 0xdc, 0x88, - 0x3b, 0xd9, 0x88, 0x9d, 0x80, 0x03, 0x45, 0x66, 0x99, 0x34, 0x4d, 0x3c, - 0x96, 0xda, 0x8b, 0x6b, 0x7a, 0x6e, 0x0d, 0x8e, 0x75, 0x2d, 0xe8, 0x73, - 0xa9, 0xd1, 0xaf, 0x34, 0x6f, 0x1a, 0xed, 0x1d, 0xfb, 0xc7, 0x36, 0xd0, - 0xef, 0xbf, 0x9a, 0x7b, 0x2e, 0x45, 0xfc, 0xca, 0x1f, 0x79, 0x86, 0x5c, - 0x18, 0xd5, 0xa0, 0x50, 0x65, 0xba, 0xb3, 0xbc, 0xee, 0x23, 0x60, 0x21, - 0x8a, 0x00, 0x88, 0xfe, 0x21, 0x7f, 0x8a, 0xbc, 0xa1, 0x2b, 0x45, 0x2f, - 0xda, 0xf8, 0xfb, 0x04, 0x63, 0x40, 0x98, 0xf0, 0xa0, 0xd8, 0xd4, 0xed, - 0x2f, 0xf5, 0x89, 0x1b, 0x01, 0xbb, 0x7a, 0x2c, 0x30, 0xd1, 0xbc, 0xb3, - 0x01, 0x42, 0x74, 0xc1, 0x50, 0x08, 0xfe, 0x74, 0xe9, 0x70, 0xc9, 0xe8, - 0xff, 0xb5, 0x15, 0xc0, 0xf9, 0x68, 0xf1, 0x6a, 0xa9, 0xd0, 0xaa, 0x13, - 0xea, 0xcd, 0xae, 0xfe, 0xc4, 0xb2, 0x68, 0x0b, 0x09, 0xe3, 0xb8, 0xf0, - 0x39, 0xad, 0x92, 0x67, 0x82, 0x20, 0x95, 0x98, 0x7c, 0xf0, 0x73, 0x81, - 0xb8, 0xcf, 0x6c, 0xab, 0x03, 0x9c, 0x6d, 0x08, 0x35, 0xd9, 0x05, 0x05, - 0x96, 0x7d, 0x63, 0x13, 0x81, 0x42, 0x6f, 0x28, 0xb7, 0xbe, 0x9f, 0x52, - 0xb2, 0xe7, 0x44, 0xf0, 0x1a, 0x94, 0xfa, 0x86, 0xeb, 0x07, 0xfd, 0x8d, - 0x30, 0x97, 0x79, 0x71, 0xc2, 0x8d, 0x4c, 0x9a, 0x4d, 0x21, 0xf2, 0x1d, - 0xb4, 0xc6, 0x9c, 0x4a, 0x57, 0x6e, 0x4e, 0xe9, 0xc1, 0x86, 0x8d, 0xc9, - 0x86, 0xfb, 0x66, 0x27, 0x02, 0xf7, 0x26, 0xc7, 0x01, 0xaa, 0x1f, 0x99, - 0x9c, 0x20, 0x32, 0xfa, 0xc6, 0x1b, 0xcf, 0xbd, 0x49, 0x5e, 0x47, 0x7d, - 0x5e, 0x19, 0x8e, 0x66, 0x16, 0x3b, 0xca, 0x99, 0xb2, 0xcd, 0x23, 0xd7, - 0xaa, 0xef, 0x15, 0x6f, 0x94, 0x55, 0xdb, 0xd5, 0xaa, 0x22, 0x42, 0xea, - 0x0f, 0x1b, 0x79, 0x54, 0x32, 0x23, 0x81, 0xcb, 0x54, 0x66, 0x3a, 0x53, - 0x2a, 0xb7, 0xfa, 0x3a, 0xf2, 0x60, 0xc9, 0xcf, 0x59, 0x20, 0xc2, 0x6a, - 0xef, 0x8e, 0x5e, 0x41, 0x6a, 0x1b, 0xbe, 0xc6, 0x38, 0x1c, 0x47, 0x76, - 0xc4, 0x55, 0x89, 0xe7, 0xb7, 0x6a, 0xbc, 0xc1, 0xda, 0xa4, 0x6a, 0x6b, - 0xa0, 0x5b, 0x7b, 0xdb, 0x64, 0x25, 0x81, 0x1b, 0xc4, 0xb2, 0xb3, 0xba, - 0x36, 0x61, 0x90, 0x40, 0x6d, 0x9d, 0xc6, 0x2b, 0x50, 0x44, 0x22, 0x76, - 0x03, 0x51, 0x4f, 0xb1, 0x34, 0x12, 0xf6, 0xef, 0x5a, 0x77, 0x33, 0x22, - 0x1b, 0x70, 0xa6, 0x30, 0x54, 0xab, 0x07, 0xa5, 0x6a, 0x62, 0x2a, 0x24, - 0xc9, 0x5b, 0xad, 0xf5, 0x10, 0x41, 0x8d, 0xbc, 0x91, 0x06, 0x04, 0x31, - 0x76, 0xba, 0xd2, 0x81, 0x41, 0x28, 0x98, 0x94, 0x9f, 0x48, 0x73, 0xf9, - 0xf8, 0x2e, 0xb2, 0x44, 0x48, 0xa6, 0x20, 0x22, 0xc4, 0x40, 0x44, 0xb6, - 0xe6, 0x43, 0x1e, 0x3c, 0x4d, 0xaa, 0x30, 0x57, 0x34, 0xba, 0xb6, 0x34, - 0xd4, 0xa2, 0xf2, 0x30, 0x3f, 0xcb, 0x4e, 0x7b, 0x3f, 0x80, 0x33, 0x05, - 0xe9, 0x4c, 0xa1, 0x49, 0x99, 0x4a, 0xe1, 0x2d, 0x1b, 0xa2, 0x48, 0x5e, - 0x7b, 0xe5, 0x4d, 0xd0, 0x30, 0xf2, 0x1b, 0x74, 0xf6, 0xd9, 0xc1, 0x17, - 0xf3, 0xc3, 0xd3, 0x36, 0x40, 0x9d, 0xf9, 0x90, 0x34, 0xc5, 0x32, 0x2e, - 0x9a, 0x5e, 0x19, 0xbb, 0x5b, 0x9a, 0x4d, 0x95, 0xef, 0x06, 0x4a, 0x83, - 0xda, 0x9f, 0x4d, 0xfa, 0xb6, 0xe3, 0x04, 0x88, 0x8c, 0x04, 0x31, 0x54, - 0x00, 0x28, 0x38, 0xdc, 0xeb, 0x9b, 0xc5, 0xe2, 0x28, 0x79, 0x9f, 0x97, - 0xb0, 0xf7, 0x58, 0x0e, 0xc6, 0x3f, 0xd3, 0xbc, 0xf8, 0x3b, 0x29, 0xde, - 0xce, 0x7f, 0xfc, 0xef, 0x5f, 0x13, 0x1d, 0xdd, 0xcc, 0x8d, 0x04, 0xe7, - 0x18, 0x24, 0x59, 0x8f, 0xf2, 0x68, 0x36, 0x49, 0x19, 0x72, 0x02, 0xfc, - 0xc9, 0x71, 0x5b, 0xed, 0xe4, 0xd2, 0x69, 0xf9, 0xb6, 0xa4, 0xec, 0xca, - 0x47, 0x7a, 0x17, 0xf7, 0x59, 0xe5, 0x07, 0x8a, 0xed, 0xe5, 0xba, 0x30, - 0xf8, 0xad, 0xcb, 0xca, 0xf9, 0x57, 0x29, 0x03, 0xac, 0x2a, 0x62, 0x44, - 0x68, 0x7d, 0xcd, 0x9c, 0x3d, 0x21, 0x09, 0xc4, 0xc0, 0xa8, 0x79, 0x6b, - 0x77, 0xf7, 0x31, 0xe8, 0x68, 0xbb, 0x3b, 0x2e, 0x80, 0x94, 0x71, 0x32, - 0xad, 0x1c, 0x5f, 0x31, 0x72, 0xa4, 0x23, 0x7a, 0x34, 0x11, 0xe4, 0xd7, - 0xfb, 0x8c, 0xaf, 0x3b, 0x39, 0xfa, 0xdf, 0xdb, 0x1d, 0x17, 0xea, 0x68, - 0x14, 0xff, 0xcf, 0x10, 0xa3, 0x5b, 0x41, 0xbb, 0x00, 0x6b, 0xd5, 0x15, - 0x39, 0xca, 0xef, 0x07, 0xf7, 0x4d, 0x7a, 0x2e, 0x61, 0xa9, 0x2b, 0xce, - 0x3a, 0xb1, 0xfb, 0x90, 0xfb, 0x5c, 0xcb, 0x85, 0x2d, 0x0c, 0x83, 0xd5, - 0x38, 0xd3, 0x03, 0xab, 0xc4, 0x83, 0xf1, 0x85, 0xf0, 0x78, 0x80, 0x26, - 0xd1, 0x17, 0x65, 0x5f, 0xd6, 0x3a, 0x2b, 0x9d, 0x21, 0x44, 0x6d, 0xcd, - 0x57, 0x49, 0xbc, 0xed, 0xf0, 0x8e, 0xde, 0x28, 0xc5, 0x96, 0x5a, 0xd2, - 0x1e, 0x7e, 0x35, 0xe1, 0xa9, 0xdf, 0xb5, 0x1b, 0x49, 0x5c, 0x19, 0x4c, - 0x87, 0x8b, 0x1a, 0x7b, 0x81, 0x0c, 0x9c, 0xb1, 0x1f, 0x69, 0x20, 0xf1, - 0x99, 0x51, 0xb5, 0x52, 0x9f, 0x2d, 0xc4, 0x5a, 0x7e, 0x40, 0xa2, 0x71, - 0x65, 0x45, 0xb7, 0xca, 0xc1, 0xb5, 0x97, 0x51, 0xc9, 0xb2, 0xc4, 0x43, - 0x9f, 0x5c, 0x62, 0xa3, 0x78, 0xb1, 0x17, 0x25, 0xba, 0x6f, 0x11, 0x95, - 0x78, 0x0a, 0xec, 0x6f, 0xc6, 0x9f, 0xf8, 0xad, 0xa7, 0xe7, 0x24, 0xf5, - 0x34, 0xb5, 0x55, 0x37, 0x8d, 0xb5, 0x91, 0x4a, 0x69, 0xa3, 0xaf, 0xc3, - 0xe0, 0xeb, 0x41, 0xff, 0xa1, 0xd5, 0x81, 0x41, 0x5e, 0x24, 0x97, 0xc7, - 0x60, 0xde, 0x01, 0x9f, 0x61, 0x78, 0x0a, 0xcf, 0x4f, 0xe2, 0xd0, 0x3a, - 0x3a, 0xb8, 0x82, 0x33, 0xff, 0x93, 0x95, 0xea, 0xaa, 0x71, 0x41, 0xaf, - 0x06, 0xee, 0xb8, 0xe5, 0xd6, 0x1d, 0x76, 0x68, 0x96, 0x0d, 0x8b, 0xf8, - 0x46, 0xe0, 0x4c, 0x46, 0xfe, 0xcb, 0x62, 0xa3, 0xf2, 0x5e, 0xe5, 0x9e, - 0xf7, 0x95, 0xff, 0x4f, 0x64, 0xb9, 0x80, 0x88, 0x84, 0x2c, 0xfc, 0x1e, - 0x77, 0x05, 0xee, 0x63, 0x14, 0xb6, 0x17, 0x7f, 0x6a, 0x72, 0x28, 0x50, - 0x62, 0x67, 0xb8, 0x37, 0x85, 0x61, 0x9d, 0xbb, 0xeb, 0x02, 0x10, 0x16, - 0x0b, 0x98, 0xec, 0xa9, 0x12, 0x52, 0xeb, 0x56, 0xa7, 0xc0, 0xc0, 0xe3, - 0x0f, 0xbf, 0xc7, 0x59, 0xd4, 0x0c, 0x35, 0xed, 0x72, 0x9e, 0x5a, 0xce, - 0x47, 0x7c, 0xcf, 0x6d, 0x49, 0x95, 0x1a, 0x68, 0x3a, 0x83, 0x16, 0x54, - 0xf9, 0x88, 0x8b, 0x51, 0x44, 0x89, 0x31, 0x1f, 0x51, 0x67, 0xa9, 0xfc, - 0xf8, 0x3f, 0x98, 0xc0, 0xbf, 0xd7, 0x3c, 0xf2, 0xda, 0x0d, 0x37, 0x1c, - 0xa7, 0xd1, 0x3f, 0xbf, 0xa3, 0x3a, 0x5d, 0xf5, 0x0a, 0x01, 0xef, 0x74, - 0x69, 0x53, 0xa9, 0x29, 0x90, 0x1e, 0x57, 0xbb, 0xbf, 0x97, 0x02, 0x45, - 0xee, 0x6f, 0x59, 0x2e, 0xa2, 0x9c, 0x6a, 0x4f, 0xac, 0x65, 0xb0, 0xee, - 0xc5, 0x52, 0x8d, 0xc5, 0xbe, 0xe5, 0x81, 0x21, 0x04, 0x87, 0x00, 0xfe, - 0x78, 0xe3, 0x40, 0x53, 0x6f, 0xa1, 0x6b, 0x48, 0x9f, 0xb0, 0x1e, 0x93, - 0xa5, 0xb4, 0xfe, 0x84, 0x8b, 0x9c, 0xde, 0xf2, 0xb7, 0xbe, 0x17, 0x28, - 0x43, 0x52, 0x0e, 0x35, 0xc3, 0x0a, 0xd0, 0x6f, 0x37, 0xdf, 0xda, 0xf9, - 0x9e, 0x4d, 0xc7, 0x15, 0xce, 0x7c, 0xd4, 0x63, 0x0e, 0xfd, 0xe7, 0xfa, - 0xea, 0x05, 0x9e, 0x46, 0x39, 0x57, 0x4d, 0x16, 0x4a, 0xaf, 0x20, 0xe2, - 0x3e, 0x17, 0xe2, 0xea, 0x72, 0xbf, 0x3a, 0xe8, 0xcf, 0x78, 0xe7, 0xcc, - 0xee, 0x88, 0xf9, 0x24, 0x2e, 0x88, 0xef, 0x4c, 0x2c, 0x60, 0x32, 0xa8, - 0x03, 0x72, 0x03, 0xa5, 0x0e, 0x66, 0xe2, 0x25, 0x89, 0x0d, 0x8a, 0xc0, - 0xcd, 0xbb, 0xa4, 0x8d, 0x2e, 0x39, 0xa7, 0x16, 0xd9, 0xa5, 0xe5, 0x54, - 0x19, 0x11, 0x0b, 0x30, 0xb4, 0x34, 0x54, 0x40, 0x13, 0x93, 0x07, 0xff, - 0xf1, 0x05, 0xb9, 0x2c, 0x48, 0x27, 0xd1, 0xc5, 0xaf, 0x43, 0xe3, 0xab, - 0xcc, 0x12, 0xca, 0x34, 0x74, 0x63, 0xac, 0x8e, 0xf9, 0x16, 0x8d, 0xa0, - 0xdb, 0xfd, 0xbe, 0x6d, 0xb2, 0xd7, 0xdb, 0x48, 0xc5, 0xbe, 0x86, 0x1e, - 0x07, 0x01, 0xd8, 0x3c, 0x6d, 0xf3, 0xc3, 0xd7, 0x3d, 0x68, 0xcf, 0xe8, - 0x0d, 0x2d, 0x25, 0xca, 0x3c, 0x45, 0x34, 0x9a, 0x3f, 0x56, 0xa1, 0x96, - 0x6e, 0x3b, 0xee, 0xa7, 0xba, 0x4f, 0xe3, 0xa4, 0x79, 0x55, 0xdd, 0xce, - 0x9c, 0x58, 0x08, 0xc7, 0x35, 0x36, 0x7a, 0xde, 0x3e, 0xbe, 0x9e, 0x4b, - 0xda, 0x29, 0xad, 0x22, 0x6c, 0x2a, 0x60, 0x71, 0xb3, 0x5b, 0xec, 0x57, - 0x6f, 0x8e, 0x49, 0x67, 0xd5, 0x06, 0x1f, 0xce, 0xa0, 0xe5, 0xa7, 0x35, - 0x9e, 0x9b, 0x58, 0xbb, 0x0f, 0xe1, 0xe9, 0x75, 0xee, 0x92, 0xa4, 0xfa, - 0x9f, 0xa2, 0x0d, 0x1e, 0x1a, 0x49, 0x5f, 0x4c, 0xc6, 0xc9, 0xe5, 0x1e, - 0x66, 0x0a, 0xcc, 0x33, 0x75, 0xec, 0xe6, 0x48, 0x3d, 0xd6, 0x52, 0xe2, - 0x54, 0x70, 0x9d, 0x15, 0xf3, 0x93, 0x29, 0x64, 0x39, 0x98, 0x47, 0x08, - 0x38, 0x02, 0x0a, 0xd6, 0xfd, 0x39, 0xf6, 0x07, 0x3d, 0x1d, 0xcd, 0x51, - 0x98, 0x6f, 0xbf, 0x74, 0x97, 0xd5, 0xd8, 0x95, 0x66, 0x27, 0x59, 0x32, - 0x4b, 0xcd, 0x1b, 0x95, 0xfa, 0x48, 0x69, 0x57, 0x91, 0xbe, 0x8b, 0xeb, - 0xc9, 0x5a, 0x48, 0x9b, 0xed, 0xbb, 0xdd, 0x86, 0xca, 0x1b, 0x55, 0x32, - 0xd4, 0x7a, 0x90, 0xd0, 0x63, 0xb1, 0xca, 0x61, 0x1d, 0x68, 0x5b, 0xf1, - 0xf0, 0xf7, 0xd8, 0xf8, 0x2c, 0x21, 0xc0, 0x61, 0x90, 0x8d, 0x10, 0x92, - 0x15, 0x65, 0xe2, 0xeb, 0xd8, 0x90, 0x2c, 0xa7, 0x40, 0x17, 0xed, 0x9f, - 0x69, 0x89, 0x38, 0xb3, 0xf2, 0xe4, 0x12, 0x60, 0xd3, 0xfb, 0x57, 0xfc, - 0xdd, 0xac, 0x15, 0x27, 0xe7, 0xfd, 0x13, 0xb1, 0xeb, 0x10, 0x21, 0xeb, - 0x21, 0x3a, 0xc4, 0x89, 0x0e, 0x4d, 0x43, 0xfa, 0xec, 0x6a, 0xd7, 0xa9, - 0x81, 0x74, 0x65, 0x90, 0xfe, 0xef, 0x7f, 0xef, 0x6c, 0xe0, 0xec, 0x8d, - 0x00, 0x57, 0x75, 0x20, 0x9e, 0x8b, 0xd4, 0xbc, 0x7d, 0x87, 0xad, 0x5c, - 0xba, 0x1b, 0x8d, 0xce, 0x9e, 0xf0, 0x77, 0xb4, 0xa5, 0x81, 0xe9, 0x0d, - 0x06, 0xf5, 0xab, 0x53, 0x39, 0xf0, 0x96, 0x4c, 0xd2, 0x3d, 0x2d, 0xff, - 0xc9, 0xa2, 0x48, 0x02, 0x28, 0x98, 0xc6, 0xa9, 0xfc, 0xc0, 0x1d, 0xbc, - 0x98, 0x6d, 0xb1, 0xe3, 0x63, 0x29, 0x5a, 0x95, 0x5a, 0x2d, 0x4a, 0x01, - 0x37, 0x23, 0x97, 0x47, 0x32, 0xb3, 0xf9, 0x14, 0x01, 0x06, 0xcd, 0xf0, - 0x6f, 0x31, 0xdf, 0x52, 0x9d, 0x3b, 0xaf, 0x6d, 0x6f, 0x3f, 0xd4, 0x57, - 0xd4, 0x76, 0x64, 0xc9, 0x21, 0x17, 0x63, 0xb4, 0xb2, 0xcb, 0x76, 0xfc, - 0x8a, 0x9f, 0xec, 0x76, 0x99, 0x24, 0x56, 0x55, 0xdf, 0x9a, 0xbe, 0x20, - 0xdb, 0x31, 0x96, 0xbf, 0x24, 0xec, 0xb0, 0x91, 0xa8, 0x15, 0x03, 0xe4, - 0x4e, 0x59, 0x9b, 0x1b, 0x9b, 0x32, 0xe7, 0x92, 0xbb, 0xd2, 0x24, 0x27, - 0x8c, 0x85, 0x70, 0x96, 0x49, 0x17, 0x89, 0x5b, 0xac, 0xf4, 0xa8, 0x32, - 0x74, 0xa6, 0x90, 0x56, 0x3b, 0xea, 0x63, 0x66, 0x04, 0x14, 0xad, 0x35, - 0xee, 0x44, 0x3b, 0xa9, 0x7e, 0xa5, 0x6d, 0xdb, 0xb3, 0xa3, 0x2e, 0xe2, - 0x41, 0xde, 0x7f, 0x16, 0xb2, 0xa1, 0x62, 0x15, 0xe8, 0x14, 0xad, 0x7c, - 0xd3, 0x7c, 0x02, 0x3e, 0x35, 0x20, 0x76, 0x37, 0xaa, 0xc6, 0xd0, 0x5d, - 0xf7, 0x30, 0x52, 0x2f, 0xa2, 0xfd, 0xa7, 0x7b, 0xf7, 0xe7, 0x37, 0xc1, - 0x7e, 0xdb, 0x9b, 0xc1, 0xec, 0x0b, 0x5e, 0xd1, 0x9b, 0xa5, 0x27, 0x92, - 0xbe, 0x1c, 0xea, 0x31, 0x3e, 0x56, 0x7b, 0x5a, 0xba, 0xb9, 0xb4, 0xc0, - 0xfd, 0x59, 0x6d, 0x4b, 0xb3, 0x51, 0xa2, 0x7c, 0x77, 0xc8, 0xbc, 0x9b, - 0xd1, 0x19, 0x78, 0x92, 0xd2, 0x02, 0x63, 0xe8, 0x1a, 0x87, 0xd7, 0x6f, - 0x88, 0xd1, 0x04, 0x33, 0x8a, 0x4e, 0x92, 0x8f, 0x9c, 0x83, 0x99, 0x1e, - 0x6f, 0x7f, 0xb0, 0x23, 0x89, 0x71, 0x9b, 0x5f, 0x0d, 0xb7, 0xb0, 0x93, - 0x34, 0x06, 0xee, 0x13, 0x97, 0xc8, 0x04, 0x0d, 0x60, 0x02, 0xbc, 0xa3, - 0x89, 0x6f, 0x8a, 0x42, 0x7a, 0x5f, 0xe0, 0xd8, 0x19, 0x2c, 0x06, 0xdb, - 0x2c, 0xc3, 0x63, 0x8a, 0x28, 0x7a, 0x51, 0x02, 0xf2, 0x74, 0xf9, 0xfb, - 0x77, 0x72, 0x69, 0x32, 0xd9, 0x25, 0xe8, 0x29, 0xd2, 0x21, 0xf5, 0xed, - 0x74, 0x8d, 0x5f, 0xac, 0xf2, 0x42, 0x0f, 0x62, 0x37, 0xb4, 0x8c, 0x45, - 0xa5, 0x70, 0x08, 0xd9, 0x4a, 0xec, 0x54, 0x86, 0x16, 0x40, 0x6a, 0xf8, - 0xa8, 0x0e, 0xda, 0xfd, 0xa3, 0xa8, 0xc4, 0xb4, 0x60, 0x37, 0xae, 0xd4, - 0x10, 0x56, 0x53, 0xe7, 0xef, 0x3a, 0x0c, 0xb4, 0xf4, 0x01, 0x04, 0x76, - 0xd6, 0x8d, 0x27, 0xac, 0xeb, 0xd7, 0x86, 0xd2, 0x95, 0x66, 0x3c, 0x26, - 0x8f, 0xee, 0x99, 0xa1, 0x6e, 0xdd, 0xa2, 0x62, 0x51, 0x4e, 0xa3, 0x8f, - 0xe5, 0x85, 0xff, 0xc8, 0x4a, 0xad, 0xb9, 0xc1, 0xcd, 0xbb, 0xa8, 0xf4, - 0xab, 0x26, 0x82, 0x6b, 0xd0, 0xbc, 0x95, 0xe9, 0xb8, 0x05, 0xa8, 0x88, - 0x94, 0xf5, 0x8f, 0xf5, 0x87, 0x3b, 0x45, 0x96, 0xb3, 0x81, 0xbe, 0x87, - 0xff, 0xef, 0x49, 0x57, 0xf9, 0x63, 0x23, 0xcf, 0xc2, 0xd1, 0x3d, 0x4f, - 0xa9, 0x25, 0xb4, 0xf3, 0x29, 0xef, 0x46, 0x9d, 0x86, 0x02, 0x5e, 0x16, - 0x28, 0xcf, 0x8e, 0xbc, 0x1b, 0x36, 0xb7, 0x73, 0xad, 0x4f, 0x73, 0xd1, - 0x5e, 0x2e, 0xcf, 0x67, 0x5d, 0x2c, 0x54, 0x66, 0x8b, 0xfa, 0xd9, 0x6b, - 0x3d, 0x0c, 0x2b, 0x9c, 0x8c, 0x31, 0xd2, 0x07, 0x15, 0xe5, 0x80, 0x4f, - 0x2e, 0xe0, 0x2d, 0xcd, 0x98, 0x9b, 0x6b, 0xdc, 0x65, 0x98, 0xa6, 0xc4, - 0x9e, 0xbb, 0x17, 0x19, 0x80, 0xa3, 0x1e, 0xd6, 0x59, 0x4a, 0x1c, 0x90, - 0xca, 0xbe, 0xd8, 0xc2, 0x40, 0xbe, 0x94, 0x18, 0x60, 0xac, 0x29, 0x0a, - 0xee, 0x4e, 0xdc, 0xba, 0x3b, 0x6f, 0x22, 0x7d, 0x63, 0x22, 0xd4, 0xbf, - 0x08, 0x53, 0x8c, 0xd0, 0x32, 0xe4, 0x6a, 0x2a, 0x9d, 0x3f, 0x05, 0xf0, - 0x06, 0x20, 0x0d, 0x06, 0xd8, 0x7f, 0xdb, 0xad, 0xa8, 0x91, 0x01, 0xd7, - 0x8e, 0x46, 0x78, 0xfb, 0x61, 0x6f, 0x77, 0x1c, 0xb6, 0x81, 0xfd, 0xfc, - 0x5f, 0xfb, 0x41, 0x21, 0x3e, 0x27, 0xee, 0x4a, 0xc5, 0xc4, 0x94, 0x3d, - 0x68, 0x97, 0x7c, 0x94, 0x66, 0x6a, 0xea, 0x80, 0x61, 0x4e, 0xc8, 0xcb, - 0xa9, 0x0c, 0xff, 0xd2, 0x53, 0x34, 0xbb, 0xfb, 0xe0, 0x4d, 0x14, 0x2a, - 0xc8, 0x64, 0x92, 0x9d, 0x66, 0xc5, 0x0a, 0x54, 0x79, 0x93, 0xfe, 0x6c, - 0xb7, 0x58, 0x34, 0x0a, 0x50, 0x4d, 0xf2, 0xf5, 0xab, 0xed, 0x19, 0xdb, - 0xf2, 0xac, 0x4b, 0xe5, 0x00, 0xd3, 0x53, 0xdc, 0xa5, 0xe2, 0x99, 0xe0, - 0x93, 0xc0, 0xd2, 0x5d, 0x6f, 0x06, 0x13, 0x87, 0x20, 0x89, 0x69, 0x18, - 0x3e, 0x40, 0xe0, 0x8c, 0x2d, 0x57, 0x74, 0x40, 0xe4, 0xc5, 0x24, 0x79, - 0xe4, 0x34, 0xa7, 0x1c, 0xa0, 0xe8, 0xe9, 0x9d, 0x40, 0xcc, 0xb5, 0xc1, - 0xcb, 0x2b, 0x3d, 0x53, 0x71, 0xf7, 0xca, 0xc3, 0x39, 0x12, 0x30, 0xcf, - 0xdb, 0xe0, 0x59, 0x25, 0x32, 0x39, 0x1c, 0x57, 0xa5, 0xbb, 0x1d, 0x6a, - 0xd1, 0xf5, 0xad, 0x00, 0x29, 0xb2, 0x01, 0x96, 0xfd, 0x02, 0x2c, 0xeb, - 0x27, 0xbd, 0x03, 0x8d, 0x09, 0x53, 0x31, 0xe9, 0xa7, 0x26, 0x2e, 0x92, - 0xa7, 0xcf, 0xba, 0x20, 0x64, 0xdc, 0xce, 0x32, 0x3e, 0x60, 0x4b, 0xa4, - 0xe4, 0x5c, 0xe1, 0x8e, 0x31, 0x75, 0x1c, 0x52, 0x00, 0xb2, 0xcf, 0xf5, - 0x60, 0x6c, 0x9e, 0xdd, 0x55, 0xc7, 0xdd, 0x42, 0xb9, 0x93, 0x14, 0xb6, - 0x35, 0xb4, 0xd6, 0xff, 0xd0, 0x4e, 0xca, 0xca, 0x84, 0x9f, 0x9b, 0x1f, - 0x26, 0x06, 0xda, 0xb0, 0x69, 0xaa, 0x54, 0x31, 0xe5, 0xdf, 0xd3, 0x73, - 0xdc, 0xa3, 0x8a, 0x56, 0x1b, 0x93, 0x6e, 0x85, 0x21, 0xd0, 0xb8, 0xbc, - 0x6b, 0x17, 0xb7, 0xf0, 0xe5, 0x06, 0x88, 0xe4, 0x41, 0xf5, 0x8f, 0x6c, - 0xca, 0x5f, 0xfd, 0x60, 0x63, 0x51, 0xdd, 0x3f, 0x0f, 0x46, 0x3d, 0x1d, - 0x61, 0xbf, 0xc1, 0xe9, 0x37, 0x16, 0x6c, 0x47, 0x59, 0xa4, 0x90, 0x92, - 0xe6, 0xe0, 0x16, 0xcd, 0x4a, 0x12, 0xcc, 0xd9, 0x5b, 0x1a, 0x3c, 0x3c, - 0x20, 0x83, 0x3a, 0x12, 0x6f, 0x7b, 0x1d, 0x4d, 0x1a, 0xb6, 0x59, 0xe0, - 0x16, 0xab, 0x4a, 0x9e, 0x43, 0x1f, 0xa6, 0xd5, 0x35, 0x5a, 0x91, 0xd6, - 0xcc, 0xb4, 0xa2, 0x50, 0xb4, 0x91, 0xbc, 0x1d, 0xfb, 0xe8, 0x19, 0x2c, - 0x90, 0x72, 0x1a, 0x1d, 0x3e, 0x92, 0x0d, 0x34, 0xae, 0x8c, 0xd2, 0xb4, - 0x47, 0xba, 0x80, 0x5d, 0x85, 0x9d, 0x29, 0x30, 0x12, 0x81, 0x7a, 0x56, - 0xd1, 0x07, 0xf4, 0xcc, 0x9f, 0xde, 0x2f, 0x66, 0xc6, 0x88, 0xd7, 0x54, - 0xcb, 0x70, 0xa6, 0xc9, 0xa0, 0x8c, 0x9b, 0x01, 0xb3, 0x32, 0x50, 0xe2, - 0x7a, 0x4d, 0xcd, 0xcd, 0xea, 0xae, 0xe1, 0x59, 0xf6, 0x76, 0x01, 0xd4, - 0x19, 0x5e, 0xd3, 0x74, 0x27, 0x47, 0x65, 0xa8, 0xe0, 0x11, 0x69, 0xa0, - 0x08, 0xe2, 0xb4, 0x5d, 0x23, 0x31, 0x93, 0xb3, 0x24, 0x3b, 0x2d, 0xb6, - 0x9a, 0x86, 0x6b, 0x6f, 0xec, 0xab, 0x17, 0xcf, 0x2c, 0xe7, 0x67, 0x72, - 0x25, 0x05, 0xe3, 0xfd, 0xb0, 0x14, 0xcf, 0x14, 0x48, 0xe7, 0x21, 0x31, - 0x0c, 0xa2, 0x91, 0xac, 0x19, 0x10, 0xdf, 0xf6, 0xee, 0x4c, 0x11, 0x14, - 0x40, 0xcb, 0xaf, 0xeb, 0x72, 0x49, 0x25, 0xd3, 0xbc, 0x2e, 0x28, 0x31, - 0xb3, 0x0b, 0x7a, 0xbe, 0x23, 0xae, 0x50, 0xcb, 0x39, 0xf1, 0xe7, 0x09, - 0x8d, 0x50, 0xdf, 0x39, 0xfa, 0x9a, 0x44, 0x9b, 0xab, 0xc8, 0x2f, 0x37, - 0xb0, 0x01, 0x58, 0x6b, 0x6a, 0x73, 0xe7, 0xb0, 0xd9, 0x5b, 0xc6, 0x93, - 0xdc, 0x37, 0x03, 0x56, 0xab, 0x1f, 0x9b, 0x2c, 0x86, 0xa8, 0xa2, 0x77, - 0x3c, 0x4f, 0x0a, 0xca, 0x5a, 0xe0, 0x1f, 0x42, 0x0e, 0x95, 0x4a, 0xab, - 0xe5, 0xad, 0xe8, 0xcc, 0xb9, 0x66, 0xb1, 0x1a, 0x5e, 0x39, 0x4b, 0x50, - 0x6e, 0x52, 0x56, 0xae, 0xb2, 0x8b, 0x32, 0x8d, 0x89, 0xda, 0x76, 0x32, - 0x10, 0xbd, 0xb5, 0xe6, 0xfb, 0xfa, 0xa6, 0x5c, 0xe2, 0x94, 0x68, 0x28, - 0xd8, 0x9e, 0x50, 0x76, 0xcc, 0xec, 0xf8, 0xab, 0x8f, 0xf1, 0x31, 0xc3, - 0x60, 0x43, 0x57, 0x4b, 0xb5, 0x9f, 0xa5, 0x92, 0xf2, 0x31, 0xc0, 0xe5, - 0x08, 0xf5, 0x82, 0x38, 0x1a, 0x91, 0x4f, 0xaf, 0x0d, 0x31, 0x06, 0x2b, - 0x0c, 0xa9, 0xce, 0x3d, 0x5b, 0x05, 0x1b, 0xa1, 0x7b, 0xce, 0x9b, 0xd2, - 0x6e, 0x8f, 0x3a, 0x18, 0x65, 0xdc, 0xb4, 0x9e, 0xd3, 0x1f, 0x1b, 0x14, - 0x04, 0x80, 0x63, 0x5b, 0x2c, 0x8e, 0x1e, 0x4c, 0xa4, 0x3f, 0xbc, 0xf4, - 0x05, 0x91, 0xde, 0xdb, 0x29, 0xd7, 0xa7, 0x15, 0xde, 0x21, 0xf0, 0x5b, - 0x0c, 0xae, 0xb3, 0xd4, 0x51, 0x45, 0xa5, 0x19, 0xcf, 0x0a, 0x26, 0xe1, - 0x57, 0x16, 0x39, 0x3f, 0xbd, 0x85, 0xe0, 0x24, 0xfd, 0x2e, 0x86, 0xca, - 0x4c, 0x95, 0x94, 0xaa, 0xfb, 0x5d, 0xa5, 0xe2, 0x7d, 0x35, 0x53, 0x08, - 0x48, 0xf4, 0x2b, 0x2a, 0xe9, 0xdc, 0xc4, 0xc4, 0x5a, 0x74, 0xbd, 0x49, - 0x1b, 0xcd, 0x16, 0x0a, 0x63, 0x0a, 0x77, 0x0b, 0xaa, 0xf2, 0xb6, 0x4a, - 0xd5, 0x69, 0x62, 0xbc, 0xf4, 0xb3, 0xff, 0x49, 0x8b, 0x0e, 0xa5, 0x9a, - 0x3b, 0x82, 0xe6, 0x88, 0x12, 0xe6, 0x1d, 0xca, 0xac, 0x26, 0x94, 0x87, - 0xd5, 0xd8, 0xe2, 0x85, 0x77, 0x17, 0x57, 0xb7, 0xb3, 0xf6, 0xa0, 0x6e, - 0x14, 0x43, 0xa6, 0x12, 0x26, 0x30, 0xaf, 0x95, 0xb2, 0x46, 0x3a, 0x92, - 0x39, 0xe9, 0x5d, 0x5a, 0xab, 0x2b, 0x27, 0x31, 0xf3, 0x33, 0x35, 0xaa, - 0x88, 0xc0, 0x09, 0x9d, 0xef, 0xfd, 0xf1, 0xf0, 0xa2, 0xce, 0x04, 0xca, - 0x5c, 0x96, 0x58, 0x65, 0x3e, 0xb5, 0x1c, 0x17, 0x23, 0x2e, 0x83, 0x83, - 0xff, 0x90, 0x94, 0x25, 0x00, 0x1c, 0xed, 0xc8, 0x23, 0xc9, 0xe9, 0xd5, - 0x0f, 0x38, 0x40, 0x74, 0x7d, 0x55, 0x2e, 0xab, 0x74, 0xcb, 0x61, 0x10, - 0x6d, 0x4f, 0x6a, 0xe3, 0xd5, 0xeb, 0xed, 0x8d, 0xd9, 0xbb, 0x13, 0xbc, - 0xd1, 0xbc, 0x59, 0xd7, 0xd8, 0x85, 0x7b, 0xc7, 0x59, 0xc9, 0xd9, 0xa3, - 0xfb, 0xad, 0x4d, 0x44, 0x17, 0x8f, 0x6b, 0xf2, 0x80, 0x38, 0xba, 0x4b, - 0x51, 0x33, 0x02, 0x86, 0x51, 0xbd, 0x04, 0xf4, 0xcf, 0xd5, 0xf3, 0x60, - 0x9e, 0xf7, 0x88, 0x2c, 0xc8, 0x64, 0x76, 0x1a, 0xa6, 0x12, 0x3f, 0xc6, - 0xb8, 0xb0, 0x26, 0xc1, 0x83, 0x0d, 0x8e, 0x1e, 0x34, 0x3f, 0x3a, 0x65, - 0xe5, 0xda, 0x23, 0x3c, 0x37, 0xbc, 0xd0, 0x9b, 0x9f, 0x0d, 0x95, 0x12, - 0xbf, 0xcf, 0x89, 0x72, 0x8b, 0xdd, 0x8c, 0x4b, 0xd0, 0xd6, 0x24, 0x3f, - 0xab, 0xb0, 0x1d, 0x81, 0x58, 0x0c, 0x36, 0x1e, 0x10, 0x6d, 0x74, 0x36, - 0x19, 0x08, 0x15, 0xf1, 0xfe, 0x4c, 0xd9, 0x4c, 0x1f, 0x60, 0xd6, 0x4b, - 0xbe, 0xf4, 0xa6, 0xce, 0x27, 0x8a, 0x5d, 0xee, 0x93, 0x9b, 0xf9, 0x66, - 0x19, 0x22, 0x1e, 0x61, 0x26, 0x01, 0x64, 0xac, 0x63, 0xb7, 0xd3, 0x9b, - 0x8e, 0x35, 0x43, 0x18, 0x44, 0x2e, 0x8f, 0xe5, 0x0e, 0xad, 0x05, 0xa9, - 0xd1, 0x9c, 0xd6, 0xf6, 0xf4, 0xa5, 0xa4, 0x52, 0xc4, 0x83, 0x10, 0x1f, - 0xa6, 0xc3, 0xc9, 0x68, 0x64, 0x17, 0xa9, 0x8b, 0xe5, 0x35, 0xd7, 0x8d, - 0xcd, 0xcc, 0x9e, 0x67, 0x97, 0xf6, 0xf3, 0xdd, 0x4e, 0xef, 0x12, 0xf7, - 0x82, 0x71, 0x74, 0xd9, 0xdd, 0xc1, 0x28, 0x54, 0xf3, 0x15, 0x1a, 0xa4, - 0x13, 0xf3, 0x46, 0x17, 0x03, 0x71, 0xf3, 0x43, 0x7a, 0x2f, 0x6d, 0x44, - 0x5b, 0xfc, 0x80, 0xbf, 0x99, 0x9c, 0x01, 0xfd, 0xeb, 0xb5, 0x55, 0x92, - 0xce, 0xd9, 0x09, 0x0c, 0xc1, 0xb0, 0x62, 0xac, 0xa5, 0xae, 0x68, 0xd4, - 0xbe, 0xf1, 0xd6, 0x7d, 0x6d, 0x5b, 0x05, 0xf9, 0x97, 0x97, 0x65, 0x58, - 0xe9, 0xdb, 0x5b, 0xca, 0x1d, 0xbe, 0xad, 0x33, 0x8e, 0x0d, 0xf8, 0x4d, - 0xe8, 0x98, 0x66, 0x0b, 0xf5, 0x82, 0xd5, 0x77, 0xcc, 0x5d, 0x4c, 0xd2, - 0x6b, 0x10, 0xc1, 0xc4, 0x86, 0xc7, 0x2e, 0x96, 0x27, 0x7f, 0x3e, 0x04, - 0x3a, 0x25, 0xfd, 0x48, 0x1f, 0x90, 0x24, 0xf3, 0x02, 0x26, 0x84, 0xd8, - 0x30, 0x79, 0x93, 0x40, 0x7a, 0xa7, 0x6f, 0x23, 0xe9, 0xd3, 0x8c, 0x4f, - 0xbd, 0xc1, 0xc4, 0xbe, 0x85, 0x9c, 0x9d, 0xf1, 0x0b, 0xbf, 0xdd, 0x5e, - 0xa1, 0x19, 0x85, 0x82, 0xf8, 0x4a, 0x9a, 0x93, 0xe0, 0x11, 0x9a, 0x52, - 0xaf, 0xba, 0xc3, 0x58, 0xc4, 0x3d, 0x8f, 0xee, 0xc0, 0x4f, 0xd3, 0xf2, - 0x26, 0x8b, 0x0c, 0x9f, 0x09, 0x49, 0x17, 0xc2, 0x1b, 0xa0, 0xbb, 0xcf, - 0x0b, 0x05, 0x68, 0x1a, 0xf4, 0xac, 0xf3, 0x0a, 0x95, 0x0b, 0x9e, 0xb2, - 0x72, 0xff, 0x98, 0x71, 0x2b, 0x19, 0x11, 0xe8, 0xe6, 0x74, 0x34, 0xe1, - 0xeb, 0x4b, 0x45, 0xe6, 0xaf, 0x1c, 0x6a, 0x79, 0xf5, 0xb6, 0x7c, 0x3d, - 0x49, 0x8d, 0x9a, 0xe3, 0xa0, 0xff, 0x9f, 0xa2, 0x87, 0x7c, 0x45, 0x0b, - 0x95, 0x3d, 0x35, 0x3e, 0x9f, 0x72, 0x6a, 0xd7, 0x47, 0x4f, 0xd3, 0x65, - 0xd1, 0x71, 0x5b, 0x18, 0x97, 0xf6, 0x7a, 0x2a, 0x16, 0x49, 0x58, 0xda, - 0xd2, 0x85, 0x0f, 0xdc, 0x27, 0xfd, 0x9d, 0x8e, 0x6e, 0xc7, 0xbf, 0xe8, - 0x4b, 0x27, 0x5d, 0x46, 0x12, 0x2c, 0xf5, 0xa5, 0xde, 0xa7, 0x0d, 0xfa, - 0x45, 0x67, 0xf9, 0xde, 0x2e, 0xba, 0xd9, 0x61, 0x2c, 0x65, 0x3d, 0xaf, - 0x14, 0x28, 0xbb, 0x80, 0x4b, 0xc4, 0xbf, 0x73, 0xf1, 0x54, 0x1c, 0x91, - 0x4d, 0x5b, 0x8d, 0x3d, 0x44, 0xa4, 0x64, 0xa4, 0xd8, 0x65, 0x90, 0xa6, - 0xb5, 0x7c, 0x7c, 0xba, 0xfb, 0x86, 0x64, 0xf0, 0x14, 0x61, 0x63, 0x5f, - 0x32, 0x95, 0xcf, 0x1b, 0xcf, 0x05, 0xda, 0xdb, 0x44, 0xc6, 0x06, 0x42, - 0x50, 0xcf, 0x5e, 0x68, 0x3d, 0xa8, 0x06, 0x69, 0x8c, 0x9a, 0x9c, 0xb2, - 0x46, 0xc4, 0x3b, 0xc8, 0x95, 0xbf, 0x9f, 0xd7, 0x3c, 0x5a, 0xc2, 0x2f, - 0xcd, 0xa0, 0x0b, 0xf9, 0xdc, 0x4d, 0xb9, 0x33, 0xf8, 0xd8, 0x15, 0xef, - 0x0c, 0xba, 0xf5, 0xe8, 0xa4, 0x27, 0x8d, 0x1b, 0x2e, 0xde, 0xca, 0x1d, - 0xcb, 0x01, 0x3f, 0x83, 0xbf, 0x20, 0xca, 0xf9, 0x0d, 0x24, 0x98, 0x4f, - 0xfd, 0x40, 0xda, 0x07, 0xe7, 0x49, 0xd0, 0x6f, 0x92, 0x57, 0xe8, 0x09, - 0xdf, 0xa8, 0x5e, 0x52, 0xe3, 0x3d, 0xbc, 0x8c, 0xc1, 0xf6, 0x4a, 0xd5, - 0x5c, 0xaf, 0x4b, 0x90, 0x58, 0x3b, 0x63, 0xb2, 0x80, 0x44, 0x46, 0x36, - 0x7c, 0xd1, 0x7e, 0xbe, 0x66, 0xe2, 0xfa, 0xf9, 0x32, 0x74, 0x1c, 0x5e, - 0x4c, 0x22, 0xe2, 0x57, 0x0a, 0x64, 0x0b, 0x20, 0x0a, 0x35, 0x56, 0xaf, - 0xac, 0xc2, 0xee, 0x9e, 0x2a, 0xa1, 0xf2, 0x1e, 0xe3, 0xc4, 0x9c, 0xa5, - 0xca, 0x97, 0x58, 0xb8, 0xc5, 0x80, 0xb6, 0xe1, 0xd8, 0xbc, 0xb3, 0x22, - 0xf3, 0xfc, 0x1d, 0x52, 0x1a, 0x5d, 0x68, 0x3d, 0x46, 0xd7, 0x6d, 0xd8, - 0xaf, 0x19, 0xc5, 0x74, 0x80, 0x62, 0x91, 0xda, 0x98, 0xe1, 0x00, 0xe8, - 0x24, 0xd1, 0xd3, 0xea, 0x8c, 0xf1, 0xc3, 0x74, 0xa9, 0xd9, 0x4f, 0xc8, - 0x8a, 0x26, 0xd8, 0x4c, 0x4f, 0x03, 0x11, 0xcd, 0x41, 0x6d, 0x97, 0x2a, - 0xdf, 0x04, 0xe3, 0x46, 0x94, 0xab, 0xe6, 0x2f, 0x74, 0x0e, 0xd9, 0x54, - 0x4e, 0x51, 0x70, 0x85, 0x99, 0x65, 0xcc, 0x96, 0xa1, 0x68, 0xaa, 0x3e, - 0xa7, 0xd0, 0x28, 0x0e, 0x40, 0x31, 0xb8, 0xe7, 0x1f, 0xfb, 0xe2, 0xee, - 0x66, 0x9f, 0xd9, 0xb1, 0x84, 0xb4, 0xb5, 0x33, 0x71, 0xd4, 0xb1, 0x09, - 0xc5, 0x6f, 0x6f, 0x75, 0xfc, 0x8a, 0xdb, 0x82, 0x91, 0xd3, 0xaf, 0x0a, - 0xe2, 0x11, 0x43, 0xc9, 0x2a, 0x72, 0x84, 0xa2, 0x5a, 0xda, 0x79, 0xd5, - 0xdb, 0x50, 0x55, 0x92, 0x90, 0x2e, 0x5e, 0x8e, 0x04, 0x31, 0x2a, 0x01, - 0xf8, 0xc7, 0x3a, 0x5c, 0xe4, 0x3c, 0x99, 0x91, 0x69, 0x05, 0xcb, 0x3c, - 0xcb, 0x5e, 0xca, 0x37, 0x91, 0xac, 0xec, 0x10, 0xfb, 0x00, 0x32, 0xbf, - 0x2d, 0x92, 0x1e, 0x46, 0x60, 0x66, 0xad, 0x52, 0xce, 0x2e, 0xb9, 0x73, - 0x3f, 0x18, 0x21, 0x4d, 0xcf, 0xb7, 0x1b, 0x19, 0x06, 0x71, 0x05, 0x6d, - 0xd9, 0xf4, 0x90, 0x2a, 0x24, 0xdb, 0xe8, 0x7e, 0x12, 0x50, 0x60, 0x60, - 0x33, 0x09, 0x9c, 0x6d, 0xe0, 0x88, 0x7d, 0xc9, 0xd4, 0xba, 0xf5, 0xe0, - 0xcd, 0x95, 0x75, 0x52, 0x85, 0x81, 0xfc, 0xc1, 0x55, 0x46, 0x39, 0xd6, - 0x66, 0x87, 0x4e, 0x5d, 0xa4, 0x27, 0xb6, 0xff, 0x1d, 0x40, 0x00, 0x86, - 0x20, 0x46, 0x12, 0x4f, 0x50, 0xe2, 0x63, 0x21, 0x08, 0x9b, 0x58, 0x7c, - 0xa0, 0x9b, 0x3e, 0x40, 0x99, 0x54, 0x23, 0x12, 0xfb, 0x6d, 0xad, 0xdb, - 0x3d, 0x22, 0xcf, 0xea, 0xfb, 0x60, 0x75, 0x12, 0x53, 0x3d, 0x2e, 0xd0, - 0xc4, 0x09, 0xcd, 0xde, 0xcf, 0xca, 0xac, 0xdf, 0x3a, 0x54, 0x8d, 0xef, - 0x50, 0x55, 0x45, 0x35, 0x17, 0x32, 0x56, 0x91, 0x00, 0x61, 0x10, 0x4f, - 0xb8, 0x04, 0x1d, 0x9b, 0x6a, 0xca, 0x67, 0x6c, 0x3b, 0xcc, 0x5a, 0x18, - 0xa8, 0x3e, 0x82, 0x45, 0xb5, 0x1e, 0xa2, 0xc5, 0xa9, 0xce, 0x87, 0x63, - 0xdf, 0xa3, 0x52, 0x7c, 0xc9, 0x9d, 0xe0, 0xfb, 0x39, 0x0a, 0xc4, 0x9c, - 0x40, 0xef, 0x6c, 0xea, 0x97, 0x70, 0xe6, 0xa3, 0xc6, 0x1c, 0x96, 0x23, - 0x03, 0xa5, 0x83, 0xee, 0x91, 0x8a, 0x4f, 0xb5, 0xcd, 0x72, 0x58, 0xc5, - 0x3b, 0xe7, 0xe5, 0xc1, 0x45, 0xfd, 0x75, 0xf1, 0x59, 0xd5, 0xb0, 0x65, - 0x0d, 0x0f, 0x8b, 0x2c, 0x03, 0x7a, 0x52, 0xff, 0xa9, 0x6e, 0x4c, 0xad, - 0x05, 0x21, 0x14, 0x6d, 0x58, 0x2d, 0xe1, 0x86, 0x59, 0x24, 0xe5, 0x66, - 0x37, 0xb7, 0x6e, 0x3e, 0xe3, 0x1d, 0x07, 0xcf, 0x4b, 0x99, 0xdd, 0x8e, - 0xa4, 0x9c, 0x1a, 0xf4, 0x04, 0x35, 0x2d, 0x4d, 0xc1, 0x70, 0xc5, 0x65, - 0x69, 0xbe, 0x2d, 0xca, 0x37, 0x29, 0x72, 0x2f, 0x07, 0x40, 0xf9, 0xa5, - 0x74, 0x7c, 0xc7, 0x20, 0x72, 0x16, 0xfa, 0xb1, 0x8b, 0x94, 0x1d, 0x8c, - 0xa5, 0x39, 0xd2, 0x29, 0xdb, 0x27, 0x7d, 0x73, 0x0e, 0x47, 0x1e, 0x18, - 0xf7, 0x6a, 0x45, 0xce, 0x36, 0x4f, 0x50, 0xcd, 0xc9, 0xdc, 0x0c, 0x6d, - 0x0e, 0x90, 0x1f, 0x2c, 0x89, 0x67, 0x4b, 0x69, 0x9b, 0x06, 0x6d, 0x32, - 0xbc, 0xe0, 0xdf, 0x2d, 0xb2, 0x27, 0xc9, 0x4e, 0xce, 0x0b, 0xa0, 0x2b, - 0xfe, 0x3f, 0x55, 0x89, 0xb8, 0xe1, 0x06, 0x5d, 0x0c, 0x91, 0xe8, 0x40, - 0x3e, 0x9a, 0x47, 0x2a, 0xdf, 0x5d, 0x3e, 0xb0, 0xc8, 0x4c, 0x3a, 0x73, - 0x4b, 0xa4, 0xb2, 0x48, 0xc7, 0xfd, 0x63, 0x6e, 0x80, 0xe6, 0xfd, 0x5b, - 0xeb, 0xd8, 0x52, 0xd3, 0x3e, 0x9c, 0x5e, 0x41, 0xe9, 0x5e, 0x41, 0xcc, - 0xba, 0x60, 0xf0, 0xba, 0xeb, 0x31, 0x10, 0xf5, 0x19, 0xd9, 0x42, 0x2b, - 0x03, 0x3e, 0xbf, 0xe2, 0x8e, 0x5e, 0x62, 0x8b, 0x70, 0x83, 0x6b, 0x84, - 0x08, 0xfd, 0xac, 0x85, 0x6b, 0xbb, 0x63, 0x9a, 0xcc, 0x61, 0x27, 0x3b, - 0xa3, 0xc7, 0x14, 0x1b, 0x8b, 0xca, 0x4c, 0x58, 0x43, 0x33, 0xfd, 0x4a, - 0xb8, 0xb7, 0x40, 0x1a, 0x71, 0xaa, 0x89, 0xa2, 0x33, 0x72, 0xd7, 0xb3, - 0x2a, 0x84, 0x8d, 0x91, 0x83, 0x51, 0x56, 0x93, 0x61, 0x21, 0xfe, 0x51, - 0xab, 0x05, 0x47, 0x40, 0x66, 0x1e, 0x80, 0x52, 0xc0, 0xcc, 0x10, 0x56, - 0xa1, 0x51, 0x58, 0x2b, 0x02, 0x22, 0x98, 0x30, 0xec, 0x0c, 0x1a, 0x08, - 0x7b, 0xcb, 0x93, 0x3e, 0xa8, 0x51, 0x73, 0x0f, 0x25, 0x2a, 0x4f, 0x24, - 0x7d, 0xce, 0x22, 0x8f, 0xfb, 0xf6, 0xc4, 0x65, 0x39, 0xe6, 0x3d, 0x75, - 0x68, 0xe4, 0x5c, 0xb5, 0xf5, 0xdf, 0x4e, 0xce, 0xd9, 0x4b, 0x34, 0x88, - 0x50, 0x5f, 0xd4, 0xf5, 0xe6, 0x33, 0x08, 0xa3, 0xfc, 0x20, 0x8b, 0x86, - 0x44, 0x02, 0xd0, 0xb2, 0x9d, 0xb7, 0x40, 0x97, 0x85, 0x59, 0xe0, 0xae, - 0x4b, 0xc4, 0xb9, 0xf5, 0xda, 0xce, 0xf8, 0x3b, 0x8d, 0xe1, 0xeb, 0xff, - 0xfc, 0xe5, 0x47, 0x3a, 0xa6, 0x4f, 0x8a, 0x26, 0xdf, 0x77, 0xae, 0xac, - 0xda, 0x47, 0xb5, 0xf1, 0x76, 0xaf, 0x2b, 0xba, 0x1d, 0x86, 0xad, 0x4f, - 0x08, 0x7b, 0xee, 0x14, 0xfb, 0x24, 0xc5, 0x87, 0x2a, 0x98, 0x8e, 0x25, - 0xd9, 0x36, 0x34, 0x8e, 0x45, 0x44, 0x0a, 0xea, 0x3d, 0xf5, 0xd4, 0x61, - 0xe8, 0x25, 0x79, 0x1d, 0xf7, 0xd8, 0x98, 0xc5, 0x60, 0x0b, 0x2f, 0x0b, - 0xd4, 0x21, 0xc5, 0xb4, 0x48, 0x4b, 0x0f, 0x0c, 0x58, 0x5b, 0x9d, 0x6f, - 0xbf, 0x83, 0x6a, 0x47, 0xa7, 0x66, 0xb6, 0x5d, 0xd8, 0x6f, 0xac, 0xf5, - 0x34, 0x16, 0x62, 0xa3, 0xf7, 0x4e, 0x33, 0xc2, 0x99, 0x90, 0xdb, 0x02, - 0x99, 0xde, 0x1f, 0xd2, 0xf8, 0x85, 0xcc, 0x95, 0x01, 0x31, 0x77, 0xd9, - 0xf8, 0xa9, 0xed, 0x69, 0x74, 0x31, 0xce, 0x5a, 0xdd, 0x14, 0x43, 0x60, - 0xfe, 0xc9, 0x00, 0x6e, 0x6a, 0x61, 0x86, 0xde, 0xe1, 0xc7, 0x98, 0xe5, - 0x01, 0xd2, 0x6e, 0x43, 0xed, 0xc5, 0x9d, 0x29, 0x23, 0x83, 0xb0, 0xa1, - 0x77, 0x79, 0xe9, 0x73, 0xb1, 0x35, 0x34, 0xd6, 0x35, 0x78, 0x87, 0xe4, - 0xb6, 0x63, 0x2c, 0x6e, 0x64, 0x9f, 0x81, 0xb8, 0x3d, 0x26, 0xe9, 0x1c, - 0xe5, 0x9a, 0x8e, 0xbb, 0x64, 0xe9, 0xd4, 0xf6, 0x8c, 0x52, 0x3d, 0x58, - 0x15, 0xd4, 0x42, 0x33, 0x21, 0xb4, 0x2a, 0x58, 0xbe, 0x73, 0x43, 0x8b, - 0x1e, 0x8d, 0x1f, 0x2f, 0x6d, 0x93, 0x66, 0xfe, 0x54, 0xed, 0x73, 0x3c, - 0xbc, 0xa3, 0x45, 0x10, 0xc0, 0x22, 0xe9, 0x1e, 0x6f, 0x7d, 0x4a, 0xfa, - 0x75, 0x48, 0x86, 0xab, 0x67, 0xcf, 0xa5, 0x51, 0xca, 0xeb, 0xc0, 0x54, - 0x9e, 0x2f, 0x7b, 0xe8, 0x8d, 0x9b, 0xf4, 0xb2, 0xbf, 0x33, 0x26, 0x6d, - 0x68, 0x96, 0x80, 0x5c, 0xba, 0x09, 0x29, 0x6e, 0x69, 0x70, 0x70, 0x09, - 0xf7, 0xbd, 0xd4, 0xf2, 0x31, 0x14, 0xe0, 0xdd, 0xb7, 0x39, 0xb4, 0x15, - 0x5b, 0xe1, 0xf8, 0x13, 0x19, 0x9b, 0xea, 0xbe, 0xd3, 0xbd, 0xde, 0xeb, - 0xc9, 0xf9, 0x70, 0x63, 0x91, 0x3e, 0x25, 0x4b, 0x1c, 0x39, 0xc9, 0x50, - 0x5c, 0x8b, 0x2c, 0xb9, 0xa3, 0xd5, 0x52, 0x13, 0xe6, 0xe8, 0xfb, 0x79, - 0xc5, 0x37, 0xef, 0x48, 0x61, 0xa6, 0x32, 0xd1, 0x04, 0xa9, 0xbc, 0xe7, - 0x1c, 0xf5, 0x9d, 0x81, 0x59, 0x34, 0xbb, 0x74, 0x79, 0x1d, 0x14, 0x49, - 0xdb, 0xe4, 0x96, 0x76, 0x6f, 0xd8, 0xed, 0x60, 0x22, 0x07, 0xbe, 0xad, - 0x9e, 0xad, 0x2e, 0x57, 0x7f, 0xb2, 0x7c, 0xbe, 0xff, 0x5f, 0xff, 0xdf, - 0x0a, 0xc4, 0x33, 0x03, 0x4d, 0x73, 0x9a, 0x67, 0x29, 0xbb, 0x53, 0x25, - 0xfa, 0x00, 0x62, 0x3e, 0x00, 0x84, 0x54, 0x93, 0x8f, 0xaf, 0x52, 0x50, - 0x28, 0xad, 0x8f, 0x1a, 0xf4, 0x36, 0x77, 0xa5, 0x47, 0xba, 0x9d, 0xd7, - 0x3c, 0x3f, 0x73, 0xb4, 0xd0, 0x64, 0x0a, 0x53, 0x0b, 0x83, 0xa9, 0x74, - 0x5a, 0x1b, 0xa7, 0x5b, 0xd2, 0x57, 0xa3, 0xd5, 0xe5, 0x8e, 0xb9, 0x7a, - 0xb9, 0xd2, 0xbd, 0x87, 0x32, 0xd0, 0xb3, 0xc5, 0xc2, 0x74, 0x6e, 0xbc, - 0x27, 0x92, 0x8f, 0xb8, 0x1c, 0x11, 0x0c, 0x10, 0x54, 0x91, 0xc8, 0xc0, - 0xb9, 0xa2, 0xd5, 0xe1, 0xb2, 0xe6, 0x05, 0xc7, 0x9b, 0xa6, 0xad, 0x40, - 0x45, 0xb5, 0x4c, 0x3d, 0x63, 0xc1, 0xf3, 0xc7, 0x11, 0x19, 0x46, 0xd5, - 0x39, 0x4a, 0x5d, 0x3c, 0x04, 0x5b, 0xd1, 0x0f, 0x7b, 0xe5, 0x7b, 0x21, - 0x0c, 0x40, 0xb9, 0x5f, 0x15, 0xf4, 0x54, 0xfb, 0xbc, 0x1d, 0xf0, 0x8a, - 0x2f, 0x14, 0xc5, 0x70, 0xe3, 0xcf, 0xcb, 0x6b, 0x2f, 0x58, 0x6a, 0xcb, - 0xd8, 0xd9, 0xb5, 0x19, 0xf6, 0x7b, 0x30, 0x48, 0x09, 0xa9, 0x04, 0xb2, - 0xa0, 0x4e, 0x7e, 0xb7, 0x79, 0x75, 0x50, 0x57, 0x0d, 0x92, 0x77, 0x45, - 0xb0, 0x65, 0xbb, 0x03, 0x57, 0xbc, 0xfa, 0x2f, 0x6c, 0x99, 0xa6, 0x15, - 0x05, 0xd2, 0x15, 0xf4, 0x4c, 0xa8, 0x33, 0x62, 0x82, 0x18, 0xca, 0x86, - 0x4c, 0x5a, 0xb7, 0xd8, 0x4c, 0xdd, 0x54, 0x1b, 0xeb, 0xf1, 0x08, 0xdf, - 0xdc, 0x01, 0xae, 0xe2, 0x1b, 0x43, 0x98, 0x67, 0xab, 0xf1, 0xc5, 0xaf, - 0x52, 0x34, 0xb4, 0x08, 0x64, 0x43, 0xc8, 0x90, 0xb1, 0x94, 0xe7, 0x78, - 0xff, 0x31, 0xc4, 0x1b, 0x06, 0x91, 0x35, 0x6a, 0xc2, 0x34, 0x7b, 0xfa, - 0x8a, 0x42, 0xee, 0x5e, 0x00, 0xbe, 0x27, 0x2e, 0x97, 0xb3, 0xcd, 0x52, - 0xed, 0xff, 0xef, 0xa4, 0xd2, 0x78, 0xcb, 0x82, 0xb7, 0x26, 0xe4, 0xd7, - 0xf2, 0xd5, 0x61, 0x85, 0x70, 0x9b, 0xed, 0x74, 0xc5, 0x27, 0xa5, 0x70, - 0xaf, 0xc9, 0xd5, 0xc1, 0x5c, 0x92, 0xc0, 0x2d, 0x42, 0x11, 0x7b, 0xb6, - 0x05, 0x93, 0xc0, 0x1b, 0x63, 0x68, 0xa3, 0x54, 0x74, 0x64, 0x93, 0x43, - 0x6a, 0x02, 0x13, 0x98, 0x55, 0x2c, 0x6d, 0x1b, 0x21, 0x68, 0x01, 0x04, - 0x39, 0xb5, 0xc1, 0x69, 0x43, 0xf6, 0x22, 0x7e, 0xe8, 0xfd, 0xb5, 0x3c, - 0x06, 0x16, 0xa6, 0x1c, 0x8e, 0x25, 0x36, 0x13, 0xbe, 0x72, 0x55, 0x97, - 0xd2, 0x52, 0x07, 0x24, 0x9c, 0x4c, 0x36, 0xa6, 0x57, 0x1a, 0x9e, 0x3c, - 0xd3, 0xde, 0xc2, 0xf4, 0xaa, 0x72, 0x0a, 0x2a, 0xa1, 0xde, 0x9b, 0x73, - 0x1d, 0xa2, 0xbd, 0xf2, 0x97, 0x10, 0x75, 0xdb, 0x00, 0xeb, 0x44, 0x80, - 0xdc, 0x85, 0x9a, 0x7f, 0xcc, 0x3d, 0xee, 0x85, 0x32, 0x36, 0xcf, 0x46, - 0x66, 0xf3, 0x4b, 0x18, 0xc0, 0x3e, 0xc0, 0xcd, 0x58, 0x7b, 0x4a, 0x89, - 0xc8, 0x3f, 0xf8, 0x43, 0x03, 0x0b, 0xd1, 0x1e, 0xae, 0xb5, 0x42, 0x50, - 0x92, 0x53, 0xd9, 0x20, 0xae, 0xbb, 0x17, 0x45, 0xf7, 0x3e, 0x05, 0xa7, - 0xf8, 0xe1, 0xb9, 0xd3, 0xd9, 0x34, 0x91, 0x34, 0xd7, 0xa0, 0xdb, 0xb0, - 0x63, 0x91, 0x0e, 0x45, 0x57, 0xcc, 0xa2, 0x1d, 0xc6, 0x9a, 0xe6, 0xfc, - 0x70, 0x59, 0x93, 0x07, 0x91, 0x19, 0x01, 0x59, 0xe6, 0x71, 0x81, 0x63, - 0x71, 0xbe, 0x43, 0x56, 0xa1, 0xa8, 0x5e, 0x42, 0x60, 0x59, 0xe6, 0x49, - 0x40, 0x89, 0x3c, 0x32, 0x46, 0xf0, 0x7e, 0x2e, 0x2d, 0x1d, 0x6f, 0x02, - 0x6b, 0x99, 0x4f, 0x6e, 0x95, 0xeb, 0x1a, 0x2d, 0x89, 0xd9, 0xd9, 0x1b, - 0x41, 0x13, 0x7c, 0xbb, 0x94, 0x34, 0x6c, 0x14, 0x5d, 0x80, 0xea, 0xbc, - 0x6a, 0x38, 0xea, 0xb7, 0xb3, 0x2d, 0xad, 0x0d, 0x2f, 0x64, 0xa4, 0x6e, - 0xb7, 0x87, 0x16, 0x51, 0x51, 0xe3, 0x0d, 0x0e, 0x3b, 0x57, 0x55, 0xbd, - 0xf6, 0xfd, 0x29, 0x2c, 0xe5, 0x75, 0x8e, 0xae, 0x13, 0xe3, 0x6f, 0x6b, - 0x76, 0x03, 0x50, 0xb0, 0xf9, 0xeb, 0x21, 0x9e, 0x2e, 0x5c, 0x51, 0xab, - 0x0b, 0x63, 0x13, 0xb7, 0x83, 0xf8, 0x80, 0x4d, 0x3a, 0x30, 0x7b, 0x3f, - 0x1b, 0xc2, 0xae, 0x6f, 0x7e, 0x2d, 0xc3, 0xee, 0xeb, 0xa0, 0x8a, 0x6d, - 0xe8, 0x9a, 0x5d, 0xd8, 0x2b, 0x7f, 0xed, 0x71, 0xf9, 0x8d, 0xb6, 0x85, - 0xa3, 0x3e, 0xf0, 0x8e, 0x60, 0xf4, 0x58, 0xe6, 0x36, 0x0a, 0x20, 0x54, - 0x0f, 0x09, 0xe5, 0xa7, 0x49, 0x22, 0xef, 0x2f, 0xda, 0xed, 0x72, 0x7b, - 0x6a, 0xf5, 0x61, 0x3d, 0x11, 0x65, 0x9e, 0x01, 0x32, 0x52, 0x7b, 0x73, - 0xa3, 0xc5, 0x41, 0x1b, 0xe1, 0x8d, 0x75, 0x84, 0x10, 0x7c, 0x54, 0xb3, - 0xfd, 0xb1, 0x19, 0x16, 0xc7, 0x2b, 0x4e, 0xc3, 0x42, 0x0d, 0x43, 0x76, - 0x16, 0x05, 0x48, 0xe4, 0x52, 0x6b, 0x92, 0x9a, 0xb4, 0x31, 0x8f, 0x1c, - 0x20, 0x63, 0xa2, 0x21, 0x4d, 0xe4, 0x2d, 0xb1, 0xae, 0x69, 0xd3, 0x4d, - 0xf4, 0x2e, 0x5c, 0xde, 0xdf, 0x5e, 0xf7, 0xf9, 0x79, 0x9b, 0x43, 0xed, - 0x5c, 0xb5, 0xbf, 0x22, 0xee, 0xc7, 0x17, 0xd1, 0x72, 0xa1, 0x57, 0x59, - 0x2f, 0x4c, 0x55, 0x23, 0x38, 0xda, 0xaf, 0x74, 0x9e, 0x92, 0xc0, 0xb5, - 0x59, 0x5b, 0x50, 0xec, 0xab, 0x47, 0x72, 0xb2, 0x66, 0x7e, 0xc4, 0x5d, - 0x4a, 0xe2, 0xb9, 0x37, 0xae, 0x3a, 0x2a, 0x5d, 0x90, 0x9d, 0x0b, 0x6c, - 0xf5, 0x4d, 0x57, 0x5c, 0xf9, 0x03, 0xb4, 0x7d, 0xa0, 0x22, 0xc4, 0x4d, - 0x88, 0x65, 0x6c, 0x2d, 0xb1, 0x50, 0x07, 0x04, 0xe3, 0xe3, 0x5a, 0x47, - 0x40, 0xf9, 0xac, 0xe1, 0x7d, 0xd8, 0x2e, 0xb4, 0x59, 0xdf, 0x9d, 0xc3, - 0xc1, 0xf5, 0xb9, 0x78, 0x7a, 0x75, 0x69, 0x26, 0x90, 0xbf, 0x7b, 0x8d, - 0x23, 0x19, 0xe8, 0x08, 0xb8, 0x1e, 0x4e, 0x31, 0x37, 0x2a, 0xd4, 0x13, - 0x1e, 0x45, 0xff, 0x41, 0xda, 0xb1, 0x70, 0x44, 0x7e, 0x55, 0xdd, 0xe9, - 0x05, 0x6c, 0x6f, 0x3e, 0x88, 0x15, 0x35, 0x0d, 0xa7, 0xf6, 0xc0, 0x8d, - 0x0b, 0x29, 0x29, 0xfc, 0x37, 0xbd, 0x88, 0x97, 0x07, 0xdc, 0x32, 0x6e, - 0x2b, 0x97, 0x29, 0xab, 0x9f, 0xc8, 0x44, 0x60, 0x3b, 0x3c, 0xa8, 0x75, - 0x50, 0xbb, 0x16, 0x3e, 0x36, 0x33, 0xb4, 0xf5, 0x57, 0x86, 0xe3, 0x38, - 0x82, 0x46, 0x29, 0xff, 0xa6, 0xfb, 0x56, 0x6a, 0x6f, 0x46, 0x1c, 0x8e, - 0x32, 0x75, 0x37, 0x00, 0xbf, 0x49, 0xce, 0xc3, 0x4d, 0x94, 0xe0, 0x18, - 0x21, 0xa7, 0xd4, 0x96, 0x97, 0x8e, 0xd5, 0x1a, 0x40, 0x66, 0xbd, 0x06, - 0x65, 0x75, 0x74, 0x36, 0xf0, 0x8a, 0xcb, 0xb7, 0x37, 0x74, 0x03, 0xa8, - 0x70, 0x5e, 0x2d, 0x2c, 0xa7, 0x58, 0x44, 0xf0, 0xc3, 0x02, 0x8a, 0xa7, - 0x13, 0x8e, 0x8e, 0xb4, 0x8f, 0x27, 0x5d, 0x79, 0x27, 0xd4, 0xe7, 0x8e, - 0x94, 0x49, 0x5e, 0x96, 0xfd, 0x24, 0xa3, 0x79, 0xa4, 0xaa, 0x3c, 0x00, - 0xb0, 0xae, 0x5d, 0xeb, 0xca, 0x12, 0xb3, 0x2a, 0x69, 0xd6, 0xa8, 0x6d, - 0x2a, 0x52, 0xe7, 0x7b, 0x8c, 0xc9, 0x0a, 0xa7, 0xcc, 0x5a, 0xe9, 0x28, - 0x7c, 0x2c, 0x9c, 0xb2, 0xb3, 0x28, 0x22, 0xdb, 0xfe, 0x48, 0xef, 0xcd, - 0x75, 0xa9, 0xcf, 0x23, 0x1c, 0xa2, 0x70, 0x41, 0xdc, 0xd7, 0xe3, 0x30, - 0xb6, 0x70, 0x21, 0x06, 0x15, 0xfd, 0x67, 0xd0, 0x74, 0x10, 0x6f, 0x3e, - 0x8f, 0xde, 0x7c, 0x83, 0x0f, 0xa7, 0x8a, 0x49, 0x35, 0xde, 0x48, 0x14, - 0xbd, 0xf0, 0x53, 0x26, 0xe7, 0x18, 0xd5, 0xb0, 0x56, 0x8f, 0x81, 0x35, - 0x11, 0xf3, 0x50, 0x68, 0x72, 0x5a, 0x76, 0x06, 0x6f, 0xe4, 0x89, 0x9b, - 0x12, 0x57, 0x91, 0x95, 0x1e, 0x9c, 0xd6, 0x9f, 0x7a, 0x4c, 0xd0, 0xc4, - 0x11, 0xb8, 0x64, 0xc9, 0x49, 0xc6, 0xce, 0x37, 0xbf, 0xe8, 0xd0, 0x7f, - 0x0a, 0x2e, 0xd0, 0xdf, 0x85, 0xd7, 0xb9, 0x84, 0x03, 0x25, 0xbc, 0xfe, - 0x52, 0x4d, 0xd3, 0xb5, 0x3a, 0x71, 0x4d, 0xd9, 0x08, 0xa1, 0x07, 0xc3, - 0xd8, 0x25, 0x4c, 0x61, 0x73, 0x4a, 0xd9, 0x12, 0x3f, 0x11, 0xd7, 0xe7, - 0x88, 0x60, 0x02, 0xfb, 0x75, 0xc7, 0x64, 0x0c, 0xc5, 0x2c, 0xa1, 0x62, - 0x6f, 0x3a, 0xb6, 0xf8, 0xfc, 0xf7, 0x4f, 0xe5, 0x9d, 0x2b, 0xd6, 0xd2, - 0x62, 0x83, 0x4f, 0xa0, 0xdc, 0xf1, 0xbd, 0x98, 0xae, 0x46, 0x30, 0xbe, - 0xb7, 0xb4, 0x74, 0xa5, 0xbd, 0xa6, 0x37, 0x9e, 0x24, 0x69, 0x5e, 0x49, - 0x32, 0x53, 0x61, 0xfc, 0x7b, 0xf5, 0xce, 0x5c, 0x7e, 0xa3, 0xf5, 0xb1, - 0x14, 0x1f, 0xdb, 0x90, 0x85, 0x06, 0x54, 0x15, 0x0d, 0x7c, 0x01, 0xba, - 0xbc, 0xea, 0x15, 0xe5, 0x8d, 0xe9, 0xc3, 0x5f, 0x11, 0x18, 0x91, 0xef, - 0x23, 0x2a, 0x38, 0x05, 0x83, 0xff, 0x67, 0x1b, 0x81, 0xc4, 0x55, 0x97, - 0x07, 0x57, 0xf7, 0xfa, 0x9a, 0x35, 0xdb, 0x0f, 0x1f, 0x39, 0xf4, 0x8d, - 0x1c, 0x86, 0x16, 0xdc, 0x6c, 0x55, 0x96, 0x70, 0x24, 0xc5, 0x70, 0x86, - 0xe5, 0x94, 0x21, 0x3f, 0xe7, 0x93, 0xec, 0xdd, 0xe3, 0xce, 0xea, 0x00, - 0x87, 0xfb, 0x55, 0xe9, 0x0b, 0xc3, 0x9d, 0xf1, 0x06, 0x2a, 0x9a, 0x4d, - 0xbe, 0xe9, 0x4c, 0xee, 0x8d, 0xc0, 0x93, 0x57, 0x3f, 0xd2, 0xf1, 0x99, - 0x32, 0x45, 0x9d, 0x62, 0x2c, 0xa6, 0xaa, 0xbb, 0xab, 0x37, 0x6f, 0xe6, - 0x62, 0xb8, 0x50, 0x6a, 0xc5, 0xa9, 0xc5, 0xae, 0x57, 0xe1, 0x46, 0x03, - 0xbf, 0x8d, 0xde, 0x62, 0xd3, 0xb0, 0x38, 0x66, 0x99, 0xce, 0x19, 0x7e, - 0x67, 0x7e, 0xea, 0x48, 0x89, 0xf1, 0xaa, 0xb9, 0xbb, 0x2d, 0x6f, 0x90, - 0x4c, 0xc4, 0x34, 0xed, 0x77, 0x10, 0x69, 0xa7, 0x46, 0x5c, 0xab, 0x59, - 0x13, 0x88, 0x81, 0xe4, 0xe7, 0x5a, 0x5c, 0x6d, 0xa7, 0x55, 0xf0, 0x02, - 0xa5, 0xe4, 0xad, 0xc9, 0x25, 0x7b, 0x8a, 0xbf, 0xa2, 0x99, 0x4d, 0xff, - 0x4f, 0x3e, 0x9a, 0x1f, 0x06, 0xc0, 0xdb, 0x89, 0xfe, 0x9c, 0x11, 0x57, - 0xb5, 0xcb, 0x38, 0x06, 0x15, 0x27, 0x60, 0x1f, 0x53, 0x3e, 0xa9, 0x56, - 0xbe, 0x05, 0x34, 0xc1, 0xcd, 0x0e, 0x48, 0x8d, 0x2a, 0xc8, 0x3e, 0xee, - 0xd6, 0x4b, 0x21, 0xea, 0xa4, 0xf7, 0x56, 0xe2, 0xfd, 0x8e, 0x58, 0xfd, - 0xbc, 0x05, 0xa5, 0xa6, 0x2e, 0xc2, 0xcf, 0x55, 0x42, 0xae, 0xba, 0x49, - 0x35, 0x03, 0xea, 0xa0, 0xdd, 0x06, 0xb7, 0x32, 0xa8, 0x1c, 0x1d, 0x00, - 0xa8, 0x19, 0xdf, 0xb8, 0x95, 0xe4, 0x5a, 0x2a, 0x5e, 0x24, 0x2e, 0x7b, - 0x46, 0x57, 0x4d, 0x06, 0x20, 0x17, 0x09, 0x72, 0x2f, 0x1d, 0x61, 0xc1, - 0x69, 0x1a, 0x96, 0x73, 0x63, 0x57, 0x07, 0xf7, 0x70, 0xd8, 0x26, 0x23, - 0xe2, 0x16, 0x2e, 0xdb, 0x92, 0x22, 0x96, 0xfa, 0xe0, 0x65, 0xa8, 0x3b, - 0xc3, 0x9c, 0x12, 0x80, 0x81, 0xf5, 0xf0, 0xc0, 0xa8, 0x47, 0xda, 0xee, - 0xf8, 0xea, 0xfe, 0x29, 0x7d, 0xde, 0x9f, 0xa3, 0x76, 0x1d, 0xb2, 0x8f, - 0xa9, 0xa6, 0x97, 0xff, 0x95, 0x62, 0xb4, 0x25, 0xdc, 0xeb, 0x10, 0x44, - 0xc7, 0x98, 0x18, 0x30, 0x0a, 0x0e, 0xbe, 0xdd, 0x3b, 0xff, 0x01, 0xfa, - 0xf2, 0x63, 0x99, 0x61, 0x83, 0xb4, 0x0c, 0x23, 0x64, 0xaa, 0xe5, 0x0a, - 0xc1, 0x27, 0xed, 0xbb, 0x5f, 0x65, 0x5e, 0x95, 0x4c, 0xdd, 0x75, 0xe0, - 0xa4, 0x71, 0xc8, 0xa0, 0x42, 0xd2, 0x17, 0xab, 0x4c, 0xf0, 0x3e, 0x7b, - 0x7e, 0x11, 0x83, 0x6e, 0x12, 0x57, 0x57, 0x9c, 0xa5, 0xb2, 0xb8, 0xc9, - 0x79, 0x8a, 0x69, 0x28, 0x0f, 0x7a, 0x42, 0x7f, 0x80, 0x2e, 0x09, 0x87, - 0xbc, 0xea, 0xb8, 0x53, 0x0e, 0x93, 0x0c, 0xc2, 0xf4, 0x34, 0xd6, 0x0a, - 0xe7, 0x5d, 0x9b, 0x62, 0x4c, 0xb1, 0x41, 0x7d, 0x38, 0x37, 0x38, 0x5a, - 0xbd, 0xe2, 0xee, 0xa7, 0x72, 0x70, 0x2d, 0xc3, 0xe2, 0x60, 0x2c, 0x07, - 0x60, 0x3a, 0x85, 0xd5, 0xf6, 0x31, 0xb3, 0x39, 0x65, 0x5a, 0x92, 0xa4, - 0x78, 0x15, 0x46, 0xce, 0x58, 0xa7, 0x05, 0x3f, 0x2a, 0xd3, 0xa9, 0x2c, - 0x83, 0xc5, 0x52, 0x2c, 0xc5, 0x81, 0xee, 0x1b, 0x67, 0x10, 0xe5, 0x33, - 0x94, 0x87, 0x8c, 0x5e, 0x63, 0x66, 0xbc, 0x97, 0x47, 0xfb, 0x2f, 0x3e, - 0x7e, 0x5e, 0x17, 0x2d, 0xe9, 0x71, 0xab, 0x97, 0x68, 0x90, 0x82, 0xcf, - 0xf3, 0xc1, 0x8e, 0x03, 0x1a, 0x37, 0xf9, 0xd9, 0x67, 0x72, 0x21, 0xff, - 0x1c, 0x3b, 0x8f, 0xd7, 0x02, 0xf1, 0x25, 0x93, 0xe9, 0x9e, 0x67, 0xe4, - 0xa4, 0x08, 0x81, 0xf1, 0x94, 0x9a, 0x03, 0xcd, 0xb4, 0xe5, 0xb9, 0xc9, - 0x7b, 0x1c, 0xbe, 0x82, 0xf0, 0x55, 0xd3, 0xf0, 0xf7, 0x58, 0x53, 0xbe, - 0xf7, 0x05, 0xbb, 0x6a, 0x0a, 0x69, 0x11, 0x9c, 0xaf, 0xe6, 0x55, 0xc4, - 0xec, 0x05, 0xbb, 0x4a, 0x76, 0x85, 0x60, 0x86, 0xbf, 0xa9, 0x50, 0x31, - 0x35, 0xe1, 0x26, 0x6a, 0x78, 0xf9, 0xc8, 0xae, 0xdf, 0x0e, 0xec, 0xf8, - 0x66, 0xfb, 0x23, 0xdb, 0xc3, 0x39, 0xf8, 0x62, 0xea, 0x93, 0x8c, 0xff, - 0x14, 0x73, 0x48, 0x24, 0x71, 0x4e, 0xd5, 0xce, 0xce, 0x0b, 0xf6, 0xe8, - 0x63, 0x78, 0x91, 0x49, 0x55, 0x32, 0x8c, 0x30, 0xbc, 0xe4, 0x3c, 0xb0, - 0x90, 0x78, 0x7f, 0xa1, 0x64, 0x06, 0x77, 0x56, 0xc2, 0xd5, 0xe7, 0x3b, - 0xcb, 0x82, 0x32, 0xfc, 0xc7, 0x6e, 0x1a, 0xc7, 0xa3, 0x71, 0xf3, 0x69, - 0x01, 0x15, 0x1e, 0xab, 0x84, 0xb9, 0x44, 0x70, 0x28, 0x29, 0xf3, 0x08, - 0xb2, 0x9c, 0xe4, 0x72, 0x24, 0xff, 0x68, 0xcb, 0xfe, 0xb2, 0x6b, 0x52, - 0x42, 0x16, 0xb3, 0x02, 0x76, 0x90, 0xd3, 0x80, 0xd3, 0xab, 0xfe, 0x3a, - 0xe7, 0x51, 0x1d, 0x55, 0x93, 0x32, 0xc6, 0xce, 0xd4, 0x89, 0x19, 0x9a, - 0x04, 0xe7, 0x58, 0x8a, 0x39, 0x7d, 0x11, 0x6b, 0xf6, 0x94, 0x95, 0x35, - 0x43, 0x42, 0xc4, 0xed, 0x7a, 0x2b, 0xb1, 0xac, 0x84, 0x5d, 0x20, 0xfb, - 0x87, 0xe3, 0x4a, 0xfd, 0x55, 0x8e, 0x97, 0x1c, 0xa8, 0x05, 0x55, 0x8f, - 0x87, 0xe6, 0x0b, 0xc5, 0x22, 0x0e, 0x78, 0xee, 0x48, 0xe4, 0x8e, 0x85, - 0xdd, 0x63, 0x17, 0x61, 0x96, 0xbe, 0xe0, 0xe5, 0x79, 0xa6, 0x45, 0x78, - 0xb6, 0xa5, 0x5a, 0xd5, 0xf8, 0xe0, 0xd8, 0x82, 0x20, 0x57, 0x33, 0x75, - 0xda, 0x36, 0x72, 0xd3, 0xd7, 0x0a, 0xf3, 0xfc, 0xe6, 0xdc, 0x6c, 0x7e, - 0xa3, 0x71, 0x87, 0xa2, 0x44, 0xeb, 0x48, 0x8b, 0x07, 0xb9, 0x56, 0x6b, - 0x0d, 0x27, 0x0f, 0x4b, 0x7f, 0x58, 0x3d, 0xab, 0xff, 0xcc, 0x84, 0x16, - 0xfb, 0x55, 0x32, 0xdd, 0xb5, 0x0c, 0x38, 0x5b, 0x22, 0x1b, 0x98, 0x19, - 0xfe, 0xdf, 0x38, 0xb0, 0x6f, 0x21, 0x2e, 0x16, 0xf2, 0x54, 0xf8, 0x38, - 0x2b, 0x7b, 0x90, 0x88, 0x68, 0x27, 0x72, 0x59, 0x39, 0xa0, 0x49, 0xc8, - 0xcd, 0xe7, 0x8c, 0xd8, 0x68, 0xff, 0xc4, 0x80, 0x2a, 0x79, 0xd9, 0x02, - 0x23, 0x41, 0x92, 0x73, 0xe5, 0x71, 0xe5, 0x55, 0x8c, 0xcb, 0x2b, 0x46, - 0x7f, 0x4a, 0xf5, 0x4c, 0x01, 0x6a, 0x9f, 0xba, 0x45, 0x0d, 0x81, 0x8e, - 0x3c, 0x9e, 0x08, 0x61, 0x26, 0x2b, 0x63, 0x58, 0x8d, 0xb4, 0xce, 0x9f, - 0x72, 0x3c, 0x91, 0x2a, 0x69, 0x0a, 0x02, 0x73, 0xa8, 0x95, 0x3e, 0x5b, - 0xe0, 0x44, 0x23, 0x9f, 0xe2, 0xc8, 0x11, 0x65, 0xf6, 0xdd, 0xc4, 0xe9, - 0x91, 0xe3, 0x79, 0x7f, 0x0e, 0x8e, 0x12, 0xcc, 0x60, 0xbf, 0x76, 0xb4, - 0x96, 0x68, 0x70, 0xed, 0xac, 0xeb, 0xb8, 0x2d, 0xb6, 0x63, 0x88, 0x79, - 0x6a, 0x04, 0xe7, 0x02, 0xcd, 0xf3, 0x3a, 0x89, 0x05, 0x8a, 0x34, 0x9a, - 0x55, 0x38, 0xd4, 0xd1, 0xb0, 0xde, 0xab, 0xe7, 0xc9, 0xa6, 0x62, 0x85, - 0x7f, 0x7d, 0x15, 0x13, 0xa6, 0x80, 0x2a, 0x25, 0xfe, 0x47, 0xeb, 0x73, - 0x86, 0xcf, 0x71, 0x07, 0xb4, 0xb0, 0xce, 0x8a, 0x31, 0x0b, 0x00, 0xc9, - 0x06, 0x62, 0x76, 0x0e, 0x20, 0x7f, 0xdc, 0xf2, 0xb4, 0xb3, 0x35, 0x78, - 0xbe, 0x12, 0x72, 0x6c, 0x47, 0x42, 0x1e, 0x74, 0x08, 0x11, 0x69, 0xbd, - 0x7c, 0x55, 0xf5, 0x61, 0xbf, 0x9b, 0x6d, 0x84, 0xbf, 0xa6, 0xda, 0x5e, - 0x10, 0x67, 0x41, 0x7e, 0x96, 0x18, 0x15, 0x1a, 0x42, 0xdf, 0x07, 0xd1, - 0x84, 0x63, 0xe2, 0xd9, 0xd9, 0x1f, 0x75, 0xbd, 0x1a, 0x03, 0x64, 0xa3, - 0x7a, 0x15, 0x72, 0x16, 0x73, 0x35, 0x8b, 0x09, 0x34, 0xdd, 0xee, 0xf8, - 0xdc, 0x8c, 0x8a, 0x1b, 0x10, 0x67, 0xc4, 0x46, 0xfd, 0xbc, 0xdc, 0xad, - 0xa3, 0x99, 0xa3, 0x77, 0xd5, 0x19, 0x05, 0x44, 0x7c, 0x3a, 0xbb, 0xae, - 0xe8, 0xe8, 0x90, 0xf7, 0x28, 0xf4, 0xc1, 0x47, 0x92, 0x46, 0x9a, 0x9a, - 0xef, 0x32, 0x2e, 0x80, 0xf9, 0x74, 0x9e, 0xac, 0x48, 0x9c, 0x05, 0xd6, - 0x2d, 0x6f, 0x1d, 0xee, 0xa5, 0xd7, 0x06, 0x24, 0x68, 0x55, 0xf0, 0xbb, - 0x4d, 0x7f, 0xc9, 0x8c, 0x3b, 0xa7, 0xc3, 0x03, 0xfc, 0xf1, 0x34, 0x14, - 0x53, 0x11, 0x00, 0x68, 0x74, 0x16, 0x99, 0x65, 0xb2, 0xcd, 0x1a, 0x09, - 0x17, 0x80, 0x1d, 0x8a, 0x66, 0xa8, 0x2c, 0x93, 0xcd, 0x6f, 0x32, 0x52, - 0x93, 0x0d, 0x2b, 0xaa, 0x05, 0x1d, 0x45, 0xe4, 0x62, 0x70, 0xe8, 0x64, - 0x48, 0xb8, 0x4d, 0xd8, 0xa0, 0x85, 0x04, 0x42, 0xcd, 0x19, 0x5c, 0x4f, - 0x05, 0xa8, 0x1f, 0x06, 0x58, 0xd4, 0x16, 0x62, 0x48, 0x57, 0x31, 0x9d, - 0xc8, 0x63, 0x53, 0x38, 0xde, 0x32, 0xb4, 0x1d, 0x52, 0x11, 0xe1, 0x82, - 0xf1, 0x7e, 0x9d, 0x39, 0x2b, 0x8f, 0xa2, 0x6f, 0x93, 0xc7, 0x60, 0x98, - 0x43, 0xec, 0x37, 0x72, 0x79, 0x0a, 0x1d, 0x32, 0xbd, 0x7c, 0x4f, 0x6f, - 0xf4, 0xb4, 0x63, 0x18, 0x9d, 0x20, 0xca, 0xfb, 0x4c, 0x12, 0x6a, 0x73, - 0x06, 0x1a, 0xfb, 0xc7, 0x03, 0xbf, 0x9d, 0x3e, 0xe3, 0x67, 0x8f, 0x0d, - 0x71, 0xce, 0x0b, 0xfb, 0x56, 0x32, 0x71, 0x82, 0xea, 0xb4, 0xff, 0x91, - 0x96, 0xa4, 0x9a, 0x59, 0x90, 0x20, 0x5b, 0xd3, 0x1f, 0x15, 0x00, 0xac, - 0xd4, 0xce, 0x7f, 0xaf, 0x96, 0x78, 0x04, 0xcf, 0x48, 0x75, 0xec, 0x3e, - 0x00, 0x69, 0x67, 0x9d, 0xe2, 0x2a, 0x87, 0x6d, 0x81, 0xfe, 0xf1, 0xcf, - 0x5b, 0xc2, 0x23, 0x41, 0x15, 0xa4, 0xcd, 0xb6, 0x38, 0x1c, 0xc0, 0xe3, - 0x45, 0xd6, 0x4b, 0x50, 0x8b, 0x92, 0xc7, 0xd2, 0x23, 0x89, 0x58, 0x15, - 0x65, 0x3f, 0xca, 0x56, 0x05, 0xa0, 0x82, 0x5a, 0x48, 0x12, 0xd4, 0x87, - 0x2f, 0x8d, 0x19, 0x96, 0xbd, 0x96, 0xce, 0xaa, 0x76, 0x59, 0x78, 0x63, - 0x39, 0x34, 0x74, 0x8c, 0x4d, 0xdf, 0xd8, 0x8e, 0x2b, 0x33, 0x52, 0xeb, - 0x1e, 0xeb, 0x23, 0x9c, 0x01, 0x67, 0x28, 0x6a, 0x40, 0xd0, 0x14, 0xa2, - 0x58, 0x03, 0xe6, 0x87, 0x97, 0x1f, 0xfc, 0x79, 0x03, 0x52, 0x8e, 0xa4, - 0xa5, 0x39, 0x48, 0x4a, 0xed, 0x52, 0x96, 0x58, 0xe0, 0xf3, 0x7a, 0xba, - 0x8b, 0x2b, 0x38, 0xd1, 0x10, 0x63, 0x9d, 0xdf, 0x6e, 0xf8, 0xca, 0x03, - 0xec, 0x5e, 0x26, 0xc4, 0x4e, 0xaf, 0x0c, 0xf8, 0x1e, 0x5c, 0x38, 0x3b, - 0xb2, 0x55, 0xea, 0x6a, 0x7c, 0xec, 0x42, 0x54, 0x55, 0xf5, 0x59, 0xc6, - 0x0d, 0xfe, 0x16, 0x5d, 0x05, 0x2e, 0x09, 0xa0, 0x53, 0xc6, 0xe2, 0x60, - 0x12, 0x5d, 0xc7, 0x52, 0x71, 0x02, 0x5b, 0x6d, 0xe9, 0xad, 0x6b, 0xe6, - 0x0d, 0xb8, 0x6f, 0xbf, 0xa4, 0x12, 0x5d, 0x8e, 0x4a, 0x02, 0xba, 0xf4, - 0xd5, 0x2c, 0xaa, 0x22, 0x23, 0xd8, 0xb0, 0x31, 0xdf, 0x7d, 0x5b, 0x40, - 0x7d, 0xab, 0xf3, 0x8e, 0x5c, 0xee, 0x7d, 0xae, 0x34, 0x68, 0x2e, 0x97, - 0x38, 0x60, 0x5c, 0x03, 0xc3, 0x30, 0x4b, 0xb8, 0x91, 0xdd, 0xad, 0x27, - 0x04, 0xad, 0x39, 0x15, 0xcb, 0x9a, 0x84, 0xa2, 0x9e, 0xb0, 0x02, 0xcc, - 0x41, 0x28, 0xa9, 0x2d, 0x80, 0x6e, 0x8d, 0xe1, 0x5c, 0x9f, 0xab, 0x87, - 0x0b, 0x9c, 0x98, 0x02, 0x75, 0x62, 0x93, 0xb4, 0x92, 0xf9, 0x2c, 0xc8, - 0xd6, 0xbf, 0x2d, 0xe6, 0x66, 0xa6, 0x87, 0x7c, 0xfd, 0xd5, 0xe3, 0x1b, - 0xaa, 0xba, 0x73, 0xe2, 0x59, 0xef, 0x03, 0x97, 0x62, 0x18, 0xde, 0x3b, - 0x73, 0x58, 0x2e, 0xe2, 0x6b, 0x7b, 0x5d, 0xbe, 0x4b, 0x7d, 0xa8, 0x96, - 0x84, 0x4e, 0x39, 0xc0, 0xa8, 0x98, 0xef, 0x8d, 0xa4, 0x2a, 0xb2, 0x33, - 0x04, 0x2e, 0x4a, 0x1f, 0x89, 0x86, 0xf3, 0x09, 0xd2, 0x50, 0x61, 0x12, - 0xf1, 0x4e, 0x18, 0xda, 0x33, 0x9c, 0x94, 0x4a, 0x8c, 0xd7, 0x87, 0xd1, - 0x47, 0x37, 0x33, 0xbe, 0x4d, 0x59, 0x11, 0x88, 0x01, 0x41, 0x9d, 0xb5, - 0xb8, 0xcc, 0x48, 0x63, 0x7f, 0x81, 0x26, 0x47, 0x02, 0x0e, 0xe0, 0x0a, - 0xe1, 0xb1, 0xe7, 0xa7, 0x14, 0x66, 0xcb, 0xcf, 0x6e, 0x55, 0x33, 0xb6, - 0x10, 0x44, 0xf2, 0x5e, 0x73, 0x24, 0xe2, 0x70, 0xc4, 0x90, 0x62, 0xf1, - 0xfa, 0x35, 0xd0, 0xc6, 0xaa, 0x8a, 0xf9, 0x79, 0xd1, 0x3f, 0xed, 0x96, - 0x04, 0x21, 0xb3, 0xac, 0x87, 0x88, 0xa8, 0x7c, 0x37, 0x15, 0x3a, 0x9d, - 0x4b, 0xd5, 0xf0, 0x00, 0xdc, 0x05, 0xa1, 0x3d, 0x0f, 0xff, 0xab, 0xf9, - 0x0a, 0x68, 0x01, 0x85, 0x28, 0x7b, 0x91, 0x86, 0x4a, 0xe9, 0x3f, 0xf1, - 0x44, 0x7e, 0x8b, 0xed, 0xb0, 0xd1, 0x6e, 0xbf, 0x89, 0xe8, 0x5d, 0x61, - 0xd3, 0xe7, 0xb4, 0x01, 0x74, 0x38, 0x3c, 0xb8, 0xdb, 0x3d, 0x7e, 0xe5, - 0xfc, 0x8f, 0x2a, 0x6d, 0xfa, 0x60, 0x5e, 0x84, 0x03, 0x4b, 0x24, 0x0a, - 0x1c, 0x65, 0x82, 0xd2, 0x17, 0xa5, 0x3b, 0xdf, 0x27, 0xb0, 0xef, 0xb8, - 0xad, 0x19, 0x61, 0x5f, 0xd5, 0xaa, 0x0b, 0x40, 0x0e, 0x9f, 0x31, 0xd5, - 0xfd, 0xbd, 0xc1, 0x3d, 0x6a, 0x84, 0xe5, 0x0d, 0x31, 0xfa, 0x1f, 0x1e, - 0x8d, 0x90, 0x65, 0x9f, 0x47, 0x20, 0xaa, 0xe3, 0xc7, 0x08, 0x6b, 0xb9, - 0x1b, 0x74, 0xc8, 0xf0, 0x40, 0x91, 0x2c, 0xd2, 0x92, 0x2e, 0x0e, 0x45, - 0x7e, 0xdc, 0xfb, 0xb4, 0xd5, 0x99, 0xe3, 0x50, 0x17, 0x9a, 0x80, 0x84, - 0xc6, 0x42, 0x75, 0xd6, 0xeb, 0xc4, 0xa4, 0xb6, 0xbf, 0xeb, 0xfa, 0xdd, - 0x58, 0x39, 0x61, 0x6c, 0xe5, 0x66, 0x29, 0x68, 0x22, 0x71, 0x1e, 0x92, - 0xa9, 0x5e, 0x67, 0xc1, 0x30, 0x3f, 0x06, 0x37, 0xd6, 0x4c, 0xaf, 0x68, - 0x06, 0xb3, 0xf9, 0x02, 0x75, 0xcd, 0x6a, 0xea, 0xc0, 0x28, 0xa6, 0xb7, - 0xbb, 0xce, 0xaa, 0x91, 0x48, 0x6a, 0x68, 0x57, 0x13, 0xff, 0x42, 0x53, - 0x96, 0x72, 0xe9, 0x1f, 0x30, 0xb7, 0x60, 0x1a, 0x45, 0x1c, 0x77, 0x67, - 0x1d, 0x1b, 0xf8, 0x3b, 0xae, 0x3c, 0xd0, 0xb3, 0x41, 0xfd, 0xcc, 0x0f, - 0x31, 0xa3, 0xc1, 0x89, 0x24, 0xca, 0xde, 0xcb, 0x3c, 0x2c, 0xac, 0x1c, - 0x0b, 0x43, 0xee, 0xb4, 0x11, 0x22, 0x24, 0xa3, 0x67, 0xf0, 0x1e, 0x52, - 0x7d, 0xc7, 0x70, 0x07, 0x57, 0x6c, 0x75, 0x9d, 0xa1, 0xac, 0x3c, 0xb6, - 0xa7, 0x37, 0xb6, 0x14, 0xf0, 0x1a, 0xa3, 0x47, 0x4d, 0xe8, 0xd4, 0x3e, - 0x72, 0x08, 0x6c, 0xfe, 0x69, 0x54, 0xe0, 0x69, 0xc9, 0xb3, 0x54, 0x28, - 0x1c, 0xd8, 0xb2, 0xc6, 0x20, 0x07, 0x98, 0xaf, 0xbb, 0x59, 0x1c, 0x1d, - 0x14, 0x33, 0x5f, 0xa3, 0x31, 0x97, 0xb4, 0x70, 0xa6, 0xce, 0x0d, 0x8f, - 0x9d, 0xe7, 0x41, 0x83, 0xa5, 0xfe, 0x08, 0x20, 0x67, 0xd2, 0xe0, 0xe9, - 0x7c, 0x56, 0xee, 0x0f, 0x0a, 0x94, 0x83, 0x0c, 0x7f, 0xe3, 0x26, 0x7b, - 0xd2, 0x09, 0x45, 0xa3, 0x5a, 0x7c, 0x70, 0xcc, 0x3a, 0x92, 0xbe, 0x5f, - 0x42, 0xa2, 0x09, 0x80, 0x90, 0xdc, 0x35, 0xc9, 0x8d, 0xb1, 0xe6, 0x72, - 0xee, 0x67, 0x33, 0x01, 0x74, 0xc5, 0x25, 0x4f, 0x8a, 0x29, 0x08, 0xd8, - 0x2b, 0x40, 0x18, 0x72, 0x0d, 0x48, 0x0b, 0x15, 0x07, 0x06, 0xb4, 0x52, - 0x94, 0x24, 0x61, 0xc9, 0xe6, 0x5b, 0x57, 0x69, 0xa6, 0xa3, 0xfd, 0x99, - 0xc6, 0x7a, 0x42, 0x92, 0x21, 0x9b, 0x45, 0xc4, 0x04, 0x2a, 0x94, 0x50, - 0xe4, 0x72, 0x11, 0x6a, 0x57, 0x6a, 0x82, 0xe1, 0x12, 0x3a, 0x20, 0x5d, - 0xb5, 0x15, 0xc6, 0xbe, 0x2d, 0xaa, 0xb7, 0x42, 0x55, 0x91, 0xc5, 0x04, - 0xd8, 0x03, 0x78, 0x69, 0x5c, 0x9c, 0xd7, 0x10, 0x6d, 0x17, 0xc7, 0xba, - 0xe4, 0x82, 0xc1, 0x4e, 0xa3, 0x71, 0x7b, 0x47, 0x81, 0x6d, 0x6b, 0xbd, - 0xc0, 0xfa, 0x0f, 0xec, 0x85, 0x24, 0xfb, 0x7d, 0x58, 0x5e, 0x38, 0xdc, - 0xf3, 0x5f, 0x41, 0xb7, 0x31, 0x49, 0x27, 0xf2, 0x39, 0xf9, 0xe7, 0xe6, - 0x19, 0xb5, 0x24, 0x78, 0xb9, 0x9d, 0x4e, 0xcf, 0x8e, 0x1b, 0x32, 0xe2, - 0xba, 0xf5, 0xb3, 0x59, 0xc1, 0xab, 0xd3, 0xae, 0xf6, 0xf6, 0x1f, 0x04, - 0x34, 0x86, 0x5d, 0x24, 0xa5, 0x03, 0xea, 0xfd, 0x70, 0xc9, 0xa7, 0x17, - 0xd3, 0x5a, 0x67, 0xe2, 0x19, 0x05, 0x3a, 0x50, 0xbc, 0x28, 0x08, 0xa3, - 0xac, 0x75, 0x52, 0x23, 0xe9, 0xb7, 0xb8, 0xa9, 0x12, 0x56, 0xf3, 0x9c, - 0xed, 0x7a, 0xab, 0x13, 0x31, 0x4c, 0x8b, 0xa8, 0xdb, 0x7c, 0x84, 0xc7, - 0xba, 0xa9, 0x83, 0x4d, 0x41, 0x6a, 0xfb, 0x78, 0x12, 0xd4, 0x6f, 0xb2, - 0xbc, 0xf6, 0x6f, 0xc2, 0xbd, 0x71, 0x7c, 0x13, 0xcf, 0x8d, 0xe6, 0x86, - 0x07, 0x83, 0x12, 0x38, 0xb1, 0x3d, 0x39, 0xe6, 0x50, 0x5c, 0x29, 0x55, - 0x27, 0xd7, 0x42, 0xbb, 0xc9, 0x33, 0x5e, 0xed, 0xf4, 0xdc, 0x05, 0x13, - 0xb1, 0xc3, 0xfd, 0xc7, 0x32, 0x58, 0x02, 0x45, 0xbb, 0x36, 0xe5, 0x24, - 0x0e, 0x37, 0x85, 0x18, 0xa5, 0x2d, 0x57, 0xb1, 0x04, 0x48, 0xb2, 0x51, - 0xa4, 0x18, 0xcc, 0x4a, 0x44, 0x9b, 0xc4, 0xb2, 0x66, 0x15, 0x89, 0x9f, - 0x28, 0xca, 0x29, 0x38, 0x90, 0x11, 0x07, 0xbd, 0x63, 0x97, 0x1c, 0xcb, - 0x51, 0x66, 0x85, 0xb0, 0xa9, 0x9e, 0xd8, 0xbe, 0x9b, 0x95, 0x50, 0x1e, - 0x53, 0x89, 0x51, 0x67, 0xe5, 0x07, 0xb7, 0x21, 0xa5, 0x0f, 0xd0, 0x06, - 0xf9, 0xfd, 0xc7, 0xaf, 0x0e, 0x6c, 0x6c, 0xf3, 0x0f, 0xe9, 0x0b, 0x55, - 0xa6, 0x69, 0xf1, 0xc4, 0xc9, 0x98, 0x30, 0xf5, 0xed, 0xfa, 0x1b, 0xd6, - 0x31, 0xfe, 0xd3, 0x24, 0x31, 0xae, 0xcb, 0x16, 0xf2, 0x01, 0x9d, 0x08, - 0xab, 0xd4, 0xed, 0x43, 0x13, 0x8a, 0x9c, 0x65, 0xca, 0xaf, 0xdd, 0xf2, - 0xd9, 0x3a, 0xe4, 0x4d, 0x4d, 0x0f, 0x3f, 0x73, 0x73, 0x1b, 0x27, 0x8e, - 0x4e, 0xce, 0x1c, 0x5d, 0x16, 0xfa, 0xdf, 0x03, 0x8c, 0x8b, 0xb1, 0x34, - 0xc1, 0xde, 0xe2, 0xec, 0x0a, 0x1b, 0xc3, 0x6a, 0x99, 0x2a, 0x34, 0x5a, - 0x74, 0x91, 0x64, 0x40, 0x6f, 0xd1, 0xa8, 0x00, 0xc1, 0xed, 0x70, 0x41, - 0x97, 0xd9, 0xc0, 0xf1, 0x64, 0x97, 0x61, 0xda, 0x0f, 0xd9, 0x55, 0x7f, - 0x9c, 0xbb, 0xce, 0x66, 0xce, 0x43, 0xc1, 0x33, 0x5d, 0x9e, 0xc2, 0x32, - 0x48, 0xc6, 0x60, 0x7d, 0xae, 0xda, 0x06, 0x36, 0x53, 0xbc, 0x85, 0x08, - 0xee, 0xc4, 0x19, 0x6a, 0xf5, 0xb6, 0xe3, 0xb4, 0x52, 0x70, 0x73, 0xd4, - 0x9a, 0x75, 0xa0, 0x57, 0x40, 0xf3, 0x61, 0x16, 0x2c, 0x48, 0x3f, 0x13, - 0xdc, 0x55, 0x7f, 0x94, 0x78, 0x23, 0x87, 0x3e, 0x86, 0xdd, 0x3e, 0x27, - 0xf9, 0xcf, 0x06, 0x6c, 0xcf, 0x97, 0x4d, 0x51, 0xa2, 0xe7, 0x96, 0x64, - 0x1e, 0x56, 0x51, 0x31, 0x1e, 0xbf, 0xce, 0x71, 0x97, 0x90, 0x87, 0xc2, - 0x34, 0x74, 0x95, 0x25, 0xb6, 0x68, 0x1d, 0x3c, 0x88, 0xbe, 0xce, 0x62, - 0x47, 0x97, 0xfc, 0x77, 0x2b, 0x8f, 0xe3, 0x8a, 0xff, 0xef, 0x70, 0x09, - 0x88, 0xc7, 0xb1, 0xda, 0x8b, 0x1c, 0x69, 0xa5, 0x5e, 0xe6, 0xf9, 0x2d, - 0x52, 0x32, 0x5b, 0x7f, 0x63, 0xa7, 0xc6, 0xa5, 0xd2, 0xf0, 0xd1, 0xd4, - 0x4c, 0x7f, 0x94, 0x2e, 0xf7, 0x67, 0x76, 0x25, 0x0e, 0x91, 0x86, 0x05, - 0xa3, 0xa4, 0xaf, 0x1a, 0x1c, 0xb3, 0x5e, 0x52, 0x69, 0x64, 0x7b, 0xa5, - 0x00, 0xd0, 0x18, 0x76, 0xa7, 0xbb, 0x1e, 0x80, 0x33, 0x43, 0xbb, 0x22, - 0x35, 0xe1, 0x15, 0xd9, 0x6f, 0xb8, 0xc5, 0x61, 0x35, 0xe4, 0xc4, 0x21, - 0x18, 0x78, 0x40, 0x2c, 0x2b, 0x42, 0xb4, 0xa2, 0x27, 0x20, 0x1b, 0xc6, - 0x53, 0x75, 0x11, 0xfe, 0x1d, 0xec, 0x0e, 0xbe, 0xa9, 0x7e, 0x3b, 0x19, - 0x72, 0xbe, 0x55, 0xaa, 0xc8, 0x89, 0x5e, 0xf5, 0x53, 0xf3, 0x8d, 0xaa, - 0xab, 0xa2, 0xec, 0x0b, 0x6b, 0x06, 0x2c, 0xe3, 0xd6, 0xb8, 0x52, 0x70, - 0x50, 0x48, 0x52, 0x46, 0x93, 0x08, 0xab, 0xec, 0xe8, 0xe9, 0xda, 0xb7, - 0x24, 0xce, 0xc3, 0xe3, 0xdf, 0xdb, 0x76, 0x19, 0xbd, 0xca, 0x0c, 0x68, - 0xb4, 0xdb, 0xfd, 0xb7, 0xc8, 0x2b, 0x1b, 0x70, 0xf4, 0x95, 0x8d, 0x0a, - 0xd8, 0xd1, 0xc5, 0xd7, 0xa5, 0x2a, 0xa2, 0x67, 0x2d, 0x9f, 0x7b, 0x0a, - 0xee, 0x40, 0x9e, 0x49, 0x29, 0xb2, 0x5c, 0x45, 0xa4, 0xb5, 0x08, 0xb9, - 0x80, 0x1e, 0xb7, 0x60, 0xb9, 0xc9, 0xf0, 0xe9, 0xfb, 0x9e, 0x58, 0x18, - 0x0f, 0x3a, 0x59, 0x51, 0xbb, 0xfd, 0x83, 0x93, 0xe3, 0xd4, 0xbe, 0xb5, - 0x1e, 0x09, 0xfb, 0x3e, 0x7c, 0x6e, 0x22, 0x5c, 0xe1, 0x27, 0xde, 0x8d, - 0x48, 0xff, 0x4b, 0x36, 0xa8, 0x73, 0xad, 0xe0, 0x4a, 0x78, 0x36, 0x5b, - 0x45, 0xd3, 0x98, 0x24, 0xf6, 0x23, 0x86, 0x6e, 0x5c, 0x38, 0xe8, 0x5d, - 0x09, 0x8a, 0x89, 0x31, 0x04, 0x01, 0xcb, 0x38, 0x2f, 0xdc, 0xa1, 0xb6, - 0x32, 0x79, 0x48, 0x61, 0x29, 0xb8, 0x8f, 0x35, 0x0c, 0xb7, 0x13, 0xb7, - 0x4c, 0x74, 0x5c, 0xbe, 0x61, 0x02, 0x31, 0xd9, 0x8f, 0xbe, 0xbb, 0xdb, - 0x50, 0xfb, 0x12, 0x06, 0xd7, 0xac, 0xd0, 0xf1, 0xc9, 0xaf, 0x9b, 0x5f, - 0xc4, 0x51, 0x2f, 0xb2, 0x99, 0xe4, 0xfd, 0xaa, 0x43, 0xea, 0xcd, 0xf2, - 0xaa, 0xf9, 0xbe, 0x80, 0xf3, 0x17, 0x52, 0x18, 0x21, 0x03, 0x0f, 0x04, - 0x82, 0xbd, 0x4c, 0x34, 0x40, 0x4b, 0x7d, 0x51, 0x8c, 0xc4, 0x09, 0x64, - 0xbb, 0x8b, 0xd5, 0xc5, 0xc8, 0xdf, 0x63, 0x33, 0x8a, 0x48, 0x7d, 0x97, - 0x5e, 0x54, 0xa5, 0xea, 0x32, 0x7c, 0x47, 0xbc, 0xd4, 0x2d, 0x90, 0x56, - 0xaa, 0xd8, 0xb5, 0x12, 0x77, 0x4b, 0x86, 0x45, 0x57, 0xf5, 0x31, 0xdb, - 0x4c, 0xef, 0xa5, 0x85, 0x26, 0x4a, 0xee, 0xa5, 0x3f, 0x5a, 0xcc, 0x84, - 0x7c, 0x8f, 0x2a, 0x42, 0x0e, 0x1b, 0xa1, 0x7d, 0x27, 0x76, 0x34, 0x73, - 0x5e, 0x51, 0x6f, 0xd6, 0x49, 0xc1, 0x8a, 0xd3, 0x85, 0x62, 0x12, 0xc9, - 0x45, 0x79, 0xc2, 0xb0, 0xa8, 0xfd, 0xf5, 0x25, 0x1d, 0x65, 0x74, 0xd0, - 0x3f, 0x11, 0x65, 0xcc, 0x2b, 0x4e, 0x21, 0x5f, 0x0f, 0x40, 0x5d, 0x05, - 0xc5, 0xc2, 0x02, 0x42, 0x4f, 0x68, 0x7a, 0x97, 0x53, 0x69, 0x03, 0x3e, - 0x1f, 0x27, 0xda, 0x89, 0x5d, 0x8b, 0x2e, 0xdf, 0x32, 0xa7, 0x46, 0x4b, - 0x70, 0x17, 0x31, 0xa8, 0x96, 0xe8, 0xf1, 0x1a, 0x6e, 0x7b, 0xd1, 0xb3, - 0xe2, 0x19, 0x58, 0xf8, 0xb1, 0xbd, 0x91, 0x1f, 0xf5, 0x8d, 0xc2, 0x5e, - 0x52, 0x7c, 0xf2, 0x53, 0xd0, 0x23, 0xa0, 0x9e, 0xb0, 0x57, 0x8d, 0x17, - 0x5a, 0x9e, 0x01, 0xfd, 0x39, 0x29, 0x85, 0x69, 0xa1, 0xac, 0xe2, 0x89, - 0x0c, 0xc2, 0xf9, 0x85, 0xef, 0xd8, 0xc1, 0x5f, 0x34, 0xae, 0xc3, 0x41, - 0xd7, 0x5e, 0x87, 0xce, 0xae, 0xa5, 0x37, 0xb6, 0x95, 0xe4, 0xff, 0x03, - 0x6d, 0x17, 0x0d, 0x3c, 0x21, 0x9e, 0x21, 0x6b, 0x37, 0x62, 0x45, 0x7e, - 0xa8, 0x88, 0x0a, 0x9a, 0x91, 0x21, 0x2d, 0x63, 0xc1, 0xa6, 0xc5, 0x2a, - 0xf6, 0x37, 0xda, 0xd6, 0x94, 0x24, 0x17, 0xb9, 0x9a, 0x44, 0x07, 0x75, - 0x19, 0x5b, 0xe2, 0xd4, 0xfa, 0x08, 0xb2, 0x12, 0x1c, 0x3d, 0x17, 0xca, - 0x2a, 0xc9, 0xc1, 0xfb, 0x4d, 0xa1, 0x4f, 0x0c, 0x57, 0x7c, 0x92, 0x35, - 0xa6, 0xc8, 0x70, 0x56, 0x64, 0x43, 0x1d, 0x68, 0x6b, 0x4c, 0x18, 0xf8, - 0x5c, 0xa3, 0xe2, 0x96, 0x91, 0xf5, 0x4d, 0x6b, 0x24, 0x62, 0x48, 0x03, - 0xba, 0xf4, 0x99, 0xb9, 0x12, 0x61, 0xf9, 0x04, 0x47, 0x31, 0x72, 0x80, - 0x2f, 0xe3, 0x81, 0x47, 0xb1, 0x06, 0x6c, 0x83, 0xa4, 0x35, 0xed, 0x3b, - 0xc6, 0x01, 0x3e, 0x59, 0xf9, 0x00, 0x4e, 0x5d, 0x93, 0x58, 0xeb, 0x71, - 0x1f, 0x1f, 0xa8, 0x25, 0x29, 0x0c, 0x8e, 0x24, 0xdd, 0x34, 0x70, 0x98, - 0x39, 0xd7, 0x61, 0x0b, 0x44, 0x51, 0x06, 0xaf, 0xab, 0x91, 0xe4, 0xbf, - 0x11, 0x74, 0x52, 0xb1, 0xe4, 0x7e, 0x1d, 0xd1, 0x08, 0x63, 0x64, 0x56, - 0xcd, 0x59, 0x56, 0xd8, 0xa3, 0xc5, 0xb7, 0xa1, 0x72, 0x42, 0x33, 0x56, - 0x55, 0x8a, 0x81, 0x16, 0x79, 0xfe, 0x49, 0xf3, 0xc8, 0xf6, 0xb7, 0x58, - 0xcb, 0x74, 0x5a, 0xb7, 0x68, 0x06, 0x00, 0x24, 0xdb, 0x47, 0x52, 0x38, - 0xcd, 0xf3, 0x1a, 0xbe, 0x19, 0x18, 0x54, 0xdf, 0xb6, 0x49, 0xff, 0x00, - 0xb8, 0x26, 0xba, 0xcf, 0x99, 0x70, 0xaf, 0x6b, 0xf6, 0xbd, 0x59, 0x2d, - 0xce, 0xb6, 0x99, 0x6b, 0x5d, 0xcd, 0xc3, 0xd1, 0x89, 0x0f, 0x85, 0x30, - 0xd5, 0xc9, 0x98, 0x3f, 0x78, 0x66, 0xed, 0x53, 0x33, 0x1b, 0x0e, 0x26, - 0xfe, 0x98, 0x4e, 0x83, 0xd7, 0x6a, 0x92, 0xc7, 0xc1, 0x47, 0xee, 0x3b, - 0xa8, 0x20, 0xfa, 0xf4, 0x98, 0x79, 0x5a, 0x7b, 0x2b, 0x20, 0xe3, 0x50, - 0xc3, 0xf5, 0x04, 0xf6, 0x3a, 0xcd, 0xe0, 0x68, 0x20, 0x6f, 0xb0, 0x56, - 0x6c, 0x21, 0x26, 0xee, 0x11, 0x76, 0xdf, 0xd7, 0x82, 0xae, 0x8e, 0xa8, - 0x6a, 0x1c, 0xde, 0x87, 0x90, 0x90, 0x57, 0x25, 0x85, 0xba, 0x39, 0x60, - 0x5c, 0x77, 0x9f, 0xb0, 0x5b, 0x18, 0x87, 0x6b, 0x99, 0x9f, 0xe8, 0xf6, - 0xbd, 0xe2, 0xc6, 0x12, 0x8b, 0xc2, 0x32, 0x9d, 0x01, 0x7b, 0x05, 0x0f, - 0xa5, 0x75, 0x0a, 0xa9, 0xbc, 0x5c, 0x51, 0x3d, 0xca, 0x9f, 0x2c, 0x00, - 0xb8, 0x24, 0x40, 0xc1, 0xcc, 0xf5, 0x3b, 0xb3, 0xae, 0x3a, 0x3c, 0x9f, - 0x65, 0x5f, 0x4d, 0xf5, 0x5b, 0x30, 0x6e, 0x16, 0xb9, 0x52, 0x8c, 0x56, - 0xa2, 0x06, 0xaf, 0xda, 0x23, 0xef, 0x1a, 0x08, 0x4d, 0xf1, 0xe0, 0x59, - 0xa2, 0xe9, 0x69, 0x7f, 0x8b, 0xb3, 0x60, 0x85, 0x18, 0xd6, 0x18, 0x2e, - 0xfb, 0x2c, 0x4d, 0x83, 0x68, 0xb8, 0x7f, 0x63, 0x15, 0x88, 0xa2, 0x8f, - 0xb9, 0x3c, 0xdb, 0x54, 0x91, 0xa9, 0x03, 0x8b, 0x62, 0xcc, 0x69, 0x98, - 0xa4, 0x3b, 0xec, 0xfb, 0x52, 0x4c, 0xf4, 0x82, 0xab, 0xb4, 0x02, 0x09, - 0x56, 0x41, 0xeb, 0x2f, 0xda, 0xab, 0x6b, 0x4a, 0x5b, 0x8e, 0x4a, 0x62, - 0x57, 0xc3, 0xde, 0xd5, 0xdf, 0x35, 0x3e, 0x3c, 0x6c, 0x86, 0x2d, 0x85, - 0xc0, 0xed, 0x69, 0x29, 0x8b, 0xd1, 0x86, 0xa4, 0x37, 0xff, 0xcb, 0x62, - 0x82, 0x72, 0x40, 0xed, 0x6b, 0x18, 0x49, 0x35, 0x04, 0xc8, 0xcb, 0x96, - 0x27, 0x5c, 0x6f, 0x80, 0x7f, 0x12, 0xed, 0x18, 0x17, 0x6c, 0x28, 0x4f, - 0x82, 0x2c, 0xc9, 0x7a, 0x50, 0x26, 0x41, 0x96, 0x9c, 0x4f, 0x69, 0x8c, - 0xd3, 0x32, 0xf5, 0x3a, 0x03, 0x20, 0xb0, 0x53, 0x6a, 0x0b, 0xae, 0x51, - 0x9f, 0x88, 0x04, 0x5b, 0xb1, 0xce, 0x34, 0x12, 0x78, 0xcc, 0x55, 0x27, - 0x28, 0xbb, 0x63, 0x38, 0xcb, 0xee, 0x46, 0x17, 0x89, 0x92, 0x3a, 0x47, - 0x11, 0x86, 0xdc, 0x06, 0x3f, 0xc4, 0xc1, 0x83, 0x89, 0x1b, 0x03, 0xc2, - 0x19, 0xe2, 0x93, 0x04, 0x45, 0xfa, 0xb9, 0xdd, 0x25, 0x85, 0xfe, 0x62, - 0x68, 0x85, 0xa4, 0xc7, 0xbc, 0xb2, 0x91, 0x3f, 0x39, 0x91, 0x30, 0x91, - 0xfb, 0x54, 0x37, 0xd2, 0x90, 0x8a, 0x9f, 0x20, 0x3a, 0x6f, 0x1f, 0xdb, - 0x5f, 0x2e, 0x5f, 0x26, 0x06, 0x37, 0xa0, 0x92, 0x38, 0x53, 0x76, 0xc0, - 0x9e, 0x79, 0x5e, 0xa9, 0x78, 0x7e, 0x77, 0x70, 0x83, 0xd4, 0xd1, 0x11, - 0x45, 0xbf, 0xa3, 0x65, 0x7a, 0x17, 0x76, 0xc6, 0x4f, 0x0e, 0x59, 0x83, - 0xf1, 0xc1, 0xc5, 0xf0, 0x5a, 0xd8, 0x21, 0x07, 0xdc, 0xb9, 0xca, 0x1e, - 0xa0, 0x78, 0xab, 0x7a, 0x12, 0x7a, 0x1d, 0x2a, 0x45, 0xfa, 0xd8, 0xdc, - 0xa7, 0x30, 0x36, 0x6c, 0x12, 0xad, 0xa3, 0xbc, 0xe3, 0xcb, 0xa5, 0x25, - 0x00, 0xef, 0x4a, 0xba, 0x42, 0x04, 0x0a, 0x73, 0x43, 0x00, 0x79, 0xa8, - 0xee, 0xdf, 0x71, 0x4d, 0x02, 0x2c, 0xb2, 0x0f, 0xe2, 0x85, 0x06, 0x91, - 0x31, 0x95, 0x51, 0xb8, 0x5c, 0xfd, 0x8e, 0x52, 0x1b, 0xbe, 0x01, 0xe5, - 0x4d, 0xf6, 0x8b, 0xc6, 0x9a, 0x0b, 0xcd, 0x44, 0x60, 0xab, 0x7c, 0x44, - 0xcb, 0x69, 0xbf, 0x60, 0x55, 0x87, 0x4c, 0xa5, 0x6b, 0xc2, 0x57, 0xe1, - 0xed, 0x9a, 0xa9, 0xcd, 0x0b, 0x31, 0xab, 0xf8, 0x35, 0x87, 0x1b, 0x3d, - 0xa5, 0xff, 0xf3, 0x0b, 0xdd, 0x90, 0x78, 0xbe, 0x8a, 0xef, 0xd8, 0x79, - 0x5c, 0x04, 0xd0, 0xac, 0x4e, 0x2c, 0x7d, 0x9c, 0x4e, 0x48, 0x7c, 0x36, - 0xb6, 0x20, 0xba, 0x70, 0x0a, 0xed, 0x26, 0x96, 0xad, 0xc8, 0xd8, 0x57, - 0x81, 0xc4, 0x3a, 0xbb, 0x95, 0x01, 0x97, 0xc4, 0x5e, 0xaf, 0x5d, 0x7f, - 0x7f, 0x47, 0x92, 0x5e, 0x26, 0xd2, 0x9a, 0x60, 0x2d, 0xb4, 0x8a, 0x27, - 0xb6, 0xe4, 0x8d, 0xc9, 0x49, 0xcb, 0x7c, 0xab, 0x7e, 0x0b, 0x51, 0x05, - 0xca, 0xfc, 0x7b, 0x70, 0x43, 0x04, 0x54, 0xb8, 0x11, 0x86, 0x7a, 0x77, - 0xb8, 0x35, 0x68, 0x1e, 0x8a, 0xb8, 0x57, 0xdb, 0x46, 0xe1, 0x2e, 0xfe, - 0x92, 0x97, 0xc0, 0x69, 0x5f, 0x89, 0x63, 0xf1, 0x75, 0xc6, 0xe8, 0x22, - 0x3d, 0x8b, 0x72, 0xff, 0xba, 0x6b, 0x03, 0x31, 0x35, 0x84, 0x1b, 0xdd, - 0xae, 0x2b, 0xaa, 0x89, 0xfe, 0xa9, 0x42, 0xa1, 0xc3, 0x4c, 0xe6, 0x79, - 0xe0, 0x07, 0xe9, 0xb8, 0x2e, 0xf8, 0x20, 0x1d, 0xe0, 0x6d, 0x6d, 0x26, - 0x09, 0x29, 0xf2, 0x9d, 0x2e, 0x8f, 0x5b, 0x73, 0xfd, 0xfe, 0xc7, 0xf2, - 0x91, 0x29, 0xae, 0x9d, 0xac, 0x86, 0x5c, 0x6f, 0x71, 0xc8, 0x13, 0x8c, - 0xd7, 0xdf, 0x6b, 0x53, 0xe7, 0x70, 0x24, 0x3e, 0xe7, 0xb0, 0x20, 0x28, - 0x8c, 0xfb, 0xa4, 0xd5, 0xd5, 0xfc, 0xc7, 0x98, 0x79, 0x9e, 0xbd, 0xd0, - 0x7e, 0xdb, 0x51, 0x20, 0x57, 0xe3, 0x7d, 0x81, 0x3b, 0x3f, 0xb8, 0x05, - 0x2f, 0xce, 0x78, 0xf9, 0xce, 0x8e, 0x9a, 0x17, 0x1d, 0x47, 0x0e, 0xd8, - 0x71, 0xe6, 0x5f, 0x1f, 0xe1, 0xea, 0xef, 0xb7, 0x58, 0xf3, 0xe7, 0xec, - 0x07, 0x9d, 0xd0, 0x6e, 0xb0, 0x3d, 0x82, 0xdb, 0x56, 0x8b, 0x66, 0xe4, - 0xaf, 0x82, 0xf2, 0xc5, 0xcb, 0x2e, 0x45, 0x0c, 0x4a, 0x34, 0x87, 0x07, - 0xf4, 0xfe, 0xbc, 0xd4, 0xa0, 0xbe, 0x69, 0x47, 0x96, 0x4d, 0x1e, 0xbf, - 0x23, 0x80, 0xb5, 0xd5, 0x01, 0xb8, 0x7a, 0xb7, 0x47, 0x3e, 0xc1, 0xb0, - 0xe1, 0xd2, 0x20, 0xce, 0xb6, 0x7f, 0x3d, 0x77, 0xde, 0xc6, 0x65, 0x85, - 0x44, 0xc3, 0xe2, 0x70, 0x4e, 0xde, 0x49, 0x22, 0xde, 0x43, 0xef, 0x4d, - 0x97, 0xde, 0x83, 0x41, 0xcc, 0x1c, 0x47, 0xbf, 0x10, 0xc8, 0xb3, 0xf8, - 0x38, 0xc0, 0xd9, 0x71, 0xd5, 0xaf, 0x9a, 0xf4, 0xba, 0xf3, 0xc2, 0x74, - 0x9f, 0x8e, 0x10, 0x1a, 0xed, 0x74, 0x02, 0xa3, 0xc2, 0x3c, 0x52, 0xd1, - 0x59, 0x1f, 0xd9, 0x95, 0x6b, 0xbe, 0xc4, 0xe9, 0x64, 0xe2, 0x70, 0xb6, - 0xe5, 0x1a, 0x29, 0x40, 0xab, 0xd2, 0xd1, 0x2c, 0xee, 0xe8, 0xff, 0x5c, - 0x01, 0xf2, 0xe2, 0xcf, 0xb2, 0xc4, 0xf0, 0x7e, 0x1d, 0x84, 0xdf, 0x88, - 0x0b, 0xad, 0x46, 0xbc, 0x9c, 0xf2, 0xc2, 0x38, 0x66, 0xdb, 0x63, 0x0a, - 0x16, 0x2e, 0xcf, 0x6d, 0x5a, 0xeb, 0x8d, 0x2e, 0xe3, 0xbc, 0x63, 0xfc, - 0x9c, 0xd7, 0xda, 0xfc, 0x85, 0x77, 0x08, 0x91, 0x32, 0x67, 0xb3, 0xf9, - 0x25, 0x4a, 0x4b, 0x2b, 0x37, 0x73, 0x43, 0xba, 0xc1, 0xb4, 0xdf, 0x64, - 0x6d, 0x88, 0xa5, 0x59, 0xcc, 0x12, 0x24, 0x23, 0xc4, 0xbe, 0xa9, 0x34, - 0xed, 0xd9, 0x24, 0x78, 0xdd, 0xb0, 0xc6, 0xec, 0x55, 0xae, 0xcd, 0x77, - 0x02, 0xf3, 0xc8, 0xd7, 0x4d, 0xbc, 0x28, 0xbf, 0xd7, 0x18, 0xb2, 0x1f, - 0xfe, 0x14, 0x59, 0x65, 0x42, 0xd8, 0x41, 0x09, 0xea, 0x0e, 0x11, 0xa6, - 0x64, 0x13, 0x6a, 0xa6, 0x0c, 0xfd, 0xf9, 0xdc, 0xf2, 0xc4, 0x8d, 0x7b, - 0x13, 0x0e, 0x11, 0xca, 0x48, 0xc4, 0xb8, 0xbc, 0xcb, 0xb3, 0x62, 0x39, - 0xaa, 0x92, 0x3c, 0x92, 0x36, 0x7e, 0x62, 0x22, 0xbe, 0x72, 0xa9, 0xeb, - 0x9d, 0x83, 0x26, 0x98, 0x43, 0xdb, 0x72, 0xe3, 0xcd, 0x90, 0x8a, 0x6f, - 0x5f, 0x88, 0x2e, 0x8d, 0xa6, 0xba, 0x2b, 0xb5, 0x28, 0x8d, 0x91, 0x4f, - 0x30, 0xf1, 0x2c, 0xfe, 0xeb, 0x4a, 0xb3, 0x28, 0x55, 0x48, 0x3d, 0x97, - 0xf5, 0x18, 0xbd, 0xba, 0x48, 0xff, 0xfe, 0x63, 0x51, 0xa1, 0x71, 0x16, - 0x11, 0xe9, 0xee, 0xa1, 0x18, 0x9f, 0x8d, 0xdd, 0x8f, 0x4d, 0xe1, 0x4d, - 0x1b, 0x5f, 0xfc, 0x9e, 0xcd, 0xef, 0x7e, 0x9c, 0x2d, 0xaa, 0x62, 0x06, - 0xec, 0x3f, 0xb5, 0x8a, 0x52, 0x24, 0x45, 0x14, 0x30, 0xf5, 0x24, 0x7b, - 0x23, 0xbb, 0x14, 0xb0, 0xf4, 0x97, 0x53, 0x9a, 0x3f, 0x0a, 0xa2, 0xfb, - 0x03, 0x14, 0xfd, 0x8b, 0xdf, 0x89, 0xdb, 0x10, 0xec, 0xf2, 0xea, 0x29, - 0xc4, 0x5e, 0xc8, 0xec, 0xed, 0x6a, 0x7d, 0x4d, 0x43, 0x99, 0xc6, 0x5a, - 0xd9, 0x71, 0x7d, 0x18, 0xee, 0xcb, 0x44, 0x36, 0xe3, 0xe1, 0x7c, 0x14, - 0xc5, 0xfe, 0xa3, 0xb6, 0x21, 0x74, 0xe7, 0x24, 0xf7, 0xd9, 0xdc, 0x4e, - 0x49, 0x7b, 0xb2, 0xb5, 0xdf, 0x70, 0x6a, 0xcd, 0xc6, 0xee, 0x62, 0x95, - 0x5c, 0x10, 0xe7, 0x71, 0x4c, 0x38, 0xc3, 0x1d, 0x9f, 0xf0, 0x77, 0x46, - 0xdc, 0xc1, 0x7e, 0xb0, 0x1d, 0x46, 0x81, 0xb6, 0xe5, 0x77, 0x00, 0x80, - 0x14, 0x52, 0xa1, 0x6e, 0xfc, 0x33, 0xb7, 0x70, 0xcf, 0xfb, 0x23, 0x49, - 0x74, 0xf8, 0x02, 0xd7, 0x72, 0x0c, 0x5a, 0xd5, 0xfa, 0xe6, 0x55, 0x66, - 0x08, 0x9c, 0x9a, 0x87, 0x44, 0x92, 0xa3, 0xa0, 0xe3, 0x9c, 0xdf, 0x4b, - 0x55, 0xff, 0x1c, 0xe7, 0xda, 0xdb, 0xc8, 0xa8, 0xa2, 0x89, 0x03, 0xd4, - 0xd9, 0xfd, 0xd9, 0xf3, 0x67, 0xde, 0xa1, 0x42, 0xa4, 0x05, 0xbf, 0xd6, - 0x4b, 0x3d, 0x6b, 0x30, 0xc5, 0xbf, 0xbb, 0xbb, 0x3c, 0xa5, 0xbc, 0x19, - 0x63, 0x0f, 0x32, 0x88, 0x8a, 0x2a, 0xa8, 0x91, 0xaa, 0x28, 0xb0, 0x6d, - 0x74, 0x19, 0xe4, 0x50, 0x3a, 0x71, 0x29, 0x7e, 0x77, 0xa5, 0x75, 0x77, - 0x04, 0x74, 0xae, 0xc1, 0xef, 0x51, 0xb7, 0x71, 0x2f, 0xae, 0x6c, 0x24, - 0x22, 0x03, 0xb4, 0xa5, 0x84, 0xdc, 0xfc, 0x79, 0x69, 0xbd, 0xf5, 0x32, - 0x82, 0xb1, 0x64, 0x18, 0xc1, 0x7a, 0x9b, 0x01, 0x6e, 0x34, 0xa4, 0x0a, - 0xa2, 0x1b, 0x26, 0x9a, 0x70, 0xb2, 0x7e, 0x4c, 0xa2, 0xf2, 0xfc, 0x6a, - 0x32, 0x47, 0x5d, 0x84, 0x7f, 0xe0, 0x90, 0xdc, 0x3c, 0x48, 0xff, 0xff, - 0x8a, 0x74, 0xf3, 0x98, 0x49, 0x25, 0x15, 0xa5, 0x12, 0x75, 0x1c, 0xfc, - 0xb0, 0x4b, 0x9d, 0x5b, 0x80, 0x95, 0x16, 0x4a, 0x66, 0x36, 0xc5, 0xe2, - 0x78, 0xdc, 0xce, 0x63, 0xd9, 0xfc, 0xb1, 0x40, 0x78, 0x91, 0x4e, 0x02, - 0xcf, 0x03, 0x68, 0x22, 0x96, 0x46, 0x76, 0x0b, 0x0e, 0x3d, 0x63, 0x20, - 0x32, 0x25, 0xf6, 0x9c, 0x42, 0xc7, 0x7b, 0x28, 0xdb, 0xcc, 0xef, 0xeb, - 0x81, 0x82, 0xb5, 0xdb, 0x43, 0xce, 0x28, 0x81, 0xd6, 0xfa, 0x05, 0x6a, - 0xaa, 0xa2, 0xe0, 0x37, 0xbc, 0x1b, 0x24, 0x93, 0x08, 0x40, 0x67, 0xfe, - 0xdb, 0xce, 0x81, 0x1c, 0xe0, 0x58, 0x2d, 0xc8, 0xde, 0x8a, 0x53, 0x6d, - 0xee, 0x59, 0x49, 0x87, 0x6a, 0x7c, 0x3b, 0x48, 0xdf, 0x26, 0xe9, 0xf6, - 0xc5, 0x0c, 0x63, 0x41, 0x44, 0x48, 0x92, 0xa8, 0x1a, 0x66, 0x64, 0xb3, - 0x8f, 0x51, 0xfa, 0x6b, 0x78, 0x83, 0x9f, 0x96, 0x58, 0xa9, 0x7b, 0x5e, - 0x1f, 0xaf, 0xde, 0x95, 0xa7, 0xa6, 0xc5, 0x09, 0x17, 0x9b, 0x76, 0x93, - 0xa7, 0xba, 0x52, 0x2d, 0xba, 0x80, 0x23, 0x24, 0x5c, 0x0d, 0x11, 0xc4, - 0xc6, 0x1d, 0x14, 0x5a, 0x08, 0xc5, 0xc7, 0x8b, 0x76, 0xba, 0x05, 0x5e, - 0xf2, 0x78, 0xca, 0xa3, 0x76, 0xec, 0x56, 0x76, 0xfd, 0x66, 0x8b, 0xa6, - 0x07, 0x7f, 0xa8, 0xde, 0xc4, 0x80, 0x5b, 0x78, 0xe9, 0xee, 0x4d, 0x37, - 0x31, 0xee, 0x49, 0xd6, 0x50, 0xa2, 0xdd, 0x81, 0x7a, 0x20, 0x0f, 0x3f, - 0x42, 0x30, 0x26, 0xa0, 0xc6, 0x7b, 0x91, 0xa6, 0x50, 0x87, 0x65, 0xd9, - 0x85, 0xdd, 0x73, 0x72, 0x5f, 0x26, 0x1f, 0x11, 0x7d, 0xed, 0xf1, 0xa5, - 0x4d, 0x9a, 0x11, 0xfa, 0x0b, 0xf0, 0xcf, 0xb4, 0x8d, 0xe4, 0x68, 0xf8, - 0xab, 0x81, 0x4c, 0xb3, 0x05, 0xea, 0x3f, 0x65, 0x4d, 0x94, 0x61, 0x94, - 0x00, 0x50, 0xa1, 0x24, 0xc0, 0xe9, 0x7c, 0x23, 0xce, 0xbe, 0x5d, 0x54, - 0x1a, 0x44, 0x82, 0x53, 0xb6, 0x83, 0x9f, 0x92, 0x32, 0x0c, 0xf2, 0xac, - 0xef, 0x92, 0x37, 0x52, 0xe1, 0xa0, 0x94, 0xe0, 0xd6, 0x3f, 0x04, 0x57, - 0xb7, 0x22, 0xec, 0x6a, 0x28, 0xe1, 0xec, 0xd6, 0xae, 0x2a, 0x39, 0x2b, - 0x39, 0xe6, 0x9a, 0x77, 0x5d, 0xae, 0xc3, 0x75, 0x23, 0x6a, 0x8d, 0xae, - 0x49, 0xf3, 0xe1, 0x98, 0x44, 0xa2, 0x50, 0xb4, 0xb5, 0xdd, 0x77, 0xc6, - 0x00, 0x65, 0xe8, 0x7e, 0xe4, 0x0f, 0x31, 0xbd, 0x14, 0x9a, 0x87, 0x68, - 0x03, 0xf1, 0x30, 0x19, 0x7c, 0x7f, 0xcc, 0x42, 0x1b, 0x3c, 0x8b, 0xb5, - 0x44, 0x3f, 0x6e, 0xed, 0xd7, 0x75, 0xa4, 0x30, 0x26, 0x4d, 0x3d, 0x94, - 0x98, 0x27, 0x54, 0x29, 0x91, 0xf4, 0xf4, 0x6d, 0x22, 0x3c, 0x86, 0x84, - 0x9b, 0x91, 0x58, 0xe6, 0xfe, 0x0d, 0x44, 0xb5, 0xe0, 0x75, 0x48, 0x68, - 0x84, 0x7a, 0x81, 0xb0, 0xb7, 0x3e, 0x6f, 0xc8, 0x09, 0x2e, 0x60, 0x3a, - 0xaf, 0xa5, 0xbc, 0x32, 0x37, 0x4a, 0x2c, 0xa7, 0x9a, 0xbe, 0x45, 0xce, - 0x31, 0xcd, 0x07, 0x6f, 0xae, 0x1e, 0xa7, 0x5a, 0x45, 0x38, 0x9a, 0xf8, - 0x41, 0xe6, 0xa7, 0x58, 0x1b, 0x08, 0x70, 0x4f, 0xe5, 0x33, 0xc6, 0xc2, - 0x18, 0xd8, 0xba, 0x33, 0xbd, 0xef, 0x85, 0x06, 0xd3, 0x87, 0x87, 0x67, - 0x22, 0xfe, 0x6d, 0x34, 0x5c, 0x54, 0x31, 0xde, 0x46, 0xb7, 0xb2, 0x15, - 0xbd, 0x21, 0x0f, 0x8b, 0xde, 0xa9, 0x51, 0x88, 0xbf, 0x37, 0xd1, 0x94, - 0xf9, 0x9a, 0x21, 0x66, 0x66, 0x18, 0x6a, 0xf2, 0x3d, 0xf4, 0xec, 0x43, - 0xb0, 0xbe, 0xc3, 0xc6, 0x12, 0xc6, 0xe6, 0x91, 0xd1, 0x3f, 0xa6, 0x51, - 0xa5, 0x94, 0x5e, 0x00, 0x3c, 0xdf, 0xae, 0x94, 0xbf, 0xff, 0xfd, 0x34, - 0x68, 0x62, 0x87, 0xc2, 0x77, 0x64, 0x79, 0x61, 0x0e, 0xc4, 0x61, 0x14, - 0x2f, 0xc8, 0x57, 0x38, 0xfb, 0xe2, 0x3e, 0x09, 0x5b, 0x7a, 0x93, 0xce, - 0x06, 0xae, 0x27, 0xe5, 0x2d, 0x9b, 0x9b, 0xb0, 0x39, 0x59, 0x48, 0x92, - 0x6c, 0x86, 0xe1, 0xb5, 0x44, 0x34, 0xf1, 0xe0, 0xe0, 0xc5, 0x66, 0x52, - 0x19, 0x98, 0x2d, 0x98, 0xf9, 0xd5, 0x6e, 0x2b, 0xa0, 0x45, 0x4f, 0xc9, - 0x6b, 0xe8, 0xd4, 0x08, 0xf6, 0xaa, 0x61, 0xa2, 0x43, 0x16, 0xf1, 0x82, - 0x8f, 0x68, 0xf3, 0xf0, 0x9a, 0x12, 0x9b, 0x58, 0x0e, 0x52, 0x1c, 0x9b, - 0x62, 0x9f, 0xae, 0x2a, 0xf5, 0x3c, 0x8e, 0x5d, 0xce, 0x50, 0x0a, 0x86, - 0x49, 0x59, 0x84, 0x44, 0xdf, 0x7f, 0xb3, 0xd1, 0x46, 0x28, 0xc3, 0x4a, - 0x5e, 0x05, 0xd3, 0x03, 0xdc, 0x02, 0x15, 0x65, 0xcc, 0x43, 0x1c, 0x25, - 0x4d, 0x01, 0xf9, 0xd9, 0xc5, 0x82, 0x89, 0x65, 0x52, 0x26, 0xa8, 0xa6, - 0x96, 0x65, 0x88, 0x7c, 0xa2, 0xc0, 0xf6, 0x22, 0xda, 0xb1, 0xac, 0xb3, - 0xed, 0xf3, 0x82, 0xf6, 0x30, 0x45, 0x0f, 0x65, 0x77, 0xe1, 0x5f, 0x43, - 0x3c, 0x3c, 0x02, 0xc1, 0xae, 0x1e, 0xbb, 0x07, 0x99, 0xd9, 0xba, 0x2f, - 0x47, 0xdb, 0xa3, 0xd9, 0x35, 0xdc, 0x08, 0x18, 0x7e, 0xf1, 0x56, 0xea, - 0x0f, 0x1e, 0x9a, 0x74, 0x2d, 0x7c, 0xf7, 0xc3, 0x8f, 0x79, 0x60, 0x1b, - 0x8c, 0xfa, 0xec, 0x2d, 0xb0, 0xb6, 0x86, 0xa9, 0xb8, 0x6f, 0xb6, 0xf6, - 0x81, 0xff, 0x84, 0xf0, 0xb1, 0xb3, 0x9b, 0xb9, 0x92, 0x13, 0x18, 0xc3, - 0xda, 0x8a, 0x9b, 0x33, 0x8d, 0x9a, 0xb3, 0x9e, 0x43, 0x87, 0x97, 0x44, - 0x3a, 0xec, 0x36, 0x62, 0x3e, 0x3d, 0x49, 0xbc, 0x23, 0xfb, 0x1a, 0xb9, - 0x52, 0xf4, 0x9b, 0xe6, 0x86, 0xbd, 0x49, 0xc7, 0x1f, 0x42, 0xa7, 0x49, - 0x0e, 0xb6, 0xd5, 0x01, 0x3e, 0x74, 0x2b, 0x77, 0xc1, 0xeb, 0x9c, 0xb5, - 0x11, 0x03, 0x8a, 0xc6, 0x09, 0xcb, 0x48, 0xe3, 0x97, 0x6c, 0x8a, 0x10, - 0xe3, 0x57, 0xe3, 0x47, 0xd5, 0x55, 0x91, 0x80, 0x74, 0xe5, 0xac, 0x8e, - 0xaa, 0x87, 0x7a, 0xa8, 0xb8, 0xe7, 0xff, 0xc8, 0xea, 0x4a, 0x4d, 0x5e, - 0x05, 0x45, 0x6f, 0x44, 0x39, 0x1f, 0x0d, 0xd5, 0xfa, 0x9b, 0x17, 0x35, - 0x03, 0x55, 0x6b, 0x02, 0x2f, 0x34, 0xe8, 0xbf, 0x69, 0x62, 0x4f, 0x71, - 0x9c, 0x7d, 0x52, 0xe5, 0x17, 0xf3, 0xd7, 0xea, 0x51, 0x7e, 0x2a, 0xd6, - 0xfc, 0xc5, 0x72, 0x5a, 0x14, 0xf9, 0x3a, 0xaa, 0xb3, 0xc5, 0x91, 0x4d, - 0xed, 0x63, 0x5d, 0xbd, 0x7a, 0x5a, 0x51, 0x00, 0xa9, 0x61, 0x76, 0xf2, - 0x3e, 0x21, 0x81, 0xc0, 0xec, 0x4e, 0x17, 0xe4, 0xae, 0xc5, 0xad, 0x2f, - 0xb7, 0x14, 0xc2, 0x57, 0xc5, 0x17, 0xc4, 0xe9, 0x35, 0x87, 0xf1, 0x9b, - 0x54, 0xf9, 0x82, 0xd8, 0x11, 0x5a, 0x2f, 0xc8, 0x9b, 0x4b, 0xca, 0xa4, - 0xb8, 0x17, 0x02, 0x85, 0xa1, 0x09, 0xd7, 0x5a, 0xad, 0x9a, 0xa6, 0x40, - 0x79, 0xe2, 0x58, 0xdb, 0x3d, 0x0f, 0xe6, 0x53, 0xda, 0x39, 0x4e, 0x31, - 0xf7, 0xee, 0x6b, 0x6f, 0x2d, 0x08, 0x08, 0x02, 0x6f, 0x81, 0xd7, 0xff, - 0x90, 0x4a, 0xa1, 0x6e, 0x29, 0x0e, 0x5c, 0xdb, 0xc0, 0x44, 0x9b, 0x67, - 0x1d, 0x21, 0x7b, 0xf6, 0x08, 0xe3, 0xb6, 0xd8, 0xbf, 0x3b, 0xe4, 0xdd, - 0xf1, 0x2d, 0x62, 0x34, 0x8b, 0x8a, 0x47, 0x76, 0x41, 0x23, 0xb7, 0x8f, - 0x76, 0x44, 0x60, 0x9d, 0x14, 0x94, 0x67, 0x62, 0x5c, 0x2f, 0x72, 0x67, - 0xdf, 0x6a, 0xa1, 0x1a, 0xa3, 0x0e, 0x83, 0xe2, 0x08, 0x34, 0xc1, 0x97, - 0xc1, 0x3c, 0x0e, 0xc0, 0x0c, 0x3b, 0x32, 0x6e, 0x1a, 0x25, 0x03, 0xc2, - 0x3b, 0x92, 0xdc, 0x2c, 0x93, 0xc6, 0xad, 0xe5, 0x63, 0xb2, 0x0c, 0x3f, - 0x43, 0x33, 0xaa, 0x75, 0x05, 0xe8, 0x9c, 0xec, 0xfd, 0x2a, 0x96, 0x6a, - 0xc6, 0xcc, 0xbc, 0x8d, 0x7e, 0x1f, 0x9c, 0x6d, 0x47, 0x79, 0x8b, 0x78, - 0x2c, 0x13, 0x38, 0x4f, 0xbb, 0x2f, 0x1b, 0x4f, 0x13, 0x3d, 0x0e, 0x6b, - 0x30, 0x8d, 0x52, 0x71, 0xab, 0x6d, 0x5e, 0x3b, 0x03, 0xc7, 0x92, 0x7f, - 0x9e, 0xa7, 0x06, 0xd4, 0x10, 0x41, 0xd4, 0xd7, 0xf9, 0xbf, 0x2d, 0xb2, - 0x38, 0x8b, 0x6b, 0x83, 0x64, 0xfe, 0x2b, 0x1b, 0x34, 0xa1, 0x03, 0xca, - 0x94, 0xfb, 0x0a, 0xf1, 0x44, 0xf2, 0x9c, 0x69, 0x7a, 0x75, 0xa7, 0x87, - 0x2b, 0x27, 0xb9, 0x47, 0xed, 0x12, 0x09, 0x1d, 0x0d, 0xf1, 0x49, 0x9b, - 0xee, 0x68, 0xdd, 0xc0, 0x8d, 0x71, 0xa4, 0x01, 0xa2, 0xd8, 0xf4, 0x8b, - 0x58, 0xf2, 0xd4, 0xfc, 0x5b, 0x77, 0xff, 0xe3, 0x44, 0xb6, 0xd6, 0x0f, - 0x8a, 0x1b, 0x84, 0x8d, 0x6f, 0x2a, 0x3d, 0xeb, 0x09, 0x92, 0x5d, 0xe7, - 0xcb, 0x76, 0xa9, 0x92, 0x3b, 0x8f, 0x37, 0x2a, 0x95, 0xb5, 0xf3, 0x44, - 0xd2, 0x9c, 0x87, 0xd8, 0x65, 0x5b, 0x55, 0xbe, 0x24, 0xa3, 0x8c, 0x48, - 0xa8, 0xc9, 0xe7, 0x55, 0x4a, 0xfd, 0x8f, 0xa1, 0xcb, 0xe1, 0xcf, 0x08, - 0x89, 0xc7, 0x2a, 0xa6, 0xaa, 0xb9, 0xf1, 0x74, 0xa6, 0xbd, 0x6f, 0x9e, - 0x0e, 0x24, 0x73, 0x27, 0xf6, 0xc3, 0xe2, 0x1a, 0xd4, 0x85, 0x45, 0x54, - 0x60, 0x4b, 0xa2, 0xe7, 0x15, 0xe1, 0x94, 0x57, 0xf6, 0x2f, 0x4f, 0x29, - 0x75, 0xf8, 0x5f, 0xea, 0x18, 0x0c, 0xc5, 0xd4, 0x0a, 0x3e, 0x8c, 0x28, - 0xbe, 0x21, 0xf4, 0x6b, 0x29, 0x93, 0x37, 0x19, 0x8a, 0xd5, 0xa9, 0x33, - 0x65, 0xff, 0x6d, 0xeb, 0xb5, 0x73, 0x41, 0x19, 0x9e, 0x36, 0x9b, 0x9c, - 0x3b, 0x1e, 0x06, 0xa9, 0xd1, 0xdc, 0x16, 0x6c, 0x74, 0x34, 0xa2, 0x17, - 0x5e, 0x2c, 0xbf, 0xc6, 0x41, 0xf4, 0xa4, 0xa1, 0x83, 0xd2, 0x99, 0xf1, - 0x8c, 0xf6, 0xd2, 0xe8, 0x14, 0xc2, 0xb4, 0x8c, 0xfa, 0xf9, 0x77, 0x08, - 0x05, 0x55, 0x89, 0x3f, 0x6b, 0x8c, 0x24, 0x88, 0x22, 0x77, 0x63, 0x6f, - 0x2b, 0xea, 0x38, 0x18, 0x16, 0x05, 0x93, 0x26, 0x61, 0x61, 0x07, 0xf8, - 0x86, 0x7a, 0xa2, 0x41, 0xfc, 0x21, 0x21, 0x67, 0xcd, 0x4f, 0x8b, 0xad, - 0x87, 0xe7, 0x13, 0x85, 0x0d, 0xeb, 0x7e, 0xf2, 0x38, 0x21, 0x28, 0x1c, - 0x22, 0xaa, 0x71, 0xa4, 0xdc, 0xce, 0xaa, 0x39, 0x66, 0xcc, 0x05, 0x5b, - 0x7f, 0xbb, 0x4b, 0xe1, 0xfb, 0x3e, 0xa6, 0xdd, 0x1a, 0xd3, 0xdc, 0xc6, - 0x4f, 0x3a, 0x9a, 0x79, 0x11, 0x2d, 0x2a, 0x0b, 0xf3, 0x61, 0xdc, 0x88, - 0x3c, 0x53, 0xb7, 0xfb, 0x2c, 0xf9, 0xb3, 0x5c, 0xbd, 0xfb, 0x2b, 0x5d, - 0x0a, 0x28, 0xe1, 0x8e, 0x26, 0xed, 0x4d, 0x86, 0x7b, 0x73, 0xef, 0xd7, - 0x18, 0x74, 0xfc, 0x01, 0x17, 0x62, 0xdf, 0x0f, 0x4d, 0x06, 0x36, 0xb9, - 0xa6, 0xa7, 0xba, 0xaf, 0x38, 0x8b, 0x91, 0x0f, 0x29, 0x54, 0xc6, 0x42, - 0x0b, 0x56, 0xec, 0xa4, 0x97, 0x3a, 0x9b, 0x62, 0xdc, 0xc0, 0xef, 0x8a, - 0x6e, 0x88, 0xee, 0xb6, 0x35, 0xff, 0xf1, 0xe8, 0x5b, 0xd1, 0xa3, 0x81, - 0xc4, 0x26, 0x85, 0xf3, 0xcf, 0x5d, 0x3a, 0x7a, 0x43, 0x36, 0xee, 0x14, - 0xe0, 0x05, 0x14, 0xe9, 0x2f, 0x6b, 0xe6, 0x71, 0x13, 0x06, 0x81, 0x5d, - 0xd2, 0xf9, 0x65, 0xe0, 0x9e, 0x96, 0xf2, 0xa7, 0x64, 0x24, 0x5f, 0x3e, - 0x51, 0x98, 0xec, 0x69, 0xd4, 0x6e, 0xb3, 0x43, 0x4c, 0x62, 0x8e, 0xc3, - 0xea, 0x75, 0x1a, 0xd9, 0x3d, 0x4a, 0xfa, 0x38, 0x29, 0xaa, 0x96, 0x8b, - 0xeb, 0xe7, 0x47, 0xd5, 0x7e, 0x9b, 0x61, 0x7c, 0x7c, 0x98, 0x1e, 0xd8, - 0xcf, 0x67, 0x1f, 0xe5, 0xe4, 0x41, 0x76, 0xca, 0x7a, 0x15, 0xcb, 0xdf, - 0x53, 0xfd, 0xa3, 0x75, 0x3f, 0x4b, 0xe5, 0xf4, 0x76, 0x14, 0xbd, 0xa9, - 0x41, 0xf4, 0x39, 0x80, 0x36, 0x60, 0xef, 0xea, 0xba, 0xfa, 0x56, 0x80, - 0xe9, 0x58, 0x41, 0x8e, 0x01, 0x9f, 0x28, 0xa7, 0x0b, 0x7a, 0x91, 0x7f, - 0xf9, 0xf8, 0xef, 0x69, 0x05, 0xfd, 0x02, 0x54, 0xbf, 0x4f, 0x53, 0xda, - 0x79, 0x57, 0x93, 0x10, 0x16, 0x55, 0xa7, 0x4e, 0xfd, 0xc2, 0x64, 0xc1, - 0xa7, 0xc0, 0xa6, 0x2a, 0x55, 0xa8, 0xf2, 0x3d, 0x5a, 0xfb, 0xa1, 0x2d, - 0x10, 0x04, 0x8e, 0x48, 0xc1, 0x11, 0x6b, 0x0a, 0xa7, 0x78, 0x77, 0x7b, - 0x12, 0x01, 0x76, 0x22, 0xba, 0x3a, 0x83, 0x6f, 0x67, 0x68, 0x46, 0xb7, - 0x47, 0x0b, 0x8d, 0x71, 0x20, 0x1a, 0x5a, 0xba, 0x61, 0x37, 0x3c, 0xd0, - 0x12, 0xeb, 0x55, 0xf2, 0x4c, 0x33, 0x11, 0x75, 0xf3, 0x7d, 0xa5, 0xdb, - 0x88, 0xcc, 0xf7, 0x60, 0xf2, 0x0e, 0x16, 0xc0, 0xb1, 0xad, 0xa9, 0x95, - 0xc1, 0x6c, 0x0d, 0x61, 0x12, 0xd4, 0x15, 0x23, 0x6a, 0x0e, 0xaa, 0x32, - 0x57, 0xc0, 0x4c, 0x9a, 0x54, 0x3b, 0x17, 0xef, 0x06, 0xbf, 0xa4, 0xa5, - 0x1e, 0x57, 0x9d, 0x20, 0xac, 0x0a, 0xb8, 0x59, 0xeb, 0x0f, 0x15, 0x3b, - 0x78, 0xe4, 0x39, 0x04, 0xcc, 0x61, 0x73, 0xfd, 0x0b, 0x41, 0x74, 0xd2, - 0x81, 0xfc, 0xa1, 0x93, 0x14, 0xac, 0x46, 0x57, 0xbf, 0xd6, 0x31, 0x1d, - 0x0b, 0xd1, 0xd1, 0xdd, 0x69, 0x62, 0x74, 0x4f, 0x82, 0x84, 0x78, 0x75, - 0x81, 0x6c, 0x7d, 0x71, 0xb8, 0x01, 0xa5, 0xf1, 0x14, 0x6b, 0xcc, 0xe4, - 0x44, 0x51, 0x16, 0x3e, 0x02, 0x7f, 0x3b, 0x68, 0x23, 0x8c, 0x1e, 0x6f, - 0xd7, 0x3e, 0xe4, 0xd2, 0x9b, 0x99, 0x22, 0x74, 0x39, 0x14, 0x07, 0xc6, - 0xef, 0x7f, 0xab, 0x43, 0xc3, 0x03, 0x20, 0xfd, 0xa9, 0xc8, 0x1b, 0x28, - 0x6f, 0xf4, 0xf9, 0xcb, 0x40, 0x90, 0x37, 0xcf, 0xa4, 0x1e, 0x5c, 0x7a, - 0x30, 0x0e, 0xd4, 0x47, 0xc6, 0x70, 0xaa, 0x08, 0x39, 0xad, 0x25, 0x2f, - 0x24, 0xb2, 0x37, 0x56, 0x32, 0xec, 0xd9, 0xa3, 0x23, 0xf5, 0xc7, 0x8f, - 0x3a, 0x4a, 0x2a, 0x7c, 0x59, 0x34, 0x67, 0x0b, 0x8d, 0x5f, 0x1b, 0xe8, - 0x83, 0x59, 0xcb, 0x9e, 0xfc, 0x96, 0x29, 0xc2, 0x1c, 0x57, 0xf8, 0x4c, - 0xf5, 0xdd, 0xf1, 0xff, 0x7b, 0x92, 0x37, 0x17, 0x96, 0xa2, 0x7e, 0xfe, - 0x5c, 0x1a, 0xcb, 0xb4, 0xcd, 0xdc, 0x93, 0x92, 0x30, 0xea, 0x54, 0xbe, - 0x1f, 0x89, 0xde, 0xab, 0xdf, 0x08, 0x75, 0x20, 0x37, 0x19, 0x71, 0x8e, - 0xa6, 0xd5, 0x3c, 0xe2, 0x0b, 0x9e, 0x40, 0xae, 0xd5, 0x89, 0x43, 0xe2, - 0x1b, 0x31, 0x66, 0xa8, 0xae, 0x93, 0x38, 0xb2, 0xdb, 0x4f, 0x62, 0x94, - 0x33, 0x62, 0x73, 0x6a, 0x32, 0xff, 0x8f, 0x50, 0x9c, 0x65, 0xe2, 0x23, - 0x22, 0xab, 0x89, 0xd9, 0x68, 0x0b, 0x93, 0x42, 0x08, 0x35, 0x5a, 0x6e, - 0x5d, 0xf5, 0x74, 0xb1, 0x15, 0x11, 0x25, 0x47, 0x30, 0x7e, 0xdb, 0x7c, - 0xcc, 0x0e, 0xa4, 0x62, 0x95, 0x3d, 0x17, 0xd1, 0x69, 0xbd, 0xfa, 0x88, - 0xe1, 0xcb, 0x12, 0x6c, 0x8d, 0xd1, 0x35, 0x2c, 0x0e, 0x72, 0xd6, 0x57, - 0x57, 0x79, 0x0f, 0x68, 0xc3, 0x9c, 0x38, 0x08, 0x2a, 0xfc, 0x83, 0xbd, - 0x9c, 0xd3, 0x67, 0xa7, 0xdd, 0x4c, 0x36, 0x80, 0x3b, 0xab, 0x0c, 0xc4, - 0x36, 0xfd, 0x34, 0x83, 0xef, 0x87, 0x87, 0x8d, 0x8c, 0x5f, 0x9d, 0xbe, - 0x80, 0xc4, 0x8a, 0x93, 0x87, 0x40, 0x5c, 0xd9, 0x0c, 0x72, 0xa5, 0x8b, - 0xcd, 0xb6, 0x5b, 0xc9, 0x01, 0x81, 0x3f, 0x29, 0xc5, 0x98, 0x97, 0xab, - 0xfb, 0x15, 0xf7, 0x9a, 0x73, 0x10, 0x25, 0xff, 0xbb, 0xc0, 0xa8, 0xe1, - 0x06, 0xbc, 0xda, 0xaf, 0x7f, 0xdc, 0x90, 0x1a, 0xe0, 0x74, 0x0d, 0x38, - 0x64, 0xce, 0xc3, 0x32, 0xf2, 0xd7, 0x81, 0x5c, 0x90, 0xf4, 0x40, 0x8f, - 0x94, 0x89, 0x7e, 0x29, 0x35, 0x8b, 0xef, 0x8a, 0x8f, 0xa7, 0x4d, 0x2a, - 0xc1, 0x24, 0x77, 0xf3, 0x50, 0x78, 0xb5, 0xcb, 0x46, 0x1b, 0x30, 0xfb, - 0xc4, 0x5d, 0x7c, 0xd5, 0xea, 0x6f, 0x9c, 0x07, 0xc2, 0x88, 0x70, 0x78, - 0x5f, 0x9b, 0x6e, 0x51, 0x6d, 0x5d, 0xc8, 0x2d, 0xac, 0x32, 0x70, 0x7b, - 0x57, 0xbf, 0x2d, 0x85, 0x40, 0x48, 0xea, 0xd4, 0x85, 0x51, 0x5f, 0x37, - 0xc6, 0xbd, 0x48, 0xd3, 0x98, 0xe8, 0x97, 0x2d, 0x71, 0xd9, 0xd1, 0x18, - 0x67, 0xc9, 0x21, 0x64, 0xa0, 0xa4, 0x40, 0x69, 0x52, 0x55, 0x5a, 0x63, - 0x00, 0x1c, 0x83, 0xed, 0xf5, 0x6f, 0x73, 0x34, 0x03, 0xcd, 0x38, 0x4a, - 0xda, 0x0c, 0x4d, 0x15, 0xc4, 0x58, 0x45, 0xe2, 0x3e, 0xc8, 0xf1, 0x86, - 0x11, 0x81, 0x06, 0xb7, 0x70, 0x17, 0x32, 0xe8, 0xb4, 0x91, 0x78, 0xb3, - 0xe3, 0x12, 0x8e, 0xfc, 0x22, 0xe5, 0x24, 0x68, 0x75, 0x8e, 0xaa, 0x26, - 0x64, 0x28, 0xd5, 0x9c, 0x05, 0xc8, 0x47, 0xdb, 0xab, 0x12, 0xd9, 0x49, - 0xb0, 0xea, 0xb4, 0x57, 0x93, 0xa4, 0x7d, 0xad, 0x91, 0x4b, 0xbc, 0x02, - 0x64, 0xd8, 0xfd, 0xce, 0xc0, 0x34, 0x19, 0x72, 0xb2, 0x88, 0x63, 0xb3, - 0x21, 0xe5, 0xf7, 0xdf, 0xa0, 0x87, 0x3f, 0x4b, 0x9f, 0xd7, 0xb2, 0x6c, - 0x99, 0xd2, 0xbd, 0x10, 0xb7, 0xa5, 0x2f, 0x1b, 0x5f, 0x93, 0xeb, 0x92, - 0xaf, 0x0e, 0xe3, 0x46, 0xba, 0xe3, 0xf0, 0x47, 0x21, 0x03, 0x0c, 0x2e, - 0x41, 0xf0, 0x71, 0x1e, 0xe0, 0x42, 0x40, 0x58, 0x1d, 0x95, 0xd0, 0x43, - 0xe6, 0x6e, 0x4f, 0x14, 0x2e, 0xe7, 0xa4, 0x91, 0xa7, 0x2f, 0x90, 0x58, - 0x3f, 0x5f, 0xf1, 0x6d, 0x83, 0x89, 0x53, 0x85, 0xd0, 0x98, 0x47, 0xa1, - 0x4f, 0x27, 0x16, 0xbc, 0x49, 0x9a, 0x11, 0xd7, 0x63, 0xbd, 0xbd, 0xbf, - 0x7d, 0x0e, 0xf0, 0x31, 0x84, 0xbe, 0x34, 0x49, 0x96, 0x0e, 0xf5, 0x70, - 0x81, 0x0f, 0xcd, 0xe6, 0xa1, 0xde, 0x44, 0xa8, 0x01, 0x9f, 0x6a, 0xe1, - 0x77, 0xa9, 0xbc, 0x54, 0x24, 0xe9, 0xc2, 0x41, 0x1d, 0xb8, 0x36, 0xfc, - 0xc9, 0x29, 0x69, 0x7a, 0xf8, 0x22, 0x95, 0x53, 0x1c, 0xb0, 0xee, 0x77, - 0x8c, 0x74, 0x57, 0x0f, 0x82, 0x74, 0xaa, 0x46, 0x62, 0x2e, 0x46, 0x14, - 0x3b, 0xe9, 0x76, 0x16, 0x09, 0xeb, 0x1e, 0x1a, 0x24, 0x68, 0x7c, 0x7d, - 0x94, 0xb4, 0xc8, 0x75, 0xb5, 0xdb, 0x76, 0x65, 0x4b, 0xd5, 0x77, 0xc6, - 0x8c, 0x79, 0x53, 0x44, 0x03, 0x87, 0x86, 0x5b, 0x34, 0xad, 0xad, 0xe0, - 0x0c, 0x56, 0x9c, 0x29, 0x0a, 0xa2, 0xf2, 0x2f, 0x86, 0xaf, 0xb2, 0xa0, - 0x2e, 0xdd, 0xd3, 0xe5, 0x9b, 0x35, 0x8b, 0xfe, 0xb9, 0xe8, 0x55, 0x01, - 0xa8, 0xd7, 0x42, 0x4e, 0x0e, 0xad, 0x24, 0x9a, 0xbf, 0x2b, 0x35, 0x27, - 0xd2, 0x91, 0x83, 0xc3, 0x2e, 0x38, 0x49, 0xaa, 0x4d, 0x76, 0x42, 0x8b, - 0x05, 0x8f, 0x7b, 0xaa, 0xc9, 0x4f, 0xca, 0x8d, 0x9b, 0x48, 0x84, 0x25, - 0x41, 0x04, 0x85, 0x36, 0x07, 0x38, 0x9e, 0xd9, 0x3e, 0x3e, 0x08, 0xb4, - 0x8d, 0x44, 0x2b, 0x52, 0x00, 0xf4, 0x57, 0x8d, 0xd1, 0xb6, 0x4d, 0xc8, - 0xdb, 0xd5, 0x59, 0xa9, 0x61, 0xef, 0xf1, 0xcf, 0x48, 0x07, 0x9e, 0xd2, - 0xd6, 0x6d, 0xa3, 0xce, 0x2e, 0x18, 0xfd, 0x52, 0x90, 0xfc, 0x07, 0x49, - 0xc4, 0xfe, 0x2a, 0x75, 0x44, 0x0d, 0x2d, 0x0e, 0x53, 0xc3, 0x84, 0x36, - 0x95, 0x95, 0xd7, 0xaa, 0x34, 0xcd, 0x5f, 0x43, 0xde, 0xb5, 0xd1, 0x03, - 0x49, 0x80, 0xab, 0xcc, 0x3a, 0x32, 0xf9, 0xef, 0xaa, 0x6d, 0x08, 0xa1, - 0x6e, 0x0e, 0x09, 0xbe, 0x07, 0x00, 0x7b, 0xba, 0x45, 0x6c, 0x96, 0xf6, - 0xb6, 0x94, 0x7d, 0xf5, 0xfb, 0x4b, 0x7d, 0x40, 0x23, 0xee, 0xb6, 0x64, - 0x7b, 0xcd, 0x1a, 0xea, 0x44, 0xa7, 0x0a, 0xf1, 0x16, 0x46, 0x32, 0x2f, - 0xf0, 0x94, 0xb1, 0x9c, 0x50, 0x03, 0x3e, 0x8c, 0x33, 0x76, 0x88, 0x4c, - 0x70, 0x53, 0x42, 0xda, 0x65, 0xc9, 0xf8, 0x59, 0xf3, 0xe7, 0x2f, 0x9e, - 0x3c, 0xf2, 0x44, 0x2e, 0x4e, 0x51, 0xa1, 0x58, 0x27, 0x27, 0x92, 0x3b, - 0x68, 0x23, 0xc3, 0xb7, 0x16, 0xa4, 0x77, 0x33, 0x7f, 0x1d, 0x0b, 0x4b, - 0x63, 0x9a, 0x03, 0x82, 0xc6, 0x29, 0xe3, 0x3e, 0xd8, 0xad, 0xd2, 0xb0, - 0x69, 0x1a, 0xf8, 0x96, 0xef, 0x79, 0x62, 0x05, 0xe2, 0x9f, 0x3d, 0x5c, - 0x34, 0x59, 0xfd, 0xee, 0x80, 0x10, 0x49, 0x5f, 0xd6, 0xb2, 0xf6, 0xb6, - 0x40, 0x2a, 0xf9, 0x47, 0xe8, 0xbc, 0x92, 0x18, 0xef, 0x29, 0x47, 0x71, - 0x01, 0x87, 0x27, 0xde, 0xcf, 0xc5, 0x00, 0xf4, 0x33, 0x93, 0xb3, 0xcb, - 0x52, 0x12, 0xab, 0x28, 0x23, 0xbe, 0xc1, 0x4e, 0x9b, 0x13, 0x55, 0xbc, - 0x42, 0xfc, 0x86, 0x89, 0x38, 0xfa, 0xfc, 0x78, 0x7d, 0x66, 0x84, 0x6f, - 0x7a, 0xc2, 0xb5, 0x34, 0x15, 0x57, 0x25, 0x96, 0x5b, 0xc8, 0x1f, 0x1b, - 0x88, 0x99, 0x76, 0x66, 0x91, 0xe5, 0x7b, 0x35, 0x1c, 0xd7, 0x48, 0xf6, - 0x10, 0x28, 0x92, 0xa9, 0xdc, 0x23, 0x51, 0x58, 0x8a, 0x22, 0xf4, 0x04, - 0x8c, 0xe8, 0xb5, 0x51, 0x38, 0x94, 0xd6, 0x24, 0x22, 0x34, 0xc9, 0x19, - 0x10, 0x72, 0x5c, 0xbf, 0x6f, 0x43, 0xb8, 0x0e, 0x37, 0x6d, 0xa4, 0x0b, - 0x5a, 0xde, 0xc8, 0x04, 0x5d, 0x4c, 0x45, 0x37, 0x18, 0x4b, 0x98, 0x8e, - 0xa0, 0xc3, 0x43, 0x4c, 0xf0, 0x28, 0x41, 0x7a, 0xb0, 0xae, 0x82, 0xce, - 0x37, 0xb3, 0xaa, 0x08, 0x23, 0x0e, 0xa0, 0x3b, 0x50, 0x11, 0xfd, 0x77, - 0xad, 0x54, 0x89, 0xa1, 0xb1, 0x58, 0x59, 0x36, 0xfe, 0xf3, 0x0f, 0xd7, - 0xf8, 0xf8, 0x21, 0x5c, 0x57, 0xa4, 0x8d, 0xe4, 0xe3, 0xe4, 0xd8, 0x29, - 0x16, 0xe4, 0x02, 0x47, 0x24, 0x61, 0x88, 0x56, 0xa2, 0x21, 0x06, 0x3f, - 0xa2, 0xd2, 0xb9, 0x45, 0x7f, 0xd9, 0xb7, 0x58, 0x6a, 0xf1, 0x0c, 0x6f, - 0x77, 0x08, 0x2b, 0xe0, 0xf7, 0xff, 0xcb, 0x10, 0x33, 0xd7, 0x86, 0xd6, - 0xe0, 0x73, 0xa4, 0x22, 0xf7, 0xd5, 0x58, 0xbc, 0xcc, 0x45, 0x3c, 0x2d, - 0xf7, 0xe7, 0x2f, 0x7a, 0x0a, 0xde, 0x0b, 0x3c, 0xaf, 0x00, 0xe8, 0x04, - 0xa6, 0x23, 0x22, 0x13, 0x67, 0xe5, 0x69, 0x28, 0x9d, 0xfe, 0xd5, 0x98, - 0xf5, 0xa6, 0x8a, 0x33, 0x85, 0xd7, 0x93, 0x36, 0x0a, 0x28, 0x30, 0x3f, - 0xb5, 0x5f, 0x45, 0x13, 0x5c, 0x2d, 0x44, 0xcc, 0x3f, 0x96, 0xae, 0xe2, - 0x1f, 0x9b, 0x70, 0x2d, 0xa9, 0x76, 0x43, 0x56, 0x81, 0xa5, 0x0e, 0xab, - 0xfb, 0xab, 0xb3, 0xa5, 0xa3, 0xa1, 0x6a, 0xdb, 0x02, 0x8d, 0x60, 0x3e, - 0x8f, 0xf2, 0xe5, 0x10, 0x88, 0xfd, 0x1e, 0x16, 0x81, 0x04, 0x89, 0x93, - 0x0b, 0xf6, 0x53, 0xb5, 0x10, 0xbd, 0x4e, 0xf5, 0x53, 0x00, 0xd0, 0xfe, - 0x36, 0x57, 0xc4, 0x93, 0xfd, 0xd5, 0x24, 0x29, 0x34, 0xf7, 0xfc, 0x58, - 0x60, 0x0b, 0x20, 0xbb, 0xcb, 0x46, 0xba, 0x50, 0x16, 0x3c, 0x12, 0x16, - 0x9e, 0x75, 0xbf, 0x59, 0x4c, 0x73, 0x30, 0xb4, 0x6b, 0x8d, 0x77, 0x99, - 0x30, 0x13, 0x84, 0x94, 0xef, 0xd9, 0xe4, 0x7b, 0x35, 0x18, 0x1c, 0x33, - 0x40, 0x60, 0x68, 0xdc, 0xee, 0x27, 0xc1, 0x8b, 0x65, 0x6e, 0x56, 0x48, - 0x94, 0x2b, 0x07, 0x16, 0x29, 0xab, 0x39, 0xf2, 0x0c, 0x52, 0x1b, 0x13, - 0x3b, 0x22, 0x86, 0x8f, 0x85, 0x32, 0x9d, 0x53, 0xb4, 0x41, 0xbc, 0x81, - 0x2b, 0xf8, 0x74, 0x75, 0x4c, 0x2d, 0x0f, 0xb6, 0x5b, 0xcf, 0x37, 0x74, - 0x37, 0x68, 0xfa, 0x23, 0x92, 0xec, 0xe6, 0x2a, 0xb7, 0x82, 0xb5, 0xfa, - 0xff, 0xdb, 0x35, 0x71, 0xba, 0x05, 0x3a, 0x91, 0x52, 0x78, 0xac, 0x82, - 0xe2, 0x07, 0x69, 0xa1, 0x5c, 0x89, 0xdd, 0xae, 0x07, 0x7b, 0x72, 0x10, - 0x33, 0x70, 0xa2, 0x76, 0xa1, 0x15, 0x11, 0xb6, 0x00, 0xb6, 0xa2, 0x9a, - 0xd0, 0x12, 0xe7, 0xfc, 0xe4, 0xb8, 0xce, 0xb1, 0xb1, 0xb2, 0x9c, 0x09, - 0x15, 0x15, 0xeb, 0xeb, 0x78, 0xe2, 0xbd, 0x78, 0xe8, 0x43, 0xc9, 0xe1, - 0xe8, 0x0e, 0x7c, 0xc5, 0x5a, 0x71, 0x48, 0x0e, 0x75, 0x5e, 0x58, 0x24, - 0x41, 0xb1, 0x21, 0xb6, 0xa6, 0x0b, 0x1f, 0xc2, 0xd9, 0xd0, 0xc0, 0x3c, - 0x63, 0x54, 0x05, 0x83, 0x5f, 0xb8, 0x95, 0x13, 0xe0, 0x26, 0xa7, 0xe4, - 0x67, 0x6f, 0x45, 0xbe, 0x99, 0xf5, 0x4c, 0xc4, 0x33, 0x07, 0x26, 0x96, - 0xba, 0x4c, 0x8d, 0xf5, 0x75, 0x4c, 0x77, 0x02, 0x93, 0xa8, 0x38, 0xec, - 0xbc, 0x30, 0x3a, 0x1a, 0xe5, 0xf0, 0x7f, 0x39, 0xde, 0xe4, 0xda, 0x3f, - 0xf9, 0x06, 0x06, 0xe1, 0xd4, 0x8d, 0x58, 0x7f, 0xc5, 0x08, 0xa5, 0x67, - 0x89, 0x7a, 0xf4, 0x19, 0x23, 0x1d, 0x29, 0x92, 0xf9, 0x78, 0x38, 0x39, - 0x16, 0x8b, 0x1d, 0x25, 0x2d, 0x31, 0xb0, 0x8d, 0xaf, 0x93, 0x65, 0x69, - 0x2f, 0x70, 0xaa, 0xd1, 0x51, 0xca, 0xdc, 0xce, 0x36, 0x72, 0xc2, 0x81, - 0x5c, 0xa6, 0xd4, 0x6b, 0x22, 0xcf, 0xc3, 0xc9, 0x55, 0x29, 0xf5, 0x35, - 0x22, 0x4f, 0x23, 0x6d, 0x21, 0x86, 0xdb, 0xbb, 0xd5, 0x1c, 0x33, 0x84, - 0xa0, 0x5f, 0x93, 0xfb, 0xaa, 0x4d, 0x09, 0xee, 0x7b, 0xaa, 0x2c, 0xb3, - 0xfa, 0x3f, 0xbc, 0xcf, 0x74, 0xfe, 0x88, 0x88, 0x5f, 0x04, 0xc8, 0xad, - 0x1f, 0x63, 0xbe, 0xd0, 0x71, 0x41, 0xf2, 0x36, 0xf9, 0xdf, 0x3c, 0x07, - 0xba, 0x03, 0x96, 0xe1, 0x67, 0x8d, 0x43, 0x1d, 0xdc, 0x35, 0xe5, 0x3c, - 0x3a, 0x9c, 0x3f, 0x07, 0x2c, 0x12, 0xcf, 0x0d, 0x6e, 0x50, 0x20, 0xda, - 0x2e, 0x7e, 0xda, 0x67, 0x8e, 0x01, 0x74, 0xb7, 0x76, 0xef, 0xd4, 0xa8, - 0x05, 0x2d, 0x4d, 0xea, 0x4a, 0x93, 0x15, 0xb4, 0x3f, 0x6b, 0x2b, 0xf8, - 0x17, 0x45, 0x4d, 0x1d, 0xf4, 0xc2, 0x95, 0xff, 0x23, 0xe7, 0x46, 0x2c, - 0x5c, 0x71, 0x9a, 0x4e, 0xf8, 0xaa, 0x48, 0x7a, 0x78, 0xe5, 0x43, 0xdf, - 0xba, 0xb9, 0x29, 0x78, 0xd6, 0xca, 0xfb, 0x5c, 0xef, 0xea, 0x8e, 0xbc, - 0xe8, 0x80, 0x8b, 0xad, 0xa1, 0xeb, 0x0a, 0x58, 0x1d, 0xf9, 0x5b, 0x05, - 0x34, 0xb8, 0xbc, 0xd4, 0xeb, 0x55, 0x49, 0xa7, 0xf5, 0xb7, 0xdb, 0x22, - 0x55, 0xe3, 0xc8, 0xfc, 0x81, 0x2a, 0x4b, 0x93, 0x8c, 0x20, 0xf4, 0x7f, - 0x86, 0x8d, 0xf2, 0xe6, 0x72, 0xfc, 0x47, 0x8b, 0x91, 0x8e, 0x6d, 0x64, - 0xa3, 0x20, 0x72, 0x3f, 0xa8, 0x4c, 0xc5, 0x63, 0x59, 0xe8, 0x43, 0x22, - 0x5d, 0xf3, 0x80, 0x60, 0x1d, 0xb3, 0x9b, 0x6c, 0x8c, 0xb3, 0xe5, 0x88, - 0xfd, 0xf9, 0xc3, 0xee, 0x86, 0xa9, 0x8c, 0x03, 0x2d, 0xfc, 0x35, 0x9a, - 0x6a, 0xe6, 0xdd, 0x05, 0x94, 0x04, 0x9f, 0x42, 0x70, 0x7b, 0x27, 0xd5, - 0xa1, 0xa8, 0x22, 0x87, 0x1d, 0x2d, 0x12, 0xe9, 0xa0, 0xf0, 0xb8, 0xcc, - 0x01, 0xa2, 0x86, 0xda, 0x9f, 0xbe, 0xe6, 0x63, 0x89, 0x8b, 0xb9, 0x40, - 0xc7, 0x77, 0x49, 0x5e, 0xd7, 0xf7, 0xb5, 0xc6, 0xdb, 0xab, 0x37, 0x73, - 0x3b, 0x61, 0x97, 0xe5, 0x07, 0x26, 0xd6, 0xa3, 0x05, 0x4e, 0xe9, 0x39, - 0x68, 0x84, 0x6a, 0x2c, 0x0c, 0x0c, 0x0a, 0xc8, 0xda, 0x09, 0x51, 0x45, - 0xfa, 0x79, 0xd0, 0x3c, 0x36, 0xd3, 0x3e, 0xe0, 0x4f, 0xee, 0x0d, 0xde, - 0xa6, 0x24, 0x37, 0x1b, 0xd8, 0x93, 0x29, 0x7d, 0x6c, 0x2a, 0xec, 0xbc, - 0x06, 0xfd, 0x54, 0x1f, 0x5d, 0x24, 0x06, 0x8a, 0xcf, 0xbe, 0x06, 0xd3, - 0x1d, 0x8b, 0x9f, 0x17, 0xfb, 0x9a, 0x9b, 0xdf, 0x74, 0x74, 0x5d, 0x3e, - 0x65, 0x7d, 0x24, 0x01, 0xd7, 0x05, 0x97, 0xae, 0x7e, 0xc0, 0xd3, 0x46, - 0x20, 0xdc, 0x4f, 0x9e, 0x5c, 0xdd, 0x0b, 0xf2, 0x57, 0xed, 0xeb, 0xd1, - 0xc9, 0x50, 0xb3, 0xf7, 0x2a, 0x2b, 0x7b, 0x3d, 0xd5, 0x5b, 0xb9, 0x15, - 0xaa, 0xb8, 0xa7, 0x37, 0x23, 0xb1, 0x40, 0xe1, 0x4f, 0x2f, 0xd8, 0x97, - 0xa5, 0x25, 0x11, 0x82, 0xf6, 0xec, 0xc9, 0x94, 0x53, 0x1c, 0xb8, 0x0b, - 0xf7, 0xfb, 0xc1, 0xd2, 0x75, 0x07, 0x42, 0xee, 0xb1, 0xbc, 0x3d, 0x1d, - 0x96, 0x0b, 0x87, 0xd8, 0xab, 0x19, 0x46, 0x76, 0xcb, 0x4e, 0x70, 0xe1, - 0x75, 0x36, 0x9c, 0x30, 0x41, 0xd0, 0x11, 0xb8, 0x74, 0xd6, 0x8c, 0x03, - 0x1e, 0x66, 0xf5, 0xef, 0xa6, 0x3c, 0x3d, 0x6c, 0xb2, 0x87, 0x39, 0xea, - 0x64, 0x51, 0x74, 0x7e, 0x95, 0xe1, 0xfd, 0xd6, 0x0e, 0x17, 0x5c, 0x71, - 0xef, 0x2c, 0x8b, 0x4f, 0x98, 0xea, 0x15, 0x4d, 0x08, 0x1a, 0x80, 0x6b, - 0x86, 0x55, 0xc6, 0x0d, 0x3b, 0x04, 0xf2, 0xcf, 0xe1, 0xce, 0x93, 0xe7, - 0x14, 0x91, 0x79, 0xc8, 0x3c, 0x67, 0xe4, 0xb4, 0xb2, 0x99, 0x89, 0x7c, - 0x84, 0xd9, 0xe4, 0x5c, 0xe9, 0x13, 0x2d, 0x28, 0x28, 0xd6, 0x82, 0x87, - 0x4b, 0xe3, 0x02, 0xc7, 0x56, 0xeb, 0x04, 0x05, 0xc2, 0xbf, 0xb2, 0xf9, - 0x56, 0xb1, 0x9e, 0x61, 0xf7, 0xe8, 0x2a, 0x20, 0x01, 0x5a, 0xe0, 0x66, - 0x94, 0xfb, 0xd1, 0xb5, 0x56, 0xb3, 0xc7, 0x0b, 0x97, 0xa0, 0xc7, 0x8c, - 0xe8, 0xcf, 0x0c, 0xc1, 0xb5, 0x06, 0x5f, 0x03, 0x10, 0x36, 0xd7, 0x9f, - 0x87, 0xc3, 0x7d, 0x2d, 0xd4, 0xd0, 0x15, 0x08, 0x71, 0x2f, 0x0d, 0x15, - 0x82, 0x97, 0xfb, 0x55, 0xff, 0x84, 0xea, 0x52, 0x44, 0x82, 0xc3, 0x0b, - 0x22, 0x5a, 0xb9, 0x98, 0xe7, 0x18, 0x7c, 0x27, 0x16, 0xb3, 0x04, 0xd4, - 0xba, 0x84, 0x4a, 0xdc, 0x42, 0x52, 0xe5, 0x86, 0xed, 0x4a, 0x9e, 0x78, - 0x9a, 0x3c, 0x16, 0xc9, 0x93, 0x24, 0xf4, 0x4e, 0x98, 0x5e, 0xc0, 0x05, - 0x90, 0xd0, 0x87, 0x4c, 0x51, 0xdc, 0xfc, 0x19, 0x54, 0xb8, 0x21, 0x9b, - 0xf1, 0x2a, 0x42, 0x12, 0xb2, 0x57, 0x28, 0x71, 0x1e, 0x7b, 0x4d, 0x7f, - 0x94, 0xa2, 0x46, 0x2b, 0x65, 0x59, 0x15, 0xc4, 0xcb, 0x40, 0x0c, 0xa9, - 0xb1, 0x6d, 0x62, 0x2b, 0x60, 0x24, 0x2d, 0x66, 0x73, 0xaa, 0xc8, 0x90, - 0x15, 0xa8, 0x50, 0x1d, 0xa4, 0x95, 0x7a, 0x3c, 0x2c, 0xaf, 0xad, 0x99, - 0x9d, 0xf7, 0xee, 0xe8, 0x9c, 0x19, 0xc1, 0x6e, 0x0c, 0xad, 0x36, 0xa9, - 0x84, 0x8b, 0x0e, 0x7c, 0xc7, 0x4e, 0xd2, 0x2b, 0x00, 0x56, 0xec, 0x29, - 0xc5, 0x0d, 0x95, 0x20, 0x0d, 0x23, 0x11, 0xac, 0x8d, 0xb2, 0xb0, 0x6e, - 0xe0, 0xaf, 0x75, 0xcb, 0xfc, 0xfb, 0x6e, 0xd2, 0x24, 0x41, 0xf2, 0x96, - 0x7b, 0x07, 0x2a, 0xdd, 0xd2, 0xe1, 0xbf, 0xad, 0x6b, 0x37, 0x9e, 0xe0, - 0x1c, 0x29, 0x30, 0xdc, 0x75, 0xc8, 0xc4, 0xa5, 0x0d, 0xb1, 0x13, 0xea, - 0xa2, 0x32, 0x54, 0x03, 0xf3, 0x79, 0x48, 0x94, 0x02, 0x06, 0x0e, 0x0d, - 0x15, 0x22, 0xa2, 0x0f, 0x73, 0x7d, 0xe4, 0x6c, 0x81, 0x5d, 0xae, 0xc0, - 0xf1, 0x31, 0x4a, 0x2d, 0xe6, 0x44, 0x73, 0x89, 0x5a, 0xb8, 0x94, 0x19, - 0xd9, 0x2e, 0xc3, 0xcb, 0x28, 0x5b, 0x71, 0x2b, 0xf5, 0xf0, 0xe6, 0x9d, - 0xb2, 0xa9, 0x62, 0xec, 0x37, 0xf1, 0xd0, 0x10, 0x22, 0xfc, 0x33, 0xcc, - 0x4a, 0xf2, 0x07, 0x8a, 0x3e, 0x4d, 0xb6, 0x1a, 0xd5, 0x24, 0x69, 0xf3, - 0x7c, 0x82, 0x30, 0xce, 0x64, 0xb3, 0x4f, 0x46, 0x74, 0x5a, 0xf6, 0x51, - 0xe6, 0x07, 0xdb, 0x5d, 0x00, 0xf0, 0xd9, 0x97, 0x85, 0x1d, 0x0c, 0xd5, - 0x9f, 0x79, 0x7d, 0x27, 0x06, 0xfa, 0x70, 0x2b, 0x27, 0xd9, 0xce, 0x93, - 0x93, 0xdd, 0xb4, 0xa9, 0xf2, 0xb8, 0x83, 0xa0, 0xe5, 0x96, 0x02, 0x7b, - 0xc3, 0xdf, 0x22, 0x71, 0xf3, 0xb2, 0x92, 0xb6, 0xd8, 0x2f, 0x90, 0x3f, - 0xdb, 0x9a, 0xc1, 0x5f, 0x13, 0x45, 0x34, 0x93, 0x34, 0x7f, 0xa3, 0xeb, - 0x19, 0xe7, 0xfa, 0xeb, 0x25, 0x12, 0x57, 0x9a, 0x08, 0x2d, 0xa9, 0x1b, - 0xe9, 0x18, 0x9e, 0x49, 0xab, 0x46, 0xa7, 0x70, 0xa4, 0x9d, 0xd3, 0xcd, - 0x66, 0x21, 0xf1, 0x2a, 0xbd, 0x07, 0xf3, 0xa9, 0x11, 0x70, 0xed, 0x32, - 0xc2, 0xa0, 0xea, 0x8c, 0x2b, 0xb8, 0xfa, 0xcb, 0xeb, 0x16, 0xf9, 0x1e, - 0xe6, 0x45, 0x06, 0x6a, 0x54, 0xa5, 0x34, 0xef, 0x7c, 0x8f, 0xdd, 0x9a, - 0xf8, 0xc6, 0x2e, 0x16, 0xec, 0xac, 0x92, 0xef, 0x40, 0xf5, 0x46, 0xc1, - 0xdf, 0x6a, 0xd0, 0x0a, 0x66, 0xeb, 0x62, 0x81, 0xfc, 0x16, 0x65, 0x52, - 0x8e, 0xb7, 0xbe, 0xfa, 0xc5, 0xf2, 0xc4, 0x17, 0x75, 0x13, 0x15, 0x4b, - 0x76, 0x05, 0xe0, 0xcd, 0x93, 0x9a, 0xb1, 0xed, 0x43, 0x7d, 0x9e, 0x18, - 0x90, 0xcd, 0x90, 0x49, 0x3c, 0xc3, 0x91, 0x4e, 0xd7, 0xbc, 0x1c, 0x8c, - 0x24, 0x46, 0x2c, 0xb0, 0x26, 0x64, 0x42, 0xa4, 0xbf, 0xa9, 0xec, 0xd9, - 0x9a, 0x00, 0xb4, 0x9d, 0xb3, 0x80, 0x2b, 0x59, 0xf4, 0x6e, 0x5a, 0x1e, - 0x48, 0x4b, 0x04, 0xc6, 0xb8, 0x32, 0xfa, 0x77, 0x65, 0xfd, 0x2c, 0x95, - 0x69, 0xad, 0x89, 0x69, 0x60, 0x2c, 0x54, 0x90, 0x53, 0x49, 0x95, 0x08, - 0xaf, 0xea, 0x07, 0x75, 0xe3, 0x92, 0x44, 0x67, 0x97, 0x07, 0xc7, 0xc7, - 0xd1, 0xef, 0xf8, 0xfc, 0x2b, 0xda, 0x03, 0x92, 0x8e, 0x6a, 0x68, 0x86, - 0x11, 0x6b, 0xd0, 0x05, 0xce, 0xf9, 0x69, 0x99, 0x08, 0xd4, 0x34, 0x36, - 0x3a, 0xb4, 0x2a, 0xbd, 0x35, 0x3c, 0x23, 0x26, 0x1e, 0x71, 0x10, 0xb9, - 0x86, 0xe6, 0x15, 0x0c, 0xe4, 0x10, 0xc7, 0x84, 0x4c, 0x23, 0x98, 0xd4, - 0x23, 0x33, 0x72, 0x02, 0xee, 0x20, 0xfd, 0xe4, 0x3e, 0xdc, 0x4f, 0x88, - 0xef, 0xdf, 0xa0, 0xb3, 0x66, 0x89, 0x2c, 0xce, 0x89, 0x37, 0x84, 0x73, - 0x12, 0x20, 0xd3, 0xe2, 0xbf, 0x8e, 0xac, 0x92, 0xf1, 0xef, 0x1d, 0x03, - 0xdd, 0x92, 0x9b, 0xb0, 0xb2, 0x66, 0x13, 0x4b, 0xbf, 0x34, 0x7b, 0x75, - 0x5b, 0xb6, 0x48, 0x09, 0x73, 0xfb, 0x87, 0x72, 0x55, 0xdd, 0xa8, 0x59, - 0x77, 0x1d, 0x4f, 0xae, 0xf3, 0xe7, 0xce, 0x22, 0x6c, 0x45, 0xb0, 0x21, - 0x41, 0xc0, 0xcf, 0xcd, 0x31, 0x6b, 0x72, 0x08, 0xfb, 0x8d, 0x92, 0x87, - 0xe8, 0x17, 0xe7, 0x1b, 0x78, 0x19, 0xbf, 0x65, 0x03, 0x24, 0xbe, 0x57, - 0xe7, 0xa4, 0x76, 0x04, 0x6a, 0x6e, 0x62, 0x67, 0x65, 0x35, 0x53, 0x3d, - 0x80, 0x74, 0xe2, 0xe8, 0xe6, 0x1c, 0x82, 0x31, 0xfd, 0x1b, 0x3f, 0x89, - 0x48, 0xac, 0x20, 0xf1, 0x61, 0xfa, 0x06, 0xb2, 0xc8, 0x5f, 0xda, 0x70, - 0xd2, 0x67, 0x21, 0x29, 0xac, 0xf1, 0x8c, 0x85, 0x2d, 0xc3, 0x4c, 0x09, - 0x79, 0xcb, 0xf7, 0x47, 0x3c, 0xa5, 0xd8, 0x36, 0xaa, 0x57, 0xff, 0x71, - 0xeb, 0x4b, 0xdb, 0xf8, 0x62, 0xaf, 0x74, 0x86, 0x62, 0x1d, 0x61, 0x18, - 0xfa, 0x15, 0x0b, 0xdd, 0x24, 0x22, 0xc8, 0x71, 0x62, 0x6b, 0x9c, 0xa4, - 0x26, 0xa3, 0x38, 0xa7, 0xe3, 0xd8, 0x19, 0xc1, 0x95, 0x1b, 0x5b, 0x6c, - 0xbc, 0xcd, 0x7b, 0xa7, 0xb7, 0xfa, 0xfb, 0xca, 0x30, 0x80, 0xfc, 0xfc, - 0x72, 0x17, 0x7d, 0xa6, 0x2b, 0x01, 0x1a, 0x40, 0xfb, 0x8d, 0x4b, 0x58, - 0x4d, 0x99, 0xdc, 0x76, 0xc3, 0x95, 0x21, 0xd1, 0x46, 0x7b, 0xf8, 0xad, - 0xec, 0x08, 0xb5, 0x3c, 0x89, 0xc7, 0x54, 0x02, 0xbc, 0x0f, 0xe9, 0x96, - 0x27, 0x19, 0xcb, 0x12, 0x9c, 0x6a, 0x1e, 0x0c, 0xdb, 0x93, 0x9f, 0xce, - 0xfa, 0x31, 0x03, 0xa5, 0x19, 0xa9, 0xbe, 0x73, 0x41, 0x2a, 0x45, 0xf0, - 0xdf, 0x37, 0x73, 0x3c, 0x83, 0x91, 0x0f, 0x19, 0x26, 0xd7, 0x5f, 0xbf, - 0x98, 0xda, 0x3b, 0x51, 0xef, 0x05, 0xd5, 0x17, 0x1a, 0xd5, 0x07, 0x20, - 0x7d, 0x60, 0xe3, 0x13, 0x14, 0xbe, 0xdb, 0x17, 0x2c, 0x8d, 0x34, 0xab, - 0x90, 0x62, 0x86, 0x1e, 0x42, 0xee, 0x9f, 0xf2, 0x4e, 0x4e, 0x5b, 0xe9, - 0x3d, 0x92, 0xcc, 0xce, 0x12, 0x86, 0x9d, 0x03, 0x1e, 0xb7, 0xf9, 0x9c, - 0x35, 0xb6, 0x13, 0xeb, 0x57, 0x7d, 0xc4, 0x8c, 0xd9, 0x4d, 0x6c, 0x34, - 0xed, 0x27, 0xae, 0x28, 0xb5, 0xd7, 0x23, 0xef, 0xa3, 0x4a, 0x3d, 0xae, - 0x46, 0xe6, 0xfa, 0x85, 0xe1, 0x92, 0x89, 0x28, 0x42, 0x34, 0x93, 0x3e, - 0x34, 0xb2, 0x83, 0x1c, 0xb9, 0xff, 0x91, 0x6b, 0x4a, 0xd8, 0xc8, 0xad, - 0x75, 0xe8, 0xba, 0xdd, 0xea, 0xc0, 0x86, 0xde, 0x35, 0xbd, 0xbe, 0x20, - 0x3e, 0x1f, 0x65, 0xc1, 0x0a, 0x27, 0x0b, 0x0c, 0x16, 0xb0, 0x63, 0x82, - 0xbe, 0x79, 0xc4, 0x02, 0x31, 0x69, 0x8c, 0x3b, 0x7d, 0x70, 0x8a, 0xde, - 0xe1, 0xc0, 0x9d, 0xda, 0x50, 0x7f, 0xa7, 0xcc, 0xda, 0xf6, 0xc7, 0x10, - 0xcf, 0x2e, 0x89, 0x35, 0x13, 0xe6, 0x50, 0x07, 0x93, 0x68, 0x95, 0x28, - 0x94, 0x03, 0x2c, 0x02, 0x94, 0x00, 0x0e, 0xe7, 0x0f, 0x20, 0x27, 0xa6, - 0xfe, 0x0a, 0x6b, 0xf2, 0x57, 0x76, 0x09, 0x7c, 0x89, 0x06, 0x5e, 0x57, - 0x21, 0x13, 0xcb, 0x2c, 0xe1, 0xbc, 0x44, 0x02, 0xc2, 0x76, 0xaf, 0x35, - 0xa5, 0x55, 0x3d, 0x8d, 0x2e, 0x49, 0x04, 0x61, 0x8b, 0x7a, 0x20, 0xbb, - 0xab, 0xaf, 0x77, 0x64, 0xfa, 0xa0, 0x2a, 0x18, 0x7a, 0xba, 0xa2, 0x6d, - 0xdb, 0x69, 0xab, 0x0c, 0x13, 0x85, 0x7e, 0x42, 0xc5, 0x61, 0x29, 0xcc, - 0xc7, 0x68, 0xa6, 0x5f, 0xe1, 0x9b, 0xc8, 0x63, 0xc0, 0x65, 0x35, 0x42, - 0x4d, 0xda, 0x1c, 0x16, 0x99, 0x31, 0x3d, 0x3c, 0xbe, 0x62, 0x8d, 0xe3, - 0x53, 0xcb, 0x0d, 0x94, 0x0f, 0x04, 0xef, 0x38, 0x15, 0x0d, 0x82, 0x20, - 0xa7, 0x2a, 0x19, 0x4a, 0x25, 0xa6, 0xb5, 0xa8, 0x2e, 0x24, 0x25, 0x5a, - 0x40, 0x76, 0x6b, 0x67, 0x62, 0xe5, 0x48, 0xe7, 0xa2, 0xa2, 0xc9, 0x10, - 0x2e, 0x8d, 0xdd, 0x26, 0x81, 0x93, 0x7d, 0x26, 0x6b, 0xcf, 0xb8, 0x70, - 0xab, 0xf8, 0xcf, 0xbb, 0x1a, 0x18, 0xa4, 0x0b, 0xa3, 0x5e, 0xe1, 0xa1, - 0xd6, 0x8a, 0xb8, 0x02, 0x05, 0x4d, 0x87, 0x92, 0x77, 0xff, 0xa2, 0x9e, - 0x0a, 0x50, 0x7c, 0xe9, 0x79, 0x2c, 0xb0, 0xaa, 0x93, 0x9b, 0x00, 0x82, - 0x62, 0x61, 0x0b, 0x12, 0x7c, 0xc8, 0x1d, 0xba, 0xe2, 0x40, 0x1a, 0x21, - 0x31, 0xc0, 0xf9, 0x4f, 0x38, 0xc5, 0x2e, 0x96, 0x5c, 0x05, 0x8d, 0x94, - 0x42, 0x2f, 0xf0, 0xfa, 0xcd, 0x50, 0x3d, 0xb1, 0x44, 0x18, 0x93, 0xc9, - 0xa4, 0x41, 0x89, 0x98, 0x00, 0xed, 0xc0, 0x43, 0x12, 0xf2, 0xba, 0xaf, - 0x9f, 0xcc, 0x75, 0x26, 0xcb, 0xba, 0xfc, 0x87, 0x2a, 0x00, 0x9a, 0x0b, - 0xce, 0xd0, 0xdc, 0xe1, 0x49, 0x02, 0x8d, 0xf4, 0x25, 0x2b, 0xed, 0x5c, - 0x3d, 0xbf, 0xe8, 0x05, 0xa7, 0xfa, 0x36, 0x08, 0x71, 0xec, 0x6d, 0x4f, - 0x1d, 0x4f, 0x71, 0x14, 0x0c, 0x0e, 0x92, 0xe5, 0xfb, 0x4e, 0x1e, 0xca, - 0x43, 0xcd, 0xf6, 0x08, 0x29, 0x8b, 0xff, 0xc6, 0xe3, 0x31, 0x1e, 0xed, - 0x7d, 0x14, 0xcb, 0xc1, 0xa0, 0x1e, 0xaf, 0x9c, 0x70, 0xf2, 0x10, 0x42, - 0xd5, 0xb8, 0x94, 0x07, 0xd7, 0xef, 0x87, 0x8a, 0x63, 0x82, 0x20, 0x59, - 0xbf, 0x8a, 0x99, 0x07, 0x1a, 0x15, 0x77, 0x87, 0x5f, 0xab, 0xd1, 0x1f, - 0xec, 0xc8, 0x37, 0xa8, 0x93, 0xb8, 0x7c, 0xba, 0x80, 0xf2, 0x70, 0x67, - 0xec, 0x98, 0x1f, 0x06, 0x68, 0xcd, 0xf8, 0x7d, 0xaf, 0xd3, 0x3a, 0x90, - 0x38, 0x6a, 0x85, 0xfe, 0x00, 0xa6, 0x90, 0x1b, 0x91, 0xc6, 0x9a, 0x47, - 0xa3, 0x75, 0x9e, 0x19, 0xb2, 0x10, 0x6a, 0x0c, 0x78, 0x1a, 0xb3, 0x95, - 0xe7, 0xc3, 0x3d, 0xd0, 0x42, 0x59, 0x94, 0x96, 0x32, 0x6a, 0x4d, 0xdc, - 0xd2, 0x5d, 0xf4, 0xe7, 0xfb, 0x0e, 0xde, 0xa1, 0x8b, 0x7b, 0xf8, 0x6d, - 0x66, 0x66, 0xbe, 0x4b, 0xbe, 0x91, 0xf4, 0x32, 0x39, 0xb2, 0x55, 0xa0, - 0xbb, 0x80, 0xfc, 0x0d, 0xca, 0x3a, 0x3d, 0x95, 0xbb, 0xcc, 0xab, 0xf5, - 0x43, 0x73, 0x6a, 0x52, 0xa9, 0xd2, 0xbc, 0x9c, 0xf9, 0x69, 0x3b, 0x65, - 0x01, 0x7d, 0xc3, 0x73, 0xdf, 0xe1, 0x49, 0x40, 0x33, 0xe6, 0xbc, 0xf0, - 0xff, 0x57, 0x23, 0x9d, 0x4c, 0x19, 0x2d, 0x7d, 0x3a, 0x79, 0x21, 0xf0, - 0x18, 0xf2, 0x45, 0x34, 0x40, 0x54, 0x7f, 0x67, 0x02, 0x1c, 0xd0, 0x76, - 0x65, 0x0c, 0xcf, 0xe1, 0xb2, 0x26, 0xc1, 0x68, 0xcb, 0x06, 0x8d, 0xf5, - 0xb0, 0x80, 0x3d, 0x57, 0xfb, 0xf6, 0x9f, 0x41, 0x6f, 0x0c, 0xbb, 0x6f, - 0x7d, 0x18, 0x93, 0x80, 0xe5, 0xd9, 0x8e, 0xbd, 0xa3, 0x0d, 0x63, 0x1f, - 0x7b, 0x61, 0x64, 0x28, 0xc4, 0xdd, 0x3a, 0x88, 0xf3, 0x26, 0xd7, 0xcd, - 0x31, 0x9b, 0x93, 0x06, 0x03, 0x98, 0x87, 0x86, 0xc1, 0x42, 0x17, 0xd5, - 0x7b, 0xf2, 0x62, 0x3e, 0xf9, 0xa9, 0x7c, 0xb5, 0x5f, 0x67, 0x82, 0x7c, - 0x0b, 0x8d, 0x21, 0xd6, 0x24, 0xa3, 0x06, 0xc5, 0xa7, 0x80, 0xb6, 0x58, - 0x7f, 0xb5, 0x72, 0xbd, 0x1a, 0xba, 0x4a, 0x53, 0x9a, 0x85, 0xa0, 0xea, - 0x91, 0xbb, 0x62, 0x12, 0x9c, 0x20, 0xc7, 0xa5, 0x84, 0xcd, 0x2a, 0x57, - 0xe8, 0xed, 0xd5, 0xcf, 0x2f, 0x7c, 0x2a, 0x1c, 0xc1, 0xd9, 0xc8, 0x74, - 0x06, 0x97, 0x76, 0xee, 0x6d, 0x6f, 0x6d, 0x81, 0x8d, 0xe9, 0xed, 0x7f, - 0x83, 0xc9, 0xc6, 0x3b, 0xec, 0xea, 0x89, 0x36, 0x4e, 0xa7, 0xa3, 0x36, - 0xaf, 0xe0, 0x30, 0x27, 0xbb, 0x9c, 0x28, 0x3f, 0x89, 0x21, 0x37, 0x1a, - 0x23, 0xee, 0x3d, 0x8e, 0xe5, 0xad, 0x2b, 0x58, 0x17, 0x82, 0x7f, 0x24, - 0xf6, 0x78, 0x04, 0x00, 0x7e, 0x96, 0x01, 0x38, 0x52, 0x4f, 0xd3, 0x6f, - 0xc1, 0x22, 0x83, 0x87, 0xf6, 0x42, 0x6b, 0xd7, 0xc9, 0x6b, 0xda, 0x76, - 0x20, 0x0a, 0x79, 0xdf, 0x00, 0x83, 0x5b, 0x53, 0x70, 0x09, 0x03, 0x5a, - 0x96, 0xd8, 0x46, 0xfe, 0xed, 0x68, 0x3b, 0x42, 0xce, 0x2d, 0x0a, 0x53, - 0x7a, 0xe7, 0x70, 0xac, 0x19, 0x12, 0xfc, 0x3c, 0x72, 0x28, 0xb8, 0x72, - 0x7b, 0x60, 0x93, 0xbb, 0xde, 0xc7, 0x39, 0xed, 0x77, 0xab, 0xef, 0x50, - 0x9d, 0x0f, 0x64, 0x18, 0xd0, 0x7d, 0x6e, 0xd1, 0x15, 0x3a, 0x8c, 0xe7, - 0x74, 0x16, 0xf7, 0x7f, 0xd1, 0x02, 0x74, 0x03, 0x21, 0x26, 0xb3, 0xab, - 0x86, 0xd4, 0x0a, 0x41, 0xdc, 0x56, 0x8c, 0xff, 0xa5, 0x9e, 0xb2, 0xaa, - 0x30, 0xb0, 0x36, 0x2b, 0xf2, 0x95, 0x32, 0x4c, 0x9d, 0x4f, 0x51, 0x54, - 0xef, 0xa4, 0x02, 0x96, 0x4e, 0x40, 0x58, 0xd8, 0x07, 0x75, 0x0f, 0x50, - 0x1b, 0x1a, 0x04, 0xa4, 0xa7, 0xba, 0x65, 0xc9, 0x86, 0x75, 0x53, 0xe8, - 0xdc, 0x74, 0xbf, 0x79, 0x23, 0xc0, 0x47, 0x6a, 0x62, 0xc2, 0xee, 0x68, - 0xf5, 0xd1, 0x71, 0x07, 0x00, 0xf2, 0xb9, 0x1e, 0x37, 0x9c, 0x13, 0x93, - 0xf3, 0x84, 0xc2, 0x94, 0x4d, 0x99, 0xab, 0xb4, 0x10, 0x73, 0x31, 0x1a, - 0xb1, 0x80, 0xd5, 0xb8, 0xca, 0xa3, 0xe4, 0x13, 0x22, 0x20, 0xfd, 0x00, - 0xff, 0x75, 0xb2, 0xe5, 0xc8, 0xdf, 0x12, 0x5a, 0x9c, 0xa3, 0xf6, 0xbd, - 0xd9, 0xb5, 0x3b, 0x32, 0x05, 0x62, 0x64, 0x65, 0x3d, 0x78, 0xb7, 0xe3, - 0xe4, 0x4e, 0x0d, 0xe1, 0xc3, 0x5b, 0x90, 0x26, 0x57, 0xf6, 0x40, 0xff, - 0x8e, 0xb9, 0x6c, 0x00, 0x3f, 0xb1, 0x8f, 0x83, 0xf5, 0x22, 0x2a, 0x3a, - 0x4e, 0x3b, 0x22, 0x6f, 0x0c, 0x8b, 0xa5, 0xe0, 0x34, 0xc6, 0xda, 0x7d, - 0xb0, 0xd6, 0xb5, 0x95, 0x5c, 0x47, 0x55, 0xa3, 0xa0, 0x8f, 0x86, 0x7d, - 0x6f, 0x4e, 0xfa, 0x56, 0x3e, 0x00, 0x6c, 0x8a, 0x04, 0xaa, 0xaa, 0x6f, - 0x37, 0x3b, 0xea, 0x28, 0x39, 0x8c, 0x92, 0x25, 0x0c, 0xfe, 0xd5, 0x9d, - 0x2f, 0xdd, 0x61, 0x6f, 0x67, 0xe8, 0x27, 0x3c, 0x09, 0x6f, 0x3a, 0x14, - 0x97, 0xa9, 0xfe, 0x12, 0x36, 0x43, 0xb5, 0x1e, 0x79, 0x38, 0x91, 0xca, - 0x09, 0xe7, 0xac, 0xb7, 0xb3, 0x90, 0x40, 0x97, 0xf2, 0x70, 0x6e, 0x8d, - 0xbc, 0xcf, 0x9b, 0x8b, 0xac, 0x00, 0xa7, 0x41, 0xc7, 0xb7, 0xfd, 0x1f, - 0x2d, 0x35, 0x1c, 0x9c, 0x21, 0x94, 0xa5, 0xd1, 0xae, 0xee, 0x06, 0x62, - 0x70, 0xf9, 0xcb, 0x5c, 0x0a, 0xbb, 0xc9, 0x23, 0x7e, 0x9d, 0x4d, 0xb1, - 0xa0, 0x3d, 0xa2, 0x7a, 0x2c, 0xd9, 0x23, 0x36, 0x5d, 0x22, 0xdd, 0x74, - 0x55, 0x11, 0x43, 0x45, 0xd4, 0xdb, 0x21, 0x73, 0xe8, 0x29, 0x68, 0x16, - 0x3d, 0x21, 0xc6, 0x66, 0x07, 0x10, 0x95, 0x31, 0x0f, 0x32, 0x7c, 0xcc, - 0x92, 0x8a, 0x5b, 0x97, 0x89, 0xcd, 0xe5, 0x6c, 0x49, 0xc4, 0xa5, 0xc0, - 0x5e, 0xd9, 0x1e, 0xc9, 0xae, 0x2a, 0x41, 0xae, 0x65, 0xc4, 0x10, 0xdd, - 0x78, 0x6d, 0xb4, 0xd1, 0xb1, 0x0b, 0x11, 0x91, 0x1e, 0xe5, 0x1d, 0xdd, - 0x8e, 0xe0, 0x1c, 0x5e, 0x0c, 0xac, 0xf2, 0x28, 0x01, 0xa7, 0xda, 0xb1, - 0xfc, 0x39, 0xdc, 0xce, 0x40, 0x16, 0x68, 0x8e, 0x7d, 0x67, 0xee, 0xce, - 0x5b, 0xbf, 0x88, 0xc2, 0xef, 0xa4, 0x1e, 0xba, 0xf3, 0xc7, 0xda, 0x35, - 0xd4, 0x6b, 0x75, 0x8d, 0xce, 0x24, 0x2c, 0x19, 0xaf, 0x56, 0x11, 0x5b, - 0x8b, 0xbe, 0x27, 0xd1, 0x2b, 0xa6, 0x7e, 0xc6, 0x7c, 0xda, 0x8c, 0x33, - 0xf7, 0x9b, 0x71, 0x98, 0x0a, 0x22, 0x3f, 0x45, 0x7f, 0x34, 0xae, 0x04, - 0x88, 0x45, 0x37, 0x11, 0x31, 0x56, 0x1d, 0x4f, 0x57, 0x2c, 0xd2, 0xbf, - 0x72, 0x16, 0x38, 0x28, 0x49, 0xbd, 0xa4, 0x9f, 0x64, 0x65, 0x3a, 0x52, - 0xa6, 0x4c, 0xd6, 0x0c, 0xa9, 0xc8, 0xb4, 0x39, 0x7c, 0x43, 0x9b, 0xaf, - 0x0a, 0xb9, 0x06, 0xc3, 0xc8, 0x6c, 0x4b, 0x4b, 0xae, 0xed, 0xf4, 0x53, - 0xa3, 0x0e, 0xb0, 0xc7, 0xe3, 0xaa, 0xac, 0x25, 0xf7, 0xd2, 0xf9, 0xee, - 0xd9, 0x15, 0x13, 0x21, 0x25, 0xd1, 0x33, 0x20, 0x11, 0xc8, 0xe3, 0x19, - 0x56, 0x94, 0x01, 0x59, 0x3d, 0x38, 0x48, 0x02, 0x64, 0x64, 0xa7, 0xb5, - 0x73, 0x6e, 0xac, 0xc7, 0x17, 0xe0, 0xe0, 0x17, 0xb4, 0xe3, 0x8b, 0xfd, - 0x20, 0x05, 0xca, 0x3e, 0x2f, 0x83, 0x49, 0xf2, 0xbf, 0xd3, 0x3c, 0x40, - 0x42, 0xdd, 0x1d, 0xab, 0x40, 0xc6, 0x79, 0x81, 0xb9, 0x26, 0x88, 0x22, - 0xa7, 0x36, 0xdb, 0xe5, 0xf2, 0xe6, 0x22, 0xad, 0xb6, 0x6f, 0x04, 0x62, - 0x33, 0xfa, 0x09, 0xc7, 0x12, 0x2b, 0x99, 0xba, 0xbc, 0xef, 0xd8, 0xbd, - 0xf8, 0x22, 0x90, 0x1b, 0xe3, 0x78, 0xb0, 0x8f, 0x8a, 0x9a, 0x20, 0xaf, - 0xf3, 0xd2, 0x23, 0xc2, 0xd1, 0x37, 0x01, 0x67, 0xf8, 0x36, 0x0e, 0xd6, - 0x5d, 0x4d, 0x9b, 0x50, 0xe7, 0x02, 0x80, 0x1b, 0x04, 0x70, 0x21, 0xc4, - 0x7b, 0x38, 0x30, 0x06, 0x92, 0x75, 0x94, 0x4f, 0x32, 0x06, 0x01, 0xba, - 0xb1, 0xc3, 0x3b, 0xc1, 0x9e, 0xa1, 0x34, 0x84, 0x54, 0x11, 0x9f, 0x59, - 0xa9, 0x01, 0x78, 0xbd, 0x1b, 0x2f, 0xf4, 0xba, 0xeb, 0x93, 0xf2, 0x11, - 0x36, 0xae, 0xca, 0xa2, 0x83, 0xac, 0x09, 0x0e, 0xd5, 0xc1, 0xb6, 0x63, - 0x6c, 0xec, 0x82, 0x53, 0x79, 0xb6, 0x38, 0x11, 0x73, 0xb8, 0x69, 0x15, - 0x0f, 0x37, 0xed, 0x06, 0x2c, 0x03, 0xcb, 0x36, 0x21, 0x0e, 0xf8, 0xfc, - 0x73, 0xf2, 0xaf, 0x49, 0x20, 0x6b, 0x9f, 0xc7, 0x97, 0x4f, 0xc8, 0x31, - 0x45, 0x92, 0xfc, 0xc7, 0x28, 0x37, 0x54, 0x18, 0xee, 0xc8, 0xca, 0x7e, - 0xda, 0x4c, 0xc5, 0x82, 0x5c, 0x6c, 0xfe, 0x38, 0x67, 0x3b, 0xcb, 0xfa, - 0x56, 0x5f, 0x67, 0x8f, 0x45, 0x1a, 0x62, 0x86, 0xbf, 0xa8, 0xdb, 0x6e, - 0x38, 0xc6, 0xa8, 0xbb, 0x0f, 0x12, 0x46, 0xe1, 0x8b, 0xac, 0x1f, 0x11, - 0x88, 0xd2, 0x86, 0xd3, 0x37, 0x3b, 0xe5, 0x5e, 0xf0, 0x15, 0x50, 0x37, - 0x64, 0x1a, 0x51, 0x2d, 0xfb, 0x92, 0x99, 0x39, 0xe5, 0xe9, 0xbd, 0x03, - 0x8c, 0xf2, 0x80, 0xeb, 0x15, 0x47, 0xb1, 0xd0, 0xd3, 0x5a, 0x2a, 0x01, - 0x0d, 0x53, 0x91, 0xd0, 0x7b, 0x3d, 0x48, 0x26, 0x2d, 0xd5, 0x70, 0x34, - 0xd3, 0x6f, 0x81, 0xbb, 0x9e, 0xbe, 0xec, 0x4b, 0x72, 0x37, 0x85, 0xbe, - 0x30, 0x06, 0x77, 0x3e, 0xfb, 0x81, 0x1d, 0x93, 0x3f, 0xc5, 0x89, 0xb9, - 0x90, 0xc4, 0x48, 0x92, 0x06, 0xae, 0x4f, 0x1a, 0xc0, 0x32, 0xf9, 0x64, - 0xa6, 0x56, 0xd4, 0x27, 0x0b, 0x0d, 0xd2, 0xa4, 0x39, 0x8a, 0x40, 0xe3, - 0x61, 0x1c, 0x2c, 0xdf, 0xcd, 0x7b, 0xcc, 0x84, 0x29, 0xe8, 0xab, 0xda, - 0x01, 0x08, 0xc0, 0x0c, 0xc6, 0xdc, 0x32, 0x83, 0x3e, 0xf3, 0x47, 0xa2, - 0xc9, 0xbd, 0xce, 0x2b, 0x09, 0x48, 0x58, 0xdc, 0x99, 0x9b, 0x2f, 0x37, - 0x9a, 0x05, 0xc5, 0x92, 0x11, 0x80, 0xfe, 0x3c, 0x0a, 0xfa, 0x1b, 0x47, - 0xb9, 0xf5, 0x5e, 0x59, 0x71, 0x10, 0x37, 0x28, 0x90, 0x11, 0xe7, 0x64, - 0x1c, 0xbe, 0x3d, 0xe3, 0x40, 0x4d, 0x42, 0x28, 0xfd, 0xfb, 0xb1, 0x06, - 0x30, 0xae, 0xfe, 0x49, 0x78, 0x0e, 0x07, 0x3c, 0x97, 0x30, 0x3a, 0x46, - 0xce, 0xb7, 0xb3, 0x0e, 0xfa, 0x73, 0xa7, 0xe4, 0x79, 0x72, 0x42, 0xc6, - 0xf5, 0x85, 0x16, 0x7c, 0x71, 0xd8, 0x98, 0x6b, 0xc4, 0xec, 0x45, 0xb2, - 0x3b, 0x0c, 0x2a, 0xea, 0x12, 0xc2, 0x1a, 0x77, 0xb4, 0xfd, 0x3d, 0x79, - 0xab, 0x12, 0xa7, 0x41, 0x84, 0x58, 0x39, 0x72, 0x3f, 0x5b, 0x9d, 0x97, - 0x8f, 0x33, 0x0e, 0xce, 0x6d, 0x15, 0x84, 0x68, 0x2a, 0x06, 0xe6, 0x72, - 0x25, 0x71, 0x63, 0x86, 0x49, 0xfc, 0x78, 0xce, 0x7e, 0x38, 0xbe, 0x15, - 0x38, 0xa7, 0x7a, 0xed, 0x87, 0xbd, 0x3e, 0x95, 0x35, 0xb9, 0xa6, 0x79, - 0xef, 0xf4, 0x62, 0xa0, 0x78, 0x45, 0xd5, 0xef, 0x3d, 0x06, 0x9f, 0xaa, - 0x91, 0x7c, 0xf2, 0x66, 0xcb, 0x51, 0x8a, 0x19, 0x4e, 0x56, 0x68, 0xcb, - 0xb8, 0x0e, 0xb5, 0xa1, 0x1a, 0x93, 0xb9, 0xc8, 0xef, 0x61, 0xa5, 0xc0, - 0x87, 0x28, 0xfa, 0x46, 0x53, 0x39, 0x84, 0x68, 0x67, 0x6d, 0x2a, 0x33, - 0x77, 0x32, 0x3d, 0xfc, 0xe5, 0x28, 0x29, 0xd3, 0xd4, 0xbe, 0xfa, 0x25, - 0xb3, 0x39, 0x56, 0x4f, 0x4d, 0x28, 0x36, 0x1a, 0x6c, 0xa9, 0x32, 0x19, - 0x87, 0x1f, 0x38, 0x9a, 0xce, 0xe9, 0xec, 0x01, 0xcc, 0xc7, 0xca, 0xf7, - 0xfc, 0xe5, 0xf6, 0x41, 0x79, 0x27, 0xac, 0x48, 0xea, 0x81, 0x29, 0xbb, - 0xfb, 0x8b, 0xc9, 0x68, 0xcc, 0xe7, 0xd0, 0xf6, 0xf7, 0x51, 0x81, 0x7a, - 0xd5, 0x6a, 0x31, 0x57, 0xb3, 0x76, 0xdc, 0x52, 0x62, 0x2a, 0xdc, 0x80, - 0xda, 0x36, 0x96, 0x46, 0x09, 0x8d, 0x3b, 0xf6, 0xb2, 0x84, 0xf7, 0xc9, - 0xff, 0x7e, 0x29, 0x31, 0x49, 0x80, 0xbb, 0xdf, 0xa3, 0x8e, 0x37, 0xe0, - 0x41, 0x12, 0x12, 0x36, 0x23, 0x6a, 0xfb, 0xc8, 0x5a, 0x48, 0x36, 0x72, - 0x4e, 0x9f, 0xfb, 0x82, 0x8b, 0xc5, 0x31, 0x52, 0xa2, 0x49, 0x69, 0xa6, - 0xba, 0xc1, 0xa5, 0xd3, 0xdd, 0x9e, 0x0a, 0x3c, 0x57, 0xb8, 0xe6, 0x77, - 0x77, 0x0c, 0x22, 0x91, 0x2d, 0x10, 0x90, 0x1a, 0x66, 0x4b, 0x0c, 0x95, - 0xb8, 0xf9, 0x25, 0xa9, 0x50, 0x3e, 0x18, 0x0d, 0xc2, 0x12, 0xbd, 0xef, - 0x33, 0x57, 0x9f, 0x59, 0x86, 0xac, 0xaa, 0xfa, 0xb0, 0xcc, 0x47, 0x12, - 0x1e, 0x3a, 0x92, 0x04, 0x4b, 0x52, 0xdf, 0xc5, 0x83, 0xd8, 0xe5, 0xf4, - 0xdb, 0x47, 0x20, 0x68, 0xb2, 0xc7, 0x9c, 0xb0, 0x7a, 0xf6, 0xa3, 0xbc, - 0xf6, 0x3b, 0xe3, 0xfb, 0xd5, 0x90, 0x7a, 0x9f, 0x45, 0x59, 0x63, 0x19, - 0x4e, 0xe2, 0x03, 0x75, 0x81, 0x0a, 0xb4, 0x90, 0x0d, 0x98, 0x29, 0xe9, - 0x57, 0xbb, 0x22, 0x5e, 0x2e, 0x8e, 0xd3, 0x2d, 0x6b, 0xdb, 0xc0, 0x9c, - 0x57, 0x94, 0x12, 0x1f, 0x32, 0x64, 0x88, 0xd3, 0x71, 0xaf, 0x03, 0x21, - 0x56, 0x1b, 0x9b, 0x7d, 0x7a, 0xd4, 0xd5, 0xe2, 0xf1, 0x7f, 0xcd, 0xb2, - 0x9d, 0xc6, 0xa6, 0x15, 0x34, 0xfa, 0x50, 0x61, 0xce, 0x57, 0x4f, 0x11, - 0x50, 0x3e, 0x1b, 0x69, 0x4e, 0x38, 0x8b, 0xc0, 0xf3, 0x9c, 0x48, 0x9f, - 0x33, 0x00, 0x49, 0xec, 0xd0, 0xfb, 0xdd, 0x34, 0xf0, 0x2f, 0xcc, 0xab, - 0xf9, 0x76, 0x4e, 0x24, 0x71, 0xf4, 0xe1, 0xe6, 0x68, 0x70, 0x02, 0x56, - 0x5e, 0xf2, 0xe0, 0x82, 0xcd, 0xb3, 0x80, 0xb1, 0xe3, 0xb3, 0xc8, 0x60, - 0xc1, 0x06, 0xc0, 0xd4, 0xb2, 0x70, 0x1b, 0xa0, 0xf2, 0x2d, 0x99, 0xbc, - 0x17, 0xd1, 0x1a, 0x4a, 0x7b, 0x6b, 0xdd, 0xa5, 0xc1, 0x9b, 0xdb, 0x14, - 0x26, 0x05, 0xb3, 0x98, 0x7a, 0x10, 0x0b, 0x33, 0xeb, 0xb0, 0x75, 0x88, - 0xc9, 0xa6, 0xa3, 0xbd, 0xac, 0x9d, 0xd5, 0x06, 0x77, 0x67, 0xf9, 0x71, - 0xb1, 0x05, 0x04, 0x89, 0x35, 0xf9, 0x10, 0x64, 0xf5, 0x23, 0x21, 0xb0, - 0x8b, 0xc8, 0xee, 0x13, 0x47, 0x29, 0x3e, 0x7a, 0x73, 0xa1, 0xf0, 0x33, - 0xb4, 0xd1, 0x19, 0x21, 0x4a, 0x9d, 0xc5, 0xb7, 0xfa, 0xff, 0x56, 0x76, - 0x5a, 0xbf, 0x08, 0xe2, 0xff, 0xee, 0x5c, 0x12, 0x13, 0x84, 0xb5, 0x48, - 0x24, 0x35, 0x01, 0xc3, 0x44, 0xf4, 0xeb, 0x53, 0x3c, 0xc6, 0xf9, 0x7b, - 0xb4, 0xa2, 0xb4, 0xd4, 0xc6, 0x44, 0x37, 0xd1, 0x72, 0xe2, 0x23, 0x41, - 0x5c, 0xb1, 0x21, 0xff, 0x08, 0xef, 0xd3, 0xad, 0x00, 0x37, 0xc9, 0xf5, - 0x96, 0x80, 0x7a, 0xd6, 0x45, 0x83, 0x8b, 0x58, 0x10, 0xa0, 0xe1, 0xd8, - 0xf7, 0x1a, 0x3e, 0xee, 0x73, 0xf2, 0xcb, 0x17, 0x08, 0x10, 0x78, 0xed, - 0xbb, 0x11, 0xbc, 0xbd, 0xbb, 0xb3, 0xd1, 0xfd, 0x40, 0x72, 0x38, 0x86, - 0x60, 0xc4, 0xcc, 0xdc, 0xf8, 0xf7, 0xc7, 0xd7, 0x5c, 0xdf, 0x2d, 0xde, - 0xdf, 0x94, 0xe5, 0xbc, 0x86, 0xaf, 0x7d, 0xff, 0xf0, 0x82, 0xe5, 0x38, - 0x48, 0x9c, 0xfe, 0xdd, 0xfd, 0x04, 0x40, 0x04, 0xbc, 0x8a, 0x62, 0xc2, - 0x8f, 0xd2, 0x31, 0xd4, 0x15, 0xd1, 0x76, 0x73, 0x78, 0xb6, 0xcd, 0xa4, - 0x11, 0xfa, 0xb5, 0xeb, 0x00, 0x59, 0x5d, 0xe1, 0x37, 0x26, 0x6c, 0xe6, - 0x38, 0xfc, 0xb2, 0x25, 0x79, 0x3c, 0x82, 0xb5, 0xbd, 0x01, 0x7f, 0x7b, - 0x77, 0xb0, 0x85, 0x9f, 0x24, 0x36, 0xca, 0xe7, 0x86, 0x0f, 0xa0, 0xc5, - 0xb4, 0x84, 0xb9, 0xa6, 0x12, 0x0a, 0x64, 0xed, 0x39, 0xf3, 0xbb, 0x79, - 0x5c, 0x5a, 0xaf, 0xee, 0xa8, 0x95, 0x7a, 0x37, 0x6d, 0x6f, 0x82, 0x71, - 0xca, 0xf5, 0xe4, 0x3d, 0x79, 0x7d, 0xeb, 0x01, 0xf3, 0x84, 0x13, 0x2f, - 0xec, 0x71, 0x4a, 0xe7, 0x15, 0xd0, 0x2e, 0xd9, 0x81, 0x15, 0x14, 0x0d, - 0xfa, 0x8a, 0x89, 0x7f, 0x05, 0xf0, 0x7d, 0x23, 0x02, 0xbb, 0x6c, 0xcf, - 0x4c, 0xf8, 0xb8, 0xb0, 0x28, 0x92, 0xc1, 0x05, 0x6d, 0xf9, 0xb5, 0xa5, - 0x2a, 0x17, 0xc9, 0x98, 0xe2, 0x3b, 0x69, 0x3c, 0x34, 0x35, 0xb2, 0x2a, - 0x36, 0xe2, 0x9e, 0x18, 0x4a, 0x5e, 0x1e, 0xa7, 0x05, 0x82, 0xeb, 0x75, - 0xa8, 0x8b, 0x77, 0x58, 0x67, 0x7b, 0x12, 0xec, 0x34, 0x1e, 0xbe, 0x54, - 0x17, 0xc2, 0xfa, 0x9a, 0xd2, 0x70, 0xe1, 0x31, 0x63, 0x30, 0x39, 0xe4, - 0xa9, 0x10, 0xe0, 0x03, 0x24, 0xbf, 0xa0, 0x2c, 0xb3, 0xd6, 0x6a, 0xf4, - 0x3d, 0x46, 0xbb, 0x42, 0xa2, 0x86, 0x96, 0x1a, 0x49, 0x72, 0xa3, 0x8a, - 0x24, 0x66, 0x84, 0xf8, 0xb9, 0xc0, 0xe5, 0x42, 0x6d, 0x0e, 0xc3, 0x42, - 0x8e, 0x34, 0xe6, 0x7f, 0x17, 0x75, 0xc6, 0xca, 0xcd, 0x66, 0x23, 0x5e, - 0x1e, 0xf2, 0x81, 0x38, 0x5c, 0x73, 0xf7, 0x28, 0x52, 0xcb, 0x13, 0xc3, - 0x44, 0x1d, 0x95, 0x42, 0x7a, 0x2c, 0xd4, 0x56, 0xa5, 0xfd, 0xbc, 0x6a, - 0x74, 0x05, 0x18, 0xb2, 0xe6, 0x3d, 0x9f, 0xe9, 0xaa, 0xff, 0xae, 0x9b, - 0xe9, 0x06, 0x94, 0x83, 0x63, 0xb8, 0x48, 0xbd, 0xe4, 0x76, 0x35, 0x5b, - 0x94, 0x78, 0xc9, 0x8f, 0xb6, 0xa9, 0xf5, 0x31, 0xd9, 0x52, 0x2f, 0x7e, - 0x58, 0x67, 0x64, 0x64, 0x58, 0xe3, 0xec, 0x95, 0x0e, 0x55, 0xe4, 0x72, - 0xb1, 0x62, 0x0c, 0xf1, 0x83, 0xc1, 0xf5, 0x19, 0x9f, 0x3c, 0xf0, 0x2d, - 0xdc, 0xcb, 0xa6, 0xa0, 0x24, 0xd8, 0x5e, 0x2e, 0xf7, 0xaf, 0x2b, 0x00, - 0xcc, 0x89, 0xc1, 0x73, 0x80, 0x89, 0x44, 0xe9, 0x0e, 0x7b, 0xd1, 0x10, - 0xfc, 0xaa, 0x69, 0xa1, 0xa6, 0xa6, 0x7f, 0x95, 0x81, 0x0e, 0x88, 0x77, - 0xc2, 0x44, 0x81, 0x34, 0xea, 0xc6, 0x3b, 0x60, 0x14, 0xe6, 0x7d, 0x49, - 0x9c, 0x88, 0x8e, 0xa4, 0x0a, 0xc8, 0x90, 0x23, 0x0d, 0x49, 0x36, 0xdf, - 0x2d, 0xea, 0xf7, 0xb1, 0xee, 0xea, 0xb3, 0xf5, 0xb4, 0xf9, 0x93, 0xc8, - 0x97, 0x60, 0xb8, 0xe1, 0x2e, 0x9d, 0xd7, 0x36, 0x0c, 0x21, 0x62, 0x16, - 0xce, 0x9e, 0xe3, 0x54, 0x8a, 0xcb, 0x08, 0x48, 0x0c, 0x65, 0xee, 0x74, - 0x82, 0x01, 0xa8, 0x6e, 0xf5, 0x94, 0xc2, 0x62, 0x77, 0x31, 0xa6, 0xb1, - 0x47, 0x26, 0xa7, 0x6c, 0x51, 0x2f, 0xc1, 0xde, 0xed, 0x0f, 0xee, 0x5a, - 0xcd, 0xdc, 0x39, 0xe6, 0xa6, 0xcc, 0xfe, 0xc4, 0xb8, 0xd0, 0x6a, 0x96, - 0xf0, 0x90, 0xa3, 0xbb, 0x58, 0xaf, 0x36, 0x6f, 0x73, 0x4d, 0x9f, 0xa3, - 0x81, 0xb8, 0x05, 0xcd, 0x8a, 0x4a, 0xa4, 0xca, 0x05, 0xd1, 0x53, 0x67, - 0xb2, 0x9a, 0xef, 0xff, 0x06, 0x6c, 0xa8, 0x62, 0x74, 0xc6, 0xb4, 0x2f, - 0xaa, 0x90, 0x39, 0x22, 0x45, 0x04, 0xb0, 0xbc, 0x15, 0x86, 0xe0, 0x50, - 0x39, 0xb0, 0x1e, 0xb8, 0x46, 0x38, 0x4a, 0x3c, 0xe8, 0x8c, 0xbb, 0x8c, - 0xe8, 0x6d, 0xb5, 0x23, 0x57, 0xf2, 0x30, 0xa2, 0x15, 0x06, 0xa3, 0x79, - 0x7f, 0xbc, 0x54, 0x29, 0x27, 0xca, 0xc9, 0x18, 0xd6, 0xa2, 0x36, 0x70, - 0xfa, 0x93, 0x59, 0x80, 0x23, 0xd0, 0x63, 0xa1, 0xb0, 0xb3, 0xdc, 0x3e, - 0xd1, 0xb2, 0xbf, 0x2f, 0xd0, 0x6a, 0x3e, 0x76, 0x97, 0x60, 0x9a, 0x2a, - 0x56, 0x81, 0x25, 0x65, 0x65, 0x29, 0x44, 0x29, 0xe2, 0xc1, 0x72, 0x19, - 0x27, 0xd1, 0x59, 0xb3, 0x5d, 0xb2, 0xf1, 0x3b, 0xee, 0xbf, 0xa1, 0xd5, - 0x1d, 0x4d, 0x51, 0xb1, 0x93, 0x79, 0x15, 0x2c, 0x4f, 0x06, 0x90, 0x58, - 0x9c, 0x0f, 0xa7, 0x36, 0x87, 0xe1, 0x6b, 0x6e, 0xab, 0x09, 0x3f, 0xcb, - 0x79, 0x1c, 0xbd, 0x74, 0x8e, 0xec, 0xce, 0x1b, 0x66, 0x80, 0x71, 0x97, - 0x94, 0x0a, 0x56, 0xe4, 0xf6, 0xee, 0xb9, 0x99, 0x7a, 0x25, 0x8d, 0xa4, - 0x6e, 0xc3, 0xa0, 0xbe, 0x42, 0x2b, 0x4f, 0xc8, 0xd9, 0x08, 0xe5, 0x7f, - 0x59, 0x10, 0xab, 0x5d, 0xcd, 0x7c, 0x57, 0x7a, 0x2f, 0x10, 0x36, 0xa8, - 0x0b, 0x26, 0x74, 0xfe, 0xd2, 0x71, 0x8a, 0xc7, 0x34, 0xec, 0xe9, 0xd7, - 0x23, 0x3e, 0xc9, 0x83, 0x6d, 0x0b, 0xa0, 0x38, 0x2a, 0x06, 0x54, 0x52, - 0xd5, 0xbc, 0xe9, 0x3d, 0x17, 0xba, 0x5a, 0xc3, 0x94, 0x41, 0xd3, 0xb9, - 0xd7, 0x4b, 0x3d, 0xb5, 0x7c, 0xde, 0x00, 0x5b, 0x6d, 0x7f, 0xed, 0xef, - 0x05, 0x5f, 0xa9, 0x2a, 0x6c, 0x22, 0x57, 0x22, 0xee, 0xfa, 0xb4, 0xd3, - 0xbf, 0xab, 0x53, 0xe7, 0x97, 0xbf, 0x3a, 0x3e, 0x48, 0x14, 0xc8, 0x2a, - 0x72, 0xec, 0xc0, 0x81, 0x8f, 0x9b, 0x8b, 0xc1, 0x09, 0x10, 0x3b, 0x1c, - 0xec, 0xe7, 0xca, 0xc4, 0x1b, 0xe4, 0x6f, 0xbc, 0x95, 0xf0, 0x83, 0xc0, - 0x15, 0xbf, 0xee, 0xf7, 0xfc, 0xc9, 0x42, 0x04, 0xa4, 0xf7, 0x48, 0x04, - 0xc5, 0x44, 0x77, 0x5e, 0x3c, 0x1a, 0xdb, 0xf1, 0xc6, 0x9d, 0x37, 0xac, - 0x63, 0x80, 0xc1, 0xbc, 0xe9, 0x8b, 0x63, 0xed, 0x32, 0x27, 0x6e, 0xa2, - 0xd0, 0x11, 0x11, 0xf2, 0x33, 0x0b, 0xc8, 0x24, 0x31, 0x94, 0xba, 0xa9, - 0xef, 0x7e, 0xef, 0x62, 0x27, 0x66, 0xcf, 0xe7, 0x4d, 0xd1, 0xc8, 0x7f, - 0x4c, 0x04, 0x9b, 0xd5, 0xe3, 0x71, 0x13, 0x45, 0x30, 0x61, 0x84, 0x5e, - 0xc3, 0xe2, 0x22, 0x40, 0xcf, 0x53, 0xc6, 0x93, 0xa2, 0xc6, 0x58, 0xfb, - 0x25, 0x82, 0xcc, 0x5f, 0x9e, 0x12, 0x4f, 0xa3, 0x78, 0xfe, 0x25, 0xfc, - 0x52, 0x6c, 0xeb, 0xc4, 0xf0, 0x63, 0x19, 0x4a, 0x60, 0x6f, 0x75, 0xd4, - 0xbb, 0xaa, 0xd7, 0xf6, 0x7b, 0x3e, 0xbc, 0x14, 0xc3, 0x0b, 0xc2, 0xe5, - 0x0d, 0x3e, 0xa2, 0xc9, 0x0f, 0xab, 0x8f, 0xe7, 0x84, 0x26, 0x52, 0x10, - 0xfc, 0x5c, 0x44, 0x4f, 0x64, 0x59, 0x8a, 0xc7, 0xe9, 0xa4, 0x63, 0x77, - 0x98, 0xce, 0x96, 0xfe, 0x01, 0xe7, 0xc4, 0x43, 0x62, 0xee, 0x27, 0x94, - 0xc8, 0x3a, 0xaf, 0x33, 0x3d, 0x5c, 0xca, 0x55, 0x89, 0xac, 0xc1, 0x8e, - 0xd3, 0xb4, 0xf8, 0x50, 0x53, 0x58, 0xb3, 0x4a, 0x33, 0x3e, 0x27, 0x42, - 0x82, 0x99, 0xa9, 0x0b, 0xea, 0xe8, 0x26, 0x23, 0x4a, 0x24, 0xb1, 0x46, - 0x5f, 0x19, 0x9e, 0xb1, 0xab, 0xe7, 0x2c, 0x2c, 0xad, 0x86, 0xd2, 0xeb, - 0x7f, 0x67, 0x51, 0xec, 0x0a, 0x73, 0x42, 0x01, 0x17, 0x25, 0x0d, 0xa5, - 0x06, 0x8b, 0xed, 0xa2, 0x92, 0x34, 0x56, 0xcc, 0xb1, 0x2a, 0x87, 0xf5, - 0xd2, 0xdf, 0x92, 0xb9, 0x01, 0x93, 0xc7, 0x94, 0x01, 0x10, 0xb4, 0x1b, - 0x5e, 0xf2, 0x1d, 0x89, 0x42, 0x9f, 0x48, 0xf5, 0x13, 0xfe, 0x1d, 0x61, - 0xda, 0x09, 0xaf, 0x82, 0x9c, 0x9a, 0x47, 0x9c, 0x9d, 0x3a, 0xbf, 0x96, - 0x0a, 0x06, 0xfa, 0x23, 0x58, 0x7e, 0x8e, 0x76, 0x42, 0xa6, 0x26, 0xa4, - 0xb6, 0x8c, 0xad, 0xbf, 0x0b, 0x58, 0x8d, 0x15, 0x10, 0xe7, 0x20, 0x5c, - 0x4e, 0x76, 0xb7, 0xae, 0xf0, 0x45, 0x07, 0x71, 0x6b, 0x98, 0x5d, 0xc0, - 0x46, 0xdf, 0xb7, 0x79, 0xc6, 0xda, 0x11, 0xc8, 0xf8, 0x37, 0xe1, 0x5e, - 0x21, 0xfe, 0xab, 0xbe, 0x7a, 0xdd, 0xd7, 0xe7, 0x35, 0xdd, 0x30, 0xc6, - 0x59, 0xbd, 0xce, 0x7f, 0x15, 0xa2, 0x92, 0xec, 0x23, 0x43, 0x9f, 0x0c, - 0x8f, 0x19, 0x2c, 0xed, 0xbb, 0xb4, 0x5e, 0x20, 0xa8, 0x26, 0xe3, 0x72, - 0x00, 0x83, 0x98, 0xab, 0xb8, 0x48, 0x70, 0x37, 0xb5, 0xe7, 0xdd, 0x6b, - 0x2e, 0x54, 0xc3, 0x93, 0x0f, 0xab, 0x63, 0x2b, 0x71, 0xa8, 0x2f, 0x02, - 0x15, 0x61, 0x51, 0xb3, 0x5d, 0xd7, 0xb4, 0xd1, 0x7f, 0x40, 0xcc, 0xc2, - 0x0f, 0xf4, 0xaf, 0xe7, 0x0c, 0x49, 0x28, 0xee, 0x3b, 0xe9, 0x04, 0x01, - 0x1b, 0x85, 0x5e, 0xa2, 0xa8, 0x3d, 0x50, 0xd5, 0xe3, 0x41, 0xe4, 0x36, - 0x8c, 0x9c, 0xb4, 0x47, 0xb1, 0x18, 0x5e, 0x5f, 0x8b, 0xb2, 0xf6, 0x40, - 0xdd, 0x7f, 0x40, 0xa7, 0x6d, 0xa9, 0x1e, 0x8d, 0xfb, 0x16, 0x2c, 0x53, - 0xf7, 0x44, 0xcc, 0x7a, 0x1a, 0x7b, 0x3d, 0x7d, 0xd7, 0x7f, 0x95, 0x87, - 0x08, 0x1f, 0x31, 0x3b, 0x24, 0xb3, 0x52, 0xc0, 0xdf, 0x0f, 0x72, 0xd5, - 0xe9, 0xe9, 0x1b, 0xd2, 0x29, 0x64, 0x2d, 0x96, 0xcb, 0xc8, 0xe7, 0x83, - 0x33, 0x85, 0x39, 0xf2, 0x3c, 0x93, 0x78, 0x8f, 0xa9, 0x08, 0xf4, 0x3a, - 0x95, 0xa9, 0xf9, 0xdc, 0xc1, 0xee, 0x25, 0x0e, 0xb5, 0xd2, 0xb8, 0xb5, - 0xdb, 0x0b, 0x50, 0xd8, 0x0f, 0xef, 0x18, 0xaa, 0x96, 0x7f, 0x0e, 0x7b, - 0x01, 0xdd, 0xaa, 0x79, 0xaa, 0x72, 0x5e, 0x3b, 0x4b, 0xd2, 0x6f, 0x4d, - 0x17, 0xda, 0xbd, 0xa9, 0xce, 0x91, 0x33, 0xe3, 0xee, 0x30, 0x9b, 0xcb, - 0xf3, 0x48, 0x58, 0x53, 0xa3, 0x65, 0x9b, 0x3a, 0xfb, 0xf9, 0xf9, 0x8b, - 0x84, 0x57, 0xcb, 0x6e, 0x6c, 0x1d, 0x66, 0xdc, 0x1f, 0x1d, 0xe5, 0x54, - 0x50, 0xa9, 0xe0, 0x77, 0xf0, 0x94, 0xd2, 0x29, 0xdd, 0x0e, 0xb0, 0x08, - 0x42, 0x58, 0x89, 0x95, 0x55, 0xc9, 0x11, 0xd6, 0xd0, 0xda, 0x28, 0x4e, - 0x25, 0x4d, 0x1c, 0xd3, 0x4b, 0x84, 0x91, 0x8a, 0x1c, 0xe3, 0x94, 0x42, - 0x94, 0xa0, 0x0e, 0xda, 0x5a, 0x5e, 0xc5, 0xa4, 0xab, 0x32, 0x8d, 0xa0, - 0xb1, 0x71, 0x1e, 0x29, 0x73, 0x97, 0x46, 0x5d, 0x34, 0x74, 0x9d, 0x1e, - 0xa5, 0xe1, 0x55, 0x14, 0xb2, 0x23, 0x5d, 0xe0, 0x2f, 0x1b, 0xae, 0x8f, - 0xea, 0x44, 0x70, 0x6c, 0x08, 0x9f, 0x7d, 0x2a, 0xef, 0x69, 0x72, 0xdc, - 0x18, 0xe6, 0x70, 0xf4, 0xe9, 0x55, 0x99, 0x26, 0xcc, 0x0a, 0x85, 0x99, - 0xe5, 0x11, 0xa3, 0x35, 0xc4, 0xe3, 0xa8, 0x16, 0x99, 0x7f, 0xce, 0x79, - 0xbb, 0x5f, 0x63, 0xae, 0x03, 0x7d, 0x18, 0x98, 0xa2, 0x90, 0x0a, 0xe0, - 0xf7, 0x11, 0x8a, 0xdb, 0xba, 0x3a, 0xbe, 0x0d, 0xd2, 0x0d, 0x4c, 0xed, - 0xfe, 0xe7, 0xd3, 0xbf, 0x75, 0x7c, 0xed, 0x03, 0x5a, 0x15, 0x92, 0x92, - 0x00, 0x42, 0x6b, 0x38, 0x78, 0x56, 0x9b, 0xee, 0xb9, 0x58, 0xc4, 0x71, - 0xdf, 0xcd, 0xdb, 0x8d, 0x3c, 0xc3, 0x05, 0x03, 0x5c, 0xbe, 0xe9, 0x6d, - 0x03, 0x50, 0x10, 0x48, 0x82, 0x2d, 0x14, 0xde, 0xdd, 0xa8, 0x39, 0x07, - 0x1a, 0xce, 0x0c, 0x45, 0xa1, 0xa2, 0xc2, 0x1d, 0xeb, 0x79, 0x25, 0xa5, - 0x63, 0x37, 0x46, 0x1b, 0x3c, 0xf1, 0x45, 0xee, 0xfa, 0x2f, 0x4c, 0x78, - 0xa9, 0x32, 0x8c, 0x92, 0xcb, 0x0a, 0x64, 0x0f, 0xf6, 0xed, 0x68, 0x1d, - 0x55, 0xe5, 0x6c, 0x8f, 0x97, 0x00, 0x3d, 0x76, 0x14, 0x45, 0xb0, 0x6f, - 0x5b, 0x1c, 0x72, 0x4c, 0x6d, 0x21, 0x49, 0x1a, 0xbb, 0x1d, 0x1f, 0xd3, - 0x7e, 0x2d, 0x19, 0x2f, 0xc4, 0x4d, 0x9b, 0x58, 0xe3, 0x41, 0xdc, 0x9f, - 0x87, 0x1e, 0x70, 0x38, 0x9a, 0x95, 0x2b, 0x1b, 0xc8, 0xb6, 0x0b, 0x17, - 0x86, 0x7d, 0xc4, 0x29, 0x7d, 0x00, 0x14, 0xe3, 0x10, 0xb3, 0x91, 0xff, - 0xe6, 0x8f, 0x32, 0x59, 0xef, 0x8e, 0x53, 0xfd, 0xc1, 0xfe, 0xe9, 0x6a, - 0xc8, 0x02, 0xb7, 0x74, 0xbd, 0x98, 0x86, 0x6f, 0x0d, 0x91, 0x12, 0xd3, - 0x1b, 0x88, 0x83, 0x09, 0x34, 0xbf, 0xda, 0xf4, 0x1c, 0x84, 0x9a, 0x0f, - 0x2b, 0x94, 0xce, 0xc2, 0xe6, 0x60, 0x19, 0xa3, 0x2d, 0xcf, 0x38, 0xef, - 0xa9, 0x43, 0x60, 0x72, 0x32, 0x8d, 0x0d, 0x77, 0xe1, 0x32, 0xf5, 0xa1, - 0xa9, 0xbb, 0xbf, 0x9f, 0x77, 0xde, 0x32, 0x00, 0xb6, 0xf3, 0x94, 0x38, - 0x72, 0x85, 0x19, 0xa4, 0xca, 0x40, 0x0b, 0x68, 0x8c, 0x79, 0x10, 0x24, - 0x75, 0xe4, 0x09, 0x3d, 0x33, 0x39, 0x5f, 0xe6, 0xd2, 0xaa, 0xb5, 0x0c, - 0xcf, 0xe4, 0x0d, 0x79, 0xfe, 0x38, 0x6b, 0xe8, 0x43, 0x3c, 0x5d, 0x33, - 0x35, 0x2b, 0xda, 0x6a, 0x73, 0x95, 0xc4, 0x8d, 0xe7, 0x30, 0x49, 0x93, - 0x0e, 0x9e, 0xe6, 0xe2, 0x5d, 0xf9, 0x95, 0x13, 0x23, 0x00, 0xc0, 0xe5, - 0xd7, 0x6f, 0x3c, 0x0d, 0x94, 0x9e, 0xdd, 0xf9, 0x54, 0xa8, 0xcc, 0xfc, - 0x6c, 0x40, 0xa6, 0x52, 0x1f, 0x30, 0x6b, 0x3b, 0x52, 0x39, 0xaa, 0xe4, - 0xc8, 0xfd, 0x90, 0x54, 0xa0, 0xf0, 0x2c, 0x57, 0x97, 0x58, 0x88, 0xb1, - 0xbe, 0xee, 0x95, 0xd8, 0x15, 0x20, 0x45, 0xd2, 0x29, 0x81, 0xb6, 0x6e, - 0xf9, 0x8e, 0xc0, 0x69, 0x23, 0xa9, 0xa7, 0xd1, 0x34, 0x63, 0xbc, 0xcc, - 0xdd, 0x6c, 0xb4, 0x93, 0x85, 0xf1, 0xee, 0xfb, 0x9b, 0x56, 0x68, 0xdd, - 0x8f, 0xae, 0xca, 0x1e, 0xdf, 0x3c, 0x22, 0x96, 0x67, 0x18, 0xba, 0x24, - 0xe2, 0x2f, 0xe1, 0x71, 0x7e, 0x3f, 0x4c, 0x73, 0xbe, 0x4b, 0x1a, 0xae, - 0x39, 0x85, 0x70, 0x54, 0x88, 0x2f, 0xd4, 0xc8, 0xbd, 0x87, 0xcf, 0x64, - 0x1f, 0x01, 0x03, 0x0a, 0x35, 0xa2, 0x95, 0x4b, 0xba, 0x46, 0x21, 0x0b, - 0x03, 0x7d, 0x00, 0x7f, 0x8d, 0xb6, 0x72, 0xaa, 0x27, 0x24, 0x71, 0xbf, - 0x41, 0xc0, 0x87, 0x52, 0xbf, 0x7a, 0xfa, 0x6c, 0xeb, 0x0a, 0x83, 0xbe, - 0xbc, 0x03, 0x2f, 0xfc, 0xf1, 0x62, 0x4d, 0x03, 0x5a, 0xcf, 0xfa, 0xfe, - 0x84, 0x9e, 0xa1, 0x8d, 0x31, 0x9e, 0x30, 0xa2, 0x44, 0x17, 0xd9, 0x94, - 0x71, 0x46, 0x73, 0x8f, 0xd9, 0x08, 0xa7, 0xe9, 0x12, 0xd7, 0x96, 0x00, - 0x34, 0x75, 0x49, 0x45, 0xcc, 0xc3, 0xc6, 0x63, 0x81, 0x85, 0x1d, 0x7e, - 0x88, 0x0b, 0x01, 0xaa, 0x87, 0x9d, 0x38, 0xff, 0x22, 0xe8, 0xac, 0xe8, - 0x44, 0x99, 0xf2, 0x6e, 0xab, 0xfd, 0x39, 0xd0, 0x6d, 0xeb, 0xac, 0xf1, - 0x82, 0xd9, 0x56, 0x6a, 0x3b, 0x5d, 0x35, 0xaf, 0xa2, 0x4f, 0xf5, 0x0a, - 0xaf, 0x94, 0xad, 0x14, 0xae, 0xed, 0xb9, 0xc6, 0xe9, 0xa2, 0x23, 0x09, - 0x88, 0x43, 0x00, 0x4d, 0x4e, 0x11, 0xcf, 0xbd, 0x9a, 0xad, 0xc1, 0xbd, - 0xb3, 0x23, 0x8f, 0x1c, 0x09, 0xdf, 0x4d, 0xd6, 0xf0, 0x14, 0x82, 0x44, - 0x26, 0xd7, 0x86, 0xe4, 0x12, 0x3f, 0x61, 0x82, 0x9d, 0xa0, 0x84, 0x54, - 0xeb, 0x19, 0x35, 0x89, 0x79, 0xbb, 0xe5, 0xac, 0xb6, 0x25, 0x0b, 0x39, - 0x8c, 0x17, 0xb8, 0xc4, 0x93, 0x80, 0x5c, 0x64, 0x91, 0x49, 0x4c, 0xe2, - 0x6b, 0xc1, 0xee, 0xe4, 0xc1, 0x3c, 0x9b, 0xd4, 0x91, 0xa2, 0xb9, 0x09, - 0x52, 0xb4, 0xf1, 0xff, 0xff, 0x27, 0xa1, 0x01, 0x0c, 0x78, 0x46, 0x9c, - 0xd4, 0x77, 0x65, 0xf5, 0x2b, 0x52, 0x89, 0xed, 0xe8, 0x7d, 0xd3, 0x11, - 0x87, 0x40, 0x60, 0xc0, 0xbf, 0x2b, 0x9d, 0xf4, 0x49, 0x42, 0xf5, 0xbb, - 0xe2, 0xc5, 0xb0, 0xf5, 0x78, 0xe3, 0xe6, 0x90, 0x9e, 0xc9, 0x31, 0xed, - 0x4f, 0x05, 0xe2, 0x2a, 0x20, 0xde, 0x66, 0x93, 0x92, 0x40, 0x75, 0x17, - 0xb7, 0xdd, 0x7c, 0x94, 0xbd, 0x73, 0x75, 0xd9, 0x0d, 0x29, 0xaa, 0x76, - 0x92, 0x9f, 0xe1, 0x5c, 0xd9, 0xa3, 0x97, 0x24, 0x7b, 0xaa, 0xc7, 0x7c, - 0x4e, 0x75, 0x5e, 0x59, 0xe1, 0xef, 0x31, 0xef, 0x77, 0x32, 0xa1, 0xf3, - 0x7c, 0x84, 0xb4, 0x7a, 0x44, 0x31, 0x23, 0x7a, 0x2a, 0x88, 0x4d, 0x6c, - 0x1b, 0x3b, 0xf6, 0x99, 0xc0, 0xd2, 0x26, 0xa4, 0x7a, 0x04, 0x60, 0x0a, - 0x02, 0x5d, 0xc3, 0xc5, 0xd3, 0x2b, 0x85, 0xc9, 0xc8, 0x74, 0x3c, 0xd7, - 0xfa, 0x40, 0x01, 0x54, 0x48, 0x32, 0x97, 0x46, 0x6d, 0x72, 0x7f, 0xce, - 0x66, 0x73, 0x8a, 0x89, 0x14, 0x67, 0x34, 0x1f, 0xa2, 0xcd, 0x0c, 0x83, - 0xdf, 0xcd, 0x8a, 0xe4, 0xb1, 0xfd, 0xae, 0x0c, 0x82, 0xe3, 0x56, 0xf3, - 0x4a, 0x27, 0xf3, 0x21, 0x71, 0xc4, 0xec, 0xf9, 0x63, 0xef, 0x20, 0x47, - 0x0c, 0xa9, 0xaa, 0x3f, 0xfe, 0x95, 0xa9, 0x85, 0x2c, 0xb5, 0x07, 0x2f, - 0xbc, 0x59, 0x42, 0x47, 0xa7, 0x91, 0x59, 0x41, 0x2f, 0x90, 0x4e, 0xfb, - 0x72, 0xcc, 0xa5, 0x47, 0xad, 0x66, 0xb9, 0xaf, 0xf5, 0x5a, 0x07, 0x9d, - 0x34, 0x69, 0x98, 0x43, 0x0a, 0xbb, 0xd5, 0x7a, 0xa7, 0x26, 0x30, 0x9f, - 0x28, 0xee, 0x91, 0x6a, 0x79, 0x01, 0xed, 0x53, 0x8c, 0xa9, 0xbf, 0x41, - 0x86, 0xeb, 0x7a, 0xff, 0x1b, 0x6c, 0xbd, 0x7b, 0x31, 0x33, 0x89, 0xf8, - 0x2a, 0xd2, 0x69, 0x5a, 0x4c, 0x5e, 0x2d, 0x48, 0x92, 0x95, 0x4a, 0x76, - 0xff, 0x21, 0x7f, 0x92, 0x4d, 0x4b, 0x32, 0x81, 0x96, 0xfb, 0x73, 0xb3, - 0x99, 0x60, 0x09, 0xf9, 0xc3, 0x80, 0x53, 0x9a, 0x6e, 0x95, 0x15, 0xe3, - 0x25, 0x53, 0xfc, 0xc8, 0xd1, 0x7b, 0xc7, 0x33, 0x64, 0x85, 0xbf, 0x28, - 0xa5, 0x4f, 0x0a, 0x3b, 0x95, 0x49, 0xb2, 0x40, 0x3c, 0x79, 0x2f, 0x96, - 0xfb, 0xcd, 0x27, 0x79, 0x44, 0x3e, 0x5c, 0x73, 0x3f, 0x16, 0x4b, 0x77, - 0xda, 0x3d, 0x7c, 0xd1, 0xcc, 0xf9, 0xfa, 0x17, 0x5e, 0xed, 0x3b, 0xb2, - 0xcb, 0x23, 0x96, 0xa4, 0xa2, 0x38, 0xda, 0xbc, 0xca, 0x12, 0x7f, 0x7f, - 0x0d, 0xd7, 0xc4, 0x48, 0x64, 0xac, 0xf0, 0x01, 0x71, 0x02, 0x01, 0x4f, - 0x60, 0x12, 0xf7, 0x16, 0x2b, 0x5c, 0xaf, 0xcb, 0xcb, 0xee, 0x01, 0x5d, - 0xac, 0x38, 0xf5, 0x6b, 0x29, 0x82, 0x7a, 0x1c, 0xf4, 0x82, 0xee, 0x98, - 0x08, 0x88, 0xa2, 0x1b, 0xfe, 0x0c, 0x7d, 0x7d, 0xee, 0x93, 0x68, 0x08, - 0x46, 0x3b, 0xa0, 0xe9, 0xe4, 0x82, 0x17, 0x4f, 0x72, 0x8e, 0x1b, 0x4c, - 0x00, 0xa7, 0xce, 0x53, 0x02, 0xb8, 0x08, 0xa4, 0xac, 0x56, 0xd3, 0x63, - 0x17, 0xbe, 0x6d, 0xfd, 0xaf, 0x85, 0x29, 0x10, 0x58, 0xeb, 0xd4, 0x8f, - 0x64, 0x68, 0x8e, 0x5e, 0x80, 0x9e, 0x35, 0x5e, 0xe3, 0x65, 0x24, 0x3e, - 0x72, 0x19, 0xcd, 0xd9, 0xd8, 0x69, 0x22, 0x8a, 0xeb, 0xd4, 0xe8, 0xbf, - 0x53, 0x4c, 0xe9, 0xf4, 0xa6, 0x3c, 0xde, 0x35, 0xea, 0x66, 0x4b, 0x4e, - 0x21, 0xf3, 0x63, 0x7d, 0xfd, 0x81, 0x7f, 0xaf, 0x9c, 0x7a, 0xd5, 0x9d, - 0xdb, 0x83, 0xc3, 0x4d, 0xff, 0xe1, 0xf0, 0x4e, 0x1c, 0x9d, 0xfb, 0x51, - 0x92, 0xcc, 0x60, 0xa6, 0x9e, 0xec, 0xd2, 0x80, 0xf0, 0x62, 0x22, 0x95, - 0x30, 0x48, 0xee, 0x7c, 0x52, 0xa2, 0xd2, 0x89, 0x0d, 0xc4, 0x2e, 0xe7, - 0xa2, 0x3d, 0x45, 0x82, 0xdf, 0xde, 0x96, 0x7e, 0x38, 0x8b, 0x6a, 0xb0, - 0xf1, 0xa7, 0x9a, 0xb3, 0xd8, 0xa0, 0xef, 0x03, 0x2c, 0x48, 0x44, 0xf8, - 0xd3, 0x42, 0x27, 0x28, 0x84, 0x38, 0x9d, 0xd0, 0x90, 0xfd, 0xc2, 0x02, - 0x59, 0xdd, 0x0a, 0xf3, 0x28, 0xfd, 0x54, 0x8b, 0x70, 0xc7, 0x74, 0x25, - 0xc5, 0xc0, 0x51, 0x6d, 0xcd, 0x90, 0x7a, 0xb1, 0x87, 0x1b, 0x55, 0xf8, - 0xae, 0x7f, 0x92, 0xdf, 0x3c, 0x58, 0xb3, 0x46, 0x64, 0x2e, 0xab, 0xa2, - 0x33, 0xff, 0xe5, 0x6e, 0xb9, 0xb7, 0x68, 0xc4, 0x40, 0x14, 0x83, 0xe0, - 0xac, 0xdc, 0x23, 0x7e, 0x4c, 0x1c, 0xec, 0x84, 0xfc, 0x28, 0x03, 0x43, - 0xb1, 0x43, 0xba, 0xd7, 0x9d, 0xd3, 0x31, 0x95, 0x6f, 0x31, 0xe4, 0x1c, - 0xde, 0x45, 0xaf, 0x50, 0xf4, 0xac, 0x9f, 0xd6, 0xf4, 0x77, 0xdc, 0x31, - 0xc4, 0x1c, 0x30, 0x72, 0x92, 0xf4, 0xdd, 0x26, 0xb4, 0x3f, 0xe2, 0xd6, - 0x1f, 0x22, 0xba, 0xd8, 0xaa, 0xd4, 0x61, 0xbb, 0x98, 0x11, 0xe8, 0x15, - 0x1e, 0x09, 0x91, 0xfd, 0xc3, 0x56, 0xe8, 0xd5, 0xc0, 0xdd, 0xf8, 0xfc, - 0xc9, 0x2a, 0x6b, 0xe7, 0x90, 0xfc, 0xc6, 0x09, 0xfe, 0x7b, 0xd9, 0x26, - 0x1e, 0xda, 0xf3, 0xc2, 0x3a, 0xba, 0x3e, 0x5c, 0x9e, 0x8a, 0xe7, 0x97, - 0x9c, 0xc4, 0x2b, 0xb9, 0x70, 0xc3, 0xe6, 0xc9, 0x18, 0xc8, 0xa2, 0x1a, - 0x8c, 0xd8, 0x6a, 0xfb, 0x9d, 0x43, 0x5d, 0x20, 0x82, 0xbd, 0xc1, 0x57, - 0x1b, 0xe7, 0x46, 0x1b, 0x7b, 0x9c, 0xd8, 0x4c, 0x53, 0x4a, 0x06, 0x4e, - 0x71, 0xd8, 0x37, 0x3c, 0x99, 0xc9, 0xfd, 0xba, 0x76, 0xc9, 0x7a, 0x65, - 0x21, 0xa3, 0x55, 0xa4, 0x7a, 0xbb, 0xa6, 0x34, 0x84, 0xc9, 0xd9, 0x0e, - 0x10, 0xde, 0xab, 0x36, 0xa0, 0x36, 0xa0, 0xcb, 0x66, 0x87, 0x4c, 0x77, - 0x0d, 0xd7, 0xd7, 0x9d, 0x26, 0x56, 0x78, 0x40, 0x4c, 0xae, 0xe1, 0x95, - 0xf9, 0x05, 0xae, 0xe3, 0x72, 0x58, 0xdd, 0x30, 0x4e, 0x8a, 0xb3, 0xb4, - 0x91, 0xfd, 0xaf, 0x42, 0xf2, 0x67, 0x81, 0x13, 0x6c, 0xfa, 0xf0, 0xd7, - 0x8b, 0x61, 0x8c, 0x33, 0x2e, 0xec, 0x98, 0xf7, 0x55, 0x0c, 0x16, 0x6d, - 0x1d, 0xf8, 0x2e, 0x95, 0xb8, 0x24, 0x3e, 0x2e, 0xff, 0x0a, 0x28, 0x05, - 0x6f, 0x29, 0xc3, 0x11, 0x9c, 0x62, 0x2b, 0x70, 0xd2, 0x60, 0x3d, 0xd7, - 0x43, 0x01, 0xac, 0x37, 0x69, 0x9e, 0xb3, 0xac, 0x6b, 0x29, 0x1a, 0x02, - 0xeb, 0xa1, 0x45, 0x11, 0xdc, 0xeb, 0x64, 0xb9, 0x59, 0x99, 0x3a, 0xe7, - 0xab, 0xd6, 0x47, 0x21, 0x60, 0x3a, 0xe9, 0x78, 0xa8, 0x9f, 0xe4, 0x4d, - 0xb0, 0x11, 0xe3, 0x7b, 0x4c, 0x58, 0x20, 0xd2, 0xe6, 0x45, 0xdb, 0x49, - 0x3c, 0x50, 0x66, 0x88, 0x9b, 0xd6, 0x11, 0xcb, 0x54, 0x17, 0xa1, 0x84, - 0xf0, 0x2d, 0xf8, 0xe3, 0xa0, 0x67, 0x27, 0xbc, 0x3e, 0x9d, 0x67, 0x54, - 0xa6, 0x04, 0xf2, 0x99, 0x54, 0x00, 0x21, 0x37, 0xb1, 0x34, 0x59, 0x3b, - 0x74, 0x37, 0xb4, 0x83, 0x0a, 0x50, 0xcc, 0x63, 0x31, 0xc0, 0x85, 0x53, - 0xa8, 0x13, 0xf8, 0x9d, 0x9a, 0x30, 0x37, 0x9d, 0xdb, 0x58, 0xa2, 0xbc, - 0xa8, 0x30, 0xa7, 0x38, 0xd6, 0xea, 0x4d, 0xb1, 0x42, 0xc5, 0xaa, 0x81, - 0x4a, 0x66, 0x71, 0x2a, 0x78, 0x01, 0xdb, 0x37, 0xe2, 0x77, 0x4f, 0x56, - 0xab, 0xf5, 0xcf, 0x94, 0x0d, 0xf7, 0x8b, 0x4a, 0x48, 0xd7, 0xb1, 0x58, - 0x3f, 0x37, 0x44, 0x09, 0x8e, 0x8f, 0x07, 0xb8, 0x77, 0xa9, 0x04, 0x02, - 0xa2, 0x63, 0x6c, 0xab, 0x04, 0x42, 0x0c, 0xbb, 0x0b, 0x17, 0xfb, 0xe3, - 0x4f, 0xab, 0xb1, 0x10, 0xcc, 0xc5, 0x6b, 0x18, 0x1b, 0xe2, 0xca, 0x84, - 0xbb, 0x07, 0xca, 0xf0, 0x1b, 0x0d, 0x52, 0x8b, 0x8f, 0x17, 0xc0, 0x2e, - 0x43, 0xc4, 0x77, 0x89, 0x91, 0xbd, 0x9a, 0xa1, 0xbd, 0xed, 0x41, 0x2a, - 0x77, 0xd4, 0x31, 0x54, 0x98, 0xdc, 0x20, 0x51, 0x45, 0xc1, 0x7f, 0x1b, - 0xd8, 0x6d, 0x10, 0x19, 0xb3, 0x87, 0x07, 0xe0, 0xb9, 0x81, 0xbd, 0x60, - 0x7b, 0x9a, 0x3a, 0x10, 0x9b, 0x3b, 0x92, 0xf3, 0x79, 0x47, 0x32, 0x8a, - 0x8c, 0xe8, 0x98, 0x57, 0xe4, 0x6e, 0x18, 0xd5, 0xbe, 0x2d, 0x2f, 0xa0, - 0xd8, 0x41, 0x0b, 0x5f, 0x07, 0x82, 0x68, 0x37, 0xdd, 0x83, 0x6a, 0x39, - 0xd1, 0x09, 0x66, 0x37, 0x97, 0xc3, 0x20, 0x3a, 0x4d, 0x53, 0xd3, 0x23, - 0x55, 0xaf, 0x2b, 0x91, 0xe2, 0xca, 0x4c, 0x3e, 0xaa, 0xfa, 0xa4, 0x4b, - 0x9c, 0x62, 0x17, 0x9d, 0xe5, 0x7b, 0xdf, 0xf0, 0x7d, 0xdf, 0xe2, 0x83, - 0x9a, 0xd9, 0xf3, 0xe8, 0xb3, 0xd5, 0x86, 0xa7, 0x7b, 0xe5, 0x8f, 0x7c, - 0x52, 0x7e, 0x4c, 0xc1, 0x74, 0xe2, 0xaa, 0x24, 0xee, 0x95, 0xb6, 0xaf, - 0xbb, 0x77, 0xd7, 0x9d, 0xab, 0xf5, 0x44, 0xfc, 0x94, 0xe8, 0x2c, 0x87, - 0x3d, 0xbb, 0x94, 0x5d, 0x74, 0xf8, 0x0e, 0x92, 0xad, 0x47, 0x63, 0x0d, - 0xde, 0x6b, 0x3b, 0x9d, 0x0a, 0x54, 0xb6, 0x22, 0x24, 0x3e, 0xab, 0xed, - 0xe7, 0x97, 0xc4, 0x4b, 0x6c, 0x1d, 0x1f, 0xec, 0x59, 0x52, 0x47, 0xc2, - 0x2d, 0x11, 0x51, 0x31, 0x4b, 0x06, 0xe9, 0x5e, 0x2f, 0x1e, 0x34, 0x5e, - 0x9b, 0xe1, 0x5d, 0xc2, 0x4d, 0xde, 0xe4, 0x81, 0xfc, 0xa6, 0x5d, 0x0e, - 0xd1, 0x48, 0x18, 0x37, 0x53, 0x74, 0x83, 0x97, 0x32, 0x0c, 0x01, 0x5b, - 0xaf, 0xf8, 0x38, 0xac, 0x6e, 0x4d, 0x97, 0x8c, 0xbe, 0xf1, 0x79, 0x2d, - 0xc6, 0x04, 0x43, 0x50, 0x34, 0x90, 0x8e, 0x25, 0x27, 0x18, 0x3d, 0xa7, - 0x9f, 0x96, 0xa4, 0x0f, 0x70, 0x0d, 0xcb, 0x81, 0xc8, 0xac, 0xa2, 0xe1, - 0x78, 0xf2, 0xbc, 0xa5, 0x11, 0xd6, 0x6e, 0x5f, 0xb6, 0x48, 0xbe, 0x3b, - 0x77, 0x3d, 0x09, 0x90, 0xb3, 0xf5, 0xa5, 0x49, 0x24, 0x0b, 0xce, 0x05, - 0xe2, 0xd2, 0xf8, 0x8a, 0x83, 0xe3, 0x10, 0xa0, 0xa8, 0x9f, 0x80, 0x6e, - 0x9a, 0x0f, 0xc7, 0xb0, 0x75, 0x9f, 0x34, 0xd2, 0xcd, 0x10, 0x4d, 0xb6, - 0xcb, 0x40, 0x7b, 0xd8, 0x9d, 0x17, 0xf5, 0x94, 0xaa, 0x26, 0xa9, 0x1f, - 0x15, 0xc2, 0x34, 0x42, 0xf8, 0xcf, 0xf0, 0x16, 0x32, 0x56, 0xdd, 0x05, - 0xb8, 0x53, 0xac, 0xfb, 0xb1, 0xd7, 0xda, 0xbf, 0x0d, 0x98, 0x71, 0x31, - 0xe7, 0x49, 0x5a, 0x04, 0xdf, 0xc4, 0x65, 0xc1, 0x09, 0x4b, 0x85, 0xe1, - 0x2d, 0x68, 0x19, 0xce, 0x9e, 0x20, 0xcf, 0x4e, 0x48, 0x9c, 0xe1, 0xf2, - 0xe9, 0xff, 0x2d, 0x89, 0x4c, 0xf4, 0x59, 0x11, 0x7d, 0x30, 0x74, 0x63, - 0xc4, 0xc2, 0x57, 0xe6, 0x90, 0x86, 0x89, 0xfd, 0x49, 0x02, 0x10, 0xae, - 0xa0, 0xc2, 0xc4, 0x5e, 0x07, 0xbc, 0x84, 0x04, 0x9a, 0x50, 0x54, 0x8b, - 0xdf, 0x6f, 0x29, 0xa2, 0x5e, 0xa8, 0x73, 0xf7, 0xe9, 0x26, 0x89, 0x72, - 0x1c, 0x58, 0x53, 0xfa, 0x3f, 0x6f, 0x9a, 0x93, 0x7e, 0xa0, 0xe9, 0xf2, - 0xc0, 0xf0, 0x7e, 0x3b, 0xb0, 0xa9, 0x97, 0xf8, 0xb7, 0x0e, 0x27, 0x17, - 0x92, 0x59, 0x7d, 0xd5, 0x6e, 0x17, 0x10, 0xc0, 0xc8, 0x3d, 0xbc, 0xbc, - 0xfc, 0xac, 0x4f, 0x36, 0x24, 0x98, 0xd1, 0x2a, 0xbe, 0x4f, 0xc6, 0xca, - 0xf6, 0xe4, 0x14, 0xeb, 0xa1, 0xa6, 0x8b, 0xb9, 0x09, 0xe1, 0x77, 0x2f, - 0x68, 0xb7, 0x65, 0x54, 0xb1, 0xef, 0x65, 0x48, 0x47, 0x26, 0xe8, 0x4f, - 0x60, 0x5d, 0x1c, 0x12, 0x74, 0x15, 0x9d, 0x41, 0x6a, 0x83, 0x8d, 0xb6, - 0xb8, 0x93, 0x31, 0x41, 0xbe, 0xf9, 0xe6, 0x78, 0x7e, 0x57, 0x63, 0x77, - 0x76, 0x4e, 0xbe, 0xbe, 0xea, 0xe8, 0x45, 0x4f, 0xc8, 0x97, 0x07, 0x87, - 0x29, 0xe6, 0x66, 0xc1, 0xc8, 0x42, 0x07, 0x2c, 0x95, 0xfa, 0xa4, 0x56, - 0x00, 0x13, 0x9c, 0x6c, 0x83, 0x94, 0x1f, 0x15, 0xff, 0x15, 0x35, 0x3a, - 0x57, 0x96, 0x13, 0x4c, 0xfb, 0x8d, 0x55, 0x41, 0x81, 0xfb, 0x94, 0x8b, - 0xec, 0xc3, 0x2f, 0xdc, 0xf0, 0x4e, 0x7c, 0x62, 0xbc, 0x3e, 0x8f, 0xd3, - 0x64, 0x08, 0xa6, 0xf4, 0xbc, 0x11, 0xd9, 0xc3, 0xcc, 0x56, 0xef, 0xba, - 0x04, 0xa7, 0xef, 0x81, 0xf5, 0xa9, 0x0a, 0x5d, 0xc0, 0xbc, 0xfa, 0x1c, - 0x96, 0xd3, 0xbd, 0x9b, 0xe0, 0x8d, 0x28, 0x12, 0x4b, 0x7d, 0x14, 0x6d, - 0xd4, 0x02, 0xb1, 0xad, 0x9d, 0x22, 0x58, 0x25, 0x81, 0x14, 0x63, 0x29, - 0x27, 0x93, 0x48, 0x35, 0x27, 0x33, 0x31, 0xc8, 0x1d, 0xd9, 0xd5, 0x28, - 0x90, 0xc5, 0x6b, 0x79, 0x06, 0x3e, 0xa8, 0xde, 0x62, 0x73, 0x67, 0xf9, - 0xa7, 0xd2, 0x22, 0xdc, 0x16, 0xb9, 0x5e, 0x0f, 0xd2, 0xb5, 0x54, 0x6b, - 0x66, 0x07, 0xa5, 0x87, 0x8d, 0xfb, 0xa1, 0x34, 0x16, 0x0e, 0x95, 0xf1, - 0x8f, 0x73, 0xcd, 0x93, 0x11, 0x94, 0xc2, 0xa3, 0x5e, 0xcb, 0xe2, 0xed, - 0x87, 0xd8, 0xf1, 0x2c, 0x3a, 0x27, 0xa5, 0x44, 0x4d, 0xb8, 0x05, 0x70, - 0xe0, 0xf5, 0x3e, 0xd4, 0x9f, 0xc8, 0x7d, 0x2f, 0x3a, 0x86, 0x00, 0xbf, - 0x79, 0xc7, 0x2d, 0x85, 0xad, 0x5e, 0xb5, 0xe4, 0xc6, 0x2c, 0x40, 0xdb, - 0x46, 0x41, 0xbc, 0x40, 0xfe, 0xef, 0x16, 0x19, 0x1a, 0x3b, 0x7d, 0x0f, - 0xe3, 0x92, 0x81, 0x2a, 0x59, 0x6c, 0xdf, 0xf5, 0xed, 0xf4, 0x4a, 0xbf, - 0xb4, 0x93, 0x71, 0xe1, 0x4a, 0x70, 0x04, 0xc6, 0xc6, 0x20, 0xd7, 0x84, - 0xcd, 0xd6, 0x8f, 0x88, 0x0b, 0xfd, 0x7b, 0xcb, 0x11, 0x06, 0xf9, 0x60, - 0x82, 0xb9, 0x34, 0xde, 0x21, 0x8f, 0xf4, 0x2e, 0xe1, 0xd6, 0x07, 0x74, - 0xe0, 0xd0, 0x27, 0x56, 0x94, 0x8e, 0xa9, 0x93, 0x85, 0xbb, 0xf9, 0x3d, - 0x0e, 0x1e, 0x3e, 0xf2, 0x1b, 0xfb, 0xf5, 0x8c, 0xd4, 0xd1, 0x5e, 0x06, - 0xe2, 0xdc, 0x83, 0x97, 0x64, 0x1c, 0x48, 0x26, 0xbe, 0x85, 0x13, 0x6a, - 0x18, 0xd5, 0xc4, 0x20, 0xbc, 0xb2, 0xb9, 0x23, 0x6d, 0x8a, 0xfc, 0x32, - 0xdd, 0x1f, 0xb0, 0x7e, 0x07, 0x40, 0xdc, 0xbf, 0x82, 0x32, 0xc5, 0x21, - 0xb8, 0xb3, 0x94, 0xe5, 0xf7, 0x3a, 0x6e, 0xdb, 0xe2, 0x76, 0xe0, 0x04, - 0x14, 0x03, 0xf0, 0x19, 0x86, 0xd8, 0xbc, 0xca, 0x25, 0x36, 0xce, 0xe5, - 0xf5, 0x16, 0x91, 0x39, 0x2b, 0x69, 0xcf, 0x1e, 0x99, 0x72, 0xd7, 0xf8, - 0x8e, 0x88, 0xad, 0x0a, 0xf5, 0x14, 0x9f, 0x6b, 0x13, 0xa4, 0x32, 0xc0, - 0x68, 0x0b, 0x90, 0x29, 0x92, 0x9c, 0xbc, 0x94, 0x7b, 0x7a, 0x13, 0x0f, - 0x7a, 0x49, 0xd2, 0x16, 0xe3, 0x8a, 0xb4, 0x2e, 0x6f, 0x6c, 0x21, 0x2d, - 0x22, 0x68, 0x1f, 0xb1, 0x15, 0xff, 0xd3, 0x69, 0x68, 0x41, 0x52, 0x89, - 0x6b, 0xe8, 0x9c, 0x28, 0xbc, 0xf2, 0xf0, 0xd2, 0x81, 0x40, 0xae, 0xb8, - 0x2b, 0xe2, 0x28, 0xf6, 0x95, 0x70, 0x1d, 0xba, 0xe2, 0xe8, 0x6e, 0x9a, - 0x2d, 0x69, 0xad, 0xfb, 0xd3, 0x4f, 0xa3, 0x8c, 0x1d, 0x46, 0x1e, 0x6b, - 0xa8, 0xb0, 0x00, 0x23, 0x93, 0xf3, 0x95, 0xe5, 0x59, 0xc1, 0x87, 0x3e, - 0x5f, 0xc0, 0x66, 0x6b, 0x00, 0x6f, 0x0b, 0xee, 0xcc, 0xf2, 0x9c, 0xcb, - 0x49, 0x73, 0x3d, 0x61, 0xbf, 0x41, 0x7a, 0xcf, 0x69, 0xd4, 0x83, 0x03, - 0xfc, 0x63, 0x89, 0x64, 0x44, 0x5f, 0x94, 0x28, 0x51, 0xcc, 0xfd, 0x17, - 0xa9, 0x7d, 0xe9, 0xee, 0x58, 0xb4, 0x15, 0x51, 0x47, 0xca, 0x23, 0xc3, - 0x0d, 0x6e, 0xd9, 0x8f, 0xaa, 0x3f, 0x98, 0x23, 0x3f, 0xfa, 0xef, 0xd8, - 0x91, 0x64, 0xfa, 0x3e, 0x45, 0x09, 0xc2, 0x4d, 0x19, 0xc9, 0xe2, 0x17, - 0x8e, 0x87, 0x8d, 0x36, 0xbc, 0xf7, 0xa2, 0xd2, 0x4e, 0xca, 0x5b, 0x8e, - 0x7d, 0xa5, 0xbb, 0xe7, 0xf9, 0x85, 0x61, 0xf3, 0x37, 0xe2, 0x51, 0x52, - 0x5f, 0x41, 0x9f, 0xb0, 0x82, 0x82, 0xc1, 0x81, 0xea, 0xfd, 0x07, 0xe4, - 0x40, 0x7e, 0x16, 0x7f, 0x3e, 0xcb, 0xa9, 0x2d, 0x34, 0x29, 0x47, 0x14, - 0x60, 0xcd, 0xe5, 0xc5, 0xc0, 0x7f, 0x3e, 0x2d, 0x50, 0xad, 0xd8, 0xcb, - 0x9c, 0xf7, 0xc3, 0xa5, 0xfb, 0x86, 0x61, 0x78, 0x9e, 0x32, 0x4c, 0xce, - 0x8e, 0x21, 0xda, 0x76, 0x2d, 0x4b, 0x80, 0xd1, 0xeb, 0x78, 0xe6, 0x26, - 0x21, 0x8b, 0xc9, 0x86, 0x89, 0xb0, 0x3d, 0x70, 0xdd, 0x33, 0x21, 0xb3, - 0x50, 0xc4, 0x93, 0x06, 0xd1, 0x1e, 0x27, 0xc4, 0x6c, 0xd2, 0xc2, 0x5b, - 0xa9, 0xea, 0x95, 0x94, 0x3c, 0xc6, 0xef, 0xb9, 0xa4, 0x79, 0xa3, 0xb5, - 0x5f, 0xda, 0x02, 0x83, 0x20, 0xa5, 0x30, 0x79, 0x62, 0x3b, 0x7b, 0xd8, - 0x9a, 0xbf, 0x94, 0xa0, 0xcd, 0xa2, 0x7e, 0xd0, 0x64, 0xf1, 0x14, 0x82, - 0x03, 0xb9, 0x93, 0xc3, 0xe2, 0x0e, 0xde, 0x8d, 0xdb, 0x99, 0x8a, 0x26, - 0x9a, 0x73, 0xb9, 0xc9, 0x8f, 0x95, 0x12, 0x49, 0x22, 0x28, 0x8e, 0x6a, - 0x10, 0xc7, 0x7a, 0x35, 0x4d, 0xc3, 0xc7, 0x03, 0x35, 0x12, 0x70, 0x02, - 0x39, 0x6f, 0xa5, 0x3d, 0xca, 0xf4, 0xbd, 0x10, 0x6e, 0x43, 0x77, 0x54, - 0xa5, 0x3e, 0x65, 0xf5, 0x27, 0x63, 0x87, 0xf1, 0xd1, 0x3b, 0xa9, 0xdc, - 0xc2, 0x87, 0x40, 0xc6, 0x7c, 0xc5, 0x3a, 0x4e, 0xfc, 0x72, 0x12, 0x8a, - 0x4a, 0xfb, 0xbe, 0xcb, 0xb3, 0x77, 0x10, 0x2e, 0xeb, 0xb3, 0x0c, 0x67, - 0xf4, 0x48, 0x67, 0xe2, 0x8f, 0x32, 0xeb, 0x04, 0xf0, 0x61, 0x3b, 0xdc, - 0x77, 0x49, 0xac, 0x3e, 0x89, 0xef, 0x6f, 0x2e, 0x9d, 0x8b, 0xdd, 0x7c, - 0x60, 0x58, 0xb1, 0x71, 0xbf, 0xb2, 0x2e, 0xb2, 0xbe, 0x76, 0xdb, 0xaa, - 0x32, 0x0d, 0xb6, 0x66, 0xc8, 0xd1, 0x70, 0x52, 0xbc, 0x2b, 0x62, 0x28, - 0xa3, 0xc8, 0x1c, 0x5e, 0x62, 0xac, 0x69, 0xc4, 0x2f, 0xc0, 0xc3, 0xfa, - 0x41, 0xc4, 0xae, 0xcd, 0x3f, 0x5e, 0xcf, 0x6f, 0x07, 0x58, 0x75, 0xd8, - 0x0a, 0x9c, 0x33, 0x4c, 0x3c, 0x0d, 0x91, 0xad, 0xe4, 0x9d, 0xc0, 0x21, - 0x70, 0x8c, 0x2f, 0xcc, 0xc3, 0x31, 0xff, 0xd7, 0x24, 0x5b, 0xc0, 0xc0, - 0x14, 0xdb, 0x32, 0x2e, 0xc8, 0x80, 0x20, 0x96, 0x9d, 0x9b, 0xf6, 0x97, - 0x08, 0xdb, 0xed, 0x97, 0x46, 0xbf, 0x1d, 0xa0, 0x3a, 0xad, 0x92, 0x48, - 0x54, 0xd6, 0x48, 0xa9, 0xef, 0xc0, 0xb2, 0x3e, 0x5c, 0x48, 0x7b, 0xea, - 0x26, 0x1b, 0xe6, 0xef, 0x99, 0xd0, 0xd3, 0xbd, 0x69, 0x23, 0xc8, 0x3e, - 0x23, 0x83, 0x44, 0xd8, 0x47, 0xfa, 0x46, 0x9f, 0xec, 0xcc, 0x8d, 0x96, - 0x6a, 0x68, 0x5f, 0xe9, 0xae, 0x81, 0xe9, 0x56, 0xf6, 0x28, 0xb7, 0xe0, - 0xa8, 0x10, 0xe1, 0xfa, 0x9e, 0x8e, 0x15, 0xaf, 0x69, 0x15, 0x75, 0xc6, - 0x4a, 0x93, 0x80, 0xb7, 0x70, 0x1e, 0x03, 0xea, 0x3e, 0x2b, 0x4c, 0x34, - 0xc2, 0x85, 0xdb, 0x98, 0x81, 0xa8, 0x3e, 0x26, 0xf1, 0xdc, 0x39, 0xdc, - 0xbb, 0x69, 0x85, 0x31, 0x78, 0xc2, 0x09, 0xab, 0x65, 0x3c, 0xa2, 0x83, - 0xa9, 0x8e, 0x44, 0xfe, 0xfb, 0xc1, 0x8b, 0x34, 0x6b, 0xb7, 0x65, 0x7b, - 0xb3, 0x20, 0x3d, 0x84, 0x11, 0xdc, 0xcd, 0x27, 0xcf, 0x82, 0xce, 0x5b, - 0xc8, 0x91, 0x45, 0x3d, 0xac, 0xa5, 0x2b, 0x69, 0xf4, 0xe1, 0xab, 0x76, - 0x4d, 0x6d, 0x79, 0x08, 0xad, 0x7f, 0xb7, 0x1c, 0x74, 0xed, 0x81, 0xc1, - 0xe2, 0xaf, 0x20, 0xad, 0x83, 0x34, 0x2e, 0xd1, 0x7c, 0x30, 0xd6, 0x3f, - 0x1f, 0x4d, 0xaf, 0x6f, 0x3b, 0x26, 0x4f, 0x28, 0x0d, 0x2f, 0x58, 0x26, - 0xa3, 0x7f, 0x45, 0x35, 0xbf, 0x48, 0xcc, 0xda, 0x7a, 0xdb, 0xe9, 0x4e, - 0x5d, 0x52, 0x90, 0x74, 0x67, 0x4b, 0x2b, 0x99, 0xb0, 0x1a, 0x27, 0x4c, - 0x93, 0x2a, 0xbe, 0x80, 0xb7, 0x8b, 0xd5, 0x19, 0x3d, 0x50, 0x47, 0x09, - 0x1d, 0x30, 0x07, 0x08, 0x86, 0x6d, 0xbb, 0x83, 0x6b, 0x2f, 0x76, 0x06, - 0x27, 0x48, 0x58, 0xf3, 0x1a, 0xc7, 0x3d, 0x96, 0xbb, 0x4c, 0xbf, 0x4d, - 0x3f, 0x7c, 0x05, 0x45, 0x34, 0x14, 0xef, 0xab, 0x14, 0xb9, 0xd9, 0x58, - 0xfe, 0x1e, 0x22, 0x7e, 0x71, 0x83, 0xe2, 0xdb, 0xc0, 0xfb, 0x76, 0x30, - 0x78, 0x4e, 0x70, 0x4c, 0x19, 0x79, 0xdb, 0xba, 0x67, 0x93, 0x5f, 0x9c, - 0x28, 0x57, 0x1e, 0xab, 0x58, 0x5e, 0x26, 0x2b, 0xee, 0xad, 0x17, 0x39, - 0xa2, 0x04, 0x35, 0xdd, 0xb0, 0x24, 0x76, 0x78, 0x06, 0xf6, 0x34, 0x82, - 0xd4, 0x1b, 0xf0, 0xf1, 0x4f, 0xa7, 0xe8, 0x80, 0x86, 0x76, 0xa5, 0x75, - 0x2b, 0x8e, 0xd6, 0x7a, 0x6e, 0x1c, 0x20, 0x53, 0x1a, 0xf0, 0x49, 0xe7, - 0x78, 0x63, 0xc4, 0x34, 0xfa, 0xe4, 0x2c, 0xae, 0x01, 0x40, 0x3c, 0xf1, - 0xb6, 0xf8, 0xc6, 0xf1, 0xaf, 0xca, 0xe0, 0xf8, 0xf0, 0x0f, 0xbc, 0xcc, - 0x60, 0x27, 0xf4, 0x93, 0x28, 0xe4, 0xa3, 0x6a, 0x56, 0xc8, 0x21, 0x64, - 0x3e, 0xd8, 0x41, 0x9b, 0x91, 0xe9, 0x45, 0x04, 0x1d, 0x79, 0x9b, 0x0b, - 0x36, 0x5c, 0xf6, 0x24, 0xd1, 0xd6, 0xea, 0xa0, 0xf7, 0xbd, 0xc7, 0xba, - 0xd5, 0xf0, 0xb2, 0xff, 0xdb, 0x30, 0x2c, 0x74, 0x85, 0xb1, 0xe0, 0x64, - 0xe6, 0xc6, 0x9e, 0x16, 0x20, 0xe8, 0x38, 0x4a, 0xed, 0xf5, 0xa2, 0xc1, - 0x90, 0xfd, 0x17, 0xf9, 0x3e, 0xff, 0x27, 0x06, 0xd6, 0xee, 0x7d, 0xa0, - 0x2f, 0xf9, 0x78, 0xea, 0x42, 0x06, 0xd6, 0xe6, 0xad, 0x47, 0xa5, 0xb4, - 0xa6, 0x72, 0xa6, 0xa4, 0x03, 0x7b, 0x32, 0xf1, 0xaa, 0xe3, 0x55, 0x5b, - 0xfc, 0xdd, 0x87, 0x86, 0x90, 0xd2, 0xcb, 0x27, 0x43, 0xdf, 0x6c, 0x96, - 0x34, 0x23, 0xf9, 0xeb, 0x13, 0x7b, 0x19, 0x88, 0xb5, 0x6d, 0x52, 0x9c, - 0xaf, 0xcb, 0xb9, 0xc0, 0xff, 0x0c, 0xc8, 0xc6, 0x0e, 0x8f, 0x0f, 0x8f, - 0x4f, 0xc4, 0xb4, 0x5b, 0xf2, 0x84, 0x25, 0xea, 0x62, 0xb9, 0x8b, 0x5e, - 0xef, 0x82, 0x76, 0x14, 0x28, 0xd8, 0xcb, 0xae, 0x85, 0x60, 0x1d, 0xf6, - 0x47, 0xd0, 0x04, 0xa6, 0xee, 0x48, 0xc9, 0xc1, 0x7f, 0x81, 0x50, 0xf0, - 0x00, 0x1d, 0x60, 0x5e, 0x77, 0x1b, 0x09, 0x3a, 0x6e, 0xac, 0xb0, 0x1e, - 0xbf, 0xcd, 0xce, 0x2a, 0xe3, 0x36, 0x41, 0xec, 0xef, 0x28, 0xa6, 0x37, - 0x84, 0x16, 0x92, 0xb6, 0xdc, 0x64, 0xfc, 0x83, 0x2c, 0xcd, 0x41, 0xed, - 0x12, 0x7c, 0x97, 0x3f, 0xc2, 0xaf, 0xc7, 0xbd, 0x16, 0xdf, 0x45, 0x2a, - 0x0d, 0x7a, 0xbe, 0xd0, 0xc7, 0x9e, 0x77, 0xc3, 0x05, 0xc6, 0x3b, 0x8b, - 0x2c, 0x9f, 0xf8, 0x24, 0xe1, 0xc0, 0x9f, 0x69, 0xa6, 0x24, 0xdd, 0x0b, - 0x40, 0xae, 0x13, 0x5a, 0x41, 0xb4, 0x53, 0xc7, 0x24, 0x49, 0x51, 0x30, - 0xd7, 0xc5, 0xac, 0x92, 0xc0, 0x88, 0x0f, 0x8c, 0x60, 0x7b, 0xe6, 0xd4, - 0x60, 0x0e, 0x87, 0x02, 0x1f, 0x5a, 0xee, 0xc6, 0x10, 0xc9, 0x3b, 0xb5, - 0xf2, 0xb7, 0x15, 0x59, 0xb6, 0x2d, 0x9c, 0xa7, 0x83, 0x46, 0x5b, 0x73, - 0x89, 0x24, 0x65, 0x6c, 0xb9, 0x39, 0x55, 0x16, 0x2e, 0xec, 0xa4, 0x8d, - 0xe0, 0xba, 0x60, 0x58, 0xac, 0xda, 0xa3, 0x28, 0x04, 0x72, 0x82, 0x0b, - 0x78, 0x02, 0x3b, 0x18, 0x52, 0x58, 0xd5, 0xa6, 0x1a, 0x85, 0xfa, 0x6e, - 0x05, 0x58, 0x1f, 0x9e, 0x13, 0x3c, 0x2a, 0xe3, 0x5d, 0x94, 0x53, 0xae, - 0x5e, 0xff, 0x1d, 0x6c, 0x36, 0xf3, 0x7f, 0x4a, 0xde, 0xf7, 0x72, 0xe2, - 0xb3, 0xd3, 0xe4, 0xe2, 0x55, 0x4c, 0xef, 0x4e, 0x76, 0xff, 0xa6, 0x44, - 0xa9, 0xa5, 0x12, 0xb5, 0x58, 0xc8, 0x42, 0xbc, 0xf6, 0xaf, 0x43, 0x7f, - 0xc9, 0x72, 0x54, 0xbe, 0xe7, 0xa9, 0xf1, 0xde, 0x78, 0xaa, 0xd7, 0x56, - 0x4a, 0xee, 0x2e, 0x26, 0xfc, 0xb9, 0xd0, 0xba, 0x47, 0x81, 0xa8, 0x28, - 0x8c, 0x54, 0xaa, 0x86, 0x02, 0xe5, 0xdb, 0xbc, 0x26, 0x37, 0x3e, 0x24, - 0x32, 0x58, 0x21, 0xe3, 0x1f, 0xc0, 0xd4, 0xb2, 0x04, 0xf8, 0xf9, 0x20, - 0xdb, 0x9a, 0xea, 0x66, 0xc9, 0x74, 0x54, 0x40, 0x65, 0xb7, 0x81, 0x55, - 0x4a, 0x63, 0x0a, 0x01, 0xf7, 0xbc, 0xfe, 0x92, 0x2a, 0xa7, 0xf3, 0x29, - 0xb5, 0xc7, 0x6e, 0x08, 0x58, 0x03, 0x59, 0x1c, 0x5c, 0x09, 0x44, 0xa7, - 0x82, 0x43, 0xc9, 0x40, 0x01, 0x6d, 0xf0, 0x40, 0xf5, 0xf1, 0x4d, 0xb2, - 0x30, 0x47, 0xbe, 0x32, 0x4d, 0x86, 0x22, 0xd5, 0xd8, 0xb5, 0xe1, 0x39, - 0xc9, 0xe2, 0x61, 0xed, 0xa6, 0xd7, 0x74, 0x62, 0x23, 0x49, 0x94, 0xe9, - 0x8e, 0xed, 0x4f, 0x04, 0xd1, 0x86, 0x44, 0xb9, 0x51, 0x7a, 0x75, 0x7f, - 0x91, 0xc5, 0xc1, 0x1e, 0x53, 0x54, 0xf2, 0xf5, 0xfc, 0x15, 0xf6, 0x9a, - 0x1b, 0x67, 0x15, 0xb8, 0x0a, 0x4e, 0x54, 0xa0, 0xc0, 0x00, 0xe1, 0xc8, - 0xb7, 0x3b, 0x14, 0xd1, 0x77, 0xe0, 0x77, 0x23, 0x1c, 0x27, 0x74, 0xb9, - 0x01, 0x2b, 0xf2, 0x99, 0x4e, 0x05, 0xa9, 0x94, 0x04, 0x6c, 0xfd, 0x27, - 0x6c, 0x24, 0x38, 0x98, 0x46, 0x2c, 0x15, 0x1b, 0x5f, 0xa6, 0x4e, 0x17, - 0x65, 0x8f, 0xb5, 0xd5, 0x79, 0x2c, 0xc3, 0xc6, 0xbd, 0xe7, 0xe4, 0x15, - 0xca, 0x7a, 0xaf, 0x07, 0xc7, 0x78, 0xb5, 0x17, 0xc9, 0xc8, 0x89, 0xc7, - 0xd7, 0x5f, 0x2b, 0x95, 0xa5, 0xf8, 0x1d, 0x86, 0xa7, 0x8c, 0x4b, 0xdb, - 0x8e, 0x3b, 0xe2, 0xe6, 0x74, 0x0e, 0x09, 0x68, 0x6a, 0x1e, 0x58, 0x8a, - 0xc9, 0x75, 0x3f, 0xc4, 0x20, 0x53, 0x37, 0xc9, 0x29, 0x91, 0x79, 0x6d, - 0xc9, 0x2b, 0xba, 0xa6, 0x55, 0xb7, 0x7a, 0x02, 0x52, 0xc1, 0x2c, 0x6b, - 0x9b, 0xad, 0x2f, 0x13, 0x38, 0xdb, 0xc2, 0x2d, 0x5a, 0x77, 0x54, 0x45, - 0xad, 0x19, 0xa4, 0x9c, 0x2a, 0xff, 0x21, 0xb6, 0xfc, 0xa5, 0x24, 0xce, - 0xe7, 0x84, 0xe0, 0x00, 0xa0, 0xf5, 0xbb, 0x3e, 0x38, 0xb5, 0xac, 0x4d, - 0xb5, 0xb0, 0xef, 0xe6, 0xb4, 0xf9, 0xa3, 0x25, 0xa5, 0x55, 0x6a, 0xcc, - 0x95, 0xa8, 0x2f, 0x97, 0x70, 0xe8, 0xee, 0x14, 0x55, 0x53, 0x43, 0xe7, - 0x5b, 0xaa, 0xc6, 0xab, 0xbf, 0x91, 0x9b, 0x24, 0x64, 0x42, 0x71, 0x1f, - 0x2f, 0xfd, 0xef, 0xed, 0xc6, 0x80, 0x6e, 0xc5, 0x97, 0x87, 0xa0, 0xc6, - 0x01, 0xca, 0x49, 0x32, 0xe5, 0x47, 0xac, 0x0a, 0x41, 0xca, 0xb5, 0x48, - 0x7f, 0x7b, 0xa5, 0xa7, 0x4d, 0x3b, 0x0c, 0x4c, 0x94, 0x31, 0x70, 0xb7, - 0x53, 0xa0, 0xf8, 0xda, 0x72, 0x14, 0x40, 0x7c, 0x9c, 0x9a, 0x7f, 0x08, - 0x27, 0x65, 0x1c, 0x5a, 0x5c, 0xb0, 0x50, 0xb7, 0x16, 0x7c, 0x85, 0x8e, - 0x09, 0x26, 0x6e, 0x45, 0xa6, 0x72, 0x30, 0x5d, 0x0c, 0x24, 0xd3, 0x3e, - 0x42, 0x2d, 0x4f, 0x4a, 0xcf, 0x4d, 0xfc, 0x30, 0xe1, 0xf0, 0xde, 0x84, - 0x92, 0xe9, 0x9e, 0x62, 0x0e, 0xe0, 0x6a, 0x87, 0x98, 0xce, 0xf6, 0xfa, - 0x7a, 0x23, 0x4f, 0x9a, 0x5d, 0xd6, 0xff, 0x51, 0x64, 0xa2, 0xc4, 0x7f, - 0x03, 0x06, 0xde, 0x32, 0x91, 0xc1, 0x0e, 0xc0, 0x71, 0x6b, 0xf6, 0xc8, - 0x97, 0x14, 0xb9, 0x4f, 0x3c, 0x5a, 0x00, 0xad, 0xd7, 0xa2, 0x3f, 0x89, - 0x9d, 0x14, 0xe0, 0xdf, 0xc1, 0x92, 0x84, 0xb0, 0xde, 0xff, 0x07, 0xb9, - 0xdc, 0x8d, 0x60, 0xca, 0x1e, 0x91, 0x03, 0x7b, 0x9c, 0x46, 0xe1, 0xe5, - 0xf1, 0xf0, 0x8e, 0x11, 0x79, 0xdb, 0x5d, 0xe8, 0x9e, 0xcf, 0xf6, 0x5d, - 0xa9, 0x94, 0x9d, 0xcb, 0xa4, 0xf0, 0x3f, 0x0b, 0xd3, 0xd5, 0xf9, 0xff, - 0x01, 0xb4, 0x9e, 0xec, 0x7f, 0xbd, 0x44, 0x20, 0x8f, 0x0f, 0x2a, 0xb1, - 0xfa, 0x8a, 0x1d, 0xb5, 0x2f, 0x2b, 0x76, 0x73, 0x8d, 0xe9, 0x60, 0x98, - 0x94, 0xe4, 0x53, 0x3b, 0xe7, 0xfe, 0x4c, 0xc2, 0xd0, 0x61, 0x8f, 0x90, - 0x4e, 0x86, 0xe6, 0xe8, 0xf8, 0x72, 0x01, 0xf5, 0x6b, 0xd8, 0xa0, 0x52, - 0x67, 0x88, 0xd3, 0xd6, 0x2e, 0x8b, 0x07, 0x7c, 0xcb, 0x2d, 0x12, 0x6a, - 0x4d, 0xc8, 0x62, 0x70, 0x4e, 0x36, 0xd9, 0xdd, 0xec, 0xe4, 0xf3, 0xf0, - 0x3c, 0x70, 0x0d, 0x3e, 0xf6, 0x3d, 0xce, 0xae, 0xb2, 0x9a, 0xef, 0x03, - 0x85, 0x28, 0xea, 0x7c, 0x4c, 0x2e, 0x7c, 0xf9, 0xa4, 0xd8, 0xc3, 0x91, - 0xef, 0xac, 0xc8, 0x33, 0x22, 0xb3, 0xaf, 0x2e, 0x9e, 0x03, 0x49, 0xfa, - 0x95, 0xda, 0x60, 0x31, 0x7a, 0x80, 0x40, 0x68, 0xc6, 0xec, 0x03, 0x66, - 0x01, 0xe9, 0x1c, 0xe6, 0xae, 0x7a, 0x05, 0x70, 0x30, 0x37, 0xab, 0x2c, - 0xa7, 0x80, 0x50, 0x34, 0x67, 0x35, 0xd2, 0x6d, 0x85, 0x58, 0xc9, 0xdc, - 0xec, 0x51, 0x17, 0x3a, 0x31, 0xcf, 0x02, 0x1a, 0xee, 0x85, 0x0d, 0x41, - 0x28, 0xf6, 0x22, 0xb2, 0x25, 0xf6, 0x29, 0xf7, 0xba, 0x8c, 0xee, 0x47, - 0xf0, 0xc9, 0xa6, 0xb2, 0xf8, 0x53, 0x33, 0x43, 0xc4, 0x21, 0xed, 0xb0, - 0x19, 0x45, 0x9d, 0x5d, 0xe3, 0x27, 0xbe, 0x8b, 0x8c, 0x10, 0x59, 0x74, - 0xf7, 0xad, 0xd0, 0xf6, 0x2c, 0x56, 0x80, 0xc5, 0xe5, 0x3a, 0xe2, 0xc2, - 0xf1, 0x79, 0x41, 0xaf, 0x04, 0x10, 0xfb, 0x35, 0x85, 0xb9, 0x9a, 0x28, - 0x30, 0x04, 0x4b, 0x06, 0xd4, 0x5d, 0x4c, 0x7b, 0x46, 0x84, 0x65, 0xff, - 0x4d, 0xe5, 0x86, 0x37, 0xe6, 0x16, 0x8c, 0x9d, 0xb1, 0x3b, 0xe6, 0x57, - 0xd7, 0x87, 0x54, 0x30, 0x21, 0xb4, 0xe4, 0x3e, 0x96, 0x58, 0xf3, 0x7b, - 0x76, 0xe9, 0x7e, 0x60, 0x7c, 0x9b, 0x2b, 0x39, 0x5a, 0x4d, 0x3d, 0x8d, - 0xe9, 0x13, 0x91, 0x5f, 0x05, 0xe1, 0x10, 0x6c, 0x0d, 0xe6, 0x7b, 0xec, - 0x9a, 0xaf, 0xaf, 0xd2, 0x01, 0xd6, 0x4c, 0x25, 0xd6, 0x6f, 0x7b, 0x34, - 0xa2, 0x8e, 0xdf, 0x22, 0x9d, 0x08, 0xcc, 0x05, 0xbf, 0x24, 0x07, 0x13, - 0x81, 0x2f, 0x93, 0x07, 0x2b, 0xf7, 0xe2, 0x8d, 0x18, 0xac, 0x31, 0xa1, - 0x55, 0x4d, 0xf2, 0x64, 0x73, 0x5c, 0x8a, 0x42, 0xf5, 0x56, 0xf3, 0x14, - 0xf3, 0x3d, 0xf0, 0x36, 0x98, 0xe1, 0x5d, 0x72, 0x69, 0xae, 0x48, 0xdb, - 0x54, 0xe5, 0xa9, 0xac, 0x9f, 0xce, 0x1d, 0xd5, 0xe4, 0x72, 0x4c, 0x01, - 0x8e, 0x7d, 0x23, 0x4b, 0xe4, 0xdb, 0x66, 0xbb, 0x7b, 0x41, 0xa3, 0x33, - 0xbb, 0x72, 0xd2, 0xc8, 0x3d, 0xad, 0x1a, 0x2c, 0x28, 0x70, 0x52, 0x4d, - 0xff, 0x67, 0x28, 0x8c, 0xa8, 0x92, 0x50, 0x91, 0x32, 0xdb, 0x6c, 0xc3, - 0x96, 0xe5, 0x67, 0xc8, 0xf2, 0x4b, 0xd8, 0x9c, 0x5c, 0x11, 0x73, 0x60, - 0xce, 0xda, 0xf9, 0x02, 0x77, 0x91, 0xb4, 0x87, 0x93, 0x39, 0x45, 0x0d, - 0x6b, 0x44, 0x2c, 0xf0, 0xd7, 0x50, 0xe9, 0xa4, 0xd8, 0x8e, 0xf6, 0xec, - 0xcc, 0x50, 0x4d, 0x2a, 0xc3, 0x46, 0x70, 0x50, 0x8d, 0x1b, 0x29, 0x14, - 0xef, 0x2c, 0x0b, 0xae, 0xa7, 0x4a, 0xd5, 0x5b, 0x54, 0xdc, 0xb6, 0xe8, - 0xb6, 0x05, 0x8d, 0x0e, 0x06, 0x9f, 0x77, 0x93, 0xe4, 0xe2, 0xf9, 0x00, - 0x71, 0x62, 0xc8, 0x03, 0x8c, 0x41, 0x84, 0xd0, 0x48, 0xfb, 0xe1, 0x09, - 0x2c, 0x9f, 0x95, 0x4a, 0x3f, 0x58, 0x31, 0xfe, 0x1c, 0x8d, 0x60, 0x79, - 0xef, 0xa9, 0xca, 0x46, 0x92, 0xeb, 0x5d, 0xf4, 0x18, 0xda, 0x6a, 0x96, - 0xdb, 0x22, 0x66, 0x8f, 0xb1, 0xde, 0xec, 0xdc, 0x49, 0xc2, 0x84, 0x43, - 0xcc, 0xfc, 0x83, 0x45, 0xef, 0xe3, 0x99, 0xd2, 0x7b, 0x74, 0x94, 0xf7, - 0x34, 0x41, 0x25, 0xe5, 0x63, 0x9a, 0xff, 0x66, 0xa6, 0x3c, 0x98, 0x3d, - 0x83, 0x5c, 0x63, 0xf2, 0x3a, 0xf6, 0xd2, 0x8d, 0x5c, 0x6e, 0x22, 0xaf, - 0xec, 0xd0, 0x09, 0xdc, 0x6f, 0x05, 0xd0, 0x7c, 0xad, 0xcc, 0x32, 0x7a, - 0x08, 0x6b, 0x47, 0x9f, 0x94, 0x91, 0xf1, 0xfa, 0x72, 0xa5, 0x8e, 0x65, - 0x79, 0x4f, 0xe7, 0x7e, 0xa5, 0xd9, 0xba, 0x4d, 0x25, 0x8f, 0x7c, 0x0b, - 0xc7, 0xf9, 0x7b, 0x55, 0x3b, 0xe3, 0x81, 0x39, 0x8b, 0xd3, 0xf9, 0x8c, - 0x4c, 0xe4, 0x7c, 0xc3, 0x73, 0x98, 0x95, 0xea, 0x1b, 0x23, 0xb8, 0x87, - 0x67, 0xec, 0x67, 0x0d, 0x27, 0x2d, 0xac, 0x54, 0x53, 0x18, 0xd6, 0xb2, - 0x03, 0x97, 0xdb, 0x27, 0x09, 0x07, 0xda, 0x85, 0xe8, 0x87, 0xdd, 0x1a, - 0xf8, 0x9f, 0x9e, 0xec, 0xf9, 0xfd, 0x0b, 0x28, 0x50, 0xc1, 0x06, 0xc6, - 0xe0, 0x96, 0x46, 0xa4, 0x7d, 0x0d, 0x23, 0x11, 0x8b, 0x67, 0xb6, 0xc4, - 0xe2, 0x4c, 0xf4, 0xe8, 0x0e, 0x0a, 0x2a, 0x25, 0x5d, 0x16, 0xa1, 0x37, - 0xa2, 0x8d, 0x15, 0x33, 0x9a, 0x3b, 0xf4, 0x4b, 0xd0, 0xcd, 0x94, 0x17, - 0x1c, 0x80, 0x36, 0xc4, 0xe8, 0xab, 0x38, 0xdb, 0x09, 0x67, 0xcf, 0xdb, - 0xa3, 0x3e, 0xbd, 0xa4, 0x20, 0x27, 0x9b, 0x1b, 0xf8, 0x8d, 0x5f, 0xa5, - 0x82, 0x51, 0x36, 0x50, 0x24, 0x5a, 0x49, 0x59, 0x00, 0xa2, 0x66, 0x97, - 0x07, 0xd2, 0x59, 0x4c, 0x7d, 0x5e, 0xfc, 0xd1, 0xc0, 0x9d, 0xa6, 0x4c, - 0xa2, 0xd4, 0xd2, 0xfa, 0xda, 0xd0, 0xba, 0x9b, 0x17, 0x95, 0x7f, 0x5f, - 0xe3, 0x4c, 0xe6, 0x4a, 0x55, 0xe1, 0x3b, 0x6e, 0xaf, 0x8b, 0x05, 0x99, - 0x8d, 0x5e, 0x3a, 0x3d, 0x64, 0x9d, 0x2f, 0x4e, 0x55, 0xe0, 0x58, 0xab, - 0x46, 0xdf, 0x1d, 0xdf, 0x6b, 0xf7, 0xbf, 0xad, 0x01, 0xc5, 0xe0, 0xe7, - 0x2d, 0x3d, 0x89, 0xe5, 0x58, 0x21, 0xd4, 0xd5, 0xb5, 0xce, 0x52, 0x7f, - 0x75, 0x22, 0xd9, 0x9d, 0xbb, 0xe7, 0x31, 0xbd, 0x3d, 0x20, 0x5c, 0xad, - 0x0b, 0x5e, 0x65, 0xeb, 0x23, 0xe7, 0x8d, 0x54, 0x9d, 0x3f, 0x43, 0x51, - 0x49, 0x00, 0xf1, 0xee, 0xbc, 0x2f, 0x9f, 0x2f, 0xa8, 0x45, 0x1f, 0x57, - 0xf5, 0xf4, 0x2f, 0xcc, 0x98, 0xa2, 0x24, 0x57, 0x81, 0xe1, 0x81, 0x93, - 0x44, 0x8d, 0x26, 0xcd, 0xec, 0x78, 0x54, 0xad, 0x12, 0xd7, 0xd0, 0x5b, - 0x4f, 0xbe, 0xda, 0x0e, 0x06, 0x1d, 0x13, 0xc9, 0xab, 0x1f, 0x8b, 0x5b, - 0xcb, 0x13, 0x7e, 0x09, 0x6b, 0x47, 0x85, 0xfe, 0xab, 0x08, 0x77, 0xae, - 0x1f, 0x80, 0x27, 0xb5, 0xec, 0x89, 0xc8, 0xd4, 0x44, 0x08, 0xba, 0xb0, - 0xdb, 0x52, 0xb4, 0x8f, 0x05, 0x13, 0xc6, 0x1e, 0xa1, 0x49, 0x47, 0xd8, - 0xe8, 0x73, 0xca, 0x74, 0x59, 0xe2, 0x41, 0xe1, 0x14, 0x16, 0x7b, 0x47, - 0x67, 0x6a, 0xf8, 0x8e, 0x1d, 0xe8, 0x38, 0xd4, 0xee, 0xa9, 0x7e, 0x3a, - 0x3b, 0xe7, 0xea, 0x15, 0x52, 0x25, 0x54, 0x78, 0x85, 0x7e, 0x50, 0xfc, - 0x30, 0x01, 0x34, 0x4a, 0x97, 0xe8, 0x0a, 0xa4, 0x00, 0xa4, 0x3e, 0x68, - 0x70, 0x1f, 0x1c, 0x9f, 0x73, 0x7c, 0xbe, 0xe1, 0x7e, 0x23, 0x2d, 0x7d, - 0x26, 0x9b, 0x92, 0x5e, 0x92, 0x38, 0x57, 0x85, 0xcf, 0x9d, 0x18, 0x00, - 0x05, 0xe7, 0xfd, 0x38, 0x4f, 0x87, 0x03, 0x1e, 0xbe, 0xb4, 0xb5, 0x3f, - 0x4e, 0xe4, 0x70, 0xe0, 0x7f, 0x6c, 0xfc, 0xad, 0x8b, 0x0c, 0x22, 0xae, - 0xfd, 0xad, 0x7e, 0x2b, 0x75, 0xc5, 0x01, 0x68, 0x64, 0x96, 0x1f, 0xa0, - 0xff, 0xdc, 0x72, 0x42, 0x21, 0x60, 0xd1, 0xe1, 0x0a, 0x17, 0x5f, 0xe2, - 0x7e, 0xe8, 0xe5, 0x04, 0xa5, 0x66, 0x53, 0x66, 0xfb, 0xd1, 0x95, 0x0c, - 0xb8, 0xff, 0xf3, 0x92, 0x9a, 0x23, 0xe2, 0xc8, 0xa4, 0x9b, 0xe2, 0xc6, - 0x40, 0xfd, 0xf3, 0x3c, 0x2d, 0x0d, 0x27, 0xf4, 0xfa, 0xdc, 0xa2, 0x56, - 0x3f, 0x50, 0x78, 0x3e, 0x62, 0x80, 0xa9, 0x0c, 0x4f, 0x34, 0xe6, 0xd6, - 0x5d, 0xc2, 0xb0, 0x81, 0xc5, 0x67, 0xf6, 0x27, 0x9d, 0x7c, 0x99, 0x35, - 0xbe, 0x9a, 0x6c, 0x05, 0x28, 0x63, 0xac, 0xc0, 0x01, 0x5e, 0x7b, 0xa0, - 0xe6, 0x7f, 0x33, 0xb3, 0xe3, 0xf7, 0x11, 0xb0, 0x7d, 0x03, 0xb5, 0xcb, - 0xf7, 0x20, 0xed, 0xee, 0x1d, 0x04, 0x6b, 0x05, 0xa3, 0x86, 0x71, 0x84, - 0x4f, 0xe7, 0x84, 0x6d, 0xbe, 0xed, 0xda, 0x35, 0xd1, 0x44, 0x05, 0x33, - 0x5b, 0xa7, 0xef, 0xa0, 0xc1, 0x69, 0x80, 0xe2, 0xe1, 0x52, 0xf4, 0xb1, - 0x14, 0x25, 0x1b, 0x90, 0x96, 0xa0, 0xef, 0x2d, 0xdb, 0x21, 0x8f, 0x36, - 0x75, 0x7c, 0xe1, 0xa6, 0x43, 0x46, 0x0c, 0x7c, 0xd0, 0xfa, 0xcd, 0xea, - 0x49, 0x21, 0x34, 0xa4, 0xbb, 0xcc, 0x39, 0x26, 0x64, 0xf9, 0xa3, 0x68, - 0xed, 0xcf, 0x6f, 0xc0, 0x8b, 0xe0, 0x26, 0x4c, 0x8c, 0x70, 0x69, 0xde, - 0x97, 0x1a, 0x23, 0xbc, 0xc7, 0xba, 0xc8, 0xb3, 0xfd, 0x97, 0x01, 0x1b, - 0x7c, 0x1e, 0x79, 0xd3, 0xf1, 0xbb, 0xd8, 0xab, 0xd8, 0xd7, 0x93, 0xcf, - 0x0f, 0xa4, 0x8c, 0x37, 0x2e, 0xb1, 0x8b, 0xdc, 0x26, 0xd4, 0x8e, 0xd7, - 0xb9, 0x00, 0xc0, 0x71, 0xfc, 0xef, 0x80, 0xf4, 0xaf, 0xda, 0xf9, 0xc7, - 0xda, 0x84, 0xf1, 0xcb, 0x77, 0xd5, 0x9e, 0x9f, 0xf7, 0x6d, 0x82, 0x10, - 0x32, 0x2d, 0xc7, 0xa0, 0x70, 0xe3, 0xec, 0xc7, 0x7d, 0x0c, 0x8d, 0xf5, - 0x01, 0x03, 0xbe, 0x14, 0x3b, 0x8e, 0x0b, 0xa5, 0x1c, 0x6b, 0x7b, 0x6d, - 0xad, 0x2c, 0x84, 0x7e, 0xdb, 0x7d, 0x9a, 0x93, 0x89, 0x9f, 0x89, 0xec, - 0x7b, 0xb4, 0xcf, 0xe2, 0x74, 0x17, 0xa0, 0xc6, 0x71, 0x20, 0x28, 0x85, - 0xb3, 0x16, 0xf1, 0x9d, 0x9b, 0x2a, 0xc0, 0xb6, 0x52, 0x7c, 0x54, 0x22, - 0x56, 0x46, 0x16, 0x99, 0x54, 0xea, 0xa1, 0xfa, 0xc8, 0x4e, 0x83, 0x6c, - 0xb8, 0xfd, 0x8c, 0x37, 0x90, 0x3c, 0x29, 0x0b, 0x02, 0x69, 0x34, 0xec, - 0xca, 0xb3, 0x2e, 0x7d, 0x41, 0x08, 0x1b, 0x0b, 0x7e, 0x93, 0x99, 0xa7, - 0xff, 0x2c, 0xe9, 0x60, 0xc5, 0xc3, 0xea, 0xe3, 0xc8, 0xde, 0x08, 0x51, - 0x50, 0x3d, 0xbf, 0x59, 0xb5, 0xa3, 0x10, 0xd3, 0x8a, 0x23, 0x6f, 0xb4, - 0xfd, 0x1a, 0x24, 0x49, 0x72, 0x97, 0xa4, 0x9c, 0xd4, 0x8f, 0xcd, 0x38, - 0x22, 0x65, 0x9a, 0xfc, 0x9b, 0xff, 0xcf, 0xef, 0xdb, 0x21, 0x2a, 0x98, - 0x3f, 0xdd, 0x5f, 0x36, 0xe9, 0x3f, 0xca, 0x5d, 0x8d, 0x23, 0x0c, 0x7f, - 0xc4, 0xa5, 0xbd, 0xdf, 0xd1, 0x8c, 0xf7, 0xce, 0x79, 0x45, 0xac, 0x99, - 0x16, 0xba, 0xd8, 0xd4, 0xc8, 0x6f, 0x64, 0x7e, 0x82, 0xa8, 0x76, 0xc9, - 0x9d, 0x07, 0x22, 0xc0, 0xf9, 0x0d, 0x34, 0x1c, 0x12, 0xf5, 0x20, 0x8d, - 0xaf, 0xbb, 0x68, 0xb7, 0x7f, 0x04, 0xa9, 0xf0, 0x27, 0xf2, 0x21, 0xa6, - 0x6c, 0xe0, 0x9f, 0xfa, 0xf8, 0xde, 0x1f, 0x1d, 0xac, 0xa7, 0x8a, 0x5f, - 0x93, 0xf5, 0xbe, 0xdc, 0x0f, 0xd0, 0xdd, 0x64, 0x85, 0x37, 0x11, 0xc1, - 0xf1, 0xb5, 0x9e, 0xc8, 0x2a, 0x9f, 0x09, 0xce, 0xe6, 0xb3, 0x87, 0x1e, - 0xc5, 0xc5, 0x94, 0xe3, 0xf7, 0x49, 0xe9, 0x60, 0x5c, 0xcf, 0x96, 0x0c, - 0x21, 0xb9, 0xac, 0xf5, 0xad, 0x40, 0xf1, 0x18, 0x2c, 0xe2, 0xcb, 0xb2, - 0x47, 0x08, 0xfb, 0x08, 0x7d, 0x1e, 0xf3, 0x45, 0x57, 0x96, 0x22, 0x7a, - 0x1f, 0x05, 0x82, 0xa8, 0xd0, 0x2f, 0x7f, 0xd1, 0x41, 0x39, 0x72, 0xb4, - 0x8b, 0xf6, 0xed, 0x44, 0xaa, 0x9b, 0xd0, 0x2e, 0x43, 0x5e, 0x02, 0x23, - 0x86, 0xed, 0x53, 0xda, 0xa4, 0xf9, 0xb1, 0xf7, 0x6b, 0x75, 0xc8, 0x99, - 0x4b, 0x16, 0x8b, 0x67, 0x8b, 0x9c, 0x0e, 0x09, 0x43, 0xa5, 0x03, 0xa5, - 0x1b, 0x82, 0x15, 0x6c, 0xb5, 0x1c, 0x1b, 0xd2, 0xb9, 0x43, 0x12, 0xad, - 0x7d, 0x75, 0x10, 0x45, 0xc3, 0x57, 0xf8, 0x96, 0x4e, 0xda, 0xca, 0x40, - 0xea, 0xcb, 0x7f, 0x04, 0xf3, 0x33, 0xdb, 0xe6, 0x3c, 0x4a, 0x05, 0xaa, - 0xf4, 0x42, 0xc8, 0x16, 0x15, 0xa4, 0x06, 0x64, 0xbf, 0xd4, 0x15, 0x3e, - 0x50, 0x15, 0x38, 0xcb, 0xc2, 0x6e, 0x16, 0xf8, 0x55, 0x6f, 0xbb, 0xe8, - 0x01, 0xd1, 0x82, 0xec, 0x4a, 0x44, 0xc2, 0xdb, 0x99, 0x25, 0xaa, 0x73, - 0xcb, 0x54, 0x30, 0x31, 0xc1, 0x02, 0xd7, 0xed, 0x4c, 0x37, 0x9f, 0x56, - 0x54, 0xa3, 0xbe, 0xd1, 0x39, 0x4a, 0x53, 0x34, 0x64, 0x3a, 0x14, 0xfe, - 0xe5, 0x15, 0x45, 0xe0, 0x5c, 0xa5, 0x3a, 0x92, 0x80, 0xb2, 0xfe, 0xe4, - 0x6c, 0x77, 0x0f, 0xae, 0xa0, 0xb3, 0x49, 0xeb, 0x1c, 0x11, 0xbb, 0x81, - 0x85, 0x6a, 0xe0, 0x81, 0x25, 0x8a, 0xd8, 0xdf, 0x6b, 0xf5, 0x46, 0x38, - 0xaf, 0x5b, 0x2b, 0xe2, 0x16, 0x20, 0x45, 0x7a, 0x55, 0x2c, 0x5d, 0xda, - 0xd9, 0xdf, 0x80, 0xe2, 0x6c, 0x66, 0x03, 0x66, 0x05, 0xe5, 0x87, 0x0a, - 0xf0, 0x10, 0x02, 0xe4, 0x4b, 0xd9, 0xde, 0x0d, 0x8f, 0xf0, 0x17, 0xa4, - 0x67, 0xa4, 0xe6, 0x2a, 0x14, 0x49, 0xbe, 0xb1, 0x3f, 0xa0, 0xe6, 0x7b, - 0x98, 0xe2, 0x4d, 0xe0, 0x49, 0x46, 0xa6, 0xdf, 0x03, 0x01, 0x3b, 0x56, - 0xf1, 0x49, 0xea, 0x70, 0x19, 0x68, 0x86, 0x15, 0xd5, 0xbc, 0xc1, 0x79, - 0xec, 0x90, 0x7c, 0x33, 0x73, 0x0a, 0x09, 0x02, 0x3c, 0xf4, 0x16, 0x7c, - 0x0c, 0x41, 0x69, 0xd4, 0x70, 0xdf, 0x73, 0x0a, 0xc5, 0x1e, 0x07, 0x4c, - 0x44, 0xb3, 0x6c, 0xfe, 0x5b, 0x60, 0x93, 0xb9, 0x11, 0x7c, 0x9c, 0x4b, - 0x29, 0xb2, 0xdb, 0x4c, 0x45, 0x6e, 0x21, 0x76, 0xd2, 0x5b, 0x8c, 0x1b, - 0xbd, 0x20, 0xb7, 0xe1, 0x83, 0x4c, 0x9f, 0x34, 0x57, 0x69, 0x8b, 0x84, - 0x54, 0x53, 0xab, 0x4a, 0xc5, 0xed, 0x94, 0x3d, 0x2c, 0xb2, 0x91, 0x0b, - 0x29, 0x64, 0xb5, 0xa2, 0x8d, 0x48, 0x9e, 0x8a, 0x2a, 0xed, 0x53, 0x4a, - 0x33, 0xa5, 0x8b, 0xaf, 0xb9, 0xd7, 0xae, 0x1b, 0x0e, 0xe7, 0xda, 0x36, - 0x3a, 0x68, 0x00, 0xe2, 0xec, 0xd8, 0xa2, 0xd3, 0x7d, 0x94, 0x72, 0x58, - 0x7c, 0xc4, 0x08, 0xfc, 0x48, 0x45, 0x54, 0x39, 0xb3, 0x1f, 0xa0, 0xe3, - 0x65, 0xd9, 0x0f, 0xa8, 0x33, 0x7a, 0x80, 0xcf, 0x16, 0x0f, 0x67, 0xfd, - 0x67, 0xd2, 0x59, 0x02, 0x22, 0x3d, 0x0c, 0x06, 0x38, 0x55, 0xf3, 0x54, - 0x89, 0x56, 0xa8, 0xf8, 0x62, 0x0b, 0x58, 0x90, 0xd2, 0xaf, 0xdf, 0xdb, - 0xc1, 0xff, 0x00, 0x8f, 0x77, 0xff, 0xe1, 0xb2, 0xca, 0xd4, 0xe1, 0x50, - 0x45, 0xbc, 0xd4, 0x83, 0x36, 0x44, 0x45, 0xd0, 0xcc, 0xee, 0x42, 0xc3, - 0x3d, 0x56, 0x35, 0xcf, 0x00, 0x81, 0x97, 0xd9, 0x9b, 0x14, 0x85, 0xc2, - 0xad, 0x63, 0xd1, 0xbd, 0xba, 0x54, 0x80, 0x66, 0x75, 0x96, 0x23, 0xdd, - 0xea, 0x3a, 0x66, 0x5a, 0xd7, 0x89, 0xb5, 0x6f, 0xbd, 0xf0, 0xf8, 0x83, - 0x09, 0xc9, 0xb8, 0x77, 0x87, 0x6a, 0x62, 0x40, 0x09, 0xfc, 0x42, 0xd1, - 0x32, 0x75, 0x4b, 0xa6, 0x5d, 0x90, 0x88, 0x9c, 0xe2, 0x9e, 0x64, 0x9e, - 0x3c, 0x0e, 0x64, 0xe2, 0x6d, 0xd2, 0xdb, 0xa3, 0x87, 0x30, 0x1f, 0x42, - 0x87, 0x8d, 0xf2, 0xc6, 0x70, 0x6c, 0xa2, 0x43, 0xec, 0x95, 0x27, 0x9a, - 0xa3, 0xfc, 0xd3, 0x09, 0x1c, 0x61, 0x18, 0xce, 0xd3, 0x6f, 0x1e, 0x90, - 0x9a, 0x58, 0x0b, 0xea, 0x0b, 0x79, 0x5e, 0x17, 0x40, 0x65, 0xef, 0x6e, - 0xc1, 0xff, 0x88, 0x14, 0x0c, 0xe3, 0x8e, 0x36, 0x55, 0xd0, 0xee, 0x2a, - 0x28, 0x96, 0x2a, 0x45, 0xa1, 0x33, 0xd6, 0xfa, 0xfe, 0x9f, 0x3a, 0x85, - 0x0f, 0x12, 0xdb, 0xbb, 0xe7, 0x02, 0x6a, 0xb3, 0xf2, 0xad, 0x30, 0xc6, - 0x1e, 0x32, 0xc3, 0x3a, 0x30, 0x8c, 0x89, 0x11, 0x4d, 0x89, 0x56, 0x38, - 0xb6, 0x19, 0x15, 0xc1, 0x4e, 0x4f, 0x2b, 0x1d, 0xc8, 0x69, 0xb3, 0x51, - 0x9b, 0xf6, 0x68, 0x1e, 0x7a, 0xc4, 0x27, 0x75, 0x01, 0x3b, 0xed, 0x14, - 0x46, 0xe6, 0x1a, 0x95, 0x66, 0x17, 0x24, 0xea, 0xfa, 0x4b, 0xde, 0x2a, - 0xd5, 0xaf, 0x90, 0xf6, 0x28, 0x96, 0x03, 0x45, 0x63, 0x73, 0xe8, 0x78, - 0x91, 0x27, 0xbe, 0xe5, 0xda, 0x4b, 0x4f, 0x2a, 0xa5, 0xed, 0x43, 0xed, - 0x44, 0x9d, 0x65, 0x34, 0x8e, 0x5f, 0x50, 0xb8, 0x75, 0x4c, 0xb7, 0x14, - 0x59, 0xe8, 0x4a, 0xcf, 0xfa, 0x00, 0x4b, 0x12, 0x82, 0x9b, 0x94, 0x95, - 0xa7, 0x65, 0xcd, 0x66, 0x49, 0x69, 0xdf, 0x29, 0xf4, 0x50, 0xfc, 0xe3, - 0x06, 0x4f, 0xc7, 0xbf, 0x1a, 0x44, 0xd2, 0x37, 0xad, 0x3d, 0x06, 0xae, - 0x07, 0xa2, 0x87, 0xc1, 0xc3, 0x55, 0x6f, 0xcf, 0x2c, 0xe6, 0xc4, 0xb5, - 0xa3, 0xa7, 0x1a, 0x68, 0x4d, 0xdb, 0xe7, 0x13, 0x11, 0xf8, 0x7a, 0xbf, - 0x20, 0xb8, 0x8f, 0x33, 0x88, 0x41, 0x54, 0x03, 0x1f, 0x9f, 0xa8, 0x69, - 0xef, 0x4c, 0x34, 0xb2, 0xd9, 0xe6, 0x4e, 0x95, 0x37, 0x87, 0xae, 0x84, - 0x08, 0xce, 0x54, 0x75, 0x9c, 0xb5, 0x03, 0x3c, 0x58, 0x6f, 0x6c, 0x23, - 0x07, 0xc5, 0x99, 0x59, 0xd2, 0x11, 0x2c, 0x51, 0x51, 0x54, 0xaa, 0x7a, - 0xdf, 0xaa, 0x1a, 0xcf, 0x61, 0xd1, 0xfc, 0x30, 0x61, 0xe2, 0x47, 0x6e, - 0xfd, 0x21, 0xe8, 0x1b, 0x0c, 0x65, 0x4c, 0xcc, 0x71, 0x0e, 0x06, 0x82, - 0x07, 0x17, 0x75, 0x55, 0xbe, 0xdb, 0xd8, 0x96, 0x75, 0x94, 0xe2, 0xb0, - 0xd6, 0x2c, 0xa3, 0xc1, 0x64, 0x10, 0x59, 0xd4, 0x88, 0x10, 0x6f, 0xcb, - 0x7b, 0xaa, 0xa6, 0x5b, 0x84, 0xca, 0x99, 0x35, 0x80, 0x50, 0xc4, 0x4c, - 0x2c, 0xc2, 0x71, 0x19, 0x1d, 0x4c, 0x22, 0xbd, 0xc3, 0x20, 0x4d, 0x61, - 0xcb, 0x39, 0xdc, 0xeb, 0x6a, 0x27, 0x25, 0x78, 0xdd, 0x80, 0xfc, 0x65, - 0x80, 0x4c, 0xde, 0x93, 0x79, 0x8b, 0x7e, 0xad, 0xb7, 0x4f, 0xb7, 0xf7, - 0xda, 0x9c, 0xfc, 0xee, 0xcc, 0x04, 0xd9, 0x97, 0xe9, 0x0d, 0x23, 0x6f, - 0xb5, 0x91, 0xdc, 0xd0, 0x39, 0x41, 0xf5, 0x84, 0x5c, 0xbb, 0xe7, 0xc4, - 0xb5, 0x26, 0xac, 0xd6, 0x83, 0x3a, 0xab, 0x16, 0x44, 0x09, 0x93, 0x7a, - 0xcd, 0xb3, 0x2c, 0xe1, 0x19, 0x45, 0xd2, 0x97, 0x9f, 0x4d, 0x5e, 0x71, - 0x00, 0x76, 0x6c, 0x6e, 0x39, 0x54, 0x32, 0x8a, 0xc0, 0xee, 0x79, 0x17, - 0x6a, 0xa7, 0x20, 0x22, 0xdc, 0xf6, 0x03, 0xfe, 0x28, 0x79, 0x03, 0x21, - 0x72, 0x05, 0xa9, 0x56, 0x95, 0xdc, 0x65, 0xd8, 0x3d, 0x6d, 0xab, 0xc1, - 0x76, 0x80, 0xb6, 0xe3, 0x3a, 0x01, 0x5c, 0x4e, 0x02, 0xa7, 0x4d, 0xc4, - 0xa7, 0xea, 0x64, 0xfc, 0x11, 0x6a, 0xaa, 0x10, 0x36, 0x28, 0x1f, 0x57, - 0x55, 0x91, 0x7f, 0xc5, 0xc1, 0xe8, 0x72, 0x70, 0x91, 0x94, 0x23, 0x91, - 0x87, 0x19, 0xf0, 0x31, 0xab, 0x4b, 0x20, 0x38, 0xf9, 0x08, 0x3d, 0x0e, - 0xa4, 0x27, 0xca, 0x92, 0xa8, 0x7c, 0x57, 0x27, 0x38, 0x38, 0x98, 0xd4, - 0xb2, 0x95, 0x73, 0x26, 0x5c, 0x8f, 0x09, 0x03, 0x2e, 0xb2, 0xab, 0x89, - 0x5b, 0xe8, 0x8b, 0x48, 0x2b, 0x54, 0x4d, 0xe7, 0x55, 0xc9, 0xff, 0x34, - 0x6d, 0xca, 0x24, 0x71, 0xa2, 0x28, 0x11, 0x92, 0xdb, 0xdd, 0xa4, 0xf6, - 0x57, 0x31, 0x01, 0x8f, 0x73, 0x0d, 0x0f, 0x5a, 0x3e, 0xa1, 0x0e, 0xcd, - 0x73, 0x86, 0x3e, 0x80, 0xef, 0x6e, 0x0a, 0x11, 0xa2, 0x77, 0x36, 0xbf, - 0x00, 0x72, 0x46, 0x8d, 0x0e, 0xf9, 0x7f, 0xa6, 0x4d, 0x4e, 0x6d, 0x0d, - 0x3e, 0x3b, 0x42, 0xe1, 0x31, 0xb3, 0x6e, 0x3d, 0xe8, 0x43, 0x23, 0xb5, - 0x87, 0x89, 0x4a, 0xc1, 0xad, 0x7f, 0xde, 0x0e, 0x3c, 0x91, 0x3f, 0x30, - 0xe3, 0xe9, 0xd8, 0x35, 0x76, 0x86, 0xcc, 0x0d, 0xae, 0x7f, 0x49, 0x45, - 0x80, 0x2f, 0xa5, 0x30, 0x44, 0x5b, 0xc1, 0xfd, 0x8c, 0xde, 0xf7, 0x84, - 0xc7, 0x29, 0x84, 0xda, 0xc6, 0x91, 0x11, 0x2c, 0xf9, 0x2e, 0xa2, 0x83, - 0x57, 0x6b, 0x80, 0x52, 0x55, 0x9f, 0x6f, 0x1c, 0xee, 0xc9, 0xad, 0x83, - 0x52, 0xe2, 0xc8, 0x6a, 0x14, 0x89, 0x07, 0xa0, 0xf2, 0x2b, 0x89, 0x77, - 0x6d, 0x3c, 0x2e, 0xca, 0xc7, 0x55, 0x08, 0x68, 0x87, 0xee, 0xa8, 0x14, - 0xe2, 0x11, 0xa8, 0x8f, 0xf1, 0x27, 0x5c, 0xe3, 0x2e, 0x92, 0x0b, 0x6a, - 0xc5, 0xc8, 0xec, 0xde, 0xcc, 0x8c, 0x6e, 0x9a, 0x5b, 0xbd, 0x19, 0x55, - 0x8b, 0x6c, 0x90, 0x9b, 0x9f, 0x1e, 0xa1, 0xd5, 0xef, 0xda, 0xef, 0x9c, - 0x88, 0x48, 0xbc, 0x3e, 0x9b, 0xbe, 0x1b, 0xd4, 0x36, 0x82, 0x1a, 0xff, - 0x6d, 0x9e, 0x54, 0xfa, 0x4f, 0xd1, 0x1d, 0x43, 0x5a, 0xb2, 0x8b, 0x2b, - 0x9c, 0x11, 0x0b, 0x31, 0x8e, 0x1b, 0x01, 0xce, 0xa5, 0x5a, 0xdc, 0x8c, - 0x44, 0x9c, 0xee, 0xba, 0xde, 0x9b, 0x28, 0xd1, 0x1c, 0x62, 0xa3, 0x09, - 0x8c, 0x35, 0x89, 0x53, 0x02, 0x9d, 0x74, 0xd2, 0x81, 0xf7, 0xc2, 0x87, - 0xe2, 0x7f, 0xe3, 0x34, 0xd3, 0x62, 0x2d, 0x69, 0x19, 0x29, 0xf8, 0x55, - 0x66, 0xaa, 0x36, 0xe0, 0x95, 0xae, 0x4d, 0x9c, 0xe9, 0x48, 0xf9, 0xb5, - 0xe1, 0xe2, 0x1b, 0x1d, 0x3c, 0x3b, 0xc5, 0x76, 0x8f, 0x4b, 0x9a, 0xf3, - 0xb4, 0xf1, 0xd1, 0x23, 0x65, 0xc6, 0xac, 0x90, 0xdc, 0xff, 0x10, 0x6d, - 0xf3, 0xc3, 0x60, 0xc4, 0xda, 0xe0, 0xa6, 0x6c, 0x6e, 0x8f, 0x0f, 0xbf, - 0x4f, 0x2f, 0x3e, 0xff, 0x78, 0x49, 0x4c, 0x42, 0x2c, 0x8c, 0x5b, 0x50, - 0x05, 0x85, 0xe9, 0xbd, 0x21, 0x24, 0x2f, 0x82, 0x7d, 0x1b, 0x3a, 0x1e, - 0xf6, 0xad, 0x73, 0x5d, 0x97, 0xc2, 0x0d, 0x81, 0xa9, 0x6c, 0xa4, 0x84, - 0xae, 0xec, 0xe9, 0x92, 0x82, 0x1b, 0x0a, 0x29, 0x5b, 0xea, 0xf9, 0xb9, - 0xe0, 0xf3, 0x1f, 0x56, 0xbb, 0xce, 0xa8, 0x4e, 0xa1, 0x8a, 0x9d, 0x80, - 0xe7, 0xd8, 0x86, 0xf8, 0xd4, 0x71, 0x06, 0xb9, 0xf1, 0xb3, 0x43, 0xc4, - 0xba, 0x06, 0xc7, 0x85, 0xbb, 0xf8, 0x4e, 0x99, 0x5c, 0x12, 0xb8, 0xd5, - 0x3a, 0x5b, 0x12, 0x84, 0x7f, 0x6a, 0x2a, 0x43, 0x11, 0x1e, 0x08, 0xd2, - 0xc1, 0x7b, 0xfc, 0x09, 0x1a, 0x0d, 0xef, 0x84, 0x10, 0x93, 0xf3, 0x50, - 0x50, 0x37, 0x80, 0x42, 0xe1, 0xe4, 0xc3, 0x9d, 0xde, 0x83, 0xeb, 0x3b, - 0xe4, 0x2e, 0xac, 0xcf, 0x0f, 0xea, 0x4a, 0x1b, 0xae, 0x65, 0x72, 0x80, - 0xe4, 0x05, 0xe4, 0xd6, 0x12, 0x5a, 0xac, 0xde, 0x80, 0x7b, 0xc6, 0xf7, - 0x0e, 0xbe, 0xd5, 0x49, 0xb3, 0xe1, 0x44, 0x78, 0x2e, 0x31, 0xfb, 0xef, - 0x76, 0x86, 0x48, 0xa9, 0x8d, 0xfe, 0xe9, 0xb4, 0x3f, 0xc1, 0xec, 0xed, - 0x6f, 0x5b, 0xd7, 0x5e, 0x2a, 0x32, 0x29, 0xd1, 0x2d, 0x3d, 0x78, 0x33, - 0x01, 0xf1, 0x57, 0xe8, 0x78, 0x2e, 0x31, 0xd3, 0x56, 0x77, 0xf7, 0xdf, - 0xcb, 0x22, 0xc7, 0x64, 0xf2, 0xc0, 0xa2, 0x05, 0xef, 0x51, 0x01, 0x53, - 0xaf, 0x1d, 0x29, 0x35, 0x6b, 0x68, 0xe5, 0xbb, 0x36, 0x37, 0x1a, 0xa0, - 0xff, 0x81, 0x67, 0xc8, 0xa0, 0x66, 0x11, 0xe9, 0xb9, 0xfb, 0xe7, 0xa8, - 0xc5, 0xd6, 0xe2, 0x57, 0x13, 0xeb, 0xea, 0xa7, 0x10, 0x35, 0x32, 0xac, - 0x04, 0x8d, 0x5d, 0xa4, 0x4f, 0x13, 0x50, 0x9f, 0xdc, 0xc8, 0x65, 0x86, - 0x86, 0x91, 0x64, 0x60, 0x60, 0xe6, 0x67, 0x99, 0x82, 0x1e, 0xbb, 0x8a, - 0xb6, 0x69, 0xf2, 0xcb, 0x3a, 0xe0, 0x27, 0xcd, 0x52, 0x71, 0x85, 0xd1, - 0x44, 0xe1, 0x0e, 0x4b, 0x16, 0x08, 0x6c, 0x73, 0x1b, 0x83, 0x71, 0xb8, - 0xac, 0xf6, 0x5c, 0x14, 0x5b, 0xc8, 0x26, 0x5c, 0x74, 0x91, 0xb0, 0xdd, - 0x8e, 0x1e, 0x35, 0xc8, 0x51, 0x40, 0xb8, 0x57, 0xc9, 0xdf, 0x8e, 0x55, - 0xb7, 0xcc, 0xf4, 0xc1, 0xbf, 0x7f, 0xd9, 0xa6, 0x46, 0xa3, 0x99, 0x80, - 0x15, 0xa2, 0x2f, 0x08, 0x10, 0x1c, 0xf3, 0xe5, 0x04, 0x30, 0x74, 0xde, - 0x57, 0xe0, 0xce, 0x97, 0x57, 0xb9, 0x53, 0x2a, 0xda, 0xb0, 0xb7, 0x82, - 0x4e, 0x69, 0xcf, 0xac, 0x0c, 0x0d, 0xf9, 0xc4, 0xb5, 0xc9, 0xda, 0x35, - 0xd2, 0x31, 0xf3, 0x84, 0xd4, 0x1f, 0xe1, 0x5f, 0x07, 0xc5, 0x33, 0xae, - 0xa4, 0x1a, 0xf1, 0x53, 0x54, 0x0e, 0xef, 0xa6, 0x4f, 0x49, 0xb3, 0xc3, - 0xa1, 0x7e, 0x76, 0x68, 0xf3, 0x9b, 0xd9, 0x29, 0xf7, 0x8e, 0x6f, 0x4e, - 0xe3, 0xd8, 0x26, 0x7c, 0x13, 0xc9, 0x34, 0x74, 0xa2, 0x82, 0xb3, 0x2e, - 0xb7, 0xec, 0xb7, 0x94, 0xbc, 0x59, 0x74, 0xa6, 0x1d, 0x98, 0xb1, 0x53, - 0x44, 0xf0, 0x7c, 0x76, 0x92, 0x12, 0xb7, 0x7f, 0x3e, 0x0b, 0x0d, 0xc9, - 0x9b, 0x13, 0x97, 0xcc, 0x54, 0x62, 0x95, 0xfc, 0x5b, 0x13, 0x23, 0xe3, - 0x5d, 0xa8, 0xcd, 0x77, 0x34, 0xf1, 0xc5, 0x95, 0x2a, 0x0a, 0xbb, 0x3b, - 0x55, 0x8e, 0x80, 0xc1, 0x58, 0xdd, 0x90, 0xba, 0x23, 0x40, 0x98, 0x9b, - 0xa9, 0xa1, 0x4f, 0xc5, 0x03, 0x3c, 0x8b, 0x2d, 0xe5, 0x9d, 0xb1, 0xe2, - 0xf3, 0x6c, 0x9f, 0x6d, 0x47, 0xad, 0x82, 0x3b, 0xaf, 0xe6, 0x5a, 0x84, - 0xbb, 0x56, 0x56, 0xe2, 0xda, 0xa0, 0x60, 0x6e, 0xd5, 0x1d, 0xbc, 0xa5, - 0x56, 0xcd, 0x7d, 0xb6, 0x0b, 0xa4, 0x32, 0xf7, 0x09, 0x91, 0x2c, 0x55, - 0x6b, 0x61, 0x60, 0x1e, 0xbc, 0x46, 0x29, 0xc6, 0xe5, 0x42, 0x52, 0x43, - 0xfd, 0x4a, 0xeb, 0xfd, 0x27, 0xee, 0x4e, 0x21, 0xbc, 0xe5, 0x71, 0xd0, - 0x41, 0xad, 0xad, 0x90, 0x13, 0x72, 0xfe, 0xe0, 0x3f, 0x1f, 0x2d, 0x0b, - 0x93, 0x0c, 0xd9, 0xbc, 0x2b, 0x11, 0x9c, 0x7b, 0x3d, 0x18, 0x98, 0x3e, - 0xd4, 0xf3, 0x46, 0x24, 0x15, 0xfb, 0x86, 0x90, 0x66, 0x05, 0xbb, 0x75, - 0xe8, 0xd7, 0xd6, 0x8c, 0x58, 0x03, 0x0c, 0x2f, 0x00, 0x35, 0xe1, 0xea, - 0x25, 0xdc, 0xb8, 0x89, 0xbd, 0x74, 0xe9, 0x68, 0x43, 0xe0, 0x85, 0xee, - 0x20, 0xb3, 0xd9, 0x4c, 0xf7, 0x7f, 0xad, 0x31, 0x69, 0xe9, 0x33, 0xc8, - 0x27, 0xed, 0x50, 0x8e, 0x2b, 0x73, 0x96, 0x86, 0xc9, 0x36, 0x25, 0x0e, - 0x31, 0x47, 0xba, 0x1b, 0xe4, 0xd8, 0x6d, 0x4c, 0xab, 0x9d, 0x73, 0x03, - 0x2e, 0x8c, 0x25, 0x07, 0xd0, 0xc4, 0x7a, 0x63, 0x10, 0xcd, 0xe9, 0x6a, - 0xb0, 0x2d, 0xa3, 0xab, 0xf3, 0x57, 0x96, 0xd3, 0xe5, 0x3f, 0x75, 0xc0, - 0x61, 0xd1, 0x09, 0xec, 0xd0, 0x22, 0xb9, 0x5f, 0x5c, 0xcc, 0x32, 0xf5, - 0xc1, 0x73, 0x9b, 0x2f, 0x84, 0x13, 0x9c, 0xf6, 0x15, 0x16, 0x30, 0x5f, - 0xf5, 0x83, 0x77, 0xb9, 0x59, 0xc7, 0x1b, 0xa1, 0xca, 0xae, 0x2d, 0xfc, - 0xb6, 0x63, 0xa9, 0x0a, 0x97, 0xdd, 0x59, 0x24, 0xe2, 0xe3, 0xde, 0x56, - 0x11, 0x69, 0x9a, 0x90, 0xb0, 0x3d, 0x7c, 0xc3, 0x1e, 0xf5, 0xe5, 0x59, - 0xc6, 0x8b, 0x36, 0xde, 0x88, 0x50, 0x14, 0xe7, 0xd5, 0x4d, 0xe0, 0x16, - 0xaa, 0x0d, 0x3d, 0x82, 0x63, 0x8a, 0xd4, 0x7e, 0x47, 0x65, 0xa3, 0x9a, - 0xf6, 0x91, 0x16, 0x56, 0xcf, 0xcd, 0x0b, 0xe4, 0xda, 0xe2, 0x72, 0x6a, - 0x8d, 0x01, 0xcb, 0x7a, 0x15, 0x9c, 0xf9, 0xc1, 0xfd, 0x22, 0xdf, 0xe8, - 0xb7, 0x30, 0xbf, 0x15, 0x18, 0x84, 0x8a, 0xd2, 0xae, 0xcb, 0x79, 0x67, - 0x30, 0x52, 0x66, 0xeb, 0x0e, 0xb5, 0x8b, 0x16, 0x5e, 0x63, 0x7e, 0xcb, - 0x21, 0x80, 0x38, 0xfc, 0x99, 0x59, 0x82, 0xf5, 0xcc, 0x49, 0xe8, 0xb2, - 0x18, 0x02, 0x04, 0x14, 0x89, 0x62, 0x4b, 0xfd, 0x63, 0xef, 0x6c, 0xd6, - 0xb8, 0xe7, 0x28, 0x63, 0x5d, 0xa3, 0xd5, 0x01, 0x19, 0xc8, 0xc7, 0x6e, - 0x4c, 0x9b, 0xb1, 0x9e, 0x18, 0x40, 0x8b, 0x7e, 0x46, 0x21, 0x19, 0xe6, - 0xef, 0x70, 0x11, 0x17, 0xe1, 0x94, 0xf3, 0xd6, 0x26, 0x1b, 0x1c, 0x83, - 0xde, 0x43, 0x8e, 0xa2, 0x6c, 0x84, 0x03, 0x94, 0x48, 0x6b, 0x50, 0x70, - 0x9b, 0xdf, 0x40, 0xfc, 0xa2, 0xed, 0xbd, 0xa3, 0x77, 0xa3, 0x0b, 0x8c, - 0x79, 0x6e, 0x15, 0x3b, 0xff, 0xe3, 0x78, 0x35, 0x17, 0x6f, 0xe6, 0x01, - 0xdd, 0x1b, 0x4b, 0xc9, 0x40, 0x35, 0x8f, 0x98, 0x82, 0x9e, 0xa5, 0xe8, - 0xa0, 0xeb, 0x66, 0x19, 0xf8, 0xc7, 0xba, 0xc4, 0x9f, 0x35, 0x78, 0xa3, - 0x62, 0x18, 0x75, 0x75, 0xce, 0x49, 0x41, 0xa4, 0x3c, 0x5d, 0x70, 0x46, - 0xf0, 0x01, 0xf1, 0xb0, 0xfc, 0x4a, 0xc2, 0xd1, 0x5e, 0xf8, 0x0a, 0x36, - 0x0f, 0x72, 0xef, 0xbb, 0x51, 0xa6, 0xbc, 0xb7, 0xae, 0xa3, 0x0e, 0x4e, - 0x61, 0xa1, 0x59, 0x53, 0x1c, 0x87, 0xfb, 0x20, 0x96, 0xd1, 0xff, 0x5a, - 0xcd, 0x98, 0x6b, 0x5c, 0x36, 0x1b, 0xdc, 0xa3, 0x6d, 0x8e, 0x17, 0x4f, - 0x27, 0x23, 0xc9, 0x84, 0xb9, 0x6b, 0xd9, 0x2d, 0x37, 0x12, 0x0e, 0xfa, - 0xcb, 0x7f, 0xc3, 0x59, 0x9d, 0x72, 0x55, 0xd7, 0x0a, 0x26, 0xb9, 0x22, - 0x3f, 0x7a, 0x02, 0x17, 0x78, 0x97, 0x21, 0xd2, 0x46, 0x93, 0xba, 0x61, - 0x49, 0xa9, 0x36, 0x52, 0xe4, 0x5e, 0x6d, 0xc6, 0x27, 0x03, 0x3b, 0x22, - 0x51, 0x82, 0xcd, 0x5d, 0x64, 0x40, 0x65, 0xcf, 0x8b, 0x8c, 0x13, 0xf0, - 0x2f, 0xd4, 0x6b, 0x37, 0x04, 0xcd, 0xa1, 0xf3, 0x04, 0xf7, 0x0c, 0x1a, - 0x99, 0xf4, 0xa6, 0x22, 0xe4, 0x92, 0x57, 0x9b, 0x17, 0x5f, 0x14, 0xfa, - 0x2b, 0x7b, 0xef, 0x07, 0x08, 0x2c, 0x9f, 0x7e, 0x4a, 0xb4, 0xc8, 0x1e, - 0x48, 0x28, 0x77, 0xbd, 0x38, 0x4a, 0xdd, 0x34, 0xe6, 0x4c, 0x4c, 0xe6, - 0xda, 0x02, 0xe7, 0x67, 0x70, 0x72, 0xa8, 0x5d, 0xc6, 0x9c, 0x14, 0x68, - 0x16, 0xcb, 0x2a, 0x09, 0x9d, 0x6f, 0xda, 0x67, 0x3b, 0x87, 0x74, 0xfe, - 0xf5, 0x20, 0x17, 0xac, 0xd5, 0x92, 0xd9, 0x80, 0x72, 0xac, 0x1d, 0x7a, - 0x03, 0x41, 0x78, 0x5c, 0x56, 0xbb, 0x57, 0xd0, 0x96, 0x8c, 0xd7, 0xbf, - 0x24, 0xaa, 0x77, 0xa3, 0x31, 0x6d, 0xb4, 0x97, 0x37, 0xdf, 0x3a, 0x1a, - 0x26, 0x6a, 0x7a, 0x2e, 0xf5, 0x48, 0xb4, 0x89, 0xf7, 0x39, 0x50, 0x57, - 0x59, 0x8d, 0x7b, 0xd5, 0x77, 0x72, 0x30, 0x33, 0xbc, 0x45, 0xc9, 0x0f, - 0x3b, 0xc4, 0x9a, 0xc8, 0x15, 0xe7, 0x6a, 0xf3, 0xbc, 0x52, 0x9e, 0x95, - 0x26, 0xbc, 0x2e, 0x0d, 0xb0, 0x8d, 0x03, 0x3e, 0x1e, 0x8a, 0x21, 0x50, - 0x07, 0x8c, 0x88, 0x6a, 0xb1, 0xa3, 0x52, 0xbf, 0xec, 0x6f, 0xc6, 0x1d, - 0x09, 0xeb, 0xe2, 0xd1, 0x8a, 0x4c, 0xbf, 0xd1, 0x66, 0xbe, 0x67, 0x16, - 0xbe, 0x54, 0x39, 0x71, 0xaa, 0x12, 0x96, 0x4c, 0xec, 0xc4, 0xd8, 0x32, - 0x0f, 0xca, 0x67, 0x27, 0xf8, 0x3b, 0x19, 0xb7, 0x71, 0x30, 0x52, 0x9c, - 0xd1, 0x63, 0xfd, 0xa8, 0xd7, 0xc7, 0x6c, 0x77, 0x61, 0x15, 0x2e, 0x8b, - 0x07, 0xc7, 0x7b, 0x2a, 0x0c, 0x1c, 0xd0, 0x9c, 0x6f, 0xbf, 0x19, 0x3b, - 0x8e, 0x92, 0xdd, 0xce, 0xa5, 0xda, 0x7f, 0x8f, 0xd2, 0x52, 0xa8, 0x77, - 0xa0, 0x6b, 0x9c, 0x39, 0x32, 0xc5, 0x1e, 0xbd, 0x7e, 0xdf, 0x6a, 0xad, - 0xdb, 0xa9, 0x45, 0x3e, 0x04, 0xbc, 0x48, 0xb6, 0xe7, 0x22, 0xcf, 0x76, - 0xac, 0x90, 0x38, 0x60, 0xe1, 0xfd, 0x93, 0xc6, 0xcc, 0x6d, 0xc0, 0x3d, - 0xe0, 0x14, 0x3f, 0x25, 0x59, 0xf9, 0x9a, 0x48, 0xfe, 0xb6, 0xb0, 0x22, - 0xec, 0xb8, 0x29, 0x11, 0x08, 0x8c, 0x03, 0xb7, 0x3d, 0xb8, 0xd0, 0x98, - 0x05, 0x9b, 0x9e, 0x61, 0xac, 0xfb, 0xf3, 0x1a, 0x5e, 0x3a, 0xf0, 0xa2, - 0xf5, 0x2a, 0x19, 0x2e, 0xfa, 0x21, 0x3f, 0x0b, 0x48, 0xf6, 0x3a, 0x79, - 0x8f, 0x59, 0x8d, 0xb0, 0xa7, 0x34, 0x98, 0xae, 0xa0, 0x5f, 0xc8, 0x8b, - 0xe3, 0x7f, 0x07, 0x7b, 0x2d, 0xfc, 0x4c, 0x04, 0xb9, 0xe6, 0x14, 0x04, - 0x3f, 0x6c, 0xdf, 0x09, 0x35, 0xfa, 0x71, 0xd9, 0x29, 0x29, 0x9c, 0x78, - 0xce, 0xf4, 0x62, 0xb1, 0xc2, 0x54, 0xd2, 0xbe, 0xfc, 0x7e, 0x64, 0x28, - 0xe7, 0x46, 0x96, 0xfa, 0xbf, 0x1d, 0x9b, 0x50, 0x9b, 0x01, 0x44, 0x7e, - 0x6e, 0x88, 0xb9, 0x27, 0x00, 0x3e, 0xf3, 0x54, 0x45, 0xac, 0x77, 0x72, - 0x81, 0xbd, 0xbc, 0xe6, 0x9e, 0xdb, 0x8f, 0x1f, 0x9b, 0x5d, 0x82, 0x17, - 0x7c, 0x0d, 0x3d, 0xfa, 0xcc, 0x4e, 0xa5, 0xc9, 0x7e, 0x45, 0xd6, 0xf8, - 0x65, 0xd7, 0x2f, 0xb2, 0x63, 0x58, 0x04, 0x57, 0xc4, 0x0c, 0x2d, 0xc4, - 0x33, 0x19, 0x02, 0x35, 0x36, 0xdd, 0x15, 0x5b, 0x50, 0xdc, 0x30, 0xbc, - 0xb8, 0x9a, 0x0e, 0x95, 0x76, 0xe0, 0x45, 0xed, 0x7c, 0xe9, 0x73, 0x12, - 0x32, 0xaf, 0xe3, 0xf1, 0x69, 0x17, 0x7d, 0x22, 0x9c, 0x9b, 0xae, 0x12, - 0xfc, 0xdd, 0xeb, 0xe7, 0xef, 0x6c, 0x2b, 0xb4, 0xe5, 0x95, 0x6c, 0xad, - 0x6b, 0xac, 0x84, 0x20, 0x75, 0xa3, 0xeb, 0x86, 0xc7, 0x13, 0x84, 0x11, - 0x70, 0x64, 0xe7, 0xfd, 0x5c, 0x8e, 0xc8, 0x60, 0xa2, 0x93, 0x8a, 0xad, - 0xd0, 0x6f, 0x2d, 0x83, 0x22, 0x7d, 0x99, 0xd2, 0x8e, 0x7e, 0x67, 0x88, - 0x38, 0xec, 0x83, 0x15, 0xd4, 0x71, 0xd5, 0x47, 0xcd, 0xab, 0x44, 0xe1, - 0xce, 0xf1, 0x94, 0xee, 0xe6, 0x14, 0x8e, 0xea, 0x4f, 0xa5, 0x18, 0xa3, - 0x2c, 0xb6, 0x1f, 0xae, 0xfb, 0x2a, 0x3a, 0x59, 0xae, 0xf7, 0xb0, 0x47, - 0x5d, 0x5c, 0xc8, 0x86, 0x9c, 0x36, 0xb7, 0x76, 0x83, 0x06, 0xda, 0x53, - 0xb3, 0x52, 0x43, 0x43, 0x79, 0xdb, 0xd6, 0xff, 0x68, 0xf5, 0xce, 0xf3, - 0x76, 0xda, 0xfa, 0x6e, 0x26, 0x7a, 0xc3, 0x1d, 0xc4, 0x0b, 0xf1, 0x95, - 0x8b, 0x57, 0x62, 0x00, 0x93, 0x4a, 0xa0, 0xe1, 0x3b, 0x78, 0x8f, 0x78, - 0x16, 0x40, 0xa2, 0x9c, 0x71, 0x5c, 0x54, 0x5d, 0x1e, 0xdf, 0x47, 0xfe, - 0x0b, 0xdf, 0x87, 0x40, 0x1c, 0x4a, 0x0e, 0x77, 0xed, 0x18, 0x7c, 0x36, - 0xb8, 0x92, 0xa1, 0x14, 0x2c, 0x29, 0x0a, 0x17, 0xef, 0xf5, 0x79, 0x25, - 0x15, 0x66, 0x59, 0x6e, 0x1e, 0xd5, 0x94, 0x16, 0x11, 0x9a, 0x48, 0x71, - 0xf6, 0x59, 0xb9, 0x45, 0xde, 0x8f, 0xc4, 0x06, 0xc7, 0xdd, 0x31, 0xd7, - 0x35, 0x18, 0xb4, 0x7f, 0x02, 0x13, 0x4e, 0xc6, 0x16, 0x25, 0x3c, 0xfe, - 0x2c, 0xdd, 0xec, 0x32, 0x58, 0x9c, 0xbb, 0x84, 0x1c, 0x67, 0x74, 0x1a, - 0x0a, 0xb0, 0x08, 0xf4, 0xb3, 0x5d, 0xb0, 0x69, 0x11, 0x6f, 0xab, 0x75, - 0x88, 0x5f, 0xa2, 0xa7, 0xc9, 0x9a, 0x89, 0x4a, 0x9c, 0x83, 0xb8, 0x10, - 0x73, 0x0c, 0x55, 0x50, 0x6e, 0xbc, 0xd3, 0x0c, 0x78, 0xb4, 0x7a, 0x0b, - 0x18, 0xe2, 0x95, 0x52, 0xf1, 0x8c, 0xc9, 0xf7, 0x48, 0x4d, 0x5b, 0xc5, - 0x9e, 0x02, 0x37, 0x77, 0x32, 0xfc, 0x96, 0x51, 0xcd, 0xe0, 0x3a, 0xd4, - 0xed, 0xfe, 0xa8, 0x38, 0x4b, 0x97, 0x8c, 0x02, 0x42, 0x53, 0x5b, 0x0c, - 0x7c, 0xc8, 0x9b, 0x83, 0x44, 0x87, 0x0f, 0xa3, 0x00, 0x75, 0xa1, 0x9e, - 0xc7, 0xcc, 0xde, 0x10, 0xe2, 0x54, 0x48, 0x87, 0x74, 0x16, 0x50, 0xce, - 0x89, 0xdf, 0x41, 0x42, 0x8b, 0x49, 0xf8, 0x95, 0xde, 0x33, 0x30, 0x84, - 0x58, 0xcb, 0xc2, 0x89, 0x74, 0xef, 0x82, 0xf0, 0x6b, 0xe6, 0xdf, 0x37, - 0xc5, 0x6a, 0xe2, 0xcb, 0x83, 0xd1, 0x4d, 0xca, 0x5b, 0xd1, 0xd1, 0x0f, - 0x51, 0x30, 0x14, 0x4b, 0x82, 0x28, 0x35, 0x40, 0xe7, 0xbb, 0xda, 0x66, - 0xbe, 0x59, 0x08, 0x48, 0x1f, 0xe5, 0xee, 0x24, 0xb7, 0x67, 0x53, 0xd9, - 0x4e, 0x19, 0x96, 0xe0, 0xb5, 0x56, 0x77, 0x23, 0xaa, 0xb0, 0x9d, 0x2f, - 0x60, 0xa8, 0xc1, 0x2b, 0xa6, 0x7c, 0x3a, 0x05, 0xa4, 0xbf, 0x70, 0x35, - 0x10, 0xca, 0x7e, 0xf4, 0xe8, 0x39, 0xda, 0x21, 0xc0, 0xd2, 0xbc, 0xbb, - 0xb6, 0x65, 0x37, 0x51, 0xc9, 0xcc, 0x7c, 0x52, 0xe9, 0x55, 0x7f, 0x84, - 0x8a, 0x75, 0xdf, 0x17, 0x2b, 0x81, 0x93, 0x6f, 0x36, 0x50, 0x86, 0xdc, - 0x4f, 0xc6, 0x9a, 0x58, 0xae, 0x20, 0x40, 0x0b, 0x4d, 0xf3, 0x57, 0x05, - 0x3b, 0x1a, 0x09, 0xd1, 0x9d, 0xe9, 0xa9, 0x40, 0x0e, 0x52, 0x78, 0x8f, - 0x09, 0x1c, 0xc5, 0x89, 0x38, 0x7b, 0x75, 0x10, 0x1e, 0xb3, 0x0e, 0xcb, - 0x97, 0x72, 0xc2, 0xda, 0x62, 0xf5, 0xde, 0x17, 0xb9, 0xbc, 0xc2, 0x1e, - 0xcb, 0x25, 0x01, 0x0d, 0x1e, 0x81, 0x43, 0x0f, 0xa9, 0x5a, 0x30, 0x93, - 0xd0, 0xbf, 0xbe, 0xcc, 0x6e, 0xe1, 0x41, 0xb9, 0x72, 0x90, 0xee, 0x8c, - 0x26, 0xf7, 0xd8, 0x3e, 0x49, 0x60, 0xb7, 0xc6, 0x77, 0x40, 0x81, 0xb2, - 0xfd, 0xec, 0x26, 0x7b, 0xcf, 0xb2, 0x55, 0x3f, 0x8f, 0x19, 0x74, 0x0a, - 0x5c, 0xbb, 0xc3, 0xf6, 0x1f, 0x23, 0x52, 0x50, 0x92, 0xa1, 0x5e, 0xf9, - 0xea, 0x98, 0xcd, 0x90, 0x3d, 0x71, 0x93, 0x3e, 0x48, 0x2e, 0x28, 0xed, - 0x90, 0xaf, 0xeb, 0xae, 0xae, 0x82, 0x65, 0xf2, 0x89, 0x8f, 0x2b, 0x3d, - 0xc2, 0x89, 0xb8, 0xbe, 0x7e, 0xd7, 0x2a, 0xb2, 0x7b, 0xb0, 0x41, 0xa7, - 0x3b, 0x52, 0xfc, 0x9a, 0x92, 0x7d, 0x8d, 0x5e, 0x10, 0x52, 0x9a, 0x42, - 0x3e, 0xa5, 0x44, 0x93, 0x39, 0xe7, 0x9d, 0xd5, 0x15, 0x2a, 0xc2, 0x46, - 0xd4, 0x8a, 0x5c, 0xbc, 0x6a, 0x78, 0x13, 0x8e, 0x3c, 0x03, 0xa9, 0xe9, - 0x84, 0x78, 0xe6, 0x78, 0xfc, 0xb3, 0x8d, 0x3c, 0x5c, 0xaa, 0x0a, 0xd2, - 0xc1, 0xd1, 0x59, 0xaa, 0x44, 0x2d, 0xc2, 0xcf, 0x91, 0xf3, 0x03, 0x52, - 0xa8, 0x2c, 0x6f, 0x48, 0xb6, 0xfc, 0x5e, 0x50, 0x4e, 0xe0, 0xe2, 0x1e, - 0xb1, 0x18, 0x82, 0xca, 0xa0, 0x08, 0xf0, 0xd0, 0x7f, 0x82, 0x10, 0x05, - 0x52, 0xf9, 0xab, 0xe4, 0x69, 0x16, 0x35, 0x48, 0x37, 0x4d, 0xf6, 0xea, - 0xff, 0x18, 0x74, 0xa9, 0xea, 0x28, 0x39, 0x3e, 0x0d, 0x52, 0x7a, 0xd2, - 0x4b, 0xa1, 0x60, 0x88, 0x03, 0x16, 0x3b, 0xaa, 0x68, 0x28, 0x4b, 0x86, - 0xd1, 0x53, 0xe4, 0xfa, 0x34, 0xf1, 0x8b, 0xef, 0x69, 0x6a, 0x1d, 0xae, - 0xd6, 0xed, 0x6c, 0xfb, 0x23, 0xb9, 0x0d, 0x28, 0x74, 0x95, 0x11, 0x13, - 0x32, 0x3b, 0x4a, 0x66, 0x1d, 0xe6, 0xfb, 0x14, 0x85, 0x4c, 0x78, 0xb4, - 0xe2, 0xac, 0x51, 0x67, 0xd8, 0xe0, 0x77, 0x56, 0x31, 0x16, 0x1a, 0x56, - 0xfa, 0x3d, 0x50, 0xc6, 0xd9, 0x49, 0xfc, 0x3a, 0x47, 0xcf, 0xb4, 0x48, - 0x76, 0x80, 0x30, 0x0c, 0xcc, 0x59, 0x87, 0xa6, 0x64, 0xed, 0x3e, 0xc6, - 0x61, 0xd9, 0x3b, 0xd7, 0xaf, 0x84, 0x57, 0x1a, 0x05, 0xab, 0x2e, 0x0a, - 0x95, 0x82, 0xcc, 0xdd, 0xda, 0x8f, 0x2f, 0x66, 0xbe, 0xfc, 0x27, 0xe7, - 0xdd, 0x95, 0x1a, 0x7c, 0x55, 0x55, 0xe0, 0x46, 0xca, 0xd1, 0xe2, 0x5e, - 0x1c, 0x80, 0xe2, 0xb9, 0x2e, 0x4e, 0x89, 0x79, 0xbc, 0x38, 0xc4, 0xaf, - 0x93, 0x29, 0x5a, 0x89, 0x7b, 0x22, 0x1d, 0x1a, 0x27, 0xf9, 0x8a, 0x61, - 0xf4, 0xd0, 0x4e, 0x78, 0x8e, 0x08, 0xcd, 0xb8, 0x13, 0xce, 0x4b, 0xf2, - 0x2b, 0x2d, 0x4f, 0x41, 0x20, 0xa4, 0xb5, 0x6e, 0x60, 0xb8, 0xf6, 0xf9, - 0x55, 0x11, 0xce, 0xa8, 0x72, 0xc1, 0xf9, 0xbb, 0x2c, 0xd6, 0x0a, 0x63, - 0x4a, 0xdb, 0x8a, 0xa5, 0x2c, 0xc7, 0x46, 0xb8, 0x51, 0x60, 0xab, 0x13, - 0xd1, 0x8b, 0x6e, 0xcd, 0xaf, 0x7e, 0xb0, 0x17, 0x60, 0x63, 0x78, 0x46, - 0x5d, 0x8b, 0xaf, 0x58, 0x42, 0x57, 0xef, 0x87, 0x09, 0xa7, 0x44, 0x0e, - 0xab, 0xe8, 0xf8, 0x1c, 0x6f, 0x6b, 0xde, 0x0f, 0x2f, 0x9f, 0x70, 0x76, - 0x40, 0x94, 0xca, 0x8e, 0x8b, 0x1a, 0x28, 0x18, 0x32, 0x75, 0x70, 0xa8, - 0x63, 0xca, 0xf5, 0x21, 0x5d, 0xc0, 0xb8, 0x7a, 0x96, 0x08, 0x86, 0x00, - 0x8e, 0xfb, 0xab, 0x10, 0xef, 0x26, 0xf5, 0x25, 0x7a, 0x42, 0xff, 0x21, - 0xc8, 0x44, 0x12, 0x3a, 0x18, 0x36, 0x5f, 0xdf, 0xf2, 0xc0, 0x3a, 0xef, - 0x03, 0x3d, 0xdc, 0xdb, 0xd3, 0x37, 0xa7, 0x25, 0x84, 0x3d, 0xaf, 0x54, - 0xc9, 0x81, 0xae, 0x33, 0x98, 0x85, 0x26, 0xcd, 0xdd, 0xa3, 0x7b, 0x53, - 0xcf, 0x15, 0x48, 0x64, 0xce, 0x97, 0x6d, 0xd4, 0x17, 0xc7, 0x1a, 0x13, - 0x36, 0xc8, 0xfe, 0x2a, 0x61, 0x91, 0xe6, 0xe5, 0xde, 0x95, 0xf2, 0xa7, - 0x08, 0xfb, 0xef, 0x20, 0x1d, 0x3f, 0x97, 0xae, 0xa9, 0x0c, 0x99, 0x33, - 0x25, 0x59, 0x41, 0x21, 0xd9, 0xae, 0x88, 0x04, 0x5b, 0x29, 0xd3, 0x7a, - 0xae, 0xce, 0x82, 0x42, 0x70, 0x70, 0xf9, 0xfd, 0x24, 0xdd, 0x30, 0xf5, - 0x50, 0x4b, 0x8e, 0x06, 0xc7, 0x14, 0x14, 0x9e, 0xa8, 0x8f, 0x0c, 0xdc, - 0xe1, 0x88, 0x36, 0x3c, 0x23, 0xcd, 0xd7, 0x72, 0xb4, 0xbb, 0x50, 0xd7, - 0x06, 0xbc, 0x03, 0x4c, 0xeb, 0x2b, 0x59, 0xac, 0x0f, 0xf4, 0xfb, 0x02, - 0x32, 0x65, 0x50, 0xf7, 0x78, 0xc5, 0xa1, 0xde, 0x11, 0x8f, 0x38, 0x4b, - 0xee, 0xc9, 0x84, 0xe6, 0x14, 0x09, 0x0a, 0x08, 0x7b, 0xf0, 0x78, 0x2f, - 0x56, 0xbc, 0xe1, 0x59, 0x43, 0x5b, 0x26, 0x0d, 0x7a, 0xe5, 0x6a, 0x64, - 0xe1, 0x29, 0xb9, 0xec, 0x2c, 0x56, 0x84, 0x36, 0xb3, 0x2c, 0x94, 0xfc, - 0x12, 0x87, 0x4c, 0x42, 0xbf, 0x36, 0x39, 0x66, 0x67, 0xab, 0xc7, 0x46, - 0xb4, 0x4d, 0x2d, 0xdb, 0xf7, 0xa5, 0x89, 0x05, 0xdb, 0x75, 0x6f, 0x7d, - 0x68, 0x43, 0xc9, 0xbc, 0x09, 0x57, 0x53, 0x6e, 0x43, 0xb6, 0xeb, 0xde, - 0x23, 0x3c, 0x80, 0x15, 0x4a, 0xb9, 0x97, 0xcb, 0xe8, 0x0a, 0x56, 0x7b, - 0xb3, 0x04, 0x0c, 0x65, 0x92, 0x4a, 0x93, 0x47, 0xa4, 0xba, 0x45, 0xc0, - 0x98, 0xa3, 0x58, 0x26, 0x9b, 0x33, 0x0d, 0xdf, 0x32, 0x05, 0xde, 0xe9, - 0x1b, 0x2b, 0xa8, 0x68, 0xaa, 0x1d, 0xd0, 0xb5, 0xd5, 0x00, 0xe0, 0x57, - 0x26, 0x3d, 0x43, 0xb4, 0x6d, 0xc4, 0x7e, 0xb0, 0x98, 0x22, 0x94, 0xe4, - 0x57, 0x22, 0x39, 0x49, 0xdd, 0x64, 0xea, 0xc0, 0x79, 0xcd, 0x94, 0x5f, - 0x55, 0xf7, 0x02, 0x60, 0x7f, 0xd5, 0x99, 0x42, 0x34, 0x03, 0xe1, 0x41, - 0x3d, 0xa2, 0xf6, 0xd9, 0xd6, 0x56, 0x57, 0x03, 0x23, 0x68, 0x70, 0x9e, - 0x96, 0x79, 0xdf, 0x27, 0x07, 0xf4, 0xd1, 0x0e, 0xec, 0x20, 0xd0, 0x1a, - 0x43, 0x08, 0xa9, 0x90, 0x7a, 0x07, 0xf2, 0x23, 0x65, 0xe7, 0xae, 0x16, - 0xdd, 0x09, 0x70, 0x40, 0x0b, 0xb3, 0x1a, 0x14, 0xb0, 0xc4, 0x1c, 0x9c, - 0x0c, 0x7a, 0xeb, 0x54, 0xc6, 0x6d, 0xef, 0xf4, 0xa6, 0x7a, 0x39, 0x20, - 0x3b, 0x4b, 0x57, 0x60, 0x85, 0xf0, 0x4b, 0x68, 0x18, 0x8b, 0x5b, 0xef, - 0x05, 0x1c, 0x99, 0xe2, 0xda, 0x5a, 0xa8, 0xd4, 0x7e, 0x97, 0x12, 0x02, - 0x21, 0x20, 0x65, 0x93, 0x5a, 0x10, 0xa3, 0x3d, 0x21, 0xeb, 0x6d, 0x41, - 0x76, 0x9b, 0xe5, 0x0b, 0xbc, 0x45, 0xff, 0xbf, 0xeb, 0xf3, 0xaa, 0xbe, - 0x85, 0xee, 0x50, 0x13, 0x1c, 0x28, 0x7e, 0xcb, 0xca, 0xc6, 0xe4, 0xdf, - 0xfa, 0x6b, 0xed, 0x5e, 0xb8, 0x13, 0x08, 0xe4, 0xda, 0x0a, 0x68, 0x2b, - 0x1d, 0xca, 0xd3, 0xac, 0xc4, 0x16, 0xa6, 0xc0, 0xc4, 0x46, 0xa9, 0x95, - 0x3a, 0x07, 0x9d, 0xa6, 0x7a, 0x56, 0xc4, 0xf9, 0x47, 0x4f, 0x2f, 0x08, - 0x1e, 0x12, 0x99, 0x9a, 0x2b, 0xa3, 0x66, 0x4b, 0xfa, 0x9e, 0xf6, 0x33, - 0x1f, 0x5a, 0x79, 0xdc, 0x74, 0x8f, 0xad, 0xfd, 0xf1, 0x42, 0x72, 0x3b, - 0xfe, 0xe1, 0x1c, 0x3f, 0xe9, 0x56, 0x94, 0x68, 0x8b, 0x0b, 0x5a, 0x43, - 0xf4, 0xa5, 0x63, 0xe6, 0xe5, 0x8e, 0x9e, 0x76, 0xd0, 0x9d, 0x00, 0x22, - 0x02, 0xce, 0xef, 0x18, 0x83, 0xd9, 0x7b, 0xc8, 0xcd, 0xc4, 0x8f, 0x74, - 0x76, 0x0c, 0x37, 0x31, 0x39, 0xdc, 0xa0, 0xfb, 0xdf, 0x2d, 0x84, 0x88, - 0x11, 0xa7, 0xdb, 0x77, 0xc8, 0xce, 0x99, 0xfe, 0x03, 0xf9, 0x43, 0xc3, - 0xbb, 0x7e, 0x4a, 0xac, 0x14, 0x53, 0xaf, 0xcb, 0x18, 0xed, 0x6d, 0xe9, - 0x5f, 0x03, 0x93, 0x3f, 0xa6, 0xcb, 0x21, 0xb6, 0x40, 0x5e, 0xfc, 0xe8, - 0x8b, 0xfe, 0xaf, 0x1c, 0x66, 0xaa, 0x82, 0xfb, 0x84, 0xf2, 0xa2, 0x5c, - 0x87, 0x9d, 0x2b, 0x70, 0x96, 0x4b, 0xc2, 0xa9, 0x61, 0x89, 0x8f, 0x67, - 0xd5, 0x24, 0x2a, 0xea, 0x25, 0x43, 0xed, 0x39, 0x8d, 0x5e, 0xa7, 0xdf, - 0x9e, 0x16, 0xf3, 0xd3, 0x31, 0x00, 0x93, 0x55, 0xd4, 0x49, 0xa4, 0x2e, - 0xf9, 0x12, 0x95, 0xe1, 0xf3, 0x7d, 0xf9, 0x76, 0x54, 0x3e, 0x96, 0xc0, - 0x07, 0x63, 0x3f, 0x3f, 0xb8, 0x2d, 0x2f, 0x7c, 0x44, 0xdd, 0x29, 0xf5, - 0x72, 0xd1, 0x2f, 0xb6, 0xfe, 0xeb, 0x5f, 0x5c, 0xcc, 0xce, 0x93, 0x4d, - 0x64, 0x23, 0x71, 0x5e, 0x05, 0x88, 0x2e, 0x73, 0x77, 0xef, 0x13, 0x1d, - 0x37, 0xa6, 0xc1, 0x99, 0xa8, 0x57, 0xa5, 0x1c, 0x21, 0xc1, 0x0b, 0xcf, - 0x47, 0xe6, 0x99, 0x90, 0xa7, 0x3d, 0x73, 0x5f, 0x5f, 0x60, 0x9a, 0x5d, - 0xed, 0x31, 0xba, 0xc8, 0xf1, 0xe9, 0x6a, 0x9c, 0xe4, 0x63, 0x9a, 0x21, - 0x78, 0x85, 0xd6, 0x2e, 0x80, 0xc9, 0x3b, 0x26, 0xd6, 0x66, 0x44, 0x46, - 0xcc, 0x37, 0xc1, 0xb6, 0x37, 0x0e, 0x59, 0xf2, 0x94, 0x2f, 0x6e, 0x64, - 0x78, 0xb4, 0x15, 0x76, 0x88, 0x01, 0x2b, 0xd0, 0x95, 0x12, 0xdd, 0xf2, - 0x92, 0xc1, 0xe2, 0x30, 0xa4, 0xdf, 0x5b, 0xce, 0x2a, 0xc4, 0x3f, 0xc8, - 0x8d, 0xb7, 0x7f, 0x12, 0x6f, 0x85, 0xc9, 0xf5, 0x6a, 0xf0, 0xb4, 0x77, - 0x50, 0xb0, 0xe7, 0x6f, 0x45, 0x6d, 0xc8, 0xb6, 0x34, 0x68, 0x70, 0x0d, - 0x62, 0x02, 0xff, 0x02, 0x76, 0x44, 0x86, 0x4d, 0xf5, 0xc4, 0xfe, 0xbd, - 0x3d, 0x72, 0x6b, 0x7e, 0x68, 0x10, 0x9d, 0xf2, 0xa7, 0x1a, 0xa6, 0xad, - 0x7f, 0x3c, 0xb0, 0x18, 0x20, 0x25, 0xdd, 0x02, 0xd0, 0x08, 0xa5, 0xc4, - 0xba, 0x28, 0x79, 0x92, 0x34, 0x0d, 0xc2, 0x48, 0x8e, 0x6f, 0x6d, 0x21, - 0x36, 0x17, 0x8c, 0x35, 0x6a, 0xf0, 0xa2, 0xf6, 0xb9, 0x26, 0x02, 0x47, - 0xa8, 0x4d, 0x28, 0x34, 0xfb, 0x60, 0xaa, 0xb2, 0x49, 0x8a, 0x49, 0xf0, - 0xc9, 0x86, 0x83, 0x0b, 0x44, 0xbe, 0x52, 0x52, 0x6f, 0x3c, 0x4e, 0x42, - 0x4e, 0xc0, 0x13, 0xdc, 0x5d, 0xcc, 0x8d, 0xf5, 0x98, 0xeb, 0x25, 0x82, - 0x97, 0xe0, 0xca, 0x0a, 0x2a, 0xd2, 0x73, 0x1a, 0xd8, 0x2f, 0xb9, 0x8b, - 0x64, 0x18, 0x75, 0xfa, 0xc0, 0xe1, 0xce, 0xaa, 0x93, 0x32, 0x53, 0x44, - 0x00, 0x02, 0x0c, 0xab, 0x2d, 0xb7, 0x19, 0x89, 0xeb, 0x71, 0x1e, 0x9d, - 0xaf, 0xec, 0xd1, 0xd5, 0x58, 0xd0, 0xf8, 0x71, 0xe4, 0xbe, 0xf7, 0x1c, - 0x49, 0x3f, 0xd3, 0x87, 0x26, 0x7f, 0x1d, 0x5b, 0xe7, 0x6a, 0x9f, 0x5e, - 0xb2, 0xd2, 0x97, 0xf3, 0x26, 0x74, 0xaf, 0x70, 0xe3, 0x1b, 0x8a, 0xda, - 0xc2, 0x0d, 0xad, 0xc3, 0xe6, 0xf2, 0x90, 0x1b, 0x97, 0x06, 0x94, 0x43, - 0x7e, 0xf6, 0x17, 0xb7, 0xb0, 0x22, 0x1d, 0xd7, 0x4b, 0x6e, 0xb8, 0x35, - 0xda, 0xa0, 0x18, 0xc3, 0x9c, 0x80, 0xfa, 0xb0, 0x18, 0xae, 0x56, 0x83, - 0x90, 0x3f, 0x77, 0xf5, 0x3d, 0x32, 0xae, 0xf7, 0x88, 0xdf, 0x79, 0xa5, - 0x92, 0x4e, 0xeb, 0x2b, 0x14, 0xe4, 0xa6, 0x7c, 0xe7, 0x6f, 0xf1, 0x68, - 0x45, 0xab, 0x59, 0x32, 0x6d, 0x68, 0x69, 0xb0, 0x7a, 0xe2, 0x8d, 0xa4, - 0x12, 0x98, 0xe0, 0x55, 0xf2, 0xa4, 0x39, 0x10, 0x8e, 0xd4, 0x02, 0x39, - 0x25, 0x4f, 0xe4, 0xb2, 0x04, 0xdf, 0x43, 0x65, 0x7f, 0x00, 0x38, 0xf3, - 0x10, 0xac, 0x2b, 0xc0, 0x3b, 0x9b, 0xe1, 0x3f, 0x70, 0x47, 0x3e, 0x6b, - 0xbb, 0x10, 0x89, 0x57, 0x49, 0x04, 0xfc, 0xbe, 0x71, 0x95, 0x8e, 0x03, - 0x8a, 0x99, 0x74, 0x51, 0xa1, 0x8d, 0x79, 0xe0, 0x46, 0xff, 0x1f, 0xee, - 0xc0, 0x60, 0x7f, 0xe7, 0xed, 0x4f, 0x8e, 0xc2, 0xd9, 0x5f, 0xd0, 0xb8, - 0xb4, 0x3d, 0x41, 0xcf, 0xc2, 0xfe, 0xab, 0x3b, 0xaf, 0xbc, 0xb7, 0x47, - 0xb2, 0x46, 0xfd, 0x04, 0xeb, 0xaa, 0x4b, 0x71, 0x4e, 0xd7, 0x6f, 0x7d, - 0x7c, 0x74, 0xd1, 0x9c, 0x89, 0x04, 0x1b, 0xeb, 0xac, 0x01, 0xe9, 0x4c, - 0xce, 0xa9, 0x8f, 0x4b, 0x39, 0x75, 0x36, 0x2f, 0x1c, 0xb5, 0xf9, 0x4d, - 0xfd, 0x0c, 0xca, 0xc0, 0x25, 0xb8, 0x13, 0x87, 0xa3, 0xa0, 0xc2, 0xba, - 0xe9, 0x69, 0xaa, 0xb1, 0x74, 0xc0, 0x99, 0xd1, 0x98, 0x97, 0x6c, 0xde, - 0xf5, 0xbe, 0xa2, 0x3a, 0x80, 0x68, 0x90, 0x07, 0xd5, 0x11, 0xe7, 0x54, - 0x68, 0x79, 0x25, 0x7e, 0xdc, 0xa6, 0xce, 0x11, 0x7f, 0xfb, 0x6e, 0xeb, - 0x3d, 0x15, 0xe6, 0x15, 0xd1, 0xc8, 0xe2, 0x23, 0xff, 0x31, 0x62, 0x47, - 0x82, 0xe1, 0x27, 0xce, 0xe4, 0x19, 0x2e, 0x5f, 0x21, 0x8e, 0x62, 0x57, - 0x35, 0xdf, 0x02, 0x8a, 0x55, 0x06, 0x68, 0xb1, 0x26, 0x5d, 0x75, 0x55, - 0xc7, 0xdc, 0x44, 0xae, 0xf6, 0xfc, 0xb8, 0xa5, 0x20, 0xd5, 0x68, 0xbd, - 0x05, 0x80, 0xe4, 0x58, 0xef, 0x16, 0xa5, 0xeb, 0x3e, 0xf3, 0x3c, 0xc4, - 0x30, 0x55, 0xc1, 0x25, 0x77, 0xbd, 0x92, 0x14, 0xbb, 0x1e, 0xdd, 0x0f, - 0x28, 0x1c, 0x8e, 0xe8, 0x53, 0x65, 0x94, 0x7e, 0x46, 0xae, 0x79, 0x2a, - 0xf0, 0xdb, 0x54, 0x7c, 0x7d, 0xd4, 0xf0, 0x5a, 0x32, 0xbb, 0x41, 0x13, - 0x74, 0x15, 0x2e, 0x43, 0x29, 0xaf, 0x56, 0x95, 0x00, 0x4c, 0x78, 0x01, - 0xd0, 0x14, 0xae, 0x4f, 0x59, 0x4b, 0x37, 0x4d, 0x7a, 0x35, 0xbd, 0x26, - 0x87, 0x7d, 0x54, 0x7f, 0xbb, 0x7c, 0x9a, 0x4b, 0x29, 0xff, 0xe2, 0xb2, - 0x64, 0xb1, 0x70, 0xaf, 0xea, 0xa8, 0xa4, 0x30, 0x1e, 0x77, 0xc0, 0x73, - 0x73, 0xae, 0xab, 0x29, 0x40, 0xf1, 0xbe, 0x56, 0x52, 0x89, 0x9f, 0xfd, - 0x6f, 0x27, 0xe4, 0xf4, 0x81, 0x63, 0xa1, 0x80, 0x05, 0x68, 0x55, 0xb3, - 0x09, 0xc4, 0x65, 0x57, 0xad, 0xcb, 0x52, 0xf0, 0x2f, 0x3c, 0xab, 0x14, - 0x2a, 0x8a, 0xdb, 0xff, 0xa3, 0x40, 0x6e, 0x70, 0x91, 0xaa, 0xd9, 0xcd, - 0x9c, 0x62, 0xd0, 0x01, 0xd5, 0x86, 0xc7, 0x5d, 0x44, 0x1b, 0xd7, 0x55, - 0x85, 0x32, 0x3e, 0x1f, 0x75, 0xed, 0xaf, 0x52, 0xc3, 0x91, 0x87, 0x3d, - 0x5d, 0xb1, 0x26, 0x81, 0x27, 0x31, 0xe6, 0x0a, 0x26, 0x85, 0xab, 0x2a, - 0x34, 0xe0, 0xc5, 0x48, 0x53, 0xcf, 0x02, 0x2c, 0xf5, 0x64, 0x0f, 0x67, - 0xb2, 0x38, 0x33, 0x74, 0x2b, 0x3b, 0x91, 0xf6, 0x2c, 0x34, 0x83, 0xfa, - 0xab, 0x2d, 0x8a, 0x0d, 0x70, 0xfb, 0xbe, 0xdb, 0xc4, 0x10, 0x11, 0xd5, - 0x51, 0x91, 0xa6, 0xdd, 0x56, 0x59, 0x02, 0xb6, 0x86, 0x2b, 0x4a, 0x8f, - 0x89, 0x88, 0xa0, 0x48, 0x05, 0xd5, 0x7c, 0xce, 0xa3, 0x6d, 0xb8, 0xa3, - 0x6a, 0xcc, 0x92, 0x31, 0x99, 0xd6, 0x73, 0x2c, 0x4d, 0xd1, 0xcf, 0xcf, - 0x15, 0x37, 0x85, 0xaf, 0xb5, 0x53, 0xbb, 0xb9, 0x03, 0xbb, 0x26, 0x68, - 0x89, 0x3e, 0x33, 0xbd, 0x54, 0xcc, 0x54, 0xcc, 0x3a, 0xb1, 0x67, 0x46, - 0x82, 0xf6, 0xc9, 0xe0, 0xcd, 0x63, 0x74, 0x0d, 0x14, 0xda, 0xa0, 0x4c, - 0xa6, 0x1f, 0xfe, 0xd5, 0xd3, 0x41, 0x99, 0x90, 0x48, 0x29, 0x09, 0x9c, - 0xba, 0xa0, 0x57, 0x25, 0xde, 0x1b, 0xab, 0x8e, 0x87, 0x73, 0x2f, 0xee, - 0xe5, 0x76, 0xea, 0x5a, 0x23, 0xc8, 0xba, 0x47, 0xd6, 0xd5, 0xce, 0x5e, - 0xa0, 0xc2, 0x18, 0xca, 0x92, 0x8b, 0x03, 0x02, 0x2e, 0xe2, 0x80, 0xd3, - 0x74, 0x8e, 0x45, 0xbd, 0x08, 0x90, 0x64, 0x50, 0xbd, 0xe1, 0x31, 0xd9, - 0x25, 0x49, 0x77, 0xd7, 0xf4, 0x34, 0xd0, 0xe3, 0x7e, 0xa8, 0x5c, 0x74, - 0xda, 0x72, 0x7c, 0x48, 0xdb, 0x9d, 0xdd, 0x81, 0x8c, 0x09, 0x34, 0x15, - 0x5d, 0x18, 0xba, 0x7d, 0x4b, 0x78, 0x77, 0xb5, 0x85, 0xaf, 0x08, 0x08, - 0x1a, 0x5d, 0x41, 0x15, 0xbe, 0xe6, 0x07, 0xd2, 0xdf, 0x35, 0x3c, 0x6a, - 0xc5, 0xd8, 0x9f, 0x00, 0x68, 0xb6, 0xea, 0x06, 0x52, 0x78, 0xe6, 0xa1, - 0x12, 0x63, 0x82, 0x5e, 0xe5, 0x14, 0x9b, 0x35, 0xa7, 0x38, 0xc1, 0xaa, - 0x3b, 0x56, 0x2d, 0x45, 0x58, 0x37, 0xf1, 0x34, 0x07, 0xe6, 0x3b, 0xf2, - 0x09, 0xb8, 0xa6, 0xbe, 0x6c, 0xaf, 0x52, 0x68, 0x70, 0x04, 0x80, 0x35, - 0x4f, 0x75, 0x1e, 0x28, 0xc0, 0xcb, 0xb5, 0x12, 0xea, 0x89, 0xcb, 0x05, - 0xe9, 0x2c, 0x5c, 0xe3, 0x27, 0xc9, 0x1d, 0x79, 0x13, 0xd2, 0x12, 0x39, - 0xec, 0x5d, 0xa3, 0x42, 0x0d, 0x68, 0x40, 0xc2, 0x3a, 0x9b, 0x8a, 0xb2, - 0xbd, 0xac, 0x4c, 0xf1, 0x70, 0x3f, 0xdc, 0x44, 0x23, 0xa2, 0xf6, 0x5c, - 0xaf, 0xcb, 0x20, 0x00, 0xb6, 0x31, 0x00, 0x64, 0x93, 0xb4, 0x40, 0xca, - 0xc7, 0x1d, 0x2d, 0xdc, 0x06, 0xf1, 0xfa, 0x59, 0xa8, 0x2c, 0xef, 0xd3, - 0x81, 0x96, 0xb5, 0x5d, 0xbd, 0xe2, 0xcf, 0x16, 0x4c, 0x6e, 0x74, 0x58, - 0x8a, 0x93, 0x9f, 0x07, 0xdd, 0x28, 0x0f, 0xae, 0x4d, 0xb6, 0x5e, 0x9d, - 0x60, 0x6d, 0x8c, 0x2c, 0x6a, 0x4c, 0x72, 0xd0, 0x1b, 0x4f, 0xb1, 0xcd, - 0x92, 0xd6, 0x49, 0xdc, 0x6d, 0x41, 0x31, 0x68, 0xa2, 0x71, 0x75, 0x76, - 0xa5, 0xd9, 0x56, 0x81, 0xf9, 0xd7, 0x89, 0x7e, 0x9e, 0x08, 0x91, 0xa5, - 0xb0, 0x88, 0xbd, 0x08, 0x30, 0xc0, 0x6d, 0xdc, 0xdf, 0xd9, 0x2a, 0xfd, - 0x8e, 0x82, 0x6c, 0x31, 0xd9, 0x83, 0x02, 0x99, 0x59, 0x5e, 0x99, 0xab, - 0x20, 0xce, 0x20, 0x4d, 0xd4, 0xdf, 0xa9, 0x84, 0x5e, 0x68, 0x4b, 0x17, - 0x65, 0xc2, 0x86, 0xd5, 0xf4, 0x0b, 0xc1, 0x89, 0xc6, 0x77, 0x8d, 0x23, - 0x15, 0xc6, 0x6d, 0xdd, 0x1c, 0x32, 0x37, 0x55, 0x91, 0x94, 0xe1, 0x03, - 0x4f, 0x75, 0x3a, 0xee, 0x1a, 0xcc, 0xc2, 0x5a, 0xb8, 0xe0, 0xfd, 0xf4, - 0x05, 0x51, 0x45, 0xb9, 0x23, 0x47, 0xb1, 0xd7, 0xe3, 0x51, 0xd7, 0x87, - 0x03, 0xab, 0x50, 0x55, 0x03, 0x2a, 0xf9, 0x3d, 0x7f, 0xe8, 0xe3, 0x0b, - 0xae, 0xde, 0x40, 0x18, 0xe0, 0xd7, 0x9c, 0x96, 0x81, 0x4e, 0x58, 0x46, - 0x8d, 0x4d, 0x1a, 0x50, 0xb8, 0x25, 0x56, 0xfe, 0x9b, 0x5e, 0xdf, 0x26, - 0x1e, 0x94, 0x73, 0x92, 0xb9, 0x9e, 0x5e, 0xb6, 0x2f, 0x9c, 0x29, 0x7f, - 0x60, 0xea, 0xea, 0x44, 0x06, 0xa1, 0x9b, 0xd3, 0x8d, 0xf8, 0x70, 0x78, - 0xb1, 0xa8, 0x0e, 0x9f, 0xbd, 0x1b, 0xd5, 0xbc, 0x87, 0x18, 0x7d, 0x45, - 0x7e, 0xdd, 0xe3, 0x8a, 0x43, 0x21, 0x0c, 0x60, 0xab, 0x9d, 0xd4, 0x4f, - 0xd0, 0x64, 0x48, 0x63, 0xa7, 0x90, 0xef, 0x19, 0x8b, 0x87, 0xfc, 0xe8, - 0x7d, 0x57, 0x71, 0x51, 0xa2, 0xb5, 0x09, 0x08, 0x64, 0x28, 0xc6, 0x99, - 0x79, 0xe6, 0x8d, 0xb1, 0xd3, 0x08, 0x2e, 0xae, 0x7c, 0xb6, 0x6a, 0xc2, - 0xef, 0xb9, 0x92, 0x89, 0x25, 0x60, 0x0e, 0x8b, 0x9b, 0x22, 0x78, 0x24, - 0x7b, 0xc3, 0x4e, 0xf1, 0x41, 0x51, 0xa4, 0xdb, 0xe8, 0x38, 0x3c, 0x36, - 0xa9, 0xc9, 0xd5, 0x0a, 0x4d, 0x80, 0x3a, 0x9e, 0x7b, 0x5c, 0x5e, 0x68, - 0x36, 0x8b, 0x27, 0x73, 0x27, 0x04, 0xdc, 0xea, 0x26, 0x0d, 0xd0, 0x68, - 0x24, 0xb7, 0x40, 0xea, 0x8e, 0xf1, 0x4b, 0xa4, 0x7a, 0xec, 0x22, 0x5a, - 0x2f, 0x0a, 0x62, 0x45, 0xc0, 0x00, 0x82, 0xcf, 0xb9, 0x31, 0xd2, 0x9c, - 0xbc, 0x5b, 0xa3, 0x57, 0xb2, 0x21, 0x5b, 0x45, 0x5c, 0x65, 0x1c, 0x3a, - 0xa0, 0x40, 0x73, 0x70, 0x9f, 0x11, 0x78, 0xb1, 0xca, 0x60, 0x01, 0x3f, - 0x30, 0x36, 0xe0, 0xdf, 0xad, 0x88, 0x57, 0x8e, 0x10, 0xc9, 0xa7, 0x87, - 0x83, 0x3d, 0x8e, 0xdb, 0x48, 0x13, 0x52, 0x33, 0x87, 0x43, 0xb7, 0x89, - 0x65, 0xdf, 0x52, 0x1c, 0xd0, 0x77, 0xb7, 0x1f, 0xfc, 0x78, 0x32, 0x2b, - 0x97, 0x75, 0xbb, 0x38, 0x8e, 0x15, 0xaf, 0x50, 0xac, 0x79, 0xe6, 0xe1, - 0xdd, 0x7b, 0x44, 0x9b, 0x73, 0xe9, 0xa7, 0x34, 0x42, 0x30, 0x74, 0x93, - 0xb1, 0xdf, 0x37, 0x03, 0x4d, 0x8d, 0x92, 0xfb, 0xde, 0x12, 0x92, 0xa9, - 0x41, 0xc6, 0x16, 0x34, 0x99, 0x27, 0x7d, 0x76, 0x59, 0xcb, 0x47, 0x27, - 0x24, 0xb0, 0x4b, 0xc8, 0x8d, 0x32, 0x97, 0xd4, 0x98, 0xb1, 0xbc, 0x4c, - 0x50, 0xed, 0xff, 0x48, 0x08, 0x5d, 0xa1, 0x48, 0x86, 0x71, 0x92, 0x15, - 0xd5, 0x52, 0x52, 0xed, 0xdc, 0x7f, 0x14, 0x8d, 0x34, 0xfa, 0x14, 0xa2, - 0x6c, 0x0b, 0x2a, 0xd1, 0xee, 0xc0, 0x7b, 0xfb, 0x76, 0xef, 0xee, 0x2a, - 0xd3, 0xed, 0x20, 0x8a, 0x56, 0x27, 0x73, 0x6b, 0x98, 0x65, 0x64, 0x73, - 0xae, 0xd5, 0x01, 0xae, 0xce, 0x1c, 0x29, 0xcb, 0x8a, 0x74, 0xfb, 0x55, - 0x1a, 0x1c, 0xb3, 0x5e, 0xf1, 0x44, 0x5f, 0x76, 0x41, 0x47, 0xd0, 0x29, - 0xb7, 0x72, 0xd7, 0x27, 0x08, 0xf9, 0x0d, 0xbe, 0x8b, 0x52, 0xa9, 0x16, - 0xaa, 0x89, 0xd9, 0x74, 0x1c, 0xc1, 0x85, 0xb3, 0x04, 0x10, 0x69, 0xe1, - 0x1a, 0x88, 0x1e, 0xd6, 0x0b, 0x90, 0xc4, 0x75, 0x2e, 0xca, 0x8b, 0x8d, - 0xf2, 0x67, 0xdc, 0x07, 0x42, 0x4c, 0xe3, 0x89, 0x4d, 0x06, 0x8a, 0x87, - 0x3a, 0xe7, 0xb8, 0x9d, 0x62, 0x32, 0x1c, 0xfa, 0x25, 0xd8, 0xd7, 0x5e, - 0xe1, 0xa8, 0xa6, 0x7b, 0xc1, 0xcf, 0x51, 0x72, 0xd3, 0xf3, 0x07, 0x13, - 0x24, 0x90, 0x2f, 0xd9, 0x98, 0x4d, 0x5c, 0x77, 0xce, 0xaa, 0xe5, 0x11, - 0x29, 0xc0, 0x8e, 0x67, 0xc5, 0x6f, 0xf1, 0xa4, 0x13, 0xb3, 0xc4, 0xe7, - 0x77, 0x8d, 0xc6, 0x02, 0x15, 0x51, 0x32, 0xb6, 0x4f, 0xd1, 0x34, 0xa0, - 0x12, 0x48, 0x15, 0x1a, 0xee, 0xba, 0xf5, 0x82, 0x51, 0x79, 0xa0, 0x57, - 0x67, 0xd4, 0x7b, 0x63, 0x73, 0x70, 0x3d, 0x1b, 0x80, 0x8c, 0x28, 0xdf, - 0x53, 0xcc, 0xf4, 0xe0, 0x91, 0xd6, 0x7a, 0x8d, 0xc9, 0x19, 0x4d, 0x9e, - 0xde, 0x34, 0x48, 0x01, 0x1f, 0xdc, 0xe3, 0x58, 0xd1, 0x3b, 0xe5, 0xff, - 0x57, 0x2e, 0xee, 0x96, 0x24, 0x0f, 0xbc, 0xfe, 0x2a, 0xc9, 0x9e, 0xdd, - 0xce, 0x31, 0xbd, 0xb6, 0x8f, 0xa8, 0x6b, 0x98, 0x4c, 0xef, 0x26, 0x3d, - 0x3a, 0xc1, 0x5d, 0xb5, 0x7f, 0x5c, 0x6c, 0x22, 0x2e, 0x03, 0x47, 0xf9, - 0x0c, 0xfa, 0x44, 0x60, 0xf8, 0x2b, 0x03, 0x08, 0x36, 0xff, 0x0d, 0xf6, - 0x72, 0xb9, 0x5e, 0x6a, 0x25, 0xac, 0x6a, 0xe1, 0x94, 0x27, 0x45, 0x7d, - 0x35, 0xf1, 0x5d, 0x2f, 0x35, 0x08, 0x58, 0x59, 0x61, 0x1d, 0x6f, 0x79, - 0x19, 0x88, 0xaa, 0xc7, 0x59, 0x25, 0xae, 0xcd, 0xce, 0x4f, 0x63, 0x91, - 0x47, 0x7b, 0x8c, 0xa3, 0x1e, 0xe1, 0x0b, 0xc8, 0x5d, 0xbe, 0xfd, 0x29, - 0x39, 0xfe, 0x79, 0x5f, 0xf6, 0x5f, 0x01, 0x05, 0x91, 0xdc, 0x4e, 0xa4, - 0xc5, 0x62, 0x91, 0x97, 0x9a, 0x47, 0x11, 0x2e, 0xf4, 0x99, 0xf8, 0x5e, - 0x3d, 0xc2, 0x58, 0x40, 0x3a, 0x82, 0xed, 0x25, 0x57, 0xd6, 0x08, 0xd7, - 0xe7, 0x54, 0xab, 0x6c, 0x36, 0xda, 0xf1, 0x3e, 0x1c, 0x8a, 0xb3, 0x28, - 0xe6, 0x77, 0xe2, 0x05, 0xca, 0x82, 0xf9, 0x40, 0x39, 0x15, 0xed, 0x0f, - 0xd2, 0x02, 0x1e, 0x7f, 0x88, 0xcc, 0x5c, 0xe4, 0x57, 0x7f, 0x1a, 0xcf, - 0x43, 0xb3, 0x49, 0x0b, 0x23, 0xca, 0x67, 0x35, 0x8e, 0xf7, 0x9c, 0xce, - 0x1e, 0xa0, 0x63, 0xd4, 0x54, 0x8a, 0xd8, 0x01, 0x8d, 0xc9, 0x91, 0x20, - 0xe4, 0x19, 0x7b, 0x99, 0x0c, 0xe5, 0x25, 0x4b, 0x8e, 0xc8, 0x55, 0x08, - 0xc8, 0x89, 0x7c, 0x1f, 0x29, 0x38, 0x3f, 0x48, 0x9d, 0xa5, 0x10, 0x14, - 0xb8, 0x34, 0xd9, 0x7c, 0xd0, 0x69, 0x75, 0x69, 0xf2, 0xcc, 0x65, 0x36, - 0x52, 0x0a, 0x70, 0x1a, 0x39, 0x89, 0x1f, 0x91, 0x29, 0x72, 0x61, 0xc5, - 0x24, 0x2e, 0x13, 0x9e, 0xc1, 0x2d, 0xe4, 0x12, 0x2b, 0xbd, 0xb8, 0x50, - 0xf4, 0x0d, 0xcd, 0x40, 0xb8, 0x64, 0x6b, 0x8d, 0x45, 0x15, 0x1d, 0x96, - 0xc6, 0xe5, 0xe8, 0xf4, 0x97, 0xc0, 0xd9, 0x75, 0x72, 0xca, 0x6f, 0xfc, - 0x05, 0x22, 0xb9, 0x92, 0xbd, 0x77, 0xe5, 0x81, 0x4d, 0xd8, 0x0e, 0x70, - 0xf6, 0xc7, 0xd1, 0xcd, 0x29, 0xd1, 0x9d, 0x73, 0x30, 0xc0, 0xd0, 0x77, - 0x69, 0x18, 0x76, 0x47, 0xd1, 0x02, 0x62, 0x8b, 0xb7, 0xb2, 0xc1, 0xe3, - 0xc7, 0x65, 0x53, 0x15, 0x6f, 0xac, 0xb4, 0xb6, 0xc4, 0x82, 0xce, 0x70, - 0x46, 0x5e, 0x67, 0xb8, 0x0e, 0x07, 0xc6, 0x17, 0xc9, 0x6e, 0xc0, 0x56, - 0xf0, 0x29, 0xad, 0x05, 0x7f, 0x07, 0x5a, 0xef, 0xb1, 0xa3, 0xa4, 0xcb, - 0x0d, 0x77, 0xeb, 0x64, 0xee, 0x91, 0xda, 0xe5, 0x9b, 0xe4, 0x5f, 0xab, - 0x8f, 0x8d, 0x04, 0xef, 0x9f, 0xcd, 0x0b, 0xc0, 0x5a, 0x8c, 0x17, 0x97, - 0x97, 0xfc, 0x20, 0x41, 0x5a, 0x49, 0x0f, 0xbd, 0x3a, 0xaa, 0x95, 0xac, - 0x67, 0x7b, 0x0b, 0xe3, 0x5b, 0x21, 0x35, 0xa3, 0x12, 0xa5, 0x45, 0x44, - 0x5b, 0x29, 0x8d, 0xe4, 0xfb, 0x0b, 0x9c, 0xae, 0x5e, 0x95, 0x0b, 0xc7, - 0x5c, 0x84, 0xbf, 0x5c, 0xcd, 0x39, 0xf8, 0x20, 0xe5, 0x99, 0xde, 0x44, - 0xa2, 0x9b, 0xbd, 0xc6, 0x74, 0x75, 0x23, 0xff, 0xe4, 0x80, 0xa9, 0x75, - 0xcf, 0x4d, 0xbf, 0x45, 0x38, 0xae, 0x18, 0x98, 0xfc, 0x45, 0xfa, 0x09, - 0xa9, 0x9d, 0xa7, 0x92, 0x58, 0xb6, 0x76, 0x79, 0xfa, 0xcc, 0x44, 0x7e, - 0x6f, 0xb2, 0xa7, 0x8a, 0x6a, 0x62, 0x79, 0x5c, 0x80, 0x7c, 0x34, 0x15, - 0x09, 0x85, 0xc4, 0x09, 0xb8, 0x2c, 0x9a, 0x36, 0xbe, 0x18, 0x94, 0x87, - 0x0f, 0xd7, 0x84, 0x15, 0x9f, 0xd8, 0x11, 0x22, 0x37, 0xd3, 0xf6, 0xd5, - 0xf2, 0x55, 0xaf, 0xd8, 0xb1, 0x09, 0x5e, 0x34, 0xe2, 0xf4, 0x6d, 0xbf, - 0x8a, 0xb2, 0xbd, 0xc0, 0xd8, 0xaa, 0x2a, 0x13, 0xb7, 0x6e, 0x64, 0x9b, - 0x1f, 0x9f, 0x6e, 0x8f, 0x44, 0xdb, 0xb8, 0x66, 0x2e, 0x57, 0x50, 0xa1, - 0x3e, 0x3c, 0x9c, 0x61, 0xef, 0xb5, 0xa7, 0x4d, 0xa0, 0xbe, 0x4f, 0x80, - 0x83, 0x4a, 0x59, 0xc0, 0x9b, 0x1b, 0x6d, 0x7b, 0xfa, 0xef, 0x62, 0x92, - 0x0d, 0x0b, 0x9b, 0xe6, 0x5e, 0xc2, 0x84, 0x09, 0x9e, 0x81, 0xc0, 0x33, - 0xb9, 0x05, 0xae, 0xed, 0x73, 0x9c, 0xc9, 0x48, 0x92, 0x3a, 0xff, 0x59, - 0x7e, 0x53, 0xd9, 0xc1, 0x9a, 0xdd, 0xf1, 0x69, 0x02, 0x8a, 0x7a, 0xda, - 0x6e, 0xcc, 0xf5, 0x98, 0xe0, 0x95, 0xb0, 0x17, 0x36, 0x7b, 0x6a, 0xd8, - 0x69, 0x17, 0xad, 0x46, 0xdf, 0x9e, 0x09, 0x16, 0xb9, 0x71, 0x64, 0xc8, - 0xd9, 0xd7, 0xa6, 0x38, 0x9f, 0x3a, 0x02, 0xf6, 0x1e, 0x28, 0xf6, 0xe8, - 0x18, 0x81, 0x9e, 0x1a, 0xd6, 0x49, 0x73, 0x8b, 0x9e, 0x15, 0xad, 0x82, - 0x7c, 0x63, 0x74, 0x63, 0xd0, 0x5d, 0xa8, 0xf0, 0x45, 0xed, 0xb1, 0x59, - 0x7c, 0x65, 0xa6, 0x79, 0x07, 0xec, 0x5c, 0x86, 0x80, 0x3e, 0x4e, 0xb3, - 0xc8, 0x80, 0xb4, 0xdb, 0x57, 0xaa, 0xb7, 0x17, 0x9f, 0xc2, 0xc8, 0x40, - 0xf2, 0x00, 0xe9, 0xc5, 0x70, 0x7b, 0xad, 0xa6, 0xf6, 0x69, 0xf2, 0x34, - 0xb7, 0x6d, 0xf1, 0xcd, 0x7b, 0x5f, 0xb7, 0x7a, 0x70, 0x7e, 0x62, 0x30, - 0xa2, 0xa4, 0x92, 0xbe, 0x2f, 0x9f, 0xc3, 0x4d, 0x83, 0x53, 0x23, 0x9f, - 0x39, 0x94, 0x6b, 0x5f, 0xd1, 0x03, 0x32, 0xb3, 0x85, 0x95, 0x85, 0xd0, - 0x37, 0x36, 0xed, 0x9a, 0x9f, 0xf1, 0xbb, 0x27, 0xa4, 0xbb, 0xfa, 0xf2, - 0x02, 0x13, 0x7b, 0x21, 0x50, 0xfc, 0x7f, 0x8b, 0x89, 0xee, 0x08, 0x20, - 0xc9, 0x18, 0x9a, 0x31, 0xf4, 0x7c, 0x2e, 0xbc, 0x4b, 0xb1, 0x04, 0xfc, - 0x01, 0xc6, 0xc6, 0x87, 0x75, 0x73, 0x29, 0x76, 0x24, 0x2e, 0x17, 0x87, - 0x64, 0xc8, 0xad, 0xed, 0x4d, 0x68, 0x91, 0xd6, 0x5f, 0x8d, 0xda, 0x9e, - 0xf7, 0x12, 0x05, 0x4f, 0xe6, 0x6c, 0xa3, 0x4f, 0x58, 0x69, 0x74, 0xa6, - 0x99, 0x56, 0x99, 0x22, 0x92, 0x57, 0x1a, 0x38, 0x12, 0x32, 0x35, 0x1c, - 0xab, 0x57, 0x5b, 0x74, 0x36, 0xb7, 0xf0, 0xab, 0x1d, 0x6a, 0x41, 0xc0, - 0x7c, 0xd8, 0x0b, 0x4e, 0xf8, 0x3a, 0x11, 0x6a, 0x75, 0x17, 0x66, 0x37, - 0xf9, 0xbe, 0x92, 0x43, 0x76, 0x31, 0xfe, 0x35, 0xfe, 0x47, 0xc1, 0x5d, - 0x79, 0x94, 0x46, 0x71, 0xcb, 0xbd, 0x73, 0x9e, 0x8a, 0x4b, 0x1c, 0x68, - 0x47, 0x5b, 0x77, 0x5c, 0x78, 0x5d, 0x71, 0x0a, 0xfd, 0xec, 0x41, 0x34, - 0xa4, 0xeb, 0x50, 0xf1, 0x15, 0xa4, 0xda, 0x39, 0x74, 0x76, 0xf0, 0x3b, - 0x6c, 0x25, 0xf6, 0xb2, 0x87, 0x17, 0x38, 0x39, 0x7c, 0x35, 0x45, 0x06, - 0xec, 0xe5, 0x7e, 0xbb, 0x55, 0x23, 0x12, 0x02, 0xa8, 0x19, 0x33, 0x2c, - 0xe8, 0x94, 0xd2, 0xdf, 0x3d, 0xd6, 0xa7, 0xee, 0xef, 0xb4, 0xe3, 0x3d, - 0x9e, 0x81, 0xcc, 0x61, 0xf8, 0x04, 0xe6, 0x38, 0x4b, 0xd9, 0x1e, 0xe4, - 0x27, 0x0a, 0x45, 0x52, 0xf8, 0x80, 0x61, 0x05, 0x25, 0x7a, 0xc2, 0xf4, - 0x6a, 0x80, 0x19, 0x9c, 0xc0, 0xb5, 0x7a, 0xd5, 0x94, 0xcf, 0x86, 0xa5, - 0x19, 0xe2, 0x27, 0x1e, 0x42, 0x9f, 0x09, 0xb6, 0xa7, 0xea, 0xf4, 0x28, - 0x54, 0x2d, 0x6b, 0x7f, 0xd9, 0xa9, 0x70, 0x0a, 0xcf, 0x70, 0xe8, 0x96, - 0x7c, 0x39, 0x7b, 0xe8, 0xa8, 0x60, 0x8a, 0xfa, 0xe2, 0x5c, 0xcd, 0x34, - 0x43, 0xf9, 0x41, 0x1f, 0x45, 0x1b, 0x61, 0x7a, 0x04, 0x57, 0x84, 0x7b, - 0xe9, 0x53, 0x8c, 0x15, 0x61, 0x78, 0x5a, 0xa4, 0xab, 0xe0, 0x1f, 0xce, - 0x05, 0xe9, 0x8f, 0x95, 0xb4, 0xfd, 0x3e, 0x4e, 0x96, 0x31, 0xee, 0x58, - 0x4f, 0x4e, 0x79, 0xf7, 0x32, 0x30, 0xc9, 0x6c, 0x63, 0xd3, 0xfd, 0xb0, - 0xe2, 0x99, 0x1e, 0x30, 0x44, 0x94, 0x49, 0x88, 0x02, 0xc1, 0x04, 0x1c, - 0x50, 0x3d, 0x45, 0x30, 0x94, 0xe9, 0xef, 0x7a, 0xf1, 0x30, 0x88, 0xab, - 0x40, 0xae, 0x69, 0x47, 0x48, 0x30, 0xc7, 0x2d, 0x40, 0x7f, 0x47, 0x02, - 0xee, 0x90, 0xc6, 0xb3, 0xea, 0x8f, 0x6c, 0x3f, 0x06, 0x6b, 0x14, 0x89, - 0xef, 0x70, 0x60, 0x74, 0xa7, 0x12, 0xb1, 0x32, 0xb9, 0xf4, 0x24, 0xa9, - 0x59, 0xf0, 0xa5, 0xe0, 0x61, 0x0d, 0xfd, 0x35, 0x7a, 0x76, 0x4c, 0x68, - 0x26, 0xa6, 0x1b, 0x59, 0x5f, 0x92, 0xb1, 0x66, 0x95, 0x7f, 0xcd, 0x54, - 0xe6, 0x2c, 0x27, 0x8c, 0xdd, 0xa3, 0x7c, 0x03, 0x50, 0x51, 0xc4, 0x2e, - 0xa4, 0x53, 0x69, 0x63, 0x54, 0x39, 0x18, 0x1a, 0xcf, 0x7c, 0x2d, 0x08, - 0x3a, 0x0a, 0xf9, 0x5b, 0xe7, 0x8e, 0x7a, 0x40, 0x21, 0x6a, 0x27, 0xb0, - 0xb7, 0x04, 0xf5, 0x61, 0xfe, 0xc1, 0xfe, 0x44, 0xdf, 0xdd, 0x86, 0x7a, - 0x6e, 0x96, 0x57, 0x2d, 0xa5, 0xed, 0x41, 0x05, 0xa3, 0x1a, 0x15, 0x13, - 0x20, 0x20, 0x2a, 0x34, 0x9e, 0x33, 0xc5, 0x8b, 0x5b, 0x30, 0x74, 0x46, - 0x16, 0x95, 0xe6, 0x06, 0x9f, 0xd2, 0xf0, 0x46, 0xf7, 0x34, 0x34, 0x18, - 0x42, 0xb6, 0x78, 0x5a, 0x72, 0xdc, 0x94, 0xfc, 0x7c, 0xc6, 0x06, 0x83, - 0x85, 0x13, 0x5e, 0x4e, 0x07, 0x8c, 0xdf, 0x99, 0x0b, 0xf4, 0x51, 0xf0, - 0x68, 0x24, 0x26, 0xc0, 0x16, 0x82, 0xd2, 0x81, 0xac, 0xba, 0x5b, 0x4f, - 0xc1, 0x69, 0x0f, 0xca, 0x5e, 0x34, 0x1a, 0x45, 0xb5, 0x8b, 0x07, 0x42, - 0xff, 0xbb, 0xd9, 0x45, 0xa8, 0xed, 0x03, 0xb7, 0x54, 0xa1, 0x41, 0xf3, - 0xfd, 0xbe, 0xbe, 0x29, 0x8f, 0x07, 0x06, 0x52, 0xee, 0x19, 0x99, 0xcc, - 0x2c, 0xb2, 0x48, 0x76, 0xca, 0x9e, 0xc8, 0xfc, 0x1d, 0x8b, 0x7f, 0xd8, - 0x19, 0x09, 0xaf, 0x95, 0xd2, 0x0e, 0x87, 0x4d, 0x4e, 0xc3, 0x86, 0xda, - 0x6d, 0x36, 0xdd, 0xf4, 0x92, 0x84, 0x1c, 0x9b, 0xa0, 0x74, 0xc5, 0x8e, - 0xcb, 0xc6, 0x67, 0xc1, 0x76, 0x85, 0x14, 0x4d, 0x79, 0x15, 0xd4, 0xed, - 0xcf, 0xb2, 0x73, 0x7c, 0x20, 0x8b, 0x2b, 0xfc, 0x80, 0xad, 0x76, 0x54, - 0x66, 0x36, 0x1f, 0xd6, 0xe9, 0xba, 0x5a, 0x5e, 0xd3, 0xf5, 0x6f, 0x86, - 0x0d, 0x3f, 0xaf, 0x53, 0x7a, 0xd4, 0x68, 0x97, 0x74, 0x04, 0x8d, 0xd9, - 0xa9, 0xad, 0x3e, 0x2f, 0x9d, 0x60, 0x1f, 0x04, 0xca, 0x2b, 0xeb, 0x01, - 0x2e, 0xbf, 0x35, 0xc6, 0x38, 0xbf, 0xe7, 0x47, 0xa3, 0x9b, 0x32, 0xa4, - 0x30, 0xf3, 0xb5, 0x2d, 0x06, 0xf5, 0xed, 0xd5, 0xf8, 0x58, 0xda, 0x4e, - 0xd7, 0x8a, 0x68, 0x0c, 0xb9, 0x24, 0x6f, 0x86, 0x21, 0xcf, 0x57, 0x1b, - 0x53, 0x09, 0xdb, 0x4b, 0xf1, 0xbc, 0xaa, 0x1f, 0x8c, 0x12, 0x6d, 0x17, - 0xd2, 0x96, 0xd3, 0x32, 0x57, 0x98, 0x5a, 0x58, 0xf6, 0x16, 0x33, 0x7c, - 0x64, 0x38, 0xce, 0x7d, 0xda, 0x6a, 0x3c, 0xb8, 0xf2, 0xb1, 0xcb, 0x03, - 0x23, 0xf6, 0x8b, 0x0d, 0xc7, 0x2e, 0xde, 0x93, 0x58, 0x43, 0x2a, 0x81, - 0x40, 0x89, 0x82, 0x17, 0x87, 0x10, 0xda, 0x31, 0x2d, 0x1b, 0xd5, 0xed, - 0x8f, 0x00, 0x8c, 0x63, 0xaa, 0x1f, 0xfe, 0xef, 0xe0, 0x06, 0xf1, 0x18, - 0x4a, 0xb1, 0x9b, 0x37, 0x5d, 0x15, 0x25, 0x42, 0xa5, 0x1f, 0x1d, 0x55, - 0x02, 0xc3, 0xd6, 0xeb, 0x32, 0x9d, 0x58, 0x9d, 0xa4, 0xc8, 0x42, 0x9c, - 0x15, 0xd4, 0xe6, 0x30, 0xde, 0x63, 0xd2, 0x7a, 0x32, 0x76, 0xe1, 0x02, - 0x4e, 0x58, 0x9b, 0x62, 0x6a, 0x8d, 0xc1, 0xc9, 0x03, 0xd2, 0x90, 0x54, - 0x9b, 0xec, 0x6f, 0xcd, 0x5c, 0x09, 0x39, 0x5e, 0xde, 0x55, 0x75, 0x93, - 0x3c, 0x9c, 0xea, 0x53, 0xf5, 0xb7, 0xcc, 0xad, 0x40, 0xe6, 0xac, 0x6e, - 0x26, 0xf1, 0x0a, 0x3d, 0x63, 0xd2, 0xdf, 0x8d, 0x55, 0x12, 0xd9, 0x1b, - 0xef, 0xc5, 0x76, 0x41, 0xea, 0xd8, 0xfc, 0x8a, 0xb7, 0xb3, 0x9a, 0x86, - 0xfe, 0x58, 0xfc, 0xd6, 0xe8, 0x48, 0xad, 0x0a, 0x8c, 0xbf, 0x6c, 0x53, - 0x3a, 0x9a, 0x7c, 0x72, 0x6b, 0xff, 0x57, 0xe0, 0x30, 0x5e, 0x18, 0x10, - 0xae, 0xd2, 0x9e, 0xc0, 0xd3, 0x55, 0x70, 0x6c, 0xf1, 0xa2, 0xd9, 0xe1, - 0x6b, 0xdf, 0x88, 0x95, 0xc4, 0x43, 0x5d, 0x98, 0xb4, 0xb8, 0xa5, 0x81, - 0x3a, 0x54, 0x48, 0x02, 0xcb, 0xcd, 0x6e, 0xef, 0xf4, 0x9c, 0xbb, 0x88, - 0x75, 0xb3, 0x05, 0x15, 0x44, 0x51, 0x73, 0xa8, 0x9d, 0xc7, 0xc6, 0x54, - 0x8e, 0x82, 0x5a, 0x16, 0x70, 0x0b, 0xa1, 0xee, 0xa7, 0x78, 0xbf, 0xfe, - 0x49, 0x3b, 0x92, 0x07, 0xe4, 0x13, 0xba, 0xdd, 0x3d, 0x97, 0x64, 0x85, - 0x6b, 0xcc, 0xeb, 0x14, 0x50, 0x28, 0x2d, 0x01, 0x6b, 0xe3, 0x4f, 0x9e, - 0x80, 0x0e, 0x39, 0x9d, 0x84, 0x72, 0xc0, 0x7c, 0x4a, 0x4e, 0x8f, 0xe1, - 0xac, 0xc8, 0x64, 0xb5, 0x10, 0xc1, 0x82, 0x65, 0xf5, 0xaa, 0x9c, 0xb3, - 0xf0, 0xcf, 0xbd, 0xa3, 0xa7, 0xf3, 0xf7, 0x2f, 0xa9, 0xb3, 0xdf, 0x11, - 0x8c, 0x9b, 0xdc, 0x66, 0x35, 0x6c, 0x37, 0x30, 0x35, 0xee, 0x3b, 0x06, - 0x12, 0xae, 0x2c, 0xb2, 0x05, 0x5c, 0x06, 0x7c, 0xac, 0xb4, 0xad, 0x11, - 0x47, 0xfc, 0xfb, 0x89, 0x91, 0x36, 0xca, 0xd0, 0x1c, 0xe8, 0xa5, 0x85, - 0xcf, 0x8c, 0x38, 0x03, 0x03, 0xcd, 0xd2, 0x4c, 0xde, 0xbb, 0xbd, 0x55, - 0x39, 0x91, 0xca, 0x46, 0xcd, 0x7d, 0x02, 0xa6, 0x3e, 0x13, 0xfa, 0x7f, - 0xd1, 0xbf, 0x61, 0xd3, 0xaf, 0xd8, 0xe7, 0xca, 0xff, 0x48, 0x78, 0x28, - 0xd0, 0x0e, 0xb5, 0x8f, 0x13, 0x1b, 0x1b, 0xd9, 0x07, 0x07, 0xed, 0x8a, - 0x5e, 0x90, 0xa0, 0x7f, 0x7d, 0xbb, 0x1e, 0x49, 0x43, 0x80, 0x25, 0xed, - 0x37, 0xf1, 0x7d, 0xbf, 0xdf, 0x9d, 0x1f, 0xd5, 0xb8, 0x5a, 0xfa, 0xad, - 0xde, 0xb0, 0xeb, 0x6e, 0xcd, 0x48, 0xe6, 0x88, 0xc3, 0x66, 0x9d, 0xb2, - 0x20, 0xca, 0x5a, 0x2f, 0x95, 0x72, 0xd6, 0xf0, 0x83, 0x5e, 0xd2, 0x5e, - 0x28, 0x9b, 0xcb, 0xd5, 0xc9, 0xac, 0xbd, 0xa7, 0x73, 0x56, 0xad, 0x6b, - 0xc1, 0x4a, 0x0d, 0x13, 0xe8, 0x52, 0x9a, 0x4b, 0xf3, 0x76, 0xbf, 0x0e, - 0xf6, 0xa2, 0x03, 0x81, 0x69, 0xca, 0x7d, 0xf1, 0xf5, 0x51, 0xe1, 0xf7, - 0x98, 0x0c, 0x77, 0xd9, 0xe0, 0x1c, 0x23, 0xf5, 0x3c, 0x57, 0x8c, 0xe6, - 0x56, 0xbc, 0x71, 0xe5, 0xa7, 0xf7, 0x8a, 0x57, 0x30, 0xbf, 0xf0, 0xca, - 0x85, 0xc3, 0x1a, 0x6a, 0x8e, 0x81, 0x5c, 0xcd, 0x4c, 0x9a, 0x69, 0xe1, - 0xee, 0x58, 0x05, 0x43, 0x52, 0x4f, 0x86, 0x0c, 0xc9, 0x66, 0xe6, 0x7f, - 0x64, 0x33, 0xc9, 0xf7, 0x02, 0x57, 0x39, 0xc2, 0x98, 0x5d, 0xe6, 0xd3, - 0xa8, 0x33, 0x12, 0x59, 0x6a, 0xd1, 0x17, 0xa8, 0x0e, 0x10, 0x05, 0x41, - 0x87, 0xe4, 0x0b, 0x6e, 0xa0, 0x79, 0x85, 0x8b, 0x75, 0x0c, 0xe3, 0x6a, - 0xf7, 0xdf, 0xdf, 0x9f, 0x3f, 0x3e, 0xd1, 0x4c, 0x5d, 0x3f, 0xc7, 0xc6, - 0x00, 0x1f, 0xf5, 0xf4, 0x42, 0x6f, 0xc9, 0xbb, 0x3b, 0x59, 0x99, 0x59, - 0x54, 0x2c, 0xf8, 0x59, 0xce, 0x83, 0xbb, 0xe2, 0xd2, 0x92, 0xd7, 0xea, - 0x9d, 0xef, 0x6c, 0x21, 0x25, 0x0d, 0xff, 0x41, 0x11, 0xe2, 0xb0, 0xe7, - 0x85, 0x7a, 0x48, 0x35, 0xeb, 0x56, 0xe5, 0x03, 0x74, 0x16, 0x82, 0xf8, - 0x4a, 0x00, 0x82, 0x2c, 0x25, 0x54, 0x92, 0xcb, 0xf3, 0x96, 0x66, 0x25, - 0xd9, 0x8c, 0xd5, 0xa0, 0xe0, 0xae, 0x68, 0x89, 0x01, 0x78, 0x99, 0xa4, - 0x1a, 0xed, 0xc2, 0x4b, 0x1e, 0xc9, 0xaf, 0xbe, 0xfd, 0x7b, 0xbe, 0x93, - 0xbf, 0xe3, 0x81, 0xb8, 0x0d, 0x8b, 0xb6, 0x2d, 0x4e, 0x05, 0x18, 0xd8, - 0xe9, 0x13, 0xc4, 0xe3, 0x0d, 0x4d, 0x86, 0x4a, 0x95, 0x86, 0xcb, 0x63, - 0xed, 0x7e, 0x5a, 0x95, 0x52, 0x71, 0x49, 0x77, 0xe6, 0x49, 0xfd, 0x05, - 0xcb, 0x12, 0x2d, 0x99, 0x8b, 0xaf, 0x2f, 0xc8, 0x65, 0x38, 0xce, 0xe6, - 0xfa, 0x21, 0x22, 0x50, 0x22, 0xbc, 0x97, 0x5f, 0xef, 0xc9, 0x43, 0xd2, - 0x21, 0x4e, 0x1a, 0x39, 0xdc, 0x2f, 0x18, 0x97, 0xf8, 0x9a, 0x7b, 0xd8, - 0xf8, 0x23, 0xb6, 0xbb, 0x22, 0x7d, 0xec, 0xe6, 0xc2, 0xd7, 0x0f, 0x88, - 0x0c, 0xaa, 0x69, 0x60, 0x5c, 0x5a, 0xe1, 0xc7, 0x11, 0x39, 0x44, 0x31, - 0x8a, 0xc1, 0x51, 0xd2, 0xb1, 0x4f, 0x2a, 0xeb, 0xf8, 0xaa, 0x75, 0x74, - 0x5a, 0x5c, 0x69, 0xc9, 0xf1, 0xc3, 0xe4, 0x06, 0x85, 0x3c, 0xcd, 0x5c, - 0x09, 0xf3, 0x5d, 0xab, 0xdd, 0x81, 0x58, 0x9d, 0xe4, 0xbf, 0xa6, 0x1e, - 0xde, 0x4e, 0x75, 0x90, 0x77, 0x2b, 0x61, 0xf2, 0xc2, 0xe1, 0x15, 0xb2, - 0x1d, 0x58, 0x72, 0x87, 0x60, 0x30, 0xc6, 0xad, 0x1b, 0x7f, 0x06, 0xf4, - 0x1f, 0x8d, 0xfb, 0x7c, 0xdb, 0xaa, 0xba, 0x72, 0xca, 0xbf, 0xd0, 0x69, - 0xa4, 0xf1, 0xc0, 0xf2, 0x3d, 0xb3, 0xdd, 0xc9, 0x94, 0x87, 0xc9, 0x3b, - 0xb3, 0x1e, 0xef, 0x0a, 0xe9, 0xc7, 0x27, 0xd9, 0x08, 0xc5, 0x48, 0xb9, - 0x83, 0x0c, 0xfd, 0xb9, 0x17, 0xe8, 0x52, 0xda, 0xe3, 0x02, 0xd5, 0x01, - 0x1c, 0x09, 0x95, 0x4a, 0x0c, 0x00, 0x81, 0xee, 0x09, 0xbe, 0xbb, 0x04, - 0xd8, 0x43, 0xb6, 0xea, 0x71, 0x3a, 0x44, 0xbe, 0x30, 0x5e, 0x63, 0x8e, - 0x12, 0xfa, 0x05, 0x1c, 0x5b, 0x29, 0xda, 0xee, 0x83, 0x9b, 0x6f, 0x4d, - 0x53, 0x0e, 0x6b, 0x32, 0x34, 0xfe, 0xe9, 0x99, 0x4e, 0x2f, 0x27, 0xae, - 0xf0, 0x1e, 0xf1, 0xb1, 0x06, 0xdb, 0x99, 0x6f, 0x00, 0x92, 0x6c, 0x4f, - 0xed, 0x9d, 0xfa, 0x21, 0x3f, 0xc1, 0x4a, 0xb8, 0x17, 0xd6, 0x66, 0x55, - 0xd0, 0x73, 0xd0, 0xd8, 0xbb, 0x34, 0xf3, 0x69, 0x3e, 0xdc, 0x41, 0x44, - 0x7c, 0xb5, 0x0a, 0x3b, 0x51, 0xc1, 0x10, 0x45, 0x1b, 0x82, 0xa5, 0x51, - 0x3f, 0x84, 0x36, 0x9f, 0x54, 0x7a, 0x2c, 0x15, 0x58, 0xa3, 0x5a, 0x14, - 0x5c, 0x2f, 0x0e, 0x18, 0xf2, 0xdd, 0xad, 0x74, 0x67, 0x24, 0xff, 0xed, - 0x89, 0x4d, 0xc8, 0xca, 0x34, 0x07, 0x8e, 0x8e, 0x95, 0x22, 0xcd, 0xec, - 0x33, 0xa0, 0x69, 0x97, 0xbe, 0xe1, 0x7f, 0xbb, 0x95, 0x26, 0x20, 0x4f, - 0x55, 0xeb, 0x6c, 0x23, 0x91, 0x6f, 0x78, 0x67, 0x00, 0xce, 0x79, 0x08, - 0xc9, 0xbb, 0xef, 0x86, 0xbc, 0x8d, 0x6a, 0x01, 0x4f, 0x2b, 0xae, 0xbd, - 0x48, 0x01, 0x66, 0xd9, 0x06, 0x1f, 0x0d, 0xd0, 0xfc, 0x4c, 0x14, 0x93, - 0x2b, 0x9c, 0x90, 0xbf, 0xd9, 0xe9, 0x59, 0xfe, 0x19, 0x23, 0xe7, 0x5a, - 0x61, 0xba, 0x0d, 0xc0, 0xb7, 0x4b, 0x5e, 0xf6, 0x6f, 0x0f, 0x58, 0xf6, - 0x9a, 0x3c, 0xbe, 0xff, 0xdb, 0x33, 0x4f, 0x01, 0x55, 0x1a, 0x34, 0x61, - 0x98, 0x05, 0xf0, 0xcd, 0x10, 0x90, 0x60, 0xa6, 0xb1, 0xbc, 0x20, 0xa2, - 0x61, 0x07, 0xf2, 0x50, 0xf3, 0x0d, 0x86, 0x46, 0x58, 0x82, 0xb6, 0x83, - 0xa9, 0x1c, 0xd8, 0xf8, 0xb4, 0x8b, 0x12, 0x7f, 0xf3, 0x43, 0x63, 0x30, - 0x1d, 0x87, 0x83, 0x7a, 0xa3, 0x77, 0x50, 0x38, 0x24, 0x55, 0xe9, 0xa0, - 0x9d, 0xf9, 0x20, 0x1e, 0x4a, 0xfb, 0x40, 0x33, 0x54, 0x92, 0xb9, 0xf6, - 0xa6, 0xcb, 0xb6, 0xb5, 0x0e, 0x04, 0x79, 0x56, 0x9e, 0xdb, 0xf6, 0x65, - 0xa7, 0xb2, 0xb9, 0x53, 0x01, 0x59, 0xcc, 0x1b, 0x83, 0xfd, 0x8f, 0xd1, - 0xa6, 0xd4, 0x05, 0xe3, 0x28, 0x23, 0x4e, 0x8e, 0x75, 0x68, 0xf6, 0x13, - 0x6f, 0x51, 0x01, 0x51, 0xe1, 0x49, 0x72, 0xf0, 0x45, 0x2f, 0xa4, 0x52, - 0xa1, 0x8a, 0x28, 0x8b, 0x79, 0x1d, 0xf7, 0x87, 0xd9, 0x80, 0xac, 0xcc, - 0xae, 0xdf, 0x9e, 0x9d, 0x61, 0xcd, 0xb4, 0x8a, 0xa1, 0x36, 0xe9, 0x56, - 0xa2, 0xe9, 0x18, 0xf6, 0x79, 0x78, 0x9d, 0xef, 0x72, 0x84, 0xf3, 0xd2, - 0x44, 0xd1, 0xf6, 0x94, 0xde, 0x1d, 0x11, 0x47, 0xd4, 0x5c, 0x24, 0x17, - 0x54, 0xc1, 0xcd, 0xac, 0xe9, 0x05, 0x98, 0x66, 0xd9, 0xa4, 0xc0, 0x0a, - 0xbb, 0x75, 0xa4, 0xd3, 0x97, 0xe7, 0x55, 0x69, 0xa0, 0xa0, 0xd8, 0x94, - 0x7a, 0xe9, 0xd8, 0x6b, 0x02, 0x96, 0x51, 0x70, 0x43, 0x56, 0x65, 0xe6, - 0x43, 0x5c, 0xd9, 0xe3, 0x72, 0x41, 0xb8, 0x9a, 0x7c, 0xc9, 0x10, 0xb2, - 0xe1, 0x1f, 0x3e, 0x07, 0x10, 0x13, 0xf8, 0x66, 0x49, 0x2e, 0x3a, 0xa4, - 0xb5, 0xc7, 0x95, 0x63, 0x54, 0x47, 0xf0, 0xa1, 0x13, 0x80, 0x35, 0x4b, - 0x32, 0x21, 0x3f, 0x19, 0x18, 0xe3, 0x70, 0x40, 0x19, 0x29, 0x06, 0x34, - 0x1f, 0x45, 0xa7, 0xe2, 0x7b, 0x42, 0xe3, 0xc9, 0x17, 0x93, 0x6d, 0x93, - 0xe3, 0xea, 0xbe, 0x66, 0x61, 0x0c, 0xfb, 0xc3, 0xc5, 0xa9, 0x8b, 0x01, - 0xf7, 0xf1, 0x9b, 0xed, 0x68, 0x88, 0x0a, 0xe8, 0x28, 0x50, 0x36, 0xe2, - 0x41, 0xd7, 0x89, 0x97, 0x81, 0xe9, 0x7f, 0x70, 0xdf, 0xd3, 0x47, 0xdb, - 0xef, 0xee, 0x6e, 0x64, 0xcd, 0xd9, 0x17, 0x2d, 0xa9, 0x8a, 0x41, 0x4d, - 0x3b, 0x7b, 0x7b, 0x36, 0x96, 0x66, 0xa2, 0xc7, 0x15, 0x73, 0x50, 0x2b, - 0x6f, 0xf4, 0x60, 0x83, 0x94, 0x63, 0xa6, 0xf8, 0x44, 0x32, 0xaf, 0xd5, - 0xe2, 0x97, 0xd9, 0x2d, 0x96, 0x94, 0xdc, 0x47, 0x29, 0x55, 0xc1, 0xd8, - 0x67, 0xe5, 0x6a, 0x57, 0xbb, 0x91, 0xe1, 0x67, 0xef, 0xc7, 0x6f, 0xde, - 0xe8, 0xde, 0x0b, 0x94, 0xd7, 0x41, 0x58, 0xae, 0xfe, 0x29, 0x63, 0x98, - 0x76, 0x03, 0x03, 0x02, 0x86, 0xd7, 0xc0, 0x9b, 0x42, 0x61, 0x27, 0x91, - 0xaa, 0x86, 0x00, 0xc5, 0x6c, 0x8a, 0x1f, 0x69, 0xd5, 0x14, 0x58, 0x2a, - 0x10, 0x76, 0xdd, 0x5b, 0xbe, 0xff, 0x90, 0xe6, 0xd3, 0x51, 0xb1, 0x92, - 0x0b, 0x55, 0xf2, 0x94, 0x7c, 0x15, 0x44, 0x3f, 0xa5, 0x48, 0xea, 0x14, - 0xaa, 0x52, 0x28, 0x2b, 0xf9, 0x8e, 0xca, 0x9a, 0x35, 0x51, 0x64, 0x27, - 0x4e, 0x0d, 0xc8, 0x35, 0xcb, 0xb1, 0x74, 0x1b, 0xd5, 0x03, 0x33, 0x38, - 0x75, 0x5b, 0xe4, 0x52, 0xaa, 0x5c, 0xb6, 0x30, 0xec, 0xdb, 0x29, 0x67, - 0x5c, 0x69, 0x3a, 0x18, 0xd6, 0x9b, 0x2a, 0x0b, 0x94, 0x2d, 0x6d, 0xfb, - 0x1e, 0xa7, 0x46, 0x60, 0x6d, 0x13, 0x40, 0x09, 0xea, 0x8e, 0x00, 0x66, - 0x60, 0x98, 0x4e, 0x1b, 0x0a, 0x95, 0x5e, 0x47, 0x86, 0x44, 0x33, 0x94, - 0x15, 0x71, 0xdf, 0xbd, 0x9d, 0x7e, 0xfa, 0x5f, 0xcc, 0x17, 0x96, 0x6c, - 0x83, 0xb0, 0x20, 0xba, 0x71, 0x3e, 0x0e, 0x3b, 0x72, 0x0c, 0xf8, 0xff, - 0x42, 0x01, 0x80, 0x2c, 0x4a, 0xca, 0x97, 0x75, 0xd4, 0xb2, 0x11, 0xea, - 0x5b, 0xad, 0xd2, 0xc8, 0x2f, 0xb7, 0x12, 0x2b, 0x20, 0x3b, 0xf1, 0x17, - 0x3f, 0x67, 0xce, 0xdb, 0xe8, 0x56, 0x45, 0xbd, 0x38, 0x64, 0xaf, 0x9e, - 0x00, 0x75, 0xbc, 0xc0, 0xdf, 0x08, 0x98, 0x8e, 0x61, 0x52, 0xf6, 0xa8, - 0xee, 0xfb, 0x9a, 0x8e, 0x4e, 0x7e, 0xd9, 0x17, 0xce, 0x51, 0x02, 0x87, - 0xcf, 0xdc, 0xd0, 0xda, 0x18, 0xdf, 0x99, 0x9e, 0x0a, 0x3b, 0xfa, 0x25, - 0xff, 0x4e, 0x6d, 0xb5, 0xb8, 0x60, 0xff, 0x07, 0x65, 0x57, 0x55, 0x02, - 0x30, 0xff, 0xf9, 0x13, 0x2e, 0xb1, 0xe0, 0x08, 0xae, 0x67, 0x53, 0x50, - 0xb1, 0xd7, 0xbb, 0x50, 0xf9, 0xb8, 0x63, 0x24, 0x02, 0xea, 0xfe, 0x23, - 0x66, 0xd9, 0x13, 0x0e, 0xaf, 0x38, 0x18, 0xff, 0x54, 0x6c, 0x7f, 0xda, - 0xec, 0x15, 0x51, 0xaf, 0xff, 0xdb, 0xc9, 0x03, 0x9d, 0xf2, 0xe7, 0x50, - 0x10, 0x08, 0xce, 0xf6, 0xf4, 0xa2, 0x64, 0x21, 0xf7, 0x2f, 0x43, 0x70, - 0xe4, 0x3b, 0xca, 0x06, 0x46, 0x49, 0xc3, 0xc3, 0xc2, 0x17, 0xb3, 0x88, - 0xdd, 0xbc, 0x6a, 0xc9, 0xc5, 0xd1, 0x34, 0xcd, 0x01, 0xfd, 0x3a, 0xa3, - 0x69, 0xab, 0x45, 0xd5, 0x84, 0xe1, 0xd2, 0x2f, 0xdf, 0xa3, 0xcd, 0xc3, - 0xb0, 0x9f, 0x16, 0xa3, 0x0f, 0xf0, 0x12, 0x6e, 0x91, 0x5e, 0xcc, 0x73, - 0xf2, 0x13, 0x66, 0xef, 0x88, 0x4e, 0x0a, 0x35, 0x68, 0xd8, 0x71, 0x24, - 0x07, 0xa3, 0x5d, 0xd2, 0x04, 0x14, 0x57, 0x64, 0xe6, 0xca, 0xea, 0x94, - 0xa7, 0x2f, 0x6a, 0x45, 0xa6, 0x56, 0xdb, 0x6a, 0x3d, 0x06, 0x82, 0xae, - 0xbc, 0x0d, 0x34, 0x0b, 0x86, 0x80, 0x38, 0xae, 0x00, 0x09, 0x84, 0x13, - 0x2b, 0xfb, 0x8d, 0x6a, 0x37, 0x70, 0x7e, 0x34, 0xd9, 0x03, 0x41, 0x9f, - 0x95, 0xc5, 0x6a, 0x59, 0xf0, 0x3c, 0x72, 0x7a, 0xbb, 0x8a, 0x4c, 0x35, - 0x0d, 0xe2, 0x95, 0x85, 0x6f, 0xc6, 0x95, 0x96, 0x0e, 0x12, 0x4e, 0x19, - 0xce, 0xa6, 0xda, 0xf0, 0x67, 0xf9, 0x63, 0xb7, 0x9f, 0xba, 0xfe, 0x1f, - 0xd4, 0x6a, 0xbc, 0x8d, 0x02, 0x99, 0x2f, 0x1d, 0xff, 0x40, 0x89, 0x25, - 0xa1, 0x4a, 0x22, 0x3a, 0x81, 0xa6, 0x87, 0xff, 0x9b, 0xac, 0xc4, 0xc0, - 0x9d, 0x72, 0xf1, 0xdf, 0xc9, 0xf4, 0xde, 0xfb, 0xa5, 0x5d, 0x0a, 0x4b, - 0xf4, 0x85, 0x2e, 0x63, 0xec, 0x01, 0x3c, 0x74, 0x4a, 0x2e, 0xb1, 0x71, - 0xc0, 0xf9, 0xb4, 0xc2, 0x40, 0xb4, 0x9f, 0x71, 0xb9, 0x09, 0xc4, 0x6a, - 0x2a, 0x94, 0xd8, 0xf5, 0x5f, 0x86, 0x68, 0x84, 0xe3, 0x29, 0x24, 0xf3, - 0x5c, 0xb0, 0xae, 0x88, 0xe1, 0x0e, 0x5a, 0x01, 0x09, 0xd8, 0x50, 0x3d, - 0xc2, 0x65, 0x9a, 0x17, 0xfa, 0x83, 0x01, 0x5b, 0xee, 0xf3, 0x3d, 0xd8, - 0x8b, 0x19, 0xb6, 0x5f, 0x2c, 0x37, 0xf1, 0xe4, 0x39, 0xde, 0x41, 0x72, - 0xac, 0x2b, 0xfa, 0x42, 0x65, 0x38, 0x18, 0xf1, 0x22, 0xaf, 0xff, 0xc3, - 0xd4, 0x3b, 0xbd, 0x34, 0xd0, 0xda, 0xde, 0x79, 0x94, 0x6c, 0x45, 0xa8, - 0x66, 0x0c, 0x3c, 0xc9, 0xd8, 0x39, 0x78, 0x6c, 0x79, 0x04, 0x17, 0xc8, - 0x78, 0x98, 0xb9, 0x80, 0x38, 0xfb, 0x79, 0x35, 0xac, 0xd6, 0x0b, 0xfc, - 0x26, 0x1d, 0x47, 0x6a, 0x23, 0xad, 0x20, 0xa1, 0x45, 0x5d, 0xce, 0x48, - 0x99, 0xdb, 0x21, 0x77, 0xa0, 0xf3, 0x16, 0x0b, 0x86, 0x21, 0xa1, 0x6c, - 0x2b, 0xaf, 0xed, 0x44, 0x18, 0xb4, 0x47, 0x1d, 0xb4, 0x24, 0xc8, 0xcd, - 0x01, 0xe5, 0xa3, 0x4b, 0x36, 0xe6, 0xf5, 0xa3, 0x32, 0x3c, 0x83, 0x74, - 0x11, 0x60, 0x9b, 0xf9, 0x5b, 0xf5, 0x2c, 0xe9, 0x9e, 0x85, 0xf0, 0xb4, - 0x79, 0x9b, 0x09, 0x8a, 0x1e, 0xa3, 0x54, 0xc1, 0x01, 0x36, 0x65, 0xc5, - 0xd4, 0x39, 0x31, 0x73, 0x74, 0x04, 0xbe, 0x8b, 0x28, 0xba, 0xbd, 0xe6, - 0xa6, 0x3e, 0x80, 0x8a, 0x86, 0x8b, 0x48, 0x50, 0x66, 0xd0, 0xc8, 0xea, - 0xdc, 0xa3, 0x2e, 0xa6, 0xc2, 0x46, 0x03, 0xb8, 0x33, 0xf4, 0xc7, 0x29, - 0xce, 0xff, 0x20, 0x59, 0x67, 0xe6, 0x1b, 0xb8, 0xc7, 0x9f, 0x89, 0x9e, - 0x61, 0x8b, 0xba, 0x78, 0x23, 0xbd, 0x06, 0xe6, 0x6c, 0x99, 0xd4, 0xab, - 0xb7, 0x78, 0x7a, 0x75, 0xe0, 0x97, 0x92, 0x63, 0xd9, 0xcf, 0xca, 0xc4, - 0x83, 0xec, 0x19, 0x28, 0x1c, 0xcd, 0xca, 0xe9, 0x01, 0x4d, 0x06, 0xf2, - 0xbb, 0xf8, 0x51, 0xeb, 0xc6, 0x13, 0x99, 0x4d, 0xba, 0x55, 0x7c, 0xf3, - 0xe7, 0xc9, 0xf9, 0xab, 0x41, 0xf1, 0xf9, 0x22, 0xb0, 0x69, 0x09, 0xff, - 0xa2, 0x58, 0x3a, 0xfe, 0x15, 0x6c, 0xb5, 0x58, 0xbf, 0xde, 0xbb, 0x69, - 0x9e, 0x71, 0xc7, 0x3c, 0x8d, 0xba, 0xc2, 0xe6, 0x00, 0x09, 0xe2, 0x4f, - 0xc4, 0x8b, 0xdb, 0x3c, 0xf2, 0xfc, 0xd3, 0x4f, 0xaa, 0xfd, 0x37, 0xad, - 0x0d, 0x1d, 0x36, 0x49, 0x9c, 0x05, 0x65, 0x13, 0xaa, 0xc5, 0x1f, 0x3b, - 0xd1, 0xe2, 0x7e, 0x28, 0x64, 0xd1, 0xc9, 0x80, 0x32, 0xcc, 0x86, 0x3c, - 0xc9, 0x15, 0xd2, 0xfd, 0x37, 0x2d, 0x74, 0x44, 0x19, 0xa6, 0xc8, 0x35, - 0x9a, 0x33, 0xd0, 0x7f, 0x15, 0xaa, 0xaf, 0xeb, 0x9c, 0xa1, 0xb5, 0x8d, - 0x9f, 0xe0, 0xc6, 0x06, 0x5f, 0x92, 0x78, 0xac, 0x3c, 0xd9, 0xfa, 0xe7, - 0x4e, 0x08, 0x2b, 0xd7, 0x29, 0x9a, 0xf2, 0x1b, 0xf9, 0xd5, 0xb7, 0x83, - 0x5b, 0x6a, 0x82, 0x7e, 0x46, 0x8f, 0xf4, 0x14, 0x9b, 0x34, 0x82, 0x80, - 0xc1, 0xaf, 0xce, 0xc4, 0x02, 0x5a, 0xf5, 0x54, 0xa9, 0xc7, 0x12, 0x3b, - 0xc9, 0x6a, 0xae, 0x98, 0x4a, 0xc9, 0x2f, 0x2d, 0xa6, 0xb0, 0x95, 0x9d, - 0x44, 0x23, 0x93, 0xa2, 0xe2, 0xe3, 0x8d, 0x43, 0x2b, 0x65, 0xc8, 0x2b, - 0xac, 0xf9, 0x8b, 0x44, 0xee, 0x37, 0xcb, 0x4c, 0x48, 0x10, 0x81, 0x65, - 0x42, 0x91, 0x3a, 0x66, 0x82, 0x7b, 0xe3, 0x0d, 0x2b, 0xec, 0x37, 0x66, - 0x19, 0xd6, 0xb5, 0xca, 0x10, 0xe4, 0xfb, 0x88, 0x9e, 0x1d, 0x31, 0xe6, - 0x61, 0x88, 0x71, 0xf1, 0x77, 0xed, 0xdb, 0xa6, 0x9a, 0xbe, 0x7b, 0x86, - 0xdd, 0xe6, 0x48, 0x8b, 0x5e, 0xe7, 0x2c, 0x61, 0x84, 0xab, 0xa0, 0x0c, - 0x01, 0x93, 0xf9, 0xd6, 0xbf, 0xca, 0xcc, 0xd5, 0x79, 0x5b, 0xb6, 0xc4, - 0xbf, 0xbb, 0x82, 0xa2, 0x6a, 0xbe, 0x8c, 0x6d, 0x1f, 0x8e, 0x29, 0x13, - 0x4b, 0xa3, 0x14, 0xd2, 0xfa, 0x5b, 0xe8, 0xe3, 0xd2, 0x7b, 0x71, 0xd0, - 0x4b, 0x9d, 0x4a, 0x55, 0xb2, 0xee, 0xb8, 0x0d, 0xb0, 0xa7, 0xbc, 0x48, - 0x6f, 0xcd, 0x9f, 0xe8, 0xb2, 0x14, 0x78, 0x5b, 0x04, 0x62, 0xf9, 0x34, - 0x03, 0xfb, 0x17, 0x05, 0xf5, 0x9e, 0x37, 0x17, 0xa5, 0xe1, 0x32, 0x6c, - 0x3f, 0x0f, 0x9c, 0xc7, 0x8c, 0xd5, 0x62, 0x41, 0x5a, 0xe6, 0x10, 0x7f, - 0xe5, 0x86, 0x06, 0x2c, 0x30, 0x3c, 0x7c, 0x80, 0xdc, 0xc3, 0x62, 0xf1, - 0xcd, 0x2a, 0x42, 0x89, 0xeb, 0x2f, 0x11, 0x47, 0x82, 0x98, 0xfe, 0x98, - 0x63, 0x4b, 0xab, 0xd8, 0x26, 0xd5, 0xeb, 0x49, 0x08, 0x19, 0x2a, 0x70, - 0xfd, 0x70, 0x37, 0x95, 0xbd, 0xf0, 0x8a, 0x5c, 0xfe, 0x76, 0xd4, 0x27, - 0x45, 0xf6, 0xa6, 0xd1, 0xfb, 0x24, 0xca, 0xac, 0x8c, 0x09, 0x98, 0x58, - 0x06, 0xde, 0x9a, 0x72, 0x4f, 0x5b, 0x4f, 0x91, 0x41, 0x0a, 0x6c, 0xc8, - 0x67, 0x5a, 0xf3, 0xa0, 0xbb, 0x3a, 0x9e, 0x65, 0x82, 0xb2, 0x14, 0xbe, - 0x4e, 0x2b, 0xd9, 0x4d, 0x8b, 0xab, 0x43, 0x1c, 0xdd, 0xcd, 0x4b, 0x05, - 0xd9, 0x19, 0xa5, 0xb5, 0xc1, 0xe1, 0x67, 0x9a, 0xf0, 0x55, 0xb3, 0x6a, - 0x92, 0x0b, 0x1a, 0xf1, 0xdd, 0xe0, 0xac, 0x8c, 0x2e, 0xc9, 0x08, 0xef, - 0x21, 0xb9, 0x8f, 0xf2, 0x1e, 0x36, 0xb3, 0x21, 0xb6, 0x3c, 0xa6, 0x0e, - 0xe4, 0x0a, 0x90, 0x1f, 0xdd, 0xd9, 0xa5, 0x4f, 0x55, 0x57, 0xbe, 0x02, - 0xca, 0x67, 0xa7, 0x7e, 0x35, 0xd7, 0xd9, 0x5a, 0x5a, 0x67, 0x64, 0x1f, - 0x52, 0x68, 0xbf, 0x36, 0x6e, 0x20, 0x5d, 0x32, 0x86, 0x7c, 0x7c, 0xf3, - 0x5c, 0xe1, 0xe8, 0x32, 0x09, 0xf3, 0x72, 0x1b, 0x03, 0x4b, 0x25, 0xb0, - 0x9a, 0x7a, 0x0c, 0xba, 0x95, 0xde, 0x74, 0xf9, 0xff, 0x2d, 0x36, 0xcb, - 0x19, 0x60, 0xc7, 0x16, 0x1b, 0x0f, 0xe0, 0x8f, 0x56, 0x0a, 0x6e, 0x94, - 0x01, 0x9a, 0x2c, 0x9b, 0xfa, 0x47, 0x1c, 0x11, 0xb5, 0xbd, 0x31, 0xe9, - 0xe4, 0x5f, 0x13, 0xd9, 0x4e, 0xe7, 0xd8, 0xfa, 0xc0, 0x45, 0xd5, 0x18, - 0xed, 0xed, 0xdd, 0xbe, 0x87, 0xa6, 0x97, 0x90, 0xa1, 0x58, 0xed, 0x0c, - 0xe7, 0xb9, 0xee, 0xa6, 0xe0, 0x0b, 0x21, 0x35, 0x30, 0x46, 0xc4, 0x86, - 0x00, 0x49, 0x81, 0xbb, 0x26, 0xff, 0x03, 0x3d, 0xc3, 0xb4, 0xf2, 0x80, - 0xbc, 0x54, 0xa4, 0x76, 0x27, 0x2f, 0xed, 0xcc, 0x2d, 0x3e, 0x2a, 0xdc, - 0x5d, 0x6e, 0x92, 0x17, 0x8f, 0x2f, 0xef, 0x87, 0xb4, 0xac, 0x58, 0xc1, - 0x52, 0x5c, 0x27, 0x5b, 0xdb, 0x5a, 0x4b, 0x1e, 0xb5, 0x1a, 0x2b, 0x8c, - 0x69, 0x2a, 0x69, 0xf4, 0xa3, 0x1d, 0x6a, 0xe0, 0x65, 0x1a, 0x28, 0x9a, - 0x1c, 0x7d, 0x7e, 0xe6, 0x04, 0x8d, 0xed, 0x25, 0x0e, 0xc7, 0x53, 0x56, - 0x74, 0x6f, 0x90, 0x25, 0x5e, 0xed, 0x17, 0xe2, 0x85, 0xc0, 0xfb, 0x4d, - 0x74, 0xc0, 0x13, 0xfc, 0xa6, 0xeb, 0x1c, 0x98, 0x2a, 0x7e, 0x46, 0x20, - 0x3f, 0x55, 0x12, 0x8f, 0xd5, 0x79, 0x6d, 0x19, 0x64, 0x27, 0x3b, 0xd9, - 0x3e, 0xa8, 0x9a, 0xe1, 0xa6, 0x05, 0xc5, 0x43, 0x63, 0x3f, 0xc6, 0x94, - 0x88, 0x6f, 0x7c, 0x55, 0xdc, 0xa5, 0x62, 0x7a, 0x3f, 0xd8, 0x7f, 0x52, - 0xdf, 0x94, 0x7e, 0xdc, 0x52, 0xb8, 0x98, 0x45, 0x10, 0x1f, 0xbf, 0x13, - 0xfb, 0xdc, 0xc0, 0xcd, 0x36, 0xa8, 0x69, 0x7d, 0x9b, 0x33, 0x5b, 0xf2, - 0xd3, 0x92, 0x7a, 0x27, 0xd3, 0x08, 0x24, 0xd3, 0x84, 0x69, 0x5d, 0x6e, - 0x03, 0xba, 0x5e, 0xac, 0x66, 0x86, 0xa3, 0xc0, 0x2a, 0x19, 0x71, 0xfb, - 0x2f, 0xb2, 0x67, 0x82, 0x13, 0xc7, 0xe7, 0xdd, 0x1b, 0xeb, 0x25, 0x7d, - 0x1e, 0x2f, 0xfd, 0xcf, 0x55, 0x54, 0x2e, 0x17, 0xf8, 0x32, 0x73, 0x75, - 0x01, 0x39, 0x7d, 0xd4, 0x61, 0x03, 0x68, 0x76, 0x89, 0xe3, 0x45, 0x2d, - 0x1f, 0x3b, 0x12, 0x58, 0xd4, 0x22, 0x5c, 0x5b, 0x40, 0xb2, 0x14, 0xe4, - 0x11, 0xff, 0x9a, 0xe4, 0x21, 0x2a, 0x2e, 0xbe, 0xdd, 0x63, 0xd6, 0x33, - 0xf0, 0x00, 0xc7, 0x79, 0x02, 0x56, 0xa2, 0xce, 0xe5, 0xce, 0x10, 0x90, - 0x90, 0x90, 0x85, 0xc4, 0x90, 0x5f, 0x1a, 0xe0, 0xdd, 0xf2, 0x0d, 0x54, - 0x66, 0x59, 0x7b, 0x6e, 0x8b, 0xcb, 0x10, 0xe9, 0xda, 0xf5, 0x03, 0xc7, - 0x08, 0x3a, 0x85, 0x7d, 0x44, 0xde, 0x2e, 0xd8, 0xc7, 0xa1, 0x5d, 0x0a, - 0x90, 0x4a, 0x1b, 0xaa, 0x59, 0x99, 0x04, 0xe5, 0xf1, 0x2d, 0x29, 0x9b, - 0xbe, 0xbf, 0xbf, 0x09, 0x1e, 0xfe, 0x37, 0xfe, 0x10, 0x30, 0xc8, 0x3c, - 0x99, 0xbf, 0xa9, 0x93, 0xac, 0xf1, 0x8e, 0x97, 0x98, 0xe7, 0x58, 0xf2, - 0x6d, 0x55, 0xe8, 0xfa, 0x2e, 0x9e, 0xf7, 0x27, 0x1f, 0xb1, 0x1c, 0x44, - 0x86, 0x99, 0xb7, 0x59, 0x16, 0x83, 0x5f, 0x73, 0xd1, 0x2b, 0x0c, 0x30, - 0x03, 0x57, 0x43, 0x6f, 0xf8, 0xbe, 0xa3, 0x26, 0xd5, 0x19, 0x4c, 0xdd, - 0xd8, 0x5e, 0x0f, 0xe1, 0x41, 0x33, 0xb6, 0x66, 0x29, 0x7e, 0xe8, 0x21, - 0x00, 0xbc, 0xea, 0x39, 0xc1, 0x53, 0xc6, 0x6f, 0xa2, 0x78, 0x35, 0x01, - 0x11, 0x4d, 0x51, 0xb8, 0xc3, 0xc9, 0x1b, 0x56, 0xa8, 0x4e, 0x9a, 0x91, - 0x1a, 0xb7, 0x76, 0x9a, 0xe5, 0x1e, 0x98, 0x57, 0x9d, 0x89, 0x03, 0x77, - 0x91, 0x02, 0xda, 0x67, 0x48, 0x62, 0xc2, 0x03, 0x5b, 0x78, 0xa4, 0xfe, - 0x12, 0x15, 0xb3, 0xa2, 0x50, 0x6d, 0x11, 0x41, 0xe2, 0x13, 0x70, 0x08, - 0x35, 0x27, 0xbf, 0x8d, 0x04, 0x97, 0xb3, 0xee, 0xb7, 0x01, 0x2f, 0x1e, - 0x08, 0x52, 0x35, 0xdd, 0x89, 0xd5, 0x0c, 0x1d, 0xf1, 0x04, 0x33, 0x17, - 0xe6, 0xd6, 0x6c, 0x07, 0xc5, 0x3b, 0x79, 0xb1, 0xc6, 0x7a, 0x5c, 0x5b, - 0xc9, 0xd8, 0xa5, 0x65, 0xd3, 0x68, 0xcf, 0x00, 0x60, 0xa9, 0x6e, 0xa9, - 0xb5, 0xd6, 0xa2, 0x0c, 0xae, 0xc4, 0x8e, 0x33, 0x3a, 0x6c, 0xc5, 0xc4, - 0x27, 0x80, 0xcf, 0x56, 0x39, 0xcf, 0xe5, 0xce, 0xd8, 0xee, 0xe4, 0xd2, - 0x42, 0xc0, 0x74, 0xac, 0xb6, 0xa1, 0x1e, 0x5d, 0x00, 0x84, 0x0a, 0x28, - 0x00, 0x5c, 0x8c, 0xf3, 0x0f, 0x3e, 0x62, 0x16, 0xe9, 0x59, 0x6e, 0x42, - 0xd2, 0xf3, 0x01, 0xcc, 0x9a, 0x38, 0x83, 0xae, 0xe2, 0x1a, 0x7f, 0x85, - 0x07, 0x1f, 0x3c, 0x3d, 0xa3, 0xc4, 0x02, 0x91, 0x17, 0x1f, 0x77, 0x1f, - 0x8a, 0xd3, 0xfa, 0x2e, 0xe3, 0x9b, 0x38, 0x6f, 0xc5, 0xdc, 0x5e, 0x5b, - 0x5f, 0x92, 0x2f, 0xfd, 0x46, 0xd6, 0x72, 0xe2, 0xa2, 0x6b, 0x7d, 0x9d, - 0xe9, 0x5b, 0x3e, 0x59, 0x7e, 0xfd, 0x16, 0x29, 0x24, 0x82, 0xbe, 0x16, - 0x1b, 0x54, 0xc8, 0x42, 0xea, 0xb8, 0x9d, 0xbe, 0x3a, 0x21, 0x83, 0x18, - 0xfc, 0x41, 0xd0, 0x3a, 0x56, 0x12, 0x22, 0x7d, 0x5f, 0x44, 0xf1, 0x35, - 0x33, 0x03, 0xda, 0x14, 0x0f, 0x60, 0x6e, 0x22, 0x96, 0x80, 0x55, 0x01, - 0xb0, 0x5b, 0xbe, 0xcc, 0x60, 0x72, 0xd5, 0xfe, 0x7c, 0xb6, 0x86, 0x7e, - 0x17, 0x5f, 0x57, 0x3e, 0xde, 0x42, 0x7e, 0xfe, 0x4f, 0x51, 0x84, 0xe5, - 0x79, 0x75, 0x0f, 0x3d, 0x0d, 0x7c, 0x98, 0x63, 0xac, 0x5e, 0x29, 0x9d, - 0x62, 0x03, 0x3d, 0x91, 0xec, 0x11, 0x9b, 0x1e, 0x2e, 0x43, 0xbe, 0x72, - 0x86, 0x28, 0xa5, 0x30, 0xb2, 0x74, 0x4b, 0x47, 0x77, 0x9e, 0xde, 0xb1, - 0x91, 0xd0, 0xa8, 0x68, 0xeb, 0xec, 0xdf, 0xfd, 0x3e, 0x83, 0xba, 0x57, - 0xda, 0x62, 0x3f, 0xb2, 0x65, 0xee, 0x86, 0x74, 0xcc, 0x02, 0xad, 0xe2, - 0xbb, 0x30, 0x79, 0x3a, 0x3d, 0x44, 0x08, 0xd1, 0xf0, 0xc1, 0x05, 0x10, - 0xaa, 0xe4, 0x45, 0xd2, 0x78, 0xa7, 0x18, 0xb7, 0x09, 0x88, 0x00, 0xc4, - 0x4a, 0xe4, 0x98, 0xb2, 0xb9, 0x97, 0x69, 0x97, 0xe4, 0x10, 0x7c, 0x46, - 0xb7, 0xf9, 0x90, 0xcd, 0x43, 0xe2, 0x95, 0x9a, 0xa0, 0x2b, 0x19, 0x51, - 0x3a, 0x95, 0x7a, 0x7b, 0x59, 0x72, 0xd2, 0xc1, 0x0d, 0x83, 0x3f, 0x2b, - 0x5f, 0x5f, 0x2a, 0xe1, 0xf6, 0x81, 0x84, 0x53, 0x9c, 0x04, 0xcf, 0x6e, - 0x03, 0xea, 0x6c, 0x24, 0x67, 0xcb, 0x52, 0x00, 0x72, 0xe2, 0x27, 0x61, - 0x83, 0x1f, 0xe7, 0x93, 0x00, 0x80, 0xed, 0x75, 0xa7, 0xdb, 0x1c, 0x27, - 0xd3, 0x66, 0xe0, 0x2e, 0x44, 0xe2, 0xc8, 0xc3, 0x35, 0x63, 0xb4, 0xb3, - 0xc2, 0xd4, 0x99, 0x90, 0xc5, 0x07, 0xbc, 0x85, 0x61, 0xc5, 0x99, 0x11, - 0xd6, 0xd5, 0x0b, 0x8d, 0xa4, 0x6b, 0x3f, 0x92, 0xc8, 0x23, 0xa2, 0x48, - 0x8d, 0xd9, 0x37, 0x04, 0x65, 0xc8, 0x60, 0x42, 0x32, 0x93, 0xdc, 0xb4, - 0x01, 0xc2, 0x91, 0x20, 0xff, 0x38, 0xa5, 0x01, 0xf2, 0x27, 0x86, 0xdf, - 0xfe, 0xe1, 0xd7, 0x0d, 0x1f, 0x86, 0x1b, 0x0b, 0x03, 0xb3, 0x9d, 0x20, - 0xab, 0x84, 0xbd, 0xe3, 0x61, 0x68, 0xcc, 0xd9, 0xef, 0xad, 0xbd, 0xb6, - 0xd8, 0xb0, 0xf2, 0xd4, 0x25, 0x84, 0x83, 0x53, 0x8e, 0xc3, 0xbd, 0x9e, - 0x9f, 0x81, 0xf7, 0xf6, 0x5c, 0x69, 0x94, 0xb0, 0xe1, 0x54, 0x6a, 0x4d, - 0x56, 0x49, 0x45, 0x19, 0xfc, 0xb2, 0xaa, 0x5a, 0x67, 0x7f, 0x76, 0x5b, - 0x74, 0x2f, 0xd7, 0x22, 0xe3, 0x0e, 0x8f, 0x99, 0x15, 0x15, 0xc3, 0xbb, - 0x4e, 0xd6, 0x37, 0x63, 0xbf, 0x1e, 0x67, 0xfd, 0x9d, 0x07, 0x12, 0x30, - 0x86, 0x08, 0x50, 0x9c, 0x2a, 0x80, 0x33, 0x74, 0xec, 0xec, 0x81, 0xbb, - 0x05, 0xf8, 0x87, 0x96, 0xbf, 0x28, 0x14, 0xee, 0xd1, 0x92, 0x27, 0x58, - 0x29, 0x7e, 0xd0, 0xb1, 0xd6, 0x55, 0xde, 0xb6, 0x2a, 0x27, 0x49, 0x7e, - 0x9d, 0x73, 0x33, 0xc8, 0xbd, 0xc6, 0x60, 0x6a, 0xbc, 0x7c, 0x3d, 0x25, - 0x43, 0x12, 0xa9, 0x12, 0x88, 0x2e, 0x7f, 0xa2, 0x78, 0x41, 0xcf, 0xd1, - 0x90, 0x79, 0xc2, 0x0f, 0x78, 0x03, 0xa8, 0x53, 0x90, 0x87, 0xb5, 0xc9, - 0x7d, 0xac, 0xbc, 0xb1, 0x65, 0x60, 0xbe, 0x0f, 0x02, 0x59, 0x66, 0x84, - 0x51, 0xbc, 0xbc, 0x6d, 0x1e, 0xcf, 0x22, 0xa3, 0xb1, 0xac, 0x97, 0x28, - 0x6b, 0x9d, 0x59, 0x4d, 0x06, 0x48, 0x2b, 0xa9, 0x8f, 0x61, 0x43, 0xa5, - 0x03, 0x02, 0x50, 0xa4, 0x77, 0x27, 0xd3, 0x8f, 0x39, 0xe2, 0xde, 0x12, - 0x15, 0x66, 0x57, 0x4a, 0xbf, 0xbc, 0x24, 0x60, 0x41, 0xd4, 0xe5, 0x21, - 0x05, 0x10, 0xb6, 0x0c, 0xf4, 0x90, 0xf5, 0xff, 0x09, 0x21, 0x35, 0x3a, - 0x4a, 0xcd, 0xee, 0xb6, 0xbb, 0xae, 0x6e, 0x02, 0x46, 0x5e, 0x67, 0x32, - 0xb3, 0x4f, 0x4e, 0xa2, 0x37, 0x78, 0x3d, 0xdd, 0x71, 0x1b, 0x56, 0x18, - 0x4f, 0xa5, 0xc3, 0xe6, 0x82, 0xe2, 0x86, 0x3a, 0xc4, 0x31, 0x96, 0xd7, - 0x0b, 0x0c, 0xe7, 0x97, 0x67, 0xce, 0x48, 0x2b, 0x62, 0xb0, 0x2d, 0x6e, - 0x4d, 0x09, 0xb9, 0x95, 0x81, 0x98, 0x11, 0x79, 0x24, 0xcb, 0x24, 0x1e, - 0x69, 0xa8, 0x7c, 0xa3, 0x8a, 0x54, 0x53, 0xa8, 0x5e, 0x6d, 0xc4, 0x73, - 0x96, 0xde, 0xdf, 0x61, 0x5b, 0x99, 0x3e, 0xa4, 0x70, 0xc4, 0x29, 0xfb, - 0xd7, 0x39, 0x32, 0x6f, 0xba, 0x5d, 0xf8, 0xb3, 0x07, 0x0c, 0x21, 0xc2, - 0x26, 0x96, 0xe1, 0xf2, 0x7e, 0xd2, 0x54, 0xf6, 0xaa, 0x7c, 0xf8, 0x2a, - 0xee, 0x7d, 0xf3, 0xc4, 0xd4, 0xd1, 0xe2, 0xf2, 0xcb, 0x4f, 0x96, 0x12, - 0x68, 0x82, 0x3d, 0x06, 0x60, 0xfa, 0xc6, 0xb5, 0x32, 0x18, 0xbf, 0x24, - 0x80, 0x36, 0xcb, 0x5a, 0x80, 0x3c, 0x06, 0xc6, 0x81, 0xb3, 0xe0, 0x2c, - 0x6a, 0x8f, 0x82, 0xf0, 0xb2, 0x63, 0x1d, 0xf3, 0x8a, 0x0f, 0x29, 0x4e, - 0x8c, 0xec, 0x72, 0xc5, 0xb0, 0x7e, 0xe8, 0x81, 0xaa, 0x48, 0xbc, 0x15, - 0x72, 0x94, 0xee, 0x88, 0x28, 0x42, 0x2f, 0xf0, 0x63, 0xf7, 0xe2, 0x3d, - 0x2e, 0x56, 0x12, 0x98, 0x55, 0x8a, 0xfe, 0x5b, 0xe6, 0xb1, 0x3d, 0x0b, - 0xd7, 0x3c, 0xd5, 0xd8, 0x6b, 0x60, 0x6b, 0x53, 0x98, 0x70, 0x6a, 0x1b, - 0x22, 0x8f, 0x68, 0xac, 0xce, 0xab, 0xcf, 0x03, 0xd6, 0x56, 0x86, 0xf7, - 0xed, 0x63, 0x11, 0xbf, 0x21, 0xf9, 0x26, 0xd6, 0xbd, 0xf0, 0x32, 0x38, - 0xf9, 0xbb, 0x12, 0x5c, 0xc6, 0x72, 0x04, 0xda, 0x32, 0xe5, 0xb2, 0x1e, - 0x3f, 0x04, 0x46, 0xa5, 0xca, 0x0d, 0x76, 0x9c, 0x41, 0xfb, 0xac, 0x97, - 0x82, 0x10, 0x23, 0x53, 0x04, 0xb9, 0x76, 0xc9, 0x44, 0xf9, 0xe5, 0x56, - 0x5f, 0x94, 0xf0, 0x8b, 0x64, 0x25, 0xc7, 0x67, 0xfe, 0x03, 0x19, 0xf3, - 0xa1, 0x80, 0x06, 0xb7, 0x2a, 0x6d, 0x33, 0xed, 0xe7, 0x63, 0xdb, 0x34, - 0x3b, 0x79, 0x8d, 0x6e, 0x17, 0x4c, 0x6d, 0x04, 0x53, 0x91, 0xe0, 0xbf, - 0xdb, 0x7e, 0xb2, 0x31, 0x6b, 0xfc, 0xea, 0xb0, 0xec, 0x17, 0x48, 0xe2, - 0x79, 0x52, 0x04, 0xd4, 0x93, 0x3d, 0x7b, 0x7a, 0x27, 0xb7, 0x48, 0x64, - 0xd5, 0xa0, 0x98, 0xc5, 0x78, 0x55, 0x32, 0x1d, 0xb8, 0xfe, 0x6d, 0x52, - 0xf4, 0xdb, 0x51, 0x6c, 0x78, 0x38, 0xcb, 0x85, 0x0b, 0x90, 0x82, 0xab, - 0x1b, 0x0f, 0x13, 0x06, 0x38, 0xfd, 0x64, 0x3b, 0x2a, 0x85, 0x3e, 0x49, - 0x73, 0x4f, 0xb0, 0xac, 0x00, 0x53, 0x17, 0xb6, 0xfe, 0xd8, 0xa9, 0x8f, - 0x89, 0x3a, 0x6f, 0x80, 0xbd, 0xd0, 0xf0, 0xe8, 0xa6, 0xfe, 0x46, 0x1a, - 0x86, 0x6d, 0xeb, 0x5d, 0xd5, 0x72, 0xfb, 0xc5, 0x66, 0x02, 0x85, 0x6c, - 0x85, 0x5a, 0x66, 0x17, 0x7b, 0x7c, 0x97, 0xf6, 0x52, 0xc7, 0xbe, 0xf6, - 0x4b, 0x9d, 0xdc, 0x8f, 0x5a, 0x80, 0xd6, 0x76, 0x70, 0xce, 0xd4, 0xef, - 0x52, 0xc9, 0xd9, 0xd1, 0xe3, 0x39, 0x48, 0xc8, 0x92, 0xbf, 0x74, 0xa9, - 0xf9, 0x01, 0x4d, 0xd3, 0x55, 0x8f, 0x01, 0x8c, 0x7d, 0x45, 0x5a, 0x6c, - 0x16, 0xac, 0x77, 0xdc, 0x1a, 0x9b, 0x01, 0x4c, 0x00, 0xf4, 0xe9, 0x58, - 0xd8, 0x07, 0x86, 0xb0, 0x76, 0x2e, 0x21, 0xfd, 0xe1, 0x0d, 0xa7, 0xbe, - 0x32, 0xe9, 0xf8, 0x6f, 0x31, 0xf4, 0x8a, 0x35, 0xac, 0xcf, 0xcc, 0x22, - 0xe7, 0xfe, 0xa5, 0xc6, 0xdf, 0xc0, 0x32, 0xe0, 0x97, 0xee, 0xe3, 0x5c, - 0x4c, 0x4d, 0xb8, 0x7d, 0x3f, 0xf1, 0xc2, 0xb6, 0x5f, 0xec, 0x86, 0x46, - 0xd1, 0xa8, 0x7f, 0x90, 0xe1, 0x98, 0xe5, 0x9d, 0x97, 0xdf, 0x08, 0x32, - 0x31, 0xc3, 0x33, 0x3b, 0x62, 0x32, 0xdf, 0xe3, 0x8c, 0xa7, 0x96, 0x90, - 0xfb, 0x2b, 0x3e, 0x3d, 0xa1, 0x1a, 0x4c, 0xcf, 0x16, 0xc6, 0x19, 0xa8, - 0xbe, 0x20, 0xcc, 0xae, 0x97, 0xd9, 0x30, 0x76, 0x27, 0x9c, 0xec, 0xc6, - 0xbe, 0xb5, 0x04, 0x26, 0x39, 0xdf, 0x95, 0xcb, 0xd4, 0xe4, 0x3e, 0x55, - 0xad, 0x9c, 0xba, 0x9f, 0x20, 0x33, 0xc9, 0x88, 0x8c, 0x77, 0xc6, 0xe1, - 0xd1, 0x3a, 0xd1, 0x2e, 0x3e, 0xec, 0x5c, 0x3f, 0x25, 0xb9, 0xce, 0xb4, - 0xa2, 0xa2, 0xff, 0xca, 0x07, 0xd8, 0x29, 0x47, 0x9a, 0x09, 0xdf, 0xe0, - 0xa1, 0x8a, 0x10, 0x2f, 0xf4, 0x6d, 0x5b, 0xdd, 0x51, 0xbc, 0x57, 0x54, - 0x6b, 0xd3, 0x16, 0xe1, 0xb3, 0x32, 0xfc, 0x46, 0x8b, 0x3e, 0xb8, 0xb8, - 0x8e, 0x7b, 0x48, 0x8a, 0x54, 0x93, 0xd5, 0xf0, 0x6f, 0x97, 0x0b, 0x1a, - 0xa4, 0xbd, 0xbe, 0x6c, 0xfc, 0x31, 0x69, 0x57, 0xd5, 0x62, 0xa6, 0x5f, - 0xda, 0x38, 0xe8, 0x41, 0xb3, 0x87, 0x04, 0x13, 0x3b, 0xe9, 0x06, 0xe8, - 0x1b, 0x3d, 0x95, 0x18, 0x11, 0xdf, 0xdb, 0x95, 0x69, 0x63, 0x11, 0x7e, - 0x49, 0x25, 0xe7, 0x1c, 0x08, 0x63, 0xd2, 0x1b, 0x65, 0x8d, 0xd5, 0x52, - 0x4f, 0x7f, 0x27, 0x6f, 0x4e, 0x2f, 0x9f, 0x66, 0x02, 0x3b, 0x52, 0x74, - 0xa4, 0x2f, 0x64, 0x42, 0x11, 0x39, 0xb0, 0xfa, 0x98, 0x60, 0x72, 0xfe, - 0x34, 0x33, 0x31, 0x9f, 0xc5, 0xce, 0x81, 0x5f, 0x6d, 0x35, 0x4a, 0xf3, - 0xcc, 0x09, 0x1f, 0xf5, 0x5c, 0xc7, 0x07, 0xa2, 0xcf, 0xd2, 0xfe, 0xed, - 0x28, 0xdf, 0xc6, 0x88, 0x31, 0x47, 0xc6, 0xbf, 0x8c, 0x23, 0x03, 0x36, - 0x34, 0xea, 0xfb, 0xf9, 0xc4, 0x51, 0x90, 0x94, 0xca, 0xdb, 0x85, 0xd0, - 0x5b, 0x1f, 0xa5, 0xc3, 0x66, 0x8b, 0x31, 0x0b, 0xc9, 0x7f, 0xff, 0xe9, - 0x50, 0xfc, 0xaf, 0x3f, 0x56, 0xb6, 0xca, 0x03, 0x7e, 0xeb, 0xce, 0x8b, - 0x36, 0x90, 0xe8, 0xf0, 0x7d, 0x17, 0x89, 0x45, 0xbd, 0x72, 0x11, 0x73, - 0x4a, 0xe8, 0x33, 0x14, 0xe7, 0x77, 0x90, 0xd8, 0xa5, 0xb3, 0xc9, 0xed, - 0xbf, 0xff, 0xf6, 0xe9, 0x64, 0xdc, 0xcc, 0x6e, 0xe7, 0x2e, 0x41, 0xfa, - 0x6c, 0xb9, 0x64, 0x6c, 0xb1, 0x8b, 0xf7, 0xc7, 0x64, 0x4a, 0x01, 0xf2, - 0x08, 0x4f, 0xca, 0xaf, 0xf3, 0x37, 0x9b, 0x76, 0x43, 0x4c, 0xb0, 0xc3, - 0xeb, 0x70, 0xfe, 0xfd, 0xc7, 0xa6, 0x17, 0x30, 0xfd, 0x53, 0xfc, 0xe8, - 0xf1, 0xb8, 0x3c, 0x70, 0xa6, 0xcf, 0xf9, 0x2d, 0xcb, 0x84, 0xe4, 0x0b, - 0x35, 0x79, 0xe7, 0xad, 0x20, 0xc2, 0x90, 0xaf, 0xfc, 0x8c, 0x52, 0xcc, - 0x68, 0x95, 0x86, 0x69, 0x2a, 0xba, 0x51, 0x65, 0xc2, 0xe6, 0x7a, 0x02, - 0x53, 0x00, 0x66, 0x4c, 0x38, 0x0c, 0xa5, 0xf2, 0x37, 0x58, 0xc0, 0x79, - 0x3f, 0x12, 0x5a, 0xc8, 0x60, 0xde, 0x02, 0x54, 0x16, 0xca, 0x32, 0x00, - 0x4c, 0x51, 0x07, 0xd8, 0x8b, 0x6f, 0xbc, 0xc0, 0x15, 0xa0, 0xb3, 0xc0, - 0x1f, 0xfc, 0xca, 0x75, 0x21, 0xcf, 0xb7, 0x4d, 0x96, 0xea, 0x26, 0xfe, - 0xbb, 0x31, 0xdf, 0x2e, 0x5b, 0x38, 0x0b, 0x5a, 0x3e, 0xf5, 0x96, 0x81, - 0x4d, 0x0c, 0x10, 0x6b, 0xe8, 0x39, 0x44, 0xd1, 0x4c, 0xb2, 0x35, 0x04, - 0xd7, 0xd5, 0x36, 0x38, 0xa0, 0xd9, 0x8d, 0xd2, 0x83, 0x1e, 0xd8, 0x95, - 0x48, 0x2a, 0x73, 0xf7, 0x66, 0x3b, 0xa1, 0xb1, 0xb9, 0x5b, 0x15, 0x00, - 0x26, 0xa3, 0x54, 0x8e, 0x5a, 0x5e, 0xb6, 0x2a, 0xf0, 0x2e, 0x6e, 0xd1, - 0x47, 0xa3, 0x76, 0x95, 0xf9, 0x8e, 0x35, 0x13, 0xca, 0x46, 0x9a, 0x18, - 0xd3, 0x05, 0x76, 0x29, 0x4e, 0xa8, 0x81, 0x0b, 0xb9, 0x6f, 0xd1, 0x97, - 0xe6, 0x4f, 0x60, 0xfd, 0x97, 0x02, 0x34, 0xd0, 0x52, 0x57, 0x24, 0x63, - 0x57, 0xb2, 0x08, 0x4a, 0xf8, 0x90, 0x48, 0xf9, 0x49, 0x68, 0x53, 0xfd, - 0x51, 0x7e, 0x10, 0xfa, 0x61, 0xaa, 0x71, 0x46, 0xf4, 0xd7, 0x2c, 0xbb, - 0x0b, 0x80, 0x7c, 0xcf, 0xbe, 0x4b, 0xdd, 0xe2, 0xbf, 0x20, 0x91, 0x56, - 0xeb, 0x71, 0x33, 0x0f, 0xf7, 0x27, 0x7f, 0x73, 0x66, 0x3b, 0x6b, 0x4c, - 0x8a, 0x29, 0x6e, 0x99, 0x28, 0x36, 0xa4, 0xc1, 0x25, 0x4d, 0x73, 0x41, - 0x33, 0x2d, 0xdf, 0x2f, 0x18, 0xe1, 0xf5, 0xb4, 0x89, 0xc3, 0x80, 0x94, - 0x63, 0xf9, 0x92, 0xc9, 0xe7, 0xe6, 0x83, 0x82, 0x31, 0x97, 0x25, 0x01, - 0x05, 0x91, 0xf8, 0x54, 0x8f, 0x28, 0xae, 0x35, 0xa3, 0x00, 0xa8, 0x18, - 0x19, 0xff, 0xf9, 0xb1, 0xc5, 0xea, 0x4c, 0x10, 0xd7, 0xb2, 0x1e, 0x83, - 0x44, 0x06, 0x63, 0x2b, 0x80, 0xb7, 0xa8, 0x40, 0x26, 0x88, 0x56, 0x95, - 0xd6, 0xd0, 0xc5, 0x7f, 0x7e, 0xa9, 0x0a, 0x41, 0xf7, 0xf8, 0x04, 0xb7, - 0x5d, 0xda, 0x5e, 0xba, 0x8c, 0xa8, 0x7e, 0x36, 0xb0, 0x72, 0x46, 0x53, - 0x15, 0xc8, 0x08, 0x8a, 0x6c, 0x32, 0xc4, 0xa0, 0x37, 0xcb, 0xdd, 0xcc, - 0xac, 0x23, 0xd2, 0xe8, 0x9b, 0xdf, 0x47, 0xed, 0xc4, 0x07, 0x99, 0x66, - 0x30, 0x0a, 0x6a, 0xfa, 0x35, 0xd8, 0x0d, 0x90, 0xd8, 0xc0, 0x19, 0x1a, - 0x05, 0x17, 0x6c, 0x3a, 0xd3, 0xaa, 0x11, 0xbb, 0x1d, 0x81, 0x73, 0x90, - 0xda, 0x66, 0x11, 0x1a, 0x6d, 0x27, 0xd1, 0xd9, 0xa2, 0xb4, 0x1a, 0x78, - 0x44, 0x0b, 0xfc, 0x8d, 0x54, 0x9f, 0xe9, 0xc9, 0x2f, 0xab, 0xd3, 0x8e, - 0xf7, 0x3c, 0x9b, 0xed, 0x35, 0x74, 0xd5, 0x4b, 0xb4, 0x22, 0xdf, 0xda, - 0x91, 0x9b, 0x8a, 0x1b, 0x98, 0x03, 0x75, 0xa2, 0xb5, 0x39, 0xc3, 0xbe, - 0x0a, 0x63, 0xda, 0xa2, 0xea, 0xb8, 0x7d, 0xbc, 0x22, 0x1d, 0x33, 0x55, - 0xe3, 0x57, 0x5a, 0xde, 0x8b, 0x8f, 0xee, 0x28, 0x46, 0x8b, 0x24, 0xad, - 0xb8, 0x84, 0x9a, 0x68, 0xc3, 0x8e, 0x13, 0x08, 0xfc, 0x5a, 0x51, 0x3d, - 0x53, 0x1f, 0x62, 0xe9, 0xc8, 0x78, 0xec, 0x82, 0x43, 0x02, 0xad, 0xd3, - 0x7c, 0xa3, 0x02, 0xf7, 0x27, 0xed, 0x49, 0x48, 0xd1, 0x6b, 0x2f, 0xae, - 0x01, 0xed, 0xe4, 0xec, 0xd3, 0x08, 0x27, 0xdc, 0x12, 0x23, 0x2c, 0x3e, - 0xd6, 0x20, 0x0c, 0xbf, 0x30, 0x2e, 0x98, 0x18, 0xca, 0xa3, 0xd6, 0x1e, - 0xf0, 0xf7, 0xe2, 0xcd, 0x9a, 0x26, 0x45, 0x5a, 0x16, 0x5a, 0x91, 0xf7, - 0x6a, 0xc7, 0x7e, 0xb6, 0xa5, 0xfb, 0xd5, 0x5a, 0xbb, 0x47, 0xa7, 0x36, - 0x90, 0xe5, 0xbb, 0x6b, 0x28, 0x0c, 0x3f, 0xa2, 0xaf, 0x57, 0x1c, 0x46, - 0x06, 0x03, 0xb1, 0x86, 0x4f, 0x5a, 0x72, 0xac, 0x02, 0x43, 0x0a, 0xd6, - 0xdf, 0xe0, 0x77, 0xc2, 0xa0, 0x78, 0x1b, 0xe9, 0x69, 0x8d, 0xf0, 0x6b, - 0x4f, 0x97, 0xfc, 0xea, 0xfa, 0xa5, 0xbf, 0x41, 0x78, 0xd8, 0x6e, 0xa1, - 0x6c, 0xae, 0xfe, 0x76, 0xdb, 0x02, 0xed, 0xf6, 0xdb, 0xcf, 0x0b, 0xc0, - 0xfe, 0x21, 0x77, 0x8d, 0x68, 0x08, 0x1a, 0xe4, 0x80, 0x2e, 0x93, 0xf2, - 0x85, 0xeb, 0x63, 0x97, 0x7a, 0xf2, 0xd8, 0x26, 0xed, 0xe6, 0x52, 0xe9, - 0xcf, 0x05, 0x7e, 0x81, 0x0a, 0xe8, 0xab, 0x9e, 0x2c, 0x8f, 0xe2, 0x5b, - 0x23, 0x75, 0x4c, 0x4a, 0xd1, 0xf6, 0xd1, 0x86, 0x11, 0x0d, 0x4f, 0xb7, - 0xa8, 0xae, 0x40, 0x84, 0xf0, 0xa1, 0xea, 0x12, 0x40, 0xf6, 0x76, 0xd1, - 0x4f, 0x44, 0xd1, 0xd6, 0x19, 0xaa, 0x96, 0xba, 0x27, 0x4a, 0x96, 0xd9, - 0x20, 0x62, 0xff, 0x8e, 0x2d, 0x04, 0xbb, 0x42, 0x82, 0x47, 0x36, 0x84, - 0xd2, 0x15, 0x7a, 0xa3, 0x30, 0x56, 0x73, 0x6a, 0x2f, 0x83, 0xac, 0xd1, - 0xee, 0x1c, 0xf6, 0x9c, 0x1f, 0xdc, 0x22, 0x08, 0x8f, 0xf2, 0x99, 0x8d, - 0x41, 0x2e, 0x7d, 0xa6, 0xb4, 0x36, 0xd4, 0x9c, 0x22, 0x30, 0x0e, 0x81, - 0xfe, 0x49, 0xec, 0xd5, 0x66, 0xd7, 0xd4, 0xca, 0xe7, 0x7e, 0x8b, 0x62, - 0x91, 0x04, 0xe8, 0xe2, 0x48, 0x39, 0x4b, 0x95, 0x82, 0x01, 0x61, 0xfd, - 0x40, 0xca, 0x50, 0xe4, 0xa0, 0x92, 0x24, 0x72, 0x2e, 0x18, 0x25, 0x8f, - 0x7d, 0x99, 0x7c, 0xe7, 0x83, 0x19, 0xe6, 0x67, 0x80, 0xbc, 0x87, 0xd5, - 0xff, 0xa1, 0x51, 0x32, 0x17, 0x44, 0x37, 0xc7, 0x3f, 0x52, 0x6c, 0x75, - 0x99, 0x35, 0xd3, 0x39, 0x07, 0xdf, 0x80, 0xfb, 0x59, 0xb9, 0xcc, 0x0e, - 0x7e, 0x74, 0xd5, 0xfd, 0x64, 0xcc, 0x40, 0x99, 0x75, 0xaf, 0xae, 0xb6, - 0xaf, 0x12, 0xce, 0xdd, 0xa5, 0x05, 0x9e, 0xa0, 0x59, 0x55, 0x6c, 0xfd, - 0x65, 0x21, 0x70, 0x04, 0x27, 0x70, 0x08, 0x46, 0xd5, 0x79, 0xcd, 0x32, - 0x49, 0xb5, 0x3e, 0xee, 0x96, 0xd3, 0x29, 0x7d, 0x59, 0x1a, 0xf8, 0x00, - 0x9c, 0x25, 0xc2, 0xbb, 0x94, 0x4f, 0x67, 0x17, 0xe7, 0xe1, 0x34, 0x3a, - 0xe3, 0x52, 0x43, 0x40, 0x31, 0x72, 0x23, 0xc0, 0x13, 0xd2, 0xf6, 0xf0, - 0xb9, 0x66, 0xdd, 0xa1, 0xb6, 0xc0, 0x19, 0xb0, 0xfa, 0x11, 0xfc, 0x9c, - 0xbf, 0xff, 0x87, 0xe1, 0x8a, 0x14, 0xea, 0xb7, 0x8a, 0xd2, 0xfe, 0x54, - 0x20, 0x94, 0x0b, 0xa6, 0x17, 0x08, 0x91, 0x32, 0xa2, 0xe2, 0x29, 0x56, - 0x56, 0xe7, 0x6b, 0x32, 0x24, 0xe2, 0xaa, 0xf1, 0x63, 0x19, 0x5a, 0x1c, - 0x45, 0xff, 0x10, 0xac, 0xa1, 0xb7, 0xfc, 0x6f, 0x28, 0xc3, 0x1f, 0xb3, - 0x24, 0x72, 0x35, 0xaa, 0xb7, 0x46, 0x55, 0x01, 0xa7, 0xe3, 0xd3, 0xaf, - 0xfa, 0x7f, 0x08, 0x3b, 0xb2, 0xeb, 0xce, 0xa8, 0xf6, 0xc5, 0xc8, 0xb3, - 0x37, 0xa0, 0x31, 0x44, 0xcc, 0x91, 0xee, 0x68, 0x9f, 0x8c, 0x59, 0x88, - 0x1e, 0x7c, 0xbe, 0x39, 0x00, 0x8b, 0x40, 0x41, 0xa9, 0x39, 0x6b, 0xf6, - 0x46, 0x80, 0x4b, 0x71, 0x4c, 0x52, 0xd8, 0x1e, 0xb8, 0x56, 0x48, 0x26, - 0xb8, 0xf1, 0x44, 0x86, 0x26, 0x5d, 0x56, 0xed, 0x97, 0x1c, 0x11, 0x22, - 0xea, 0x7c, 0x84, 0xf8, 0x57, 0x38, 0x86, 0x70, 0xa5, 0x33, 0xe2, 0x5c, - 0x40, 0x0a, 0xb0, 0xaf, 0xea, 0x7a, 0x70, 0xcf, 0x5b, 0x91, 0xe6, 0xa2, - 0xb0, 0x6b, 0x1b, 0x2b, 0x5b, 0x23, 0x38, 0xa7, 0xe0, 0x8d, 0xa4, 0xd4, - 0xc4, 0xc1, 0xaf, 0xaa, 0xf4, 0x00, 0x57, 0x21, 0x21, 0x6f, 0x8a, 0xf0, - 0x70, 0x87, 0xc0, 0x76, 0xf1, 0x77, 0x2f, 0xe7, 0x21, 0x4b, 0xa0, 0x20, - 0xaf, 0x49, 0xe1, 0x51, 0xe4, 0x38, 0x66, 0x08, 0xa2, 0x5f, 0xf2, 0xd8, - 0x0f, 0xd8, 0xd1, 0x7d, 0xa1, 0x62, 0xcd, 0x64, 0xd6, 0x56, 0xd6, 0x4b, - 0xcd, 0x03, 0x1a, 0x4a, 0x3b, 0x74, 0x44, 0x99, 0x04, 0xfe, 0xe5, 0xd3, - 0xb6, 0x74, 0xa4, 0xa2, 0xa9, 0x9e, 0xb3, 0x76, 0x8b, 0xe6, 0x84, 0xb0, - 0xd8, 0x80, 0xa7, 0x10, 0xa5, 0x91, 0xac, 0x9c, 0x79, 0xea, 0xa6, 0x8c, - 0x54, 0x67, 0x41, 0x7b, 0xcf, 0x07, 0xc4, 0x83, 0xef, 0xbc, 0x95, 0xab, - 0x01, 0xa5, 0x56, 0x05, 0x94, 0xd1, 0x5d, 0xfa, 0xcd, 0x4f, 0xc1, 0xf4, - 0x39, 0x12, 0x36, 0xae, 0xe2, 0x05, 0x7e, 0xb5, 0xda, 0xdb, 0x4a, 0xe0, - 0x59, 0x86, 0xec, 0xec, 0x9d, 0x5c, 0xe9, 0x18, 0x6a, 0x5b, 0x44, 0x8b, - 0x24, 0x3f, 0x1b, 0x79, 0x98, 0x89, 0xf1, 0x15, 0xd2, 0x89, 0xd2, 0x83, - 0x93, 0x75, 0x92, 0xc2, 0x35, 0x18, 0xea, 0x0a, 0x6c, 0xc0, 0xeb, 0x30, - 0x10, 0x1c, 0xc3, 0xe3, 0xb9, 0x8f, 0x73, 0xc1, 0xce, 0x8b, 0x91, 0x81, - 0x9c, 0x75, 0x83, 0x83, 0xf1, 0x56, 0xfc, 0xc5, 0xdd, 0xc9, 0x65, 0x40, - 0x6c, 0x65, 0xc4, 0xdf, 0x64, 0xf5, 0x19, 0x1c, 0x5c, 0xbd, 0x22, 0x86, - 0xb1, 0x09, 0xb3, 0x88, 0x8d, 0xec, 0x12, 0xaa, 0x9c, 0x6a, 0x05, 0x53, - 0x25, 0xa7, 0x3f, 0x74, 0x1d, 0xef, 0xd8, 0xf0, 0x45, 0x56, 0x3b, 0x0e, - 0x53, 0xb9, 0x0d, 0x39, 0x68, 0xff, 0xa6, 0x97, 0x64, 0x62, 0x79, 0xd0, - 0xb8, 0x21, 0x5d, 0xed, 0x9f, 0xe5, 0x2f, 0x20, 0x0e, 0x0b, 0x61, 0x34, - 0xfe, 0x3e, 0x4a, 0x06, 0x3a, 0x51, 0xb1, 0x2a, 0x38, 0xda, 0x4f, 0xed, - 0x7e, 0xcb, 0x89, 0x8e, 0x05, 0x7d, 0xf8, 0x0f, 0x52, 0xbe, 0x23, 0x8e, - 0x80, 0xd3, 0x76, 0x26, 0xb5, 0xd7, 0x13, 0xa2, 0x1a, 0x1e, 0x45, 0x3a, - 0x38, 0xf1, 0x51, 0x41, 0x2c, 0x1c, 0xe2, 0xf4, 0x8c, 0x97, 0x2a, 0x61, - 0xdd, 0x4d, 0xf5, 0x51, 0xda, 0x4e, 0xed, 0xb3, 0x9a, 0xa9, 0xc6, 0x5c, - 0xe5, 0xc6, 0xbb, 0xd6, 0x94, 0xeb, 0x42, 0x13, 0xa2, 0x2e, 0x10, 0x5c, - 0x30, 0xfb, 0x84, 0x28, 0xd0, 0xc9, 0x7c, 0x3c, 0x61, 0xd2, 0xbb, 0x45, - 0x80, 0xa2, 0xe1, 0xed, 0x11, 0x86, 0xb2, 0xb7, 0x47, 0x17, 0x40, 0x35, - 0xad, 0x8b, 0xcc, 0x66, 0xe0, 0xc0, 0x2a, 0xa2, 0x4d, 0x75, 0xae, 0xf2, - 0xa2, 0xba, 0xa8, 0x4b, 0xc1, 0x4c, 0x51, 0x31, 0x06, 0x96, 0xf5, 0x2c, - 0x5c, 0xf6, 0x11, 0xae, 0x68, 0x3c, 0x89, 0xe4, 0x33, 0xc7, 0x88, 0xab, - 0x2f, 0xee, 0xd6, 0xe4, 0xbc, 0x4e, 0xb2, 0x4d, 0x88, 0x16, 0x6a, 0xc5, - 0x0b, 0xfd, 0xe3, 0x0f, 0x5b, 0xf3, 0x5e, 0xbd, 0x40, 0x21, 0x2e, 0x20, - 0x4f, 0x96, 0xc6, 0x82, 0x4a, 0xf4, 0x3c, 0xae, 0xbf, 0xd0, 0x05, 0xc0, - 0x92, 0x2c, 0xea, 0x18, 0x07, 0x0e, 0x56, 0xe9, 0xc7, 0xfb, 0xdb, 0xc3, - 0xb3, 0x4e, 0x1c, 0x9a, 0x3c, 0x7a, 0x24, 0x72, 0x1d, 0xe6, 0x47, 0x43, - 0xf3, 0xec, 0x1b, 0xa8, 0xfa, 0x9c, 0x31, 0x1a, 0x6a, 0x3c, 0x0e, 0xca, - 0xc5, 0x3b, 0x5f, 0x2e, 0x5a, 0x4d, 0xfd, 0x30, 0x96, 0x4d, 0x3e, 0x60, - 0xe1, 0x23, 0xb1, 0x42, 0xc9, 0xdb, 0x10, 0xf2, 0xac, 0x07, 0xc9, 0x73, - 0xf6, 0x85, 0xd2, 0xb3, 0xe8, 0x3d, 0x68, 0xef, 0x0e, 0x43, 0x32, 0xd2, - 0x4d, 0xa2, 0x4a, 0x54, 0xe8, 0xa8, 0xc9, 0xa5, 0x68, 0xb6, 0x81, 0xb7, - 0x20, 0xa7, 0x2e, 0x67, 0x68, 0xfc, 0xd1, 0x1b, 0xea, 0x68, 0xb5, 0xc0, - 0xf4, 0xbb, 0x45, 0xa0, 0xbb, 0xf4, 0x9f, 0x40, 0xb1, 0x11, 0xb1, 0x85, - 0x9c, 0x53, 0xfa, 0x5d, 0x4c, 0x30, 0x5f, 0xad, 0x7b, 0xf7, 0x52, 0x6f, - 0x38, 0x3f, 0xe4, 0x95, 0xa2, 0x6b, 0xde, 0xa6, 0x4c, 0xe0, 0x34, 0xd6, - 0x9a, 0x8a, 0x85, 0x59, 0xb5, 0xe2, 0xa4, 0xb9, 0x34, 0xcc, 0x05, 0x84, - 0x55, 0x25, 0x8c, 0xc7, 0x83, 0x8e, 0x56, 0xd8, 0x94, 0xce, 0x10, 0x2c, - 0x1b, 0x97, 0xc4, 0x09, 0x73, 0x99, 0x2e, 0xa6, 0xb9, 0x96, 0x62, 0x23, - 0x84, 0xc7, 0xda, 0xef, 0x94, 0xb3, 0x02, 0x3b, 0xd8, 0x9e, 0xba, 0x19, - 0x92, 0x78, 0x03, 0x55, 0xdd, 0x6f, 0xe4, 0x99, 0x16, 0xc8, 0xeb, 0x14, - 0x55, 0xaa, 0x70, 0xb9, 0xbc, 0x68, 0x9f, 0x8f, 0xd1, 0xe2, 0x5e, 0x8b, - 0x63, 0xdb, 0x15, 0xff, 0x8e, 0xde, 0x49, 0xaa, 0xbe, 0x60, 0xb8, 0xc4, - 0xa5, 0xf7, 0x6d, 0xbb, 0x1e, 0x92, 0x61, 0x00, 0x65, 0x6c, 0x4b, 0x12, - 0xb7, 0xc3, 0x77, 0x50, 0xb9, 0x7f, 0xb0, 0xd7, 0x51, 0xd1, 0x7f, 0xe7, - 0x8f, 0xb4, 0x3c, 0xf7, 0xc0, 0x88, 0x45, 0xc6, 0x51, 0x92, 0x45, 0xd9, - 0x71, 0x43, 0x2e, 0xfa, 0x84, 0xf5, 0xd8, 0xc9, 0xa8, 0x8b, 0xdf, 0x54, - 0xcf, 0x05, 0xba, 0x4d, 0x7a, 0xb2, 0x0f, 0xed, 0x44, 0x56, 0xc5, 0x70, - 0xff, 0xa1, 0x24, 0xc6, 0xb8, 0x95, 0xad, 0xf4, 0xf5, 0x2a, 0x87, 0xea, - 0x3d, 0x04, 0xfc, 0x41, 0x3f, 0xea, 0xa1, 0x97, 0x9a, 0x6f, 0x76, 0x70, - 0xf3, 0xf6, 0xe5, 0xf8, 0x7e, 0xf7, 0x03, 0x6f, 0xce, 0x6b, 0x80, 0xeb, - 0x15, 0xda, 0x65, 0x5d, 0x07, 0x72, 0x62, 0x16, 0x64, 0x7e, 0x71, 0x0c, - 0xf8, 0x80, 0xe9, 0x84, 0xc4, 0xea, 0x55, 0xea, 0xaa, 0x57, 0xb5, 0x4e, - 0x10, 0x34, 0xcb, 0x6a, 0x76, 0x9e, 0x49, 0x44, 0xa8, 0x2b, 0x83, 0xfe, - 0x69, 0x92, 0xfa, 0x8f, 0xc6, 0x7a, 0x1d, 0xd1, 0x59, 0xab, 0x5d, 0xd3, - 0x24, 0xe4, 0xc1, 0xa2, 0x38, 0xd6, 0x0e, 0xce, 0xa9, 0x8b, 0xa6, 0xbc, - 0xf0, 0x92, 0x54, 0x8a, 0xdb, 0xa0, 0x09, 0xc9, 0xe3, 0x43, 0x3e, 0xa6, - 0x1c, 0xf2, 0x6f, 0x48, 0x3e, 0xe0, 0x47, 0xa5, 0xac, 0x2e, 0x75, 0x38, - 0x24, 0xc7, 0xe0, 0x22, 0xa3, 0xe4, 0x7a, 0x8d, 0xec, 0xb5, 0x96, 0x66, - 0x0a, 0x51, 0x49, 0x31, 0xf5, 0xaf, 0xfa, 0xbe, 0x61, 0xd0, 0xb5, 0x6a, - 0x7c, 0xea, 0x7f, 0x1a, 0x61, 0x3a, 0xf3, 0x7d, 0x2f, 0x6f, 0x44, 0xfd, - 0x24, 0x0f, 0x47, 0xd4, 0x17, 0xa3, 0x6f, 0x63, 0x4d, 0x02, 0xd1, 0xe3, - 0x23, 0x7d, 0xfe, 0x54, 0x86, 0x43, 0xb7, 0xf6, 0x8e, 0xab, 0xf6, 0x01, - 0xe4, 0x82, 0x76, 0xdf, 0x03, 0xb2, 0x08, 0x0d, 0x27, 0x81, 0x4c, 0x1b, - 0x8f, 0x7f, 0x5a, 0xd0, 0xb5, 0x74, 0x26, 0x65, 0x4b, 0xd9, 0x46, 0x4d, - 0xe9, 0x45, 0x58, 0x64, 0xa4, 0x87, 0x05, 0xf1, 0x86, 0xd3, 0x6a, 0xa9, - 0x53, 0x7b, 0x12, 0x7a, 0x99, 0xe7, 0xc9, 0x8d, 0x1d, 0x97, 0x94, 0x00, - 0x2f, 0x15, 0x63, 0xba, 0xcf, 0x82, 0x30, 0x74, 0xde, 0xfe, 0xd3, 0x1d, - 0x13, 0x37, 0x2d, 0xc0, 0xa7, 0x5d, 0xf7, 0x49, 0xe9, 0x58, 0x7b, 0x91, - 0xfc, 0xd2, 0x29, 0xda, 0xf5, 0x99, 0x03, 0x3c, 0x11, 0xd5, 0x61, 0x26, - 0xd2, 0xe8, 0x42, 0xc9, 0xca, 0xda, 0xd5, 0xc9, 0xef, 0xb9, 0x2f, 0x23, - 0x37, 0x2a, 0xf5, 0xd1, 0x8f, 0x02, 0x42, 0x6d, 0x11, 0x70, 0x32, 0x6f, - 0x67, 0xc6, 0x38, 0x07, 0x06, 0x61, 0x6f, 0xb7, 0x58, 0xf0, 0xcc, 0x56, - 0x3a, 0x36, 0xf3, 0xb1, 0x7a, 0x2f, 0x22, 0x28, 0x22, 0xf8, 0xad, 0xba, - 0xb8, 0xa2, 0xf4, 0x77, 0x89, 0x38, 0xe2, 0xa1, 0x63, 0x6e, 0xc2, 0x7a, - 0x23, 0xea, 0x8a, 0xd5, 0x8d, 0x2c, 0x21, 0x2d, 0x78, 0x50, 0xd7, 0xe6, - 0x58, 0x43, 0x15, 0x33, 0x48, 0xc4, 0xc6, 0x7a, 0x65, 0xae, 0x5d, 0x02, - 0xd3, 0xcd, 0xa0, 0x83, 0xfd, 0x81, 0x16, 0x18, 0x7d, 0x1c, 0x82, 0x7b, - 0xca, 0xf4, 0x82, 0xd2, 0x67, 0xe6, 0x78, 0x83, 0x63, 0x54, 0xc9, 0x25, - 0x44, 0xde, 0xb7, 0x19, 0xa8, 0x28, 0xb7, 0x93, 0x88, 0xce, 0xa1, 0x03, - 0x2c, 0x8c, 0xc8, 0xa9, 0xab, 0x25, 0x2e, 0xa2, 0xd1, 0x07, 0xf8, 0xda, - 0x90, 0xb1, 0xf6, 0xf0, 0xd9, 0x28, 0x46, 0xba, 0x8b, 0x4a, 0xfb, 0x56, - 0x9b, 0x4c, 0x57, 0x65, 0x81, 0x39, 0xf5, 0xcb, 0x63, 0x91, 0xf6, 0x8f, - 0x55, 0x81, 0xc8, 0xc6, 0x68, 0xf1, 0x19, 0x7e, 0x09, 0x66, 0x97, 0x1d, - 0xd3, 0x03, 0xa1, 0xeb, 0xd7, 0x30, 0x9a, 0xd0, 0x0e, 0x7c, 0x15, 0x71, - 0x95, 0x3c, 0x85, 0x94, 0x7f, 0xbe, 0x93, 0xe3, 0xcb, 0x83, 0x4e, 0xc6, - 0x0b, 0x80, 0x50, 0x92, 0x55, 0x71, 0xf0, 0x16, 0x58, 0x52, 0x46, 0x0c, - 0xef, 0x33, 0x6f, 0x12, 0xb0, 0xf5, 0x67, 0xda, 0xd1, 0xcc, 0xbc, 0xf8, - 0x1b, 0x3c, 0x4b, 0xf7, 0x92, 0x0b, 0xc4, 0x48, 0xa2, 0xdb, 0x7b, 0x8c, - 0x71, 0xb7, 0x68, 0x00, 0x2e, 0x25, 0x45, 0xb6, 0xc4, 0x23, 0x08, 0x21, - 0x52, 0x90, 0x96, 0xa9, 0xdc, 0xb9, 0xce, 0x45, 0x83, 0xa7, 0x55, 0xce, - 0xf0, 0x95, 0x3a, 0xc0, 0xc2, 0xb8, 0x01, 0xae, 0x8c, 0x26, 0x0b, 0x54, - 0x2a, 0x8d, 0x8f, 0xb2, 0x33, 0x4d, 0x0f, 0x76, 0x66, 0x81, 0x09, 0x7e, - 0xaa, 0x6d, 0x3f, 0x38, 0x39, 0x4c, 0xdf, 0x3f, 0x70, 0x5f, 0x89, 0xe4, - 0x33, 0xf6, 0x92, 0x3b, 0xd9, 0xc7, 0xe9, 0xc2, 0x68, 0x28, 0xdf, 0xef, - 0xd1, 0xb8, 0x1c, 0xb9, 0xaa, 0xbb, 0xf9, 0xf8, 0x03, 0xcf, 0xeb, 0x4d, - 0x58, 0x89, 0x38, 0x92, 0xf7, 0x07, 0x90, 0xc0, 0xe4, 0x43, 0x18, 0xca, - 0x6c, 0x08, 0xce, 0x81, 0xe9, 0xff, 0x5a, 0x5d, 0x1c, 0x1f, 0x35, 0x60, - 0x39, 0x47, 0x16, 0xc9, 0x97, 0x53, 0x1c, 0x2f, 0x91, 0x85, 0xfe, 0x51, - 0xbd, 0x06, 0x8d, 0x6b, 0x9c, 0xb2, 0xe0, 0x94, 0xe7, 0xde, 0x7d, 0x8d, - 0x78, 0xc4, 0x18, 0x42, 0x43, 0x35, 0x44, 0x91, 0x42, 0x57, 0x82, 0x41, - 0x16, 0x8b, 0x69, 0x0b, 0x83, 0xc9, 0x17, 0xa7, 0x0f, 0x0c, 0xc4, 0x45, - 0xe7, 0xab, 0x74, 0xe5, 0xd1, 0xd3, 0xd8, 0x63, 0x87, 0xed, 0xcd, 0x45, - 0xc4, 0x14, 0x9f, 0xfc, 0xdc, 0x75, 0xd6, 0x2d, 0x9d, 0xe5, 0x51, 0xce, - 0x78, 0x5a, 0xc9, 0x9a, 0xb4, 0x56, 0xc3, 0x0e, 0xe5, 0xde, 0xe7, 0x6f, - 0x3e, 0x6c, 0xd3, 0x36, 0xb4, 0x36, 0x1b, 0xc0, 0x40, 0x0c, 0x8d, 0xfe, - 0x02, 0x58, 0x11, 0x26, 0xff, 0x5e, 0xb4, 0x84, 0x42, 0x9d, 0xa4, 0x95, - 0xd7, 0xdb, 0x56, 0xca, 0xd6, 0xcc, 0x79, 0x97, 0xbe, 0xa9, 0x9a, 0xbb, - 0x25, 0x80, 0xb7, 0x33, 0x4c, 0x45, 0x3b, 0x42, 0x68, 0x53, 0xf7, 0x71, - 0x6e, 0xa6, 0xf5, 0xad, 0xdc, 0xe1, 0xc9, 0xc8, 0x1c, 0xdc, 0xd8, 0x5f, - 0xa2, 0xb5, 0x42, 0x1d, 0x53, 0x08, 0x6a, 0x31, 0x52, 0xdb, 0xd1, 0x04, - 0x4d, 0xfc, 0x52, 0x27, 0xad, 0x9e, 0x4a, 0xcc, 0xa6, 0x32, 0x22, 0xf9, - 0xec, 0x74, 0x70, 0x16, 0xfc, 0xc3, 0x56, 0x0b, 0x37, 0xeb, 0x3e, 0xd5, - 0x5c, 0xa0, 0x31, 0x7f, 0x78, 0xe9, 0x80, 0xd3, 0x01, 0xfa, 0x3a, 0xe8, - 0xda, 0xd0, 0x49, 0xc1, 0x2c, 0x18, 0x76, 0x30, 0x42, 0xcc, 0x01, 0x3c, - 0xf5, 0x4d, 0x04, 0xa7, 0x65, 0xd5, 0xa5, 0x22, 0x33, 0x36, 0xac, 0x97, - 0x2a, 0x10, 0xa8, 0xf7, 0x63, 0xb3, 0xcb, 0x78, 0x4f, 0xcf, 0xfc, 0x62, - 0x60, 0x89, 0x68, 0xe6, 0x0a, 0xd1, 0xa7, 0x9e, 0x86, 0x6e, 0x9b, 0xfa, - 0xf1, 0x0d, 0xe3, 0xb8, 0x06, 0x50, 0xd5, 0x51, 0xa8, 0x36, 0x8e, 0xa8, - 0xa1, 0x38, 0xc8, 0xbe, 0x84, 0x39, 0x1c, 0x02, 0x3d, 0x47, 0x49, 0x17, - 0xa4, 0x9a, 0x98, 0x39, 0x80, 0xf1, 0x9a, 0x13, 0x4a, 0xdf, 0x44, 0x69, - 0x2d, 0x4a, 0x0c, 0x41, 0x17, 0xbf, 0xbe, 0xbf, 0x87, 0xa2, 0xd0, 0x13, - 0xa8, 0xb6, 0x1e, 0x98, 0x84, 0xfd, 0xe3, 0xd9, 0xff, 0x42, 0xaa, 0x6e, - 0x61, 0xe3, 0xb4, 0x9c, 0x66, 0xbc, 0x10, 0xf2, 0x9f, 0xaf, 0x29, 0x7d, - 0xc9, 0x5d, 0xc7, 0xd3, 0x45, 0x44, 0x2b, 0x6f, 0x81, 0x57, 0x28, 0x94, - 0xb7, 0xa2, 0xd5, 0x7d, 0xcf, 0x89, 0xd0, 0xe8, 0x83, 0x4c, 0x5a, 0xec, - 0x3c, 0xa2, 0x69, 0xb9, 0xfd, 0x9b, 0x8b, 0xb7, 0xa1, 0x86, 0xa9, 0x65, - 0xf9, 0x85, 0x0f, 0x2e, 0x9b, 0xf0, 0xbe, 0x48, 0xec, 0x1c, 0x39, 0x4c, - 0xe0, 0x8b, 0xa9, 0x86, 0xa8, 0x05, 0x7e, 0xdc, 0x3a, 0x83, 0x8f, 0x19, - 0x17, 0xb0, 0x8b, 0x4a, 0x6a, 0xc2, 0xe5, 0xf5, 0xc7, 0x5f, 0x91, 0x16, - 0x7f, 0xc1, 0x4f, 0xd9, 0x9d, 0xfe, 0x54, 0x0f, 0xdf, 0x57, 0xf1, 0x90, - 0xa9, 0xf1, 0x9f, 0x1b, 0x5c, 0xa2, 0xdc, 0x6e, 0x2b, 0x39, 0xb4, 0x50, - 0xe2, 0x52, 0xd7, 0xf9, 0x48, 0xc0, 0xc2, 0xdd, 0x9e, 0x86, 0xd9, 0x10, - 0x44, 0xb4, 0x31, 0xef, 0xbf, 0x36, 0x13, 0xfa, 0x15, 0x06, 0x3a, 0xa0, - 0xca, 0x37, 0x49, 0xb2, 0x05, 0x7d, 0x95, 0x41, 0xbb, 0x12, 0xcc, 0xf5, - 0xe6, 0xdf, 0xfd, 0x96, 0x9c, 0x30, 0xa3, 0xc7, 0x36, 0x1b, 0xf5, 0x21, - 0x55, 0xce, 0x63, 0xa9, 0xa9, 0x7a, 0x47, 0xf8, 0xdc, 0xb8, 0xfb, 0xde, - 0x0a, 0xee, 0xf9, 0x7a, 0x5d, 0xb9, 0x56, 0xb3, 0x28, 0xca, 0x2f, 0x8b, - 0xb7, 0xc7, 0x1a, 0x99, 0x18, 0x13, 0xdd, 0x2a, 0xff, 0xc7, 0x5c, 0x84, - 0x98, 0x42, 0x33, 0x23, 0x8f, 0x8b, 0x55, 0xcb, 0xed, 0x32, 0x59, 0xfe, - 0x6d, 0xda, 0x7c, 0xfb, 0xac, 0x74, 0xac, 0x66, 0xde, 0x40, 0x2a, 0x4e, - 0x49, 0x96, 0x1d, 0xc8, 0xca, 0x1b, 0xcd, 0xdf, 0x46, 0x05, 0xf2, 0x16, - 0x92, 0x71, 0x2c, 0xa3, 0x1c, 0x56, 0x4f, 0xc9, 0x1f, 0x32, 0x53, 0xce, - 0xb1, 0xd0, 0x50, 0x3d, 0xa9, 0x78, 0x9c, 0x57, 0x61, 0x2c, 0x0e, 0x21, - 0x6e, 0xf1, 0xd6, 0x20, 0x79, 0xc8, 0x2c, 0xad, 0x00, 0x96, 0xae, 0xe6, - 0xa6, 0x66, 0x1c, 0xd8, 0x1f, 0x46, 0xec, 0x74, 0x2e, 0xc4, 0xff, 0xd7, - 0x38, 0x5c, 0x77, 0x05, 0xf3, 0x5d, 0xaa, 0x3f, 0x7f, 0x62, 0x76, 0xf7, - 0xc9, 0xea, 0x1c, 0x14, 0xbf, 0xd8, 0x3d, 0x59, 0x8a, 0xed, 0x9e, 0x5b, - 0x73, 0xbb, 0x45, 0x29, 0x01, 0x34, 0xb7, 0xff, 0x46, 0xe7, 0xe7, 0xeb, - 0x23, 0x08, 0x57, 0xb7, 0x23, 0x01, 0xea, 0xdb, 0x3c, 0xbe, 0xdf, 0x7e, - 0xb3, 0x3b, 0xe9, 0xef, 0x16, 0x6f, 0x3e, 0x72, 0x4e, 0x4c, 0x98, 0x78, - 0x70, 0xe0, 0x17, 0x20, 0xdb, 0x8a, 0x72, 0xb9, 0x8d, 0x21, 0xba, 0x9c, - 0x69, 0xf4, 0x7b, 0x70, 0xfd, 0x46, 0xfe, 0x79, 0xab, 0x1a, 0xe1, 0x91, - 0x1a, 0x3d, 0xd2, 0x3f, 0x64, 0x5c, 0xa7, 0xb4, 0x4d, 0xf9, 0xce, 0xd5, - 0x6a, 0xc7, 0x45, 0x52, 0x07, 0xdf, 0x93, 0x19, 0xc3, 0x9d, 0xe5, 0x3c, - 0xd3, 0xa5, 0xcc, 0x93, 0xb6, 0xbb, 0x6b, 0x58, 0xdc, 0x48, 0x83, 0xfa, - 0x1b, 0x95, 0x29, 0x44, 0x9d, 0x1f, 0x2c, 0x07, 0x6d, 0x27, 0xdd, 0xf5, - 0x7b, 0xb3, 0x79, 0xb6, 0xf0, 0x36, 0xb0, 0xad, 0xe9, 0x2d, 0x2c, 0xdd, - 0x1b, 0x73, 0xff, 0xc9, 0xaa, 0xb4, 0xc9, 0x6b, 0x1b, 0x2a, 0xe7, 0x45, - 0x24, 0x77, 0x8b, 0x8c, 0x21, 0xc4, 0xf3, 0x04, 0x71, 0x06, 0xbd, 0xcc, - 0xec, 0x94, 0x5c, 0x92, 0x6d, 0x64, 0x91, 0x98, 0xe8, 0x5a, 0x97, 0x18, - 0x72, 0x0c, 0xdc, 0x2a, 0x8b, 0xd9, 0x18, 0x13, 0x25, 0x11, 0xa6, 0xf1, - 0x81, 0x1e, 0x4d, 0x63, 0x70, 0xdc, 0xd9, 0x9b, 0x2b, 0xe7, 0x3f, 0x0e, - 0x96, 0xe8, 0x8c, 0x73, 0x68, 0xdb, 0x20, 0x65, 0x82, 0xd1, 0x76, 0x36, - 0xd2, 0x84, 0x42, 0x6e, 0xd2, 0x6b, 0xa5, 0xd8, 0x50, 0x10, 0x3f, 0x8e, - 0x51, 0x05, 0x06, 0xce, 0xd9, 0xd0, 0x0c, 0x1b, 0x42, 0xc2, 0x10, 0x8c, - 0x14, 0x8e, 0x34, 0xc8, 0x0d, 0xdc, 0x64, 0x49, 0x6e, 0x70, 0x78, 0xb3, - 0x8b, 0x98, 0x07, 0x9b, 0x75, 0x96, 0x51, 0x7e, 0x18, 0xb3, 0x51, 0x68, - 0x92, 0x22, 0x23, 0xf0, 0x43, 0x51, 0xb6, 0x3a, 0x71, 0x70, 0x5e, 0x60, - 0xa8, 0x9d, 0xa3, 0x36, 0xca, 0x72, 0x29, 0xfc, 0xdb, 0xd5, 0xee, 0x5d, - 0x95, 0x40, 0xf2, 0xf1, 0xe1, 0x26, 0xa1, 0x8b, 0x7a, 0x3f, 0x77, 0x4d, - 0xaf, 0xa9, 0x1d, 0x60, 0x4f, 0x41, 0xbd, 0x7f, 0x4d, 0xeb, 0xa5, 0xca, - 0x57, 0xea, 0xa4, 0x89, 0xbd, 0x15, 0xe0, 0x64, 0xd9, 0x5e, 0x54, 0x9b, - 0x0c, 0x38, 0x28, 0x45, 0xe5, 0xe4, 0x2e, 0x8a, 0x80, 0x1c, 0xe8, 0x3b, - 0x8e, 0xe7, 0x41, 0xb1, 0x91, 0x46, 0x31, 0x44, 0xe1, 0x51, 0x59, 0x15, - 0x2a, 0xb7, 0x1f, 0xb3, 0x91, 0x69, 0xf2, 0xf3, 0xbe, 0x41, 0x28, 0x94, - 0xdb, 0xf3, 0x94, 0xd5, 0x10, 0x30, 0xa4, 0x8e, 0xb7, 0x43, 0x9e, 0xbf, - 0x50, 0x7c, 0x91, 0xb4, 0x48, 0x3b, 0x18, 0x66, 0x53, 0xe1, 0xa9, 0x11, - 0xa7, 0x80, 0x6d, 0x91, 0x9a, 0xa5, 0x4d, 0x4e, 0x9d, 0x1e, 0xb5, 0xfd, - 0x7b, 0x43, 0x85, 0x98, 0x3e, 0x32, 0x29, 0xc0, 0xe0, 0xd2, 0xbf, 0xbb, - 0xf1, 0x82, 0x45, 0x05, 0x94, 0xe6, 0x62, 0x44, 0x27, 0xd1, 0x49, 0x50, - 0x3c, 0xd6, 0x1a, 0xd9, 0x3c, 0x9e, 0x67, 0x58, 0x88, 0xe2, 0x7c, 0x8b, - 0xa7, 0x10, 0xdf, 0x29, 0xef, 0x07, 0x95, 0xbc, 0xa5, 0x76, 0xf8, 0x61, - 0xd8, 0x7c, 0xaf, 0x26, 0x4c, 0x71, 0xec, 0xd6, 0xac, 0xf3, 0xcf, 0xdd, - 0x14, 0x8f, 0x22, 0x66, 0x98, 0x8f, 0xbc, 0x7b, 0xcf, 0x8e, 0xae, 0xb0, - 0x26, 0x8d, 0xf0, 0x9e, 0xdc, 0xf0, 0xc6, 0xbf, 0x31, 0xae, 0x53, 0x72, - 0x2b, 0xc7, 0x01, 0xed, 0xa0, 0x24, 0xf8, 0x8e, 0xf5, 0x1f, 0x53, 0x2d, - 0xbc, 0xf7, 0xbc, 0x10, 0xbe, 0xb8, 0x44, 0xd2, 0x28, 0x02, 0x26, 0x30, - 0x42, 0xe9, 0x82, 0x60, 0x93, 0xdb, 0xd0, 0x13, 0x1c, 0xfe, 0xa8, 0x2d, - 0x3f, 0xf0, 0xc9, 0xce, 0x00, 0x83, 0xf9, 0xfe, 0x1b, 0x05, 0xf5, 0x78, - 0xe7, 0xb0, 0x32, 0xd7, 0xec, 0xbc, 0x14, 0x4c, 0x94, 0x40, 0xd8, 0x35, - 0x87, 0xed, 0xa3, 0xd1, 0xb0, 0xd5, 0xb5, 0x1c, 0xb5, 0x75, 0xf8, 0x76, - 0xe4, 0x15, 0x9b, 0x93, 0x55, 0x4f, 0x60, 0x0a, 0xa8, 0x8a, 0x26, 0x1f, - 0x95, 0x97, 0xd7, 0xb3, 0xfa, 0x85, 0x74, 0xf6, 0x04, 0x70, 0x5b, 0x1d, - 0x24, 0x62, 0xa3, 0x78, 0x92, 0xea, 0xe0, 0xd1, 0x9e, 0x13, 0xa0, 0xab, - 0xba, 0x14, 0x78, 0x6b, 0x8a, 0xb1, 0xd8, 0xf8, 0x34, 0xfe, 0x32, 0xed, - 0xa5, 0x3b, 0x74, 0x07, 0xb2, 0x6b, 0x40, 0xa5, 0x82, 0x49, 0x58, 0xe1, - 0x20, 0x4c, 0x1b, 0x5d, 0x31, 0x45, 0x60, 0xf1, 0x41, 0x02, 0xdd, 0x99, - 0x9a, 0x8e, 0x99, 0x59, 0x81, 0x81, 0x19, 0x03, 0x23, 0xe2, 0x6a, 0x71, - 0x3d, 0x7f, 0xde, 0x62, 0xfa, 0xbd, 0x30, 0x7a, 0x3e, 0xbf, 0x68, 0x08, - 0xdb, 0x9e, 0xd7, 0x38, 0x6a, 0x9c, 0x2c, 0x3a, 0x7b, 0xf2, 0xdd, 0x69, - 0x77, 0x36, 0xcc, 0xe9, 0x73, 0x0e, 0xc8, 0x65, 0x73, 0xf2, 0x6f, 0x79, - 0x9f, 0x2f, 0x00, 0x84, 0xb9, 0x93, 0x45, 0x91, 0x3c, 0x5b, 0x34, 0x35, - 0x52, 0xfe, 0x46, 0x5b, 0x79, 0xc4, 0xb5, 0x8f, 0xbf, 0xc2, 0x3e, 0x89, - 0x62, 0x44, 0x83, 0xa8, 0x29, 0x50, 0xb7, 0x1e, 0x5a, 0x0f, 0xaf, 0x0a, - 0x21, 0x14, 0x81, 0x51, 0x5f, 0xfd, 0x65, 0x26, 0xa7, 0xec, 0x22, 0xa6, - 0x00, 0x04, 0xb8, 0x16, 0x57, 0x7b, 0xc9, 0x54, 0x7b, 0x1f, 0x3b, 0xad, - 0x9e, 0x34, 0x54, 0xc9, 0x91, 0x38, 0xb9, 0x94, 0x73, 0x69, 0xfe, 0x01, - 0xa6, 0x40, 0xeb, 0x69, 0x33, 0xe2, 0x3e, 0xcb, 0xee, 0x45, 0x66, 0xe0, - 0x64, 0xe2, 0x7e, 0xa7, 0xb5, 0x5f, 0x51, 0x25, 0xc9, 0xcd, 0x42, 0xae, - 0x1e, 0xd3, 0x22, 0xbc, 0x0a, 0xce, 0x98, 0xda, 0x8c, 0x53, 0x25, 0xde, - 0x38, 0x88, 0x97, 0x5b, 0xa6, 0xca, 0xe5, 0x0c, 0x35, 0x52, 0xd8, 0xfe, - 0x28, 0xc5, 0xba, 0x5e, 0xd1, 0x6f, 0x28, 0x1b, 0x98, 0xa7, 0x1f, 0x42, - 0x4a, 0xe9, 0x9a, 0x8d, 0x31, 0xb3, 0xcf, 0x64, 0xf8, 0xbd, 0x6f, 0x4c, - 0x6b, 0xfe, 0x65, 0xc1, 0xa3, 0xed, 0x4b, 0x76, 0x26, 0xe2, 0xce, 0x9d, - 0xe1, 0x8a, 0xe4, 0x73, 0xe3, 0xe0, 0x26, 0xe2, 0xab, 0x33, 0x89, 0xd2, - 0xb2, 0x11, 0x2c, 0xff, 0x07, 0x55, 0xb7, 0xea, 0x6e, 0x86, 0x66, 0x3b, - 0x44, 0xad, 0x8b, 0x9d, 0xe1, 0x36, 0x20, 0x5e, 0xfb, 0x3f, 0xcb, 0x2e, - 0x67, 0x39, 0x4f, 0xbd, 0x45, 0x79, 0x8b, 0x9e, 0x9d, 0x46, 0x43, 0xd8, - 0x4a, 0xdf, 0x9b, 0xa5, 0xd5, 0xe8, 0x37, 0x8b, 0x94, 0x76, 0x9e, 0xec, - 0x55, 0xf2, 0xb3, 0xd0, 0x98, 0xe0, 0xf9, 0x74, 0xe7, 0x29, 0xbf, 0x9f, - 0xef, 0x67, 0x6f, 0x4a, 0xb0, 0x34, 0xd5, 0x70, 0x7e, 0x28, 0x31, 0x80, - 0x83, 0xf8, 0x1a, 0xb4, 0xc4, 0xfb, 0x6c, 0xe1, 0x65, 0xd7, 0x07, 0x4d, - 0x9b, 0xd0, 0x51, 0x9f, 0x8f, 0x6d, 0x07, 0x31, 0xb3, 0x90, 0x43, 0xa9, - 0x4b, 0xce, 0x80, 0xb4, 0xa8, 0x8f, 0x63, 0x64, 0xab, 0x8a, 0xff, 0x86, - 0x1b, 0xec, 0xf7, 0xfe, 0xb5, 0xdf, 0xcb, 0x80, 0x81, 0xec, 0x06, 0xda, - 0xb1, 0x04, 0xcc, 0x6a, 0x03, 0x39, 0x79, 0x4a, 0x04, 0x6b, 0x3c, 0x2c, - 0x88, 0xc8, 0x3f, 0x50, 0x66, 0xb1, 0xe9, 0xae, 0x17, 0x57, 0x54, 0x41, - 0xa2, 0x05, 0xf5, 0xdd, 0x47, 0xe7, 0xab, 0x1e, 0x22, 0x7f, 0xc3, 0xee, - 0x7d, 0x37, 0x48, 0x07, 0xad, 0x89, 0xd3, 0x40, 0x2d, 0x34, 0x88, 0x81, - 0x44, 0x7a, 0x14, 0xea, 0x42, 0xb2, 0x7e, 0xd5, 0x3f, 0xc8, 0xf6, 0x68, - 0x63, 0x45, 0x58, 0x3b, 0xf9, 0x0b, 0xc5, 0x31, 0x60, 0x9a, 0x60, 0xed, - 0xee, 0x90, 0x05, 0x78, 0x15, 0xea, 0xb9, 0xeb, 0xff, 0x8f, 0x51, 0xaa, - 0xe3, 0x30, 0xfd, 0xfc, 0xef, 0x2c, 0xe0, 0x4f, 0xf1, 0x21, 0xf6, 0x69, - 0x02, 0x33, 0x31, 0x1b, 0xf3, 0xee, 0x23, 0x85, 0xf5, 0xf9, 0xa1, 0x33, - 0xb6, 0xe2, 0x13, 0x99, 0x98, 0xbf, 0xa4, 0x62, 0x5f, 0x79, 0xd7, 0x0e, - 0x7c, 0xaa, 0x96, 0x36, 0x7b, 0x31, 0xe4, 0xf0, 0xe6, 0x2b, 0x4c, 0x39, - 0xcf, 0x2d, 0x63, 0xb9, 0x72, 0xe6, 0xe3, 0x97, 0xb4, 0xf7, 0x45, 0xea, - 0x44, 0xc9, 0xdf, 0xc5, 0x47, 0xb0, 0x1a, 0x80, 0x0e, 0x9e, 0x38, 0x09, - 0xc8, 0x83, 0x7c, 0xb0, 0x55, 0x63, 0x68, 0xda, 0x18, 0x61, 0xf7, 0xa1, - 0x08, 0xec, 0xdf, 0xe4, 0x98, 0xd9, 0xc9, 0xbf, 0xdd, 0x68, 0x71, 0x0c, - 0x3f, 0x8a, 0x5d, 0x01, 0x83, 0xaa, 0x9e, 0x67, 0xbf, 0xb5, 0x6a, 0x37, - 0xea, 0x0c, 0x8c, 0x41, 0x04, 0x41, 0x6f, 0xfa, 0xf4, 0x5f, 0xc8, 0x8b, - 0x1f, 0xf8, 0xf6, 0x16, 0x52, 0x33, 0x0b, 0x79, 0x39, 0xd2, 0xbd, 0x55, - 0x0a, 0x07, 0x72, 0x0c, 0xc6, 0x2e, 0x02, 0xd2, 0x36, 0x0c, 0x9f, 0xba, - 0xa4, 0x28, 0xc9, 0x23, 0xae, 0xd3, 0xcf, 0x66, 0x53, 0x98, 0x24, 0xea, - 0x9e, 0xe3, 0x1b, 0x8d, 0x61, 0x53, 0x88, 0xa8, 0x2d, 0xf6, 0xa2, 0xff, - 0xec, 0xaf, 0xf8, 0x5a, 0x29, 0x03, 0x28, 0xbb, 0xf6, 0x8d, 0xff, 0xba, - 0x47, 0xd3, 0x0d, 0xef, 0x90, 0xac, 0x3d, 0x6b, 0xcf, 0x13, 0x96, 0xea, - 0x78, 0x83, 0x95, 0x26, 0xd6, 0x7e, 0xde, 0x88, 0x8c, 0x68, 0x6c, 0x96, - 0xce, 0xf8, 0xe1, 0x32, 0x58, 0x79, 0x13, 0x99, 0x6d, 0x5f, 0xe1, 0xeb, - 0x6d, 0x20, 0x9d, 0x8a, 0x82, 0x77, 0xfd, 0x83, 0x57, 0xaa, 0xae, 0xe2, - 0x03, 0x33, 0xa6, 0xa6, 0xba, 0xd4, 0x94, 0x17, 0x96, 0x47, 0x5e, 0xd0, - 0x52, 0xd7, 0xe8, 0x86, 0xc4, 0x85, 0xad, 0xa6, 0xf5, 0x9d, 0x9a, 0x4f, - 0x9d, 0x83, 0xce, 0x1e, 0x9e, 0x24, 0x44, 0x75, 0x99, 0x88, 0x94, 0x55, - 0xb3, 0x97, 0x00, 0xe8, 0x56, 0x71, 0x91, 0xb3, 0x23, 0x67, 0x56, 0xab, - 0xd7, 0xda, 0x13, 0x19, 0xdf, 0xf5, 0x47, 0x97, 0x1e, 0x45, 0xdf, 0x85, - 0x7f, 0x5e, 0x34, 0xd8, 0xd7, 0x22, 0x6a, 0x20, 0x5b, 0xac, 0x8e, 0xb1, - 0x88, 0xa1, 0x73, 0xd5, 0xf2, 0x46, 0xd7, 0xfe, 0xce, 0xae, 0xff, 0x0f, - 0xa6, 0xfc, 0x6f, 0xb3, 0xdf, 0x02, 0x78, 0x3e, 0xc7, 0xea, 0x1d, 0x1f, - 0xeb, 0x5e, 0xb6, 0x60, 0x11, 0xba, 0xab, 0x06, 0x58, 0x9f, 0x52, 0x0c, - 0x73, 0x8d, 0x6a, 0x03, 0xb9, 0x73, 0x57, 0xff, 0x81, 0xcf, 0x16, 0x15, - 0x90, 0x9e, 0x9f, 0x14, 0xef, 0x9a, 0xb3, 0xff, 0xb3, 0xb2, 0x32, 0xd5, - 0x46, 0x7f, 0x0c, 0x70, 0x8b, 0xcf, 0xf6, 0x0d, 0x9f, 0x8c, 0x49, 0x21, - 0x93, 0xf9, 0x32, 0x0c, 0x41, 0x00, 0x6b, 0x43, 0x18, 0xd4, 0x61, 0x78, - 0xf3, 0x04, 0x9b, 0x87, 0x7e, 0xb2, 0x87, 0xa7, 0x95, 0x72, 0x22, 0x64, - 0x3a, 0xf2, 0xa5, 0x8a, 0x34, 0xae, 0x29, 0x4d, 0x0c, 0xe0, 0x92, 0xb5, - 0xca, 0xb9, 0xaf, 0xe6, 0x4c, 0x19, 0x77, 0x4b, 0x25, 0xc9, 0xf0, 0xc0, - 0x7a, 0x15, 0xdb, 0xd0, 0x4e, 0x66, 0xc3, 0x48, 0xa0, 0xb0, 0x6c, 0x36, - 0x9f, 0x68, 0xf9, 0x7d, 0xa1, 0x47, 0x82, 0x93, 0x43, 0xfa, 0x75, 0x11, - 0x54, 0xe5, 0xea, 0x88, 0x67, 0x62, 0x3c, 0xe6, 0xcf, 0x8e, 0xd5, 0x10, - 0xe5, 0x8f, 0x8c, 0xd3, 0x76, 0xd9, 0x03, 0xce, 0xc0, 0x5d, 0xb9, 0x74, - 0xb0, 0xdf, 0xe9, 0x67, 0x43, 0xcd, 0xc7, 0x3f, 0xe8, 0x7a, 0x5c, 0xb5, - 0xf3, 0x0a, 0x74, 0x3d, 0x2d, 0x2c, 0x21, 0x91, 0x56, 0xee, 0x9c, 0xb0, - 0xdd, 0xdd, 0xc9, 0xcc, 0xe9, 0x46, 0x7a, 0x0a, 0xb6, 0xee, 0x16, 0x82, - 0x9d, 0xb2, 0xb7, 0xa3, 0x6f, 0x54, 0xa4, 0x88, 0xa2, 0x7d, 0xd8, 0xfb, - 0xc4, 0x34, 0x8f, 0x2e, 0x76, 0x11, 0x24, 0x6b, 0xdf, 0x28, 0x29, 0x77, - 0xfa, 0xa6, 0x7e, 0xab, 0xae, 0x16, 0x11, 0xe6, 0x6b, 0x7b, 0xb4, 0xd6, - 0x87, 0x37, 0x87, 0xf7, 0xed, 0xb9, 0xf9, 0x65, 0x28, 0x6a, 0x22, 0xe2, - 0x75, 0x75, 0xee, 0x7f, 0xc9, 0x0b, 0x27, 0xf7, 0xb0, 0x3c, 0x3c, 0xe8, - 0x83, 0xa2, 0xe1, 0xb6, 0xe6, 0x2d, 0x56, 0xd5, 0xdb, 0x5e, 0x22, 0xd1, - 0x14, 0xb5, 0xdf, 0x22, 0x75, 0x06, 0x7a, 0x96, 0xa8, 0x27, 0xbc, 0xb0, - 0x83, 0x95, 0xe4, 0x7a, 0x76, 0xc0, 0xa0, 0xdf, 0x3c, 0x47, 0x4e, 0xd5, - 0xe3, 0xf1, 0x8b, 0x1d, 0xa8, 0x86, 0xdf, 0x96, 0x55, 0x4f, 0xdc, 0x88, - 0xe0, 0xf8, 0xeb, 0x8f, 0xab, 0xf3, 0x25, 0xb4, 0xb1, 0xd2, 0x21, 0xa4, - 0x14, 0xe7, 0x01, 0xb1, 0x49, 0xee, 0x7f, 0x74, 0x06, 0x12, 0x61, 0x94, - 0x37, 0x01, 0x23, 0xc3, 0x97, 0xc9, 0x44, 0x76, 0x02, 0x22, 0xbf, 0xc0, - 0xbb, 0x7b, 0x93, 0xf0, 0x31, 0x08, 0xa4, 0x98, 0xba, 0xf6, 0x47, 0xb3, - 0xd1, 0xb0, 0x8c, 0x78, 0xaa, 0xd8, 0x01, 0xb2, 0x66, 0x6c, 0x56, 0x97, - 0xc9, 0xa8, 0xd1, 0x47, 0x44, 0xa1, 0x24, 0xa0, 0x55, 0x08, 0x95, 0x34, - 0x1b, 0x2f, 0x00, 0x62, 0x0c, 0x7f, 0x4c, 0x66, 0x09, 0x8a, 0x43, 0xf0, - 0xf6, 0x5c, 0x14, 0xc3, 0xec, 0xe2, 0x01, 0x68, 0xb0, 0x38, 0x08, 0x7a, - 0x19, 0x22, 0x76, 0x54, 0xe1, 0x55, 0x71, 0x30, 0x92, 0xc2, 0x7d, 0x09, - 0xb7, 0xf3, 0xa4, 0x41, 0x1c, 0x8b, 0xec, 0x6b, 0x2f, 0x98, 0x1b, 0x4d, - 0x5d, 0xa8, 0x59, 0x5e, 0x22, 0xe5, 0x25, 0x55, 0x52, 0x6d, 0x72, 0x7f, - 0xbf, 0x1b, 0xc5, 0xf2, 0xc7, 0xd1, 0x90, 0x0d, 0x02, 0x8a, 0xfe, 0x83, - 0x7a, 0xa8, 0x1c, 0x87, 0x15, 0x68, 0x95, 0x5c, 0xb4, 0xa4, 0xac, 0x7c, - 0x54, 0x78, 0x82, 0xe1, 0xa9, 0xfc, 0xcf, 0x7d, 0x4c, 0xc4, 0x5e, 0x24, - 0x95, 0xce, 0x0a, 0x6b, 0xaf, 0x6e, 0xcc, 0x68, 0x0d, 0x52, 0x08, 0xfd, - 0xf3, 0x79, 0x3c, 0x9b, 0x9c, 0x59, 0x2b, 0xe5, 0x95, 0x5b, 0xe1, 0xb2, - 0x8a, 0xad, 0xd1, 0x68, 0xcf, 0x29, 0x29, 0x00, 0x86, 0x97, 0x81, 0x3f, - 0x7d, 0x91, 0xa1, 0x87, 0xea, 0x31, 0x40, 0x03, 0xff, 0x6d, 0xf6, 0xe5, - 0x7c, 0x0a, 0x39, 0x0a, 0x07, 0xbd, 0x40, 0x8b, 0x50, 0x66, 0x11, 0x71, - 0x3a, 0x2f, 0xc4, 0x23, 0x7c, 0x2c, 0xd5, 0x36, 0xc5, 0x93, 0xa8, 0x1d, - 0xdd, 0xff, 0x74, 0x4c, 0x48, 0x84, 0xba, 0xa4, 0xab, 0x3d, 0x50, 0xe3, - 0xa2, 0xa4, 0x35, 0xca, 0x8b, 0x7d, 0x8b, 0x23, 0x34, 0xbc, 0xc0, 0xff, - 0xac, 0x8e, 0x8b, 0xcf, 0xe6, 0x48, 0x39, 0x79, 0x22, 0x6a, 0x5e, 0xee, - 0xa6, 0x21, 0xa5, 0x9f, 0xbf, 0x58, 0xb0, 0x20, 0xfe, 0x31, 0x04, 0x42, - 0x43, 0x76, 0x70, 0x74, 0xdc, 0xe7, 0xa8, 0x55, 0x15, 0xdc, 0xf9, 0x71, - 0x22, 0x30, 0x0c, 0xe2, 0x2e, 0xe3, 0xc9, 0x02, 0x21, 0x48, 0xce, 0x98, - 0xe7, 0x25, 0xb4, 0x59, 0x4a, 0xcb, 0x6a, 0xf6, 0x9e, 0x62, 0x7b, 0x02, - 0x65, 0x56, 0xb0, 0x71, 0x5b, 0xe0, 0x25, 0x33, 0x6a, 0x17, 0x50, 0xf8, - 0x18, 0xdd, 0xde, 0x51, 0x5c, 0x98, 0xee, 0xe2, 0x75, 0x2a, 0x4a, 0x60, - 0x44, 0x6c, 0x38, 0xbb, 0x42, 0xdf, 0xb0, 0xf0, 0x6a, 0xc5, 0xf5, 0xa2, - 0x4b, 0xe6, 0xb0, 0xff, 0x6e, 0xcd, 0xf0, 0xaf, 0xfe, 0xc1, 0x6e, 0x9f, - 0x4c, 0x7e, 0xfe, 0x42, 0x79, 0xfc, 0x48, 0x0c, 0xc6, 0x51, 0x01, 0x2b, - 0xfc, 0x21, 0x13, 0xd7, 0x55, 0xa1, 0xb1, 0x5f, 0x64, 0x85, 0xcd, 0x5a, - 0xcc, 0x7c, 0xb3, 0x9e, 0x91, 0x5d, 0x11, 0x9e, 0x70, 0x5f, 0xcb, 0xb0, - 0x33, 0x0c, 0xe2, 0x6b, 0x7f, 0xbe, 0x31, 0x64, 0x4e, 0xb0, 0x38, 0x5f, - 0x39, 0x58, 0x4c, 0xf8, 0x27, 0xfc, 0x56, 0x4e, 0xca, 0xc4, 0x5f, 0xd1, - 0xa4, 0x08, 0x0a, 0xcc, 0xd1, 0x6b, 0xb3, 0x63, 0xd6, 0x65, 0xab, 0x21, - 0xbe, 0xef, 0x2a, 0x6c, 0x8e, 0x9e, 0x1e, 0xbc, 0xb3, 0x6a, 0xee, 0x3d, - 0x59, 0x3c, 0x9c, 0xd7, 0xf3, 0xf4, 0xa7, 0x5e, 0xde, 0xaf, 0xa7, 0xe3, - 0x33, 0x04, 0x56, 0xe3, 0x76, 0x3f, 0xcd, 0x21, 0x30, 0xb3, 0x67, 0xa4, - 0x26, 0xb2, 0x32, 0x3c, 0x7c, 0xfa, 0xfc, 0xd7, 0x80, 0x85, 0x6f, 0xbb, - 0x4b, 0x5b, 0x65, 0xb7, 0x8b, 0x3a, 0x54, 0x50, 0x8a, 0xc5, 0xc7, 0xcc, - 0x71, 0x4d, 0x23, 0x24, 0x80, 0x16, 0x1b, 0xf2, 0x74, 0x2d, 0xaf, 0x4d, - 0x9c, 0x7e, 0x82, 0x6d, 0x62, 0x89, 0xb0, 0xfa, 0xb6, 0x71, 0xdd, 0x46, - 0xb2, 0x9e, 0xa7, 0xf2, 0x35, 0x16, 0x28, 0xf8, 0x43, 0xa1, 0x7b, 0xea, - 0x0e, 0x7f, 0xcc, 0x33, 0x19, 0x0e, 0xcf, 0x1a, 0x91, 0x91, 0x72, 0xea, - 0x8b, 0x86, 0x7e, 0x96, 0x11, 0x67, 0xe4, 0x44, 0xfb, 0xf4, 0x28, 0x33, - 0x15, 0x4f, 0xbd, 0xc4, 0xed, 0x84, 0xa5, 0xfe, 0x09, 0x33, 0xf3, 0x74, - 0xdc, 0x41, 0x62, 0xb9, 0x92, 0xa8, 0x27, 0x5d, 0x39, 0x40, 0x88, 0xde, - 0x82, 0xe3, 0x64, 0x96, 0xa7, 0x1a, 0xe7, 0xab, 0x3a, 0xc6, 0xac, 0x73, - 0x4c, 0x66, 0x0b, 0xb3, 0x71, 0x30, 0x7c, 0xda, 0x46, 0x69, 0x5e, 0xdb, - 0xad, 0xc2, 0x11, 0xda, 0xb4, 0xf0, 0xcc, 0xbd, 0x5f, 0x6e, 0x48, 0x32, - 0x23, 0x89, 0x98, 0x17, 0x9c, 0x1d, 0x29, 0xa3, 0x04, 0x33, 0x98, 0xfb, - 0x48, 0x35, 0x6c, 0xac, 0xb1, 0x93, 0xd4, 0x96, 0x05, 0x1d, 0xa2, 0xcc, - 0x2e, 0x3c, 0x78, 0x52, 0x7f, 0x38, 0x46, 0x82, 0x38, 0x62, 0xfd, 0xcf, - 0x20, 0xf3, 0x62, 0x82, 0x8a, 0x72, 0xe9, 0xa7, 0x9e, 0x2c, 0x65, 0xec, - 0x66, 0xeb, 0x21, 0x12, 0xdd, 0xc2, 0x8f, 0xc0, 0x12, 0x8d, 0x93, 0xa6, - 0x95, 0x24, 0x4e, 0x7a, 0x12, 0x17, 0x9f, 0xa0, 0x3d, 0xdd, 0x6f, 0xfc, - 0x42, 0x66, 0x5f, 0xdd, 0xbb, 0x82, 0x62, 0xfa, 0x2d, 0xd2, 0x2a, 0xca, - 0xf4, 0x33, 0xc3, 0x3d, 0x42, 0xa9, 0x43, 0x93, 0x2f, 0x00, 0xd7, 0x46, - 0x0e, 0xcc, 0x1d, 0x42, 0xad, 0xac, 0x4f, 0xf1, 0x23, 0x76, 0x91, 0x13, - 0xb9, 0x1f, 0x40, 0xde, 0x76, 0xf2, 0x3a, 0xcf, 0xc9, 0x0b, 0xc2, 0xf1, - 0x60, 0x5f, 0x3c, 0x86, 0x69, 0x0d, 0x5e, 0xc6, 0xfa, 0x5a, 0x48, 0x7e, - 0x9f, 0xfa, 0x55, 0xe7, 0x1d, 0x1f, 0x8e, 0x2e, 0x0c, 0x10, 0x08, 0xca, - 0x2f, 0xbe, 0x2d, 0x2a, 0x2a, 0x4a, 0xe1, 0x78, 0xf8, 0x5a, 0x11, 0x15, - 0x81, 0xab, 0xf7, 0xa1, 0x13, 0xd0, 0x8a, 0x60, 0x74, 0xb0, 0xed, 0x4a, - 0x97, 0x21, 0x24, 0xc5, 0xc4, 0xe1, 0x17, 0x95, 0x61, 0x94, 0x80, 0x6d, - 0xbf, 0x6b, 0x55, 0xdd, 0x41, 0x07, 0x61, 0x21, 0xa8, 0x50, 0x6f, 0x2e, - 0x67, 0x68, 0x30, 0x91, 0x07, 0xe4, 0x4f, 0xd8, 0x4a, 0xd4, 0x72, 0x29, - 0x33, 0xc7, 0x12, 0x43, 0xb9, 0xe7, 0xd2, 0x7b, 0x96, 0xa4, 0x74, 0x6f, - 0xbf, 0xe2, 0xd0, 0x90, 0xa7, 0x93, 0x56, 0x6b, 0x8a, 0xee, 0x32, 0x9e, - 0xc3, 0x44, 0xa4, 0x7f, 0xe1, 0xcd, 0x03, 0xd4, 0xac, 0x88, 0x68, 0x8d, - 0xe8, 0xe8, 0xda, 0xc0, 0x4a, 0x4f, 0xae, 0x0f, 0x53, 0x88, 0x87, 0xc8, - 0xd4, 0x4f, 0x20, 0xfb, 0x0a, 0x42, 0x3c, 0x88, 0x6a, 0x44, 0x7d, 0x13, - 0xf2, 0x97, 0xd0, 0x8a, 0x1b, 0x57, 0xaa, 0x71, 0xb2, 0x01, 0x1b, 0x22, - 0x97, 0xa9, 0xb9, 0xc6, 0x8c, 0xd8, 0x93, 0x17, 0x3e, 0x06, 0xe8, 0x9f, - 0x9d, 0x38, 0x11, 0xe2, 0x9f, 0x83, 0x65, 0x30, 0x63, 0x46, 0xf2, 0xe3, - 0xdf, 0x2d, 0x88, 0x74, 0x51, 0x61, 0xfc, 0x50, 0xca, 0x54, 0xe1, 0x6f, - 0x30, 0xc7, 0x16, 0xa6, 0x2a, 0x03, 0xc7, 0x26, 0x12, 0xcc, 0x8b, 0x12, - 0xe2, 0xa9, 0x33, 0x5a, 0xad, 0xe2, 0x4e, 0x9b, 0x35, 0x27, 0x32, 0x92, - 0xb7, 0x97, 0xd0, 0xad, 0x15, 0x5f, 0x2c, 0x92, 0x6a, 0xc3, 0xae, 0xe9, - 0x08, 0xf7, 0x37, 0x2f, 0xf0, 0x32, 0xf6, 0x3e, 0xeb, 0x45, 0x4a, 0x25, - 0xd6, 0x48, 0xf5, 0xca, 0x2c, 0x73, 0x2e, 0x8f, 0x17, 0x60, 0x78, 0x74, - 0x01, 0x02, 0x22, 0xd8, 0x6f, 0x27, 0x66, 0xde, 0xf5, 0x3c, 0xf8, 0x4b, - 0x3b, 0x82, 0xb4, 0xfb, 0xdb, 0x74, 0xf8, 0xf6, 0x93, 0x40, 0xd2, 0x3b, - 0xac, 0x41, 0xf0, 0x24, 0x7b, 0xe1, 0x8a, 0xcd, 0x1a, 0xda, 0x4f, 0x19, - 0x21, 0x95, 0x13, 0x34, 0xc1, 0x5c, 0x9c, 0x74, 0xba, 0xd3, 0xf1, 0xed, - 0xd4, 0x58, 0x27, 0xa0, 0x45, 0xa1, 0xfc, 0x39, 0x61, 0xcb, 0x2a, 0x34, - 0x8e, 0x94, 0x32, 0xc6, 0x2c, 0xf5, 0x35, 0x6c, 0x58, 0xd4, 0xbd, 0x4e, - 0x82, 0x76, 0xb9, 0xe8, 0x16, 0xdd, 0x60, 0x88, 0x8f, 0x0c, 0xe8, 0x65, - 0x87, 0xd5, 0xd0, 0x48, 0x85, 0xdf, 0x1c, 0xc3, 0xcd, 0x87, 0xf7, 0xed, - 0x73, 0x4a, 0x9b, 0xe4, 0x2b, 0x15, 0x30, 0xf1, 0x12, 0x09, 0xa0, 0x4c, - 0x72, 0xff, 0x84, 0x77, 0x83, 0xcc, 0x91, 0xb0, 0x7c, 0x31, 0x9d, 0x83, - 0x63, 0x33, 0x11, 0x15, 0x7e, 0x2a, 0x7c, 0x01, 0x4f, 0x92, 0xab, 0xcf, - 0x13, 0xc6, 0xa1, 0xd1, 0xd8, 0x73, 0x32, 0x4a, 0xb2, 0xe0, 0x2c, 0xf0, - 0x00, 0x0f, 0xff, 0x9c, 0x05, 0x7e, 0x8d, 0x14, 0xbc, 0xf1, 0x6f, 0xfa, - 0xb1, 0x52, 0x2b, 0x70, 0x1f, 0x01, 0xca, 0x57, 0xd5, 0x9e, 0x51, 0x68, - 0xbf, 0x83, 0x92, 0xf6, 0xc4, 0x0b, 0xbf, 0xe1, 0xf4, 0x29, 0x71, 0x4c, - 0xbc, 0x88, 0x9f, 0xe5, 0x43, 0x29, 0x5e, 0x5c, 0xb8, 0xf5, 0x22, 0x6c, - 0x03, 0x69, 0x21, 0x7a, 0x91, 0x16, 0x92, 0x08, 0x41, 0x01, 0xb6, 0xa9, - 0xf2, 0x1b, 0xbf, 0x64, 0xa4, 0x26, 0xf1, 0x62, 0x12, 0xec, 0xa2, 0x34, - 0x85, 0xd9, 0x97, 0xfc, 0xd4, 0xe8, 0xed, 0x0d, 0x88, 0x1d, 0x4d, 0xb4, - 0x38, 0xcc, 0x4d, 0xbc, 0xca, 0xd7, 0x7f, 0xd9, 0x74, 0xbf, 0x43, 0x1d, - 0xb3, 0x5a, 0x22, 0x17, 0x7e, 0x1d, 0xab, 0x68, 0x94, 0x22, 0xff, 0x03, - 0x18, 0x02, 0xaa, 0x71, 0xd2, 0x9c, 0xcd, 0x26, 0xcc, 0x84, 0x03, 0xc8, - 0x2c, 0x5c, 0x9c, 0xd3, 0x14, 0x3f, 0xbf, 0x40, 0x00, 0xc9, 0x40, 0xac, - 0xc5, 0xde, 0x87, 0x75, 0x91, 0xb8, 0xa0, 0x50, 0x6f, 0x7e, 0x6c, 0x67, - 0xdd, 0x18, 0x34, 0xa8, 0xeb, 0x9c, 0x55, 0x4a, 0xc9, 0xa2, 0x46, 0xa1, - 0x79, 0xfd, 0x04, 0xb5, 0xee, 0x51, 0xf7, 0x62, 0x78, 0x55, 0x0c, 0xd3, - 0xc3, 0x14, 0x19, 0x3c, 0x16, 0x65, 0xde, 0x2f, 0x6d, 0xa4, 0x75, 0x23, - 0x23, 0x4d, 0x79, 0xa4, 0x15, 0x17, 0x1a, 0x92, 0xf9, 0xb8, 0xf5, 0x70, - 0x06, 0x64, 0x12, 0xdc, 0x0b, 0xa4, 0x7b, 0x78, 0xa4, 0x63, 0xdf, 0x95, - 0xbf, 0x5c, 0xf8, 0x50, 0x82, 0x06, 0xeb, 0xcc, 0x48, 0x4e, 0xc5, 0x5c, - 0x11, 0xcb, 0x28, 0x6a, 0xd3, 0xe8, 0x0a, 0x61, 0x35, 0x3c, 0xc2, 0x38, - 0x48, 0xb9, 0x73, 0x45, 0xc1, 0x21, 0x4e, 0x42, 0x2b, 0x2b, 0x38, 0xad, - 0x8d, 0x2d, 0x09, 0x55, 0x42, 0x7d, 0x83, 0xa1, 0x14, 0x12, 0x05, 0x98, - 0x4e, 0x46, 0x54, 0x6b, 0x8d, 0xfb, 0xc8, 0x55, 0x29, 0x2b, 0x33, 0xa7, - 0x44, 0x6c, 0x46, 0xa1, 0x66, 0x8f, 0xb3, 0x28, 0x5f, 0x27, 0x7f, 0x33, - 0xb3, 0xbc, 0xcd, 0x65, 0x6f, 0x4d, 0xee, 0x78, 0x2d, 0x9c, 0x5f, 0xfc, - 0x17, 0xb8, 0x0c, 0xb6, 0x6e, 0x6b, 0x01, 0x64, 0x7c, 0x50, 0x3a, 0x5b, - 0xf3, 0xd4, 0x5e, 0xa2, 0xa0, 0xa0, 0x1e, 0xce, 0x50, 0x66, 0xda, 0xb3, - 0xaa, 0xae, 0x89, 0xee, 0x70, 0x41, 0x68, 0x07, 0x0a, 0xf9, 0xfe, 0xda, - 0xb7, 0x65, 0xd7, 0x14, 0x00, 0xc7, 0x9f, 0xd5, 0xae, 0x54, 0x3d, 0x80, - 0xab, 0x7c, 0xb8, 0x55, 0x64, 0xc0, 0x5a, 0x77, 0xae, 0x74, 0xff, 0x37, - 0xbf, 0x1c, 0xd0, 0x71, 0x6d, 0x15, 0x60, 0x9f, 0x88, 0xc1, 0xd3, 0xd9, - 0xa5, 0x3f, 0x39, 0x9d, 0xf8, 0x68, 0xd2, 0xdf, 0x45, 0xbd, 0x77, 0x0b, - 0x58, 0x08, 0xe4, 0x19, 0x3b, 0x77, 0x4a, 0xf6, 0xf6, 0x6d, 0x80, 0x41, - 0xf9, 0xb1, 0x09, 0x94, 0x60, 0x62, 0xd0, 0x45, 0xef, 0x7f, 0x72, 0xc8, - 0x12, 0x89, 0x56, 0xe7, 0xb0, 0x23, 0x8d, 0xb8, 0xde, 0x75, 0xfa, 0x62, - 0x5f, 0x53, 0xb2, 0x73, 0x48, 0x84, 0xee, 0x36, 0x3c, 0x4b, 0x1e, 0x8f, - 0x08, 0x3d, 0xb4, 0xa7, 0xa9, 0x02, 0xee, 0xb1, 0x59, 0xb5, 0xbd, 0xe5, - 0x81, 0x81, 0x8b, 0xb4, 0xf1, 0x44, 0x44, 0xa6, 0x04, 0x9e, 0x2f, 0x24, - 0xa6, 0x65, 0xf5, 0x1f, 0x3e, 0x1b, 0x7d, 0x56, 0x6d, 0x3c, 0x3e, 0x51, - 0xe2, 0x29, 0xdf, 0x40, 0x6e, 0x9f, 0x22, 0x5f, 0xe4, 0x93, 0x72, 0x2c, - 0x11, 0x1d, 0xf6, 0xef, 0xbe, 0x24, 0xd2, 0xde, 0xe0, 0xbc, 0xa4, 0x5b, - 0x9b, 0x38, 0xf6, 0x6a, 0x68, 0x6c, 0xea, 0x31, 0x2c, 0xb2, 0x3b, 0x9d, - 0xde, 0x11, 0x55, 0xb0, 0x5d, 0x89, 0x88, 0x2d, 0x3d, 0x1c, 0x5d, 0xda, - 0xf6, 0x09, 0x8b, 0x42, 0xd6, 0x1e, 0xc0, 0x4e, 0xe0, 0xf4, 0xea, 0xe7, - 0xf9, 0x2f, 0x98, 0xef, 0x6d, 0x6c, 0xb6, 0xfb, 0x4b, 0x4a, 0xb5, 0x69, - 0x73, 0x37, 0x4f, 0xa7, 0x41, 0x16, 0xcb, 0x53, 0xa5, 0x63, 0x2a, 0x2f, - 0x0f, 0x55, 0xe6, 0x80, 0x12, 0x35, 0xcc, 0xcc, 0x06, 0x84, 0xec, 0x65, - 0x5c, 0x5f, 0x6f, 0xe8, 0x70, 0xb2, 0xff, 0x6e, 0x97, 0xa9, 0xe7, 0x08, - 0xf5, 0xbb, 0x7e, 0xd2, 0x78, 0xb6, 0x05, 0x1b, 0xaf, 0x08, 0xce, 0xb0, - 0x92, 0xdb, 0x25, 0x40, 0x11, 0x26, 0x21, 0xac, 0x0b, 0xeb, 0x15, 0x65, - 0x85, 0x86, 0xde, 0xe4, 0xb7, 0xef, 0xea, 0xcf, 0xa2, 0xd7, 0x59, 0xec, - 0x6e, 0x01, 0xd2, 0x6d, 0x4d, 0x2e, 0xfa, 0x5f, 0x21, 0xe7, 0x16, 0x1a, - 0xea, 0x18, 0xe4, 0x30, 0x9e, 0x99, 0x28, 0xc2, 0x92, 0x7b, 0xd6, 0x97, - 0x2d, 0xc0, 0x7f, 0xf6, 0x61, 0x68, 0xe0, 0xcc, 0x56, 0x82, 0x5a, 0x22, - 0x1f, 0xc3, 0x22, 0xbf, 0x6f, 0x13, 0x27, 0x19, 0x06, 0x3a, 0x57, 0xd3, - 0xb7, 0x04, 0x45, 0xe6, 0x62, 0xac, 0x07, 0x05, 0x32, 0x81, 0x1f, 0x78, - 0x3b, 0x8d, 0x7d, 0xd7, 0xff, 0x1b, 0xe6, 0x42, 0x5a, 0x55, 0x6f, 0xc0, - 0x24, 0x5e, 0x1e, 0x82, 0x73, 0x92, 0x7d, 0xf5, 0xca, 0xd9, 0x02, 0xb6, - 0x9f, 0x61, 0xd6, 0xcb, 0x5e, 0x80, 0x0c, 0x9b, 0xac, 0x37, 0xa5, 0xc6, - 0xbf, 0x8f, 0xa3, 0x1a, 0x9f, 0x96, 0xc2, 0xda, 0xe8, 0xbc, 0x3d, 0x44, - 0xab, 0x8e, 0x45, 0x30, 0xb4, 0xef, 0x96, 0xf4, 0x5a, 0xff, 0x7a, 0x81, - 0x79, 0xee, 0x22, 0x02, 0xd4, 0x80, 0xdc, 0x10, 0xf5, 0x38, 0x04, 0x28, - 0x5d, 0xc2, 0x1c, 0x9c, 0x1a, 0x22, 0x29, 0x1b, 0x7f, 0x25, 0x67, 0xe7, - 0x37, 0xb6, 0x3b, 0xbb, 0x09, 0x9b, 0xbd, 0x00, 0xca, 0xec, 0x99, 0x4f, - 0x81, 0x9d, 0xc7, 0x92, 0xad, 0x17, 0x21, 0x51, 0x65, 0x3b, 0x89, 0x7e, - 0x5e, 0xeb, 0xe9, 0x32, 0xc0, 0xb8, 0x22, 0xb4, 0xaf, 0x5e, 0x08, 0x67, - 0xf4, 0x48, 0x69, 0x25, 0xf0, 0x13, 0xcd, 0xbe, 0x7b, 0x80, 0x53, 0x5e, - 0xde, 0xc8, 0xc1, 0xd2, 0x57, 0x24, 0xad, 0xf3, 0x55, 0x6e, 0x2e, 0x2f, - 0x4c, 0x4a, 0xf4, 0xa6, 0xe7, 0x61, 0xe9, 0xb5, 0xed, 0x3f, 0xb6, 0x94, - 0xd9, 0x1e, 0xc6, 0x46, 0x2b, 0x8d, 0xaf, 0xde, 0xf0, 0xd5, 0x4b, 0x2c, - 0x54, 0x62, 0x5e, 0xa8, 0x31, 0xa5, 0x63, 0x24, 0x18, 0x96, 0x93, 0x7d, - 0x8f, 0x41, 0xfd, 0x2c, 0x11, 0xec, 0xe2, 0x63, 0x1e, 0x3f, 0xf2, 0x92, - 0xd0, 0xa7, 0xa2, 0x81, 0xfb, 0x9c, 0x77, 0xc0, 0x26, 0x2f, 0x44, 0x80, - 0x87, 0xc5, 0x42, 0x62, 0x21, 0xdb, 0xaa, 0x4d, 0xc9, 0x33, 0xc1, 0x5b, - 0x97, 0x37, 0xcc, 0x9a, 0xc4, 0xc7, 0xfd, 0x1e, 0xf8, 0x5b, 0x1a, 0xa7, - 0x97, 0x5c, 0xbb, 0xe3, 0xb8, 0xc0, 0xec, 0x8e, 0xd6, 0x0d, 0x31, 0xe7, - 0x1c, 0x0c, 0x9b, 0x37, 0xc7, 0x81, 0x61, 0xc8, 0xb1, 0xbb, 0x26, 0x4b, - 0x23, 0x4f, 0xdd, 0xe8, 0x40, 0x1c, 0x08, 0x18, 0x16, 0xa4, 0xe7, 0x64, - 0x46, 0x69, 0x81, 0xf9, 0xf4, 0xf3, 0xa6, 0x5e, 0x33, 0x3d, 0x6e, 0xdf, - 0x1b, 0x6b, 0x9f, 0xe0, 0xfc, 0x68, 0xfd, 0xf1, 0xc9, 0x32, 0xc3, 0x4a, - 0x75, 0xe8, 0xf9, 0x52, 0x31, 0x85, 0x71, 0xa8, 0x59, 0xe5, 0x52, 0x3e, - 0x5c, 0x76, 0x18, 0x9e, 0xf1, 0x4e, 0x50, 0x1b, 0xb8, 0x6a, 0xeb, 0x79, - 0xef, 0x94, 0xd0, 0xfa, 0xb9, 0x2c, 0x8a, 0x8c, 0x47, 0xf0, 0x9d, 0xc0, - 0x3d, 0xc8, 0xe3, 0xc1, 0xcc, 0x61, 0xc8, 0x7f, 0x68, 0xd4, 0x18, 0x04, - 0x74, 0x66, 0x5a, 0xbb, 0xef, 0xd7, 0x3e, 0x41, 0xfa, 0x08, 0x79, 0xf0, - 0xc3, 0x4a, 0x32, 0x90, 0x40, 0x52, 0xee, 0x2d, 0xb4, 0x22, 0x70, 0xee, - 0xa5, 0xe1, 0xf5, 0xd2, 0xd4, 0x66, 0x81, 0x6d, 0x92, 0xff, 0x5f, 0x96, - 0x19, 0xc6, 0x8b, 0x11, 0x03, 0x02, 0x59, 0xfe, 0x55, 0xd6, 0x18, 0x59, - 0xec, 0x97, 0x92, 0x24, 0x77, 0x6b, 0xc9, 0x59, 0xd4, 0xfa, 0x1a, 0x39, - 0xae, 0x2a, 0x57, 0x3f, 0xda, 0xe4, 0x03, 0xce, 0x7e, 0x73, 0xfd, 0xd5, - 0x81, 0x38, 0xc1, 0x24, 0x1d, 0x6d, 0xa3, 0xc0, 0x9f, 0x28, 0xbf, 0xe6, - 0x29, 0x7c, 0x67, 0xcf, 0xe1, 0x2c, 0x87, 0xe0, 0xf0, 0x7b, 0x5f, 0x41, - 0xc1, 0x26, 0x94, 0xd4, 0x2a, 0x24, 0x27, 0x94, 0xb9, 0xa4, 0xd7, 0xbb, - 0x8f, 0xfa, 0x23, 0x00, 0x8f, 0x4f, 0x7e, 0x3b, 0x27, 0xd2, 0xa0, 0x71, - 0x4b, 0x6b, 0x2b, 0xfa, 0x6a, 0x4b, 0x19, 0x52, 0x03, 0x8a, 0x58, 0x2e, - 0x07, 0x78, 0x9e, 0x1c, 0xe3, 0x0f, 0xc5, 0x54, 0x50, 0x9d, 0x85, 0x69, - 0x07, 0x92, 0xda, 0x10, 0x8d, 0xec, 0x05, 0x94, 0x28, 0xca, 0x8b, 0x9b, - 0x94, 0x52, 0x7b, 0xef, 0x02, 0xf0, 0xbe, 0xf8, 0x49, 0x47, 0xd7, 0xa7, - 0xf5, 0xaf, 0xed, 0xf1, 0x96, 0x67, 0xa4, 0xa2, 0xb8, 0x0f, 0x7e, 0x0c, - 0x27, 0x3a, 0x71, 0x00, 0x32, 0xaa, 0x28, 0xa2, 0x73, 0xef, 0xc8, 0x05, - 0x87, 0x1c, 0x6f, 0x6d, 0x8b, 0xae, 0x5e, 0x4b, 0x8b, 0xe4, 0x5f, 0x01, - 0xeb, 0x58, 0x6e, 0xe9, 0x2c, 0xd0, 0xd4, 0xed, 0xb8, 0x3f, 0x19, 0x58, - 0x18, 0x78, 0x95, 0xee, 0x31, 0x6d, 0xb6, 0xca, 0x6b, 0x7c, 0xa2, 0x2a, - 0x6d, 0x5e, 0x94, 0x18, 0x57, 0x35, 0x39, 0x82, 0x56, 0x77, 0xeb, 0x7d, - 0xbd, 0x88, 0x2e, 0x0e, 0x1c, 0x13, 0x07, 0x61, 0xae, 0x93, 0x39, 0x57, - 0x21, 0xff, 0xba, 0x96, 0xa1, 0x29, 0x9b, 0x73, 0x14, 0xac, 0x26, 0xf7, - 0xa0, 0x17, 0x67, 0xb2, 0x5f, 0x3a, 0x1b, 0x54, 0x53, 0x6a, 0x26, 0x4d, - 0xb1, 0xfd, 0xdf, 0x6c, 0x8d, 0xa2, 0xbd, 0x8f, 0x4e, 0x2d, 0x01, 0x9e, - 0xf1, 0xcb, 0xff, 0x37, 0x90, 0xbc, 0x0f, 0xee, 0xa0, 0x26, 0x45, 0x74, - 0xd6, 0x4e, 0xcd, 0xe1, 0x94, 0xc9, 0x9d, 0xcc, 0xb9, 0xd5, 0x56, 0x3a, - 0x58, 0x43, 0x32, 0xa3, 0x74, 0x63, 0x06, 0x12, 0xc0, 0x59, 0xc1, 0x39, - 0xdc, 0x47, 0x25, 0x64, 0x58, 0xed, 0xfc, 0x6f, 0xba, 0x57, 0xee, 0x02, - 0xda, 0x18, 0x80, 0x9b, 0x3a, 0x92, 0x38, 0xf2, 0x37, 0x6a, 0x69, 0x12, - 0xb7, 0xc4, 0x41, 0x94, 0xb8, 0x98, 0xdf, 0x6e, 0x7b, 0x41, 0x04, 0x86, - 0xd9, 0x96, 0xf4, 0x52, 0xa0, 0x1b, 0x95, 0x05, 0xbf, 0xf6, 0xc8, 0x78, - 0x7a, 0x19, 0x7a, 0x64, 0x3e, 0x95, 0x6e, 0x9e, 0xa0, 0xe2, 0xb9, 0x60, - 0x83, 0xbf, 0xea, 0x93, 0x87, 0x0b, 0x39, 0xc9, 0x08, 0xf9, 0x91, 0xe2, - 0xf3, 0x00, 0x39, 0x0b, 0xee, 0xdf, 0x56, 0x6d, 0x26, 0xaa, 0x9f, 0x24, - 0xac, 0xb2, 0xc3, 0x15, 0x4f, 0x03, 0x10, 0x8f, 0x41, 0x02, 0xf4, 0x75, - 0x0b, 0xde, 0xa6, 0x9b, 0x50, 0x5a, 0x56, 0xac, 0x49, 0x88, 0x8c, 0x98, - 0xe1, 0x0c, 0xc5, 0x70, 0x14, 0x61, 0x7a, 0xca, 0xa8, 0x0e, 0x14, 0xf5, - 0xf4, 0x0f, 0xae, 0x48, 0x18, 0xe4, 0x99, 0xa1, 0xf0, 0xa3, 0xf6, 0xa3, - 0x7b, 0xb8, 0xf5, 0xc7, 0x35, 0x87, 0x1f, 0xb1, 0xb8, 0x23, 0x07, 0xfa, - 0xd3, 0xc1, 0xfb, 0x79, 0xfa, 0x3d, 0x29, 0xa6, 0x9e, 0x6b, 0x53, 0xf8, - 0x58, 0xfd, 0xb0, 0x1c, 0x3a, 0x4c, 0x62, 0x5e, 0x49, 0xc5, 0xa7, 0x1f, - 0xc3, 0xdd, 0x86, 0x66, 0xd8, 0x58, 0x57, 0xdd, 0x6d, 0x82, 0x58, 0x0e, - 0x02, 0x2b, 0x16, 0xe2, 0x37, 0x2a, 0xfd, 0x98, 0xf9, 0xa0, 0x8b, 0xed, - 0xba, 0x05, 0xda, 0xc6, 0xb8, 0x65, 0x19, 0xca, 0x0c, 0xfc, 0xd7, 0xbf, - 0xd9, 0xe8, 0xc0, 0x49, 0x19, 0x3f, 0x36, 0x2d, 0x44, 0x9a, 0xd6, 0xaa, - 0x26, 0xdc, 0x59, 0x0f, 0x22, 0xa3, 0xf6, 0xf5, 0x63, 0x50, 0x76, 0xe3, - 0x28, 0xd7, 0x20, 0x16, 0x0b, 0xb9, 0x65, 0xf8, 0xca, 0x67, 0xc2, 0xa6, - 0x89, 0x9f, 0x63, 0x65, 0xdd, 0x64, 0x25, 0x50, 0xee, 0x09, 0x11, 0x49, - 0xb9, 0x63, 0x8b, 0x7c, 0x36, 0x59, 0xa1, 0xe8, 0x34, 0x91, 0x65, 0xb6, - 0x52, 0xf3, 0x69, 0x5c, 0xb7, 0xef, 0xc9, 0xd7, 0x58, 0xa1, 0x66, 0x69, - 0xed, 0x87, 0x24, 0x9d, 0xde, 0x2f, 0x8e, 0x44, 0x43, 0xaa, 0xed, 0x2f, - 0x76, 0x19, 0xe1, 0x96, 0x4b, 0x03, 0x11, 0x33, 0xa6, 0xe9, 0x45, 0x15, - 0xa9, 0xa8, 0x18, 0x02, 0xd7, 0xb8, 0x6e, 0x00, 0x2c, 0x23, 0x1c, 0x2d, - 0x37, 0x05, 0x02, 0x00, 0x93, 0x71, 0x67, 0xf2, 0x51, 0x65, 0xfb, 0x56, - 0x2d, 0x4a, 0x79, 0xdd, 0xb7, 0x08, 0x79, 0xc2, 0x1d, 0xac, 0x8b, 0x5f, - 0xb6, 0x1d, 0x12, 0x6a, 0x05, 0xb0, 0xb6, 0xe8, 0x8a, 0x88, 0x13, 0xc5, - 0xd9, 0x33, 0x0d, 0x69, 0x98, 0xec, 0x53, 0xbf, 0xaa, 0xcd, 0x06, 0x66, - 0x74, 0x94, 0x23, 0x8f, 0x82, 0xcf, 0xd2, 0x7f, 0xa5, 0x71, 0x96, 0x3b, - 0xdb, 0xf5, 0x7d, 0xbf, 0x68, 0xdc, 0xf6, 0x2a, 0xae, 0xb0, 0x9a, 0x0d, - 0x48, 0xc4, 0xa5, 0x33, 0xfa, 0xc1, 0xd0, 0x6f, 0x3c, 0x28, 0x2b, 0xc5, - 0xfd, 0x30, 0x08, 0xa5, 0xb5, 0x13, 0xcf, 0x63, 0x5a, 0x60, 0xac, 0x37, - 0x8f, 0x75, 0xf8, 0xb6, 0x30, 0xfc, 0x0b, 0x4a, 0x33, 0xfd, 0x69, 0x78, - 0xd0, 0x4c, 0x05, 0x2c, 0x37, 0xec, 0x5c, 0x27, 0xaf, 0x99, 0x23, 0x51, - 0xa9, 0x65, 0x77, 0x95, 0x5c, 0x76, 0xea, 0x2f, 0xb3, 0xb0, 0xfa, 0x75, - 0x40, 0x3b, 0x50, 0xa0, 0xe8, 0xff, 0x6c, 0xf1, 0x45, 0x99, 0xca, 0x79, - 0xf6, 0x4f, 0x18, 0xb6, 0xec, 0x78, 0xfe, 0x5d, 0x1d, 0x2b, 0x50, 0xce, - 0xd8, 0x95, 0x82, 0xeb, 0xf8, 0xc9, 0xb7, 0x57, 0x73, 0xec, 0x20, 0x2c, - 0x97, 0xa6, 0x53, 0x91, 0x0a, 0xce, 0xee, 0x5e, 0x2d, 0xfb, 0x48, 0x4f, - 0x3c, 0xb7, 0x3c, 0xdf, 0xb1, 0xe6, 0x32, 0x70, 0x3b, 0x36, 0x4e, 0x0d, - 0x5a, 0x60, 0x3a, 0x21, 0x8d, 0x13, 0x7b, 0x3f, 0xd1, 0x86, 0x5b, 0x12, - 0x37, 0xfd, 0x48, 0x83, 0x5a, 0x0e, 0xcd, 0x87, 0x68, 0x3e, 0x90, 0x6c, - 0x35, 0xc3, 0xa0, 0x92, 0xcd, 0x70, 0xc8, 0x45, 0xc7, 0x1d, 0x1d, 0xc7, - 0xdd, 0xc2, 0xf6, 0xc8, 0x8b, 0xf7, 0xcb, 0x9d, 0x6d, 0x0a, 0x9b, 0x4b, - 0xc6, 0x2e, 0xc3, 0x29, 0x69, 0x9e, 0x43, 0x5c, 0x36, 0x6b, 0xc2, 0x82, - 0xe5, 0x03, 0x8c, 0x71, 0xb3, 0x0a, 0x88, 0xe4, 0x0e, 0xf2, 0x0e, 0xeb, - 0xa8, 0x73, 0x50, 0xd9, 0x45, 0x3d, 0x6f, 0x67, 0x03, 0x0a, 0x3b, 0x49, - 0x78, 0xbc, 0xf3, 0x59, 0xb3, 0xe4, 0xd6, 0x3f, 0xcd, 0x80, 0xec, 0x70, - 0x95, 0x26, 0x41, 0x94, 0x20, 0x4d, 0x7f, 0x7e, 0xdd, 0xa0, 0x8f, 0xf9, - 0xfe, 0xac, 0xd4, 0xf0, 0xbd, 0x71, 0x6a, 0x0f, 0x39, 0xd4, 0xec, 0xa1, - 0x8a, 0x79, 0x6d, 0x1a, 0x46, 0x8c, 0xf1, 0xbd, 0x76, 0xc1, 0x08, 0x79, - 0x73, 0xf5, 0x43, 0x0d, 0x47, 0x15, 0x6b, 0x66, 0x3e, 0x12, 0xff, 0x74, - 0x6c, 0x21, 0x15, 0xd6, 0x73, 0x3d, 0x90, 0x37, 0xae, 0x97, 0x2f, 0x0b, - 0xd6, 0xf3, 0x2f, 0x80, 0xfe, 0x42, 0x39, 0xc7, 0xa0, 0x80, 0x06, 0x49, - 0xf0, 0x40, 0xfa, 0x1c, 0x6d, 0x7a, 0x6b, 0x10, 0x00, 0x78, 0x6a, 0xb5, - 0x4a, 0x08, 0x8a, 0x99, 0xf4, 0x17, 0x04, 0xb8, 0x2d, 0x8d, 0xef, 0xa4, - 0xfa, 0x4a, 0xf0, 0xeb, 0x59, 0x40, 0xb3, 0xef, 0xec, 0xfd, 0x2c, 0xa5, - 0x68, 0xba, 0x6c, 0x1c, 0xf1, 0xe0, 0xaa, 0x5c, 0xaf, 0x2a, 0x3f, 0xd7, - 0x2c, 0xb3, 0xab, 0x79, 0x55, 0x6c, 0x13, 0x8f, 0x24, 0x1b, 0xa1, 0xb1, - 0x6c, 0x6c, 0x02, 0x77, 0x3b, 0x0c, 0x36, 0x16, 0xfd, 0x16, 0x36, 0xd1, - 0x61, 0x8b, 0xe7, 0x1e, 0x8d, 0x27, 0xa8, 0x89, 0xcc, 0x00, 0xb8, 0x68, - 0x38, 0xac, 0x19, 0x04, 0x3a, 0xea, 0x3e, 0x31, 0x09, 0x15, 0x09, 0xe9, - 0x67, 0x48, 0x8a, 0x49, 0x86, 0xdf, 0x40, 0x20, 0xd3, 0x94, 0xb7, 0xa8, - 0x13, 0x2a, 0xbb, 0x6c, 0xfd, 0xaa, 0xc6, 0xb2, 0xc2, 0x38, 0x4a, 0x0a, - 0x08, 0xd1, 0x06, 0x29, 0xb7, 0x58, 0x99, 0xe2, 0xbb, 0x1e, 0xa3, 0xca, - 0xb1, 0x36, 0x86, 0x47, 0x9e, 0x14, 0x91, 0xc1, 0x2a, 0x48, 0xed, 0xfd, - 0x37, 0xb8, 0x36, 0x21, 0x6c, 0x6e, 0x48, 0x76, 0x81, 0xe9, 0xb4, 0x1e, - 0x9b, 0x81, 0x58, 0xb9, 0xe4, 0x3d, 0x5a, 0x96, 0x17, 0xae, 0x23, 0xc5, - 0xcd, 0x5e, 0x4d, 0x9f, 0x09, 0xda, 0x5b, 0x15, 0x6b, 0xb9, 0xbb, 0x1e, - 0xd4, 0xaa, 0xea, 0xc1, 0x47, 0x01, 0x7f, 0x92, 0x0e, 0x7a, 0x94, 0xee, - 0xbe, 0x42, 0xa1, 0x71, 0x5f, 0x4d, 0x63, 0xde, 0x8a, 0x40, 0xe5, 0x68, - 0xe8, 0x6f, 0xaf, 0xb2, 0xbf, 0x63, 0xbb, 0x75, 0x0b, 0x4a, 0xce, 0xb5, - 0x57, 0x71, 0x2d, 0x33, 0x98, 0x8c, 0x92, 0x9f, 0xc7, 0x9f, 0xe8, 0x07, - 0xf5, 0xd0, 0xa8, 0x2c, 0x41, 0x5e, 0x25, 0x30, 0x3d, 0x3f, 0x25, 0x89, - 0xd4, 0xd4, 0x33, 0x4e, 0x19, 0x22, 0x54, 0xbb, 0xef, 0x56, 0x01, 0x17, - 0xc1, 0x87, 0x62, 0x13, 0x96, 0xa9, 0x09, 0xe9, 0x31, 0x3e, 0x28, 0x67, - 0xee, 0xb0, 0xd2, 0x78, 0x7e, 0x2f, 0x49, 0xab, 0xb4, 0xb0, 0x3b, 0x75, - 0xf5, 0xf2, 0xaa, 0x08, 0x66, 0xdb, 0x3b, 0x34, 0x79, 0xac, 0x1c, 0x45, - 0xb3, 0xb9, 0x99, 0xdc, 0x8a, 0x03, 0x9b, 0x36, 0x08, 0x4f, 0xe8, 0x54, - 0x3c, 0x09, 0xe9, 0x59, 0x8c, 0x56, 0xd8, 0xa6, 0xf7, 0x67, 0x4e, 0x20, - 0xcc, 0x80, 0xd3, 0x1a, 0x68, 0xa3, 0x12, 0x95, 0xa5, 0x4f, 0x14, 0x0a, - 0xe4, 0xd8, 0x4e, 0x85, 0xbc, 0x60, 0x3a, 0xd2, 0x6d, 0xd6, 0xf1, 0xbc, - 0xcd, 0x1a, 0xa2, 0x5e, 0x37, 0xae, 0x0e, 0xec, 0xbd, 0x7e, 0xf7, 0xe1, - 0x67, 0x62, 0x2c, 0x58, 0x3b, 0x99, 0x2e, 0xec, 0x44, 0xb1, 0x39, 0x2c, - 0x09, 0x1a, 0x57, 0x2b, 0x4b, 0x41, 0xda, 0xcd, 0x61, 0x3f, 0x8e, 0x82, - 0x08, 0x24, 0x51, 0x35, 0x1d, 0x79, 0x4c, 0x80, 0x77, 0x39, 0x06, 0xd4, - 0x40, 0x47, 0x96, 0x9d, 0xc1, 0xb9, 0xae, 0x94, 0xb3, 0xd9, 0x1a, 0x27, - 0xfb, 0x9f, 0xee, 0x82, 0xaf, 0xfb, 0xc0, 0x32, 0x72, 0xcd, 0x21, 0x20, - 0xc5, 0x55, 0x86, 0x9c, 0xa2, 0x81, 0xc0, 0x62, 0xdf, 0x5a, 0x16, 0x43, - 0xdd, 0x37, 0xfe, 0xd1, 0x2a, 0x33, 0xef, 0x71, 0x22, 0xc0, 0x94, 0x94, - 0x81, 0x82, 0xe3, 0xe2, 0x3f, 0x64, 0x0a, 0x5b, 0x1a, 0x4c, 0xd3, 0xb3, - 0x16, 0x3d, 0x34, 0xf6, 0x14, 0xb2, 0x61, 0xc3, 0x15, 0x20, 0x9c, 0x80, - 0x6d, 0x23, 0xde, 0x9e, 0xb7, 0xe3, 0xbc, 0x1e, 0x39, 0xe0, 0x22, 0xa1, - 0x11, 0x56, 0x03, 0xf2, 0x6d, 0x6e, 0x39, 0xde, 0x50, 0x07, 0x61, 0x92, - 0x86, 0x96, 0x4d, 0xee, 0x9b, 0x3e, 0xbd, 0xcc, 0xe7, 0x02, 0xdf, 0xce, - 0xca, 0x46, 0x71, 0xc2, 0x64, 0x6b, 0x9c, 0x0a, 0x78, 0xae, 0x0e, 0xde, - 0x10, 0x3c, 0x68, 0x28, 0xbe, 0xab, 0x94, 0xf9, 0xe3, 0xa9, 0xe8, 0x9c, - 0x67, 0x0d, 0xa9, 0x48, 0xf0, 0x55, 0x0e, 0x4a, 0x7d, 0x3f, 0x03, 0x3a, - 0x6b, 0x30, 0x8b, 0xf8, 0x2e, 0x81, 0x2e, 0xc4, 0xd6, 0x9a, 0xfa, 0xb9, - 0x65, 0xe1, 0x95, 0xad, 0x1e, 0x5e, 0x0d, 0xae, 0x04, 0x92, 0x45, 0x22, - 0x69, 0x6e, 0xb3, 0x68, 0xe0, 0x97, 0xae, 0xd4, 0xf1, 0xd0, 0xfb, 0xae, - 0x6a, 0x51, 0x90, 0x8d, 0x82, 0x4a, 0xd3, 0x74, 0xbb, 0x51, 0xe3, 0xdc, - 0x2e, 0xd6, 0xba, 0xa6, 0x51, 0x96, 0x07, 0x9d, 0xc4, 0xab, 0xb7, 0xb1, - 0x9e, 0xd1, 0x45, 0xdd, 0x15, 0x94, 0x33, 0x23, 0x9e, 0x7c, 0xfc, 0x8b, - 0x55, 0x8c, 0x47, 0x02, 0xeb, 0xcb, 0x31, 0x6e, 0xbd, 0xc9, 0xae, 0x9c, - 0x62, 0xad, 0x32, 0xa2, 0x46, 0xd2, 0xe3, 0x39, 0x09, 0x7c, 0x97, 0xcd, - 0x20, 0x3a, 0x9c, 0x05, 0xa6, 0x3c, 0xad, 0xc8, 0xb1, 0xa2, 0xa9, 0x24, - 0x9a, 0xd9, 0x6a, 0x3c, 0xaa, 0x9d, 0xcd, 0x93, 0xc0, 0x99, 0x5f, 0x7d, - 0x0b, 0xe3, 0xc2, 0xb2, 0x57, 0x2c, 0x7a, 0x22, 0x4c, 0x99, 0xf6, 0x90, - 0xe9, 0xae, 0x17, 0x94, 0xfb, 0xb1, 0x74, 0x36, 0xcc, 0x13, 0x4b, 0xec, - 0x57, 0x3f, 0x3b, 0x40, 0xbb, 0x03, 0xe5, 0xd7, 0x4f, 0xf8, 0xe8, 0x71, - 0x29, 0x0e, 0x54, 0x9c, 0xe7, 0x5d, 0xc9, 0x81, 0xc7, 0x34, 0x06, 0x49, - 0x14, 0xd7, 0x62, 0x14, 0x30, 0xe8, 0xd3, 0x45, 0x88, 0xcb, 0x05, 0x9f, - 0xed, 0xa2, 0x1c, 0x5e, 0x32, 0x27, 0x11, 0x50, 0xc9, 0x6a, 0x86, 0x89, - 0x33, 0x28, 0x3a, 0xeb, 0x22, 0xe8, 0x29, 0xd8, 0x7b, 0x6d, 0x1a, 0x05, - 0xa4, 0xe8, 0xc7, 0x2e, 0x0c, 0x5d, 0x4a, 0x73, 0x21, 0xa7, 0x04, 0x20, - 0x4c, 0x04, 0x56, 0x90, 0x91, 0xc2, 0xd3, 0x8d, 0xfa, 0x63, 0x23, 0xa2, - 0xb7, 0x45, 0x13, 0x8d, 0x94, 0xd5, 0x34, 0xfd, 0xf3, 0xba, 0x6e, 0xd6, - 0x7a, 0x4f, 0x5c, 0x55, 0xd3, 0x1c, 0x9a, 0x93, 0x47, 0x82, 0x04, 0xb6, - 0x79, 0xd1, 0x0b, 0x90, 0xa7, 0x81, 0x90, 0x12, 0xea, 0x9d, 0xd9, 0x7c, - 0x5f, 0xff, 0x83, 0x10, 0x6b, 0xb7, 0x50, 0xa3, 0x4f, 0xdd, 0xc0, 0xc5, - 0x34, 0x4f, 0x78, 0xef, 0x44, 0x2f, 0x2e, 0x54, 0x15, 0x97, 0x64, 0xdd, - 0x96, 0x6d, 0x7d, 0x53, 0xa5, 0xa7, 0x3b, 0x49, 0xd4, 0x54, 0xf8, 0xc5, - 0x01, 0x99, 0x7a, 0xbc, 0xab, 0x6a, 0xab, 0xca, 0x95, 0x36, 0xe3, 0x8a, - 0x51, 0x24, 0x2f, 0x15, 0x50, 0xf3, 0x02, 0xf0, 0x76, 0x26, 0x38, 0xd3, - 0x0a, 0xdc, 0x35, 0x2d, 0xe4, 0xff, 0x37, 0x7a, 0x45, 0xd4, 0x78, 0xa3, - 0x19, 0x93, 0x91, 0x04, 0x7b, 0x42, 0x95, 0x16, 0x02, 0x99, 0x83, 0x31, - 0x21, 0x0d, 0x23, 0xa0, 0xa1, 0xb6, 0x6b, 0x39, 0x46, 0x1d, 0x85, 0x2c, - 0x2a, 0x0c, 0x89, 0x84, 0xb4, 0x6f, 0xd0, 0xbf, 0xcb, 0x70, 0x18, 0x2e, - 0xd8, 0xfd, 0x18, 0xce, 0xb6, 0xc0, 0xa2, 0xa5, 0x37, 0xdd, 0x40, 0x18, - 0x58, 0xe6, 0xb9, 0xe2, 0xf8, 0x5e, 0xb6, 0x2c, 0x79, 0xda, 0xd5, 0x2f, - 0x82, 0x3e, 0x41, 0x83, 0xab, 0x85, 0x49, 0xe6, 0x92, 0x9c, 0xa6, 0xf1, - 0xf8, 0x6e, 0x1c, 0x7f, 0x0b, 0x2a, 0x4d, 0x5c, 0x0a, 0x8a, 0x21, 0xc3, - 0x33, 0xe3, 0xca, 0x67, 0x79, 0x41, 0x66, 0x3e, 0xe4, 0xd4, 0x18, 0x7a, - 0xef, 0x65, 0x80, 0x47, 0x03, 0x43, 0x6c, 0xa7, 0x0b, 0xad, 0xb4, 0xc1, - 0x97, 0x8b, 0xa5, 0x78, 0xae, 0x6c, 0x6d, 0xf3, 0xc8, 0xbd, 0x58, 0xc3, - 0x69, 0x71, 0x8f, 0x1b, 0x70, 0xbd, 0xb0, 0xb7, 0x38, 0x86, 0xb3, 0xf8, - 0xd0, 0x59, 0x2f, 0x6d, 0x08, 0x49, 0x50, 0x7d, 0x2d, 0xb5, 0xca, 0xc8, - 0x21, 0xdf, 0x50, 0xe6, 0x6d, 0x89, 0x28, 0xa9, 0xc2, 0x07, 0xcf, 0xaf, - 0xd1, 0x95, 0x08, 0xfa, 0xb5, 0x61, 0x86, 0x5a, 0xfd, 0xa9, 0x82, 0xc4, - 0x2d, 0x6e, 0x4c, 0x02, 0xa5, 0x62, 0x36, 0x13, 0x54, 0x35, 0x35, 0x22, - 0x2c, 0x45, 0xc4, 0x10, 0x46, 0x65, 0xbe, 0x8e, 0xd8, 0xe5, 0xce, 0xe9, - 0x77, 0xfe, 0xba, 0x0a, 0xf6, 0x73, 0xe3, 0x9b, 0x8d, 0x70, 0x96, 0xbe, - 0x93, 0xa6, 0xe4, 0x9c, 0x1b, 0x14, 0x6b, 0x6b, 0x0a, 0xbd, 0x7b, 0x82, - 0xd8, 0xf8, 0xaa, 0x66, 0xce, 0x27, 0x9f, 0xdb, 0x81, 0x52, 0xac, 0xfc, - 0x15, 0x65, 0x00, 0x04, 0x5a, 0x8b, 0x5b, 0x20, 0xce, 0xd7, 0x5f, 0xf5, - 0xf5, 0xe3, 0x4b, 0x61, 0x86, 0xc4, 0x97, 0x99, 0xc5, 0xd2, 0x8d, 0x11, - 0xfc, 0x19, 0x81, 0x0a, 0x20, 0xd4, 0x73, 0xcc, 0x2c, 0xc9, 0x38, 0xc2, - 0x46, 0x9e, 0xb2, 0x8a, 0xbe, 0x00, 0xf2, 0x78, 0x55, 0x35, 0x9c, 0x52, - 0x96, 0x19, 0x85, 0x32, 0xc1, 0xea, 0xef, 0x31, 0x67, 0xd2, 0x70, 0xfc, - 0xcf, 0x0f, 0xbf, 0xda, 0x46, 0x44, 0xf5, 0x50, 0x68, 0xf7, 0x95, 0x43, - 0x8c, 0x84, 0x84, 0x47, 0x74, 0x59, 0x74, 0xe8, 0xa2, 0x54, 0x56, 0x73, - 0x25, 0xd4, 0x63, 0xd0, 0xa9, 0xac, 0xb8, 0x18, 0x78, 0x6b, 0x41, 0x98, - 0xef, 0x08, 0xac, 0x94, 0x32, 0xa4, 0x56, 0xcc, 0xe8, 0x2e, 0x9c, 0x4e, - 0x02, 0x43, 0x5e, 0xda, 0xc8, 0xe5, 0x5e, 0x48, 0xf3, 0x1d, 0x9b, 0x7d, - 0x93, 0x16, 0x9e, 0xd2, 0xf5, 0xf6, 0x3a, 0x19, 0x32, 0x87, 0xd4, 0xd8, - 0x47, 0x5f, 0xe6, 0x09, 0x38, 0x75, 0x0f, 0x76, 0x06, 0x12, 0x23, 0x2c, - 0x43, 0x9c, 0xa5, 0x45, 0x48, 0xbf, 0xde, 0xd7, 0x8e, 0x52, 0x93, 0x75, - 0x29, 0x3c, 0x9d, 0xc1, 0xa3, 0x9c, 0x45, 0x69, 0x09, 0xf3, 0x43, 0xd5, - 0x5a, 0xc6, 0xb9, 0xba, 0x9a, 0x9a, 0x7e, 0x51, 0xb9, 0x51, 0x9e, 0xdc, - 0x13, 0x3b, 0x9f, 0xd9, 0xaf, 0xd2, 0x48, 0x9e, 0xea, 0x93, 0x92, 0x6d, - 0x9f, 0x3f, 0x5a, 0x46, 0xa4, 0x9e, 0x2c, 0x96, 0xa6, 0x0a, 0x5e, 0x07, - 0xc5, 0x4e, 0x60, 0x1d, 0xa5, 0xca, 0x41, 0xdd, 0xd1, 0x8c, 0x90, 0x14, - 0xdf, 0xe3, 0x44, 0xe1, 0x43, 0xdc, 0xea, 0x84, 0x91, 0xcf, 0x19, 0x56, - 0xb9, 0x0c, 0xff, 0x08, 0xc9, 0x20, 0xfd, 0x0c, 0x20, 0x85, 0x2a, 0x83, - 0x78, 0xc6, 0xa3, 0xf2, 0x49, 0x35, 0x83, 0xaf, 0xeb, 0x35, 0x06, 0x2f, - 0x9b, 0x19, 0xbe, 0xb6, 0xc3, 0xbc, 0x25, 0xf5, 0x87, 0x52, 0x8d, 0x88, - 0xd3, 0xa6, 0x9a, 0x1f, 0xbb, 0x3f, 0xab, 0x6b, 0x07, 0x7c, 0x0b, 0x7c, - 0x61, 0x28, 0xf0, 0xfe, 0x50, 0xbe, 0xc8, 0xd4, 0xb0, 0xc9, 0x3c, 0x69, - 0x5e, 0x31, 0x7f, 0x4d, 0x73, 0xff, 0x27, 0xd9, 0x50, 0x90, 0x62, 0xf6, - 0xb1, 0x47, 0x6d, 0x07, 0xbc, 0x5d, 0x11, 0x51, 0x38, 0x06, 0xf2, 0x9d, - 0x8e, 0xef, 0x41, 0xe9, 0x88, 0x64, 0x2a, 0x32, 0xcc, 0xcc, 0x41, 0x8c, - 0x75, 0x13, 0x7f, 0x8a, 0x7b, 0x26, 0xac, 0x44, 0x80, 0x03, 0xdb, 0x7f, - 0x6b, 0xf5, 0x67, 0xc2, 0x62, 0xd0, 0x29, 0xf1, 0x16, 0xec, 0x29, 0x8c, - 0x89, 0xc6, 0xe4, 0x7e, 0xd0, 0x1f, 0x89, 0x58, 0x06, 0x0e, 0xc8, 0xf9, - 0xa1, 0xd4, 0x89, 0x96, 0x99, 0x8e, 0xfd, 0xa7, 0x6c, 0x48, 0xb9, 0x76, - 0x6f, 0xff, 0x17, 0xb8, 0x4d, 0x4d, 0x42, 0x65, 0x87, 0x4a, 0x48, 0xa4, - 0x2a, 0x95, 0x55, 0x07, 0xaf, 0xa8, 0x60, 0x3f, 0xad, 0x2a, 0x89, 0x7c, - 0x00, 0xba, 0x82, 0x13, 0x98, 0x08, 0x72, 0x3a, 0xc3, 0xd5, 0xfa, 0xb6, - 0xb6, 0x61, 0x35, 0xfe, 0xcb, 0x02, 0x5e, 0xef, 0x70, 0x69, 0x8b, 0xa4, - 0xe2, 0x62, 0x34, 0x52, 0x5d, 0x72, 0xde, 0x15, 0x70, 0x51, 0x74, 0x04, - 0x05, 0x05, 0xba, 0x3c, 0x23, 0x24, 0x62, 0x5e, 0x15, 0x44, 0x69, 0x61, - 0xe0, 0xee, 0x66, 0x85, 0xe5, 0xb7, 0x6f, 0x4f, 0x11, 0xa5, 0xa2, 0x66, - 0x46, 0x69, 0x2d, 0xc9, 0x78, 0x20, 0x79, 0x5c, 0xac, 0xb7, 0xb9, 0x6e, - 0x3a, 0xbd, 0x29, 0x9e, 0xd8, 0x3d, 0xb3, 0xb4, 0xc2, 0x68, 0xc2, 0x78, - 0xe6, 0x4b, 0x9a, 0x75, 0xf3, 0x88, 0xfe, 0x67, 0x78, 0x4c, 0x9b, 0xde, - 0xa9, 0x9b, 0xee, 0x07, 0xb4, 0x72, 0x6d, 0xa6, 0x14, 0xc1, 0x5a, 0x3e, - 0x7d, 0x19, 0x38, 0x98, 0x08, 0x93, 0x1b, 0x64, 0xec, 0xb2, 0xb8, 0x14, - 0x66, 0xec, 0x09, 0x9e, 0x6b, 0xf9, 0xd9, 0xb4, 0x34, 0xc4, 0x39, 0x7b, - 0x22, 0xf2, 0x6e, 0xd0, 0x06, 0x49, 0x52, 0x7f, 0x9a, 0x5c, 0xa3, 0x3b, - 0xa3, 0x3d, 0xcb, 0xb2, 0xe5, 0xd8, 0xfb, 0x43, 0x3e, 0x4d, 0xa4, 0xb0, - 0x70, 0x93, 0xec, 0x27, 0xf1, 0x7e, 0x6d, 0xee, 0x70, 0x35, 0x96, 0x4e, - 0x6e, 0xfc, 0x3b, 0xa6, 0x84, 0x29, 0xac, 0x8e, 0x38, 0x58, 0xc3, 0x93, - 0x28, 0xf6, 0xf1, 0x74, 0x14, 0x1a, 0x1e, 0xb3, 0x86, 0x97, 0x3e, 0x42, - 0x2e, 0x00, 0xf6, 0x82, 0x4d, 0xaa, 0xa9, 0x2d, 0xea, 0xd2, 0xd0, 0xe9, - 0x54, 0x10, 0x4c, 0xbc, 0x61, 0xc3, 0xe1, 0x03, 0x58, 0x2a, 0x3a, 0xaa, - 0x2f, 0x28, 0xcf, 0x0e, 0x98, 0x36, 0xac, 0x15, 0x20, 0x65, 0xd8, 0x49, - 0x9a, 0xe9, 0x28, 0xbd, 0x47, 0xf6, 0xc5, 0x25, 0x26, 0x36, 0x94, 0x29, - 0x51, 0x52, 0x91, 0xdd, 0xc0, 0xbd, 0xf8, 0x6e, 0xdc, 0xcc, 0x61, 0x7f, - 0xde, 0x83, 0x5e, 0x99, 0x4d, 0x60, 0x58, 0xa1, 0x81, 0xc6, 0x9c, 0xda, - 0xc8, 0x0a, 0x20, 0x55, 0x0b, 0x60, 0x5b, 0xc2, 0xc3, 0x80, 0x5b, 0xc9, - 0x52, 0xe4, 0x6c, 0xb5, 0xfd, 0xaf, 0x23, 0xb9, 0x98, 0x72, 0x9d, 0x6d, - 0xcc, 0xa0, 0xa7, 0xa8, 0x6d, 0x8c, 0x9e, 0xac, 0xee, 0x71, 0xe4, 0xf0, - 0x40, 0x7c, 0x77, 0xa8, 0x94, 0x91, 0xc8, 0x31, 0x3c, 0x15, 0x6a, 0x23, - 0xe3, 0x02, 0x49, 0xa5, 0x99, 0x78, 0x08, 0x6b, 0x18, 0x8e, 0x21, 0x50, - 0x4a, 0x49, 0x4e, 0xa6, 0xe7, 0xfd, 0x6c, 0xfa, 0xdd, 0xfd, 0x19, 0xc8, - 0x54, 0x0b, 0xaf, 0x3a, 0x4a, 0xa4, 0x56, 0x65, 0x8e, 0x68, 0xaa, 0x35, - 0x82, 0xd7, 0xb4, 0xda, 0x7c, 0x88, 0xa9, 0xe4, 0x0b, 0xdc, 0x3e, 0xcd, - 0xf9, 0x89, 0xdf, 0xf9, 0x93, 0x92, 0x37, 0x0d, 0x39, 0xef, 0xe7, 0xf0, - 0xc2, 0xf3, 0x52, 0x9e, 0x52, 0xdd, 0x75, 0x36, 0x1b, 0x2b, 0xd9, 0x3a, - 0xcf, 0x3a, 0xf9, 0xb8, 0x61, 0x42, 0xbb, 0xd8, 0x00, 0x28, 0x90, 0xe9, - 0x44, 0x1e, 0xd9, 0xae, 0xad, 0xb3, 0xf7, 0x45, 0x42, 0x50, 0x73, 0xcf, - 0x7d, 0x71, 0x28, 0x63, 0x2e, 0x72, 0x57, 0x0f, 0xff, 0x88, 0x8a, 0x44, - 0x4d, 0xe4, 0x32, 0x53, 0x6a, 0x4e, 0xea, 0x91, 0xba, 0x5c, 0x13, 0x03, - 0xdf, 0xcc, 0x58, 0xdf, 0xa5, 0x05, 0x4c, 0x96, 0x10, 0xb4, 0x52, 0x74, - 0xb9, 0x03, 0x1f, 0x97, 0xaa, 0xef, 0x9d, 0xc0, 0xfe, 0xb5, 0xb2, 0x1a, - 0xc4, 0x1d, 0xf0, 0xb9, 0xa7, 0xa1, 0xc6, 0xd2, 0x59, 0xc7, 0xe8, 0x24, - 0x85, 0x04, 0xcd, 0x91, 0xca, 0xc1, 0x02, 0x29, 0xa7, 0xac, 0x58, 0xfa, - 0x6f, 0xf5, 0x1e, 0x03, 0x53, 0xe3, 0x88, 0xee, 0x3f, 0x85, 0xd2, 0x0e, - 0x03, 0x8e, 0x3f, 0x45, 0xd5, 0x18, 0x37, 0xbc, 0xe1, 0xf8, 0xf4, 0x59, - 0x17, 0x29, 0xe2, 0x63, 0x22, 0xa2, 0xb4, 0x25, 0xa2, 0x4b, 0x0e, 0x0e, - 0x8d, 0xf1, 0x43, 0x2e, 0x42, 0x11, 0x44, 0x58, 0xb8, 0x94, 0xbb, 0x18, - 0xbf, 0x99, 0xde, 0x13, 0x38, 0xe4, 0xa8, 0xbb, 0xb2, 0xf4, 0x35, 0xbc, - 0x53, 0x4d, 0x97, 0xcd, 0x0b, 0xab, 0xbe, 0xe5, 0x85, 0x75, 0x53, 0xbb, - 0x75, 0x3a, 0xd7, 0x5a, 0xfe, 0x53, 0x28, 0x35, 0x1a, 0xf6, 0xc7, 0x35, - 0x7f, 0xcc, 0xf1, 0xb8, 0x29, 0x2c, 0x60, 0x09, 0xc4, 0xac, 0xb2, 0x5a, - 0xe6, 0x73, 0xb8, 0xe3, 0xd4, 0x98, 0x2d, 0xeb, 0xbb, 0xfe, 0xe5, 0x20, - 0xf9, 0xf7, 0x82, 0x3b, 0xd6, 0xd1, 0x09, 0x61, 0x91, 0xde, 0x2f, 0x2c, - 0x84, 0xfb, 0xa5, 0x0f, 0x7f, 0xdb, 0xb0, 0xed, 0x6d, 0x03, 0xe2, 0x19, - 0x7b, 0x74, 0x07, 0x87, 0x12, 0xbb, 0x0d, 0x2b, 0xe7, 0xd4, 0x17, 0x4d, - 0xde, 0x09, 0xe9, 0x90, 0xc4, 0x30, 0xe5, 0xc7, 0x3d, 0xd3, 0x13, 0x44, - 0x2b, 0x52, 0xbf, 0xaf, 0x0e, 0x92, 0xfc, 0x16, 0xa9, 0x0c, 0x7f, 0xe4, - 0xc4, 0x7a, 0xe4, 0x49, 0x74, 0x50, 0x9a, 0xf8, 0xf9, 0x25, 0x91, 0x35, - 0x0c, 0x27, 0x79, 0x7d, 0x4a, 0x4e, 0x94, 0xd2, 0xac, 0xa1, 0x13, 0x6d, - 0x80, 0xca, 0xa6, 0xe8, 0x04, 0x40, 0xb7, 0x2a, 0x13, 0x85, 0x3e, 0x35, - 0x62, 0x19, 0xc4, 0x54, 0xe7, 0x8e, 0x74, 0x01, 0xcc, 0x77, 0xb2, 0xee, - 0x59, 0x50, 0xad, 0xc1, 0x85, 0xa6, 0xf4, 0x73, 0x97, 0x9e, 0xd1, 0xa5, - 0x90, 0x74, 0x78, 0xf3, 0x6b, 0x99, 0x8c, 0xe1, 0xdb, 0x47, 0xf8, 0xdb, - 0x43, 0xd7, 0x6d, 0x4d, 0x0b, 0x23, 0xd3, 0x9d, 0xd9, 0x70, 0xe0, 0x87, - 0x1e, 0x16, 0x0d, 0xaa, 0x53, 0xd2, 0x4f, 0x32, 0x1a, 0x1c, 0x43, 0xc0, - 0x9e, 0xa2, 0x85, 0xd7, 0xea, 0x8d, 0x12, 0xb8, 0xc2, 0xa4, 0x4d, 0x0e, - 0x90, 0xad, 0xdc, 0xe7, 0x54, 0x3a, 0xe9, 0x9a, 0x9e, 0x00, 0xfb, 0xb1, - 0xfa, 0xa5, 0x1c, 0x4c, 0x17, 0xff, 0x38, 0xb8, 0x75, 0x0e, 0xf2, 0x78, - 0xe8, 0x3a, 0x75, 0x48, 0xc8, 0xd8, 0x72, 0x65, 0x9e, 0x36, 0x98, 0x5b, - 0xb7, 0xc3, 0xfb, 0xec, 0xa0, 0x5a, 0xf7, 0x60, 0x30, 0xcf, 0x20, 0x9d, - 0x6e, 0x83, 0x10, 0x7e, 0x73, 0x33, 0xc1, 0x93, 0x0c, 0x58, 0x80, 0x51, - 0xf0, 0x16, 0x77, 0x29, 0xf9, 0x7f, 0x2e, 0xd9, 0x42, 0x38, 0x8b, 0x83, - 0xc6, 0x9d, 0x0d, 0xbb, 0xdd, 0x58, 0x89, 0x5c, 0xb7, 0xaa, 0x6f, 0xdf, - 0x51, 0x88, 0xb6, 0x78, 0x8a, 0xe0, 0x99, 0xc8, 0x89, 0x6b, 0xeb, 0x71, - 0xfc, 0x8a, 0xc0, 0xd0, 0x2b, 0x5b, 0x1c, 0xda, 0x0c, 0x07, 0x6b, 0x30, - 0xa6, 0xff, 0xea, 0xd4, 0xcd, 0x4d, 0xb8, 0x88, 0x37, 0x2a, 0x0f, 0x7d, - 0x40, 0xc1, 0x0b, 0x66, 0xdd, 0x99, 0x9e, 0xd1, 0x54, 0x51, 0x6c, 0xf7, - 0x05, 0x15, 0x2b, 0x76, 0x1e, 0xa5, 0x1e, 0x36, 0x10, 0x33, 0xf6, 0xba, - 0x3a, 0x7e, 0x1f, 0x06, 0xbc, 0x51, 0x93, 0x06, 0x19, 0xc6, 0x49, 0x9d, - 0x3a, 0x08, 0x8f, 0xb4, 0x48, 0xd8, 0xe2, 0x45, 0x06, 0x74, 0x81, 0x05, - 0x00, 0x25, 0xb8, 0x56, 0x98, 0x99, 0xa3, 0xb5, 0x75, 0xb3, 0x43, 0x23, - 0x47, 0x34, 0x9a, 0x9a, 0x68, 0x93, 0x0a, 0x31, 0xf7, 0xdc, 0xa1, 0x1c, - 0x11, 0xb1, 0x89, 0x48, 0x5d, 0xfd, 0x6f, 0xb3, 0xa9, 0x76, 0xf8, 0x5e, - 0xa5, 0xf2, 0xeb, 0x4d, 0xf6, 0x21, 0xe8, 0x65, 0xda, 0x59, 0x46, 0x77, - 0x90, 0x7a, 0x54, 0x4f, 0x17, 0x17, 0x6a, 0x53, 0xbe, 0xe8, 0xbc, 0x30, - 0x67, 0x03, 0x1c, 0xf1, 0xee, 0x5a, 0x1a, 0x87, 0x7e, 0xd1, 0x2b, 0xcd, - 0x24, 0x92, 0x6f, 0xb1, 0xa9, 0x38, 0xf8, 0x0e, 0x66, 0x04, 0xca, 0x24, - 0x83, 0x8c, 0x01, 0xdb, 0xb9, 0x28, 0x61, 0x74, 0xe9, 0xe0, 0x80, 0x18, - 0x15, 0x6b, 0xeb, 0x68, 0x0e, 0x2a, 0x3b, 0x15, 0x40, 0xcd, 0x45, 0xd9, - 0x1a, 0x43, 0x54, 0x1d, 0xfc, 0x4e, 0xf2, 0x16, 0xa9, 0x71, 0x2f, 0x08, - 0xc5, 0x97, 0xf6, 0xc1, 0x5f, 0x66, 0x45, 0x92, 0x32, 0x6d, 0x66, 0xf9, - 0x2b, 0x07, 0xfc, 0x73, 0x32, 0x22, 0x52, 0x4f, 0xfe, 0x70, 0xb5, 0x56, - 0x6e, 0x94, 0x54, 0x8e, 0x5f, 0xd3, 0x25, 0xda, 0xd8, 0x12, 0xa0, 0x57, - 0x33, 0x1e, 0x0d, 0xba, 0xed, 0x1f, 0x55, 0x75, 0x73, 0xd7, 0x1a, 0x7f, - 0x34, 0x42, 0x65, 0x9a, 0xae, 0x3a, 0x82, 0xb0, 0x1c, 0x0d, 0xc4, 0xd7, - 0x17, 0x13, 0x5c, 0xa0, 0xc7, 0x64, 0xdd, 0xaf, 0xba, 0x5a, 0xdc, 0x14, - 0x0b, 0x33, 0xa2, 0x3d, 0x90, 0x0a, 0xc1, 0xa4, 0xbc, 0x2c, 0x40, 0xc4, - 0xca, 0x63, 0x67, 0x4e, 0x94, 0x6d, 0xb9, 0x51, 0xf8, 0x70, 0x02, 0x90, - 0x17, 0xfd, 0xf9, 0xa8, 0xa4, 0xc5, 0xb0, 0xb0, 0xc1, 0xd8, 0xfa, 0x3a, - 0xca, 0x75, 0x2f, 0x02, 0x5c, 0x2b, 0xec, 0x15, 0x8f, 0xc6, 0x53, 0x12, - 0x17, 0x26, 0x66, 0x3a, 0xf4, 0xf9, 0x35, 0x26, 0x1c, 0xb5, 0xf7, 0xca, - 0x9a, 0xd1, 0x37, 0x5d, 0x09, 0xbd, 0x30, 0x9c, 0x97, 0x4c, 0xb6, 0xd9, - 0x3b, 0x28, 0x1d, 0xe6, 0x95, 0x2b, 0xa2, 0x92, 0x75, 0x75, 0x79, 0xa1, - 0x34, 0xd3, 0x8c, 0xc3, 0x0b, 0x2e, 0x68, 0xd0, 0x5a, 0x50, 0x9d, 0x86, - 0xe1, 0x3d, 0x08, 0xbe, 0xcd, 0xae, 0xa4, 0x65, 0x5e, 0x89, 0x67, 0xdb, - 0x19, 0xff, 0x06, 0x7d, 0xcc, 0xd2, 0x5c, 0xcf, 0x0b, 0xa4, 0xf2, 0x06, - 0x5a, 0xb0, 0x43, 0xa0, 0x66, 0x00, 0xae, 0x62, 0xf2, 0xc5, 0x21, 0xfd, - 0x83, 0xc5, 0x10, 0xe7, 0xd1, 0x76, 0x96, 0xca, 0xca, 0x96, 0xb8, 0x17, - 0x24, 0x5c, 0x59, 0x7b, 0x62, 0x1d, 0x92, 0xd2, 0xce, 0x9e, 0x4f, 0x0f, - 0x07, 0x7c, 0xef, 0xe5, 0xa6, 0x92, 0x2f, 0xd3, 0x42, 0xb7, 0xaf, 0xca, - 0x50, 0x83, 0xb2, 0x53, 0x6c, 0xbc, 0x1d, 0xf9, 0x5d, 0xb0, 0x6f, 0x0e, - 0x5a, 0xb8, 0x17, 0x26, 0x47, 0x62, 0x28, 0xd2, 0xd5, 0xb3, 0x5d, 0xc6, - 0x40, 0x86, 0x1c, 0xcb, 0xcb, 0x26, 0xf1, 0xe5, 0x36, 0x31, 0xcb, 0x67, - 0xd4, 0xc4, 0x14, 0x43, 0x2d, 0x26, 0x49, 0xb5, 0x89, 0x04, 0xd2, 0x8b, - 0x56, 0xbd, 0x77, 0xa7, 0x01, 0x8a, 0x4d, 0x33, 0xcc, 0x58, 0xdd, 0x9f, - 0x35, 0x75, 0xa2, 0x63, 0xa9, 0x74, 0x62, 0x12, 0x6a, 0xd6, 0x72, 0x16, - 0x0a, 0x2a, 0x02, 0xc3, 0xa0, 0x1d, 0xc2, 0x07, 0xd2, 0xbe, 0x54, 0x00, - 0x26, 0xf2, 0xe7, 0xb6, 0xd1, 0x9e, 0xdc, 0x05, 0x46, 0x6a, 0x18, 0x68, - 0x32, 0x7f, 0x4c, 0x7c, 0xc7, 0xe9, 0xc9, 0x7e, 0x9d, 0x7b, 0x2e, 0xf5, - 0xbb, 0xc7, 0xc8, 0xff, 0x6c, 0x2f, 0x93, 0x84, 0xfb, 0x66, 0x7d, 0x09, - 0x02, 0x7c, 0xcf, 0x81, 0x51, 0x49, 0x88, 0x9d, 0xe0, 0x77, 0x52, 0x87, - 0x67, 0xfa, 0xe8, 0xda, 0x6a, 0x5b, 0xd5, 0x02, 0xfa, 0x7e, 0xab, 0xa1, - 0xd4, 0x73, 0x8b, 0x93, 0xbd, 0x08, 0x9a, 0x7c, 0x19, 0x6b, 0x74, 0x68, - 0x99, 0xd9, 0x19, 0xd6, 0x92, 0x23, 0xd1, 0xe9, 0x12, 0xd7, 0xd5, 0xcb, - 0x16, 0xf6, 0x26, 0xef, 0x6d, 0x35, 0x58, 0x87, 0xdb, 0xa2, 0xaa, 0xd7, - 0x87, 0x8c, 0xfd, 0x0a, 0x1b, 0x9a, 0x90, 0x3b, 0xf4, 0x96, 0x88, 0x3f, - 0xa4, 0x28, 0x4b, 0x51, 0x17, 0x6a, 0x98, 0xbb, 0xfa, 0x02, 0x31, 0x11, - 0x55, 0xca, 0x8a, 0x65, 0x39, 0x7c, 0x63, 0xa2, 0x78, 0x7e, 0xe9, 0xaf, - 0x44, 0xbc, 0xa2, 0xd8, 0xcc, 0xac, 0x0b, 0x91, 0xb5, 0x49, 0xe8, 0x4e, - 0xd8, 0xb7, 0x19, 0x06, 0x2c, 0x33, 0x6c, 0xcb, 0xb1, 0x0d, 0x25, 0x6c, - 0x6c, 0x33, 0x31, 0xf7, 0xaf, 0xe8, 0x52, 0xcd, 0x68, 0x96, 0x03, 0x4c, - 0xb5, 0xc9, 0xc8, 0x6e, 0xa2, 0x07, 0xf0, 0xde, 0x95, 0x9a, 0x95, 0x0f, - 0x29, 0xdc, 0x8f, 0x6a, 0xbf, 0x41, 0x33, 0x99, 0x58, 0x25, 0xbc, 0x6c, - 0x7c, 0x8f, 0xa7, 0x83, 0x1a, 0xbc, 0xc4, 0xcf, 0x4e, 0xb2, 0x76, 0x6a, - 0x59, 0xb1, 0x89, 0x94, 0x02, 0xd2, 0x67, 0xae, 0x35, 0x74, 0x75, 0x96, - 0xf7, 0x9f, 0x16, 0x8c, 0x34, 0x46, 0x37, 0xcd, 0xa3, 0x62, 0xd0, 0x12, - 0x47, 0x0c, 0xfa, 0x8a, 0xe2, 0x35, 0x63, 0x9c, 0x9e, 0x0f, 0xd6, 0x68, - 0x71, 0x72, 0x26, 0xc1, 0x1c, 0x30, 0x80, 0x86, 0xb6, 0x78, 0xa1, 0xc8, - 0x99, 0x54, 0x56, 0xa8, 0xc5, 0x80, 0x02, 0x29, 0x8e, 0x24, 0x1b, 0xc7, - 0x36, 0x60, 0xa7, 0xd2, 0x18, 0xd1, 0xcc, 0x4f, 0x30, 0x96, 0xf9, 0xa3, - 0xbd, 0xf5, 0xdb, 0x87, 0x2e, 0x97, 0x05, 0x16, 0x2f, 0x65, 0xcb, 0x9f, - 0x8e, 0x7b, 0xbd, 0x3d, 0x8a, 0x49, 0xcb, 0x00, 0x06, 0xfb, 0x59, 0xed, - 0x1c, 0x04, 0x9c, 0xbd, 0xfc, 0xc3, 0xf5, 0xb2, 0xbb, 0x95, 0xf6, 0x07, - 0xd7, 0x7a, 0x01, 0xa5, 0xf6, 0x46, 0x5d, 0xc5, 0xb6, 0x05, 0x20, 0x8e, - 0xf7, 0xa0, 0x6c, 0x76, 0x3a, 0xcb, 0xe9, 0x87, 0xb5, 0x69, 0xa3, 0x6a, - 0xb5, 0xa2, 0xaf, 0xe1, 0xe9, 0xd9, 0x76, 0x4e, 0xb8, 0xe9, 0x84, 0xac, - 0xb2, 0xfd, 0x7c, 0x48, 0x5c, 0x20, 0x50, 0x20, 0x7a, 0x57, 0x50, 0x11, - 0xef, 0x8a, 0x49, 0x76, 0x24, 0xde, 0x38, 0xd4, 0x06, 0x62, 0xf9, 0x5c, - 0xaa, 0xa5, 0xa4, 0x85, 0x97, 0xfe, 0xd0, 0x8c, 0x18, 0x27, 0x9f, 0xbf, - 0xad, 0xae, 0x4a, 0x9f, 0x1a, 0x2f, 0xa8, 0x1b, 0x40, 0x61, 0x07, 0x8d, - 0x0f, 0x71, 0x0d, 0x3c, 0x71, 0x88, 0x8f, 0xf6, 0xc7, 0xf0, 0x0f, 0x73, - 0x9c, 0xb4, 0x8c, 0x4c, 0xb1, 0xab, 0x1d, 0xab, 0x4d, 0xd3, 0xde, 0x5c, - 0xa7, 0xba, 0x31, 0x0a, 0x8a, 0x5f, 0xf7, 0xf4, 0xba, 0x59, 0x92, 0x18, - 0xea, 0xd9, 0x26, 0xec, 0xe9, 0x68, 0x78, 0x3e, 0xa3, 0x56, 0xf0, 0x71, - 0xfe, 0x1e, 0xc2, 0x07, 0x0d, 0xd0, 0xef, 0x23, 0xdd, 0x96, 0x56, 0xae, - 0x8e, 0xd6, 0x0f, 0x9c, 0x4a, 0x98, 0xce, 0xba, 0x58, 0x1f, 0x8d, 0xb6, - 0x38, 0x13, 0x7b, 0x91, 0x84, 0xcd, 0x0f, 0xe1, 0x32, 0xbf, 0x63, 0x2c, - 0xd2, 0x5e, 0x1a, 0xdf, 0x54, 0xaa, 0x8c, 0x97, 0x93, 0x19, 0xa0, 0xd9, - 0xf5, 0xcf, 0xf1, 0xcc, 0xdd, 0xe3, 0xaf, 0xe6, 0x6f, 0x6b, 0xcf, 0xa4, - 0xaa, 0x8c, 0xb7, 0x3c, 0x2a, 0xea, 0x35, 0x8d, 0x89, 0x80, 0x35, 0x1c, - 0x6d, 0x05, 0x69, 0x91, 0xa9, 0xd1, 0x90, 0x4a, 0x14, 0xc9, 0xb6, 0x7a, - 0xe5, 0x46, 0x05, 0x9e, 0x1c, 0xd2, 0xbc, 0xda, 0xc9, 0xf0, 0xd3, 0xba, - 0x24, 0xa6, 0x89, 0x71, 0x3d, 0x03, 0x22, 0x29, 0xb7, 0xbf, 0xc5, 0x6a, - 0xb7, 0xa0, 0x8d, 0xd0, 0x58, 0x5a, 0x5e, 0xac, 0x07, 0x4c, 0x6d, 0x79, - 0x35, 0x71, 0x97, 0x2e, 0x34, 0x4b, 0x06, 0x13, 0xcd, 0x28, 0x33, 0x6d, - 0x17, 0x3a, 0x68, 0xe3, 0xa8, 0x97, 0x2c, 0x66, 0x9e, 0x76, 0x92, 0xf1, - 0xb7, 0x3c, 0x58, 0xdf, 0xd2, 0xe2, 0x91, 0x2e, 0x39, 0x3e, 0x41, 0xb0, - 0xb8, 0xde, 0xe6, 0xc8, 0x1f, 0xa7, 0xc7, 0x24, 0x2a, 0x1d, 0xd7, 0x3c, - 0xe0, 0xe0, 0x36, 0xab, 0xd5, 0x80, 0xb7, 0x29, 0x09, 0x4e, 0x1c, 0xc2, - 0x42, 0xad, 0x74, 0x8b, 0x64, 0xb2, 0xa0, 0xc6, 0xf4, 0xc3, 0xde, 0x17, - 0xbc, 0x00, 0x23, 0xdd, 0x43, 0xab, 0xa9, 0xac, 0x16, 0x34, 0x95, 0x4d, - 0x0f, 0xda, 0x5e, 0xed, 0xd4, 0x7e, 0xb7, 0xc0, 0x53, 0xed, 0x18, 0x52, - 0x2a, 0xba, 0x04, 0x12, 0xad, 0x3e, 0x5d, 0x72, 0xb4, 0x9e, 0xb3, 0x7b, - 0x59, 0xf2, 0xa2, 0xea, 0x06, 0x20, 0x5d, 0x81, 0x55, 0x91, 0x86, 0xfc, - 0xb8, 0x4d, 0x8b, 0x4e, 0x35, 0x36, 0xe7, 0x34, 0x90, 0x46, 0x94, 0x51, - 0xf6, 0x29, 0x72, 0x1b, 0x7c, 0x18, 0x3d, 0x9e, 0x2c, 0x0a, 0x05, 0x60, - 0x60, 0xd8, 0xec, 0xda, 0x79, 0x9a, 0x29, 0x22, 0x59, 0x2c, 0xf9, 0x7f, - 0xd0, 0x8e, 0x59, 0x63, 0xe1, 0x62, 0xb2, 0x2e, 0x5f, 0xef, 0x80, 0x23, - 0xb3, 0x28, 0xde, 0xfe, 0x77, 0xb3, 0x3e, 0x39, 0x28, 0x62, 0xdd, 0x3c, - 0x04, 0xe5, 0x8d, 0x09, 0x78, 0x59, 0x51, 0x3b, 0xdd, 0x71, 0x8f, 0xd9, - 0x63, 0xfa, 0x20, 0x7a, 0x45, 0xab, 0x36, 0x7b, 0xfe, 0x12, 0xcf, 0x72, - 0x47, 0xb1, 0x4b, 0x3c, 0x2f, 0x8e, 0x3b, 0x25, 0x03, 0x1e, 0x84, 0xa0, - 0x2d, 0x49, 0xa5, 0x81, 0x51, 0x53, 0x9f, 0xf9, 0xd9, 0x26, 0xb7, 0x07, - 0xed, 0x57, 0x7e, 0xe0, 0x55, 0x15, 0x9a, 0xba, 0x82, 0xfa, 0x15, 0x1e, - 0x57, 0x62, 0x85, 0x28, 0x3e, 0x95, 0xdb, 0x93, 0x96, 0xef, 0x5f, 0x00, - 0xd4, 0x8a, 0x7d, 0xa7, 0xbf, 0x17, 0x40, 0x40, 0xaf, 0x92, 0xf4, 0xf2, - 0x9f, 0xeb, 0x55, 0x42, 0x25, 0x07, 0x84, 0x9c, 0x40, 0x90, 0xb3, 0x9e, - 0x29, 0x59, 0xb6, 0xf2, 0x16, 0xbb, 0x72, 0x32, 0x81, 0x78, 0xae, 0x8b, - 0xc2, 0x18, 0x14, 0x81, 0x41, 0x9a, 0x7d, 0x6a, 0xea, 0x68, 0x20, 0xa0, - 0x3f, 0xef, 0x1f, 0x28, 0x98, 0xb6, 0x66, 0xd7, 0xe8, 0x95, 0x9b, 0x8e, - 0x5f, 0xfb, 0xce, 0x59, 0xd8, 0x5b, 0xc8, 0x15, 0x82, 0xd2, 0x1a, 0xb2, - 0x2e, 0xce, 0xfe, 0xaa, 0x1d, 0x4c, 0x2b, 0xfc, 0x0c, 0x63, 0x06, 0x1e, - 0xce, 0x72, 0xae, 0xb6, 0xae, 0xed, 0x2f, 0x3a, 0xc9, 0x60, 0xf3, 0x25, - 0x7c, 0x99, 0x3d, 0xaf, 0xd6, 0xc7, 0x40, 0xe3, 0xed, 0x8f, 0x9d, 0x7a, - 0x76, 0x02, 0x5a, 0x24, 0xb6, 0xee, 0x1a, 0x09, 0x70, 0x19, 0x06, 0x1f, - 0x8f, 0x18, 0x28, 0x3c, 0xe6, 0xe8, 0x14, 0xad, 0x97, 0x9e, 0x2a, 0x49, - 0x62, 0x44, 0x53, 0xce, 0xca, 0xff, 0x4f, 0xa2, 0xce, 0x69, 0xaf, 0xd3, - 0x9a, 0x2b, 0x00, 0xc9, 0xac, 0xdf, 0x63, 0xb9, 0x75, 0x87, 0xb2, 0xfc, - 0x47, 0x17, 0x3d, 0xb2, 0x31, 0xfe, 0x48, 0xbc, 0x2d, 0xf5, 0xcc, 0xb2, - 0xa6, 0x76, 0x56, 0xbf, 0xae, 0x84, 0xd9, 0xdc, 0xf6, 0x3d, 0x8d, 0x13, - 0x84, 0xc3, 0x7f, 0xde, 0x80, 0x00, 0x95, 0xea, 0x5e, 0xf9, 0xc8, 0x72, - 0x59, 0xa8, 0x85, 0x11, 0x68, 0x50, 0x4b, 0x3f, 0x4f, 0x85, 0x9b, 0x54, - 0xe3, 0xbb, 0xb9, 0xd7, 0xf5, 0xf6, 0x1b, 0x63, 0xbf, 0xe4, 0x5f, 0x0b, - 0xdc, 0xba, 0xfa, 0x40, 0x3e, 0x95, 0x7e, 0x42, 0x03, 0xfc, 0x54, 0xf6, - 0xd8, 0x5b, 0x18, 0x09, 0xf2, 0xb2, 0x40, 0x73, 0x32, 0x26, 0x50, 0x5c, - 0xca, 0x8b, 0x07, 0x79, 0xd6, 0x4b, 0x06, 0x4b, 0xe3, 0xfc, 0x20, 0xbd, - 0x1e, 0xb1, 0xc5, 0x1e, 0x81, 0x04, 0xca, 0xe1, 0x16, 0xa2, 0xfd, 0xaa, - 0x4c, 0x09, 0x3f, 0xf3, 0xe7, 0x37, 0x5e, 0x1c, 0xd3, 0x7d, 0x41, 0xe4, - 0x8e, 0x8d, 0xf5, 0xc4, 0xc5, 0x9a, 0x85, 0x24, 0x0c, 0xde, 0x63, 0x8c, - 0xbe, 0x00, 0xf4, 0x20, 0x89, 0xda, 0x5c, 0x5d, 0x25, 0x1a, 0xe1, 0xa7, - 0xb1, 0xcc, 0xad, 0x83, 0x3c, 0x3e, 0xce, 0x39, 0xc6, 0xb8, 0xa1, 0xca, - 0x49, 0xcb, 0x98, 0xc1, 0x54, 0xda, 0x06, 0xb0, 0xf8, 0x72, 0x57, 0x18, - 0xda, 0x1d, 0x0b, 0xa4, 0xa2, 0x8f, 0x39, 0xf4, 0xc9, 0x50, 0xf3, 0xea, - 0x5c, 0x94, 0x06, 0x10, 0x5f, 0xf5, 0x93, 0xeb, 0x82, 0x7a, 0xf4, 0x0b, - 0x30, 0xdf, 0x72, 0xcd, 0x49, 0x88, 0xd4, 0xd3, 0x28, 0x8a, 0x8c, 0x29, - 0x96, 0xf2, 0xc8, 0x81, 0x7f, 0x2c, 0x54, 0x67, 0x33, 0xed, 0x4b, 0x59, - 0xad, 0x05, 0xd8, 0xad, 0xc1, 0x59, 0x63, 0xf4, 0x24, 0xcb, 0x18, 0x7c, - 0x69, 0xe9, 0x78, 0x78, 0xd2, 0x48, 0x1c, 0x06, 0x58, 0xd2, 0xf7, 0x55, - 0xaa, 0x36, 0x7a, 0x94, 0x05, 0x8c, 0x8a, 0xdd, 0xb5, 0x85, 0xd6, 0x18, - 0x56, 0x50, 0x9c, 0x0f, 0xea, 0x62, 0x3b, 0x8f, 0x3c, 0xb8, 0x1b, 0x54, - 0x4a, 0x73, 0xaa, 0x0c, 0x48, 0xf7, 0x24, 0xfd, 0x76, 0xb4, 0xe4, 0x90, - 0xa3, 0x9a, 0x7f, 0x34, 0x62, 0x53, 0x7b, 0x2d, 0x59, 0x57, 0x6e, 0x60, - 0x31, 0xba, 0xea, 0xfc, 0x44, 0xf2, 0xb7, 0x8f, 0x06, 0x38, 0x5e, 0xe8, - 0x56, 0xc0, 0xd8, 0xf9, 0x1c, 0x03, 0x9c, 0xcf, 0xc7, 0x57, 0x34, 0x71, - 0x70, 0x2e, 0xa6, 0x96, 0x49, 0x35, 0x5e, 0x2d, 0x12, 0x5b, 0xcc, 0xbd, - 0x49, 0x85, 0x5d, 0xfe, 0x90, 0xbf, 0x91, 0x80, 0x6f, 0xe3, 0x88, 0x2c, - 0x02, 0x8d, 0x62, 0x6d, 0x38, 0x74, 0x72, 0x17, 0xb3, 0x29, 0x33, 0xf1, - 0xb3, 0x67, 0xb7, 0x05, 0xff, 0x1c, 0xda, 0xb6, 0x07, 0xbe, 0x99, 0x4c, - 0x3d, 0x30, 0x69, 0x3a, 0xb3, 0xdc, 0xb1, 0x38, 0x24, 0xa1, 0x24, 0x4a, - 0x3b, 0x70, 0x71, 0x66, 0x97, 0x5c, 0xf1, 0xf5, 0x2d, 0xd6, 0x4e, 0x68, - 0x22, 0x71, 0x7d, 0x59, 0x63, 0xb9, 0xaa, 0xd7, 0x28, 0x76, 0x24, 0xe1, - 0xfd, 0xda, 0x6a, 0x3c, 0x8c, 0xf5, 0x40, 0x43, 0x27, 0xe0, 0xa1, 0x83, - 0x07, 0x32, 0xe6, 0x17, 0x65, 0xc0, 0x5f, 0xb9, 0xb9, 0xa6, 0x22, 0x03, - 0x69, 0x4b, 0xb0, 0x15, 0x5e, 0x26, 0xb9, 0x46, 0x4a, 0x8c, 0xc8, 0x2b, - 0x7b, 0x54, 0x83, 0x35, 0x84, 0x00, 0x07, 0xc3, 0x55, 0x8c, 0xbb, 0x3c, - 0x57, 0x4d, 0xe6, 0x14, 0x9d, 0x84, 0xfc, 0x13, 0x97, 0x44, 0x80, 0x5d, - 0xac, 0x10, 0xd1, 0x19, 0x29, 0x7b, 0xb3, 0x3f, 0xbe, 0xc5, 0x87, 0x43, - 0x21, 0x72, 0x7e, 0xc5, 0x79, 0x42, 0x38, 0xd1, 0x9f, 0x6b, 0x94, 0xd4, - 0x66, 0x77, 0x86, 0xb1, 0x41, 0x0d, 0x88, 0x09, 0xd5, 0xdf, 0x3d, 0xb3, - 0xc5, 0x45, 0x5c, 0xea, 0xe8, 0xac, 0x48, 0xef, 0xb4, 0x66, 0x8a, 0x7c, - 0xdb, 0x71, 0x9f, 0x9a, 0x96, 0xbb, 0x0b, 0xd2, 0xf8, 0xf4, 0xe7, 0xb8, - 0xe0, 0x07, 0xf6, 0x04, 0x25, 0xd9, 0xc5, 0x4f, 0x61, 0xb4, 0x22, 0xbd, - 0xfb, 0x8f, 0x6d, 0xb4, 0x7a, 0xfd, 0xfd, 0xfb, 0x83, 0xcc, 0x8c, 0x47, - 0x71, 0xe5, 0xbc, 0x35, 0x20, 0x53, 0x32, 0x73, 0x0c, 0x88, 0x2a, 0xcc, - 0x63, 0xae, 0xab, 0x6c, 0xb8, 0xb4, 0x7e, 0x60, 0x8c, 0xf4, 0x9d, 0xbd, - 0x7f, 0xf7, 0xc8, 0x07, 0x9f, 0xd7, 0xfc, 0x17, 0x0f, 0x06, 0x1f, 0x72, - 0xf8, 0x9b, 0x58, 0x76, 0x13, 0xf6, 0x49, 0x89, 0xeb, 0x31, 0x81, 0x5e, - 0x71, 0x73, 0x83, 0x74, 0x34, 0xa4, 0xe8, 0x36, 0xa4, 0x22, 0xe7, 0x24, - 0xde, 0xa7, 0x4a, 0x99, 0x6f, 0x7f, 0xf7, 0x80, 0xfa, 0x98, 0x6b, 0xdd, - 0xa6, 0x06, 0x6a, 0xc7, 0x5d, 0x4c, 0x91, 0x53, 0xcf, 0x2c, 0x35, 0xd8, - 0xb6, 0xc0, 0xfd, 0x4b, 0x92, 0xdc, 0x4b, 0xeb, 0x1c, 0x72, 0x3a, 0x14, - 0xdc, 0xaf, 0x89, 0xc7, 0x05, 0x02, 0xb1, 0xb9, 0x51, 0x25, 0xbc, 0x49, - 0x77, 0x8f, 0x6a, 0x22, 0x2b, 0x7a, 0xa2, 0x19, 0x6d, 0x3b, 0xcd, 0x18, - 0x2e, 0xf4, 0x5a, 0xbe, 0x53, 0x0a, 0xaa, 0xbb, 0x61, 0x30, 0x03, 0x55, - 0x4a, 0x94, 0xa0, 0x7e, 0xb4, 0xc5, 0x57, 0x84, 0x17, 0x7b, 0x5d, 0x61, - 0x46, 0x58, 0x05, 0x71, 0x1f, 0x2e, 0x3e, 0x05, 0xf9, 0x35, 0xab, 0x34, - 0xce, 0x0a, 0xc1, 0xd2, 0xf4, 0x97, 0x9d, 0xbf, 0x9b, 0xe2, 0xc6, 0xfb, - 0x65, 0x1b, 0x6e, 0x64, 0x2f, 0xd5, 0xd7, 0x46, 0x18, 0x87, 0xdc, 0xf0, - 0x7d, 0xc3, 0x7d, 0xe7, 0x3a, 0x16, 0xde, 0x5b, 0x6c, 0x34, 0x3c, 0x9c, - 0x7e, 0xdd, 0xa8, 0xae, 0xd0, 0x28, 0xde, 0xe6, 0x7c, 0x4d, 0x9e, 0xec, - 0x8b, 0x2f, 0xfe, 0xd8, 0x59, 0xfd, 0x47, 0x18, 0xef, 0x63, 0xd8, 0x36, - 0xe8, 0xe3, 0xe3, 0xac, 0xce, 0x53, 0x85, 0x5c, 0x3d, 0x3a, 0xed, 0xb1, - 0x35, 0xa0, 0xf1, 0xca, 0x29, 0xd2, 0x64, 0x70, 0x47, 0x4b, 0xb0, 0x2f, - 0x0b, 0xcb, 0xda, 0x45, 0x03, 0xd7, 0xd3, 0xf0, 0xd8, 0xc6, 0x39, 0xb1, - 0x6b, 0xb0, 0xa5, 0x7c, 0xcb, 0x42, 0xd4, 0xc2, 0xc2, 0xa5, 0xff, 0x7e, - 0x4a, 0x13, 0xff, 0x0a, 0x06, 0x90, 0x6f, 0x5b, 0xaf, 0xc8, 0xd0, 0x61, - 0x24, 0x7f, 0xfe, 0x5f, 0x07, 0x56, 0x84, 0x98, 0x89, 0x1b, 0xaa, 0xef, - 0x35, 0x89, 0xe0, 0x62, 0x3d, 0x89, 0xb0, 0x90, 0xda, 0xa5, 0x3f, 0x50, - 0xa6, 0xf4, 0x34, 0x0d, 0x1f, 0xfc, 0x73, 0xa7, 0x02, 0x4a, 0xc2, 0x0b, - 0xe7, 0x96, 0x10, 0x09, 0x26, 0xca, 0x9b, 0xa4, 0x0f, 0x76, 0x0f, 0xed, - 0x01, 0x09, 0x04, 0x89, 0x46, 0x3f, 0x4a, 0x1d, 0xaa, 0xd2, 0xc6, 0x91, - 0xc6, 0x8e, 0x7d, 0xf3, 0x0f, 0x59, 0x37, 0x0f, 0x67, 0xae, 0x73, 0x27, - 0x64, 0x03, 0x0d, 0xad, 0xc8, 0xf5, 0x11, 0x93, 0x78, 0x0f, 0xa0, 0x18, - 0x3c, 0x11, 0x8f, 0x45, 0x77, 0xc3, 0xe5, 0xd4, 0xbe, 0x7d, 0xe6, 0xee, - 0xe2, 0x2c, 0x3a, 0x70, 0x8a, 0x0f, 0x97, 0x16, 0x9d, 0x02, 0xc0, 0x19, - 0xa6, 0x35, 0xb8, 0xc1, 0x64, 0x0c, 0x29, 0x7f, 0x74, 0x28, 0xab, 0x57, - 0xd7, 0xb4, 0x1f, 0x39, 0x70, 0x82, 0x9e, 0xef, 0xc2, 0x18, 0xfe, 0x4b, - 0x77, 0xa5, 0xbc, 0x55, 0x0f, 0x36, 0xbe, 0x61, 0x58, 0xb8, 0x2e, 0x42, - 0x75, 0x6e, 0x58, 0x8f, 0xf2, 0x8a, 0xbd, 0x88, 0x31, 0xc0, 0xc9, 0xc8, - 0x36, 0x68, 0xb6, 0x1f, 0xd0, 0x56, 0xd7, 0x29, 0xb7, 0xa2, 0x47, 0xd6, - 0x42, 0x18, 0xc3, 0x09, 0x48, 0xb6, 0x95, 0x8e, 0x5d, 0x09, 0x60, 0xbe, - 0x81, 0x03, 0xe4, 0x43, 0x6e, 0x93, 0xf2, 0x7b, 0xae, 0x7a, 0xd2, 0xcd, - 0x9d, 0x19, 0x73, 0x09, 0x1d, 0xe2, 0xff, 0x55, 0x9c, 0x0e, 0x75, 0xe7, - 0xe1, 0x64, 0x99, 0x90, 0x72, 0x09, 0xd3, 0xad, 0x7c, 0x1b, 0x03, 0xe2, - 0x4f, 0xc2, 0xb0, 0x58, 0x48, 0xcc, 0x44, 0x80, 0x75, 0xe3, 0xba, 0x9f, - 0x3b, 0x81, 0x76, 0xa5, 0x3f, 0xe9, 0xde, 0xe9, 0x99, 0xf0, 0x78, 0x09, - 0x16, 0xce, 0x10, 0x10, 0xc8, 0x01, 0x24, 0x8c, 0xe0, 0x80, 0x89, 0x06, - 0xbd, 0x98, 0xa0, 0x52, 0x10, 0xbe, 0x33, 0x91, 0x54, 0xa4, 0x8f, 0x8e, - 0xf9, 0x5e, 0x51, 0x8c, 0x07, 0xd6, 0x6b, 0x1c, 0x04, 0x9c, 0x1e, 0xbb, - 0x78, 0x39, 0xfb, 0xf8, 0xbc, 0x7a, 0xc6, 0x4a, 0x8e, 0xd1, 0xd8, 0x03, - 0xe4, 0x97, 0x9c, 0x0b, 0x8c, 0x29, 0xeb, 0xe4, 0x11, 0x62, 0xa4, 0xcf, - 0x0a, 0x3a, 0x47, 0x5b, 0x22, 0x31, 0xef, 0xad, 0x3b, 0x41, 0xc8, 0x95, - 0xbe, 0xab, 0x5e, 0x65, 0x32, 0x1d, 0xc7, 0x2e, 0xaa, 0xaa, 0x97, 0xa8, - 0x9b, 0x86, 0xd7, 0x18, 0x06, 0x23, 0xf8, 0xe8, 0x3d, 0x43, 0x58, 0x4b, - 0x9d, 0xcf, 0x60, 0x8b, 0xd6, 0xdd, 0xc2, 0xa5, 0x7a, 0x52, 0xcf, 0x27, - 0xca, 0x36, 0x05, 0xc5, 0xee, 0x16, 0x87, 0xcf, 0xde, 0x18, 0x50, 0xbc, - 0x0f, 0x7b, 0x78, 0x60, 0xc8, 0xf8, 0xaa, 0x19, 0x20, 0x0b, 0xa3, 0x21, - 0xdd, 0x69, 0x23, 0x1d, 0xf0, 0x64, 0x98, 0x9d, 0x0a, 0x11, 0xcb, 0x45, - 0x12, 0x3a, 0x7a, 0x92, 0x87, 0xdf, 0x8e, 0xdd, 0x16, 0xbf, 0xeb, 0xe1, - 0x04, 0x14, 0x6f, 0x1b, 0x2a, 0xa1, 0x3f, 0xb4, 0x4d, 0x5a, 0x3f, 0xac, - 0x4f, 0x39, 0x3e, 0x88, 0x33, 0x7c, 0xaa, 0x64, 0xdc, 0xbc, 0xd7, 0x72, - 0x98, 0x0e, 0x2e, 0xfb, 0x2c, 0x75, 0x46, 0x67, 0x3e, 0x28, 0xad, 0xe0, - 0x80, 0x50, 0x15, 0xf5, 0x6e, 0x43, 0x1e, 0x8a, 0xea, 0x45, 0xff, 0x16, - 0xf6, 0xc4, 0x43, 0x9b, 0xd8, 0xbc, 0x09, 0x2d, 0xc9, 0x0e, 0x75, 0xd4, - 0x93, 0x17, 0xec, 0x5b, 0x44, 0x03, 0xcf, 0xce, 0x8b, 0xc5, 0xfa, 0x99, - 0x52, 0x0f, 0x2e, 0x2b, 0xf7, 0xb5, 0x08, 0x45, 0xd3, 0x22, 0x23, 0x1e, - 0xb8, 0x4a, 0xa8, 0x48, 0xab, 0xe8, 0xef, 0x47, 0xed, 0x52, 0x93, 0x62, - 0x0f, 0x7b, 0x88, 0x03, 0xd3, 0xdb, 0x7c, 0x58, 0xa1, 0x83, 0xce, 0x5e, - 0xf7, 0x4b, 0x47, 0x20, 0xc1, 0xae, 0xc7, 0xe6, 0x79, 0x0d, 0xd2, 0x34, - 0xa8, 0x1b, 0x83, 0x0a, 0x3b, 0x84, 0xdf, 0x7d, 0x6e, 0x88, 0x8b, 0xa1, - 0xa2, 0xd3, 0x6e, 0x4d, 0x74, 0x3e, 0x75, 0x42, 0x84, 0xfd, 0x0a, 0x60, - 0x9d, 0x2b, 0xee, 0x06, 0x83, 0x04, 0xf8, 0x00, 0xac, 0x2f, 0x83, 0x55, - 0x08, 0x3e, 0xc3, 0x6f, 0xb0, 0x3a, 0xd5, 0x24, 0x6a, 0xb4, 0x79, 0xa7, - 0x0f, 0x41, 0x98, 0x13, 0x1b, 0x96, 0xa8, 0x88, 0x27, 0xf2, 0x60, 0x87, - 0xeb, 0x81, 0x51, 0xbe, 0x84, 0x31, 0x21, 0xd1, 0x6a, 0xfb, 0xde, 0x2a, - 0x09, 0xcc, 0x7b, 0x3e, 0x93, 0xc6, 0x46, 0x1f, 0x61, 0xde, 0x07, 0x38, - 0x3b, 0x99, 0x15, 0x1d, 0x44, 0xc8, 0x9a, 0x1f, 0x8e, 0xa0, 0x22, 0x2d, - 0xc9, 0x20, 0x58, 0x89, 0x4e, 0xfc, 0xee, 0x19, 0x72, 0x7e, 0x03, 0xcd, - 0x94, 0x83, 0xe7, 0xfe, 0x10, 0xd9, 0xd4, 0xd3, 0x21, 0x9f, 0x9c, 0x26, - 0xcc, 0xf6, 0x8b, 0xd5, 0x2b, 0x92, 0x25, 0x90, 0x58, 0xab, 0x6f, 0xe6, - 0x42, 0xb6, 0x90, 0x1a, 0xab, 0x12, 0xda, 0xab, 0x60, 0xc2, 0xa3, 0x57, - 0xf2, 0xf7, 0x36, 0xfc, 0xcb, 0x22, 0x08, 0x83, 0xef, 0x88, 0x72, 0xec, - 0x81, 0x6a, 0xdb, 0xe9, 0xa0, 0x72, 0x89, 0x93, 0x0f, 0xcd, 0xab, 0x15, - 0xcc, 0x4c, 0x85, 0xe9, 0x26, 0x51, 0x4b, 0x1b, 0x89, 0x1c, 0xc3, 0xca, - 0xd5, 0x95, 0x6a, 0xab, 0x50, 0x37, 0x3c, 0x0a, 0x22, 0x8a, 0x69, 0x8e, - 0xd4, 0x8b, 0x0d, 0x27, 0x52, 0x05, 0x77, 0x28, 0x9b, 0x53, 0xe4, 0x07, - 0xdd, 0x00, 0x25, 0xea, 0x82, 0x2a, 0xcb, 0xc9, 0x80, 0x5f, 0xa2, 0x40, - 0x7d, 0x57, 0x93, 0x62, 0x1e, 0x54, 0xa7, 0xd3, 0x64, 0xea, 0x7b, 0xa9, - 0x46, 0xfc, 0x49, 0x07, 0xdf, 0x84, 0xd9, 0x0b, 0x58, 0x11, 0xeb, 0x35, - 0xf3, 0x06, 0xa0, 0x9e, 0xf9, 0xb2, 0xf3, 0x38, 0xbd, 0xca, 0xf6, 0xee, - 0xdc, 0x1f, 0x73, 0xb1, 0xa8, 0x60, 0x31, 0x7a, 0x94, 0x5c, 0xa3, 0x41, - 0x07, 0xa5, 0x4b, 0x41, 0xef, 0xd0, 0xa9, 0x47, 0x0a, 0x9b, 0x45, 0x00, - 0xb5, 0xa2, 0x6d, 0xf5, 0xca, 0xc4, 0x5c, 0x65, 0x47, 0xcd, 0x42, 0xf5, - 0xe3, 0x08, 0x74, 0x60, 0x54, 0xea, 0xcc, 0xf6, 0x32, 0xe9, 0x8e, 0xc2, - 0x24, 0x4d, 0xe0, 0x13, 0x7a, 0xe0, 0xeb, 0x3e, 0xaf, 0x78, 0xbb, 0x96, - 0xb8, 0x5d, 0x07, 0x07, 0x7b, 0x75, 0x95, 0x76, 0x61, 0xe2, 0x1a, 0xcb, - 0x34, 0x88, 0xf5, 0xae, 0x08, 0x75, 0x50, 0xa5, 0x2a, 0x48, 0xcd, 0x17, - 0xa0, 0x60, 0x95, 0xd1, 0x2a, 0xf1, 0x67, 0x4b, 0x46, 0x36, 0x9d, 0x4d, - 0x8c, 0x44, 0x47, 0x47, 0x46, 0x3d, 0x34, 0xc6, 0x9e, 0xed, 0x82, 0x8e, - 0xd2, 0x19, 0xa2, 0xb8, 0xb1, 0x70, 0x17, 0x22, 0xf7, 0xb3, 0x64, 0xc5, - 0xa8, 0xac, 0x78, 0xb4, 0x03, 0xb8, 0x96, 0x48, 0x6c, 0x69, 0xfd, 0xf5, - 0x51, 0xb0, 0xb6, 0xdd, 0x1b, 0x90, 0x7b, 0x87, 0xb6, 0xd2, 0x96, 0x03, - 0x2e, 0xe6, 0x44, 0x2a, 0x90, 0x65, 0x84, 0x6d, 0x93, 0x17, 0x5f, 0x62, - 0xe6, 0x0f, 0xbd, 0x79, 0xc1, 0xce, 0xc1, 0xd9, 0xec, 0xe0, 0x45, 0x6f, - 0x57, 0x82, 0xf6, 0x76, 0x29, 0x51, 0xfc, 0x23, 0xa7, 0xfd, 0xdd, 0x31, - 0xd2, 0xbd, 0xfb, 0x64, 0xce, 0x70, 0x79, 0x53, 0x1d, 0x07, 0x0b, 0xd2, - 0x29, 0x16, 0xea, 0xba, 0xcb, 0xb2, 0x13, 0xe1, 0xd0, 0x80, 0xf3, 0xc8, - 0x54, 0xf1, 0xa6, 0xed, 0x20, 0x7a, 0x6e, 0x6b, 0x93, 0xba, 0x6f, 0xda, - 0xba, 0xf4, 0x9c, 0xb4, 0x85, 0x75, 0xe4, 0xff, 0xb6, 0xf6, 0xb4, 0x69, - 0xf0, 0xa9, 0xac, 0x9b, 0x7d, 0xab, 0x67, 0xec, 0xb5, 0x2b, 0x4e, 0xdb, - 0xba, 0x69, 0x61, 0x06, 0x05, 0x51, 0xed, 0xbe, 0xdc, 0x2e, 0xb6, 0x17, - 0xee, 0xc0, 0xb0, 0x5d, 0x0a, 0x1f, 0x58, 0x67, 0x40, 0xfa, 0x13, 0x49, - 0x71, 0x37, 0x0a, 0x2d, 0xd5, 0x55, 0xd6, 0x14, 0xcc, 0x3c, 0x00, 0x6a, - 0xa9, 0xea, 0x38, 0x6c, 0xfd, 0xee, 0x8b, 0x19, 0xcb, 0xd0, 0x3e, 0x5b, - 0x03, 0x3f, 0xec, 0x6d, 0x0e, 0xa4, 0x02, 0xae, 0x65, 0x23, 0x63, 0x5b, - 0x0f, 0x9c, 0xdf, 0x3a, 0x80, 0x83, 0x24, 0xd1, 0xc4, 0x29, 0x60, 0x73, - 0xbc, 0xd1, 0x70, 0x2e, 0xc4, 0x64, 0xaf, 0x04, 0x45, 0xad, 0xfc, 0xf7, - 0x98, 0x76, 0x31, 0x93, 0x53, 0x08, 0x28, 0x18, 0x88, 0xe7, 0x60, 0x68, - 0x95, 0x78, 0xee, 0xe0, 0x2b, 0x01, 0xf1, 0x2d, 0x64, 0x19, 0xcf, 0xe2, - 0xd2, 0xb3, 0xdf, 0x40, 0xca, 0xe7, 0x7f, 0x96, 0xa3, 0xd3, 0xe3, 0xad, - 0x86, 0x1d, 0x28, 0x7d, 0x13, 0x73, 0xd9, 0x3a, 0xbe, 0x60, 0x20, 0x44, - 0xcf, 0x91, 0x4c, 0xad, 0x64, 0xac, 0xd1, 0x83, 0xb5, 0xb4, 0x1f, 0x78, - 0xd7, 0xd2, 0xdf, 0xc4, 0x87, 0x95, 0xcc, 0xff, 0xd7, 0x90, 0x06, 0x51, - 0xe4, 0xfd, 0x7f, 0xbf, 0x2e, 0xb5, 0x43, 0xc4, 0x7e, 0xc6, 0xbb, 0xc9, - 0x5e, 0x29, 0xdd, 0x51, 0x89, 0xd6, 0xe3, 0xcd, 0x73, 0x64, 0xc3, 0xd7, - 0xe0, 0x8e, 0xb2, 0xcd, 0xbd, 0x8c, 0xe9, 0x1a, 0xbd, 0xc4, 0x44, 0x99, - 0xa4, 0x6f, 0xc8, 0x6c, 0x1b, 0x89, 0x55, 0xee, 0xe3, 0xe6, 0x27, 0x3c, - 0xe2, 0xd7, 0xe2, 0x5d, 0x30, 0x3b, 0xef, 0x52, 0x7b, 0xbb, 0x9f, 0x91, - 0xea, 0x9c, 0x1c, 0xb9, 0x4b, 0x97, 0x00, 0xeb, 0x72, 0x90, 0x44, 0xd8, - 0xc6, 0x25, 0x11, 0x89, 0x81, 0xae, 0x8d, 0x74, 0xf3, 0x70, 0x16, 0x15, - 0x94, 0xf8, 0x00, 0x59, 0xc6, 0xbd, 0xed, 0xa7, 0xde, 0x1b, 0xeb, 0x4d, - 0x9a, 0x1b, 0xcd, 0xe5, 0x7c, 0x5a, 0xaa, 0xd0, 0x98, 0x28, 0xe0, 0x64, - 0x34, 0x79, 0xd9, 0x99, 0xe5, 0x1b, 0x9c, 0x70, 0xb8, 0xdd, 0x86, 0xa6, - 0xb6, 0x9a, 0xd1, 0xd2, 0x98, 0xf6, 0x18, 0x0f, 0xd5, 0x47, 0xb6, 0x36, - 0xb1, 0x27, 0xf6, 0xc7, 0x51, 0xe7, 0xa8, 0xf9, 0x39, 0x31, 0xf2, 0x6f, - 0x07, 0x3a, 0x77, 0xdb, 0x63, 0xe3, 0xca, 0x71, 0x74, 0x24, 0x57, 0x0b, - 0x44, 0x43, 0xd2, 0xec, 0x29, 0xbe, 0xae, 0x4d, 0x06, 0x70, 0xc5, 0xf8, - 0xe9, 0x90, 0x72, 0x32, 0xbc, 0x50, 0x3e, 0x70, 0xba, 0xbb, 0xb4, 0x8d, - 0xb0, 0x76, 0xfe, 0x41, 0x83, 0x6f, 0xa4, 0xef, 0xbf, 0x5c, 0x42, 0xb1, - 0x98, 0xc7, 0x7d, 0x41, 0x9d, 0x34, 0xea, 0x29, 0x38, 0xbb, 0xc0, 0xf7, - 0xba, 0x05, 0x0c, 0xc4, 0xd1, 0x5f, 0x6d, 0xb4, 0x96, 0x17, 0x4e, 0xcc, - 0x1e, 0x8c, 0x47, 0x10, 0x05, 0x4d, 0xd3, 0xd1, 0x41, 0x6b, 0xa5, 0xed, - 0xbd, 0x3d, 0xc1, 0x6d, 0xcc, 0x8f, 0x33, 0xd1, 0x59, 0xe5, 0x1e, 0x49, - 0xcd, 0xe9, 0x60, 0x86, 0x32, 0x49, 0xce, 0xc6, 0xaa, 0x37, 0x27, 0x97, - 0x68, 0x3a, 0xc3, 0xaf, 0xd1, 0x8f, 0xc3, 0x75, 0xa4, 0x26, 0x62, 0x7f, - 0xbb, 0xd4, 0xd5, 0x23, 0xa1, 0x3f, 0x13, 0x20, 0x66, 0x6e, 0x23, 0x30, - 0xdb, 0xa8, 0x55, 0x21, 0xf8, 0x74, 0x69, 0xf2, 0xbd, 0x79, 0x4a, 0xe8, - 0xc9, 0xc7, 0x8f, 0x34, 0xa2, 0x3d, 0xf4, 0xa7, 0x5a, 0x56, 0x50, 0xde, - 0xf4, 0xe9, 0x5c, 0x07, 0x37, 0xaf, 0xd9, 0x2c, 0xe6, 0x4f, 0xba, 0x63, - 0x4f, 0x48, 0xe1, 0x8d, 0x1e, 0x5d, 0x4b, 0xba, 0x1d, 0x2a, 0xc0, 0x45, - 0xf6, 0x7b, 0x83, 0x3e, 0x49, 0x83, 0x85, 0xd1, 0x6b, 0x39, 0xed, 0x9d, - 0x05, 0x4d, 0x01, 0x88, 0x5a, 0x2e, 0xb0, 0x30, 0x5c, 0x72, 0x79, 0xfc, - 0x9e, 0x51, 0xa1, 0x5d, 0xbf, 0x2f, 0xc0, 0xa9, 0xc2, 0x55, 0x37, 0x53, - 0x27, 0xf2, 0xa8, 0xf9, 0x7d, 0xca, 0x55, 0x82, 0x81, 0x04, 0x25, 0xfd, - 0x98, 0xe9, 0x0e, 0xa0, 0x36, 0x88, 0xb3, 0x5c, 0x3b, 0xa6, 0xf9, 0x5c, - 0x49, 0x60, 0x19, 0x20, 0x72, 0xb2, 0x51, 0xa4, 0xa4, 0x7b, 0x1b, 0xbd, - 0x98, 0x10, 0xcd, 0x82, 0xa9, 0x2e, 0x5d, 0xe2, 0xcc, 0xc2, 0xec, 0x19, - 0x29, 0x4b, 0x4c, 0x66, 0x2b, 0x62, 0x99, 0xb2, 0x38, 0x42, 0xd6, 0x3a, - 0x82, 0xd3, 0x9d, 0xc2, 0x12, 0xd9, 0xc4, 0x8f, 0x77, 0xe6, 0xad, 0x06, - 0x83, 0x25, 0xa0, 0x24, 0xcc, 0x91, 0x30, 0xb1, 0xa5, 0x72, 0x1c, 0x82, - 0x21, 0x0b, 0x3e, 0xe6, 0x0b, 0x0c, 0xae, 0xf2, 0xf7, 0x75, 0x75, 0x47, - 0x9b, 0x70, 0x57, 0xf6, 0xfd, 0x78, 0x77, 0x12, 0x0a, 0x7a, 0xd9, 0xe5, - 0x04, 0x0a, 0xda, 0xc5, 0xdd, 0xfb, 0xd6, 0x86, 0x88, 0xed, 0xfc, 0xf3, - 0xf4, 0x1d, 0xb3, 0xd6, 0x85, 0x5c, 0xa0, 0xc6, 0x9a, 0xec, 0xfa, 0xa5, - 0xdd, 0x83, 0x08, 0x22, 0xcf, 0x00, 0x36, 0xa9, 0x97, 0xf8, 0xf0, 0x6e, - 0xd3, 0x6b, 0xfd, 0x2c, 0x71, 0xe1, 0x93, 0x8c, 0x3d, 0x5d, 0xd4, 0x7c, - 0x6b, 0x75, 0x83, 0x1a, 0x7f, 0x22, 0x20, 0x85, 0x59, 0x67, 0x20, 0xdc, - 0xcf, 0x07, 0x41, 0xbd, 0x8b, 0xeb, 0xe1, 0x89, 0x6a, 0x2b, 0xb0, 0xfe, - 0x2d, 0x2b, 0xa0, 0x53, 0x72, 0x3d, 0x84, 0xbf, 0xa5, 0x0b, 0x2d, 0x8f, - 0xe9, 0x71, 0x97, 0x8b, 0xb3, 0x9c, 0x79, 0x45, 0x1a, 0xb1, 0x55, 0xc3, - 0xf7, 0xb7, 0x22, 0x05, 0x2f, 0x82, 0x0f, 0x4a, 0x11, 0xda, 0xd4, 0x4a, - 0xfa, 0xde, 0xa2, 0xa9, 0xda, 0xa9, 0x63, 0xde, 0xba, 0x0f, 0x6d, 0x23, - 0x2b, 0x3f, 0x7f, 0x1f, 0x6f, 0x26, 0xe8, 0x55, 0x22, 0xe0, 0x4c, 0x7f, - 0x35, 0x3e, 0x01, 0x73, 0xf7, 0x1c, 0xca, 0x03, 0x40, 0xe5, 0x4e, 0x5f, - 0x31, 0x4e, 0xff, 0xa1, 0x1c, 0x41, 0xa9, 0xc3, 0x9a, 0xc2, 0x3c, 0x90, - 0xd6, 0xa8, 0x53, 0x83, 0x37, 0x65, 0x71, 0x81, 0xca, 0x3f, 0x1f, 0xc3, - 0x3c, 0x8a, 0x6a, 0xc2, 0xd9, 0xf8, 0x20, 0x7f, 0x43, 0xf1, 0x35, 0x43, - 0xf7, 0x27, 0x3b, 0xb7, 0xbc, 0xa0, 0x47, 0x28, 0x0a, 0xa5, 0xdb, 0x1c, - 0xb7, 0x3d, 0x7d, 0x17, 0x11, 0x44, 0x63, 0x27, 0x88, 0xd2, 0xda, 0xbc, - 0xee, 0xbb, 0x1b, 0xb1, 0x30, 0xfe, 0xba, 0xa6, 0x7f, 0x78, 0xd8, 0x1e, - 0xe7, 0xfa, 0xfa, 0x5c, 0xa6, 0x27, 0x1c, 0x9a, 0xa7, 0x4f, 0x40, 0xff, - 0xa3, 0xf4, 0x92, 0x97, 0xc1, 0xde, 0x0a, 0x85, 0x65, 0x08, 0x89, 0xc0, - 0xd8, 0xee, 0xd2, 0x0d, 0x2c, 0x22, 0xcc, 0xa2, 0x10, 0xc2, 0x62, 0x3a, - 0x11, 0xcd, 0x19, 0x3e, 0x7f, 0xf5, 0x68, 0xa1, 0xfa, 0x24, 0x4a, 0x30, - 0x21, 0x77, 0x39, 0x59, 0xa9, 0x8b, 0x8f, 0x7a, 0xbc, 0x06, 0x42, 0x5f, - 0xea, 0xe0, 0x58, 0x32, 0xad, 0x7b, 0x43, 0x49, 0xfb, 0x10, 0x22, 0xce, - 0xbb, 0xb8, 0xc1, 0x43, 0x26, 0x88, 0xe8, 0xea, 0x4e, 0x1b, 0x82, 0xe8, - 0x5f, 0xf2, 0x73, 0xf8, 0x58, 0x7b, 0x58, 0x6b, 0x1f, 0x82, 0xfe, 0x6b, - 0x8d, 0x2d, 0x7b, 0x0f, 0x32, 0x45, 0xe3, 0xda, 0xdd, 0x4e, 0x65, 0x37, - 0xdf, 0x76, 0x2a, 0x05, 0x5d, 0xb5, 0x79, 0x48, 0xff, 0x85, 0x84, 0x66, - 0xcd, 0x30, 0xd2, 0x66, 0xbe, 0xae, 0xf5, 0xf3, 0x16, 0xa7, 0xdc, 0x09, - 0x60, 0xc0, 0x59, 0xd3, 0x71, 0x81, 0x53, 0xe7, 0x22, 0xf5, 0x48, 0xef, - 0xb4, 0xcf, 0x6d, 0xd2, 0x03, 0xbb, 0xca, 0xcc, 0x30, 0x3f, 0x23, 0x56, - 0x4d, 0x1e, 0x18, 0x74, 0x0e, 0x8b, 0x4a, 0xf8, 0xbd, 0xe5, 0xdf, 0x25, - 0xdb, 0x0b, 0xf7, 0x90, 0xe9, 0x73, 0xde, 0x5c, 0x90, 0x30, 0x1b, 0x11, - 0x1f, 0xec, 0x1d, 0x50, 0xdd, 0x54, 0x82, 0x81, 0x87, 0xdf, 0x84, 0xea, - 0xb4, 0x09, 0x74, 0x17, 0xd3, 0x68, 0x6e, 0xa5, 0x80, 0x42, 0x62, 0x47, - 0xfb, 0x93, 0x3e, 0xf6, 0x9d, 0xbc, 0x7e, 0xe2, 0x3c, 0xef, 0x2c, 0xa0, - 0xcf, 0x91, 0x49, 0xf2, 0xf0, 0xed, 0x3f, 0x24, 0x8b, 0xc4, 0xb4, 0x90, - 0x35, 0xeb, 0x82, 0xae, 0x38, 0xed, 0xfc, 0xbd, 0x48, 0x58, 0x87, 0x2e, - 0x20, 0x3d, 0xf7, 0x68, 0xa2, 0xdd, 0xce, 0xff, 0xf8, 0x4b, 0x76, 0x7c, - 0xf1, 0x68, 0x93, 0x1a, 0xe2, 0x65, 0x85, 0xa9, 0x4d, 0xf3, 0x36, 0x40, - 0x66, 0xfc, 0x29, 0x5d, 0x72, 0x77, 0xe7, 0x82, 0x75, 0x09, 0x3e, 0xea, - 0x4c, 0xd4, 0x5f, 0xf3, 0xec, 0xd9, 0x47, 0xcc, 0x38, 0x8f, 0xac, 0xc4, - 0x12, 0x60, 0xa2, 0x84, 0x39, 0x5f, 0xfb, 0xb8, 0x8d, 0x18, 0xcd, 0x2d, - 0x8f, 0x72, 0xd6, 0xfc, 0x0e, 0x82, 0x4f, 0x45, 0xa2, 0x2e, 0x38, 0xc8, - 0xb5, 0xb2, 0x7f, 0xed, 0x74, 0x4b, 0xc2, 0xc0, 0x24, 0xf8, 0x4f, 0xc0, - 0x25, 0xf2, 0x2f, 0xec, 0xef, 0xaa, 0x26, 0x44, 0xbe, 0x8d, 0x9e, 0xa2, - 0x7d, 0x92, 0xe1, 0xa1, 0x54, 0xb9, 0x4d, 0xf3, 0x82, 0x2e, 0xe0, 0x65, - 0x54, 0x44, 0xa1, 0x82, 0x80, 0x97, 0x63, 0x56, 0xac, 0xc4, 0x34, 0x74, - 0x63, 0x8b, 0xb0, 0xa8, 0x49, 0xf4, 0x79, 0x23, 0xa2, 0x7d, 0xf4, 0x68, - 0x6f, 0x1f, 0x40, 0x82, 0xe8, 0x73, 0x3a, 0x64, 0x7c, 0x83, 0xd9, 0x69, - 0xb4, 0x5b, 0xe2, 0xde, 0xc3, 0xb0, 0xe5, 0x0c, 0x68, 0x55, 0x90, 0xf5, - 0x07, 0xfc, 0x0f, 0xc5, 0xc3, 0xe2, 0x6e, 0x6c, 0xb1, 0xa4, 0x60, 0xc8, - 0xe3, 0x8b, 0x77, 0x63, 0xea, 0x08, 0x95, 0x97, 0x60, 0x6e, 0x3d, 0x5e, - 0xb3, 0xf7, 0xe4, 0xf2, 0x31, 0x3c, 0xf8, 0xcd, 0x5e, 0xad, 0xa7, 0x56, - 0xdb, 0x91, 0x75, 0xc1, 0x78, 0xf7, 0x7f, 0x45, 0x63, 0x03, 0xa4, 0xfc, - 0xf5, 0x66, 0x52, 0xaf, 0xca, 0xce, 0x9c, 0x5e, 0x52, 0x7c, 0xdc, 0x3b, - 0xcb, 0x2e, 0x4a, 0xe6, 0x50, 0x0f, 0x89, 0x40, 0x20, 0x91, 0x61, 0xa1, - 0xda, 0xcd, 0x2d, 0x49, 0x1a, 0x9f, 0xbd, 0x4d, 0x8c, 0xd0, 0xc7, 0xe9, - 0x38, 0x3f, 0xbc, 0x37, 0xab, 0xd1, 0x80, 0x10, 0xb7, 0x17, 0x50, 0x61, - 0xe0, 0xc8, 0x79, 0x7a, 0x91, 0x66, 0xe3, 0x97, 0x6f, 0x48, 0xac, 0x14, - 0xea, 0x84, 0x5c, 0x71, 0xd4, 0xbd, 0x26, 0x0a, 0x73, 0x69, 0x11, 0x20, - 0x58, 0x53, 0x80, 0xee, 0x1c, 0xc5, 0x92, 0x09, 0x84, 0x7d, 0x52, 0xb1, - 0x84, 0x3c, 0x32, 0x95, 0xe0, 0x1e, 0x07, 0x24, 0xf7, 0xfd, 0xdd, 0xa4, - 0xe2, 0xfa, 0x72, 0xca, 0xeb, 0x7f, 0x5c, 0xef, 0x2c, 0xfa, 0xdc, 0xa3, - 0x14, 0x55, 0x41, 0xdf, 0x47, 0xdf, 0xb1, 0xe8, 0x8b, 0x47, 0x3a, 0xbd, - 0x57, 0x1c, 0x3a, 0x8a, 0x22, 0x89, 0x64, 0xe8, 0xe6, 0xb8, 0x87, 0xf8, - 0x99, 0x0e, 0x8c, 0xe5, 0xfc, 0x29, 0x97, 0xf7, 0xc8, 0xbb, 0x33, 0x45, - 0x80, 0x98, 0x37, 0x2c, 0xf9, 0xc9, 0x5c, 0x00, 0xa5, 0xc3, 0xbc, 0x01, - 0x87, 0x98, 0x32, 0x18, 0xb0, 0x1e, 0x6d, 0x62, 0x0c, 0x79, 0x70, 0xb4, - 0xfc, 0x27, 0xd4, 0x57, 0x15, 0x05, 0xf4, 0x0e, 0xe7, 0x25, 0x90, 0xbf, - 0xd9, 0x77, 0x71, 0x61, 0xfd, 0x5c, 0xab, 0xde, 0xe6, 0x0b, 0x31, 0x05, - 0x82, 0xaf, 0x48, 0xe3, 0xdc, 0xa5, 0x10, 0x0f, 0x64, 0x71, 0xf0, 0x4e, - 0x7f, 0xa8, 0xc1, 0x8d, 0xe7, 0x53, 0x9f, 0x9e, 0xb3, 0x97, 0x79, 0x11, - 0x4f, 0x17, 0xec, 0x9a, 0x55, 0xf0, 0x02, 0x47, 0x05, 0xa7, 0x31, 0xb7, - 0x2a, 0x17, 0xd8, 0x82, 0xc3, 0x28, 0x65, 0x14, 0x7a, 0x39, 0x84, 0x35, - 0xaa, 0x5a, 0x00, 0x4f, 0x0a, 0xf6, 0x9e, 0x02, 0xad, 0x8d, 0xaa, 0x66, - 0x6e, 0x9d, 0x33, 0x7b, 0x2b, 0x99, 0x09, 0x19, 0xad, 0x91, 0xbd, 0xf3, - 0x65, 0x20, 0xfe, 0x0b, 0xc8, 0xe6, 0x0f, 0xf9, 0x63, 0xa7, 0xd6, 0xc0, - 0x82, 0xfc, 0x2c, 0xdc, 0xc4, 0xb4, 0x4d, 0x78, 0xa1, 0x06, 0xeb, 0x6f, - 0x1e, 0x50, 0xbc, 0x97, 0xaa, 0xfc, 0x47, 0x2c, 0xed, 0xf7, 0x20, 0x01, - 0x61, 0x8d, 0x36, 0xa8, 0x25, 0x69, 0xcc, 0x84, 0x3c, 0xa8, 0x4b, 0x96, - 0x9a, 0xdd, 0x61, 0xa7, 0x07, 0x8e, 0xde, 0x49, 0xab, 0xae, 0xa1, 0xe3, - 0xf7, 0x4f, 0x43, 0x87, 0xa6, 0x4e, 0xce, 0x3b, 0x30, 0xcd, 0xe5, 0x7a, - 0x05, 0xa9, 0x73, 0x85, 0xc8, 0x62, 0x8c, 0x85, 0x99, 0xf2, 0x24, 0x22, - 0x89, 0xfc, 0x4f, 0x9f, 0xfc, 0x6d, 0x75, 0x85, 0x97, 0x10, 0x72, 0xc9, - 0x37, 0x8d, 0x41, 0xa7, 0x95, 0x20, 0xf9, 0x9f, 0xaa, 0xfb, 0xc0, 0x9a, - 0xbe, 0x35, 0x30, 0xd5, 0x27, 0x8c, 0x4a, 0x57, 0x02, 0x6c, 0xd8, 0xa3, - 0xc2, 0xf4, 0xa6, 0xaa, 0x68, 0x91, 0x04, 0xc2, 0x02, 0x0b, 0x5a, 0xbb, - 0xf2, 0xc1, 0x8f, 0xd9, 0xbb, 0x5d, 0xe3, 0x23, 0x86, 0xbf, 0xde, 0xdb, - 0x87, 0x1e, 0xbc, 0xb1, 0x3a, 0xc0, 0x7c, 0xd2, 0xaf, 0x5a, 0xcf, 0x0f, - 0x51, 0x03, 0x65, 0x08, 0x57, 0xa7, 0x54, 0x4f, 0xe2, 0x32, 0x86, 0x8c, - 0x01, 0x6a, 0x0a, 0xd6, 0x5a, 0x07, 0x77, 0x6c, 0xb0, 0x2f, 0x48, 0x96, - 0xe2, 0xdd, 0x95, 0xc4, 0xb9, 0x28, 0x4f, 0x39, 0x22, 0x11, 0x0f, 0x29, - 0xb6, 0x1a, 0xae, 0x75, 0xad, 0x23, 0xac, 0x23, 0xf5, 0xe0, 0xec, 0x32, - 0x8b, 0x4e, 0x4e, 0x38, 0x77, 0xe0, 0x5b, 0xa4, 0x8d, 0x28, 0xac, 0xa9, - 0xa4, 0xc1, 0xa1, 0x11, 0xdd, 0x2d, 0x46, 0x5f, 0xd9, 0x46, 0x1c, 0xb4, - 0xa3, 0xe2, 0xbd, 0xd4, 0xe4, 0x08, 0xba, 0xe2, 0xf8, 0xad, 0x4f, 0x03, - 0xd6, 0x47, 0x87, 0x61, 0xbf, 0x29, 0x8a, 0x3d, 0x8f, 0x8f, 0x69, 0x0a, - 0x3d, 0xed, 0xd2, 0xe1, 0xa0, 0x94, 0xf0, 0x00, 0x12, 0xf0, 0x2f, 0x5e, - 0x80, 0x2b, 0xa4, 0x5a, 0xd2, 0x49, 0x8c, 0xd5, 0x87, 0xa6, 0xab, 0x40, - 0x40, 0x08, 0xfe, 0x13, 0x84, 0x36, 0xd6, 0x26, 0x7d, 0xf1, 0x61, 0xeb, - 0xb3, 0x7a, 0xcb, 0x91, 0x85, 0xe0, 0x39, 0x45, 0xf4, 0x05, 0x2b, 0x7f, - 0x88, 0x6d, 0xb7, 0xf6, 0xd8, 0x1f, 0xc0, 0x04, 0x80, 0x6a, 0x0d, 0x41, - 0x78, 0x92, 0x29, 0x03, 0xc0, 0x24, 0xe4, 0x03, 0x0a, 0xa7, 0xd5, 0xb0, - 0x6e, 0x08, 0xad, 0x7c, 0xd8, 0x3d, 0xf8, 0x55, 0xa7, 0xc4, 0x1f, 0xe1, - 0x69, 0xf8, 0x8d, 0xb4, 0x68, 0x0c, 0x2a, 0xba, 0xdd, 0x0f, 0xb8, 0x48, - 0xce, 0x01, 0x18, 0x74, 0xe4, 0x60, 0xdb, 0x20, 0x43, 0x35, 0xd9, 0x0e, - 0x55, 0x52, 0x3d, 0x81, 0xb4, 0x8d, 0x60, 0x39, 0x3f, 0x1c, 0x28, 0x64, - 0xca, 0x36, 0x42, 0x0d, 0xbc, 0xc4, 0x75, 0x01, 0x57, 0x67, 0x28, 0x39, - 0x45, 0xa0, 0xbb, 0x83, 0x89, 0x26, 0xc8, 0x2f, 0x6d, 0x27, 0x33, 0x74, - 0xef, 0x97, 0x71, 0x39, 0xce, 0x74, 0x94, 0x1d, 0xe6, 0xd7, 0x15, 0xab, - 0xae, 0x55, 0x03, 0xeb, 0xb0, 0xf4, 0x79, 0x09, 0x2d, 0xf8, 0x9b, 0x2b, - 0x25, 0x1b, 0x52, 0xe3, 0x67, 0xa5, 0xf3, 0x8e, 0x72, 0x3d, 0xcf, 0x92, - 0x6a, 0xef, 0x35, 0x71, 0xcb, 0x93, 0x09, 0x4a, 0x26, 0x92, 0x91, 0x16, - 0x6b, 0x7d, 0xa8, 0xd0, 0x0a, 0x9c, 0xa6, 0xb0, 0x82, 0x1e, 0x19, 0xe9, - 0x1d, 0x6d, 0x85, 0x98, 0xba, 0xe9, 0xc4, 0xcd, 0x39, 0xc2, 0x6a, 0x5e, - 0x28, 0xec, 0xa7, 0x0b, 0x50, 0x76, 0x5d, 0xde, 0x80, 0x7f, 0x57, 0x91, - 0x19, 0xdd, 0xbb, 0x5e, 0xac, 0x82, 0x91, 0xc7, 0x95, 0xad, 0xd5, 0x9d, - 0xd7, 0xf3, 0x44, 0x88, 0x4e, 0xa3, 0x38, 0xd8, 0xf5, 0xc1, 0x9f, 0x5b, - 0x26, 0xcb, 0xbd, 0xe9, 0x35, 0x64, 0xa9, 0xa8, 0xbf, 0x3e, 0xf5, 0x98, - 0x7d, 0xb4, 0xfb, 0x1e, 0x22, 0xd9, 0xec, 0xa9, 0xce, 0x73, 0xe6, 0x13, - 0xc3, 0x1a, 0x9e, 0x67, 0xb3, 0x7f, 0x78, 0x5b, 0xb8, 0x53, 0xa4, 0xda, - 0x9c, 0x82, 0xff, 0x69, 0x17, 0x49, 0x5e, 0x16, 0x0a, 0x88, 0xe4, 0x13, - 0xd7, 0x56, 0x23, 0x07, 0x09, 0x60, 0x85, 0x7d, 0x68, 0xe9, 0x1a, 0x6d, - 0xeb, 0x1d, 0x6e, 0x2f, 0x81, 0xf8, 0x42, 0x81, 0x95, 0x96, 0x38, 0x10, - 0x3f, 0x6d, 0x88, 0x43, 0x91, 0xda, 0x16, 0x03, 0x2b, 0x3e, 0xc9, 0xb9, - 0xed, 0xc6, 0x24, 0xa7, 0xc4, 0xf5, 0x1a, 0x27, 0x37, 0xd9, 0xab, 0x8b, - 0xad, 0xa4, 0xae, 0xf5, 0x23, 0x87, 0x9a, 0x3e, 0x98, 0xca, 0x31, 0x5e, - 0x96, 0x0e, 0xa4, 0xd3, 0xff, 0x13, 0x4e, 0x14, 0x8e, 0xd1, 0x60, 0xac, - 0x4c, 0x10, 0x10, 0x21, 0xff, 0x90, 0x4c, 0x13, 0xea, 0xfa, 0x54, 0x98, - 0x4b, 0xe2, 0xaf, 0xf4, 0x3c, 0xc4, 0xda, 0x84, 0xac, 0x8a, 0xdf, 0xb3, - 0x7b, 0xda, 0x52, 0x90, 0xde, 0x3d, 0xd2, 0xc3, 0x00, 0x47, 0x85, 0x5b, - 0xd6, 0x14, 0x07, 0xd4, 0x96, 0xc9, 0x0e, 0x69, 0xcf, 0xef, 0x75, 0x39, - 0x6f, 0xf6, 0xb6, 0x07, 0x8d, 0x4f, 0xf1, 0x2e, 0xc0, 0x1e, 0x0d, 0x5e, - 0xd6, 0x37, 0xfd, 0xae, 0x1b, 0x10, 0x19, 0xb7, 0xa8, 0x3b, 0x4b, 0x35, - 0xbb, 0x2c, 0xe6, 0x20, 0x15, 0x59, 0x19, 0xab, 0x9b, 0x7f, 0x4e, 0x04, - 0x45, 0x87, 0x5f, 0xbe, 0x92, 0xf9, 0x10, 0x04, 0x50, 0xc6, 0x22, 0x9e, - 0xd5, 0x26, 0xb0, 0x98, 0x8d, 0x13, 0x53, 0x3a, 0x95, 0x95, 0x4a, 0xa7, - 0x2b, 0xfe, 0x6b, 0xd7, 0xf3, 0xd1, 0x22, 0xa2, 0x91, 0xa1, 0x08, 0xd2, - 0x06, 0x51, 0x8e, 0x2f, 0xd2, 0xcb, 0x88, 0x28, 0x69, 0xb3, 0x4f, 0x95, - 0x51, 0x34, 0xa9, 0x38, 0x0f, 0x12, 0x76, 0x81, 0x19, 0xed, 0xf9, 0xe5, - 0xed, 0x34, 0x9b, 0xd3, 0xf7, 0x51, 0xaf, 0x27, 0x39, 0x97, 0xc8, 0x91, - 0x8d, 0x86, 0x99, 0x04, 0x3b, 0xa3, 0x3e, 0xcf, 0xb7, 0xc4, 0x30, 0x1e, - 0x70, 0xd8, 0x60, 0x0a, 0x08, 0xe8, 0x53, 0xd2, 0xa2, 0x8b, 0x63, 0x07, - 0x67, 0x75, 0xf5, 0xf5, 0xa2, 0xb0, 0x45, 0xa0, 0xc9, 0xed, 0x7f, 0xfe, - 0x26, 0x49, 0x7d, 0x71, 0xc9, 0x08, 0xa4, 0xac, 0xc3, 0xe2, 0xde, 0x0f, - 0x8b, 0x3f, 0x41, 0x94, 0xec, 0x06, 0xca, 0x79, 0x1b, 0x29, 0x54, 0xa8, - 0x4e, 0x51, 0x05, 0x92, 0x95, 0x9a, 0x9c, 0xc0, 0x59, 0x00, 0x66, 0x3f, - 0x9f, 0xfd, 0xc7, 0x7e, 0xc4, 0x23, 0xcf, 0x46, 0x80, 0xe4, 0x9a, 0x48, - 0x26, 0x3a, 0xc1, 0x0d, 0xde, 0x2b, 0x20, 0xc7, 0xf8, 0x06, 0xfe, 0xfc, - 0x75, 0x6b, 0xef, 0xdc, 0x6e, 0x7d, 0xca, 0x2d, 0x6c, 0xfd, 0xdd, 0xa6, - 0x5f, 0xf9, 0x14, 0x54, 0x18, 0xfb, 0x2e, 0x32, 0x7e, 0xc6, 0xef, 0x7f, - 0x0a, 0x65, 0xe1, 0x96, 0xa4, 0xff, 0x84, 0xee, 0x83, 0x77, 0x0d, 0x92, - 0xfe, 0x2d, 0x30, 0xbf, 0x67, 0x0e, 0xa1, 0x21, 0xa0, 0x7a, 0x8a, 0x0d, - 0xe8, 0x0b, 0x52, 0x6b, 0x99, 0x95, 0xe3, 0xe4, 0x41, 0x74, 0xc4, 0x96, - 0x94, 0x02, 0x17, 0xb7, 0xd8, 0x46, 0x5f, 0xc5, 0x92, 0x50, 0x2a, 0x28, - 0xa9, 0xc9, 0x0b, 0x05, 0xe4, 0x1f, 0xa0, 0x59, 0x51, 0x7c, 0x97, 0x3a, - 0x29, 0x89, 0x65, 0x28, 0x7c, 0x4c, 0xb6, 0xd6, 0x84, 0x81, 0x68, 0x4a, - 0x94, 0x6c, 0x10, 0x44, 0x8b, 0xb3, 0x52, 0xa8, 0x93, 0x80, 0xd0, 0x63, - 0x20, 0xf5, 0xd9, 0x25, 0xf8, 0xfa, 0x17, 0xd4, 0xc2, 0x28, 0xb5, 0x1d, - 0xc8, 0x03, 0xed, 0x87, 0x51, 0xe0, 0x14, 0x45, 0xcc, 0x51, 0x1d, 0xc7, - 0xe1, 0x05, 0xd6, 0x53, 0x22, 0x58, 0x3e, 0x8c, 0x06, 0xee, 0xa6, 0x45, - 0xf0, 0xb3, 0xe9, 0x0f, 0xf5, 0x4a, 0x0b, 0xe6, 0xec, 0x34, 0xc4, 0x9f, - 0x76, 0x3f, 0x12, 0xf1, 0xdc, 0xc1, 0x86, 0xdf, 0x4d, 0x91, 0x6b, 0xd2, - 0x07, 0x12, 0x60, 0x8d, 0x83, 0x19, 0x67, 0x3a, 0xfd, 0x0a, 0x35, 0xfb, - 0xb9, 0x8a, 0x98, 0x0d, 0x39, 0x1e, 0xdd, 0xcf, 0xec, 0xea, 0x52, 0xe3, - 0xc9, 0x4d, 0x54, 0xfe, 0xb9, 0xbb, 0x98, 0x52, 0x09, 0x00, 0x0a, 0x68, - 0xc4, 0xde, 0x9c, 0x78, 0x69, 0x99, 0x66, 0x47, 0x33, 0x55, 0x9f, 0x72, - 0x63, 0xf5, 0x95, 0x93, 0xcd, 0xf4, 0x50, 0x9a, 0xdb, 0xbd, 0x01, 0xe9, - 0xc5, 0x5a, 0x53, 0xa8, 0x48, 0x68, 0xe9, 0xf9, 0xff, 0xdd, 0x3c, 0x4f, - 0xc8, 0xe2, 0xfc, 0x5b, 0xd0, 0x1b, 0x52, 0x20, 0xe4, 0x1f, 0xd5, 0x22, - 0x61, 0x8b, 0x3c, 0x1d, 0x13, 0xc6, 0xcd, 0x78, 0x54, 0xf4, 0x7b, 0x8d, - 0x86, 0x4b, 0xbf, 0xd3, 0xb2, 0xfc, 0xef, 0x1e, 0x80, 0x06, 0x24, 0x0a, - 0xd3, 0xf1, 0x5f, 0xb2, 0x5f, 0x72, 0x2b, 0xb1, 0x18, 0x35, 0xae, 0x0b, - 0x6f, 0x1b, 0x53, 0xd5, 0x42, 0x55, 0xca, 0x52, 0xd9, 0xbc, 0x29, 0x5d, - 0x2b, 0x7d, 0x44, 0x53, 0xd9, 0x5b, 0x8a, 0x19, 0xbf, 0x7f, 0x39, 0xca, - 0xd1, 0xfb, 0xb6, 0xc9, 0x2b, 0x27, 0x81, 0x33, 0x23, 0xb9, 0xdb, 0x16, - 0x6f, 0x48, 0x91, 0x01, 0xc9, 0x0e, 0x5c, 0x28, 0x29, 0xd5, 0x41, 0xff, - 0xc5, 0xe0, 0x67, 0x02, 0x4f, 0xcc, 0x0a, 0x38, 0xf4, 0x3a, 0xa0, 0x70, - 0x18, 0x2f, 0xdd, 0x7b, 0xdc, 0x98, 0xfb, 0x1c, 0x9f, 0x58, 0xf1, 0x77, - 0x11, 0x2a, 0x26, 0xfc, 0x10, 0xe0, 0x55, 0xe3, 0x0d, 0x97, 0xe1, 0x16, - 0xd8, 0x79, 0x2a, 0x98, 0x87, 0xe7, 0x43, 0x23, 0x58, 0x5a, 0x59, 0xb8, - 0xd9, 0xc9, 0x0f, 0x3a, 0x2a, 0x28, 0xfc, 0xbb, 0x5f, 0x58, 0x73, 0x3f, - 0x25, 0xcc, 0xb0, 0x08, 0x22, 0x27, 0x6b, 0xe4, 0x3e, 0xea, 0x80, 0x0b, - 0xee, 0x43, 0x10, 0x1c, 0x06, 0xe6, 0xb8, 0x07, 0x8d, 0x9e, 0x98, 0x87, - 0xec, 0x8e, 0x30, 0x51, 0x49, 0x1e, 0xfc, 0x63, 0x7a, 0x36, 0x64, 0xdf, - 0xc2, 0x47, 0xd7, 0x49, 0x09, 0x21, 0xd8, 0x03, 0x51, 0x52, 0xe6, 0x31, - 0x6c, 0x9d, 0xf7, 0xc2, 0x80, 0x8e, 0xdc, 0x2f, 0x2c, 0xd6, 0x57, 0x20, - 0xcf, 0x25, 0x95, 0xc4, 0xdc, 0xde, 0x2e, 0x54, 0xe0, 0x3e, 0x71, 0xf2, - 0xc4, 0x01, 0x09, 0x70, 0x26, 0xd7, 0x22, 0x08, 0x33, 0x0a, 0xb6, 0xff, - 0x08, 0x77, 0xc1, 0xe7, 0xcd, 0x8d, 0x53, 0xac, 0xba, 0xed, 0xab, 0xf1, - 0x6a, 0xbf, 0x5f, 0x13, 0x1d, 0x1e, 0x4b, 0x17, 0xe8, 0x29, 0x93, 0x0a, - 0x44, 0x09, 0x47, 0xd1, 0x03, 0x34, 0xca, 0x08, 0xe0, 0x32, 0xd0, 0xce, - 0xbf, 0xf9, 0x5f, 0x77, 0x21, 0x96, 0xe1, 0x00, 0x15, 0x7e, 0x73, 0xdc, - 0x66, 0x4d, 0xf0, 0xea, 0x47, 0xa3, 0x2c, 0x2d, 0x98, 0xd5, 0x6a, 0xbe, - 0xfe, 0xb2, 0x73, 0x4d, 0x8e, 0xea, 0xfc, 0x80, 0xf1, 0x00, 0x85, 0xed, - 0x5c, 0x55, 0x61, 0xc3, 0xfa, 0x60, 0xc0, 0x36, 0xda, 0x7b, 0x7a, 0x91, - 0x24, 0x28, 0x2b, 0xd4, 0xe7, 0x11, 0xad, 0x2d, 0xff, 0x33, 0x6c, 0xa3, - 0x78, 0xa0, 0x3a, 0x60, 0x55, 0x35, 0x78, 0x5c, 0x6d, 0xf1, 0xcb, 0x6e, - 0xcf, 0x13, 0x91, 0x4c, 0x84, 0x21, 0xf3, 0xae, 0xca, 0x6b, 0xe2, 0xbf, - 0x4f, 0xd5, 0xef, 0xb5, 0xb2, 0xb3, 0x37, 0xc7, 0x3f, 0xb1, 0xff, 0x13, - 0x2f, 0x9d, 0xb6, 0x14, 0x83, 0xb1, 0x47, 0x99, 0xb2, 0x3d, 0x94, 0xd6, - 0x02, 0x79, 0x6d, 0x28, 0xe7, 0xa5, 0x51, 0x6d, 0x69, 0xc1, 0xbf, 0x2f, - 0xe1, 0xbb, 0x4f, 0x61, 0x56, 0x59, 0xcb, 0xe6, 0x86, 0xfb, 0x03, 0xdb, - 0x10, 0xf7, 0xe3, 0x62, 0xeb, 0xfd, 0x06, 0xed, 0xdf, 0xab, 0x52, 0xaf, - 0xed, 0xdb, 0x16, 0x9b, 0x66, 0x4c, 0x5d, 0x43, 0x0f, 0xda, 0xa2, 0xba, - 0x9c, 0x07, 0x9d, 0xe0, 0x95, 0x8a, 0x45, 0xa8, 0x7a, 0xeb, 0xfe, 0x85, - 0xf0, 0xfd, 0x14, 0xd7, 0x73, 0x40, 0x20, 0x94, 0x01, 0x58, 0x11, 0x61, - 0x70, 0x73, 0xcf, 0xc5, 0x80, 0x0b, 0x5d, 0x3c, 0xe5, 0x65, 0x3e, 0x45, - 0x00, 0xb8, 0x4b, 0xf5, 0x92, 0x5f, 0xba, 0xb7, 0x80, 0x4b, 0xbb, 0x08, - 0x8a, 0x25, 0x11, 0x80, 0x17, 0x4d, 0x3d, 0x99, 0x77, 0x89, 0x8a, 0xb9, - 0x0e, 0xcf, 0x95, 0x89, 0xc9, 0x5b, 0xa1, 0x23, 0xe5, 0x38, 0xf8, 0x86, - 0x27, 0x86, 0x04, 0x39, 0xc8, 0x9e, 0x75, 0x59, 0x67, 0x2f, 0x02, 0x3d, - 0xe8, 0xb0, 0x58, 0x9c, 0xcf, 0x98, 0x3c, 0xf7, 0xbb, 0x80, 0xaf, 0xbf, - 0xce, 0xfd, 0xcd, 0x64, 0x53, 0x80, 0xdd, 0x2d, 0xc4, 0x49, 0xd0, 0x8f, - 0x42, 0xc7, 0xfd, 0x86, 0x03, 0xa8, 0x1f, 0x93, 0x2a, 0xd5, 0x30, 0x41, - 0x69, 0x39, 0x71, 0x36, 0xc0, 0xee, 0x48, 0x6a, 0x0c, 0x05, 0xbd, 0x97, - 0xd7, 0x89, 0x17, 0xbc, 0x37, 0xb5, 0x81, 0xd7, 0x66, 0x64, 0xf3, 0x6d, - 0xa7, 0x13, 0xe4, 0x93, 0x8c, 0x6d, 0xc9, 0xe3, 0x12, 0x2e, 0xc6, 0x64, - 0xfe, 0x25, 0x1e, 0x5a, 0xc4, 0x44, 0xcd, 0x8d, 0x93, 0xd7, 0x3c, 0x0a, - 0xde, 0x64, 0xdd, 0xda, 0x01, 0xbd, 0x05, 0x9d, 0x45, 0x5a, 0x3d, 0x52, - 0x18, 0x7e, 0x7f, 0x92, 0x9b, 0x94, 0x2e, 0xa9, 0xa6, 0x28, 0x10, 0x30, - 0x48, 0x89, 0x85, 0x1f, 0x9d, 0x54, 0xec, 0x21, 0x33, 0xdc, 0xa9, 0x46, - 0x97, 0x34, 0xf0, 0x64, 0xbd, 0xcf, 0x22, 0xdf, 0x6c, 0xaa, 0xe6, 0x63, - 0x58, 0x92, 0x8c, 0x69, 0x02, 0xa5, 0x53, 0x7d, 0x4b, 0x13, 0xc0, 0x37, - 0x32, 0xd7, 0xb5, 0x41, 0xf5, 0xbd, 0x79, 0xb0, 0x6a, 0x13, 0x2c, 0xfd, - 0x11, 0x13, 0xe9, 0x0b, 0xef, 0x46, 0xf6, 0xbe, 0x46, 0xf7, 0x54, 0xf0, - 0x96, 0x92, 0xe0, 0xab, 0xe9, 0xfa, 0x8d, 0xc9, 0x55, 0x62, 0x46, 0xc4, - 0x50, 0xc4, 0x2e, 0xea, 0xff, 0x85, 0x7e, 0xe9, 0x16, 0xc7, 0x82, 0x30, - 0x52, 0xfc, 0x19, 0x61, 0xd2, 0x13, 0xf7, 0x6f, 0x3d, 0xb7, 0x46, 0x85, - 0x13, 0x81, 0x65, 0x85, 0xc4, 0x75, 0x71, 0xf6, 0x83, 0x53, 0x6f, 0x09, - 0x44, 0x28, 0x99, 0x0d, 0x43, 0xb6, 0xde, 0xbc, 0xa4, 0xf7, 0xe4, 0xa4, - 0x33, 0x22, 0x78, 0x3e, 0x10, 0x1f, 0x7d, 0xe8, 0x07, 0xb5, 0xba, 0x02, - 0xf1, 0x0b, 0x26, 0xe3, 0x3c, 0x15, 0x7c, 0x6f, 0x93, 0xdd, 0xb5, 0x85, - 0x17, 0x29, 0xea, 0xed, 0x70, 0xe2, 0x1b, 0x47, 0xcc, 0xa2, 0x45, 0x14, - 0xfc, 0x86, 0xef, 0x01, 0xf6, 0xf9, 0xd1, 0xdd, 0x5b, 0x14, 0x33, 0xf3, - 0x35, 0x9f, 0x0c, 0xe4, 0xe9, 0xfb, 0x6c, 0x64, 0x76, 0x8a, 0xc1, 0xf9, - 0x15, 0xdf, 0xea, 0xdd, 0xdc, 0x96, 0xe3, 0x36, 0xe2, 0x55, 0xee, 0x8d, - 0x73, 0x6e, 0x04, 0x01, 0x69, 0xb7, 0x07, 0x01, 0xd4, 0x22, 0xf0, 0xfc, - 0x8a, 0x2d, 0x50, 0xd9, 0xb0, 0xae, 0x89, 0x03, 0xe9, 0xae, 0x1c, 0x73, - 0x8e, 0x06, 0xa1, 0x29, 0x5d, 0x3f, 0xc3, 0x62, 0x30, 0x23, 0x25, 0x36, - 0xde, 0xfc, 0xb7, 0x21, 0x24, 0xd4, 0xb4, 0x73, 0x04, 0xd2, 0x60, 0x56, - 0x4f, 0xb7, 0xb3, 0x3e, 0x51, 0xc8, 0xa0, 0x28, 0xf4, 0xe1, 0x15, 0x94, - 0x46, 0x46, 0x18, 0xa6, 0xf4, 0x9e, 0x33, 0x6e, 0x2e, 0xb9, 0x6d, 0xa3, - 0x66, 0x1c, 0x30, 0x15, 0x45, 0x5e, 0x06, 0xa5, 0xaf, 0x4d, 0x41, 0xf4, - 0xee, 0x4b, 0x3d, 0x99, 0x02, 0x6c, 0x1f, 0x98, 0xc7, 0x48, 0xe8, 0xd1, - 0xd6, 0x20, 0x9a, 0xbd, 0xad, 0x33, 0xd1, 0xcc, 0xae, 0xa3, 0xdf, 0xf6, - 0xee, 0xfe, 0x07, 0xe6, 0x21, 0x21, 0xb4, 0x2a, 0x4b, 0x6d, 0xd9, 0x79, - 0x48, 0x81, 0xc2, 0xe9, 0x07, 0x74, 0x61, 0xf6, 0xe5, 0x4e, 0xea, 0x58, - 0xbf, 0xc6, 0xe3, 0x4b, 0x34, 0x0b, 0x89, 0x79, 0x16, 0xbf, 0x27, 0xd7, - 0x88, 0x65, 0x32, 0x0b, 0x7d, 0xdc, 0xf6, 0xc4, 0x7a, 0x45, 0xb0, 0xb4, - 0x25, 0x30, 0x9b, 0xcb, 0xbe, 0x5b, 0xdc, 0xa9, 0x6f, 0x05, 0x48, 0xb6, - 0x91, 0x68, 0x5e, 0x43, 0x83, 0x25, 0x30, 0xf8, 0x8b, 0x59, 0x4b, 0x6f, - 0x00, 0xc7, 0x40, 0xa9, 0xe8, 0x17, 0xeb, 0x8c, 0x24, 0xeb, 0xcd, 0x3e, - 0x1a, 0xef, 0x02, 0x26, 0xe9, 0x73, 0xa6, 0xf9, 0xb8, 0xc4, 0x19, 0x97, - 0x1c, 0x6b, 0x97, 0x84, 0x2d, 0xb2, 0x00, 0x9e, 0xb2, 0x17, 0x38, 0xe2, - 0x65, 0x54, 0x57, 0x6e, 0xce, 0x7a, 0x34, 0xae, 0x40, 0x17, 0x5e, 0x73, - 0x3c, 0x86, 0x9d, 0x37, 0xe7, 0x7e, 0x0a, 0x89, 0x72, 0x17, 0x4d, 0x8e, - 0x2b, 0x63, 0x24, 0x4a, 0x4f, 0xc2, 0xc5, 0x99, 0xb6, 0x69, 0x0c, 0x07, - 0x2f, 0x7d, 0x3a, 0xc9, 0x95, 0x53, 0x5e, 0xb1, 0x4d, 0x1c, 0xf2, 0x2d, - 0xfb, 0xd9, 0xfa, 0x00, 0xca, 0xb2, 0xad, 0x19, 0x67, 0xf5, 0xc8, 0xa2, - 0x02, 0x16, 0xbc, 0xa9, 0x2e, 0x3e, 0x11, 0x46, 0x77, 0xf1, 0x45, 0xa2, - 0x39, 0xd9, 0xa5, 0x52, 0x9e, 0x22, 0xe7, 0xb1, 0x65, 0x58, 0x72, 0x45, - 0xf1, 0xb1, 0x6c, 0x8f, 0xe3, 0xd4, 0xda, 0x07, 0x6a, 0x0b, 0xd1, 0x56, - 0xc0, 0x89, 0xbf, 0x1c, 0x93, 0xe8, 0xfb, 0xa4, 0x29, 0x15, 0xad, 0x17, - 0x7b, 0x4f, 0xcb, 0x0f, 0xdf, 0x28, 0xea, 0xe8, 0xbe, 0xb7, 0x6b, 0xf1, - 0xf7, 0xc5, 0xdc, 0x53, 0x73, 0x07, 0x02, 0x55, 0x47, 0x47, 0x6e, 0xd2, - 0xac, 0x4f, 0xae, 0x77, 0x63, 0xd5, 0x65, 0x79, 0x97, 0xa9, 0x69, 0x7f, - 0x53, 0xb7, 0x2f, 0x5e, 0x01, 0xd8, 0xd8, 0x2d, 0xe1, 0xe8, 0x5f, 0x53, - 0x5c, 0x18, 0x25, 0x17, 0x58, 0x81, 0x42, 0x00, 0xc1, 0x89, 0x4c, 0x20, - 0xe1, 0x9a, 0x29, 0x67, 0xfa, 0xdd, 0x70, 0xf3, 0xfd, 0xe9, 0xee, 0x9a, - 0x8b, 0x93, 0xbf, 0x1f, 0xa8, 0xab, 0x96, 0x56, 0x08, 0x50, 0x35, 0x33, - 0x13, 0xca, 0xeb, 0xa4, 0xc8, 0x2d, 0x74, 0xb3, 0xd0, 0x1c, 0x6b, 0x1d, - 0x0a, 0x4d, 0xbd, 0x0c, 0x8e, 0xc6, 0xfc, 0x4e, 0x3c, 0x5d, 0x13, 0x8e, - 0x2a, 0xc9, 0x74, 0x72, 0x79, 0x77, 0x3a, 0x8c, 0x77, 0x91, 0x0f, 0x87, - 0xc9, 0x3b, 0xa8, 0xd4, 0x8c, 0xf3, 0xa1, 0xbd, 0xa5, 0xd6, 0xc0, 0x0f, - 0x3c, 0xeb, 0x13, 0x06, 0xdd, 0xaf, 0x94, 0x6f, 0x4d, 0x78, 0x7e, 0x09, - 0x38, 0xc3, 0xa1, 0xe9, 0xe4, 0x1d, 0x75, 0xfb, 0x2a, 0x81, 0x2a, 0x2c, - 0xd5, 0xac, 0x07, 0xcf, 0x17, 0x4f, 0xff, 0xc9, 0xd2, 0x77, 0x35, 0x24, - 0xea, 0x20, 0xb5, 0xd0, 0xee, 0x45, 0xb2, 0x12, 0x9f, 0x59, 0x42, 0x6e, - 0xc1, 0x3f, 0x54, 0xb1, 0xfb, 0x97, 0xc6, 0x2f, 0xee, 0xc4, 0xa6, 0x29, - 0x4e, 0xba, 0x9b, 0x42, 0x04, 0xa5, 0x4a, 0x36, 0x11, 0x12, 0xcb, 0xa9, - 0x4a, 0x0b, 0x75, 0xf2, 0x69, 0x37, 0x94, 0x72, 0x76, 0x7c, 0x9e, 0x4b, - 0x3b, 0xec, 0x64, 0x22, 0x53, 0xfe, 0x7e, 0xe9, 0x22, 0x85, 0x1e, 0xd3, - 0xad, 0xf0, 0xd1, 0x30, 0x80, 0xe6, 0x2b, 0x64, 0x96, 0x6c, 0xa9, 0x0a, - 0x8d, 0x63, 0x58, 0x0c, 0xda, 0x08, 0x40, 0x9f, 0x82, 0xd1, 0xff, 0x51, - 0xac, 0xdb, 0x7f, 0xaf, 0xa4, 0xc3, 0x92, 0xc5, 0xde, 0xba, 0x17, 0x02, - 0xfb, 0x35, 0x37, 0x68, 0x81, 0xe3, 0x82, 0x9d, 0xda, 0x13, 0x49, 0xe7, - 0x82, 0x0c, 0x29, 0x9e, 0xc7, 0xd1, 0xa1, 0x86, 0x2e, 0x7a, 0x3f, 0xb1, - 0xe8, 0x32, 0x84, 0xb8, 0xd4, 0x0a, 0x96, 0x95, 0x38, 0x6c, 0x62, 0x27, - 0xa6, 0x23, 0x46, 0xa0, 0x42, 0xd9, 0xf6, 0xdc, 0xc6, 0x71, 0x8c, 0x5d, - 0xc8, 0xc6, 0x7e, 0xba, 0xaf, 0x0b, 0xae, 0xd8, 0xb7, 0x76, 0x39, 0x9e, - 0x5d, 0x7a, 0x5a, 0xb5, 0x8e, 0x57, 0x94, 0xc3, 0x61, 0x6e, 0x92, 0xd8, - 0x52, 0x18, 0xb1, 0x6c, 0x72, 0xa1, 0x82, 0xfc, 0xcd, 0x5e, 0xdb, 0xfb, - 0x4a, 0x5c, 0xed, 0x9a, 0x45, 0x11, 0xf8, 0xff, 0x0d, 0xfd, 0xef, 0xff, - 0x92, 0x61, 0xf5, 0x6c, 0xa8, 0x9a, 0x18, 0x8c, 0x51, 0x96, 0x12, 0xa7, - 0x1f, 0x05, 0x20, 0x8a, 0x07, 0x00, 0xec, 0x84, 0xca, 0x2f, 0x46, 0xca, - 0x26, 0xf5, 0x75, 0x50, 0x30, 0x65, 0x64, 0x7a, 0xff, 0xbd, 0x4c, 0xe7, - 0xca, 0x34, 0x65, 0x8d, 0xb1, 0xde, 0x2f, 0x60, 0xa5, 0xcb, 0x1f, 0x11, - 0x38, 0x03, 0xcc, 0xdf, 0x4a, 0x5b, 0x8d, 0x9a, 0x19, 0x17, 0xbf, 0xa9, - 0xce, 0x53, 0x78, 0x45, 0xfd, 0xe3, 0x71, 0xe4, 0x29, 0x02, 0x41, 0x6c, - 0x0d, 0xc2, 0x9c, 0xa0, 0x8a, 0x9a, 0x1d, 0xb4, 0xdd, 0xa0, 0x2b, 0x91, - 0x8d, 0xc5, 0xa5, 0x7e, 0x68, 0x4b, 0xf0, 0x75, 0x0d, 0xa2, 0x53, 0x93, - 0x29, 0x05, 0x0f, 0x81, 0x8b, 0x04, 0x0c, 0x18, 0xd3, 0x8a, 0x89, 0x60, - 0xd3, 0x07, 0x7e, 0x13, 0x2b, 0x4f, 0x0f, 0x7b, 0x2c, 0xf5, 0x43, 0xc7, - 0xc3, 0x04, 0xba, 0x22, 0xb9, 0xe2, 0xdc, 0x3e, 0xee, 0xb1, 0x2c, 0x98, - 0x5f, 0x5e, 0xfa, 0x56, 0xbe, 0x2f, 0x24, 0xd9, 0xa6, 0xe6, 0xde, 0x17, - 0x60, 0x20, 0x3a, 0x04, 0xf0, 0x77, 0xbb, 0xc9, 0x33, 0x82, 0x28, 0x5f, - 0xa8, 0xe8, 0xa5, 0x22, 0xd9, 0x6f, 0x2e, 0x0f, 0x8b, 0x36, 0xd5, 0xda, - 0x1e, 0x75, 0x67, 0x3e, 0x36, 0x3a, 0xcf, 0x89, 0xb0, 0x38, 0x97, 0xde, - 0x2d, 0x43, 0x52, 0xd1, 0x06, 0x00, 0x22, 0x04, 0x5e, 0x21, 0xe8, 0x92, - 0x2d, 0xac, 0x60, 0xc2, 0xc8, 0x84, 0x3d, 0xf6, 0xa8, 0xb5, 0x5c, 0x72, - 0xb3, 0x01, 0x9f, 0x26, 0x55, 0xbd, 0xce, 0xbe, 0xd5, 0x93, 0xc3, 0xee, - 0x18, 0x84, 0x79, 0x08, 0xac, 0x6b, 0xa8, 0x2b, 0x7f, 0x97, 0x3e, 0x88, - 0x3e, 0xd3, 0x5a, 0xc3, 0xa1, 0xc6, 0x55, 0xad, 0xba, 0x39, 0x85, 0x73, - 0x6d, 0x0f, 0xdc, 0x5c, 0x7e, 0x82, 0xba, 0x61, 0x98, 0x4d, 0x58, 0x2b, - 0x92, 0x50, 0xee, 0xda, 0x09, 0xaa, 0x2b, 0x62, 0xe1, 0x2d, 0xa0, 0xfd, - 0xcd, 0x54, 0x38, 0x6b, 0x8a, 0x38, 0xf5, 0xb9, 0xfd, 0x5b, 0x6d, 0x8d, - 0x48, 0x88, 0x2a, 0x0e, 0xd9, 0x6e, 0x18, 0xec, 0x7d, 0xde, 0x08, 0x78, - 0x69, 0x1b, 0xd1, 0xfa, 0x33, 0x5a, 0x9b, 0x23, 0x79, 0x83, 0x92, 0x40, - 0xb2, 0x36, 0x28, 0xbe, 0x84, 0x62, 0x35, 0x88, 0xef, 0xca, 0xe9, 0xbd, - 0x77, 0x73, 0xed, 0x8f, 0xa0, 0xdd, 0xb3, 0xef, 0xb0, 0x04, 0x36, 0x8c, - 0xa0, 0xe8, 0xa8, 0x0c, 0xa4, 0x84, 0xee, 0xf0, 0x3d, 0x3f, 0x5a, 0x18, - 0x49, 0xef, 0x78, 0x77, 0xf6, 0x4b, 0x48, 0x89, 0xa9, 0x8e, 0x46, 0x3f, - 0xd9, 0xd7, 0x97, 0xfb, 0x14, 0xce, 0x88, 0xb6, 0x80, 0xe0, 0xf0, 0xd9, - 0x38, 0x0b, 0xfb, 0x7e, 0x17, 0x22, 0x3d, 0x55, 0xff, 0x24, 0x8f, 0xb3, - 0xbc, 0x76, 0xee, 0x4f, 0xc3, 0xbe, 0x96, 0xf6, 0x48, 0x6f, 0x64, 0xd5, - 0x9c, 0x98, 0x20, 0x26, 0x3b, 0xa8, 0xa3, 0x08, 0xb5, 0x1e, 0x84, 0x44, - 0x60, 0xae, 0xd1, 0x9f, 0x85, 0x63, 0xfb, 0x43, 0xed, 0xd9, 0xae, 0x83, - 0xf3, 0x17, 0x16, 0x39, 0x80, 0x85, 0x00, 0xae, 0x57, 0x5f, 0x8c, 0x1a, - 0x17, 0x2d, 0xb2, 0xae, 0xe4, 0x12, 0x51, 0xcc, 0x81, 0x97, 0xcb, 0x20, - 0x69, 0x76, 0x35, 0xb1, 0xc9, 0x92, 0x26, 0xf3, 0x03, 0x5e, 0x64, 0x44, - 0xaf, 0xe9, 0x28, 0x0e, 0x72, 0x6c, 0x92, 0xe3, 0x86, 0x03, 0x94, 0xe2, - 0xc8, 0x03, 0xbf, 0xbd, 0xee, 0xb2, 0xcd, 0x4c, 0xf0, 0x85, 0x68, 0xcd, - 0x3c, 0x77, 0xfa, 0x7e, 0x60, 0x97, 0x4e, 0x35, 0xc8, 0x14, 0xc1, 0xf7, - 0xf3, 0xb0, 0x1b, 0x29, 0x36, 0xe4, 0x49, 0x44, 0x19, 0xda, 0x32, 0x1b, - 0x4e, 0x7e, 0xd6, 0xa1, 0x94, 0x04, 0x38, 0x53, 0xa3, 0x1b, 0x5c, 0xdc, - 0xb2, 0x3e, 0xd6, 0xaf, 0x30, 0x4a, 0xdc, 0xd2, 0xfc, 0xce, 0xb3, 0x20, - 0x63, 0xb3, 0x67, 0xad, 0x74, 0xff, 0x1b, 0xb8, 0xb5, 0x02, 0x16, 0x11, - 0x2c, 0x0f, 0x55, 0x37, 0xff, 0x01, 0x3c, 0x55, 0x45, 0xf0, 0x86, 0x11, - 0x7d, 0xdd, 0x57, 0xe9, 0x62, 0x5b, 0xe7, 0xd3, 0x2a, 0x67, 0x62, 0x05, - 0x16, 0xb1, 0x1f, 0xf8, 0x41, 0xce, 0x56, 0x20, 0xa4, 0x11, 0xdc, 0xb7, - 0xc5, 0xff, 0x2f, 0x4f, 0xa8, 0xff, 0x97, 0x37, 0xea, 0xaf, 0xfe, 0x33, - 0xd2, 0x68, 0x49, 0xca, 0xd0, 0x10, 0xb1, 0x27, 0x85, 0x9e, 0xe9, 0xab, - 0x74, 0x6d, 0xcd, 0x0f, 0x4d, 0xa6, 0xb2, 0xd4, 0x4a, 0x47, 0xa2, 0xd4, - 0xac, 0x50, 0x17, 0x90, 0x47, 0xbf, 0x1b, 0x6f, 0x25, 0x91, 0x1b, 0x4b, - 0xb9, 0x5c, 0x57, 0xc5, 0x2f, 0xe5, 0x71, 0xe1, 0x30, 0xce, 0x4d, 0x72, - 0xdd, 0x97, 0x23, 0x41, 0x36, 0xc1, 0xdf, 0x74, 0xa9, 0x5b, 0xa8, 0xee, - 0x1a, 0x15, 0x29, 0x0e, 0x24, 0x11, 0xef, 0xbc, 0x43, 0x59, 0x5c, 0x2d, - 0x13, 0xed, 0x80, 0x4b, 0xf6, 0x76, 0xf6, 0x01, 0x6c, 0xfe, 0xcb, 0xad, - 0x9f, 0x3f, 0xad, 0x14, 0xd0, 0x5d, 0xe0, 0x36, 0x73, 0x2d, 0x38, 0x19, - 0x40, 0xe3, 0x27, 0x63, 0x9b, 0x34, 0x47, 0x02, 0x1e, 0x69, 0x7f, 0xd6, - 0xc5, 0xd0, 0x75, 0x70, 0xd2, 0xe6, 0x3c, 0x7c, 0xdb, 0xec, 0x41, 0xa5, - 0x69, 0x44, 0x8b, 0xed, 0x9d, 0x16, 0x30, 0x92, 0x4e, 0x94, 0xd5, 0x31, - 0x49, 0x0f, 0x1a, 0x9e, 0x90, 0x16, 0x09, 0xff, 0xce, 0xa2, 0xd4, 0x4c, - 0x64, 0x39, 0xb6, 0x8e, 0x3a, 0x12, 0x35, 0x53, 0x06, 0x52, 0xf1, 0x2a, - 0xa2, 0x49, 0x1b, 0xff, 0xb6, 0x29, 0xf1, 0x01, 0x4a, 0x8c, 0xf8, 0x9d, - 0xcf, 0x70, 0xd5, 0x13, 0xae, 0x72, 0x01, 0x6b, 0x3d, 0x60, 0x41, 0x87, - 0x8b, 0x1a, 0x17, 0x27, 0xc7, 0x51, 0xba, 0x27, 0x21, 0xdf, 0xb2, 0x8a, - 0x76, 0x65, 0x52, 0xe5, 0x64, 0x8a, 0x2e, 0x65, 0x2b, 0xb4, 0xf8, 0x3d, - 0x18, 0x39, 0xfa, 0xf1, 0x7b, 0xee, 0x2e, 0xaa, 0x7d, 0xed, 0xab, 0x27, - 0x98, 0x58, 0x41, 0x2d, 0xd0, 0x4b, 0xe5, 0x75, 0xa1, 0x88, 0xc0, 0x88, - 0x8f, 0x7c, 0xa4, 0x16, 0x95, 0x9d, 0x65, 0xef, 0x95, 0xd2, 0xd6, 0x6f, - 0x03, 0xc2, 0x45, 0x35, 0xbc, 0x64, 0xd5, 0x53, 0xb6, 0xa5, 0xd6, 0x95, - 0x50, 0x63, 0xe6, 0x44, 0x23, 0xa9, 0x59, 0x1c, 0x7d, 0x63, 0xa3, 0x27, - 0x9b, 0xca, 0x5d, 0x4a, 0x7e, 0xf8, 0x93, 0xaa, 0x7f, 0x6a, 0x46, 0x4b, - 0x8e, 0x6a, 0x9a, 0xc9, 0x69, 0xeb, 0x32, 0x12, 0xac, 0x25, 0x56, 0x67, - 0x9e, 0xb9, 0x0f, 0x9c, 0xb5, 0xca, 0x0b, 0xd9, 0x72, 0x8c, 0x26, 0x9b, - 0x6d, 0xbf, 0xd0, 0x33, 0xd9, 0xa5, 0x53, 0xed, 0xea, 0x66, 0xab, 0x4f, - 0x20, 0x6e, 0x8c, 0xc2, 0xac, 0x20, 0x97, 0x0e, 0xcc, 0xad, 0x17, 0x8e, - 0xe2, 0xdc, 0xda, 0xef, 0x2e, 0x43, 0x62, 0xb0, 0xc0, 0x7f, 0x82, 0x20, - 0xe2, 0x80, 0xbe, 0xb6, 0x28, 0xdb, 0x1f, 0x1a, 0x60, 0xe7, 0x0d, 0xba, - 0x6e, 0xc0, 0xfa, 0x36, 0x16, 0x3b, 0xc4, 0xac, 0x5f, 0xf4, 0xa2, 0x6a, - 0x3f, 0x0f, 0x50, 0xf9, 0xe6, 0xb5, 0x89, 0x80, 0x66, 0xda, 0x1a, 0x76, - 0xe2, 0xd3, 0x65, 0x77, 0x8a, 0xf2, 0xc7, 0xe8, 0x46, 0x9f, 0xa8, 0x36, - 0x7b, 0x80, 0xa6, 0xd4, 0xb5, 0xe3, 0x89, 0x15, 0x83, 0x12, 0xf8, 0xeb, - 0x02, 0x93, 0xa5, 0x44, 0x2c, 0xf0, 0x7d, 0xb7, 0x47, 0x95, 0x7a, 0x4c, - 0x70, 0x6f, 0xba, 0xf8, 0x43, 0x62, 0x50, 0x2e, 0x6e, 0xf3, 0x2e, 0x1d, - 0xff, 0xd8, 0xc5, 0xf5, 0x02, 0xcb, 0x55, 0xf3, 0x72, 0xff, 0x16, 0x94, - 0x95, 0x28, 0x5a, 0x8c, 0xe1, 0xad, 0x63, 0x9e, 0xfd, 0x8e, 0xcb, 0x3d, - 0x6a, 0x3e, 0x6a, 0xe4, 0x23, 0x5c, 0x79, 0x2e, 0x18, 0x01, 0x14, 0x4f, - 0xb8, 0x83, 0xed, 0xfe, 0x07, 0x84, 0xf6, 0x39, 0x15, 0xdb, 0xe3, 0xfe, - 0x9c, 0xc9, 0x74, 0xc9, 0xb5, 0x8f, 0x02, 0x32, 0x03, 0x25, 0x93, 0x36, - 0x20, 0x4f, 0xcf, 0x80, 0xc4, 0x1c, 0x44, 0x5c, 0xb2, 0xbb, 0x01, 0x96, - 0x33, 0xd1, 0x16, 0x07, 0x81, 0x7c, 0x67, 0x1b, 0x65, 0x5e, 0x08, 0x9a, - 0xb8, 0xd0, 0xb3, 0xf2, 0x6d, 0x16, 0x2a, 0x1e, 0xe5, 0x44, 0x1b, 0xcd, - 0x1f, 0xf7, 0x14, 0x2e, 0xdb, 0x08, 0xc4, 0xd4, 0xb5, 0x8c, 0x40, 0x42, - 0xdb, 0x27, 0x20, 0x6d, 0x45, 0x65, 0xbf, 0x17, 0x45, 0x84, 0xa1, 0xc0, - 0x52, 0xc6, 0x52, 0x98, 0x5e, 0x3b, 0x6a, 0xeb, 0xd4, 0x64, 0xae, 0x52, - 0x52, 0xe1, 0x95, 0xa6, 0x0e, 0xb8, 0x62, 0x92, 0x1a, 0x18, 0x52, 0x29, - 0xa3, 0x78, 0x60, 0xd7, 0x97, 0x9d, 0x5c, 0x26, 0xd9, 0x56, 0x2a, 0x3e, - 0xf3, 0xaf, 0x79, 0x7f, 0xfe, 0xc6, 0xb9, 0xc1, 0x7f, 0x83, 0xab, 0x2b, - 0xed, 0x92, 0xe0, 0x30, 0x98, 0xf5, 0xda, 0xf6, 0x0b, 0x6e, 0x85, 0xed, - 0x38, 0x21, 0x64, 0x30, 0x0c, 0x04, 0xfd, 0x29, 0x4c, 0x7e, 0x32, 0x3f, - 0x91, 0x54, 0x97, 0x64, 0x19, 0x38, 0x8b, 0xda, 0xef, 0x65, 0xe2, 0xe4, - 0xec, 0xe5, 0xed, 0x42, 0x20, 0x9c, 0x3a, 0xa5, 0x55, 0xd8, 0x0b, 0x94, - 0xe2, 0xff, 0xe7, 0x71, 0x23, 0xb2, 0xfb, 0xe7, 0xfc, 0x4d, 0x93, 0x7d, - 0x00, 0xf9, 0xbe, 0x00, 0xaa, 0x99, 0x44, 0x3b, 0xd4, 0x1e, 0xcd, 0xb1, - 0x20, 0x65, 0xde, 0x6c, 0xb4, 0x10, 0x71, 0xed, 0x89, 0xff, 0x74, 0x70, - 0x64, 0x69, 0x75, 0xd1, 0xe7, 0x9e, 0x90, 0x80, 0x37, 0xa0, 0x3c, 0xcc, - 0x60, 0x19, 0x87, 0xed, 0x96, 0xfe, 0x06, 0xa5, 0x3e, 0xa4, 0x9c, 0x82, - 0xaf, 0xf1, 0x5d, 0xa4, 0x80, 0xcc, 0x8d, 0xb7, 0x84, 0x2e, 0xc1, 0x88, - 0xc7, 0x14, 0x59, 0x86, 0x23, 0xb7, 0x96, 0x62, 0xf3, 0xb6, 0x66, 0x77, - 0xdb, 0x72, 0x30, 0xd5, 0x98, 0xea, 0x71, 0xf9, 0x56, 0xe5, 0x2f, 0xb2, - 0x06, 0x59, 0x52, 0xc8, 0x3c, 0x06, 0x01, 0x91, 0x32, 0xd1, 0x52, 0x4d, - 0x00, 0x1e, 0x96, 0x8f, 0x05, 0xf0, 0x04, 0x71, 0x0f, 0xc0, 0x43, 0xa1, - 0xa8, 0x04, 0x7d, 0xb8, 0xfb, 0x3c, 0xd3, 0xfa, 0x2e, 0x03, 0x3e, 0x1b, - 0xd8, 0x97, 0xad, 0xd1, 0x5a, 0xbf, 0xb0, 0x1b, 0x88, 0xa8, 0x41, 0xa7, - 0xc0, 0x79, 0x66, 0x71, 0xea, 0xbc, 0x56, 0xf2, 0xb6, 0x4f, 0x61, 0x25, - 0xbe, 0xd0, 0x49, 0x63, 0x15, 0x06, 0x8e, 0x78, 0xad, 0x18, 0x64, 0xe9, - 0x7d, 0x87, 0x38, 0x07, 0xb7, 0xad, 0x44, 0xbc, 0xc4, 0x32, 0xdd, 0xb6, - 0xf3, 0x00, 0xf0, 0xb3, 0x5e, 0xc5, 0xc2, 0x7b, 0xba, 0x93, 0xdf, 0xcf, - 0xa4, 0xce, 0xd9, 0x01, 0x67, 0x0e, 0xd5, 0xa2, 0x1b, 0xf0, 0x16, 0x49, - 0x9f, 0xde, 0xbd, 0x3a, 0x88, 0xed, 0x4f, 0x40, 0xe5, 0xb6, 0x09, 0xee, - 0x75, 0xa1, 0x73, 0x8c, 0x71, 0x14, 0xc3, 0x7e, 0x0c, 0x0a, 0x54, 0xd7, - 0xcf, 0x9c, 0xa6, 0x56, 0x53, 0x27, 0xcb, 0x26, 0x26, 0x3f, 0x2f, 0x93, - 0xcf, 0xdc, 0xe7, 0x65, 0x21, 0xd0, 0x3a, 0x28, 0xa8, 0x7c, 0xa9, 0xde, - 0xce, 0xdb, 0xbc, 0x4b, 0x02, 0xa4, 0x3e, 0xc3, 0xa6, 0xca, 0x30, 0xf4, - 0x71, 0xee, 0x21, 0xd6, 0x65, 0x8a, 0x89, 0xda, 0x51, 0x6d, 0xbd, 0x56, - 0x30, 0xa5, 0x8c, 0x01, 0x7f, 0x2a, 0xa7, 0x33, 0x55, 0x43, 0xa6, 0xde, - 0xe6, 0x10, 0xab, 0x90, 0x84, 0xa2, 0x85, 0x5e, 0x0d, 0xc6, 0x3d, 0x8b, - 0x20, 0x38, 0x49, 0xb5, 0xc8, 0x20, 0xaa, 0xee, 0x47, 0x47, 0x09, 0x9e, - 0x6d, 0xd6, 0xec, 0xf7, 0xbb, 0x2f, 0xd3, 0x4e, 0x4f, 0xb0, 0x6f, 0xa0, - 0x6f, 0xa2, 0xb1, 0xc3, 0x49, 0x23, 0xb8, 0x75, 0xec, 0x84, 0xc7, 0xa3, - 0x7a, 0xe9, 0x7f, 0x87, 0xcb, 0xe5, 0x4a, 0x2e, 0x0f, 0x08, 0x68, 0xe1, - 0x6e, 0x7f, 0x0f, 0x19, 0x37, 0xe7, 0xc5, 0xd5, 0x30, 0x20, 0x29, 0x64, - 0x18, 0x61, 0xfe, 0x2b, 0x47, 0xa5, 0x54, 0x80, 0x2e, 0x73, 0xa8, 0x14, - 0xf6, 0xff, 0xd8, 0xcb, 0xd6, 0x03, 0x0c, 0xb9, 0x7b, 0x36, 0x6b, 0x16, - 0xc8, 0x23, 0x6b, 0x55, 0x07, 0xd4, 0x6e, 0xe4, 0x7f, 0x19, 0x63, 0xe3, - 0xf3, 0x4e, 0x68, 0x8d, 0x37, 0x69, 0x29, 0xcd, 0x92, 0x3b, 0xa1, 0xa5, - 0xea, 0x20, 0x69, 0xcd, 0xbe, 0x87, 0x8f, 0xeb, 0x99, 0xa3, 0x58, 0x4a, - 0xb9, 0x9a, 0x9b, 0x5c, 0x33, 0x92, 0x51, 0x98, 0xb1, 0x5d, 0x58, 0x81, - 0x71, 0x5b, 0xfa, 0x3c, 0x7e, 0x77, 0x64, 0x6d, 0x8c, 0xef, 0xfa, 0x0e, - 0xa4, 0x6e, 0x69, 0x74, 0xe7, 0x76, 0xcb, 0xed, 0x6d, 0x3a, 0x2c, 0xdf, - 0xc3, 0x60, 0xc0, 0xd3, 0x94, 0xc8, 0x6f, 0xcf, 0x46, 0xda, 0x37, 0x73, - 0x07, 0x21, 0x7b, 0x79, 0x18, 0x19, 0x44, 0x77, 0x2d, 0xce, 0x01, 0xc9, - 0xb6, 0x98, 0xc2, 0x73, 0xa3, 0xe4, 0x8d, 0xf6, 0xa5, 0xd4, 0x75, 0x80, - 0xcd, 0xf1, 0x92, 0x37, 0x48, 0xb1, 0x7d, 0x58, 0x84, 0x62, 0xa0, 0x69, - 0x7b, 0xd1, 0x9a, 0xf9, 0x60, 0xc5, 0xdd, 0xb8, 0x15, 0x41, 0x72, 0x0e, - 0xed, 0x93, 0xf2, 0x33, 0xf5, 0x22, 0x16, 0x6f, 0x87, 0x32, 0xd0, 0xca, - 0x21, 0x5f, 0x67, 0xa5, 0x5b, 0x2f, 0x06, 0x2a, 0xf6, 0xf7, 0xd3, 0x22, - 0x30, 0x7c, 0xaf, 0x71, 0x09, 0xed, 0x42, 0x80, 0x0b, 0x10, 0x4d, 0xae, - 0xc0, 0x07, 0x88, 0x75, 0xb3, 0x67, 0x8d, 0x1b, 0x4b, 0xbf, 0x60, 0x82, - 0xae, 0xb1, 0x74, 0xb7, 0x4d, 0x03, 0xab, 0xf4, 0x86, 0x97, 0x6d, 0xd9, - 0x44, 0x8f, 0xc5, 0x4a, 0x4a, 0x4b, 0x48, 0x6c, 0xc9, 0x57, 0xf6, 0x57, - 0x1e, 0x65, 0x02, 0xa8, 0x8d, 0xdc, 0x4a, 0x33, 0x0c, 0x39, 0xa3, 0xcb, - 0x67, 0x7f, 0x95, 0x51, 0x83, 0x46, 0x77, 0x32, 0xf2, 0x4c, 0x4e, 0x1f, - 0x92, 0x95, 0xe4, 0x32, 0xb0, 0x63, 0xea, 0xa5, 0x27, 0x4c, 0x50, 0x42, - 0x3f, 0x32, 0xa5, 0xb6, 0x0e, 0x39, 0x59, 0x53, 0x3a, 0x25, 0xad, 0x18, - 0x10, 0x03, 0xdd, 0x6e, 0x8a, 0x1f, 0x45, 0xdb, 0x5a, 0x60, 0x68, 0x98, - 0x33, 0x42, 0xe5, 0xc4, 0x71, 0xa9, 0xb3, 0x34, 0xd1, 0x89, 0x42, 0xe1, - 0xee, 0xba, 0x9b, 0x8d, 0x6b, 0x0c, 0xbe, 0x97, 0x88, 0x4f, 0x14, 0xb2, - 0x4c, 0x53, 0x0e, 0x7f, 0xcc, 0xc4, 0x8a, 0xb5, 0xd8, 0x93, 0x95, 0x92, - 0xf3, 0x7b, 0xd6, 0xdb, 0x75, 0xd7, 0x8b, 0xe5, 0x25, 0x93, 0x1f, 0x2c, - 0xbb, 0x62, 0x7b, 0x7d, 0x00, 0x1f, 0x93, 0xca, 0xd7, 0xe3, 0x03, 0x0a, - 0xee, 0xbd, 0x41, 0x67, 0x9b, 0x8f, 0xf2, 0xc2, 0xaf, 0xa6, 0x3c, 0xac, - 0x45, 0xb6, 0xb5, 0x07, 0xef, 0x49, 0xba, 0xf7, 0xd6, 0x5d, 0x06, 0x38, - 0x6a, 0x29, 0x3c, 0xdd, 0x0a, 0x2c, 0x94, 0x94, 0x8f, 0x01, 0x0f, 0xdb, - 0xc5, 0xaa, 0x86, 0xb3, 0x9b, 0x2f, 0x9f, 0xeb, 0x22, 0x68, 0xf5, 0x0d, - 0xe3, 0x04, 0x50, 0x3a, 0xdd, 0x98, 0xb1, 0x9d, 0x50, 0x8f, 0x33, 0xe4, - 0x85, 0x3b, 0xf2, 0xb4, 0x33, 0xa2, 0x61, 0x5c, 0x67, 0x50, 0x48, 0x86, - 0xc0, 0x94, 0xec, 0xa5, 0xea, 0xeb, 0x76, 0x65, 0xac, 0xed, 0xa9, 0x5b, - 0xdd, 0x0d, 0x13, 0x0f, 0x83, 0x65, 0x38, 0xee, 0xb0, 0x51, 0x8b, 0x78, - 0x1b, 0xdb, 0xeb, 0x57, 0x1a, 0x38, 0x93, 0xc4, 0x5d, 0x07, 0xc1, 0x2d, - 0x98, 0xab, 0xb6, 0x8f, 0x09, 0x64, 0xd0, 0x95, 0xed, 0x82, 0x21, 0xca, - 0xb1, 0xe6, 0x78, 0xa9, 0x9e, 0x16, 0x21, 0x89, 0x2a, 0x1a, 0x66, 0xa0, - 0x00, 0xaf, 0xe6, 0x36, 0x68, 0x5f, 0x15, 0xb4, 0xa8, 0x62, 0xf1, 0x5b, - 0x34, 0x40, 0xa6, 0x62, 0xf1, 0xc0, 0xbe, 0x5c, 0xfc, 0x25, 0x4a, 0xbd, - 0x6a, 0x52, 0x5c, 0x5f, 0x23, 0x33, 0xaa, 0xe3, 0x0a, 0x27, 0xf0, 0x18, - 0xe5, 0x6b, 0x1c, 0x11, 0xd3, 0x1e, 0x83, 0x19, 0xb9, 0xab, 0xee, 0x23, - 0xf9, 0x12, 0xa2, 0x82, 0x65, 0x0f, 0xf6, 0x41, 0x59, 0xc2, 0x1f, 0xd4, - 0x6e, 0x08, 0x52, 0xad, 0x5d, 0xda, 0x0c, 0x75, 0xcc, 0x3c, 0x96, 0xf2, - 0x26, 0xfb, 0xb2, 0x48, 0xcf, 0x41, 0x72, 0x36, 0x26, 0x86, 0xfc, 0x60, - 0xaa, 0xc1, 0x42, 0xb9, 0x08, 0x88, 0xe4, 0x23, 0x4f, 0x31, 0x54, 0xaf, - 0xe1, 0xa0, 0x26, 0x9a, 0x02, 0xbd, 0xdc, 0x1b, 0x38, 0x3a, 0xee, 0x17, - 0x67, 0xf5, 0x7e, 0xaf, 0x09, 0xe9, 0x25, 0xe3, 0xe1, 0xea, 0x50, 0xf7, - 0xaa, 0xf6, 0xda, 0xcc, 0x3a, 0x80, 0xa6, 0x38, 0x3a, 0x5f, 0x34, 0x5a, - 0x59, 0x56, 0x15, 0xb2, 0xc6, 0x39, 0x50, 0x4c, 0x0a, 0x29, 0xa0, 0x81, - 0xf4, 0xaf, 0x77, 0x7b, 0x5f, 0xc9, 0x71, 0x91, 0x0c, 0xe6, 0x5c, 0xe1, - 0x2e, 0xab, 0x31, 0x64, 0x29, 0x06, 0xd1, 0x70, 0x67, 0x26, 0x60, 0x05, - 0x10, 0x14, 0xc3, 0xb9, 0xf1, 0xa1, 0x64, 0x9d, 0x51, 0x85, 0x25, 0x11, - 0x8e, 0xf8, 0x39, 0x0d, 0x3a, 0xa0, 0x03, 0x11, 0x4d, 0xf0, 0x8c, 0x84, - 0xc0, 0x07, 0xb1, 0xf7, 0x8b, 0x7b, 0x79, 0x93, 0x79, 0x7e, 0x82, 0x0e, - 0x78, 0x3f, 0x97, 0x6b, 0x6a, 0x2a, 0x3a, 0xea, 0x65, 0x05, 0x60, 0xb6, - 0xa2, 0xf4, 0x32, 0xdb, 0xa3, 0x58, 0x65, 0xbf, 0xe1, 0x1b, 0x1e, 0x17, - 0x13, 0x28, 0x40, 0x44, 0xf5, 0x8b, 0xf3, 0x42, 0xef, 0xbe, 0x9e, 0xa7, - 0x40, 0x97, 0xb6, 0x77, 0x43, 0x79, 0x71, 0x0f, 0x62, 0x78, 0x21, 0xc5, - 0xab, 0x6f, 0x9b, 0xcd, 0x66, 0x82, 0x99, 0xa3, 0x61, 0xaf, 0xaf, 0x59, - 0xd0, 0xce, 0x29, 0x37, 0xb7, 0x73, 0x0c, 0xd5, 0x6e, 0x7a, 0x6a, 0xdf, - 0xb6, 0xd8, 0x71, 0x90, 0xbb, 0xba, 0x41, 0x72, 0xab, 0x13, 0x8b, 0x5e, - 0x91, 0x4a, 0xbd, 0x2e, 0x78, 0xbd, 0xc4, 0xa3, 0xd9, 0x60, 0x22, 0x5b, - 0x8c, 0xac, 0xa8, 0xf7, 0x26, 0x11, 0x23, 0x9d, 0x42, 0x6b, 0x3a, 0x78, - 0x6e, 0x66, 0x1f, 0xa1, 0x28, 0x78, 0x4d, 0x12, 0x8e, 0xc9, 0x55, 0x54, - 0xfc, 0x4b, 0x8c, 0xa8, 0x6f, 0x6a, 0x95, 0x47, 0xce, 0xc5, 0x73, 0xc4, - 0x05, 0x43, 0xf3, 0xd2, 0x3a, 0xc5, 0x86, 0x9f, 0x3d, 0x0a, 0x13, 0x96, - 0x2c, 0x96, 0x4b, 0x52, 0xc5, 0x71, 0x1f, 0x90, 0x15, 0xb6, 0x79, 0xa3, - 0xd9, 0x30, 0x8a, 0xb9, 0xcf, 0x24, 0x3d, 0x9a, 0x81, 0x2f, 0xf0, 0x46, - 0xbe, 0x49, 0x00, 0xfd, 0xc8, 0x4c, 0x1f, 0xec, 0x40, 0x71, 0x8b, 0x49, - 0x2b, 0x93, 0x07, 0x3f, 0x9d, 0xc1, 0x4c, 0x02, 0x76, 0x4d, 0x0d, 0x45, - 0x07, 0x33, 0x0a, 0x98, 0xd8, 0xa4, 0xe4, 0x8e, 0x22, 0xb8, 0x5e, 0x69, - 0x23, 0xf4, 0xa5, 0x3f, 0x0d, 0x3c, 0x02, 0x84, 0x0d, 0x58, 0xdc, 0x43, - 0xc4, 0xfd, 0xb5, 0xe7, 0xbc, 0xbb, 0x9c, 0xc8, 0x5e, 0xa8, 0xd7, 0xab, - 0xf0, 0xe4, 0xa9, 0xc3, 0x27, 0x6d, 0x11, 0xd7, 0x8c, 0xcf, 0x6e, 0x9b, - 0x89, 0x19, 0x27, 0xd8, 0x29, 0x69, 0x49, 0x66, 0xe0, 0xc3, 0xc0, 0xca, - 0x8c, 0x56, 0x52, 0x26, 0x8e, 0x52, 0x0f, 0xf0, 0xd5, 0x05, 0x27, 0x70, - 0x69, 0x51, 0xc2, 0x3a, 0x81, 0xf7, 0x7c, 0x76, 0x13, 0xf3, 0x82, 0x76, - 0xbb, 0x74, 0x53, 0xba, 0x00, 0x98, 0x81, 0x1e, 0x75, 0x68, 0xe1, 0x68, - 0x3c, 0x05, 0xd1, 0x3f, 0x6d, 0x21, 0xe2, 0xdc, 0x30, 0x4b, 0xa3, 0x3f, - 0xa7, 0x3b, 0x66, 0xb7, 0xb9, 0x08, 0x6f, 0x84, 0x62, 0xbd, 0x60, 0xee, - 0x82, 0xf7, 0x7f, 0x98, 0x52, 0x09, 0x99, 0x12, 0x4b, 0x6f, 0x52, 0x18, - 0x04, 0x5b, 0xd2, 0x37, 0xd6, 0x04, 0xab, 0x97, 0x4b, 0xd1, 0x18, 0xa9, - 0xab, 0x5d, 0x2c, 0x7a, 0x4e, 0x32, 0xef, 0xd9, 0x0e, 0x2f, 0x72, 0x04, - 0x8d, 0xff, 0x49, 0xbb, 0x8e, 0x47, 0xae, 0xe8, 0x7d, 0x7b, 0xe3, 0xd9, - 0x9c, 0x0e, 0xc0, 0xe0, 0x6b, 0x4b, 0xe1, 0xf7, 0x44, 0xc7, 0xb6, 0xf1, - 0xbd, 0xaa, 0x06, 0x03, 0x84, 0x1b, 0x6c, 0xf1, 0x0b, 0x62, 0x83, 0xd4, - 0x1c, 0x69, 0xf8, 0x06, 0x9d, 0x11, 0xa7, 0x99, 0x73, 0x0f, 0x24, 0xd1, - 0xdd, 0xd5, 0x21, 0xab, 0x5b, 0x24, 0x37, 0xde, 0xe2, 0x0c, 0xfc, 0x83, - 0xb5, 0x26, 0xa0, 0x4e, 0x78, 0xbd, 0xb2, 0x03, 0x7c, 0xb1, 0xa9, 0x34, - 0xe9, 0x1a, 0x6f, 0x0e, 0x84, 0x37, 0x6e, 0x8e, 0x17, 0xde, 0xca, 0xc4, - 0x6f, 0x8c, 0xcd, 0x32, 0x99, 0x9a, 0x20, 0xde, 0x94, 0x88, 0xd9, 0x85, - 0x66, 0x27, 0x90, 0x30, 0x4a, 0xf9, 0xb6, 0x54, 0x23, 0xb4, 0x51, 0xd8, - 0xbc, 0x3e, 0x70, 0xae, 0xda, 0x0f, 0x1e, 0x46, 0x09, 0x93, 0xa6, 0x14, - 0x7d, 0x15, 0xca, 0x0d, 0xf7, 0x0e, 0x14, 0x1f, 0xa6, 0x8c, 0xc6, 0xcd, - 0x03, 0xb4, 0x46, 0x14, 0x4c, 0x2c, 0x62, 0x7e, 0x0b, 0xed, 0x5f, 0xe6, - 0x90, 0x29, 0x2a, 0x35, 0xa1, 0x41, 0x47, 0x08, 0x65, 0x4d, 0x3a, 0x01, - 0xe3, 0xbc, 0xe6, 0x85, 0x26, 0x6a, 0x2f, 0x6e, 0x5a, 0xe2, 0xf6, 0x8b, - 0xcc, 0x73, 0x56, 0x2e, 0xb3, 0xbf, 0xa3, 0x10, 0x22, 0xcd, 0xf7, 0x64, - 0xb6, 0xdf, 0xd7, 0xaa, 0x01, 0x30, 0x8d, 0x5c, 0x99, 0xfd, 0x1f, 0x11, - 0xd5, 0x01, 0x91, 0x4a, 0xf6, 0x3f, 0x0d, 0x9d, 0xc4, 0xb7, 0xe1, 0xd7, - 0xc7, 0x0b, 0xaa, 0x26, 0xc2, 0xc4, 0x71, 0x0c, 0x14, 0xfd, 0x1c, 0x7b, - 0x96, 0x7c, 0x34, 0xaa, 0xf3, 0xd8, 0xcf, 0xb6, 0x16, 0xeb, 0xa3, 0xf7, - 0xf2, 0x7e, 0x9e, 0xe7, 0xfe, 0xce, 0x43, 0x12, 0x72, 0xe3, 0x36, 0x4c, - 0xee, 0x28, 0xc8, 0xb9, 0x99, 0x25, 0x74, 0xfb, 0xa6, 0x73, 0x3b, 0x5e, - 0x56, 0x2c, 0x7e, 0x9e, 0x43, 0x8b, 0xc8, 0x92, 0x83, 0xae, 0x10, 0xd6, - 0x85, 0xb9, 0xec, 0x26, 0x69, 0x15, 0x43, 0xb4, 0x06, 0xf7, 0xcd, 0xc4, - 0xd7, 0x6e, 0x14, 0x55, 0x68, 0x01, 0x0a, 0xda, 0xe7, 0x75, 0x75, 0x21, - 0x55, 0xbf, 0x08, 0x6a, 0x9f, 0x8b, 0x7c, 0x3e, 0x59, 0xbf, 0xe1, 0x29, - 0x4c, 0x04, 0x3e, 0xd9, 0x64, 0xfe, 0x79, 0x4e, 0x92, 0xbf, 0x80, 0xf4, - 0x65, 0xab, 0x13, 0xf7, 0x7c, 0x49, 0x75, 0x92, 0x51, 0x6f, 0x8b, 0x9d, - 0x9c, 0xe8, 0x6b, 0x3e, 0xa9, 0xf1, 0xab, 0x49, 0x79, 0xe0, 0xb9, 0x15, - 0x60, 0xe1, 0x08, 0xac, 0xfd, 0x96, 0xa0, 0x9d, 0x79, 0xd3, 0x84, 0xdb, - 0xc2, 0xc0, 0xa2, 0x3f, 0x8d, 0x20, 0x9a, 0xbc, 0x3b, 0x52, 0xc2, 0xbb, - 0x13, 0x9d, 0x7a, 0xd7, 0x4c, 0x46, 0xc7, 0xda, 0xa2, 0x47, 0xe8, 0xd8, - 0x2a, 0x2c, 0x1c, 0x07, 0xd4, 0x68, 0x14, 0x23, 0xcf, 0x15, 0x98, 0x22, - 0xfb, 0xfa, 0x0a, 0x2a, 0x65, 0x24, 0xf0, 0x0c, 0xe3, 0xb7, 0xa5, 0xf4, - 0x2c, 0x2f, 0xb7, 0xc8, 0xcf, 0x1a, 0x98, 0x62, 0x66, 0x13, 0x8e, 0x44, - 0xde, 0x30, 0x7e, 0xe0, 0x23, 0xac, 0x68, 0xf8, 0x3d, 0xf4, 0xb0, 0x7a, - 0x41, 0x17, 0xef, 0x19, 0xb9, 0xfb, 0x55, 0xe6, 0x29, 0xf4, 0x5f, 0xc2, - 0xe0, 0x47, 0x65, 0x44, 0x2d, 0x46, 0xe1, 0x0f, 0x25, 0x9b, 0xaa, 0xb0, - 0xc2, 0xbb, 0x1d, 0x2f, 0x78, 0x8e, 0x3e, 0xfa, 0xe1, 0xdc, 0x67, 0xe6, - 0xbf, 0x0d, 0x19, 0x50, 0x76, 0x49, 0x28, 0xd3, 0xeb, 0xe1, 0x7a, 0xbf, - 0xbc, 0x8d, 0x5c, 0x99, 0x27, 0xae, 0x99, 0xa9, 0x89, 0x2c, 0x08, 0x3c, - 0xc5, 0x46, 0x77, 0x1f, 0x3c, 0x00, 0x8c, 0xbe, 0xcf, 0x1a, 0x3c, 0x18, - 0x0f, 0x40, 0xff, 0x57, 0x9c, 0x8d, 0xe5, 0xae, 0x6c, 0x31, 0x14, 0xd7, - 0x87, 0x21, 0x3e, 0x66, 0x31, 0x07, 0x69, 0x33, 0x9c, 0x16, 0xca, 0x8e, - 0x2f, 0xb9, 0xc3, 0xfa, 0xd2, 0x98, 0xc0, 0x48, 0x84, 0x6c, 0x9c, 0x4f, - 0xff, 0x2a, 0x44, 0xd4, 0x34, 0x11, 0x69, 0x06, 0x17, 0xbd, 0x63, 0x1f, - 0x0d, 0xe7, 0x27, 0x2f, 0xd4, 0x4a, 0x2b, 0x9f, 0xf0, 0x8a, 0xa8, 0xa5, - 0x13, 0x9b, 0x46, 0x3f, 0x01, 0x76, 0x09, 0xcf, 0x34, 0x5e, 0xa7, 0xd5, - 0x8c, 0x72, 0x40, 0x62, 0xa9, 0x24, 0xf9, 0x4b, 0x7e, 0xa0, 0x0e, 0x15, - 0x9a, 0x3b, 0xaf, 0xab, 0x22, 0xfc, 0x58, 0x76, 0x39, 0x93, 0x9c, 0x5c, - 0x90, 0x5d, 0x7f, 0x65, 0xbf, 0xba, 0x36, 0x28, 0xa8, 0x68, 0x66, 0x00, - 0x83, 0x2c, 0x51, 0x10, 0x7a, 0xe4, 0xd7, 0xa2, 0xd4, 0xce, 0x32, 0xca, - 0xc5, 0x89, 0xb8, 0x68, 0xcb, 0xca, 0xf9, 0xd7, 0xc0, 0xef, 0xc2, 0x8d, - 0xb4, 0xd0, 0xdf, 0x74, 0xbe, 0x7c, 0xa8, 0x56, 0x5b, 0xce, 0xb9, 0xde, - 0xec, 0x48, 0xcf, 0xed, 0xcb, 0xcb, 0xd1, 0x7d, 0x25, 0x59, 0x7d, 0x8b, - 0x32, 0x2c, 0x5d, 0x1d, 0xc9, 0x41, 0xe7, 0x39, 0x45, 0xa2, 0x4f, 0xeb, - 0x30, 0x45, 0xad, 0xbc, 0xf2, 0x24, 0xe9, 0xed, 0xd9, 0xc1, 0x6a, 0x59, - 0x68, 0xee, 0x46, 0x4f, 0xd7, 0x95, 0x13, 0x70, 0x01, 0xcb, 0xaa, 0x0c, - 0x52, 0x17, 0x37, 0xba, 0x23, 0xb9, 0xd5, 0x9b, 0x9e, 0x24, 0xe9, 0x7f, - 0xd4, 0x9f, 0xf8, 0x56, 0x1c, 0x37, 0x54, 0x21, 0xcf, 0x7f, 0x8a, 0x88, - 0x49, 0x1f, 0x78, 0xca, 0xf9, 0x5c, 0x6e, 0xf8, 0x7b, 0x4f, 0x70, 0x2c, - 0x0f, 0x1c, 0xd1, 0x48, 0xa2, 0x87, 0x2e, 0x47, 0x53, 0xf5, 0xf3, 0x68, - 0x97, 0xcc, 0x9f, 0x26, 0x8b, 0x28, 0xef, 0x21, 0xbc, 0x9f, 0x33, 0x38, - 0xd2, 0xae, 0x81, 0x5b, 0x45, 0x81, 0xca, 0x55, 0xfb, 0x30, 0x73, 0x79, - 0x12, 0x87, 0xd8, 0xe9, 0x88, 0x98, 0x3b, 0x22, 0xc3, 0x28, 0x8b, 0x17, - 0x6a, 0xa9, 0x57, 0xbd, 0x21, 0x91, 0x16, 0xc8, 0x97, 0x77, 0xe8, 0xba, - 0x1c, 0x67, 0x96, 0xa1, 0x4a, 0xab, 0x11, 0x29, 0x76, 0x13, 0x20, 0x42, - 0x6f, 0x92, 0xa6, 0xa4, 0xc3, 0x7f, 0x96, 0x29, 0x4a, 0x48, 0x1b, 0x17, - 0x4f, 0xc1, 0xe3, 0x8b, 0x5d, 0x3a, 0x9a, 0x3b, 0x9a, 0x35, 0x62, 0x54, - 0x23, 0xac, 0x52, 0xca, 0x7a, 0xb3, 0x3e, 0x25, 0x91, 0x83, 0x73, 0x3f, - 0xfb, 0x1c, 0x62, 0xab, 0xe9, 0xc4, 0x71, 0xc9, 0x7b, 0xb3, 0x8c, 0x2c, - 0x37, 0x90, 0x79, 0xd1, 0x66, 0x20, 0xab, 0xe2, 0x82, 0x5e, 0x53, 0x9f, - 0x46, 0xde, 0x53, 0x0b, 0x1f, 0x4e, 0x58, 0xdc, 0x83, 0xd0, 0xca, 0xd7, - 0xa3, 0x99, 0x80, 0xcc, 0x5c, 0xc5, 0x1f, 0x8b, 0x34, 0x9b, 0x01, 0xf9, - 0xfb, 0x35, 0x38, 0x43, 0x43, 0xe9, 0x5e, 0xdf, 0xc7, 0x30, 0x08, 0x2f, - 0x92, 0x31, 0x8b, 0x81, 0xd1, 0x61, 0xf0, 0x36, 0xfb, 0xbd, 0x8e, 0x54, - 0x2e, 0x5b, 0xa2, 0x1b, 0xde, 0x29, 0xec, 0x0d, 0xf8, 0x75, 0x98, 0x80, - 0x62, 0x53, 0xdd, 0xe1, 0xd1, 0x80, 0x27, 0xee, 0x55, 0xb4, 0x50, 0x0d, - 0xb1, 0xa3, 0xb2, 0x95, 0xc7, 0x37, 0x94, 0x2c, 0x11, 0x31, 0x9c, 0xac, - 0x44, 0xda, 0xdc, 0x56, 0xbb, 0x2e, 0xf9, 0xf2, 0x28, 0x58, 0x4e, 0x85, - 0x18, 0x29, 0x54, 0xfd, 0x22, 0x66, 0xa6, 0x0c, 0x0c, 0x25, 0x27, 0xd1, - 0xe7, 0x15, 0xa3, 0x88, 0x74, 0x00, 0x5b, 0xbd, 0x3c, 0x21, 0x6f, 0xd9, - 0x04, 0x45, 0x8c, 0x59, 0x4e, 0x08, 0x2d, 0xee, 0xe2, 0xc8, 0xe0, 0xfe, - 0x53, 0x62, 0x26, 0x0e, 0xe4, 0x97, 0x3f, 0x84, 0xd0, 0x2a, 0x71, 0xbe, - 0xd1, 0x96, 0x50, 0x34, 0xd0, 0x77, 0x5e, 0xb9, 0xb2, 0x73, 0x59, 0xfc, - 0xa1, 0x7f, 0xf5, 0xf8, 0xee, 0x6b, 0x22, 0xff, 0xe6, 0x31, 0xed, 0x9a, - 0x65, 0x7f, 0x72, 0x67, 0x8b, 0x70, 0xb9, 0xca, 0x02, 0x14, 0x0f, 0xb3, - 0xc8, 0x19, 0x26, 0x11, 0x1b, 0x3a, 0xb4, 0xc1, 0x47, 0x24, 0x7a, 0x37, - 0x47, 0x22, 0x67, 0x40, 0x19, 0xe1, 0x43, 0x22, 0xa1, 0x08, 0x7e, 0x75, - 0xbd, 0x2f, 0x7c, 0x52, 0xa3, 0x63, 0x59, 0x1c, 0xe2, 0x45, 0x7e, 0x0f, - 0xf4, 0xf7, 0xe1, 0x7d, 0xaf, 0xae, 0x1f, 0x85, 0x10, 0x24, 0x6d, 0x05, - 0x44, 0x6c, 0xf9, 0x4a, 0x8f, 0xed, 0x70, 0x2c, 0x4e, 0xf3, 0xcb, 0xca, - 0x0a, 0xa7, 0x72, 0x5e, 0x5e, 0x4d, 0x03, 0xc7, 0xeb, 0x8a, 0x26, 0xe3, - 0x99, 0xed, 0x01, 0xc7, 0x99, 0xb6, 0x0a, 0xb9, 0x94, 0x28, 0x1a, 0x09, - 0xed, 0x5c, 0xf6, 0x9a, 0xae, 0x99, 0xe7, 0x8b, 0xcd, 0x31, 0x88, 0xff, - 0x79, 0x84, 0x4b, 0x8c, 0x22, 0x04, 0x00, 0xcc, 0x80, 0x0e, 0x3c, 0xdb, - 0x73, 0xeb, 0x3f, 0xc4, 0xfa, 0x69, 0xe8, 0x12, 0x36, 0x81, 0xb9, 0x1a, - 0xf5, 0x54, 0xec, 0x10, 0xd9, 0xc9, 0xa7, 0xe5, 0xe4, 0x6b, 0x4d, 0x38, - 0x62, 0xaa, 0x0d, 0x67, 0xda, 0x7a, 0xba, 0x7e, 0xc6, 0x96, 0x1b, 0xb6, - 0x68, 0x2b, 0xe3, 0x5c, 0x3f, 0x36, 0x4e, 0x69, 0xba, 0xe8, 0xb4, 0x1c, - 0xa9, 0xe0, 0x44, 0x84, 0x80, 0x50, 0x5c, 0x85, 0x28, 0x61, 0x11, 0x52, - 0xc8, 0xbf, 0x8f, 0x3e, 0x26, 0xa7, 0xf9, 0xca, 0xba, 0xc5, 0x52, 0xab, - 0xe6, 0x9a, 0xab, 0x70, 0xd5, 0xfe, 0x3e, 0xa4, 0x6a, 0x9e, 0x54, 0xb2, - 0x7d, 0xbd, 0x7e, 0x4b, 0x88, 0xb2, 0x28, 0x19, 0xf8, 0xab, 0x62, 0xcc, - 0x2e, 0xb3, 0x47, 0xc1, 0x28, 0x90, 0x86, 0xdc, 0x19, 0x94, 0xcc, 0x9a, - 0xde, 0xf4, 0xae, 0x9c, 0x09, 0xcf, 0xcb, 0xe4, 0x2b, 0x53, 0x82, 0xfe, - 0x94, 0xa9, 0x1b, 0x08, 0x39, 0x3d, 0x5f, 0x36, 0x8d, 0x18, 0x6c, 0x86, - 0x3a, 0xd5, 0x9c, 0x1f, 0x81, 0xd4, 0xad, 0xb4, 0xdc, 0xf6, 0x76, 0x33, - 0x4d, 0xb4, 0x17, 0x7f, 0xbf, 0xf5, 0x14, 0xa1, 0x04, 0xd3, 0x05, 0x6a, - 0x8b, 0xee, 0xd7, 0x4d, 0xa6, 0x53, 0x10, 0x27, 0x8a, 0x2b, 0x65, 0xeb, - 0x86, 0x87, 0xf6, 0x42, 0x27, 0xc1, 0x1a, 0x7a, 0xf7, 0xb2, 0xaf, 0xf7, - 0xbf, 0x47, 0xc2, 0xe1, 0x21, 0xfe, 0x66, 0xd3, 0xdf, 0x94, 0x38, 0xa3, - 0x7a, 0xf5, 0xaa, 0xb5, 0x50, 0xe8, 0xcc, 0x26, 0x17, 0x58, 0x91, 0xca, - 0x5f, 0xa1, 0x2d, 0x2d, 0x83, 0x77, 0x4f, 0x87, 0x0b, 0xa4, 0xe3, 0x72, - 0x40, 0x94, 0x3d, 0xcf, 0x49, 0x35, 0x88, 0xad, 0xe1, 0x64, 0x8b, 0x0e, - 0x5c, 0xdb, 0x51, 0x21, 0xc3, 0x02, 0xc9, 0xf6, 0x8d, 0xce, 0xe0, 0x04, - 0x2c, 0x3b, 0x23, 0x55, 0xf2, 0x99, 0x14, 0xc3, 0x82, 0xb7, 0x84, 0xfb, - 0x83, 0x3d, 0x17, 0xbd, 0xb4, 0x32, 0xca, 0x8d, 0x1c, 0x20, 0xbc, 0x30, - 0xb2, 0xb3, 0x38, 0x4e, 0xe1, 0x25, 0x6c, 0xe9, 0xe3, 0x7d, 0x5e, 0xf7, - 0x23, 0x05, 0xb2, 0x75, 0x7f, 0x8c, 0x05, 0x47, 0x3d, 0xe2, 0xd6, 0x86, - 0xd0, 0x7d, 0x4a, 0x6a, 0x46, 0x2d, 0x10, 0xf4, 0x68, 0xd7, 0x60, 0xe2, - 0x74, 0xc5, 0x74, 0x70, 0x40, 0x1d, 0xe6, 0x64, 0x23, 0x36, 0x6b, 0x2a, - 0x4f, 0x2c, 0x2f, 0x7e, 0xdf, 0x83, 0x10, 0x5b, 0x1a, 0x17, 0xaa, 0x38, - 0x6a, 0x55, 0xcc, 0xa0, 0x48, 0xb0, 0xe7, 0xa4, 0x40, 0xe5, 0xbf, 0x31, - 0xd9, 0xfb, 0x7a, 0x6a, 0xde, 0x64, 0x7f, 0xeb, 0x55, 0xd2, 0x7a, 0x99, - 0x11, 0x9d, 0xae, 0x21, 0xcd, 0x35, 0x32, 0xb6, 0xf2, 0x65, 0xce, 0xcc, - 0x09, 0x69, 0x69, 0x2b, 0x87, 0x17, 0x6f, 0x56, 0x51, 0xa9, 0x7a, 0x5c, - 0x57, 0xbc, 0xa9, 0x8b, 0x9e, 0x69, 0xb5, 0xcd, 0xbb, 0x2a, 0x8a, 0x83, - 0x4d, 0x17, 0x8f, 0x94, 0x13, 0x6c, 0xde, 0xbd, 0x96, 0x9e, 0x48, 0xbe, - 0xae, 0x81, 0x18, 0x96, 0xdf, 0x47, 0xc3, 0x2f, 0xc7, 0x75, 0x28, 0x5f, - 0x0c, 0x53, 0xc8, 0xdf, 0xa4, 0x97, 0x16, 0x8a, 0x54, 0x4f, 0x97, 0x2c, - 0xa2, 0x8d, 0xea, 0xad, 0xba, 0x7f, 0x40, 0x58, 0x62, 0x4d, 0x92, 0x20, - 0x51, 0x2b, 0x0a, 0x9c, 0xe2, 0x5d, 0x45, 0x09, 0xab, 0x22, 0xb1, 0xcf, - 0x57, 0xeb, 0xd3, 0x2c, 0x2f, 0x2e, 0xbf, 0x82, 0xbb, 0x04, 0xd4, 0xce, - 0xb9, 0x3f, 0x3b, 0x78, 0xfd, 0x9d, 0x2d, 0x98, 0x22, 0xea, 0x17, 0x06, - 0x6e, 0xa7, 0xad, 0x5f, 0x79, 0x89, 0x14, 0x26, 0x18, 0x7e, 0xef, 0xeb, - 0xd3, 0xf3, 0x3c, 0x97, 0x22, 0x84, 0xac, 0x98, 0x0b, 0x2a, 0xd9, 0x52, - 0xb8, 0x5b, 0x9c, 0x5f, 0x47, 0x98, 0x22, 0xe1, 0x5c, 0xcc, 0x24, 0x60, - 0x19, 0x4d, 0xa4, 0xd0, 0x55, 0x45, 0x5d, 0x1a, 0x07, 0xd5, 0x6c, 0x6d, - 0xad, 0xaa, 0x90, 0x42, 0x48, 0x82, 0x36, 0x7e, 0xd8, 0xa6, 0xe9, 0xf3, - 0x7b, 0xb0, 0x20, 0xe6, 0x68, 0xcd, 0xb2, 0x7f, 0xc7, 0x22, 0x86, 0x09, - 0x40, 0xcb, 0x6f, 0x44, 0x36, 0x41, 0x34, 0x99, 0xf8, 0x34, 0x29, 0x7f, - 0x5c, 0x2f, 0x41, 0x0e, 0x19, 0xb9, 0xc1, 0xf1, 0x0d, 0xb6, 0xcd, 0xb2, - 0x00, 0x2c, 0xca, 0xa6, 0x15, 0xa2, 0x73, 0x2a, 0x7b, 0xa2, 0xae, 0x78, - 0xa3, 0xed, 0x0e, 0x56, 0x8a, 0xa4, 0x25, 0xd8, 0xa7, 0xb9, 0x95, 0x7d, - 0x07, 0xff, 0xe9, 0x26, 0x3c, 0x53, 0x09, 0xdd, 0x10, 0x60, 0xf2, 0x7b, - 0xa5, 0xfb, 0xa5, 0xe1, 0x8f, 0x93, 0xec, 0xf5, 0x0d, 0xf9, 0x43, 0x97, - 0xac, 0xe7, 0x40, 0x74, 0x6a, 0x73, 0x78, 0x1f, 0xcc, 0x1a, 0xc3, 0x83, - 0x09, 0xf8, 0xd0, 0x03, 0x86, 0xe7, 0x9f, 0xde, 0xee, 0x3a, 0x59, 0xf7, - 0x93, 0x79, 0xeb, 0x83, 0xdc, 0x41, 0xdd, 0x71, 0x64, 0x61, 0x4d, 0xbe, - 0x3d, 0x0d, 0x7a, 0x9c, 0xed, 0x08, 0xe7, 0xa2, 0x4c, 0x78, 0xe1, 0xd6, - 0xaa, 0x03, 0xa7, 0x14, 0x5f, 0xd1, 0x29, 0x61, 0x03, 0x74, 0xc7, 0x93, - 0x52, 0x06, 0x80, 0x48, 0xf5, 0xa5, 0x04, 0x0a, 0x03, 0x86, 0x05, 0x8b, - 0x3a, 0x1f, 0xf5, 0x38, 0x9e, 0x8e, 0x12, 0x62, 0x53, 0xa7, 0x4d, 0xa9, - 0xbc, 0x85, 0x33, 0x6a, 0xb5, 0x3e, 0xb4, 0x8e, 0x81, 0xdb, 0xb5, 0xdf, - 0x22, 0x13, 0xd1, 0x04, 0x42, 0x67, 0xfb, 0x89, 0x9b, 0x83, 0x80, 0x78, - 0x9a, 0x25, 0xca, 0x0d, 0x70, 0xe4, 0x8a, 0x7c, 0x57, 0x1b, 0x03, 0x53, - 0x0a, 0xee, 0xbd, 0x98, 0xad, 0xc0, 0xf0, 0xff, 0x11, 0x39, 0x84, 0x95, - 0x45, 0x02, 0xba, 0x5e, 0xe9, 0xd8, 0xbe, 0x07, 0x8f, 0x3a, 0xfc, 0x16, - 0x4e, 0xab, 0x67, 0xcb, 0x76, 0x70, 0xd7, 0x14, 0xa9, 0xfa, 0x2d, 0xe5, - 0x47, 0xaa, 0x58, 0xd4, 0xbd, 0x7b, 0x7a, 0x73, 0x05, 0xc5, 0x83, 0x63, - 0x27, 0x55, 0x26, 0xe7, 0x82, 0xd6, 0x07, 0x0b, 0xa8, 0xc5, 0x56, 0xa0, - 0x7c, 0x21, 0x67, 0x3c, 0xf5, 0x25, 0x32, 0x8e, 0xc1, 0xcd, 0x1f, 0x41, - 0x04, 0x97, 0x3b, 0x2e, 0x17, 0xf5, 0xa9, 0xe1, 0xca, 0xb8, 0x30, 0xf6, - 0x0b, 0x06, 0x38, 0xa8, 0x26, 0xb0, 0xab, 0xee, 0xc5, 0xeb, 0x30, 0x28, - 0x7d, 0xed, 0x1b, 0xde, 0xfb, 0x77, 0xf8, 0xca, 0xff, 0xc3, 0xc8, 0x49, - 0x7c, 0x67, 0x21, 0x6c, 0x8e, 0xd4, 0x26, 0x67, 0x88, 0xd7, 0xcd, 0x0a, - 0xf8, 0x64, 0x25, 0x77, 0x6b, 0xf1, 0x97, 0x52, 0x8e, 0xa6, 0xc1, 0xc5, - 0x24, 0x1c, 0xde, 0xbb, 0xba, 0x03, 0x8c, 0x07, 0x88, 0xf2, 0x96, 0xfe, - 0x85, 0x00, 0xde, 0xda, 0xf0, 0xb2, 0x7f, 0x71, 0x27, 0x6e, 0x7d, 0xdb, - 0xf1, 0x49, 0x78, 0x7a, 0x57, 0x1c, 0x90, 0xf6, 0x6f, 0xcd, 0xcb, 0xb7, - 0xf7, 0x1a, 0xc8, 0xab, 0xad, 0xa7, 0x89, 0x14, 0xd3, 0x52, 0x64, 0x20, - 0xfd, 0x31, 0xed, 0x6b, 0x65, 0x21, 0x40, 0x16, 0xf4, 0x69, 0xac, 0x1e, - 0x78, 0x26, 0x78, 0x06, 0x44, 0x83, 0xb0, 0x57, 0x00, 0x6a, 0xa2, 0x96, - 0xbd, 0xd2, 0xcf, 0x53, 0xf0, 0xdf, 0xde, 0x9d, 0xb6, 0xb3, 0xc3, 0x46, - 0xc5, 0xe5, 0xe5, 0x3e, 0xc4, 0xc7, 0xa7, 0x59, 0x2e, 0xe0, 0x0b, 0x14, - 0x57, 0xd7, 0x36, 0x38, 0x5d, 0xb4, 0xe2, 0x14, 0x2d, 0x1b, 0xc3, 0x4d, - 0xd6, 0x04, 0x03, 0x56, 0x80, 0x05, 0x17, 0xbd, 0x02, 0x2c, 0x8f, 0xd8, - 0x29, 0x8e, 0x1b, 0x78, 0xee, 0xcc, 0x61, 0x4b, 0xce, 0x36, 0x1f, 0x50, - 0xf0, 0xc0, 0x30, 0x9a, 0xa0, 0xe7, 0x4b, 0xfb, 0x1a, 0x3e, 0xb4, 0x8a, - 0xf5, 0x60, 0x05, 0xd2, 0x16, 0x8d, 0xaa, 0x9e, 0x33, 0xc0, 0xe5, 0xbd, - 0xff, 0x1b, 0x33, 0xce, 0x80, 0x9e, 0xc9, 0xd5, 0xbc, 0x36, 0x75, 0xe1, - 0x75, 0xc2, 0x6c, 0xb6, 0xee, 0x85, 0xaf, 0x5f, 0xf7, 0x77, 0xa0, 0x86, - 0x08, 0x84, 0xee, 0x06, 0x6c, 0xe0, 0x7e, 0x85, 0xef, 0x1a, 0x0a, 0xae, - 0x17, 0xde, 0x24, 0xac, 0x2c, 0xb6, 0x38, 0x08, 0x76, 0x0b, 0x9f, 0x2b, - 0xba, 0x84, 0x91, 0xd2, 0xdb, 0x64, 0xf7, 0x06, 0x19, 0x9b, 0x6f, 0xa5, - 0x1d, 0x0f, 0x7d, 0xa6, 0x89, 0x12, 0x66, 0xfa, 0xdd, 0x11, 0xce, 0x1c, - 0x68, 0x62, 0x27, 0xe5, 0x27, 0x5f, 0xa2, 0x0e, 0xca, 0x37, 0x3a, 0xee, - 0x32, 0x2d, 0x91, 0xf6, 0x36, 0x9f, 0x09, 0x0c, 0x57, 0x4d, 0x42, 0x9f, - 0x37, 0xce, 0xd1, 0x91, 0x19, 0x0a, 0xcc, 0x6b, 0x3c, 0xd1, 0xae, 0xf5, - 0x09, 0xdd, 0x86, 0xdb, 0x38, 0xad, 0x39, 0x4f, 0x2f, 0x07, 0x56, 0xea, - 0x20, 0x57, 0x2f, 0xd8, 0x64, 0xd2, 0xd8, 0xa2, 0xdc, 0x3a, 0xb1, 0xdb, - 0x52, 0x6c, 0x0c, 0x3a, 0x0c, 0xb6, 0xc7, 0xab, 0xea, 0x6b, 0xd3, 0x92, - 0x40, 0x40, 0x4a, 0xf1, 0x2f, 0x71, 0x79, 0xfc, 0xe8, 0xc0, 0x51, 0x28, - 0x6e, 0xf3, 0xe0, 0x4f, 0xb4, 0xd2, 0x23, 0x6d, 0xa2, 0xf5, 0x34, 0x1f, - 0x75, 0x21, 0xa7, 0xaf, 0xa8, 0x29, 0x98, 0x1a, 0x30, 0x5a, 0x4b, 0x52, - 0x9e, 0x00, 0x6f, 0xed, 0x45, 0xb5, 0x0d, 0x2c, 0x1a, 0x16, 0x2b, 0x1f, - 0xdf, 0x28, 0x79, 0xfb, 0xde, 0x69, 0xd1, 0xcd, 0xaf, 0x42, 0xe0, 0x08, - 0xea, 0x3b, 0x98, 0x93, 0xf6, 0x70, 0x6f, 0xd2, 0x2a, 0x75, 0xdc, 0x98, - 0xb0, 0x78, 0x08, 0x74, 0x4f, 0x2b, 0x5d, 0x81, 0x4b, 0x32, 0x21, 0x53, - 0x98, 0xb4, 0xa2, 0x2d, 0x46, 0x5c, 0x04, 0x4b, 0x7f, 0x91, 0x62, 0x3b, - 0x5f, 0x18, 0x65, 0x16, 0x17, 0x52, 0xe1, 0x52, 0xc5, 0x12, 0xa8, 0x9d, - 0xd1, 0x5c, 0xec, 0xb8, 0x03, 0xf0, 0x6a, 0xe0, 0x7d, 0x81, 0xd4, 0x5e, - 0x28, 0xd8, 0x75, 0x64, 0xd9, 0x94, 0x32, 0x46, 0xa1, 0xba, 0xc6, 0x31, - 0x74, 0xc9, 0x6b, 0xad, 0xa5, 0xe5, 0x75, 0x8d, 0xd6, 0xb7, 0xd8, 0x76, - 0x77, 0x67, 0x52, 0xf8, 0x19, 0xee, 0x98, 0xe8, 0xea, 0xa7, 0x23, 0xe0, - 0x09, 0x60, 0x5e, 0x52, 0xcb, 0xfd, 0x1a, 0x1c, 0x2e, 0x8e, 0x56, 0x8c, - 0x6e, 0xbf, 0x32, 0xc9, 0x02, 0x94, 0xef, 0x40, 0x20, 0x1b, 0x12, 0xf6, - 0x1c, 0x23, 0x8d, 0x20, 0xdf, 0xe5, 0x49, 0x7c, 0x24, 0xda, 0x7f, 0xdb, - 0xf7, 0x7f, 0x93, 0x57, 0xda, 0x50, 0x2a, 0x58, 0xc6, 0xc9, 0x03, 0xcd, - 0xd6, 0x3e, 0xd2, 0x6b, 0xfc, 0x65, 0x3b, 0x06, 0xaa, 0x1e, 0x97, 0x8c, - 0x0a, 0xe7, 0x6d, 0xf8, 0xb6, 0x06, 0x4c, 0x6a, 0xf2, 0x89, 0x4a, 0x7b, - 0x0e, 0x7a, 0x4d, 0xbf, 0x1a, 0x4d, 0x44, 0x37, 0x54, 0x7f, 0xeb, 0x4b, - 0x76, 0x76, 0x8e, 0x99, 0x86, 0xec, 0x53, 0x91, 0x6a, 0x6b, 0xfe, 0xd2, - 0x2e, 0x69, 0x6a, 0x81, 0x24, 0x2b, 0x84, 0xe8, 0x95, 0x4f, 0x61, 0xd6, - 0x36, 0x17, 0xac, 0xe3, 0xd0, 0x10, 0x32, 0xf4, 0x93, 0xf5, 0xe1, 0x42, - 0xbe, 0x06, 0x48, 0x2d, 0x90, 0x4e, 0x0e, 0xbf, 0xa7, 0x20, 0x5d, 0xee, - 0x96, 0x69, 0x4a, 0xbd, 0xfd, 0x46, 0xed, 0xfb, 0x71, 0xfb, 0x02, 0x41, - 0x20, 0x1b, 0x0d, 0x66, 0xbe, 0x99, 0xdf, 0x19, 0x84, 0x59, 0xf5, 0x01, - 0x5c, 0x79, 0x0e, 0xd3, 0xfb, 0x2e, 0xd5, 0xf8, 0xf1, 0xbf, 0xaf, 0x90, - 0x79, 0x7b, 0x7c, 0x71, 0x36, 0x0d, 0xdb, 0x72, 0x9c, 0xeb, 0x73, 0x74, - 0xf2, 0x8a, 0x7f, 0x93, 0xa9, 0xb4, 0x6b, 0xea, 0x66, 0xc8, 0xd9, 0xac, - 0x9c, 0x61, 0xfc, 0x78, 0xdf, 0xb5, 0xa3, 0xd9, 0xdd, 0x38, 0x84, 0x5d, - 0x6c, 0xb6, 0x4a, 0x6e, 0x2b, 0xcb, 0x28, 0xd8, 0xc5, 0x39, 0xcc, 0xcd, - 0xeb, 0xd9, 0x96, 0xd7, 0x2c, 0xb4, 0x20, 0x49, 0xd3, 0x17, 0x70, 0xc7, - 0x5c, 0x6a, 0x04, 0xfe, 0x70, 0xb5, 0x9f, 0x2d, 0x35, 0xe0, 0x28, 0x5c, - 0x64, 0x65, 0x14, 0x56, 0x36, 0x8f, 0xbf, 0x94, 0xb1, 0x64, 0x11, 0x01, - 0x9f, 0xb2, 0xeb, 0x60, 0xbe, 0x36, 0xe3, 0xdb, 0xf5, 0x68, 0xb0, 0xa1, - 0x18, 0xbd, 0x91, 0x38, 0xf0, 0xfb, 0x68, 0x2d, 0x8e, 0xb4, 0x96, 0x77, - 0x24, 0xd5, 0x0d, 0xd0, 0xca, 0x5a, 0xb4, 0x4d, 0x09, 0x73, 0x1c, 0xa2, - 0xd5, 0x08, 0x77, 0x48, 0x75, 0xea, 0x4d, 0xb7, 0xf8, 0x52, 0x8a, 0x7f, - 0x58, 0x8a, 0x4d, 0x3e, 0x87, 0x17, 0xf6, 0x08, 0xa4, 0x01, 0x4f, 0xb8, - 0x55, 0x1e, 0xa1, 0xb3, 0xc3, 0xb2, 0x2c, 0xcd, 0xf4, 0x9b, 0xe8, 0xa8, - 0xea, 0xa6, 0xc0, 0x6a, 0x53, 0x86, 0x6d, 0xdd, 0xc7, 0x3f, 0x85, 0x9e, - 0x50, 0xef, 0x4c, 0x21, 0x1c, 0x7b, 0xd3, 0x12, 0x70, 0x53, 0x9d, 0xf3, - 0xb8, 0xd0, 0x26, 0x00, 0x74, 0x57, 0x67, 0xcf, 0x6f, 0x28, 0x8b, 0x64, - 0x79, 0x76, 0x84, 0x4a, 0x15, 0x5a, 0x9a, 0x89, 0x84, 0xb4, 0x16, 0x07, - 0x59, 0x63, 0xbe, 0xcc, 0xc9, 0xd3, 0x80, 0x31, 0xa6, 0x2c, 0x8e, 0x6a, - 0x5b, 0x19, 0x65, 0x70, 0xa2, 0x26, 0xa5, 0x47, 0x8c, 0xe0, 0xba, 0xc7, - 0xa4, 0x34, 0xf5, 0x3f, 0xc6, 0x15, 0x8b, 0xff, 0x4d, 0x49, 0xd5, 0xc1, - 0x86, 0x2a, 0xc6, 0x9f, 0xff, 0x42, 0x25, 0x23, 0x18, 0xdb, 0xcc, 0x7a, - 0x9d, 0xfe, 0xff, 0x20, 0x7c, 0x6b, 0xad, 0xf0, 0x01, 0xca, 0x39, 0xfa, - 0x8a, 0x6e, 0xbb, 0xfa, 0x79, 0xc8, 0x12, 0xcb, 0xc7, 0xa5, 0x90, 0x71, - 0x13, 0x84, 0xa6, 0x6a, 0xee, 0x48, 0x96, 0x57, 0xf0, 0x62, 0x98, 0x22, - 0xa6, 0x61, 0x51, 0x2a, 0x58, 0x79, 0x40, 0x8e, 0x5e, 0x21, 0x64, 0xe2, - 0x3e, 0x15, 0xec, 0x36, 0x72, 0x15, 0xb7, 0x21, 0x29, 0x2a, 0xa1, 0x1f, - 0x89, 0x55, 0xe5, 0x8e, 0xa7, 0xef, 0x58, 0x68, 0xf0, 0x1f, 0x80, 0x7a, - 0x98, 0xbc, 0xbc, 0x33, 0x82, 0x33, 0x5f, 0x35, 0x95, 0x19, 0x60, 0xbd, - 0xed, 0x26, 0xed, 0xc5, 0xa2, 0xee, 0xf8, 0x7b, 0xca, 0x5a, 0x64, 0xcb, - 0x80, 0xe5, 0x36, 0xce, 0x2f, 0x13, 0xa2, 0x34, 0xd2, 0xed, 0x45, 0x9a, - 0x39, 0x31, 0x48, 0x4d, 0xf6, 0x3b, 0xd1, 0x6d, 0xe6, 0xc1, 0x33, 0x45, - 0x15, 0x4a, 0x68, 0x5d, 0xac, 0x33, 0xf0, 0xaa, 0x5f, 0xf0, 0x46, 0x71, - 0x4f, 0x51, 0xd5, 0x20, 0x4a, 0xcd, 0x8c, 0xec, 0x11, 0x4a, 0x5d, 0xfc, - 0xd3, 0x99, 0x7c, 0x5a, 0xd3, 0xd5, 0x2f, 0x7b, 0xca, 0xcd, 0x6a, 0x9c, - 0xfa, 0x0e, 0x1d, 0xde, 0x3d, 0xd2, 0x48, 0x97, 0xac, 0x36, 0x59, 0xf4, - 0xbe, 0x99, 0xe9, 0xc1, 0x87, 0x9c, 0xdf, 0xb7, 0xf0, 0x00, 0x5e, 0x68, - 0xe9, 0x40, 0xbc, 0x72, 0x35, 0x71, 0x66, 0x52, 0xf5, 0x0e, 0x02, 0xb2, - 0xae, 0x15, 0x79, 0xf7, 0x65, 0x1e, 0x3c, 0x73, 0x04, 0x2b, 0x7f, 0x23, - 0xa0, 0x35, 0x99, 0x56, 0x57, 0x52, 0xbf, 0x52, 0xe0, 0x98, 0x6f, 0x13, - 0xde, 0xde, 0x84, 0x6b, 0x86, 0xfe, 0x91, 0x5e, 0x17, 0xac, 0xa1, 0x06, - 0x49, 0x7f, 0xa1, 0xc4, 0xcf, 0x4f, 0xd2, 0xd8, 0x94, 0x6d, 0x58, 0x77, - 0x13, 0x7b, 0x6f, 0x79, 0xb5, 0x88, 0xb9, 0xd0, 0xcc, 0xa0, 0x77, 0x79, - 0xe4, 0xe0, 0x96, 0x02, 0xf7, 0x2f, 0xb7, 0x28, 0x23, 0xec, 0x6e, 0x6e, - 0x72, 0x7c, 0x36, 0xa9, 0x51, 0xa6, 0x34, 0x1c, 0x3e, 0x83, 0x0b, 0xc2, - 0x25, 0xc7, 0x58, 0xd5, 0xd3, 0xab, 0x35, 0x77, 0xed, 0x23, 0x49, 0xf2, - 0xac, 0x88, 0x10, 0xec, 0xf4, 0xd8, 0xf6, 0x51, 0xe2, 0x07, 0x31, 0xcb, - 0x41, 0x80, 0x00, 0x30, 0x8b, 0x2a, 0x0a, 0xa6, 0x09, 0x16, 0x79, 0x09, - 0x16, 0x24, 0x9d, 0xc6, 0x43, 0x1c, 0x76, 0x8a, 0xd5, 0x17, 0xd3, 0x95, - 0xb0, 0x97, 0x55, 0xa8, 0xa8, 0xea, 0x8a, 0x78, 0x9c, 0x17, 0x27, 0x05, - 0xb6, 0x18, 0xf9, 0xb7, 0x0c, 0xe1, 0x73, 0x0a, 0xc2, 0xf8, 0x46, 0xaa, - 0x62, 0x27, 0x6e, 0x65, 0xa8, 0xbe, 0x6a, 0x23, 0x8a, 0x7b, 0x77, 0x14, - 0x5a, 0xe6, 0xb7, 0xff, 0x84, 0xb8, 0x03, 0xdc, 0x37, 0x20, 0xed, 0xf2, - 0x27, 0xbc, 0xd8, 0x46, 0xd6, 0xef, 0xdf, 0x3d, 0xc5, 0x55, 0x55, 0x56, - 0x58, 0x62, 0x33, 0xc7, 0x1b, 0x3c, 0x9e, 0x88, 0x74, 0x9d, 0x94, 0x59, - 0x98, 0x5e, 0x39, 0x44, 0x05, 0xde, 0x8d, 0xda, 0x4c, 0x94, 0xdb, 0x86, - 0xd5, 0x10, 0x5a, 0xf0, 0x8b, 0x63, 0x65, 0xc7, 0xd4, 0xff, 0xba, 0xc8, - 0x5f, 0x94, 0x24, 0x31, 0xe3, 0xc2, 0x48, 0x72, 0x69, 0x43, 0x9d, 0xa3, - 0x31, 0x4f, 0xa3, 0x30, 0x56, 0xa2, 0x58, 0x81, 0x5e, 0xa5, 0x14, 0x7a, - 0x69, 0x8a, 0x8b, 0x93, 0x50, 0x19, 0x08, 0x77, 0x4b, 0xd4, 0x9c, 0x7b, - 0x0a, 0x6e, 0x7b, 0xf0, 0x17, 0x02, 0x4b, 0x5b, 0x79, 0x64, 0x3b, 0x4b, - 0x91, 0x33, 0x6b, 0xfb, 0x2a, 0x0e, 0x32, 0x8d, 0xd3, 0x1e, 0x62, 0x66, - 0x10, 0xfd, 0xf6, 0xdc, 0xf7, 0x90, 0xbf, 0x61, 0xa0, 0xff, 0xb6, 0x02, - 0x8b, 0xa6, 0x1e, 0x43, 0x49, 0x91, 0xd6, 0xd5, 0xf7, 0x9f, 0x8b, 0x31, - 0x04, 0x5d, 0x65, 0x6d, 0x45, 0x42, 0x55, 0x89, 0x2b, 0x2d, 0xd0, 0x9f, - 0xe2, 0xdc, 0xe9, 0x6e, 0x46, 0x0a, 0x33, 0xb4, 0x99, 0x81, 0xbe, 0x9c, - 0x6c, 0xc1, 0x7f, 0x42, 0xa6, 0x42, 0xe9, 0xbc, 0x49, 0xcf, 0xcd, 0xcc, - 0x79, 0xd8, 0xab, 0xac, 0x6d, 0x60, 0x82, 0x3f, 0x8e, 0x4b, 0x7c, 0xef, - 0x6c, 0xd6, 0x2f, 0x1c, 0xaa, 0x65, 0x68, 0x9d, 0x88, 0x83, 0x98, 0x53, - 0x7c, 0x52, 0xaf, 0x80, 0x96, 0x63, 0x9b, 0x0e, 0x40, 0x84, 0x01, 0x4b, - 0x4e, 0x8e, 0xaf, 0x72, 0xd1, 0xf0, 0xeb, 0x7c, 0x37, 0x96, 0xbc, 0x97, - 0x65, 0x8a, 0x82, 0x9e, 0x77, 0x44, 0x66, 0x6c, 0x5e, 0x38, 0x93, 0x7b, - 0x7e, 0x27, 0x10, 0xb7, 0xf2, 0x9f, 0xe4, 0xeb, 0xd5, 0xd5, 0x38, 0xc4, - 0x54, 0x76, 0x18, 0x15, 0x75, 0xf9, 0x18, 0x7c, 0x6f, 0x71, 0xae, 0x36, - 0x31, 0x62, 0xc8, 0xc7, 0x8e, 0xb8, 0xa6, 0xb6, 0xb9, 0xb4, 0x84, 0x8f, - 0x9d, 0x87, 0xc7, 0x5f, 0x20, 0xb7, 0xcb, 0x22, 0x02, 0x13, 0x92, 0x4f, - 0xcd, 0x7c, 0xd8, 0x10, 0xbc, 0xc1, 0xd5, 0x24, 0x63, 0x1e, 0xc0, 0xb8, - 0x77, 0x6b, 0xc1, 0x35, 0xf5, 0x5a, 0xd4, 0x76, 0x04, 0x85, 0x55, 0x1b, - 0xd6, 0x14, 0x55, 0xb9, 0x55, 0x09, 0x4f, 0x29, 0x23, 0xc3, 0xd1, 0x05, - 0x39, 0x0d, 0xf4, 0xc4, 0x2c, 0x87, 0x28, 0xb8, 0xe3, 0x1d, 0x90, 0x7c, - 0x8a, 0x28, 0xbb, 0xea, 0x08, 0x11, 0xee, 0x0f, 0xa5, 0x88, 0xb5, 0x3f, - 0x14, 0xac, 0x13, 0x28, 0x0b, 0xdc, 0x0b, 0xb6, 0x1a, 0x9d, 0x44, 0x12, - 0x45, 0x13, 0xa6, 0xfd, 0x78, 0x07, 0x18, 0x80, 0xf9, 0x64, 0xa1, 0x4f, - 0xa8, 0x6b, 0x4c, 0x98, 0xab, 0x6c, 0x33, 0x66, 0x29, 0x1b, 0x80, 0x8d, - 0x3e, 0xaf, 0x7a, 0xb9, 0x99, 0xc1, 0x05, 0x38, 0xdd, 0x1a, 0xba, 0xf3, - 0x4e, 0x4e, 0xf3, 0x77, 0x9a, 0x87, 0xe5, 0x7f, 0x89, 0x84, 0x4c, 0xdb, - 0x6d, 0xf4, 0x55, 0x9a, 0x2a, 0x56, 0xed, 0x2a, 0x02, 0x0d, 0xc7, 0x4d, - 0xf7, 0xab, 0xc3, 0xbe, 0x76, 0x97, 0x29, 0xe4, 0x77, 0x1d, 0x47, 0x37, - 0xe6, 0x65, 0x47, 0x3d, 0x90, 0xb9, 0x69, 0xbd, 0x5d, 0x17, 0x72, 0x6d, - 0x1b, 0xe4, 0xfb, 0x60, 0x8b, 0xaa, 0x4c, 0x98, 0xd5, 0x80, 0x1d, 0xb9, - 0xe7, 0x0b, 0x15, 0xb1, 0x7f, 0xac, 0x11, 0x30, 0x38, 0xbe, 0xe1, 0xbc, - 0xfe, 0xd8, 0x1b, 0x0b, 0xa1, 0xfb, 0x2a, 0x20, 0x44, 0xd9, 0xbe, 0xec, - 0x30, 0xb1, 0xb7, 0x4b, 0xf6, 0x62, 0xd4, 0x99, 0xd1, 0x0a, 0x43, 0xca, - 0xe6, 0xe8, 0x77, 0xc6, 0xd9, 0xd0, 0xc5, 0xe9, 0x33, 0x9d, 0x16, 0x0c, - 0x8e, 0xa0, 0xd9, 0x96, 0xb1, 0x93, 0x78, 0x57, 0x2c, 0xc8, 0x41, 0x8e, - 0x78, 0x42, 0x49, 0x13, 0x9b, 0xe6, 0x81, 0xf0, 0x45, 0x1e, 0x8b, 0x31, - 0x9d, 0x86, 0x6e, 0x79, 0xf2, 0xcd, 0xfc, 0x00, 0x54, 0x56, 0xb3, 0x43, - 0xfb, 0x10, 0x7b, 0x57, 0xed, 0xb1, 0x0a, 0x84, 0x81, 0x29, 0xdd, 0x28, - 0x96, 0xc4, 0x2a, 0x28, 0xf5, 0x5e, 0x9a, 0xad, 0x35, 0x23, 0x4a, 0x20, - 0x6f, 0x49, 0xfa, 0x82, 0x34, 0xaa, 0xa1, 0xe3, 0x8a, 0x76, 0x20, 0xa5, - 0x40, 0x4a, 0xb7, 0x7c, 0xf6, 0xbb, 0x67, 0xfc, 0x36, 0x34, 0x66, 0xd5, - 0xcc, 0x80, 0x87, 0xa4, 0x0a, 0x77, 0x02, 0x97, 0x8f, 0xee, 0x29, 0xa0, - 0xc7, 0xc6, 0x68, 0x70, 0x2d, 0x41, 0xa2, 0x2f, 0xe6, 0x46, 0x50, 0x02, - 0xcc, 0x75, 0x60, 0xaf, 0x5f, 0x12, 0xa9, 0xfa, 0x98, 0x66, 0x88, 0xe3, - 0x14, 0x70, 0x79, 0xd9, 0xa3, 0xc0, 0x35, 0xf8, 0xab, 0x9b, 0x5b, 0xa4, - 0xe3, 0x7a, 0x12, 0xfb, 0x34, 0xe5, 0x26, 0xdc, 0x7f, 0x4d, 0xc7, 0xba, - 0x4a, 0x8e, 0x10, 0x4f, 0x9f, 0x6b, 0xad, 0x98, 0xe2, 0x32, 0x58, 0x23, - 0x35, 0xd7, 0x63, 0xc4, 0x23, 0x4a, 0xd4, 0xb9, 0xd3, 0xec, 0x48, 0x46, - 0xa6, 0x58, 0xbc, 0xeb, 0xdd, 0x31, 0x42, 0x54, 0xc9, 0xcd, 0x74, 0x61, - 0xa9, 0x18, 0x66, 0x85, 0x40, 0x66, 0x4e, 0x20, 0x19, 0x0d, 0x14, 0x21, - 0x74, 0x77, 0xaf, 0xeb, 0x38, 0xbd, 0x84, 0xd2, 0x8e, 0xa2, 0x04, 0x99, - 0x03, 0xbd, 0x4e, 0x44, 0x97, 0x44, 0x9c, 0x9b, 0xab, 0x8f, 0x14, 0x09, - 0x26, 0x22, 0x60, 0x23, 0x3a, 0x08, 0x4c, 0x2c, 0xc0, 0xf2, 0x03, 0x87, - 0x7f, 0xd1, 0x19, 0xd8, 0x5b, 0x67, 0x7d, 0x39, 0xc3, 0x22, 0x47, 0x22, - 0x15, 0x1d, 0x66, 0x03, 0xe8, 0x14, 0xc0, 0x17, 0x1a, 0xbb, 0x09, 0xa9, - 0x5f, 0xea, 0x09, 0x74, 0x9e, 0x16, 0x97, 0x7d, 0x0e, 0x03, 0x73, 0x93, - 0x45, 0x6c, 0xe2, 0x4e, 0xd4, 0x57, 0x19, 0x36, 0xaa, 0x75, 0xf2, 0x0b, - 0x7b, 0x51, 0xe3, 0x1a, 0xa4, 0xbd, 0xd4, 0xde, 0x55, 0xe9, 0x0a, 0x16, - 0x0e, 0xf7, 0x0a, 0xee, 0x05, 0xbb, 0x1e, 0x8d, 0x38, 0xb5, 0x5f, 0xb8, - 0x27, 0x53, 0xcd, 0xf6, 0x08, 0x5e, 0x6a, 0x72, 0x82, 0xb5, 0x4e, 0xd5, - 0x44, 0x16, 0x2d, 0x79, 0x6e, 0x55, 0xa8, 0xc9, 0x69, 0x47, 0x82, 0xc3, - 0x55, 0x66, 0x9f, 0x81, 0xe0, 0x0d, 0xa8, 0xfa, 0x73, 0x17, 0xa5, 0xde, - 0xa3, 0x0d, 0xfb, 0x38, 0x60, 0x23, 0x85, 0x5c, 0x51, 0xf9, 0x47, 0x5b, - 0x9e, 0x1f, 0xaf, 0x07, 0x1d, 0x0a, 0x42, 0xcb, 0x7d, 0x3e, 0x30, 0x31, - 0xfc, 0x75, 0xfd, 0xdb, 0x22, 0x61, 0xa9, 0x04, 0x9c, 0x98, 0x8e, 0x77, - 0x52, 0x3b, 0x3e, 0xd7, 0xef, 0xca, 0xc5, 0xe8, 0x91, 0x7a, 0x59, 0x18, - 0x26, 0xfc, 0x09, 0x03, 0x21, 0xe8, 0xd5, 0x6f, 0x3b, 0x2e, 0xfa, 0xe7, - 0x6d, 0x3f, 0xcd, 0x03, 0xfc, 0xa9, 0xbf, 0x58, 0xa0, 0x5f, 0x91, 0x83, - 0x77, 0xe4, 0xbd, 0x2d, 0x7f, 0x15, 0x87, 0x48, 0x29, 0xae, 0xa8, 0x92, - 0x16, 0xd5, 0x18, 0x00, 0x10, 0xcd, 0xd8, 0x23, 0x87, 0x1f, 0x66, 0x60, - 0x1c, 0x78, 0x73, 0xad, 0x3a, 0xe5, 0xd5, 0x3f, 0x78, 0x02, 0x8d, 0xc7, - 0x1d, 0x27, 0x4d, 0xf1, 0x08, 0x88, 0xb9, 0xd6, 0x7d, 0xfd, 0xdb, 0x4c, - 0xf0, 0xf6, 0xd0, 0x03, 0x6c, 0x31, 0x2b, 0xd0, 0xea, 0x9b, 0xf2, 0xf8, - 0x0d, 0x4b, 0x6d, 0xa0, 0x7b, 0x21, 0x9b, 0xf1, 0x80, 0x93, 0xe3, 0x88, - 0xd9, 0x30, 0xa2, 0x7d, 0xf6, 0x88, 0x99, 0x83, 0xa5, 0xf9, 0xb0, 0xfd, - 0xe0, 0x7d, 0xed, 0x85, 0xea, 0x41, 0x06, 0x8b, 0x00, 0x77, 0xda, 0xb2, - 0x65, 0x63, 0x82, 0x9f, 0x0a, 0x6c, 0x8b, 0x3f, 0x59, 0xc0, 0xe1, 0x12, - 0x43, 0xe5, 0xf0, 0x93, 0x1f, 0xf0, 0x69, 0x1d, 0x95, 0xb7, 0xaf, 0xc1, - 0x83, 0xb2, 0x88, 0x18, 0xd1, 0x4a, 0xcf, 0x23, 0xb7, 0x4e, 0xc7, 0x4f, - 0xf7, 0xe0, 0x81, 0xc1, 0x55, 0x76, 0x1b, 0x8c, 0xbf, 0x68, 0x34, 0x63, - 0xd1, 0x86, 0xc3, 0xaa, 0x81, 0xce, 0x0d, 0x6c, 0xed, 0x73, 0x48, 0xfe, - 0xe2, 0xce, 0xb3, 0x73, 0x71, 0x7b, 0xb7, 0xd4, 0x76, 0x7b, 0xd8, 0xa4, - 0xc4, 0x70, 0x38, 0xdc, 0xd9, 0xb3, 0x9c, 0x92, 0xe2, 0x15, 0xd3, 0x93, - 0x43, 0x0b, 0xd6, 0xfb, 0xe8, 0x03, 0x22, 0x9b, 0x8c, 0x21, 0x41, 0x00, - 0x79, 0x54, 0xe7, 0x6e, 0x1a, 0xb3, 0xfc, 0xb2, 0xfd, 0xec, 0xce, 0x59, - 0xc1, 0x56, 0x30, 0x04, 0xca, 0xc1, 0xd9, 0x3e, 0x28, 0x18, 0xd0, 0xb5, - 0x4a, 0x87, 0x61, 0x37, 0xf7, 0xd3, 0x2d, 0x95, 0x88, 0xf3, 0xfc, 0xe5, - 0x78, 0x36, 0x40, 0x67, 0x40, 0xbf, 0x79, 0xee, 0xa5, 0x23, 0x78, 0xcd, - 0x25, 0x02, 0x2b, 0xf0, 0xe7, 0x77, 0x7d, 0xea, 0xa9, 0x45, 0xa7, 0xf9, - 0x14, 0x75, 0xbb, 0x72, 0x3c, 0x1a, 0x25, 0x53, 0x50, 0xf4, 0x3e, 0xe8, - 0xb5, 0xc4, 0x92, 0x94, 0x43, 0xa2, 0x44, 0x29, 0x7e, 0x10, 0x3f, 0xe3, - 0x08, 0x78, 0xcf, 0x03, 0xf5, 0xe5, 0xbf, 0x86, 0x77, 0x3f, 0xaa, 0xce, - 0xa7, 0x10, 0xea, 0x4d, 0x3a, 0x2f, 0x18, 0x18, 0x64, 0x83, 0xd6, 0x96, - 0x8f, 0xf6, 0xf5, 0xc6, 0xd6, 0x12, 0x1b, 0x10, 0x00, 0x1f, 0x2c, 0xc1, - 0x0f, 0x61, 0xcd, 0x6a, 0x24, 0x86, 0xa3, 0x9a, 0x2c, 0x89, 0x1b, 0xe8, - 0x37, 0xf8, 0x4d, 0xa0, 0x12, 0xfa, 0x16, 0xa2, 0xd6, 0xc1, 0x79, 0x29, - 0xb5, 0x61, 0x64, 0xdf, 0xad, 0x57, 0x5b, 0xb8, 0x8b, 0x66, 0xc0, 0x58, - 0x20, 0x8c, 0x9b, 0x8d, 0xce, 0xd1, 0x89, 0x49, 0xa0, 0x1e, 0xac, 0x72, - 0x01, 0x37, 0x51, 0x68, 0xb1, 0x5a, 0x90, 0x8d, 0xd7, 0x66, 0x61, 0x26, - 0x7c, 0xc0, 0xb7, 0x66, 0x00, 0x83, 0x09, 0xcb, 0x5a, 0x9d, 0x35, 0xef, - 0x6d, 0x7b, 0xb2, 0xdc, 0xcf, 0x34, 0x32, 0xd0, 0x4a, 0x21, 0x6b, 0xbd, - 0x26, 0xfd, 0xa4, 0xad, 0x86, 0x82, 0x48, 0xa0, 0x04, 0x38, 0x74, 0x63, - 0xf4, 0x47, 0x19, 0xf1, 0xaf, 0x34, 0xbd, 0x4b, 0x40, 0x79, 0x5d, 0xc9, - 0xbf, 0x69, 0x2a, 0xd1, 0x57, 0x8b, 0x30, 0xc0, 0x6f, 0x1a, 0x14, 0xb9, - 0xdf, 0xe0, 0x86, 0xe0, 0x92, 0xfb, 0xdd, 0xc7, 0xf7, 0xeb, 0x67, 0x49, - 0xcb, 0x5b, 0x06, 0x24, 0x90, 0x4e, 0x96, 0x6f, 0x86, 0x79, 0x33, 0x66, - 0x25, 0x72, 0x29, 0x82, 0x84, 0x7a, 0x2b, 0xd8, 0x1a, 0xa0, 0x86, 0x0e, - 0x6d, 0x36, 0x71, 0xce, 0x2e, 0x1d, 0x8d, 0x2f, 0x30, 0x4e, 0x28, 0x9c, - 0xa6, 0xaf, 0x4d, 0x38, 0x3b, 0x00, 0xdf, 0xde, 0x7d, 0x1f, 0x10, 0x0e, - 0xf0, 0xc4, 0x88, 0x95, 0xa8, 0x10, 0x22, 0xa1, 0xa6, 0x74, 0xd1, 0xbf, - 0x53, 0x20, 0x8a, 0x15, 0x4e, 0x22, 0x95, 0x9e, 0xce, 0x11, 0xa2, 0xf2, - 0xb7, 0x44, 0xb3, 0x78, 0xbd, 0x6c, 0xf3, 0x0f, 0x02, 0xfc, 0xe0, 0x51, - 0x4d, 0x2b, 0x9a, 0x2f, 0xed, 0x3d, 0x36, 0x83, 0x4e, 0xb1, 0xf9, 0xfb, - 0x15, 0xdc, 0x7d, 0x92, 0x3f, 0xd4, 0x3e, 0xe8, 0x53, 0xb8, 0x73, 0x5f, - 0xd6, 0xc5, 0x29, 0xfd, 0xc9, 0xa5, 0x2b, 0x40, 0xd0, 0x55, 0x1c, 0x87, - 0x77, 0x08, 0x90, 0xa0, 0x32, 0x4b, 0xe6, 0xbf, 0xa0, 0x0a, 0x41, 0xe4, - 0xa8, 0x19, 0x22, 0x50, 0x0b, 0x47, 0x17, 0xd8, 0x06, 0x4d, 0xe9, 0xd1, - 0x34, 0xfd, 0x19, 0x2f, 0x37, 0x39, 0x75, 0xe9, 0xaf, 0x7d, 0x03, 0x2b, - 0x83, 0xc5, 0xd6, 0x55, 0xe5, 0xe5, 0x00, 0x6c, 0x65, 0x70, 0x6f, 0x7d, - 0x4f, 0xa7, 0x3a, 0xd6, 0x41, 0xc7, 0xf6, 0x3c, 0x6f, 0x69, 0xdc, 0x43, - 0x13, 0x58, 0xce, 0xa1, 0x2b, 0x45, 0x4e, 0x2a, 0x26, 0x30, 0x4e, 0x9c, - 0x97, 0xbb, 0xf7, 0xdd, 0xd8, 0x92, 0x47, 0xc0, 0x70, 0x9a, 0xf8, 0xee, - 0xd4, 0xde, 0xab, 0x7f, 0x82, 0xe6, 0xbe, 0xb2, 0x3c, 0x95, 0x95, 0x3c, - 0x26, 0x59, 0x01, 0xd7, 0xf9, 0x4f, 0xb8, 0xbb, 0x8a, 0x8d, 0xc4, 0x98, - 0x11, 0xc5, 0xf1, 0x7d, 0x62, 0x19, 0x1f, 0x27, 0x0e, 0x57, 0x4f, 0xe2, - 0xf7, 0xd6, 0xa0, 0xea, 0x25, 0xa2, 0x59, 0xb1, 0xfc, 0x21, 0x73, 0x8e, - 0xc9, 0x9b, 0x69, 0x07, 0x02, 0xed, 0x49, 0xb9, 0x11, 0x61, 0xf3, 0xcd, - 0x12, 0x40, 0x40, 0xbf, 0x92, 0x89, 0x2e, 0x0c, 0xa7, 0xd9, 0x06, 0xfd, - 0x45, 0xa0, 0xdb, 0x7f, 0xba, 0xee, 0xd7, 0x8b, 0x3b, 0xa7, 0x2f, 0xc4, - 0xef, 0xe9, 0xa2, 0x38, 0x26, 0xbf, 0x87, 0xa8, 0xc2, 0x76, 0x01, 0xa6, - 0x97, 0x01, 0x13, 0x02, 0x7d, 0x77, 0x15, 0x43, 0x28, 0xbf, 0x57, 0x61, - 0xfc, 0x13, 0x01, 0xa6, 0xee, 0x53, 0x32, 0x4f, 0x92, 0x76, 0xb7, 0x0f, - 0x85, 0x3b, 0xf0, 0x28, 0x47, 0x41, 0x5c, 0x25, 0x48, 0x5d, 0x76, 0x1a, - 0x41, 0x59, 0x12, 0x01, 0x45, 0xe5, 0x6d, 0xb5, 0x84, 0x3e, 0xb1, 0x95, - 0x90, 0xab, 0xf7, 0xe9, 0xed, 0x84, 0xf6, 0x7e, 0x0f, 0xaf, 0xa5, 0x0c, - 0xa8, 0x6d, 0xfa, 0xfa, 0x83, 0x2a, 0xdb, 0xc5, 0xc9, 0xb8, 0xd7, 0x28, - 0x2f, 0x29, 0x91, 0x18, 0xee, 0xe9, 0xcb, 0x37, 0xf8, 0x58, 0x45, 0x9e, - 0xd1, 0x1f, 0xcd, 0xd9, 0x19, 0xaf, 0x21, 0x59, 0x51, 0x10, 0x81, 0x4d, - 0x08, 0xc6, 0x5a, 0x55, 0xe8, 0x8b, 0x77, 0x88, 0xa3, 0xf2, 0x2c, 0x5b, - 0x63, 0x61, 0x4f, 0x7a, 0x55, 0xef, 0x11, 0xdb, 0x9f, 0x87, 0xc1, 0x2a, - 0x6e, 0x41, 0x3d, 0x66, 0xec, 0x24, 0x09, 0xa6, 0x54, 0xa8, 0x4d, 0xa2, - 0x4f, 0x06, 0xa2, 0x6e, 0x5a, 0xc7, 0x2d, 0x9a, 0xbb, 0xfa, 0x01, 0x1f, - 0x55, 0x6f, 0xe2, 0xd3, 0x0c, 0x3f, 0x8d, 0x07, 0xa7, 0x34, 0xea, 0xd8, - 0xbc, 0x15, 0xda, 0x7d, 0xc3, 0x2d, 0xc6, 0xfb, 0xfc, 0x94, 0xed, 0x2b, - 0x27, 0x7d, 0x6b, 0x05, 0x14, 0x86, 0x3a, 0x6f, 0x53, 0x1f, 0xf2, 0x59, - 0xf7, 0xf9, 0xbe, 0xde, 0xef, 0x48, 0xea, 0xda, 0x55, 0xce, 0x79, 0xd9, - 0x73, 0xc0, 0x10, 0x9a, 0x77, 0x8a, 0x44, 0x19, 0x98, 0x70, 0x2d, 0xe4, - 0x1f, 0x9c, 0xea, 0xd6, 0xa5, 0x8a, 0x53, 0xf2, 0x17, 0x98, 0x8b, 0x53, - 0xc4, 0xd1, 0x63, 0xc8, 0xdd, 0xba, 0xb5, 0x17, 0x91, 0xb9, 0xc0, 0x7e, - 0xfa, 0x13, 0x12, 0xe7, 0xc9, 0x10, 0x9f, 0x77, 0x95, 0x29, 0x35, 0x72, - 0xaf, 0xba, 0xe5, 0x24, 0x4b, 0x6a, 0xb8, 0x7b, 0xb0, 0xff, 0x6c, 0x59, - 0xf6, 0x1e, 0xfe, 0x6f, 0x8e, 0x95, 0x0b, 0x0a, 0x5a, 0x8a, 0xaf, 0x32, - 0x4d, 0x38, 0xeb, 0x4b, 0xaf, 0xf7, 0xa0, 0xbc, 0x10, 0x9b, 0x25, 0xa6, - 0x8a, 0xa3, 0x25, 0xf4, 0x65, 0x97, 0x7b, 0x49, 0x78, 0xa4, 0xa0, 0x03, - 0x38, 0x00, 0xf1, 0xe6, 0x2a, 0x04, 0x4c, 0x3e, 0xce, 0xeb, 0x9d, 0x9e, - 0x5f, 0xeb, 0xc8, 0x5e, 0x38, 0xba, 0x8c, 0x6d, 0xab, 0x5b, 0x21, 0xa3, - 0xa6, 0x58, 0xa8, 0x6e, 0x45, 0xe1, 0xc7, 0xca, 0xa3, 0x25, 0xb5, 0xa5, - 0xb9, 0x9f, 0xbd, 0x3e, 0x13, 0xb1, 0x02, 0xa3, 0x6f, 0x39, 0x41, 0x0e, - 0x6f, 0x6a, 0x92, 0x35, 0x82, 0x07, 0xa9, 0x6e, 0xf1, 0xda, 0x15, 0xd0, - 0xe6, 0x69, 0x20, 0x18, 0x89, 0x1a, 0x3d, 0xc1, 0x3f, 0x0b, 0x4a, 0x15, - 0xd6, 0x30, 0xdf, 0x9c, 0xf3, 0xe0, 0xdf, 0x24, 0x18, 0x31, 0x66, 0xcd, - 0x2b, 0x56, 0xef, 0x51, 0x65, 0x42, 0xc1, 0x6d, 0xc6, 0xa8, 0x43, 0xaf, - 0xb9, 0xea, 0xa5, 0xb2, 0xce, 0x0b, 0xe7, 0x9d, 0x07, 0xd4, 0x8d, 0xa3, - 0x89, 0x7b, 0xd8, 0xa1, 0xee, 0x0c, 0x84, 0xf1, 0xa2, 0xc4, 0xe4, 0x5e, - 0xa5, 0x7c, 0x38, 0xb3, 0x2b, 0x37, 0x81, 0xed, 0x07, 0x65, 0x02, 0xe6, - 0x14, 0x40, 0xd2, 0x2c, 0xcc, 0xcd, 0xdc, 0xf8, 0x3c, 0xab, 0x7f, 0xeb, - 0x03, 0x02, 0xc6, 0x08, 0x57, 0x78, 0x79, 0x38, 0x82, 0xbc, 0x16, 0x22, - 0x1e, 0x67, 0xe7, 0xed, 0xa4, 0xe7, 0x95, 0x5d, 0x2e, 0x2d, 0x01, 0x28, - 0xf0, 0xc1, 0x2b, 0x17, 0xa7, 0xf4, 0xbf, 0xb2, 0x1d, 0x51, 0x9a, 0xcf, - 0x52, 0x0b, 0xbb, 0x77, 0xc9, 0x73, 0xfb, 0x58, 0xa0, 0x5c, 0xb5, 0x6d, - 0x74, 0xeb, 0x8c, 0xcd, 0xd8, 0x05, 0x72, 0xe6, 0xa9, 0xf6, 0x29, 0x1a, - 0x6d, 0x73, 0xe9, 0xa7, 0xfd, 0xea, 0xca, 0x2b, 0xc0, 0xb2, 0x47, 0xa0, - 0x80, 0x29, 0x11, 0x49, 0xad, 0xd8, 0xa5, 0x22, 0x1c, 0xa3, 0x43, 0x09, - 0xd1, 0x09, 0x81, 0x1b, 0xeb, 0x99, 0xdf, 0x4c, 0x25, 0xab, 0xd9, 0x87, - 0x68, 0x70, 0xf4, 0xe0, 0x7a, 0xbd, 0x79, 0xc3, 0x9e, 0xe5, 0xbb, 0xe1, - 0x60, 0xa0, 0x10, 0x40, 0x1d, 0x5d, 0x21, 0x08, 0x5d, 0x02, 0xe9, 0x25, - 0x5e, 0x1b, 0xa6, 0x85, 0x64, 0x3c, 0xfb, 0xe4, 0x03, 0x3c, 0xb9, 0x40, - 0xce, 0x7a, 0xe7, 0xf5, 0x5a, 0xe2, 0x33, 0xf7, 0x9c, 0x51, 0xe0, 0x7d, - 0xf3, 0x2f, 0x5d, 0xab, 0xa6, 0x97, 0xc9, 0x4b, 0x5e, 0x14, 0x03, 0x71, - 0x3f, 0xa3, 0x76, 0xd8, 0xcc, 0xc4, 0x3c, 0x39, 0xbc, 0xed, 0x51, 0x68, - 0xe8, 0x91, 0x2f, 0xaa, 0xd8, 0x97, 0xca, 0x8d, 0x2f, 0x1b, 0x0b, 0x41, - 0xe8, 0x27, 0xa2, 0x7a, 0x2e, 0x28, 0xa9, 0x64, 0xde, 0xec, 0x5e, 0x57, - 0xc1, 0x40, 0x22, 0x4f, 0xbc, 0x81, 0xa0, 0x73, 0xc9, 0x0c, 0x9c, 0x6e, - 0xe4, 0xe3, 0x63, 0x21, 0xcd, 0xda, 0xb6, 0x88, 0x20, 0x0b, 0xd4, 0xeb, - 0x4b, 0xb6, 0x38, 0x0d, 0xc3, 0x1f, 0x3a, 0x53, 0x1e, 0x5e, 0xbc, 0x99, - 0x5d, 0x6b, 0x93, 0x8d, 0xe5, 0x2f, 0x03, 0xb5, 0x56, 0x35, 0xb8, 0xf8, - 0x6a, 0x1a, 0x1a, 0x2a, 0xd8, 0xaa, 0x47, 0x71, 0xba, 0x5b, 0x36, 0x5c, - 0x4f, 0x42, 0xbc, 0x7e, 0x1a, 0xd0, 0xc0, 0x2e, 0x35, 0x11, 0x40, 0xfc, - 0xc0, 0x22, 0x69, 0xb6, 0xbb, 0x1e, 0x84, 0x7a, 0x3c, 0x20, 0x35, 0xff, - 0x2e, 0x7f, 0x20, 0x11, 0x4c, 0x76, 0x20, 0x68, 0xb2, 0xbb, 0x39, 0xf2, - 0x1d, 0x1a, 0x79, 0xfc, 0x3e, 0x63, 0xb0, 0xdc, 0xab, 0xf1, 0x0f, 0x2a, - 0xc0, 0xbf, 0x30, 0x12, 0x90, 0xec, 0xeb, 0x5a, 0xb1, 0x28, 0x0b, 0xbc, - 0x6a, 0xf1, 0x30, 0xf9, 0x22, 0xf1, 0x52, 0x9c, 0xd9, 0x92, 0x50, 0x2d, - 0x60, 0x5b, 0xd8, 0x87, 0x9c, 0x6c, 0x05, 0x99, 0xb9, 0x8e, 0xd1, 0x14, - 0x20, 0xa8, 0xf8, 0xef, 0x35, 0x1c, 0xd3, 0x19, 0x0e, 0x81, 0x04, 0x0b, - 0xf1, 0xf8, 0x64, 0xa8, 0xbe, 0xa7, 0x6d, 0x58, 0xb5, 0x96, 0x20, 0xf0, - 0x51, 0x9c, 0x57, 0x57, 0x27, 0x6b, 0xd1, 0xec, 0xf2, 0x2a, 0x61, 0xfe, - 0x1c, 0x87, 0x0b, 0xe6, 0x75, 0xd6, 0xac, 0x4a, 0x8d, 0xdb, 0x5b, 0x16, - 0x82, 0x2d, 0x8a, 0x23, 0xc5, 0xdb, 0x30, 0xbf, 0xa8, 0x42, 0xd6, 0xd5, - 0xf0, 0xe5, 0x5c, 0x8b, 0xce, 0xc8, 0x6e, 0x94, 0x9f, 0x44, 0x2e, 0x7f, - 0xc9, 0x9f, 0xbf, 0xba, 0x5b, 0xa0, 0x2e, 0xc7, 0x83, 0xe7, 0xb5, 0x74, - 0x05, 0xed, 0x27, 0xdf, 0x04, 0x01, 0x3e, 0xa2, 0x1a, 0x7d, 0x91, 0x9e, - 0xdd, 0x34, 0x49, 0x74, 0x85, 0xca, 0xcd, 0x24, 0xc5, 0x4a, 0x84, 0xab, - 0x3c, 0x7e, 0xee, 0xa5, 0xec, 0x82, 0x63, 0x8f, 0x72, 0x43, 0x16, 0x75, - 0x35, 0xac, 0xd5, 0x43, 0x10, 0x74, 0xbc, 0xe9, 0x3a, 0x24, 0xa4, 0x27, - 0xb3, 0xfd, 0xf4, 0x2a, 0xbf, 0x39, 0xed, 0x6a, 0x03, 0x98, 0xc2, 0x35, - 0x9a, 0x25, 0x4a, 0xa6, 0xeb, 0x6d, 0xa1, 0xdb, 0xb5, 0x6a, 0xb7, 0x49, - 0xd5, 0xc7, 0x84, 0x8c, 0x5d, 0x43, 0xea, 0x76, 0xca, 0xe4, 0xca, 0x06, - 0x56, 0xed, 0xd5, 0x5c, 0xba, 0x24, 0xd4, 0x5d, 0x99, 0x19, 0x9f, 0xcd, - 0x81, 0xb8, 0x8f, 0xa6, 0x85, 0x85, 0x53, 0xe2, 0x15, 0x1e, 0x86, 0x83, - 0x38, 0x84, 0x79, 0x1d, 0x35, 0xd9, 0x8d, 0xce, 0x3b, 0x70, 0x13, 0xa7, - 0xaa, 0x54, 0x5e, 0x88, 0x26, 0x7e, 0x17, 0x00, 0xe9, 0x86, 0xae, 0x4a, - 0xf9, 0x58, 0x49, 0xe7, 0x5e, 0x92, 0xeb, 0x96, 0xc2, 0xa8, 0x74, 0x49, - 0xa1, 0xb2, 0x2d, 0x4e, 0x2e, 0x8e, 0xe2, 0xc7, 0x08, 0xef, 0x2a, 0x98, - 0x9d, 0x6a, 0xfa, 0xfd, 0x92, 0xfb, 0x79, 0x60, 0x8f, 0xea, 0x95, 0xd3, - 0x07, 0x2b, 0x90, 0x8f, 0x0a, 0x31, 0x83, 0x49, 0x56, 0x05, 0xca, 0xa4, - 0x67, 0x83, 0xe1, 0x76, 0x37, 0x55, 0x22, 0x6b, 0x0c, 0xca, 0x0c, 0xe5, - 0x6f, 0x1c, 0x54, 0x2d, 0xe4, 0x30, 0xaf, 0x8d, 0xbe, 0x32, 0x95, 0x4f, - 0xe8, 0xab, 0x64, 0x66, 0x3a, 0x4e, 0x6b, 0xef, 0x0c, 0x1f, 0x70, 0x1d, - 0x85, 0x03, 0xbc, 0x27, 0x88, 0x60, 0x07, 0xd0, 0x8c, 0x43, 0xe4, 0xb6, - 0xe8, 0x58, 0xe3, 0xcf, 0x8b, 0x3f, 0x47, 0xfd, 0xc8, 0x20, 0x60, 0xb1, - 0xaa, 0x06, 0x94, 0xcd, 0x76, 0x27, 0x26, 0x13, 0x51, 0x32, 0x27, 0xab, - 0xf8, 0x53, 0x81, 0x76, 0xdf, 0x6a, 0x7e, 0xf8, 0xdd, 0x33, 0x7e, 0x68, - 0x0a, 0xc8, 0x7c, 0x30, 0x98, 0xb2, 0xf4, 0x9e, 0x77, 0x40, 0x4f, 0x4e, - 0xd1, 0x39, 0x94, 0x07, 0x1b, 0x04, 0xfe, 0x11, 0xa2, 0xf8, 0x44, 0x5d, - 0x4d, 0x28, 0x81, 0xe2, 0xd3, 0xe2, 0x39, 0x46, 0x1c, 0x2e, 0x7c, 0xc4, - 0xda, 0x39, 0xd2, 0x02, 0x19, 0x58, 0x12, 0x1a, 0xee, 0xde, 0x38, 0x8b, - 0x0c, 0x6d, 0x29, 0xa9, 0x86, 0xb0, 0xba, 0x11, 0xa4, 0x2f, 0x63, 0x67, - 0xa7, 0xb5, 0xf0, 0xeb, 0x9e, 0x74, 0x15, 0xf6, 0xec, 0xd9, 0x16, 0x91, - 0x55, 0x71, 0xcc, 0x31, 0x26, 0x01, 0x0b, 0x03, 0xc6, 0x2a, 0xb9, 0x18, - 0x26, 0x48, 0xf8, 0x7f, 0x59, 0x4e, 0xbb, 0xf2, 0x30, 0x0a, 0xb8, 0x37, - 0x56, 0xb6, 0x04, 0x4a, 0x0f, 0x44, 0xb1, 0x94, 0x23, 0xaf, 0x23, 0x7e, - 0xef, 0x83, 0xe1, 0xf2, 0x78, 0x0e, 0x2c, 0x35, 0xa0, 0x95, 0xb7, 0xb9, - 0x09, 0x1b, 0x1c, 0x46, 0x41, 0x95, 0x8d, 0x7c, 0x55, 0x52, 0x24, 0x34, - 0x9d, 0xd7, 0xff, 0xa1, 0x59, 0xef, 0x7a, 0xd8, 0x9d, 0x58, 0x00, 0x40, - 0xc7, 0xae, 0xe0, 0x8f, 0x78, 0xea, 0x57, 0xff, 0x68, 0xbc, 0xc4, 0x53, - 0x3c, 0xf7, 0xc9, 0xa6, 0xc3, 0x4f, 0xe1, 0x25, 0xfd, 0x83, 0x27, 0xb9, - 0x04, 0x3e, 0x31, 0x4c, 0xf3, 0x4e, 0xb3, 0x32, 0x51, 0x44, 0x92, 0x8c, - 0x46, 0x2e, 0x74, 0xa7, 0x1f, 0xfe, 0x3f, 0xf5, 0xde, 0xa8, 0xbc, 0xc8, - 0xfd, 0x93, 0xcb, 0x24, 0x80, 0xa5, 0x5e, 0x21, 0x95, 0x8c, 0x17, 0xdd, - 0xbb, 0x84, 0x16, 0x38, 0x69, 0x64, 0x48, 0xa7, 0xf2, 0x0a, 0x33, 0x46, - 0xc2, 0xd9, 0xca, 0x24, 0x00, 0x3c, 0xaa, 0xae, 0xf3, 0xe6, 0x5b, 0x17, - 0x8b, 0xe7, 0x43, 0xbd, 0xef, 0x8f, 0xb1, 0x61, 0x23, 0x03, 0x89, 0x65, - 0xdc, 0x76, 0xe1, 0x09, 0xf6, 0x4d, 0xc1, 0x87, 0x4b, 0x8c, 0xf8, 0x47, - 0x7a, 0x48, 0x82, 0x29, 0xff, 0xaf, 0x3f, 0x4a, 0xf8, 0xff, 0x98, 0x8d, - 0x77, 0xe6, 0x7d, 0xb4, 0xd7, 0x7d, 0x14, 0x62, 0x37, 0xf2, 0x28, 0x87, - 0x84, 0x6c, 0xce, 0x3c, 0x67, 0x6c, 0x14, 0xf8, 0xce, 0x2f, 0x47, 0x0e, - 0x8f, 0xb7, 0x77, 0xa0, 0x6e, 0x7a, 0x3e, 0x4c, 0x69, 0x22, 0x00, 0xe5, - 0x29, 0xf0, 0xa7, 0xc2, 0x21, 0x0b, 0xfc, 0x9c, 0x2a, 0x9c, 0x4a, 0x40, - 0xe3, 0x4d, 0x67, 0xca, 0xd7, 0x30, 0x2e, 0x11, 0xc7, 0xae, 0x9d, 0xe8, - 0x71, 0x48, 0x5f, 0x5f, 0xaf, 0x80, 0x86, 0xd0, 0x8d, 0x79, 0xcc, 0x49, - 0x99, 0x58, 0x56, 0x59, 0xc8, 0xe9, 0xb1, 0x43, 0x49, 0xf6, 0xac, 0x02, - 0x3a, 0x79, 0x46, 0xe3, 0x8a, 0x06, 0x40, 0x4d, 0xd5, 0x49, 0x51, 0xee, - 0x88, 0x84, 0xe1, 0xc4, 0x13, 0xac, 0xf9, 0x7b, 0x1b, 0xc0, 0xe5, 0x9e, - 0xa5, 0xe6, 0xda, 0xbd, 0x4b, 0xfe, 0xbd, 0x77, 0x43, 0xd7, 0xe6, 0x8e, - 0x70, 0x34, 0x4f, 0x23, 0x98, 0xea, 0x59, 0x50, 0x63, 0xd2, 0xb4, 0xbb, - 0x3b, 0x66, 0x7a, 0xd4, 0x66, 0xce, 0x10, 0xdb, 0xdd, 0x14, 0x23, 0x93, - 0xa1, 0x95, 0x09, 0x91, 0x04, 0x03, 0xeb, 0x6f, 0xe4, 0xe9, 0x37, 0x56, - 0x03, 0x04, 0x0b, 0xb8, 0x3d, 0xb4, 0x20, 0xcd, 0xf0, 0x45, 0x1d, 0x08, - 0x22, 0x70, 0x84, 0xf1, 0xa9, 0x88, 0x01, 0xd1, 0xd5, 0xa0, 0x3f, 0xa1, - 0x00, 0xba, 0xc5, 0x2c, 0x50, 0x9f, 0x49, 0x80, 0xd6, 0x1b, 0x16, 0xcf, - 0x5c, 0x3b, 0x3c, 0xd1, 0xe6, 0xf5, 0xc7, 0x4b, 0xdc, 0x55, 0xe1, 0x27, - 0xde, 0x29, 0xca, 0x6e, 0xaa, 0x70, 0x42, 0x6d, 0x79, 0xcf, 0xee, 0x79, - 0xf2, 0xe2, 0x86, 0x98, 0x80, 0xd8, 0xf5, 0x68, 0xc8, 0x32, 0xa9, 0x0d, - 0xf0, 0x2e, 0x2a, 0x02, 0x50, 0x71, 0x4e, 0x53, 0x4f, 0x32, 0xab, 0x72, - 0xfd, 0x6d, 0x61, 0x30, 0xb3, 0x3f, 0xcb, 0xdb, 0x24, 0x18, 0xc0, 0xa2, - 0xdb, 0x77, 0x38, 0x1d, 0xa9, 0xdc, 0x39, 0xd2, 0x88, 0x97, 0xf9, 0xb7, - 0xcc, 0x4d, 0xcd, 0x81, 0x5d, 0xc8, 0xd5, 0xc0, 0xaa, 0x3d, 0xb5, 0x7f, - 0x17, 0xf6, 0xf8, 0x50, 0x23, 0xfa, 0xf2, 0xe6, 0xba, 0x8a, 0xd5, 0xb8, - 0x22, 0x90, 0xf3, 0x71, 0x4c, 0xdb, 0x36, 0x16, 0x50, 0xbc, 0x71, 0x96, - 0xa8, 0x8c, 0xa6, 0x10, 0xe7, 0x9c, 0x7b, 0xdd, 0xc5, 0xbd, 0x51, 0xd0, - 0xfa, 0xf4, 0x9e, 0x8e, 0x9b, 0xac, 0xd5, 0xbd, 0x3e, 0xfd, 0x98, 0x44, - 0xb3, 0x83, 0xab, 0x50, 0xa7, 0x24, 0xf4, 0x1f, 0xc5, 0x52, 0x0f, 0xf5, - 0xed, 0xa2, 0x4a, 0xb3, 0x2d, 0xdb, 0x87, 0x27, 0x4a, 0x7f, 0x34, 0xbf, - 0x35, 0x65, 0x19, 0xed, 0x05, 0x97, 0x8b, 0xe3, 0xe8, 0x92, 0x98, 0xbc, - 0x8e, 0x7a, 0x88, 0x0b, 0xa2, 0x0a, 0x18, 0xf2, 0xe1, 0xbb, 0xf7, 0x57, - 0xea, 0xa9, 0x74, 0x32, 0xb3, 0xb3, 0xb6, 0x02, 0x6a, 0x66, 0xca, 0xfe, - 0x78, 0x79, 0x1e, 0x54, 0x2b, 0x8d, 0xa5, 0x5c, 0x4b, 0x37, 0xa0, 0xe1, - 0xe1, 0x3b, 0xa2, 0x8a, 0xc3, 0xe8, 0x47, 0xd2, 0x2c, 0x7c, 0xe0, 0x2f, - 0x68, 0x33, 0xe6, 0x44, 0x0a, 0xbf, 0x98, 0x7e, 0xcb, 0x1b, 0xe3, 0x9c, - 0xae, 0x23, 0xee, 0xe0, 0x2c, 0x10, 0x27, 0x2f, 0xa4, 0x53, 0xa1, 0xd4, - 0xa5, 0x71, 0xfb, 0x64, 0xae, 0xac, 0xf1, 0x58, 0xb7, 0xab, 0xbf, 0x1c, - 0x56, 0xce, 0xf9, 0x7c, 0xdd, 0x9a, 0x04, 0xde, 0xe3, 0x80, 0x69, 0x5d, - 0x49, 0x06, 0x43, 0x8e, 0x5a, 0x16, 0x77, 0x6f, 0x97, 0xd3, 0xc5, 0xac, - 0xbd, 0x64, 0xf7, 0x97, 0x25, 0x10, 0xc5, 0x77, 0x60, 0x49, 0x31, 0x75, - 0x96, 0x5f, 0x35, 0xce, 0xcf, 0xcc, 0xf3, 0x84, 0xd6, 0x50, 0xf6, 0x7e, - 0x43, 0xe0, 0xd2, 0x81, 0xa0, 0x4e, 0xda, 0x14, 0x9f, 0xe2, 0xb3, 0x04, - 0xc8, 0x7a, 0x62, 0x0c, 0x4a, 0x37, 0x30, 0x4c, 0x6b, 0x38, 0x6d, 0xa4, - 0x20, 0x8b, 0x1e, 0x72, 0x6f, 0xd7, 0x79, 0x60, 0x06, 0x96, 0xb0, 0x6b, - 0x73, 0x60, 0xc0, 0x1a, 0x72, 0x8a, 0x69, 0xa6, 0x4a, 0x6f, 0x66, 0xc6, - 0x1e, 0x87, 0x46, 0x24, 0x93, 0x48, 0x5e, 0x5d, 0x65, 0xe2, 0x40, 0x8e, - 0xb3, 0x4e, 0xbb, 0xae, 0x4f, 0xbe, 0xb8, 0x78, 0x4f, 0x6c, 0x4d, 0xf0, - 0xb1, 0x58, 0xcc, 0x27, 0x74, 0x0a, 0xb0, 0xed, 0xd8, 0xed, 0x09, 0x51, - 0x3c, 0xd0, 0x17, 0xc2, 0xfa, 0xfc, 0xd5, 0x32, 0xd6, 0x3b, 0x8a, 0x3b, - 0x3a, 0x46, 0x55, 0x35, 0x54, 0x21, 0x84, 0x8c, 0x94, 0x0d, 0xc2, 0xb6, - 0xce, 0x86, 0x1e, 0x94, 0x73, 0x12, 0xf2, 0x3f, 0x47, 0x5f, 0x56, 0x03, - 0x22, 0x52, 0x4e, 0xc2, 0x0b, 0x8d, 0x46, 0xc3, 0xaa, 0xbe, 0xe0, 0x74, - 0x1c, 0x21, 0xba, 0x28, 0x50, 0x77, 0x2c, 0xc5, 0x8a, 0x87, 0xf8, 0x71, - 0xc6, 0x8b, 0x28, 0xc7, 0x46, 0x8b, 0x4e, 0xf5, 0x7d, 0x3c, 0xfd, 0xf9, - 0x7f, 0x33, 0xec, 0x22, 0x1c, 0xed, 0x99, 0x1c, 0x75, 0x93, 0x6a, 0x28, - 0x5f, 0xaf, 0x8b, 0x8c, 0xcb, 0xfa, 0x9b, 0x27, 0x87, 0x0a, 0x7a, 0x53, - 0xba, 0x05, 0xcd, 0x24, 0x8a, 0x1e, 0xd3, 0x71, 0xf1, 0x97, 0xd8, 0x28, - 0xea, 0x9d, 0x8c, 0xbc, 0x2e, 0x6e, 0xb8, 0xea, 0x14, 0xce, 0xd7, 0x70, - 0x7f, 0xb6, 0x52, 0xa3, 0xa7, 0xf5, 0xbd, 0x23, 0x59, 0x9e, 0xc6, 0xe0, - 0xf4, 0xef, 0x2f, 0xac, 0x15, 0x5a, 0xa3, 0xcd, 0xbe, 0xaa, 0x9e, 0x15, - 0x7c, 0xad, 0xca, 0x7a, 0xbe, 0xb3, 0x28, 0xb4, 0xe8, 0x39, 0xdb, 0x9a, - 0xe9, 0x64, 0xb3, 0xa2, 0x89, 0xa2, 0x5d, 0xfb, 0x19, 0x6c, 0x4e, 0xcc, - 0xc8, 0xa1, 0x93, 0x73, 0x91, 0xc2, 0xfc, 0xf5, 0x3a, 0x58, 0x37, 0x1e, - 0xa6, 0x00, 0xb1, 0x61, 0x1c, 0xd8, 0xe8, 0x7b, 0x0f, 0xe1, 0x10, 0x66, - 0xf8, 0x7c, 0x66, 0x02, 0x9e, 0x85, 0xdb, 0xcc, 0x11, 0x2c, 0x38, 0xef, - 0xc0, 0x14, 0x07, 0xea, 0xb4, 0xdb, 0xc5, 0x5b, 0x76, 0xd7, 0xb8, 0xa2, - 0x73, 0xa7, 0xc5, 0x90, 0x06, 0x3a, 0x75, 0x5d, 0xae, 0x7f, 0x43, 0x9d, - 0xd4, 0x25, 0xf4, 0x6e, 0x06, 0x6f, 0x12, 0x4f, 0xa5, 0x81, 0x09, 0x62, - 0x12, 0x06, 0x79, 0xf8, 0x16, 0xcc, 0x5a, 0x27, 0x52, 0xd9, 0x57, 0x3d, - 0xd0, 0x61, 0xce, 0xfd, 0xc8, 0x8e, 0xcd, 0xfb, 0xe4, 0xfb, 0x3e, 0xd1, - 0x88, 0xd0, 0xb9, 0x77, 0x53, 0x03, 0xed, 0x31, 0x3a, 0xd7, 0x0f, 0x5f, - 0x82, 0xfd, 0x38, 0x82, 0xb9, 0x6e, 0xf0, 0xcf, 0x8a, 0x19, 0x7a, 0x69, - 0x33, 0xe3, 0x5b, 0x91, 0x52, 0x68, 0x85, 0x10, 0xdc, 0xa8, 0x13, 0xa6, - 0xbe, 0x2b, 0xbc, 0xe3, 0x57, 0x3f, 0x1c, 0x93, 0x48, 0x98, 0x2c, 0x3c, - 0x6a, 0x8c, 0x61, 0x75, 0x5b, 0x88, 0xeb, 0xa2, 0x39, 0x7e, 0xde, 0xf3, - 0x77, 0x6f, 0xfe, 0x61, 0xc7, 0xbe, 0xde, 0xb7, 0x13, 0x41, 0x9a, 0xa1, - 0xd8, 0x1a, 0x06, 0xb2, 0xe7, 0xdb, 0xdc, 0x9b, 0xcf, 0x1e, 0x93, 0x25, - 0x1f, 0xba, 0xe6, 0x1b, 0xe5, 0xc7, 0x7e, 0x9f, 0x2e, 0x4b, 0x54, 0x8f, - 0xf2, 0x32, 0xb0, 0xed, 0x29, 0xe6, 0xa2, 0xd5, 0xc8, 0xe1, 0x39, 0xb7, - 0x9c, 0x93, 0xde, 0x45, 0x68, 0x35, 0x75, 0xd3, 0xb1, 0xed, 0xc3, 0x4b, - 0xd1, 0xd8, 0x7f, 0x1f, 0xc4, 0xa0, 0x40, 0xc7, 0xbc, 0x32, 0x0e, 0xb1, - 0x19, 0xe3, 0x61, 0x4b, 0xb9, 0x15, 0x51, 0x1b, 0xfb, 0x5e, 0x88, 0x9f, - 0xb2, 0xa5, 0xd9, 0x52, 0x0d, 0x4f, 0xb7, 0x7d, 0x20, 0x0a, 0x25, 0xcf, - 0xff, 0x5e, 0x2d, 0xca, 0xe9, 0x95, 0x9e, 0x37, 0x9d, 0xfb, 0x1e, 0x2b, - 0x8f, 0x04, 0x03, 0x83, 0x9c, 0x59, 0xf8, 0xfd, 0x9f, 0xfe, 0x03, 0x3b, - 0x2e, 0xdc, 0x82, 0x67, 0xce, 0xf8, 0xa9, 0x68, 0x5e, 0x83, 0x55, 0xba, - 0x60, 0xd3, 0x88, 0x9a, 0x69, 0x6b, 0x2e, 0xae, 0xab, 0x31, 0x33, 0xa7, - 0x36, 0xa4, 0x10, 0x8a, 0xab, 0x8c, 0xa4, 0x68, 0xdd, 0xa4, 0x7c, 0xb8, - 0x7d, 0xf8, 0x51, 0xcc, 0xd7, 0x1b, 0x35, 0x0d, 0x80, 0xb4, 0x3b, 0x9f, - 0xad, 0xdf, 0x8d, 0xfa, 0xb6, 0x2a, 0xb9, 0x3e, 0x2e, 0x0a, 0x69, 0x93, - 0xf3, 0xe6, 0x18, 0xd3, 0x61, 0x96, 0x01, 0x78, 0xb4, 0xe9, 0xbf, 0x26, - 0xd7, 0xab, 0xc5, 0x6a, 0x73, 0x97, 0xcb, 0xe3, 0x22, 0xaf, 0xb2, 0x65, - 0x2c, 0xc3, 0xde, 0xbe, 0x9f, 0x53, 0xfa, 0x9b, 0xe7, 0xb7, 0x53, 0xa7, - 0x81, 0xb4, 0xc1, 0xc1, 0x84, 0xd4, 0xeb, 0x80, 0xfc, 0x72, 0xfe, 0x76, - 0xfa, 0xa3, 0x63, 0x1b, 0xd8, 0xb2, 0xc1, 0xca, 0x50, 0xc7, 0x9b, 0x03, - 0xdb, 0x6e, 0xb6, 0xd9, 0x7c, 0x91, 0x9b, 0xd8, 0xf5, 0x4a, 0x9c, 0xb4, - 0x2e, 0xdd, 0xd4, 0xdb, 0x32, 0xf3, 0x47, 0x14, 0x56, 0xd2, 0xee, 0x13, - 0xab, 0x5c, 0x6c, 0x00, 0x14, 0x23, 0xc2, 0xbe, 0xd5, 0x91, 0xf0, 0x8b, - 0xfa, 0xbe, 0x3b, 0xb5, 0x1e, 0x18, 0x8d, 0xae, 0x82, 0xbb, 0x94, 0x88, - 0xcf, 0xf7, 0x27, 0xa8, 0x81, 0xea, 0x2d, 0x94, 0x51, 0xcf, 0xf7, 0x8c, - 0x92, 0x46, 0x63, 0xda, 0xc9, 0x9f, 0x59, 0xa7, 0xe3, 0x2e, 0xd3, 0x08, - 0x6b, 0x06, 0xb3, 0x96, 0x00, 0xbb, 0x31, 0xe8, 0x97, 0xaf, 0x81, 0x8f, - 0xe2, 0x77, 0xf5, 0xb7, 0x70, 0xf9, 0xda, 0xc9, 0xb1, 0x0a, 0x9b, 0x8d, - 0xf2, 0xd0, 0x9d, 0x29, 0x0f, 0x2d, 0x33, 0x4c, 0x0e, 0xa9, 0x7d, 0x6e, - 0x68, 0x64, 0x14, 0x11, 0x88, 0xc9, 0x35, 0x36, 0x51, 0xfc, 0x0b, 0x84, - 0xff, 0xd6, 0xb8, 0xa9, 0x2d, 0xd5, 0xa2, 0xfb, 0x8a, 0x15, 0x26, 0x77, - 0x83, 0xaa, 0x3c, 0xbf, 0x40, 0x4b, 0x22, 0x94, 0x95, 0x71, 0xb8, 0x27, - 0x93, 0x54, 0x04, 0x27, 0x37, 0x84, 0x6d, 0xf6, 0x07, 0x80, 0xf5, 0x05, - 0x14, 0xfb, 0x9d, 0xfe, 0xfe, 0x72, 0x53, 0x15, 0x8f, 0xa3, 0xf5, 0x25, - 0x7a, 0x99, 0x48, 0x3b, 0xe0, 0xa6, 0x0f, 0x12, 0xa5, 0x29, 0x44, 0x0e, - 0x47, 0x54, 0x02, 0x4a, 0xa8, 0x66, 0xe9, 0xa8, 0xf4, 0xdf, 0xb8, 0x71, - 0x26, 0x70, 0xb3, 0xef, 0x3f, 0x87, 0x90, 0x73, 0x3e, 0xdc, 0x0e, 0xf8, - 0xc7, 0x3a, 0xbe, 0x5d, 0x0f, 0xad, 0x49, 0x8d, 0xfb, 0x49, 0x17, 0xa5, - 0x7f, 0xe2, 0x5a, 0x64, 0xd3, 0x79, 0xc1, 0xfa, 0xe8, 0x56, 0xc6, 0x07, - 0x4b, 0x60, 0x97, 0x9a, 0x78, 0xb4, 0x10, 0xd6, 0xb9, 0x6d, 0x22, 0x75, - 0xc9, 0x21, 0x22, 0xe1, 0x14, 0xcc, 0x6e, 0x5f, 0x01, 0x42, 0x5b, 0x10, - 0x4c, 0x6d, 0x21, 0x0b, 0x72, 0xb8, 0xeb, 0xb9, 0x7b, 0x96, 0x39, 0xbf, - 0x3a, 0x45, 0x48, 0xa8, 0xe6, 0xef, 0xa6, 0x52, 0xf0, 0x7e, 0x9e, 0x61, - 0xd6, 0x77, 0xb6, 0xbd, 0x52, 0xa1, 0xf9, 0x9c, 0x3c, 0xd3, 0xf7, 0x39, - 0x71, 0xa1, 0xfc, 0xa8, 0xf2, 0x85, 0x30, 0xa5, 0x8a, 0xed, 0x3d, 0x74, - 0x83, 0xd7, 0x39, 0xa8, 0xf9, 0x2f, 0xbf, 0xa5, 0x09, 0x72, 0x1f, 0x42, - 0x9f, 0xe4, 0x85, 0x75, 0x85, 0xad, 0xe1, 0x04, 0x34, 0xd2, 0xb2, 0x70, - 0x06, 0x71, 0xcb, 0x5e, 0x91, 0x97, 0x8a, 0x2c, 0xab, 0x6c, 0xd0, 0x9d, - 0xef, 0x32, 0x77, 0x49, 0xbe, 0x58, 0x66, 0xc9, 0x39, 0xc5, 0x17, 0xba, - 0x9c, 0xac, 0x58, 0xd5, 0x36, 0x11, 0xe5, 0x9d, 0x44, 0x6b, 0xfa, 0x72, - 0x2f, 0x05, 0xf8, 0x87, 0x6a, 0x36, 0x1c, 0xe8, 0xc8, 0xa6, 0x70, 0x42, - 0x7b, 0x69, 0x6b, 0x19, 0xa6, 0xb7, 0x23, 0x32, 0xa1, 0xc2, 0xd1, 0xfa, - 0x46, 0x66, 0x36, 0x5f, 0x85, 0x3b, 0x3c, 0xe3, 0x21, 0xa4, 0xcb, 0xf3, - 0xc9, 0xf2, 0xa8, 0x7e, 0xdc, 0x00, 0xc5, 0x0d, 0x94, 0xf0, 0xb5, 0x14, - 0x00, 0xe8, 0x15, 0xd1, 0xf2, 0x26, 0xa6, 0x1b, 0x38, 0x17, 0x70, 0xbd, - 0xde, 0x70, 0x68, 0x9e, 0xf6, 0x01, 0xb6, 0x72, 0xda, 0x6e, 0xde, 0x56, - 0xdf, 0xb4, 0x7d, 0xc2, 0x63, 0x2e, 0x05, 0xac, 0x62, 0xf6, 0x3b, 0x01, - 0x8e, 0x64, 0x64, 0x81, 0x70, 0x1a, 0x61, 0xd3, 0x5f, 0xdc, 0xf0, 0x4b, - 0xe8, 0xb5, 0x57, 0xb4, 0xaa, 0x97, 0x08, 0xa2, 0xea, 0x67, 0x5f, 0xc9, - 0x0e, 0x2b, 0x1f, 0x57, 0x75, 0xb6, 0xbd, 0xde, 0xfa, 0x6a, 0xef, 0x64, - 0x71, 0x75, 0x8d, 0x41, 0x7b, 0x26, 0x74, 0x4a, 0x4d, 0x3d, 0x5f, 0xbe, - 0x0b, 0x27, 0x3a, 0x3c, 0xa2, 0x1f, 0x2a, 0x68, 0x52, 0x09, 0xf4, 0x8f, - 0x44, 0x6a, 0x3d, 0x91, 0x70, 0x1c, 0x43, 0x76, 0x76, 0x0c, 0xf5, 0xe2, - 0xe1, 0x31, 0xa1, 0x7d, 0xd6, 0x8a, 0xfa, 0x4f, 0xbc, 0xd3, 0xcd, 0x0c, - 0xa4, 0x3d, 0x83, 0xaa, 0xb5, 0xee, 0x23, 0xa8, 0xa9, 0x8d, 0xce, 0x92, - 0x1a, 0xac, 0x86, 0x22, 0x9e, 0x4e, 0x8b, 0xa0, 0x84, 0xcd, 0xf5, 0xb0, - 0xec, 0x2c, 0x25, 0xbc, 0x26, 0xb6, 0x35, 0x44, 0x2d, 0x32, 0x7a, 0x69, - 0xa5, 0x70, 0x15, 0x11, 0x43, 0x4e, 0xd4, 0x4e, 0xe0, 0x81, 0x21, 0x33, - 0xa9, 0xc2, 0x42, 0xc4, 0x66, 0xe9, 0xf4, 0xce, 0xb1, 0xc3, 0x10, 0x85, - 0x2f, 0xcf, 0xd1, 0x34, 0x48, 0x03, 0x78, 0xf2, 0xdf, 0xde, 0x37, 0x22, - 0x0b, 0x65, 0x9a, 0xb5, 0x54, 0xe7, 0x03, 0x2c, 0x2d, 0x80, 0x11, 0x98, - 0x18, 0xf7, 0x85, 0x4a, 0xde, 0x17, 0xfd, 0xec, 0x3f, 0x71, 0x79, 0xfe, - 0x35, 0x82, 0x66, 0x4c, 0x94, 0xcd, 0x23, 0x21, 0x81, 0x61, 0x33, 0x44, - 0x34, 0xdd, 0x2a, 0x82, 0x6c, 0x8f, 0xfa, 0x5f, 0x61, 0x9e, 0x18, 0x80, - 0x49, 0xce, 0x09, 0xd0, 0xf6, 0x2d, 0xf0, 0x8a, 0xcf, 0x07, 0xc8, 0x45, - 0x30, 0xa8, 0x61, 0x0f, 0x65, 0x72, 0x32, 0x2a, 0x13, 0x00, 0x55, 0x73, - 0x81, 0xc5, 0x3b, 0x5a, 0x20, 0x1f, 0xe0, 0x39, 0x26, 0xb1, 0xb5, 0x2f, - 0xa7, 0x96, 0x82, 0x60, 0x6b, 0xed, 0xda, 0x99, 0x25, 0xdb, 0x37, 0x92, - 0x63, 0xba, 0x71, 0x69, 0x3e, 0x3e, 0xc0, 0x15, 0xf4, 0x56, 0xb9, 0xcc, - 0x15, 0xf1, 0x1d, 0x5a, 0x6e, 0xda, 0xde, 0x69, 0xf3, 0x6f, 0x60, 0x5a, - 0xd6, 0xa3, 0x29, 0x1d, 0x6c, 0x00, 0x56, 0x28, 0x2a, 0x8e, 0xac, 0x47, - 0x1e, 0xd1, 0x1a, 0xef, 0x4a, 0xb1, 0x23, 0x2f, 0x97, 0x87, 0x1a, 0xe0, - 0x9c, 0x8a, 0x05, 0xad, 0xfc, 0xd7, 0x5f, 0xc5, 0xc4, 0xe8, 0xe3, 0xf5, - 0x9f, 0x77, 0x1e, 0x98, 0x9f, 0x22, 0x40, 0x29, 0x96, 0xb3, 0x04, 0xc0, - 0x33, 0x18, 0x5a, 0x6f, 0xae, 0xd7, 0xeb, 0xca, 0x05, 0x49, 0xa9, 0xc6, - 0x5e, 0xe8, 0x11, 0x6e, 0x09, 0x14, 0xc4, 0xd0, 0x67, 0x21, 0x7d, 0x88, - 0xcd, 0xd9, 0x8b, 0x7a, 0x09, 0xa1, 0x6e, 0x49, 0x9d, 0x79, 0xa1, 0xe0, - 0x61, 0xbe, 0xfd, 0x83, 0x90, 0xec, 0x49, 0x9e, 0x86, 0xb8, 0xa1, 0xfe, - 0x23, 0x3c, 0x52, 0x6b, 0x58, 0xfc, 0xcb, 0x34, 0x47, 0xbe, 0x23, 0x3f, - 0x47, 0xb6, 0x59, 0x98, 0x96, 0x7f, 0x26, 0x4b, 0x1d, 0x93, 0x9e, 0x59, - 0x9e, 0x3f, 0x9f, 0x1d, 0x7a, 0xf2, 0x6c, 0xd3, 0xdf, 0x75, 0xb6, 0xc9, - 0xee, 0x8a, 0x70, 0x71, 0x7e, 0x51, 0xb4, 0xc3, 0x2a, 0xf0, 0x7b, 0x2b, - 0xcb, 0x5f, 0x80, 0xdd, 0xce, 0x98, 0x3b, 0x6b, 0x09, 0x08, 0xd6, 0x89, - 0x9a, 0x85, 0xac, 0xa1, 0x58, 0xe2, 0xad, 0x19, 0x33, 0x44, 0xab, 0xf1, - 0x41, 0xb0, 0x51, 0x90, 0x49, 0x36, 0x6e, 0x7f, 0xe3, 0x94, 0x7d, 0xcc, - 0x94, 0x08, 0x8d, 0x6e, 0xde, 0x4e, 0x67, 0x70, 0x66, 0xfd, 0x93, 0x4c, - 0xc7, 0xd7, 0x20, 0xcd, 0x95, 0x20, 0x11, 0xb4, 0x36, 0xdd, 0x26, 0x5b, - 0xaf, 0xa3, 0xb2, 0x72, 0xb2, 0x9e, 0xd0, 0xb4, 0xb5, 0x63, 0x5a, 0x0c, - 0xf8, 0x71, 0xd6, 0x2a, 0x55, 0xea, 0xc5, 0x39, 0xf8, 0xcb, 0xe2, 0xe1, - 0x8a, 0x0f, 0x24, 0xe1, 0x83, 0xd1, 0xee, 0xcd, 0x80, 0xa4, 0x52, 0xb0, - 0xc7, 0x66, 0x53, 0x47, 0xb6, 0xd4, 0x79, 0x07, 0x11, 0xa6, 0x33, 0x3f, - 0x8b, 0xc6, 0x91, 0xdd, 0x01, 0x1d, 0x71, 0x32, 0xed, 0xf3, 0xa7, 0xa4, - 0x4d, 0xcf, 0xa7, 0x6d, 0x2a, 0xde, 0x7b, 0x2c, 0x8d, 0x89, 0x8c, 0xd7, - 0x14, 0x0d, 0x3d, 0x9d, 0x67, 0x62, 0x3f, 0x6b, 0xd8, 0xa2, 0x3d, 0xb3, - 0x7a, 0xab, 0x0c, 0x7a, 0xb0, 0x7f, 0x5b, 0x35, 0x39, 0xf3, 0xbe, 0x46, - 0x84, 0xd8, 0x5b, 0x44, 0x7b, 0x3a, 0xcc, 0x0c, 0xcc, 0x60, 0xb9, 0x7b, - 0x23, 0x1e, 0x0c, 0x73, 0xe2, 0x07, 0x79, 0xd0, 0xfd, 0x9d, 0x66, 0xf6, - 0xe5, 0xfe, 0x3f, 0x75, 0x4f, 0x03, 0x2c, 0xcd, 0x6c, 0xbe, 0xf3, 0x59, - 0xbf, 0xf2, 0x35, 0xfa, 0xfa, 0xd6, 0xeb, 0x50, 0x7c, 0x26, 0x71, 0xb4, - 0xe3, 0xb7, 0xc0, 0x23, 0xba, 0x49, 0x00, 0x7a, 0xf4, 0x41, 0xfa, 0xb6, - 0xb6, 0x44, 0x52, 0xfb, 0x20, 0x0c, 0x38, 0xe3, 0xa9, 0xb0, 0x32, 0x98, - 0xc0, 0x78, 0xaa, 0xc1, 0xba, 0xa8, 0x75, 0xcd, 0xf2, 0x3d, 0xc6, 0xd8, - 0xd6, 0x3d, 0x1f, 0xe1, 0x23, 0x2e, 0x32, 0x35, 0x05, 0xbd, 0x99, 0x21, - 0xaf, 0x88, 0xd0, 0xe2, 0xba, 0x85, 0x32, 0x25, 0x4b, 0xf3, 0x6d, 0x4b, - 0x84, 0xb5, 0xe6, 0x69, 0x20, 0x33, 0x35, 0xcb, 0xe8, 0xa7, 0x97, 0x17, - 0xac, 0xc5, 0xd1, 0xb0, 0xed, 0xd9, 0x37, 0xec, 0x9a, 0x46, 0xdd, 0x33, - 0x92, 0x6f, 0xc8, 0xd9, 0xc7, 0x64, 0x8a, 0xb5, 0x38, 0x77, 0x10, 0x0d, - 0xfe, 0xfb, 0x83, 0x86, 0xab, 0x3b, 0xd2, 0x9e, 0x4b, 0xed, 0x7c, 0x03, - 0x0c, 0xf0, 0x5f, 0xa9, 0xa7, 0x20, 0x88, 0xc5, 0x42, 0x00, 0xb4, 0x81, - 0x6a, 0x01, 0x7f, 0x75, 0x60, 0x79, 0xd9, 0x2e, 0x7b, 0xb3, 0x86, 0xf3, - 0xd6, 0x89, 0x4b, 0x60, 0x7c, 0x84, 0xf0, 0x76, 0x97, 0x8d, 0x78, 0x76, - 0x18, 0xae, 0xda, 0x7d, 0x80, 0xc3, 0x83, 0x53, 0x7d, 0x5b, 0x70, 0x02, - 0xc6, 0xeb, 0x9e, 0x6b, 0x51, 0xf7, 0x7b, 0xc0, 0x49, 0xb5, 0xa3, 0xf8, - 0xad, 0xcf, 0x44, 0x7e, 0x9f, 0x80, 0x41, 0xb6, 0x6c, 0xb4, 0x4c, 0x58, - 0x22, 0x7f, 0xf7, 0x23, 0x15, 0xaa, 0x34, 0x8c, 0xbc, 0x69, 0x55, 0xae, - 0x8e, 0xf5, 0xf6, 0xb7, 0x6c, 0x33, 0x64, 0xba, 0xce, 0x7d, 0xb0, 0xf0, - 0x1d, 0x0b, 0x65, 0xb8, 0xfc, 0xe5, 0x00, 0xb8, 0x4b, 0x0e, 0x39, 0x48, - 0xdd, 0x7b, 0xc8, 0xfd, 0x89, 0xed, 0x8e, 0x5b, 0xa7, 0x58, 0x8a, 0x52, - 0x2d, 0x55, 0xc2, 0x61, 0xc1, 0xf9, 0x95, 0xb2, 0x07, 0xff, 0x0b, 0x6a, - 0x56, 0x65, 0x58, 0x70, 0x59, 0xde, 0x53, 0x3a, 0xeb, 0x1e, 0xb8, 0xda, - 0x09, 0x48, 0x4d, 0x5f, 0xba, 0x85, 0x43, 0x01, 0xf1, 0x2e, 0x0f, 0x17, - 0x0c, 0xbc, 0x36, 0x31, 0x73, 0xc4, 0x29, 0xbc, 0xff, 0x1a, 0xf2, 0x88, - 0x67, 0x5d, 0x32, 0x68, 0x4f, 0xcd, 0xfe, 0xb7, 0x65, 0xef, 0xb6, 0xf6, - 0xf6, 0xe6, 0x11, 0x3e, 0x9f, 0x40, 0x46, 0x7a, 0xb0, 0xa7, 0xb4, 0x6e, - 0x52, 0x1b, 0x86, 0x17, 0x1a, 0x49, 0x19, 0xf4, 0x6f, 0xa4, 0x2a, 0x0c, - 0x0d, 0xb0, 0xcf, 0x95, 0x46, 0x30, 0x38, 0x43, 0x2c, 0x29, 0x33, 0xb3, - 0x46, 0xd4, 0xe8, 0x78, 0x12, 0x0c, 0xc0, 0x89, 0x8d, 0x25, 0x04, 0xd9, - 0x5b, 0xef, 0xcf, 0x0f, 0xe1, 0x5e, 0x94, 0x74, 0x68, 0x7c, 0xda, 0x7e, - 0x6a, 0x75, 0x34, 0x27, 0x66, 0xed, 0xab, 0x9f, 0x81, 0xad, 0xa7, 0x03, - 0xcf, 0x36, 0x88, 0x9d, 0xe9, 0xe5, 0x56, 0xaf, 0x47, 0x83, 0x5c, 0xd0, - 0xb8, 0x45, 0xcc, 0x77, 0x20, 0xdb, 0x81, 0x91, 0x67, 0x8c, 0x3d, 0x1e, - 0x36, 0xd3, 0x01, 0x26, 0xdc, 0x03, 0x0d, 0xca, 0xbb, 0x2f, 0xc7, 0x1a, - 0x08, 0xa4, 0x1f, 0x8f, 0xee, 0xf7, 0xbe, 0x23, 0x0b, 0xaa, 0xb9, 0xe8, - 0x2e, 0x3f, 0xaf, 0x39, 0x94, 0x87, 0x22, 0xde, 0x6f, 0x79, 0xf4, 0x1f, - 0x3c, 0xe0, 0xbc, 0xa1, 0xdc, 0x20, 0x01, 0xfe, 0x72, 0x3e, 0x63, 0x0d, - 0xb2, 0x70, 0xda, 0x2f, 0x11, 0x46, 0x4a, 0x80, 0x67, 0x63, 0x10, 0x46, - 0xa6, 0xd4, 0xda, 0xec, 0x2a, 0xfe, 0x09, 0x13, 0x06, 0x95, 0x3d, 0x2b, - 0x6f, 0x3d, 0xa5, 0x56, 0x00, 0x3d, 0x27, 0x30, 0x5f, 0x90, 0xe1, 0xac, - 0xb8, 0x02, 0xc1, 0x62, 0x27, 0x7b, 0xfa, 0xcd, 0x3c, 0x12, 0x0e, 0xc3, - 0x85, 0x48, 0xb8, 0x5f, 0xac, 0x97, 0xfe, 0xbb, 0x23, 0x19, 0xd7, 0xe0, - 0x10, 0x3f, 0xad, 0xb5, 0x5d, 0x6a, 0x6f, 0x0f, 0x37, 0x74, 0x32, 0x30, - 0x4b, 0x36, 0xa3, 0x63, 0x44, 0xb0, 0x50, 0xc8, 0xc3, 0x95, 0xd0, 0x94, - 0x14, 0xdc, 0xd9, 0x85, 0x46, 0x3a, 0x41, 0x8b, 0x94, 0x12, 0x2e, 0x88, - 0x31, 0xe2, 0xfe, 0xbd, 0x1e, 0xd5, 0x17, 0xee, 0x4d, 0x12, 0x68, 0xb4, - 0x6b, 0xe4, 0x01, 0x20, 0xab, 0x7d, 0x77, 0x24, 0x31, 0x86, 0xe9, 0x9f, - 0xc4, 0x73, 0x09, 0xd4, 0x39, 0x89, 0x72, 0xbc, 0xd3, 0x69, 0x3d, 0xec, - 0x4d, 0x07, 0x3f, 0x80, 0x6a, 0x75, 0x08, 0xa9, 0x28, 0x95, 0xcf, 0xab, - 0xdf, 0x1e, 0x61, 0x77, 0x5b, 0x2d, 0x27, 0x62, 0xc6, 0xa8, 0x79, 0x9e, - 0xe3, 0x6f, 0x4d, 0x8d, 0x3d, 0x37, 0x84, 0x91, 0x19, 0x84, 0x04, 0xf4, - 0xf4, 0xc9, 0xf0, 0xf3, 0xbc, 0x4c, 0x94, 0x1c, 0x12, 0xad, 0x32, 0xc3, - 0xa3, 0x05, 0x26, 0x7a, 0xea, 0x66, 0x8d, 0x6f, 0x31, 0x8b, 0x03, 0x73, - 0x64, 0x2a, 0x69, 0x0d, 0x29, 0x97, 0x5a, 0xad, 0x36, 0xcf, 0xfc, 0xfc, - 0x6e, 0x09, 0xc2, 0x37, 0x85, 0x35, 0xea, 0x6a, 0x10, 0x49, 0x97, 0x84, - 0x23, 0xe5, 0x08, 0x59, 0x73, 0xd1, 0x6c, 0x15, 0x3a, 0x4a, 0xc8, 0xbf, - 0xfc, 0x79, 0x43, 0x07, 0x62, 0xf6, 0x75, 0x0c, 0xbd, 0x5f, 0x3c, 0x31, - 0x98, 0x20, 0x3d, 0x90, 0x3c, 0x7e, 0x23, 0xfe, 0x4b, 0xc7, 0x6d, 0xce, - 0x3c, 0x3f, 0x4b, 0x1f, 0xbe, 0x1d, 0xbb, 0x85, 0xab, 0xcb, 0xdb, 0x9e, - 0xa5, 0x7a, 0x8c, 0x61, 0xf2, 0x7b, 0xa5, 0xd1, 0x7e, 0x86, 0xd4, 0xa9, - 0x57, 0xbf, 0x58, 0xdb, 0x7e, 0x56, 0x3b, 0x4a, 0xf7, 0x7f, 0x0c, 0x21, - 0x31, 0x2a, 0xfa, 0xca, 0x0a, 0x98, 0xb4, 0xde, 0x52, 0xfc, 0x02, 0x6a, - 0x26, 0xfd, 0xb5, 0x75, 0x61, 0x79, 0xd8, 0xde, 0x45, 0xf7, 0xde, 0xcd, - 0x54, 0xd6, 0x66, 0xe8, 0x27, 0xcd, 0xd6, 0xcf, 0xa7, 0x80, 0x63, 0x04, - 0x5a, 0x25, 0x6c, 0x4d, 0x69, 0x2c, 0x32, 0xea, 0x0c, 0x34, 0x47, 0xc4, - 0xa6, 0x03, 0x35, 0x6f, 0xa4, 0x91, 0x00, 0xc1, 0xe4, 0xfb, 0x0c, 0x38, - 0xf6, 0x1f, 0x86, 0x00, 0xa8, 0x16, 0x24, 0xa9, 0xb4, 0xe9, 0x2c, 0xd3, - 0x2e, 0x83, 0x11, 0xbc, 0xcb, 0xcf, 0x33, 0x44, 0x02, 0xee, 0xc8, 0x2d, - 0x38, 0x63, 0x23, 0xe6, 0x41, 0x9c, 0xfc, 0xa3, 0xbd, 0xba, 0x86, 0x4b, - 0x80, 0x97, 0xdf, 0x9a, 0xf9, 0xef, 0x62, 0x53, 0x36, 0x68, 0x44, 0x4b, - 0x40, 0x9b, 0x1d, 0xfe, 0x84, 0xa8, 0x45, 0xde, 0x3a, 0x6c, 0xda, 0x74, - 0x53, 0x17, 0x9b, 0x72, 0x34, 0x3a, 0xf2, 0xcd, 0x29, 0x55, 0x3f, 0x39, - 0x03, 0xc1, 0x6b, 0x2d, 0xf0, 0x00, 0xfe, 0xbf, 0x4a, 0xe1, 0x9a, 0xf1, - 0x7a, 0x60, 0x5e, 0x9c, 0xfd, 0xdf, 0x7d, 0x9c, 0x75, 0x57, 0x6f, 0x2e, - 0x50, 0x98, 0xe0, 0x5a, 0xe8, 0xf6, 0xf6, 0xfc, 0x13, 0x11, 0xdd, 0x61, - 0xa9, 0x45, 0x02, 0x1f, 0xc1, 0xd3, 0x22, 0xdc, 0xbb, 0x0e, 0x0b, 0x80, - 0x35, 0xa6, 0xdc, 0xfe, 0x2a, 0x27, 0x1d, 0x70, 0xec, 0x29, 0x89, 0x8b, - 0x8a, 0xe8, 0xaf, 0xa6, 0x4b, 0x70, 0xa5, 0x1e, 0x5b, 0xbf, 0xfc, 0xf7, - 0x63, 0x57, 0x18, 0x47, 0x41, 0xd8, 0xe2, 0x16, 0x58, 0xb2, 0x9c, 0xa0, - 0x21, 0x4e, 0xd9, 0xb7, 0x23, 0x3a, 0x0a, 0x86, 0x51, 0x45, 0x59, 0x12, - 0xfb, 0xef, 0xf8, 0x93, 0xd3, 0x92, 0xdc, 0x24, 0xd0, 0xf3, 0x3b, 0xb6, - 0xab, 0xd0, 0x8a, 0xd7, 0x48, 0x46, 0xb3, 0x0c, 0x4c, 0xf3, 0x23, 0x6c, - 0x4b, 0x33, 0x54, 0x2e, 0x31, 0x0e, 0x19, 0xbb, 0x8d, 0x5d, 0x26, 0xe9, - 0xb4, 0x82, 0x96, 0xae, 0xd3, 0xb3, 0x0e, 0xb5, 0x5d, 0xb3, 0x7d, 0x39, - 0x25, 0xa1, 0x17, 0xe6, 0xf9, 0x4d, 0x4b, 0x76, 0x6f, 0x79, 0x81, 0x9f, - 0xd0, 0x2c, 0x03, 0x8c, 0x09, 0xc9, 0xe7, 0x8a, 0x98, 0x33, 0x83, 0xfc, - 0x60, 0xf7, 0x16, 0x82, 0x5a, 0x3a, 0x84, 0xba, 0xb0, 0xfb, 0x3c, 0xcb, - 0xe0, 0x4e, 0x46, 0x4d, 0xc3, 0x25, 0x63, 0x43, 0x11, 0x3d, 0xa9, 0xf4, - 0x03, 0xf8, 0x99, 0xdf, 0xd8, 0x66, 0xac, 0xbe, 0xf3, 0xd9, 0xbe, 0x99, - 0x4e, 0x5c, 0x11, 0x18, 0x14, 0xe9, 0x1f, 0xa5, 0x82, 0x0b, 0x22, 0x6f, - 0xc4, 0xca, 0x26, 0xe4, 0x86, 0xba, 0x55, 0x06, 0x50, 0xf4, 0x2a, 0xff, - 0xda, 0x1b, 0xba, 0xae, 0xd6, 0xb8, 0x8d, 0xcb, 0x5f, 0x57, 0xc1, 0x84, - 0x23, 0x91, 0x22, 0xec, 0x47, 0x35, 0xe7, 0x65, 0x07, 0x94, 0x6c, 0x4f, - 0xad, 0xa2, 0x0d, 0xfd, 0x57, 0x0b, 0xff, 0x8c, 0xb0, 0x4a, 0x51, 0x9a, - 0xbb, 0x5c, 0x92, 0x5e, 0xcb, 0xb8, 0xca, 0x1e, 0xce, 0x8c, 0xb6, 0xb0, - 0x0b, 0xa2, 0x29, 0x8b, 0xea, 0x4e, 0xf4, 0x3a, 0x35, 0x3c, 0xcb, 0xfa, - 0xde, 0x1d, 0xd5, 0x3b, 0x2f, 0xfd, 0x52, 0x8a, 0x29, 0x86, 0xfe, 0xee, - 0x0a, 0xa0, 0x26, 0x7b, 0x06, 0x10, 0x19, 0xef, 0x02, 0xce, 0x4c, 0xdc, - 0x70, 0x22, 0x3e, 0xab, 0xd9, 0xa8, 0xd2, 0x76, 0x5a, 0x9e, 0x9b, 0x36, - 0x8c, 0xfc, 0xe4, 0xc9, 0xf1, 0x79, 0x6e, 0x97, 0x9f, 0x83, 0x7c, 0x7e, - 0xa9, 0xb4, 0x9e, 0x16, 0xa7, 0x5d, 0x11, 0x47, 0xf1, 0xd3, 0x36, 0x34, - 0x18, 0x93, 0xa4, 0xe8, 0x45, 0x76, 0xc0, 0x03, 0x39, 0x79, 0x3c, 0x1a, - 0x2e, 0x66, 0xc9, 0x05, 0x8c, 0x23, 0x2f, 0xda, 0x16, 0x15, 0xc3, 0xbc, - 0xde, 0xc7, 0x81, 0x47, 0x8b, 0x69, 0x4a, 0xbd, 0x6d, 0xf6, 0x11, 0x96, - 0x8b, 0xee, 0x2e, 0xf2, 0x7a, 0x44, 0x4c, 0x36, 0x8a, 0x3e, 0xd0, 0xf9, - 0x09, 0x39, 0xf3, 0x69, 0x0c, 0x06, 0x35, 0x44, 0x31, 0x37, 0x46, 0x54, - 0x37, 0xd9, 0x44, 0x20, 0x3f, 0xc2, 0x82, 0xf6, 0x23, 0xb6, 0xb1, 0x2f, - 0xba, 0x70, 0x4f, 0x89, 0x96, 0xa3, 0xbf, 0x5e, 0x76, 0x2a, 0x50, 0xbd, - 0xf2, 0x0d, 0x65, 0x65, 0x27, 0x03, 0x2d, 0x1c, 0xb8, 0x85, 0xb4, 0x1d, - 0x99, 0x6d, 0xcf, 0xa3, 0x63, 0x93, 0x43, 0x47, 0x35, 0x00, 0x23, 0xdc, - 0xf4, 0xcb, 0x75, 0x98, 0xc7, 0x2f, 0xa4, 0x59, 0x59, 0xca, 0xf8, 0x96, - 0xa0, 0x32, 0xa2, 0x79, 0x95, 0xf4, 0xe8, 0x0a, 0x40, 0xc3, 0xd8, 0x7f, - 0xa4, 0x99, 0x80, 0x46, 0x71, 0xd2, 0xd7, 0x69, 0xc6, 0x85, 0x5f, 0x6a, - 0x35, 0x69, 0x45, 0xc4, 0xbb, 0x9d, 0xe1, 0x60, 0x2c, 0xf0, 0x8e, 0xb9, - 0xcb, 0x27, 0x51, 0xc0, 0xf1, 0x3c, 0x63, 0xf3, 0x31, 0x2b, 0xd2, 0x53, - 0x5e, 0x77, 0x99, 0x86, 0x13, 0x5f, 0x98, 0xbc, 0x03, 0xde, 0xf6, 0xbf, - 0xa8, 0x22, 0xe3, 0xa1, 0xe7, 0x61, 0x13, 0x6e, 0xda, 0x81, 0x21, 0x2f, - 0xfd, 0xf2, 0x9a, 0x0b, 0xe5, 0xbe, 0xa8, 0x0e, 0xbe, 0x08, 0x8a, 0x1c, - 0xe8, 0x5d, 0x7f, 0xd4, 0xbd, 0x0c, 0x92, 0xb9, 0x8e, 0x0c, 0x0d, 0xe4, - 0x0f, 0x6f, 0xfd, 0xc1, 0xf2, 0x4b, 0x0e, 0x1d, 0x03, 0x6d, 0xbe, 0xa3, - 0xe2, 0x13, 0x34, 0xe7, 0x98, 0x84, 0x77, 0x8c, 0x38, 0x73, 0xb2, 0xd1, - 0x5d, 0xbf, 0x57, 0x9b, 0x86, 0x6a, 0x26, 0x10, 0x4e, 0xfe, 0x49, 0x30, - 0xd0, 0x22, 0xa2, 0xfe, 0xd2, 0x1c, 0x43, 0xae, 0xba, 0x62, 0x3a, 0x61, - 0xc1, 0x83, 0xfb, 0x23, 0x6d, 0x45, 0xf6, 0x68, 0x24, 0xef, 0xba, 0xcc, - 0xa2, 0x4f, 0xff, 0x4f, 0x79, 0x2c, 0x11, 0xa7, 0x5c, 0x4c, 0xb4, 0x69, - 0x83, 0xba, 0xaf, 0x69, 0xab, 0xde, 0x06, 0x04, 0xf4, 0x1c, 0x40, 0xa0, - 0xb9, 0xb9, 0x56, 0x65, 0x86, 0x3d, 0x85, 0x79, 0xc0, 0x15, 0xbb, 0x10, - 0xa9, 0xff, 0xee, 0xff, 0x0c, 0xc0, 0x03, 0x8c, 0xec, 0x24, 0x5a, 0x78, - 0x83, 0x34, 0x8f, 0xa3, 0x45, 0x18, 0x49, 0x98, 0x6b, 0x27, 0xd1, 0xb5, - 0x40, 0x9d, 0x90, 0xc0, 0xa7, 0x02, 0x27, 0xef, 0x5f, 0x1d, 0xe5, 0x9a, - 0x15, 0x66, 0xd0, 0xb5, 0xbe, 0x20, 0xaf, 0x90, 0xb8, 0x58, 0x65, 0xe0, - 0x54, 0x72, 0x54, 0x4c, 0x35, 0x50, 0x56, 0x93, 0x61, 0x18, 0xf8, 0x0b, - 0x51, 0xa7, 0xea, 0x83, 0xaa, 0x60, 0x6c, 0x0a, 0xbe, 0x79, 0xd8, 0x81, - 0x8a, 0x17, 0xd8, 0x9c, 0x56, 0x06, 0x7c, 0x15, 0x44, 0xaa, 0x62, 0x48, - 0x67, 0xe6, 0x5c, 0xa0, 0x09, 0x75, 0xbd, 0xf0, 0x61, 0x15, 0x9f, 0xac, - 0x57, 0xbc, 0xfb, 0xa9, 0xa2, 0x97, 0x84, 0x6d, 0xfa, 0xbc, 0xcc, 0x53, - 0x96, 0x46, 0x01, 0x6d, 0x98, 0x43, 0x83, 0xc2, 0xcf, 0x38, 0x92, 0x99, - 0x3f, 0xdb, 0x93, 0x99, 0xab, 0x56, 0x6c, 0x02, 0x78, 0x04, 0x66, 0x1a, - 0xec, 0x8e, 0xd3, 0x70, 0x48, 0xd0, 0x7c, 0x1f, 0x54, 0x0c, 0x2f, 0x30, - 0xac, 0x75, 0x08, 0x1f, 0x57, 0x6d, 0xe2, 0x20, 0xb2, 0xd0, 0x19, 0xff, - 0xe3, 0x56, 0xc5, 0x6f, 0x1f, 0x9c, 0x29, 0x79, 0x0a, 0x59, 0xe6, 0x81, - 0x5c, 0xe2, 0x98, 0xef, 0xb0, 0xba, 0x93, 0xe6, 0x2f, 0xdc, 0x92, 0x68, - 0x0c, 0xb4, 0xff, 0x7e, 0x71, 0xda, 0xad, 0x10, 0x99, 0x0f, 0x6e, 0xc4, - 0xaa, 0x0e, 0x69, 0x45, 0x4a, 0xf3, 0x5d, 0x5a, 0x34, 0x64, 0x55, 0x8a, - 0x16, 0x1e, 0xdb, 0x3b, 0xdf, 0xa3, 0x3f, 0x5e, 0xbd, 0x47, 0xf6, 0x65, - 0xb0, 0x44, 0x4f, 0xf7, 0xda, 0x29, 0x42, 0x6c, 0x6c, 0x83, 0xc3, 0xb4, - 0x6d, 0x1a, 0x8a, 0x39, 0x6d, 0x28, 0xa9, 0x71, 0xf1, 0x0e, 0x29, 0xb2, - 0xe0, 0x2d, 0x06, 0xcf, 0x6b, 0x60, 0xbb, 0xf8, 0x0b, 0x29, 0x78, 0x43, - 0x3f, 0x29, 0xf6, 0x33, 0xd3, 0xac, 0x3b, 0xd6, 0xce, 0x98, 0x6e, 0x30, - 0x6a, 0x0d, 0x64, 0x4c, 0x96, 0xfc, 0x4c, 0x74, 0x3c, 0xb1, 0xc4, 0xd4, - 0x80, 0x5a, 0x13, 0xc5, 0xb2, 0xbe, 0xc5, 0xe8, 0x19, 0x43, 0x50, 0x3f, - 0x74, 0xd9, 0x1b, 0x89, 0x75, 0x24, 0x4d, 0x5a, 0x9c, 0x1c, 0x0a, 0xae, - 0x29, 0xf2, 0x64, 0x41, 0x7a, 0x6d, 0x71, 0xde, 0x67, 0x2b, 0xc0, 0x60, - 0x48, 0x94, 0x5f, 0x74, 0x85, 0xfd, 0x8f, 0xf6, 0xaa, 0xf9, 0x48, 0x6d, - 0x9d, 0x63, 0x5b, 0xc9, 0x87, 0xb8, 0x4a, 0x6f, 0xaa, 0x3e, 0x34, 0x56, - 0x50, 0xa9, 0x46, 0x14, 0x4b, 0xe7, 0x80, 0x64, 0xd4, 0xf8, 0xaf, 0xd4, - 0x97, 0xd3, 0xe6, 0x3a, 0xa0, 0x3a, 0x3b, 0x88, 0xe5, 0xcc, 0x7a, 0xc7, - 0xb8, 0x38, 0x8a, 0x9f, 0xf8, 0x7f, 0x67, 0xe5, 0xdf, 0x39, 0x08, 0x2a, - 0xe9, 0x82, 0x4f, 0xec, 0x80, 0xb5, 0xce, 0x3d, 0xee, 0x1c, 0xe8, 0x89, - 0xb5, 0x42, 0xb1, 0xfd, 0x03, 0x62, 0xac, 0x6c, 0xfe, 0x19, 0xaa, 0x0f, - 0xe8, 0x07, 0x98, 0x2d, 0x13, 0x27, 0xc2, 0xcc, 0x62, 0xe1, 0x22, 0xda, - 0x1c, 0xde, 0x22, 0x00, 0x2f, 0x1b, 0x41, 0xa7, 0x0d, 0xa9, 0x16, 0x87, - 0x40, 0xa5, 0xb9, 0x4a, 0x87, 0x70, 0x9d, 0x9a, 0x38, 0x1f, 0x65, 0xe7, - 0xcd, 0xa0, 0xa2, 0xea, 0x93, 0x22, 0xcb, 0xd5, 0x57, 0x34, 0xd5, 0xb9, - 0xc6, 0x4a, 0x58, 0xe4, 0xcb, 0x92, 0x35, 0x3c, 0x63, 0x07, 0xf7, 0x6a, - 0x5d, 0x44, 0xef, 0xed, 0x0c, 0xea, 0xa1, 0xa2, 0xbd, 0x88, 0xe0, 0xc6, - 0xff, 0x2f, 0x0d, 0xcf, 0x7c, 0x25, 0xce, 0x31, 0x1b, 0xb7, 0x6b, 0x70, - 0xfa, 0x4e, 0xc7, 0xa3, 0x9b, 0x9e, 0xfb, 0x3f, 0x16, 0x37, 0x8d, 0x3c, - 0x50, 0xce, 0xb3, 0x33, 0x86, 0x4a, 0x41, 0xa8, 0x61, 0x4e, 0x93, 0xb3, - 0xbd, 0xda, 0x0e, 0xf6, 0xee, 0x4f, 0x75, 0x50, 0x8f, 0x87, 0xbb, 0xc7, - 0xd9, 0xf9, 0xe3, 0x2c, 0xd0, 0x04, 0x04, 0xf5, 0x61, 0xdf, 0x09, 0xef, - 0xc0, 0x65, 0x01, 0xc2, 0x5e, 0x6f, 0x93, 0x92, 0x0d, 0xa7, 0xb4, 0xd6, - 0x40, 0xcc, 0x5c, 0x2a, 0x3c, 0x6b, 0xd7, 0xe0, 0xbb, 0xdc, 0x3d, 0x28, - 0x91, 0x34, 0xb0, 0xf6, 0xb2, 0x15, 0x34, 0x13, 0x75, 0x5e, 0xa2, 0x15, - 0x2f, 0x1b, 0x03, 0xf7, 0x4d, 0x39, 0xae, 0x8b, 0xc8, 0x85, 0x48, 0xb3, - 0xa5, 0x1e, 0xf7, 0xf4, 0x25, 0x8e, 0x5c, 0x5e, 0xa7, 0x9d, 0x4a, 0x71, - 0xd6, 0x02, 0xb6, 0x32, 0x36, 0xe9, 0xa6, 0x9e, 0xff, 0xff, 0x66, 0xe1, - 0xee, 0xa4, 0x97, 0x25, 0xe5, 0xad, 0x10, 0xfb, 0x6a, 0xbb, 0xe3, 0x7a, - 0x97, 0xdf, 0xe9, 0x43, 0xfe, 0x5e, 0x2a, 0x7e, 0xf9, 0xf7, 0x1f, 0x47, - 0xdf, 0xe0, 0x9b, 0xc1, 0x71, 0xf5, 0xfc, 0x1e, 0x17, 0x2c, 0x8b, 0x75, - 0x91, 0x93, 0xe5, 0x05, 0xed, 0x60, 0x84, 0xf0, 0x03, 0xb5, 0x3c, 0xfc, - 0x2b, 0x2c, 0x28, 0x83, 0x47, 0x23, 0xaa, 0xd3, 0x37, 0xd5, 0xbe, 0x86, - 0xac, 0x37, 0xe2, 0xf2, 0x5e, 0xb8, 0x42, 0x2b, 0x31, 0xb2, 0xcb, 0x34, - 0x63, 0xce, 0xaf, 0x75, 0x4b, 0xd0, 0x4a, 0x9e, 0x16, 0xd8, 0xd9, 0xa0, - 0xca, 0x07, 0xd7, 0x2e, 0x4a, 0xbe, 0x5f, 0x4a, 0x69, 0xf1, 0x6a, 0x23, - 0x05, 0xe7, 0xab, 0x1c, 0xd6, 0xf0, 0x17, 0x06, 0x84, 0xf7, 0x9b, 0x71, - 0x24, 0xa4, 0x87, 0x3c, 0x89, 0x2f, 0xf0, 0x41, 0xe3, 0x1b, 0x11, 0x02, - 0x02, 0xe3, 0xb3, 0x8c, 0x7f, 0xda, 0xba, 0x57, 0xe0, 0xa7, 0xbc, 0x84, - 0xf9, 0xeb, 0xb7, 0x7c, 0x35, 0x01, 0x4d, 0x88, 0x75, 0x89, 0x3e, 0xc0, - 0xca, 0x06, 0x9e, 0xf9, 0x12, 0x10, 0x31, 0xae, 0xe8, 0xd4, 0x6f, 0xea, - 0x88, 0xec, 0xb3, 0xfd, 0x5b, 0xdc, 0xae, 0xb2, 0x10, 0x9d, 0x03, 0x9d, - 0xbb, 0x9b, 0x6d, 0x3a, 0x30, 0x56, 0xb1, 0xea, 0xd8, 0xf4, 0xb7, 0x48, - 0x36, 0x76, 0x3b, 0x49, 0x02, 0x68, 0xa9, 0x52, 0x0c, 0xed, 0xee, 0x6b, - 0x22, 0x21, 0x0d, 0x76, 0x09, 0x63, 0x41, 0x13, 0x0f, 0x12, 0x02, 0x36, - 0x4f, 0x1d, 0x3d, 0xea, 0x95, 0x45, 0x70, 0x59, 0x8d, 0x58, 0x31, 0x85, - 0x8d, 0x9b, 0xe4, 0xb3, 0xa4, 0xa4, 0x96, 0x26, 0xd8, 0xee, 0xd7, 0xd6, - 0xa7, 0x0d, 0x81, 0xad, 0xd2, 0x33, 0x0b, 0xb8, 0x19, 0x30, 0xbf, 0xa9, - 0x00, 0xe9, 0xc8, 0xb8, 0x0b, 0x66, 0x5b, 0x50, 0x25, 0x05, 0x81, 0x4b, - 0x86, 0x40, 0x07, 0x88, 0x1c, 0x65, 0x8a, 0x14, 0xbd, 0xba, 0xc5, 0xee, - 0x2d, 0xba, 0xf8, 0x67, 0x92, 0x06, 0xe2, 0x42, 0x36, 0x17, 0x8d, 0x89, - 0xc0, 0x06, 0xdf, 0xa1, 0xa5, 0x8a, 0xb7, 0x34, 0xa9, 0x2f, 0x1f, 0x6b, - 0x4a, 0x87, 0xf9, 0xc2, 0xc3, 0x25, 0xf9, 0x9f, 0x1b, 0x0d, 0x81, 0x55, - 0xc1, 0x6d, 0x7e, 0x53, 0x56, 0xce, 0xfc, 0xaf, 0xae, 0xa9, 0x88, 0x05, - 0x8c, 0xcb, 0x36, 0x95, 0x50, 0x12, 0x13, 0x85, 0xba, 0xd6, 0x79, 0xe0, - 0xb7, 0x63, 0x4b, 0x93, 0xa1, 0xcd, 0x88, 0x6c, 0x69, 0xeb, 0x14, 0xcc, - 0xb0, 0x9e, 0x72, 0x92, 0x61, 0xb0, 0xfc, 0x59, 0x4f, 0x63, 0x3f, 0xe3, - 0x73, 0xb9, 0xfd, 0x45, 0x20, 0x04, 0xfe, 0x0f, 0x87, 0xcb, 0x14, 0xed, - 0xc2, 0x2f, 0xbc, 0x51, 0x78, 0xcc, 0x8e, 0x6f, 0x90, 0x89, 0x2d, 0x9a, - 0xdb, 0xde, 0x31, 0xcf, 0x21, 0x8b, 0x72, 0x18, 0x77, 0x30, 0x8a, 0x02, - 0x98, 0x8e, 0x6e, 0x26, 0x4f, 0xdc, 0xcb, 0x13, 0x89, 0x1c, 0xc9, 0x27, - 0x8b, 0x54, 0xff, 0xba, 0x4c, 0x01, 0x2d, 0xbb, 0x13, 0xe4, 0x3d, 0x83, - 0xde, 0x75, 0x5f, 0xfd, 0xe2, 0xfc, 0x3d, 0x25, 0x3a, 0x77, 0x6d, 0x79, - 0x09, 0xbb, 0x83, 0x9a, 0x20, 0x25, 0xf7, 0x60, 0x0f, 0xbb, 0xb3, 0x1a, - 0xbd, 0x25, 0x21, 0xd6, 0xfb, 0x56, 0xfc, 0xaf, 0x12, 0x95, 0x00, 0xc8, - 0xf6, 0xcc, 0x09, 0xed, 0xee, 0xff, 0x78, 0x23, 0xf5, 0x74, 0x11, 0xc3, - 0x5e, 0xf8, 0xee, 0x3e, 0x5f, 0x8b, 0xcd, 0x5a, 0x0c, 0xd1, 0xd1, 0x86, - 0xae, 0x4a, 0x70, 0x4a, 0xeb, 0x36, 0x37, 0x61, 0x95, 0xfe, 0x9c, 0x95, - 0x4b, 0xfa, 0xfd, 0x13, 0xfd, 0x08, 0x8f, 0x54, 0x67, 0x83, 0xfe, 0x3c, - 0xe4, 0xd7, 0xa5, 0x04, 0x5e, 0xbd, 0xc4, 0x82, 0x4e, 0xa6, 0xd4, 0x52, - 0xfe, 0xb0, 0xe8, 0x1e, 0xb6, 0x87, 0x94, 0x48, 0x09, 0x8c, 0x91, 0x34, - 0x56, 0x65, 0x3a, 0x7d, 0xed, 0x11, 0x93, 0x48, 0xb0, 0xd7, 0xdc, 0x5e, - 0xca, 0xca, 0x83, 0xc1, 0x1a, 0x7e, 0x4c, 0xb2, 0xcb, 0xef, 0x83, 0x10, - 0xe7, 0x1f, 0xac, 0x27, 0xc5, 0xb9, 0xe9, 0x36, 0xec, 0xf5, 0x51, 0xe3, - 0xf6, 0x3a, 0xfd, 0x84, 0xb0, 0x48, 0x48, 0xf2, 0x31, 0x81, 0xa8, 0x24, - 0xb0, 0x01, 0xca, 0xa7, 0xd5, 0x1f, 0x79, 0x08, 0xa1, 0x75, 0x48, 0x99, - 0x50, 0x56, 0xf9, 0xca, 0x26, 0xb3, 0x1c, 0x50, 0x48, 0x2b, 0xeb, 0x91, - 0x5f, 0x78, 0xe9, 0x21, 0x79, 0x88, 0x99, 0xb5, 0x36, 0xfe, 0x00, 0x30, - 0x51, 0x1b, 0xde, 0x7c, 0x95, 0x45, 0x40, 0x18, 0x28, 0x15, 0xaa, 0xe4, - 0x07, 0x70, 0x4b, 0xd4, 0xcd, 0xcb, 0xda, 0x33, 0xda, 0xa6, 0xb7, 0xf7, - 0xb1, 0x4c, 0xc7, 0x91, 0x4f, 0x34, 0x83, 0xd0, 0xe1, 0x6b, 0x19, 0x3b, - 0x48, 0x26, 0xe8, 0xf6, 0x40, 0xb5, 0x62, 0xfb, 0x13, 0x3d, 0x46, 0x38, - 0xca, 0x61, 0x42, 0xd4, 0xb9, 0x21, 0xb0, 0x40, 0x56, 0x97, 0x0f, 0xe4, - 0xcb, 0x4f, 0x24, 0x4c, 0x9a, 0x76, 0xc5, 0xd3, 0x3d, 0x4b, 0xb0, 0xaa, - 0x0d, 0x6b, 0x8e, 0xe3, 0xa1, 0x1f, 0xf3, 0x87, 0xd1, 0xed, 0xae, 0x6d, - 0x8e, 0xcc, 0x21, 0x0a, 0xf3, 0x13, 0xa6, 0xf5, 0x64, 0x42, 0x19, 0xd6, - 0xa6, 0xdb, 0xa7, 0xc5, 0xd5, 0xdc, 0xd6, 0x9e, 0xf2, 0xf1, 0xec, 0x8a, - 0x97, 0xdc, 0x73, 0xd5, 0x3d, 0x48, 0x94, 0x7b, 0x70, 0x8b, 0x58, 0xcf, - 0x10, 0xb7, 0x63, 0xf6, 0x2a, 0xee, 0x22, 0xf4, 0x4d, 0x0b, 0x07, 0x90, - 0xda, 0xf8, 0xb2, 0x93, 0xff, 0x67, 0xb9, 0xbd, 0xf5, 0xf9, 0xe9, 0x51, - 0x2f, 0xbf, 0xf5, 0xf1, 0x2d, 0x2b, 0x66, 0x4b, 0x34, 0x53, 0x9b, 0xb3, - 0x6e, 0xbe, 0x4c, 0x52, 0xda, 0x87, 0x69, 0xd2, 0x3b, 0x6f, 0xe0, 0x4b, - 0x06, 0xf0, 0xb2, 0x3e, 0x28, 0x9d, 0x20, 0x9d, 0x5a, 0x9a, 0xb2, 0x17, - 0x42, 0xcf, 0x67, 0x12, 0x77, 0x1b, 0x63, 0xdc, 0x25, 0xcb, 0xa9, 0x67, - 0xc5, 0x94, 0xbe, 0x01, 0x85, 0x8c, 0xc3, 0x74, 0xb9, 0x31, 0xbb, 0x8e, - 0x0f, 0x42, 0x60, 0xe2, 0x7f, 0xb4, 0x05, 0x17, 0xa3, 0x2a, 0xfb, 0xc6, - 0xc1, 0xd4, 0xc2, 0x63, 0x15, 0x71, 0x7b, 0x8b, 0x91, 0x72, 0x5e, 0xee, - 0xa7, 0x41, 0x58, 0x91, 0x0a, 0x09, 0xd2, 0x1b, 0x59, 0xf7, 0x3d, 0x16, - 0x09, 0x53, 0x40, 0x35, 0xe9, 0x50, 0x0b, 0x77, 0xac, 0xa8, 0x57, 0x45, - 0x58, 0x76, 0xf8, 0x06, 0x6c, 0x5c, 0xa4, 0x3e, 0x82, 0xdb, 0xf7, 0x81, - 0x20, 0x1a, 0xd0, 0x23, 0xa1, 0x1e, 0x3d, 0x66, 0xfe, 0xe5, 0xbb, 0xee, - 0xdb, 0x16, 0x74, 0x9a, 0xc4, 0xba, 0xc5, 0x60, 0xd4, 0x28, 0xde, 0x03, - 0xa9, 0x93, 0x94, 0x95, 0xb4, 0xcc, 0x9a, 0x11, 0x4d, 0x88, 0xf1, 0x96, - 0xce, 0x31, 0xef, 0xe6, 0xc4, 0x54, 0xa4, 0xcc, 0x43, 0x6b, 0x6b, 0x6b, - 0xc7, 0x4c, 0x75, 0x12, 0xa5, 0xb6, 0x8f, 0x38, 0xde, 0x12, 0x72, 0xf9, - 0xab, 0x70, 0x38, 0x93, 0x06, 0x68, 0xda, 0x2f, 0xed, 0x28, 0xd6, 0x2d, - 0xaf, 0x19, 0xd0, 0xbe, 0x9f, 0x8d, 0xae, 0xb7, 0x19, 0x14, 0x24, 0xbb, - 0xf8, 0x0c, 0xa1, 0x5e, 0xe5, 0x55, 0x40, 0x92, 0x2f, 0x18, 0x34, 0x54, - 0x2f, 0x89, 0x6f, 0x4f, 0x47, 0x88, 0x3e, 0x61, 0x48, 0xe4, 0x1f, 0x34, - 0xf5, 0x85, 0x8a, 0x2e, 0xfe, 0xb8, 0x14, 0xe5, 0x10, 0x82, 0x64, 0x66, - 0xd4, 0x9b, 0x21, 0x8a, 0x16, 0x27, 0xbb, 0x92, 0xda, 0xd9, 0x13, 0x8f, - 0xd0, 0xe6, 0x35, 0xe2, 0xba, 0xf6, 0xb2, 0xe0, 0x49, 0x2d, 0x50, 0x9f, - 0x8a, 0xf1, 0xbd, 0x14, 0x25, 0xdf, 0xcf, 0x7e, 0x4d, 0x31, 0x4e, 0x4f, - 0x84, 0x12, 0xce, 0x2d, 0x2c, 0x3b, 0xde, 0x79, 0x34, 0x70, 0x28, 0xee, - 0xf4, 0x59, 0x08, 0x9b, 0xc9, 0x06, 0xc7, 0x92, 0xb3, 0xb5, 0x70, 0x0c, - 0xc8, 0x4f, 0x73, 0xa6, 0x07, 0x18, 0x58, 0xdb, 0x16, 0xd8, 0x56, 0xb8, - 0x42, 0x85, 0x02, 0xbd, 0xf9, 0x6a, 0x60, 0x21, 0x25, 0xd0, 0x4a, 0x75, - 0x44, 0x56, 0x25, 0x94, 0x76, 0x39, 0x6f, 0xf5, 0xc9, 0xf0, 0xe4, 0x0f, - 0xe8, 0xeb, 0xfd, 0xc8, 0xc8, 0x7c, 0x9d, 0x54, 0x25, 0x51, 0x98, 0xb3, - 0x17, 0x74, 0x24, 0x7a, 0x99, 0xf1, 0x68, 0xc5, 0x57, 0x22, 0xca, 0x94, - 0x5f, 0x99, 0x7b, 0x60, 0x74, 0x86, 0xc2, 0x4a, 0x76, 0xbb, 0x03, 0x87, - 0x57, 0x83, 0x6b, 0x0b, 0x72, 0xec, 0x3f, 0x75, 0xc6, 0x2d, 0xc6, 0x1f, - 0xbe, 0x12, 0x48, 0xb9, 0xea, 0xa7, 0x5e, 0x0c, 0x7d, 0xc6, 0xa5, 0x22, - 0x16, 0xa7, 0x80, 0xa1, 0xcd, 0x7c, 0x09, 0xcf, 0x84, 0x8b, 0xd2, 0x70, - 0x56, 0xc1, 0x7c, 0x59, 0xc9, 0x05, 0x36, 0x57, 0xb9, 0x02, 0x46, 0xfe, - 0xbb, 0xb2, 0xe9, 0x19, 0x09, 0x7a, 0xf8, 0xb5, 0x97, 0x4d, 0x10, 0xd0, - 0x5a, 0x5d, 0x37, 0x69, 0xc4, 0x91, 0x7b, 0xd3, 0xe2, 0xdb, 0x1c, 0x7f, - 0xc9, 0x5d, 0xb2, 0x48, 0x97, 0x34, 0x66, 0x37, 0xaa, 0xdc, 0xbf, 0xce, - 0xe1, 0x37, 0xbf, 0x09, 0x4a, 0xb9, 0x1f, 0x06, 0x38, 0x64, 0x69, 0x67, - 0x6c, 0x87, 0xb4, 0x2c, 0x5c, 0x95, 0x04, 0xaf, 0xbb, 0x11, 0x25, 0x7d, - 0x46, 0x91, 0xfc, 0x8b, 0x34, 0x99, 0xae, 0xd2, 0x94, 0x03, 0x7a, 0x81, - 0x92, 0x7c, 0xbe, 0x36, 0x75, 0xa7, 0xc9, 0xe0, 0x54, 0xfe, 0xab, 0x12, - 0x28, 0x26, 0xa3, 0xb8, 0xc6, 0xee, 0xa8, 0xfa, 0x97, 0x0a, 0x35, 0x18, - 0xb9, 0xfd, 0x5b, 0x01, 0xa8, 0x67, 0xc0, 0x5b, 0x82, 0xec, 0xa0, 0x6f, - 0xfb, 0x48, 0x6f, 0xd3, 0x81, 0x95, 0x29, 0xc1, 0xa5, 0x8a, 0xd4, 0xfb, - 0x90, 0xf7, 0xb2, 0x47, 0x5f, 0x4c, 0x7b, 0x0c, 0x53, 0xbb, 0xdd, 0x75, - 0x8d, 0x6c, 0x6c, 0xb8, 0x57, 0x50, 0x41, 0x38, 0xf7, 0x02, 0x7a, 0x52, - 0x42, 0xed, 0x25, 0x9a, 0xe5, 0x94, 0x13, 0x59, 0xc2, 0x2f, 0xc7, 0xf2, - 0x9c, 0xd9, 0xa8, 0x3a, 0x77, 0x80, 0x95, 0xee, 0x28, 0x62, 0x85, 0xd8, - 0x1b, 0x0a, 0xa5, 0xcd, 0x12, 0xa1, 0xcb, 0xdf, 0x35, 0x89, 0x9c, 0xd0, - 0x0a, 0x5a, 0x68, 0x77, 0xf8, 0x98, 0x3d, 0x21, 0x6a, 0xb3, 0x8b, 0xb0, - 0x77, 0xfb, 0x63, 0xee, 0x10, 0x62, 0x1c, 0xd5, 0x86, 0x3b, 0xb5, 0x4d, - 0xe5, 0xeb, 0x5b, 0x6a, 0x23, 0x65, 0x0f, 0x16, 0x64, 0xba, 0xb7, 0x89, - 0x2f, 0x61, 0x31, 0x0b, 0x59, 0xde, 0xdc, 0x27, 0xf1, 0x2c, 0xd6, 0x16, - 0xd4, 0x94, 0x14, 0x2f, 0xbd, 0x51, 0xa4, 0xc4, 0xbb, 0x60, 0x61, 0xb6, - 0x19, 0x47, 0xe3, 0x19, 0x57, 0x63, 0x00, 0x05, 0xb3, 0xfa, 0xc0, 0x2c, - 0x46, 0x77, 0x95, 0xc5, 0x19, 0xd6, 0xad, 0x92, 0xd5, 0x25, 0x7f, 0xc7, - 0x86, 0xd5, 0xac, 0x57, 0x07, 0xdf, 0x84, 0x20, 0xac, 0x56, 0xa4, 0xb4, - 0xdf, 0x72, 0xc4, 0x86, 0x75, 0xca, 0x4b, 0xfc, 0xfc, 0x7f, 0x1a, 0x14, - 0x27, 0xe1, 0xbe, 0xa0, 0xd1, 0x6c, 0xcc, 0x6e, 0x1b, 0x2c, 0x40, 0xc1, - 0x10, 0xf5, 0x02, 0x84, 0x1e, 0x31, 0x99, 0xd4, 0xcf, 0xbb, 0xe9, 0xa9, - 0xde, 0x20, 0x5f, 0x61, 0x5f, 0x7b, 0xfe, 0x73, 0x2f, 0x12, 0x44, 0x8d, - 0x17, 0x23, 0x06, 0x82, 0xe6, 0x83, 0x15, 0x8d, 0xd2, 0x16, 0x46, 0x44, - 0x26, 0x43, 0x86, 0x80, 0x45, 0x01, 0xf3, 0x13, 0xfe, 0x8f, 0x78, 0x9c, - 0x49, 0x36, 0x81, 0x7a, 0xc0, 0x4e, 0x4a, 0xc2, 0xc7, 0x57, 0xac, 0x10, - 0xf7, 0x29, 0x92, 0xfc, 0x9a, 0xe6, 0x10, 0x8f, 0xed, 0x14, 0x9d, 0xcd, - 0xd7, 0x8f, 0xa2, 0xbb, 0x48, 0x0e, 0x78, 0x50, 0x18, 0x98, 0x04, 0x1d, - 0xeb, 0x52, 0x85, 0x18, 0x4a, 0x73, 0x01, 0x3b, 0x6d, 0xf8, 0x72, 0x7f, - 0xe8, 0x59, 0xf0, 0x8b, 0x0c, 0x42, 0x30, 0xba, 0xf5, 0xa5, 0x79, 0x36, - 0xe3, 0x92, 0x93, 0x86, 0xc9, 0x9c, 0xbe, 0x61, 0x35, 0xa0, 0x5a, 0x7c, - 0x6a, 0xbe, 0x8c, 0x73, 0xb5, 0x7e, 0x52, 0x4c, 0x4c, 0x42, 0x75, 0xd8, - 0x3a, 0x5d, 0x7b, 0x4a, 0x26, 0x03, 0x82, 0xd0, 0xd4, 0x19, 0xaa, 0x2d, - 0xde, 0x81, 0x44, 0xfd, 0xc7, 0x49, 0xfe, 0x23, 0x38, 0x63, 0xe8, 0xf8, - 0x65, 0xb5, 0x40, 0x6e, 0x09, 0xc0, 0xfe, 0x60, 0x9c, 0x7a, 0xcc, 0x01, - 0xb2, 0x31, 0xe6, 0x59, 0x84, 0x7e, 0x8d, 0x33, 0x8f, 0xab, 0xa4, 0x83, - 0x7c, 0x76, 0x90, 0x4e, 0xdf, 0x7b, 0x73, 0x34, 0x46, 0x41, 0x1e, 0x18, - 0xc1, 0xc8, 0xd7, 0xa7, 0xe8, 0x49, 0x23, 0xf7, 0xd4, 0x9c, 0x63, 0xda, - 0x1a, 0xd1, 0x9f, 0x20, 0x4a, 0x75, 0x45, 0x91, 0xd5, 0x4b, 0xf1, 0x41, - 0x6a, 0x7f, 0xc3, 0x16, 0x04, 0x58, 0x21, 0x34, 0x50, 0xc0, 0x92, 0xad, - 0x7b, 0x2e, 0xc9, 0x0e, 0x3a, 0x80, 0xfa, 0x48, 0xe0, 0xb4, 0x9b, 0xdb, - 0x8c, 0x50, 0xcd, 0x9e, 0xe3, 0xa4, 0x00, 0x1a, 0xef, 0xb5, 0xbc, 0x97, - 0xb1, 0x63, 0x5d, 0x2b, 0xcb, 0x78, 0x6f, 0x6b, 0x86, 0x27, 0x75, 0x03, - 0x69, 0xcf, 0xc8, 0xa1, 0xe2, 0xd6, 0x45, 0xa7, 0xf0, 0xf7, 0xb6, 0x75, - 0xeb, 0xcb, 0xa9, 0x6a, 0x87, 0xed, 0x60, 0x20, 0xd7, 0x81, 0xf9, 0xbe, - 0x64, 0xa5, 0xde, 0x14, 0xdd, 0x10, 0x9c, 0xfa, 0xfe, 0xe9, 0xbc, 0xbd, - 0x8e, 0xef, 0x6d, 0x26, 0x1b, 0xe8, 0x60, 0x22, 0x71, 0x88, 0xdb, 0x46, - 0x58, 0xcd, 0x25, 0x6d, 0xd3, 0x99, 0xb2, 0x3e, 0x90, 0x92, 0x1c, 0x01, - 0xd6, 0x58, 0x82, 0x9c, 0xc4, 0x62, 0xbb, 0x47, 0xb7, 0x6d, 0x3a, 0xea, - 0x6b, 0x20, 0xa8, 0x17, 0x92, 0xb0, 0x62, 0xd6, 0x1d, 0x56, 0x2f, 0x4c, - 0xcc, 0x5b, 0x35, 0xf8, 0x56, 0x8c, 0x95, 0x5a, 0x84, 0x32, 0x2e, 0x41, - 0x65, 0x8c, 0x51, 0x14, 0xe8, 0x19, 0xaa, 0x94, 0x08, 0x87, 0x5f, 0x37, - 0x3b, 0x4c, 0x7f, 0x28, 0x1f, 0x95, 0xe9, 0x00, 0x3b, 0x67, 0x66, 0x18, - 0x26, 0xc6, 0x32, 0x89, 0x79, 0xe9, 0xe7, 0x04, 0xec, 0x27, 0xe9, 0x90, - 0x6d, 0x49, 0xc8, 0x1a, 0x48, 0x66, 0x29, 0xe4, 0xa5, 0xc4, 0x18, 0xfd, - 0x8d, 0x51, 0x22, 0xe0, 0x99, 0xd7, 0x97, 0x7d, 0x21, 0xa2, 0xca, 0x6b, - 0x90, 0x37, 0x82, 0x32, 0xd5, 0x87, 0xf5, 0x0c, 0x1f, 0x17, 0x37, 0xd2, - 0x8b, 0x22, 0x77, 0xe2, 0x80, 0x95, 0x6d, 0xf6, 0xb5, 0x2b, 0x1c, 0xfd, - 0x41, 0xdf, 0xf9, 0x7f, 0x3e, 0x26, 0xd1, 0x71, 0x25, 0x81, 0x54, 0x63, - 0x21, 0xa5, 0xa6, 0x45, 0xe2, 0xba, 0xa7, 0x58, 0x46, 0x48, 0x75, 0x28, - 0xf5, 0x48, 0x75, 0xf6, 0xd8, 0x81, 0x21, 0xda, 0x95, 0x4a, 0xc3, 0x7e, - 0x1f, 0xa6, 0x22, 0xb9, 0xdb, 0xe5, 0x5d, 0x1d, 0x09, 0xc5, 0x98, 0x76, - 0x89, 0x49, 0xa3, 0xa8, 0x05, 0xda, 0x2c, 0x9b, 0x01, 0x42, 0xa0, 0x42, - 0xe6, 0x4a, 0x4d, 0x83, 0x3b, 0x65, 0x18, 0x04, 0x44, 0xbf, 0x3f, 0x6b, - 0x72, 0xa8, 0xd1, 0x8e, 0x52, 0xf8, 0x05, 0xca, 0x93, 0xc4, 0x7e, 0x23, - 0xea, 0xe6, 0x65, 0x94, 0x27, 0x03, 0x97, 0x86, 0x7b, 0x70, 0x37, 0x70, - 0x78, 0xae, 0xea, 0xf9, 0x63, 0xd4, 0xc2, 0x4c, 0x38, 0x14, 0x5d, 0x57, - 0x9a, 0x3d, 0x31, 0xe7, 0xce, 0x02, 0x8a, 0x5c, 0x6f, 0xf9, 0xcb, 0xc5, - 0x92, 0x84, 0x4b, 0x84, 0xd0, 0x5c, 0x07, 0xff, 0xf9, 0xfb, 0x9b, 0x03, - 0x0c, 0x41, 0xc0, 0x0f, 0xe5, 0xa3, 0x3d, 0x1b, 0x3c, 0x00, 0x96, 0x35, - 0xca, 0x28, 0xe7, 0xa5, 0x6f, 0x98, 0x56, 0xf1, 0xa6, 0x2d, 0xfe, 0x2a, - 0x8e, 0xf7, 0xb8, 0xed, 0x93, 0x5b, 0x03, 0x39, 0xb9, 0xb1, 0x77, 0x0a, - 0x92, 0x67, 0xdb, 0xee, 0xfc, 0x75, 0xae, 0x75, 0xf8, 0x48, 0x5d, 0xd3, - 0xc8, 0x68, 0x53, 0x79, 0x49, 0xab, 0x44, 0x47, 0xb4, 0xa2, 0x5a, 0x30, - 0x72, 0x4e, 0xf9, 0xfa, 0x4a, 0x78, 0x37, 0x03, 0xa6, 0x3a, 0xfe, 0x44, - 0xeb, 0xae, 0x23, 0x20, 0x91, 0xfc, 0x9b, 0x1e, 0x1e, 0x00, 0xf1, 0x03, - 0x52, 0x7f, 0xc6, 0x51, 0xd3, 0x80, 0xda, 0xc7, 0x62, 0xaa, 0x5b, 0xc3, - 0xdb, 0x21, 0xb6, 0x7c, 0x63, 0xa6, 0xe4, 0x78, 0x32, 0xe4, 0xd9, 0xe9, - 0xdb, 0xa7, 0x0f, 0xa1, 0xd7, 0x50, 0x12, 0x32, 0xd5, 0xa2, 0xf5, 0x9c, - 0x2d, 0x60, 0x97, 0x30, 0xb6, 0x84, 0xfd, 0x5d, 0x91, 0x96, 0x69, 0xa9, - 0xd0, 0x16, 0x55, 0xba, 0x5a, 0xce, 0x1e, 0x1b, 0x9b, 0x82, 0xaf, 0x53, - 0x06, 0x61, 0xdb, 0x43, 0x42, 0x1a, 0x3c, 0xef, 0xda, 0xea, 0x62, 0x0a, - 0xe2, 0x71, 0x7c, 0x5b, 0xe8, 0xce, 0xf8, 0xcb, 0xf3, 0x19, 0x9a, 0x6b, - 0x90, 0xd0, 0x43, 0x4c, 0xd3, 0x0a, 0x9b, 0x64, 0x64, 0x70, 0x52, 0x07, - 0x2a, 0x17, 0xec, 0x20, 0x3f, 0x15, 0x5e, 0xd3, 0xd8, 0x3a, 0x6e, 0x40, - 0x2f, 0xa5, 0x1a, 0xcd, 0x45, 0x1f, 0x4c, 0x48, 0x54, 0x40, 0x60, 0xef, - 0x32, 0xe3, 0x8c, 0xa7, 0xe0, 0x86, 0xe5, 0xf9, 0x25, 0xe0, 0xb6, 0x89, - 0x1d, 0x5c, 0x9a, 0xe0, 0x2d, 0xb7, 0xba, 0x88, 0x99, 0x15, 0x3b, 0x15, - 0xb6, 0x0f, 0x54, 0xb7, 0x1f, 0xdc, 0x89, 0x24, 0xe2, 0xfd, 0x69, 0xef, - 0x50, 0x4b, 0x42, 0xf9, 0x48, 0xf3, 0x02, 0x8d, 0xe0, 0x0d, 0x8e, 0x99, - 0x2c, 0x68, 0xb7, 0x95, 0x57, 0x26, 0x88, 0x61, 0x84, 0x72, 0x22, 0x6f, - 0xc0, 0xd9, 0x17, 0x3a, 0x53, 0x8c, 0xe1, 0x4a, 0x80, 0x75, 0xa8, 0xb2, - 0x25, 0xaa, 0xce, 0x67, 0x3a, 0x0f, 0x40, 0x87, 0xeb, 0x4f, 0xe4, 0x2c, - 0xc5, 0x74, 0xa9, 0xb0, 0x5b, 0x6c, 0x9b, 0xe3, 0x9b, 0x8b, 0x80, 0x30, - 0x7c, 0x96, 0x95, 0xa1, 0xde, 0xef, 0xdd, 0x00, 0x77, 0x2a, 0x3c, 0x61, - 0x8d, 0x6e, 0x74, 0xff, 0x7c, 0x90, 0xe0, 0x1e, 0x6b, 0x4e, 0x79, 0x8e, - 0xbc, 0x8d, 0x2e, 0x8b, 0x43, 0x0f, 0xe6, 0xbd, 0xd5, 0xf0, 0x36, 0x0a, - 0xca, 0xfc, 0x89, 0xf1, 0x59, 0x49, 0x2b, 0x72, 0xcb, 0x57, 0xa1, 0x90, - 0x46, 0x21, 0x2c, 0x05, 0x93, 0xb5, 0xe7, 0x7e, 0x6d, 0xda, 0xd7, 0xdb, - 0x04, 0x9a, 0x33, 0x6d, 0x36, 0xd5, 0xaf, 0x7f, 0xa8, 0x7c, 0xed, 0x06, - 0x6a, 0xe7, 0xd9, 0xbc, 0xf2, 0x07, 0x0b, 0x73, 0xee, 0x87, 0xd7, 0x90, - 0xb0, 0xda, 0xa8, 0xe9, 0xd4, 0x38, 0x2d, 0xb4, 0xb9, 0x33, 0x06, 0xa6, - 0x65, 0xe0, 0xc0, 0x60, 0xd5, 0x66, 0x87, 0x7b, 0x63, 0xc5, 0x08, 0x91, - 0x22, 0x7c, 0xe0, 0x24, 0xb7, 0x3b, 0xc2, 0xb2, 0xc1, 0xb6, 0xa5, 0x50, - 0x40, 0x7a, 0xd0, 0xc4, 0x38, 0x61, 0xc6, 0x73, 0x70, 0x29, 0xe5, 0x53, - 0x7c, 0xf3, 0xbf, 0x29, 0x36, 0xc1, 0xad, 0xa4, 0xf5, 0x13, 0xd8, 0xd3, - 0x54, 0x66, 0xb6, 0xd5, 0xd4, 0x09, 0xed, 0xf8, 0x30, 0x96, 0xfc, 0x2d, - 0x9a, 0x17, 0x98, 0xe3, 0x62, 0x25, 0x25, 0xc9, 0xad, 0x1e, 0x76, 0xc5, - 0x14, 0x8e, 0x38, 0x6c, 0xca, 0x18, 0x96, 0x04, 0x84, 0x9f, 0xa3, 0x2e, - 0xcc, 0x0c, 0x4b, 0x13, 0x7a, 0x1c, 0xe3, 0x7e, 0x43, 0xa2, 0x51, 0x67, - 0x04, 0x09, 0x9b, 0xd1, 0x92, 0x7c, 0x89, 0x25, 0x05, 0xe4, 0x33, 0x18, - 0x59, 0x64, 0xba, 0xdb, 0x9d, 0xc4, 0x63, 0xb5, 0xb5, 0x47, 0xdf, 0xde, - 0x6e, 0x33, 0xae, 0x14, 0x7f, 0x1b, 0x94, 0x80, 0xa8, 0xb5, 0x92, 0x3c, - 0x16, 0xb3, 0x0a, 0x52, 0xa6, 0x44, 0xe7, 0x2e, 0xce, 0x1b, 0x47, 0xa4, - 0x5f, 0x8e, 0x80, 0xb1, 0x98, 0xe1, 0x23, 0x23, 0x16, 0xdc, 0xc7, 0x28, - 0xe8, 0xf6, 0xc6, 0x21, 0x42, 0x70, 0xd3, 0xd8, 0xe6, 0x31, 0xbb, 0x43, - 0x23, 0x8f, 0x62, 0x32, 0xdd, 0xf6, 0x82, 0x22, 0x81, 0xd9, 0x2b, 0x93, - 0x28, 0xfe, 0xe5, 0xec, 0x41, 0x09, 0x56, 0x7f, 0xe8, 0x40, 0x78, 0x42, - 0xa2, 0x77, 0x6f, 0x2b, 0xe6, 0xfd, 0x25, 0xe8, 0xaa, 0x75, 0x7f, 0xdf, - 0xa1, 0x2a, 0xdc, 0xa5, 0xe9, 0xa2, 0x2e, 0x9e, 0x85, 0x77, 0x80, 0xf8, - 0x68, 0x60, 0xde, 0xed, 0xe1, 0xec, 0xa2, 0x1f, 0x5c, 0xf7, 0xad, 0xf3, - 0x42, 0x21, 0xef, 0x7e, 0x2c, 0x3f, 0x75, 0x58, 0xad, 0x97, 0x1e, 0x8e, - 0x08, 0xb2, 0x46, 0x41, 0x10, 0x4c, 0xe0, 0x2f, 0x6d, 0x38, 0xc1, 0xc0, - 0xaf, 0xd5, 0x90, 0x0a, 0x5c, 0x2b, 0x89, 0x64, 0x92, 0x26, 0xd4, 0xf5, - 0xbe, 0xc1, 0xbf, 0xbe, 0xe5, 0xd3, 0x13, 0x82, 0x77, 0xb2, 0x4d, 0xa8, - 0x32, 0x0d, 0x39, 0xd8, 0xfa, 0x08, 0x8e, 0xb8, 0x27, 0x9d, 0x78, 0xd2, - 0x6a, 0x4f, 0x19, 0xee, 0x85, 0xc7, 0x63, 0x10, 0x48, 0xbf, 0xb9, 0xab, - 0x23, 0xae, 0xde, 0xa3, 0xb6, 0x68, 0xfd, 0x12, 0x31, 0xd3, 0x99, 0xcf, - 0xc1, 0x8b, 0x30, 0xf8, 0x2b, 0x65, 0xc8, 0x6c, 0xb0, 0xd7, 0xcd, 0xaa, - 0x15, 0x02, 0xa4, 0x43, 0x05, 0x79, 0x73, 0xb1, 0xbc, 0xd8, 0x53, 0x53, - 0x39, 0xc6, 0xe5, 0x9b, 0xaa, 0x9d, 0x58, 0xce, 0xe2, 0x0a, 0xb3, 0x46, - 0x48, 0x60, 0x96, 0x04, 0x33, 0x93, 0x6c, 0xf7, 0xfa, 0x27, 0xee, 0x14, - 0xdb, 0xad, 0xa0, 0x40, 0xc9, 0x3c, 0x64, 0x04, 0x28, 0x8e, 0xcc, 0x75, - 0x10, 0x89, 0x04, 0x6c, 0x4a, 0xc8, 0x9f, 0xf0, 0xb9, 0xfc, 0xe2, 0xc5, - 0xd1, 0x4e, 0x3e, 0x88, 0xb2, 0x89, 0x93, 0x1e, 0x63, 0x4e, 0x64, 0xb5, - 0x39, 0xbd, 0x9b, 0x02, 0xa2, 0xcf, 0xe2, 0xbc, 0xdf, 0x83, 0xd7, 0x38, - 0x68, 0xf2, 0xf1, 0x50, 0x10, 0xa5, 0x37, 0xb0, 0x2f, 0x1e, 0x56, 0x5f, - 0x4e, 0xaf, 0xb4, 0x41, 0x62, 0x8e, 0x6c, 0xd7, 0xcd, 0xc6, 0x42, 0x60, - 0x17, 0xa7, 0x15, 0xc6, 0xf8, 0x70, 0x2c, 0xd4, 0x4d, 0x6e, 0xaf, 0x23, - 0xf0, 0xdd, 0x5b, 0x49, 0x9f, 0x2c, 0xfd, 0xa8, 0xb7, 0xd3, 0xec, 0x06, - 0x8e, 0x7f, 0xcb, 0x33, 0x44, 0xc1, 0x5b, 0x6d, 0x7e, 0x8d, 0xd1, 0xd5, - 0x37, 0x67, 0x15, 0x94, 0xa7, 0x37, 0x1f, 0x2a, 0x53, 0xa6, 0x41, 0xb4, - 0x62, 0x8a, 0x51, 0xce, 0x0f, 0x8c, 0xaf, 0xc7, 0x17, 0x42, 0x6b, 0x9d, - 0x4f, 0x2b, 0x4d, 0x94, 0x75, 0x73, 0xa0, 0x59, 0x1b, 0xc4, 0x84, 0x70, - 0xf0, 0x2d, 0x95, 0xed, 0x12, 0x80, 0x5e, 0xfd, 0x1d, 0x3d, 0x23, 0xa9, - 0x58, 0x6f, 0xb4, 0xe8, 0x68, 0x4f, 0x99, 0x27, 0xce, 0x73, 0x74, 0xe0, - 0xfb, 0x97, 0xcc, 0xa0, 0x4d, 0xa6, 0x13, 0x0f, 0x0e, 0x5c, 0x36, 0xac, - 0xa6, 0xd8, 0x7f, 0x7d, 0xca, 0x98, 0xf6, 0xa1, 0xb3, 0x11, 0x9a, 0x61, - 0x65, 0xcc, 0x23, 0xb7, 0xce, 0xb3, 0x1a, 0x98, 0xa2, 0x5d, 0x96, 0x40, - 0x22, 0x83, 0x07, 0x6d, 0xf1, 0x14, 0x18, 0x37, 0x97, 0x1b, 0x98, 0x5f, - 0xd3, 0x47, 0xfd, 0x9b, 0xcc, 0xbc, 0xb4, 0x7e, 0x1a, 0xc5, 0x3d, 0x00, - 0x58, 0xe1, 0x96, 0x77, 0xd1, 0x88, 0x4a, 0x3c, 0xd5, 0xe7, 0xe8, 0xba, - 0xf0, 0xe7, 0x1c, 0x65, 0x83, 0x17, 0x50, 0xee, 0xee, 0x95, 0xe6, 0xb7, - 0x73, 0x68, 0x1d, 0xe7, 0xbf, 0x98, 0x44, 0xc6, 0x01, 0xf3, 0x0b, 0xbc, - 0xf8, 0x69, 0xe3, 0x30, 0xb7, 0x0a, 0x70, 0x61, 0x57, 0x79, 0x06, 0x4d, - 0x4c, 0x09, 0x97, 0xa9, 0x84, 0x20, 0x9f, 0xea, 0x92, 0x43, 0xb8, 0x6a, - 0x0a, 0x21, 0x8f, 0xd3, 0x1f, 0xa9, 0x2d, 0x5e, 0xae, 0x28, 0x54, 0xce, - 0x34, 0x77, 0xd8, 0xda, 0xaf, 0x31, 0xdf, 0xee, 0x44, 0xf8, 0x99, 0x76, - 0x7d, 0xe2, 0x72, 0x81, 0xd7, 0xa5, 0x32, 0xa6, 0xe2, 0x42, 0xe8, 0xf8, - 0x60, 0x72, 0xa8, 0x56, 0x7e, 0x03, 0x4c, 0x4f, 0xd3, 0xae, 0x80, 0xc0, - 0xcf, 0xd1, 0xfb, 0xfa, 0x67, 0x5a, 0x9b, 0x2c, 0x75, 0x8c, 0x19, 0x7c, - 0xe4, 0x18, 0x1b, 0xc0, 0xda, 0x14, 0x3f, 0x66, 0x56, 0xa6, 0x6c, 0xd6, - 0x38, 0x84, 0x8c, 0xa7, 0xed, 0x7d, 0xd0, 0x56, 0x70, 0x17, 0x08, 0x7c, - 0x31, 0xcd, 0x35, 0x40, 0x89, 0xe9, 0x0a, 0xb8, 0x8e, 0x79, 0xb8, 0x7b, - 0xa0, 0x9d, 0x26, 0x8c, 0x05, 0x27, 0xee, 0x18, 0x0e, 0x92, 0x3c, 0xa6, - 0x43, 0x0f, 0xe6, 0xa9, 0x1f, 0xa0, 0x1b, 0x95, 0x90, 0x8e, 0x60, 0xd8, - 0xae, 0x45, 0xf0, 0xc5, 0xca, 0x86, 0x52, 0x18, 0x6a, 0x2f, 0x9e, 0x1e, - 0x14, 0x73, 0x68, 0x77, 0xbe, 0x95, 0x66, 0xd6, 0x6e, 0xc7, 0x6d, 0x9c, - 0xa6, 0x9a, 0x78, 0xf2, 0x0c, 0xb9, 0x73, 0x6c, 0x96, 0xae, 0x89, 0x5d, - 0xd2, 0x30, 0xbf, 0x29, 0x69, 0x66, 0x1a, 0x7b, 0xa4, 0x9b, 0x99, 0x20, - 0x97, 0x2b, 0x81, 0xdb, 0xa8, 0x5d, 0xde, 0xa6, 0x5b, 0x3e, 0x88, 0x2b, - 0xbf, 0x98, 0x92, 0x07, 0x8c, 0xf9, 0x37, 0x8a, 0xc0, 0x61, 0x57, 0x1e, - 0x75, 0xd2, 0xbb, 0x02, 0x4c, 0xde, 0x14, 0x71, 0x35, 0x4c, 0x08, 0x4e, - 0x16, 0x06, 0x79, 0x0f, 0x8e, 0xda, 0xb4, 0xde, 0x23, 0x3b, 0x1a, 0xd2, - 0x19, 0xe9, 0x76, 0x7a, 0x47, 0xd9, 0x54, 0xe1, 0x8e, 0x5f, 0x1f, 0x49, - 0x07, 0xd5, 0xf0, 0x9f, 0xff, 0x75, 0xa1, 0x1c, 0xa3, 0xdd, 0x11, 0x17, - 0x30, 0x64, 0x17, 0xc4, 0x7c, 0x46, 0xfe, 0xf2, 0x39, 0x91, 0xfa, 0x25, - 0x14, 0xda, 0x51, 0x94, 0xf0, 0xe4, 0xe8, 0x76, 0x1f, 0x4e, 0x8d, 0x29, - 0x93, 0x98, 0x1e, 0x98, 0xe5, 0x92, 0xbe, 0x34, 0x8c, 0x14, 0x3d, 0xc7, - 0x5b, 0x1e, 0xdf, 0x89, 0x3b, 0xb8, 0x66, 0x2d, 0x93, 0x38, 0xc7, 0xe1, - 0x8c, 0xab, 0x88, 0xf6, 0x7e, 0x5d, 0xc2, 0x0a, 0xf6, 0x26, 0xbb, 0xef, - 0x5e, 0xf8, 0x65, 0x1c, 0xd8, 0xa4, 0xf4, 0xc6, 0xfb, 0x2e, 0x40, 0xc9, - 0x21, 0x20, 0x1e, 0x4a, 0x05, 0x0a, 0x40, 0xb8, 0x8d, 0xaa, 0x9a, 0x7d, - 0x7a, 0xc3, 0x67, 0xde, 0x68, 0x06, 0x83, 0xc0, 0xae, 0xc3, 0x61, 0x1a, - 0x1d, 0x85, 0xe6, 0x15, 0xdd, 0x6a, 0x54, 0xae, 0xda, 0x1b, 0x4f, 0x28, - 0xd2, 0xbb, 0xd2, 0x6f, 0x20, 0x83, 0x55, 0x32, 0xf9, 0x65, 0xac, 0xde, - 0x30, 0xb9, 0x2a, 0x5e, 0x66, 0x2d, 0x1e, 0x02, 0x7b, 0x7d, 0x30, 0x2f, - 0x5a, 0x6a, 0xd0, 0x14, 0xe1, 0xef, 0x21, 0x70, 0x03, 0x92, 0x37, 0x76, - 0x8d, 0x27, 0x84, 0xdc, 0x23, 0x36, 0x46, 0x56, 0x0a, 0x52, 0x94, 0xad, - 0x1f, 0x5d, 0x9f, 0x6e, 0x67, 0x50, 0x6d, 0xad, 0x66, 0x8f, 0x23, 0x9a, - 0xa8, 0xc2, 0xa5, 0xec, 0xb4, 0xaf, 0x43, 0xc1, 0x05, 0xf1, 0x49, 0x86, - 0xb6, 0xbb, 0x79, 0xbb, 0x66, 0xa3, 0xa1, 0xc4, 0x90, 0xd1, 0x1b, 0xb1, - 0x13, 0xeb, 0x79, 0x63, 0x42, 0xc0, 0xc6, 0x0d, 0xd6, 0xea, 0xab, 0x97, - 0xeb, 0xf3, 0x66, 0xc4, 0xd9, 0xc0, 0xd2, 0x1e, 0x7d, 0x68, 0xcc, 0xf0, - 0x7d, 0x9d, 0x47, 0x41, 0xdc, 0x7f, 0x9c, 0x86, 0x55, 0x53, 0xf2, 0x9e, - 0x19, 0x92, 0x85, 0xbb, 0x0d, 0x49, 0x99, 0xa9, 0x80, 0x98, 0x6a, 0x65, - 0x32, 0x43, 0xaf, 0xbe, 0x61, 0x19, 0x15, 0x5b, 0x1c, 0x77, 0x9a, 0x9f, - 0x59, 0x91, 0x97, 0x31, 0x46, 0x70, 0x79, 0x35, 0xa1, 0xf4, 0x13, 0x6b, - 0xf9, 0xac, 0x65, 0x81, 0xfc, 0x8a, 0xef, 0xf7, 0x0b, 0x5a, 0x89, 0x20, - 0x1a, 0x3a, 0x91, 0x1e, 0x67, 0x55, 0x4d, 0xe3, 0xb1, 0xef, 0x8d, 0x72, - 0x8c, 0x6e, 0x83, 0xe0, 0xcc, 0xcc, 0x98, 0xf5, 0x49, 0xe3, 0x17, 0xca, - 0xab, 0xef, 0x69, 0x12, 0x8b, 0xd0, 0x36, 0xfd, 0xa5, 0xbf, 0x0b, 0x3b, - 0x67, 0x3f, 0x2f, 0xa6, 0x47, 0xba, 0xb1, 0xa8, 0x14, 0xdb, 0x43, 0xe7, - 0x89, 0x08, 0xee, 0x16, 0x43, 0xb3, 0x52, 0x6e, 0xed, 0x30, 0x60, 0xfa, - 0xf7, 0x15, 0x5b, 0xf7, 0x3d, 0xd5, 0x74, 0x92, 0x62, 0x42, 0xa3, 0xa2, - 0xb9, 0xa4, 0x16, 0xca, 0x3d, 0xfc, 0x37, 0x3f, 0x6f, 0xe3, 0x30, 0x91, - 0xe5, 0x23, 0xf8, 0x7d, 0x81, 0xda, 0x0b, 0x86, 0xcd, 0x5a, 0x35, 0x4f, - 0x55, 0x30, 0xeb, 0x0b, 0x73, 0xb7, 0xdc, 0xe9, 0x4f, 0x8f, 0x12, 0x26, - 0x55, 0x2e, 0xdb, 0x7d, 0xa6, 0x62, 0xea, 0xc3, 0xd7, 0xb4, 0x5b, 0xeb, - 0x0d, 0x19, 0x91, 0x4b, 0xeb, 0x4c, 0x79, 0x18, 0x56, 0x5a, 0xc4, 0x90, - 0xba, 0x91, 0xd5, 0x77, 0x31, 0x90, 0x48, 0x7c, 0x4a, 0xd5, 0xa0, 0x45, - 0x5a, 0x2c, 0x27, 0xc7, 0x79, 0x12, 0x1e, 0x4f, 0xb2, 0x2e, 0xf8, 0x1b, - 0x3a, 0xb4, 0x3d, 0x8f, 0x0f, 0xc6, 0xef, 0xd6, 0xb7, 0xdd, 0x80, 0x06, - 0xd3, 0x28, 0x78, 0x3e, 0x33, 0xf3, 0x21, 0xbf, 0xdb, 0xf7, 0xce, 0x79, - 0xbe, 0x83, 0x60, 0xa9, 0x26, 0x41, 0xea, 0x77, 0xfa, 0x22, 0x52, 0x14, - 0xc5, 0x8d, 0x68, 0xe9, 0x57, 0x78, 0xc7, 0xca, 0xda, 0xf2, 0xbb, 0xd5, - 0xd5, 0xea, 0x82, 0x64, 0xcd, 0xa4, 0xb0, 0xd4, 0x75, 0xce, 0xbe, 0x33, - 0xdb, 0x5d, 0x5f, 0x9d, 0x3b, 0x9e, 0xeb, 0x05, 0x7a, 0x72, 0x90, 0x71, - 0x88, 0x26, 0xb0, 0x25, 0xc3, 0xfa, 0xf9, 0xfd, 0x03, 0x8d, 0x48, 0x02, - 0x8a, 0xc9, 0x82, 0x18, 0x99, 0x49, 0xa3, 0x96, 0xea, 0xa5, 0x71, 0xd9, - 0x2b, 0xc6, 0x38, 0x96, 0x87, 0x3c, 0xbf, 0x2b, 0xf5, 0x62, 0xe7, 0xb7, - 0xbd, 0x8f, 0xf7, 0xdf, 0x10, 0x26, 0x41, 0xcc, 0xbf, 0xd8, 0xe5, 0xfe, - 0xbd, 0x87, 0xdb, 0x24, 0xbc, 0x71, 0x6c, 0xcb, 0x3d, 0xf5, 0x5b, 0x5a, - 0x53, 0xd8, 0xa7, 0xb0, 0x4c, 0x70, 0x7e, 0xf0, 0x64, 0x4f, 0x7a, 0xa8, - 0x22, 0x82, 0x34, 0xeb, 0xe1, 0x2b, 0xbd, 0xbf, 0x85, 0x8a, 0xb6, 0xa9, - 0x0a, 0xc5, 0x6d, 0x5f, 0xf0, 0xf6, 0x1b, 0xa8, 0x0f, 0x51, 0x3c, 0x1b, - 0xf7, 0x46, 0x45, 0xdd, 0x45, 0x55, 0x20, 0xe6, 0xc3, 0x55, 0x70, 0x13, - 0x8a, 0x24, 0xa7, 0x27, 0x38, 0x53, 0xd8, 0xb6, 0xe4, 0x71, 0xd6, 0xe4, - 0x8b, 0x14, 0xbe, 0x8f, 0xc9, 0x4c, 0x1e, 0x38, 0xef, 0x23, 0x53, 0xc0, - 0xd4, 0x24, 0x6b, 0x50, 0xa3, 0x2a, 0xf5, 0xa9, 0x9f, 0xcc, 0x72, 0x03, - 0x4b, 0x47, 0xe4, 0xa3, 0xfa, 0xe1, 0x65, 0xde, 0x85, 0xba, 0x28, 0xe5, - 0x0b, 0xc6, 0x1a, 0x3f, 0xcc, 0x21, 0xfd, 0x3e, 0xcd, 0x3c, 0xc4, 0xc5, - 0x5b, 0xd3, 0xef, 0x85, 0x1e, 0x3c, 0x06, 0x2b, 0xcf, 0x26, 0xa1, 0x7a, - 0xa0, 0x7a, 0xfe, 0x51, 0xe1, 0x05, 0xb1, 0x42, 0xa0, 0xdb, 0x6a, 0x0f, - 0xa4, 0x45, 0xee, 0x54, 0x6a, 0xc6, 0xf6, 0x1f, 0x80, 0xd7, 0x07, 0x31, - 0x96, 0xfc, 0xf3, 0x47, 0x8c, 0x66, 0xe9, 0x41, 0x39, 0x37, 0x89, 0x05, - 0x85, 0x3d, 0xb0, 0x0a, 0x2e, 0x19, 0x97, 0x20, 0xf2, 0x85, 0x36, 0x6f, - 0x2b, 0xd4, 0x1c, 0x47, 0x1f, 0xdd, 0xd7, 0xff, 0xc5, 0xaf, 0x8d, 0xfc, - 0x5e, 0xd4, 0x63, 0x6e, 0xb0, 0x8e, 0xb8, 0x58, 0x13, 0xe7, 0xf3, 0x7d, - 0x38, 0xfc, 0x4b, 0x51, 0x85, 0xc8, 0x2f, 0xc9, 0x6f, 0x41, 0x91, 0xbf, - 0x34, 0xae, 0xeb, 0x40, 0x14, 0x1b, 0x37, 0xd1, 0x6f, 0x70, 0x6e, 0x5f, - 0x13, 0xa7, 0x3d, 0x63, 0x93, 0x60, 0x6e, 0x18, 0xd2, 0xcb, 0x68, 0x71, - 0xa4, 0xca, 0xeb, 0xf7, 0x80, 0x0c, 0x63, 0x0c, 0x70, 0xcd, 0x72, 0x4e, - 0xcb, 0x23, 0x5b, 0x96, 0x14, 0x32, 0x77, 0xc4, 0x82, 0xb8, 0xb1, 0x24, - 0x68, 0x2a, 0x72, 0x73, 0x85, 0xe6, 0x02, 0x29, 0x0c, 0x8f, 0xae, 0x88, - 0x24, 0xaa, 0x13, 0x6f, 0xaf, 0xd2, 0xaa, 0xa9, 0x77, 0x57, 0xbe, 0xbd, - 0x16, 0x83, 0xea, 0xc0, 0xad, 0x01, 0x27, 0xf1, 0x4f, 0x87, 0x49, 0x32, - 0x02, 0x9a, 0x19, 0xe6, 0x97, 0xb1, 0x6d, 0x4a, 0x85, 0x5f, 0x19, 0x07, - 0x88, 0xe2, 0xc2, 0x9f, 0x1d, 0xfd, 0xb0, 0x10, 0xf2, 0x66, 0xb1, 0x04, - 0xfd, 0x54, 0x75, 0x92, 0x35, 0xa2, 0x3b, 0x0e, 0x93, 0xde, 0x53, 0x62, - 0x66, 0x99, 0xe0, 0x97, 0x04, 0x46, 0x07, 0x9d, 0xff, 0xaa, 0x30, 0x53, - 0xe1, 0xfc, 0xb4, 0x87, 0x68, 0x59, 0x5b, 0x23, 0x35, 0x40, 0xbc, 0xd4, - 0xd9, 0x21, 0xa7, 0xff, 0xee, 0x38, 0x32, 0x45, 0xcc, 0xa9, 0x82, 0xff, - 0x5c, 0x8f, 0x67, 0x3c, 0xfd, 0x52, 0x4a, 0xf6, 0x4e, 0x2b, 0x8f, 0x48, - 0xe9, 0xa5, 0x2a, 0x21, 0xb7, 0x6a, 0x08, 0xe5, 0x25, 0x3c, 0xf7, 0xf9, - 0xd8, 0xb0, 0x12, 0x99, 0xea, 0x21, 0x84, 0xc8, 0x2b, 0x96, 0xdb, 0x52, - 0x59, 0x55, 0xa7, 0x36, 0x57, 0x1b, 0xd7, 0x82, 0x13, 0xd9, 0x77, 0xdf, - 0xa6, 0xba, 0xb8, 0xbc, 0x5a, 0x56, 0x5b, 0xcb, 0x90, 0xb5, 0x99, 0x9c, - 0xa6, 0x67, 0x64, 0x41, 0xfe, 0x38, 0x25, 0x8e, 0x61, 0x8c, 0x38, 0x4d, - 0xf1, 0x21, 0x37, 0x6d, 0xa2, 0x0f, 0xfe, 0x93, 0xee, 0xf0, 0x33, 0x78, - 0x80, 0xfd, 0xc1, 0xc8, 0xfa, 0x51, 0x9f, 0x8b, 0x78, 0xd1, 0x2e, 0x10, - 0xe8, 0xb4, 0xae, 0xe7, 0xe1, 0x10, 0xbd, 0x9c, 0x07, 0x8f, 0x0d, 0xcf, - 0x2b, 0x3d, 0xfb, 0x26, 0x83, 0xc7, 0xbe, 0x83, 0x02, 0xb6, 0x4f, 0xfe, - 0x8a, 0x0a, 0x9e, 0x4d, 0x76, 0x32, 0x2a, 0xa1, 0x12, 0xf4, 0xf7, 0x08, - 0xad, 0x71, 0xf9, 0x82, 0xe1, 0x8d, 0x40, 0x00, 0x3c, 0x6f, 0xa7, 0xdf, - 0x8b, 0x65, 0x46, 0x38, 0xfa, 0xa1, 0xf9, 0x93, 0x6c, 0x6e, 0xcf, 0xde, - 0x3f, 0x16, 0x2d, 0xee, 0x4b, 0xf6, 0xda, 0xf1, 0xee, 0xab, 0xfa, 0xc3, - 0x2d, 0xd1, 0xd7, 0x08, 0x08, 0x62, 0xba, 0xdc, 0xd8, 0xd3, 0x53, 0xd1, - 0xcd, 0xaa, 0x77, 0x9d, 0x8a, 0xa2, 0xd9, 0x14, 0x24, 0x7a, 0x9e, 0x4b, - 0x08, 0x1c, 0xc0, 0xe4, 0x37, 0x5e, 0x78, 0x4f, 0x7d, 0x06, 0x2e, 0x6e, - 0x70, 0xbf, 0x50, 0x5b, 0xcf, 0xf8, 0x06, 0x32, 0xad, 0xc8, 0x5e, 0xc5, - 0x8c, 0xcf, 0x87, 0x28, 0x97, 0xb8, 0x21, 0xda, 0x16, 0x91, 0xdf, 0x37, - 0x45, 0x3c, 0xe6, 0xc0, 0x56, 0xae, 0x89, 0x4d, 0xfb, 0x07, 0xe7, 0xb1, - 0x1a, 0xd2, 0x46, 0x3c, 0xd8, 0xbf, 0x37, 0x4b, 0xbf, 0x5e, 0xdd, 0xea, - 0xe2, 0x22, 0xe8, 0x76, 0xcc, 0x01, 0x4e, 0xeb, 0x5b, 0xa9, 0xcd, 0xcb, - 0xa9, 0xbc, 0xef, 0x1e, 0xea, 0x26, 0x42, 0x71, 0x6c, 0xe5, 0xae, 0x4b, - 0x47, 0x7c, 0xae, 0x4e, 0x39, 0x69, 0x83, 0x00, 0xe9, 0x11, 0x61, 0x82, - 0xd9, 0x70, 0x99, 0x8b, 0xa9, 0x95, 0xd4, 0x16, 0x68, 0x6a, 0x79, 0xb3, - 0xb1, 0xe9, 0x17, 0xb5, 0xff, 0xed, 0xed, 0x00, 0xdc, 0xdf, 0x04, 0x13, - 0x7d, 0xc8, 0x95, 0xb2, 0xe2, 0xc6, 0xbe, 0xa8, 0x8b, 0x7d, 0x1f, 0x2b, - 0x21, 0x68, 0x2f, 0x55, 0x65, 0x45, 0x46, 0x05, 0x85, 0xf0, 0x27, 0x5d, - 0x88, 0x70, 0x73, 0x57, 0x4e, 0x67, 0xc2, 0xad, 0x3b, 0x0c, 0x1f, 0x8a, - 0x92, 0xbb, 0x49, 0xe6, 0x43, 0xee, 0x4c, 0x2e, 0x6d, 0x3c, 0xa6, 0xe4, - 0xb2, 0x88, 0xa8, 0x47, 0xcf, 0x50, 0x4f, 0x5a, 0x45, 0x55, 0xc4, 0xb1, - 0x67, 0x2f, 0xff, 0x45, 0x00, 0xf3, 0xfb, 0xec, 0x56, 0x3a, 0x2b, 0x30, - 0xd3, 0x08, 0x29, 0x4e, 0x7a, 0x27, 0xc3, 0xe7, 0xf8, 0x59, 0x92, 0x7b, - 0xdd, 0xbd, 0x6d, 0xe3, 0x4e, 0x31, 0x8e, 0x9b, 0xcd, 0xba, 0x98, 0xb2, - 0x21, 0x75, 0xaf, 0x42, 0xf7, 0x95, 0xc8, 0xb2, 0x44, 0x13, 0x40, 0x79, - 0xcd, 0xfb, 0xbb, 0x58, 0x60, 0xbf, 0xa6, 0x0b, 0x4c, 0xfb, 0x5b, 0x0f, - 0xd8, 0xe2, 0xb9, 0x38, 0x6f, 0x35, 0x21, 0x7e, 0xae, 0x7b, 0x1c, 0x43, - 0x96, 0xa7, 0x0b, 0x7d, 0xb7, 0x68, 0xb4, 0x8e, 0x86, 0xa4, 0xe5, 0xd6, - 0x97, 0x7e, 0x8c, 0xe2, 0x14, 0x24, 0xf5, 0xd8, 0xb2, 0xf2, 0x0b, 0x23, - 0x18, 0xd0, 0xb4, 0xb4, 0x90, 0x01, 0x2f, 0x56, 0xd6, 0x70, 0xd0, 0xf2, - 0x2b, 0x3c, 0x9a, 0x20, 0xa7, 0x71, 0xdc, 0x3a, 0x45, 0x42, 0x40, 0xe6, - 0x72, 0x0c, 0x3c, 0x56, 0xe2, 0x06, 0x4f, 0xc0, 0x2d, 0x94, 0xe0, 0xe4, - 0x2e, 0xae, 0x33, 0x21, 0x01, 0xab, 0x6f, 0x87, 0x4f, 0x9a, 0x73, 0x55, - 0x98, 0x0b, 0x48, 0x89, 0xff, 0x19, 0x41, 0x33, 0x12, 0xcd, 0xb7, 0x3b, - 0x49, 0x8d, 0x5f, 0xcd, 0xc1, 0x90, 0x71, 0xc4, 0xec, 0x96, 0x7f, 0xa1, - 0xe5, 0xc9, 0x84, 0x43, 0x49, 0x9a, 0xb0, 0x02, 0xd9, 0xb1, 0x52, 0x80, - 0x0c, 0xe0, 0xc8, 0x63, 0x7a, 0x2c, 0x31, 0x57, 0xb7, 0x5e, 0x75, 0xb2, - 0x82, 0x8c, 0x43, 0x0d, 0x65, 0xd4, 0x29, 0x24, 0x8c, 0x3c, 0x83, 0xf8, - 0xc8, 0x7b, 0x37, 0x60, 0xae, 0x70, 0x22, 0x14, 0xe5, 0x4b, 0x7a, 0xfa, - 0xe3, 0xc1, 0xd5, 0x97, 0xe6, 0xce, 0x33, 0xdc, 0xe2, 0x86, 0xd4, 0xb2, - 0x23, 0x6f, 0x3e, 0xd7, 0x9c, 0x45, 0xdc, 0x16, 0x9d, 0x88, 0x46, 0xad, - 0xfe, 0x05, 0x14, 0xb6, 0x0f, 0xaf, 0xd2, 0xca, 0x4b, 0xc8, 0x3f, 0x5d, - 0x06, 0x98, 0xc1, 0xdf, 0x1d, 0xd8, 0xa9, 0x45, 0xb4, 0x8e, 0x37, 0xef, - 0x37, 0x04, 0xa3, 0x28, 0xbd, 0xf3, 0xd0, 0x68, 0x29, 0xb1, 0x85, 0x21, - 0x0b, 0xfa, 0x08, 0xc8, 0x6b, 0xa4, 0xc5, 0x52, 0xdf, 0x08, 0xa7, 0x56, - 0x52, 0x31, 0x8f, 0xed, 0x5a, 0x48, 0x8d, 0xe5, 0xf2, 0x62, 0x98, 0x5b, - 0x05, 0x5c, 0x7b, 0xb3, 0xe0, 0x2a, 0xc9, 0x24, 0x18, 0x7d, 0xa5, 0x5f, - 0x3d, 0xa5, 0x0e, 0x9b, 0xb5, 0xb2, 0x37, 0x09, 0x09, 0x35, 0x20, 0x7d, - 0x09, 0x5b, 0x1c, 0x23, 0xbf, 0x7e, 0x29, 0x78, 0x25, 0xc8, 0xa8, 0x0a, - 0xef, 0x7b, 0x63, 0x2a, 0x66, 0xb9, 0xd6, 0x12, 0xe8, 0xbd, 0x06, 0x3f, - 0xc2, 0x39, 0x30, 0xd1, 0xfd, 0xfd, 0x95, 0x0a, 0xe8, 0x34, 0xe3, 0xbc, - 0x9f, 0x95, 0x2b, 0x73, 0x29, 0x43, 0xa1, 0xe6, 0x5e, 0xaf, 0xa8, 0xca, - 0x1c, 0x7d, 0xf0, 0xda, 0xf0, 0x5d, 0x54, 0x60, 0x6f, 0x9c, 0x05, 0xc8, - 0xc0, 0xbf, 0x33, 0x3c, 0x9f, 0xd0, 0xd6, 0xd7, 0x57, 0xe1, 0x3e, 0xc9, - 0x97, 0x7c, 0x93, 0xf3, 0x0f, 0xdc, 0x68, 0xc6, 0x60, 0x3e, 0xfa, 0x50, - 0xc7, 0xf2, 0x62, 0x0e, 0x3f, 0xbe, 0x06, 0x2b, 0xb1, 0x96, 0x9c, 0x26, - 0x7c, 0xcb, 0x1f, 0xc0, 0xef, 0x6a, 0x64, 0xad, 0x70, 0x58, 0x8e, 0x06, - 0x88, 0xd9, 0x78, 0x0d, 0x5b, 0x70, 0x3d, 0x8f, 0xeb, 0x02, 0xf7, 0xbe, - 0x9e, 0x42, 0xac, 0x17, 0xb4, 0xab, 0xc1, 0x9b, 0x70, 0x15, 0x0e, 0xa5, - 0xd5, 0x19, 0x88, 0x73, 0xfa, 0x8d, 0xa4, 0xd0, 0xee, 0x5a, 0x5e, 0x6f, - 0x63, 0x1d, 0xe0, 0xa6, 0x84, 0x6d, 0xa4, 0xd8, 0xa6, 0xeb, 0xc5, 0xa7, - 0x6b, 0x73, 0xd0, 0x65, 0x94, 0xb3, 0x48, 0x8b, 0xd8, 0xf6, 0x15, 0xbe, - 0x1a, 0x14, 0x48, 0xdf, 0x7a, 0x6e, 0x4b, 0x1c, 0x09, 0x8e, 0x71, 0xf8, - 0x18, 0x04, 0x26, 0xfd, 0xd9, 0x76, 0xda, 0x13, 0xc6, 0x78, 0xd9, 0xe9, - 0x5a, 0xfe, 0x4c, 0x5f, 0xac, 0xbd, 0xe5, 0x49, 0xc7, 0xbc, 0x58, 0xb5, - 0xdd, 0xbc, 0x88, 0x89, 0x1b, 0xe1, 0x60, 0xcd, 0xf2, 0xb3, 0x97, 0x23, - 0xda, 0xc0, 0x5c, 0x3a, 0x68, 0x63, 0x5b, 0xb7, 0x55, 0xd4, 0xf4, 0x71, - 0x69, 0x5d, 0x99, 0xf9, 0x73, 0x5a, 0x47, 0x78, 0x38, 0xf0, 0x54, 0x19, - 0x26, 0x20, 0x28, 0x62, 0xa6, 0x02, 0xaf, 0x7b, 0x58, 0x30, 0x36, 0xbf, - 0x90, 0xdf, 0xe8, 0xb7, 0xf1, 0xd6, 0x80, 0x54, 0x39, 0xaa, 0xe4, 0xb4, - 0x26, 0x9d, 0xea, 0xba, 0x5c, 0x68, 0x85, 0xe8, 0x66, 0xd7, 0x34, 0x69, - 0xd8, 0x46, 0x8a, 0x4e, 0x46, 0xf8, 0x88, 0xbe, 0xe0, 0xd1, 0xfe, 0x20, - 0x76, 0xac, 0x51, 0x17, 0x30, 0x33, 0x35, 0x29, 0x54, 0x88, 0x52, 0xde, - 0xb6, 0x86, 0xc4, 0x92, 0x4e, 0x3c, 0xe8, 0x62, 0xc7, 0x20, 0xf0, 0x63, - 0xb9, 0xd3, 0xb0, 0x1a, 0x3e, 0xe7, 0x9c, 0x88, 0x5f, 0x0b, 0x53, 0x7f, - 0x56, 0x03, 0xc2, 0xbf, 0x43, 0xb8, 0x4e, 0x47, 0xb6, 0x52, 0x30, 0xfa, - 0x46, 0xb7, 0x2b, 0xf3, 0xc4, 0x8d, 0x6f, 0xa2, 0xc5, 0xec, 0xa1, 0x53, - 0x55, 0x3d, 0x61, 0xb9, 0xa9, 0x8a, 0xe5, 0x19, 0x31, 0x5b, 0xef, 0x39, - 0x84, 0x56, 0x1a, 0x7b, 0xd9, 0x25, 0xa3, 0xd6, 0x56, 0x88, 0x55, 0xe7, - 0x66, 0xf0, 0xb6, 0xcf, 0x27, 0x2d, 0x15, 0x3c, 0xe8, 0x1b, 0x2c, 0x46, - 0x73, 0xb5, 0x66, 0x8f, 0xff, 0x2f, 0x68, 0x7c, 0x86, 0x68, 0xae, 0x13, - 0x39, 0x0f, 0xcb, 0xa7, 0xd8, 0x93, 0xeb, 0xb2, 0x8f, 0x20, 0x6a, 0xda, - 0x1d, 0xdc, 0xdf, 0x5e, 0x4b, 0xce, 0x89, 0xad, 0xd6, 0xf4, 0xc7, 0xe0, - 0xe3, 0x30, 0xa9, 0xc3, 0xf7, 0x65, 0x92, 0x29, 0x11, 0xb6, 0x43, 0x5c, - 0x44, 0xb1, 0x36, 0xf4, 0xb6, 0xbd, 0x8f, 0x42, 0x9a, 0x4b, 0xb2, 0xc4, - 0xb6, 0x0f, 0x06, 0x5b, 0x70, 0x2d, 0x8a, 0x89, 0x13, 0xf9, 0xeb, 0xfe, - 0xb9, 0x33, 0x58, 0xe3, 0x3b, 0x19, 0x57, 0x4c, 0xb3, 0xea, 0x06, 0x1d, - 0xc0, 0xba, 0xe9, 0x98, 0xb4, 0x4b, 0x9c, 0xe2, 0x0f, 0xfd, 0xd2, 0x22, - 0x40, 0x0d, 0xf3, 0xf8, 0x68, 0xe1, 0xd3, 0x2b, 0x0f, 0xf7, 0xf1, 0x14, - 0x14, 0x7c, 0xbb, 0xc4, 0xad, 0xf0, 0xd5, 0xd7, 0x53, 0xaf, 0x3d, 0x0a, - 0x82, 0xa5, 0xa3, 0xbf, 0xd0, 0xdb, 0x63, 0x06, 0x6d, 0x05, 0x1d, 0x38, - 0xfc, 0x8e, 0x2e, 0x49, 0x44, 0x3a, 0x28, 0x82, 0xc7, 0x4c, 0x35, 0xe1, - 0x0f, 0x90, 0xa9, 0x41, 0x7d, 0x6e, 0x31, 0xbf, 0xc1, 0x51, 0x9b, 0xc0, - 0x2e, 0x00, 0x37, 0x9b, 0xe3, 0x6f, 0xa3, 0x29, 0x51, 0x63, 0x99, 0xd7, - 0x73, 0x12, 0x29, 0xde, 0x03, 0xde, 0x79, 0x1a, 0xd3, 0xa2, 0x39, 0xbd, - 0x03, 0xae, 0xaa, 0x39, 0x9b, 0xd7, 0xf1, 0x5b, 0x75, 0xc8, 0x6a, 0x3e, - 0xbb, 0xc1, 0xa8, 0x64, 0x46, 0x19, 0x79, 0x31, 0x3d, 0x1e, 0x36, 0xde, - 0x03, 0x95, 0x60, 0x73, 0xb4, 0x9c, 0x6e, 0xc3, 0x2f, 0x90, 0x4a, 0x7a, - 0x8b, 0xd1, 0x01, 0x66, 0xb6, 0x5a, 0x86, 0x7c, 0x35, 0xd7, 0x10, 0x99, - 0x42, 0xe7, 0x6f, 0xe6, 0xc8, 0x73, 0xb4, 0xbe, 0x0c, 0x27, 0x4f, 0xfe, - 0xe2, 0x72, 0xc0, 0x48, 0xdb, 0x9f, 0x78, 0xb5, 0x88, 0xa3, 0xa3, 0x17, - 0x5f, 0x4b, 0x7e, 0xc0, 0x3e, 0x38, 0x88, 0xad, 0x2b, 0xf1, 0xdb, 0x84, - 0x76, 0xd6, 0xb6, 0x87, 0xf9, 0x60, 0x7a, 0x15, 0x96, 0x5e, 0x29, 0xaf, - 0x66, 0x57, 0x04, 0x54, 0x1d, 0x74, 0xe4, 0x22, 0xbf, 0xc6, 0xc9, 0xfd, - 0x6d, 0x71, 0x8f, 0x28, 0x7b, 0x1d, 0x53, 0xc4, 0xe2, 0xbc, 0xc2, 0x26, - 0x29, 0x67, 0xe5, 0x4f, 0x4b, 0xe1, 0x16, 0x57, 0x21, 0x99, 0xe8, 0xa0, - 0xe2, 0xb2, 0x38, 0xbe, 0x11, 0xc5, 0xf8, 0xc3, 0xdc, 0x27, 0x83, 0x77, - 0xee, 0x39, 0x16, 0x00, 0x0b, 0x12, 0xe3, 0xe6, 0x6b, 0x4f, 0x99, 0xe2, - 0xd5, 0x2c, 0x7d, 0x42, 0xf4, 0xd4, 0x0b, 0x17, 0x42, 0x75, 0x3d, 0xf9, - 0xda, 0xe2, 0x36, 0xb5, 0xce, 0x04, 0x33, 0xb7, 0xc6, 0xd8, 0x01, 0xfa, - 0xf5, 0x2a, 0x5c, 0x41, 0xd0, 0x7c, 0x6c, 0x77, 0x95, 0x01, 0x3d, 0x34, - 0x9e, 0x3d, 0xe9, 0x0b, 0x37, 0xfe, 0xb7, 0xc9, 0x34, 0xb7, 0xe3, 0xc6, - 0xda, 0x89, 0x07, 0x29, 0xca, 0xba, 0x1d, 0xa3, 0x11, 0x9a, 0x47, 0x0e, - 0xe2, 0x6f, 0xd4, 0x24, 0x71, 0x87, 0x36, 0x83, 0x57, 0xdd, 0x78, 0xde, - 0xcb, 0xba, 0x24, 0xe3, 0x2e, 0xf7, 0x73, 0xd8, 0xf0, 0xeb, 0x52, 0x9c, - 0x65, 0x89, 0x87, 0xa8, 0x63, 0xf5, 0x9f, 0xb0, 0x7c, 0x17, 0xc1, 0xd2, - 0x47, 0x60, 0xbb, 0xdf, 0x9d, 0xff, 0x22, 0xa0, 0xf1, 0x41, 0x8c, 0x33, - 0x67, 0x3b, 0x41, 0x4b, 0x18, 0xce, 0x40, 0x7d, 0x85, 0xb2, 0x86, 0x46, - 0x3c, 0x8e, 0x7d, 0x7a, 0xc2, 0x96, 0xe6, 0xa7, 0x45, 0x87, 0xd6, 0x63, - 0x9a, 0x54, 0x2b, 0x31, 0x26, 0xfd, 0x9b, 0xf1, 0x4c, 0x2f, 0x43, 0xd0, - 0x5f, 0x68, 0x02, 0x7e, 0xa4, 0x92, 0x01, 0x79, 0xa5, 0xc9, 0xc7, 0xe2, - 0x6c, 0xf0, 0xf4, 0xe5, 0x75, 0xc4, 0xaa, 0xed, 0x56, 0x37, 0xd4, 0x76, - 0x55, 0x3c, 0xb8, 0x57, 0xb0, 0xdf, 0x8d, 0x30, 0xdc, 0x71, 0x4f, 0x5b, - 0xe9, 0xe2, 0xa8, 0x2c, 0xb7, 0x80, 0x1c, 0x50, 0x76, 0x61, 0x90, 0x74, - 0x4c, 0x1d, 0x7c, 0x39, 0x2f, 0x51, 0xb0, 0xc7, 0xfc, 0x09, 0xa9, 0xcf, - 0x80, 0xd6, 0xf1, 0x0b, 0xb3, 0x76, 0xf7, 0x57, 0xd3, 0x07, 0xd7, 0xe1, - 0x38, 0x76, 0x56, 0x8d, 0x31, 0xb9, 0x84, 0x5c, 0x18, 0xc5, 0xeb, 0x95, - 0x7c, 0xf5, 0xa6, 0xfe, 0x6c, 0x3b, 0x4c, 0x49, 0x82, 0xf0, 0xbd, 0x05, - 0x82, 0x7a, 0x0b, 0xc7, 0xb0, 0x9f, 0xcb, 0x53, 0xbf, 0xad, 0xb4, 0xc1, - 0x2c, 0xc8, 0x68, 0x9c, 0x66, 0x92, 0x41, 0xfa, 0x2d, 0x5f, 0xe8, 0xe4, - 0x6b, 0xce, 0xe3, 0xc3, 0xc8, 0x85, 0x38, 0x37, 0x47, 0x85, 0xd7, 0xa3, - 0x0a, 0x35, 0xd8, 0x68, 0x62, 0xcb, 0x3e, 0x66, 0xde, 0x10, 0x85, 0xfb, - 0xe7, 0x68, 0xd8, 0x32, 0x78, 0xce, 0x19, 0xb3, 0xe8, 0xde, 0x79, 0xf0, - 0xef, 0x27, 0x1e, 0x4a, 0xd1, 0xe2, 0x2e, 0xd0, 0x9f, 0x20, 0x81, 0x1f, - 0xcb, 0xf3, 0xf5, 0x19, 0xf5, 0x68, 0xc7, 0x8b, 0x16, 0xc6, 0xb5, 0x7e, - 0x0a, 0x89, 0x6e, 0xb9, 0xf8, 0xfc, 0x8c, 0x28, 0xf1, 0x5b, 0x38, 0x40, - 0x81, 0x0a, 0x87, 0x0b, 0x27, 0x75, 0x47, 0x67, 0xd1, 0x62, 0x4f, 0xff, - 0xda, 0xae, 0xec, 0xe3, 0xd0, 0xf2, 0x34, 0xdc, 0x77, 0xf4, 0xa4, 0xce, - 0xc9, 0x46, 0x66, 0xfe, 0x16, 0x6f, 0xbd, 0xc6, 0x4d, 0xb4, 0x90, 0x83, - 0x9a, 0x9c, 0x08, 0xa1, 0xf4, 0x9f, 0x3a, 0xee, 0xc1, 0xde, 0xf3, 0x23, - 0x77, 0xee, 0x42, 0x30, 0xd5, 0x8f, 0x5a, 0x53, 0x0a, 0x9a, 0xe6, 0xb6, - 0x1f, 0xe6, 0xa8, 0x34, 0x63, 0x5d, 0x8d, 0x87, 0x32, 0x72, 0x8a, 0x5b, - 0x72, 0x16, 0xc4, 0x1c, 0x5e, 0x99, 0x7c, 0xaa, 0xe6, 0x8e, 0x90, 0xc1, - 0x65, 0x9f, 0x49, 0x9c, 0x64, 0xdb, 0x2e, 0x61, 0x71, 0x0a, 0xd4, 0x47, - 0xdb, 0x2e, 0x4b, 0xb9, 0xd4, 0x02, 0xad, 0xef, 0xc4, 0xfb, 0xf2, 0x9d, - 0x23, 0xe9, 0x07, 0x33, 0x25, 0x7d, 0x8b, 0x3c, 0x0b, 0x3c, 0x36, 0xc0, - 0x31, 0xb9, 0x14, 0xec, 0x7d, 0xfe, 0x4e, 0x2a, 0xb3, 0x7b, 0x7c, 0x24, - 0x1e, 0xba, 0xc1, 0x5d, 0x9a, 0x3b, 0x29, 0x39, 0xd9, 0x9b, 0xea, 0x27, - 0x8f, 0xd2, 0xbc, 0xc0, 0x16, 0x93, 0x90, 0x5e, 0x20, 0x6e, 0x42, 0x6f, - 0x1b, 0x89, 0xe4, 0x2b, 0x1b, 0xe2, 0x6d, 0xe8, 0x82, 0xdb, 0x67, 0x03, - 0x5f, 0x5b, 0xb4, 0x51, 0xf5, 0xb5, 0x53, 0x1e, 0xaa, 0x29, 0x6e, 0x54, - 0xd1, 0xc0, 0xff, 0x28, 0x98, 0xbe, 0x9c, 0x9d, 0x35, 0x9c, 0x0e, 0xee, - 0x78, 0xdd, 0x19, 0x05, 0x30, 0x7d, 0x2c, 0x19, 0xf2, 0xb0, 0xb4, 0x56, - 0xab, 0x78, 0x09, 0x65, 0xb1, 0x01, 0x3a, 0xbd, 0x60, 0xd9, 0x0e, 0x5b, - 0x7d, 0x1a, 0xc0, 0x47, 0x7d, 0x12, 0x1b, 0xc0, 0x6f, 0x9f, 0xac, 0xb7, - 0xf2, 0x23, 0x4e, 0x15, 0x67, 0x70, 0x8a, 0xc5, 0xf4, 0x8f, 0x0e, 0x7f, - 0xe2, 0xc9, 0xa7, 0xbb, 0x2c, 0x89, 0x73, 0x00, 0xfc, 0xf2, 0x72, 0xd5, - 0xd6, 0x5f, 0x38, 0xbe, 0x4c, 0xed, 0x53, 0xfc, 0xa3, 0x0b, 0x09, 0x19, - 0x75, 0x01, 0x81, 0x89, 0xc9, 0x57, 0x46, 0x3c, 0x3e, 0xc6, 0x19, 0xd3, - 0x16, 0xcc, 0x75, 0x5f, 0x8a, 0xcb, 0xde, 0x74, 0xec, 0x1c, 0x3f, 0xb1, - 0xee, 0xc1, 0xe6, 0x56, 0x13, 0xce, 0x7d, 0xf6, 0x53, 0xbc, 0x59, 0x6c, - 0xb5, 0xd0, 0x88, 0x10, 0x6d, 0x72, 0xf9, 0xae, 0x16, 0x29, 0x04, 0x82, - 0xdf, 0x7f, 0x6d, 0x95, 0x2b, 0x86, 0x96, 0xba, 0xd1, 0x82, 0x2d, 0xdc, - 0xb9, 0x6a, 0xf8, 0xd6, 0x00, 0x97, 0x5c, 0x03, 0xe8, 0x6b, 0xd4, 0xf6, - 0x8f, 0x44, 0xe7, 0x96, 0xb4, 0xa0, 0x85, 0xa8, 0x30, 0x77, 0x37, 0x0d, - 0x4c, 0x1c, 0x1d, 0xe4, 0x81, 0x6e, 0x10, 0xd9, 0x8d, 0x84, 0xca, 0x97, - 0x7f, 0x53, 0xaf, 0x63, 0x14, 0xfd, 0x85, 0x53, 0x75, 0x35, 0x0b, 0xc5, - 0xfc, 0x53, 0xc7, 0x28, 0xc4, 0x4a, 0xe9, 0xaa, 0x8b, 0xe7, 0xc0, 0x64, - 0x2b, 0x7a, 0x57, 0x8c, 0xfd, 0x66, 0xdd, 0x9c, 0x72, 0x1f, 0x04, 0x47, - 0x27, 0xee, 0x75, 0x0a, 0x42, 0xc6, 0xf8, 0x57, 0x05, 0x77, 0x4b, 0x03, - 0x38, 0xcc, 0x7f, 0xfc, 0x6a, 0xad, 0xe6, 0xce, 0xf5, 0x7c, 0xc5, 0x02, - 0x99, 0x62, 0x3f, 0xfa, 0xb6, 0xba, 0xe1, 0x17, 0xe9, 0xd0, 0x4a, 0xff, - 0x4d, 0x39, 0x3a, 0x45, 0xd1, 0x3f, 0xf9, 0x5e, 0x79, 0xbb, 0xb0, 0xe7, - 0xed, 0x53, 0x22, 0xcb, 0x9a, 0x4d, 0xa7, 0x01, 0x3b, 0x50, 0xa6, 0x05, - 0xd4, 0xcf, 0x21, 0x9e, 0x9d, 0xa0, 0xc9, 0x08, 0x02, 0xd9, 0x8f, 0xbd, - 0x03, 0xed, 0x47, 0x3c, 0x71, 0x58, 0x1c, 0x03, 0x6a, 0xfe, 0x5c, 0x92, - 0x38, 0x01, 0xb7, 0xab, 0x74, 0x4b, 0x4d, 0x2f, 0xad, 0x66, 0xfc, 0x18, - 0xf0, 0xe6, 0x80, 0xb1, 0x59, 0x8f, 0xe7, 0xb2, 0x74, 0x99, 0x55, 0xfe, - 0x91, 0x45, 0xed, 0x32, 0x11, 0xa1, 0x97, 0x70, 0x50, 0xc3, 0x81, 0x31, - 0x70, 0xc0, 0x9e, 0xdc, 0x4c, 0x49, 0x0d, 0xdd, 0x99, 0x06, 0x2f, 0xa4, - 0x3d, 0x86, 0x07, 0x82, 0x3a, 0x61, 0x46, 0x06, 0x57, 0xeb, 0xde, 0xd4, - 0x15, 0x35, 0x19, 0x89, 0xd3, 0x97, 0xda, 0xce, 0x7d, 0xf0, 0xea, 0x79, - 0x7e, 0x09, 0x62, 0x00, 0x63, 0x32, 0x05, 0x42, 0x36, 0x36, 0x8d, 0x43, - 0x2e, 0xfb, 0xe7, 0xde, 0xd6, 0xcd, 0x73, 0xb8, 0xc8, 0x10, 0x2a, 0xe3, - 0x28, 0x7d, 0x74, 0x79, 0x04, 0x52, 0x70, 0x79, 0xa8, 0x25, 0x80, 0x04, - 0xcf, 0x93, 0x0f, 0x07, 0x0c, 0xbe, 0xda, 0x16, 0xb7, 0xf0, 0x1d, 0x4d, - 0x21, 0x0e, 0x63, 0xa7, 0x27, 0x9b, 0xe6, 0xb0, 0xcf, 0x11, 0x0f, 0x8e, - 0xfb, 0x0f, 0xb3, 0x60, 0x69, 0xa5, 0x8a, 0xc2, 0x57, 0xbf, 0x03, 0x5d, - 0x8e, 0x58, 0xbb, 0x47, 0xe7, 0xf3, 0xdd, 0x6e, 0x43, 0x1a, 0xe1, 0xdd, - 0x32, 0x96, 0x08, 0xba, 0xdb, 0x31, 0xf6, 0xd7, 0xcd, 0x28, 0xe3, 0x33, - 0x73, 0x15, 0x48, 0x9f, 0x69, 0x03, 0x35, 0x4f, 0xd8, 0xe4, 0xe0, 0x29, - 0x0c, 0xb0, 0x24, 0x7b, 0xbc, 0x62, 0xcd, 0xe3, 0x20, 0x03, 0x28, 0xd8, - 0xcd, 0x19, 0xee, 0xf3, 0xd9, 0x85, 0xd9, 0xf7, 0xe2, 0x5e, 0x5f, 0x27, - 0x7a, 0xac, 0xe6, 0x40, 0xcb, 0xaf, 0x3e, 0x3d, 0x7a, 0x51, 0x3e, 0xf6, - 0xf0, 0xfd, 0x7e, 0x9c, 0xf6, 0xa4, 0x2a, 0x9c, 0xa5, 0x87, 0x2e, 0xb1, - 0xb8, 0x1b, 0xc0, 0xfc, 0x74, 0x16, 0xc7, 0x00, 0x4d, 0x22, 0xba, 0xac, - 0x63, 0xea, 0xbd, 0x6c, 0xe8, 0xee, 0x3b, 0x0c, 0x0e, 0x71, 0x27, 0x9f, - 0xe3, 0xba, 0xf5, 0x80, 0x6c, 0x2e, 0x92, 0xe5, 0xc9, 0xe0, 0xe6, 0xce, - 0x89, 0x51, 0xad, 0xd6, 0x99, 0x71, 0xd9, 0x98, 0x4f, 0x34, 0x72, 0xb7, - 0xd5, 0x3e, 0xc9, 0x8b, 0xa1, 0x1c, 0xbe, 0xc8, 0x15, 0xa9, 0x4d, 0xe7, - 0x0c, 0x29, 0x82, 0xb3, 0x56, 0x47, 0x4b, 0x45, 0xa2, 0xa2, 0x6f, 0x0a, - 0xab, 0xae, 0x03, 0xa3, 0x54, 0x74, 0xb0, 0xd6, 0xcd, 0xce, 0xb0, 0xcd, - 0xb0, 0x7c, 0xfc, 0x77, 0xaf, 0xc7, 0x7c, 0xf8, 0xd3, 0xf5, 0xa7, 0x6e, - 0x04, 0x4c, 0x11, 0x4e, 0x1c, 0x12, 0x77, 0xdd, 0x28, 0xf4, 0x3f, 0xf2, - 0x9d, 0x06, 0xaa, 0x91, 0x9f, 0x4d, 0x31, 0xa2, 0xe1, 0x72, 0x50, 0x28, - 0x3c, 0x58, 0x9e, 0x34, 0x2a, 0x4c, 0x9d, 0xc0, 0x27, 0x55, 0x29, 0xa4, - 0xc7, 0xf4, 0x5e, 0x7b, 0x7c, 0x5d, 0x31, 0x02, 0xb8, 0xfb, 0x43, 0x75, - 0x68, 0xaa, 0xc5, 0x3d, 0x9f, 0x90, 0x92, 0x12, 0xb9, 0x2d, 0x5f, 0x6e, - 0xe5, 0xc6, 0x1a, 0x7a, 0x65, 0xd2, 0x5b, 0x23, 0x03, 0x94, 0xd6, 0xd4, - 0x22, 0xce, 0x80, 0x7e, 0xbd, 0x4f, 0x38, 0x87, 0xd4, 0xc4, 0xcf, 0x81, - 0xb8, 0x93, 0xb5, 0xfe, 0xdf, 0x0b, 0x71, 0x61, 0xa4, 0xe8, 0xcd, 0x18, - 0xa6, 0x21, 0x3f, 0x45, 0x22, 0xd6, 0x0c, 0xe1, 0x14, 0x74, 0xbb, 0x5e, - 0x2b, 0x09, 0x3d, 0x8d, 0x7b, 0x13, 0xdd, 0x58, 0xad, 0x5c, 0x94, 0x91, - 0x9c, 0x79, 0xc2, 0x84, 0x88, 0x21, 0x04, 0xd2, 0x1f, 0x85, 0xb5, 0xdf, - 0x84, 0xe0, 0xd3, 0x35, 0x93, 0x16, 0x16, 0x3a, 0xb0, 0x81, 0xab, 0x33, - 0x5e, 0x5c, 0xad, 0x54, 0x2a, 0x4d, 0xcc, 0xa8, 0x95, 0xf0, 0x61, 0x78, - 0x9b, 0x07, 0xb5, 0xc6, 0x6a, 0xdf, 0x0e, 0xa6, 0x61, 0xe7, 0x0b, 0x23, - 0x0d, 0x0f, 0xfb, 0xee, 0x0c, 0x8b, 0x12, 0xcc, 0x6a, 0x87, 0x36, 0xc7, - 0x3a, 0xe3, 0xda, 0xf0, 0xdc, 0x52, 0x4b, 0x11, 0x2e, 0x48, 0x08, 0x94, - 0x1b, 0xdd, 0x83, 0x65, 0x6a, 0xed, 0x6f, 0xbc, 0x0c, 0x48, 0x7f, 0xfa, - 0xd0, 0xe4, 0x9b, 0x38, 0xd9, 0x91, 0x30, 0x44, 0xa8, 0x91, 0x5e, 0x2d, - 0x16, 0xaf, 0xc7, 0xe2, 0xb7, 0x14, 0x1a, 0xdf, 0xf3, 0xf7, 0x18, 0xce, - 0x64, 0x51, 0x92, 0xd2, 0xc1, 0xa5, 0x05, 0x9f, 0x63, 0xe5, 0x0e, 0x20, - 0x7c, 0x64, 0xdb, 0x60, 0x76, 0x8d, 0x9d, 0xe0, 0x45, 0xfd, 0x26, 0xea, - 0x15, 0x0e, 0x92, 0x92, 0x9c, 0xed, 0x54, 0x65, 0x05, 0xaf, 0x0b, 0x3d, - 0xf7, 0xba, 0x3d, 0x02, 0xbe, 0x1d, 0x1f, 0x53, 0x11, 0xe6, 0x19, 0x96, - 0x89, 0xad, 0xc9, 0x04, 0x0e, 0x94, 0x05, 0xdc, 0x76, 0xa3, 0x6c, 0x5e, - 0xcc, 0x64, 0xf6, 0xb3, 0x10, 0xd1, 0xe7, 0xa5, 0xa1, 0xe3, 0xaa, 0xd8, - 0x19, 0x14, 0x30, 0x52, 0x3b, 0xcb, 0xc0, 0x54, 0x4f, 0xf9, 0x01, 0xaa, - 0x99, 0x41, 0x6d, 0xce, 0xaf, 0x1b, 0xf8, 0x59, 0x14, 0x1c, 0x9b, 0x9f, - 0x63, 0xba, 0x29, 0x81, 0x5b, 0x07, 0xb4, 0xdd, 0xa2, 0xd4, 0x02, 0xa6, - 0xbf, 0xe6, 0xed, 0x4b, 0xf9, 0x35, 0x71, 0xa2, 0xa4, 0x49, 0xc3, 0x2c, - 0x78, 0xab, 0xc4, 0x10, 0x54, 0x55, 0xcb, 0xd7, 0x7d, 0x83, 0x65, 0x0f, - 0xe6, 0xa5, 0x6f, 0xee, 0x15, 0x9e, 0x40, 0xcc, 0x8c, 0x5f, 0x8e, 0x4d, - 0x3c, 0x28, 0x13, 0x49, 0x28, 0x4c, 0xda, 0x20, 0xca, 0x1f, 0x1d, 0xd0, - 0x54, 0x49, 0xa1, 0x28, 0x72, 0x0e, 0xe0, 0xc4, 0x3c, 0x96, 0xbe, 0x05, - 0xa2, 0xc9, 0xfa, 0x84, 0x51, 0x70, 0x2d, 0x09, 0xc4, 0x2f, 0x70, 0x8d, - 0x11, 0x01, 0x58, 0xdf, 0x2b, 0x36, 0x92, 0x3d, 0x6f, 0x33, 0x42, 0x1b, - 0x87, 0x15, 0x00, 0x07, 0x22, 0xdf, 0xc4, 0x4f, 0x07, 0x48, 0x48, 0x18, - 0x67, 0x9c, 0xcf, 0x1f, 0x44, 0x99, 0x2a, 0x6a, 0x9d, 0x47, 0x77, 0x6a, - 0xad, 0x38, 0x7c, 0x9a, 0x95, 0x04, 0xfc, 0x42, 0xd3, 0xcf, 0x22, 0x1e, - 0x29, 0x58, 0x5f, 0x8d, 0x90, 0x0d, 0x0a, 0x27, 0x5f, 0xff, 0xcf, 0xa2, - 0xfa, 0x60, 0xc1, 0x36, 0x79, 0xd5, 0xd1, 0x15, 0x13, 0x9e, 0xdb, 0x53, - 0xbf, 0x89, 0xca, 0x8d, 0xc4, 0x0b, 0xa9, 0x40, 0xa7, 0xcb, 0x46, 0x21, - 0x95, 0x6b, 0xb4, 0xd1, 0x98, 0x97, 0x9e, 0xbb, 0x48, 0x83, 0xc1, 0x1e, - 0xa8, 0xc5, 0xce, 0x1b, 0xce, 0xc1, 0x51, 0xd5, 0xea, 0xc0, 0xa5, 0xd4, - 0x86, 0x74, 0x1b, 0x73, 0x34, 0x45, 0xa9, 0x24, 0xbd, 0xfc, 0x3b, 0xfb, - 0x55, 0x36, 0x9b, 0x72, 0xae, 0x78, 0x66, 0xb4, 0xb2, 0x5d, 0x70, 0xec, - 0x14, 0xdb, 0x23, 0x0a, 0x91, 0x8d, 0xa1, 0x6f, 0xcf, 0x3e, 0x49, 0x05, - 0xd2, 0xed, 0x4c, 0xdb, 0x51, 0x47, 0x2a, 0xf9, 0xc8, 0xcb, 0x1a, 0x1b, - 0x0f, 0x71, 0x8b, 0xaf, 0xe9, 0xb1, 0xb9, 0x71, 0x3b, 0xb8, 0x2e, 0x32, - 0xc5, 0xd4, 0xec, 0xcd, 0x79, 0x72, 0x2c, 0x9d, 0x1a, 0x8f, 0xdc, 0x04, - 0x79, 0x6e, 0xbb, 0x5a, 0x55, 0x20, 0x12, 0xda, 0x0d, 0x3c, 0xae, 0x42, - 0x21, 0xd8, 0x41, 0x80, 0xfc, 0x7a, 0x38, 0x74, 0x61, 0x7a, 0xac, 0xc3, - 0xe7, 0x82, 0xf5, 0xbb, 0xbe, 0xfa, 0xee, 0x97, 0x74, 0x94, 0xbe, 0x12, - 0xec, 0x85, 0x05, 0x50, 0x6d, 0xf1, 0x35, 0x22, 0x94, 0x76, 0x75, 0xfa, - 0x0a, 0x7a, 0xf0, 0x57, 0xee, 0x9b, 0x7f, 0xfc, 0xdd, 0x14, 0x54, 0x29, - 0x05, 0xb2, 0x58, 0x98, 0xda, 0xf9, 0x69, 0xab, 0x6b, 0xff, 0x01, 0x15, - 0x58, 0x9b, 0xcd, 0x60, 0xeb, 0x5c, 0x8d, 0x11, 0xc6, 0x34, 0x88, 0xfe, - 0xdd, 0xda, 0x8b, 0x91, 0x09, 0xd9, 0xb0, 0xad, 0x01, 0x11, 0x37, 0x14, - 0x65, 0x35, 0x74, 0xc0, 0x8e, 0x55, 0x5b, 0x7f, 0x15, 0x20, 0xeb, 0xeb, - 0x5b, 0xb7, 0x30, 0x4e, 0xf6, 0x1d, 0xdc, 0x74, 0x51, 0x14, 0xe3, 0x4a, - 0x20, 0x52, 0xd3, 0xba, 0xfe, 0x88, 0x08, 0x92, 0x77, 0x36, 0xf8, 0xe0, - 0x08, 0x99, 0x47, 0xc8, 0x58, 0xd2, 0xd6, 0xbc, 0x89, 0xe9, 0x62, 0xe9, - 0xca, 0x3a, 0x21, 0x52, 0x1c, 0xfa, 0x78, 0x75, 0xac, 0xb3, 0x76, 0xaa, - 0xe9, 0x03, 0x83, 0x66, 0x3a, 0xcf, 0x34, 0xeb, 0x2d, 0x3d, 0x66, 0xd7, - 0x4d, 0xff, 0x3f, 0xaf, 0x26, 0x7c, 0x1b, 0xfa, 0x71, 0xc4, 0xca, 0xc5, - 0x1f, 0xc1, 0x1c, 0xe2, 0xd4, 0x09, 0x5b, 0x57, 0xc4, 0x62, 0x8c, 0x8c, - 0x1e, 0xaf, 0xe8, 0x7d, 0x4b, 0xca, 0x1c, 0x89, 0xe3, 0x5d, 0xfd, 0x19, - 0x79, 0x1a, 0x0a, 0x41, 0x69, 0x4a, 0xc1, 0xbb, 0xb1, 0xf7, 0x18, 0x2c, - 0xa2, 0x8f, 0x82, 0xc4, 0x06, 0xa4, 0x95, 0xaf, 0xe8, 0x0e, 0x09, 0xa5, - 0xe6, 0xa9, 0x6e, 0x02, 0x3f, 0x86, 0xad, 0x98, 0x1f, 0xb4, 0xbb, 0x4f, - 0x19, 0x7b, 0x8e, 0x65, 0x0c, 0xbb, 0x01, 0x75, 0xa4, 0xcc, 0x0e, 0x59, - 0xef, 0xf6, 0xf2, 0x0b, 0x45, 0xa2, 0xdc, 0x5e, 0x2c, 0x29, 0xbb, 0x56, - 0x5a, 0xef, 0x6e, 0x42, 0x83, 0xa0, 0x38, 0x41, 0x41, 0x09, 0x13, 0xf9, - 0x77, 0x8f, 0x79, 0xb0, 0x7e, 0x0d, 0x9d, 0x24, 0xed, 0x5a, 0x19, 0x3d, - 0x58, 0xf7, 0x0d, 0x4a, 0x96, 0x6e, 0x98, 0x33, 0x62, 0xe9, 0x99, 0x29, - 0x35, 0xd0, 0x81, 0xb2, 0x21, 0x73, 0x5e, 0x54, 0x61, 0x29, 0xad, 0x12, - 0xd5, 0x82, 0xc8, 0x5e, 0xfc, 0x71, 0xf8, 0x22, 0x53, 0x70, 0x0f, 0xf1, - 0xa8, 0x3b, 0x15, 0xac, 0x22, 0xdf, 0xa9, 0x2c, 0x76, 0xf9, 0x7a, 0xd2, - 0x46, 0xcf, 0x31, 0x0e, 0x5c, 0x3f, 0xcd, 0x05, 0x92, 0x33, 0xb8, 0x5d, - 0xc0, 0x86, 0xa4, 0xbe, 0x35, 0x94, 0x09, 0x50, 0x77, 0x58, 0x28, 0x91, - 0x7d, 0x19, 0x04, 0x9c, 0xa4, 0xfa, 0xb6, 0x19, 0x9b, 0xa9, 0xb5, 0xe5, - 0xb6, 0x31, 0x10, 0xb3, 0x61, 0x93, 0x72, 0x6c, 0xe7, 0x68, 0xeb, 0x7f, - 0xed, 0xbe, 0x33, 0x93, 0xf7, 0x53, 0x8a, 0x74, 0x2e, 0x33, 0x31, 0x27, - 0x93, 0x97, 0xbb, 0xa4, 0x0e, 0x2b, 0x78, 0x79, 0x3c, 0x0a, 0xd3, 0x66, - 0xf7, 0x42, 0x9f, 0x42, 0x10, 0x96, 0x5c, 0x0c, 0x58, 0xf9, 0x43, 0xef, - 0x22, 0xd1, 0xde, 0xd5, 0x73, 0x14, 0xdc, 0x9c, 0xc5, 0xd7, 0xe3, 0x0c, - 0xa4, 0xba, 0x99, 0x9c, 0xd6, 0xec, 0xa4, 0x9b, 0xca, 0x3a, 0x79, 0xb9, - 0xa1, 0xdb, 0xb2, 0x5b, 0x7b, 0x71, 0xc6, 0x49, 0xd5, 0x05, 0x9d, 0x3f, - 0x1a, 0x8c, 0x6e, 0xb6, 0xbf, 0xc8, 0xf9, 0xde, 0x21, 0x79, 0xa7, 0x65, - 0xe2, 0x37, 0xb5, 0xb3, 0x9b, 0x61, 0x56, 0x8c, 0x1b, 0xc0, 0xfb, 0x6b, - 0x92, 0x6e, 0x79, 0x4c, 0x4a, 0x0a, 0xbb, 0x47, 0x4c, 0xa1, 0x77, 0xa5, - 0x13, 0x46, 0x37, 0xc9, 0x7d, 0x71, 0x0e, 0xbb, 0x5c, 0xf1, 0xfd, 0x43, - 0x48, 0x58, 0xb1, 0xf6, 0x67, 0x5c, 0x42, 0xd7, 0x85, 0x8d, 0x71, 0x41, - 0x1a, 0x68, 0x45, 0x18, 0x38, 0x5f, 0x5e, 0x63, 0x96, 0xfa, 0xa4, 0x55, - 0xca, 0xf0, 0x8a, 0x0c, 0x3c, 0x4d, 0x32, 0x76, 0x95, 0x4c, 0x70, 0xf0, - 0xbc, 0xce, 0x21, 0x00, 0x5f, 0xc1, 0xc8, 0x19, 0x97, 0x26, 0xb9, 0xaa, - 0x87, 0xf2, 0x4a, 0x7d, 0xbb, 0x4b, 0x76, 0xef, 0x63, 0x68, 0x54, 0xb6, - 0xde, 0x82, 0x50, 0xa7, 0x08, 0x53, 0x0b, 0x64, 0x31, 0x5a, 0x89, 0xbf, - 0x03, 0xe7, 0x86, 0x9e, 0x22, 0xfe, 0x0c, 0x89, 0xf5, 0x36, 0x2a, 0xfd, - 0x91, 0x2c, 0x29, 0x86, 0xaf, 0x3f, 0xa5, 0x48, 0xa7, 0xec, 0xbf, 0xfc, - 0x52, 0xc8, 0x61, 0xe0, 0xc2, 0x59, 0x3e, 0x35, 0x93, 0x5c, 0xd2, 0xdd, - 0x39, 0x39, 0xf1, 0x16, 0x71, 0x3e, 0x5c, 0xec, 0x9c, 0x2c, 0x95, 0xc4, - 0x50, 0xa1, 0xba, 0x1d, 0x9b, 0x01, 0x79, 0xbd, 0xdb, 0x43, 0x70, 0xcf, - 0xe0, 0x73, 0x03, 0x59, 0x38, 0x33, 0x7e, 0xb3, 0xc0, 0xc9, 0xaf, 0x66, - 0x9f, 0x46, 0x41, 0x34, 0x31, 0x0c, 0xab, 0xdf, 0x77, 0x5e, 0xe4, 0x41, - 0xfc, 0xa9, 0x4f, 0xbc, 0x27, 0x2b, 0x81, 0xbe, 0xad, 0xca, 0xb4, 0x81, - 0x5a, 0x4a, 0x1a, 0xc5, 0xf8, 0xe3, 0x96, 0xe4, 0x7d, 0xe2, 0x01, 0x54, - 0x88, 0x22, 0x96, 0x44, 0x55, 0x74, 0x01, 0x6a, 0xfb, 0xb0, 0x23, 0xc2, - 0x0f, 0x89, 0x95, 0xdf, 0xbf, 0x1d, 0xfa, 0x40, 0xf8, 0xad, 0xef, 0xe4, - 0xe6, 0x91, 0xe3, 0xbe, 0x92, 0xa1, 0xd9, 0x4c, 0x27, 0x60, 0x12, 0x90, - 0x6d, 0xbd, 0xf8, 0xba, 0x82, 0x55, 0x82, 0x66, 0x48, 0x9e, 0xc0, 0x96, - 0xdb, 0xd4, 0xb7, 0xe9, 0xb5, 0xe6, 0x9f, 0x7d, 0x60, 0x93, 0x98, 0x38, - 0x8f, 0x08, 0x82, 0xd1, 0xad, 0xea, 0x5b, 0xb2, 0xa3, 0xd1, 0x8b, 0x16, - 0x58, 0xa7, 0x46, 0xaf, 0x57, 0x80, 0xf4, 0x6c, 0x8d, 0x76, 0x25, 0xa3, - 0x37, 0xfc, 0xf4, 0x6d, 0x92, 0x49, 0xc0, 0x80, 0x98, 0xfd, 0x7e, 0x26, - 0x33, 0x7d, 0xee, 0x26, 0xa8, 0x6d, 0x18, 0x2c, 0xac, 0xdf, 0x28, 0xee, - 0x71, 0x26, 0x5f, 0xe9, 0x3a, 0x0c, 0xec, 0xad, 0x1c, 0x37, 0xf5, 0x71, - 0xf5, 0xb3, 0xb0, 0x70, 0xe2, 0xbb, 0x0f, 0xcb, 0x97, 0x40, 0x5d, 0x63, - 0x46, 0x28, 0x04, 0x61, 0x35, 0x4b, 0x23, 0x06, 0x6b, 0x69, 0xbc, 0x28, - 0xa3, 0xe7, 0xf1, 0x6c, 0x00, 0x0a, 0x0c, 0xb5, 0x31, 0xb2, 0x8e, 0x3b, - 0xfe, 0xe7, 0xcc, 0x26, 0x60, 0x5c, 0x45, 0xad, 0xd8, 0x25, 0x2e, 0xf8, - 0x7c, 0xb5, 0x19, 0x49, 0x42, 0xc4, 0x12, 0x14, 0xd4, 0xe2, 0x82, 0xa4, - 0xb4, 0x26, 0x67, 0x34, 0x1d, 0x8c, 0x8e, 0xab, 0xab, 0xe5, 0xc7, 0x8e, - 0xbe, 0x11, 0x73, 0x84, 0xff, 0x07, 0x72, 0x5b, 0xfe, 0x33, 0x6a, 0xf6, - 0xd1, 0x4a, 0xf1, 0xb6, 0x08, 0xe1, 0x3d, 0xf7, 0x26, 0x49, 0x46, 0x8d, - 0xf7, 0x71, 0xdc, 0x33, 0x04, 0x90, 0x30, 0x7c, 0x83, 0xf5, 0xe3, 0xca, - 0xac, 0x8e, 0x03, 0x7a, 0x4b, 0xe1, 0xf8, 0x70, 0xbd, 0x33, 0x42, 0xc1, - 0x9d, 0x6a, 0x66, 0xe4, 0xcf, 0x9d, 0xfa, 0xc9, 0xd7, 0x5f, 0xce, 0xba, - 0x7d, 0xa1, 0x90, 0x04, 0x2d, 0xbb, 0xaf, 0x65, 0x47, 0x6d, 0x54, 0x21, - 0xad, 0xb4, 0x98, 0x5b, 0x39, 0xb1, 0x92, 0x9f, 0x1b, 0x1d, 0x2d, 0x3a, - 0xad, 0x5a, 0x41, 0x91, 0x3f, 0x69, 0xd3, 0xf5, 0x7e, 0x41, 0xb5, 0xfb, - 0x23, 0xfb, 0xfd, 0x0c, 0x6b, 0x05, 0x43, 0xbd, 0x77, 0xf7, 0x2a, 0x71, - 0x7e, 0x7e, 0x45, 0x02, 0xc0, 0x68, 0x50, 0xc6, 0x93, 0xfe, 0xde, 0x29, - 0x62, 0x37, 0xf0, 0x3d, 0xab, 0x65, 0x7e, 0xae, 0x5f, 0x89, 0x03, 0x2a, - 0xb8, 0x88, 0x36, 0xcf, 0x3a, 0xe4, 0xb0, 0xd9, 0x44, 0x4f, 0xf7, 0xc1, - 0x65, 0xe6, 0x68, 0x08, 0x1b, 0x22, 0xa2, 0xc3, 0x3f, 0x72, 0x20, 0x83, - 0x57, 0x61, 0xe4, 0x4f, 0x1d, 0x0f, 0x2f, 0x89, 0xe2, 0x8b, 0x83, 0x6b, - 0x9f, 0x03, 0xfc, 0xc8, 0xcd, 0x89, 0x18, 0x0e, 0xa8, 0x75, 0x5a, 0x37, - 0x2c, 0x7c, 0x1f, 0xc1, 0xea, 0xbe, 0x10, 0xad, 0x28, 0x00, 0xf6, 0x10, - 0x5d, 0x50, 0xcb, 0x9f, 0x44, 0xae, 0xef, 0xe9, 0xc1, 0xfc, 0x7d, 0xf1, - 0x59, 0x7c, 0x20, 0xde, 0x08, 0x32, 0xbd, 0x52, 0x00, 0xe7, 0x0e, 0x66, - 0x35, 0xff, 0x3b, 0xd2, 0x57, 0x09, 0xbb, 0x79, 0x4c, 0x37, 0xcc, 0x27, - 0xb9, 0xdb, 0xe7, 0x0d, 0xe5, 0x38, 0x4f, 0x60, 0xfe, 0x18, 0x6f, 0x17, - 0x97, 0x64, 0x58, 0x6a, 0xc3, 0x7c, 0x7a, 0x81, 0x30, 0x67, 0xa5, 0xc1, - 0xfb, 0x4d, 0x07, 0xa2, 0x33, 0xd0, 0x5d, 0x4d, 0x6a, 0x18, 0xdf, 0x35, - 0x6a, 0x32, 0x29, 0xe7, 0x57, 0x46, 0x52, 0x3e, 0x0f, 0xc1, 0x5b, 0xe1, - 0x9f, 0x83, 0x75, 0x56, 0x78, 0x25, 0x4f, 0xba, 0xb5, 0xf1, 0xde, 0xf9, - 0xeb, 0x37, 0x61, 0x73, 0xba, 0xec, 0x47, 0xb4, 0x04, 0xb1, 0x20, 0xb3, - 0xc1, 0x54, 0x4d, 0x71, 0x89, 0xc4, 0x0d, 0xcc, 0xb9, 0x69, 0xe7, 0x96, - 0x3d, 0x42, 0xea, 0x04, 0x8a, 0xf1, 0xf5, 0x88, 0xa4, 0xed, 0xbc, 0x17, - 0x4e, 0x8d, 0x1e, 0x2c, 0xb1, 0x32, 0x61, 0x80, 0xfd, 0xa2, 0x04, 0x59, - 0xf9, 0xbd, 0x74, 0x36, 0x3a, 0x8a, 0x08, 0x62, 0xc2, 0x62, 0xa2, 0xad, - 0x57, 0xbf, 0x5b, 0x44, 0xda, 0xd3, 0xcd, 0x3c, 0xa3, 0xab, 0xec, 0x88, - 0xa3, 0xac, 0xae, 0xb3, 0xa8, 0x98, 0x1d, 0x47, 0x80, 0x05, 0xf3, 0x4d, - 0x0d, 0xa6, 0xef, 0x15, 0x14, 0x84, 0x19, 0x23, 0xdd, 0x1c, 0x30, 0x6f, - 0x6e, 0xc5, 0xe3, 0xac, 0xb3, 0xb7, 0xef, 0xbe, 0x35, 0x54, 0xea, 0x6e, - 0xab, 0x46, 0xde, 0x50, 0xb2, 0x04, 0xf9, 0x8c, 0xab, 0x92, 0x3e, 0x38, - 0x9b, 0x68, 0xd9, 0xe0, 0x75, 0x2c, 0xd4, 0xf9, 0xa4, 0x17, 0xf9, 0x09, - 0x62, 0x6b, 0x7c, 0x22, 0x3c, 0x28, 0x38, 0xcf, 0x58, 0xfc, 0x54, 0x85, - 0x51, 0xf6, 0x89, 0x72, 0x2f, 0x91, 0x89, 0xa7, 0xa9, 0x6f, 0x54, 0x7e, - 0xc9, 0x89, 0x57, 0xfc, 0xff, 0x85, 0x74, 0x36, 0x76, 0x72, 0xeb, 0xb4, - 0x71, 0x81, 0x4c, 0xe5, 0xaa, 0xca, 0xa1, 0x9a, 0x43, 0x9d, 0xfb, 0xd6, - 0xd3, 0x20, 0xd1, 0xd0, 0x2c, 0x40, 0xed, 0x44, 0x73, 0x76, 0x6c, 0x10, - 0xc7, 0x3c, 0xf5, 0xb0, 0xb4, 0x26, 0x1b, 0x62, 0x1d, 0xed, 0xfb, 0xcc, - 0x67, 0x79, 0x63, 0xed, 0xb0, 0xb2, 0x9f, 0xea, 0xcb, 0xa5, 0x81, 0xd0, - 0x3a, 0x7d, 0x99, 0xda, 0xb3, 0x6d, 0x2d, 0xe9, 0x32, 0x0f, 0x71, 0xd8, - 0x9e, 0x06, 0xfd, 0xd3, 0x6d, 0x92, 0xaa, 0x7f, 0xfa, 0x00, 0x2c, 0xef, - 0xea, 0x81, 0x2c, 0x4c, 0x1e, 0x67, 0xe9, 0x9c, 0xc0, 0x71, 0x98, 0xe9, - 0x74, 0x5f, 0xdd, 0x7a, 0x5e, 0x44, 0x47, 0xe4, 0x7f, 0xcc, 0x57, 0x97, - 0x2b, 0x49, 0xda, 0x92, 0xc3, 0x1b, 0x0e, 0x01, 0x53, 0x12, 0xbe, 0xb6, - 0x63, 0x82, 0xec, 0xe1, 0xb6, 0xe7, 0x64, 0x59, 0xe6, 0xa5, 0xa0, 0xeb, - 0xe6, 0xd8, 0x11, 0x30, 0xf1, 0xae, 0x0d, 0xc0, 0x53, 0x48, 0x5c, 0x31, - 0x83, 0xc4, 0x33, 0x9e, 0xf4, 0x3a, 0x24, 0xb2, 0xa2, 0x3f, 0x8d, 0x29, - 0x9f, 0x49, 0x06, 0x03, 0x7e, 0xcd, 0x33, 0xca, 0x2e, 0xa5, 0x2e, 0xb0, - 0x0f, 0x06, 0xf4, 0x52, 0xc3, 0xe3, 0x85, 0x28, 0x73, 0xb4, 0x19, 0xf6, - 0xfa, 0xe8, 0x83, 0xcd, 0xb7, 0xf6, 0x9a, 0x71, 0x0e, 0x99, 0x45, 0x51, - 0x7e, 0x46, 0x3a, 0xdb, 0xb0, 0x6c, 0xf1, 0x75, 0x46, 0xbf, 0x2b, 0x40, - 0x2c, 0x47, 0x03, 0xf5, 0x50, 0xe6, 0xed, 0xbc, 0x3d, 0x15, 0x1d, 0x00, - 0xe4, 0x5b, 0xb8, 0xd1, 0x76, 0xfa, 0xd0, 0x04, 0x25, 0x6f, 0x4b, 0x33, - 0x4b, 0x40, 0x98, 0x0a, 0xc8, 0x7e, 0x9a, 0xf0, 0x0f, 0x98, 0xb6, 0x0a, - 0x61, 0x07, 0x5a, 0xb2, 0xb9, 0x17, 0x54, 0x83, 0x23, 0x14, 0xb9, 0xe8, - 0x25, 0x55, 0xbb, 0x20, 0x13, 0x85, 0xd2, 0xbb, 0x9d, 0x06, 0x18, 0x39, - 0xe0, 0xe6, 0x24, 0x2a, 0x45, 0xc0, 0x08, 0x9e, 0x8f, 0xfd, 0xac, 0xf8, - 0xc5, 0xae, 0xdc, 0xe3, 0x0a, 0xb4, 0xe0, 0x38, 0x38, 0x53, 0xf8, 0x5b, - 0x3a, 0x71, 0x9b, 0x0c, 0x03, 0x5b, 0x0b, 0xe5, 0xab, 0x00, 0x8e, 0xec, - 0x75, 0xf4, 0x83, 0x7a, 0x1b, 0x0a, 0x15, 0x1e, 0xaf, 0xbb, 0x1d, 0x5a, - 0x07, 0x43, 0xe2, 0x9f, 0xd7, 0x87, 0x25, 0x88, 0x5d, 0x3f, 0x94, 0x68, - 0x49, 0x02, 0x3e, 0x4e, 0x8c, 0xc2, 0xbc, 0x37, 0x7f, 0xfd, 0x30, 0x59, - 0x47, 0x41, 0xfc, 0xa6, 0xc9, 0x01, 0x97, 0x6c, 0x72, 0x7d, 0x9c, 0x92, - 0x85, 0x4c, 0x7f, 0x86, 0x04, 0x73, 0x04, 0xa2, 0x70, 0xaf, 0x9f, 0x5a, - 0x5a, 0x07, 0x8e, 0xa8, 0x5b, 0x24, 0x38, 0xbe, 0x2e, 0x4c, 0x39, 0xfb, - 0x1a, 0x2f, 0x41, 0x13, 0xcc, 0x06, 0x7c, 0x92, 0x1f, 0x9c, 0x47, 0x8b, - 0x9f, 0xf3, 0xce, 0xe0, 0xa9, 0xb3, 0x3e, 0xa9, 0x97, 0xd7, 0x1f, 0x4d, - 0x2f, 0x66, 0xc8, 0xf1, 0x36, 0xe9, 0x11, 0xd5, 0x4e, 0x72, 0x9a, 0x85, - 0x7d, 0x62, 0xf3, 0x0c, 0x0b, 0xe4, 0xc7, 0x48, 0x6d, 0x7a, 0x7e, 0x2a, - 0xc6, 0x7d, 0x25, 0x58, 0xac, 0x57, 0xdf, 0x0d, 0x0a, 0x0d, 0x9e, 0x27, - 0xd1, 0xe9, 0x9f, 0x9d, 0x92, 0x31, 0xb7, 0x3d, 0x04, 0x1b, 0xbf, 0xb1, - 0x1c, 0x4b, 0x84, 0x4d, 0x09, 0x24, 0xad, 0x8d, 0x4e, 0xe0, 0xb4, 0xc7, - 0x98, 0x26, 0xc3, 0xfc, 0xc4, 0x61, 0x2f, 0xc8, 0x26, 0x24, 0x88, 0x98, - 0x96, 0x7f, 0x44, 0x73, 0xb9, 0x92, 0xa4, 0xee, 0x8d, 0x3a, 0xf3, 0x67, - 0xce, 0xd0, 0xad, 0xac, 0x7f, 0x47, 0xbd, 0x44, 0x2a, 0xc2, 0xed, 0x82, - 0xd2, 0x95, 0xaa, 0x8e, 0xd8, 0x75, 0xd7, 0xfe, 0x28, 0x40, 0x22, 0x0f, - 0x05, 0x91, 0xdf, 0xd1, 0x6b, 0x8d, 0x87, 0x06, 0x7d, 0x3b, 0x4b, 0x59, - 0x10, 0x46, 0x0d, 0x99, 0xe7, 0x36, 0xff, 0x99, 0xe7, 0xb0, 0x56, 0x92, - 0x97, 0xb4, 0xf3, 0xe3, 0x09, 0x7a, 0x4b, 0x08, 0xff, 0xf5, 0xbe, 0xf0, - 0xf1, 0xbd, 0x00, 0x02, 0xb3, 0x51, 0x9d, 0x8c, 0xfd, 0x23, 0x4d, 0x52, - 0x16, 0x6e, 0xf4, 0x82, 0x65, 0x55, 0xcb, 0x5e, 0x47, 0x5f, 0x6f, 0x57, - 0xef, 0x7d, 0x59, 0xef, 0x64, 0xae, 0xbc, 0x08, 0x8f, 0x19, 0x14, 0xec, - 0x92, 0x50, 0x0a, 0xbe, 0x13, 0x13, 0x59, 0x5f, 0x62, 0x4a, 0x54, 0xde, - 0x73, 0x3b, 0xbe, 0x20, 0x9f, 0x35, 0x22, 0xdb, 0xf8, 0x4f, 0xe4, 0x66, - 0x9f, 0x31, 0xb4, 0x81, 0x2f, 0x19, 0x21, 0x33, 0xa6, 0x7f, 0x37, 0x68, - 0xe0, 0x61, 0xb8, 0x9f, 0x00, 0x3e, 0x8a, 0x1d, 0xdc, 0x34, 0xda, 0x48, - 0xd8, 0x4a, 0x3f, 0xfb, 0xfd, 0x5f, 0x05, 0xf8, 0xce, 0x7a, 0xa9, 0x32, - 0xd8, 0xb2, 0xee, 0x73, 0x0d, 0x9f, 0x69, 0x41, 0xe0, 0x9d, 0x36, 0xac, - 0x34, 0x9f, 0x8c, 0x72, 0xf2, 0x5b, 0xec, 0x48, 0x77, 0xf0, 0x9f, 0xa8, - 0x34, 0x46, 0x25, 0x70, 0xd7, 0xfe, 0x01, 0x1a, 0xc9, 0x5f, 0x98, 0x9c, - 0x82, 0xbb, 0x78, 0x4d, 0x47, 0x9f, 0xf3, 0xd0, 0xb0, 0x3c, 0xb7, 0x82, - 0xae, 0x05, 0xc5, 0x2c, 0x69, 0xb8, 0x09, 0xc7, 0x49, 0x57, 0xe5, 0x31, - 0x8e, 0x1e, 0x94, 0x59, 0x99, 0x9f, 0x38, 0x5c, 0xee, 0xe3, 0x12, 0x0f, - 0x83, 0x3d, 0x1e, 0xe5, 0xf5, 0x50, 0xec, 0xd9, 0x61, 0xa1, 0xd2, 0xd4, - 0x15, 0x86, 0xee, 0x88, 0xb7, 0x59, 0xc5, 0x97, 0xbd, 0xcb, 0xda, 0xf7, - 0x5a, 0xde, 0x26, 0x83, 0xa5, 0x3c, 0xea, 0x57, 0xbf, 0xdb, 0x06, 0xb1, - 0xf6, 0x2f, 0xb5, 0x9e, 0xce, 0x8d, 0xdf, 0x08, 0x68, 0x47, 0x46, 0xfa, - 0x58, 0x63, 0xd4, 0xb2, 0xc0, 0xe1, 0x95, 0x2e, 0xd2, 0x73, 0xc5, 0x4f, - 0x5d, 0x02, 0xe9, 0xfc, 0xec, 0x59, 0x2b, 0x36, 0xa9, 0x78, 0x9f, 0x0a, - 0x00, 0xa3, 0xe4, 0xab, 0x4d, 0x1d, 0x14, 0xf3, 0xd5, 0x5f, 0xda, 0xa3, - 0x11, 0xfd, 0x30, 0xc5, 0x15, 0x70, 0x73, 0xe6, 0xd9, 0x42, 0x5b, 0x2e, - 0xd7, 0xf9, 0x2b, 0x74, 0xf4, 0x53, 0xbf, 0xe2, 0x8d, 0xb8, 0x25, 0x3e, - 0xce, 0xc0, 0xf9, 0x77, 0x60, 0xb9, 0x57, 0xe6, 0x23, 0xf5, 0xf5, 0x26, - 0xb1, 0x97, 0x32, 0x4b, 0xe5, 0x65, 0xa3, 0xe4, 0x79, 0x81, 0x72, 0xb8, - 0x34, 0x2d, 0xb2, 0xb1, 0x42, 0x28, 0x62, 0xc7, 0x21, 0x9b, 0x71, 0x76, - 0x74, 0xbf, 0x43, 0x42, 0x70, 0x99, 0xbb, 0x0c, 0x93, 0x0a, 0xde, 0xce, - 0x8a, 0x2c, 0x4c, 0x2c, 0xcd, 0x13, 0x5e, 0xba, 0x07, 0xe0, 0x04, 0xd4, - 0x5a, 0xa4, 0x4f, 0x81, 0x04, 0x8b, 0xa3, 0x5b, 0x05, 0x1d, 0xbc, 0xc0, - 0xad, 0xc0, 0x48, 0x91, 0xaa, 0x6f, 0x36, 0x1a, 0xc2, 0xbe, 0x80, 0x19, - 0x98, 0x28, 0xf9, 0x64, 0x72, 0x5b, 0xbf, 0x2c, 0x77, 0xad, 0x48, 0x23, - 0x5f, 0x1c, 0xb9, 0x35, 0xab, 0x22, 0xd9, 0x9f, 0x9d, 0x34, 0xca, 0x06, - 0xa3, 0x20, 0xb4, 0xe4, 0x38, 0x7c, 0xd4, 0xdd, 0xa0, 0x59, 0xae, 0x48, - 0x51, 0xde, 0xcc, 0xb6, 0xa1, 0x07, 0x66, 0xd6, 0xbc, 0xee, 0x71, 0x38, - 0x97, 0xf8, 0x16, 0x47, 0xa4, 0x51, 0x16, 0x77, 0xf9, 0x38, 0x5d, 0x51, - 0x62, 0x83, 0x01, 0x40, 0x4b, 0xb1, 0x56, 0xc7, 0x80, 0xa7, 0x2f, 0x34, - 0x77, 0xa8, 0xaa, 0x7b, 0xc3, 0x5a, 0x9d, 0xaf, 0x87, 0x38, 0x8a, 0x37, - 0x63, 0x73, 0x2d, 0x09, 0x67, 0xe9, 0x69, 0xda, 0xf7, 0x31, 0x27, 0x43, - 0x62, 0x8e, 0xc6, 0xb8, 0x7f, 0xfe, 0x61, 0x1f, 0x34, 0x9b, 0xff, 0x53, - 0x24, 0xb5, 0x8c, 0x6d, 0x8d, 0x9a, 0x4c, 0x20, 0xc6, 0x29, 0x97, 0xb3, - 0xea, 0xb7, 0x5a, 0xb0, 0x88, 0x4a, 0xe0, 0x44, 0xb0, 0x22, 0x34, 0xe5, - 0xce, 0x9b, 0xa2, 0x71, 0x61, 0xdb, 0x3e, 0x50, 0xfa, 0x8c, 0x56, 0xff, - 0x8a, 0x4c, 0x17, 0x0d, 0x25, 0xe1, 0x95, 0xce, 0x10, 0x0c, 0x53, 0x1d, - 0x3a, 0xd4, 0x4a, 0xe6, 0xbe, 0x1d, 0xfe, 0x01, 0x20, 0xb2, 0xab, 0x10, - 0x4c, 0x77, 0xbf, 0xb8, 0x20, 0x82, 0xe2, 0x9c, 0x81, 0x2a, 0xa3, 0x59, - 0xde, 0x71, 0x23, 0xc5, 0x3e, 0x57, 0x80, 0xd3, 0x60, 0x87, 0x7c, 0x24, - 0x6a, 0x96, 0x85, 0x28, 0xd3, 0x86, 0x02, 0xd7, 0x69, 0x86, 0xf0, 0xb3, - 0xee, 0x2f, 0x19, 0x26, 0x7c, 0x89, 0xbd, 0xa9, 0x1a, 0x83, 0xfa, 0x33, - 0xda, 0xce, 0xd4, 0x87, 0x34, 0x7e, 0x1c, 0x9c, 0x08, 0x64, 0xfd, 0xc0, - 0x54, 0x90, 0x19, 0xd4, 0xd1, 0x65, 0xea, 0x3f, 0xad, 0xa6, 0xf8, 0xe3, - 0x35, 0xd9, 0x74, 0x5b, 0xcf, 0x0f, 0x3b, 0x41, 0x7d, 0x6e, 0x55, 0xee, - 0x63, 0x4d, 0xc3, 0xc0, 0xa6, 0xb7, 0x64, 0x76, 0xc8, 0x9a, 0xa5, 0x58, - 0xf1, 0x8a, 0x1c, 0xa2, 0xfb, 0xc3, 0x6a, 0xef, 0x04, 0xf0, 0xc0, 0x83, - 0xfc, 0x21, 0x54, 0x83, 0xf4, 0x71, 0x21, 0x94, 0x47, 0x8a, 0x87, 0x95, - 0x8d, 0x82, 0x5f, 0xab, 0x08, 0x09, 0x7e, 0xfa, 0xa6, 0x2e, 0x35, 0x5c, - 0x6b, 0x59, 0x77, 0xdf, 0xa6, 0x28, 0xe6, 0x45, 0xc1, 0xaf, 0x18, 0xa2, - 0x73, 0x6b, 0xc9, 0x44, 0x5b, 0x79, 0x40, 0x52, 0x18, 0x2d, 0x04, 0x85, - 0xca, 0x26, 0x7f, 0x61, 0x17, 0x29, 0xde, 0x8a, 0xe6, 0xd5, 0x35, 0xac, - 0xf8, 0x50, 0x62, 0x77, 0xd5, 0xb4, 0x1d, 0xfb, 0xa0, 0x9e, 0xc6, 0x1e, - 0x04, 0x49, 0x3f, 0x4c, 0x5e, 0xed, 0x03, 0xfd, 0xc6, 0xde, 0xc0, 0xfa, - 0x9c, 0x8d, 0x83, 0x50, 0xfc, 0x83, 0xc8, 0x5d, 0x32, 0x57, 0xce, 0x9d, - 0x14, 0x68, 0x19, 0x08, 0x8b, 0x3a, 0x0e, 0xd9, 0x33, 0x3e, 0x89, 0x34, - 0x7b, 0x71, 0xd9, 0xa2, 0x53, 0x2d, 0x08, 0x23, 0x48, 0xc5, 0x7f, 0xc7, - 0x0b, 0xc8, 0x99, 0x87, 0x80, 0xa2, 0xca, 0xe5, 0xb8, 0xb8, 0x99, 0x82, - 0x0e, 0xae, 0x4f, 0x0b, 0xd9, 0x80, 0xab, 0x0a, 0xbe, 0xd1, 0x42, 0xe7, - 0x10, 0xf6, 0x3d, 0x9a, 0xc1, 0x71, 0x31, 0xcb, 0xb9, 0x93, 0x74, 0xe5, - 0x9e, 0xfb, 0xfa, 0xbe, 0x9c, 0xc9, 0x27, 0xb3, 0xe1, 0xc4, 0xa1, 0xfe, - 0xb5, 0x35, 0x9e, 0xeb, 0xbc, 0x1a, 0x2b, 0xae, 0x12, 0xa3, 0x5e, 0x95, - 0xce, 0x8c, 0x53, 0xbb, 0x71, 0x7e, 0x95, 0x3a, 0x68, 0x43, 0x16, 0x5d, - 0x5d, 0xd2, 0x48, 0x04, 0xc2, 0x5b, 0x04, 0xb8, 0x0f, 0x2a, 0x85, 0x5e, - 0x93, 0x64, 0x55, 0xf5, 0x86, 0x68, 0x1f, 0xa0, 0x38, 0x43, 0x03, 0x5e, - 0x4b, 0x86, 0x51, 0xfd, 0x83, 0x8e, 0xbb, 0x0d, 0x15, 0xd0, 0xfd, 0x0c, - 0x04, 0x3b, 0x85, 0xe0, 0xd3, 0x4c, 0x81, 0x39, 0x4d, 0x91, 0x5e, 0xb2, - 0x3f, 0x29, 0x30, 0xe2, 0x22, 0xb8, 0xc8, 0xf6, 0x15, 0xe1, 0x74, 0xdb, - 0x2f, 0x84, 0x5c, 0xb3, 0xe3, 0xd9, 0xd7, 0x13, 0x7b, 0xab, 0xda, 0x6a, - 0xf5, 0x8a, 0x09, 0xbd, 0xb4, 0xb8, 0x28, 0x4a, 0x25, 0x49, 0xf5, 0x4d, - 0x66, 0xe6, 0xf5, 0xb0, 0x65, 0xca, 0x8f, 0x47, 0xff, 0x9d, 0xfc, 0xab, - 0xb4, 0x52, 0x97, 0xda, 0xe2, 0x87, 0xf2, 0xae, 0x8e, 0x0b, 0xb0, 0x67, - 0x6b, 0x7f, 0x3e, 0x44, 0x9f, 0xfd, 0x1c, 0x21, 0xdd, 0x7e, 0xb0, 0xeb, - 0x46, 0xeb, 0xc5, 0xac, 0xc2, 0x5f, 0xcc, 0x64, 0x02, 0xb6, 0xed, 0x74, - 0x31, 0x62, 0xcf, 0xa2, 0x8e, 0x1f, 0x66, 0x74, 0xea, 0x87, 0x6c, 0xb0, - 0xff, 0xde, 0xaf, 0x58, 0xfa, 0x34, 0x0a, 0xcd, 0xbb, 0x5c, 0x96, 0x82, - 0x88, 0xda, 0xe5, 0x5a, 0xc7, 0x40, 0xcf, 0x49, 0xf9, 0x55, 0x23, 0x16, - 0xce, 0x20, 0x29, 0x36, 0xb1, 0x53, 0xfc, 0xc1, 0xfb, 0xa9, 0x4d, 0x89, - 0x78, 0x8c, 0xf3, 0xda, 0xd9, 0x81, 0x0d, 0xdb, 0x98, 0x32, 0x98, 0x22, - 0x48, 0xe8, 0x7e, 0x47, 0x6a, 0xa9, 0xbf, 0xc3, 0xea, 0x57, 0x3f, 0x75, - 0xbb, 0x4e, 0x7a, 0x1d, 0x29, 0x43, 0x91, 0x60, 0xc3, 0x3f, 0x9d, 0x19, - 0x06, 0xcf, 0x64, 0x06, 0x7e, 0xc8, 0x30, 0xc1, 0x2e, 0x6d, 0x9c, 0x7b, - 0x35, 0xc6, 0x5c, 0x0f, 0x2f, 0x6c, 0x98, 0xc2, 0x17, 0xd1, 0xe1, 0x55, - 0xe8, 0x7c, 0x5d, 0x0a, 0x07, 0x18, 0xf7, 0xa5, 0x4a, 0xa1, 0x67, 0x4b, - 0x29, 0x55, 0x85, 0xe3, 0xaf, 0x80, 0xc6, 0x57, 0x01, 0x0c, 0x8b, 0x2f, - 0xe0, 0x2e, 0x52, 0x2f, 0x43, 0xbe, 0x77, 0xd4, 0x01, 0x65, 0xee, 0x01, - 0x92, 0x8e, 0xd2, 0xee, 0x27, 0x62, 0x2d, 0xf1, 0x69, 0x47, 0x95, 0xa4, - 0x02, 0xb2, 0x07, 0x7d, 0x44, 0xe9, 0xac, 0xdb, 0x13, 0x15, 0x3a, 0x9e, - 0x5f, 0x6a, 0xf9, 0x45, 0x93, 0xed, 0xfc, 0x9f, 0xbf, 0xbf, 0x17, 0xd2, - 0x8b, 0xbb, 0x4e, 0x1a, 0x4a, 0x6d, 0x2f, 0x73, 0xef, 0x44, 0x18, 0x6f, - 0xfe, 0xa2, 0x40, 0xcf, 0xc7, 0x5b, 0x4d, 0xf8, 0x59, 0xbc, 0x4e, 0xf1, - 0xc8, 0x3b, 0x3d, 0xbd, 0x43, 0xd4, 0x69, 0x41, 0x10, 0x33, 0x5f, 0xa7, - 0x0f, 0xbc, 0x2e, 0x51, 0x7c, 0xfd, 0x69, 0x7e, 0x9c, 0x1f, 0x4c, 0x70, - 0xde, 0xd4, 0x2c, 0x0d, 0xeb, 0xfa, 0x61, 0xa6, 0x87, 0x42, 0x80, 0x85, - 0x72, 0xd4, 0xf1, 0xa7, 0x8b, 0xb9, 0x84, 0xb2, 0x53, 0x45, 0xfe, 0xf2, - 0x27, 0x3a, 0xfc, 0x97, 0xb2, 0x21, 0x2b, 0x79, 0xc8, 0xdb, 0xc7, 0xa4, - 0x15, 0x4b, 0xf6, 0x64, 0x7e, 0x5e, 0x74, 0x6a, 0x0d, 0x28, 0x20, 0x75, - 0xb1, 0xa6, 0x1e, 0xda, 0x0c, 0x79, 0x8d, 0x56, 0x97, 0x57, 0xe6, 0xb2, - 0xc3, 0xf1, 0x7f, 0xda, 0xa0, 0x8e, 0x72, 0xb0, 0xb2, 0xc1, 0x90, 0x8d, - 0x03, 0x03, 0x34, 0x57, 0xaf, 0x00, 0x2d, 0x5c, 0x06, 0x0c, 0x13, 0xf7, - 0x8e, 0xc6, 0x93, 0x04, 0x5d, 0xc4, 0xa8, 0x8d, 0x0e, 0x11, 0xfb, 0x3f, - 0x83, 0xcb, 0xaa, 0x2b, 0xcd, 0xea, 0xfa, 0x66, 0xb7, 0xe2, 0x6b, 0xb6, - 0x80, 0xf9, 0xf0, 0xe6, 0xc0, 0xea, 0xc9, 0x01, 0x24, 0x09, 0x45, 0xf9, - 0xac, 0x68, 0x9d, 0xd2, 0xc6, 0xe5, 0xe8, 0x85, 0x08, 0xab, 0xf8, 0x61, - 0x85, 0xd4, 0xb2, 0x20, 0xa9, 0xa4, 0x45, 0xeb, 0xe2, 0x26, 0xf7, 0xf7, - 0x3a, 0x1d, 0x9b, 0xf9, 0xe0, 0x7e, 0xe2, 0x38, 0xa0, 0xc0, 0x0f, 0x3e, - 0x12, 0xd9, 0x1d, 0x27, 0x3b, 0x3a, 0xd1, 0x4c, 0xbf, 0x80, 0x33, 0xae, - 0xc8, 0xe3, 0x06, 0xa6, 0xb1, 0xe1, 0x0e, 0x09, 0x27, 0xc4, 0x3e, 0x77, - 0x36, 0x51, 0x41, 0xaa, 0x9c, 0xb3, 0x8d, 0x12, 0x15, 0x51, 0x98, 0x1d, - 0x5c, 0x40, 0x3d, 0x95, 0x26, 0xbe, 0xaf, 0x21, 0xbc, 0x5a, 0x11, 0x3e, - 0xaf, 0x6c, 0x0d, 0x52, 0xf8, 0xf0, 0x04, 0xeb, 0x36, 0xd3, 0x57, 0xb8, - 0x3e, 0x8a, 0xf4, 0x94, 0xe2, 0xc5, 0x97, 0xf2, 0x6b, 0x9e, 0x31, 0x7e, - 0x22, 0xc8, 0x45, 0x96, 0x79, 0x30, 0x15, 0x77, 0x02, 0x39, 0xd1, 0x46, - 0x12, 0x41, 0xf5, 0x35, 0xfc, 0xe6, 0x62, 0x0e, 0x13, 0xfa, 0x40, 0x99, - 0xb0, 0x54, 0x96, 0xab, 0x75, 0x7c, 0x40, 0xc9, 0x43, 0x26, 0x89, 0xc8, - 0x60, 0x22, 0xa7, 0xd2, 0x94, 0x42, 0xc3, 0x5f, 0x84, 0x72, 0xc4, 0x05, - 0x61, 0xe2, 0x69, 0x43, 0xd9, 0xf6, 0x23, 0x4c, 0x03, 0xf8, 0x3a, 0x91, - 0x8b, 0x38, 0xd9, 0x3f, 0xb5, 0xf2, 0x56, 0x78, 0x81, 0x50, 0xe4, 0xaf, - 0x76, 0x88, 0xe1, 0xc2, 0xb1, 0xa3, 0xe9, 0xed, 0xe2, 0xc4, 0x64, 0xf3, - 0x21, 0x8d, 0xf6, 0x6b, 0xa4, 0xf5, 0x31, 0x0f, 0xa6, 0xd9, 0xb5, 0x99, - 0x09, 0x83, 0xc5, 0x42, 0xf2, 0xaf, 0x59, 0x51, 0xac, 0x34, 0x2d, 0x60, - 0x3f, 0x0d, 0x0f, 0x36, 0x6f, 0x0d, 0x31, 0xbb, 0x25, 0x23, 0x7a, 0xca, - 0x69, 0xeb, 0x77, 0xe5, 0xbf, 0x0e, 0x91, 0xd4, 0x75, 0xdb, 0x01, 0xe8, - 0x37, 0x79, 0x76, 0x21, 0x36, 0xad, 0xc1, 0x40, 0x86, 0x7a, 0x21, 0x42, - 0xe6, 0x83, 0x0b, 0xe4, 0x5d, 0x0b, 0x28, 0xbe, 0x11, 0xba, 0xf6, 0x25, - 0x6e, 0x10, 0x46, 0xfc, 0x6e, 0xd1, 0xe7, 0x92, 0x6f, 0x8d, 0x8f, 0x1c, - 0x36, 0x07, 0x64, 0x11, 0xb1, 0xff, 0x97, 0xce, 0xfe, 0x5a, 0x29, 0xa9, - 0xf2, 0xab, 0x37, 0x22, 0x0e, 0xf1, 0x5b, 0x38, 0x58, 0x74, 0x7f, 0x32, - 0x6f, 0x16, 0xec, 0x01, 0x77, 0x6b, 0x7b, 0x5e, 0xe4, 0x37, 0x72, 0x67, - 0x1e, 0x43, 0xb7, 0x41, 0xc4, 0xb0, 0xa0, 0xb2, 0x73, 0xd6, 0xb3, 0x19, - 0x04, 0xe1, 0xb2, 0xf8, 0x5a, 0xf3, 0xbb, 0x7e, 0xbe, 0x6d, 0x00, 0xc8, - 0x9d, 0x7b, 0x04, 0xcc, 0x54, 0xa7, 0xc4, 0xf4, 0x01, 0x4e, 0xf6, 0xd5, - 0x60, 0xcc, 0xdc, 0x56, 0xf6, 0x3d, 0x81, 0x6a, 0x65, 0xc6, 0x02, 0xbf, - 0xa5, 0xc5, 0xcc, 0xde, 0x4d, 0x4d, 0xfe, 0x40, 0x7b, 0xd1, 0xbf, 0xe5, - 0xb7, 0xe9, 0x38, 0xbe, 0x70, 0x8b, 0x94, 0x83, 0xfd, 0xbf, 0xd7, 0x0e, - 0x01, 0xe0, 0x3c, 0xf9, 0x51, 0xab, 0x5e, 0x1e, 0xde, 0x19, 0x6a, 0x62, - 0x94, 0xb0, 0x93, 0x40, 0xcf, 0xa0, 0x8b, 0x08, 0x99, 0xb3, 0xbc, 0x86, - 0xce, 0xb7, 0x8a, 0xe9, 0x24, 0xe0, 0x89, 0x93, 0x64, 0x4f, 0x4e, 0x5d, - 0xd0, 0x3a, 0x08, 0x53, 0xea, 0x89, 0x14, 0xa9, 0x4c, 0xcb, 0xed, 0x74, - 0x95, 0x94, 0xba, 0x09, 0x91, 0xb0, 0x88, 0x30, 0xc6, 0x59, 0x64, 0xcd, - 0x40, 0xe0, 0xa5, 0x6f, 0xea, 0x59, 0x99, 0x71, 0x95, 0xf7, 0xb8, 0x01, - 0xbd, 0x78, 0x02, 0x42, 0x30, 0xca, 0xee, 0x2a, 0x2e, 0x0e, 0xaa, 0xa9, - 0x02, 0x0d, 0xb3, 0x97, 0xb3, 0xb9, 0xe0, 0x2d, 0x75, 0xc3, 0x44, 0xc8, - 0x9b, 0x3a, 0xf1, 0xb9, 0x0f, 0x3c, 0x77, 0x34, 0x68, 0x42, 0xb2, 0x2b, - 0x89, 0x77, 0xe6, 0xed, 0x7d, 0x94, 0x3f, 0xcc, 0x60, 0xae, 0x79, 0x7c, - 0xef, 0x59, 0x60, 0xa0, 0x74, 0xa9, 0x4f, 0x7a, 0x24, 0x0a, 0x07, 0x20, - 0x34, 0xaf, 0x87, 0xb0, 0x78, 0x1d, 0x76, 0x81, 0x9d, 0x67, 0x3f, 0x32, - 0xc0, 0x7a, 0x92, 0x52, 0x13, 0x67, 0xae, 0xb6, 0x41, 0x05, 0x5c, 0x9d, - 0xaf, 0xe0, 0xbb, 0x35, 0x04, 0x28, 0xe0, 0xc9, 0x59, 0xe0, 0xe6, 0x62, - 0x21, 0x59, 0x5d, 0x11, 0xba, 0xa3, 0x0d, 0x2b, 0x82, 0x17, 0xd3, 0xdc, - 0x0b, 0x85, 0x17, 0xe9, 0xf9, 0xe3, 0x94, 0x31, 0xf8, 0x8f, 0x50, 0xb3, - 0xed, 0xa3, 0xbe, 0x82, 0x4a, 0x52, 0xc0, 0x46, 0xeb, 0xe2, 0xad, 0xa1, - 0xb2, 0x82, 0x1e, 0x22, 0x7f, 0xed, 0x4b, 0x51, 0x22, 0x52, 0x53, 0xa4, - 0xe7, 0x20, 0x52, 0xae, 0xb8, 0x66, 0xc4, 0x71, 0xaf, 0x46, 0x33, 0xdc, - 0xb0, 0xc0, 0xc1, 0x72, 0x82, 0x55, 0x53, 0xc5, 0xe1, 0x20, 0xed, 0x38, - 0x3b, 0x4b, 0xca, 0xf1, 0xfd, 0x30, 0xd9, 0x81, 0x16, 0x1b, 0x1e, 0x64, - 0x9f, 0xf2, 0x0a, 0xeb, 0x3c, 0xfd, 0xc1, 0x32, 0xd2, 0xdc, 0x3d, 0x95, - 0x2e, 0x2d, 0xfa, 0x3e, 0x5f, 0x55, 0x84, 0xd1, 0xcb, 0x02, 0x5d, 0xb9, - 0x77, 0x91, 0x8d, 0x3a, 0x71, 0xb5, 0x43, 0x09, 0x38, 0x39, 0xe6, 0xbc, - 0x44, 0xc6, 0x49, 0xe6, 0xd0, 0x60, 0x8f, 0xaf, 0x68, 0x72, 0x16, 0x82, - 0xcc, 0xb2, 0xea, 0x67, 0xad, 0x26, 0x4d, 0x9d, 0x94, 0x36, 0x48, 0x8c, - 0x8a, 0x9f, 0x8c, 0x46, 0x9e, 0x8a, 0xb7, 0xf1, 0xe4, 0x39, 0xc6, 0x95, - 0xcc, 0x3e, 0x75, 0x31, 0xd9, 0x05, 0x38, 0xfb, 0x1f, 0x56, 0x02, 0x14, - 0x5d, 0x4e, 0x5e, 0xed, 0xcd, 0x96, 0x07, 0x61, 0x07, 0x0d, 0xf0, 0x5d, - 0xe0, 0x85, 0xb2, 0x36, 0x7d, 0x5b, 0x9c, 0xa0, 0x70, 0xa0, 0x3c, 0xee, - 0x2f, 0xbb, 0xac, 0xaa, 0x2a, 0xba, 0x6a, 0x53, 0xd4, 0xd8, 0x0d, 0x9f, - 0xec, 0x7f, 0x00, 0x2e, 0xdb, 0x73, 0x84, 0xb9, 0x97, 0xfa, 0xf1, 0x22, - 0x8a, 0x5f, 0xa3, 0xd5, 0xcf, 0x61, 0x23, 0xeb, 0x91, 0xc9, 0x08, 0xa5, - 0x96, 0x76, 0xb0, 0xb6, 0xad, 0x11, 0xfd, 0xe0, 0x31, 0x0e, 0xfa, 0x50, - 0xd1, 0xfa, 0x55, 0xe8, 0xc6, 0xde, 0x2f, 0xdd, 0x72, 0xa0, 0x6b, 0x41, - 0x56, 0x8d, 0x3c, 0x6c, 0x92, 0x8b, 0xe2, 0x95, 0x40, 0x9b, 0xc8, 0x9a, - 0xb5, 0xef, 0x99, 0xd0, 0xc7, 0x0e, 0x8b, 0xb5, 0xd1, 0xe1, 0x80, 0x32, - 0x22, 0x71, 0x76, 0xc8, 0xf7, 0x3b, 0xa8, 0xce, 0x14, 0x2b, 0xee, 0x14, - 0x95, 0x3a, 0x1f, 0xdf, 0x6c, 0x56, 0x4b, 0x90, 0xe9, 0xc0, 0x0f, 0x5e, - 0xfa, 0x95, 0x68, 0x8d, 0x98, 0xc7, 0x88, 0xdf, 0xe4, 0x6b, 0xa7, 0x73, - 0x11, 0x3e, 0x5b, 0xad, 0xdd, 0x7e, 0x8e, 0x8d, 0x65, 0x8d, 0x19, 0xd5, - 0xa8, 0x2d, 0x6f, 0x25 -}; -static const unsigned int random_bin_len = 256000; -static uint32_t value; - -/* - * This file has one purpose which is to make the firmware big! - */ -int -read_random_data(void) -{ - int i; - - for (value = 0, i = 0; i < random_bin_len; i++) { - value += random_bin[i]; - } - - return value; -} diff --git a/mcuboot/testplan/mynewt/apps/slinky/syscfg.yml b/mcuboot/testplan/mynewt/apps/slinky/syscfg.yml deleted file mode 100644 index 1005edcfd..000000000 --- a/mcuboot/testplan/mynewt/apps/slinky/syscfg.yml +++ /dev/null @@ -1,34 +0,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. -# - -syscfg.defs: - BLINKY_TICKS_PER_SEC: - value: 1 - -syscfg.vals: - SHELL_TASK: 1 - STATS_NAMES: 1 - REBOOT_LOG_FCB: 1 - LOG_FCB: 1 - CONFIG_FCB: 1 - STATS_CLI: 1 - LOG_CLI: 1 - CONFIG_CLI: 1 - STATS_MGMT: 1 - LOG_MGMT: 1 - CONFIG_MGMT: 1 diff --git a/mcuboot/testplan/mynewt/key_ec.pem b/mcuboot/testplan/mynewt/key_ec.pem deleted file mode 100644 index 73078002f..000000000 --- a/mcuboot/testplan/mynewt/key_ec.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MGgCAQEEHKDCA+0fUA9P6MkTZvGlO4IN8kQfMbD4xyt619WgBwYFK4EEACGhPAM6 -AASgjFrWmCAa1bnE/X+l0wjKAJFexpJJzhjFZBftv2PQzbj3/yklNVp6IDDJJpWy -V9FGDWkYE8l9sw== ------END EC PRIVATE KEY----- diff --git a/mcuboot/testplan/mynewt/key_ec256.pem b/mcuboot/testplan/mynewt/key_ec256.pem deleted file mode 100644 index 0f9264fd0..000000000 --- a/mcuboot/testplan/mynewt/key_ec256.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEINtq7Uc92lGcI9pcfwU7IEWfjtYKMpG3iSLy8vdn3p0poAoGCCqGSM49 -AwEHoUQDQgAEbmhhf9fiyT20CixtsNDO/lS4lq38YIeJQektIcg+HV7Dd/1iX7v7 -2hCnWiOq/AG13HM9N8FFj5A7Zv0rlWacyQ== ------END EC PRIVATE KEY----- diff --git a/mcuboot/testplan/mynewt/key_ec256_2.pem b/mcuboot/testplan/mynewt/key_ec256_2.pem deleted file mode 100644 index da05302b2..000000000 --- a/mcuboot/testplan/mynewt/key_ec256_2.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEICDt9+UM3LnshnbYzo73AGTWav9ZmRYDydJAarzx4Og8oAoGCCqGSM49 -AwEHoUQDQgAEDv6jJOUwhCpzEH3T7yWlAOZRTLIlC0q/JMHyJR0PkPMS+eyq7fEp -hOnAXbCNx5PLyVLR2NSnOU1A6QiLHW1j0A== ------END EC PRIVATE KEY----- diff --git a/mcuboot/testplan/mynewt/key_ec_2.pem b/mcuboot/testplan/mynewt/key_ec_2.pem deleted file mode 100644 index 82dff4314..000000000 --- a/mcuboot/testplan/mynewt/key_ec_2.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MGgCAQEEHCN8/JmSnXMbwvimYU61t5J3BqSog3UD9rszWEugBwYFK4EEACGhPAM6 -AATihCbugkqIXekQOh7iZZZPghfS/bQID5ad8FRY1xnL5rBd2nR7gFqTXxV9M9tF -EJFA+MwFnIbgng== ------END EC PRIVATE KEY----- diff --git a/mcuboot/testplan/mynewt/key_rsa.pem b/mcuboot/testplan/mynewt/key_rsa.pem deleted file mode 100644 index c43da3bee..000000000 --- a/mcuboot/testplan/mynewt/key_rsa.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpgIBAAKCAQEA4khfMQhQLk9tv83QCfFc1gjphM91LIgHzA75U65KmpO0G1VD -t34QqFDZFJAFgBWgjNvcGwNW1keURKHoFfR3SWBFNKQXmoGo/LbZIfZo+noT5SXN -pQt3Cl/2C500j8P0kferKBJS3LuykoCY4hMz58MqHCeY/P8H210W0lDBjhL6lZhR -kbv57sNlpALgv7axxiDHn/5jYWpo9gjKVTLAUN2NUnMDer7XMtlhmRn/DeaCyBw9 -BxrpqHutdSwmhz1nK1rEf3CGcIp+7ekvvirVtDN7zInNVwi7ct8AjuqKKqigHLiK -Ya8yPUHp9rGic8L/0TJVH9oJI8GDUeFP1WU+lwIDAQABAoIBAQDBV+8mGSFRgIKY -2UVByZ52LyVAWnaW9yAaZkz5CDose7nvhNoYZbnb50Ckhi588327/XvDBQZkjsKM -Jf8FC14FLyHSycZ1OQZn79/1WfL22eo36CYfOH2dOsMjx04K7PcC5aiz03xDqIj7 -DrASsy+tfp9zcQ4SVeKjt5VxXJkVR1wMTUM08N7GXTf71YpTLSb0drbovWS8QUYq -JIUh36EMhNOIqNyXVBBxCHdbUEvN0p4185mciK+P42JJvTm1i9ooyuYQUaF3U25y -yDyhMGxVxPwgREaIhA/xfmU2Dsqrmq0pitiVZ9qJqbuWIuxZJTd2l9tkeEr4hdHB -zCgFqyKhAoGBAP/iDrMUdf+KB53U7le2xIk+MJwNDSblVF/O2t93hvMk39Y0bT9y -YvGaVh3Ryqoy4/g81nwbvQs36IMb3XGvbn3N4a5XGBlysOLOzwF0piYNX1ZyRgxn -2wxw1O24uE1qN4Eh0UrLDvN07nKRJ6V9az+zSW3EAxwwUDWBIFL0pM8xAoGBAOJi -2cbIfHXEpt46aDEN7BwBog+8KL5Mima13zN8Melu6WvhB69JGG8IlUstMPPAq6uL -Wd72vVkN0Vy7kr6dHCa+/IzdW47ukUFIB4IaMAHYTByWaY7Hh7mnIUyNUIojou9e -o49DKdpV/xOksJWljwhtiHy6QCivbka3prTBikhHAoGBAMFQn5pbkuoD9c0f2REb -W0/0U/URRyZji2L2fBTn0GRRL2o9IWwVlvrAht7waBQ9bk1UaRZKPoADNP4YRyxk -RS12JVH5KpPPOiOf6nRHFF8bKzO8EX+91peHhtYx/8s8u8IrMls3HYyAgsS7NSCp -qCTv5kGvHEpnlbFWZH1HpluBAoGBAJT3wSA6SxPfzIJNYsRsyeJ//JloElNu4F/H -69DgN6PI1Rak5D6m1coylrL6UM0FCrH+J6w9JsnT+uGPmHePwLeKU3uKKbZ7K+AO -OsqU2uRL5YGmRF2s1JYI8TODhezwmEX1O6GI66B9mDTf2UcPw3gjQ333vUJIdkNY -k/07off/AoGBAPx9NTR13dbDhlG6hyxEtCrTyxKKXs3vmTfjmaQnicvM/oceRYed -h8+q/YN2ePvxeOYiOgluFWJz+pOrWKYm1sFYEa6+GtCnBwyv5fmxLxY/99ULIMYA -Jyudi8CusEM1q5TetFMoNcRSj7iPLUyFO1thUoRpCTJ/bUcD0Dl9PL20 ------END RSA PRIVATE KEY----- diff --git a/mcuboot/testplan/mynewt/key_rsa_2.pem b/mcuboot/testplan/mynewt/key_rsa_2.pem deleted file mode 100644 index c0dba0ab2..000000000 --- a/mcuboot/testplan/mynewt/key_rsa_2.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEArKyBv+rzsk2frv0lqcYNJ0o2ahMwS/lpXXvfkd9cGvgX+Xf+ -Zdv54VHO6cpvp1CExOoeVwhK+78ETYTXuOqIzJB2uv+MtcvlwN/OH14g0TmMb14Z -n3iaV9I9/VLEt2BxI0gAp+megUAz5CW66BMw/cfxX0jvWYhHr8qFRWSbZkExivwy -b10azCw+g6xk+NlOddd9x0Jw1UjIZcSKoVdLcuhctBTqteMqhFUIsR9LjzEj0VQk -nXtHFABIXGsc4J20WvLMueLIyd5AW1J4EKLHLcpvBuNFQTil3U8T5mmdfarVaqVr -7AHINsv3ROIw6sWzA1S9baB8Ok9cDzkZLK0XgwIDAQABAoIBAQCUUXT9ya3b2Qsx -fuYsBx9jQT6uLJ9OkwSrNOzb2rS9wZ6uPSC6k5H2tZN6g9UWLXZtwf+fmFL4HKJw -h4vYnTQ2Klyh0UInIeXOny7pCKw9qyXyvyxZK3m/t6phfwfTz7Y+rOlLUcNBmEk6 -TiJWl618P5MX2oklKYcR+24wJfPJhwpclnrxw5UzqUbDSFfSL/zDjlnPEeQ8tQ1Z -WQISqUim6bMk3J62AiOUwH9QsOj7seEQG7zCqVc+MWQ5OloI1wlPyACLDAvnBBT5 -9VaP8ixEaJbarpMXH9j9qnRRsEeLa8BGqJ6qZIlf9zyWEQrkzLAi75oTdiRL5cm1 -VSiXVAhJAoGBAN7s7537JJuPFMHwurAUbYd02rqv6pWztwmVJZzsILOPjVBOyb9E -QJXCnJ1OfL1lhtegndP36Sb/mGwdK6IWDLH2+E/eLcWzcUXNvI0H02pbvzq/Vbh+ -Q0VxFblhvwGhvi0+SydC9MowTzcv/5wAV7zp2AK6+fBjenE3aCPNZCyNAoGBAMZK -7sgIOuvLS0qVd7YXJpcBcjZRNpRc14T8Qh+AXRLv5qbFjMjwc3usJo3E4+EIE7eq -IopMw54emT7qDfRoZXXjPPDawixTRMFDBEFHbXb1KB3sDp8xyghZ1f8296Y00NJ9 -3pNba/UBTgVXNspZ5gTois8HsLrAnbqjNuA5NrhPAoGBAMaZ63ehUKHNvL5zSr6n -1FSDRIJhSuqHqx+8YkAFFbUixNCxAIeHtMo3EPQMApFxK8paa4F2MZ7uwso+yqqi -XjkGP35YAAtLrDR17+7s8+qjRiB+aU3uHtx0vNflPxejExyXjLizrAWdOFWAS4ad -v4ysACeekCEbXvASXpLW3tHZAoGAemvWwb57CgpnwHNJBi2C0KW+6pP3O1+aW2sW -M7afP8rGvt2mDoSM96SP5OTSv6Kp8bFjQ7ki6GMBv5rm5KbzRPX3MMgOKyl5gEus -u9SqW0/95YNQf65QihlUig1Ylc9zwRCesqE1pHyau6ddl04rOYqL8EdSL+otNwX/ -Ii2Qf/cCgYBi5WOv0cFyff+uQNUGEv1l896+8yhyml2ogE8PTdrBX16e4/N89vG4 -5vXEmPmqk9qYxmKIr5MLM9229gWCCGt7wWdH5Xt0AT7ZUvxwyKnaS/QimOVU2X1t -3lpGMTJkRq5bxMUUbC1n9e6o/GFrlmtLjCTYgRLOBKNy36bxxZnOZw== ------END RSA PRIVATE KEY----- diff --git a/mcuboot/testplan/mynewt/keys/ec/pkg.yml b/mcuboot/testplan/mynewt/keys/ec/pkg.yml deleted file mode 100644 index 2b3256b49..000000000 --- a/mcuboot/testplan/mynewt/keys/ec/pkg.yml +++ /dev/null @@ -1,3 +0,0 @@ -pkg.name: keys/ec -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" diff --git a/mcuboot/testplan/mynewt/keys/ec/src/keys.c b/mcuboot/testplan/mynewt/keys/ec/src/keys.c deleted file mode 100644 index 81505eb4a..000000000 --- a/mcuboot/testplan/mynewt/keys/ec/src/keys.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -static unsigned char key[] = { - 0x30, 0x4e, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, - 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x21, 0x03, 0x3a, 0x00, 0x04, - 0xa0, 0x8c, 0x5a, 0xd6, 0x98, 0x20, 0x1a, 0xd5, 0xb9, 0xc4, 0xfd, 0x7f, - 0xa5, 0xd3, 0x08, 0xca, 0x00, 0x91, 0x5e, 0xc6, 0x92, 0x49, 0xce, 0x18, - 0xc5, 0x64, 0x17, 0xed, 0xbf, 0x63, 0xd0, 0xcd, 0xb8, 0xf7, 0xff, 0x29, - 0x25, 0x35, 0x5a, 0x7a, 0x20, 0x30, 0xc9, 0x26, 0x95, 0xb2, 0x57, 0xd1, - 0x46, 0x0d, 0x69, 0x18, 0x13, 0xc9, 0x7d, 0xb3 -}; -static unsigned int key_len = 80; -const struct bootutil_key bootutil_keys[] = { - [0] = { - .key = key, - .len = &key_len, - }, -}; -const int bootutil_key_cnt = 1; diff --git a/mcuboot/testplan/mynewt/keys/ec256/pkg.yml b/mcuboot/testplan/mynewt/keys/ec256/pkg.yml deleted file mode 100644 index 2467ce480..000000000 --- a/mcuboot/testplan/mynewt/keys/ec256/pkg.yml +++ /dev/null @@ -1,3 +0,0 @@ -pkg.name: keys/ec256 -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" diff --git a/mcuboot/testplan/mynewt/keys/ec256/src/keys.c b/mcuboot/testplan/mynewt/keys/ec256/src/keys.c deleted file mode 100644 index ece45c37d..000000000 --- a/mcuboot/testplan/mynewt/keys/ec256/src/keys.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -static unsigned char key[] = { - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, - 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04, 0x6e, 0x68, 0x61, 0x7f, 0xd7, 0xe2, 0xc9, 0x3d, 0xb4, - 0x0a, 0x2c, 0x6d, 0xb0, 0xd0, 0xce, 0xfe, 0x54, 0xb8, 0x96, 0xad, 0xfc, - 0x60, 0x87, 0x89, 0x41, 0xe9, 0x2d, 0x21, 0xc8, 0x3e, 0x1d, 0x5e, 0xc3, - 0x77, 0xfd, 0x62, 0x5f, 0xbb, 0xfb, 0xda, 0x10, 0xa7, 0x5a, 0x23, 0xaa, - 0xfc, 0x01, 0xb5, 0xdc, 0x73, 0x3d, 0x37, 0xc1, 0x45, 0x8f, 0x90, 0x3b, - 0x66, 0xfd, 0x2b, 0x95, 0x66, 0x9c, 0xc9 -}; -static unsigned int key_len = 91; -const struct bootutil_key bootutil_keys[] = { - [0] = { - .key = key, - .len = &key_len, - }, -}; -const int bootutil_key_cnt = 1; diff --git a/mcuboot/testplan/mynewt/keys/pkg.yml b/mcuboot/testplan/mynewt/keys/pkg.yml deleted file mode 100644 index e7e73e340..000000000 --- a/mcuboot/testplan/mynewt/keys/pkg.yml +++ /dev/null @@ -1,12 +0,0 @@ -pkg.name: keys -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" - -pkg.deps.BOOTUTIL_SIGN_RSA: - - keys/rsa - -pkg.deps.BOOTUTIL_SIGN_EC: - - keys/ec - -pkg.deps.BOOTUTIL_SIGN_EC256: - - keys/ec256 diff --git a/mcuboot/testplan/mynewt/keys/rsa/pkg.yml b/mcuboot/testplan/mynewt/keys/rsa/pkg.yml deleted file mode 100644 index eaadda10a..000000000 --- a/mcuboot/testplan/mynewt/keys/rsa/pkg.yml +++ /dev/null @@ -1,3 +0,0 @@ -pkg.name: keys/rsa -pkg.author: "Apache Mynewt " -pkg.homepage: "http://mynewt.apache.org/" diff --git a/mcuboot/testplan/mynewt/keys/rsa/src/keys.c b/mcuboot/testplan/mynewt/keys/rsa/src/keys.c deleted file mode 100644 index bc593225a..000000000 --- a/mcuboot/testplan/mynewt/keys/rsa/src/keys.c +++ /dev/null @@ -1,34 +0,0 @@ -#include -static unsigned char key[] = { - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe2, 0x48, 0x5f, - 0x31, 0x08, 0x50, 0x2e, 0x4f, 0x6d, 0xbf, 0xcd, 0xd0, 0x09, 0xf1, 0x5c, - 0xd6, 0x08, 0xe9, 0x84, 0xcf, 0x75, 0x2c, 0x88, 0x07, 0xcc, 0x0e, 0xf9, - 0x53, 0xae, 0x4a, 0x9a, 0x93, 0xb4, 0x1b, 0x55, 0x43, 0xb7, 0x7e, 0x10, - 0xa8, 0x50, 0xd9, 0x14, 0x90, 0x05, 0x80, 0x15, 0xa0, 0x8c, 0xdb, 0xdc, - 0x1b, 0x03, 0x56, 0xd6, 0x47, 0x94, 0x44, 0xa1, 0xe8, 0x15, 0xf4, 0x77, - 0x49, 0x60, 0x45, 0x34, 0xa4, 0x17, 0x9a, 0x81, 0xa8, 0xfc, 0xb6, 0xd9, - 0x21, 0xf6, 0x68, 0xfa, 0x7a, 0x13, 0xe5, 0x25, 0xcd, 0xa5, 0x0b, 0x77, - 0x0a, 0x5f, 0xf6, 0x0b, 0x9d, 0x34, 0x8f, 0xc3, 0xf4, 0x91, 0xf7, 0xab, - 0x28, 0x12, 0x52, 0xdc, 0xbb, 0xb2, 0x92, 0x80, 0x98, 0xe2, 0x13, 0x33, - 0xe7, 0xc3, 0x2a, 0x1c, 0x27, 0x98, 0xfc, 0xff, 0x07, 0xdb, 0x5d, 0x16, - 0xd2, 0x50, 0xc1, 0x8e, 0x12, 0xfa, 0x95, 0x98, 0x51, 0x91, 0xbb, 0xf9, - 0xee, 0xc3, 0x65, 0xa4, 0x02, 0xe0, 0xbf, 0xb6, 0xb1, 0xc6, 0x20, 0xc7, - 0x9f, 0xfe, 0x63, 0x61, 0x6a, 0x68, 0xf6, 0x08, 0xca, 0x55, 0x32, 0xc0, - 0x50, 0xdd, 0x8d, 0x52, 0x73, 0x03, 0x7a, 0xbe, 0xd7, 0x32, 0xd9, 0x61, - 0x99, 0x19, 0xff, 0x0d, 0xe6, 0x82, 0xc8, 0x1c, 0x3d, 0x07, 0x1a, 0xe9, - 0xa8, 0x7b, 0xad, 0x75, 0x2c, 0x26, 0x87, 0x3d, 0x67, 0x2b, 0x5a, 0xc4, - 0x7f, 0x70, 0x86, 0x70, 0x8a, 0x7e, 0xed, 0xe9, 0x2f, 0xbe, 0x2a, 0xd5, - 0xb4, 0x33, 0x7b, 0xcc, 0x89, 0xcd, 0x57, 0x08, 0xbb, 0x72, 0xdf, 0x00, - 0x8e, 0xea, 0x8a, 0x2a, 0xa8, 0xa0, 0x1c, 0xb8, 0x8a, 0x61, 0xaf, 0x32, - 0x3d, 0x41, 0xe9, 0xf6, 0xb1, 0xa2, 0x73, 0xc2, 0xff, 0xd1, 0x32, 0x55, - 0x1f, 0xda, 0x09, 0x23, 0xc1, 0x83, 0x51, 0xe1, 0x4f, 0xd5, 0x65, 0x3e, - 0x97, 0x02, 0x03, 0x01, 0x00, 0x01 -}; -static unsigned int key_len = 270; -const struct bootutil_key bootutil_keys[] = { - [0] = { - .key = key, - .len = &key_len, - }, -}; -const int bootutil_key_cnt = 1; diff --git a/mcuboot/testplan/mynewt/project.yml b/mcuboot/testplan/mynewt/project.yml deleted file mode 100644 index a268f4fc3..000000000 --- a/mcuboot/testplan/mynewt/project.yml +++ /dev/null @@ -1,36 +0,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. -# - -project.name: "mcuboot-test" - -project.repositories: - - apache-mynewt-core - - mcuboot - -repository.apache-mynewt-core: - type: github - vers: 0-dev - user: apache - repo: mynewt-core - -repository.mcuboot: - type: github - vers: 0-dev - user: JuulLabs-OSS - repo: mcuboot diff --git a/mcuboot/zephyr/module.yml b/mcuboot/zephyr/module.yml deleted file mode 100644 index 7850f8bd9..000000000 --- a/mcuboot/zephyr/module.yml +++ /dev/null @@ -1,2 +0,0 @@ -samples: - - boot/zephyr diff --git a/west.yml b/west.yml new file mode 100644 index 000000000..8ebf68cca --- /dev/null +++ b/west.yml @@ -0,0 +1,11 @@ +# The west manifest file (west.yml) for the Zephyr Trusted Firmware-M module. +# +# This file specifies dependencies of TF-M, as can also be found referenced in +# the trusted-firmware-m build system. + +manifest: + projects: + - name: tfm-mcuboot + url: https://github.com/zephyrproject-rtos/mcuboot + path: modules/tee/tfm-mcuboot + revision: 1.7.0-rc1