diff --git a/.astyleignore b/.astyleignore index 8f596204b7d..2bc09892b66 100644 --- a/.astyleignore +++ b/.astyleignore @@ -2,13 +2,8 @@ ^cmsis ^features/cryptocell ^features/FEATURE_BLE -^features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV -^features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/attestation.h -^features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl -^features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor -^features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_struct_ipc.h -^features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM -^features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS +^features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV +^features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM ^features/frameworks ^features/lwipstack/lwip ^features/lwipstack/lwip-sys diff --git a/.gitignore b/.gitignore index e89472c010a..ad52c208f81 100644 --- a/.gitignore +++ b/.gitignore @@ -97,3 +97,6 @@ test_suite.json # default delivery dir DELIVERY/ + +# Directory used to clone and build TF-M +features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_IGNORE/ diff --git a/LICENSE.md b/LICENSE.md index 6c226bea937..b0c86f0bf6b 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -5,11 +5,12 @@ Folders containing files under different permissive license than Apache 2.0 are - [cmsis](./cmsis) - MIT, BSD-3-Clause - [components/802.15.4_RF/mcr20a-rf-driver](./components/802.15.4_RF/mcr20a-rf-driver) - BSD-3-Clause -- [components/TARGET_PSA/TARGET_TFM](./components/TARGET_PSA/TARGET_TFM) - BSD-3-Clause -- [components/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation](./components/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation) - BSD-3-Clause - [features/cryptocell/FEATURE_CRYPTOCELL310](./features/cryptocell/FEATURE_CRYPTOCELL310) - ARM Object Code and Header Files License - [features/FEATURE_BOOTLOADER](./features/FEATURE_BOOTLOADER) - PBL - [features/FEATURE_BLE/targets](./features/FEATURE_BLE/targets) - BSD-style, PBL, MIT-style +- [features/FEATURE_PSA/FEATURE_TFM](./features/FEATURE_PSA/FEATURE_TFM) - BSD-3-Clause +- [features/FEATURE_PSA/FEATURE_MBED_PSA_SRV/services/attestation](./features/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation) - BSD-3-Clause +- [features/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor](./features/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor) - BSD-3-Clause - [features/lorawan](./features/lorawan) - Revised BSD - [features/lwipstack](./features/lwipstack) - BSD-style, MIT-style - [features/nanostack/sal-stack-nanostack](./features/nanostack/sal-stack-nanostack) - BSD-3-Clause diff --git a/TESTS/configs/baremetal.json b/TESTS/configs/baremetal.json index fccf94dcff4..4f210ae06d0 100644 --- a/TESTS/configs/baremetal.json +++ b/TESTS/configs/baremetal.json @@ -5,6 +5,7 @@ "utest", "unity", "psa", + "psa-services", "mbedtls", "psa-compliance-framework", "filesystem", diff --git a/TESTS/mbed_hal/trng/main.cpp b/TESTS/mbed_hal/trng/main.cpp index edd5dff70e6..40147e8fd0a 100644 --- a/TESTS/mbed_hal/trng/main.cpp +++ b/TESTS/mbed_hal/trng/main.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2018 ARM Limited. All rights reserved. +* Copyright (c) 2018-2020 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. @@ -69,33 +69,6 @@ using namespace utest::v1; -#if (defined(TARGET_PSA) && defined(COMPONENT_PSA_SRV_IPC) && defined(MBEDTLS_PSA_CRYPTO_C)) -#include "entropy.h" -#include "entropy_poll.h" -#include "crypto.h" -#if !defined(MAX) -#define MAX(a,b) (((a)>(b))?(a):(b)) -#endif - -/* Calculating the minimum allowed entropy size in bytes */ -#define MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE \ - MAX(MBEDTLS_ENTROPY_MIN_PLATFORM, MBEDTLS_ENTROPY_BLOCK_SIZE) - -void inject_entropy_for_psa() -{ - if (psa_crypto_init() == PSA_ERROR_INSUFFICIENT_ENTROPY) { - uint8_t seed[MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE] = {0}; - /* inject some a seed for test*/ - for (int i = 0; i < MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE; ++i) { - seed[i] = i; - } - - /* don't really care if this succeed this is just to make crypto init pass*/ - mbedtls_psa_inject_entropy(seed, MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE); - } -} -#endif // (defined(TARGET_PSA) && defined(COMPONENT_PSA_SRV_IPC) && defined(MBEDTLS_PSA_CRYPTO_C)) - static int fill_buffer_trng(uint8_t *buffer, trng_t *trng_obj, size_t trng_len) { size_t temp_size = 0, output_length = 0; @@ -275,9 +248,6 @@ int main() #if defined(MBEDTLS_PLATFORM_C) ret = mbedtls_platform_setup(NULL); #endif /* MBEDTLS_PLATFORM_C */ -#if (defined(TARGET_PSA) && defined(COMPONENT_PSA_SRV_IPC) && defined(MBEDTLS_PSA_CRYPTO_C)) - inject_entropy_for_psa(); -#endif ret = !Harness::run(specification); #if defined(MBEDTLS_PLATFORM_C) mbedtls_platform_teardown(NULL); diff --git a/TESTS/mbedtls/sanity/main.cpp b/TESTS/mbedtls/sanity/main.cpp index d255ecc0229..c01fa150e22 100644 --- a/TESTS/mbedtls/sanity/main.cpp +++ b/TESTS/mbedtls/sanity/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Arm Limited and affiliates + * Copyright (c) 2018-2020, Arm Limited and affiliates * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,12 +15,11 @@ * limitations under the License. */ -#if ((!defined(TARGET_PSA)) || (!defined(MBEDTLS_PSA_CRYPTO_C))) +#if ((!defined(FEATURE_PSA)) || (!defined(MBEDTLS_PSA_CRYPTO_C))) #error [NOT_SUPPORTED] Mbed Crypto is OFF - skipping. #else #include "psa/crypto.h" - #include #include "mbed.h" #include "greentea-client/test_env.h" @@ -31,7 +30,7 @@ using namespace utest::v1; -#if defined(MBEDTLS_ENTROPY_NV_SEED) || defined(COMPONENT_PSA_SRV_IPC) +#if defined(MBEDTLS_ENTROPY_NV_SEED) #if !defined(MAX) #define MAX(a,b) (((a)>(b))?(a):(b)) @@ -48,7 +47,7 @@ void inject_entropy() } mbedtls_psa_inject_entropy(seed, MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE); } -#endif // defined(MBEDTLS_ENTROPY_NV_SEED) || defined(COMPONENT_PSA_SRV_IPC) +#endif // defined(MBEDTLS_ENTROPY_NV_SEED) void test_crypto_random(void) { @@ -431,12 +430,12 @@ void test_crypto_hash_clone(void) utest::v1::status_t case_setup_handler(const Case *const source, const size_t index_of_case) { psa_status_t status = psa_crypto_init(); -#if defined(MBEDTLS_ENTROPY_NV_SEED) || defined(COMPONENT_PSA_SRV_IPC) +#if defined(MBEDTLS_ENTROPY_NV_SEED) if (status == PSA_ERROR_INSUFFICIENT_ENTROPY) { inject_entropy(); status = psa_crypto_init(); } -#endif /* defined(MBEDTLS_ENTROPY_NV_SEED) || defined(COMPONENT_PSA_SRV_IPC) */ +#endif /* defined(MBEDTLS_ENTROPY_NV_SEED) */ TEST_ASSERT_EQUAL(PSA_SUCCESS, status); return greentea_case_setup_handler(source, index_of_case); } diff --git a/TESTS/mbedtls/selftest/main.cpp b/TESTS/mbedtls/selftest/main.cpp index 207681ca740..1f98c257555 100644 --- a/TESTS/mbedtls/selftest/main.cpp +++ b/TESTS/mbedtls/selftest/main.cpp @@ -1,5 +1,5 @@ /* mbed Microcontroller Library - * Copyright (c) 2016 ARM Limited + * Copyright (c) 2016-2020 ARM Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -87,32 +87,6 @@ Case cases[] = { #endif /* MBEDTLS_SELF_TEST */ }; -#if (defined(MBEDTLS_ENTROPY_C) && defined(TARGET_PSA) && defined(COMPONENT_PSA_SRV_IPC) && defined(MBEDTLS_PSA_CRYPTO_C)) -#include "crypto.h" -#if !defined(MAX) -#define MAX(a,b) (((a)>(b))?(a):(b)) -#endif - -/* Calculating the minimum allowed entropy size in bytes */ -#define MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE \ - MAX(MBEDTLS_ENTROPY_MIN_PLATFORM, MBEDTLS_ENTROPY_BLOCK_SIZE) - -void inject_entropy_for_psa() -{ - if (psa_crypto_init() == PSA_ERROR_INSUFFICIENT_ENTROPY) { - uint8_t seed[MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE] = {0}; - /* inject some a seed for test*/ - for (int i = 0; i < MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE; ++i) { - seed[i] = i; - } - - /* don't really care if this succeed this is just to make crypto init pass*/ - mbedtls_psa_inject_entropy(seed, MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE); - } -} -#endif // (defined(MBEDTLS_ENTROPY_C) && defined(TARGET_PSA) && defined(COMPONENT_PSA_SRV_IPC) && defined(MBEDTLS_PSA_CRYPTO_C)) - - utest::v1::status_t test_setup(const size_t num_cases) { GREENTEA_SETUP(120, "default_auto"); @@ -131,10 +105,6 @@ int main() } #endif -#if (defined(MBEDTLS_ENTROPY_C) && defined(TARGET_PSA) && defined(COMPONENT_PSA_SRV_IPC) && defined(MBEDTLS_PSA_CRYPTO_C)) - inject_entropy_for_psa(); -#endif - ret = (Harness::run(specification) ? 0 : 1); #if defined(MBEDTLS_PLATFORM_C) mbedtls_platform_teardown(NULL); diff --git a/cmsis/TARGET_CORTEX_M/mbed_tz_context.c b/cmsis/TARGET_CORTEX_M/mbed_tz_context.c index 17bf625afea..917eeaeeced 100644 --- a/cmsis/TARGET_CORTEX_M/mbed_tz_context.c +++ b/cmsis/TARGET_CORTEX_M/mbed_tz_context.c @@ -5,7 +5,7 @@ * @date 10. January 2018 ******************************************************************************/ /* - * Copyright (c) 2016-2018 Arm Limited. All rights reserved. + * Copyright (c) 2016-2020 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -22,7 +22,7 @@ * limitations under the License. */ -#if !TARGET_TFM +#if !FEATURE_TFM #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) @@ -204,4 +204,4 @@ uint32_t TZ_StoreContext_S (TZ_MemoryId_t id) { } #endif -#endif // !TARGET_TFM +#endif // !FEATURE_TFM diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/attestation/main.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/attestation/main.cpp similarity index 97% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/attestation/main.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/attestation/main.cpp index c7305cae254..866123c784c 100755 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/attestation/main.cpp +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/attestation/main.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2019 ARM Limited. All rights reserved. +* Copyright (c) 2019-2020 ARM Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -135,7 +135,7 @@ utest::v1::status_t case_setup_handler(const Case *const source, const size_t in psa_status_t status; status = mbed_psa_reboot_and_request_new_security_state(PSA_LIFECYCLE_ASSEMBLY_AND_TEST); TEST_ASSERT_EQUAL(PSA_SUCCESS, status); -#if (defined(COMPONENT_PSA_SRV_IPC) || defined(MBEDTLS_ENTROPY_NV_SEED)) +#if defined(MBEDTLS_ENTROPY_NV_SEED) uint8_t seed[MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE] = {0}; /* inject some seed for test*/ for (int i = 0; i < MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE; ++i) { diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/psa_attestation_testlist.md b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/psa_attestation_testlist.md similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/psa_attestation_testlist.md rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/psa_attestation_testlist.md diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_a001.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_a001.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_a001.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_a001.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_a001.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_a001.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_a001.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_a001.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_attestation/test_a001/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/psa_its_testlist.md b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/psa_its_testlist.md similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/psa_its_testlist.md rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/psa_its_testlist.md diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_s001.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_s001.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_s001.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_s001.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_s001.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_s001.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_s001.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s001/test_s001.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_s002.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_s002.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_s002.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_s002.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_s002.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_s002.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_s002.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s002/test_s002.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_s003.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_s003.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_s003.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_s003.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_s003.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_s003.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_s003.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s003/test_s003.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_s004.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_s004.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_s004.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_s004.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_s004.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_s004.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_s004.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s004/test_s004.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_s005.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_s005.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_s005.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_s005.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_s005.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_s005.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_s005.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s005/test_s005.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_s006.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_s006.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_s006.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_s006.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_s006.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_s006.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_s006.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s006/test_s006.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_s007.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_s007.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_s007.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_s007.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_s007.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_s007.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_s007.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s007/test_s007.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_s008.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_s008.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_s008.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_s008.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_s008.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_s008.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_s008.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s008/test_s008.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_s009.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_s009.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_s009.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_s009.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_s009.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_s009.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_s009.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s009/test_s009.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/main.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/main.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/main.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/main.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_entry.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_entry.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_entry.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_entry.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_its_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_its_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_its_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_its_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_ps_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_ps_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_ps_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_ps_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_s010.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_s010.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_s010.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_s010.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_s010.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_s010.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_s010.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/compliance_its/test_s010/test_s010.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/crypto_init/main.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/crypto_init/main.cpp similarity index 73% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/crypto_init/main.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/crypto_init/main.cpp index c5854499276..778b0fb6af4 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/crypto_init/main.cpp +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/crypto_init/main.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2018 ARM Limited. All rights reserved. +* Copyright (c) 2018-2020 ARM Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -46,31 +46,6 @@ utest::v1::status_t greentea_test_setup(const size_t number_of_cases) return greentea_test_setup_handler(number_of_cases); } -static void check_multi_crypto_init_deinit() -{ -#if !defined(COMPONENT_PSA_SRV_IPC) - TEST_SKIP(); -#endif - uint8_t output[TEST_RANDOM_SIZE] = {0}; - - psa_status_t status = psa_crypto_init(); - TEST_ASSERT_EQUAL(PSA_SUCCESS, status); - - status = psa_crypto_init(); - TEST_ASSERT_EQUAL(PSA_SUCCESS, status); - - status = psa_generate_random(output, sizeof(output)); - TEST_ASSERT_NOT_EQUAL(PSA_ERROR_BAD_STATE, status); - - mbedtls_psa_crypto_free(); - status = psa_generate_random(output, sizeof(output)); - TEST_ASSERT_NOT_EQUAL(PSA_ERROR_BAD_STATE, status); - - mbedtls_psa_crypto_free(); - status = psa_generate_random(output, sizeof(output)); - TEST_ASSERT_EQUAL(PSA_ERROR_BAD_STATE, status); -} - static void check_crypto_init_deinit() { psa_status_t status; @@ -93,14 +68,13 @@ static void check_crypto_init_deinit() Case cases[] = { Case("PSA crypto-init De-init", check_crypto_init_deinit), - Case("PSA crypto- multiple init De-init", check_multi_crypto_init_deinit), }; Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler); int main() { -#if (defined(COMPONENT_PSA_SRV_IPC) || defined(MBEDTLS_ENTROPY_NV_SEED)) +#if defined(MBEDTLS_ENTROPY_NV_SEED) uint8_t seed[MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE] = {0}; /* inject some a seed for test*/ for (int i = 0; i < MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE; ++i) { diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/entropy_inject/main.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/entropy_inject/main.cpp similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/entropy_inject/main.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/entropy_inject/main.cpp diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/its_ps/main.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/its_ps/main.cpp similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TESTS/its_ps/main.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/TESTS/its_ps/main.cpp diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/client.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/client.h new file mode 100644 index 00000000000..de1c520c527 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/client.h @@ -0,0 +1,155 @@ +/* Copyright (c) 2017-2020 ARM Limited + * + * 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(FEATURE_TFM) +#include "interface/include/psa_client.h" +#else + +#ifndef __MBED_OS_DEFAULT_PSA_CLIENT_API_H__ +#define __MBED_OS_DEFAULT_PSA_CLIENT_API_H__ + +#include +#include "psa/error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(UINT32_MAX) +#define UINT32_MAX ((uint32_t)-1) +#endif + +#if !defined(INT32_MIN) +#define INT32_MIN (-0x7fffffff - 1) +#endif + +#define PSA_FRAMEWORK_VERSION (0x0100) /**< Version of the PSA Framework API. */ +#define PSA_VERSION_NONE (0L) /**< Identifier for an unimplemented Root of Trust (RoT) Service. */ +#define PSA_CONNECTION_REFUSED (INT32_MIN + 1) /**< The return value from psa_connect() if the RoT Service or SPM was unable to establish a connection.*/ +#define PSA_CONNECTION_BUSY (INT32_MIN + 2) /**< The return value from psa_connect() if the RoT Service rejects the connection for a transient reason.*/ +#define PSA_DROP_CONNECTION (INT32_MIN) /**< The result code in a call to psa_reply() to indicate a nonrecoverable error in the client.*/ +#define PSA_NULL_HANDLE ((psa_handle_t)0) /**< Denotes an invalid handle.*/ + +typedef int32_t psa_handle_t; + +typedef struct psa_invec { + const void *base; /**< Starting address of the buffer.*/ + size_t len; /**< Length in bytes of the buffer.*/ +} psa_invec; + + +typedef struct psa_outvec { + void *base; /**< Starting address of the buffer.*/ + size_t len; /**< Length in bytes of the buffer.*/ +} psa_outvec; + +/** + * \brief Retrieve the version of the PSA Framework API that is implemented. + * + * \return version The version of the PSA Framework implementation + * that is providing the runtime services to the + * caller. The major and minor version are encoded + * as follows: + * \arg version[15:8] -- major version number. + * \arg version[7:0] -- minor version number. + */ +uint32_t psa_framework_version(void); + +/** + * \brief Retrieve the version of an RoT Service or indicate that it is not + * present on this system. + * + * \param[in] sid ID of the RoT Service to query. + * + * \retval PSA_VERSION_NONE The RoT Service is not implemented, or the + * caller is not permitted to access the service. + * \retval > 0 The version of the implemented RoT Service. + */ +uint32_t psa_version(uint32_t sid); + +/** + * \brief Connect to an RoT Service by its SID. + * + * \param[in] sid ID of the RoT Service to connect to. + * \param[in] version Requested version of the RoT Service. + * + * \retval > 0 A handle for the connection. + * \retval PSA_ERROR_CONNECTION_REFUSED The SPM or RoT Service has refused the + * connection. + * \retval PSA_ERROR_CONNECTION_BUSY The SPM or RoT Service cannot make the + * connection at the moment. + * \retval "PROGRAMMER ERROR" The call is a PROGRAMMER ERROR if one or more + * of the following are true: + * \arg The RoT Service ID is not present. + * \arg The RoT Service version is not supported. + * \arg The caller is not allowed to access the RoT + * service. + */ +psa_handle_t psa_connect(uint32_t sid, uint32_t version); + +/** + * \brief Call an RoT Service on an established connection. + * + * \param[in] handle A handle to an established connection. + * \param[in] type The reuqest type. + * Must be zero( \ref PSA_IPC_CALL) or positive. + * \param[in] in_vec Array of input \ref psa_invec structures. + * \param[in] in_len Number of input \ref psa_invec structures. + * \param[in/out] out_vec Array of output \ref psa_outvec structures. + * \param[in] out_len Number of output \ref psa_outvec structures. + * + * \retval >=0 RoT Service-specific status value. + * \retval <0 RoT Service-specific error code. + * \retval PSA_ERROR_PROGRAMMER_ERROR The connection has been terminated by the + * RoT Service. The call is a PROGRAMMER ERROR if + * one or more of the following are true: + * \arg An invalid handle was passed. + * \arg The connection is already handling a request. + * \arg type < 0. + * \arg An invalid memory reference was provided. + * \arg in_len + out_len > PSA_MAX_IOVEC. + * \arg The message is unrecognized by the RoT + * Service or incorrectly formatted. + */ +psa_status_t psa_call(psa_handle_t handle, int32_t type, + const psa_invec *in_vec, + size_t in_len, + psa_outvec *out_vec, + size_t out_len); + +/** + * \brief Close a connection to an RoT Service. + * + * \param[in] handle A handle to an established connection, or the + * null handle. + * + * \retval void Success. + * \retval "PROGRAMMER ERROR" The call is a PROGRAMMER ERROR if one or more + * of the following are true: + * \arg An invalid handle was provided that is not + * the null handle. + * \arg The connection is currently handling a + * request. + */ +void psa_close(psa_handle_t handle); + +#ifdef __cplusplus +} +#endif + +#endif // __MBED_OS_DEFAULT_PSA_CLIENT_API_H__ +#endif diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_accel_driver.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_accel_driver.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_accel_driver.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_accel_driver.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_compat.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_compat.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_compat.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_compat.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_driver_common.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_driver_common.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_driver_common.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_driver_common.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_entropy_driver.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_entropy_driver.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_entropy_driver.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_entropy_driver.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_extra.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_extra.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_extra.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_extra.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_platform.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_platform.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_platform.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_platform.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_se_driver.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_se_driver.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_se_driver.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_se_driver.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_sizes.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_sizes.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_sizes.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_sizes.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_types.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_types.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_types.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_types.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_values.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_values.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/inc/psa/crypto_values.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/crypto_values.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/error.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/error.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/error.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/error.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/internal_trusted_storage.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/internal_trusted_storage.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/internal_trusted_storage.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/internal_trusted_storage.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/lifecycle.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/lifecycle.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/lifecycle.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/lifecycle.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/protected_storage.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/protected_storage.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/protected_storage.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/protected_storage.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/service.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/service.h similarity index 92% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/service.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/service.h index 355c966dd06..ff54f1c28b5 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/service.h +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/service.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2018 ARM Limited +/* Copyright (c) 2017-2020 ARM Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -15,7 +15,7 @@ * limitations under the License. */ -#if defined(TARGET_TFM) +#if defined(FEATURE_TFM) #include "interface/include/psa_service.h" #include "secure_fw/core/ipc/include/tfm_utils.h" diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/storage_common.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/storage_common.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/storage_common.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/inc/psa/storage_common.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/COMPONENT_PSA_SRV_IMPL/mbed_lib.json b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbed_lib.json similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/COMPONENT_PSA_SRV_IMPL/mbed_lib.json rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbed_lib.json diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/COMPONENT_NSPE/crypto_struct.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/crypto_struct.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/COMPONENT_NSPE/crypto_struct.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/crypto_struct.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_core.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_core.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_core.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_core.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_invasive.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_invasive.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_invasive.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_invasive.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_its.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_its.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_its.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_its.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_se.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_se.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_se.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_se.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_se.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_se.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_se.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_se.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_service_integration.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_service_integration.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_service_integration.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_service_integration.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_slot_management.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_slot_management.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_slot_management.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_slot_management.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_slot_management.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_slot_management.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_slot_management.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_slot_management.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_storage.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_storage.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_storage.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_storage.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_storage.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_storage.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_crypto_storage.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_crypto_storage.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_its_file.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_its_file.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_MBED_PSA_SRV/COMPONENT_PSA_SRV_IMPL/psa_its_file.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls/psa_its_file.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal_attestation_eat.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_attestation_eat.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal_attestation_eat.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_attestation_eat.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal_attestation_eat.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_attestation_eat.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal_attestation_eat.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_attestation_eat.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_attestation_intf.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_attestation_intf.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_attestation_intf.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_attestation_intf.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_attestation_intf.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_attestation_intf.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_attestation_intf.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_attestation_intf.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_client_api_empty_intf.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_client_api_empty_intf.c similarity index 96% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_client_api_empty_intf.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_client_api_empty_intf.c index eb8fb2e3cd9..8e9b90dcda9 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_client_api_empty_intf.c +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_client_api_empty_intf.c @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,8 +15,6 @@ * limitations under the License. **/ -#ifndef COMPONENT_PSA_SRV_IPC - #include "pal_common.h" #include "pal_client_api_intf.h" @@ -94,5 +92,3 @@ void pal_ipc_close(psa_handle_t handle) { return; } - -#endif diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_client_api_intf.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_client_api_intf.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_client_api_intf.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_client_api_intf.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_client_api_intf.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_client_api_intf.h similarity index 80% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_client_api_intf.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_client_api_intf.h index e5cf884cf0e..3c53f5ea42e 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_client_api_intf.h +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_client_api_intf.h @@ -1,5 +1,5 @@ /** @file - * Copyright (c) 2018, Arm Limited or its affiliates. All rights reserved. + * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved. * SPDX-License-Identifier : Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,17 +18,6 @@ #ifndef _PAL_CLIENT_API_H_ #define _PAL_CLIENT_API_H_ -#if PSA_IPC_IMPLEMENTED -/* psa/client.h: Contains the Client API elements. Accessible to all applications */ -#include "psa/client.h" - -/* psa_manifest/sid.h: Macro definitions derived from manifest files that map from RoT Service - * names to Service IDs (SIDs). - * Partition manifest parse build tool must provide the implementation of this file. -*/ -#include "psa_manifest/sid.h" - -#else #include "pal_common.h" #define PSA_VERSION_NONE (0) @@ -59,7 +48,6 @@ psa_status_t psa_call(psa_handle_t handle, psa_outvec *out_vec, size_t out_len); void psa_close(psa_handle_t handle); -#endif /* PSA_IPC_IMPLEMENTED */ uint32_t pal_ipc_framework_version(void); uint32_t pal_ipc_version(uint32_t sid); diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_common.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_common.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_common.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_common.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal_interfaces_ns.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_interfaces_ns.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal_interfaces_ns.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_interfaces_ns.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_internal_trusted_storage_intf.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_internal_trusted_storage_intf.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_internal_trusted_storage_intf.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_internal_trusted_storage_intf.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_internal_trusted_storage_intf.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_internal_trusted_storage_intf.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_internal_trusted_storage_intf.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_internal_trusted_storage_intf.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_mbed_os_intf.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_mbed_os_intf.cpp similarity index 85% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_mbed_os_intf.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_mbed_os_intf.cpp index 9a797f480d5..be1c70e255e 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_mbed_os_intf.cpp +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_mbed_os_intf.cpp @@ -1,4 +1,21 @@ -#include "mbed.h" +/* + * Copyright (c) 2019-2020 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. + */ + #include "rtos.h" #include "mbed_assert.h" #include "val_interfaces.h" diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_mbed_os_intf.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_mbed_os_intf.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_mbed_os_intf.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_mbed_os_intf.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_protected_storage_intf.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_protected_storage_intf.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_protected_storage_intf.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_protected_storage_intf.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_protected_storage_intf.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_protected_storage_intf.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/pal/pal_protected_storage_intf.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/pal/pal_protected_storage_intf.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/LICENSE b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/LICENSE rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/LICENSE-BSD-3-Clause b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE-BSD-3-Clause similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/LICENSE-BSD-3-Clause rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE-BSD-3-Clause diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attest_boot_status_loader.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attest_boot_status_loader.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attest_boot_status_loader.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attest_boot_status_loader.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attest_crypto.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attest_crypto.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attest_crypto.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attest_crypto.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attest_crypto_keys.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attest_crypto_keys.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attest_crypto_keys.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attest_crypto_keys.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attest_iat_claims_loader.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attest_iat_claims_loader.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attest_iat_claims_loader.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attest_iat_claims_loader.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/attestation.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attestation.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/attestation.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attestation.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attestation_bootloader_data.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attestation_bootloader_data.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attestation_bootloader_data.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attestation_bootloader_data.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attestation_bootloader_data.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attestation_bootloader_data.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/attestation_bootloader_data.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/attestation_bootloader_data.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_EMUL/psa_attest_inject_key.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_attest_inject_key.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_EMUL/psa_attest_inject_key.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_attest_inject_key.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_attest_inject_key.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_attest_inject_key.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_attest_inject_key.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_attest_inject_key.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/psa_attestation_stubs.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_attestation_stubs.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/psa_attestation_stubs.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_attestation_stubs.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_EMUL/psa_initial_attestation_api.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_initial_attestation_api.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_EMUL/psa_initial_attestation_api.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_initial_attestation_api.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_initial_attestation_api.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_initial_attestation_api.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_initial_attestation_api.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_initial_attestation_api.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/psa_inject_attestation_key_impl.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_inject_attestation_key_impl.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/psa_inject_attestation_key_impl.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_inject_attestation_key_impl.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/psa_inject_attestation_key_impl.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_inject_attestation_key_impl.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/psa_inject_attestation_key_impl.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/psa_inject_attestation_key_impl.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/.mbedignore b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/.mbedignore similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/.mbedignore rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/.mbedignore diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/CMakeLists.txt b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/CMakeLists.txt similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/CMakeLists.txt rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/CMakeLists.txt diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/README.md b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/README.md similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/README.md rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/README.md diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/UsefulBuf.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/UsefulBuf.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/UsefulBuf.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/UsefulBuf.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/qcbor.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/qcbor.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/qcbor.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/qcbor.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/useful_buf.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/useful_buf.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/useful_buf.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/inc/useful_buf.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/UsefulBuf.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/UsefulBuf.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/UsefulBuf.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/UsefulBuf.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/ieee754.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/ieee754.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/ieee754.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/ieee754.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/ieee754.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/ieee754.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/ieee754.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/ieee754.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/qcbor_decode.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/qcbor_decode.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/qcbor_decode.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/qcbor_decode.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/qcbor_encode.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/qcbor_encode.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/qcbor_encode.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/src/qcbor_encode.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/UsefulBuf_Tests.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/UsefulBuf_Tests.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/UsefulBuf_Tests.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/UsefulBuf_Tests.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/UsefulBuf_Tests.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/UsefulBuf_Tests.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/UsefulBuf_Tests.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/UsefulBuf_Tests.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/float_tests.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/float_tests.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/float_tests.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/float_tests.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/float_tests.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/float_tests.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/float_tests.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/float_tests.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/half_to_double_from_rfc7049.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/half_to_double_from_rfc7049.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/half_to_double_from_rfc7049.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/half_to_double_from_rfc7049.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/half_to_double_from_rfc7049.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/half_to_double_from_rfc7049.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/half_to_double_from_rfc7049.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/half_to_double_from_rfc7049.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_decode_tests.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_decode_tests.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_decode_tests.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_decode_tests.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_decode_tests.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_decode_tests.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_decode_tests.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_decode_tests.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_encode_tests.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_encode_tests.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_encode_tests.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_encode_tests.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_encode_tests.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_encode_tests.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_encode_tests.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/qcbor_encode_tests.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/run_tests.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/run_tests.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/run_tests.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/run_tests.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/run_tests.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/run_tests.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/run_tests.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/qcbor/test/run_tests.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_client.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_client.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_client.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_client.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/attest_eat_defines.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/attest_eat_defines.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/attest_eat_defines.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/attest_eat_defines.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/attest_token.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/attest_token.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/attest_token.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/attest_token.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/attest_token.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/attest_token.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/attest_token.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/attest_token.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/attestation_core.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/attestation_core.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/attestation_core.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/attestation_core.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/CMakeLists.txt b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/CMakeLists.txt similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/CMakeLists.txt rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/CMakeLists.txt diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/README.md b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/README.md similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/README.md rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/README.md diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/inc/t_cose_common.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/inc/t_cose_common.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/inc/t_cose_common.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/inc/t_cose_common.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/inc/t_cose_sign1_sign.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/inc/t_cose_sign1_sign.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/inc/t_cose_sign1_sign.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/inc/t_cose_sign1_sign.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_crypto.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_crypto.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_crypto.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_crypto.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_defines.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_defines.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_defines.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_defines.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_sign1_sign.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_sign1_sign.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_sign1_sign.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_sign1_sign.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_util.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_util.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_util.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_util.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_util.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_util.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/t_cose/src/t_cose_util.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/t_cose/src/t_cose_util.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_attest_hal.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_attest_hal.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_attest_hal.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_attest_hal.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_boot_status.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_boot_status.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_boot_status.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_boot_status.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_plat_boot_seed.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_plat_boot_seed.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_plat_boot_seed.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_plat_boot_seed.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_plat_crypto_keys.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_plat_crypto_keys.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_plat_crypto_keys.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_plat_crypto_keys.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_plat_defs.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_plat_defs.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_plat_defs.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_plat_defs.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_plat_device_id.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_plat_device_id.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_impl/tfm_plat_device_id.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_impl/tfm_plat_device_id.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_memory_utils.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_memory_utils.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IMPL/tfm_memory_utils.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/attestation/tfm_memory_utils.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/platform/COMPONENT_PSA_SRV_EMUL/platform_emul.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/platform/platform_emul.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/platform/COMPONENT_PSA_SRV_EMUL/platform_emul.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/platform/platform_emul.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/platform/COMPONENT_PSA_SRV_IMPL/platform_srv_impl.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/platform/platform_srv_impl.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/platform/COMPONENT_PSA_SRV_IMPL/platform_srv_impl.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/platform/platform_srv_impl.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/platform/COMPONENT_PSA_SRV_IMPL/platform_srv_impl.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/platform/platform_srv_impl.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/platform/COMPONENT_PSA_SRV_IMPL/platform_srv_impl.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/platform/platform_srv_impl.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/common/psa_storage_common_impl.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/common/psa_storage_common_impl.cpp similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/common/psa_storage_common_impl.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/common/psa_storage_common_impl.cpp diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/common/psa_storage_common_impl.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/common/psa_storage_common_impl.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/common/psa_storage_common_impl.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/common/psa_storage_common_impl.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_IMPL/TARGET_TFM/its_tfm_impl.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/its_tfm_impl.cpp similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_IMPL/TARGET_TFM/its_tfm_impl.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/its_tfm_impl.cpp diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_IMPL/pits_impl.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/pits_impl.cpp similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_IMPL/pits_impl.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/pits_impl.cpp diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_IMPL/pits_impl.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/pits_impl.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_IMPL/pits_impl.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/pits_impl.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_EMUL/psa_prot_internal_storage.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/psa_prot_internal_storage.cpp similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_EMUL/psa_prot_internal_storage.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/psa_prot_internal_storage.cpp diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/psa_prot_internal_storage.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/psa_prot_internal_storage.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/psa_prot_internal_storage.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/its/psa_prot_internal_storage.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/ps/COMPONENT_NSPE/protected_storage.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/ps/protected_storage.cpp similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/ps/COMPONENT_NSPE/protected_storage.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/services/storage/ps/protected_storage.cpp diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/src/client.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/src/client.c new file mode 100644 index 00000000000..2cc8bb40230 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/src/client.c @@ -0,0 +1,51 @@ +/* Copyright (c) 2017-2020 ARM Limited + * + * 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 implementation of the PSA Client API is provided for application + * compatibility on single v7-M targets. The client implementation is stubbed + * and non-functional, but present and returns sane errors. */ + +#include "psa/client.h" + +uint32_t psa_framework_version(void) +{ + return PSA_FRAMEWORK_VERSION; +} + +uint32_t psa_version(uint32_t sid) +{ + return PSA_VERSION_NONE; +} + +psa_handle_t psa_connect(uint32_t sid, uint32_t version) +{ + return PSA_ERROR_PROGRAMMER_ERROR; +} + +psa_status_t psa_call(psa_handle_t handle, int32_t type, + const psa_invec *in_vec, + size_t in_len, + psa_outvec *out_vec, + size_t out_len) +{ + return PSA_ERROR_PROGRAMMER_ERROR; +} + +void psa_close(psa_handle_t handle) +{ + return; +} diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/COMPONENT_PSA_SRV_IMPL/src/default_random_seed.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/src/default_random_seed.cpp similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/COMPONENT_PSA_SRV_IMPL/src/default_random_seed.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/src/default_random_seed.cpp diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_attestation.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_attestation.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_attestation.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_attestation.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_attestation.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_attestation.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_attestation.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_attestation.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_client_defs.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_client_defs.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_client_defs.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_client_defs.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_entry.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_entry.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_entry.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_entry.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_framework.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_framework.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_framework.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_framework.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_greentea.cpp b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_greentea.cpp similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_greentea.cpp rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_greentea.cpp diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_greentea.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_greentea.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_greentea.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_greentea.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_interfaces.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_interfaces.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_interfaces.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_interfaces.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_interfaces.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_interfaces.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_interfaces.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_interfaces.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_internal_trusted_storage.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_internal_trusted_storage.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_internal_trusted_storage.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_internal_trusted_storage.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_internal_trusted_storage.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_internal_trusted_storage.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_internal_trusted_storage.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_internal_trusted_storage.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_protected_storage.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_protected_storage.c similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_protected_storage.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_protected_storage.c diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_protected_storage.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_protected_storage.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_protected_storage.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_protected_storage.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_target.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_target.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/val_target.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_MBED_PSA_SRV/val/val_target.h diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/platform_multicore.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/platform_multicore.c new file mode 100644 index 00000000000..e860ae03e92 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/platform_multicore.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2019 Arm Limited. All rights reserved. + * Copyright (c) 2019 Cypress Semiconductor Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "cmsis_compiler.h" + +#include "platform_multicore.h" +#include "tfm_multi_core_api.h" +#include "tfm_ns_mailbox.h" + +#include "cy_ipc_drv.h" +#include "cy_sysint.h" +#if CY_SYSTEM_CPU_CM0P +#include "spe_ipc_config.h" +#else +#include "ns_ipc_config.h" +#endif + +int platform_mailbox_fetch_msg_ptr(void **msg_ptr) +{ + cy_en_ipcdrv_status_t status; + + if (!msg_ptr) { + return PLATFORM_MAILBOX_INVAL_PARAMS; + } + + status = Cy_IPC_Drv_ReadMsgPtr(Cy_IPC_Drv_GetIpcBaseAddress(IPC_RX_CHAN), + msg_ptr); + if (status != CY_IPC_DRV_SUCCESS) { + return PLATFORM_MAILBOX_RX_ERROR; + } + + Cy_IPC_Drv_ReleaseNotify(Cy_IPC_Drv_GetIpcBaseAddress(IPC_RX_CHAN), + IPC_RX_RELEASE_MASK); + return PLATFORM_MAILBOX_SUCCESS; +} + +int platform_mailbox_fetch_msg_data(uint32_t *data_ptr) +{ + cy_en_ipcdrv_status_t status; + + if (!data_ptr) { + return PLATFORM_MAILBOX_INVAL_PARAMS; + } + + status = Cy_IPC_Drv_ReadMsgWord(Cy_IPC_Drv_GetIpcBaseAddress(IPC_RX_CHAN), + data_ptr); + if (status != CY_IPC_DRV_SUCCESS) { + return PLATFORM_MAILBOX_RX_ERROR; + } + + Cy_IPC_Drv_ReleaseNotify(Cy_IPC_Drv_GetIpcBaseAddress(IPC_RX_CHAN), + IPC_RX_RELEASE_MASK); + return PLATFORM_MAILBOX_SUCCESS; +} + +int platform_mailbox_send_msg_ptr(const void *msg_ptr) +{ + cy_en_ipcdrv_status_t status; + + if (!msg_ptr) + return PLATFORM_MAILBOX_INVAL_PARAMS; + + status = Cy_IPC_Drv_SendMsgPtr(Cy_IPC_Drv_GetIpcBaseAddress(IPC_TX_CHAN), + IPC_TX_NOTIFY_MASK, msg_ptr); + if (status != CY_IPC_DRV_SUCCESS) { + return PLATFORM_MAILBOX_TX_ERROR; + } + + return PLATFORM_MAILBOX_SUCCESS; +} + +int platform_mailbox_send_msg_data(uint32_t data) +{ + cy_en_ipcdrv_status_t status; + + status = Cy_IPC_Drv_SendMsgWord(Cy_IPC_Drv_GetIpcBaseAddress(IPC_TX_CHAN), + IPC_TX_NOTIFY_MASK, data); + if (status != CY_IPC_DRV_SUCCESS) { + return PLATFORM_MAILBOX_TX_ERROR; + } + + return PLATFORM_MAILBOX_SUCCESS; +} + +void platform_mailbox_wait_for_notify(void) +{ + uint32_t status; + + while (1) { + status = Cy_IPC_Drv_GetInterruptStatusMasked( + Cy_IPC_Drv_GetIntrBaseAddr(IPC_RX_INTR_STRUCT)); + status >>= CY_IPC_NOTIFY_SHIFT; + if (status & IPC_RX_INT_MASK) { + break; + } + } + + Cy_IPC_Drv_ClearInterrupt(Cy_IPC_Drv_GetIntrBaseAddr(IPC_RX_INTR_STRUCT), + 0, IPC_RX_INT_MASK); +} + +int platform_ns_ipc_init(void) +{ + Cy_IPC_Drv_SetInterruptMask(Cy_IPC_Drv_GetIntrBaseAddr(IPC_RX_INTR_STRUCT), + 0, IPC_RX_INT_MASK); + return PLATFORM_MAILBOX_SUCCESS; +} + +int32_t tfm_platform_ns_wait_for_s_cpu_ready(void) +{ + uint32_t data = 0; + + if (platform_ns_ipc_init() != PLATFORM_MAILBOX_SUCCESS) { + return PLATFORM_MAILBOX_INVAL_PARAMS; + } + while(data != IPC_SYNC_MAGIC) + { + platform_mailbox_wait_for_notify(); + platform_mailbox_fetch_msg_data(&data); + } + + if (platform_mailbox_send_msg_data(~IPC_SYNC_MAGIC) != + PLATFORM_MAILBOX_SUCCESS) { + return PLATFORM_MAILBOX_RX_ERROR; + } + return PLATFORM_MAILBOX_SUCCESS; +} diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/platform_ns_mailbox.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/platform_ns_mailbox.c new file mode 100644 index 00000000000..af08ac1a394 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/platform_ns_mailbox.c @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * Copyright (c) 2019, Cypress Semiconductor Corporation. All rights reserved + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* -------------------------------------- Includes ----------------------------------- */ +#include +#include + +#include "cmsis_compiler.h" + +#include "cy_ipc_drv.h" +#include "cy_sysint.h" +#include "cy_ipc_sema.h" + +#include "ns_ipc_config.h" +#include "tfm_ns_mailbox.h" +#include "platform_multicore.h" +#include "cmsis_os2.h" + +static uint8_t saved_irq_state = 1; + +/* -------------------------------------- HAL API ------------------------------------ */ + +static void mailbox_ipc_init(void) +{ + Cy_IPC_Drv_SetInterruptMask(Cy_IPC_Drv_GetIntrBaseAddr(IPC_RX_INTR_STRUCT), + 0, IPC_RX_INT_MASK); +} + +static void mailbox_ipc_config(void) +{ + NVIC_SetPriority(PSA_CLIENT_REPLY_NVIC_IRQn, PSA_CLIENT_REPLY_IRQ_PRIORITY); + + NVIC_EnableIRQ(PSA_CLIENT_REPLY_NVIC_IRQn); +} + +int32_t tfm_ns_mailbox_hal_notify_peer(void) +{ + cy_en_ipcdrv_status_t status; + + status = Cy_IPC_Drv_SendMsgWord(Cy_IPC_Drv_GetIpcBaseAddress(IPC_TX_CHAN), + IPC_TX_NOTIFY_MASK, + PSA_CLIENT_CALL_REQ_MAGIC); + + if (status == CY_IPC_DRV_SUCCESS) { + return MAILBOX_SUCCESS; + } else { + return MAILBOX_CHAN_BUSY; + } +} + +static int32_t mailbox_sema_init(void) +{ + /* semaphore data */ + static uint32_t tfm_sema __attribute__((section("TFM_SHARED_DATA"))); + + if (Cy_IPC_Sema_Init(PLATFORM_MAILBOX_IPC_CHAN_SEMA, + sizeof(tfm_sema) * CHAR_BIT, + &tfm_sema) != CY_IPC_SEMA_SUCCESS) { + return PLATFORM_MAILBOX_INIT_ERROR; + } + return PLATFORM_MAILBOX_SUCCESS; +} + +int32_t tfm_ns_mailbox_hal_init(struct ns_mailbox_queue_t *queue) +{ + uint32_t stage; + + if (!queue) { + return MAILBOX_INVAL_PARAMS; + } + + /* Init semaphores used for critical sections */ + if (mailbox_sema_init() != PLATFORM_MAILBOX_SUCCESS) + return MAILBOX_INIT_ERROR; + + /* + * FIXME + * Further verification of mailbox queue address may be required according + * to diverse NSPE implementations. + */ + + mailbox_ipc_init(); + + /* + * Wait until SPE mailbox library is ready to receive NSPE mailbox queue + * address. + */ + while (1) { + platform_mailbox_wait_for_notify(); + + platform_mailbox_fetch_msg_data(&stage); + if (stage == NS_MAILBOX_INIT_ENABLE) { + break; + } + } + + /* Send out the address */ + platform_mailbox_send_msg_ptr(queue); + + /* Wait until SPE mailbox service is ready */ + while (1) { + platform_mailbox_wait_for_notify(); + + platform_mailbox_fetch_msg_data(&stage); + if (stage == S_MAILBOX_READY) { + break; + } + } + + mailbox_ipc_config(); + + return MAILBOX_SUCCESS; +} + +const void *tfm_ns_mailbox_get_task_handle(void) +{ +#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL + return osThreadGetId(); +#else + return NULL; +#endif +} + +void tfm_ns_mailbox_hal_wait_reply(mailbox_msg_handle_t handle) +{ + osThreadFlagsWait(handle, osFlagsWaitAll, osWaitForever); +} + +static cy_en_ipcsema_status_t mailbox_raw_spin_lock(uint32_t ipc_channel, + uint32_t sema_num) +{ + uint32_t semaIndex; + uint32_t semaMask; + cy_stc_ipc_sema_t *semaStruct; + cy_en_ipcdrv_status_t acqStatus; + cy_en_ipcsema_status_t ret = CY_IPC_SEMA_BAD_PARAM; + bool is_lock = false; + IPC_STRUCT_Type *semaIpcStruct; + + /* Get IPC register structure */ + semaIpcStruct = Cy_IPC_Drv_GetIpcBaseAddress(ipc_channel); + /* Get pointer to structure */ + semaStruct = (cy_stc_ipc_sema_t *)Cy_IPC_Drv_ReadDataValue(semaIpcStruct); + + if (sema_num < semaStruct->maxSema) { + semaIndex = sema_num / CY_IPC_SEMA_PER_WORD; + semaMask = (uint32_t)(1ul << (sema_num - \ + (semaIndex * CY_IPC_SEMA_PER_WORD))); + + while (!is_lock) { + /* Check to make sure the IPC channel is released + If so, check if specific channel can be locked. */ + do { + acqStatus = Cy_IPC_Drv_LockAcquire(semaIpcStruct); + } while (acqStatus != CY_IPC_DRV_SUCCESS); + + if ((semaStruct->arrayPtr[semaIndex] & semaMask) == 0ul) { + semaStruct->arrayPtr[semaIndex] |= semaMask; + is_lock = true; + } + + /* Release, but do not trigger a release event */ + (void)Cy_IPC_Drv_LockRelease(semaIpcStruct, + CY_IPC_NO_NOTIFICATION); + + if (!is_lock) { + /* + * The secure core is occupying this lock. Insert a small delay + * to give the secure core a chance to acquire the IPC channel + * and release the lock. + * Otherwise, the secure core may not be able to release the + * lock if non-secure core has higher CPU frequency. It will + * generate a deadlock. + * This delay won't harm performance too much since non-secure + * core has to busy wait here anyway. + * Alternatively, non-secure core can wait for release + * notification event from secure core. However, it is more + * complex and requires more code and more modifications. + */ + volatile uint32_t count = 1000; + while(count > 0) { + count--; + } + Cy_IPC_Sema_Status(sema_num); + } + } + + ret = CY_IPC_SEMA_SUCCESS; + } + + return ret; +} + +static cy_en_ipcsema_status_t mailbox_raw_spin_unlock(uint32_t ipc_channel, + uint32_t sema_num) +{ + uint32_t semaIndex; + uint32_t semaMask; + cy_stc_ipc_sema_t *semaStruct; + cy_en_ipcdrv_status_t acqStatus; + cy_en_ipcsema_status_t ret = CY_IPC_SEMA_BAD_PARAM; + bool is_unlock = false; + IPC_STRUCT_Type *semaIpcStruct; + + /* Get IPC register structure */ + semaIpcStruct = Cy_IPC_Drv_GetIpcBaseAddress(ipc_channel); + /* Get pointer to structure */ + semaStruct = (cy_stc_ipc_sema_t *)Cy_IPC_Drv_ReadDataValue(semaIpcStruct); + + if (sema_num < semaStruct->maxSema) { + semaIndex = sema_num / CY_IPC_SEMA_PER_WORD; + semaMask = (uint32_t)(1ul << (sema_num - \ + (semaIndex * CY_IPC_SEMA_PER_WORD))); + + while (!is_unlock) { + /* Check to make sure the IPC channel is released + If so, check if specific channel can be locked. */ + do { + acqStatus = Cy_IPC_Drv_LockAcquire(semaIpcStruct); + } while (acqStatus != CY_IPC_DRV_SUCCESS); + + if ((semaStruct->arrayPtr[semaIndex] & semaMask) != 0ul) { + semaStruct->arrayPtr[semaIndex] &= ~semaMask; + is_unlock = true; + } + + /* Release, but do not trigger a release event */ + (void)Cy_IPC_Drv_LockRelease(semaIpcStruct, + CY_IPC_NO_NOTIFICATION); + } + + ret = CY_IPC_SEMA_SUCCESS; + } + + return ret; +} + +void tfm_ns_mailbox_hal_enter_critical(void) +{ + saved_irq_state = Cy_SysLib_EnterCriticalSection(); + + mailbox_raw_spin_lock(CY_IPC_CHAN_SEMA, MAILBOX_SEMAPHORE_NUM); +} + +void tfm_ns_mailbox_hal_exit_critical(void) +{ + mailbox_raw_spin_unlock(CY_IPC_CHAN_SEMA, MAILBOX_SEMAPHORE_NUM); + + Cy_SysLib_ExitCriticalSection(saved_irq_state); +} + +void tfm_ns_mailbox_hal_enter_critical_isr(void) +{ + mailbox_raw_spin_lock(CY_IPC_CHAN_SEMA, MAILBOX_SEMAPHORE_NUM); +} + +void tfm_ns_mailbox_hal_exit_critical_isr(void) +{ + mailbox_raw_spin_unlock(CY_IPC_CHAN_SEMA, MAILBOX_SEMAPHORE_NUM); +} + +static bool mailbox_clear_intr(void) +{ + uint32_t status; + + status = Cy_IPC_Drv_GetInterruptStatusMasked( + Cy_IPC_Drv_GetIntrBaseAddr(IPC_RX_INTR_STRUCT)); + status >>= CY_IPC_NOTIFY_SHIFT; + if ((status & IPC_RX_INT_MASK) == 0) { + return false; + } + + Cy_IPC_Drv_ClearInterrupt(Cy_IPC_Drv_GetIntrBaseAddr(IPC_RX_INTR_STRUCT), + 0, IPC_RX_INT_MASK); + return true; +} + +void cpuss_interrupts_ipc_5_IRQHandler(void) +{ + uint32_t magic; + mailbox_msg_handle_t handle; + osThreadId_t task_handle; + + if (!mailbox_clear_intr()) + return; + + platform_mailbox_fetch_msg_data(&magic); + if (magic == PSA_CLIENT_CALL_REPLY_MAGIC) { + /* Handle all the pending replies */ + while (1) { + handle = tfm_ns_mailbox_fetch_reply_msg_isr(); + if (handle == MAILBOX_MSG_NULL_HANDLE) { + break; + } + + task_handle = (osThreadId_t)tfm_ns_mailbox_get_msg_owner(handle); + if (task_handle) { + /* According to the description of CMSIS-RTOS v2 Thread Flags, + * osThreadFlagsSet() can be called inside Interrupt Service + * Routine. */ + osThreadFlagsSet(task_handle, handle); + } + } + } +} diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/tfm_multi_core_api.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/tfm_multi_core_api.c new file mode 100644 index 00000000000..b58738feb34 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/tfm_multi_core_api.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include "tfm_api.h" +#include "tfm_mailbox.h" +#include "tfm_multi_core_api.h" +#include "cmsis_os2.h" + +#define MAX_SEMAPHORE_COUNT NUM_MAILBOX_QUEUE_SLOT + +static osSemaphoreId_t ns_lock_handle = NULL; + +__attribute__((weak)) +enum tfm_status_e tfm_ns_interface_init(void) +{ + osSemaphoreAttr_t sema_attrib = {0}; + + ns_lock_handle = osSemaphoreNew(MAX_SEMAPHORE_COUNT, + MAX_SEMAPHORE_COUNT, + &sema_attrib); + if (!ns_lock_handle) { + return TFM_ERROR_GENERIC; + } + + return TFM_SUCCESS; +} + +int32_t tfm_ns_wait_for_s_cpu_ready(void) +{ + return tfm_platform_ns_wait_for_s_cpu_ready(); +} + +uint32_t tfm_ns_multi_core_lock_acquire(void) +{ + return osSemaphoreAcquire(ns_lock_handle, osWaitForever); +} + +uint32_t tfm_ns_multi_core_lock_release(void) +{ + return osSemaphoreRelease(ns_lock_handle); +} diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/tfm_multi_core_psa_ns_api.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/tfm_multi_core_psa_ns_api.c new file mode 100644 index 00000000000..3af3af8512d --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/tfm_multi_core_psa_ns_api.c @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include +#include + +#include "psa/client.h" +#include "psa/error.h" +#include "tfm_api.h" +#include "tfm_multi_core_api.h" +#include "tfm_ns_mailbox.h" + +/* + * TODO + * Currently, force all the non-secure client to share the same ID. + * + * It requires a more clear mechanism to synchronize the non-secure client + * ID with SPE in dual core scenario. + * In current design, the value is transferred to SPE via mailbox message. + * A dedicated routine to receive the non-secure client information in + * TF-M core/SPM in dual core scenario should be added besides current + * implementation for single Armv8-M. + * The non-secure client identification is shared with SPE in + * single Armv8-M scenario via CMSIS TrustZone context management API, + * which may not work in dual core scenario. + */ +#define NON_SECURE_CLIENT_ID (1) + +/* + * TODO + * Require a formal definition of errors related to mailbox in PSA client call. + */ +#define PSA_INTER_CORE_COMM_ERR (INT32_MIN + 0xFF) + +static void mailbox_wait_reply(mailbox_msg_handle_t handle) +{ + /* + * If the system can support multiple outstanding NS PSA Client calls, call + * tfm_ns_mailbox_wait_reply() to sleep and wait for reply. The NS side + * should implement tfm_ns_mailbox_hal_wait_reply() and wake-up mechanism. + * Otherwise, by default, call tfm_ns_mailbox_is_msg_replied() to simply + * poll the reply status of the mailbox message of current thread. + */ +#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL + tfm_ns_mailbox_wait_reply(handle); +#else + while (!tfm_ns_mailbox_is_msg_replied(handle)) { + } +#endif +} + +/**** API functions ****/ + +uint32_t psa_framework_version(void) +{ + struct psa_client_params_t params; + mailbox_msg_handle_t handle; + uint32_t version; + int32_t ret; + + if (tfm_ns_multi_core_lock_acquire() != TFM_SUCCESS) { + return PSA_VERSION_NONE; + } + + handle = tfm_ns_mailbox_tx_client_req(MAILBOX_PSA_FRAMEWORK_VERSION, + ¶ms, NON_SECURE_CLIENT_ID); + if (handle < 0) { + tfm_ns_multi_core_lock_release(); + return PSA_VERSION_NONE; + } + + mailbox_wait_reply(handle); + + ret = tfm_ns_mailbox_rx_client_reply(handle, (int32_t *)&version); + if (ret != MAILBOX_SUCCESS) { + version = PSA_VERSION_NONE; + } + + if (tfm_ns_multi_core_lock_release() != TFM_SUCCESS) { + return PSA_VERSION_NONE; + } + + return version; +} + +uint32_t psa_version(uint32_t sid) +{ + struct psa_client_params_t params; + mailbox_msg_handle_t handle; + uint32_t version; + int32_t ret; + + params.psa_version_params.sid = sid; + + if (tfm_ns_multi_core_lock_acquire() != TFM_SUCCESS) { + return PSA_VERSION_NONE; + } + + handle = tfm_ns_mailbox_tx_client_req(MAILBOX_PSA_VERSION, ¶ms, + NON_SECURE_CLIENT_ID); + if (handle < 0) { + tfm_ns_multi_core_lock_release(); + return PSA_VERSION_NONE; + } + + mailbox_wait_reply(handle); + + ret = tfm_ns_mailbox_rx_client_reply(handle, (int32_t *)&version); + if (ret != MAILBOX_SUCCESS) { + version = PSA_VERSION_NONE; + } + + if (tfm_ns_multi_core_lock_release() != TFM_SUCCESS) { + return PSA_VERSION_NONE; + } + + return version; +} + +psa_handle_t psa_connect(uint32_t sid, uint32_t version) +{ + struct psa_client_params_t params; + mailbox_msg_handle_t handle; + psa_handle_t psa_handle; + int32_t ret; + + params.psa_connect_params.sid = sid; + params.psa_connect_params.version = version; + + if (tfm_ns_multi_core_lock_acquire() != TFM_SUCCESS) { + return PSA_NULL_HANDLE; + } + + handle = tfm_ns_mailbox_tx_client_req(MAILBOX_PSA_CONNECT, ¶ms, + NON_SECURE_CLIENT_ID); + if (handle < 0) { + tfm_ns_multi_core_lock_release(); + return PSA_NULL_HANDLE; + } + + mailbox_wait_reply(handle); + + ret = tfm_ns_mailbox_rx_client_reply(handle, (int32_t *)&psa_handle); + if (ret != MAILBOX_SUCCESS) { + psa_handle = PSA_NULL_HANDLE; + } + + if (tfm_ns_multi_core_lock_release() != TFM_SUCCESS) { + return PSA_NULL_HANDLE; + } + + return psa_handle; +} + +psa_status_t psa_call(psa_handle_t handle, int32_t type, + const psa_invec *in_vec, size_t in_len, + psa_outvec *out_vec, size_t out_len) +{ + struct psa_client_params_t params; + mailbox_msg_handle_t msg_handle; + int32_t ret; + psa_status_t status; + + params.psa_call_params.handle = handle; + params.psa_call_params.type = type; + params.psa_call_params.in_vec = in_vec; + params.psa_call_params.in_len = in_len; + params.psa_call_params.out_vec = out_vec; + params.psa_call_params.out_len = out_len; + + if (tfm_ns_multi_core_lock_acquire() != TFM_SUCCESS) { + return PSA_ERROR_GENERIC_ERROR; + } + + msg_handle = tfm_ns_mailbox_tx_client_req(MAILBOX_PSA_CALL, ¶ms, + NON_SECURE_CLIENT_ID); + if (msg_handle < 0) { + tfm_ns_multi_core_lock_release(); + return PSA_INTER_CORE_COMM_ERR; + } + + mailbox_wait_reply(msg_handle); + + ret = tfm_ns_mailbox_rx_client_reply(msg_handle, (int32_t *)&status); + if (ret != MAILBOX_SUCCESS) { + status = PSA_INTER_CORE_COMM_ERR; + } + + if (tfm_ns_multi_core_lock_release() != TFM_SUCCESS) { + return PSA_ERROR_GENERIC_ERROR; + } + + return status; +} + +void psa_close(psa_handle_t handle) +{ + struct psa_client_params_t params; + mailbox_msg_handle_t msg_handle; + int32_t reply; + + params.psa_close_params.handle = handle; + + if (tfm_ns_multi_core_lock_acquire() != TFM_SUCCESS) { + return; + } + + msg_handle = tfm_ns_mailbox_tx_client_req(MAILBOX_PSA_CLOSE, ¶ms, + NON_SECURE_CLIENT_ID); + if (msg_handle < 0) { + tfm_ns_multi_core_lock_release(); + return; + } + + mailbox_wait_reply(msg_handle); + + (void)tfm_ns_mailbox_rx_client_reply(msg_handle, &reply); + + tfm_ns_multi_core_lock_release(); +} diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/tfm_ns_mailbox.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/tfm_ns_mailbox.c new file mode 100644 index 00000000000..f7326f09263 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_DUALCPU/src/tfm_ns_mailbox.c @@ -0,0 +1,425 @@ +/* + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include +#include "tfm_ns_mailbox.h" + +/* The pointer to NSPE mailbox queue */ +static struct ns_mailbox_queue_t *mailbox_queue_ptr = NULL; + +static inline void clear_queue_slot_empty(uint8_t idx) +{ + if (idx < NUM_MAILBOX_QUEUE_SLOT) { + mailbox_queue_ptr->empty_slots &= ~(1 << idx); + } +} + +static inline void set_queue_slot_empty(uint8_t idx) +{ + if (idx < NUM_MAILBOX_QUEUE_SLOT) { + mailbox_queue_ptr->empty_slots |= (1 << idx); + } +} + +static inline void set_queue_slot_pend(uint8_t idx) +{ + if (idx < NUM_MAILBOX_QUEUE_SLOT) { + mailbox_queue_ptr->pend_slots |= (1 << idx); + } +} + +static inline int32_t get_mailbox_msg_handle(uint8_t idx, + mailbox_msg_handle_t *handle) +{ + if ((idx >= NUM_MAILBOX_QUEUE_SLOT) || !handle) { + return MAILBOX_INVAL_PARAMS; + } + + *handle = (mailbox_msg_handle_t)(idx + 1); + + return MAILBOX_SUCCESS; +} + +static inline int32_t get_mailbox_msg_idx(mailbox_msg_handle_t handle, + uint8_t *idx) +{ + if ((handle == MAILBOX_MSG_NULL_HANDLE) || !idx) { + return MAILBOX_INVAL_PARAMS; + } + + *idx = (uint8_t)(handle - 1); + + return MAILBOX_SUCCESS; +} + +static inline void clear_queue_slot_replied(uint8_t idx) +{ + if (idx < NUM_MAILBOX_QUEUE_SLOT) { + mailbox_queue_ptr->replied_slots &= ~(1 << idx); + } +} + +static inline void set_queue_slot_woken(uint8_t idx) +{ + if (idx < NUM_MAILBOX_QUEUE_SLOT) { + mailbox_queue_ptr->queue[idx].is_woken = true; + } +} + +static inline bool is_queue_slot_woken(uint8_t idx) +{ + if (idx < NUM_MAILBOX_QUEUE_SLOT) { + return mailbox_queue_ptr->queue[idx].is_woken; + } + + return false; +} + +static inline void clear_queue_slot_woken(uint8_t idx) +{ + if (idx < NUM_MAILBOX_QUEUE_SLOT) { + mailbox_queue_ptr->queue[idx].is_woken = false; + } +} + +static uint8_t acquire_empty_slot(const struct ns_mailbox_queue_t *queue) +{ + uint8_t idx; + mailbox_queue_status_t status; + + tfm_ns_mailbox_hal_enter_critical(); + status = queue->empty_slots; + + if (!status) { + /* No empty slot */ + tfm_ns_mailbox_hal_exit_critical(); + return NUM_MAILBOX_QUEUE_SLOT; + } + + for (idx = 0; idx < NUM_MAILBOX_QUEUE_SLOT; idx++) { + if (status & (1 << idx)) { + break; + } + } + + clear_queue_slot_empty(idx); + + tfm_ns_mailbox_hal_exit_critical(); + + return idx; +} + +static void set_msg_owner(uint8_t idx, const void *owner) +{ + if (idx < NUM_MAILBOX_QUEUE_SLOT) { + mailbox_queue_ptr->queue[idx].owner = owner; + } +} + +#ifdef TFM_MULTI_CORE_TEST +void tfm_ns_mailbox_tx_stats_init(void) +{ + if (!mailbox_queue_ptr) { + return; + } + + tfm_ns_mailbox_hal_enter_critical(); + + mailbox_queue_ptr->nr_tx = 0; + mailbox_queue_ptr->nr_used_slots = 0; + + tfm_ns_mailbox_hal_exit_critical(); +} + +static void mailbox_tx_stats_update(struct ns_mailbox_queue_t *ns_queue) +{ + mailbox_queue_status_t empty_status; + uint8_t idx, nr_empty = 0; + + if (!ns_queue) { + return; + } + + tfm_ns_mailbox_hal_enter_critical(); + + ns_queue->nr_tx++; + + /* Count the number of used slots when this tx arrives */ + empty_status = ns_queue->empty_slots; + tfm_ns_mailbox_hal_exit_critical(); + + if (empty_status) { + for (idx = 0; idx < NUM_MAILBOX_QUEUE_SLOT; idx++) { + if (empty_status & (0x1UL << idx)) { + nr_empty++; + } + } + } + + tfm_ns_mailbox_hal_enter_critical(); + ns_queue->nr_used_slots += (NUM_MAILBOX_QUEUE_SLOT - nr_empty); + tfm_ns_mailbox_hal_exit_critical(); +} + +void tfm_ns_mailbox_stats_avg_slot(struct ns_mailbox_stats_res_t *stats_res) +{ + uint32_t nr_used_slots, nr_tx; + + if (!mailbox_queue_ptr || !stats_res) { + return; + } + + tfm_ns_mailbox_hal_enter_critical(); + nr_used_slots = mailbox_queue_ptr->nr_used_slots; + nr_tx = mailbox_queue_ptr->nr_tx; + tfm_ns_mailbox_hal_exit_critical(); + + stats_res->avg_nr_slots = nr_used_slots / nr_tx; + nr_used_slots %= nr_tx; + stats_res->avg_nr_slots_tenths = nr_used_slots * 10 / nr_tx; +} +#endif + +mailbox_msg_handle_t tfm_ns_mailbox_tx_client_req(uint32_t call_type, + const struct psa_client_params_t *params, + int32_t client_id) +{ + uint8_t idx; + struct mailbox_msg_t *msg_ptr; + mailbox_msg_handle_t handle; + const void *task_handle; + + if (!mailbox_queue_ptr) { + return MAILBOX_MSG_NULL_HANDLE; + } + + if (!params) { + return MAILBOX_MSG_NULL_HANDLE; + } + + idx = acquire_empty_slot(mailbox_queue_ptr); + if (idx >= NUM_MAILBOX_QUEUE_SLOT) { + return MAILBOX_QUEUE_FULL; + } + +#ifdef TFM_MULTI_CORE_TEST + mailbox_tx_stats_update(mailbox_queue_ptr); +#endif + + /* Fill the mailbox message */ + msg_ptr = &mailbox_queue_ptr->queue[idx].msg; + + msg_ptr->call_type = call_type; + memcpy(&msg_ptr->params, params, sizeof(msg_ptr->params)); + msg_ptr->client_id = client_id; + + /* + * Fetch the current task handle. The task will be woken up according the + * handle value set in the owner field. + */ + task_handle = tfm_ns_mailbox_get_task_handle(); + set_msg_owner(idx, task_handle); + + get_mailbox_msg_handle(idx, &handle); + + tfm_ns_mailbox_hal_enter_critical(); + set_queue_slot_pend(idx); + tfm_ns_mailbox_hal_exit_critical(); + + tfm_ns_mailbox_hal_notify_peer(); + + return handle; +} + +int32_t tfm_ns_mailbox_rx_client_reply(mailbox_msg_handle_t handle, + int32_t *reply) +{ + uint8_t idx; + int32_t ret; + + if (!mailbox_queue_ptr) { + return MAILBOX_INVAL_PARAMS; + } + + if ((handle == MAILBOX_MSG_NULL_HANDLE) || (!reply)) { + return MAILBOX_INVAL_PARAMS; + } + + ret = get_mailbox_msg_idx(handle, &idx); + if (ret != MAILBOX_SUCCESS) { + return ret; + } + + *reply = mailbox_queue_ptr->queue[idx].reply.return_val; + + /* Clear up the owner field */ + set_msg_owner(idx, NULL); + + tfm_ns_mailbox_hal_enter_critical(); + clear_queue_slot_replied(idx); + clear_queue_slot_woken(idx); + /* + * Make sure that the empty flag is set after all the other status flags are + * re-initialized. + */ + set_queue_slot_empty(idx); + tfm_ns_mailbox_hal_exit_critical(); + + return MAILBOX_SUCCESS; +} + +bool tfm_ns_mailbox_is_msg_replied(mailbox_msg_handle_t handle) +{ + uint8_t idx; + int32_t ret; + mailbox_queue_status_t status; + + if (!mailbox_queue_ptr) { + return false; + } + + if (handle == MAILBOX_MSG_NULL_HANDLE) { + return false; + } + + ret = get_mailbox_msg_idx(handle, &idx); + if (ret != MAILBOX_SUCCESS) { + return false; + } + + tfm_ns_mailbox_hal_enter_critical(); + status = mailbox_queue_ptr->replied_slots; + tfm_ns_mailbox_hal_exit_critical(); + + if (status & (1 << idx)) { + return true; + } + + return false; +} + +mailbox_msg_handle_t tfm_ns_mailbox_fetch_reply_msg_isr(void) +{ + uint8_t idx; + mailbox_msg_handle_t handle; + mailbox_queue_status_t replied_status; + + if (!mailbox_queue_ptr) { + return MAILBOX_MSG_NULL_HANDLE; + } + + tfm_ns_mailbox_hal_enter_critical_isr(); + replied_status = mailbox_queue_ptr->replied_slots; + tfm_ns_mailbox_hal_exit_critical_isr(); + + if (!replied_status) { + return MAILBOX_MSG_NULL_HANDLE; + } + + for (idx = 0; idx < NUM_MAILBOX_QUEUE_SLOT; idx++) { + /* Find the first replied message in queue */ + if (replied_status & (0x1UL << idx)) { + tfm_ns_mailbox_hal_enter_critical_isr(); + clear_queue_slot_replied(idx); + set_queue_slot_woken(idx); + tfm_ns_mailbox_hal_exit_critical_isr(); + + if (get_mailbox_msg_handle(idx, &handle) == MAILBOX_SUCCESS) { + return handle; + } + } + } + + return MAILBOX_MSG_NULL_HANDLE; +} + +const void *tfm_ns_mailbox_get_msg_owner(mailbox_msg_handle_t handle) +{ + uint8_t idx; + + if (get_mailbox_msg_idx(handle, &idx) != MAILBOX_SUCCESS) { + return NULL; + } + + if (idx < NUM_MAILBOX_QUEUE_SLOT) { + return mailbox_queue_ptr->queue[idx].owner; + } + + return NULL; +} + +int32_t tfm_ns_mailbox_init(struct ns_mailbox_queue_t *queue) +{ + int32_t ret; + + if (!queue) { + return MAILBOX_INVAL_PARAMS; + } + + /* + * Further verification of mailbox queue address may be required according + * to non-secure memory assignment. + */ + + memset(queue, 0, sizeof(*queue)); + + /* Initialize empty bitmask */ + queue->empty_slots = + (mailbox_queue_status_t)((1UL << (NUM_MAILBOX_QUEUE_SLOT - 1)) - 1); + queue->empty_slots += + (mailbox_queue_status_t)(1UL << (NUM_MAILBOX_QUEUE_SLOT - 1)); + + mailbox_queue_ptr = queue; + + /* Platform specific initialization. */ + ret = tfm_ns_mailbox_hal_init(queue); + +#ifdef TFM_MULTI_CORE_TEST + tfm_ns_mailbox_tx_stats_init(); +#endif + + return ret; +} + +#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL +int32_t tfm_ns_mailbox_wait_reply(mailbox_msg_handle_t handle) +{ + uint8_t idx; + int32_t ret; + + if (!mailbox_queue_ptr) { + return MAILBOX_INVAL_PARAMS; + } + + if (handle == MAILBOX_MSG_NULL_HANDLE) { + return MAILBOX_INVAL_PARAMS; + } + + ret = get_mailbox_msg_idx(handle, &idx); + if (ret != MAILBOX_SUCCESS) { + return ret; + } + + while (1) { + tfm_ns_mailbox_hal_wait_reply(handle); + + /* + * Woken up from sleep + * Check the completed flag to make sure that the current thread is + * woken up by reply event, rather than other events. + */ + tfm_ns_mailbox_hal_enter_critical(); + if (is_queue_slot_woken(idx)) { + tfm_ns_mailbox_hal_exit_critical(); + break; + } + tfm_ns_mailbox_hal_exit_critical(); + } + + return MAILBOX_SUCCESS; +} +#endif diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/device/cmsis_nvic_virtual.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V8M/src/cmsis_nvic_virtual.c similarity index 86% rename from targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/device/cmsis_nvic_virtual.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V8M/src/cmsis_nvic_virtual.c index 6a8ef8dc54b..bee85979576 100644 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/device/cmsis_nvic_virtual.c +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V8M/src/cmsis_nvic_virtual.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Arm Limited + * Copyright (c) 2019-2020 Arm Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -17,9 +17,9 @@ */ #include "cmsis_nvic_virtual.h" -#include "psa/lifecycle.h" +#include "tfm_platform_api.h" void NVIC_SystemReset(void) { - mbed_psa_system_reset(); + tfm_platform_system_reset(); } diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V8M/src/tfm_ns_interface.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V8M/src/tfm_ns_interface.c new file mode 100644 index 00000000000..97591455900 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V8M/src/tfm_ns_interface.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2017-2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +#include +#include + +#include "tfm_api.h" +#include "tfm_ns_interface.h" +#include "cmsis_os2.h" + +/** + * \brief the ns_lock ID + */ +static osMutexId_t ns_lock_handle = NULL; + +__attribute__((weak)) +int32_t tfm_ns_interface_dispatch(veneer_fn fn, + uint32_t arg0, uint32_t arg1, + uint32_t arg2, uint32_t arg3) +{ + int32_t result; + osStatus_t status; + + /* TFM request protected by NS lock */ + status = osMutexAcquire(ns_lock_handle, osWaitForever); + if (status != osOK) { + return (int32_t)TFM_ERROR_GENERIC; + } + + result = fn(arg0, arg1, arg2, arg3); + + status = osMutexRelease(ns_lock_handle); + if (status != osOK) { + return (int32_t)TFM_ERROR_GENERIC; + } + + return result; +} + +__attribute__((weak)) +enum tfm_status_e tfm_ns_interface_init(void) +{ + const osMutexAttr_t attr = { + .name = NULL, + .attr_bits = osMutexPrioInherit, /* Priority inheritance is recommended + * to enable if it is supported. + * For recursive mutex and the ability + * of auto release when owner being + * terminated is not required. + */ + .cb_mem = NULL, + .cb_size = 0U + }; + + ns_lock_handle = osMutexNew(&attr); + if (!ns_lock_handle) { + return TFM_ERROR_GENERIC; + } + + return TFM_SUCCESS; +} diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/COMPONENT_NSPE/interface/src/tfm_psa_ns_api.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V8M/src/tfm_psa_ns_api.c similarity index 53% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/COMPONENT_NSPE/interface/src/tfm_psa_ns_api.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V8M/src/tfm_psa_ns_api.c index 159eef90888..9a677a2cd3c 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/COMPONENT_NSPE/interface/src/tfm_psa_ns_api.c +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/TARGET_TFM_V8M/src/tfm_psa_ns_api.c @@ -1,19 +1,20 @@ /* - * Copyright (c) 2018, Arm Limited. All rights reserved. + * Copyright (c) 2018-2019, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause * */ -#include "interface/include/psa_client.h" -#include "tfm_ns_lock.h" +#include "psa/client.h" +#include "tfm_ns_interface.h" #include "tfm_api.h" /**** API functions ****/ uint32_t psa_framework_version(void) { - return tfm_ns_lock_dispatch((veneer_fn)tfm_psa_framework_version_veneer, + return tfm_ns_interface_dispatch( + (veneer_fn)tfm_psa_framework_version_veneer, 0, 0, 0, @@ -22,23 +23,25 @@ uint32_t psa_framework_version(void) uint32_t psa_version(uint32_t sid) { - return tfm_ns_lock_dispatch((veneer_fn)tfm_psa_version_veneer, + return tfm_ns_interface_dispatch( + (veneer_fn)tfm_psa_version_veneer, sid, 0, 0, 0); } -psa_handle_t psa_connect(uint32_t sid, uint32_t minor_version) +psa_handle_t psa_connect(uint32_t sid, uint32_t version) { - return tfm_ns_lock_dispatch((veneer_fn)tfm_psa_connect_veneer, + return tfm_ns_interface_dispatch( + (veneer_fn)tfm_psa_connect_veneer, sid, - minor_version, + version, 0, 0); } -psa_status_t psa_call(psa_handle_t handle, +psa_status_t psa_call(psa_handle_t handle, int32_t type, const psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, @@ -51,25 +54,26 @@ psa_status_t psa_call(psa_handle_t handle, /* Due to v8M restrictions, TF-M NS API needs to add another layer of * serialization in order for NS to pass arguments to S */ - psa_invec in_vecs, out_vecs; + const struct tfm_control_parameter_t ctrl_param = { + .type = type, + .in_len = in_len, + .out_len = out_len, + }; - in_vecs.base = in_vec; - in_vecs.len = in_len; - out_vecs.base = out_vec; - out_vecs.len = out_len; - return tfm_ns_lock_dispatch((veneer_fn)tfm_psa_call_veneer, + return tfm_ns_interface_dispatch( + (veneer_fn)tfm_psa_call_veneer, (uint32_t)handle, - (uint32_t)&in_vecs, - (uint32_t)&out_vecs, - 0); + (uint32_t)&ctrl_param, + (uint32_t)in_vec, + (uint32_t)out_vec); } void psa_close(psa_handle_t handle) { - tfm_ns_lock_dispatch((veneer_fn)tfm_psa_close_veneer, + (void)tfm_ns_interface_dispatch( + (veneer_fn)tfm_psa_close_veneer, (uint32_t)handle, 0, 0, 0); } - diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/VERSION.txt b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/VERSION.txt new file mode 100644 index 00000000000..32a958e6c45 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/VERSION.txt @@ -0,0 +1 @@ +1d1faca481c3 diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/device/cmsis_nvic_virtual.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/cmsis_nvic_virtual.h similarity index 100% rename from targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/device/cmsis_nvic_virtual.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/cmsis_nvic_virtual.h diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/ns_ipc_config.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/ns_ipc_config.h new file mode 100644 index 00000000000..e1cd7b74300 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/ns_ipc_config.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _IPC_CONFIG_H_ +#define _IPC_CONFIG_H_ + +#include "platform_multicore.h" + +#define IPC_RX_CHAN IPC_PSA_CLIENT_REPLY_CHAN +#define IPC_RX_INTR_STRUCT IPC_PSA_CLIENT_REPLY_INTR_STRUCT +#define IPC_RX_INT_MASK IPC_PSA_CLIENT_REPLY_INTR_MASK + +#define IPC_TX_CHAN IPC_PSA_CLIENT_CALL_CHAN +#define IPC_TX_NOTIFY_MASK IPC_PSA_CLIENT_CALL_NOTIFY_MASK + +#define PSA_CLIENT_REPLY_NVIC_IRQn IPC_PSA_CLIENT_REPLY_IPC_INTR +#define PSA_CLIENT_REPLY_IRQ_PRIORITY 3 + +#endif diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/platform_multicore.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/platform_multicore.h new file mode 100644 index 00000000000..f90fb1e2794 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/platform_multicore.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2019, Arm Limited. All rights reserved. + * Copyright (c) 2019, Cypress Semiconductor Corporation. All rights reserved + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef _TFM_PLATFORM_MULTICORE_ +#define _TFM_PLATFORM_MULTICORE_ + +#include +#include "cy_device_headers.h" + +#define IPC_PSA_CLIENT_CALL_CHAN (8) +#define IPC_PSA_CLIENT_CALL_INTR_STRUCT (6) +#define IPC_PSA_CLIENT_CALL_INTR_MASK (1 << IPC_PSA_CLIENT_CALL_CHAN) +#define IPC_PSA_CLIENT_CALL_NOTIFY_MASK (1 << IPC_PSA_CLIENT_CALL_INTR_STRUCT) +#define IPC_PSA_CLIENT_CALL_IPC_INTR cpuss_interrupts_ipc_6_IRQn + +#define IPC_PSA_CLIENT_REPLY_CHAN (9) +#define IPC_PSA_CLIENT_REPLY_INTR_STRUCT (5) +#define IPC_PSA_CLIENT_REPLY_INTR_MASK (1 << IPC_PSA_CLIENT_REPLY_CHAN) +#define IPC_PSA_CLIENT_REPLY_NOTIFY_MASK (1 << IPC_PSA_CLIENT_REPLY_INTR_STRUCT) +#define IPC_PSA_CLIENT_REPLY_IPC_INTR cpuss_interrupts_ipc_5_IRQn + +#define IPC_RX_RELEASE_MASK (0) + +#define CY_IPC_NOTIFY_SHIFT (16) + +#define PSA_CLIENT_CALL_REQ_MAGIC (0xA5CF50C6) +#define PSA_CLIENT_CALL_REPLY_MAGIC (0xC605FC5A) + +#define NS_MAILBOX_INIT_ENABLE (0xAE) +#define S_MAILBOX_READY (0xC3) + +#define PLATFORM_MAILBOX_SUCCESS (0x0) +#define PLATFORM_MAILBOX_INVAL_PARAMS (INT32_MIN + 1) +#define PLATFORM_MAILBOX_TX_ERROR (INT32_MIN + 2) +#define PLATFORM_MAILBOX_RX_ERROR (INT32_MIN + 3) +#define PLATFORM_MAILBOX_INIT_ERROR (INT32_MIN + 4) + +/* Inter-Processor Communication (IPC) data channel for the Semaphores */ +#define PLATFORM_MAILBOX_IPC_CHAN_SEMA CY_IPC_CHAN_SEMA +#define MAILBOX_SEMAPHORE_NUM (16) + +#define IPC_SYNC_MAGIC 0x7DADE011 + +/** + * \brief Fetch a pointer from mailbox message + * + * \param[out] msg_ptr The address to write the pointer value to. + * + * \retval 0 The operation succeeds. + * \retval else The operation fails. + */ +int platform_mailbox_fetch_msg_ptr(void **msg_ptr); + +/** + * \brief Fetch a data value from mailbox message + * + * \param[out] data_ptr The address to write the pointer value to. + * + * \retval 0 The operation succeeds. + * \retval else The operation fails. + */ +int platform_mailbox_fetch_msg_data(uint32_t *data_ptr); + +/** + * \brief Send a pointer via mailbox message + * + * \param[in] msg_ptr The pointer value to be sent. + * + * \retval 0 The operation succeeds. + * \retval else The operation fails. + */ +int platform_mailbox_send_msg_ptr(const void *msg_ptr); + +/** + * \brief Send a data value via mailbox message + * + * \param[in] data The data value to be sent + * + * \retval 0 The operation succeeds. + * \retval else The operation fails. + */ +int platform_mailbox_send_msg_data(uint32_t data); + +/** + * \brief Wait for a mailbox notify event. + */ +void platform_mailbox_wait_for_notify(void); + +/** + * \brief IPC initialization + * + * \retval 0 The operation succeeds. + * \retval else The operation fails. + */ +int platform_ns_ipc_init(void); + +#endif diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/psa_client.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/client.h similarity index 58% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/psa_client.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/client.h index 71adb802e39..4115f930e9e 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/psa_client.h +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/client.h @@ -8,29 +8,56 @@ #ifndef __PSA_CLIENT_H__ #define __PSA_CLIENT_H__ +#include +#include + +#include "psa/error.h" + #ifdef __cplusplus extern "C" { #endif -#include -#include - /*********************** PSA Client Macros and Types *************************/ -#define PSA_FRAMEWORK_VERSION (0x0100) +/** + * The version of the PSA Framework API that is being used to build the calling + * firmware. + */ +#define PSA_FRAMEWORK_VERSION (0x0100u) + +/** + * Return value from psa_version() if the requested RoT Service is not present + * in the system. + */ +#define PSA_VERSION_NONE (0u) + +/** + * The zero-value null handle can be assigned to variables used in clients and + * RoT Services, indicating that there is no current connection or message. + */ +#define PSA_NULL_HANDLE ((psa_handle_t)0) + +/** + * Tests whether a handle value returned by psa_connect() is valid. + */ +#define PSA_HANDLE_IS_VALID(handle) ((psa_handle_t)(handle) > 0) -#define PSA_VERSION_NONE (0) +/** + * Converts the handle value returned from a failed call psa_connect() into + * an error code. + */ +#define PSA_HANDLE_TO_ERROR(handle) ((psa_status_t)(handle)) -/* PSA response types */ -#define PSA_SUCCESS (0) -#define PSA_CONNECTION_REFUSED (INT32_MIN + 1) -#define PSA_CONNECTION_BUSY (INT32_MIN + 2) -#define PSA_DROP_CONNECTION (INT32_MIN) +/** + * Maximum number of input and output vectors for a request to psa_call(). + */ +#define PSA_MAX_IOVEC (4u) -/* PSA message handles */ -#define PSA_NULL_HANDLE ((psa_handle_t)0) +/** + * An IPC message type that indicates a generic client request. + */ +#define PSA_IPC_CALL (0) -typedef int32_t psa_status_t; typedef int32_t psa_handle_t; /** @@ -64,15 +91,14 @@ typedef struct psa_outvec { uint32_t psa_framework_version(void); /** - * \brief Retrieve the minor version of an RoT Service or indicate that it is - * not present on this system. + * \brief Retrieve the version of an RoT Service or indicate that it is not + * present on this system. * * \param[in] sid ID of the RoT Service to query. * * \retval PSA_VERSION_NONE The RoT Service is not implemented, or the * caller is not permitted to access the service. - * \retval > 0 The minor version of the implemented RoT - * Service. + * \retval > 0 The version of the implemented RoT Service. */ uint32_t psa_version(uint32_t sid); @@ -80,23 +106,28 @@ uint32_t psa_version(uint32_t sid); * \brief Connect to an RoT Service by its SID. * * \param[in] sid ID of the RoT Service to connect to. - * \param[in] minor_version Requested version of the RoT Service. + * \param[in] version Requested version of the RoT Service. * * \retval > 0 A handle for the connection. - * \retval PSA_CONNECTION_REFUSED The SPM or RoT Service has refused the + * \retval PSA_ERROR_CONNECTION_REFUSED The SPM or RoT Service has refused the * connection. - * \retval PSA_CONNECTION_BUSY The SPM or RoT Service cannot make the + * \retval PSA_ERROR_CONNECTION_BUSY The SPM or RoT Service cannot make the * connection at the moment. - * \retval "Does not return" The RoT Service ID and version are not - * supported, or the caller is not permitted to - * access the service. + * \retval "PROGRAMMER ERROR" The call is a PROGRAMMER ERROR if one or more + * of the following are true: + * \arg The RoT Service ID is not present. + * \arg The RoT Service version is not supported. + * \arg The caller is not allowed to access the RoT + * service. */ -psa_handle_t psa_connect(uint32_t sid, uint32_t minor_version); +psa_handle_t psa_connect(uint32_t sid, uint32_t version); /** * \brief Call an RoT Service on an established connection. * * \param[in] handle A handle to an established connection. + * \param[in] type The reuqest type. + * Must be zero( \ref PSA_IPC_CALL) or positive. * \param[in] in_vec Array of input \ref psa_invec structures. * \param[in] in_len Number of input \ref psa_invec structures. * \param[in/out] out_vec Array of output \ref psa_outvec structures. @@ -104,19 +135,18 @@ psa_handle_t psa_connect(uint32_t sid, uint32_t minor_version); * * \retval >=0 RoT Service-specific status value. * \retval <0 RoT Service-specific error code. - * \retval PSA_DROP_CONNECTION The connection has been dropped by the RoT - * Service. This indicates that either this or - * a previous message was invalid. - * \retval "Does not return" The call is invalid, one or more of the - * following are true: + * \retval PSA_ERROR_PROGRAMMER_ERROR The connection has been terminated by the + * RoT Service. The call is a PROGRAMMER ERROR if + * one or more of the following are true: * \arg An invalid handle was passed. * \arg The connection is already handling a request. + * \arg type < 0. * \arg An invalid memory reference was provided. * \arg in_len + out_len > PSA_MAX_IOVEC. * \arg The message is unrecognized by the RoT * Service or incorrectly formatted. */ -psa_status_t psa_call(psa_handle_t handle, +psa_status_t psa_call(psa_handle_t handle, int32_t type, const psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, @@ -129,11 +159,12 @@ psa_status_t psa_call(psa_handle_t handle, * null handle. * * \retval void Success. - * \retval "Does not return" The call is invalid, one or more of the - * following are true: + * \retval "PROGRAMMER ERROR" The call is a PROGRAMMER ERROR if one or more + * of the following are true: * \arg An invalid handle was provided that is not * the null handle. - * \arg The connection is handling a request. + * \arg The connection is currently handling a + * request. */ void psa_close(psa_handle_t handle); diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto.h new file mode 100644 index 00000000000..91581172c2b --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto.h @@ -0,0 +1,3770 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +/** + * \file psa/crypto.h + * \brief Platform Security Architecture cryptography module + */ + +#ifndef PSA_CRYPTO_H +#define PSA_CRYPTO_H + +#include "psa/crypto_platform.h" + +#include + +#ifdef __DOXYGEN_ONLY__ +/* This __DOXYGEN_ONLY__ block contains mock definitions for things that + * must be defined in the crypto_platform.h header. These mock definitions + * are present in this file as a convenience to generate pretty-printed + * documentation that includes those definitions. */ + +/** \defgroup platform Implementation-specific definitions + * @{ + */ + +/** \brief Key handle. + * + * This type represents open handles to keys. It must be an unsigned integral + * type. The choice of type is implementation-dependent. + * + * 0 is not a valid key handle. How other handle values are assigned is + * implementation-dependent. + */ +typedef _unsigned_integral_type_ psa_key_handle_t; + +/**@}*/ +#endif /* __DOXYGEN_ONLY__ */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* The file "crypto_types.h" declares types that encode errors, + * algorithms, key types, policies, etc. */ +#include "psa/crypto_types.h" + +/** \defgroup version API version + * @{ + */ + +/** + * The major version of this implementation of the PSA Crypto API + */ +#define PSA_CRYPTO_API_VERSION_MAJOR 1 + +/** + * The minor version of this implementation of the PSA Crypto API + */ +#define PSA_CRYPTO_API_VERSION_MINOR 0 + +/**@}*/ + +/* The file "crypto_values.h" declares macros to build and analyze values + * of integral types defined in "crypto_types.h". */ +#include "psa/crypto_values.h" + +/** \defgroup initialization Library initialization + * @{ + */ + +/** + * \brief Library initialization. + * + * Applications must call this function before calling any other + * function in this module. + * + * Applications may call this function more than once. Once a call + * succeeds, subsequent calls are guaranteed to succeed. + * + * If the application calls other functions before calling psa_crypto_init(), + * the behavior is undefined. Implementations are encouraged to either perform + * the operation as if the library had been initialized or to return + * #PSA_ERROR_BAD_STATE or some other applicable error. In particular, + * implementations should not return a success status if the lack of + * initialization may have security implications, for example due to improper + * seeding of the random number generator. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY + */ +psa_status_t psa_crypto_init(void); + +/**@}*/ + +/** \addtogroup attributes + * @{ + */ + +/** \def PSA_KEY_ATTRIBUTES_INIT + * + * This macro returns a suitable initializer for a key attribute structure + * of type #psa_key_attributes_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_KEY_ATTRIBUTES_INIT {0} +#endif + +/** Return an initial value for a key attributes structure. + */ +static psa_key_attributes_t psa_key_attributes_init(void); + +/** Declare a key as persistent and set its key identifier. + * + * If the attribute structure currently declares the key as volatile (which + * is the default content of an attribute structure), this function sets + * the lifetime attribute to #PSA_KEY_LIFETIME_PERSISTENT. + * + * This function does not access storage, it merely stores the given + * value in the structure. + * The persistent key will be written to storage when the attribute + * structure is passed to a key creation function such as + * psa_import_key(), psa_generate_key(), + * psa_key_derivation_output_key() or psa_copy_key(). + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param id The persistent identifier for the key. + */ +static void psa_set_key_id(psa_key_attributes_t *attributes, + psa_key_id_t id); + +/** Set the location of a persistent key. + * + * To make a key persistent, you must give it a persistent key identifier + * with psa_set_key_id(). By default, a key that has a persistent identifier + * is stored in the default storage area identifier by + * #PSA_KEY_LIFETIME_PERSISTENT. Call this function to choose a storage + * area, or to explicitly declare the key as volatile. + * + * This function does not access storage, it merely stores the given + * value in the structure. + * The persistent key will be written to storage when the attribute + * structure is passed to a key creation function such as + * psa_import_key(), psa_generate_key(), + * psa_key_derivation_output_key() or psa_copy_key(). + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param lifetime The lifetime for the key. + * If this is #PSA_KEY_LIFETIME_VOLATILE, the + * key will be volatile, and the key identifier + * attribute is reset to 0. + */ +static void psa_set_key_lifetime(psa_key_attributes_t *attributes, + psa_key_lifetime_t lifetime); + +/** Retrieve the key identifier from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The persistent identifier stored in the attribute structure. + * This value is unspecified if the attribute structure declares + * the key as volatile. + */ +static psa_key_id_t psa_get_key_id(const psa_key_attributes_t *attributes); + +/** Retrieve the lifetime from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The lifetime value stored in the attribute structure. + */ +static psa_key_lifetime_t psa_get_key_lifetime( + const psa_key_attributes_t *attributes); + +/** Declare usage flags for a key. + * + * Usage flags are part of a key's usage policy. They encode what + * kind of operations are permitted on the key. For more details, + * refer to the documentation of the type #psa_key_usage_t. + * + * This function overwrites any usage flags + * previously set in \p attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param usage_flags The usage flags to write. + */ +static void psa_set_key_usage_flags(psa_key_attributes_t *attributes, + psa_key_usage_t usage_flags); + +/** Retrieve the usage flags from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The usage flags stored in the attribute structure. + */ +static psa_key_usage_t psa_get_key_usage_flags( + const psa_key_attributes_t *attributes); + +/** Declare the permitted algorithm policy for a key. + * + * The permitted algorithm policy of a key encodes which algorithm or + * algorithms are permitted to be used with this key. The following + * algorithm policies are supported: + * - 0 does not allow any cryptographic operation with the key. The key + * may be used for non-cryptographic actions such as exporting (if + * permitted by the usage flags). + * - An algorithm value permits this particular algorithm. + * - An algorithm wildcard built from #PSA_ALG_ANY_HASH allows the specified + * signature scheme with any hash algorithm. + * + * This function overwrites any algorithm policy + * previously set in \p attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param alg The permitted algorithm policy to write. + */ +static void psa_set_key_algorithm(psa_key_attributes_t *attributes, + psa_algorithm_t alg); + + +/** Retrieve the algorithm policy from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The algorithm stored in the attribute structure. + */ +static psa_algorithm_t psa_get_key_algorithm( + const psa_key_attributes_t *attributes); + +/** Declare the type of a key. + * + * This function overwrites any key type + * previously set in \p attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param type The key type to write. + * If this is 0, the key type in \p attributes + * becomes unspecified. + */ +static void psa_set_key_type(psa_key_attributes_t *attributes, + psa_key_type_t type); + + +/** Declare the size of a key. + * + * This function overwrites any key size previously set in \p attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate each of its arguments exactly once. + * + * \param[out] attributes The attribute structure to write to. + * \param bits The key size in bits. + * If this is 0, the key size in \p attributes + * becomes unspecified. Keys of size 0 are + * not supported. + */ +static void psa_set_key_bits(psa_key_attributes_t *attributes, + size_t bits); + +/** Retrieve the key type from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The key type stored in the attribute structure. + */ +static psa_key_type_t psa_get_key_type(const psa_key_attributes_t *attributes); + +/** Retrieve the key size from key attributes. + * + * This function may be declared as `static` (i.e. without external + * linkage). This function may be provided as a function-like macro, + * but in this case it must evaluate its argument exactly once. + * + * \param[in] attributes The key attribute structure to query. + * + * \return The key size stored in the attribute structure, in bits. + */ +static size_t psa_get_key_bits(const psa_key_attributes_t *attributes); + +/** Retrieve the attributes of a key. + * + * This function first resets the attribute structure as with + * psa_reset_key_attributes(). It then copies the attributes of + * the given key into the given attribute structure. + * + * \note This function may allocate memory or other resources. + * Once you have called this function on an attribute structure, + * you must call psa_reset_key_attributes() to free these resources. + * + * \param[in] handle Handle to the key to query. + * \param[in,out] attributes On success, the attributes of the key. + * On failure, equivalent to a + * freshly-initialized structure. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_get_key_attributes(psa_key_handle_t handle, + psa_key_attributes_t *attributes); + +/** Reset a key attribute structure to a freshly initialized state. + * + * You must initialize the attribute structure as described in the + * documentation of the type #psa_key_attributes_t before calling this + * function. Once the structure has been initialized, you may call this + * function at any time. + * + * This function frees any auxiliary resources that the structure + * may contain. + * + * \param[in,out] attributes The attribute structure to reset. + */ +void psa_reset_key_attributes(psa_key_attributes_t *attributes); + +/**@}*/ + +/** \defgroup key_management Key management + * @{ + */ + +/** Open a handle to an existing persistent key. + * + * Open a handle to a persistent key. A key is persistent if it was created + * with a lifetime other than #PSA_KEY_LIFETIME_VOLATILE. A persistent key + * always has a nonzero key identifier, set with psa_set_key_id() when + * creating the key. Implementations may provide additional pre-provisioned + * keys that can be opened with psa_open_key(). Such keys have a key identifier + * in the vendor range, as documented in the description of #psa_key_id_t. + * + * The application must eventually close the handle with psa_close_key() or + * psa_destroy_key() to release associated resources. If the application dies + * without calling one of these functions, the implementation should perform + * the equivalent of a call to psa_close_key(). + * + * Some implementations permit an application to open the same key multiple + * times. If this is successful, each call to psa_open_key() will return a + * different key handle. + * + * \note Applications that rely on opening a key multiple times will not be + * portable to implementations that only permit a single key handle to be + * opened. See also :ref:\`key-handles\`. + * + * \param id The persistent identifier of the key. + * \param[out] handle On success, a handle to the key. + * + * \retval #PSA_SUCCESS + * Success. The application can now use the value of `*handle` + * to access the key. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * The implementation does not have sufficient resources to open the + * key. This can be due to reaching an implementation limit on the + * number of open keys, the number of open key handles, or available + * memory. + * \retval #PSA_ERROR_DOES_NOT_EXIST + * There is no persistent key with key identifier \p id. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p id is not a valid persistent key identifier. + * \retval #PSA_ERROR_NOT_PERMITTED + * The specified key exists, but the application does not have the + * permission to access it. Note that this specification does not + * define any way to create such a key, but it may be possible + * through implementation-specific means. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_open_key(psa_key_id_t id, + psa_key_handle_t *handle); + + +/** Close a key handle. + * + * If the handle designates a volatile key, this will destroy the key material + * and free all associated resources, just like psa_destroy_key(). + * + * If this is the last open handle to a persistent key, then closing the handle + * will free all resources associated with the key in volatile memory. The key + * data in persistent storage is not affected and can be opened again later + * with a call to psa_open_key(). + * + * Closing the key handle makes the handle invalid, and the key handle + * must not be used again by the application. + * + * \note If the key handle was used to set up an active + * :ref:\`multipart operation \`, then closing the + * key handle can cause the multipart operation to fail. Applications should + * maintain the key handle until after the multipart operation has finished. + * + * \param handle The key handle to close. + * If this is \c 0, do nothing and return \c PSA_SUCCESS. + * + * \retval #PSA_SUCCESS + * \p handle was a valid handle or \c 0. It is now closed. + * \retval #PSA_ERROR_INVALID_HANDLE + * \p handle is not a valid handle nor \c 0. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_close_key(psa_key_handle_t handle); + +/** Make a copy of a key. + * + * Copy key material from one location to another. + * + * This function is primarily useful to copy a key from one location + * to another, since it populates a key using the material from + * another key which may have a different lifetime. + * + * This function may be used to share a key with a different party, + * subject to implementation-defined restrictions on key sharing. + * + * The policy on the source key must have the usage flag + * #PSA_KEY_USAGE_COPY set. + * This flag is sufficient to permit the copy if the key has the lifetime + * #PSA_KEY_LIFETIME_VOLATILE or #PSA_KEY_LIFETIME_PERSISTENT. + * Some secure elements do not provide a way to copy a key without + * making it extractable from the secure element. If a key is located + * in such a secure element, then the key must have both usage flags + * #PSA_KEY_USAGE_COPY and #PSA_KEY_USAGE_EXPORT in order to make + * a copy of the key outside the secure element. + * + * The resulting key may only be used in a way that conforms to + * both the policy of the original key and the policy specified in + * the \p attributes parameter: + * - The usage flags on the resulting key are the bitwise-and of the + * usage flags on the source policy and the usage flags in \p attributes. + * - If both allow the same algorithm or wildcard-based + * algorithm policy, the resulting key has the same algorithm policy. + * - If either of the policies allows an algorithm and the other policy + * allows a wildcard-based algorithm policy that includes this algorithm, + * the resulting key allows the same algorithm. + * - If the policies do not allow any algorithm in common, this function + * fails with the status #PSA_ERROR_INVALID_ARGUMENT. + * + * The effect of this function on implementation-defined attributes is + * implementation-defined. + * + * \param source_handle The key to copy. It must be a valid key handle. + * \param[in] attributes The attributes for the new key. + * They are used as follows: + * - The key type and size may be 0. If either is + * nonzero, it must match the corresponding + * attribute of the source key. + * - The key location (the lifetime and, for + * persistent keys, the key identifier) is + * used directly. + * - The policy constraints (usage flags and + * algorithm policy) are combined from + * the source key and \p attributes so that + * both sets of restrictions apply, as + * described in the documentation of this function. + * \param[out] target_handle On success, a handle to the newly created key. + * \c 0 on failure. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INVALID_HANDLE + * \p source_handle is invalid. + * \retval #PSA_ERROR_ALREADY_EXISTS + * This is an attempt to create a persistent key, and there is + * already a persistent key with the given identifier. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The lifetime or identifier in \p attributes are invalid. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The policy constraints on the source and specified in + * \p attributes are incompatible. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p attributes specifies a key type or key size + * which does not match the attributes of the source key. + * \retval #PSA_ERROR_NOT_PERMITTED + * The source key does not have the #PSA_KEY_USAGE_COPY usage flag. + * \retval #PSA_ERROR_NOT_PERMITTED + * The source key is not exportable and its lifetime does not + * allow copying it to the target's lifetime. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_copy_key(psa_key_handle_t source_handle, + const psa_key_attributes_t *attributes, + psa_key_handle_t *target_handle); + + +/** + * \brief Destroy a key. + * + * This function destroys a key from both volatile + * memory and, if applicable, non-volatile storage. Implementations shall + * make a best effort to ensure that that the key material cannot be recovered. + * + * This function also erases any metadata such as policies and frees + * resources associated with the key. To free all resources associated with + * the key, all handles to the key must be closed or destroyed. + * + * Destroying the key makes the handle invalid, and the key handle + * must not be used again by the application. Using other open handles to the + * destroyed key in a cryptographic operation will result in an error. + * + * If a key is currently in use in a multipart operation, then destroying the + * key will cause the multipart operation to fail. + * + * \param handle Handle to the key to erase. + * If this is \c 0, do nothing and return \c PSA_SUCCESS. + * + * \retval #PSA_SUCCESS + * \p handle was a valid handle and the key material that it + * referred to has been erased. + * Alternatively, \p handle is \c 0. + * \retval #PSA_ERROR_NOT_PERMITTED + * The key cannot be erased because it is + * read-only, either due to a policy or due to physical restrictions. + * \retval #PSA_ERROR_INVALID_HANDLE + * \p handle is not a valid handle nor \c 0. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * There was an failure in communication with the cryptoprocessor. + * The key material may still be present in the cryptoprocessor. + * \retval #PSA_ERROR_STORAGE_FAILURE + * The storage is corrupted. Implementations shall make a best effort + * to erase key material even in this stage, however applications + * should be aware that it may be impossible to guarantee that the + * key material is not recoverable in such cases. + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * An unexpected condition which is not a storage corruption or + * a communication failure occurred. The cryptoprocessor may have + * been compromised. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_destroy_key(psa_key_handle_t handle); + +/**@}*/ + +/** \defgroup import_export Key import and export + * @{ + */ + +/** + * \brief Import a key in binary format. + * + * This function supports any output from psa_export_key(). Refer to the + * documentation of psa_export_public_key() for the format of public keys + * and to the documentation of psa_export_key() for the format for + * other key types. + * + * The key data determines the key size. The attributes may optionally + * specify a key size; in this case it must match the size determined + * from the key data. A key size of 0 in \p attributes indicates that + * the key size is solely determined by the key data. + * + * Implementations must reject an attempt to import a key of size 0. + * + * This specification supports a single format for each key type. + * Implementations may support other formats as long as the standard + * format is supported. Implementations that support other formats + * should ensure that the formats are clearly unambiguous so as to + * minimize the risk that an invalid input is accidentally interpreted + * according to a different format. + * + * \param[in] attributes The attributes for the new key. + * The key size is always determined from the + * \p data buffer. + * If the key size in \p attributes is nonzero, + * it must be equal to the size from \p data. + * \param[out] handle On success, a handle to the newly created key. + * \c 0 on failure. + * \param[in] data Buffer containing the key data. The content of this + * buffer is interpreted according to the type declared + * in \p attributes. + * All implementations must support at least the format + * described in the documentation + * of psa_export_key() or psa_export_public_key() for + * the chosen type. Implementations may allow other + * formats, but should be conservative: implementations + * should err on the side of rejecting content if it + * may be erroneous (e.g. wrong type or truncated data). + * \param data_length Size of the \p data buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * If the key is persistent, the key material and the key's metadata + * have been saved to persistent storage. + * \retval #PSA_ERROR_ALREADY_EXISTS + * This is an attempt to create a persistent key, and there is + * already a persistent key with the given identifier. + * \retval #PSA_ERROR_NOT_SUPPORTED + * The key type or key size is not supported, either by the + * implementation in general or in this particular persistent location. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key attributes, as a whole, are invalid. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key data is not correctly formatted. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size in \p attributes is nonzero and does not match the size + * of the key data. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_import_key(const psa_key_attributes_t *attributes, + const uint8_t *data, + size_t data_length, + psa_key_handle_t *handle); + + + +/** + * \brief Export a key in binary format. + * + * The output of this function can be passed to psa_import_key() to + * create an equivalent object. + * + * If the implementation of psa_import_key() supports other formats + * beyond the format specified here, the output from psa_export_key() + * must use the representation specified here, not the original + * representation. + * + * For standard key types, the output format is as follows: + * + * - For symmetric keys (including MAC keys), the format is the + * raw bytes of the key. + * - For DES, the key data consists of 8 bytes. The parity bits must be + * correct. + * - For Triple-DES, the format is the concatenation of the + * two or three DES keys. + * - For RSA key pairs (#PSA_KEY_TYPE_RSA_KEY_PAIR), the format + * is the non-encrypted DER encoding of the representation defined by + * PKCS\#1 (RFC 8017) as `RSAPrivateKey`, version 0. + * ``` + * RSAPrivateKey ::= SEQUENCE { + * version INTEGER, -- must be 0 + * modulus INTEGER, -- n + * publicExponent INTEGER, -- e + * privateExponent INTEGER, -- d + * prime1 INTEGER, -- p + * prime2 INTEGER, -- q + * exponent1 INTEGER, -- d mod (p-1) + * exponent2 INTEGER, -- d mod (q-1) + * coefficient INTEGER, -- (inverse of q) mod p + * } + * ``` + * - For elliptic curve key pairs (key types for which + * #PSA_KEY_TYPE_IS_ECC_KEY_PAIR is true), the format is + * a representation of the private value as a `ceiling(m/8)`-byte string + * where `m` is the bit size associated with the curve, i.e. the bit size + * of the order of the curve's coordinate field. This byte string is + * in little-endian order for Montgomery curves (curve types + * `PSA_ECC_CURVE_CURVEXXX`), and in big-endian order for Weierstrass + * curves (curve types `PSA_ECC_CURVE_SECTXXX`, `PSA_ECC_CURVE_SECPXXX` + * and `PSA_ECC_CURVE_BRAINPOOL_PXXX`). + * This is the content of the `privateKey` field of the `ECPrivateKey` + * format defined by RFC 5915. + * - For Diffie-Hellman key exchange key pairs (key types for which + * #PSA_KEY_TYPE_IS_DH_KEY_PAIR is true), the + * format is the representation of the private key `x` as a big-endian byte + * string. The length of the byte string is the private key size in bytes + * (leading zeroes are not stripped). + * - For public keys (key types for which #PSA_KEY_TYPE_IS_PUBLIC_KEY is + * true), the format is the same as for psa_export_public_key(). + * + * The policy on the key must have the usage flag #PSA_KEY_USAGE_EXPORT set. + * + * \param handle Handle to the key to export. + * \param[out] data Buffer where the key data is to be written. + * \param data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes + * that make up the key data. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * The key does not have the #PSA_KEY_USAGE_EXPORT flag. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p data buffer is too small. You can determine a + * sufficient buffer size by calling + * #PSA_KEY_EXPORT_MAX_SIZE(\c type, \c bits) + * where \c type is the key type + * and \c bits is the key size in bits. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_export_key(psa_key_handle_t handle, + uint8_t *data, + size_t data_size, + size_t *data_length); + +/** + * \brief Export a public key or the public part of a key pair in binary format. + * + * The output of this function can be passed to psa_import_key() to + * create an object that is equivalent to the public key. + * + * This specification supports a single format for each key type. + * Implementations may support other formats as long as the standard + * format is supported. Implementations that support other formats + * should ensure that the formats are clearly unambiguous so as to + * minimize the risk that an invalid input is accidentally interpreted + * according to a different format. + * + * For standard key types, the output format is as follows: + * - For RSA public keys (#PSA_KEY_TYPE_RSA_PUBLIC_KEY), the DER encoding of + * the representation defined by RFC 3279 §2.3.1 as `RSAPublicKey`. + * ``` + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER } -- e + * ``` + * - For elliptic curve public keys (key types for which + * #PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY is true), the format is the uncompressed + * representation defined by SEC1 §2.3.3 as the content of an ECPoint. + * Let `m` be the bit size associated with the curve, i.e. the bit size of + * `q` for a curve over `F_q`. The representation consists of: + * - The byte 0x04; + * - `x_P` as a `ceiling(m/8)`-byte string, big-endian; + * - `y_P` as a `ceiling(m/8)`-byte string, big-endian. + * - For Diffie-Hellman key exchange public keys (key types for which + * #PSA_KEY_TYPE_IS_DH_PUBLIC_KEY is true), + * the format is the representation of the public key `y = g^x mod p` as a + * big-endian byte string. The length of the byte string is the length of the + * base prime `p` in bytes. + * + * Exporting a public key object or the public part of a key pair is + * always permitted, regardless of the key's usage flags. + * + * \param handle Handle to the key to export. + * \param[out] data Buffer where the key data is to be written. + * \param data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes + * that make up the key data. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key is neither a public key nor a key pair. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p data buffer is too small. You can determine a + * sufficient buffer size by calling + * #PSA_KEY_EXPORT_MAX_SIZE(#PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(\c type), \c bits) + * where \c type is the key type + * and \c bits is the key size in bits. + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_export_public_key(psa_key_handle_t handle, + uint8_t *data, + size_t data_size, + size_t *data_length); + + + +/**@}*/ + +/** \defgroup hash Message digests + * @{ + */ + +/** Calculate the hash (digest) of a message. + * + * \note To verify the hash of a message against an + * expected value, use psa_hash_compare() instead. + * + * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_HASH(\p alg) is true). + * \param[in] input Buffer containing the message to hash. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] hash Buffer where the hash is to be written. + * \param hash_size Size of the \p hash buffer in bytes. + * \param[out] hash_length On success, the number of bytes + * that make up the hash value. This is always + * #PSA_HASH_SIZE(\p alg). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a hash algorithm. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p hash_size is too small + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_compute(psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *hash, + size_t hash_size, + size_t *hash_length); + +/** Calculate the hash (digest) of a message and compare it with a + * reference value. + * + * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_HASH(\p alg) is true). + * \param[in] input Buffer containing the message to hash. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] hash Buffer containing the expected hash value. + * \param hash_length Size of the \p hash buffer in bytes. + * + * \retval #PSA_SUCCESS + * The expected hash is identical to the actual hash of the input. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The hash of the message was calculated successfully, but it + * differs from the expected hash. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a hash algorithm. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p input_length or \p hash_length do not match the hash size for \p alg + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_compare(psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *hash, + const size_t hash_length); + +/** The type of the state data structure for multipart hash operations. + * + * Before calling any function on a hash operation object, the application must + * initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_hash_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_hash_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_HASH_OPERATION_INIT, + * for example: + * \code + * psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_hash_operation_init() + * to the structure, for example: + * \code + * psa_hash_operation_t operation; + * operation = psa_hash_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. */ +typedef struct psa_hash_operation_s psa_hash_operation_t; + +/** \def PSA_HASH_OPERATION_INIT + * + * This macro returns a suitable initializer for a hash operation object + * of type #psa_hash_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_HASH_OPERATION_INIT {0} +#endif + +/** Return an initial value for a hash operation object. + */ +static psa_hash_operation_t psa_hash_operation_init(void); + +/** Set up a multipart hash operation. + * + * The sequence of operations to calculate a hash (message digest) + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_hash_operation_t, e.g. #PSA_HASH_OPERATION_INIT. + * -# Call psa_hash_setup() to specify the algorithm. + * -# Call psa_hash_update() zero, one or more times, passing a fragment + * of the message each time. The hash that is calculated is the hash + * of the concatenation of these messages in order. + * -# To calculate the hash, call psa_hash_finish(). + * To compare the hash with an expected value, call psa_hash_verify(). + * + * If an error occurs at any step after a call to psa_hash_setup(), the + * operation will need to be reset by a call to psa_hash_abort(). The + * application may call psa_hash_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_hash_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_hash_finish() or psa_hash_verify(). + * - A call to psa_hash_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_hash_operation_t and not yet in use. + * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_HASH(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not a supported hash algorithm. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p alg is not a hash algorithm. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_setup(psa_hash_operation_t *operation, + psa_algorithm_t alg); + +/** Add a message fragment to a multipart hash operation. + * + * The application must call psa_hash_setup() before calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_hash_abort(). + * + * \param[in,out] operation Active hash operation. + * \param[in] input Buffer containing the message fragment to hash. + * \param input_length Size of the \p input buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it muct be active). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_update(psa_hash_operation_t *operation, + const uint8_t *input, + size_t input_length); + +/** Finish the calculation of the hash of a message. + * + * The application must call psa_hash_setup() before calling this function. + * This function calculates the hash of the message formed by concatenating + * the inputs passed to preceding calls to psa_hash_update(). + * + * When this function returns successfuly, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_hash_abort(). + * + * \warning Applications should not call this function if they expect + * a specific value for the hash. Call psa_hash_verify() instead. + * Beware that comparing integrity or authenticity data such as + * hash values with a function such as \c memcmp is risky + * because the time taken by the comparison may leak information + * about the hashed data which could allow an attacker to guess + * a valid hash and thereby bypass security controls. + * + * \param[in,out] operation Active hash operation. + * \param[out] hash Buffer where the hash is to be written. + * \param hash_size Size of the \p hash buffer in bytes. + * \param[out] hash_length On success, the number of bytes + * that make up the hash value. This is always + * #PSA_HASH_SIZE(\c alg) where \c alg is the + * hash algorithm that is calculated. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p hash buffer is too small. You can determine a + * sufficient buffer size by calling #PSA_HASH_SIZE(\c alg) + * where \c alg is the hash algorithm that is calculated. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_finish(psa_hash_operation_t *operation, + uint8_t *hash, + size_t hash_size, + size_t *hash_length); + +/** Finish the calculation of the hash of a message and compare it with + * an expected value. + * + * The application must call psa_hash_setup() before calling this function. + * This function calculates the hash of the message formed by concatenating + * the inputs passed to preceding calls to psa_hash_update(). It then + * compares the calculated hash with the expected hash passed as a + * parameter to this function. + * + * When this function returns successfuly, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_hash_abort(). + * + * \note Implementations shall make the best effort to ensure that the + * comparison between the actual hash and the expected hash is performed + * in constant time. + * + * \param[in,out] operation Active hash operation. + * \param[in] hash Buffer containing the expected hash value. + * \param hash_length Size of the \p hash buffer in bytes. + * + * \retval #PSA_SUCCESS + * The expected hash is identical to the actual hash of the message. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The hash of the message was calculated successfully, but it + * differs from the expected hash. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_verify(psa_hash_operation_t *operation, + const uint8_t *hash, + size_t hash_length); + +/** Abort a hash operation. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * psa_hash_setup() again. + * + * You may call this function any time after the operation object has + * been initialized by one of the methods described in #psa_hash_operation_t. + * + * In particular, calling psa_hash_abort() after the operation has been + * terminated by a call to psa_hash_abort(), psa_hash_finish() or + * psa_hash_verify() is safe and has no effect. + * + * \param[in,out] operation Initialized hash operation. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_abort(psa_hash_operation_t *operation); + +/** Clone a hash operation. + * + * This function copies the state of an ongoing hash operation to + * a new operation object. In other words, this function is equivalent + * to calling psa_hash_setup() on \p target_operation with the same + * algorithm that \p source_operation was set up for, then + * psa_hash_update() on \p target_operation with the same input that + * that was passed to \p source_operation. After this function returns, the + * two objects are independent, i.e. subsequent calls involving one of + * the objects do not affect the other object. + * + * \param[in] source_operation The active hash operation to clone. + * \param[in,out] target_operation The operation object to set up. + * It must be initialized but not active. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_BAD_STATE + * The \p source_operation state is not valid (it must be active). + * \retval #PSA_ERROR_BAD_STATE + * The \p target_operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation, + psa_hash_operation_t *target_operation); + +/**@}*/ + +/** \defgroup MAC Message authentication codes + * @{ + */ + +/** Calculate the MAC (message authentication code) of a message. + * + * \note To verify the MAC of a message against an + * expected value, use psa_mac_verify() instead. + * Beware that comparing integrity or authenticity data such as + * MAC values with a function such as \c memcmp is risky + * because the time taken by the comparison may leak information + * about the MAC value which could allow an attacker to guess + * a valid MAC and thereby bypass security controls. + * + * \param handle Handle to the key to use for the operation. + * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * \param[in] input Buffer containing the input message. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] mac Buffer where the MAC value is to be written. + * \param mac_size Size of the \p mac buffer in bytes. + * \param[out] mac_length On success, the number of bytes + * that make up the MAC value. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a MAC algorithm. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p mac_size is too small + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * The key could not be retrieved from storage. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_compute(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *mac, + size_t mac_size, + size_t *mac_length); + +/** Calculate the MAC of a message and compare it with a reference value. + * + * \param handle Handle to the key to use for the operation. + * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * \param[in] input Buffer containing the input message. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] mac Buffer containing the expected MAC value. + * \param mac_length Size of the \p mac buffer in bytes. + * + * \retval #PSA_SUCCESS + * The expected MAC is identical to the actual MAC of the input. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The MAC of the message was calculated successfully, but it + * differs from the expected value. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a MAC algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * The key could not be retrieved from storage. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_verify(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *mac, + const size_t mac_length); + +/** The type of the state data structure for multipart MAC operations. + * + * Before calling any function on a MAC operation object, the application must + * initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_mac_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_mac_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_MAC_OPERATION_INIT, + * for example: + * \code + * psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_mac_operation_init() + * to the structure, for example: + * \code + * psa_mac_operation_t operation; + * operation = psa_mac_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. */ +typedef struct psa_mac_operation_s psa_mac_operation_t; + +/** \def PSA_MAC_OPERATION_INIT + * + * This macro returns a suitable initializer for a MAC operation object of type + * #psa_mac_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_MAC_OPERATION_INIT {0} +#endif + +/** Return an initial value for a MAC operation object. + */ +static psa_mac_operation_t psa_mac_operation_init(void); + +/** Set up a multipart MAC calculation operation. + * + * This function sets up the calculation of the MAC + * (message authentication code) of a byte string. + * To verify the MAC of a message against an + * expected value, use psa_mac_verify_setup() instead. + * + * The sequence of operations to calculate a MAC is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_mac_operation_t, e.g. #PSA_MAC_OPERATION_INIT. + * -# Call psa_mac_sign_setup() to specify the algorithm and key. + * -# Call psa_mac_update() zero, one or more times, passing a fragment + * of the message each time. The MAC that is calculated is the MAC + * of the concatenation of these messages in order. + * -# At the end of the message, call psa_mac_sign_finish() to finish + * calculating the MAC value and retrieve it. + * + * If an error occurs at any step after a call to psa_mac_sign_setup(), the + * operation will need to be reset by a call to psa_mac_abort(). The + * application may call psa_mac_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_mac_sign_setup(), the application must + * eventually terminate the operation through one of the following methods: + * - A successful call to psa_mac_sign_finish(). + * - A call to psa_mac_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_mac_operation_t and not yet in use. + * \param handle Handle to the key to use for the operation. + * It must remain valid until the operation + * terminates. + * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a MAC algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * The key could not be retrieved from storage. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg); + +/** Set up a multipart MAC verification operation. + * + * This function sets up the verification of the MAC + * (message authentication code) of a byte string against an expected value. + * + * The sequence of operations to verify a MAC is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_mac_operation_t, e.g. #PSA_MAC_OPERATION_INIT. + * -# Call psa_mac_verify_setup() to specify the algorithm and key. + * -# Call psa_mac_update() zero, one or more times, passing a fragment + * of the message each time. The MAC that is calculated is the MAC + * of the concatenation of these messages in order. + * -# At the end of the message, call psa_mac_verify_finish() to finish + * calculating the actual MAC of the message and verify it against + * the expected value. + * + * If an error occurs at any step after a call to psa_mac_verify_setup(), the + * operation will need to be reset by a call to psa_mac_abort(). The + * application may call psa_mac_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_mac_verify_setup(), the application must + * eventually terminate the operation through one of the following methods: + * - A successful call to psa_mac_verify_finish(). + * - A call to psa_mac_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_mac_operation_t and not yet in use. + * \param handle Handle to the key to use for the operation. + * It must remain valid until the operation + * terminates. + * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value + * such that #PSA_ALG_IS_MAC(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c key is not compatible with \c alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \c alg is not supported or is not a MAC algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * The key could not be retrieved from storage + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg); + +/** Add a message fragment to a multipart MAC operation. + * + * The application must call psa_mac_sign_setup() or psa_mac_verify_setup() + * before calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_mac_abort(). + * + * \param[in,out] operation Active MAC operation. + * \param[in] input Buffer containing the message fragment to add to + * the MAC calculation. + * \param input_length Size of the \p input buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_update(psa_mac_operation_t *operation, + const uint8_t *input, + size_t input_length); + +/** Finish the calculation of the MAC of a message. + * + * The application must call psa_mac_sign_setup() before calling this function. + * This function calculates the MAC of the message formed by concatenating + * the inputs passed to preceding calls to psa_mac_update(). + * + * When this function returns successfuly, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_mac_abort(). + * + * \warning Applications should not call this function if they expect + * a specific value for the MAC. Call psa_mac_verify_finish() instead. + * Beware that comparing integrity or authenticity data such as + * MAC values with a function such as \c memcmp is risky + * because the time taken by the comparison may leak information + * about the MAC value which could allow an attacker to guess + * a valid MAC and thereby bypass security controls. + * + * \param[in,out] operation Active MAC operation. + * \param[out] mac Buffer where the MAC value is to be written. + * \param mac_size Size of the \p mac buffer in bytes. + * \param[out] mac_length On success, the number of bytes + * that make up the MAC value. This is always + * #PSA_MAC_FINAL_SIZE(\c key_type, \c key_bits, \c alg) + * where \c key_type and \c key_bits are the type and + * bit-size respectively of the key and \c alg is the + * MAC algorithm that is calculated. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active mac sign + * operation). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p mac buffer is too small. You can determine a + * sufficient buffer size by calling PSA_MAC_FINAL_SIZE(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation, + uint8_t *mac, + size_t mac_size, + size_t *mac_length); + +/** Finish the calculation of the MAC of a message and compare it with + * an expected value. + * + * The application must call psa_mac_verify_setup() before calling this function. + * This function calculates the MAC of the message formed by concatenating + * the inputs passed to preceding calls to psa_mac_update(). It then + * compares the calculated MAC with the expected MAC passed as a + * parameter to this function. + * + * When this function returns successfuly, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_mac_abort(). + * + * \note Implementations shall make the best effort to ensure that the + * comparison between the actual MAC and the expected MAC is performed + * in constant time. + * + * \param[in,out] operation Active MAC operation. + * \param[in] mac Buffer containing the expected MAC value. + * \param mac_length Size of the \p mac buffer in bytes. + * + * \retval #PSA_SUCCESS + * The expected MAC is identical to the actual MAC of the message. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The MAC of the message was calculated successfully, but it + * differs from the expected MAC. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active mac verify + * operation). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation, + const uint8_t *mac, + size_t mac_length); + +/** Abort a MAC operation. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * psa_mac_sign_setup() or psa_mac_verify_setup() again. + * + * You may call this function any time after the operation object has + * been initialized by one of the methods described in #psa_mac_operation_t. + * + * In particular, calling psa_mac_abort() after the operation has been + * terminated by a call to psa_mac_abort(), psa_mac_sign_finish() or + * psa_mac_verify_finish() is safe and has no effect. + * + * \param[in,out] operation Initialized MAC operation. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_mac_abort(psa_mac_operation_t *operation); + +/**@}*/ + +/** \defgroup cipher Symmetric ciphers + * @{ + */ + +/** Encrypt a message using a symmetric cipher. + * + * This function encrypts a message with a random IV (initialization + * vector). Use the multipart operation interface with a + * #psa_cipher_operation_t object to provide other forms of IV. + * + * \param handle Handle to the key to use for the operation. + * It must remain valid until the operation + * terminates. + * \param alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \param[in] input Buffer containing the message to encrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the output is to be written. + * The output contains the IV followed by + * the ciphertext proper. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a cipher algorithm. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_encrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** Decrypt a message using a symmetric cipher. + * + * This function decrypts a message encrypted with a symmetric cipher. + * + * \param handle Handle to the key to use for the operation. + * It must remain valid until the operation + * terminates. + * \param alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * \param[in] input Buffer containing the message to decrypt. + * This consists of the IV followed by the + * ciphertext proper. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the plaintext is to be written. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a cipher algorithm. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_decrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** The type of the state data structure for multipart cipher operations. + * + * Before calling any function on a cipher operation object, the application + * must initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_cipher_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_cipher_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_CIPHER_OPERATION_INIT, + * for example: + * \code + * psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_cipher_operation_init() + * to the structure, for example: + * \code + * psa_cipher_operation_t operation; + * operation = psa_cipher_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. */ +typedef struct psa_cipher_operation_s psa_cipher_operation_t; + +/** \def PSA_CIPHER_OPERATION_INIT + * + * This macro returns a suitable initializer for a cipher operation object of + * type #psa_cipher_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_CIPHER_OPERATION_INIT {0} +#endif + +/** Return an initial value for a cipher operation object. + */ +static psa_cipher_operation_t psa_cipher_operation_init(void); + +/** Set the key for a multipart symmetric encryption operation. + * + * The sequence of operations to encrypt a message with a symmetric cipher + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_cipher_operation_t, e.g. + * #PSA_CIPHER_OPERATION_INIT. + * -# Call psa_cipher_encrypt_setup() to specify the algorithm and key. + * -# Call either psa_cipher_generate_iv() or psa_cipher_set_iv() to + * generate or set the IV (initialization vector). You should use + * psa_cipher_generate_iv() unless the protocol you are implementing + * requires a specific IV value. + * -# Call psa_cipher_update() zero, one or more times, passing a fragment + * of the message each time. + * -# Call psa_cipher_finish(). + * + * If an error occurs at any step after a call to psa_cipher_encrypt_setup(), + * the operation will need to be reset by a call to psa_cipher_abort(). The + * application may call psa_cipher_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_cipher_encrypt_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_cipher_finish(). + * - A call to psa_cipher_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_cipher_operation_t and not yet in use. + * \param handle Handle to the key to use for the operation. + * It must remain valid until the operation + * terminates. + * \param alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a cipher algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg); + +/** Set the key for a multipart symmetric decryption operation. + * + * The sequence of operations to decrypt a message with a symmetric cipher + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_cipher_operation_t, e.g. + * #PSA_CIPHER_OPERATION_INIT. + * -# Call psa_cipher_decrypt_setup() to specify the algorithm and key. + * -# Call psa_cipher_set_iv() with the IV (initialization vector) for the + * decryption. If the IV is prepended to the ciphertext, you can call + * psa_cipher_update() on a buffer containing the IV followed by the + * beginning of the message. + * -# Call psa_cipher_update() zero, one or more times, passing a fragment + * of the message each time. + * -# Call psa_cipher_finish(). + * + * If an error occurs at any step after a call to psa_cipher_decrypt_setup(), + * the operation will need to be reset by a call to psa_cipher_abort(). The + * application may call psa_cipher_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_cipher_decrypt_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_cipher_finish(). + * - A call to psa_cipher_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_cipher_operation_t and not yet in use. + * \param handle Handle to the key to use for the operation. + * It must remain valid until the operation + * terminates. + * \param alg The cipher algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_CIPHER(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not a cipher algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg); + +/** Generate an IV for a symmetric encryption operation. + * + * This function generates a random IV (initialization vector), nonce + * or initial counter value for the encryption operation as appropriate + * for the chosen algorithm, key type and key size. + * + * The application must call psa_cipher_encrypt_setup() before + * calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_cipher_abort(). + * + * \param[in,out] operation Active cipher operation. + * \param[out] iv Buffer where the generated IV is to be written. + * \param iv_size Size of the \p iv buffer in bytes. + * \param[out] iv_length On success, the number of bytes of the + * generated IV. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, with no IV set). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p iv buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation, + uint8_t *iv, + size_t iv_size, + size_t *iv_length); + +/** Set the IV for a symmetric encryption or decryption operation. + * + * This function sets the IV (initialization vector), nonce + * or initial counter value for the encryption or decryption operation. + * + * The application must call psa_cipher_encrypt_setup() before + * calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_cipher_abort(). + * + * \note When encrypting, applications should use psa_cipher_generate_iv() + * instead of this function, unless implementing a protocol that requires + * a non-random IV. + * + * \param[in,out] operation Active cipher operation. + * \param[in] iv Buffer containing the IV to use. + * \param iv_length Size of the IV in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active cipher + * encrypt operation, with no IV set). + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size of \p iv is not acceptable for the chosen algorithm, + * or the chosen algorithm does not use an IV. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation, + const uint8_t *iv, + size_t iv_length); + +/** Encrypt or decrypt a message fragment in an active cipher operation. + * + * Before calling this function, you must: + * 1. Call either psa_cipher_encrypt_setup() or psa_cipher_decrypt_setup(). + * The choice of setup function determines whether this function + * encrypts or decrypts its input. + * 2. If the algorithm requires an IV, call psa_cipher_generate_iv() + * (recommended when encrypting) or psa_cipher_set_iv(). + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_cipher_abort(). + * + * \param[in,out] operation Active cipher operation. + * \param[in] input Buffer containing the message fragment to + * encrypt or decrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the output is to be written. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, with an IV set + * if required for the algorithm). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_update(psa_cipher_operation_t *operation, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** Finish encrypting or decrypting a message in a cipher operation. + * + * The application must call psa_cipher_encrypt_setup() or + * psa_cipher_decrypt_setup() before calling this function. The choice + * of setup function determines whether this function encrypts or + * decrypts its input. + * + * This function finishes the encryption or decryption of the message + * formed by concatenating the inputs passed to preceding calls to + * psa_cipher_update(). + * + * When this function returns successfuly, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_cipher_abort(). + * + * \param[in,out] operation Active cipher operation. + * \param[out] output Buffer where the output is to be written. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total input size passed to this operation is not valid for + * this particular algorithm. For example, the algorithm is a based + * on block cipher and requires a whole number of blocks, but the + * total input size is not a multiple of the block size. + * \retval #PSA_ERROR_INVALID_PADDING + * This is a decryption operation for an algorithm that includes + * padding, and the ciphertext does not contain valid padding. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, with an IV set + * if required for the algorithm). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** Abort a cipher operation. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * psa_cipher_encrypt_setup() or psa_cipher_decrypt_setup() again. + * + * You may call this function any time after the operation object has + * been initialized as described in #psa_cipher_operation_t. + * + * In particular, calling psa_cipher_abort() after the operation has been + * terminated by a call to psa_cipher_abort() or psa_cipher_finish() + * is safe and has no effect. + * + * \param[in,out] operation Initialized cipher operation. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation); + +/**@}*/ + +/** \defgroup aead Authenticated encryption with associated data (AEAD) + * @{ + */ + +/** Process an authenticated encryption operation. + * + * \param handle Handle to the key to use for the operation. + * \param alg The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param[in] nonce Nonce or IV to use. + * \param nonce_length Size of the \p nonce buffer in bytes. + * \param[in] additional_data Additional data that will be authenticated + * but not encrypted. + * \param additional_data_length Size of \p additional_data in bytes. + * \param[in] plaintext Data that will be authenticated and + * encrypted. + * \param plaintext_length Size of \p plaintext in bytes. + * \param[out] ciphertext Output buffer for the authenticated and + * encrypted data. The additional data is not + * part of this output. For algorithms where the + * encrypted data and the authentication tag + * are defined as separate outputs, the + * authentication tag is appended to the + * encrypted data. + * \param ciphertext_size Size of the \p ciphertext buffer in bytes. + * This must be at least + * #PSA_AEAD_ENCRYPT_OUTPUT_SIZE(\p alg, + * \p plaintext_length). + * \param[out] ciphertext_length On success, the size of the output + * in the \p ciphertext buffer. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not an AEAD algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p ciphertext_size is too small + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_encrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *nonce, + size_t nonce_length, + const uint8_t *additional_data, + size_t additional_data_length, + const uint8_t *plaintext, + size_t plaintext_length, + uint8_t *ciphertext, + size_t ciphertext_size, + size_t *ciphertext_length); + +/** Process an authenticated decryption operation. + * + * \param handle Handle to the key to use for the operation. + * \param alg The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param[in] nonce Nonce or IV to use. + * \param nonce_length Size of the \p nonce buffer in bytes. + * \param[in] additional_data Additional data that has been authenticated + * but not encrypted. + * \param additional_data_length Size of \p additional_data in bytes. + * \param[in] ciphertext Data that has been authenticated and + * encrypted. For algorithms where the + * encrypted data and the authentication tag + * are defined as separate inputs, the buffer + * must contain the encrypted data followed + * by the authentication tag. + * \param ciphertext_length Size of \p ciphertext in bytes. + * \param[out] plaintext Output buffer for the decrypted data. + * \param plaintext_size Size of the \p plaintext buffer in bytes. + * This must be at least + * #PSA_AEAD_DECRYPT_OUTPUT_SIZE(\p alg, + * \p ciphertext_length). + * \param[out] plaintext_length On success, the size of the output + * in the \p plaintext buffer. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The ciphertext is not authentic. + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not an AEAD algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p plaintext_size or \p nonce_length is too small + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_decrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *nonce, + size_t nonce_length, + const uint8_t *additional_data, + size_t additional_data_length, + const uint8_t *ciphertext, + size_t ciphertext_length, + uint8_t *plaintext, + size_t plaintext_size, + size_t *plaintext_length); + +/** The type of the state data structure for multipart AEAD operations. + * + * Before calling any function on an AEAD operation object, the application + * must initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_aead_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_aead_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_AEAD_OPERATION_INIT, + * for example: + * \code + * psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_aead_operation_init() + * to the structure, for example: + * \code + * psa_aead_operation_t operation; + * operation = psa_aead_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. */ +typedef struct psa_aead_operation_s psa_aead_operation_t; + +/** \def PSA_AEAD_OPERATION_INIT + * + * This macro returns a suitable initializer for an AEAD operation object of + * type #psa_aead_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_AEAD_OPERATION_INIT {0} +#endif + +/** Return an initial value for an AEAD operation object. + */ +static psa_aead_operation_t psa_aead_operation_init(void); + +/** Set the key for a multipart authenticated encryption operation. + * + * The sequence of operations to encrypt a message with authentication + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_aead_operation_t, e.g. + * #PSA_AEAD_OPERATION_INIT. + * -# Call psa_aead_encrypt_setup() to specify the algorithm and key. + * -# If needed, call psa_aead_set_lengths() to specify the length of the + * inputs to the subsequent calls to psa_aead_update_ad() and + * psa_aead_update(). See the documentation of psa_aead_set_lengths() + * for details. + * -# Call either psa_aead_generate_nonce() or psa_aead_set_nonce() to + * generate or set the nonce. You should use + * psa_aead_generate_nonce() unless the protocol you are implementing + * requires a specific nonce value. + * -# Call psa_aead_update_ad() zero, one or more times, passing a fragment + * of the non-encrypted additional authenticated data each time. + * -# Call psa_aead_update() zero, one or more times, passing a fragment + * of the message to encrypt each time. + * -# Call psa_aead_finish(). + * + * If an error occurs at any step after a call to psa_aead_encrypt_setup(), + * the operation will need to be reset by a call to psa_aead_abort(). The + * application may call psa_aead_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_aead_encrypt_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_aead_finish(). + * - A call to psa_aead_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_aead_operation_t and not yet in use. + * \param handle Handle to the key to use for the operation. + * It must remain valid until the operation + * terminates. + * \param alg The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not an AEAD algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg); + +/** Set the key for a multipart authenticated decryption operation. + * + * The sequence of operations to decrypt a message with authentication + * is as follows: + * -# Allocate an operation object which will be passed to all the functions + * listed here. + * -# Initialize the operation object with one of the methods described in the + * documentation for #psa_aead_operation_t, e.g. + * #PSA_AEAD_OPERATION_INIT. + * -# Call psa_aead_decrypt_setup() to specify the algorithm and key. + * -# If needed, call psa_aead_set_lengths() to specify the length of the + * inputs to the subsequent calls to psa_aead_update_ad() and + * psa_aead_update(). See the documentation of psa_aead_set_lengths() + * for details. + * -# Call psa_aead_set_nonce() with the nonce for the decryption. + * -# Call psa_aead_update_ad() zero, one or more times, passing a fragment + * of the non-encrypted additional authenticated data each time. + * -# Call psa_aead_update() zero, one or more times, passing a fragment + * of the ciphertext to decrypt each time. + * -# Call psa_aead_verify(). + * + * If an error occurs at any step after a call to psa_aead_decrypt_setup(), + * the operation will need to be reset by a call to psa_aead_abort(). The + * application may call psa_aead_abort() at any time after the operation + * has been initialized. + * + * After a successful call to psa_aead_decrypt_setup(), the application must + * eventually terminate the operation. The following events terminate an + * operation: + * - A successful call to psa_aead_verify(). + * - A call to psa_aead_abort(). + * + * \param[in,out] operation The operation object to set up. It must have + * been initialized as per the documentation for + * #psa_aead_operation_t and not yet in use. + * \param handle Handle to the key to use for the operation. + * It must remain valid until the operation + * terminates. + * \param alg The AEAD algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p handle is not compatible with \p alg. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not supported or is not an AEAD algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg); + +/** Generate a random nonce for an authenticated encryption operation. + * + * This function generates a random nonce for the authenticated encryption + * operation with an appropriate size for the chosen algorithm, key type + * and key size. + * + * The application must call psa_aead_encrypt_setup() before + * calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \param[in,out] operation Active AEAD operation. + * \param[out] nonce Buffer where the generated nonce is to be + * written. + * \param nonce_size Size of the \p nonce buffer in bytes. + * \param[out] nonce_length On success, the number of bytes of the + * generated nonce. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active aead encrypt + operation, with no nonce set). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p nonce buffer is too small. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation, + uint8_t *nonce, + size_t nonce_size, + size_t *nonce_length); + +/** Set the nonce for an authenticated encryption or decryption operation. + * + * This function sets the nonce for the authenticated + * encryption or decryption operation. + * + * The application must call psa_aead_encrypt_setup() or + * psa_aead_decrypt_setup() before calling this function. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \note When encrypting, applications should use psa_aead_generate_nonce() + * instead of this function, unless implementing a protocol that requires + * a non-random IV. + * + * \param[in,out] operation Active AEAD operation. + * \param[in] nonce Buffer containing the nonce to use. + * \param nonce_length Size of the nonce in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, with no nonce + * set). + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size of \p nonce is not acceptable for the chosen algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation, + const uint8_t *nonce, + size_t nonce_length); + +/** Declare the lengths of the message and additional data for AEAD. + * + * The application must call this function before calling + * psa_aead_update_ad() or psa_aead_update() if the algorithm for + * the operation requires it. If the algorithm does not require it, + * calling this function is optional, but if this function is called + * then the implementation must enforce the lengths. + * + * You may call this function before or after setting the nonce with + * psa_aead_set_nonce() or psa_aead_generate_nonce(). + * + * - For #PSA_ALG_CCM, calling this function is required. + * - For the other AEAD algorithms defined in this specification, calling + * this function is not required. + * - For vendor-defined algorithm, refer to the vendor documentation. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \param[in,out] operation Active AEAD operation. + * \param ad_length Size of the non-encrypted additional + * authenticated data in bytes. + * \param plaintext_length Size of the plaintext to encrypt in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, and + * psa_aead_update_ad() and psa_aead_update() must not have been + * called yet). + * \retval #PSA_ERROR_INVALID_ARGUMENT + * At least one of the lengths is not acceptable for the chosen + * algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation, + size_t ad_length, + size_t plaintext_length); + +/** Pass additional data to an active AEAD operation. + * + * Additional data is authenticated, but not encrypted. + * + * You may call this function multiple times to pass successive fragments + * of the additional data. You may not call this function after passing + * data to encrypt or decrypt with psa_aead_update(). + * + * Before calling this function, you must: + * 1. Call either psa_aead_encrypt_setup() or psa_aead_decrypt_setup(). + * 2. Set the nonce with psa_aead_generate_nonce() or psa_aead_set_nonce(). + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \warning When decrypting, until psa_aead_verify() has returned #PSA_SUCCESS, + * there is no guarantee that the input is valid. Therefore, until + * you have called psa_aead_verify() and it has returned #PSA_SUCCESS, + * treat the input as untrusted and prepare to undo any action that + * depends on the input if psa_aead_verify() returns an error status. + * + * \param[in,out] operation Active AEAD operation. + * \param[in] input Buffer containing the fragment of + * additional data. + * \param input_length Size of the \p input buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, have a nonce + * set, have lengths set if required by the algorithm, and + * psa_aead_update() must not have been called yet). + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total input length overflows the additional data length that + * was previously specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation, + const uint8_t *input, + size_t input_length); + +/** Encrypt or decrypt a message fragment in an active AEAD operation. + * + * Before calling this function, you must: + * 1. Call either psa_aead_encrypt_setup() or psa_aead_decrypt_setup(). + * The choice of setup function determines whether this function + * encrypts or decrypts its input. + * 2. Set the nonce with psa_aead_generate_nonce() or psa_aead_set_nonce(). + * 3. Call psa_aead_update_ad() to pass all the additional data. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \warning When decrypting, until psa_aead_verify() has returned #PSA_SUCCESS, + * there is no guarantee that the input is valid. Therefore, until + * you have called psa_aead_verify() and it has returned #PSA_SUCCESS: + * - Do not use the output in any way other than storing it in a + * confidential location. If you take any action that depends + * on the tentative decrypted data, this action will need to be + * undone if the input turns out not to be valid. Furthermore, + * if an adversary can observe that this action took place + * (for example through timing), they may be able to use this + * fact as an oracle to decrypt any message encrypted with the + * same key. + * - In particular, do not copy the output anywhere but to a + * memory or storage space that you have exclusive access to. + * + * This function does not require the input to be aligned to any + * particular block boundary. If the implementation can only process + * a whole block at a time, it must consume all the input provided, but + * it may delay the end of the corresponding output until a subsequent + * call to psa_aead_update(), psa_aead_finish() or psa_aead_verify() + * provides sufficient input. The amount of data that can be delayed + * in this way is bounded by #PSA_AEAD_UPDATE_OUTPUT_SIZE. + * + * \param[in,out] operation Active AEAD operation. + * \param[in] input Buffer containing the message fragment to + * encrypt or decrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[out] output Buffer where the output is to be written. + * \param output_size Size of the \p output buffer in bytes. + * This must be at least + * #PSA_AEAD_UPDATE_OUTPUT_SIZE(\c alg, + * \p input_length) where \c alg is the + * algorithm that is being calculated. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active, have a nonce + * set, and have lengths set if required by the algorithm). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. + * You can determine a sufficient buffer size by calling + * #PSA_AEAD_UPDATE_OUTPUT_SIZE(\c alg, \p input_length) + * where \c alg is the algorithm that is being calculated. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total length of input to psa_aead_update_ad() so far is + * less than the additional data length that was previously + * specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total input length overflows the plaintext length that + * was previously specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_update(psa_aead_operation_t *operation, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** Finish encrypting a message in an AEAD operation. + * + * The operation must have been set up with psa_aead_encrypt_setup(). + * + * This function finishes the authentication of the additional data + * formed by concatenating the inputs passed to preceding calls to + * psa_aead_update_ad() with the plaintext formed by concatenating the + * inputs passed to preceding calls to psa_aead_update(). + * + * This function has two output buffers: + * - \p ciphertext contains trailing ciphertext that was buffered from + * preceding calls to psa_aead_update(). + * - \p tag contains the authentication tag. Its length is always + * #PSA_AEAD_TAG_LENGTH(\c alg) where \c alg is the AEAD algorithm + * that the operation performs. + * + * When this function returns successfuly, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \param[in,out] operation Active AEAD operation. + * \param[out] ciphertext Buffer where the last part of the ciphertext + * is to be written. + * \param ciphertext_size Size of the \p ciphertext buffer in bytes. + * This must be at least + * #PSA_AEAD_FINISH_OUTPUT_SIZE(\c alg) where + * \c alg is the algorithm that is being + * calculated. + * \param[out] ciphertext_length On success, the number of bytes of + * returned ciphertext. + * \param[out] tag Buffer where the authentication tag is + * to be written. + * \param tag_size Size of the \p tag buffer in bytes. + * This must be at least + * #PSA_AEAD_TAG_LENGTH(\c alg) where \c alg is + * the algorithm that is being calculated. + * \param[out] tag_length On success, the number of bytes + * that make up the returned tag. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active encryption + * operation with a nonce set). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p ciphertext or \p tag buffer is too small. + * You can determine a sufficient buffer size for \p ciphertext by + * calling #PSA_AEAD_FINISH_OUTPUT_SIZE(\c alg) + * where \c alg is the algorithm that is being calculated. + * You can determine a sufficient buffer size for \p tag by + * calling #PSA_AEAD_TAG_LENGTH(\c alg). + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total length of input to psa_aead_update_ad() so far is + * less than the additional data length that was previously + * specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total length of input to psa_aead_update() so far is + * less than the plaintext length that was previously + * specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_finish(psa_aead_operation_t *operation, + uint8_t *ciphertext, + size_t ciphertext_size, + size_t *ciphertext_length, + uint8_t *tag, + size_t tag_size, + size_t *tag_length); + +/** Finish authenticating and decrypting a message in an AEAD operation. + * + * The operation must have been set up with psa_aead_decrypt_setup(). + * + * This function finishes the authenticated decryption of the message + * components: + * + * - The additional data consisting of the concatenation of the inputs + * passed to preceding calls to psa_aead_update_ad(). + * - The ciphertext consisting of the concatenation of the inputs passed to + * preceding calls to psa_aead_update(). + * - The tag passed to this function call. + * + * If the authentication tag is correct, this function outputs any remaining + * plaintext and reports success. If the authentication tag is not correct, + * this function returns #PSA_ERROR_INVALID_SIGNATURE. + * + * When this function returns successfuly, the operation becomes inactive. + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_aead_abort(). + * + * \note Implementations shall make the best effort to ensure that the + * comparison between the actual tag and the expected tag is performed + * in constant time. + * + * \param[in,out] operation Active AEAD operation. + * \param[out] plaintext Buffer where the last part of the plaintext + * is to be written. This is the remaining data + * from previous calls to psa_aead_update() + * that could not be processed until the end + * of the input. + * \param plaintext_size Size of the \p plaintext buffer in bytes. + * This must be at least + * #PSA_AEAD_VERIFY_OUTPUT_SIZE(\c alg) where + * \c alg is the algorithm that is being + * calculated. + * \param[out] plaintext_length On success, the number of bytes of + * returned plaintext. + * \param[in] tag Buffer containing the authentication tag. + * \param tag_length Size of the \p tag buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculations were successful, but the authentication tag is + * not correct. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be an active decryption + * operation with a nonce set). + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p plaintext buffer is too small. + * You can determine a sufficient buffer size for \p plaintext by + * calling #PSA_AEAD_VERIFY_OUTPUT_SIZE(\c alg) + * where \c alg is the algorithm that is being calculated. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total length of input to psa_aead_update_ad() so far is + * less than the additional data length that was previously + * specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The total length of input to psa_aead_update() so far is + * less than the plaintext length that was previously + * specified with psa_aead_set_lengths(). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_verify(psa_aead_operation_t *operation, + uint8_t *plaintext, + size_t plaintext_size, + size_t *plaintext_length, + const uint8_t *tag, + size_t tag_length); + +/** Abort an AEAD operation. + * + * Aborting an operation frees all associated resources except for the + * \p operation structure itself. Once aborted, the operation object + * can be reused for another operation by calling + * psa_aead_encrypt_setup() or psa_aead_decrypt_setup() again. + * + * You may call this function any time after the operation object has + * been initialized as described in #psa_aead_operation_t. + * + * In particular, calling psa_aead_abort() after the operation has been + * terminated by a call to psa_aead_abort(), psa_aead_finish() or + * psa_aead_verify() is safe and has no effect. + * + * \param[in,out] operation Initialized AEAD operation. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_aead_abort(psa_aead_operation_t *operation); + +/**@}*/ + +/** \defgroup asymmetric Asymmetric cryptography + * @{ + */ + +/** + * \brief Sign a hash or short message with a private key. + * + * Note that to perform a hash-and-sign signature algorithm, you must + * first calculate the hash by calling psa_hash_setup(), psa_hash_update() + * and psa_hash_finish(). Then pass the resulting hash as the \p hash + * parameter to this function. You can use #PSA_ALG_SIGN_GET_HASH(\p alg) + * to determine the hash algorithm to use. + * + * \param handle Handle to the key to use for the operation. + * It must be an asymmetric key pair. + * \param alg A signature algorithm that is compatible with + * the type of \p handle. + * \param[in] hash The hash or message to sign. + * \param hash_length Size of the \p hash buffer in bytes. + * \param[out] signature Buffer where the signature is to be written. + * \param signature_size Size of the \p signature buffer in bytes. + * \param[out] signature_length On success, the number of bytes + * that make up the returned signature value. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of \p handle. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_sign_hash(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length); + +/** + * \brief Verify the signature a hash or short message using a public key. + * + * Note that to perform a hash-and-sign signature algorithm, you must + * first calculate the hash by calling psa_hash_setup(), psa_hash_update() + * and psa_hash_finish(). Then pass the resulting hash as the \p hash + * parameter to this function. You can use #PSA_ALG_SIGN_GET_HASH(\p alg) + * to determine the hash algorithm to use. + * + * \param handle Handle to the key to use for the operation. + * It must be a public key or an asymmetric key pair. + * \param alg A signature algorithm that is compatible with + * the type of \p handle. + * \param[in] hash The hash or message whose signature is to be + * verified. + * \param hash_length Size of the \p hash buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS + * The signature is valid. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was perfomed successfully, but the passed + * signature is not a valid signature. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_verify_hash(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + const uint8_t *signature, + size_t signature_length); + +/** + * \brief Encrypt a short message with a public key. + * + * \param handle Handle to the key to use for the operation. + * It must be a public key or an asymmetric + * key pair. + * \param alg An asymmetric encryption algorithm that is + * compatible with the type of \p handle. + * \param[in] input The message to encrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[in] salt A salt or label, if supported by the + * encryption algorithm. + * If the algorithm does not support a + * salt, pass \c NULL. + * If the algorithm supports an optional + * salt and you do not want to pass a salt, + * pass \c NULL. + * + * - For #PSA_ALG_RSA_PKCS1V15_CRYPT, no salt is + * supported. + * \param salt_length Size of the \p salt buffer in bytes. + * If \p salt is \c NULL, pass 0. + * \param[out] output Buffer where the encrypted message is to + * be written. + * \param output_size Size of the \p output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of \p handle. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *salt, + size_t salt_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/** + * \brief Decrypt a short message with a private key. + * + * \param handle Handle to the key to use for the operation. + * It must be an asymmetric key pair. + * \param alg An asymmetric encryption algorithm that is + * compatible with the type of \p handle. + * \param[in] input The message to decrypt. + * \param input_length Size of the \p input buffer in bytes. + * \param[in] salt A salt or label, if supported by the + * encryption algorithm. + * If the algorithm does not support a + * salt, pass \c NULL. + * If the algorithm supports an optional + * salt and you do not want to pass a salt, + * pass \c NULL. + * + * - For #PSA_ALG_RSA_PKCS1V15_CRYPT, no salt is + * supported. + * \param salt_length Size of the \p salt buffer in bytes. + * If \p salt is \c NULL, pass 0. + * \param[out] output Buffer where the decrypted message is to + * be written. + * \param output_size Size of the \c output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p output buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of \p handle. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY + * \retval #PSA_ERROR_INVALID_PADDING + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *salt, + size_t salt_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/**@}*/ + +/** \defgroup key_derivation Key derivation and pseudorandom generation + * @{ + */ + +/** The type of the state data structure for key derivation operations. + * + * Before calling any function on a key derivation operation object, the + * application must initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_key_derivation_operation_t operation; + * memset(&operation, 0, sizeof(operation)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_key_derivation_operation_t operation = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_KEY_DERIVATION_OPERATION_INIT, + * for example: + * \code + * psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT; + * \endcode + * - Assign the result of the function psa_key_derivation_operation_init() + * to the structure, for example: + * \code + * psa_key_derivation_operation_t operation; + * operation = psa_key_derivation_operation_init(); + * \endcode + * + * This is an implementation-defined \c struct. Applications should not + * make any assumptions about the content of this structure except + * as directed by the documentation of a specific implementation. + */ +typedef struct psa_key_derivation_s psa_key_derivation_operation_t; + +/** \def PSA_KEY_DERIVATION_OPERATION_INIT + * + * This macro returns a suitable initializer for a key derivation operation + * object of type #psa_key_derivation_operation_t. + */ +#ifdef __DOXYGEN_ONLY__ +/* This is an example definition for documentation purposes. + * Implementations should define a suitable value in `crypto_struct.h`. + */ +#define PSA_KEY_DERIVATION_OPERATION_INIT {0} +#endif + +/** Return an initial value for a key derivation operation object. + */ +static psa_key_derivation_operation_t psa_key_derivation_operation_init(void); + +/** Set up a key derivation operation. + * + * A key derivation algorithm takes some inputs and uses them to generate + * a byte stream in a deterministic way. + * This byte stream can be used to produce keys and other + * cryptographic material. + * + * To derive a key: + * -# Start with an initialized object of type #psa_key_derivation_operation_t. + * -# Call psa_key_derivation_setup() to select the algorithm. + * -# Provide the inputs for the key derivation by calling + * psa_key_derivation_input_bytes() or psa_key_derivation_input_key() + * as appropriate. Which inputs are needed, in what order, and whether + * they may be keys and if so of what type depends on the algorithm. + * -# Optionally set the operation's maximum capacity with + * psa_key_derivation_set_capacity(). You may do this before, in the middle + * of or after providing inputs. For some algorithms, this step is mandatory + * because the output depends on the maximum capacity. + * -# To derive a key, call psa_key_derivation_output_key(). + * To derive a byte string for a different purpose, call + * psa_key_derivation_output_bytes(). + * Successive calls to these functions use successive output bytes + * calculated by the key derivation algorithm. + * -# Clean up the key derivation operation object with + * psa_key_derivation_abort(). + * + * If this function returns an error, the key derivation operation object is + * not changed. + * + * If an error occurs at any step after a call to psa_key_derivation_setup(), + * the operation will need to be reset by a call to psa_key_derivation_abort(). + * + * Implementations must reject an attempt to derive a key of size 0. + * + * \param[in,out] operation The key derivation operation object + * to set up. It must + * have been initialized but not set up yet. + * \param alg The key derivation algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_KEY_DERIVATION(\p alg) is true). + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c alg is not a key derivation algorithm. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \c alg is not supported or is not a key derivation algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be inactive). + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_setup( + psa_key_derivation_operation_t *operation, + psa_algorithm_t alg); + +/** Retrieve the current capacity of a key derivation operation. + * + * The capacity of a key derivation is the maximum number of bytes that it can + * return. When you get *N* bytes of output from a key derivation operation, + * this reduces its capacity by *N*. + * + * \param[in] operation The operation to query. + * \param[out] capacity On success, the capacity of the operation. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active). + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_get_capacity( + const psa_key_derivation_operation_t *operation, + size_t *capacity); + +/** Set the maximum capacity of a key derivation operation. + * + * The capacity of a key derivation operation is the maximum number of bytes + * that the key derivation operation can return from this point onwards. + * + * \param[in,out] operation The key derivation operation object to modify. + * \param capacity The new capacity of the operation. + * It must be less or equal to the operation's + * current capacity. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p capacity is larger than the operation's current capacity. + * In this case, the operation object remains valid and its capacity + * remains unchanged. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active). + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_set_capacity( + psa_key_derivation_operation_t *operation, + size_t capacity); + +/** Use the maximum possible capacity for a key derivation operation. + * + * Use this value as the capacity argument when setting up a key derivation + * to indicate that the operation should have the maximum possible capacity. + * The value of the maximum possible capacity depends on the key derivation + * algorithm. + */ +#define PSA_KEY_DERIVATION_UNLIMITED_CAPACITY ((size_t)(-1)) + +/** Provide an input for key derivation or key agreement. + * + * Which inputs are required and in what order depends on the algorithm. + * Refer to the documentation of each key derivation or key agreement + * algorithm for information. + * + * This function passes direct inputs, which is usually correct for + * non-secret inputs. To pass a secret input, which should be in a key + * object, call psa_key_derivation_input_key() instead of this function. + * Refer to the documentation of individual step types + * (`PSA_KEY_DERIVATION_INPUT_xxx` values of type ::psa_key_derivation_step_t) + * for more information. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * \param[in,out] operation The key derivation operation object to use. + * It must have been set up with + * psa_key_derivation_setup() and must not + * have produced any output yet. + * \param step Which step the input data is for. + * \param[in] data Input data to use. + * \param data_length Size of the \p data buffer in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c step is not compatible with the operation's algorithm. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c step does not allow direct inputs. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid for this input \p step. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_input_bytes( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + const uint8_t *data, + size_t data_length); + +/** Provide an input for key derivation in the form of a key. + * + * Which inputs are required and in what order depends on the algorithm. + * Refer to the documentation of each key derivation or key agreement + * algorithm for information. + * + * This function obtains input from a key object, which is usually correct for + * secret inputs or for non-secret personalization strings kept in the key + * store. To pass a non-secret parameter which is not in the key store, + * call psa_key_derivation_input_bytes() instead of this function. + * Refer to the documentation of individual step types + * (`PSA_KEY_DERIVATION_INPUT_xxx` values of type ::psa_key_derivation_step_t) + * for more information. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * \param[in,out] operation The key derivation operation object to use. + * It must have been set up with + * psa_key_derivation_setup() and must not + * have produced any output yet. + * \param step Which step the input data is for. + * \param handle Handle to the key. It must have an + * appropriate type for \p step and must + * allow the usage #PSA_KEY_USAGE_DERIVE. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c step is not compatible with the operation's algorithm. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c step does not allow key inputs of the given type + * or does not allow key inputs at all. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid for this input \p step. + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_input_key( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + psa_key_handle_t handle); + +/** Perform a key agreement and use the shared secret as input to a key + * derivation. + * + * A key agreement algorithm takes two inputs: a private key \p private_key + * a public key \p peer_key. + * The result of this function is passed as input to a key derivation. + * The output of this key derivation can be extracted by reading from the + * resulting operation to produce keys and other cryptographic material. + * + * If this function returns an error status, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * \param[in,out] operation The key derivation operation object to use. + * It must have been set up with + * psa_key_derivation_setup() with a + * key agreement and derivation algorithm + * \c alg (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_KEY_AGREEMENT(\c alg) is true + * and #PSA_ALG_IS_RAW_KEY_AGREEMENT(\c alg) + * is false). + * The operation must be ready for an + * input of the type given by \p step. + * \param step Which step the input data is for. + * \param private_key Handle to the private key to use. + * \param[in] peer_key Public key of the peer. The peer key must be in the + * same format that psa_import_key() accepts for the + * public key type corresponding to the type of + * private_key. That is, this function performs the + * equivalent of + * #psa_import_key(..., + * `peer_key`, `peer_key_length`) where + * with key attributes indicating the public key + * type corresponding to the type of `private_key`. + * For example, for EC keys, this means that peer_key + * is interpreted as a point on the curve that the + * private key is on. The standard formats for public + * keys are documented in the documentation of + * psa_export_public_key(). + * \param peer_key_length Size of \p peer_key in bytes. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid for this key agreement \p step. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c private_key is not compatible with \c alg, + * or \p peer_key is not valid for \c alg or not compatible with + * \c private_key. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \c alg is not supported or is not a key derivation algorithm. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \c step does not allow an input resulting from a key agreement. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_key_agreement( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + psa_key_handle_t private_key, + const uint8_t *peer_key, + size_t peer_key_length); + +/** Read some data from a key derivation operation. + * + * This function calculates output bytes from a key derivation algorithm and + * return those bytes. + * If you view the key derivation's output as a stream of bytes, this + * function destructively reads the requested number of bytes from the + * stream. + * The operation's capacity decreases by the number of bytes read. + * + * If this function returns an error status other than + * #PSA_ERROR_INSUFFICIENT_DATA, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * \param[in,out] operation The key derivation operation object to read from. + * \param[out] output Buffer where the output will be written. + * \param output_length Number of bytes to output. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_INSUFFICIENT_DATA + * The operation's capacity was less than + * \p output_length bytes. Note that in this case, + * no output is written to the output buffer. + * The operation's capacity is set to 0, thus + * subsequent calls to this function will not + * succeed, even with a smaller output buffer. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active and completed + * all required input steps). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_output_bytes( + psa_key_derivation_operation_t *operation, + uint8_t *output, + size_t output_length); + +/** Derive a key from an ongoing key derivation operation. + * + * This function calculates output bytes from a key derivation algorithm + * and uses those bytes to generate a key deterministically. + * The key's location, usage policy, type and size are taken from + * \p attributes. + * + * If you view the key derivation's output as a stream of bytes, this + * function destructively reads as many bytes as required from the + * stream. + * The operation's capacity decreases by the number of bytes read. + * + * If this function returns an error status other than + * #PSA_ERROR_INSUFFICIENT_DATA, the operation enters an error + * state and must be aborted by calling psa_key_derivation_abort(). + * + * How much output is produced and consumed from the operation, and how + * the key is derived, depends on the key type: + * + * - For key types for which the key is an arbitrary sequence of bytes + * of a given size, this function is functionally equivalent to + * calling #psa_key_derivation_output_bytes + * and passing the resulting output to #psa_import_key. + * However, this function has a security benefit: + * if the implementation provides an isolation boundary then + * the key material is not exposed outside the isolation boundary. + * As a consequence, for these key types, this function always consumes + * exactly (\p bits / 8) bytes from the operation. + * The following key types defined in this specification follow this scheme: + * + * - #PSA_KEY_TYPE_AES; + * - #PSA_KEY_TYPE_ARC4; + * - #PSA_KEY_TYPE_CAMELLIA; + * - #PSA_KEY_TYPE_DERIVE; + * - #PSA_KEY_TYPE_HMAC. + * + * - For ECC keys on a Montgomery elliptic curve + * (#PSA_KEY_TYPE_ECC_KEY_PAIR(\c curve) where \c curve designates a + * Montgomery curve), this function always draws a byte string whose + * length is determined by the curve, and sets the mandatory bits + * accordingly. That is: + * + * - #PSA_ECC_CURVE_CURVE25519: draw a 32-byte string + * and process it as specified in RFC 7748 §5. + * - #PSA_ECC_CURVE_CURVE448: draw a 56-byte string + * and process it as specified in RFC 7748 §5. + * + * - For key types for which the key is represented by a single sequence of + * \p bits bits with constraints as to which bit sequences are acceptable, + * this function draws a byte string of length (\p bits / 8) bytes rounded + * up to the nearest whole number of bytes. If the resulting byte string + * is acceptable, it becomes the key, otherwise the drawn bytes are discarded. + * This process is repeated until an acceptable byte string is drawn. + * The byte string drawn from the operation is interpreted as specified + * for the output produced by psa_export_key(). + * The following key types defined in this specification follow this scheme: + * + * - #PSA_KEY_TYPE_DES. + * Force-set the parity bits, but discard forbidden weak keys. + * For 2-key and 3-key triple-DES, the three keys are generated + * successively (for example, for 3-key triple-DES, + * if the first 8 bytes specify a weak key and the next 8 bytes do not, + * discard the first 8 bytes, use the next 8 bytes as the first key, + * and continue reading output from the operation to derive the other + * two keys). + * - Finite-field Diffie-Hellman keys (#PSA_KEY_TYPE_DH_KEY_PAIR(\c group) + * where \c group designates any Diffie-Hellman group) and + * ECC keys on a Weierstrass elliptic curve + * (#PSA_KEY_TYPE_ECC_KEY_PAIR(\c curve) where \c curve designates a + * Weierstrass curve). + * For these key types, interpret the byte string as integer + * in big-endian order. Discard it if it is not in the range + * [0, *N* - 2] where *N* is the boundary of the private key domain + * (the prime *p* for Diffie-Hellman, the subprime *q* for DSA, + * or the order of the curve's base point for ECC). + * Add 1 to the resulting integer and use this as the private key *x*. + * This method allows compliance to NIST standards, specifically + * the methods titled "key-pair generation by testing candidates" + * in NIST SP 800-56A §5.6.1.1.4 for Diffie-Hellman, + * in FIPS 186-4 §B.1.2 for DSA, and + * in NIST SP 800-56A §5.6.1.2.2 or + * FIPS 186-4 §B.4.2 for elliptic curve keys. + * + * - For other key types, including #PSA_KEY_TYPE_RSA_KEY_PAIR, + * the way in which the operation output is consumed is + * implementation-defined. + * + * In all cases, the data that is read is discarded from the operation. + * The operation's capacity is decreased by the number of bytes read. + * + * For algorithms that take an input step #PSA_KEY_DERIVATION_INPUT_SECRET, + * the input to that step must be provided with psa_key_derivation_input_key(). + * Future versions of this specification may include additional restrictions + * on the derived key based on the attributes and strength of the secret key. + * + * \param[in] attributes The attributes for the new key. + * \param[in,out] operation The key derivation operation object to read from. + * \param[out] handle On success, a handle to the newly created key. + * \c 0 on failure. + * + * \retval #PSA_SUCCESS + * Success. + * If the key is persistent, the key material and the key's metadata + * have been saved to persistent storage. + * \retval #PSA_ERROR_ALREADY_EXISTS + * This is an attempt to create a persistent key, and there is + * already a persistent key with the given identifier. + * \retval #PSA_ERROR_INSUFFICIENT_DATA + * There was not enough data to create the desired key. + * Note that in this case, no output is written to the output buffer. + * The operation's capacity is set to 0, thus subsequent calls to + * this function will not succeed, even with a smaller output buffer. + * \retval #PSA_ERROR_NOT_SUPPORTED + * The key type or key size is not supported, either by the + * implementation in general or in this particular location. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The provided key attributes are not valid for the operation. + * \retval #PSA_ERROR_NOT_PERMITTED + * The #PSA_KEY_DERIVATION_INPUT_SECRET input was not provided through + * a key. + * \retval #PSA_ERROR_BAD_STATE + * The operation state is not valid (it must be active and completed + * all required input steps). + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_output_key( + const psa_key_attributes_t *attributes, + psa_key_derivation_operation_t *operation, + psa_key_handle_t *handle); + +/** Abort a key derivation operation. + * + * Aborting an operation frees all associated resources except for the \c + * operation structure itself. Once aborted, the operation object can be reused + * for another operation by calling psa_key_derivation_setup() again. + * + * This function may be called at any time after the operation + * object has been initialized as described in #psa_key_derivation_operation_t. + * + * In particular, it is valid to call psa_key_derivation_abort() twice, or to + * call psa_key_derivation_abort() on an operation that has not been set up. + * + * \param[in,out] operation The operation to abort. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_key_derivation_abort( + psa_key_derivation_operation_t *operation); + +/** Perform a key agreement and return the raw shared secret. + * + * \warning The raw result of a key agreement algorithm such as finite-field + * Diffie-Hellman or elliptic curve Diffie-Hellman has biases and should + * not be used directly as key material. It should instead be passed as + * input to a key derivation algorithm. To chain a key agreement with + * a key derivation, use psa_key_derivation_key_agreement() and other + * functions from the key derivation interface. + * + * \param alg The key agreement algorithm to compute + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_RAW_KEY_AGREEMENT(\p alg) + * is true). + * \param private_key Handle to the private key to use. + * \param[in] peer_key Public key of the peer. It must be + * in the same format that psa_import_key() + * accepts. The standard formats for public + * keys are documented in the documentation + * of psa_export_public_key(). + * \param peer_key_length Size of \p peer_key in bytes. + * \param[out] output Buffer where the decrypted message is to + * be written. + * \param output_size Size of the \c output buffer in bytes. + * \param[out] output_length On success, the number of bytes + * that make up the returned output. + * + * \retval #PSA_SUCCESS + * Success. + * \retval #PSA_ERROR_INVALID_HANDLE + * \retval #PSA_ERROR_NOT_PERMITTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p alg is not a key agreement algorithm + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p private_key is not compatible with \p alg, + * or \p peer_key is not valid for \p alg or not compatible with + * \p private_key. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p output_size is too small + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not a supported key agreement algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_raw_key_agreement(psa_algorithm_t alg, + psa_key_handle_t private_key, + const uint8_t *peer_key, + size_t peer_key_length, + uint8_t *output, + size_t output_size, + size_t *output_length); + +/**@}*/ + +/** \defgroup random Random generation + * @{ + */ + +/** + * \brief Generate random bytes. + * + * \warning This function **can** fail! Callers MUST check the return status + * and MUST NOT use the content of the output buffer if the return + * status is not #PSA_SUCCESS. + * + * \note To generate a key, use psa_generate_key() instead. + * + * \param[out] output Output buffer for the generated data. + * \param output_size Number of bytes to generate and output. + * + * \retval #PSA_SUCCESS + * \retval #PSA_ERROR_NOT_SUPPORTED + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_generate_random(uint8_t *output, + size_t output_size); + +/** + * \brief Generate a key or key pair. + * + * The key is generated randomly. + * Its location, usage policy, type and size are taken from \p attributes. + * + * Implementations must reject an attempt to generate a key of size 0. + * + * The following type-specific considerations apply: + * - For RSA keys (#PSA_KEY_TYPE_RSA_KEY_PAIR), + * the public exponent is 65537. + * The modulus is a product of two probabilistic primes + * between 2^{n-1} and 2^n where n is the bit size specified in the + * attributes. + * + * \param[in] attributes The attributes for the new key. + * \param[out] handle On success, a handle to the newly created key. + * \c 0 on failure. + * + * \retval #PSA_SUCCESS + * Success. + * If the key is persistent, the key material and the key's metadata + * have been saved to persistent storage. + * \retval #PSA_ERROR_ALREADY_EXISTS + * This is an attempt to create a persistent key, and there is + * already a persistent key with the given identifier. + * \retval #PSA_ERROR_NOT_SUPPORTED + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY + * \retval #PSA_ERROR_COMMUNICATION_FAILURE + * \retval #PSA_ERROR_HARDWARE_FAILURE + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * \retval #PSA_ERROR_INSUFFICIENT_STORAGE + * \retval #PSA_ERROR_STORAGE_FAILURE + * \retval #PSA_ERROR_BAD_STATE + * The library has not been previously initialized by psa_crypto_init(). + * It is implementation-dependent whether a failure to initialize + * results in this error code. + */ +psa_status_t psa_generate_key(const psa_key_attributes_t *attributes, + psa_key_handle_t *handle); + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +/* The file "crypto_sizes.h" contains definitions for size calculation + * macros whose definitions are implementation-specific. */ +#include "psa/crypto_sizes.h" + +/* The file "crypto_struct.h" contains definitions for + * implementation-specific structs that are declared above. */ +#include "psa/crypto_struct.h" + +/* The file "crypto_extra.h" contains vendor-specific definitions. This + * can include vendor-defined algorithms, extra functions, etc. */ +#include "psa/crypto_extra.h" + +#endif /* PSA_CRYPTO_H */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_compat.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_compat.h new file mode 100644 index 00000000000..518008b8a72 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_compat.h @@ -0,0 +1,111 @@ +/** + * \file psa/crypto_compat.h + * + * \brief PSA cryptography module: Backward compatibility aliases + * + * This header declares alternative names for macro and functions. + * New application code should not use these names. + * These names may be removed in a future version of Mbed Crypto. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + */ +/* + * Copyright (C) 2019-2020, 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 PSA_CRYPTO_COMPAT_H +#define PSA_CRYPTO_COMPAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(MBEDTLS_DEPRECATED_REMOVED) + +/* + * Mechanism for declaring deprecated values + */ +#if defined(MBEDTLS_DEPRECATED_WARNING) && !defined(MBEDTLS_PSA_DEPRECATED) +#define MBEDTLS_PSA_DEPRECATED __attribute__((deprecated)) +#else +#define MBEDTLS_PSA_DEPRECATED +#endif + +typedef MBEDTLS_PSA_DEPRECATED size_t mbedtls_deprecated_size_t; +typedef MBEDTLS_PSA_DEPRECATED psa_status_t mbedtls_deprecated_psa_status_t; +typedef MBEDTLS_PSA_DEPRECATED psa_key_usage_t mbedtls_deprecated_psa_key_usage_t; + +#define MBEDTLS_DEPRECATED_CONSTANT( type, value ) \ + ( (mbedtls_deprecated_##type) ( value ) ) + +/* + * Deprecated PSA Crypto error code definitions (PSA Crypto API <= 1.0 beta2) + */ +#define PSA_ERROR_UNKNOWN_ERROR \ + MBEDTLS_DEPRECATED_CONSTANT( psa_status_t, PSA_ERROR_GENERIC_ERROR ) +#define PSA_ERROR_OCCUPIED_SLOT \ + MBEDTLS_DEPRECATED_CONSTANT( psa_status_t, PSA_ERROR_ALREADY_EXISTS ) +#define PSA_ERROR_EMPTY_SLOT \ + MBEDTLS_DEPRECATED_CONSTANT( psa_status_t, PSA_ERROR_DOES_NOT_EXIST ) +#define PSA_ERROR_INSUFFICIENT_CAPACITY \ + MBEDTLS_DEPRECATED_CONSTANT( psa_status_t, PSA_ERROR_INSUFFICIENT_DATA ) +#define PSA_ERROR_TAMPERING_DETECTED \ + MBEDTLS_DEPRECATED_CONSTANT( psa_status_t, PSA_ERROR_CORRUPTION_DETECTED ) + +/* + * Deprecated PSA Crypto numerical encodings (PSA Crypto API <= 1.0 beta3) + */ +#define PSA_KEY_USAGE_SIGN \ + MBEDTLS_DEPRECATED_CONSTANT( psa_key_usage_t, PSA_KEY_USAGE_SIGN_HASH ) +#define PSA_KEY_USAGE_VERIFY \ + MBEDTLS_DEPRECATED_CONSTANT( psa_key_usage_t, PSA_KEY_USAGE_VERIFY_HASH ) + +/* + * Deprecated PSA Crypto size calculation macros (PSA Crypto API <= 1.0 beta3) + */ +#define PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE \ + MBEDTLS_DEPRECATED_CONSTANT( size_t, PSA_SIGNATURE_MAX_SIZE ) +#define PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type, key_bits, alg ) \ + MBEDTLS_DEPRECATED_CONSTANT( size_t, PSA_SIGN_OUTPUT_SIZE( key_type, key_bits, alg ) ) + +/* + * Deprecated PSA Crypto function names (PSA Crypto API <= 1.0 beta3) + */ +MBEDTLS_PSA_DEPRECATED psa_status_t psa_asymmetric_sign( psa_key_handle_t key, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length ); + +MBEDTLS_PSA_DEPRECATED psa_status_t psa_asymmetric_verify( psa_key_handle_t key, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + const uint8_t *signature, + size_t signature_length ); + +#endif /* MBEDTLS_DEPRECATED_REMOVED */ + +#ifdef __cplusplus +} +#endif + +#endif /* PSA_CRYPTO_COMPAT_H */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_extra.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_extra.h new file mode 100644 index 00000000000..33c9c0537a8 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_extra.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +/** + * \file psa/crypto_extra.h + * + * \brief PSA cryptography module: vendor extensions + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * This file is reserved for vendor-specific definitions. + */ + +#ifndef PSA_CRYPTO_EXTRA_H +#define PSA_CRYPTO_EXTRA_H + +#include "psa/crypto_compat.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief Declare the enrollment algorithm for a key. + * + * An operation on a key may indifferently use the algorithm set with + * psa_set_key_algorithm() or with this function. + * + * \param[out] attributes The attribute structure to write to. + * \param alg2 A second algorithm that the key may be used + * for, in addition to the algorithm set with + * psa_set_key_algorithm(). + * + * \warning Setting an enrollment algorithm is not recommended, because + * using the same key with different algorithms can allow some + * attacks based on arithmetic relations between different + * computations made with the same key, or can escalate harmless + * side channels into exploitable ones. Use this function only + * if it is necessary to support a protocol for which it has been + * verified that the usage of the key with multiple algorithms + * is safe. + */ +static inline void psa_set_key_enrollment_algorithm( + psa_key_attributes_t *attributes, + psa_algorithm_t alg2) +{ + attributes->core.policy.alg2 = alg2; +} + +#ifdef __cplusplus +} +#endif + +#endif /* PSA_CRYPTO_EXTRA_H */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_platform.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_platform.h new file mode 100644 index 00000000000..c3120e485b4 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_platform.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +/** + * \file psa/crypto_platform.h + * + * \brief PSA cryptography module: Mbed TLS platform definitions + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * This file contains platform-dependent type definitions. + * + * In implementations with isolation between the application and the + * cryptography module, implementers should take care to ensure that + * the definitions that are exposed to applications match what the + * module implements. + */ + +#ifndef PSA_CRYPTO_PLATFORM_H +#define PSA_CRYPTO_PLATFORM_H + +/* PSA requires several types which C99 provides in stdint.h. */ +#include + +/* Integral type representing a key handle. */ +typedef uint16_t psa_key_handle_t; + +/* This implementation distinguishes *application key identifiers*, which + * are the key identifiers specified by the application, from + * *key file identifiers*, which are the key identifiers that the library + * sees internally. The two types can be different if there is a remote + * call layer between the application and the library which supports + * multiple client applications that do not have access to each others' + * keys. The point of having different types is that the key file + * identifier may encode not only the key identifier specified by the + * application, but also the the identity of the application. + * + * Note that this is an internal concept of the library and the remote + * call layer. The application itself never sees anything other than + * #psa_app_key_id_t with its standard definition. + */ + +/* The application key identifier is always what the application sees as + * #psa_key_id_t. */ +typedef uint32_t psa_app_key_id_t; + +#endif /* PSA_CRYPTO_PLATFORM_H */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_sizes.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_sizes.h new file mode 100644 index 00000000000..4f67501b563 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_sizes.h @@ -0,0 +1,650 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +/** + * \file psa/crypto_sizes.h + * + * \brief PSA cryptography module: Mbed TLS buffer size macros + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. + * + * This file contains the definitions of macros that are useful to + * compute buffer sizes. The signatures and semantics of these macros + * are standardized, but the definitions are not, because they depend on + * the available algorithms and, in some cases, on permitted tolerances + * on buffer sizes. + * + * In implementations with isolation between the application and the + * cryptography module, implementers should take care to ensure that + * the definitions that are exposed to applications match what the + * module implements. + * + * Macros that compute sizes whose values do not depend on the + * implementation are in crypto.h. + */ + +#ifndef PSA_CRYPTO_SIZES_H +#define PSA_CRYPTO_SIZES_H + +#define PSA_BITS_TO_BYTES(bits) (((bits) + 7) / 8) +#define PSA_BYTES_TO_BITS(bytes) ((bytes) * 8) + +#define PSA_ROUND_UP_TO_MULTIPLE(block_size, length) \ + (((length) + (block_size) - 1) / (block_size) * (block_size)) + +/** The size of the output of psa_hash_finish(), in bytes. + * + * This is also the hash size that psa_hash_verify() expects. + * + * \param alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p alg) is true), or an HMAC algorithm + * (#PSA_ALG_HMAC(\c hash_alg) where \c hash_alg is a + * hash algorithm). + * + * \return The hash size for the specified hash algorithm. + * If the hash algorithm is not recognized, return 0. + * An implementation may return either 0 or the correct size + * for a hash algorithm that it recognizes, but does not support. + */ +#define PSA_HASH_SIZE(alg) \ + ( \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD2 ? 16 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD4 ? 16 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_MD5 ? 16 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_RIPEMD160 ? 20 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_1 ? 20 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_224 ? 28 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_256 ? 32 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_384 ? 48 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512 ? 64 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_224 ? 28 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA_512_256 ? 32 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_224 ? 28 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_256 ? 32 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_384 ? 48 : \ + PSA_ALG_HMAC_GET_HASH(alg) == PSA_ALG_SHA3_512 ? 64 : \ + 0) + +/** \def PSA_HASH_MAX_SIZE + * + * Maximum size of a hash. + * + * This macro must expand to a compile-time constant integer. This value + * should be the maximum size of a hash supported by the implementation, + * in bytes, and must be no smaller than this maximum. + */ +/* Note: for HMAC-SHA-3, the block size is 144 bytes for HMAC-SHA3-226, + * 136 bytes for HMAC-SHA3-256, 104 bytes for SHA3-384, 72 bytes for + * HMAC-SHA3-512. */ +#define PSA_HASH_MAX_SIZE 64 +#define PSA_HMAC_MAX_HASH_BLOCK_SIZE 128 + +/** \def PSA_MAC_MAX_SIZE + * + * Maximum size of a MAC. + * + * This macro must expand to a compile-time constant integer. This value + * should be the maximum size of a MAC supported by the implementation, + * in bytes, and must be no smaller than this maximum. + */ +/* All non-HMAC MACs have a maximum size that's smaller than the + * minimum possible value of PSA_HASH_MAX_SIZE in this implementation. */ +/* Note that the encoding of truncated MAC algorithms limits this value + * to 64 bytes. + */ +#define PSA_MAC_MAX_SIZE PSA_HASH_MAX_SIZE + +/** The tag size for an AEAD algorithm, in bytes. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return The tag size for the specified algorithm. + * If the AEAD algorithm does not have an identified + * tag that can be distinguished from the rest of + * the ciphertext, return 0. + * If the AEAD algorithm is not recognized, return 0. + * An implementation may return either 0 or a + * correct size for an AEAD algorithm that it + * recognizes, but does not support. + */ +#define PSA_AEAD_TAG_LENGTH(alg) \ + (PSA_ALG_IS_AEAD(alg) ? \ + (((alg) & PSA_ALG_AEAD_TAG_LENGTH_MASK) >> PSA_AEAD_TAG_LENGTH_OFFSET) : \ + 0) + +/* The maximum size of an RSA key on this implementation, in bits. + * This is a vendor-specific macro. + * + * Mbed TLS does not set a hard limit on the size of RSA keys: any key + * whose parameters fit in a bignum is accepted. However large keys can + * induce a large memory usage and long computation times. Unlike other + * auxiliary macros in this file and in crypto.h, which reflect how the + * library is configured, this macro defines how the library is + * configured. This implementation refuses to import or generate an + * RSA key whose size is larger than the value defined here. + * + * Note that an implementation may set different size limits for different + * operations, and does not need to accept all key sizes up to the limit. */ +#define PSA_VENDOR_RSA_MAX_KEY_BITS 4096 + +/* The maximum size of an ECC key on this implementation, in bits. + * This is a vendor-specific macro. */ +#define PSA_VENDOR_ECC_MAX_CURVE_BITS 521 + +/** Bit size associated with an elliptic curve. + * + * \param curve An elliptic curve (value of type #psa_ecc_curve_t). + * + * \return The size associated with \p curve, in bits. + * This may be 0 if the implementation does not support + * the specified curve. + */ +#define PSA_ECC_CURVE_BITS(curve) \ + ((curve) == PSA_ECC_CURVE_SECT163K1 ? 163 : \ + (curve) == PSA_ECC_CURVE_SECT163R1 ? 163 : \ + (curve) == PSA_ECC_CURVE_SECT163R2 ? 163 : \ + (curve) == PSA_ECC_CURVE_SECT193R1 ? 193 : \ + (curve) == PSA_ECC_CURVE_SECT193R2 ? 193 : \ + (curve) == PSA_ECC_CURVE_SECT233K1 ? 233 : \ + (curve) == PSA_ECC_CURVE_SECT233R1 ? 233 : \ + (curve) == PSA_ECC_CURVE_SECT239K1 ? 239 : \ + (curve) == PSA_ECC_CURVE_SECT283K1 ? 283 : \ + (curve) == PSA_ECC_CURVE_SECT283R1 ? 283 : \ + (curve) == PSA_ECC_CURVE_SECT409K1 ? 409 : \ + (curve) == PSA_ECC_CURVE_SECT409R1 ? 409 : \ + (curve) == PSA_ECC_CURVE_SECT571K1 ? 571 : \ + (curve) == PSA_ECC_CURVE_SECT571R1 ? 571 : \ + (curve) == PSA_ECC_CURVE_SECP160K1 ? 160 : \ + (curve) == PSA_ECC_CURVE_SECP160R1 ? 160 : \ + (curve) == PSA_ECC_CURVE_SECP160R2 ? 160 : \ + (curve) == PSA_ECC_CURVE_SECP192K1 ? 192 : \ + (curve) == PSA_ECC_CURVE_SECP192R1 ? 192 : \ + (curve) == PSA_ECC_CURVE_SECP224K1 ? 224 : \ + (curve) == PSA_ECC_CURVE_SECP224R1 ? 224 : \ + (curve) == PSA_ECC_CURVE_SECP256K1 ? 256 : \ + (curve) == PSA_ECC_CURVE_SECP256R1 ? 256 : \ + (curve) == PSA_ECC_CURVE_SECP384R1 ? 384 : \ + (curve) == PSA_ECC_CURVE_SECP521R1 ? 521 : \ + (curve) == PSA_ECC_CURVE_BRAINPOOL_P256R1 ? 256 : \ + (curve) == PSA_ECC_CURVE_BRAINPOOL_P384R1 ? 384 : \ + (curve) == PSA_ECC_CURVE_BRAINPOOL_P512R1 ? 512 : \ + (curve) == PSA_ECC_CURVE_CURVE25519 ? 255 : \ + (curve) == PSA_ECC_CURVE_CURVE448 ? 448 : \ + 0) + +/** \def PSA_ALG_TLS12_PSK_TO_MS_MAX_PSK_LEN + * + * This macro returns the maximum length of the PSK supported + * by the TLS-1.2 PSK-to-MS key derivation. + * + * Quoting RFC 4279, Sect 5.3: + * TLS implementations supporting these ciphersuites MUST support + * arbitrary PSK identities up to 128 octets in length, and arbitrary + * PSKs up to 64 octets in length. Supporting longer identities and + * keys is RECOMMENDED. + * + * Therefore, no implementation should define a value smaller than 64 + * for #PSA_ALG_TLS12_PSK_TO_MS_MAX_PSK_LEN. + */ +#define PSA_ALG_TLS12_PSK_TO_MS_MAX_PSK_LEN 128 + +/** The maximum size of a block cipher supported by the implementation. */ +#define PSA_MAX_BLOCK_CIPHER_BLOCK_SIZE 16 + +/** The size of the output of psa_mac_sign_finish(), in bytes. + * + * This is also the MAC size that psa_mac_verify_finish() expects. + * + * \param key_type The type of the MAC key. + * \param key_bits The size of the MAC key in bits. + * \param alg A MAC algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_MAC(\p alg) is true). + * + * \return The MAC size for the specified algorithm with + * the specified key parameters. + * \return 0 if the MAC algorithm is not recognized. + * \return Either 0 or the correct size for a MAC algorithm that + * the implementation recognizes, but does not support. + * \return Unspecified if the key parameters are not consistent + * with the algorithm. + */ +#define PSA_MAC_FINAL_SIZE(key_type, key_bits, alg) \ + ((alg) & PSA_ALG_MAC_TRUNCATION_MASK ? PSA_MAC_TRUNCATED_LENGTH(alg) : \ + PSA_ALG_IS_HMAC(alg) ? PSA_HASH_SIZE(PSA_ALG_HMAC_GET_HASH(alg)) : \ + PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) ? PSA_BLOCK_CIPHER_BLOCK_SIZE(key_type) : \ + ((void)(key_type), (void)(key_bits), 0)) + +/** The maximum size of the output of psa_aead_encrypt(), in bytes. + * + * If the size of the ciphertext buffer is at least this large, it is + * guaranteed that psa_aead_encrypt() will not fail due to an + * insufficient buffer size. Depending on the algorithm, the actual size of + * the ciphertext may be smaller. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param plaintext_length Size of the plaintext in bytes. + * + * \return The AEAD ciphertext size for the specified + * algorithm. + * If the AEAD algorithm is not recognized, return 0. + * An implementation may return either 0 or a + * correct size for an AEAD algorithm that it + * recognizes, but does not support. + */ +#define PSA_AEAD_ENCRYPT_OUTPUT_SIZE(alg, plaintext_length) \ + (PSA_AEAD_TAG_LENGTH(alg) != 0 ? \ + (plaintext_length) + PSA_AEAD_TAG_LENGTH(alg) : \ + 0) + +/** The maximum size of the output of psa_aead_decrypt(), in bytes. + * + * If the size of the plaintext buffer is at least this large, it is + * guaranteed that psa_aead_decrypt() will not fail due to an + * insufficient buffer size. Depending on the algorithm, the actual size of + * the plaintext may be smaller. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param ciphertext_length Size of the plaintext in bytes. + * + * \return The AEAD ciphertext size for the specified + * algorithm. + * If the AEAD algorithm is not recognized, return 0. + * An implementation may return either 0 or a + * correct size for an AEAD algorithm that it + * recognizes, but does not support. + */ +#define PSA_AEAD_DECRYPT_OUTPUT_SIZE(alg, ciphertext_length) \ + (PSA_AEAD_TAG_LENGTH(alg) != 0 ? \ + (ciphertext_length) - PSA_AEAD_TAG_LENGTH(alg) : \ + 0) + +/** A sufficient output buffer size for psa_aead_update(). + * + * If the size of the output buffer is at least this large, it is + * guaranteed that psa_aead_update() will not fail due to an + * insufficient buffer size. The actual size of the output may be smaller + * in any given call. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * \param input_length Size of the input in bytes. + * + * \return A sufficient output buffer size for the specified + * algorithm. + * If the AEAD algorithm is not recognized, return 0. + * An implementation may return either 0 or a + * correct size for an AEAD algorithm that it + * recognizes, but does not support. + */ +/* For all the AEAD modes defined in this specification, it is possible + * to emit output without delay. However, hardware may not always be + * capable of this. So for modes based on a block cipher, allow the + * implementation to delay the output until it has a full block. */ +#define PSA_AEAD_UPDATE_OUTPUT_SIZE(alg, input_length) \ + (PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \ + PSA_ROUND_UP_TO_MULTIPLE(PSA_MAX_BLOCK_CIPHER_BLOCK_SIZE, (input_length)) : \ + (input_length)) + +/** A sufficient ciphertext buffer size for psa_aead_finish(). + * + * If the size of the ciphertext buffer is at least this large, it is + * guaranteed that psa_aead_finish() will not fail due to an + * insufficient ciphertext buffer size. The actual size of the output may + * be smaller in any given call. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return A sufficient ciphertext buffer size for the + * specified algorithm. + * If the AEAD algorithm is not recognized, return 0. + * An implementation may return either 0 or a + * correct size for an AEAD algorithm that it + * recognizes, but does not support. + */ +#define PSA_AEAD_FINISH_OUTPUT_SIZE(alg) \ + (PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \ + PSA_MAX_BLOCK_CIPHER_BLOCK_SIZE : \ + 0) + +/** A sufficient plaintext buffer size for psa_aead_verify(). + * + * If the size of the plaintext buffer is at least this large, it is + * guaranteed that psa_aead_verify() will not fail due to an + * insufficient plaintext buffer size. The actual size of the output may + * be smaller in any given call. + * + * \param alg An AEAD algorithm + * (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return A sufficient plaintext buffer size for the + * specified algorithm. + * If the AEAD algorithm is not recognized, return 0. + * An implementation may return either 0 or a + * correct size for an AEAD algorithm that it + * recognizes, but does not support. + */ +#define PSA_AEAD_VERIFY_OUTPUT_SIZE(alg) \ + (PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) ? \ + PSA_MAX_BLOCK_CIPHER_BLOCK_SIZE : \ + 0) + +#define PSA_RSA_MINIMUM_PADDING_SIZE(alg) \ + (PSA_ALG_IS_RSA_OAEP(alg) ? \ + 2 * PSA_HASH_SIZE(PSA_ALG_RSA_OAEP_GET_HASH(alg)) + 1 : \ + 11 /*PKCS#1v1.5*/) + +/** + * \brief ECDSA signature size for a given curve bit size + * + * \param curve_bits Curve size in bits. + * \return Signature size in bytes. + * + * \note This macro returns a compile-time constant if its argument is one. + */ +#define PSA_ECDSA_SIGNATURE_SIZE(curve_bits) \ + (PSA_BITS_TO_BYTES(curve_bits) * 2) + +/** Sufficient signature buffer size for psa_sign_hash(). + * + * This macro returns a sufficient buffer size for a signature using a key + * of the specified type and size, with the specified algorithm. + * Note that the actual size of the signature may be smaller + * (some algorithms produce a variable-size signature). + * + * \warning This function may call its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type An asymmetric key type (this may indifferently be a + * key pair type or a public key type). + * \param key_bits The size of the key in bits. + * \param alg The signature algorithm. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_sign_hash() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not supported + * by the implementation, this macro shall return either a + * sensible size or 0. + * If the parameters are not valid, the + * return value is unspecified. + */ +#define PSA_SIGN_OUTPUT_SIZE(key_type, key_bits, alg) \ + (PSA_KEY_TYPE_IS_RSA(key_type) ? ((void)alg, PSA_BITS_TO_BYTES(key_bits)) : \ + PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_ECDSA_SIGNATURE_SIZE(key_bits) : \ + ((void)alg, 0)) + +#define PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE \ + PSA_ECDSA_SIGNATURE_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS) + +/** \def PSA_SIGNATURE_MAX_SIZE + * + * Maximum size of an asymmetric signature. + * + * This macro must expand to a compile-time constant integer. This value + * should be the maximum size of a signature supported by the implementation, + * in bytes, and must be no smaller than this maximum. + */ +#define PSA_SIGNATURE_MAX_SIZE \ + (PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS) > PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE ? \ + PSA_BITS_TO_BYTES(PSA_VENDOR_RSA_MAX_KEY_BITS) : \ + PSA_VENDOR_ECDSA_SIGNATURE_MAX_SIZE) + +/** Sufficient output buffer size for psa_asymmetric_encrypt(). + * + * This macro returns a sufficient buffer size for a ciphertext produced using + * a key of the specified type and size, with the specified algorithm. + * Note that the actual size of the ciphertext may be smaller, depending + * on the algorithm. + * + * \warning This function may call its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type An asymmetric key type (this may indifferently be a + * key pair type or a public key type). + * \param key_bits The size of the key in bits. + * \param alg The signature algorithm. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_asymmetric_encrypt() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not supported + * by the implementation, this macro shall return either a + * sensible size or 0. + * If the parameters are not valid, the + * return value is unspecified. + */ +#define PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \ + (PSA_KEY_TYPE_IS_RSA(key_type) ? \ + ((void)alg, PSA_BITS_TO_BYTES(key_bits)) : \ + 0) + +/** Sufficient output buffer size for psa_asymmetric_decrypt(). + * + * This macro returns a sufficient buffer size for a ciphertext produced using + * a key of the specified type and size, with the specified algorithm. + * Note that the actual size of the ciphertext may be smaller, depending + * on the algorithm. + * + * \warning This function may call its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * \param key_type An asymmetric key type (this may indifferently be a + * key pair type or a public key type). + * \param key_bits The size of the key in bits. + * \param alg The signature algorithm. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_asymmetric_decrypt() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not supported + * by the implementation, this macro shall return either a + * sensible size or 0. + * If the parameters are not valid, the + * return value is unspecified. + */ +#define PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(key_type, key_bits, alg) \ + (PSA_KEY_TYPE_IS_RSA(key_type) ? \ + PSA_BITS_TO_BYTES(key_bits) - PSA_RSA_MINIMUM_PADDING_SIZE(alg) : \ + 0) + +/* Maximum size of the ASN.1 encoding of an INTEGER with the specified + * number of bits. + * + * This definition assumes that bits <= 2^19 - 9 so that the length field + * is at most 3 bytes. The length of the encoding is the length of the + * bit string padded to a whole number of bytes plus: + * - 1 type byte; + * - 1 to 3 length bytes; + * - 0 to 1 bytes of leading 0 due to the sign bit. + */ +#define PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(bits) \ + ((bits) / 8 + 5) + +/* Maximum size of the export encoding of an RSA public key. + * Assumes that the public exponent is less than 2^32. + * + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER } -- e + * + * - 4 bytes of SEQUENCE overhead; + * - n : INTEGER; + * - 7 bytes for the public exponent. + */ +#define PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(key_bits) \ + (PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(key_bits) + 11) + +/* Maximum size of the export encoding of an RSA key pair. + * Assumes thatthe public exponent is less than 2^32 and that the size + * difference between the two primes is at most 1 bit. + * + * RSAPrivateKey ::= SEQUENCE { + * version Version, -- 0 + * modulus INTEGER, -- N-bit + * publicExponent INTEGER, -- 32-bit + * privateExponent INTEGER, -- N-bit + * prime1 INTEGER, -- N/2-bit + * prime2 INTEGER, -- N/2-bit + * exponent1 INTEGER, -- N/2-bit + * exponent2 INTEGER, -- N/2-bit + * coefficient INTEGER, -- N/2-bit + * } + * + * - 4 bytes of SEQUENCE overhead; + * - 3 bytes of version; + * - 7 half-size INTEGERs plus 2 full-size INTEGERs, + * overapproximated as 9 half-size INTEGERS; + * - 7 bytes for the public exponent. + */ +#define PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(key_bits) \ + (9 * PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE((key_bits) / 2 + 1) + 14) + +/* Maximum size of the export encoding of a DSA public key. + * + * SubjectPublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * subjectPublicKey BIT STRING } -- contains DSAPublicKey + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters Dss-Parms } -- SEQUENCE of 3 INTEGERs + * DSAPublicKey ::= INTEGER -- public key, Y + * + * - 3 * 4 bytes of SEQUENCE overhead; + * - 1 + 1 + 7 bytes of algorithm (DSA OID); + * - 4 bytes of BIT STRING overhead; + * - 3 full-size INTEGERs (p, g, y); + * - 1 + 1 + 32 bytes for 1 sub-size INTEGER (q <= 256 bits). + */ +#define PSA_KEY_EXPORT_DSA_PUBLIC_KEY_MAX_SIZE(key_bits) \ + (PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(key_bits) * 3 + 59) + +/* Maximum size of the export encoding of a DSA key pair. + * + * DSAPrivateKey ::= SEQUENCE { + * version Version, -- 0 + * prime INTEGER, -- p + * subprime INTEGER, -- q + * generator INTEGER, -- g + * public INTEGER, -- y + * private INTEGER, -- x + * } + * + * - 4 bytes of SEQUENCE overhead; + * - 3 bytes of version; + * - 3 full-size INTEGERs (p, g, y); + * - 2 * (1 + 1 + 32) bytes for 2 sub-size INTEGERs (q, x <= 256 bits). + */ +#define PSA_KEY_EXPORT_DSA_KEY_PAIR_MAX_SIZE(key_bits) \ + (PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(key_bits) * 3 + 75) + +/* Maximum size of the export encoding of an ECC public key. + * + * The representation of an ECC public key is: + * - The byte 0x04; + * - `x_P` as a `ceiling(m/8)`-byte string, big-endian; + * - `y_P` as a `ceiling(m/8)`-byte string, big-endian; + * - where m is the bit size associated with the curve. + * + * - 1 byte + 2 * point size. + */ +#define PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_bits) \ + (2 * PSA_BITS_TO_BYTES(key_bits) + 1) + +/* Maximum size of the export encoding of an ECC key pair. + * + * An ECC key pair is represented by the secret value. + */ +#define PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(key_bits) \ + (PSA_BITS_TO_BYTES(key_bits)) + +/** Sufficient output buffer size for psa_export_key() or psa_export_public_key(). + * + * This macro returns a compile-time constant if its arguments are + * compile-time constants. + * + * \warning This function may call its arguments multiple times or + * zero times, so you should not pass arguments that contain + * side effects. + * + * The following code illustrates how to allocate enough memory to export + * a key by querying the key type and size at runtime. + * \code{c} + * psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + * psa_status_t status; + * status = psa_get_key_attributes(key, &attributes); + * if (status != PSA_SUCCESS) handle_error(...); + * psa_key_type_t key_type = psa_get_key_type(&attributes); + * size_t key_bits = psa_get_key_bits(&attributes); + * size_t buffer_size = PSA_KEY_EXPORT_MAX_SIZE(key_type, key_bits); + * psa_reset_key_attributes(&attributes); + * uint8_t *buffer = malloc(buffer_size); + * if (buffer == NULL) handle_error(...); + * size_t buffer_length; + * status = psa_export_key(key, buffer, buffer_size, &buffer_length); + * if (status != PSA_SUCCESS) handle_error(...); + * \endcode + * + * For psa_export_public_key(), calculate the buffer size from the + * public key type. You can use the macro #PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR + * to convert a key pair type to the corresponding public key type. + * \code{c} + * psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + * psa_status_t status; + * status = psa_get_key_attributes(key, &attributes); + * if (status != PSA_SUCCESS) handle_error(...); + * psa_key_type_t key_type = psa_get_key_type(&attributes); + * psa_key_type_t public_key_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(key_type); + * size_t key_bits = psa_get_key_bits(&attributes); + * size_t buffer_size = PSA_KEY_EXPORT_MAX_SIZE(public_key_type, key_bits); + * psa_reset_key_attributes(&attributes); + * uint8_t *buffer = malloc(buffer_size); + * if (buffer == NULL) handle_error(...); + * size_t buffer_length; + * status = psa_export_public_key(key, buffer, buffer_size, &buffer_length); + * if (status != PSA_SUCCESS) handle_error(...); + * \endcode + * + * \param key_type A supported key type. + * \param key_bits The size of the key in bits. + * + * \return If the parameters are valid and supported, return + * a buffer size in bytes that guarantees that + * psa_sign_hash() will not fail with + * #PSA_ERROR_BUFFER_TOO_SMALL. + * If the parameters are a valid combination that is not supported + * by the implementation, this macro shall return either a + * sensible size or 0. + * If the parameters are not valid, the + * return value is unspecified. + */ +#define PSA_KEY_EXPORT_MAX_SIZE(key_type, key_bits) \ + (PSA_KEY_TYPE_IS_UNSTRUCTURED(key_type) ? PSA_BITS_TO_BYTES(key_bits) : \ + (key_type) == PSA_KEY_TYPE_RSA_KEY_PAIR ? PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(key_bits) : \ + (key_type) == PSA_KEY_TYPE_RSA_PUBLIC_KEY ? PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(key_bits) : \ + (key_type) == PSA_KEY_TYPE_DSA_KEY_PAIR ? PSA_KEY_EXPORT_DSA_KEY_PAIR_MAX_SIZE(key_bits) : \ + (key_type) == PSA_KEY_TYPE_DSA_PUBLIC_KEY ? PSA_KEY_EXPORT_DSA_PUBLIC_KEY_MAX_SIZE(key_bits) : \ + PSA_KEY_TYPE_IS_ECC_KEY_PAIR(key_type) ? PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(key_bits) : \ + PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY(key_type) ? PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(key_bits) : \ + 0) + +#endif /* PSA_CRYPTO_SIZES_H */ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_struct_ipc.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_struct.h similarity index 75% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_struct_ipc.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_struct.h index 20bea21c667..403a734000b 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_struct_ipc.h +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_struct.h @@ -1,7 +1,13 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ /** * \file psa/crypto_struct.h * - * \brief PSA cryptography module: Mbed TLS structured type implementations + * \brief PSA cryptography module: structured type implementations * * \note This file may not be included directly. Applications must * include psa/crypto.h. @@ -12,60 +18,38 @@ * In implementations with isolation between the application and the * cryptography module, it is expected that the front-end and the back-end * would have different versions of this file. - * - *

Design notes about multipart operation structures

- * - * Each multipart operation structure contains a `psa_algorithm_t alg` - * field which indicates which specific algorithm the structure is for. - * When the structure is not in use, `alg` is 0. Most of the structure - * consists of a union which is discriminated by `alg`. - * - * Note that when `alg` is 0, the content of other fields is undefined. - * In particular, it is not guaranteed that a freshly-initialized structure - * is all-zero: we initialize structures to something like `{0, 0}`, which - * is only guaranteed to initializes the first member of the union; - * GCC and Clang initialize the whole structure to 0 (at the time of writing), - * but MSVC and CompCert don't. - * - * In Mbed Crypto, multipart operation structures live independently from - * the key. This allows Mbed Crypto to free the key objects when destroying - * a key slot. If a multipart operation needs to remember the key after - * the setup function returns, the operation structure needs to contain a - * copy of the key. - */ -/* - * 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 PSA_CRYPTO_STRUCT_H #define PSA_CRYPTO_STRUCT_H -#include "psa/client.h" - #ifdef __cplusplus extern "C" { #endif -struct psa_hash_operation_s { - psa_handle_t handle; +/* + * Note that the below structures are different from the decalrations in + * mbed-crypto. This is because TF-M maintains 'front-end' and 'back-end' + * versions of this header. In the front-end version, exported to NS + * clients in interface/include/psa, a crypto operation is defined as an + * opaque handle to a context in the Crypto service. The back-end + * version, directly included from the mbed-crypto repo by the Crypto + * service, contains the full definition of the operation structs. + * + * One of the functions of the Crypto service is to allocate the back-end + * operation contexts in its own partition memory (in crypto_alloc.c), + * and then do the mapping between front-end operation handles passed by + * NS clients and the corresponding back-end operation contexts. The + * advantage of doing it this way is that internal mbed-crypto state is never + * exposed to the NS client. + */ + +struct psa_hash_operation_s +{ + uint32_t handle; }; -#define PSA_HASH_OPERATION_INIT { PSA_NULL_HANDLE } +#define PSA_HASH_OPERATION_INIT {0} static inline struct psa_hash_operation_s psa_hash_operation_init( void ) { const struct psa_hash_operation_s v = PSA_HASH_OPERATION_INIT; @@ -74,10 +58,10 @@ static inline struct psa_hash_operation_s psa_hash_operation_init( void ) struct psa_mac_operation_s { - psa_handle_t handle; + uint32_t handle; }; -#define PSA_MAC_OPERATION_INIT { PSA_NULL_HANDLE } +#define PSA_MAC_OPERATION_INIT {0} static inline struct psa_mac_operation_s psa_mac_operation_init( void ) { const struct psa_mac_operation_s v = PSA_MAC_OPERATION_INIT; @@ -86,10 +70,10 @@ static inline struct psa_mac_operation_s psa_mac_operation_init( void ) struct psa_cipher_operation_s { - psa_handle_t handle; + uint32_t handle; }; -#define PSA_CIPHER_OPERATION_INIT { PSA_NULL_HANDLE } +#define PSA_CIPHER_OPERATION_INIT {0} static inline struct psa_cipher_operation_s psa_cipher_operation_init( void ) { const struct psa_cipher_operation_s v = PSA_CIPHER_OPERATION_INIT; @@ -98,10 +82,10 @@ static inline struct psa_cipher_operation_s psa_cipher_operation_init( void ) struct psa_aead_operation_s { - psa_handle_t handle; + uint32_t handle; }; -#define PSA_AEAD_OPERATION_INIT { PSA_NULL_HANDLE } +#define PSA_AEAD_OPERATION_INIT {0} static inline struct psa_aead_operation_s psa_aead_operation_init( void ) { const struct psa_aead_operation_s v = PSA_AEAD_OPERATION_INIT; @@ -110,11 +94,10 @@ static inline struct psa_aead_operation_s psa_aead_operation_init( void ) struct psa_key_derivation_s { - psa_handle_t handle; + uint32_t handle; }; -/* This only zeroes out the first byte in the union, the rest is unspecified. */ -#define PSA_KEY_DERIVATION_OPERATION_INIT { PSA_NULL_HANDLE } +#define PSA_KEY_DERIVATION_OPERATION_INIT {0} static inline struct psa_key_derivation_s psa_key_derivation_operation_init( void ) { const struct psa_key_derivation_s v = PSA_KEY_DERIVATION_OPERATION_INIT; diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_types.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_types.h new file mode 100644 index 00000000000..690999f79c4 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_types.h @@ -0,0 +1,313 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +/** + * \file psa/crypto_types.h + * + * \brief PSA cryptography module: type aliases. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. Drivers must include the appropriate driver + * header file. + * + * This file contains portable definitions of integral types for properties + * of cryptographic keys, designations of cryptographic algorithms, and + * error codes returned by the library. + * + * This header file does not declare any function. + */ + +#ifndef PSA_CRYPTO_TYPES_H +#define PSA_CRYPTO_TYPES_H + +#include + +/** \defgroup error Error codes + * @{ + */ + +/** + * \brief Function return status. + * + * This is either #PSA_SUCCESS (which is zero), indicating success, + * or a small negative value indicating that an error occurred. Errors are + * encoded as one of the \c PSA_ERROR_xxx values defined here. */ +/* If #PSA_SUCCESS is already defined, it means that #psa_status_t + * is also defined in an external header, so prevent its multiple + * definition. + */ +#ifndef PSA_SUCCESS +typedef int32_t psa_status_t; +#endif + +/**@}*/ + +/** \defgroup crypto_types Key and algorithm types + * @{ + */ + +/** \brief Encoding of a key type. + */ +typedef uint32_t psa_key_type_t; + +/** The type of PSA elliptic curve identifiers. + * + * The curve identifier is required to create an ECC key using the + * PSA_KEY_TYPE_ECC_KEY_PAIR() or PSA_KEY_TYPE_ECC_PUBLIC_KEY() + * macros. + * + * The encoding of curve identifiers is taken from the + * TLS Supported Groups Registry (formerly known as the + * TLS EC Named Curve Registry) + * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 + * + * This specification defines identifiers for some of the curves in the IANA + * registry. Implementations that support other curves that are in the IANA + * registry should use the IANA value and a implementation-specific identifier. + * Implemenations that support non-IANA curves should use one of the following + * approaches for allocating a key type: + * + * 1. Select a ::psa_ecc_curve_t value in the range #PSA_ECC_CURVE_VENDOR_MIN to + * #PSA_ECC_CURVE_VENDOR_MAX, which is a subset of the IANA private use + * range. + * 2. Use a ::psa_key_type_t value that is vendor-defined. + * + * The first option is recommended. + */ +typedef uint16_t psa_ecc_curve_t; + +/** The type of PSA Diffie-Hellman group identifiers. + * + * The group identifier is required to create an Diffie-Hellman key using the + * PSA_KEY_TYPE_DH_KEY_PAIR() or PSA_KEY_TYPE_DH_PUBLIC_KEY() + * macros. + * + * The encoding of group identifiers is taken from the + * TLS Supported Groups Registry (formerly known as the + * TLS EC Named Curve Registry) + * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 + * + * This specification defines identifiers for some of the groups in the IANA + * registry. Implementations that support other groups that are in the IANA + * registry should use the IANA value and a implementation-specific identifier. + * Implemenations that support non-IANA groups should use one of the following + * approaches for allocating a key type: + * + * 1. Select a ::psa_dh_group_t value in the range #PSA_DH_GROUP_VENDOR_MIN to + * #PSA_DH_GROUP_VENDOR_MAX, which is a subset of the IANA private use + * range. + * 2. Select a ::psa_dh_group_t value from the named groups allocated for + * GREASE in the IETF draft specification. The GREASE specification and + * values are listed below. + * 3. Use a ::psa_key_type_t value that is vendor-defined. + * + * Option 1 or 2 are recommended. + * + * The current draft of the GREASE specification is + * https://datatracker.ietf.org/doc/draft-ietf-tls-grease + * + * The following GREASE values are allocated for named groups: + * \code + * 0x0A0A + * 0x1A1A + * 0x2A2A + * 0x3A3A + * 0x4A4A + * 0x5A5A + * 0x6A6A + * 0x7A7A + * 0x8A8A + * 0x9A9A + * 0xAAAA + * 0xBABA + * 0xCACA + * 0xDADA + * 0xEAEA + * 0xFAFA + * \endcode + */ +typedef uint16_t psa_dh_group_t; + +/** \brief Encoding of a cryptographic algorithm. + * + * For algorithms that can be applied to multiple key types, this type + * does not encode the key type. For example, for symmetric ciphers + * based on a block cipher, #psa_algorithm_t encodes the block cipher + * mode and the padding mode while the block cipher itself is encoded + * via #psa_key_type_t. + */ +typedef uint32_t psa_algorithm_t; + +/**@}*/ + +/** \defgroup key_lifetimes Key lifetimes + * @{ + */ + +/** Encoding of key lifetimes. + * + * The lifetime of a key indicates where it is stored and what system actions + * may create and destroy it. + * + * Keys with the lifetime #PSA_KEY_LIFETIME_VOLATILE are automatically + * destroyed when the application terminates or on a power reset. + * + * Keys with a lifetime other than #PSA_KEY_LIFETIME_VOLATILE are said + * to be _persistent_. + * Persistent keys are preserved if the application or the system restarts. + * Persistent keys have a key identifier of type #psa_key_id_t. + * The application can call psa_open_key() to open a persistent key that + * it created previously. + */ +typedef uint32_t psa_key_lifetime_t; + +/** Encoding of identifiers of persistent keys. + * + * - Applications may freely choose key identifiers in the range + * #PSA_KEY_ID_USER_MIN to #PSA_KEY_ID_USER_MAX. + * - Implementations may define additional key identifiers in the range + * #PSA_KEY_ID_VENDOR_MIN to #PSA_KEY_ID_VENDOR_MAX. + * - 0 is reserved as an invalid key identifier. + * - Key identifiers outside these ranges are reserved for future use. + */ +typedef uint32_t psa_key_id_t; +#define PSA_KEY_ID_INIT 0 + +/**@}*/ + +/** \defgroup policy Key policies + * @{ + */ + +/** \brief Encoding of permitted usage on a key. */ +typedef uint32_t psa_key_usage_t; + +/**@}*/ + +/** \defgroup attributes Key attributes + * @{ + */ + +/** The type of a structure containing key attributes. + * + * This is an opaque structure that can represent the metadata of a key + * object. Metadata that can be stored in attributes includes: + * - The location of the key in storage, indicated by its key identifier + * and its lifetime. + * - The key's policy, comprising usage flags and a specification of + * the permitted algorithm(s). + * - Information about the key itself: the key type and its size. + * - Implementations may define additional attributes. + * + * The actual key material is not considered an attribute of a key. + * Key attributes do not contain information that is generally considered + * highly confidential. + * + * An attribute structure can be a simple data structure where each function + * `psa_set_key_xxx` sets a field and the corresponding function + * `psa_get_key_xxx` retrieves the value of the corresponding field. + * However, implementations may report values that are equivalent to the + * original one, but have a different encoding. For example, an + * implementation may use a more compact representation for types where + * many bit-patterns are invalid or not supported, and store all values + * that it does not support as a special marker value. In such an + * implementation, after setting an invalid value, the corresponding + * get function returns an invalid value which may not be the one that + * was originally stored. + * + * An attribute structure may contain references to auxiliary resources, + * for example pointers to allocated memory or indirect references to + * pre-calculated values. In order to free such resources, the application + * must call psa_reset_key_attributes(). As an exception, calling + * psa_reset_key_attributes() on an attribute structure is optional if + * the structure has only been modified by the following functions + * since it was initialized or last reset with psa_reset_key_attributes(): + * - psa_set_key_id() + * - psa_set_key_lifetime() + * - psa_set_key_type() + * - psa_set_key_bits() + * - psa_set_key_usage_flags() + * - psa_set_key_algorithm() + * + * Before calling any function on a key attribute structure, the application + * must initialize it by any of the following means: + * - Set the structure to all-bits-zero, for example: + * \code + * psa_key_attributes_t attributes; + * memset(&attributes, 0, sizeof(attributes)); + * \endcode + * - Initialize the structure to logical zero values, for example: + * \code + * psa_key_attributes_t attributes = {0}; + * \endcode + * - Initialize the structure to the initializer #PSA_KEY_ATTRIBUTES_INIT, + * for example: + * \code + * psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + * \endcode + * - Assign the result of the function psa_key_attributes_init() + * to the structure, for example: + * \code + * psa_key_attributes_t attributes; + * attributes = psa_key_attributes_init(); + * \endcode + * + * A freshly initialized attribute structure contains the following + * values: + * + * - lifetime: #PSA_KEY_LIFETIME_VOLATILE. + * - key identifier: 0 (which is not a valid key identifier). + * - type: \c 0 (meaning that the type is unspecified). + * - key size: \c 0 (meaning that the size is unspecified). + * - usage flags: \c 0 (which allows no usage except exporting a public key). + * - algorithm: \c 0 (which allows no cryptographic usage, but allows + * exporting). + * + * A typical sequence to create a key is as follows: + * -# Create and initialize an attribute structure. + * -# If the key is persistent, call psa_set_key_id(). + * Also call psa_set_key_lifetime() to place the key in a non-default + * location. + * -# Set the key policy with psa_set_key_usage_flags() and + * psa_set_key_algorithm(). + * -# Set the key type with psa_set_key_type(). + * Skip this step if copying an existing key with psa_copy_key(). + * -# When generating a random key with psa_generate_key() or deriving a key + * with psa_key_derivation_output_key(), set the desired key size with + * psa_set_key_bits(). + * -# Call a key creation function: psa_import_key(), psa_generate_key(), + * psa_key_derivation_output_key() or psa_copy_key(). This function reads + * the attribute structure, creates a key with these attributes, and + * outputs a handle to the newly created key. + * -# The attribute structure is now no longer necessary. + * You may call psa_reset_key_attributes(), although this is optional + * with the workflow presented here because the attributes currently + * defined in this specification do not require any additional resources + * beyond the structure itself. + * + * A typical sequence to query a key's attributes is as follows: + * -# Call psa_get_key_attributes(). + * -# Call `psa_get_key_xxx` functions to retrieve the attribute(s) that + * you are interested in. + * -# Call psa_reset_key_attributes() to free any resources that may be + * used by the attribute structure. + * + * Once a key has been created, it is impossible to change its attributes. + */ +typedef struct psa_key_attributes_s psa_key_attributes_t; + +/**@}*/ + +/** \defgroup derivation Key derivation + * @{ + */ + +/** \brief Encoding of the step of a key derivation. */ +typedef uint16_t psa_key_derivation_step_t; + +/**@}*/ + +#endif /* PSA_CRYPTO_TYPES_H */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_values.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_values.h new file mode 100644 index 00000000000..7fde07385fa --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/crypto_values.h @@ -0,0 +1,1701 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +/** + * \file psa/crypto_values.h + * + * \brief PSA cryptography module: macros to build and analyze integer values. + * + * \note This file may not be included directly. Applications must + * include psa/crypto.h. Drivers must include the appropriate driver + * header file. + * + * This file contains portable definitions of macros to build and analyze + * values of integral types that encode properties of cryptographic keys, + * designations of cryptographic algorithms, and error codes returned by + * the library. + * + * This header file only defines preprocessor macros. + */ + +#ifndef PSA_CRYPTO_VALUES_H +#define PSA_CRYPTO_VALUES_H + +/** \defgroup error Error codes + * @{ + */ + +/* PSA error codes */ + +/** The action was completed successfully. */ +#ifndef PSA_SUCCESS +#define PSA_SUCCESS ((psa_status_t)0) +#endif + +/** An error occurred that does not correspond to any defined + * failure cause. + * + * Implementations may use this error code if none of the other standard + * error codes are applicable. */ +#define PSA_ERROR_GENERIC_ERROR ((psa_status_t)-132) + +/** The requested operation or a parameter is not supported + * by this implementation. + * + * Implementations should return this error code when an enumeration + * parameter such as a key type, algorithm, etc. is not recognized. + * If a combination of parameters is recognized and identified as + * not valid, return #PSA_ERROR_INVALID_ARGUMENT instead. */ +#define PSA_ERROR_NOT_SUPPORTED ((psa_status_t)-134) + +/** The requested action is denied by a policy. + * + * Implementations should return this error code when the parameters + * are recognized as valid and supported, and a policy explicitly + * denies the requested operation. + * + * If a subset of the parameters of a function call identify a + * forbidden operation, and another subset of the parameters are + * not valid or not supported, it is unspecified whether the function + * returns #PSA_ERROR_NOT_PERMITTED, #PSA_ERROR_NOT_SUPPORTED or + * #PSA_ERROR_INVALID_ARGUMENT. */ +#define PSA_ERROR_NOT_PERMITTED ((psa_status_t)-133) + +/** An output buffer is too small. + * + * Applications can call the \c PSA_xxx_SIZE macro listed in the function + * description to determine a sufficient buffer size. + * + * Implementations should preferably return this error code only + * in cases when performing the operation with a larger output + * buffer would succeed. However implementations may return this + * error if a function has invalid or unsupported parameters in addition + * to the parameters that determine the necessary output buffer size. */ +#define PSA_ERROR_BUFFER_TOO_SMALL ((psa_status_t)-138) + +/** Asking for an item that already exists + * + * Implementations should return this error, when attempting + * to write an item (like a key) that already exists. */ +#define PSA_ERROR_ALREADY_EXISTS ((psa_status_t)-139) + +/** Asking for an item that doesn't exist + * + * Implementations should return this error, if a requested item (like + * a key) does not exist. */ +#define PSA_ERROR_DOES_NOT_EXIST ((psa_status_t)-140) + +/** The requested action cannot be performed in the current state. + * + * Multipart operations return this error when one of the + * functions is called out of sequence. Refer to the function + * descriptions for permitted sequencing of functions. + * + * Implementations shall not return this error code to indicate + * that a key either exists or not, + * but shall instead return #PSA_ERROR_ALREADY_EXISTS or #PSA_ERROR_DOES_NOT_EXIST + * as applicable. + * + * Implementations shall not return this error code to indicate that a + * key handle is invalid, but shall return #PSA_ERROR_INVALID_HANDLE + * instead. */ +#define PSA_ERROR_BAD_STATE ((psa_status_t)-137) + +/** The parameters passed to the function are invalid. + * + * Implementations may return this error any time a parameter or + * combination of parameters are recognized as invalid. + * + * Implementations shall not return this error code to indicate that a + * key handle is invalid, but shall return #PSA_ERROR_INVALID_HANDLE + * instead. + */ +#define PSA_ERROR_INVALID_ARGUMENT ((psa_status_t)-135) + +/** There is not enough runtime memory. + * + * If the action is carried out across multiple security realms, this + * error can refer to available memory in any of the security realms. */ +#define PSA_ERROR_INSUFFICIENT_MEMORY ((psa_status_t)-141) + +/** There is not enough persistent storage. + * + * Functions that modify the key storage return this error code if + * there is insufficient storage space on the host media. In addition, + * many functions that do not otherwise access storage may return this + * error code if the implementation requires a mandatory log entry for + * the requested action and the log storage space is full. */ +#define PSA_ERROR_INSUFFICIENT_STORAGE ((psa_status_t)-142) + +/** There was a communication failure inside the implementation. + * + * This can indicate a communication failure between the application + * and an external cryptoprocessor or between the cryptoprocessor and + * an external volatile or persistent memory. A communication failure + * may be transient or permanent depending on the cause. + * + * \warning If a function returns this error, it is undetermined + * whether the requested action has completed or not. Implementations + * should return #PSA_SUCCESS on successful completion whenever + * possible, however functions may return #PSA_ERROR_COMMUNICATION_FAILURE + * if the requested action was completed successfully in an external + * cryptoprocessor but there was a breakdown of communication before + * the cryptoprocessor could report the status to the application. + */ +#define PSA_ERROR_COMMUNICATION_FAILURE ((psa_status_t)-145) + +/** There was a storage failure that may have led to data loss. + * + * This error indicates that some persistent storage is corrupted. + * It should not be used for a corruption of volatile memory + * (use #PSA_ERROR_CORRUPTION_DETECTED), for a communication error + * between the cryptoprocessor and its external storage (use + * #PSA_ERROR_COMMUNICATION_FAILURE), or when the storage is + * in a valid state but is full (use #PSA_ERROR_INSUFFICIENT_STORAGE). + * + * Note that a storage failure does not indicate that any data that was + * previously read is invalid. However this previously read data may no + * longer be readable from storage. + * + * When a storage failure occurs, it is no longer possible to ensure + * the global integrity of the keystore. Depending on the global + * integrity guarantees offered by the implementation, access to other + * data may or may not fail even if the data is still readable but + * its integrity cannot be guaranteed. + * + * Implementations should only use this error code to report a + * permanent storage corruption. However application writers should + * keep in mind that transient errors while reading the storage may be + * reported using this error code. */ +#define PSA_ERROR_STORAGE_FAILURE ((psa_status_t)-146) + +/** A hardware failure was detected. + * + * A hardware failure may be transient or permanent depending on the + * cause. */ +#define PSA_ERROR_HARDWARE_FAILURE ((psa_status_t)-147) + +/** A tampering attempt was detected. + * + * If an application receives this error code, there is no guarantee + * that previously accessed or computed data was correct and remains + * confidential. Applications should not perform any security function + * and should enter a safe failure state. + * + * Implementations may return this error code if they detect an invalid + * state that cannot happen during normal operation and that indicates + * that the implementation's security guarantees no longer hold. Depending + * on the implementation architecture and on its security and safety goals, + * the implementation may forcibly terminate the application. + * + * This error code is intended as a last resort when a security breach + * is detected and it is unsure whether the keystore data is still + * protected. Implementations shall only return this error code + * to report an alarm from a tampering detector, to indicate that + * the confidentiality of stored data can no longer be guaranteed, + * or to indicate that the integrity of previously returned data is now + * considered compromised. Implementations shall not use this error code + * to indicate a hardware failure that merely makes it impossible to + * perform the requested operation (use #PSA_ERROR_COMMUNICATION_FAILURE, + * #PSA_ERROR_STORAGE_FAILURE, #PSA_ERROR_HARDWARE_FAILURE, + * #PSA_ERROR_INSUFFICIENT_ENTROPY or other applicable error code + * instead). + * + * This error indicates an attack against the application. Implementations + * shall not return this error code as a consequence of the behavior of + * the application itself. */ +#define PSA_ERROR_CORRUPTION_DETECTED ((psa_status_t)-151) + +/** There is not enough entropy to generate random data needed + * for the requested action. + * + * This error indicates a failure of a hardware random generator. + * Application writers should note that this error can be returned not + * only by functions whose purpose is to generate random data, such + * as key, IV or nonce generation, but also by functions that execute + * an algorithm with a randomized result, as well as functions that + * use randomization of intermediate computations as a countermeasure + * to certain attacks. + * + * Implementations should avoid returning this error after psa_crypto_init() + * has succeeded. Implementations should generate sufficient + * entropy during initialization and subsequently use a cryptographically + * secure pseudorandom generator (PRNG). However implementations may return + * this error at any time if a policy requires the PRNG to be reseeded + * during normal operation. */ +#define PSA_ERROR_INSUFFICIENT_ENTROPY ((psa_status_t)-148) + +/** The signature, MAC or hash is incorrect. + * + * Verification functions return this error if the verification + * calculations completed successfully, and the value to be verified + * was determined to be incorrect. + * + * If the value to verify has an invalid size, implementations may return + * either #PSA_ERROR_INVALID_ARGUMENT or #PSA_ERROR_INVALID_SIGNATURE. */ +#define PSA_ERROR_INVALID_SIGNATURE ((psa_status_t)-149) + +/** The decrypted padding is incorrect. + * + * \warning In some protocols, when decrypting data, it is essential that + * the behavior of the application does not depend on whether the padding + * is correct, down to precise timing. Applications should prefer + * protocols that use authenticated encryption rather than plain + * encryption. If the application must perform a decryption of + * unauthenticated data, the application writer should take care not + * to reveal whether the padding is invalid. + * + * Implementations should strive to make valid and invalid padding + * as close as possible to indistinguishable to an external observer. + * In particular, the timing of a decryption operation should not + * depend on the validity of the padding. */ +#define PSA_ERROR_INVALID_PADDING ((psa_status_t)-150) + +/** Return this error when there's insufficient data when attempting + * to read from a resource. */ +#define PSA_ERROR_INSUFFICIENT_DATA ((psa_status_t)-143) + +/** The key handle is not valid. See also :ref:\`key-handles\`. + */ +#define PSA_ERROR_INVALID_HANDLE ((psa_status_t)-136) + +/**@}*/ + +/** \defgroup crypto_types Key and algorithm types + * @{ + */ + +/** An invalid key type value. + * + * Zero is not the encoding of any key type. + */ +#define PSA_KEY_TYPE_NONE ((psa_key_type_t)0x00000000) + +/** Vendor-defined key type flag. + * + * Key types defined by this standard will never have the + * #PSA_KEY_TYPE_VENDOR_FLAG bit set. Vendors who define additional key types + * must use an encoding with the #PSA_KEY_TYPE_VENDOR_FLAG bit set and should + * respect the bitwise structure used by standard encodings whenever practical. + */ +#define PSA_KEY_TYPE_VENDOR_FLAG ((psa_key_type_t)0x80000000) + +#define PSA_KEY_TYPE_CATEGORY_MASK ((psa_key_type_t)0x70000000) +#define PSA_KEY_TYPE_CATEGORY_SYMMETRIC ((psa_key_type_t)0x40000000) +#define PSA_KEY_TYPE_CATEGORY_RAW ((psa_key_type_t)0x50000000) +#define PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY ((psa_key_type_t)0x60000000) +#define PSA_KEY_TYPE_CATEGORY_KEY_PAIR ((psa_key_type_t)0x70000000) + +#define PSA_KEY_TYPE_CATEGORY_FLAG_PAIR ((psa_key_type_t)0x10000000) + +/** Whether a key type is vendor-defined. + * + * See also #PSA_KEY_TYPE_VENDOR_FLAG. + */ +#define PSA_KEY_TYPE_IS_VENDOR_DEFINED(type) \ + (((type) & PSA_KEY_TYPE_VENDOR_FLAG) != 0) + +/** Whether a key type is an unstructured array of bytes. + * + * This encompasses both symmetric keys and non-key data. + */ +#define PSA_KEY_TYPE_IS_UNSTRUCTURED(type) \ + (((type) & PSA_KEY_TYPE_CATEGORY_MASK & ~(psa_key_type_t)0x10000000) == \ + PSA_KEY_TYPE_CATEGORY_SYMMETRIC) + +/** Whether a key type is asymmetric: either a key pair or a public key. */ +#define PSA_KEY_TYPE_IS_ASYMMETRIC(type) \ + (((type) & PSA_KEY_TYPE_CATEGORY_MASK \ + & ~PSA_KEY_TYPE_CATEGORY_FLAG_PAIR) == \ + PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY) +/** Whether a key type is the public part of a key pair. */ +#define PSA_KEY_TYPE_IS_PUBLIC_KEY(type) \ + (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY) +/** Whether a key type is a key pair containing a private part and a public + * part. */ +#define PSA_KEY_TYPE_IS_KEY_PAIR(type) \ + (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_KEY_PAIR) +/** The key pair type corresponding to a public key type. + * + * You may also pass a key pair type as \p type, it will be left unchanged. + * + * \param type A public key type or key pair type. + * + * \return The corresponding key pair type. + * If \p type is not a public key or a key pair, + * the return value is undefined. + */ +#define PSA_KEY_TYPE_KEY_PAIR_OF_PUBLIC_KEY(type) \ + ((type) | PSA_KEY_TYPE_CATEGORY_FLAG_PAIR) +/** The public key type corresponding to a key pair type. + * + * You may also pass a key pair type as \p type, it will be left unchanged. + * + * \param type A public key type or key pair type. + * + * \return The corresponding public key type. + * If \p type is not a public key or a key pair, + * the return value is undefined. + */ +#define PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) \ + ((type) & ~PSA_KEY_TYPE_CATEGORY_FLAG_PAIR) + +/** Raw data. + * + * A "key" of this type cannot be used for any cryptographic operation. + * Applications may use this type to store arbitrary data in the keystore. */ +#define PSA_KEY_TYPE_RAW_DATA ((psa_key_type_t)0x50000001) + +/** HMAC key. + * + * The key policy determines which underlying hash algorithm the key can be + * used for. + * + * HMAC keys should generally have the same size as the underlying hash. + * This size can be calculated with #PSA_HASH_SIZE(\c alg) where + * \c alg is the HMAC algorithm or the underlying hash algorithm. */ +#define PSA_KEY_TYPE_HMAC ((psa_key_type_t)0x51000000) + +/** A secret for key derivation. + * + * The key policy determines which key derivation algorithm the key + * can be used for. + */ +#define PSA_KEY_TYPE_DERIVE ((psa_key_type_t)0x52000000) + +/** Key for a cipher, AEAD or MAC algorithm based on the AES block cipher. + * + * The size of the key can be 16 bytes (AES-128), 24 bytes (AES-192) or + * 32 bytes (AES-256). + */ +#define PSA_KEY_TYPE_AES ((psa_key_type_t)0x40000001) + +/** Key for a cipher or MAC algorithm based on DES or 3DES (Triple-DES). + * + * The size of the key can be 8 bytes (single DES), 16 bytes (2-key 3DES) or + * 24 bytes (3-key 3DES). + * + * Note that single DES and 2-key 3DES are weak and strongly + * deprecated and should only be used to decrypt legacy data. 3-key 3DES + * is weak and deprecated and should only be used in legacy protocols. + */ +#define PSA_KEY_TYPE_DES ((psa_key_type_t)0x40000002) + +/** Key for a cipher, AEAD or MAC algorithm based on the + * Camellia block cipher. */ +#define PSA_KEY_TYPE_CAMELLIA ((psa_key_type_t)0x40000003) + +/** Key for the RC4 stream cipher. + * + * Note that RC4 is weak and deprecated and should only be used in + * legacy protocols. */ +#define PSA_KEY_TYPE_ARC4 ((psa_key_type_t)0x40000004) + +/** Key for the ChaCha20 stream cipher or the Chacha20-Poly1305 AEAD algorithm. + * + * ChaCha20 and the ChaCha20_Poly1305 construction are defined in RFC 7539. + * + * Implementations must support 12-byte nonces, may support 8-byte nonces, + * and should reject other sizes. + */ +#define PSA_KEY_TYPE_CHACHA20 ((psa_key_type_t)0x40000005) + +/** RSA public key. */ +#define PSA_KEY_TYPE_RSA_PUBLIC_KEY ((psa_key_type_t)0x60010000) +/** RSA key pair (private and public key). */ +#define PSA_KEY_TYPE_RSA_KEY_PAIR ((psa_key_type_t)0x70010000) +/** Whether a key type is an RSA key (pair or public-only). */ +#define PSA_KEY_TYPE_IS_RSA(type) \ + (PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) == PSA_KEY_TYPE_RSA_PUBLIC_KEY) + +#define PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE ((psa_key_type_t)0x60030000) +#define PSA_KEY_TYPE_ECC_KEY_PAIR_BASE ((psa_key_type_t)0x70030000) +#define PSA_KEY_TYPE_ECC_CURVE_MASK ((psa_key_type_t)0x0000ffff) +/** Elliptic curve key pair. + * + * \param curve A value of type ::psa_ecc_curve_t that identifies the + * ECC curve to be used. + */ +#define PSA_KEY_TYPE_ECC_KEY_PAIR(curve) \ + (PSA_KEY_TYPE_ECC_KEY_PAIR_BASE | (curve)) +/** Elliptic curve public key. + * + * \param curve A value of type ::psa_ecc_curve_t that identifies the + * ECC curve to be used. + */ +#define PSA_KEY_TYPE_ECC_PUBLIC_KEY(curve) \ + (PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE | (curve)) + +/** Whether a key type is an elliptic curve key (pair or public-only). */ +#define PSA_KEY_TYPE_IS_ECC(type) \ + ((PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) & \ + ~PSA_KEY_TYPE_ECC_CURVE_MASK) == PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE) +/** Whether a key type is an elliptic curve key pair. */ +#define PSA_KEY_TYPE_IS_ECC_KEY_PAIR(type) \ + (((type) & ~PSA_KEY_TYPE_ECC_CURVE_MASK) == \ + PSA_KEY_TYPE_ECC_KEY_PAIR_BASE) +/** Whether a key type is an elliptic curve public key. */ +#define PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY(type) \ + (((type) & ~PSA_KEY_TYPE_ECC_CURVE_MASK) == \ + PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE) + +/** Extract the curve from an elliptic curve key type. */ +#define PSA_KEY_TYPE_GET_CURVE(type) \ + ((psa_ecc_curve_t) (PSA_KEY_TYPE_IS_ECC(type) ? \ + ((type) & PSA_KEY_TYPE_ECC_CURVE_MASK) : \ + 0)) + +/* The encoding of curve identifiers is currently aligned with the + * TLS Supported Groups Registry (formerly known as the + * TLS EC Named Curve Registry) + * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 + * The values are defined by RFC 8422 and RFC 7027. */ +#define PSA_ECC_CURVE_SECT163K1 ((psa_ecc_curve_t) 0x0001) +#define PSA_ECC_CURVE_SECT163R1 ((psa_ecc_curve_t) 0x0002) +#define PSA_ECC_CURVE_SECT163R2 ((psa_ecc_curve_t) 0x0003) +#define PSA_ECC_CURVE_SECT193R1 ((psa_ecc_curve_t) 0x0004) +#define PSA_ECC_CURVE_SECT193R2 ((psa_ecc_curve_t) 0x0005) +#define PSA_ECC_CURVE_SECT233K1 ((psa_ecc_curve_t) 0x0006) +#define PSA_ECC_CURVE_SECT233R1 ((psa_ecc_curve_t) 0x0007) +#define PSA_ECC_CURVE_SECT239K1 ((psa_ecc_curve_t) 0x0008) +#define PSA_ECC_CURVE_SECT283K1 ((psa_ecc_curve_t) 0x0009) +#define PSA_ECC_CURVE_SECT283R1 ((psa_ecc_curve_t) 0x000a) +#define PSA_ECC_CURVE_SECT409K1 ((psa_ecc_curve_t) 0x000b) +#define PSA_ECC_CURVE_SECT409R1 ((psa_ecc_curve_t) 0x000c) +#define PSA_ECC_CURVE_SECT571K1 ((psa_ecc_curve_t) 0x000d) +#define PSA_ECC_CURVE_SECT571R1 ((psa_ecc_curve_t) 0x000e) +#define PSA_ECC_CURVE_SECP160K1 ((psa_ecc_curve_t) 0x000f) +#define PSA_ECC_CURVE_SECP160R1 ((psa_ecc_curve_t) 0x0010) +#define PSA_ECC_CURVE_SECP160R2 ((psa_ecc_curve_t) 0x0011) +#define PSA_ECC_CURVE_SECP192K1 ((psa_ecc_curve_t) 0x0012) +#define PSA_ECC_CURVE_SECP192R1 ((psa_ecc_curve_t) 0x0013) +#define PSA_ECC_CURVE_SECP224K1 ((psa_ecc_curve_t) 0x0014) +#define PSA_ECC_CURVE_SECP224R1 ((psa_ecc_curve_t) 0x0015) +#define PSA_ECC_CURVE_SECP256K1 ((psa_ecc_curve_t) 0x0016) +#define PSA_ECC_CURVE_SECP256R1 ((psa_ecc_curve_t) 0x0017) +#define PSA_ECC_CURVE_SECP384R1 ((psa_ecc_curve_t) 0x0018) +#define PSA_ECC_CURVE_SECP521R1 ((psa_ecc_curve_t) 0x0019) +#define PSA_ECC_CURVE_BRAINPOOL_P256R1 ((psa_ecc_curve_t) 0x001a) +#define PSA_ECC_CURVE_BRAINPOOL_P384R1 ((psa_ecc_curve_t) 0x001b) +#define PSA_ECC_CURVE_BRAINPOOL_P512R1 ((psa_ecc_curve_t) 0x001c) +/** Curve25519. + * + * This is the curve defined in Bernstein et al., + * _Curve25519: new Diffie-Hellman speed records_, LNCS 3958, 2006. + * The algorithm #PSA_ALG_ECDH performs X25519 when used with this curve. + */ +#define PSA_ECC_CURVE_CURVE25519 ((psa_ecc_curve_t) 0x001d) +/** Curve448 + * + * This is the curve defined in Hamburg, + * _Ed448-Goldilocks, a new elliptic curve_, NIST ECC Workshop, 2015. + * The algorithm #PSA_ALG_ECDH performs X448 when used with this curve. + */ +#define PSA_ECC_CURVE_CURVE448 ((psa_ecc_curve_t) 0x001e) + +/** Minimum value for a vendor-defined ECC curve identifier + * + * The range for vendor-defined curve identifiers is a subset of the IANA + * registry private use range, `0xfe00` - `0xfeff`. + */ +#define PSA_ECC_CURVE_VENDOR_MIN ((psa_ecc_curve_t) 0xfe00) +/** Maximum value for a vendor-defined ECC curve identifier + * + * The range for vendor-defined curve identifiers is a subset of the IANA + * registry private use range, `0xfe00` - `0xfeff`. + */ +#define PSA_ECC_CURVE_VENDOR_MAX ((psa_ecc_curve_t) 0xfe7f) + +#define PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE ((psa_key_type_t)0x60040000) +#define PSA_KEY_TYPE_DH_KEY_PAIR_BASE ((psa_key_type_t)0x70040000) +#define PSA_KEY_TYPE_DH_GROUP_MASK ((psa_key_type_t)0x0000ffff) +/** Diffie-Hellman key pair. + * + * \param group A value of type ::psa_dh_group_t that identifies the + * Diffie-Hellman group to be used. + */ +#define PSA_KEY_TYPE_DH_KEY_PAIR(group) \ + (PSA_KEY_TYPE_DH_KEY_PAIR_BASE | (group)) +/** Diffie-Hellman public key. + * + * \param group A value of type ::psa_dh_group_t that identifies the + * Diffie-Hellman group to be used. + */ +#define PSA_KEY_TYPE_DH_PUBLIC_KEY(group) \ + (PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE | (group)) + +/** Whether a key type is a Diffie-Hellman key (pair or public-only). */ +#define PSA_KEY_TYPE_IS_DH(type) \ + ((PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(type) & \ + ~PSA_KEY_TYPE_DH_GROUP_MASK) == PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE) +/** Whether a key type is a Diffie-Hellman key pair. */ +#define PSA_KEY_TYPE_IS_DH_KEY_PAIR(type) \ + (((type) & ~PSA_KEY_TYPE_DH_GROUP_MASK) == \ + PSA_KEY_TYPE_DH_KEY_PAIR_BASE) +/** Whether a key type is a Diffie-Hellman public key. */ +#define PSA_KEY_TYPE_IS_DH_PUBLIC_KEY(type) \ + (((type) & ~PSA_KEY_TYPE_DH_GROUP_MASK) == \ + PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE) + +/** Extract the group from a Diffie-Hellman key type. */ +#define PSA_KEY_TYPE_GET_GROUP(type) \ + ((psa_dh_group_t) (PSA_KEY_TYPE_IS_DH(type) ? \ + ((type) & PSA_KEY_TYPE_DH_GROUP_MASK) : \ + 0)) + +/* The encoding of group identifiers is currently aligned with the + * TLS Supported Groups Registry (formerly known as the + * TLS EC Named Curve Registry) + * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 + * The values are defined by RFC 7919. */ +#define PSA_DH_GROUP_FFDHE2048 ((psa_dh_group_t) 0x0100) +#define PSA_DH_GROUP_FFDHE3072 ((psa_dh_group_t) 0x0101) +#define PSA_DH_GROUP_FFDHE4096 ((psa_dh_group_t) 0x0102) +#define PSA_DH_GROUP_FFDHE6144 ((psa_dh_group_t) 0x0103) +#define PSA_DH_GROUP_FFDHE8192 ((psa_dh_group_t) 0x0104) + +/** Minimum value for a vendor-defined Diffie Hellman group identifier + * + * The range for vendor-defined group identifiers is a subset of the IANA + * registry private use range, `0x01fc` - `0x01ff`. + */ +#define PSA_DH_GROUP_VENDOR_MIN ((psa_dh_group_t) 0x01fc) +/** Maximum value for a vendor-defined Diffie Hellman group identifier + * + * The range for vendor-defined group identifiers is a subset of the IANA + * registry private use range, `0x01fc` - `0x01ff`. + */ +#define PSA_DH_GROUP_VENDOR_MAX ((psa_dh_group_t) 0x01fd) + +/** The block size of a block cipher. + * + * \param type A cipher key type (value of type #psa_key_type_t). + * + * \return The block size for a block cipher, or 1 for a stream cipher. + * The return value is undefined if \p type is not a supported + * cipher key type. + * + * \note It is possible to build stream cipher algorithms on top of a block + * cipher, for example CTR mode (#PSA_ALG_CTR). + * This macro only takes the key type into account, so it cannot be + * used to determine the size of the data that #psa_cipher_update() + * might buffer for future processing in general. + * + * \note This macro returns a compile-time constant if its argument is one. + * + * \warning This macro may evaluate its argument multiple times. + */ +#define PSA_BLOCK_CIPHER_BLOCK_SIZE(type) \ + ( \ + (type) == PSA_KEY_TYPE_AES ? 16 : \ + (type) == PSA_KEY_TYPE_DES ? 8 : \ + (type) == PSA_KEY_TYPE_CAMELLIA ? 16 : \ + (type) == PSA_KEY_TYPE_ARC4 ? 1 : \ + (type) == PSA_KEY_TYPE_CHACHA20 ? 1 : \ + 0) + +/** Vendor-defined algorithm flag. + * + * Algorithms defined by this standard will never have the #PSA_ALG_VENDOR_FLAG + * bit set. Vendors who define additional algorithms must use an encoding with + * the #PSA_ALG_VENDOR_FLAG bit set and should respect the bitwise structure + * used by standard encodings whenever practical. + */ +#define PSA_ALG_VENDOR_FLAG ((psa_algorithm_t)0x80000000) + +#define PSA_ALG_CATEGORY_MASK ((psa_algorithm_t)0x7f000000) +#define PSA_ALG_CATEGORY_HASH ((psa_algorithm_t)0x01000000) +#define PSA_ALG_CATEGORY_MAC ((psa_algorithm_t)0x02000000) +#define PSA_ALG_CATEGORY_CIPHER ((psa_algorithm_t)0x04000000) +#define PSA_ALG_CATEGORY_AEAD ((psa_algorithm_t)0x06000000) +#define PSA_ALG_CATEGORY_SIGN ((psa_algorithm_t)0x10000000) +#define PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION ((psa_algorithm_t)0x12000000) +#define PSA_ALG_CATEGORY_KEY_DERIVATION ((psa_algorithm_t)0x20000000) +#define PSA_ALG_CATEGORY_KEY_AGREEMENT ((psa_algorithm_t)0x30000000) + +/** Whether an algorithm is vendor-defined. + * + * See also #PSA_ALG_VENDOR_FLAG. + */ +#define PSA_ALG_IS_VENDOR_DEFINED(alg) \ + (((alg) & PSA_ALG_VENDOR_FLAG) != 0) + +/** Whether the specified algorithm is a hash algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a hash algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_HASH(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_HASH) + +/** Whether the specified algorithm is a MAC algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a MAC algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_MAC(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_MAC) + +/** Whether the specified algorithm is a symmetric cipher algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a symmetric cipher algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_CIPHER(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_CIPHER) + +/** Whether the specified algorithm is an authenticated encryption + * with associated data (AEAD) algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is an AEAD algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_AEAD(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_AEAD) + +/** Whether the specified algorithm is a public-key signature algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a public-key signature algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_SIGN(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_SIGN) + +/** Whether the specified algorithm is a public-key encryption algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a public-key encryption algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION) + +/** Whether the specified algorithm is a key agreement algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a key agreement algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_KEY_AGREEMENT(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_KEY_AGREEMENT) + +/** Whether the specified algorithm is a key derivation algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a key derivation algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_KEY_DERIVATION(alg) \ + (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_KEY_DERIVATION) + +#define PSA_ALG_HASH_MASK ((psa_algorithm_t)0x000000ff) +/** MD2 */ +#define PSA_ALG_MD2 ((psa_algorithm_t)0x01000001) +/** MD4 */ +#define PSA_ALG_MD4 ((psa_algorithm_t)0x01000002) +/** MD5 */ +#define PSA_ALG_MD5 ((psa_algorithm_t)0x01000003) +/** PSA_ALG_RIPEMD160 */ +#define PSA_ALG_RIPEMD160 ((psa_algorithm_t)0x01000004) +/** SHA1 */ +#define PSA_ALG_SHA_1 ((psa_algorithm_t)0x01000005) +/** SHA2-224 */ +#define PSA_ALG_SHA_224 ((psa_algorithm_t)0x01000008) +/** SHA2-256 */ +#define PSA_ALG_SHA_256 ((psa_algorithm_t)0x01000009) +/** SHA2-384 */ +#define PSA_ALG_SHA_384 ((psa_algorithm_t)0x0100000a) +/** SHA2-512 */ +#define PSA_ALG_SHA_512 ((psa_algorithm_t)0x0100000b) +/** SHA2-512/224 */ +#define PSA_ALG_SHA_512_224 ((psa_algorithm_t)0x0100000c) +/** SHA2-512/256 */ +#define PSA_ALG_SHA_512_256 ((psa_algorithm_t)0x0100000d) +/** SHA3-224 */ +#define PSA_ALG_SHA3_224 ((psa_algorithm_t)0x01000010) +/** SHA3-256 */ +#define PSA_ALG_SHA3_256 ((psa_algorithm_t)0x01000011) +/** SHA3-384 */ +#define PSA_ALG_SHA3_384 ((psa_algorithm_t)0x01000012) +/** SHA3-512 */ +#define PSA_ALG_SHA3_512 ((psa_algorithm_t)0x01000013) + +/** In a hash-and-sign algorithm policy, allow any hash algorithm. + * + * This value may be used to form the algorithm usage field of a policy + * for a signature algorithm that is parametrized by a hash. The key + * may then be used to perform operations using the same signature + * algorithm parametrized with any supported hash. + * + * That is, suppose that `PSA_xxx_SIGNATURE` is one of the following macros: + * - #PSA_ALG_RSA_PKCS1V15_SIGN, #PSA_ALG_RSA_PSS, + * - #PSA_ALG_ECDSA, #PSA_ALG_DETERMINISTIC_ECDSA. + * Then you may create and use a key as follows: + * - Set the key usage field using #PSA_ALG_ANY_HASH, for example: + * ``` + * psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH); // or VERIFY + * psa_set_key_algorithm(&attributes, PSA_xxx_SIGNATURE(PSA_ALG_ANY_HASH)); + * ``` + * - Import or generate key material. + * - Call psa_sign_hash() or psa_verify_hash(), passing + * an algorithm built from `PSA_xxx_SIGNATURE` and a specific hash. Each + * call to sign or verify a message may use a different hash. + * ``` + * psa_sign_hash(handle, PSA_xxx_SIGNATURE(PSA_ALG_SHA_256), ...); + * psa_sign_hash(handle, PSA_xxx_SIGNATURE(PSA_ALG_SHA_512), ...); + * psa_sign_hash(handle, PSA_xxx_SIGNATURE(PSA_ALG_SHA3_256), ...); + * ``` + * + * This value may not be used to build other algorithms that are + * parametrized over a hash. For any valid use of this macro to build + * an algorithm \c alg, #PSA_ALG_IS_HASH_AND_SIGN(\c alg) is true. + * + * This value may not be used to build an algorithm specification to + * perform an operation. It is only valid to build policies. + */ +#define PSA_ALG_ANY_HASH ((psa_algorithm_t)0x010000ff) + +#define PSA_ALG_MAC_SUBCATEGORY_MASK ((psa_algorithm_t)0x00c00000) +#define PSA_ALG_HMAC_BASE ((psa_algorithm_t)0x02800000) +/** Macro to build an HMAC algorithm. + * + * For example, #PSA_ALG_HMAC(#PSA_ALG_SHA_256) is HMAC-SHA-256. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * + * \return The corresponding HMAC algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_HMAC(hash_alg) \ + (PSA_ALG_HMAC_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) + +#define PSA_ALG_HMAC_GET_HASH(hmac_alg) \ + (PSA_ALG_CATEGORY_HASH | ((hmac_alg) & PSA_ALG_HASH_MASK)) + +/** Whether the specified algorithm is an HMAC algorithm. + * + * HMAC is a family of MAC algorithms that are based on a hash function. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is an HMAC algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_HMAC(alg) \ + (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_MAC_SUBCATEGORY_MASK)) == \ + PSA_ALG_HMAC_BASE) + +/* In the encoding of a MAC algorithm, the bits corresponding to + * PSA_ALG_MAC_TRUNCATION_MASK encode the length to which the MAC is + * truncated. As an exception, the value 0 means the untruncated algorithm, + * whatever its length is. The length is encoded in 6 bits, so it can + * reach up to 63; the largest MAC is 64 bytes so its trivial truncation + * to full length is correctly encoded as 0 and any non-trivial truncation + * is correctly encoded as a value between 1 and 63. */ +#define PSA_ALG_MAC_TRUNCATION_MASK ((psa_algorithm_t)0x00003f00) +#define PSA_MAC_TRUNCATION_OFFSET 8 + +/** Macro to build a truncated MAC algorithm. + * + * A truncated MAC algorithm is identical to the corresponding MAC + * algorithm except that the MAC value for the truncated algorithm + * consists of only the first \p mac_length bytes of the MAC value + * for the untruncated algorithm. + * + * \note This macro may allow constructing algorithm identifiers that + * are not valid, either because the specified length is larger + * than the untruncated MAC or because the specified length is + * smaller than permitted by the implementation. + * + * \note It is implementation-defined whether a truncated MAC that + * is truncated to the same length as the MAC of the untruncated + * algorithm is considered identical to the untruncated algorithm + * for policy comparison purposes. + * + * \param mac_alg A MAC algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p alg) + * is true). This may be a truncated or untruncated + * MAC algorithm. + * \param mac_length Desired length of the truncated MAC in bytes. + * This must be at most the full length of the MAC + * and must be at least an implementation-specified + * minimum. The implementation-specified minimum + * shall not be zero. + * + * \return The corresponding MAC algorithm with the specified + * length. + * \return Unspecified if \p alg is not a supported + * MAC algorithm or if \p mac_length is too small or + * too large for the specified MAC algorithm. + */ +#define PSA_ALG_TRUNCATED_MAC(mac_alg, mac_length) \ + (((mac_alg) & ~PSA_ALG_MAC_TRUNCATION_MASK) | \ + ((mac_length) << PSA_MAC_TRUNCATION_OFFSET & PSA_ALG_MAC_TRUNCATION_MASK)) + +/** Macro to build the base MAC algorithm corresponding to a truncated + * MAC algorithm. + * + * \param mac_alg A MAC algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p alg) + * is true). This may be a truncated or untruncated + * MAC algorithm. + * + * \return The corresponding base MAC algorithm. + * \return Unspecified if \p alg is not a supported + * MAC algorithm. + */ +#define PSA_ALG_FULL_LENGTH_MAC(mac_alg) \ + ((mac_alg) & ~PSA_ALG_MAC_TRUNCATION_MASK) + +/** Length to which a MAC algorithm is truncated. + * + * \param mac_alg A MAC algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_MAC(\p alg) + * is true). + * + * \return Length of the truncated MAC in bytes. + * \return 0 if \p alg is a non-truncated MAC algorithm. + * \return Unspecified if \p alg is not a supported + * MAC algorithm. + */ +#define PSA_MAC_TRUNCATED_LENGTH(mac_alg) \ + (((mac_alg) & PSA_ALG_MAC_TRUNCATION_MASK) >> PSA_MAC_TRUNCATION_OFFSET) + +#define PSA_ALG_CIPHER_MAC_BASE ((psa_algorithm_t)0x02c00000) +/** The CBC-MAC construction over a block cipher + * + * \warning CBC-MAC is insecure in many cases. + * A more secure mode, such as #PSA_ALG_CMAC, is recommended. + */ +#define PSA_ALG_CBC_MAC ((psa_algorithm_t)0x02c00001) +/** The CMAC construction over a block cipher */ +#define PSA_ALG_CMAC ((psa_algorithm_t)0x02c00002) + +/** Whether the specified algorithm is a MAC algorithm based on a block cipher. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a MAC algorithm based on a block cipher, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) \ + (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_MAC_SUBCATEGORY_MASK)) == \ + PSA_ALG_CIPHER_MAC_BASE) + +#define PSA_ALG_CIPHER_STREAM_FLAG ((psa_algorithm_t)0x00800000) +#define PSA_ALG_CIPHER_FROM_BLOCK_FLAG ((psa_algorithm_t)0x00400000) + +/** Whether the specified algorithm is a stream cipher. + * + * A stream cipher is a symmetric cipher that encrypts or decrypts messages + * by applying a bitwise-xor with a stream of bytes that is generated + * from a key. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a stream cipher algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier or if it is not a symmetric cipher algorithm. + */ +#define PSA_ALG_IS_STREAM_CIPHER(alg) \ + (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_CIPHER_STREAM_FLAG)) == \ + (PSA_ALG_CATEGORY_CIPHER | PSA_ALG_CIPHER_STREAM_FLAG)) + +/** The ARC4 stream cipher algorithm. + */ +#define PSA_ALG_ARC4 ((psa_algorithm_t)0x04800001) + +/** The ChaCha20 stream cipher. + * + * ChaCha20 is defined in RFC 7539. + * + * The nonce size for psa_cipher_set_iv() or psa_cipher_generate_iv() + * must be 12. + * + * The initial block counter is always 0. + * + */ +#define PSA_ALG_CHACHA20 ((psa_algorithm_t)0x04800005) + +/** The CTR stream cipher mode. + * + * CTR is a stream cipher which is built from a block cipher. + * The underlying block cipher is determined by the key type. + * For example, to use AES-128-CTR, use this algorithm with + * a key of type #PSA_KEY_TYPE_AES and a length of 128 bits (16 bytes). + */ +#define PSA_ALG_CTR ((psa_algorithm_t)0x04c00001) + +/** The CFB stream cipher mode. + * + * The underlying block cipher is determined by the key type. + */ +#define PSA_ALG_CFB ((psa_algorithm_t)0x04c00002) + +/** The OFB stream cipher mode. + * + * The underlying block cipher is determined by the key type. + */ +#define PSA_ALG_OFB ((psa_algorithm_t)0x04c00003) + +/** The XTS cipher mode. + * + * XTS is a cipher mode which is built from a block cipher. It requires at + * least one full block of input, but beyond this minimum the input + * does not need to be a whole number of blocks. + */ +#define PSA_ALG_XTS ((psa_algorithm_t)0x044000ff) + +/** The CBC block cipher chaining mode, with no padding. + * + * The underlying block cipher is determined by the key type. + * + * This symmetric cipher mode can only be used with messages whose lengths + * are whole number of blocks for the chosen block cipher. + */ +#define PSA_ALG_CBC_NO_PADDING ((psa_algorithm_t)0x04600100) + +/** The CBC block cipher chaining mode with PKCS#7 padding. + * + * The underlying block cipher is determined by the key type. + * + * This is the padding method defined by PKCS#7 (RFC 2315) §10.3. + */ +#define PSA_ALG_CBC_PKCS7 ((psa_algorithm_t)0x04600101) + +#define PSA_ALG_AEAD_FROM_BLOCK_FLAG ((psa_algorithm_t)0x00400000) + +/** Whether the specified algorithm is an AEAD mode on a block cipher. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is an AEAD algorithm which is an AEAD mode based on + * a block cipher, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(alg) \ + (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_AEAD_FROM_BLOCK_FLAG)) == \ + (PSA_ALG_CATEGORY_AEAD | PSA_ALG_AEAD_FROM_BLOCK_FLAG)) + +/** The CCM authenticated encryption algorithm. + * + * The underlying block cipher is determined by the key type. + */ +#define PSA_ALG_CCM ((psa_algorithm_t)0x06401001) + +/** The GCM authenticated encryption algorithm. + * + * The underlying block cipher is determined by the key type. + */ +#define PSA_ALG_GCM ((psa_algorithm_t)0x06401002) + +/** The Chacha20-Poly1305 AEAD algorithm. + * + * The ChaCha20_Poly1305 construction is defined in RFC 7539. + * + * Implementations must support 12-byte nonces, may support 8-byte nonces, + * and should reject other sizes. + * + * Implementations must support 16-byte tags and should reject other sizes. + */ +#define PSA_ALG_CHACHA20_POLY1305 ((psa_algorithm_t)0x06001005) + +/* In the encoding of a AEAD algorithm, the bits corresponding to + * PSA_ALG_AEAD_TAG_LENGTH_MASK encode the length of the AEAD tag. + * The constants for default lengths follow this encoding. + */ +#define PSA_ALG_AEAD_TAG_LENGTH_MASK ((psa_algorithm_t)0x00003f00) +#define PSA_AEAD_TAG_LENGTH_OFFSET 8 + +/** Macro to build a shortened AEAD algorithm. + * + * A shortened AEAD algorithm is similar to the corresponding AEAD + * algorithm, but has an authentication tag that consists of fewer bytes. + * Depending on the algorithm, the tag length may affect the calculation + * of the ciphertext. + * + * \param aead_alg An AEAD algorithm identifier (value of type + * #psa_algorithm_t such that #PSA_ALG_IS_AEAD(\p alg) + * is true). + * \param tag_length Desired length of the authentication tag in bytes. + * + * \return The corresponding AEAD algorithm with the specified + * length. + * \return Unspecified if \p alg is not a supported + * AEAD algorithm or if \p tag_length is not valid + * for the specified AEAD algorithm. + */ +#define PSA_ALG_AEAD_WITH_TAG_LENGTH(aead_alg, tag_length) \ + (((aead_alg) & ~PSA_ALG_AEAD_TAG_LENGTH_MASK) | \ + ((tag_length) << PSA_AEAD_TAG_LENGTH_OFFSET & \ + PSA_ALG_AEAD_TAG_LENGTH_MASK)) + +/** Calculate the corresponding AEAD algorithm with the default tag length. + * + * \param aead_alg An AEAD algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_AEAD(\p alg) is true). + * + * \return The corresponding AEAD algorithm with the default + * tag length for that algorithm. + */ +#define PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH(aead_alg) \ + ( \ + PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH_CASE(aead_alg, PSA_ALG_CCM) \ + PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH_CASE(aead_alg, PSA_ALG_GCM) \ + PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH_CASE(aead_alg, PSA_ALG_CHACHA20_POLY1305) \ + 0) +#define PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH_CASE(aead_alg, ref) \ + PSA_ALG_AEAD_WITH_TAG_LENGTH(aead_alg, 0) == \ + PSA_ALG_AEAD_WITH_TAG_LENGTH(ref, 0) ? \ + ref : + +#define PSA_ALG_RSA_PKCS1V15_SIGN_BASE ((psa_algorithm_t)0x10020000) +/** RSA PKCS#1 v1.5 signature with hashing. + * + * This is the signature scheme defined by RFC 8017 + * (PKCS#1: RSA Cryptography Specifications) under the name + * RSASSA-PKCS1-v1_5. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding RSA PKCS#1 v1.5 signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_RSA_PKCS1V15_SIGN(hash_alg) \ + (PSA_ALG_RSA_PKCS1V15_SIGN_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +/** Raw PKCS#1 v1.5 signature. + * + * The input to this algorithm is the DigestInfo structure used by + * RFC 8017 (PKCS#1: RSA Cryptography Specifications), §9.2 + * steps 3–6. + */ +#define PSA_ALG_RSA_PKCS1V15_SIGN_RAW PSA_ALG_RSA_PKCS1V15_SIGN_BASE +#define PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_PKCS1V15_SIGN_BASE) + +#define PSA_ALG_RSA_PSS_BASE ((psa_algorithm_t)0x10030000) +/** RSA PSS signature with hashing. + * + * This is the signature scheme defined by RFC 8017 + * (PKCS#1: RSA Cryptography Specifications) under the name + * RSASSA-PSS, with the message generation function MGF1, and with + * a salt length equal to the length of the hash. The specified + * hash algorithm is used to hash the input message, to create the + * salted hash, and for the mask generation. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding RSA PSS signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_RSA_PSS(hash_alg) \ + (PSA_ALG_RSA_PSS_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +#define PSA_ALG_IS_RSA_PSS(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_PSS_BASE) + +#define PSA_ALG_ECDSA_BASE ((psa_algorithm_t)0x10060000) +/** ECDSA signature with hashing. + * + * This is the ECDSA signature scheme defined by ANSI X9.62, + * with a random per-message secret number (*k*). + * + * The representation of the signature as a byte string consists of + * the concatentation of the signature values *r* and *s*. Each of + * *r* and *s* is encoded as an *N*-octet string, where *N* is the length + * of the base point of the curve in octets. Each value is represented + * in big-endian order (most significant octet first). + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding ECDSA signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_ECDSA(hash_alg) \ + (PSA_ALG_ECDSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +/** ECDSA signature without hashing. + * + * This is the same signature scheme as #PSA_ALG_ECDSA(), but + * without specifying a hash algorithm. This algorithm may only be + * used to sign or verify a sequence of bytes that should be an + * already-calculated hash. Note that the input is padded with + * zeros on the left or truncated on the left as required to fit + * the curve size. + */ +#define PSA_ALG_ECDSA_ANY PSA_ALG_ECDSA_BASE +#define PSA_ALG_DETERMINISTIC_ECDSA_BASE ((psa_algorithm_t)0x10070000) +/** Deterministic ECDSA signature with hashing. + * + * This is the deterministic ECDSA signature scheme defined by RFC 6979. + * + * The representation of a signature is the same as with #PSA_ALG_ECDSA(). + * + * Note that when this algorithm is used for verification, signatures + * made with randomized ECDSA (#PSA_ALG_ECDSA(\p hash_alg)) with the + * same private key are accepted. In other words, + * #PSA_ALG_DETERMINISTIC_ECDSA(\p hash_alg) differs from + * #PSA_ALG_ECDSA(\p hash_alg) only for signature, not for verification. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * This includes #PSA_ALG_ANY_HASH + * when specifying the algorithm in a usage policy. + * + * \return The corresponding deterministic ECDSA signature + * algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_DETERMINISTIC_ECDSA(hash_alg) \ + (PSA_ALG_DETERMINISTIC_ECDSA_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +#define PSA_ALG_ECDSA_DETERMINISTIC_FLAG ((psa_algorithm_t)0x00010000) +#define PSA_ALG_IS_ECDSA(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK & ~PSA_ALG_ECDSA_DETERMINISTIC_FLAG) == \ + PSA_ALG_ECDSA_BASE) +#define PSA_ALG_ECDSA_IS_DETERMINISTIC(alg) \ + (((alg) & PSA_ALG_ECDSA_DETERMINISTIC_FLAG) != 0) +#define PSA_ALG_IS_DETERMINISTIC_ECDSA(alg) \ + (PSA_ALG_IS_ECDSA(alg) && PSA_ALG_ECDSA_IS_DETERMINISTIC(alg)) +#define PSA_ALG_IS_RANDOMIZED_ECDSA(alg) \ + (PSA_ALG_IS_ECDSA(alg) && !PSA_ALG_ECDSA_IS_DETERMINISTIC(alg)) + +/** Whether the specified algorithm is a hash-and-sign algorithm. + * + * Hash-and-sign algorithms are public-key signature algorithms structured + * in two parts: first the calculation of a hash in a way that does not + * depend on the key, then the calculation of a signature from the + * hash value and the key. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a hash-and-sign algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_HASH_AND_SIGN(alg) \ + (PSA_ALG_IS_RSA_PSS(alg) || PSA_ALG_IS_RSA_PKCS1V15_SIGN(alg) || \ + PSA_ALG_IS_ECDSA(alg)) + +/** Get the hash used by a hash-and-sign signature algorithm. + * + * A hash-and-sign algorithm is a signature algorithm which is + * composed of two phases: first a hashing phase which does not use + * the key and produces a hash of the input message, then a signing + * phase which only uses the hash and the key and not the message + * itself. + * + * \param alg A signature algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_SIGN(\p alg) is true). + * + * \return The underlying hash algorithm if \p alg is a hash-and-sign + * algorithm. + * \return 0 if \p alg is a signature algorithm that does not + * follow the hash-and-sign structure. + * \return Unspecified if \p alg is not a signature algorithm or + * if it is not supported by the implementation. + */ +#define PSA_ALG_SIGN_GET_HASH(alg) \ + (PSA_ALG_IS_HASH_AND_SIGN(alg) ? \ + ((alg) & PSA_ALG_HASH_MASK) == 0 ? /*"raw" algorithm*/ 0 : \ + ((alg) & PSA_ALG_HASH_MASK) | PSA_ALG_CATEGORY_HASH : \ + 0) + +/** RSA PKCS#1 v1.5 encryption. + */ +#define PSA_ALG_RSA_PKCS1V15_CRYPT ((psa_algorithm_t)0x12020000) + +#define PSA_ALG_RSA_OAEP_BASE ((psa_algorithm_t)0x12030000) +/** RSA OAEP encryption. + * + * This is the encryption scheme defined by RFC 8017 + * (PKCS#1: RSA Cryptography Specifications) under the name + * RSAES-OAEP, with the message generation function MGF1. + * + * \param hash_alg The hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true) to use + * for MGF1. + * + * \return The corresponding RSA OAEP signature algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_RSA_OAEP(hash_alg) \ + (PSA_ALG_RSA_OAEP_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +#define PSA_ALG_IS_RSA_OAEP(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_RSA_OAEP_BASE) +#define PSA_ALG_RSA_OAEP_GET_HASH(alg) \ + (PSA_ALG_IS_RSA_OAEP(alg) ? \ + ((alg) & PSA_ALG_HASH_MASK) | PSA_ALG_CATEGORY_HASH : \ + 0) + +#define PSA_ALG_HKDF_BASE ((psa_algorithm_t)0x20000100) +/** Macro to build an HKDF algorithm. + * + * For example, `PSA_ALG_HKDF(PSA_ALG_SHA256)` is HKDF using HMAC-SHA-256. + * + * This key derivation algorithm uses the following inputs: + * - #PSA_KEY_DERIVATION_INPUT_SALT is the salt used in the "extract" step. + * It is optional; if omitted, the derivation uses an empty salt. + * - #PSA_KEY_DERIVATION_INPUT_SECRET is the secret key used in the "extract" step. + * - #PSA_KEY_DERIVATION_INPUT_INFO is the info string used in the "expand" step. + * You must pass #PSA_KEY_DERIVATION_INPUT_SALT before #PSA_KEY_DERIVATION_INPUT_SECRET. + * You may pass #PSA_KEY_DERIVATION_INPUT_INFO at any time after steup and before + * starting to generate output. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * + * \return The corresponding HKDF algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_HKDF(hash_alg) \ + (PSA_ALG_HKDF_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) +/** Whether the specified algorithm is an HKDF algorithm. + * + * HKDF is a family of key derivation algorithms that are based on a hash + * function and the HMAC construction. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is an HKDF algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key derivation algorithm identifier. + */ +#define PSA_ALG_IS_HKDF(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_HKDF_BASE) +#define PSA_ALG_HKDF_GET_HASH(hkdf_alg) \ + (PSA_ALG_CATEGORY_HASH | ((hkdf_alg) & PSA_ALG_HASH_MASK)) + +#define PSA_ALG_TLS12_PRF_BASE ((psa_algorithm_t)0x20000200) +/** Macro to build a TLS-1.2 PRF algorithm. + * + * TLS 1.2 uses a custom pseudorandom function (PRF) for key schedule, + * specified in Section 5 of RFC 5246. It is based on HMAC and can be + * used with either SHA-256 or SHA-384. + * + * This key derivation algorithm uses the following inputs, which must be + * passed in the order given here: + * - #PSA_KEY_DERIVATION_INPUT_SEED is the seed. + * - #PSA_KEY_DERIVATION_INPUT_SECRET is the secret key. + * - #PSA_KEY_DERIVATION_INPUT_LABEL is the label. + * + * For the application to TLS-1.2 key expansion, the seed is the + * concatenation of ServerHello.Random + ClientHello.Random, + * and the label is "key expansion". + * + * For example, `PSA_ALG_TLS12_PRF(PSA_ALG_SHA256)` represents the + * TLS 1.2 PRF using HMAC-SHA-256. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * + * \return The corresponding TLS-1.2 PRF algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_TLS12_PRF(hash_alg) \ + (PSA_ALG_TLS12_PRF_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) + +/** Whether the specified algorithm is a TLS-1.2 PRF algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is a TLS-1.2 PRF algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key derivation algorithm identifier. + */ +#define PSA_ALG_IS_TLS12_PRF(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_TLS12_PRF_BASE) +#define PSA_ALG_TLS12_PRF_GET_HASH(hkdf_alg) \ + (PSA_ALG_CATEGORY_HASH | ((hkdf_alg) & PSA_ALG_HASH_MASK)) + +#define PSA_ALG_TLS12_PSK_TO_MS_BASE ((psa_algorithm_t)0x20000300) +/** Macro to build a TLS-1.2 PSK-to-MasterSecret algorithm. + * + * In a pure-PSK handshake in TLS 1.2, the master secret is derived + * from the PreSharedKey (PSK) through the application of padding + * (RFC 4279, Section 2) and the TLS-1.2 PRF (RFC 5246, Section 5). + * The latter is based on HMAC and can be used with either SHA-256 + * or SHA-384. + * + * This key derivation algorithm uses the following inputs, which must be + * passed in the order given here: + * - #PSA_KEY_DERIVATION_INPUT_SEED is the seed. + * - #PSA_KEY_DERIVATION_INPUT_SECRET is the secret key. + * - #PSA_KEY_DERIVATION_INPUT_LABEL is the label. + * + * For the application to TLS-1.2, the seed (which is + * forwarded to the TLS-1.2 PRF) is the concatenation of the + * ClientHello.Random + ServerHello.Random, + * and the label is "master secret" or "extended master secret". + * + * For example, `PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA256)` represents the + * TLS-1.2 PSK to MasterSecret derivation PRF using HMAC-SHA-256. + * + * \param hash_alg A hash algorithm (\c PSA_ALG_XXX value such that + * #PSA_ALG_IS_HASH(\p hash_alg) is true). + * + * \return The corresponding TLS-1.2 PSK to MS algorithm. + * \return Unspecified if \p hash_alg is not a supported + * hash algorithm. + */ +#define PSA_ALG_TLS12_PSK_TO_MS(hash_alg) \ + (PSA_ALG_TLS12_PSK_TO_MS_BASE | ((hash_alg) & PSA_ALG_HASH_MASK)) + +/** Whether the specified algorithm is a TLS-1.2 PSK to MS algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is a TLS-1.2 PSK to MS algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key derivation algorithm identifier. + */ +#define PSA_ALG_IS_TLS12_PSK_TO_MS(alg) \ + (((alg) & ~PSA_ALG_HASH_MASK) == PSA_ALG_TLS12_PSK_TO_MS_BASE) +#define PSA_ALG_TLS12_PSK_TO_MS_GET_HASH(hkdf_alg) \ + (PSA_ALG_CATEGORY_HASH | ((hkdf_alg) & PSA_ALG_HASH_MASK)) + +#define PSA_ALG_KEY_DERIVATION_MASK ((psa_algorithm_t)0x0803ffff) +#define PSA_ALG_KEY_AGREEMENT_MASK ((psa_algorithm_t)0x10fc0000) + +/** Macro to build a combined algorithm that chains a key agreement with + * a key derivation. + * + * \param ka_alg A key agreement algorithm (\c PSA_ALG_XXX value such + * that #PSA_ALG_IS_KEY_AGREEMENT(\p ka_alg) is true). + * \param kdf_alg A key derivation algorithm (\c PSA_ALG_XXX value such + * that #PSA_ALG_IS_KEY_DERIVATION(\p kdf_alg) is true). + * + * \return The corresponding key agreement and derivation + * algorithm. + * \return Unspecified if \p ka_alg is not a supported + * key agreement algorithm or \p kdf_alg is not a + * supported key derivation algorithm. + */ +#define PSA_ALG_KEY_AGREEMENT(ka_alg, kdf_alg) \ + ((ka_alg) | (kdf_alg)) + +#define PSA_ALG_KEY_AGREEMENT_GET_KDF(alg) \ + (((alg) & PSA_ALG_KEY_DERIVATION_MASK) | PSA_ALG_CATEGORY_KEY_DERIVATION) + +#define PSA_ALG_KEY_AGREEMENT_GET_BASE(alg) \ + (((alg) & PSA_ALG_KEY_AGREEMENT_MASK) | PSA_ALG_CATEGORY_KEY_AGREEMENT) + +/** Whether the specified algorithm is a raw key agreement algorithm. + * + * A raw key agreement algorithm is one that does not specify + * a key derivation function. + * Usually, raw key agreement algorithms are constructed directly with + * a \c PSA_ALG_xxx macro while non-raw key agreement algorithms are + * constructed with PSA_ALG_KEY_AGREEMENT(). + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \p alg is a raw key agreement algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \p alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_RAW_KEY_AGREEMENT(alg) \ + (PSA_ALG_IS_KEY_AGREEMENT(alg) && \ + PSA_ALG_KEY_AGREEMENT_GET_KDF(alg) == PSA_ALG_CATEGORY_KEY_DERIVATION) + +#define PSA_ALG_IS_KEY_DERIVATION_OR_AGREEMENT(alg) \ + ((PSA_ALG_IS_KEY_DERIVATION(alg) || PSA_ALG_IS_KEY_AGREEMENT(alg))) + +/** The finite-field Diffie-Hellman (DH) key agreement algorithm. + * + * The shared secret produced by key agreement is + * `g^{ab}` in big-endian format. + * It is `ceiling(m / 8)` bytes long where `m` is the size of the prime `p` + * in bits. + */ +#define PSA_ALG_FFDH ((psa_algorithm_t)0x30100000) + +/** Whether the specified algorithm is a finite field Diffie-Hellman algorithm. + * + * This includes the raw finite field Diffie-Hellman algorithm as well as + * finite-field Diffie-Hellman followed by any supporter key derivation + * algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is a finite field Diffie-Hellman algorithm, 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key agreement algorithm identifier. + */ +#define PSA_ALG_IS_FFDH(alg) \ + (PSA_ALG_KEY_AGREEMENT_GET_BASE(alg) == PSA_ALG_FFDH) + +/** The elliptic curve Diffie-Hellman (ECDH) key agreement algorithm. + * + * The shared secret produced by key agreement is the x-coordinate of + * the shared secret point. It is always `ceiling(m / 8)` bytes long where + * `m` is the bit size associated with the curve, i.e. the bit size of the + * order of the curve's coordinate field. When `m` is not a multiple of 8, + * the byte containing the most significant bit of the shared secret + * is padded with zero bits. The byte order is either little-endian + * or big-endian depending on the curve type. + * + * - For Montgomery curves (curve types `PSA_ECC_CURVE_CURVEXXX`), + * the shared secret is the x-coordinate of `d_A Q_B = d_B Q_A` + * in little-endian byte order. + * The bit size is 448 for Curve448 and 255 for Curve25519. + * - For Weierstrass curves over prime fields (curve types + * `PSA_ECC_CURVE_SECPXXX` and `PSA_ECC_CURVE_BRAINPOOL_PXXX`), + * the shared secret is the x-coordinate of `d_A Q_B = d_B Q_A` + * in big-endian byte order. + * The bit size is `m = ceiling(log_2(p))` for the field `F_p`. + * - For Weierstrass curves over binary fields (curve types + * `PSA_ECC_CURVE_SECTXXX`), + * the shared secret is the x-coordinate of `d_A Q_B = d_B Q_A` + * in big-endian byte order. + * The bit size is `m` for the field `F_{2^m}`. + */ +#define PSA_ALG_ECDH ((psa_algorithm_t)0x30200000) + +/** Whether the specified algorithm is an elliptic curve Diffie-Hellman + * algorithm. + * + * This includes the raw elliptic curve Diffie-Hellman algorithm as well as + * elliptic curve Diffie-Hellman followed by any supporter key derivation + * algorithm. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is an elliptic curve Diffie-Hellman algorithm, + * 0 otherwise. + * This macro may return either 0 or 1 if \c alg is not a supported + * key agreement algorithm identifier. + */ +#define PSA_ALG_IS_ECDH(alg) \ + (PSA_ALG_KEY_AGREEMENT_GET_BASE(alg) == PSA_ALG_ECDH) + +/** Whether the specified algorithm encoding is a wildcard. + * + * Wildcard values may only be used to set the usage algorithm field in + * a policy, not to perform an operation. + * + * \param alg An algorithm identifier (value of type #psa_algorithm_t). + * + * \return 1 if \c alg is a wildcard algorithm encoding. + * \return 0 if \c alg is a non-wildcard algorithm encoding (suitable for + * an operation). + * \return This macro may return either 0 or 1 if \c alg is not a supported + * algorithm identifier. + */ +#define PSA_ALG_IS_WILDCARD(alg) \ + (PSA_ALG_IS_HASH_AND_SIGN(alg) ? \ + PSA_ALG_SIGN_GET_HASH(alg) == PSA_ALG_ANY_HASH : \ + (alg) == PSA_ALG_ANY_HASH) + +/**@}*/ + +/** \defgroup key_lifetimes Key lifetimes + * @{ + */ + +/** A volatile key only exists as long as the handle to it is not closed. + * The key material is guaranteed to be erased on a power reset. + */ +#define PSA_KEY_LIFETIME_VOLATILE ((psa_key_lifetime_t)0x00000000) + +/** The default storage area for persistent keys. + * + * A persistent key remains in storage until it is explicitly destroyed or + * until the corresponding storage area is wiped. This specification does + * not define any mechanism to wipe a storage area, but implementations may + * provide their own mechanism (for example to perform a factory reset, + * to prepare for device refurbishment, or to uninstall an application). + * + * This lifetime value is the default storage area for the calling + * application. Implementations may offer other storage areas designated + * by other lifetime values as implementation-specific extensions. + */ +#define PSA_KEY_LIFETIME_PERSISTENT ((psa_key_lifetime_t)0x00000001) + +/** The minimum value for a key identifier chosen by the application. + */ +#define PSA_KEY_ID_USER_MIN ((psa_app_key_id_t)0x00000001) +/** The maximum value for a key identifier chosen by the application. + */ +#define PSA_KEY_ID_USER_MAX ((psa_app_key_id_t)0x3fffffff) +/** The minimum value for a key identifier chosen by the implementation. + */ +#define PSA_KEY_ID_VENDOR_MIN ((psa_app_key_id_t)0x40000000) +/** The maximum value for a key identifier chosen by the implementation. + */ +#define PSA_KEY_ID_VENDOR_MAX ((psa_app_key_id_t)0x7fffffff) + +/**@}*/ + +/** \defgroup policy Key policies + * @{ + */ + +/** Whether the key may be exported. + * + * A public key or the public part of a key pair may always be exported + * regardless of the value of this permission flag. + * + * If a key does not have export permission, implementations shall not + * allow the key to be exported in plain form from the cryptoprocessor, + * whether through psa_export_key() or through a proprietary interface. + * The key may however be exportable in a wrapped form, i.e. in a form + * where it is encrypted by another key. + */ +#define PSA_KEY_USAGE_EXPORT ((psa_key_usage_t)0x00000001) + +/** Whether the key may be copied. + * + * This flag allows the use of psa_copy_key() to make a copy of the key + * with the same policy or a more restrictive policy. + * + * For lifetimes for which the key is located in a secure element which + * enforce the non-exportability of keys, copying a key outside the secure + * element also requires the usage flag #PSA_KEY_USAGE_EXPORT. + * Copying the key inside the secure element is permitted with just + * #PSA_KEY_USAGE_COPY if the secure element supports it. + * For keys with the lifetime #PSA_KEY_LIFETIME_VOLATILE or + * #PSA_KEY_LIFETIME_PERSISTENT, the usage flag #PSA_KEY_USAGE_COPY + * is sufficient to permit the copy. + */ +#define PSA_KEY_USAGE_COPY ((psa_key_usage_t)0x00000002) + +/** Whether the key may be used to encrypt a message. + * + * This flag allows the key to be used for a symmetric encryption operation, + * for an AEAD encryption-and-authentication operation, + * or for an asymmetric encryption operation, + * if otherwise permitted by the key's type and policy. + * + * For a key pair, this concerns the public key. + */ +#define PSA_KEY_USAGE_ENCRYPT ((psa_key_usage_t)0x00000100) + +/** Whether the key may be used to decrypt a message. + * + * This flag allows the key to be used for a symmetric decryption operation, + * for an AEAD decryption-and-verification operation, + * or for an asymmetric decryption operation, + * if otherwise permitted by the key's type and policy. + * + * For a key pair, this concerns the private key. + */ +#define PSA_KEY_USAGE_DECRYPT ((psa_key_usage_t)0x00000200) + +/** Whether the key may be used to sign a message. + * + * This flag allows the key to be used for a MAC calculation operation + * or for an asymmetric signature operation, + * if otherwise permitted by the key's type and policy. + * + * For a key pair, this concerns the private key. + */ +#define PSA_KEY_USAGE_SIGN_HASH ((psa_key_usage_t)0x00000400) + +/** Whether the key may be used to verify a message signature. + * + * This flag allows the key to be used for a MAC verification operation + * or for an asymmetric signature verification operation, + * if otherwise permitted by by the key's type and policy. + * + * For a key pair, this concerns the public key. + */ +#define PSA_KEY_USAGE_VERIFY_HASH ((psa_key_usage_t)0x00000800) + +/** Whether the key may be used to derive other keys. + */ +#define PSA_KEY_USAGE_DERIVE ((psa_key_usage_t)0x00001000) + +/**@}*/ + +/** \defgroup derivation Key derivation + * @{ + */ + +/** A secret input for key derivation. + * + * This should be a key of type #PSA_KEY_TYPE_DERIVE + * (passed to psa_key_derivation_input_key()) + * or the shared secret resulting from a key agreement + * (obtained via psa_key_derivation_key_agreement()). + * + * The secret can also be a direct input (passed to + * key_derivation_input_bytes()). In this case, the derivation operation + * may not be used to derive keys: the operation will only allow + * psa_key_derivation_output_bytes(), not psa_key_derivation_output_key(). + */ +#define PSA_KEY_DERIVATION_INPUT_SECRET ((psa_key_derivation_step_t)0x0101) + +/** A label for key derivation. + * + * This should be a direct input. + * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA. + */ +#define PSA_KEY_DERIVATION_INPUT_LABEL ((psa_key_derivation_step_t)0x0201) + +/** A salt for key derivation. + * + * This should be a direct input. + * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA. + */ +#define PSA_KEY_DERIVATION_INPUT_SALT ((psa_key_derivation_step_t)0x0202) + +/** An information string for key derivation. + * + * This should be a direct input. + * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA. + */ +#define PSA_KEY_DERIVATION_INPUT_INFO ((psa_key_derivation_step_t)0x0203) + +/** A seed for key derivation. + * + * This should be a direct input. + * It can also be a key of type #PSA_KEY_TYPE_RAW_DATA. + */ +#define PSA_KEY_DERIVATION_INPUT_SEED ((psa_key_derivation_step_t)0x0204) + +/**@}*/ + +#endif /* PSA_CRYPTO_VALUES_H */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/error.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/error.h new file mode 100644 index 00000000000..439dba4b702 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/error.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/** + * \file psa/error.h + * \brief Standard error codes for the SPM and RoT Services + */ + +#ifndef __PSA_ERROR_H__ +#define __PSA_ERROR_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* If #PSA_SUCCESS is already defined, it means that #psa_status_t + * is also defined in an external header, so prevent its multiple + * definition. + */ +#ifndef PSA_SUCCESS +typedef int32_t psa_status_t; +#endif + +#define PSA_SUCCESS ((psa_status_t)0) + +#define PSA_ERROR_PROGRAMMER_ERROR ((psa_status_t)-129) +#define PSA_ERROR_CONNECTION_REFUSED ((psa_status_t)-130) +#define PSA_ERROR_CONNECTION_BUSY ((psa_status_t)-131) +#define PSA_ERROR_GENERIC_ERROR ((psa_status_t)-132) +#define PSA_ERROR_NOT_PERMITTED ((psa_status_t)-133) +#define PSA_ERROR_NOT_SUPPORTED ((psa_status_t)-134) +#define PSA_ERROR_INVALID_ARGUMENT ((psa_status_t)-135) +#define PSA_ERROR_INVALID_HANDLE ((psa_status_t)-136) +#define PSA_ERROR_BAD_STATE ((psa_status_t)-137) +#define PSA_ERROR_BUFFER_TOO_SMALL ((psa_status_t)-138) +#define PSA_ERROR_ALREADY_EXISTS ((psa_status_t)-139) +#define PSA_ERROR_DOES_NOT_EXIST ((psa_status_t)-140) +#define PSA_ERROR_INSUFFICIENT_MEMORY ((psa_status_t)-141) +#define PSA_ERROR_INSUFFICIENT_STORAGE ((psa_status_t)-142) +#define PSA_ERROR_INSUFFICIENT_DATA ((psa_status_t)-143) +#define PSA_ERROR_SERVICE_FAILURE ((psa_status_t)-144) +#define PSA_ERROR_COMMUNICATION_FAILURE ((psa_status_t)-145) +#define PSA_ERROR_STORAGE_FAILURE ((psa_status_t)-146) +#define PSA_ERROR_HARDWARE_FAILURE ((psa_status_t)-147) +#define PSA_ERROR_INVALID_SIGNATURE ((psa_status_t)-149) + +#ifdef __cplusplus +} +#endif + +#endif /* __PSA_ERROR_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/initial_attestation.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/initial_attestation.h new file mode 100644 index 00000000000..c125a4d6f4e --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/initial_attestation.h @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/***************************************************************************/ +/* DRAFT UNDER REVIEW */ +/* These APIs are still evolving and are meant as a prototype for review.*/ +/* The APIs will change depending on feedback and will be firmed up */ +/* to a stable set of APIs once all the feedback has been considered. */ +/***************************************************************************/ + +#ifndef __PSA_INITIAL_ATTESTATION_H__ +#define __PSA_INITIAL_ATTESTATION_H__ + +#include +#include +#include +#include "psa/crypto.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief PSA INITIAL ATTESTATION API version + * + * Initial attestation API version is: 1.0.0 + */ +#define PSA_INITIAL_ATTEST_API_VERSION_MAJOR (1) +#define PSA_INITIAL_ATTEST_API_VERSION_MINOR (0) + +/** + * The allowed size of input challenge in bytes: 32, 48, 64 + * Challenge can be a nonce from server + * or the hash of some combined data : nonce + attested data by caller. + */ +#define PSA_INITIAL_ATTEST_CHALLENGE_SIZE_32 (32u) +#define PSA_INITIAL_ATTEST_CHALLENGE_SIZE_48 (48u) +#define PSA_INITIAL_ATTEST_CHALLENGE_SIZE_64 (64u) + +/** + * The maximum size of an attestation token that can be generated by the + * attestation service. Used to configure buffers for services that verify the + * produced tokens. + */ +#define PSA_INITIAL_ATTEST_MAX_TOKEN_SIZE (0x400) + +/** + * The list of fixed claims in the initial attestation token is still evolving, + * you can expect slight changes in the future. + * + * The initial attestation token is planned to be aligned with future version of + * Entity Attestation Token format: + * https://tools.ietf.org/html/draft-mandyam-eat-01 + * + * Current list of claims: + * - Challenge: Input object from caller. Can be a single nonce from server + * or hash of nonce and attested data. It is intended to provide + * freshness to reports and the caller has responsibility to + * arrange this. Allowed length: 32, 48, 64 bytes. The claim is + * modeled to be eventually represented by the EAT standard + * claim nonce. Until such a time as that standard exists, + * the claim will be represented by a custom claim. Value + * is encoded as byte string. + * + * - Instance ID: It represents the unique identifier of the instance. In the + * PSA definition it is a hash of the public attestation key + * of the instance. The claim is modeled to be eventually + * represented by the EAT standard claim UEID of type GUID. + * Until such a time as that standard exists, the claim will be + * represented by a custom claim Value is encoded as byte + * string. + * + * - Verification service indicator: Optional, recommended claim. It is used by + * a Relying Party to locate a validation service for the token. + * The value is a text string that can be used to locate the + * service or a URL specifying the address of the service. The + * claim is modeled to be eventually represented by the EAT + * standard claim origination. Until such a time as that + * standard exists, the claim will be represented by a custom + * claim. Value is encoded as text string. + * + * - Profile definition: Optional, recommended claim. It contains the name of + * a document that describes the 'profile' of the token, being + * a full description of the claims, their usage, verification + * and token signing. The document name may include versioning. + * Custom claim with a value encoded as text string. + * + * - Implementation ID: It represents the original implementation signer of the + * attestation key and identifies the contract between the + * report and verification. A verification service will use this + * claim to locate the details of the verification process. + * Custom claim with a value encoded as byte string. + * + * - Security lifecycle: It represents the current lifecycle state of the + * instance. Custom claim with a value encoded as integer that + * is divided to convey a major state and a minor state. The + * PSA state and implementation state are encoded as follows: + * - version[15:8] - PSA lifecycle state - major + * - version[7:0] - IMPLEMENTATION DEFINED state - minor + * Possible PSA lifecycle states: + * - Unknown (0x1000u), + * - PSA_RoT_Provisioning (0x2000u), + * - Secured (0x3000u), + * - Non_PSA_RoT_Debug(0x4000u), + * - Recoverable_PSA_RoT_Debug (0x5000u), + * - Decommissioned (0x6000u) + * + * - Client ID: The partition ID of that secure partition or non-secure + * thread who called the initial attestation API. Custom claim + * with a value encoded as a *signed* integer. Negative number + * represents non-secure caller, positive numbers represents + * secure callers, zero is invalid. + * + * - HW version: Optional claim. Globally unique number in EAN-13 format + * identifying the GDSII that went to fabrication, HW and ROM. + * It can be used to reference the security level of the PSA-ROT + * via a certification website. Custom claim with a value is + * encoded as text string. + + * - Boot seed: It represents a random value created at system boot time that + * will allow differentiation of reports from different system + * sessions. The size is 32 bytes. Custom claim with a value is + * encoded as byte string. + * + * - Software components: Recommended claim. It represents the software state + * of the system. The value of the claim is an array of CBOR map + * entries, with one entry per software component within the + * device. Each map contains multiple claims that describe + * evidence about the details of the software component. + * + * - Measurement type: Optional claim. It represents the role of the + * software component. Value is encoded as short(!) text + * string. + * + * - Measurement value: It represents a hash of the invariant software + * component in memory at start-up time. The value must be a + * cryptographic hash of 256 bits or stronger.Value is + * encoded as byte string. + * + * - Version: Optional claim. It represents the issued software version. + * Value is encoded as text string. + * + * - Signer ID: It represents the hash of a signing authority public key. + * Value is encoded as byte string. + * + * - Measurement description: Optional claim. It represents the way in which + * the measurement value of the software component is + * computed. Value is encoded as text string containing an + * abbreviated description (name) of the measurement method. + * + * - No software measurements: In the event that the implementation does not + * contain any software measurements then the software + * components claim above can be omitted but instead + * it is mandatory to include this claim to indicate this is a + * deliberate state. Custom claim a value is encoded as unsigned + * integer set to 1. + */ + +/** + * \brief Get initial attestation token + * + * \param[in] auth_challenge Pointer to buffer where challenge input is + * stored. Nonce and / or hash of attested data. + * Must be always + * \ref PSA_INITIAL_ATTEST_TOKEN_SIZE bytes + * long. + * \param[in] challenge_size Size of challenge object in bytes. + * \param[out] token_buf Pointer to the buffer where attestation token + * will be stored. + * \param[in] token_buf_size Size of allocated buffer for token, in bytes. + * \param[out] token_size Size of the token that has been returned, in + * bytes. + * + * \return Returns error code as specified in \ref psa_status_t + */ +psa_status_t +psa_initial_attest_get_token(const uint8_t *auth_challenge, + size_t challenge_size, + uint8_t *token_buf, + size_t token_buf_size, + size_t *token_size); + +/** + * \brief Get the exact size of initial attestation token in bytes. + * + * It just returns with the size of the IAT token. It can be used if the caller + * dynamically allocates memory for the token buffer. + * + * \param[in] challenge_size Size of challenge object in bytes. This must be + * a supported challenge size (as above). + * \param[out] token_size Size of the token in bytes, which is created by + * initial attestation service. + * + * \return Returns error code as specified in \ref psa_status_t + */ +psa_status_t +psa_initial_attest_get_token_size(size_t challenge_size, + size_t *token_size); + +/** + * \brief Get the initial attestation public key. + * + * \param[out] public_key Pointer to the buffer where the public key + * will be stored. + * \param[in] key_buf_size Size of allocated buffer for key, in bytes. + * \param[out] public_key_len Size of public key in bytes. + * \param[out] public_key_curve Type of the elliptic curve which the key + * belongs to. + * + * \note Currently only the ECDSA P-256 over SHA-256 algorithm is supported. + * + * \return Returns error code as specified in \ref psa_status_t + */ +psa_status_t +tfm_initial_attest_get_public_key(uint8_t *public_key, + size_t public_key_buf_size, + size_t *public_key_len, + psa_ecc_curve_t *elliptic_curve_type); + +#ifdef __cplusplus +} +#endif + +#endif /* __PSA_INITIAL_ATTESTATION_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/internal_trusted_storage.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/internal_trusted_storage.h new file mode 100644 index 00000000000..3920bc98259 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/internal_trusted_storage.h @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/** This file describes the PSA Internal Trusted Storage API +*/ + +#ifndef PSA_INTERNAL_TRUSTED_STORAGE_H +#define PSA_INTERNAL_TRUSTED_STORAGE_H + +#include +#include + +#include "psa/error.h" +#include "psa/storage_common.h" + +#ifdef __cplusplus +extern "C" { +#endif +#define PSA_ITS_API_VERSION_MAJOR 1 /**< The major version number of the + * PSA ITS API + */ +#define PSA_ITS_API_VERSION_MINOR 0 /**< The minor version number of the + * PSA ITS API + */ +// This version of the header file is associated with 1.0 final release. + +/** + * \brief Create a new, or modify an existing, uid/value pair + * + * Stores data in the internal storage. + * + * \param[in] uid The identifier for the data + * \param[in] data_length The size in bytes of the data in `p_data` + * \param[in] p_data A buffer containing the data + * \param[in] create_flags The flags that the data will be stored with + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The operation completed successfully + * \retval PSA_ERROR_NOT_PERMITTED The operation failed because the + * provided `uid` value was already + * created with + * PSA_STORAGE_FLAG_WRITE_ONCE + * \retval PSA_ERROR_NOT_SUPPORTED The operation failed because one or + * more of the flags provided in + * `create_flags` is not supported or is + * not valid + * \retval PSA_ERROR_INSUFFICIENT_STORAGE The operation failed because there + * was insufficient space on the + * storage medium + * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the + * physical storage has failed (Fatal + * error) + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one + * of the provided pointers(`p_data`) + * is invalid, for example is `NULL` or + * references memory the caller cannot + * access + */ +psa_status_t psa_its_set(psa_storage_uid_t uid, + size_t data_length, + const void *p_data, + psa_storage_create_flags_t create_flags); + +/** + * \brief Retrieve data associated with a provided UID + * + * Retrieves up to `data_size` bytes of the data associated with `uid`, starting + * at `data_offset` bytes from the beginning of the data. Upon successful + * completion, the data will be placed in the `p_data` buffer, which must be at + * least `data_size` bytes in size. The length of the data returned will be in + * `p_data_length`. If `data_size` is 0, the contents of `p_data_length` will + * be set to zero. + * + * \param[in] uid The uid value + * \param[in] data_offset The starting offset of the data requested + * \param[in] data_size The amount of data requested + * \param[out] p_data On success, the buffer where the data will + * be placed + * \param[out] p_data_length On success, this will contain size of the data + * placed in `p_data` + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The operation completed successfully + * \retval PSA_ERROR_DOES_NOT_EXIST The operation failed because the + * provided `uid` value was not found in + * the storage + * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the + * physical storage has failed (Fatal + * error) + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one of the + * provided arguments (`p_data`, + * `p_data_length`) is invalid, for example + * is `NULL` or references memory the + * caller cannot access. In addition, this + * can also happen if `data_offset` is + * larger than the size of the data + * associated with `uid` + */ +psa_status_t psa_its_get(psa_storage_uid_t uid, + size_t data_offset, + size_t data_size, + void *p_data, + size_t *p_data_length); + +/** + * \brief Retrieve the metadata about the provided uid + * + * Retrieves the metadata stored for a given `uid` as a `psa_storage_info_t` + * structure. + * + * \param[in] uid The `uid` value + * \param[out] p_info A pointer to the `psa_storage_info_t` struct that will + * be populated with the metadata + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The operation completed successfully + * \retval PSA_ERROR_DOES_NOT_EXIST The operation failed because the provided + * uid value was not found in the storage + * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the physical + * storage has failed (Fatal error) + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one of the + * provided pointers(`p_info`) + * is invalid, for example is `NULL` or + * references memory the caller cannot + * access + */ +psa_status_t psa_its_get_info(psa_storage_uid_t uid, + struct psa_storage_info_t *p_info); + +/** + * \brief Remove the provided uid and its associated data from the storage + * + * Deletes the data from internal storage. + * + * \param[in] uid The `uid` value + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The operation completed successfully + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one or more + * of the given arguments were invalid (null + * pointer, wrong flags and so on) + * \retval PSA_ERROR_DOES_NOT_EXIST The operation failed because the provided + * uid value was not found in the storage + * \retval PSA_ERROR_NOT_PERMITTED The operation failed because the provided + * uid value was created with + * PSA_STORAGE_FLAG_WRITE_ONCE + * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the physical + * storage has failed (Fatal error) + */ +psa_status_t psa_its_remove(psa_storage_uid_t uid); + +#ifdef __cplusplus +} +#endif + +#endif // PSA_INTERNAL_TRUSTED_STORAGE_H diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/protected_storage.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/protected_storage.h new file mode 100644 index 00000000000..e76205c4f14 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/protected_storage.h @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/* This file describes the PSA Protected Storage API */ + +#ifndef PSA_PROTECTED_STORAGE_H +#define PSA_PROTECTED_STORAGE_H + +#include +#include + +#include "psa/error.h" +#include "psa/storage_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief PSA_PS_API_VERSION version + * + * Major and minor PSA_PS_API_VERSION numbers + */ +#define PSA_PS_API_VERSION_MAJOR 1 +#define PSA_PS_API_VERSION_MINOR 0 + +// This version of the header file is associated with 1.0 final release + +/** + * \brief Create a new, or modify an existing, uid/value pair + * + * Stores data in the protected storage. + * + * \param[in] uid The identifier for the data + * \param[in] data_length The size in bytes of the data in `p_data` + * \param[in] p_data A buffer containing the data + * \param[in] create_flags The flags that the data will be stored with + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The operation completed successfully + * \retval PSA_ERROR_NOT_PERMITTED The operation failed because the + * provided `uid` value was already + * created with + * PSA_STORAGE_FLAG_WRITE_ONCE + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one + * of the provided pointers(`p_data`) + * is invalid, for example is `NULL` or + * references memory the caller cannot + * access + * \retval PSA_ERROR_NOT_SUPPORTED The operation failed because one or + * more of the flags provided in + * `create_flags` is not supported or is + * not valid + * \retval PSA_ERROR_INSUFFICIENT_STORAGE The operation failed because there + * was insufficient space on the + * storage medium + * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the + * physical storage has failed (Fatal + * error) + * \retval PSA_ERROR_GENERIC_ERROR The operation failed because of an + * unspecified internal failure + */ +psa_status_t psa_ps_set(psa_storage_uid_t uid, + size_t data_length, + const void *p_data, + psa_storage_create_flags_t create_flags); + +/** + * \brief Retrieve data associated with a provided uid + * + * Retrieves up to `data_size` bytes of the data associated with `uid`, starting + * at `data_offset` bytes from the beginning of the data. Upon successful + * completion, the data will be placed in the `p_data` buffer, which must be at + * least `data_size` bytes in size. The length of the data returned will be in + * `p_data_length`. If `data_size` is 0, the contents of `p_data_length` will + * be set to zero. + * + * \param[in] uid The uid value + * \param[in] data_offset The starting offset of the data requested + * \param[in] data_size The amount of data requested + * \param[out] p_data On success, the buffer where the data will + * be placed + * \param[out] p_data_length On success, this will contain size of the data + * placed in `p_data` + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The operation completed successfully + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one of the + * provided arguments (`p_data`, + * `p_data_length`) is invalid, for example + * is `NULL` or references memory the + * caller cannot access. In addition, this + * can also happen if `data_offset` is + * larger than the size of the data + * associated with `uid` + * \retval PSA_ERROR_DOES_NOT_EXIST The operation failed because the + * provided `uid` value was not found in + * the storage + * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the + * physical storage has failed (Fatal + * error) + * \retval PSA_ERROR_GENERIC_ERROR The operation failed because of an + * unspecified internal failure + * \retval PSA_ERROR_DATA_CORRUPT The operation failed because the data + * associated with the UID was corrupt + * \retval PSA_ERROR_INVALID_SIGNATURE The operation failed because the data + * associated with the UID failed + * authentication + */ +psa_status_t psa_ps_get(psa_storage_uid_t uid, + size_t data_offset, + size_t data_size, + void *p_data, + size_t *p_data_length); + +/** + * \brief Retrieve the metadata about the provided uid + * + * Retrieves the metadata stored for a given `uid` + * + * \param[in] uid The `uid` value + * \param[out] p_info A pointer to the `psa_storage_info_t` struct that will + * be populated with the metadata + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The operation completed successfully + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one of the + * provided pointers(`p_info`) + * is invalid, for example is `NULL` or + * references memory the caller cannot + * access + * \retval PSA_ERROR_DOES_NOT_EXIST The operation failed because the provided + * uid value was not found in the storage + * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the physical + * storage has failed (Fatal error) + * \retval PSA_ERROR_GENERIC_ERROR The operation failed because of an + * unspecified internal failure + * \retval PSA_ERROR_DATA_CORRUPT The operation failed because the data + * associated with the UID was corrupt + */ +psa_status_t psa_ps_get_info(psa_storage_uid_t uid, + struct psa_storage_info_t *p_info); + +/** + * \brief Remove the provided uid and its associated data from the storage + * + * Removes previously stored data and any associated metadata, + * including rollback protection data. + * + * \param[in] uid The `uid` value + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The operation completed successfully + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one or more + * of the given arguments were invalid (null + * pointer, wrong flags and so on) + * \retval PSA_ERROR_DOES_NOT_EXIST The operation failed because the provided + * uid value was not found in the storage + * \retval PSA_ERROR_NOT_PERMITTED The operation failed because the provided + * uid value was created with + * PSA_STORAGE_FLAG_WRITE_ONCE + * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the physical + * storage has failed (Fatal error) + * \retval PSA_ERROR_GENERIC_ERROR The operation failed because of an + * unspecified internal failure + */ +psa_status_t psa_ps_remove(psa_storage_uid_t uid); + +/** + * \brief Reserves storage for the specified uid + * + * Upon success, the capacity of the storage will be capacity, and the size + * will be 0. It is only necessary to call this function for assets that will + * be written with the psa_ps_set_extended function. If only the psa_ps_set + * function is needed, calls to this function are redundant. + * + * \param[in] uid The `uid` value + * \param[in] capacity The capacity to be allocated in bytes + * \param[in] create_flags Flags indicating properties of storage + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The operation completed successfully + * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the + * physical storage has failed + * (Fatal error) + * \retval PSA_ERROR_INSUFFICIENT_STORAGE The operation failed because the + * capacity is bigger than the current + * available space + * \retval PSA_ERROR_NOT_SUPPORTED The operation failed because the + * function is not implemented or one + * or more create_flags are not + * supported. + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because uid was + * 0 or create_flags specified flags + * that are not defined in the API. + * \retval PSA_ERROR_GENERIC_ERROR The operation failed due to an + * unspecified error + * \retval PSA_ERROR_ALREADY_EXISTS Storage for the specified uid + * already exists + */ +psa_status_t psa_ps_create(psa_storage_uid_t uid, + size_t capacity, + psa_storage_create_flags_t create_flags); + +/** + * \brief Sets partial data into an asset + * + * Before calling this function, the storage must have been reserved with a call + * to psa_ps_create. It can also be used to overwrite data in an asset that was + * created with a call to psa_ps_set. Calling this function with data_length = 0 + * is permitted, which will make no change to the stored data.This function can + * overwrite existing data and/or extend it up to the capacity for the uid + * specified in psa_ps_create, but cannot create gaps. + * + * That is, it has preconditions: + * - data_offset <= size + * - data_offset + data_length <= capacity + * and postconditions: + * - size = max(size, data_offset + data_length) + * - capacity unchanged. + * + * \param[in] uid The `uid` value + * \param[in] data_offset Offset within the asset to start the write + * \param[in] data_length The size in bytes of the data in p_data to write + * \param[in] p_data Pointer to a buffer which contains the data to write + * + * \return A status indicating the success/failure of the operation + * + * \retval PSA_SUCCESS The asset exists, the input parameters + * are correct and the data is correctly + * written in the physical storage. + * \retval PSA_ERROR_STORAGE_FAILURE The data was not written correctly in + * the physical storage + * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one or more + * of the preconditions listed above + * regarding data_offset, size, or + * data_length was violated. + * \retval PSA_ERROR_DOES_NOT_EXIST The specified uid was not found + * \retval PSA_ERROR_NOT_SUPPORTED The implementation of the API does not + * support this function + * \retval PSA_ERROR_GENERIC_ERROR The operation failed due to an + * unspecified error + * \retval PSA_ERROR_DATA_CORRUPT The operation failed because the + * existing data has been corrupted. + * \retval PSA_ERROR_INVALID_SIGNATURE The operation failed because the + * existing data failed authentication + * (MAC check failed). + * \retval PSA_ERROR_NOT_PERMITTED The operation failed because it was + * attempted on an asset which was written + * with the flag + * PSA_STORAGE_FLAG_WRITE_ONCE + */ +psa_status_t psa_ps_set_extended(psa_storage_uid_t uid, + size_t data_offset, + size_t data_length, + const void *p_data); + +/** + * \brief Lists optional features. + * + * \return A bitmask with flags set for all of + * the optional features supported by the + * implementation.Currently defined flags + * are limited to + * PSA_STORAGE_SUPPORT_SET_EXTENDED + */ +uint32_t psa_ps_get_support(void); + +#ifdef __cplusplus +} +#endif + +#endif /* PSA_PROTECTED_STORAGE_H */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/storage_common.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/storage_common.h new file mode 100644 index 00000000000..3f901c5bf91 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa/storage_common.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/* This file includes common definitions for PSA storage +*/ + +#ifndef PSA_STORAGE_COMMON_H +#define PSA_STORAGE_COMMON_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef uint32_t psa_storage_create_flags_t; + +typedef uint64_t psa_storage_uid_t; + +/* Flags */ + +#define PSA_STORAGE_FLAG_NONE 0u +#define PSA_STORAGE_FLAG_WRITE_ONCE (1u << 0) +#define PSA_STORAGE_FLAG_NO_CONFIDENTIALITY (1u << 1) +#define PSA_STORAGE_FLAG_NO_REPLAY_PROTECTION (1u << 2) + +/* A container for metadata associated with a specific uid */ + +struct psa_storage_info_t { + size_t capacity; + size_t size; + psa_storage_create_flags_t flags; +}; + +#define PSA_STORAGE_SUPPORT_SET_EXTENDED (1u << 0) + +#define PSA_ERROR_INVALID_SIGNATURE ((psa_status_t)-149) +#define PSA_ERROR_DATA_CORRUPT ((psa_status_t)-152) + +#ifdef __cplusplus +} +#endif + +#endif // PSA_STORAGE_COMMON_H diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa_manifest/sid.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa_manifest/sid.h new file mode 100644 index 00000000000..4b9b8c9c52e --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/psa_manifest/sid.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/*********** WARNING: This is an auto-generated file. Do not edit! ***********/ + +#ifndef __PSA_MANIFEST_SID_H__ +#define __PSA_MANIFEST_SID_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/******** TFM_SP_STORAGE ********/ +#define TFM_SST_SET_SID (0x00000060U) +#define TFM_SST_SET_VERSION (1U) +#define TFM_SST_GET_SID (0x00000061U) +#define TFM_SST_GET_VERSION (1U) +#define TFM_SST_GET_INFO_SID (0x00000062U) +#define TFM_SST_GET_INFO_VERSION (1U) +#define TFM_SST_REMOVE_SID (0x00000063U) +#define TFM_SST_REMOVE_VERSION (1U) +#define TFM_SST_GET_SUPPORT_SID (0x00000064U) +#define TFM_SST_GET_SUPPORT_VERSION (1U) + +/******** TFM_SP_ITS ********/ +#define TFM_ITS_SET_SID (0x00000070U) +#define TFM_ITS_SET_VERSION (1U) +#define TFM_ITS_GET_SID (0x00000071U) +#define TFM_ITS_GET_VERSION (1U) +#define TFM_ITS_GET_INFO_SID (0x00000072U) +#define TFM_ITS_GET_INFO_VERSION (1U) +#define TFM_ITS_REMOVE_SID (0x00000073U) +#define TFM_ITS_REMOVE_VERSION (1U) + +/******** TFM_SP_CRYPTO ********/ +#define TFM_CRYPTO_SID (0x00000080U) +#define TFM_CRYPTO_VERSION (1U) + +/******** TFM_SP_PLATFORM ********/ +#define TFM_SP_PLATFORM_SYSTEM_RESET_SID (0x00000040U) +#define TFM_SP_PLATFORM_SYSTEM_RESET_VERSION (1U) +#define TFM_SP_PLATFORM_IOCTL_SID (0x00000041U) +#define TFM_SP_PLATFORM_IOCTL_VERSION (1U) +#define TFM_SP_PLATFORM_NV_COUNTER_SID (0x00000042U) +#define TFM_SP_PLATFORM_NV_COUNTER_VERSION (1U) + +/******** TFM_SP_INITIAL_ATTESTATION ********/ +#define TFM_ATTEST_GET_TOKEN_SID (0x00000020U) +#define TFM_ATTEST_GET_TOKEN_VERSION (1U) +#define TFM_ATTEST_GET_TOKEN_SIZE_SID (0x00000021U) +#define TFM_ATTEST_GET_TOKEN_SIZE_VERSION (1U) +#define TFM_ATTEST_GET_PUBLIC_KEY_SID (0x00000022U) +#define TFM_ATTEST_GET_PUBLIC_KEY_VERSION (1U) + +/******** TFM_SP_CORE_TEST ********/ +#define SPM_CORE_TEST_INIT_SUCCESS_SID (0x0000F020U) +#define SPM_CORE_TEST_INIT_SUCCESS_VERSION (1U) +#define SPM_CORE_TEST_DIRECT_RECURSION_SID (0x0000F021U) +#define SPM_CORE_TEST_DIRECT_RECURSION_VERSION (1U) +#define SPM_CORE_TEST_SS_TO_SS_SID (0x0000F024U) +#define SPM_CORE_TEST_SS_TO_SS_VERSION (1U) +#define SPM_CORE_TEST_SS_TO_SS_BUFFER_SID (0x0000F025U) +#define SPM_CORE_TEST_SS_TO_SS_BUFFER_VERSION (1U) +#define SPM_CORE_TEST_OUTVEC_WRITE_SID (0x0000F026U) +#define SPM_CORE_TEST_OUTVEC_WRITE_VERSION (1U) +#define SPM_CORE_TEST_PERIPHERAL_ACCESS_SID (0x0000F027U) +#define SPM_CORE_TEST_PERIPHERAL_ACCESS_VERSION (1U) +#define SPM_CORE_TEST_GET_CALLER_CLIENT_ID_SID (0x0000F028U) +#define SPM_CORE_TEST_GET_CALLER_CLIENT_ID_VERSION (1U) +#define SPM_CORE_TEST_SPM_REQUEST_SID (0x0000F029U) +#define SPM_CORE_TEST_SPM_REQUEST_VERSION (1U) +#define SPM_CORE_TEST_BLOCK_SID (0x0000F02AU) +#define SPM_CORE_TEST_BLOCK_VERSION (1U) +#define SPM_CORE_TEST_NS_THREAD_SID (0x0000F02BU) +#define SPM_CORE_TEST_NS_THREAD_VERSION (1U) + +/******** TFM_SP_CORE_TEST_2 ********/ +#define SPM_CORE_TEST_2_SLAVE_SERVICE_SID (0x0000F040U) +#define SPM_CORE_TEST_2_SLAVE_SERVICE_VERSION (1U) +#define SPM_CORE_TEST_2_CHECK_CALLER_CLIENT_ID_SID (0x0000F041U) +#define SPM_CORE_TEST_2_CHECK_CALLER_CLIENT_ID_VERSION (1U) +#define SPM_CORE_TEST_2_GET_EVERY_SECOND_BYTE_SID (0x0000F042U) +#define SPM_CORE_TEST_2_GET_EVERY_SECOND_BYTE_VERSION (1U) +#define SPM_CORE_TEST_2_INVERT_SID (0x0000F043U) +#define SPM_CORE_TEST_2_INVERT_VERSION (1U) +#define SPM_CORE_TEST_2_PREPARE_TEST_SCENARIO_SID (0x0000F044U) +#define SPM_CORE_TEST_2_PREPARE_TEST_SCENARIO_VERSION (1U) +#define SPM_CORE_TEST_2_EXECUTE_TEST_SCENARIO_SID (0x0000F045U) +#define SPM_CORE_TEST_2_EXECUTE_TEST_SCENARIO_VERSION (1U) + +/******** TFM_SP_SECURE_TEST_PARTITION ********/ +#define TFM_SECURE_CLIENT_SFN_RUN_TESTS_SID (0x0000F000U) +#define TFM_SECURE_CLIENT_SFN_RUN_TESTS_VERSION (1U) + +/******** TFM_SP_IPC_SERVICE_TEST ********/ +#define IPC_SERVICE_TEST_BASIC_SID (0x0000F080U) +#define IPC_SERVICE_TEST_BASIC_VERSION (1U) +#define IPC_SERVICE_TEST_PSA_ACCESS_APP_MEM_SID (0x0000F081U) +#define IPC_SERVICE_TEST_PSA_ACCESS_APP_MEM_VERSION (1U) +#define IPC_SERVICE_TEST_PSA_ACCESS_APP_READ_ONLY_MEM_SID (0x0000F082U) +#define IPC_SERVICE_TEST_PSA_ACCESS_APP_READ_ONLY_MEM_VERSION (1U) +#define IPC_SERVICE_TEST_APP_ACCESS_PSA_MEM_SID (0x0000F083U) +#define IPC_SERVICE_TEST_APP_ACCESS_PSA_MEM_VERSION (1U) +#define IPC_SERVICE_TEST_CLIENT_PROGRAMMER_ERROR_SID (0x0000F084U) +#define IPC_SERVICE_TEST_CLIENT_PROGRAMMER_ERROR_VERSION (1U) + +/******** TFM_SP_IPC_CLIENT_TEST ********/ +#define IPC_CLIENT_TEST_BASIC_SID (0x0000F060U) +#define IPC_CLIENT_TEST_BASIC_VERSION (1U) +#define IPC_CLIENT_TEST_PSA_ACCESS_APP_MEM_SID (0x0000F061U) +#define IPC_CLIENT_TEST_PSA_ACCESS_APP_MEM_VERSION (1U) +#define IPC_CLIENT_TEST_PSA_ACCESS_APP_READ_ONLY_MEM_SID (0x0000F062U) +#define IPC_CLIENT_TEST_PSA_ACCESS_APP_READ_ONLY_MEM_VERSION (1U) +#define IPC_CLIENT_TEST_APP_ACCESS_PSA_MEM_SID (0x0000F063U) +#define IPC_CLIENT_TEST_APP_ACCESS_PSA_MEM_VERSION (1U) +#define IPC_CLIENT_TEST_MEM_CHECK_SID (0x0000F064U) +#define IPC_CLIENT_TEST_MEM_CHECK_VERSION (1U) + +/******** TFM_IRQ_TEST_1 ********/ +#define SPM_CORE_IRQ_TEST_1_PREPARE_TEST_SCENARIO_SID (0x0000F0A0U) +#define SPM_CORE_IRQ_TEST_1_PREPARE_TEST_SCENARIO_VERSION (1U) +#define SPM_CORE_IRQ_TEST_1_EXECUTE_TEST_SCENARIO_SID (0x0000F0A1U) +#define SPM_CORE_IRQ_TEST_1_EXECUTE_TEST_SCENARIO_VERSION (1U) + +/******** TFM_SP_SST_TEST ********/ +#define TFM_SST_TEST_PREPARE_SID (0x0000F0C0U) +#define TFM_SST_TEST_PREPARE_VERSION (1U) + +/******** TFM_SP_SECURE_CLIENT_2 ********/ +#define TFM_SECURE_CLIENT_2_SID (0x0000F0E0U) +#define TFM_SECURE_CLIENT_2_VERSION (1U) + +/******** TFM_SP_MULTI_CORE_TEST ********/ +#define MULTI_CORE_MULTI_CLIENT_CALL_TEST_0_SID (0x0000F100U) +#define MULTI_CORE_MULTI_CLIENT_CALL_TEST_0_VERSION (1U) +#define MULTI_CORE_MULTI_CLIENT_CALL_TEST_1_SID (0x0000F101U) +#define MULTI_CORE_MULTI_CLIENT_CALL_TEST_1_VERSION (1U) + +#ifdef __cplusplus +} +#endif + +#endif /* __PSA_MANIFEST_SID_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_api.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_api.h new file mode 100644 index 00000000000..09abc399b17 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_api.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2017-2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef __TFM_API_H__ +#define __TFM_API_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "psa/client.h" + +#define TFM_INVALID_CLIENT_ID 0 + +/** + * \brief Checks if the provided client ID is a secure client ID. + * + * \param[in] client_id Client ID to check. + * + * \retval 1 Client ID is secure. + * \retval 0 Client ID is non-secure. + */ +#define TFM_CLIENT_ID_IS_S(client_id) ((client_id)>0) + +/** + * \brief Checks if the provided client ID is a non-secure client ID. + * + * \param[in] client_id Client ID to check. + * + * \retval 1 Client ID is non-secure. + * \retval 0 Client ID is secure. + */ +#define TFM_CLIENT_ID_IS_NS(client_id) ((client_id)<0) + +/* The mask used for timeout values */ +#define PSA_TIMEOUT_MASK PSA_BLOCK + +/* FixMe: sort out DEBUG compile option and limit return value options + * on external interfaces */ +enum tfm_status_e +{ + TFM_SUCCESS = 0, + TFM_PARTITION_BUSY, + TFM_ERROR_SECURE_DOMAIN_LOCKED, + TFM_ERROR_INVALID_PARAMETER, + TFM_ERROR_PARTITION_NON_REENTRANT, + TFM_ERROR_NS_THREAD_MODE_CALL, + TFM_ERROR_NOT_INITIALIZED, + TFM_ERROR_NO_ACTIVE_PARTITION, + TFM_ERROR_INVALID_EXC_MODE, + TFM_SECURE_LOCK_FAILED, + TFM_SECURE_UNLOCK_FAILED, + TFM_ERROR_GENERIC = 0x1F, +}; + +/* + * Structure to package type, in_len and out_len, it is mainly used for + * psa_call. + */ +struct tfm_control_parameter_t { + int32_t type; + size_t in_len; + size_t out_len; +}; + +/********************* Secure function declarations ***************************/ + +/** + * \brief Assign client ID to the current TZ context. + * + * \param[in] ns_client_id The client ID to be assigned to the current + * context. + * \retval TFM_SUCCESS The client ID assigned successfully. + * \retval error code The client ID assignment failed, an error code + * returned according to \ref tfm_status_e. + * \note This function have to be called from handler mode. + */ +enum tfm_status_e tfm_register_client_id (int32_t ns_client_id); + +/** + * \brief Retrieve the version of the PSA Framework API that is implemented. + * + * \return The version of the PSA Framework. + */ +uint32_t tfm_psa_framework_version_veneer(void); + +/** + * \brief Return version of secure function provided by secure binary. + * + * \param[in] sid ID of secure service. + * + * \return Version number of secure function. + */ +uint32_t tfm_psa_version_veneer(uint32_t sid); + +/** + * \brief Connect to secure function. + * + * \param[in] sid ID of secure service. + * \param[in] version Version of SF requested by client. + * + * \return Returns handle to connection. + */ +psa_handle_t tfm_psa_connect_veneer(uint32_t sid, uint32_t version); + +/** + * \brief Call a secure function referenced by a connection handle. + * + * \param[in] handle Handle to connection. + * \param[in] ctrl_param Parameter structure, includes reuqest type, + * in_num and out_num. + * \param[in] in_vec Array of input \ref psa_invec structures. + * \param[in/out] out_vec Array of output \ref psa_outvec structures. + * + * \return Returns \ref psa_status_t status code. + */ +psa_status_t tfm_psa_call_veneer(psa_handle_t handle, + const struct tfm_control_parameter_t *ctrl_param, + const psa_invec *in_vec, + psa_outvec *out_vec); + +/** + * \brief Close connection to secure function referenced by a connection handle. + * + * \param[in] handle Handle to connection + * + * \return void + */ +void tfm_psa_close_veneer(psa_handle_t handle); + +/***************** End Secure function declarations ***************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* __TFM_API_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_crypto_defs.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_crypto_defs.h new file mode 100644 index 00000000000..53c03ce0223 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_crypto_defs.h @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef __TFM_CRYPTO_DEFS_H__ +#define __TFM_CRYPTO_DEFS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "tfm_api.h" +#include "psa/crypto.h" + +/** + * \brief This type is used to overcome a limitation in the number of maximum + * IOVECs that can be used especially in psa_aead_encrypt and + * psa_aead_decrypt. To be removed in case the AEAD APIs number of + * parameters passed gets restructured + */ +#define TFM_CRYPTO_MAX_NONCE_LENGTH (16u) +struct tfm_crypto_aead_pack_input { + uint8_t nonce[TFM_CRYPTO_MAX_NONCE_LENGTH]; + uint32_t nonce_length; +}; + +/** + * \brief Structure used to pack non-pointer types in a call + * + */ +struct tfm_crypto_pack_iovec { + uint32_t sfn_id; /*!< Secure function ID used to dispatch the + * request + */ + uint16_t step; /*!< Key derivation step */ + psa_key_handle_t key_handle; /*!< Key handle */ + psa_algorithm_t alg; /*!< Algorithm */ + uint32_t op_handle; /*!< Frontend context handle associated to a + * multipart operation + */ + size_t capacity; /*!< Key derivation capacity */ + + struct tfm_crypto_aead_pack_input aead_in; /*!< FixMe: Temporarily used for + * AEAD until the API is + * restructured + */ +}; + +/** + * \brief Define a progressive numerical value for each SID which can be used + * when dispatching the requests to the service + */ +enum { + TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID = (0u), + TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID, + TFM_CRYPTO_OPEN_KEY_SID, + TFM_CRYPTO_CLOSE_KEY_SID, + TFM_CRYPTO_IMPORT_KEY_SID, + TFM_CRYPTO_DESTROY_KEY_SID, + TFM_CRYPTO_EXPORT_KEY_SID, + TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID, + TFM_CRYPTO_COPY_KEY_SID, + TFM_CRYPTO_HASH_COMPUTE_SID, + TFM_CRYPTO_HASH_COMPARE_SID, + TFM_CRYPTO_HASH_SETUP_SID, + TFM_CRYPTO_HASH_UPDATE_SID, + TFM_CRYPTO_HASH_FINISH_SID, + TFM_CRYPTO_HASH_VERIFY_SID, + TFM_CRYPTO_HASH_ABORT_SID, + TFM_CRYPTO_HASH_CLONE_SID, + TFM_CRYPTO_MAC_COMPUTE_SID, + TFM_CRYPTO_MAC_VERIFY_SID, + TFM_CRYPTO_MAC_SIGN_SETUP_SID, + TFM_CRYPTO_MAC_VERIFY_SETUP_SID, + TFM_CRYPTO_MAC_UPDATE_SID, + TFM_CRYPTO_MAC_SIGN_FINISH_SID, + TFM_CRYPTO_MAC_VERIFY_FINISH_SID, + TFM_CRYPTO_MAC_ABORT_SID, + TFM_CRYPTO_CIPHER_ENCRYPT_SID, + TFM_CRYPTO_CIPHER_DECRYPT_SID, + TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID, + TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID, + TFM_CRYPTO_CIPHER_GENERATE_IV_SID, + TFM_CRYPTO_CIPHER_SET_IV_SID, + TFM_CRYPTO_CIPHER_UPDATE_SID, + TFM_CRYPTO_CIPHER_FINISH_SID, + TFM_CRYPTO_CIPHER_ABORT_SID, + TFM_CRYPTO_AEAD_ENCRYPT_SID, + TFM_CRYPTO_AEAD_DECRYPT_SID, + TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID, + TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID, + TFM_CRYPTO_AEAD_GENERATE_NONCE_SID, + TFM_CRYPTO_AEAD_SET_NONCE_SID, + TFM_CRYPTO_AEAD_SET_LENGTHS_SID, + TFM_CRYPTO_AEAD_UPDATE_AD_SID, + TFM_CRYPTO_AEAD_UPDATE_SID, + TFM_CRYPTO_AEAD_FINISH_SID, + TFM_CRYPTO_AEAD_VERIFY_SID, + TFM_CRYPTO_AEAD_ABORT_SID, + TFM_CRYPTO_SIGN_HASH_SID, + TFM_CRYPTO_VERIFY_HASH_SID, + TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID, + TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID, + TFM_CRYPTO_KEY_DERIVATION_SETUP_SID, + TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID, + TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID, + TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID, + TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID, + TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID, + TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID, + TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID, + TFM_CRYPTO_KEY_DERIVATION_ABORT_SID, + TFM_CRYPTO_RAW_KEY_AGREEMENT_SID, + TFM_CRYPTO_GENERATE_RANDOM_SID, + TFM_CRYPTO_GENERATE_KEY_SID, + TFM_CRYPTO_SET_KEY_DOMAIN_PARAMETERS_SID, + TFM_CRYPTO_GET_KEY_DOMAIN_PARAMETERS_SID, + TFM_CRYPTO_SID_MAX, +}; + +/** + * \brief Define an invalid value for an SID + * + */ +#define TFM_CRYPTO_SID_INVALID (~0x0u) + +/** + * \brief This value is used to mark an handle as invalid. + * + */ +#define TFM_CRYPTO_INVALID_HANDLE (0x0u) + +/** + * \brief The persistent key identifier that refers to the hardware unique key. + * + */ +#define TFM_CRYPTO_KEY_ID_HUK (0xFFFF815Bu) + +/** + * \brief The algorithm identifier that refers to key derivation from the + * hardware unique key. + * + */ +#define TFM_CRYPTO_ALG_HUK_DERIVATION ((psa_algorithm_t)0xB0000F00) + +/** + * \brief Define miscellaneous literal constants that are used in the service + * + */ +enum { + TFM_CRYPTO_NOT_IN_USE = 0, + TFM_CRYPTO_IN_USE = 1 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __TFM_CRYPTO_DEFS_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_mailbox.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_mailbox.h new file mode 100644 index 00000000000..3d128f40b2f --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_mailbox.h @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/* + * This is header file of common mailbox objects shared by NSPE and SPE. + * Please refer to tfm_ns_mailbox.h for the definitions only used in NSPE + * mailbox library. + * Please refer to tfm_spe_mailbox.h for the SPE specific definitions and APIs. + */ + +#ifndef __TFM_MAILBOX_H__ +#define __TFM_MAILBOX_H__ + +#include +#include +#include +#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL +#include "device_cfg.h" +#endif +#include "psa/client.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * If multiple outstanding NS PSA Client calls is enabled, multi-core platform + * should define the number of mailbox queue slots NUM_MAILBOX_QUEUE_SLOT in + * platform device_cfg.h. + * Otherwise, NUM_MAILBOX_QUEUE_SLOT is defined as 1. + */ +#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL +#ifndef NUM_MAILBOX_QUEUE_SLOT +#error "Error: Platform doesn't define NUM_MAILBOX_QUEUE_SLOT for mailbox queue" +#endif + +#if (NUM_MAILBOX_QUEUE_SLOT < 2) +#error "Error: Invalid NUM_MAILBOX_QUEUE_SLOT. The value should be more than 1" +#endif + +/* + * The number of slots should be no more than the number of bits in + * mailbox_queue_status_t. + * Here the value is hardcoded. A better way is to define a sizeof() to + * calculate the bits in mailbox_queue_status_t and dump it with pragma message. + */ +#if (NUM_MAILBOX_QUEUE_SLOT > 32) +#error "Error: Invalid NUM_MAILBOX_QUEUE_SLOT. The value should be no more than 32" +#endif +#else /* TFM_MULTI_CORE_MULTI_CLIENT_CALL */ +/* Force the number of mailbox queue slots as 1. */ +#undef NUM_MAILBOX_QUEUE_SLOT +#define NUM_MAILBOX_QUEUE_SLOT (1) +#endif /* TFM_MULTI_CORE_MULTI_CLIENT_CALL */ + +/* PSA client call type value */ +#define MAILBOX_PSA_FRAMEWORK_VERSION (0x1) +#define MAILBOX_PSA_VERSION (0x2) +#define MAILBOX_PSA_CONNECT (0x3) +#define MAILBOX_PSA_CALL (0x4) +#define MAILBOX_PSA_CLOSE (0x5) + +/* Return code of mailbox APIs */ +#define MAILBOX_SUCCESS (0) +#define MAILBOX_QUEUE_FULL (INT32_MIN + 1) +#define MAILBOX_INVAL_PARAMS (INT32_MIN + 2) +#define MAILBOX_NO_PERMS (INT32_MIN + 3) +#define MAILBOX_NO_PEND_EVENT (INT32_MIN + 4) +#define MAILBOX_CHAN_BUSY (INT32_MIN + 5) +#define MAILBOX_CALLBACK_REG_ERROR (INT32_MIN + 6) +#define MAILBOX_INIT_ERROR (INT32_MIN + 7) + +/* + * This structure holds the parameters used in a PSA client call. + */ +struct psa_client_params_t { + union { + struct { + uint32_t sid; + } psa_version_params; + + struct { + uint32_t sid; + uint32_t version; + } psa_connect_params; + + struct { + psa_handle_t handle; + int32_t type; + const psa_invec *in_vec; + size_t in_len; + psa_outvec *out_vec; + size_t out_len; + } psa_call_params; + + struct { + psa_handle_t handle; + } psa_close_params; + }; +}; + +/* Mailbox message passed from NSPE to SPE to deliver a PSA client call */ +struct mailbox_msg_t { + uint32_t call_type; /* PSA client call type */ + struct psa_client_params_t params; /* Contain parameters used in PSA + * client call + */ + + int32_t client_id; /* Optional client ID of the + * non-secure caller. + * It is required to identify the + * non-secure task when NSPE OS + * enforces non-secure task isolation + */ +}; + +/* A handle to a mailbox message in use */ +typedef int32_t mailbox_msg_handle_t; + +#define MAILBOX_MSG_NULL_HANDLE ((mailbox_msg_handle_t)0) + +/* + * Mailbox reply structure in non-secure memory + * to hold the PSA client call return result from SPE + */ +struct mailbox_reply_t { + int32_t return_val; +}; + +/* A single slot structure in NSPE mailbox queue */ +struct ns_mailbox_slot_t { + struct mailbox_msg_t msg; + struct mailbox_reply_t reply; + const void *owner; /* Handle of the owner task of this + * slot + */ + bool is_woken; /* Indicate that owner task has been + * or should be woken up, after the + * replied is received. + */ +}; + +typedef uint32_t mailbox_queue_status_t; + +/* NSPE mailbox queue */ +struct ns_mailbox_queue_t { + mailbox_queue_status_t empty_slots; /* Bitmask of empty slots */ + mailbox_queue_status_t pend_slots; /* Bitmask of slots pending + * for SPE handling + */ + mailbox_queue_status_t replied_slots; /* Bitmask of active slots + * containing PSA client call + * return result + */ + + struct ns_mailbox_slot_t queue[NUM_MAILBOX_QUEUE_SLOT]; + +#ifdef TFM_MULTI_CORE_TEST + uint32_t nr_tx; /* The total number of + * submission of NS PSA Client + * calls from NS task via + * mailbox. + */ + uint32_t nr_used_slots; /* The total number of used + * mailbox queue slots each time + * NS thread requests a mailbox + * queue slot. + */ +#endif +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __TFM_MAILBOX_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_multi_core_api.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_multi_core_api.h new file mode 100644 index 00000000000..7999fa442de --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_multi_core_api.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef __TFM_MULTI_CORE_API__ +#define __TFM_MULTI_CORE_API__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * \brief Called on the non-secure CPU. + * Flags that the non-secure side has completed its initialization. + * Waits, if necessary, for the secure CPU to flag that it has completed + * its initialization. + * + * \return Return 0 if succeeds. + * \return Otherwise, return specific error code. + */ +int32_t tfm_ns_wait_for_s_cpu_ready(void); + +/** + * \brief Synchronisation with secure CPU, platform-specific implementation. + * Flags that the non-secure side has completed its initialization. + * Waits, if necessary, for the secure CPU to flag that it has completed + * its initialization. + * + * \retval Return 0 if succeeds. + * \retval Otherwise, return specific error code. + */ +int32_t tfm_platform_ns_wait_for_s_cpu_ready(void); + +/** + * \brief Acquire the multi-core lock for synchronizing PSA client call(s) + * The actual implementation depends on the use scenario. + * + * \return \ref TFM_SUCCESS on success + * \return \ref TFM_ERROR_GENERIC on error + */ +uint32_t tfm_ns_multi_core_lock_acquire(void); + +/** + * \brief Release the multi-core lock for synchronizing PSA client call(s) + * The actual implementation depends on the use scenario. + * + * \return \ref TFM_SUCCESS on success + * \return \ref TFM_ERROR_GENERIC on error + */ +uint32_t tfm_ns_multi_core_lock_release(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __TFM_MULTI_CORE_API__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_ns_interface.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_ns_interface.h new file mode 100644 index 00000000000..21857bed6fc --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_ns_interface.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017-2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ +#ifndef __TFM_NS_INTERFACE_H__ +#define __TFM_NS_INTERFACE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "tfm_api.h" + +typedef int32_t (*veneer_fn) (uint32_t arg0, uint32_t arg1, + uint32_t arg2, uint32_t arg3); + +/** + * \brief NS interface, veneer function dispatcher + * + * \details This function implements the dispatching mechanism for the + * desired veneer function, to be called with the parameters + * described from arg0 to arg3. + * + * \param[in] fn Function pointer to the veneer function desired + * \param[in] arg0 Argument 0 + * \param[in] arg1 Argument 1 + * \param[in] arg2 Argument 2 + * \param[in] arg3 Argument 3 + * + * \return Returns the same return value of the requested veneer function + */ +int32_t tfm_ns_interface_dispatch(veneer_fn fn, + uint32_t arg0, uint32_t arg1, + uint32_t arg2, uint32_t arg3); + +/** + * \brief NS interface, Initialise the NS interface + * + * \details This function needs to be called from the NS world to + * properly initialise the NS interface towards TF-M. This + * function will initialise all the objects required for + * runtime dispatching of TF-M requests to services + * + * \return A value according to \ref enum tfm_status_e + */ +enum tfm_status_e tfm_ns_interface_init(void); +#ifdef __cplusplus +} +#endif + +#endif /* __TFM_NS_INTERFACE_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_ns_mailbox.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_ns_mailbox.h new file mode 100644 index 00000000000..2fcb1b64705 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_ns_mailbox.h @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/* Data types and API definitions in NSPE mailbox library */ + +#ifndef __TFM_NS_MAILBOX_H__ +#define __TFM_NS_MAILBOX_H__ + +#include +#include +#include "tfm_mailbox.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef TFM_MULTI_CORE_TEST +/** + * \brief The structure to hold the statistics result of NSPE mailbox + */ +struct ns_mailbox_stats_res_t { + uint8_t avg_nr_slots; /* The value before the decimal point + * in the average number of NSPE + * mailbox slots in use. + */ + uint8_t avg_nr_slots_tenths; /* The first digit value after the + * decimal point in the average + * number of NSPE mailbox slots in use. + */ +}; +#endif + +/** + * \brief Prepare and send PSA client request to SPE via mailbox. + * + * \param[in] call_type PSA client call type + * \param[in] params Parmaters used for PSA client call + * \param[in] client_id Optional client ID of non-secure caller. + * It is required to identify the non-secure caller + * when NSPE OS enforces non-secure task isolation. + * + * \retval >= 0 The handle to the mailbox message assigned. + * \retval < 0 Operation failed with an error code. + */ +mailbox_msg_handle_t tfm_ns_mailbox_tx_client_req(uint32_t call_type, + const struct psa_client_params_t *params, + int32_t client_id); + +/** + * \brief Fetch PSA client return result. + * + * \param[in] handle The handle to the mailbox message + * \param[out] reply The address to be written with return result. + * + * \retval MAILBOX_SUCCESS Successfully get PSA client call return result. + * \retval Other return code Operation failed with an error code. + */ +int32_t tfm_ns_mailbox_rx_client_reply(mailbox_msg_handle_t handle, + int32_t *reply); + +/** + * \brief Check whether a specific mailbox message has been replied. + * + * \param[in] handle The handle to the mailbox message + * + * \retval true The PSA client call return value is replied. + * \retval false The PSA client call return value is not + * replied yet. + */ +bool tfm_ns_mailbox_is_msg_replied(mailbox_msg_handle_t handle); + +/** + * \brief NSPE mailbox initialization + * + * \param[in] queue The base address of NSPE mailbox queue to be + * initialized. + * + * \retval MAILBOX_SUCCESS Operation succeeded. + * \retval Other return code Operation failed with an error code. + */ +int32_t tfm_ns_mailbox_init(struct ns_mailbox_queue_t *queue); + +/** + * \brief Get the handle of the current non-secure task executing mailbox + * functionalities + * + * \note This function should be implemented according to platform, NS OS + * and actual use scenario. + * This function can be ignored or return NULL if sleep/wake-up mechanism + * is not required in PSA Client API implementation. + * + * \return Return the handle of task. + */ +const void *tfm_ns_mailbox_get_task_handle(void); + +/** + * \brief Fetch the handle to the first replied mailbox message in the NSPE + * mailbox queue. + * This function is intended to be called inside platform specific + * notification IRQ handler. + * + * \note The replied status of the fetched mailbox message will be cleaned after + * the message is fetched. When this function is called again, it fetches + * the next replied mailbox message from the NSPE mailbox queue. + * + * \return Return the handle to the first replied mailbox message in the + * queue. + * Return \ref MAILBOX_MSG_NULL_HANDLE if no mailbox message is replied. + */ +mailbox_msg_handle_t tfm_ns_mailbox_fetch_reply_msg_isr(void); + +/** + * \brief Return the handle of owner task of a mailbox message according to the + * \ref mailbox_msg_handle_t + * + * \param[in] handle The handle of mailbox message. + * + * \return Return the handle value of the owner task. + */ +const void *tfm_ns_mailbox_get_msg_owner(mailbox_msg_handle_t handle); + +#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL +/** + * \brief Wait for the reply returned from SPE to the mailbox message specified + * by handle + * + * \param[in] handle The handle of mailbox message. + * + * \retval MAILBOX_SUCCESS Return from waiting successfully. + * \retval Other return code Failed to wait with an error code. + */ +int32_t tfm_ns_mailbox_wait_reply(mailbox_msg_handle_t handle); +#endif + +/** + * \brief Platform specific NSPE mailbox initialization. + * Invoked by \ref tfm_ns_mailbox_init(). + * + * \param[in] queue The base address of NSPE mailbox queue to be + * initialized. + * + * \retval MAILBOX_SUCCESS Operation succeeded. + * \retval Other return code Operation failed with an error code. + */ +int32_t tfm_ns_mailbox_hal_init(struct ns_mailbox_queue_t *queue); + +/** + * \brief Notify SPE to deal with the PSA client call sent via mailbox + * + * \note The implementation depends on platform specific hardware and use case. + * + * \retval MAILBOX_SUCCESS Operation succeeded. + * \retval Other return code Operation failed with an error code. + */ +int32_t tfm_ns_mailbox_hal_notify_peer(void); + +/** + * \brief Enter critical section of NSPE mailbox. + * + * \note The implementation depends on platform specific hardware and use case. + */ +void tfm_ns_mailbox_hal_enter_critical(void); + +/** + * \brief Exit critical section of NSPE mailbox. + * + * \note The implementation depends on platform specific hardware and use case. + */ +void tfm_ns_mailbox_hal_exit_critical(void); + +/** + * \brief Enter critical section of NSPE mailbox in IRQ handler. + * + * \note The implementation depends on platform specific hardware and use case. + */ +void tfm_ns_mailbox_hal_enter_critical_isr(void); + +/** + * \brief Enter critical section of NSPE mailbox in IRQ handler + * + * \note The implementation depends on platform specific hardware and use case. + */ +void tfm_ns_mailbox_hal_exit_critical_isr(void); + +#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL +/** + * \brief Performs platform and NS OS specific waiting mechanism to wait for + * the reply of the specified mailbox message to be returned from SPE. + * + * \note This function is implemented by platform and NS OS specific waiting + * mechanism accroding to use scenario. + * + * \param[in] handle The handle of mailbox message. + */ +void tfm_ns_mailbox_hal_wait_reply(mailbox_msg_handle_t handle); +#endif + +#ifdef TFM_MULTI_CORE_TEST +/** + * \brief Initialize the statistics module in TF-M NSPE mailbox. + * + * \note This function is only available when multi-core tests are enabled. + */ +void tfm_ns_mailbox_tx_stats_init(void); + +/** + * \brief Calculate the average number of used NS mailbox queue slots each time + * NS task requires a queue slot to submit mailbox message, which is + * recorded in NS mailbox statisitics module. + * + * \note This function is only available when multi-core tests are enabled. + * + * \param[in] stats_res The buffer to be written with + * \ref ns_mailbox_stats_res_t. + * + * \return Return the calculation result. + */ +void tfm_ns_mailbox_stats_avg_slot(struct ns_mailbox_stats_res_t *stats_res); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __TFM_NS_MAILBOX_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_ns_svc.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_ns_svc.h similarity index 97% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_ns_svc.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_ns_svc.h index 366a70a91a9..def0c2f7eec 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_ns_svc.h +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_ns_svc.h @@ -6,7 +6,7 @@ */ #include -#include +#include "cmsis_compiler.h" #ifndef __TFM_NS_SVC_H__ #define __TFM_NS_SVC_H__ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_platform_api.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_platform_api.h new file mode 100644 index 00000000000..8c9b0db1fa0 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_platform_api.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef __TFM_PLATFORM_API__ +#define __TFM_PLATFORM_API__ + +#include +#include +#include +#include "tfm_api.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief TFM secure partition platform API version + */ +#define TFM_PLATFORM_API_VERSION_MAJOR (0) +#define TFM_PLATFORM_API_VERSION_MINOR (3) + +#define TFM_PLATFORM_API_ID_NV_READ (1010) +#define TFM_PLATFORM_API_ID_NV_INCREMENT (1011) + +/*! + * \enum tfm_platform_err_t + * + * \brief Platform service error types + * + */ +enum tfm_platform_err_t { + TFM_PLATFORM_ERR_SUCCESS = 0, + TFM_PLATFORM_ERR_SYSTEM_ERROR, + TFM_PLATFORM_ERR_INVALID_PARAM, + TFM_PLATFORM_ERR_NOT_SUPPORTED, + + /* Following entry is only to ensure the error code of int size */ + TFM_PLATFORM_ERR_FORCE_INT_SIZE = INT_MAX +}; + +typedef int32_t tfm_platform_ioctl_req_t; + +/*! + * \brief Resets the system. + * + * \return Returns values as specified by the \ref tfm_platform_err_t + */ +enum tfm_platform_err_t tfm_platform_system_reset(void); + +/*! + * \brief Performs a platform-specific service + * + * \param[in] request Request identifier (valid values vary + * based on the platform) + * \param[in] input Input buffer to the requested service (or NULL) + * \param[in,out] output Output buffer to the requested service (or NULL) + * + * \return Returns values as specified by the \ref tfm_platform_err_t + */ +enum tfm_platform_err_t tfm_platform_ioctl(tfm_platform_ioctl_req_t request, + psa_invec *input, + psa_outvec *output); + +/*! + * \brief Increments the given non-volatile (NV) counter by one + * + * \param[in] counter_id NV counter ID. + * + * \return TFM_PLATFORM_ERR_SUCCESS if the value is read correctly. Otherwise, + * it returns TFM_PLATFORM_ERR_SYSTEM_ERROR. + */ +enum tfm_platform_err_t +tfm_platform_nv_counter_increment(uint32_t counter_id); + +/*! + * \brief Reads the given non-volatile (NV) counter + * + * \param[in] counter_id NV counter ID. + * \param[in] size Size of the buffer to store NV counter value + * in bytes. + * \param[out] val Pointer to store the current NV counter value. + * + * \return TFM_PLATFORM_ERR_SUCCESS if the value is read correctly. Otherwise, + * it returns TFM_PLATFORM_ERR_SYSTEM_ERROR. + */ +enum tfm_platform_err_t +tfm_platform_nv_counter_read(uint32_t counter_id, + uint32_t size, uint8_t *val); + +#ifdef __cplusplus +} +#endif + +#endif /* __TFM_PLATFORM_API__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_veneers.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_veneers.h new file mode 100644 index 00000000000..d2d9207ffc2 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/include/tfm_veneers.h @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/*********** WARNING: This is an auto-generated file. Do not edit! ***********/ + +#ifndef __TFM_VENEERS_H__ +#define __TFM_VENEERS_H__ + +#include "tfm_api.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef TFM_PARTITION_SECURE_STORAGE +/******** TFM_SP_STORAGE ********/ +psa_status_t tfm_tfm_sst_set_req_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_sst_get_req_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_sst_get_info_req_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_sst_remove_req_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_sst_get_support_req_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_SECURE_STORAGE */ + +#ifdef TFM_PARTITION_INTERNAL_TRUSTED_STORAGE +/******** TFM_SP_ITS ********/ +psa_status_t tfm_tfm_its_set_req_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_its_get_req_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_its_get_info_req_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_its_remove_req_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_INTERNAL_TRUSTED_STORAGE */ + +#ifdef TFM_PARTITION_AUDIT_LOG +/******** TFM_SP_AUDIT_LOG ********/ +psa_status_t tfm_audit_core_retrieve_record_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_audit_core_add_record_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_audit_core_get_info_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_audit_core_get_record_info_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_audit_core_delete_record_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_AUDIT_LOG */ + +#ifdef TFM_PARTITION_CRYPTO +/******** TFM_SP_CRYPTO ********/ +psa_status_t tfm_tfm_crypto_get_key_attributes_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_open_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_close_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_reset_key_attributes_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_import_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_destroy_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_export_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_export_public_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_copy_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_hash_compute_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_hash_compare_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_hash_setup_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_hash_update_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_hash_finish_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_hash_verify_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_hash_abort_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_hash_clone_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_mac_compute_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_mac_verify_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_mac_sign_setup_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_mac_verify_setup_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_mac_update_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_mac_sign_finish_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_mac_verify_finish_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_mac_abort_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_cipher_encrypt_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_cipher_decrypt_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_cipher_encrypt_setup_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_cipher_decrypt_setup_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_cipher_generate_iv_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_cipher_set_iv_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_cipher_update_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_cipher_finish_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_cipher_abort_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_encrypt_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_decrypt_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_encrypt_setup_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_decrypt_setup_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_generate_nonce_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_set_nonce_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_set_lengths_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_update_ad_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_update_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_finish_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_verify_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_aead_abort_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_sign_hash_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_verify_hash_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_asymmetric_encrypt_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_asymmetric_decrypt_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_key_derivation_setup_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_key_derivation_get_capacity_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_key_derivation_set_capacity_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_key_derivation_input_bytes_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_key_derivation_input_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_key_derivation_key_agreement_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_key_derivation_output_bytes_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_key_derivation_output_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_key_derivation_abort_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_raw_key_agreement_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_generate_random_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_tfm_crypto_generate_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_CRYPTO */ + +#ifdef TFM_PARTITION_PLATFORM +/******** TFM_SP_PLATFORM ********/ +psa_status_t tfm_platform_sp_system_reset_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_platform_sp_ioctl_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_platform_sp_nv_counter_read_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_platform_sp_nv_counter_increment_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_PLATFORM */ + +#ifdef TFM_PARTITION_INITIAL_ATTESTATION +/******** TFM_SP_INITIAL_ATTESTATION ********/ +psa_status_t tfm_initial_attest_get_token_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_initial_attest_get_token_size_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_initial_attest_get_public_key_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_INITIAL_ATTESTATION */ + +#ifdef TFM_PARTITION_TEST_CORE +/******** TFM_SP_CORE_TEST ********/ +psa_status_t tfm_spm_core_test_sfn_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_spm_core_test_sfn_init_success_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_spm_core_test_sfn_direct_recursion_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_TEST_CORE */ + +#ifdef TFM_PARTITION_TEST_CORE +/******** TFM_SP_CORE_TEST_2 ********/ +psa_status_t tfm_spm_core_test_2_slave_service_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_spm_core_test_2_sfn_invert_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_spm_core_test_2_check_caller_client_id_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_spm_core_test_2_get_every_second_byte_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_spm_core_test_2_prepare_test_scenario_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_spm_core_test_2_execute_test_scenario_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_TEST_CORE */ + +#ifdef TFM_PARTITION_TEST_SECURE_SERVICES +/******** TFM_SP_SECURE_TEST_PARTITION ********/ +psa_status_t tfm_tfm_secure_client_service_sfn_run_tests_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_TEST_SECURE_SERVICES */ + +#ifdef TFM_PARTITION_TEST_CORE_IPC +/******** TFM_SP_IPC_SERVICE_TEST ********/ +#endif /* TFM_PARTITION_TEST_CORE_IPC */ + +#ifdef TFM_PARTITION_TEST_CORE_IPC +/******** TFM_SP_IPC_CLIENT_TEST ********/ +#endif /* TFM_PARTITION_TEST_CORE_IPC */ + +#ifdef TFM_ENABLE_IRQ_TEST +/******** TFM_IRQ_TEST_1 ********/ +psa_status_t tfm_spm_irq_test_1_prepare_test_scenario_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +psa_status_t tfm_spm_irq_test_1_execute_test_scenario_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_ENABLE_IRQ_TEST */ + +#ifdef TFM_PARTITION_TEST_SST +/******** TFM_SP_SST_TEST ********/ +psa_status_t tfm_tfm_sst_test_prepare_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_TEST_SST */ + +#ifdef TFM_PARTITION_TEST_SECURE_SERVICES +/******** TFM_SP_SECURE_CLIENT_2 ********/ +psa_status_t tfm_tfm_secure_client_2_call_veneer(psa_invec *in_vec, size_t in_len, psa_outvec *out_vec, size_t out_len); +#endif /* TFM_PARTITION_TEST_SECURE_SERVICES */ + +#ifdef TFM_MULTI_CORE_TEST +/******** TFM_SP_MULTI_CORE_TEST ********/ +#endif /* TFM_MULTI_CORE_TEST */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TFM_VENEERS_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_crypto_ipc_api.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_crypto_ipc_api.c new file mode 100644 index 00000000000..70b3a0dfe59 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_crypto_ipc_api.c @@ -0,0 +1,1875 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include "tfm_crypto_defs.h" +#include "psa/crypto.h" +#include "tfm_ns_interface.h" +#include "psa_manifest/sid.h" +#include "psa/client.h" + +#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) + +#define PSA_CONNECT(service) \ + psa_handle_t ipc_handle; \ + ipc_handle = psa_connect(service##_SID, service##_VERSION); \ + if (!PSA_HANDLE_IS_VALID(ipc_handle)) { \ + return PSA_ERROR_GENERIC_ERROR; \ + } \ + +#define PSA_CLOSE() psa_close(ipc_handle) + +#define API_DISPATCH(sfn_name, sfn_id) \ + psa_call(ipc_handle, PSA_IPC_CALL, \ + in_vec, ARRAY_SIZE(in_vec), \ + out_vec, ARRAY_SIZE(out_vec)) + +#define API_DISPATCH_NO_OUTVEC(sfn_name, sfn_id) \ + psa_call(ipc_handle, PSA_IPC_CALL, \ + in_vec, ARRAY_SIZE(in_vec), \ + (psa_outvec *)NULL, 0) + +psa_status_t psa_crypto_init(void) +{ + /* Service init is performed during TFM boot up, + * so application level initialisation is empty + */ + return PSA_SUCCESS; +} + +psa_status_t psa_open_key(psa_key_id_t id, + psa_key_handle_t *handle) +{ +#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + const struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_OPEN_KEY_SID, + }; + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = &id, .len = sizeof(psa_key_id_t)}, + }; + psa_outvec out_vec[] = { + {.base = handle, .len = sizeof(psa_key_handle_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_open_key, + TFM_CRYPTO_OPEN_KEY); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */ +} + +psa_status_t psa_close_key(psa_key_handle_t handle) +{ +#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + const struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_CLOSE_KEY_SID, + .key_handle = handle, + }; + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH_NO_OUTVEC(tfm_crypto_close_key, + TFM_CRYPTO_CLOSE_KEY);; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */ +} + +psa_status_t psa_import_key(const psa_key_attributes_t *attributes, + const uint8_t *data, + size_t data_length, + psa_key_handle_t *handle) +{ +#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_IMPORT_KEY_SID, + }; + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = attributes, .len = sizeof(psa_key_attributes_t)}, + {.base = data, .len = data_length} + }; + psa_outvec out_vec[] = { + {.base = handle, .len = sizeof(psa_key_handle_t)} + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_import_key, + TFM_CRYPTO_IMPORT_KEY); + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */ +} + +psa_status_t psa_destroy_key(psa_key_handle_t handle) +{ +#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_DESTROY_KEY_SID, + .key_handle = handle, + }; + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH_NO_OUTVEC(tfm_crypto_destroy_key, + TFM_CRYPTO_DESTROY_KEY); + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */ +} + +psa_status_t psa_get_key_attributes(psa_key_handle_t handle, + psa_key_attributes_t *attributes) +{ +#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID, + .key_handle = handle, + }; + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = attributes, .len = sizeof(psa_key_attributes_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_get_key_attributes, + TFM_CRYPTO_GET_KEY_ATTRIBUTES); + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */ +} + +void psa_reset_key_attributes(psa_key_attributes_t *attributes) +{ +#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED + return; +#else + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID, + }; + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = attributes, .len = sizeof(psa_key_attributes_t)}, + }; + + psa_handle_t ipc_handle; + ipc_handle = psa_connect(TFM_CRYPTO_SID, TFM_CRYPTO_VERSION); + if (!PSA_HANDLE_IS_VALID(ipc_handle)) { + return; + } + + (void)API_DISPATCH(tfm_crypto_reset_key_attributes, + TFM_CRYPTO_RESET_KEY_ATTRIBUTES); + PSA_CLOSE(); + + return; +#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */ +} + +psa_status_t psa_export_key(psa_key_handle_t handle, + uint8_t *data, + size_t data_size, + size_t *data_length) +{ +#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_EXPORT_KEY_SID, + .key_handle = handle, + }; + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = data, .len = data_size} + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_export_key, + TFM_CRYPTO_EXPORT_KEY); + + *data_length = out_vec[0].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */ +} + +psa_status_t psa_export_public_key(psa_key_handle_t handle, + uint8_t *data, + size_t data_size, + size_t *data_length) +{ +#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID, + .key_handle = handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = data, .len = data_size} + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_export_public_key, + TFM_CRYPTO_EXPORT_PUBLIC_KEY); + + *data_length = out_vec[0].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */ +} + +psa_status_t psa_copy_key(psa_key_handle_t source_handle, + const psa_key_attributes_t *attributes, + psa_key_handle_t *target_handle) +{ +#ifdef TFM_CRYPTO_KEY_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_COPY_KEY_SID, + .key_handle = source_handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = attributes, .len = sizeof(psa_key_attributes_t)}, + + }; + + psa_outvec out_vec[] = { + {.base = target_handle, .len = sizeof(psa_key_handle_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_copy_key, + TFM_CRYPTO_COPY_KEY); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_KEY_MODULE_DISABLED */ +} + +psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation, + unsigned char *iv, + size_t iv_size, + size_t *iv_length) +{ +#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_CIPHER_GENERATE_IV_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + {.base = iv, .len = iv_size}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_cipher_generate_iv, + TFM_CRYPTO_CIPHER_GENERATE_IV); + + *iv_length = out_vec[1].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */ +} + +psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation, + const unsigned char *iv, + size_t iv_length) +{ +#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_CIPHER_SET_IV_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = iv, .len = iv_length}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_cipher_set_iv, + TFM_CRYPTO_CIPHER_SET_IV); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */ +} + +psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg) +{ +#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID, + .key_handle = handle, + .alg = alg, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_cipher_encrypt_setup, + TFM_CRYPTO_CIPHER_ENCRYPT_SETUP); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */ +} + +psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg) +{ +#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID, + .key_handle = handle, + .alg = alg, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_cipher_decrypt_setup, + TFM_CRYPTO_CIPHER_DECRYPT_SETUP); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */ +} + +psa_status_t psa_cipher_update(psa_cipher_operation_t *operation, + const uint8_t *input, + size_t input_length, + unsigned char *output, + size_t output_size, + size_t *output_length) +{ +#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_CIPHER_UPDATE_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = input, .len = input_length}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + {.base = output, .len = output_size} + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_cipher_update, + TFM_CRYPTO_CIPHER_UPDATE); + + *output_length = out_vec[1].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */ +} + +psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation) +{ +#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_CIPHER_ABORT_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_cipher_abort, + TFM_CRYPTO_CIPHER_ABORT); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */ +} + +psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ +#ifdef TFM_CRYPTO_CIPHER_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_CIPHER_FINISH_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + {.base = output, .len = output_size}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_cipher_finish, + TFM_CRYPTO_CIPHER_FINISH); + + *output_length = out_vec[1].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_CIPHER_MODULE_DISABLED */ +} + +psa_status_t psa_hash_setup(psa_hash_operation_t *operation, + psa_algorithm_t alg) +{ +#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_HASH_SETUP_SID, + .alg = alg, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_hash_setup, + TFM_CRYPTO_HASH_SETUP); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */ +} + +psa_status_t psa_hash_update(psa_hash_operation_t *operation, + const uint8_t *input, + size_t input_length) +{ +#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_HASH_UPDATE_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = input, .len = input_length}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_hash_update, + TFM_CRYPTO_HASH_UPDATE); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */ +} + +psa_status_t psa_hash_finish(psa_hash_operation_t *operation, + uint8_t *hash, + size_t hash_size, + size_t *hash_length) +{ +#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_HASH_FINISH_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + {.base = hash, .len = hash_size}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_hash_finish, + TFM_CRYPTO_HASH_FINISH); + + *hash_length = out_vec[1].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */ +} + +psa_status_t psa_hash_verify(psa_hash_operation_t *operation, + const uint8_t *hash, + size_t hash_length) +{ +#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_HASH_VERIFY_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = hash, .len = hash_length}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_hash_verify, + TFM_CRYPTO_HASH_VERIFY); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */ +} + +psa_status_t psa_hash_abort(psa_hash_operation_t *operation) +{ +#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_HASH_ABORT_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_hash_abort, + TFM_CRYPTO_HASH_ABORT); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */ +} + +psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation, + psa_hash_operation_t *target_operation) +{ +#ifdef TFM_CRYPTO_HASH_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_HASH_CLONE_SID, + .op_handle = source_operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = target_operation, .len = sizeof(psa_hash_operation_t)}, + }; + + if (target_operation && (target_operation->handle != 0)) { + return PSA_ERROR_BAD_STATE; + } + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_hash_clone, + TFM_CRYPTO_HASH_CLONE); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_HASH_MODULE_DISABLED */ +} + +psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg) +{ +#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_MAC_SIGN_SETUP_SID, + .key_handle = handle, + .alg = alg, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_mac_sign_setup, + TFM_CRYPTO_MAC_SIGN_SETUP); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */ +} + +psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg) +{ +#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_MAC_VERIFY_SETUP_SID, + .key_handle = handle, + .alg = alg, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_mac_verify_setup, + TFM_CRYPTO_MAC_VERIFY_SETUP); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */ +} + +psa_status_t psa_mac_update(psa_mac_operation_t *operation, + const uint8_t *input, + size_t input_length) +{ +#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_MAC_UPDATE_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = input, .len = input_length}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_mac_update, + TFM_CRYPTO_MAC_UPDATE); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */ +} + +psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation, + uint8_t *mac, + size_t mac_size, + size_t *mac_length) +{ +#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_MAC_SIGN_FINISH_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + {.base = mac, .len = mac_size}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_mac_sign_finish, + TFM_CRYPTO_MAC_SIGN_FINISH); + + *mac_length = out_vec[1].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */ +} + +psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation, + const uint8_t *mac, + size_t mac_length) +{ +#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_MAC_VERIFY_FINISH_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = mac, .len = mac_length}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_mac_verify_finish, + TFM_CRYPTO_MAC_VERIFY_FINISH); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */ +} + +psa_status_t psa_mac_abort(psa_mac_operation_t *operation) +{ +#ifdef TFM_CRYPTO_MAC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_MAC_ABORT_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_mac_abort, + TFM_CRYPTO_MAC_ABORT); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_MAC_MODULE_DISABLED */ +} + +psa_status_t psa_aead_encrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *nonce, + size_t nonce_length, + const uint8_t *additional_data, + size_t additional_data_length, + const uint8_t *plaintext, + size_t plaintext_length, + uint8_t *ciphertext, + size_t ciphertext_size, + size_t *ciphertext_length) +{ +#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_AEAD_ENCRYPT_SID, + .key_handle = handle, + .alg = alg, + .aead_in = {.nonce = {0}, .nonce_length = nonce_length} + }; + + /* Sanitize the optional input */ + if ((additional_data == NULL) && (additional_data_length != 0)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + size_t idx = 0; + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = plaintext, .len = plaintext_length}, + {.base = additional_data, .len = additional_data_length}, + }; + psa_outvec out_vec[] = { + {.base = ciphertext, .len = ciphertext_size}, + }; + + if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + if (nonce != NULL) { + for (idx = 0; idx < nonce_length; idx++) { + iov.aead_in.nonce[idx] = nonce[idx]; + } + } + + PSA_CONNECT(TFM_CRYPTO); + + size_t in_len = ARRAY_SIZE(in_vec); + if (additional_data == NULL) { + in_len--; + } + status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len, + out_vec, ARRAY_SIZE(out_vec)); + + *ciphertext_length = out_vec[0].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */ +} + +psa_status_t psa_aead_decrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *nonce, + size_t nonce_length, + const uint8_t *additional_data, + size_t additional_data_length, + const uint8_t *ciphertext, + size_t ciphertext_length, + uint8_t *plaintext, + size_t plaintext_size, + size_t *plaintext_length) +{ +#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_AEAD_DECRYPT_SID, + .key_handle = handle, + .alg = alg, + .aead_in = {.nonce = {0}, .nonce_length = nonce_length} + }; + + /* Sanitize the optional input */ + if ((additional_data == NULL) && (additional_data_length != 0)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + size_t idx = 0; + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = ciphertext, .len = ciphertext_length}, + {.base = additional_data, .len = additional_data_length}, + }; + psa_outvec out_vec[] = { + {.base = plaintext, .len = plaintext_size}, + }; + + if (nonce_length > TFM_CRYPTO_MAX_NONCE_LENGTH) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + if (nonce != NULL) { + for (idx = 0; idx < nonce_length; idx++) { + iov.aead_in.nonce[idx] = nonce[idx]; + } + } + + PSA_CONNECT(TFM_CRYPTO); + + size_t in_len = ARRAY_SIZE(in_vec); + if (additional_data == NULL) { + in_len--; + } + status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len, + out_vec, ARRAY_SIZE(out_vec)); + + *plaintext_length = out_vec[0].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */ +} + +psa_status_t psa_asymmetric_sign(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length) +{ + return psa_sign_hash(handle, alg, hash, hash_length, signature, signature_size, signature_length); +} + +psa_status_t psa_sign_hash(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + uint8_t *signature, + size_t signature_size, + size_t *signature_length) +{ +#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_SIGN_HASH_SID, + .key_handle = handle, + .alg = alg, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = hash, .len = hash_length}, + }; + psa_outvec out_vec[] = { + {.base = signature, .len = signature_size}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_sign_hash, + TFM_CRYPTO_SIGN_HASH); + + *signature_length = out_vec[0].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */ +} + +psa_status_t psa_asymmetric_verify(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + const uint8_t *signature, + size_t signature_length) +{ + return psa_verify_hash(handle, alg, hash, hash_length, signature, signature_length); +} + +psa_status_t psa_verify_hash(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *hash, + size_t hash_length, + const uint8_t *signature, + size_t signature_length) +{ +#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_VERIFY_HASH_SID, + .key_handle = handle, + .alg = alg + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = hash, .len = hash_length}, + {.base = signature, .len = signature_length} + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH_NO_OUTVEC(tfm_crypto_verify_hash, + TFM_CRYPTO_VERIFY_HASH); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */ +} + +psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *salt, + size_t salt_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ +#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID, + .key_handle = handle, + .alg = alg + }; + + /* Sanitize the optional input */ + if ((salt == NULL) && (salt_length != 0)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = input, .len = input_length}, + {.base = salt, .len = salt_length} + }; + + psa_outvec out_vec[] = { + {.base = output, .len = output_size}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + size_t in_len = ARRAY_SIZE(in_vec); + if (salt == NULL) { + in_len--; + } + status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len, + out_vec, ARRAY_SIZE(out_vec)); + + *output_length = out_vec[0].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */ +} + +psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *salt, + size_t salt_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ +#ifdef TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID, + .key_handle = handle, + .alg = alg + }; + + /* Sanitize the optional input */ + if ((salt == NULL) && (salt_length != 0)) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = input, .len = input_length}, + {.base = salt, .len = salt_length} + }; + + psa_outvec out_vec[] = { + {.base = output, .len = output_size}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + size_t in_len = ARRAY_SIZE(in_vec); + if (salt == NULL) { + in_len--; + } + status = psa_call(ipc_handle, PSA_IPC_CALL, in_vec, in_len, + out_vec, ARRAY_SIZE(out_vec)); + + *output_length = out_vec[0].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_ASYMMETRIC_MODULE_DISABLED */ +} + +psa_status_t psa_key_derivation_get_capacity( + const psa_key_derivation_operation_t *operation, + size_t *capacity) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + + psa_outvec out_vec[] = { + {.base = capacity, .len = sizeof(size_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_key_derivation_get_capacity, + TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_key_derivation_output_bytes( + psa_key_derivation_operation_t *operation, + uint8_t *output, + size_t output_length) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + + psa_outvec out_vec[] = { + {.base = output, .len = output_length}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_key_derivation_output_bytes, + TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_key_derivation_input_key( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + psa_key_handle_t handle) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID, + .key_handle = handle, + .step = step, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_key, + TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_key_derivation_abort( + psa_key_derivation_operation_t *operation) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_KEY_DERIVATION_ABORT_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_key_derivation_abort, + TFM_CRYPTO_KEY_DERIVATION_ABORT); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_key_derivation_key_agreement( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + psa_key_handle_t private_key, + const uint8_t *peer_key, + size_t peer_key_length) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID, + .key_handle = private_key, + .step = step, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = peer_key, .len = peer_key_length}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_key_agreement, + TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_generate_random(uint8_t *output, + size_t output_size) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_GENERATE_RANDOM_SID, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + + psa_outvec out_vec[] = { + {.base = output, .len = output_size}, + }; + + if (output_size == 0) { + return PSA_SUCCESS; + } + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_generate_random, + TFM_CRYPTO_GENERATE_RANDOM); + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_generate_key(const psa_key_attributes_t *attributes, + psa_key_handle_t *handle) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_GENERATE_KEY_SID, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = attributes, .len = sizeof(psa_key_attributes_t)}, + }; + + psa_outvec out_vec[] = { + {.base = handle, .len = sizeof(psa_key_handle_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_generate_key, + TFM_CRYPTO_GENERATE_KEY); + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes, + psa_key_type_t type, + const uint8_t *data, + size_t data_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_get_key_domain_parameters( + const psa_key_attributes_t *attributes, + uint8_t *data, + size_t data_size, + size_t *data_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_hash_compare(psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *hash, + const size_t hash_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation, + const uint8_t *input, + size_t input_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_finish(psa_aead_operation_t *operation, + uint8_t *ciphertext, + size_t ciphertext_size, + size_t *ciphertext_length, + uint8_t *tag, + size_t tag_size, + size_t *tag_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_verify(psa_aead_operation_t *operation, + uint8_t *plaintext, + size_t plaintext_size, + size_t *plaintext_length, + const uint8_t *tag, + size_t tag_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_abort(psa_aead_operation_t *operation) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_mac_compute(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *mac, + size_t mac_size, + size_t *mac_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_mac_verify(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + const uint8_t *mac, + const size_t mac_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_cipher_encrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_cipher_decrypt(psa_key_handle_t handle, + psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_raw_key_agreement(psa_algorithm_t alg, + psa_key_handle_t private_key, + const uint8_t *peer_key, + size_t peer_key_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_RAW_KEY_AGREEMENT_SID, + .alg = alg, + .key_handle = private_key + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = peer_key, .len = peer_key_length}, + }; + + psa_outvec out_vec[] = { + {.base = output, .len = output_size}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_raw_key_agreement, + TFM_CRYPTO_RAW_KEY_AGREEMENT); + + *output_length = out_vec[0].len; + + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_key_derivation_setup(psa_key_derivation_operation_t *operation, + psa_algorithm_t alg) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SETUP_SID, + .alg = alg, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + psa_outvec out_vec[] = { + {.base = &(operation->handle), .len = sizeof(uint32_t)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_key_derivation_setup, + TFM_CRYPTO_KEY_DERIVATION_SETUP); + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_key_derivation_set_capacity( + psa_key_derivation_operation_t *operation, + size_t capacity) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID, + .capacity = capacity, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_set_capacity, + TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY); + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_key_derivation_input_bytes( + psa_key_derivation_operation_t *operation, + psa_key_derivation_step_t step, + const uint8_t *data, + size_t data_length) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID, + .step = step, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = data, .len = data_length}, + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH_NO_OUTVEC(tfm_crypto_key_derivation_input_bytes, + TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES); + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_key_derivation_output_key( + const psa_key_attributes_t *attributes, + psa_key_derivation_operation_t *operation, + psa_key_handle_t *handle) +{ +#ifdef TFM_CRYPTO_GENERATOR_MODULE_DISABLED + return PSA_ERROR_NOT_SUPPORTED; +#else + psa_status_t status; + struct tfm_crypto_pack_iovec iov = { + .sfn_id = TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID, + .op_handle = operation->handle, + }; + + psa_invec in_vec[] = { + {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)}, + {.base = attributes, .len = sizeof(psa_key_attributes_t)}, + }; + + psa_outvec out_vec[] = { + {.base = handle, .len = sizeof(psa_key_handle_t)} + }; + + PSA_CONNECT(TFM_CRYPTO); + + status = API_DISPATCH(tfm_crypto_key_derivation_output_key, + TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY); + PSA_CLOSE(); + + return status; +#endif /* TFM_CRYPTO_GENERATOR_MODULE_DISABLED */ +} + +psa_status_t psa_hash_compute(psa_algorithm_t alg, + const uint8_t *input, + size_t input_length, + uint8_t *hash, + size_t hash_size, + size_t *hash_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation, + psa_key_handle_t handle, + psa_algorithm_t alg) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation, + uint8_t *nonce, + size_t nonce_size, + size_t *nonce_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation, + const uint8_t *nonce, + size_t nonce_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation, + size_t ad_length, + size_t plaintext_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} + +psa_status_t psa_aead_update(psa_aead_operation_t *operation, + const uint8_t *input, + size_t input_length, + uint8_t *output, + size_t output_size, + size_t *output_length) +{ + psa_status_t status; + + status = PSA_ERROR_NOT_SUPPORTED; + + return status; +} diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_initial_attestation_ipc_api.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_initial_attestation_ipc_api.c new file mode 100644 index 00000000000..78f9dec6f45 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_initial_attestation_ipc_api.c @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include "psa/initial_attestation.h" +#include "tfm_ns_interface.h" +#include "psa/client.h" +#include "psa/crypto_types.h" +#include "psa_manifest/sid.h" + +#define IOVEC_LEN(x) (sizeof(x)/sizeof(x[0])) + +psa_status_t +psa_initial_attest_get_token(const uint8_t *auth_challenge, + size_t challenge_size, + uint8_t *token_buf, + size_t token_buf_size, + size_t *token_size) +{ + psa_handle_t handle = PSA_NULL_HANDLE; + psa_status_t status; + + psa_invec in_vec[] = { + {auth_challenge, challenge_size} + }; + psa_outvec out_vec[] = { + {token_buf, token_buf_size} + }; + + handle = psa_connect(TFM_ATTEST_GET_TOKEN_SID, + TFM_ATTEST_GET_TOKEN_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_HANDLE_TO_ERROR(handle); + } + + status = psa_call(handle, PSA_IPC_CALL, + in_vec, IOVEC_LEN(in_vec), + out_vec, IOVEC_LEN(out_vec)); + psa_close(handle); + + if (status == PSA_SUCCESS) { + *token_size = out_vec[0].len; + } + + return status; +} + +psa_status_t +psa_initial_attest_get_token_size(size_t challenge_size, + size_t *token_size) +{ + psa_handle_t handle = PSA_NULL_HANDLE; + psa_status_t status; + psa_invec in_vec[] = { + {&challenge_size, sizeof(challenge_size)} + }; + psa_outvec out_vec[] = { + {token_size, sizeof(size_t)} + }; + + handle = psa_connect(TFM_ATTEST_GET_TOKEN_SIZE_SID, + TFM_ATTEST_GET_TOKEN_SIZE_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_HANDLE_TO_ERROR(handle); + } + + status = psa_call(handle, PSA_IPC_CALL, + in_vec, IOVEC_LEN(in_vec), + out_vec, IOVEC_LEN(out_vec)); + psa_close(handle); + + return status; +} + +psa_status_t +tfm_initial_attest_get_public_key(uint8_t *public_key, + size_t public_key_buf_size, + size_t *public_key_len, + psa_ecc_curve_t *elliptic_curve_type) +{ + psa_handle_t handle = PSA_NULL_HANDLE; + psa_status_t status; + + psa_outvec out_vec[] = { + {.base = public_key, .len = public_key_buf_size}, + {.base = elliptic_curve_type, .len = sizeof(*elliptic_curve_type)}, + {.base = public_key_len, .len = sizeof(*public_key_len)} + }; + + handle = psa_connect(TFM_ATTEST_GET_PUBLIC_KEY_SID, + TFM_ATTEST_GET_PUBLIC_KEY_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_HANDLE_TO_ERROR(handle); + } + + status = psa_call(handle, PSA_IPC_CALL, + NULL, 0, + out_vec, IOVEC_LEN(out_vec)); + psa_close(handle); + + return status; +} diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_its_ipc_api.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_its_ipc_api.c new file mode 100644 index 00000000000..9326f7b8e30 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_its_ipc_api.c @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include "psa/internal_trusted_storage.h" +#include "tfm_api.h" + +#include "psa/client.h" +#include "psa_manifest/sid.h" + +#define IOVEC_LEN(x) (sizeof(x)/sizeof(x[0])) + +psa_status_t psa_its_set(psa_storage_uid_t uid, + size_t data_length, + const void *p_data, + psa_storage_create_flags_t create_flags) +{ + psa_status_t status; + psa_handle_t handle; + + psa_invec in_vec[] = { + { .base = &uid, .len = sizeof(uid) }, + { .base = p_data, .len = data_length }, + { .base = &create_flags, .len = sizeof(create_flags) } + }; + + handle = psa_connect(TFM_ITS_SET_SID, TFM_ITS_SET_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_ERROR_GENERIC_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), NULL, 0); + + psa_close(handle); + + if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + return status; +} + +psa_status_t psa_its_get(psa_storage_uid_t uid, + size_t data_offset, + size_t data_size, + void *p_data, + size_t *p_data_length) +{ + psa_status_t status; + psa_handle_t handle; + + psa_invec in_vec[] = { + { .base = &uid, .len = sizeof(uid) }, + { .base = &data_offset, .len = sizeof(data_offset) } + }; + + psa_outvec out_vec[] = { + { .base = p_data, .len = data_size } + }; + + if (p_data_length == NULL) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + handle = psa_connect(TFM_ITS_GET_SID, TFM_ITS_GET_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_ERROR_GENERIC_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec, + IOVEC_LEN(out_vec)); + + psa_close(handle); + + if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + *p_data_length = out_vec[0].len; + + return status; +} + +psa_status_t psa_its_get_info(psa_storage_uid_t uid, + struct psa_storage_info_t *p_info) +{ + psa_status_t status; + psa_handle_t handle; + + psa_invec in_vec[] = { + { .base = &uid, .len = sizeof(uid) } + }; + + psa_outvec out_vec[] = { + { .base = p_info, .len = sizeof(*p_info) } + }; + + handle = psa_connect(TFM_ITS_GET_INFO_SID, TFM_ITS_GET_INFO_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_ERROR_GENERIC_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec, + IOVEC_LEN(out_vec)); + + psa_close(handle); + + if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + return status; +} + +psa_status_t psa_its_remove(psa_storage_uid_t uid) +{ + psa_status_t status; + psa_handle_t handle; + + psa_invec in_vec[] = { + { .base = &uid, .len = sizeof(uid) } + }; + + handle = psa_connect(TFM_ITS_REMOVE_SID, TFM_ITS_REMOVE_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_ERROR_GENERIC_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), NULL, 0); + + psa_close(handle); + + return status; +} diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_platform_ipc_api.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_platform_ipc_api.c new file mode 100644 index 00000000000..0c1edf463f8 --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_platform_ipc_api.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2019, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include +#include "tfm_platform_api.h" +#include "psa_manifest/sid.h" + +enum tfm_platform_err_t tfm_platform_system_reset(void) +{ + psa_status_t status = PSA_ERROR_CONNECTION_REFUSED; + psa_handle_t handle = PSA_NULL_HANDLE; + + handle = psa_connect(TFM_SP_PLATFORM_SYSTEM_RESET_SID, + TFM_SP_PLATFORM_SYSTEM_RESET_VERSION); + if (handle <= 0) { + return TFM_PLATFORM_ERR_SYSTEM_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, + NULL, 0, NULL, 0); + psa_close(handle); + + if (status < PSA_SUCCESS) { + return TFM_PLATFORM_ERR_SYSTEM_ERROR; + } else { + return (enum tfm_platform_err_t) status; + } + +} + +enum tfm_platform_err_t +tfm_platform_ioctl(tfm_platform_ioctl_req_t request, + psa_invec *input, psa_outvec *output) +{ + tfm_platform_ioctl_req_t req = request; + struct psa_invec in_vec[2] = { {0} }; + size_t inlen, outlen; + psa_status_t status = PSA_ERROR_CONNECTION_REFUSED; + psa_handle_t handle = PSA_NULL_HANDLE; + + in_vec[0].base = &req; + in_vec[0].len = sizeof(req); + if (input != NULL) { + in_vec[1].base = input->base; + in_vec[1].len = input->len; + inlen = 2; + } else { + inlen = 1; + } + + if (output != NULL) { + outlen = 1; + } else { + outlen = 0; + } + + handle = psa_connect(TFM_SP_PLATFORM_IOCTL_SID, + TFM_SP_PLATFORM_IOCTL_VERSION); + if (handle <= 0) { + return TFM_PLATFORM_ERR_SYSTEM_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, + in_vec, inlen, + output, outlen); + psa_close(handle); + + if (status < PSA_SUCCESS) { + return TFM_PLATFORM_ERR_SYSTEM_ERROR; + } else { + return (enum tfm_platform_err_t) status; + } +} + diff --git a/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_sst_ipc_api.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_sst_ipc_api.c new file mode 100644 index 00000000000..41304281f5f --- /dev/null +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/TARGET_TFM/src/tfm_sst_ipc_api.c @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2017-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include "psa/protected_storage.h" + +#include "tfm_ns_interface.h" +#include "psa_manifest/sid.h" + +#define IOVEC_LEN(x) (uint32_t)(sizeof(x)/sizeof(x[0])) + +psa_status_t psa_ps_set(psa_storage_uid_t uid, + size_t data_length, + const void *p_data, + psa_storage_create_flags_t create_flags) +{ + psa_status_t status; + psa_handle_t handle; + + psa_invec in_vec[] = { + { .base = &uid, .len = sizeof(uid) }, + { .base = p_data, .len = data_length }, + { .base = &create_flags, .len = sizeof(create_flags) } + }; + + handle = psa_connect(TFM_SST_SET_SID, TFM_SST_SET_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_ERROR_GENERIC_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), + NULL, 0); + + psa_close(handle); + + /* A parameter with a buffer pointer pointer that has data length longer + * than maximum permitted is treated as a secure violation. + * TF-M framework rejects the request with TFM_ERROR_INVALID_PARAMETER. + */ + if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + return status; +} + +psa_status_t psa_ps_get(psa_storage_uid_t uid, + size_t data_offset, + size_t data_size, + void *p_data, + size_t *p_data_length) +{ + psa_status_t status; + psa_handle_t handle; + + psa_invec in_vec[] = { + { .base = &uid, .len = sizeof(uid) }, + { .base = &data_offset, .len = sizeof(data_offset) } + }; + + psa_outvec out_vec[] = { + { .base = p_data, .len = data_size } + }; + + if (p_data_length == NULL) { + return PSA_ERROR_INVALID_ARGUMENT; + } + + handle = psa_connect(TFM_SST_GET_SID, TFM_SST_GET_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_ERROR_GENERIC_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec, + IOVEC_LEN(out_vec)); + + psa_close(handle); + + *p_data_length = out_vec[0].len; + + return status; +} + +psa_status_t psa_ps_get_info(psa_storage_uid_t uid, + struct psa_storage_info_t *p_info) +{ + psa_status_t status; + psa_handle_t handle; + + psa_invec in_vec[] = { + { .base = &uid, .len = sizeof(uid) } + }; + + psa_outvec out_vec[] = { + { .base = p_info, .len = sizeof(*p_info) } + }; + + handle = psa_connect(TFM_SST_GET_INFO_SID, TFM_SST_GET_INFO_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_ERROR_GENERIC_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), out_vec, + IOVEC_LEN(out_vec)); + + psa_close(handle); + + return status; +} + +psa_status_t psa_ps_remove(psa_storage_uid_t uid) +{ + psa_status_t status; + psa_handle_t handle; + + psa_invec in_vec[] = { + { .base = &uid, .len = sizeof(uid) } + }; + + + handle = psa_connect(TFM_SST_REMOVE_SID, TFM_SST_REMOVE_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return PSA_ERROR_GENERIC_ERROR; + } + + status = psa_call(handle, PSA_IPC_CALL, in_vec, IOVEC_LEN(in_vec), + NULL, 0); + + psa_close(handle); + + return status; +} + +psa_status_t psa_ps_create(psa_storage_uid_t uid, size_t size, + psa_storage_create_flags_t create_flags) +{ + (void)uid; + (void)size; + (void)create_flags; + + return PSA_ERROR_NOT_SUPPORTED; +} + +psa_status_t psa_ps_set_extended(psa_storage_uid_t uid, size_t data_offset, + size_t data_length, const void *p_data) +{ + (void)uid; + (void)data_offset; + (void)data_length; + (void)p_data; + + return PSA_ERROR_NOT_SUPPORTED; +} + +uint32_t psa_ps_get_support(void) +{ + /* Initialise support_flags to a sensible default, to avoid returning an + * uninitialised value in case the secure function fails. + */ + uint32_t support_flags = 0; + psa_handle_t handle; + + psa_outvec out_vec[] = { + { .base = &support_flags, .len = sizeof(support_flags) } + }; + + /* The PSA API does not return an error, so any error from TF-M is + * ignored. + */ + handle = psa_connect(TFM_SST_GET_SUPPORT_SID, TFM_SST_GET_SUPPORT_VERSION); + if (!PSA_HANDLE_IS_VALID(handle)) { + return support_flags; + } + + (void)psa_call(handle, PSA_IPC_CALL, NULL, 0, out_vec, IOVEC_LEN(out_vec)); + + psa_close(handle); + + return support_flags; +} diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/COMPONENT_PSA_SRV_IMPL/inc/default_random_seed.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/inc/default_random_seed.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/COMPONENT_PSA_SRV_IMPL/inc/default_random_seed.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/inc/default_random_seed.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/inc/psa/tfm_platform_api.h b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/inc/psa/tfm_platform_api.h similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/inc/psa/tfm_platform_api.h rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/inc/psa/tfm_platform_api.h diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/mbed_lib.json b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/mbed_lib.json similarity index 100% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/mbed_lib.json rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/mbed_lib.json diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/COMPONENT_NSPE/src/psa_hrng.c b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/src/psa_hrng.c similarity index 86% rename from features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/COMPONENT_NSPE/src/psa_hrng.c rename to features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/src/psa_hrng.c index 15897f47d65..f5c0a30b8bc 100644 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/COMPONENT_NSPE/src/psa_hrng.c +++ b/features/FEATURE_EXPERIMENTAL_API/FEATURE_PSA/src/psa_hrng.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2018 ARM Limited +/* Copyright (c) 2018-2020 ARM Limited * * SPDX-License-Identifier: Apache-2.0 * @@ -19,8 +19,6 @@ #include "crypto.h" #include "mbed_toolchain.h" -#if (defined(DEVICE_TRNG) && defined(MBEDTLS_PSA_CRYPTO_C)) - MBED_WEAK void trng_init(trng_t *obj) { (void)(obj); @@ -45,7 +43,6 @@ MBED_WEAK int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t } status = psa_generate_random(output, length); - mbedtls_psa_crypto_free(); if (status != PSA_SUCCESS) { return -1; } @@ -54,5 +51,3 @@ MBED_WEAK int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t return 0; } - -#endif // (defined(DEVICE_TRNG) && defiend(MBEDTLS_PSA_CRYPTO_C)) diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/COMPONENT_NSPE/interface/src/tfm_ns_lock_rtx.c b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/COMPONENT_NSPE/interface/src/tfm_ns_lock_rtx.c deleted file mode 100644 index d12d3487fe1..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/COMPONENT_NSPE/interface/src/tfm_ns_lock_rtx.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2017-2019, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ -#include -#include -#include "cmsis.h" -#include "rtx_os.h" -#include "cmsis_os2.h" -#include "tfm_api.h" -#include "tfm_ns_lock.h" - -/** - * \brief struct ns_lock_state type - */ -struct ns_lock_state -{ - bool init; - osMutexId_t id; -}; - -/** - * \brief ns_lock status - */ -static struct ns_lock_state ns_lock = {.init=false, .id=NULL}; - -/** - * \brief Mutex properties, NS lock - */ - -static osRtxMutex_t ns_lock_cb = { 0 }; - -static const osMutexAttr_t ns_lock_attrib = { - .name = "ns_lock", - .attr_bits = osMutexPrioInherit, - .cb_mem = &ns_lock_cb, - .cb_size = sizeof(ns_lock_cb) -}; - -/** - * \brief NS world, NS lock based dispatcher - */ -__attribute__((weak)) -uint32_t tfm_ns_lock_dispatch(veneer_fn fn, - uint32_t arg0, uint32_t arg1, - uint32_t arg2, uint32_t arg3) -{ - uint32_t result; - - /* Check the NS lock has been initialized */ - if (ns_lock.init == false) { - return TFM_ERROR_GENERIC; - } - - /* TFM request protected by NS lock */ - if (osMutexAcquire(ns_lock.id,osWaitForever) != osOK) { - return TFM_ERROR_GENERIC; - } - - result = fn(arg0, arg1, arg2, arg3); - - if (osMutexRelease(ns_lock.id) != osOK) { - return TFM_ERROR_GENERIC; - } - - return result; -} - -/** - * \brief NS world, Init NS lock - */ -__attribute__((weak)) -enum tfm_status_e tfm_ns_lock_init() -{ - if (ns_lock.init == false) { - ns_lock.id = osMutexNew(&ns_lock_attrib); - ns_lock.init = true; - return TFM_SUCCESS; - } - else { - return TFM_ERROR_GENERIC; - } -} - -bool tfm_ns_lock_get_init_state() -{ - return ns_lock.init; -} - diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/psa_service.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/psa_service.h deleted file mode 100644 index 6453aede8ba..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/psa_service.h +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2018-2019, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ - -#ifndef __PSA_SERVICE_H__ -#define __PSA_SERVICE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/********************** PSA Secure Partition Macros and Types ****************/ - -/* PSA wait timeouts */ -#define PSA_POLL (0x00000000u) -#define PSA_BLOCK (0x80000000u) - -/* A mask value that includes all Secure Partition signals */ -#define PSA_WAIT_ANY (~0u) - -/* Doorbell signal */ -#define PSA_DOORBELL (0x00000008u) - -/* PSA message types */ -#define PSA_IPC_CONNECT (1) -#define PSA_IPC_CALL (2) -#define PSA_IPC_DISCONNECT (3) - -/* Maximum number of input and output vectors */ -#define PSA_MAX_IOVEC (4) - -/* Return code from psa_get() */ -#define PSA_ERR_NOMSG (INT32_MIN + 3) - -/* Store a set of one or more Secure Partition signals */ -typedef uint32_t psa_signal_t; - -/** - * Describe a message received by an RoT Service after calling \ref psa_get(). - */ -typedef struct psa_msg_t { - uint32_t type; /* One of the following values: - * \ref PSA_IPC_CONNECT - * \ref PSA_IPC_CALL - * \ref PSA_IPC_DISCONNECT - */ - psa_handle_t handle; /* A reference generated by the SPM to the - * message returned by psa_get(). - */ - int32_t client_id; /* Partition ID of the sender of the message */ - void *rhandle; /* Be useful for binding a connection to some - * application-specific data or function - * pointer within the RoT Service - * implementation. - */ - size_t in_size[PSA_MAX_IOVEC]; /* Provide the size of each client input - * vector in bytes. - */ - size_t out_size[PSA_MAX_IOVEC];/* Provide the size of each client output - * vector in bytes. - */ -} psa_msg_t; - -/************************* PSA Secure Partition API **************************/ - -/** - * \brief Return the Secure Partition interrupt signals that have been asserted - * from a subset of signals provided by the caller. - * - * \param[in] signal_mask A set of signals to query. Signals that are not - * in this set will be ignored. - * \param[in] timeout Specify either blocking \ref PSA_BLOCK or - * polling \ref PSA_POLL operation. - * - * \retval >0 At least one signal is asserted. - * \retval 0 No signals are asserted. This is only seen when - * a polling timeout is used. - */ -psa_signal_t psa_wait(psa_signal_t signal_mask, uint32_t timeout); - -/** - * \brief Retrieve the message which corresponds to a given RoT Service signal - * and remove the message from the RoT Service queue. - * - * \param[in] signal The signal value for an asserted RoT Service. - * \param[out] msg Pointer to \ref psa_msg_t object for receiving - * the message. - * - * \retval PSA_SUCCESS Success, *msg will contain the delivered - * message. - * \retval PSA_ERR_NOMSG Message could not be delivered. - * \retval "Does not return" The call is invalid because one or more of the - * following are true: - * \arg signal has more than a single bit set. - * \arg signal does not correspond to an RoT Service. - * \arg The RoT Service signal is not currently - * asserted. - * \arg The msg pointer provided is not a valid memory - * reference. - */ -psa_status_t psa_get(psa_signal_t signal, psa_msg_t *msg); - -/** - * \brief Associate some RoT Service private data with a client connection. - * - * \param[in] msg_handle Handle for the client's message. - * \param[in] rhandle Reverse handle allocated by the RoT Service. - * - * \retval void Success, rhandle will be provided with all - * subsequent messages delivered on this - * connection. - * \retval "Does not return" msg_handle is invalid. - */ -void psa_set_rhandle(psa_handle_t msg_handle, void *rhandle); - -/** - * \brief Read a message parameter or part of a message parameter from a client - * input vector. - * - * \param[in] msg_handle Handle for the client's message. - * \param[in] invec_idx Index of the input vector to read from. Must be - * less than \ref PSA_MAX_IOVEC. - * \param[out] buffer Buffer in the Secure Partition to copy the - * requested data to. - * \param[in] num_bytes Maximum number of bytes to be read from the - * client input vector. - * - * \retval >0 Number of bytes copied. - * \retval 0 There was no remaining data in this input - * vector. - * \retval "Does not return" The call is invalid, one or more of the - * following are true: - * \arg msg_handle is invalid. - * \arg msg_handle does not refer to a - * \ref PSA_IPC_CALL message. - * \arg invec_idx is equal to or greater than - * \ref PSA_MAX_IOVEC. - * \arg the memory reference for buffer is invalid or - * not writable. - */ -size_t psa_read(psa_handle_t msg_handle, uint32_t invec_idx, - void *buffer, size_t num_bytes); - -/** - * \brief Skip over part of a client input vector. - * - * \param[in] msg_handle Handle for the client's message. - * \param[in] invec_idx Index of input vector to skip from. Must be - * less than \ref PSA_MAX_IOVEC. - * \param[in] num_bytes Maximum number of bytes to skip in the client - * input vector. - * - * \retval >0 Number of bytes skipped. - * \retval 0 There was no remaining data in this input - * vector. - * \retval "Does not return" The call is invalid, one or more of the - * following are true: - * \arg msg_handle is invalid. - * \arg msg_handle does not refer to a - * \ref PSA_IPC_CALL message. - * \arg invec_idx is equal to or greater than - * \ref PSA_MAX_IOVEC. - */ -size_t psa_skip(psa_handle_t msg_handle, uint32_t invec_idx, size_t num_bytes); - -/** - * \brief Write a message response to a client output vector. - * - * \param[in] msg_handle Handle for the client's message. - * \param[out] outvec_idx Index of output vector in message to write to. - * Must be less than \ref PSA_MAX_IOVEC. - * \param[in] buffer Buffer with the data to write. - * \param[in] num_bytes Number of bytes to write to the client output - * vector. - * - * \retval void Success - * \retval "Does not return" The call is invalid, one or more of the - * following are true: - * \arg msg_handle is invalid. - * \arg msg_handle does not refer to a - * \ref PSA_IPC_CALL message. - * \arg outvec_idx is equal to or greater than - * \ref PSA_MAX_IOVEC. - * \arg The memory reference for buffer is invalid. - * \arg The call attempts to write data past the end - * of the client output vector. - */ -void psa_write(psa_handle_t msg_handle, uint32_t outvec_idx, - const void *buffer, size_t num_bytes); - -/** - * \brief Complete handling of a specific message and unblock the client. - * - * \param[in] msg_handle Handle for the client's message. - * \param[in] status Message result value to be reported to the - * client. - * - * \retval void Success. - * \retval "Does not return" The call is invalid, one or more of the - * following are true: - * \arg msg_handle is invalid. - * \arg An invalid status code is specified for the - * type of message. - */ -void psa_reply(psa_handle_t msg_handle, psa_status_t status); - -/** - * \brief Send a PSA_DOORBELL signal to a specific Secure Partition. - * - * \param[in] partition_id Secure Partition ID of the target partition. - * - * \retval void Success. - * \retval "Does not return" partition_id does not correspond to a Secure - * Partition. - */ -void psa_notify(int32_t partition_id); - -/** - * \brief Clear the PSA_DOORBELL signal. - * - * \retval void Success. - * \retval "Does not return" The Secure Partition's doorbell signal is not - * currently asserted. - */ -void psa_clear(void); - -/** - * \brief Inform the SPM that an interrupt has been handled (end of interrupt). - * - * \param[in] irq_signal The interrupt signal that has been processed. - * - * \retval void Success. - * \retval "Does not return" The call is invalid, one or more of the - * following are true: - * \arg irq_signal is not an interrupt signal. - * \arg irq_signal indicates more than one signal. - * \arg irq_signal is not currently asserted. - */ -void psa_eoi(psa_signal_t irq_signal); - -#ifdef __cplusplus -} -#endif - -#endif /* __PSA_SERVICE_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_api.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_api.h deleted file mode 100644 index d6ce6893a07..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_api.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2017-2019, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ - -#ifndef __TFM_API_H__ -#define __TFM_API_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "psa_client.h" - -#define TFM_INVALID_CLIENT_ID 0 - -/** - * \brief Checks if the provided client ID is a secure client ID. - * - * \param[in] client_id Client ID to check - * - * \return Returns 1 if the client Id is secure. Otherwise, returns 0. - */ -#define TFM_CLIENT_ID_IS_S(client_id) ((client_id)>0) - -/** - * \brief Checks if the provided client ID is a non-secure client ID. - * - * \param[in] client_id Client ID to check - * - * \return Returns 1 if the client Id is non-secure. Otherwise, returns 0. - */ -#define TFM_CLIENT_ID_IS_NS(client_id) ((client_id)<0) - -/* Maximum number of input and output vectors */ -#define PSA_MAX_IOVEC (4) - -/* FixMe: sort out DEBUG compile option and limit return value options - * on external interfaces */ -/* For secure functions using prorietary signatures - * TFM will only return values recognized and parsed by TFM core. - * Service return codes are not automatically passed on to REE. - * Any non-zero return value is interpreted as an error that may trigger - * TEE error handling flow. - * For secure functions using the veneers in secure_fw/ns_callable/tfm_veneers.c - * (iovec API) this limitation does not apply. - */ -enum tfm_status_e -{ - TFM_SUCCESS = 0, - TFM_PARTITION_BUSY, - TFM_ERROR_SECURE_DOMAIN_LOCKED, - TFM_ERROR_INVALID_PARAMETER, - TFM_ERROR_PARTITION_NON_REENTRANT, - TFM_ERROR_NS_THREAD_MODE_CALL, - TFM_ERROR_NOT_INITIALIZED, - TFM_ERROR_NO_ACTIVE_PARTITION, - TFM_ERROR_INVALID_EXC_MODE, - TFM_SECURE_LOCK_FAILED, - TFM_SECURE_UNLOCK_FAILED, - TFM_ERROR_GENERIC = 0x1F, - TFM_PARTITION_SPECIFIC_ERROR_MIN, -}; - -//==================== Secure function declarations ==========================// - -/** - * \brief Assign client ID to the current TZ context - * - * \param[in] ns_client_id The client ID to be assigned to the current - * context - * \return TFM_SUCCESS if the client ID assigned successfully, an error code - * according to \ref tfm_status_e in case of error. - * - * \note This function have to be called from handler mode. - */ -enum tfm_status_e tfm_register_client_id (int32_t ns_client_id); - -/** - * \brief Retrieve the version of the PSA Framework API that is implemented - * - * \return The version of the PSA Framework - */ -uint32_t tfm_psa_framework_version_veneer(void); - -/** - * \brief Return version of secure function provided by secure binary - * - * \param[in] sid ID of secure service - * - * \return Version number of secure function - */ -uint32_t tfm_psa_version_veneer(uint32_t sid); - -/** - * \brief Connect to secure function - * - * \param[in] sid ID of secure service - * \param[in] minor_version Minor version of SF requested by client - * - * \return Returns handle to connection - */ -psa_handle_t tfm_psa_connect_veneer(uint32_t sid, uint32_t minor_version); - -/** - * \brief Call a secure function referenced by a connection handle - * - * \param[in] handle Handle to connection - * \param[in] in_vecs invec containing pointer/count of input vectors - * \param[in] out_vecs outvec containing pointer/count of output vectors - * - * \return Returns \ref psa_status_t status code - */ -psa_status_t tfm_psa_call_veneer(psa_handle_t handle, - const psa_invec *in_vecs, - psa_outvec *out_vecs); - -/** - * \brief Close connection to secure function referenced by a connection handle - * - * \param[in] handle Handle to connection - * - * \return Returns \ref psa_status_t status code - */ -psa_status_t tfm_psa_close_veneer(psa_handle_t handle); - -//================ End Secure function declarations ==========================// - -#ifdef __cplusplus -} -#endif - -#endif /* __TFM_API_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_ns_lock.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_ns_lock.h deleted file mode 100644 index d9acd005286..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_ns_lock.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2017-2019, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ -#ifndef __TFM_NS_LOCK_H__ -#define __TFM_NS_LOCK_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "tfm_api.h" - -typedef int32_t (*veneer_fn) (uint32_t arg0, uint32_t arg1, - uint32_t arg2, uint32_t arg3); - -/** - * \brief NS world, NS lock based dispatcher - * - * \details To be called from the wrapper API interface - */ - -uint32_t tfm_ns_lock_dispatch(veneer_fn fn, - uint32_t arg0, uint32_t arg1, - uint32_t arg2, uint32_t arg3); - -/** - * \brief NS world, Init NS lock - * - * \details Needs to be called during non-secure app init - * to initialize the TFM NS lock object - */ -enum tfm_status_e tfm_ns_lock_init(); - -#ifdef __cplusplus -} -#endif - -#endif /* __TFM_NS_LOCK_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_nspm_svc_handler.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_nspm_svc_handler.h deleted file mode 100644 index 73f75a95e13..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/interface/include/tfm_nspm_svc_handler.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2018, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ - -#ifndef __TFM_NSPM_SVC_HANDLER_H__ -#define __TFM_NSPM_SVC_HANDLER_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Reports the client ID of this task to TF-M (SVC function) - * - * \param [in] client_id Client ID to register. - * - * \return Returns 1 if the client ID was successfully reported 0 otherwise - */ -uint32_t tfm_nspm_svc_register_client_id(uint32_t client_id); - -#ifdef __cplusplus -} -#endif - -#endif /* __TFM_NSPM_SVC_HANDLER_H__ */ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/mbed_lib.json b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/mbed_lib.json deleted file mode 100644 index 0cf8e65ea23..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/TARGET_TFM/mbed_lib.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "tfm", - "macros": [ - "TFM_PSA_API", "MBED_TZ_DEFAULT_ACCESS=1" - ], - "config": { - "level": { - "help": "TFM security level", - "macro_name": "TFM_LVL", - "value": 1 - }, - "handle_pool_size": { - "help": "maximum number of handles that can be opened at the same time", - "macro_name": "TFM_CONN_HANDLE_MAX_NUM", - "value": 10 - }, - "rot_pool_size": { - "help": "maximum number of RoT services allowed", - "macro_name": "TFM_SPM_MAX_ROT_SERV_NUM", - "value": 32 - }, - "message_pool_size": { - "help": "maximum number of active messages allowed", - "macro_name": "TFM_MSG_QUEUE_MAX_MSG_NUM", - "value": 10 - } - } -} - diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/client.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/client.h deleted file mode 100644 index effc0ced3e1..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa/client.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (c) 2017-2018 ARM Limited - * - * 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(TARGET_TFM) -#include "interface/include/psa_client.h" -#else - -#ifndef __MBED_OS_DEFAULT_PSA_CLIENT_API_H__ -#define __MBED_OS_DEFAULT_PSA_CLIENT_API_H__ - -#include -#include "psa/error.h" - -#if !defined(UINT32_MAX) -#define UINT32_MAX ((uint32_t)-1) -#endif - -#if !defined(INT32_MIN) -#define INT32_MIN (-0x7fffffff - 1) -#endif - -#define PSA_FRAMEWORK_VERSION (0x0100) /**< Version of the PSA Framework API. */ -#define PSA_VERSION_NONE (0L) /**< Identifier for an unimplemented Root of Trust (RoT) Service. */ -#define PSA_CONNECTION_REFUSED (INT32_MIN + 1) /**< The return value from psa_connect() if the RoT Service or SPM was unable to establish a connection.*/ -#define PSA_CONNECTION_BUSY (INT32_MIN + 2) /**< The return value from psa_connect() if the RoT Service rejects the connection for a transient reason.*/ -#define PSA_DROP_CONNECTION (INT32_MIN) /**< The result code in a call to psa_reply() to indicate a nonrecoverable error in the client.*/ -#define PSA_NULL_HANDLE ((psa_handle_t)0) /**< Denotes an invalid handle.*/ - -typedef int32_t psa_handle_t; - -typedef struct psa_invec { - const void *base; /**< Starting address of the buffer.*/ - size_t len; /**< Length in bytes of the buffer.*/ -} psa_invec; - - -typedef struct psa_outvec { - void *base; /**< Starting address of the buffer.*/ - size_t len; /**< Length in bytes of the buffer.*/ -} psa_outvec; - -#endif // __MBED_OS_DEFAULT_PSA_CLIENT_API_H__ -#endif diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa_manifest/sid.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa_manifest/sid.h deleted file mode 100644 index 42fe92b669f..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/inc/psa_manifest/sid.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (c) 2017-2018 ARM Limited - * - * 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 __SID_H__ -#define __SID_H__ - -#include "autogen_sid.h" - -#endif // __SID_H__ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IPC/psa_attest_inject_key.c b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IPC/psa_attest_inject_key.c deleted file mode 100755 index 239b8d35df9..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IPC/psa_attest_inject_key.c +++ /dev/null @@ -1,55 +0,0 @@ -/* -* Copyright (c) 2018-2019 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. -*/ - -#include "psa_attest_inject_key.h" -#include "psa/crypto.h" -#include "psa/client.h" -#include "psa_manifest/sid.h" - -#define MINOR_VER 1 - -psa_status_t -psa_attestation_inject_key(const uint8_t *key_data, - size_t key_data_length, - psa_key_type_t type, - uint8_t *public_key_data, - size_t public_key_data_size, - size_t *public_key_data_length) -{ - psa_handle_t handle = PSA_NULL_HANDLE; - psa_status_t call_error = PSA_SUCCESS; - psa_invec in_vec[2] = { - { &type, sizeof(type) }, - { key_data, key_data_length } - }; - - psa_outvec out_vec[2] = { - { public_key_data, public_key_data_size }, - { public_key_data_length, sizeof(*public_key_data_length) } - }; - - handle = psa_connect(PSA_ATTEST_INJECT_KEY_ID, MINOR_VER); - if (handle <= 0) { - return (PSA_ERROR_COMMUNICATION_FAILURE); - } - - call_error = psa_call(handle, in_vec, 2, out_vec, 2); - - psa_close(handle); - return call_error; -} diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IPC/psa_initial_attestation_api.c b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IPC/psa_initial_attestation_api.c deleted file mode 100755 index ff90cc8530a..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/COMPONENT_PSA_SRV_IPC/psa_initial_attestation_api.c +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Copyright (c) 2018-2019 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. -*/ - -#include "psa_initial_attestation_api.h" -#include "psa/crypto.h" -#include "psa/client.h" -#include "attestation.h" -#include -#include "psa_manifest/sid.h" - -#define MINOR_VER 1 - -enum psa_attest_err_t -psa_initial_attest_get_token(const uint8_t *challenge_obj, - uint32_t challenge_size, - uint8_t *token, - uint32_t *token_size) { - psa_status_t err_call; - psa_handle_t handle = PSA_NULL_HANDLE; - - psa_invec in_vec[1] = { { challenge_obj, challenge_size } }; - psa_outvec out_vec[1] = { { token, *token_size } }; - - handle = psa_connect(PSA_ATTEST_GET_TOKEN_ID, MINOR_VER); - if (handle <= 0) - { - return (PSA_ATTEST_ERR_GENERAL); - } - - err_call = psa_call(handle, in_vec, 1, out_vec, 1); - psa_close(handle); - - if (err_call < 0) - { - err_call = PSA_ATTEST_ERR_GENERAL; - } - - return ((enum psa_attest_err_t) err_call); -} - -enum psa_attest_err_t -psa_initial_attest_get_token_size(uint32_t challenge_size, - uint32_t *token_size) { - psa_status_t err_call; - psa_handle_t handle = PSA_NULL_HANDLE; - psa_invec in_vec[1] = { { &challenge_size, sizeof(uint32_t) } }; - psa_outvec out_vec[1] = { { token_size, sizeof(uint32_t) } }; - - handle = psa_connect(PSA_ATTEST_GET_TOKEN_SIZE_ID, MINOR_VER); - if (handle <= 0) - { - return (PSA_ATTEST_ERR_GENERAL); - } - - err_call = psa_call(handle, in_vec, 1, out_vec, 1); - psa_close(handle); - - if (err_call < 0) - { - err_call = PSA_ATTEST_ERR_GENERAL; - } - - return ((enum psa_attest_err_t) err_call); -} diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE deleted file mode 100644 index 96810fdc927..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE +++ /dev/null @@ -1,2 +0,0 @@ -Unless specifically indicated otherwise in a file, TF-M files in this directory are licensed under the BSD-3-Clause license, -as can be found in: LICENSE-bsd-3-clause.txt diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE-BSD-3-Clause b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE-BSD-3-Clause deleted file mode 100644 index 476769c1fbc..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/attestation/LICENSE-BSD-3-Clause +++ /dev/null @@ -1,26 +0,0 @@ -Copyright 2019 Arm Limited and affiliates. -SPDX-License-Identifier: BSD-3-Clause - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. 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. -3. Neither the name of the copyright holder 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 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/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_platform_spe.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_platform_spe.h deleted file mode 100644 index 05fe728fbfe..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_platform_spe.h +++ /dev/null @@ -1,179 +0,0 @@ -/** - * \file psa/crypto_platform_spe.h - * - * \brief PSA cryptography module: Mbed TLS platfom definitions - */ -/* - * 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 PSA_CRYPTO_SPE_PLATFORM_H -#define PSA_CRYPTO_SPE_PLATFORM_H - -/* Include the Mbed TLS configuration file, the way Mbed TLS does it - * in each of its header files. */ -#if !defined(MBEDTLS_CONFIG_FILE) -#include "../mbedtls/config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -/** \defgroup PSA Crypto APIs -* @{ -*/ - -/** \brief psa_s_function_t enum defines for all the available functions in PSA Crypto. */ -typedef enum psa_sec_function_s { - PSA_CRYPTO_INVALID, - PSA_GET_KEY_ATTRIBUTES, - PSA_OPEN_KEY, - PSA_CLOSE_KEY, - PSA_IMPORT_KEY, - PSA_DESTROY_KEY, - PSA_EXPORT_KEY, - PSA_EXPORT_PUBLIC_KEY, - PSA_COPY_KEY, - PSA_HASH_COMPUTE, - PSA_HASH_COMPARE, - PSA_HASH_SETUP, - PSA_HASH_UPDATE, - PSA_HASH_FINISH, - PSA_HASH_VERIFY, - PSA_HASH_ABORT, - PSA_HASH_CLONE, - PSA_HASH_CLONE_BEGIN, - PSA_HASH_CLONE_END, - PSA_MAC_COMPUTE, - PSA_MAC_VERIFY, - PSA_MAC_SIGN_SETUP, - PSA_MAC_VERIFY_SETUP, - PSA_MAC_UPDATE, - PSA_MAC_SIGN_FINISH, - PSA_MAC_VERIFY_FINISH, - PSA_MAC_ABORT, - PSA_CIPHER_ENCRYPT, - PSA_CIPHER_DECRYPT, - PSA_CIPHER_ENCRYPT_SETUP, - PSA_CIPHER_DECRYPT_SETUP, - PSA_CIPHER_GENERATE_IV, - PSA_CIPHER_SET_IV, - PSA_CIPHER_UPDATE, - PSA_CIPHER_FINISH, - PSA_CIPHER_ABORT, - PSA_AEAD_ENCRYPT, - PSA_AEAD_DECRYPT, - PSA_AEAD_ENCRYPT_SETUP, - PSA_AEAD_DECRYPT_SETUP, - PSA_AEAD_GENERATE_NONCE, - PSA_AEAD_SET_NONCE, - PSA_AEAD_SET_LENGTHS, - PSA_AEAD_UPDATE_AD, - PSA_AEAD_UPDATE, - PSA_AEAD_FINISH, - PSA_AEAD_VERIFY, - PSA_AEAD_ABORT, - PSA_SIGN_HASH, - PSA_VERIFY_HASH, - PSA_ASYMMETRIC_ENCRYPT, - PSA_ASYMMETRIC_DECRYPT, - PSA_KEY_DERIVATION_SETUP, - PSA_KEY_DERIVATION_GET_CAPACITY, - PSA_KEY_DERIVATION_SET_CAPACITY, - PSA_KEY_DERIVATION_INPUT_BYTES, - PSA_KEY_DERIVATION_INPUT_KEY, - PSA_KEY_DERIVATION_KEY_AGREEMENT, - PSA_KEY_DERIVATION_OUTPUT_BYTES, - PSA_KEY_DERIVATION_OUTPUT_KEY, - PSA_KEY_DERIVATION_ABORT, - PSA_RAW_KEY_AGREEMENT, - PSA_GENERATE_RANDOM, - PSA_GENERATE_KEY, -} psa_sec_function_t; - -/**@}*/ - -/** \defgroup PSA Crypto structures for IPC -* @{ -*/ - -/** psa_crypto_ipc_s struct used for some of the - * PSA Crypto APIs that need psa_key_handle_t and psa_algorithm_t arguments - * and in order to use the existing infrastructure of the SPM-IPC we provide a struct to - * pack them together. - */ -typedef struct psa_crypto_ipc_s { - psa_sec_function_t func; - psa_key_handle_t handle; - psa_algorithm_t alg; -} psa_crypto_ipc_t; - -/** psa_crypto_derivation_ipc_s struct used for some of the - * PSA Crypto APIs that need psa_key_handle_t and psa_algorithm_t arguments - * and in order to use the existing infrastructure of the SPM-IPC we provide a struct to - * pack them together. - */ -typedef struct psa_crypto_derivation_ipc_s { - psa_sec_function_t func; - psa_key_handle_t handle; - psa_algorithm_t alg; - size_t capacity; -} psa_crypto_derivation_ipc_t; - -/** psa_key_mng_ipc_s struct used for some of the - * PSA Crypto APIs that need psa_key_handle_t and psa_algorithm_t arguments - * and in order to use the existing infrastructure of the SPM-IPC we provide a struct to - * pack them together. - */ -typedef struct psa_key_mng_ipc_s { - psa_key_handle_t handle; - psa_sec_function_t func; -} psa_key_mng_ipc_t; - -/** psa_crypto_ipc_aead_s struct used for AEAD integrated - * PSA Crypto APIs that need psa_key_handle_t and psa_algorithm_t and extra arguments - * and in order to use the existing infrastructure of the SPM-IPC we provide a struct to - * pack them together. - */ -// Max length supported for nonce is 16 bytes. -#define PSA_AEAD_MAX_NONCE_SIZE 16 -typedef struct psa_crypto_ipc_aead_s { - psa_sec_function_t func; - psa_key_handle_t handle; - psa_algorithm_t alg; - uint16_t nonce_size; - size_t additional_data_length; - size_t input_length; - uint8_t nonce[PSA_AEAD_MAX_NONCE_SIZE]; -} psa_crypto_ipc_aead_t; - -/** psa_crypto_ipc_asymmetric_s struct used for asymmetric - * PSA Crypto APIs that need psa_key_handle_t and psa_algorithm_t arguments - * and in order to use the existing infrastructure of the SPM-IPC we provide a struct to - * pack them together. - */ -typedef struct psa_crypto_ipc_asymmetric_s { - psa_sec_function_t func; - psa_key_handle_t handle; - psa_algorithm_t alg; - size_t input_length; - size_t salt_length; -} psa_crypto_ipc_asymmetric_t; - -/**@}*/ - -#endif /* PSA_CRYPTO_SPE_PLATFORM_H */ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_struct.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_struct.h deleted file mode 100644 index 465ccbb916e..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/crypto_struct.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2020, Arm Limited and affiliates. - * 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 "crypto_struct_ipc.h" diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c deleted file mode 100644 index c50004a8e9e..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/crypto/COMPONENT_PSA_SRV_IPC/psa_crypto_spm.c +++ /dev/null @@ -1,1636 +0,0 @@ -/* - * PSA crypto layer on top of Mbed TLS crypto - */ -/* 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) - */ - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "mbedtls/config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#if defined(MBEDTLS_PSA_CRYPTO_C) - -#include -#include -#include - -#include "psa_manifest/sid.h" -#include "psa/client.h" -#include "psa/crypto.h" -#include "crypto_platform_spe.h" -#include "mbed_assert.h" - -#define MINOR_VER 1 -#define CLIENT_PSA_KEY_ID_SIZE_IN_BYTES 4 - -MBED_STATIC_ASSERT(sizeof(psa_key_id_t) == CLIENT_PSA_KEY_ID_SIZE_IN_BYTES, "Unexpected psa_key_id_t size"); - -/****************************************************************/ -/* INTERNAL HELPER FUNCTIONS */ -/****************************************************************/ -static psa_status_t ipc_connect(uint32_t sid, psa_handle_t *handle) -{ - *handle = psa_connect(sid, MINOR_VER); - if (*handle <= PSA_NULL_HANDLE) { - return (PSA_ERROR_COMMUNICATION_FAILURE); - } - return (PSA_SUCCESS); -} - -static inline void ipc_close(psa_handle_t *handle) -{ - psa_close(*handle); - *handle = PSA_NULL_HANDLE; -} - -static psa_status_t ipc_call(psa_handle_t *handle, psa_invec *in_vec, size_t in_vec_size, - psa_outvec *out_vec, size_t out_vec_size, bool close) -{ - if (*handle <= PSA_NULL_HANDLE) { - return (PSA_ERROR_BAD_STATE); - } - - psa_status_t status = psa_call(*handle, in_vec, in_vec_size, out_vec, out_vec_size); - if (close) { - ipc_close(handle); - } - return (status); -} - -static psa_status_t ipc_oneshot(uint32_t sid, psa_invec *in_vec, size_t in_vec_size, - psa_outvec *out_vec, size_t out_vec_size) -{ - psa_handle_t handle = PSA_NULL_HANDLE; - psa_status_t status = ipc_connect(sid, &handle); - if (status != PSA_SUCCESS) { - return status; - } - status = ipc_call(&handle, in_vec, in_vec_size, out_vec, out_vec_size, true); - return (status); -} - - -/* - * PSA Crypto API (crypto.h) - */ - -psa_status_t psa_crypto_init(void) -{ - psa_status_t status = ipc_oneshot(PSA_CRYPTO_INIT_ID, NULL, 0, NULL, 0); - return (status); -} - -psa_status_t psa_get_key_attributes(psa_key_handle_t handle, - psa_key_attributes_t *attributes) -{ - psa_key_mng_ipc_t psa_key_mng_ipc = { - .func = PSA_GET_KEY_ATTRIBUTES, - .handle = handle - }; - - psa_invec in_vec = { &psa_key_mng_ipc, sizeof(psa_key_mng_ipc) }; - - psa_outvec out_vec = { attributes, sizeof(*attributes) }; - - return ipc_oneshot(PSA_KEY_MNG_ID, &in_vec, 1, &out_vec, 1); -} - -void psa_reset_key_attributes(psa_key_attributes_t *attributes) -{ - /* The reset of key attributes can happen entirely without going to the - * core. In fact, it can't go to the core without causing issues with - * memory ownership. Given that psa_set_key_domain_parameters(), which we - * currently don't allow in the client/server architecture, allocates - * memory that would be freed by psa_reset_key_attributes(), we must do - * this in the NSPE due to lack of memory ownership information in the - * core; the SPE can't currently know if any given allocation is valid to - * free for a given client. */ - - /* Note attributes->domain_parameters are currently ignored, as we don't - * currently support them in client/server architecture. */ - memset(attributes, 0, sizeof(*attributes)); -} - -psa_status_t psa_set_key_domain_parameters(psa_key_attributes_t *attributes, - psa_key_type_t type, - const uint8_t *data, - size_t data_length) -{ - return PSA_ERROR_NOT_SUPPORTED; -} - -psa_status_t psa_get_key_domain_parameters(const psa_key_attributes_t *attributes, - uint8_t *data, - size_t data_size, - size_t *data_length) -{ - return PSA_ERROR_NOT_SUPPORTED; -} - -psa_status_t psa_open_key(psa_key_id_t id, - psa_key_handle_t *handle) -{ - psa_key_mng_ipc_t psa_key_mng_ipc = { - .func = PSA_OPEN_KEY, - .handle = *handle, - }; - - psa_invec in_vec[2] = { - { &psa_key_mng_ipc, sizeof(psa_key_mng_ipc) }, - { &id, sizeof(id) } - }; - - psa_outvec out_vec = { handle, sizeof(*handle) }; - - psa_status_t status = ipc_oneshot(PSA_KEY_MNG_ID, in_vec, 2, &out_vec, 1); - return (status); -} - -psa_status_t psa_close_key(psa_key_handle_t handle) -{ - psa_key_mng_ipc_t psa_key_mng_ipc = { - .func = PSA_CLOSE_KEY, - .handle = handle, - }; - - psa_invec in_vec = { &psa_key_mng_ipc, sizeof(psa_key_mng_ipc) }; - - psa_status_t status = ipc_oneshot(PSA_KEY_MNG_ID, &in_vec, 1, NULL, 0); - return (status); -} - -psa_status_t psa_import_key(const psa_key_attributes_t *attributes, - const uint8_t *data, - size_t data_length, - psa_key_handle_t *handle) -{ - psa_key_mng_ipc_t psa_key_mng_ipc = { - .func = PSA_IMPORT_KEY, - .handle = 0, - }; - - psa_invec in_vec[3] = { - { &psa_key_mng_ipc, sizeof(psa_key_mng_ipc) }, - { attributes, sizeof(*attributes) }, - { data, data_length }, - }; - - psa_outvec out_vec = { handle, sizeof(*handle) }; - - return ipc_oneshot(PSA_KEY_MNG_ID, in_vec, 3, &out_vec, 1); -} - -psa_status_t psa_destroy_key(psa_key_handle_t handle) -{ - psa_key_mng_ipc_t psa_key_mng_ipc = { - .func = PSA_DESTROY_KEY, - .handle = handle, - }; - - psa_invec in_vec = { &psa_key_mng_ipc, sizeof(psa_key_mng_ipc) }; - - psa_status_t status = ipc_oneshot(PSA_KEY_MNG_ID, &in_vec, 1, NULL, 0); - return (status); -} - -static psa_status_t psa_export_key_common(psa_key_handle_t handle, - uint8_t *data, - size_t data_size, - size_t *data_length, - psa_sec_function_t func) -{ - psa_key_mng_ipc_t psa_key_mng_ipc = { - .func = func, - .handle = handle, - }; - - psa_invec in_vec = { &psa_key_mng_ipc, sizeof(psa_key_mng_ipc) }; - - psa_outvec out_vec[2] = { - { data, data_size }, - { data_length, sizeof(*data_length) } - }; - - psa_status_t status = ipc_oneshot(PSA_KEY_MNG_ID, &in_vec, 1, out_vec, 2); - return (status); -} - -psa_status_t psa_export_key(psa_key_handle_t handle, - uint8_t *data, - size_t data_size, - size_t *data_length) -{ - psa_status_t status = psa_export_key_common(handle, data, data_size, - data_length, PSA_EXPORT_KEY); - return (status); -} - -psa_status_t psa_export_public_key(psa_key_handle_t handle, - uint8_t *data, - size_t data_size, - size_t *data_length) -{ - psa_status_t status = psa_export_key_common(handle, data, data_size, - data_length, - PSA_EXPORT_PUBLIC_KEY); - return (status); -} - -psa_status_t psa_copy_key(psa_key_handle_t source_handle, - const psa_key_attributes_t *attributes, - psa_key_handle_t *target_handle) -{ - psa_key_mng_ipc_t psa_key_mng_ipc = { - .func = PSA_COPY_KEY, - .handle = source_handle, - }; - - psa_invec in_vec = { &psa_key_mng_ipc, sizeof(psa_key_mng_ipc) }; - - psa_outvec out_vec = { target_handle, sizeof(*target_handle) }; - - return ipc_oneshot(PSA_KEY_MNG_ID, &in_vec, 1, &out_vec, 1); -} - -psa_status_t psa_hash_compute(psa_algorithm_t alg, - const uint8_t *input, - size_t input_length, - uint8_t *hash, - size_t hash_size, - size_t *hash_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_HASH_COMPUTE, - .handle = 0, - .alg = alg, - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length } - }; - - psa_outvec out_vec[2] = { - { hash, hash_size }, - { hash_length, sizeof(*hash_length) } - }; - - return ipc_oneshot(PSA_HASH_ID, in_vec, 2, out_vec, 2); -} - -psa_status_t psa_hash_compare(psa_algorithm_t alg, - const uint8_t *input, - size_t input_length, - const uint8_t *hash, - const size_t hash_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_HASH_COMPARE, - .handle = 0, - .alg = alg, - }; - - psa_invec in_vec[3] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length }, - { hash, hash_length }, - }; - - return ipc_oneshot(PSA_HASH_ID, in_vec, 3, NULL, 0); -} - -psa_status_t psa_hash_setup(psa_hash_operation_t *operation, - psa_algorithm_t alg) -{ - if (operation->handle != PSA_NULL_HANDLE) { - return (PSA_ERROR_BAD_STATE); - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_HASH_SETUP, - .handle = 0, - .alg = alg - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_status_t status = ipc_connect(PSA_HASH_ID, &operation->handle); - if (status != PSA_SUCCESS) { - return (status); - } - status = ipc_call(&operation->handle, &in_vec, 1, NULL, 0, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - return (status); -} - -psa_status_t psa_hash_update(psa_hash_operation_t *operation, - const uint8_t *input, - size_t input_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_HASH_UPDATE, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length } - }; - - psa_status_t status = ipc_call(&operation->handle, in_vec, 2, NULL, 0, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - return (status); -} - -psa_status_t psa_hash_finish(psa_hash_operation_t *operation, - uint8_t *hash, - size_t hash_size, - size_t *hash_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_HASH_FINISH, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { &hash_size, sizeof(hash_size) } - }; - - psa_outvec out_vec[2] = { - { hash, hash_size }, - { hash_length, sizeof(*hash_length) } - }; - - psa_status_t status = ipc_call(&operation->handle, in_vec, 2, out_vec, 2, true); - return (status); -} - -psa_status_t psa_hash_verify(psa_hash_operation_t *operation, - const uint8_t *hash, - size_t hash_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_HASH_VERIFY, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[3] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { &hash_length, sizeof(hash_length) }, - { hash, hash_length } - }; - - psa_status_t status = ipc_call(&operation->handle, in_vec, 3, NULL, 0, true); - return (status); -} - -psa_status_t psa_hash_abort(psa_hash_operation_t *operation) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return (PSA_SUCCESS); - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_HASH_ABORT, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_status_t status = ipc_call(&operation->handle, &in_vec, 1, NULL, 0, true); - return (status); -} - -psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation, - psa_hash_operation_t *target_operation) -{ - if (source_operation->handle <= PSA_NULL_HANDLE || target_operation->handle != PSA_NULL_HANDLE) { - return (PSA_ERROR_BAD_STATE); - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = 0, - .handle = 0, - .alg = 0 - }; - - size_t index = 0; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { &index, sizeof(index) } - }; - - psa_outvec out_vec = { &index, sizeof(index) }; - - psa_status_t status = ipc_connect(PSA_HASH_ID, &target_operation->handle); - if (status != PSA_SUCCESS) { - return (status); - } - - psa_crypto_ipc.func = PSA_HASH_CLONE_BEGIN; - status = ipc_call((psa_handle_t *)&source_operation->handle, in_vec, 1, &out_vec, 1, false); - if (status != PSA_SUCCESS) { - goto exit; - } - - psa_crypto_ipc.func = PSA_HASH_CLONE_END; - status = ipc_call(&target_operation->handle, in_vec, 2, NULL, 0, false); - -exit: - if (status != PSA_SUCCESS) { - ipc_close(&target_operation->handle); - } - return (status); -} - -psa_status_t psa_mac_compute(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *input, - size_t input_length, - uint8_t *mac, - size_t mac_size, - size_t *mac_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_MAC_COMPUTE, - .handle = handle, - .alg = alg, - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length }, - }; - - psa_outvec out_vec[2] = { - { mac, mac_size }, - { mac_length, sizeof(*mac_length) }, - }; - - psa_status_t status = ipc_oneshot(PSA_MAC_ID, in_vec, 2, out_vec, 2); - return (status); -} - -psa_status_t psa_mac_verify(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *input, - size_t input_length, - const uint8_t *mac, - const size_t mac_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_MAC_VERIFY, - .handle = handle, - .alg = alg, - }; - - psa_invec in_vec[3] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length }, - { mac, mac_length }, - }; - - psa_status_t status = ipc_oneshot(PSA_MAC_ID, in_vec, 2, NULL, 0); - return (status); -} - -static psa_status_t psa_mac_setup(psa_mac_operation_t *operation, - psa_key_handle_t handle, - psa_algorithm_t alg, - psa_sec_function_t func) -{ - if (operation->handle != PSA_NULL_HANDLE) { - return (PSA_ERROR_BAD_STATE); - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = func, - .handle = handle, - .alg = alg - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_status_t status = ipc_connect(PSA_MAC_ID, &operation->handle); - if (status != PSA_SUCCESS) { - return (status); - } - status = ipc_call(&operation->handle, &in_vec, 1, NULL, 0, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - return (status); -} - -psa_status_t psa_mac_sign_setup(psa_mac_operation_t *operation, - psa_key_handle_t handle, - psa_algorithm_t alg) -{ - psa_status_t status = psa_mac_setup(operation, handle, alg, PSA_MAC_SIGN_SETUP); - return (status); -} - -psa_status_t psa_mac_verify_setup(psa_mac_operation_t *operation, - psa_key_handle_t handle, - psa_algorithm_t alg) -{ - psa_status_t status = psa_mac_setup(operation, handle, alg, PSA_MAC_VERIFY_SETUP); - return (status); -} - -psa_status_t psa_mac_update(psa_mac_operation_t *operation, - const uint8_t *input, - size_t input_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_MAC_UPDATE, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length } - }; - - psa_status_t status = ipc_call(&operation->handle, in_vec, 2, NULL, 0, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - return (status); -} - -psa_status_t psa_mac_sign_finish(psa_mac_operation_t *operation, - uint8_t *mac, - size_t mac_size, - size_t *mac_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_MAC_SIGN_FINISH, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { &mac_size, sizeof(mac_size) } - }; - - psa_outvec out_vec[2] = { - { mac, mac_size }, - { mac_length, sizeof(*mac_length) } - }; - - psa_status_t status = ipc_call(&operation->handle, in_vec, 2, out_vec, 2, true); - return (status); -} - -psa_status_t psa_mac_verify_finish(psa_mac_operation_t *operation, - const uint8_t *mac, - size_t mac_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_MAC_VERIFY_FINISH, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[3] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { &mac_length, sizeof(mac_length) }, - { mac, mac_length } - }; - - psa_status_t status = ipc_call(&operation->handle, in_vec, 3, NULL, 0, true); - return (status); -} - -psa_status_t psa_mac_abort(psa_mac_operation_t *operation) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return (PSA_SUCCESS); - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_MAC_ABORT, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_status_t status = ipc_call(&operation->handle, &in_vec, 1, NULL, 0, true); - return (status); -} - -psa_status_t psa_cipher_encrypt(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *input, - size_t input_length, - uint8_t *output, - size_t output_size, - size_t *output_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_CIPHER_ENCRYPT, - .handle = handle, - .alg = alg, - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length }, - }; - - psa_outvec out_vec[2] = { - { output, output_size }, - { output_length, sizeof(*output_length) }, - }; - - psa_status_t status = ipc_oneshot(PSA_SYMMETRIC_ID, in_vec, 2, out_vec, 2); - return (status); -} - -psa_status_t psa_cipher_decrypt(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *input, - size_t input_length, - uint8_t *output, - size_t output_size, - size_t *output_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_CIPHER_DECRYPT, - .handle = handle, - .alg = alg, - }; - - psa_invec in_vec[3] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length }, - }; - - psa_outvec out_vec[2] = { - { output, output_size }, - { output_length, sizeof(*output_length) }, - }; - - psa_status_t status = ipc_oneshot(PSA_SYMMETRIC_ID, in_vec, 2, out_vec, 2); - return (status); -} - -static psa_status_t psa_cipher_setup(psa_cipher_operation_t *operation, - psa_key_handle_t handle, - psa_algorithm_t alg, - psa_sec_function_t func) -{ - if (operation->handle != PSA_NULL_HANDLE) { - return (PSA_ERROR_BAD_STATE); - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = func, - .handle = handle, - .alg = alg - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_status_t status = ipc_connect(PSA_SYMMETRIC_ID, &operation->handle); - if (status != PSA_SUCCESS) { - return (status); - } - status = ipc_call(&operation->handle, &in_vec, 1, NULL, 0, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - return (status); -} - -psa_status_t psa_cipher_encrypt_setup(psa_cipher_operation_t *operation, - psa_key_handle_t handle, - psa_algorithm_t alg) -{ - psa_status_t status = psa_cipher_setup(operation, handle, alg, PSA_CIPHER_ENCRYPT_SETUP); - return (status); -} - -psa_status_t psa_cipher_decrypt_setup(psa_cipher_operation_t *operation, - psa_key_handle_t handle, - psa_algorithm_t alg) -{ - psa_status_t status = psa_cipher_setup(operation, handle, alg, PSA_CIPHER_DECRYPT_SETUP); - return (status); -} - -psa_status_t psa_cipher_generate_iv(psa_cipher_operation_t *operation, - uint8_t *iv, - size_t iv_size, - size_t *iv_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_CIPHER_GENERATE_IV, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_outvec out_vec[2] = { - { iv, iv_size }, - { iv_length, sizeof(*iv_length) } - }; - - psa_status_t status = ipc_call(&operation->handle, &in_vec, 1, out_vec, 2, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - return (status); -} - -psa_status_t psa_cipher_set_iv(psa_cipher_operation_t *operation, - const uint8_t *iv, - size_t iv_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_CIPHER_SET_IV, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { iv, iv_length } - }; - - psa_status_t status = ipc_call(&operation->handle, in_vec, 2, NULL, 0, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - return (status); -} - -psa_status_t psa_cipher_update(psa_cipher_operation_t *operation, - const uint8_t *input, - size_t input_length, - uint8_t *output, - size_t output_size, - size_t *output_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_CIPHER_UPDATE, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length } - }; - - psa_outvec out_vec[2] = { - { output, output_size }, - { output_length, (output_length == NULL ? 0 : sizeof(*output_length)) } - }; - - psa_status_t status = ipc_call(&operation->handle, in_vec, 2, out_vec, 2, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - return (status); -} - -psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation, - uint8_t *output, - size_t output_size, - size_t *output_length) -{ - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_CIPHER_FINISH, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_outvec out_vec[2] = { - { output, output_size }, - { output_length, (output_length == NULL ? 0 : sizeof(*output_length)) } - }; - - psa_status_t status = ipc_call(&operation->handle, &in_vec, 1, out_vec, 2, true); - return (status); -} - -psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return (PSA_SUCCESS); - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_CIPHER_ABORT, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_status_t status = ipc_call(&operation->handle, &in_vec, 1, NULL, 0, true); - return (status); -} - -psa_status_t psa_aead_encrypt(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *nonce, - size_t nonce_length, - const uint8_t *additional_data, - size_t additional_data_length, - const uint8_t *plaintext, - size_t plaintext_length, - uint8_t *ciphertext, - size_t ciphertext_size, - size_t *ciphertext_length) -{ - if (nonce_length > PSA_AEAD_MAX_NONCE_SIZE) { - return (PSA_ERROR_INVALID_ARGUMENT); - } - - uint8_t *buffer = calloc(1, (additional_data_length + plaintext_length)); - if (buffer == NULL) { - return (PSA_ERROR_INSUFFICIENT_MEMORY); - } - - psa_crypto_ipc_aead_t psa_crypto_ipc = { - .func = PSA_AEAD_ENCRYPT, - .handle = handle, - .alg = alg, - .nonce_size = nonce_length, - .additional_data_length = additional_data_length, - .input_length = plaintext_length, - .nonce = { 0 } - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { buffer, (additional_data_length + plaintext_length) } - }; - - psa_outvec out_vec[2] = { - { ciphertext, ciphertext_size }, - { ciphertext_length, sizeof(*ciphertext_length) } - }; - - psa_status_t status; - memcpy(buffer, additional_data, additional_data_length); - memcpy(buffer + additional_data_length, plaintext, plaintext_length); - memcpy(psa_crypto_ipc.nonce, nonce, nonce_length); - - status = ipc_oneshot(PSA_AEAD_ID, in_vec, 2, out_vec, 2); - free(buffer); - return (status); -} - -psa_status_t psa_aead_decrypt(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *nonce, - size_t nonce_length, - const uint8_t *additional_data, - size_t additional_data_length, - const uint8_t *ciphertext, - size_t ciphertext_length, - uint8_t *plaintext, - size_t plaintext_size, - size_t *plaintext_length) -{ - if (nonce_length > PSA_AEAD_MAX_NONCE_SIZE) { - return (PSA_ERROR_INVALID_ARGUMENT); - } - - uint8_t *buffer = calloc(1, (additional_data_length + ciphertext_length)); - if (buffer == NULL) { - return (PSA_ERROR_INSUFFICIENT_MEMORY); - } - - psa_crypto_ipc_aead_t psa_crypto_ipc = { - .func = PSA_AEAD_DECRYPT, - .handle = handle, - .alg = alg, - .nonce_size = nonce_length, - .additional_data_length = additional_data_length, - .input_length = ciphertext_length, - .nonce = { 0 } - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { buffer, (additional_data_length + ciphertext_length) } - }; - - psa_outvec out_vec[2] = { - { plaintext, plaintext_size }, - { plaintext_length, sizeof(*plaintext_length) } - }; - - psa_status_t status; - memcpy(buffer, additional_data, additional_data_length); - memcpy(buffer + additional_data_length, ciphertext, ciphertext_length); - memcpy(psa_crypto_ipc.nonce, nonce, nonce_length); - - status = ipc_oneshot(PSA_AEAD_ID, in_vec, 2, out_vec, 2); - free(buffer); - return (status); -} - -static psa_status_t psa_aead_setup(psa_aead_operation_t *operation, - psa_key_handle_t handle, - psa_algorithm_t alg, - psa_sec_function_t func) -{ - if (operation->handle != PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = func, - .handle = handle, - .alg = alg - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_status_t status = ipc_connect(PSA_AEAD_ID, &operation->handle); - if (status != PSA_SUCCESS) { - return status; - } - status = ipc_call(&operation->handle, &in_vec, 1, NULL, 0, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - return status; -} - -psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation, - psa_key_handle_t handle, - psa_algorithm_t alg) -{ - return psa_aead_setup(operation, handle, alg, PSA_AEAD_ENCRYPT_SETUP); -} - -psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation, - psa_key_handle_t handle, - psa_algorithm_t alg) -{ - return psa_aead_setup(operation, handle, alg, PSA_AEAD_DECRYPT_SETUP); -} - -psa_status_t psa_aead_generate_nonce(psa_aead_operation_t *operation, - uint8_t *nonce, - size_t nonce_size, - size_t *nonce_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_ipc_aead_t psa_crypto_ipc = { - .func = PSA_AEAD_GENERATE_NONCE, - .handle = 0, - }; - - psa_invec in_vec[1] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - }; - - psa_outvec out_vec[2] = { - { nonce, nonce_size }, - { nonce_length, sizeof(*nonce_length) }, - }; - - return ipc_call(&operation->handle, in_vec, 1, out_vec, 2, false); -} - -psa_status_t psa_aead_set_nonce(psa_aead_operation_t *operation, - const uint8_t *nonce, - size_t nonce_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - if (nonce_length > PSA_AEAD_MAX_NONCE_SIZE) { - return (PSA_ERROR_INVALID_ARGUMENT); - } - - psa_crypto_ipc_aead_t psa_crypto_ipc = { - .func = PSA_AEAD_SET_NONCE, - .handle = 0, - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { nonce, nonce_length } - }; - - return ipc_call(&operation->handle, in_vec, 2, NULL, 0, false); -} - -psa_status_t psa_aead_set_lengths(psa_aead_operation_t *operation, - size_t ad_length, - size_t plaintext_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_ipc_aead_t psa_crypto_ipc = { - .func = PSA_AEAD_SET_LENGTHS, - .handle = 0, - .alg = 0, - .additional_data_length = ad_length, - .input_length = plaintext_length, - }; - - psa_invec in_vec[1] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - }; - - return ipc_call(&operation->handle, in_vec, 1, NULL, 0, false); -} - -psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation, - const uint8_t *input, - size_t input_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_ipc_aead_t psa_crypto_ipc = { - .func = PSA_AEAD_UPDATE_AD, - .handle = 0, - .alg = 0, - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length }, - }; - - return ipc_call(&operation->handle, in_vec, 2, NULL, 0, false); -} - -psa_status_t psa_aead_update(psa_aead_operation_t *operation, - const uint8_t *input, - size_t input_length, - uint8_t *output, - size_t output_size, - size_t *output_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_ipc_aead_t psa_crypto_ipc = { - .func = PSA_AEAD_UPDATE, - .handle = 0, - .alg = 0, - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { input, input_length }, - }; - - psa_outvec out_vec[2] = { - { output, output_size }, - { output_length, sizeof(*output_length) }, - }; - - return ipc_call(&operation->handle, in_vec, 2, out_vec, 2, false); -} - -psa_status_t psa_aead_finish(psa_aead_operation_t *operation, - uint8_t *ciphertext, - size_t ciphertext_size, - size_t *ciphertext_length, - uint8_t *tag, - size_t tag_size, - size_t *tag_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_AEAD_FINISH, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[1] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - }; - - psa_outvec out_vec[4] = { - { ciphertext, ciphertext_size }, - { ciphertext_length, (ciphertext_length == NULL ? 0 : sizeof(*ciphertext_length)) }, - { tag, tag_size }, - { tag_length, (tag_length == NULL ? 0 : sizeof(*tag_length)) }, - }; - - return ipc_call(&operation->handle, in_vec, 1, out_vec, 4, true); -} - -psa_status_t psa_aead_verify(psa_aead_operation_t *operation, - uint8_t *plaintext, - size_t plaintext_size, - size_t *plaintext_length, - const uint8_t *tag, - size_t tag_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_ipc_t psa_crypto_ipc = { - .func = PSA_AEAD_VERIFY, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec[3] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { tag, tag_length }, - }; - - psa_outvec out_vec[2] = { - { plaintext, plaintext_size }, - { plaintext_length, (plaintext_length == NULL ? 0 : sizeof(*plaintext_length)) }, - }; - - return ipc_call(&operation->handle, in_vec, 3, out_vec, 2, true); -} - -psa_status_t psa_aead_abort(psa_aead_operation_t *operation) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_SUCCESS; - } - - psa_crypto_ipc_aead_t psa_crypto_ipc = { - .func = PSA_AEAD_ABORT, - .handle = 0, - .alg = 0 - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - return ipc_call(&operation->handle, &in_vec, 1, NULL, 0, true); -} - -psa_status_t psa_sign_hash(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *hash, - size_t hash_length, - uint8_t *signature, - size_t signature_size, - size_t *signature_length) -{ - psa_crypto_ipc_asymmetric_t psa_crypto_ipc = { - .func = PSA_SIGN_HASH, - .handle = handle, - .alg = alg, - .input_length = 0, - .salt_length = 0 - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { hash, hash_length } - }; - - psa_outvec out_vec[2] = { - { signature, signature_size }, - { signature_length, sizeof(*signature_length) } - }; - - psa_status_t status = ipc_oneshot(PSA_ASYMMETRIC_ID, in_vec, 2, out_vec, 2); - return (status); -} - -psa_status_t psa_verify_hash(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *hash, - size_t hash_length, - const uint8_t *signature, - size_t signature_size) -{ - psa_crypto_ipc_asymmetric_t psa_crypto_ipc = { - .func = PSA_VERIFY_HASH, - .handle = handle, - .alg = alg, - .input_length = 0, - .salt_length = 0 - }; - - psa_invec in_vec[3] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { signature, signature_size }, - { hash, hash_length } - }; - - psa_status_t status = ipc_oneshot(PSA_ASYMMETRIC_ID, in_vec, 3, NULL, 0); - return (status); -} - -static psa_status_t psa_asymmetric_operation(psa_sec_function_t func, - psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *input, - size_t input_length, - const uint8_t *salt, - size_t salt_length, - uint8_t *output, - size_t output_size, - size_t *output_length) -{ - uint8_t *buffer = calloc(1, (input_length + salt_length)); - if (buffer == NULL) { - return (PSA_ERROR_INSUFFICIENT_MEMORY); - } - - psa_crypto_ipc_asymmetric_t psa_crypto_ipc = { - .func = func, - .handle = handle, - .alg = alg, - .input_length = input_length, - .salt_length = salt_length - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { buffer, (input_length + salt_length) } - }; - - psa_outvec out_vec[2] = { - { output, output_size }, - { output_length, sizeof(*output_length) } - }; - - psa_status_t status; - memcpy(buffer, input, input_length); - memcpy(buffer + input_length, salt, salt_length); - - status = ipc_oneshot(PSA_ASYMMETRIC_ID, in_vec, 2, out_vec, 2); - free(buffer); - return (status); -} - -psa_status_t psa_asymmetric_encrypt(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *input, - size_t input_length, - const uint8_t *salt, - size_t salt_length, - uint8_t *output, - size_t output_size, - size_t *output_length) -{ - psa_status_t status = psa_asymmetric_operation(PSA_ASYMMETRIC_ENCRYPT, - handle, - alg, input, input_length, - salt, salt_length, output, - output_size, output_length); - return (status); -} - -psa_status_t psa_asymmetric_decrypt(psa_key_handle_t handle, - psa_algorithm_t alg, - const uint8_t *input, - size_t input_length, - const uint8_t *salt, - size_t salt_length, - uint8_t *output, - size_t output_size, - size_t *output_length) -{ - psa_status_t status = psa_asymmetric_operation(PSA_ASYMMETRIC_DECRYPT, - handle, - alg, input, input_length, - salt, salt_length, output, - output_size, output_length); - return (status); -} - -psa_status_t psa_key_derivation_setup( - psa_key_derivation_operation_t *operation, - psa_algorithm_t alg) -{ - if (operation->handle != PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_KEY_DERIVATION_SETUP, - .handle = 0, - .alg = alg - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_status_t status = ipc_connect(PSA_KEY_DERIVATION_ID, &operation->handle); - if (status != PSA_SUCCESS) { - return status; - } - - status = ipc_call(&operation->handle, &in_vec, 1, NULL, 0, false); - if (status != PSA_SUCCESS) { - ipc_close(&operation->handle); - } - - return status; -} - -psa_status_t psa_key_derivation_get_capacity( - const psa_key_derivation_operation_t *op, - size_t *capacity) -{ - psa_key_derivation_operation_t *operation = (psa_key_derivation_operation_t *) op; - - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_KEY_DERIVATION_GET_CAPACITY, - .handle = 0, - .alg = 0, - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_outvec out_vec = { capacity, sizeof(*capacity) }; - - return ipc_call(&operation->handle, &in_vec, 1, &out_vec, 1, false); -} - -psa_status_t psa_key_derivation_set_capacity( - psa_key_derivation_operation_t *operation, - size_t capacity) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_KEY_DERIVATION_SET_CAPACITY, - .handle = 0, - .alg = 0, - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { &capacity, sizeof(capacity) }, - }; - - return ipc_call(&operation->handle, in_vec, 2, NULL, 0, false); -} - -psa_status_t psa_key_derivation_input_bytes( - psa_key_derivation_operation_t *operation, - psa_key_derivation_step_t step, - const uint8_t *data, - size_t data_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_KEY_DERIVATION_INPUT_BYTES, - .handle = 0, - .alg = 0, - }; - - psa_invec in_vec[3] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { &step, sizeof(step) }, - { data, data_length }, - }; - - return ipc_call(&operation->handle, in_vec, 3, NULL, 0, false); -} - -psa_status_t psa_key_derivation_input_key( - psa_key_derivation_operation_t *operation, - psa_key_derivation_step_t step, - psa_key_handle_t handle) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_KEY_DERIVATION_INPUT_KEY, - .handle = handle, - .alg = 0 - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { &step, sizeof(step) }, - }; - - psa_status_t status = ipc_call(&operation->handle, in_vec, 2, NULL, 0, false); - return (status); -} - -psa_status_t psa_key_derivation_key_agreement( - psa_key_derivation_operation_t *operation, - psa_key_derivation_step_t step, - psa_key_handle_t private_key, - const uint8_t *peer_key, - size_t peer_key_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_KEY_DERIVATION_KEY_AGREEMENT, - .handle = private_key, - .alg = 0, - }; - - psa_invec in_vec[3] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { &step, sizeof(step) }, - { peer_key, peer_key_length }, - }; - - return ipc_call(&operation->handle, in_vec, 3, NULL, 0, false); -} - -psa_status_t psa_key_derivation_output_bytes( - psa_key_derivation_operation_t *operation, - uint8_t *output, - size_t output_length) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_KEY_DERIVATION_OUTPUT_BYTES, - .handle = 0, - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - psa_outvec out_vec = { output, output_length }; - - return ipc_call(&operation->handle, &in_vec, 1, &out_vec, 1, false); -} - -psa_status_t psa_key_derivation_output_key( - const psa_key_attributes_t *attributes, - psa_key_derivation_operation_t *operation, - psa_key_handle_t *handle) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_ERROR_BAD_STATE; - } - - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_KEY_DERIVATION_OUTPUT_KEY, - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { attributes, sizeof(*attributes) }, - }; - - psa_outvec out_vec = { handle, sizeof(*handle) }; - - return ipc_call(&operation->handle, in_vec, 2, &out_vec, 1, false); -} - -psa_status_t psa_key_derivation_abort( - psa_key_derivation_operation_t *operation) -{ - if (operation->handle <= PSA_NULL_HANDLE) { - return PSA_SUCCESS; - } - - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_KEY_DERIVATION_ABORT, - .handle = 0, - .alg = 0, - }; - - psa_invec in_vec = { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }; - - return ipc_call(&operation->handle, &in_vec, 1, NULL, 0, true); -} - -psa_status_t psa_raw_key_agreement(psa_algorithm_t alg, - psa_key_handle_t private_key, - const uint8_t *peer_key, - size_t peer_key_length, - uint8_t *output, - size_t output_size, - size_t *output_length) -{ - psa_crypto_derivation_ipc_t psa_crypto_ipc = { - .func = PSA_RAW_KEY_AGREEMENT, - .handle = private_key, - .alg = alg, - }; - - psa_invec in_vec[2] = { - { &psa_crypto_ipc, sizeof(psa_crypto_ipc) }, - { peer_key, peer_key_length }, - }; - - psa_outvec out_vec[2] = { - { output, output_size }, - { output_length, sizeof(*output_length) } - }; - - return ipc_oneshot(PSA_KEY_DERIVATION_ID, in_vec, 2, out_vec, 2); -} - -psa_status_t psa_generate_random(uint8_t *output, - size_t output_size) -{ - psa_outvec out_vec = { output, output_size }; - - psa_status_t status = ipc_oneshot(PSA_RNG_ID, NULL, 0, &out_vec, 1); - return (status); -} - -psa_status_t psa_generate_key(const psa_key_attributes_t *attributes, - psa_key_handle_t *handle) -{ - psa_key_mng_ipc_t psa_key_mng_ipc = { - .func = PSA_GENERATE_KEY, - }; - - psa_invec in_vec[2] = { - { &psa_key_mng_ipc, sizeof(psa_key_mng_ipc) }, - { attributes, sizeof(*attributes) }, - }; - - psa_outvec out_vec = { handle, sizeof(*handle) }; - - return ipc_oneshot(PSA_KEY_MNG_ID, in_vec, 2, &out_vec, 1); -} - - -/* - * PSA Crypto API extensions (crypto_extra.h) - */ - -void mbedtls_psa_crypto_free(void) -{ - ipc_oneshot(PSA_CRYPTO_FREE_ID, NULL, 0, NULL, 0); -} - -psa_status_t mbedtls_psa_inject_entropy(const uint8_t *seed, - size_t seed_size) -{ - psa_invec in_vec = { seed, seed_size }; - - psa_status_t status = ipc_oneshot(PSA_ENTROPY_ID, &in_vec, 1, NULL, 0); - return (status); -} - -#endif /* MBEDTLS_PSA_CRYPTO_C */ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/inc/autogen_sid.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/inc/autogen_sid.h deleted file mode 100644 index d3440689c1c..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/inc/autogen_sid.h +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright (c) 2019 ARM Limited - * - * 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 AN AUTO-GENERATED FILE - DO NOT MODIFY IT. - * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - * Template Version 1.0 - * Generated by tools/psa/generate_partition_code.py Version 1.1 - ******************************************************************************/ - -/****************** Service Partitions ****************************************/ - -/* ----------------------------------------------------------------------------- - * ATTEST_SRV Service IDs - * -------------------------------------------------------------------------- */ - -#define PSA_ATTEST_GET_TOKEN_ID 0x00000F10 -#define PSA_ATTEST_GET_TOKEN_SIZE_ID 0x00000F11 -#define PSA_ATTEST_INJECT_KEY_ID 0x00000F12 - -/* ----------------------------------------------------------------------------- - * CRYPTO_SRV Service IDs - * -------------------------------------------------------------------------- */ - -#define PSA_CRYPTO_INIT_ID 0x00000F00 -#define PSA_MAC_ID 0x00000F01 -#define PSA_HASH_ID 0x00000F02 -#define PSA_ASYMMETRIC_ID 0x00000F03 -#define PSA_SYMMETRIC_ID 0x00000F04 -#define PSA_AEAD_ID 0x00000F05 -#define PSA_KEY_MNG_ID 0x00000F06 -#define PSA_RNG_ID 0x00000F07 -#define PSA_CRYPTO_FREE_ID 0x00000F08 -#define PSA_KEY_DERIVATION_ID 0x00000F09 -#define PSA_ENTROPY_ID 0x00000F0A - -/* ----------------------------------------------------------------------------- - * PLATFORM Service IDs - * -------------------------------------------------------------------------- */ - -#define PSA_PLATFORM_LC_GET 0x00011000 -#define PSA_PLATFORM_LC_SET 0x00011001 -#define PSA_PLATFORM_SYSTEM_RESET 0x00011002 -#define PSA_PLATFORM_IOCTL 0x00011003 - -/* ----------------------------------------------------------------------------- - * ITS Service IDs - * -------------------------------------------------------------------------- */ - -#define PSA_ITS_GET 0x00011A00 -#define PSA_ITS_SET 0x00011A01 -#define PSA_ITS_INFO 0x00011A02 -#define PSA_ITS_REMOVE 0x00011A03 -#define PSA_ITS_RESET 0x00011A04 - -/****************** Test Partitions *******************************************/ - -/* ----------------------------------------------------------------------------- - * CRYPTO_ACL_TEST Service IDs - * -------------------------------------------------------------------------- */ - -#define CRYPTO_GENERATE_KEY 0x00000201 -#define CRYPTO_OPEN_KEY 0x00000202 -#define CRYPTO_CLOSE_KEY 0x00000203 -#define CRYPTO_DESTROY_KEY 0x00000205 -#define CRYPTO_GET_KEY_ATTRIBUTES 0x00000206 -#define CRYPTO_IMPORT_KEY 0x00000208 - -/* ----------------------------------------------------------------------------- - * CLIENT_TESTS_PART1 Service IDs - * -------------------------------------------------------------------------- */ - -#define CLIENT_TESTS_PART1_ROT_SRV1 0x00001A05 -#define CLIENT_TESTS_PART1_DROP_CONN 0x00001A06 -#define CLIENT_TESTS_PART1_SECURE_CLIENTS_ONLY 0x00001A07 - -/* ----------------------------------------------------------------------------- - * SERVER_TESTS_PART1 Service IDs - * -------------------------------------------------------------------------- */ - -#define SERVER_TESTS_PART1_CONTROL 0x00001A01 -#define SERVER_TESTS_PART1_TEST 0x00001A02 - -/* ----------------------------------------------------------------------------- - * SERVER_TESTS_PART2 Service IDs - * -------------------------------------------------------------------------- */ - -#define SERVER_TESTS_PART2_ROT_SRV_REVERSE 0x00001A03 -#define SERVER_TESTS_PART2_ROT_SRV_DB_TST 0x00001A04 - -/* ----------------------------------------------------------------------------- - * SMOKE_TESTS_PART1 Service IDs - * -------------------------------------------------------------------------- */ - -#define SMOKE_TESTS_PART1_ROT_SRV1 0x00001A00 - diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/inc/mbed_spm_partitions.h b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/inc/mbed_spm_partitions.h deleted file mode 100644 index acf41223efc..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/inc/mbed_spm_partitions.h +++ /dev/null @@ -1,310 +0,0 @@ -/* Copyright (c) 2017-2019 ARM Limited - * - * 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 AN AUTO-GENERATED FILE - DO NOT MODIFY IT. - * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - * Template Version 1.0 - * Generated by tools/psa/generate_partition_code.py Version 1.1 - ******************************************************************************/ - -#ifndef __MBED_SPM_PARTITIONS_H___ -#define __MBED_SPM_PARTITIONS_H___ - - -/****************** Common definitions ****************************************/ - -/* PSA reserved event flags */ -#define PSA_RESERVED1_POS (1UL) -#define PSA_RESERVED1_MSK (1UL << PSA_RESERVED1_POS) - -#define PSA_RESERVED2_POS (2UL) -#define PSA_RESERVED2_MSK (1UL << PSA_RESERVED2_POS) - -/****************** Service Partitions ****************************************/ - -/* ----------------------------------------------------------------------------- - * ATTEST_SRV defines - * -------------------------------------------------------------------------- */ -#define ATTEST_SRV_ID 37 - -#define ATTEST_SRV_ROT_SRV_COUNT (3UL) -#define ATTEST_SRV_EXT_ROT_SRV_COUNT (7UL) - - -#define ATTEST_SRV_WAIT_ANY_IRQ_MSK (0) - -#define PSA_ATTEST_GET_TOKEN_POS (4UL) -#define PSA_ATTEST_GET_TOKEN (1UL << PSA_ATTEST_GET_TOKEN_POS) -#define PSA_ATTEST_GET_TOKEN_SIZE_POS (5UL) -#define PSA_ATTEST_GET_TOKEN_SIZE (1UL << PSA_ATTEST_GET_TOKEN_SIZE_POS) -#define PSA_ATTEST_INJECT_KEY_POS (6UL) -#define PSA_ATTEST_INJECT_KEY (1UL << PSA_ATTEST_INJECT_KEY_POS) - -#define ATTEST_SRV_WAIT_ANY_SID_MSK (\ - PSA_ATTEST_GET_TOKEN | \ - PSA_ATTEST_GET_TOKEN_SIZE | \ - PSA_ATTEST_INJECT_KEY) - - -/* ----------------------------------------------------------------------------- - * CRYPTO_SRV defines - * -------------------------------------------------------------------------- */ -#define CRYPTO_SRV_ID 35 - -#define CRYPTO_SRV_ROT_SRV_COUNT (11UL) -#define CRYPTO_SRV_EXT_ROT_SRV_COUNT (4UL) - - -#define CRYPTO_SRV_WAIT_ANY_IRQ_MSK (0) - -#define PSA_CRYPTO_INIT_POS (4UL) -#define PSA_CRYPTO_INIT (1UL << PSA_CRYPTO_INIT_POS) -#define PSA_MAC_POS (5UL) -#define PSA_MAC (1UL << PSA_MAC_POS) -#define PSA_HASH_POS (6UL) -#define PSA_HASH (1UL << PSA_HASH_POS) -#define PSA_ASYMMETRIC_POS (7UL) -#define PSA_ASYMMETRIC (1UL << PSA_ASYMMETRIC_POS) -#define PSA_SYMMETRIC_POS (8UL) -#define PSA_SYMMETRIC (1UL << PSA_SYMMETRIC_POS) -#define PSA_AEAD_POS (9UL) -#define PSA_AEAD (1UL << PSA_AEAD_POS) -#define PSA_KEY_MNG_POS (10UL) -#define PSA_KEY_MNG (1UL << PSA_KEY_MNG_POS) -#define PSA_RNG_POS (11UL) -#define PSA_RNG (1UL << PSA_RNG_POS) -#define PSA_CRYPTO_FREE_POS (12UL) -#define PSA_CRYPTO_FREE (1UL << PSA_CRYPTO_FREE_POS) -#define PSA_KEY_DERIVATION_POS (13UL) -#define PSA_KEY_DERIVATION (1UL << PSA_KEY_DERIVATION_POS) -#define PSA_ENTROPY_INJECT_POS (14UL) -#define PSA_ENTROPY_INJECT (1UL << PSA_ENTROPY_INJECT_POS) - -#define CRYPTO_SRV_WAIT_ANY_SID_MSK (\ - PSA_CRYPTO_INIT | \ - PSA_MAC | \ - PSA_HASH | \ - PSA_ASYMMETRIC | \ - PSA_SYMMETRIC | \ - PSA_AEAD | \ - PSA_KEY_MNG | \ - PSA_RNG | \ - PSA_CRYPTO_FREE | \ - PSA_KEY_DERIVATION | \ - PSA_ENTROPY_INJECT) - - -/* ----------------------------------------------------------------------------- - * PLATFORM defines - * -------------------------------------------------------------------------- */ -#define PLATFORM_ID 8 - -#define PLATFORM_ROT_SRV_COUNT (4UL) -#define PLATFORM_EXT_ROT_SRV_COUNT (1UL) - - -#define PLATFORM_WAIT_ANY_IRQ_MSK (0) - -#define PSA_PLATFORM_LC_GET_MSK_POS (4UL) -#define PSA_PLATFORM_LC_GET_MSK (1UL << PSA_PLATFORM_LC_GET_MSK_POS) -#define PSA_PLATFORM_LC_SET_MSK_POS (5UL) -#define PSA_PLATFORM_LC_SET_MSK (1UL << PSA_PLATFORM_LC_SET_MSK_POS) -#define PSA_PLATFORM_SYSTEM_RESET_MSK_POS (6UL) -#define PSA_PLATFORM_SYSTEM_RESET_MSK (1UL << PSA_PLATFORM_SYSTEM_RESET_MSK_POS) -#define PSA_PLATFORM_IOCTL_MSK_POS (7UL) -#define PSA_PLATFORM_IOCTL_MSK (1UL << PSA_PLATFORM_IOCTL_MSK_POS) - -#define PLATFORM_WAIT_ANY_SID_MSK (\ - PSA_PLATFORM_LC_GET_MSK | \ - PSA_PLATFORM_LC_SET_MSK | \ - PSA_PLATFORM_SYSTEM_RESET_MSK | \ - PSA_PLATFORM_IOCTL_MSK) - - -/* ----------------------------------------------------------------------------- - * ITS defines - * -------------------------------------------------------------------------- */ -#define ITS_ID 10 - -#define ITS_ROT_SRV_COUNT (5UL) -#define ITS_EXT_ROT_SRV_COUNT (0UL) - - -#define ITS_WAIT_ANY_IRQ_MSK (0) - -#define PSA_ITS_GET_MSK_POS (4UL) -#define PSA_ITS_GET_MSK (1UL << PSA_ITS_GET_MSK_POS) -#define PSA_ITS_SET_MSK_POS (5UL) -#define PSA_ITS_SET_MSK (1UL << PSA_ITS_SET_MSK_POS) -#define PSA_ITS_INFO_MSK_POS (6UL) -#define PSA_ITS_INFO_MSK (1UL << PSA_ITS_INFO_MSK_POS) -#define PSA_ITS_REMOVE_MSK_POS (7UL) -#define PSA_ITS_REMOVE_MSK (1UL << PSA_ITS_REMOVE_MSK_POS) -#define PSA_ITS_RESET_MSK_POS (8UL) -#define PSA_ITS_RESET_MSK (1UL << PSA_ITS_RESET_MSK_POS) - -#define ITS_WAIT_ANY_SID_MSK (\ - PSA_ITS_GET_MSK | \ - PSA_ITS_SET_MSK | \ - PSA_ITS_INFO_MSK | \ - PSA_ITS_REMOVE_MSK | \ - PSA_ITS_RESET_MSK) - - - -/****************** Test Partitions *******************************************/ - -#ifdef USE_PSA_TEST_PARTITIONS - -#ifdef USE_CRYPTO_ACL_TEST -/* ----------------------------------------------------------------------------- - * CRYPTO_ACL_TEST defines - * -------------------------------------------------------------------------- */ -#define CRYPTO_ACL_TEST_ID 128 - -#define CRYPTO_ACL_TEST_ROT_SRV_COUNT (6UL) -#define CRYPTO_ACL_TEST_EXT_ROT_SRV_COUNT (1UL) - - -#define CRYPTO_ACL_TEST_WAIT_ANY_IRQ_MSK (0) - -#define CRYPTO_GENERATE_KEY_MSK_POS (4UL) -#define CRYPTO_GENERATE_KEY_MSK (1UL << CRYPTO_GENERATE_KEY_MSK_POS) -#define CRYPTO_OPEN_KEY_MSK_POS (5UL) -#define CRYPTO_OPEN_KEY_MSK (1UL << CRYPTO_OPEN_KEY_MSK_POS) -#define CRYPTO_CLOSE_KEY_MSK_POS (6UL) -#define CRYPTO_CLOSE_KEY_MSK (1UL << CRYPTO_CLOSE_KEY_MSK_POS) -#define CRYPTO_DESTROY_KEY_MSK_POS (7UL) -#define CRYPTO_DESTROY_KEY_MSK (1UL << CRYPTO_DESTROY_KEY_MSK_POS) -#define CRYPTO_GET_KEY_ATTRIBUTES_MSK_POS (8UL) -#define CRYPTO_GET_KEY_ATTRIBUTES_MSK (1UL << CRYPTO_GET_KEY_ATTRIBUTES_MSK_POS) -#define CRYPTO_IMPORT_KEY_MSK_POS (9UL) -#define CRYPTO_IMPORT_KEY_MSK (1UL << CRYPTO_IMPORT_KEY_MSK_POS) - -#define CRYPTO_ACL_TEST_WAIT_ANY_SID_MSK (\ - CRYPTO_GENERATE_KEY_MSK | \ - CRYPTO_OPEN_KEY_MSK | \ - CRYPTO_CLOSE_KEY_MSK | \ - CRYPTO_DESTROY_KEY_MSK | \ - CRYPTO_GET_KEY_ATTRIBUTES_MSK | \ - CRYPTO_IMPORT_KEY_MSK) - - -#endif // USE_CRYPTO_ACL_TEST - -#ifdef USE_CLIENT_TESTS_PART1 -/* ----------------------------------------------------------------------------- - * CLIENT_TESTS_PART1 defines - * -------------------------------------------------------------------------- */ -#define CLIENT_TESTS_PART1_ID 1 - -#define CLIENT_TESTS_PART1_ROT_SRV_COUNT (3UL) -#define CLIENT_TESTS_PART1_EXT_ROT_SRV_COUNT (0UL) - - -#define CLIENT_TESTS_PART1_WAIT_ANY_IRQ_MSK (0) - -#define PART1_ROT_SRV1_MSK_POS (4UL) -#define PART1_ROT_SRV1_MSK (1UL << PART1_ROT_SRV1_MSK_POS) -#define DROP_CONN_MSK_POS (5UL) -#define DROP_CONN_MSK (1UL << DROP_CONN_MSK_POS) -#define SECURE_CLIENTS_ONLY_MSK_POS (6UL) -#define SECURE_CLIENTS_ONLY_MSK (1UL << SECURE_CLIENTS_ONLY_MSK_POS) - -#define CLIENT_TESTS_PART1_WAIT_ANY_SID_MSK (\ - PART1_ROT_SRV1_MSK | \ - DROP_CONN_MSK | \ - SECURE_CLIENTS_ONLY_MSK) - - -#endif // USE_CLIENT_TESTS_PART1 - -#ifdef USE_SERVER_TESTS_PART1 -/* ----------------------------------------------------------------------------- - * SERVER_TESTS_PART1 defines - * -------------------------------------------------------------------------- */ -#define SERVER_TESTS_PART1_ID 2 - -#define SERVER_TESTS_PART1_ROT_SRV_COUNT (2UL) -#define SERVER_TESTS_PART1_EXT_ROT_SRV_COUNT (2UL) - - -#define SERVER_TESTS_PART1_WAIT_ANY_IRQ_MSK (0) - -#define CONTROL_MSK_POS (4UL) -#define CONTROL_MSK (1UL << CONTROL_MSK_POS) -#define TEST_MSK_POS (5UL) -#define TEST_MSK (1UL << TEST_MSK_POS) - -#define SERVER_TESTS_PART1_WAIT_ANY_SID_MSK (\ - CONTROL_MSK | \ - TEST_MSK) - - -#endif // USE_SERVER_TESTS_PART1 - -#ifdef USE_SERVER_TESTS_PART2 -/* ----------------------------------------------------------------------------- - * SERVER_TESTS_PART2 defines - * -------------------------------------------------------------------------- */ -#define SERVER_TESTS_PART2_ID 3 - -#define SERVER_TESTS_PART2_ROT_SRV_COUNT (2UL) -#define SERVER_TESTS_PART2_EXT_ROT_SRV_COUNT (0UL) - - -#define SERVER_TESTS_PART2_WAIT_ANY_IRQ_MSK (0) - -#define ROT_SRV_REVERSE_MSK_POS (4UL) -#define ROT_SRV_REVERSE_MSK (1UL << ROT_SRV_REVERSE_MSK_POS) -#define ROT_SRV_DB_TST_MSK_POS (5UL) -#define ROT_SRV_DB_TST_MSK (1UL << ROT_SRV_DB_TST_MSK_POS) - -#define SERVER_TESTS_PART2_WAIT_ANY_SID_MSK (\ - ROT_SRV_REVERSE_MSK | \ - ROT_SRV_DB_TST_MSK) - - -#endif // USE_SERVER_TESTS_PART2 - -#ifdef USE_SMOKE_TESTS_PART1 -/* ----------------------------------------------------------------------------- - * SMOKE_TESTS_PART1 defines - * -------------------------------------------------------------------------- */ -#define SMOKE_TESTS_PART1_ID 4 - -#define SMOKE_TESTS_PART1_ROT_SRV_COUNT (1UL) -#define SMOKE_TESTS_PART1_EXT_ROT_SRV_COUNT (0UL) - - -#define SMOKE_TESTS_PART1_WAIT_ANY_IRQ_MSK (0) - -#define ROT_SRV1_MSK_POS (4UL) -#define ROT_SRV1_MSK (1UL << ROT_SRV1_MSK_POS) - -#define SMOKE_TESTS_PART1_WAIT_ANY_SID_MSK (\ - ROT_SRV1_MSK) - - -#endif // USE_SMOKE_TESTS_PART1 - - -#endif // USE_PSA_TEST_PARTITIONS - -#endif // __MBED_SPM_PARTITIONS_H___ diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/platform/COMPONENT_PSA_SRV_IPC/platform_ipc.c b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/platform/COMPONENT_PSA_SRV_IPC/platform_ipc.c deleted file mode 100644 index 92cf1cd868e..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/platform/COMPONENT_PSA_SRV_IPC/platform_ipc.c +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (c) 2019-2020 Arm Limited - * - * 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 "psa_manifest/sid.h" -#include "psa/lifecycle.h" -#include "psa/client.h" -#include "mbed_toolchain.h" -#include "mbed_error.h" -#include "tfm_platform_api.h" - -uint32_t psa_security_lifecycle_state(void) -{ - psa_handle_t conn = psa_connect(PSA_PLATFORM_LC_GET, 1); - if (conn <= PSA_NULL_HANDLE) { - return PSA_LIFECYCLE_UNKNOWN; - } - - uint32_t lc_state = 0; - psa_outvec resp[1] = { {&lc_state, sizeof(lc_state)} }; - - psa_status_t status = psa_call(conn, NULL, 0, resp, 1); - if (status == PSA_DROP_CONNECTION) { - lc_state = PSA_LIFECYCLE_UNKNOWN; - } - - psa_close(conn); - - return lc_state; -} - -psa_status_t mbed_psa_reboot_and_request_new_security_state(uint32_t new_state) -{ - psa_handle_t conn = psa_connect(PSA_PLATFORM_LC_SET, 1); - if (conn <= PSA_NULL_HANDLE) { - return (psa_status_t) conn; - } - - psa_invec msg[1] = { - { &new_state, sizeof(new_state) } - }; - - psa_status_t status = psa_call(conn, msg, 1, NULL, 0); - - psa_close(conn); - return status; -} - -void mbed_psa_system_reset(void) -{ - psa_handle_t conn = psa_connect(PSA_PLATFORM_SYSTEM_RESET, 1); - if (conn > PSA_NULL_HANDLE) { - psa_call(conn, NULL, 0, NULL, 0); - } - error("reset failed - cannot connect to service handle=%ld", conn); -} - -enum tfm_platform_err_t -tfm_platform_ioctl(tfm_platform_ioctl_req_t request, - psa_invec *input, psa_outvec *output) { - tfm_platform_ioctl_req_t req = request; - struct psa_invec in_vec[2] = { {0} }; - size_t inlen, outlen; - psa_status_t status = PSA_ERROR_CONNECTION_REFUSED; - psa_handle_t handle = PSA_NULL_HANDLE; - - in_vec[0].base = &req; - in_vec[0].len = sizeof(req); - if (input != NULL) - { - in_vec[1].base = input->base; - in_vec[1].len = input->len; - inlen = 2; - } else - { - inlen = 1; - } - - if (output != NULL) - { - outlen = 1; - } else - { - outlen = 0; - } - - handle = psa_connect(PSA_PLATFORM_IOCTL, 1); - if (handle <= 0) - { - return TFM_PLATFORM_ERR_SYSTEM_ERROR; - } - - status = psa_call(handle, - in_vec, inlen, - output, outlen); - psa_close(handle); - - if (status < PSA_SUCCESS) - { - return TFM_PLATFORM_ERR_SYSTEM_ERROR; - } else - { - return (enum tfm_platform_err_t) status; - } -} diff --git a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_IPC/psa_prot_internal_storage.c b/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_IPC/psa_prot_internal_storage.c deleted file mode 100644 index fb999af51f9..00000000000 --- a/features/FEATURE_EXPERIMENTAL_API/TARGET_PSA/TARGET_MBED_PSA_SRV/services/storage/its/COMPONENT_PSA_SRV_IPC/psa_prot_internal_storage.c +++ /dev/null @@ -1,137 +0,0 @@ -/* Copyright (c) 2018 ARM Limited - * - * 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 "psa/client.h" -#include "psa/storage_common.h" -#include "psa/internal_trusted_storage.h" -#include "psa_manifest/sid.h" - -psa_status_t psa_its_set(psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags) -{ - if (!p_data && data_length) { - return PSA_ERROR_INVALID_ARGUMENT; - } - - psa_invec msg[3] = { - { &uid, sizeof(uid) }, - { p_data, data_length }, - { &create_flags, sizeof(create_flags) } - }; - - psa_handle_t conn = psa_connect(PSA_ITS_SET, 1); - if (conn <= PSA_NULL_HANDLE) { - return PSA_ERROR_STORAGE_FAILURE; - } - - psa_status_t status = psa_call(conn, msg, 3, NULL, 0); - if (status == PSA_DROP_CONNECTION) { - status = PSA_ERROR_STORAGE_FAILURE; - } - - psa_close(conn); - return status; -} - -psa_status_t psa_its_get(psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data, size_t *p_data_length) -{ - size_t actual_size = 0; - - if ((!p_data && data_length) || !p_data_length) { - return PSA_ERROR_INVALID_ARGUMENT; - } - - psa_invec msg[2] = { - { &uid, sizeof(uid) }, - { &data_offset, sizeof(data_offset) } - }; - - psa_outvec resp[2] = { - { p_data, data_length }, - { &actual_size, sizeof(actual_size) } - }; - - psa_handle_t conn = psa_connect(PSA_ITS_GET, 1); - if (conn <= PSA_NULL_HANDLE) { - return PSA_ERROR_STORAGE_FAILURE; - } - - psa_status_t status = psa_call(conn, msg, 2, resp, 2); - - *p_data_length = actual_size; - - psa_close(conn); - return status; -} - -psa_status_t psa_its_get_info(psa_storage_uid_t uid, struct psa_storage_info_t *p_info) -{ - if (!p_info) { - return PSA_ERROR_INVALID_ARGUMENT; - } - - struct psa_storage_info_t info = { 0, PSA_STORAGE_FLAG_NONE }; - psa_invec msg = { &uid, sizeof(uid) }; - psa_outvec resp = { &info, sizeof(info) }; - psa_handle_t conn = psa_connect(PSA_ITS_INFO, 1); - if (conn <= PSA_NULL_HANDLE) { - return PSA_ERROR_STORAGE_FAILURE; - } - - psa_status_t status = psa_call(conn, &msg, 1, &resp, 1); - - *p_info = info; - - if (status == PSA_DROP_CONNECTION) { - status = PSA_ERROR_STORAGE_FAILURE; - } - - psa_close(conn); - return status; -} - -psa_status_t psa_its_remove(psa_storage_uid_t uid) -{ - psa_invec msg = { &uid, sizeof(uid) }; - psa_handle_t conn = psa_connect(PSA_ITS_REMOVE, 1); - if (conn <= PSA_NULL_HANDLE) { - return PSA_ERROR_STORAGE_FAILURE; - } - - psa_status_t status = psa_call(conn, &msg, 1, NULL, 0); - if (status == PSA_DROP_CONNECTION) { - status = PSA_ERROR_STORAGE_FAILURE; - } - - psa_close(conn); - return status; -} - -psa_status_t psa_its_reset() -{ - psa_handle_t conn = psa_connect(PSA_ITS_RESET, 1); - if (conn <= PSA_NULL_HANDLE) { - return PSA_ERROR_STORAGE_FAILURE; - } - - psa_status_t status = psa_call(conn, NULL, 0, NULL, 0); - if (status == PSA_DROP_CONNECTION) { - status = PSA_ERROR_STORAGE_FAILURE; - } - - psa_close(conn); - return status; -} diff --git a/features/mbedtls/importer/Makefile b/features/mbedtls/importer/Makefile index d81d52f003d..823427e6c27 100644 --- a/features/mbedtls/importer/Makefile +++ b/features/mbedtls/importer/Makefile @@ -35,20 +35,10 @@ TARGET_PREFIX:=../ TARGET_EXPERIMENTAL:=../../FEATURE_EXPERIMENTAL_API/ TARGET_SRC:=$(TARGET_PREFIX)src TARGET_INC:=$(TARGET_PREFIX)inc -TARGET_PSA:=$(TARGET_EXPERIMENTAL)TARGET_MBED_PSA_SRV +TARGET_PSA:=$(TARGET_EXPERIMENTAL)FEATURE_PSA/TARGET_MBED_PSA_SRV/mbedtls TARGET_PSA_INC:=$(TARGET_PSA)/inc TARGET_TESTS:=$(TARGET_PREFIX)TESTS -# A folder structure is introduced here for targets that have both a Secure -# Processing Environment (SPE) targets and Non-secure Processing Environment -# (NSPE). Documentation for each folder as follows: -# COMPONENT_PSA_SRV_IMPL - Include secure service implementation code. For -# example PSA Crypto or PSA Secure Time implementations -TARGET_SRV_IMPL:=$(TARGET_PSA)/COMPONENT_PSA_SRV_IMPL -# COMPONENT_NSPE - Include code that compiles ONLY to the NSPE image and never -# compiles to the SPE image -TARGET_NSPE:=$(TARGET_SRV_IMPL)/COMPONENT_NSPE - # mbed TLS source directory - hidden from mbed via TARGET_IGNORE MBED_TLS_DIR:=TARGET_IGNORE/mbedtls MBED_TLS_API:=$(MBED_TLS_DIR)/include/mbedtls @@ -70,6 +60,7 @@ rsync: # Copying mbed TLS headers to mbed includes... rm -rf $(TARGET_INC) mkdir -p $(TARGET_INC) + mkdir -p $(TARGET_PSA_INC) rsync -a --delete $(MBED_TLS_API) $(TARGET_INC) rsync -a --delete --exclude='crypto_struct.h' $(CRYPTO_API) $(TARGET_PSA_INC)/ # @@ -77,16 +68,15 @@ rsync: cp $(MBED_TLS_DIR)/LICENSE $(TARGET_PREFIX) # # Copying Mbed Crypto into Mbed OS... - rm -rf $(TARGET_SRV_IMPL) + rm -rf $(TARGET_PSA) - mkdir -p $(TARGET_SRV_IMPL) - mkdir -p $(TARGET_NSPE) + mkdir -p $(TARGET_PSA) - rsync -a --delete $(CRYPTO_API)/crypto_struct.h $(TARGET_NSPE)/ - rsync -a --delete $(MBED_TLS_DIR)/library/psa_*.c $(TARGET_SRV_IMPL)/ - rsync -a --delete $(MBED_TLS_DIR)/library/psa_*.h $(TARGET_SRV_IMPL)/ + rsync -a --delete $(CRYPTO_API)/crypto_struct.h $(TARGET_PSA)/ + rsync -a --delete $(MBED_TLS_DIR)/library/psa_*.c $(TARGET_PSA)/ + rsync -a --delete $(MBED_TLS_DIR)/library/psa_*.h $(TARGET_PSA)/ # - # Remove PSA-specific C & H files (they go into $(TARGET_SRV_IMPL)) + # Remove PSA-specific C & H files (they go into $(TARGET_PSA)) rm -rf $(TARGET_SRC)/psa_*.c rm -rf $(TARGET_SRC)/psa_*.h @@ -138,4 +128,4 @@ clean: rm -rf $(TARGET_SRC) rm -rf $(TARGET_INC) rm -rf $(MBED_TLS_DIR) - rm -rf $(TARGET_SRV_IMPL) + rm -rf $(TARGET_PSA) diff --git a/features/mbedtls/importer/adjust-config.sh b/features/mbedtls/importer/adjust-config.sh index 0ee94c6df05..f172d5dc2e9 100755 --- a/features/mbedtls/importer/adjust-config.sh +++ b/features/mbedtls/importer/adjust-config.sh @@ -83,6 +83,11 @@ prepend_code "#error \"No entropy source was found at build time, so TLS \" \\\\\n" \ " \"functionality is not available\"\n" \ "#endif\n" \ + "\n" \ + "#if defined(FEATURE_EXPERIMENTAL_API) && defined(FEATURE_PSA)\n" \ + " #define MBEDTLS_PSA_HAS_ITS_IO\n" \ + " #define MBEDTLS_USE_PSA_CRYPTO\n" \ + "#endif\n" \ "\n" # not supported on mbed OS, nor used by mbed Client diff --git a/features/mbedtls/inc/mbedtls/config.h b/features/mbedtls/inc/mbedtls/config.h index bdf7e5e19da..7192f384e11 100644 --- a/features/mbedtls/inc/mbedtls/config.h +++ b/features/mbedtls/inc/mbedtls/config.h @@ -3719,4 +3719,9 @@ "functionality is not available" #endif +#if defined(FEATURE_EXPERIMENTAL_API) && defined(FEATURE_PSA) + #define MBEDTLS_PSA_HAS_ITS_IO + #define MBEDTLS_USE_PSA_CRYPTO +#endif + #endif /* MBEDTLS_CONFIG_H */ diff --git a/features/mbedtls/inc/mbedtls/psa_util.h b/features/mbedtls/inc/mbedtls/psa_util.h index 513bc5feb78..3d884576eb0 100644 --- a/features/mbedtls/inc/mbedtls/psa_util.h +++ b/features/mbedtls/inc/mbedtls/psa_util.h @@ -7,7 +7,7 @@ * change at any time. */ /* - * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved + * Copyright (C) 2006-2020, ARM Limited, All Rights Reserved * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -163,6 +163,87 @@ static inline int mbedtls_psa_get_ecc_oid_from_id( psa_ecc_curve_t curve, size_t bits, char const **oid, size_t *oid_len ) { +#if TARGET_TFM + /* Use older Crypto API, at least until TF-M updates its crypto + * implementation to Mbed TLS 2.22.0. See + * https://github.com/ARMmbed/mbed-os/issues/13025 for details. */ + (void) bits; + switch( curve ) + { +#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) + case PSA_ECC_CURVE_SECP192R1: + *oid = MBEDTLS_OID_EC_GRP_SECP192R1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP192R1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) + case PSA_ECC_CURVE_SECP224R1: + *oid = MBEDTLS_OID_EC_GRP_SECP224R1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP224R1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) + case PSA_ECC_CURVE_SECP256R1: + *oid = MBEDTLS_OID_EC_GRP_SECP256R1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP256R1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) + case PSA_ECC_CURVE_SECP384R1: + *oid = MBEDTLS_OID_EC_GRP_SECP384R1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP384R1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) + case PSA_ECC_CURVE_SECP521R1: + *oid = MBEDTLS_OID_EC_GRP_SECP521R1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP521R1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) + case PSA_ECC_CURVE_SECP192K1: + *oid = MBEDTLS_OID_EC_GRP_SECP192K1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP192K1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) + case PSA_ECC_CURVE_SECP224K1: + *oid = MBEDTLS_OID_EC_GRP_SECP224K1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP224K1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) + case PSA_ECC_CURVE_SECP256K1: + *oid = MBEDTLS_OID_EC_GRP_SECP256K1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_SECP256K1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) + case PSA_ECC_CURVE_BRAINPOOL_P256R1: + *oid = MBEDTLS_OID_EC_GRP_BP256R1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_BP256R1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) + case PSA_ECC_CURVE_BRAINPOOL_P384R1: + *oid = MBEDTLS_OID_EC_GRP_BP384R1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_BP384R1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ +#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) + case PSA_ECC_CURVE_BRAINPOOL_P512R1: + *oid = MBEDTLS_OID_EC_GRP_BP512R1; + *oid_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_EC_GRP_BP512R1 ); + return( 0 ); +#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ + default: + (void) oid; + (void) oid_len; + return( -1 ); + } +#else + /* Use more up to date Crypto API */ + switch( curve ) { case PSA_ECC_CURVE_SECP_R1: @@ -250,6 +331,7 @@ static inline int mbedtls_psa_get_ecc_oid_from_id( (void) oid; (void) oid_len; return( -1 ); +#endif /* TARGET_TFM */ } #define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH 1 @@ -369,12 +451,16 @@ static inline int mbedtls_psa_err_translate_pk( psa_status_t status ) static inline psa_key_type_t mbedtls_psa_parse_tls_ecc_group( uint16_t tls_ecc_grp_reg_id, size_t *bits ) { +#if TARGET_TFM + return( (psa_ecc_curve_t) tls_ecc_grp_reg_id ); +#else const mbedtls_ecp_curve_info *curve_info = mbedtls_ecp_curve_info_from_tls_id( tls_ecc_grp_reg_id ); if( curve_info == NULL ) return( 0 ); return( PSA_KEY_TYPE_ECC_KEY_PAIR( mbedtls_ecc_group_to_psa( curve_info->grp_id, bits ) ) ); +#endif } #endif /* MBEDTLS_ECP_C */ diff --git a/features/mbedtls/platform/inc/platform_mbed.h b/features/mbedtls/platform/inc/platform_mbed.h index f03a410be28..c424a053ba2 100644 --- a/features/mbedtls/platform/inc/platform_mbed.h +++ b/features/mbedtls/platform/inc/platform_mbed.h @@ -21,7 +21,7 @@ #ifndef __PLATFORM_MBED__H__ #define __PLATFORM_MBED__H__ -#if (defined(TARGET_PSA) && defined(MBEDTLS_ENTROPY_NV_SEED)) +#if (defined(FEATURE_PSA) && defined(MBEDTLS_ENTROPY_NV_SEED)) #include "default_random_seed.h" @@ -37,7 +37,7 @@ * MBEDTLS_ENTROPY_NV_SEED is enabled. */ #define MBEDTLS_PSA_INJECT_ENTROPY -#endif // (defined(TARGET_PSA) && defined(MBEDTLS_ENTROPY_NV_SEED)) +#endif // (defined(FEATURE_PSA) && defined(MBEDTLS_ENTROPY_NV_SEED)) #if DEVICE_TRNG #define MBEDTLS_ENTROPY_HARDWARE_ALT @@ -47,7 +47,7 @@ #include "mbedtls_device.h" #endif -#if defined(TARGET_PSA) +#if defined(FEATURE_PSA) /* The following configurations are a needed for Mbed Crypto submodule. * They are related to the persistent key storage feature. */ diff --git a/features/mbedtls/src/pk.c b/features/mbedtls/src/pk.c index b83ba8e71d4..13afa2d4e4f 100644 --- a/features/mbedtls/src/pk.c +++ b/features/mbedtls/src/pk.c @@ -1,7 +1,7 @@ /* * Public Key abstraction layer * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved + * Copyright (C) 2006-2020, ARM Limited, All Rights Reserved * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -617,12 +617,18 @@ int mbedtls_pk_wrap_as_opaque( mbedtls_pk_context *pk, if( ( ret = mbedtls_mpi_write_binary( &ec->d, d, d_len ) ) != 0 ) return( ret ); + /* prepare the key attributes */ +#if TARGET_TFM + curve_id = mbedtls_ecp_curve_info_from_grp_id( ec->grp.id )->tls_id; + key_type = PSA_KEY_TYPE_ECC_KEY_PAIR( + mbedtls_psa_parse_tls_ecc_group ( curve_id, + &bits ) ); +#else curve_id = mbedtls_ecc_group_to_psa( ec->grp.id, &bits ); key_type = PSA_KEY_TYPE_ECC_KEY_PAIR( curve_id ); - - /* prepare the key attributes */ - psa_set_key_type( &attributes, key_type ); +#endif psa_set_key_bits( &attributes, bits ); + psa_set_key_type( &attributes, key_type ); psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_HASH ); psa_set_key_algorithm( &attributes, PSA_ALG_ECDSA(hash_alg) ); diff --git a/features/mbedtls/src/pk_wrap.c b/features/mbedtls/src/pk_wrap.c index f736431495f..4316debfe44 100644 --- a/features/mbedtls/src/pk_wrap.c +++ b/features/mbedtls/src/pk_wrap.c @@ -1,7 +1,7 @@ /* * Public Key abstraction layer: wrapper functions * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved + * Copyright (C) 2006-2020, ARM Limited, All Rights Reserved * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -559,8 +559,12 @@ static int ecdsa_verify_wrap( void *ctx_arg, mbedtls_md_type_t md_alg, mbedtls_pk_info_t pk_info = mbedtls_eckey_info; psa_algorithm_t psa_sig_md, psa_md; size_t curve_bits; - psa_ecc_curve_t curve = - mbedtls_ecc_group_to_psa( ctx->grp.id, &curve_bits ); + psa_ecc_curve_t curve; +#if TARGET_TFM + curve = mbedtls_ecp_curve_info_from_grp_id( ctx->grp.id )->tls_id; +#else + curve = mbedtls_ecc_group_to_psa( ctx->grp.id, &curve_bits ); +#endif const size_t signature_part_size = ( ctx->grp.nbits + 7 ) / 8; if( curve == 0 ) diff --git a/platform/source/mbed_retarget.cpp b/platform/source/mbed_retarget.cpp index 5938cbe1cb3..f2f7774ea69 100644 --- a/platform/source/mbed_retarget.cpp +++ b/platform/source/mbed_retarget.cpp @@ -1,5 +1,5 @@ /* mbed Microcontroller Library - * Copyright (c) 2006-2019 ARM Limited + * Copyright (c) 2006-2020 ARM Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -1138,7 +1138,7 @@ MBED_USED extern "C" __value_in_regs struct __initial_stackheap __user_setup_sta return _mbed_user_setup_stackheap(R0, R1, R2, R3); } -#endif // !defined(TARGET_TFM) +#endif // !defined(FEATURE_PSA) #endif diff --git a/rtos/source/TARGET_CORTEX/mbed_rtos_rtx.c b/rtos/source/TARGET_CORTEX/mbed_rtos_rtx.c index d8413d24d47..7c03f41c1f9 100644 --- a/rtos/source/TARGET_CORTEX/mbed_rtos_rtx.c +++ b/rtos/source/TARGET_CORTEX/mbed_rtos_rtx.c @@ -24,8 +24,8 @@ #include "mbed_critical.h" #include "mbed_boot.h" -#if defined(TARGET_TFM) && defined(COMPONENT_NSPE) -#include "TARGET_TFM/interface/include/tfm_ns_lock.h" +#if defined(FEATURE_TFM) +#include "FEATURE_TFM/interface/include/tfm_ns_lock.h" #endif osThreadAttr_t _main_thread_attr; @@ -58,9 +58,9 @@ MBED_NORETURN void mbed_rtos_start() _main_thread_attr.tz_module = 1U; #endif -#if defined(TARGET_TFM) && defined(COMPONENT_NSPE) +#if defined(FEATURE_TFM) tfm_ns_lock_init(); -#endif // defined(TARGET_TFM) && defined(COMPONENT_NSPE) +#endif // defined(FEATURE_TFM) osThreadId_t result = osThreadNew((osThreadFunc_t)mbed_start, NULL, &_main_thread_attr); if ((void *)result == NULL) { diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/LICENSE-permissive-binary-license-1.0.txt b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/LICENSE-permissive-binary-license-1.0.txt similarity index 100% rename from targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/LICENSE-permissive-binary-license-1.0.txt rename to targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/LICENSE-permissive-binary-license-1.0.txt diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/README.md b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/README.md new file mode 100644 index 00000000000..926f37cecf5 --- /dev/null +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/README.md @@ -0,0 +1,25 @@ +# MUSCA_A1_NS prebuilt secure binaries + +This directory tree contains Secure images released under Permissive Binary License. + +Built by mbed-cli using GNU Arm Embedded - version 6.3.1 + +These images were compiled by the following command: + +## mcuboot.bin +### Repository +https://github.com/ARMmbed/trusted-firmware-m.git +### Commit SHA +Contained in `features/FEATURE_PSA/TARGET_TFM/VERSION.txt` +```sh +cmake ../ -G"Unix Makefiles" -DTARGET_PLATFORM=MUSCA_A -DCOMPILER=ARMCLANG -DCMAKE_BUILD_TYPE=Debug +make +``` + +## tfm.bin + +```sh +mbed compile -t GCC_ARM -m ARM_MUSCA_A1_S --app-config tools/psa/tfm/mbed_app.json --profile release +``` + +To update the prebuilt binaries run the previous commands. diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/mcuboot.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/mcuboot.bin new file mode 100644 index 00000000000..a697054bd57 Binary files /dev/null and b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/mcuboot.bin differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/README.md b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/README.md deleted file mode 100644 index ca2c87049aa..00000000000 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# MUSCA_A1_NS prebuilt secure binaries - -This directory tree contains Secure images released under Permissive Binary License. - -Built by mbed-cli using GNU Arm Embedded - version 6.3.1 - -These images were compiled by the following command: - -## mcuboot.bin -### Repository -https://git.trustedfirmware.org/trusted-firmware-m.git -### Commit SHA -6c5be4a98e4d7055ee49076ca4e515fb4b172e66 -```sh -cmake ../ -G"Unix Makefiles" -DTARGET_PLATFORM=MUSCA_A -DCOMPILER=ARMCLANG -DCMAKE_BUILD_TYPE=Debug -make -``` - -## tfm.bin - -```sh -mbed compile -t GCC_ARM -m ARM_MUSCA_A1_S --app-config tools/psa/tfm/mbed_app.json --profile release -``` - -## spm_smoke.bin - -```sh -mbed test --compile -t GCC_ARM -m ARM_MUSCA_A1_S --app-config tools/psa/tfm/mbed_app.json -n tests-psa-spm_smoke -DUSE_PSA_TEST_PARTITIONS -DUSE_SMOKE_TESTS_PART1 --profile release -``` - -## spm_client.bin - -```sh -mbed test --compile -t GCC_ARM -m ARM_MUSCA_A1_S --app-config tools/psa/tfm/mbed_app.json -n tests-psa-spm_client -DUSE_PSA_TEST_PARTITIONS -DUSE_CLIENT_TESTS_PART1 --profile release -``` - -## spm_server.bin - -```sh -mbed test --compile -t GCC_ARM -m ARM_MUSCA_A1_S --app-config tools/psa/tfm/mbed_app.json -n tests-psa-spm_server -DUSE_PSA_TEST_PARTITIONS -DUSE_SERVER_TESTS_PART1 -DUSE_SERVER_TESTS_PART2 --profile release -``` - -To update the prebuilt binaries run the previous commands. diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/cmse_lib.o b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/cmse_lib.o deleted file mode 100644 index 118b2d3fbf0..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/cmse_lib.o and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/crypto_access_control.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/crypto_access_control.bin deleted file mode 100644 index cbcd4ae3dd6..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/crypto_access_control.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/mcuboot.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/mcuboot.bin deleted file mode 100644 index 977cc2cbe2e..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/mcuboot.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/spm_client.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/spm_client.bin deleted file mode 100644 index a5cc36b0bdb..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/spm_client.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/spm_server.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/spm_server.bin deleted file mode 100644 index c96f913307e..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/spm_server.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/spm_smoke.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/spm_smoke.bin deleted file mode 100644 index dcfb083f977..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/spm_smoke.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/tfm.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/tfm.bin deleted file mode 100644 index 7ed014ed5e7..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/prebuilt/tfm.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/cmse_lib.o b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/s_veneers.o similarity index 70% rename from targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/cmse_lib.o rename to targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/s_veneers.o index 706fd2b9968..70479f3b4df 100644 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/cmse_lib.o and b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/s_veneers.o differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/tfm_s.axf b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/tfm_s.axf new file mode 100644 index 00000000000..ee5f9755a69 Binary files /dev/null and b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/tfm_s.axf differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/tfm_s.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/tfm_s.bin new file mode 100644 index 00000000000..669e7315345 Binary files /dev/null and b/targets/TARGET_ARM_SSG/TARGET_MUSCA_A1/tfm_s.bin differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/cmsis.h b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/cmsis.h index 4bc147df1ab..720bad28898 100644 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/cmsis.h +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/cmsis.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Arm Limited + * Copyright (c) 2017-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. @@ -81,4 +81,8 @@ #warning Not supported compiler type #endif +#if defined(TARGET_MUSCA_B1) +#include "cmsis_nvic.h" +#endif + #endif /*__MUSCA_B1_CMSIS_H__ */ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/cmsis_nvic_virtual.c b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/cmsis_nvic_virtual.c deleted file mode 100644 index b38df8e8ae1..00000000000 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/cmsis_nvic_virtual.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020 Arm Limited - * - * 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 "cmsis_nvic_virtual.h" -#include "psa/lifecycle.h" - -void NVIC_SystemReset(void) -{ - mbed_psa_system_reset(); -} diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/mcuboot.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/mcuboot.bin new file mode 100644 index 00000000000..bde2aa8c620 Binary files /dev/null and b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/mcuboot.bin differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/partition/image_macros_preprocessed.c b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/partition/image_macros_preprocessed.c deleted file mode 100644 index bcc459ddca6..00000000000 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/partition/image_macros_preprocessed.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020 Arm Limited - * 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. - */ - -enum image_attributes { - RE_SECURE_IMAGE_OFFSET = (0x0), - RE_SECURE_IMAGE_MAX_SIZE = (0x60000), - RE_NON_SECURE_IMAGE_OFFSET = ((0x0) + (0x60000)), - RE_NON_SECURE_IMAGE_MAX_SIZE = (0x80000), - RE_SIGN_BIN_SIZE = ((0x60000) + (0x80000)), -}; diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/partition/image_macros_preprocessed_ns.c b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/partition/image_macros_preprocessed_ns.c new file mode 100644 index 00000000000..271da46bef3 --- /dev/null +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/partition/image_macros_preprocessed_ns.c @@ -0,0 +1,7 @@ +enum image_attributes { + RE_SECURE_IMAGE_OFFSET = (0x0), + RE_SECURE_IMAGE_MAX_SIZE = (0x60000), + RE_NON_SECURE_IMAGE_OFFSET = ((0x0) + (0x60000)), + RE_NON_SECURE_IMAGE_MAX_SIZE = (0x80000), + RE_SIGN_BIN_SIZE = ((0x80000)), +}; diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/partition/image_macros_preprocessed_s.c b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/partition/image_macros_preprocessed_s.c new file mode 100644 index 00000000000..d8ebb65289c --- /dev/null +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/partition/image_macros_preprocessed_s.c @@ -0,0 +1,7 @@ +enum image_attributes { + RE_SECURE_IMAGE_OFFSET = (0x0), + RE_SECURE_IMAGE_MAX_SIZE = (0x60000), + RE_NON_SECURE_IMAGE_OFFSET = ((0x0) + (0x60000)), + RE_NON_SECURE_IMAGE_MAX_SIZE = (0x80000), + RE_SIGN_BIN_SIZE = ((0x60000)), +}; diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/LICENSE-permissive-binary-license-1.0.txt b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/LICENSE-permissive-binary-license-1.0.txt deleted file mode 100644 index 92d2328166e..00000000000 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/LICENSE-permissive-binary-license-1.0.txt +++ /dev/null @@ -1,49 +0,0 @@ -Permissive Binary License - -Version 1.0, December 2020 - -Redistribution. Redistribution and use in binary form, without -modification, are permitted provided that the following conditions are -met: - -1) Redistributions must reproduce the above copyright notice and the - following disclaimer in the documentation and/or other materials - provided with the distribution. - -2) Unless to the extent explicitly permitted by law, no reverse - engineering, decompilation, or disassembly of this software is - permitted. - -3) Redistribution as part of a software development kit must include the - accompanying file named DEPENDENCIES and any dependencies listed in - that file. - -4) Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -Limited patent license. The copyright holders (and contributors) grant a -worldwide, non-exclusive, no-charge, royalty-free patent license to -make, have made, use, offer to sell, sell, import, and otherwise -transfer this software, where such license applies only to those patent -claims licensable by the copyright holders (and contributors) that are -necessarily infringed by this software. This patent license shall not -apply to any combinations that include this software. No hardware is -licensed hereunder. - -If you institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the software -itself infringes your patent(s), then your rights granted under this -license shall terminate as of the date such litigation is filed. - -DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS "AS IS." 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 -HOLDERS 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/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/README.md b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/README.md deleted file mode 100644 index 78c37123d73..00000000000 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# MUSCA_B1_NS prebuilt secure binaries - -This directory tree contains Secure images released under Permissive Binary License. - -Built by mbed-cli using GNU Arm Embedded - version 8.3.1 - -These images were compiled by the following command: - -## mcuboot.bin -### Repository -https://git.trustedfirmware.org/trusted-firmware-m.git -### Commit SHA -6c5be4a98e4d7055ee49076ca4e515fb4b172e66 -```sh -cmake ../ -G"Unix Makefiles" -DTARGET_PLATFORM=MUSCA_B1 -DCOMPILER=ARMCLANG -DCMAKE_BUILD_TYPE=Debug -make -``` - -## tfm.bin - -```sh -mbed compile -t GCC_ARM -m ARM_MUSCA_B1_S --app-config tools/psa/tfm/mbed_app.json --profile release -``` - -## spm_smoke.bin - -```sh -mbed test --compile -t GCC_ARM -m ARM_MUSCA_B1_S --app-config tools/psa/tfm/mbed_app.json -n tests-psa-spm_smoke -DUSE_PSA_TEST_PARTITIONS -DUSE_SMOKE_TESTS_PART1 --profile release -``` - -## spm_client.bin - -```sh -mbed test --compile -t GCC_ARM -m ARM_MUSCA_B1_S --app-config tools/psa/tfm/mbed_app.json -n tests-psa-spm_client -DUSE_PSA_TEST_PARTITIONS -DUSE_CLIENT_TESTS_PART1 --profile release -``` - -## spm_server.bin - -```sh -mbed test --compile -t GCC_ARM -m ARM_MUSCA_B1_S --app-config tools/psa/tfm/mbed_app.json -n tests-psa-spm_server -DUSE_PSA_TEST_PARTITIONS -DUSE_SERVER_TESTS_PART1 -DUSE_SERVER_TESTS_PART2 --profile release -``` - -## crypto_access_control.bin - -```sh -mbed test --compile -t GCC_ARM -m ARM_MUSCA_B1_S --app-config tools/psa/tfm/mbed_app.json -n tests-psa-crypto_access_control -DUSE_PSA_TEST_PARTITIONS -DUSE_CRYPTO_ACL_TEST --profile release -``` - -To update the prebuilt binaries run the previous commands. diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/crypto_access_control.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/crypto_access_control.bin deleted file mode 100644 index 4fd7c24cbb2..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/crypto_access_control.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/mcuboot.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/mcuboot.bin deleted file mode 100644 index cceebfcac1a..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/mcuboot.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/spm_client.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/spm_client.bin deleted file mode 100644 index 3ea4bb0d5d2..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/spm_client.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/spm_server.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/spm_server.bin deleted file mode 100644 index e4412b02e57..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/spm_server.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/spm_smoke.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/spm_smoke.bin deleted file mode 100644 index a0df490131d..00000000000 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/spm_smoke.bin and /dev/null differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/s_veneers.o b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/s_veneers.o new file mode 100644 index 00000000000..94b09968af3 Binary files /dev/null and b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/s_veneers.o differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/tfm_s.axf b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/tfm_s.axf new file mode 100644 index 00000000000..059c17ca4a1 Binary files /dev/null and b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/tfm_s.axf differ diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/tfm.bin b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/tfm_s.bin similarity index 52% rename from targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/tfm.bin rename to targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/tfm_s.bin index b56a0eaf086..9ac7aee4fa1 100644 Binary files a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/prebuilt/tfm.bin and b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/tfm_s.bin differ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/TOOLCHAIN_ARM/cyb06xxa_cm4.sct b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/TOOLCHAIN_ARM/cyb06xxa_cm4.sct index 8fd5a3d43d4..c6b552dce05 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/TOOLCHAIN_ARM/cyb06xxa_cm4.sct +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/TOOLCHAIN_ARM/cyb06xxa_cm4.sct @@ -27,6 +27,7 @@ ;******************************************************************************* ;* \copyright ;* Copyright 2016-2020 Cypress Semiconductor Corporation +;* Copyright 2020 Arm Limited ;* SPDX-License-Identifier: Apache-2.0 ;* ;* Licensed under the Apache License, Version 2.0 (the "License"); @@ -42,8 +43,10 @@ ;* limitations under the License. ;******************************************************************************/ +#include "../../../partition/region_defs.h" + #if !defined(MBED_ROM_START) - #define MBED_ROM_START 0x10000000 + #define MBED_ROM_START NS_CODE_START #endif ;* MBED_APP_START is being used by the bootloader build script and @@ -55,7 +58,7 @@ #endif #if !defined(MBED_ROM_SIZE) - #define MBED_ROM_SIZE 0x001D0000 + #define MBED_ROM_SIZE NS_CODE_SIZE #endif ;* MBED_APP_SIZE is being used by the bootloader build script and @@ -67,19 +70,19 @@ #endif #if !defined(MBED_RAM_START) - #define MBED_RAM_START 0x08000000 + #define MBED_RAM_START NS_DATA_START #endif #if !defined(MBED_RAM_SIZE) - #define MBED_RAM_SIZE 0x000EA000 + #define MBED_RAM_SIZE NS_DATA_SIZE #endif #if !defined(MBED_BOOT_STACK_SIZE) - #define MBED_BOOT_STACK_SIZE 0x400 + #define MBED_BOOT_STACK_SIZE NS_MSP_STACK_SIZE #endif -; The size of the stack section at the end of CM4 SRAM -#define STACK_SIZE MBED_BOOT_STACK_SIZE +; Shared memory area between Non-secure and Secure +#define MBED_DATA_SHARED_SIZE NS_DATA_SHARED_SIZE ; The defines below describe the location and size of blocks of memory in the target. ; Use these defines to specify the memory regions available for allocation. @@ -92,9 +95,6 @@ #define FLASH_START MBED_APP_START #define FLASH_SIZE MBED_APP_SIZE -; The size of the MCU boot header area at the start of FLASH -#define BOOT_HEADER_SIZE 0x00000400 - ; The following defines describe 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. @@ -136,7 +136,7 @@ ; Cortex-M4 application flash area LR_IROM1 FLASH_START FLASH_SIZE { - ER_FLASH_VECTORS +BOOT_HEADER_SIZE + ER_FLASH_VECTORS +0 { * (RESET, +FIRST) } @@ -166,15 +166,27 @@ LR_IROM1 FLASH_START FLASH_SIZE } ; Application heap area (HEAP) - ARM_LIB_HEAP +0 EMPTY RAM_START+RAM_SIZE-STACK_SIZE-ImageLimit(RW_IRAM1) - { + ARM_LIB_HEAP +0 ALIGN 4 EMPTY RAM_START+RAM_SIZE-MBED_BOOT_STACK_SIZE-MBED_DATA_SHARED_SIZE-ImageLimit(RW_IRAM1) + { } - + ; Stack region growing down - ARM_LIB_STACK RAM_START+RAM_SIZE EMPTY -STACK_SIZE + ARM_LIB_STACK RAM_START+RAM_SIZE-MBED_DATA_SHARED_SIZE ALIGN 4 EMPTY -MBED_BOOT_STACK_SIZE + { + } + + ; Stack area overflowed within RAM + ScatterAssert(ImageBase(ARM_LIB_STACK) + ImageLength(ARM_LIB_STACK) == RAM_START+RAM_SIZE-MBED_DATA_SHARED_SIZE) + + ; Shared region + ARM_LIB_SHARED RAM_START+RAM_SIZE-MBED_DATA_SHARED_SIZE ALIGN 4 EMPTY MBED_DATA_SHARED_SIZE { - } - + } + + ; Shared area overflowed within RAM + ScatterAssert(ImageBase(ARM_LIB_SHARED) + ImageLength(ARM_LIB_SHARED) == RAM_START+RAM_SIZE) + + ; 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. diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/TOOLCHAIN_GCC_ARM/cyb06xxa_cm4.ld b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/TOOLCHAIN_GCC_ARM/cyb06xxa_cm4.ld index 6b29f396c31..914ebc35fd8 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/TOOLCHAIN_GCC_ARM/cyb06xxa_cm4.ld +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/TOOLCHAIN_GCC_ARM/cyb06xxa_cm4.ld @@ -20,6 +20,7 @@ ******************************************************************************** * \copyright * Copyright 2016-2020 Cypress Semiconductor Corporation +* Copyright 2020 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -40,8 +41,10 @@ SEARCH_DIR(.) GROUP(-lgcc -lc -lnosys) ENTRY(Reset_Handler) +#include "../../../partition/region_defs.h" + #if !defined(MBED_ROM_START) - #define MBED_ROM_START 0x10000000 + #define MBED_ROM_START NS_CODE_START #endif /* MBED_APP_START is being used by the bootloader build script and @@ -49,11 +52,11 @@ ENTRY(Reset_Handler) * is equal to MBED_ROM_START */ #if !defined(MBED_APP_START) - #define MBED_APP_START MBED_ROM_START + #define MBED_APP_START MBED_ROM_START #endif #if !defined(MBED_ROM_SIZE) - #define MBED_ROM_SIZE 0x001D0000 + #define MBED_ROM_SIZE NS_CODE_SIZE #endif /* MBED_APP_SIZE is being used by the bootloader build script and @@ -61,26 +64,24 @@ ENTRY(Reset_Handler) * is equal to MBED_ROM_SIZE */ #if !defined(MBED_APP_SIZE) - #define MBED_APP_SIZE MBED_ROM_SIZE + #define MBED_APP_SIZE MBED_ROM_SIZE #endif #if !defined(MBED_RAM_START) - #define MBED_RAM_START 0x08000000 + #define MBED_RAM_START NS_DATA_START #endif #if !defined(MBED_RAM_SIZE) - #define MBED_RAM_SIZE 0x000EA000 + #define MBED_RAM_SIZE NS_DATA_SIZE #endif +/* Size of the stack section in CM4 SRAM area */ #if !defined(MBED_BOOT_STACK_SIZE) - #define MBED_BOOT_STACK_SIZE 0x400 + #define MBED_BOOT_STACK_SIZE NS_MSP_STACK_SIZE #endif -/* The size of the stack section at the end of CM4 SRAM */ -STACK_SIZE = MBED_BOOT_STACK_SIZE; - -/* The size of the MCU boot header area at the start of FLASH */ -BOOT_HEADER_SIZE = 0x400; +/* Shared memory area between Non-Secure and Secure */ +#define MBED_DATA_SHARED_SIZE NS_DATA_SHARED_SIZE /* 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 @@ -157,7 +158,7 @@ GROUP(libgcc.a libc.a libm.a libnosys.a) SECTIONS { /* Cortex-M4 application flash area */ - .text ORIGIN(flash) + BOOT_HEADER_SIZE : + .text ORIGIN(flash) : { /* Cortex-M4 flash vector table */ . = ALIGN(4); @@ -330,20 +331,26 @@ SECTIONS __end__ = .; end = __end__; KEEP(*(.heap*)) - . = ORIGIN(ram) + LENGTH(ram) - STACK_SIZE; + . = ORIGIN(ram) + LENGTH(ram) - MBED_BOOT_STACK_SIZE - MBED_DATA_SHARED_SIZE; + . = ALIGN(4); + __StackLimit = .; __HeapLimit = .; } > 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 - STACK_SIZE; + __StackTop = (__StackLimit + MBED_BOOT_STACK_SIZE + 3) & 0xFFFFFFFC; PROVIDE(__stack = __StackTop); - /* Check if data + heap + stack exceeds RAM limit */ - ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + .shared __StackTop (NOLOAD): + { + __SharedStart = .; + . += MBED_DATA_SHARED_SIZE; + KEEP(*(.shared*)) + __SharedLimit = .; + } > ram + /* Check if Shared area overflowed within RAM */ + ASSERT(__SharedLimit == ORIGIN(ram) + LENGTH(ram), "Shared area overflowed within RAM") /* 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. */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/device_cfg.h b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/device_cfg.h new file mode 100644 index 00000000000..b9d720c2e92 --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/device/COMPONENT_CM4/device_cfg.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2017-2018 Arm Limited + * Copyright (c) 2020, Cypress Semiconductor Corporation. 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. + */ + +#ifndef __ARM_LTD_DEVICE_CFG_H__ +#define __ARM_LTD_DEVICE_CFG_H__ + +#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL +#define NUM_MAILBOX_QUEUE_SLOT 4 +#endif + +#endif /* __ARM_LTD_DEVICE_CFG_H__ */ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/tfm_s.axf b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/tfm_s.axf new file mode 100644 index 00000000000..491d488c975 Binary files /dev/null and b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/tfm_s.axf differ diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/tfm_s.hex b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/tfm_s.hex new file mode 100644 index 00000000000..6d2112eac1a --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W/tfm_s.hex @@ -0,0 +1,13677 @@ +:020000041000EA +:1004000000080108910400100D000000616F021047 +:1004100000000000000000000000000000000000DC +:10042000000000000000000000000000496F021002 +:1004300000000000000000000D6F0210FD0400101D +:10044000FD040010B56F0210FD040010D537021036 +:10045000FD040010FD040010FD040010A56D021045 +:10046000FD040010FD040010FD040010FD04001048 +:10047000FD040010FD040010FD040010FD04001038 +:100480007047EFF3108072B6704780F310887047A2 +:10049000FFF7F6FF72B6144C144DAC4209DA21682E +:1004A0006268A368043B02DBC858D050FAE70C34FA +:1004B000F3E70F4B0F4CA34208DA19685A68002083 +:1004C000043A01DB8850FBE70833F4E726F054FEDA +:1004D000EFF314800221084380F31488064880F368 +:1004E000098824F0AFF8FEE71C050010E8050010AD +:1004F000E8050010D006001000100108FEE7FEE736 +:1005000000B504207146084202D0EFF3098001E0F3 +:0C051000EFF30880043025F09DFFFEE7AB +:10051C00204B0310007E0208A00A00004049031083 +:10052C000010000880000000E049031000100108D2 +:10053C0000000000E04903108028010800000000C2 +:10054C00E049031000C0010840000000204A0310DD +:10055C008050020800000000204A031000550208D9 +:10056C0000000000204A0310006202080000000096 +:10057C00C04903108010000800000000204A03103E +:10058C000066020800010000204B031000760208F0 +:10059C0000000000C0490310801500080000000096 +:1005AC00C04903100019000820000000204B031064 +:1005BC00A078020800000000E0490310801D00082C +:1005CC0000000000E04903100021000800000000BA +:0C05DC00C055031000F002089804000055 +:1005E800A0880208802500000010010820120000E1 +:1005F800802201080006000080280108809200007F +:1006080000BB01080005000040C0010800700000A0 +:1006180080300208002000008050020820000000FE +:1006280000510208000400000055020860020000A2 +:1006380080570208800A00000062020820000000BB +:100648008062020880030000801000082002000079 +:100658000013000880020000006702080002000082 +:1006680000690208000D0000007602082000000062 +:100678008076020820020000801500082000000093 +:1006880000160008000300002019000820000000E0 +:100698008019000800040000A0780208200000006B +:1006A8000079020800050000801D000820000000F5 +:1006B800001E0008000300000021000820000000C0 +:0806C800802100080001000080 +:0806D000000000000000000022 +:1006D8000000000000000000000000000000000012 +:1006E8000000000000000000000000000000000002 +:1007000010B5034B0A000100186800F055F810BD41 +:1007100034880208084B10B50400002B02D00021D9 +:1007200000E000BF054B1868836A002B00D0984793 +:1007300020002EF0CDFDC04600000000441800103F +:1007400010B5034B0100186800F044F810BDC04616 +:100750003488020830B500240139A24201D10020BA +:1007600005E0035D01340D5DAB42F6D0581B30BD92 +:10077000002310B59A4200D110BDCC5CC4540133A3 +:10078000F8E710B5884202D98B18984203D30023AA +:1007900007E08B5C8354013AFBD210BDCC5CC4549F +:1007A00001339A42FAD1F8E703008218934200D14C +:1007B000704719700133F9E74A4370B5110015000D +:1007C00000F052F8041E03D02A000021FFF7ECFFCE +:1007D000200070BD70B50500002910D00C1F2368E3 +:1007E000002B00DAE418280000F06EFC1D4A1368A4 +:1007F000002B05D163601460280000F06DFC70BD13 +:10080000A34208D9216860188342F3D118685B6855 +:1008100041182160EEE71A005B68002B01D0A3426B +:10082000F9D911685018A0420BD120680918501846 +:1008300011608342E0D118685B6841181160536011 +:10084000DAE7A04202D90C232B60D5E721686018B3 +:10085000834203D118685B6841182160636054606B +:10086000CAE7C04600AE0208F8B50323CD1C9D437D +:10087000083506000C2D1FD20C25A9421ED83000C9 +:1008800000F022FC25490A681400002C1AD1244FDC +:100890003B68002B04D12100300000F0D9F838600B +:1008A0002900300000F0D4F8431C2BD10C23300079 +:1008B000336000F011FC03E0002DDEDA0C2333601E +:1008C0000020F8BD23685B1B19D40B2B03D92360D0 +:1008D000E418256003E06368A2420ED10B6030008B +:1008E00000F0FAFB200007220B30231D9043C21AB0 +:1008F0009842E6D01B1AA350E3E75360EFE72200CB +:100900006468C2E70323C41C9C43A042E1D0211ABF +:10091000300000F09DF8431CDBD1C7E700AE0208B1 +:1009200004AE02080FB40B4B13B51C68002C05D0A5 +:10093000A369002B02D1200000F0B6FA05AB20001D +:10094000049AA168019300F0F7FB16BC08BC04B040 +:100950001847C0463488020870B505000E0000280C +:1009600004D08369002B01D100F09EFAAB69AC681A +:10097000002B02D1280000F097FA2D4B9C4222D187 +:100980006C68636EDB0705D4A3899B0502D4A06D58 +:1009900000F02BFBA3891B0702D52369002B29D16B +:1009A0002100280000F0DAF8002823D001256D424C +:1009B000636EDB0705D4A3899B0502D4A06D00F00C +:1009C00015FB280070BD1B4B9C4201D1AC68D8E7D9 +:1009D000194B9C42D5D1EC68D3E70136A360002BBC +:1009E00004DAA2699A4216DC0A2914D023685A1C38 +:1009F00022601970A3683178013B0029EDD1A36012 +:100A0000002B0FDA280022000A3100F051F80A25E5 +:100A1000431CCDD1CAE72200280000F049F8431C4E +:100A2000E8D1C3E70A2523685A1C22601D70BFE77E +:100A300068180010881800104818001010B5034BF3 +:100A400001001868FFF788FF10BDC046348802080F +:100A5000002370B5064D040008002B602EF02AFC20 +:100A6000431C03D12B68002B00D0236070BDC0460F +:100A70001CAE02080023C25C0133002AFBD1581EC1 +:100A800070470A7830B5002A0CD130BD9A4208D19F +:100A90000123CC5C002CF8D0C55CA54201D1013308 +:100AA000F7E701300378002BF0D11800EDE70000E4 +:100AB000F8B505000E001400002804D08369002B4F +:100AC00001D100F0F1F9224B9C422ED16C68A36950 +:100AD000A360A3891B0732D52369002B2FD023687D +:100AE0002269F7B2981A6369F6B2834205DC2100E5 +:100AF000280000F037F9002827D1A3680130013B16 +:100B0000A36023685A1C22601F706369834204D06B +:100B1000A389DB0707D50A2E05D12100280000F0A4 +:100B200021F9002811D13000F8BD0A4B9C4201D1B7 +:100B3000AC68CCE7084B9C42C9D1EC68C7E7210000 +:100B4000280000F00BF80028C9D001267642EAE719 +:100B5000681800108818001048180010374B70B53E +:100B60001D6806000C00002D05D0AB69002B02D1DA +:100B7000280000F099F9324B9C420FD16C680C238D +:100B8000E25E93B211072DD4D90611D409230120B6 +:100B9000336037331343A381404270BD294B9C42DD +:100BA00001D1AC68EBE7284B9C42E8D1EC68E6E762 +:100BB0005B0713D5616B002908D0230044339942A9 +:100BC00002D03000FFF706FE002363632422A389CE +:100BD0009343A38100236360236923600823A289D0 +:100BE0001343A3812369002B0BD1A0218022A38969 +:100BF000890092000B40934203D02100300000F0A6 +:100C00001FFA0C22A35E01201A0099B2024003428F +:100C10000FD00022A26062695242A26100202269C4 +:100C20008242BAD10A06B8D540221343A3810138C3 +:100C3000B3E7880700D46269A260EFE7348802084E +:100C4000681800108818001048180010F7B58B8934 +:100C500005000C001A075FD44A68002A04DC0A6CFD +:100C6000002A01DC0020FEBDE76A002FFAD0002236 +:100C700080212E682A601A0049010A400B4234D0B4 +:100C8000606DA3895B0706D56368C01A636B002B90 +:100C900001D0236CC01A0200216A00232800E76AF1 +:100CA000B847A189431C06D12B681D2B31D82C4A8B +:100CB000DA40D3072DD50023636023692360CB047A +:100CC00005D5431C02D12B68002B00D16065616BF8 +:100CD0002E600029C6D023004433994202D0280058 +:100CE000FFF778FD00206063BDE701232800216A3B +:100CF000B847431CC5D12B68002BC2D01D2B01D097 +:100D0000162B01D12E60ADE74023A2891343A381A6 +:100D1000A9E740230B43FAE70F69002FA2D00A6826 +:100D20000F60D21B019200229B0700D14A69A2608A +:100D3000019B002B00DC95E73A002800019B216A0B +:100D4000A66AB047002806DC40230120A289404261 +:100D50001343A38187E7019B3F181B1A0193E7E721 +:100D6000010040200B6970B505000C00002B02D17A +:100D70000025280070BD002804D08369002B01D114 +:100D800000F092F8144B9C421BD16C680C22A35EBD +:100D9000002BEDD0626ED20704D49B0502D4A06D67 +:100DA00000F023F928002100FFF750FF636E0500D3 +:100DB000DB07DED4A3899B05DBD4A06D00F016F918 +:100DC000D7E7064B9C4201D1AC68DFE7044B9C425D +:100DD000DCD1EC68DAE7C04668180010881800100B +:100DE00048180010002310B50400036043608360BE +:100DF000818143661900C2810361436183610822D6 +:100E00005C30FFF7D1FC054B6362054B2462A362A3 +:100E1000044BE362044B236310BDC046B1160010BF +:100E2000D9160010111700103D17001010B5024917 +:100E300000F0BAF810BDC046650D001070B5682509 +:100E40004A1E55430E0029007431FFF70DFD041EA4 +:100E500008D000212A00016046600C30A060683292 +:100E6000FFF7A2FC200070BD10B5024800F0BDF8ED +:100E700010BDC04618AE020810B5024800F0B6F822 +:100E800010BDC04618AE020810B5024800F0ADF81B +:100E900010BDC04613AE020810B5024800F0A6F817 +:100EA00010BDC04613AE020813B50400FFF7ECFFF7 +:100EB000A369002B02D0FFF7EFFF13BDA364E36427 +:100EC0002365134B134A1B68A2620193A34201D10D +:100ED0000123A361200000F01FF86060200000F0F3 +:100EE0001BF8A060200000F017F800220421E06049 +:100EF0006068FFF777FF01220921A068FFF772FF02 +:100F000002221221E068FFF76DFF0123A361D2E7FF +:100F1000441800102D0E0010F8B50700FFF7A4FFCD +:100F20001F4B1E68B369002B02D13000FFF7BCFFD6 +:100F30004836B4687368013B04D53368002B22D06F +:100F40003668F6E70C22A55E002D1AD12000154B5D +:100F50005830E360656600F047F8FFF78DFF20002A +:100F6000082229002560A560656025616561A5618D +:100F70005C30FFF719FC6563A563A564E564200098 +:100F8000F8BD6834D7E704213800FFF757FF041E87 +:100F90003060D5D1FFF770FF0C233B60EFE7C04610 +:100FA000441800100100FFFFF7B5040006000027F9 +:100FB000019148346368A5680093009B013B00934E +:100FC00004D52468002CF5D13800FEBDAB89012B77 +:100FD00008D90E22AB5E013304D029003000019BFA +:100FE000984707436835E8E7704770477047000047 +:100FF00070B50E001D000E23C95E140096B00029C6 +:1010000007DA00232B60B3891B0611D48023DB0091 +:101010000FE06A4600F0BEFB0028F2DBF0230199E6 +:101020001B021940054BC9184B4259412960EDE795 +:1010300040230020236016B070BDC04600E0FFFFD3 +:10104000F7B502268B8905000C00334206D0230039 +:1010500047332360236101236361F7BD6A4601AB17 +:10106000FFF7C6FF009907002800FFF7FDFB0028E7 +:1010700008D10C22A35E9A05EFD4032293431E43AA +:10108000A681E4E70F4BAB628023A2892060134363 +:10109000A381009B20616361019B002B0DD0280080 +:1010A0000E23E15E00F088FB002806D00322A3890E +:1010B00093431A0001231343A381A0890743A78107 +:1010C000CBE7C0462D0E001010B50248FFF78DFF8C +:1010D00010BDC04614AE020810B50248FFF786FFE7 +:1010E00010BDC04614AE0208936810B5013B936072 +:1010F000002B04DA9469A34207DB0A2905D01368A0 +:10110000581C10601970080010BDFFF7D1FC0100D9 +:10111000F9E7F8B506000F001400D518AC4201D16C +:10112000002007E021783A003000FFF7DDFF0134AE +:10113000431CF3D1F8BD0000F0B5A1B006000C00CF +:101140001F000392002804D08369002B01D1FFF710 +:10115000ABFE8E4B9C421CD17468636EDB0705D4DA +:10116000A3899B0502D4A06DFFF73FFFA3891B074E +:1011700002D52369002B1DD121003000FFF7EEFCC2 +:10118000002817D0636EDB070DD50120404221B047 +:10119000F0BD7F4B9C4201D1B468DEE77D4B9C42A1 +:1011A000DBD1F468D9E7A3899B05EED4A06DFFF7E6 +:1011B0001DFFEAE7002308AD6B6120336B76103327 +:1011C000AB760797039F3B78002B01D0252B4ED1A0 +:1011D000039BFB1A0593039B9F420DD0059B2100A7 +:1011E0003000039AFFF795FF431C00D1B5E06A6910 +:1011F000059B944663446B613B78002B00D1ACE0C7 +:1012000001227B1C0393002352426A6004A95432DA +:1012100052182B60EB60AB601370AB65039B05222B +:1012200019785D4800F0EEFA039B5F1C002820D17E +:101230002A68D30604D5532304A95B18202119700A +:10124000130704D5532304A95B182B211970039BA2 +:101250001B782A2B16D00021EB68039F3A78781C64 +:10126000303A8446092A4FD9002911D117E00137B5 +:10127000A9E7494B2A68C01A0123834013432B6016 +:101280000397CBE7079B191D1B680791002B01DB18 +:101290000B9304E05B42EB60022313432B603B782B +:1012A0002E2B0AD17B782A2B37D1079B02371A1DA8 +:1012B0001B680792002B2DDB0993032239783748EE +:1012C00000F0A0FA002807D0344B2A68C01A402347 +:1012D0008340134301372B6039787B1C062230484A +:1012E0000393297600F08EFA002845D02D4B002B71 +:1012F00027D10722079B07339343083307936B6972 +:10130000049A9B186B615DE70A214B4367469B1863 +:101310000939A3E701235B42CEE700231A00013716 +:101320006B603978781C30398446092903D9002B41 +:10133000C3D00992C1E70A235A4367465218093BB2 +:10134000EFE707AB0093220029003000164B00E0C6 +:1013500000BF0490049B0133D1D1636EDB0705D439 +:10136000A3899B0502D4A06DFFF740FEA3895B060D +:1013700000D50AE70D980AE707AB00932200290081 +:101380003000094B00F082F8E3E7C046681800100F +:101390008818001048180010A8180010AE18001087 +:1013A000B21800100000000013110010F7B515006E +:1013B00001938A680B690C000090934200DA1300D5 +:1013C00022002B6043321278002A01D001332B60B7 +:1013D00023689B0602D52B6802332B602268062304 +:1013E00017001F401A4227D0230043331B785A1E90 +:1013F00093412268920630D4220001990098089EF9 +:101400004332B047431C25D0062320682A68E16890 +:1014100000250340042B03D18D1AEB43DB171D403D +:10142000A3682269934201DD9B1AED180027BD4293 +:1014300020D1002010E00137E3682A689B1ABB42E4 +:10144000D2DD2200012301990098089E1932B0478D +:10145000431CF0D101204042FEBD3020E118433151 +:10146000087021005A1C45310978A2184332023312 +:101470001170C1E72200012301990098089E1A32D9 +:10148000B047431CE6D00137D1E70000F0B58BB080 +:1014900006920A0043320793059004920A7E0C00DC +:1014A000109B782A06D8622A08D8002A00D1C0E00A +:1014B000582A52D026004236327022E0100063389B +:1014C0001528F7D801F040FE16001F00F6FFF6FFC2 +:1014D000F6FFF6FF1F00F6FFF6FFF6FFF6FFA80087 +:1014E00036009A00F6FFF6FFB900F6FF3600F6FF69 +:1014F000F6FF9E0026001A684236111D1960136817 +:1015000033700123A7E0086819680A1D05060BD58A +:101510000D681A60002D03DA2D23049A6D421370B2 +:10152000614B0A27039332E00D681A604106F1D53A +:101530002DB2EFE70D681968081D18602E0601D559 +:101540000D6803E06D06FBD50D68ADB2564B0A275A +:1015500003936F2A17D1082715E045310A70524AC4 +:1015600003921A68216820CA1A60080650D5CB0772 +:1015700002D52023194321601027002D03D12023F9 +:1015800022689A4322602300002243331A70636862 +:10159000A360002B03DB0422216891432160002D0E +:1015A00002D1049E002B0CD0049E2800390001F0CB +:1015B00065FE039B013E5B5C33702B0005009F4280 +:1015C000F3D9082F09D12368DB0706D563682269A0 +:1015D000934202DC3023013E3370049B9B1B23614A +:1015E000079B210000930598069B09AAFFF7DEFEE2 +:1015F000431C35D1012040420BB0F0BD20220968C8 +:101600000A4322602200782145321170274AA7E759 +:101610004806ACD5ADB2AAE71A680D68101D496935 +:10162000186013682E0601D5196002E06D06FBD51F +:1016300019800023049E2361D2E71A68111D1960E6 +:10164000166800213000626800F0DCF8002801D044 +:10165000801B6060636823610023049A1370BFE7F6 +:101660002369320006990598079DA847431CC1D0FD +:1016700023689B0715D4099BE0689842BCDA1800E0 +:10168000BAE72200012306990598079E1932B04750 +:10169000431CAFD00135E368099A9B1AAB42F0DCDA +:1016A000E9E70025F7E7C046B9180010CA1800108E +:1016B00070B50C000E25495F00F0B0F8002803DB80 +:1016C000636D1B18636570BDA389024A1340A38133 +:1016D000F9E7C046FFEFFFFFF8B51F008B89050053 +:1016E0000C001600DB0505D50E23C95E002202237F +:1016F00000F074F8A389054A28001340A381320042 +:101700000E23E15E3B0000F01FF8F8BDFFEFFFFF86 +:1017100070B50C000E25495F00F060F8A389421CEB +:1017200003D1054A1340A38170BD802252011343A7 +:10173000A3816065F8E7C046FFEFFFFF10B50E23F9 +:10174000C95E00F015F810BD70B504000800110066 +:101750001A000023054D2B6020F020FB431C03D111 +:101760002B68002B00D0236070BDC0461CAE020861 +:10177000002370B5064D040008002B602DF072FDAB +:10178000431C03D12B68002B00D0236070BDC046E2 +:101790001CAE0208002370B5064D040008001100BD +:1017A0002B602DF067FD431C03D12B68002B00D06C +:1017B000236070BD1CAE0208002370B5064D040006 +:1017C00008002B602DF05EFD431C03D12B68002B1D +:1017D00000D0236070BDC0461CAE020870B5040086 +:1017E000080011001A000023054D2B602DF052FD5A +:1017F000431C03D12B68002B00D0236070BDC04672 +:101800001CAE0208C9B28218904201D10020704774 +:1018100003788B42FBD00130F6E7000070B504007E +:10182000080011001A000023054D2B602DF03AFD31 +:10183000431C03D12B68002B00D0236070BDC04631 +:101840001CAE0208388802080000000000000000FA +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000232D302B2000686C99 +:1018B0004C00656667454647003031323334353673 +:1018C00037383941424344454600303132333435AC +:1018D00036373839616263646566000005DF70473A +:1018E0000020FBE706DF704709DF704730B585B0A1 +:1018F0000291050001210C48039204F05BF9041EDB +:101900000EDD002329000193009302AA013304F0A5 +:1019100053F90500200004F05BF9280005B030BD44 +:1019200084256D42F9E7C046E0F0000030B50121A2 +:101930000B4883B004F03EF9041E0DDD00230022A5 +:1019400000210193009304F037F90500200004F012 +:101950003FF9280003B030BD84256D42F9E7C04649 +:10196000C0F0000030B587B0029003912020012123 +:101970000492059304F01EF90400051E11DD0123F5 +:10198000019304AB00930021012302AA04F014F98F +:101990000400280004F01CF9002C02D1059A0A9BCF +:1019A0001A60200007B030BD30B589B003AB049396 +:1019B000042303900691212001210593079304F04D +:1019C000F9F8041E0DDD0123019306AB00210093FD +:1019D00004AA012304F0F0F80500200004F0F8F850 +:1019E0002C00200009B030BD30B589B0049302232B +:1019F000029003910593012102332220069207935E +:101A000004F0D8F8041E0DDD0323019302AB00227D +:101A100000210093002304F0CFF80500200004F01B +:101A2000D7F82C00200009B030BDC04630B58BB0CF +:101A30000290039102A90491069308210EAB08932A +:101A400004230591602007390792099304F0B2F846 +:101A5000041E10DD002300210193009304AA033328 +:101A600004F0AAF80500200004F0B2F8032D05D018 +:101A700028000BB030BD84256D42F9E78A3DF7E7B9 +:101A800070B58CB0039204AA08920822099203AAA6 +:101A90000A920422119E0B92109A049005910692CC +:101AA0000793002E1CD00121612004F083F8041E4E +:101AB00013DD0123019306AB00930021022308AA42 +:101AC00004F07AF80500200004F082F8032D07D016 +:101AD000079B336028000CB070BD84256D42F9E788 +:101AE00087256D42F6E7C04630B589B002AB049356 +:101AF000082302900391059301210433622006928A +:101B0000079304F057F8041E11DD0123019306AB7F +:101B100000930021012304AA04F04EF805002000E0 +:101B200004F056F8032D05D0280009B030BD8425F7 +:101B30006D42F9E78A3DF7E730B587B002AB049311 +:101B400008230290039101216320059304F032F8E9 +:101B5000041E10DD002300210193009304AA013329 +:101B600004F02AF80500200004F032F8032D05D017 +:101B7000280007B030BD84256D42F9E78A3DF7E7BC +:101B8000862040427047C046862040427047C0468B +:101B9000002310B586B0039303AB04930423012103 +:101BA0006420059304F006F8041E0BDD0123019365 +:101BB00004AB009300220023002103F0FDFF20006E +:101BC00004F006F8039806B010BDC04630B58BB0DF +:101BD0000290039102A90491069308210EAB089389 +:101BE00004230591702007390792099303F0E2FF5F +:101BF000041E10DD002300210193009304AA033387 +:101C000003F0DAFF0500200003F0E2FF032D05D00A +:101C100028000BB030BD84256D42F9E78A3DF7E717 +:101C200070B58CB0039204AA08920822099203AA04 +:101C30000A920422119E0B92109A0490059106922A +:101C40000793002E1CD00121712003F0B3FF041E66 +:101C500013DD0123019306AB00930021022308AAA0 +:101C600003F0AAFF0500200003F0B2FF032D07D008 +:101C7000079B336028000CB070BD84256D42F9E7E6 +:101C800087256D42F6E7C04630B589B002AB0493B4 +:101C900008230290039105930121043372200692D8 +:101CA000079303F087FF041E11DD0123019306ABA8 +:101CB00000930021012304AA03F07EFF0500200009 +:101CC00003F086FF032D05D0280009B030BD842520 +:101CD0006D42F9E78A3DF7E730B587B002AB049370 +:101CE00008230290039101217320059303F062FF02 +:101CF000041E0EDD002300210193009304AA01338A +:101D000003F05AFF0500200003F062FF280007B02F +:101D100030BD84256D42F9E70020704730B595B09D +:101D20000C002422002103900BA8FEF73DFD0AAA17 +:101D300006922822079203AA022308920422012174 +:101D4000802004940A930992059303F033FF041E44 +:101D50000FDD0123019304AB00930021022306AAA7 +:101D600003F02AFF0500200003F032FF280015B021 +:101D700030BD84256D42F9E7862040427047C04659 +:101D800030B58FB004002422002105A8FEF70CFD19 +:101D9000032304AD0493012125338020EC800295B8 +:101DA000039303F007FF041E0EDD002300210193BF +:101DB000009302AA013303F0FFFE0500200003F0A8 +:101DC00007FF28000FB030BD84256D42F9E7C046FB +:101DD000F0B595B007000E001500002124220BA8D5 +:101DE0001C00FEF7E1FC04230A930AAB04932823AA +:101DF0000593043B07930121223B80200294069720 +:101E000008960995039303F0D5FE041E0FDD012308 +:101E1000019302AB00930021032304AA03F0CCFE3C +:101E20000500200003F0D4FE280015B0F0BD842585 +:101E30006D42F9E730B58FB004002422002105A8D7 +:101E4000FEF7B2FC052304AD049301212333802067 +:101E5000EC800295039303F0ADFE041E0EDD00231B +:101E600000210193009302AA013303F0A5FE0500AF +:101E7000200003F0ADFE28000FB030BD84256D4278 +:101E8000F9E7C04630B591B00C00050028220021CA +:101E900006A8FEF789FC6B46DD8306AB0293282378 +:101EA000012103938020043B0494059303F082FEF8 +:101EB000041E0FDD0123019304AB009300210123D5 +:101EC00002AA03F079FE0500200003F081FE28003D +:101ED00011B030BD84256D42F9E7C046F0B5C64665 +:101EE00000B590B0140006000D002422002107A8C0 +:101EF0009846FEF759FC062306AF069301212233CC +:101F000080200594FE8002970393049503F052FE0F +:101F1000041E14DD0123019304AB009302AA0123E4 +:101F2000002103F049FE4346059A05001A6020008F +:101F300003F04EFE280010B004BC9046F0BD84258E +:101F40006D42F7E7F0B5C64600B590B01400060044 +:101F50000D002422002107A89846FEF725FC072340 +:101F600006AF06930121213380200594FE8002975D +:101F70000393049503F01EFE041E14DD0123019358 +:101F800004AB009302AA0123002103F015FE43468F +:101F9000059A05001A60200003F01AFE280010B010 +:101FA00004BC9046F0BD84256D42F7E7F0B593B0D0 +:101FB000140006000D002422002109A8FEF7F4FBFE +:101FC0000823089320330593043B08AF07930121AE +:101FD000223B80200294FE8004970695039303F031 +:101FE000E9FD041E0FDD0123019302AB00930021E4 +:101FF000022304AA03F0E0FD0500200003F0E8FD41 +:10200000280013B0F0BD84256D42F9E7F0B5C6464F +:1020100000B592B004000E001500002124221F001C +:1020200009A808AB9846FEF7BFFB1D23089343465B +:1020300022680293DA602823012103938020243B45 +:10204000049405930696079503F0B4FD041E13DD72 +:102050000223019304AB00930021012302AA03F0A1 +:10206000ABFD079B05003B60200003F0B1FD28009D +:1020700012B004BC9046F0BD84256D42F7E7C0461F +:10208000F0B593B004000E0015000021242209A829 +:10209000FEF78AFB1E230893236808AFFB60282302 +:1020A000012105938020243B02940497069607950E +:1020B000039303F07FFD041E0FDD0123019302ABA8 +:1020C00000930021022304AA03F076FD05002000FE +:1020D00003F07EFD280013B0F0BD84256D42F9E7C2 +:1020E000F0B591B004000F0016000021242207A8CB +:1020F000FEF75AFB1B230693236806ADEB602823EB +:10210000012103938020243B0494EF8002950593E2 +:10211000AE6003F04FFD041E0FDD0123019304ABFD +:1021200000930021012302AA03F046FD05002000D0 +:1021300003F04EFD280011B0F0BD84256D42F9E793 +:10214000F0B591B004000F0016000021242207A86A +:10215000FEF72AFB1C230693236806ADEB602823B9 +:10216000012103938020243B0494EF800295059382 +:10217000AE6003F01FFD041E0FDD0123019304ABCD +:1021800000930021012302AA03F016FD05002000A0 +:1021900003F01EFD280011B0F0BD84256D42F9E763 +:1021A000F0B5C64600B594B004000F0016001D003F +:1021B00024220AAB00210BA89846FEF7F5FA1F234C +:1021C0000A93434622680293DA6028230393243B50 +:1021D00007931A9B01218020069404970596089581 +:1021E000099303F0E7FC041E14DD0223019306AB00 +:1021F000009302AA0223002103F0DEFC099A1B9B34 +:1022000005001A60200003F0E3FC280014B004BCB1 +:102210009046F0BD84256D42F7E7C04630B591B0D9 +:1022200004002422002107A8FEF7BEFA212306930A +:10223000236806ADEB602823012103938020243B13 +:1022400004940295059303F0B5FC041E0FDD0123F1 +:10225000019304AB00930021012302AA03F0ACFC1C +:102260000500200003F0B4FC280011B030BD842527 +:102270006D42F9E7F0B5C64600B592B004000E0015 +:102280001500002124221F0009A808AB9846FEF77C +:102290008BFA20230893434622680293DA602823AE +:1022A000012103938020243B04940593069607950F +:1022B00003F080FC041E13DD0223019304AB0093A2 +:1022C0000021012302AA03F077FC079B05003B6075 +:1022D000200003F07DFC280012B004BC9046F0BD45 +:1022E00084256D42F7E7C04670B590B004000E003B +:1022F0002422002107A8FEF757FA0B230693236830 +:1023000006ADEB602823012103938020243B049435 +:1023100002950593AE6003F04DFC041E0FDD012312 +:10232000019304AB00930021012302AA03F044FCB3 +:102330000500200003F04CFC280010B070BD84257F +:102340006D42F9E7F0B593B004000E0015000021CE +:10235000242209A8FEF728FA0C230893236808AF63 +:10236000FB602823012105938020243B02940497DD +:1023700006960795039303F01DFC041E0FDD012351 +:10238000019302AB00930021022304AA03F014FC82 +:102390000500200003F01CFC280013B0F0BD8425CC +:1023A0006D42F9E7F0B5C64600B592B004000E00E4 +:1023B0001500002124221F0009A808AB9846FEF74B +:1023C000F3F90D230893434622680293DA60282329 +:1023D000012103938020243B0494059306960795DE +:1023E00003F0E8FB041E13DD0223019304AB00930A +:1023F0000021012302AA03F0DFFB079B05003B60DD +:10240000200003F0E5FB280012B004BC9046F0BDAC +:1024100084256D42F7E7C046F0B593B004000E0086 +:1024200015000021242209A8FEF7BEF90E23089307 +:10243000236808AFFB602823012105938020243BFB +:102440000294049706960795039303F0B3FB041ECA +:102450000FDD0123019302AB00930021022304AAA4 +:1024600003F0AAFB0500200003F0B2FB280013B024 +:10247000F0BD84256D42F9E730B591B00400242207 +:10248000002107A8FEF790F90F230693236806ADF5 +:10249000EB602823012103938020243B04940295C0 +:1024A000059303F087FB041E0FDD0123019304ABAA +:1024B00000930021012302AA03F07EFB0500200007 +:1024C00003F086FB280011B030BD84256D42F9E78A +:1024D00070B590B005000C002422002107A8FEF77B +:1024E00063F9102306932B6806AEF3602823039349 +:1024F000243B029604940593002C02D02368002B01 +:1025000018D10121802003F055FB041E0FDD0123AB +:10251000019304AB00930021012302AA03F04CFBBA +:102520000500200003F054FB280010B070BD842586 +:102530006D42F9E789256D42F6E7C046F0B591B0E6 +:1025400004000F0016000021242207A8FEF72CF932 +:1025500013230693236806ADEB6028230121039320 +:102560008020243B0494EF8002950593AE6003F035 +:1025700021FB041E0FDD0123019304AB0093002116 +:10258000012302AA03F018FB0500200003F020FB42 +:10259000280011B0F0BD84256D42F9E7F0B591B087 +:1025A00004000F0016000021242207A8FEF7FCF803 +:1025B00014230693236806ADEB60282301210393BF +:1025C0008020243B0494EF8002950593AE6003F0D5 +:1025D000F1FA041E0FDD0123019304AB00930021E7 +:1025E000012302AA03F0E8FA0500200003F0F0FA44 +:1025F000280011B0F0BD84256D42F9E7F0B593B025 +:1026000004000E0015000021242209A8FEF7CCF8D2 +:1026100015230893236808AFFB6028230121059345 +:102620008020243B0294049706960795039303F0B9 +:10263000C1FA041E0FDD0123019302AB00930021B8 +:10264000022304AA03F0B8FA0500200003F0C0FA40 +:10265000280013B0F0BD84256D42F9E7F0B5C646F9 +:1026600000B592B004000E001500002124221F00C6 +:1026700009A808AB9846FEF797F816230893434637 +:1026800022680293DA602823012103938020243BEF +:10269000049405930696079503F08CFA041E13DD47 +:1026A0000223019304AB00930021012302AA03F04B +:1026B00083FA079B05003B60200003F089FA28009D +:1026C00012B004BC9046F0BD84256D42F7E7C046C9 +:1026D000F0B593B004000E0015000021242209A8D3 +:1026E000FEF762F817230893236808AFFB602823DE +:1026F000012105938020243B0294049706960795B8 +:10270000039303F057FA041E0FDD0123019302AB7C +:1027100000930021022304AA03F04EFA05002000D2 +:1027200003F056FA280013B0F0BD84256D42F9E796 +:1027300030B591B004002422002107A8FEF734F838 +:1027400018230693236806ADEB6028230121039329 +:102750008020243B04940295059303F02BFA041E79 +:102760000FDD0123019304AB00930021012302AA92 +:1027700003F022FA0500200003F02AFA280011B025 +:1027800030BD84256D42F9E7F0B5C64600B594B07A +:1027900080460F001600002120220BA81D001A9C65 +:1027A000FEF702F8222342460A936B460C97DA851D +:1027B0001395002C37D00AAB0493282305931C9B58 +:1027C000089406931D9B07931B9B09931E9B0293E2 +:1027D0001F9B0393102D29D8002E06D0002D04D066 +:1027E0002A0031000FA8FDF7C3FF0121802003F06C +:1027F000E1F9051E1DDD230001225C1EA3410192AB +:1028000002AA02330092002104AA03F0D5F9039A28 +:10281000209B04001A60280003F0DAF9200014B0AD +:1028200004BC9046F0BD1B9B002BC4D0872464429F +:10283000F4E784246442F1E7F0B5C64600B594B0ED +:1028400080460F001600002120220BA81D001A9CB4 +:10285000FDF7AAFF232342460A936B460C97DA85BD +:102860001395002C37D00AAB0493282305931C9BA7 +:10287000089406931D9B07931B9B09931E9B029331 +:102880001F9B0393102D29D8002E06D0002D04D0B5 +:102890002A0031000FA8FDF76BFF0121802003F013 +:1028A00089F9051E1DDD230001225C1EA341019252 +:1028B00002AA02330092002104AA03F07DF9039AD0 +:1028C000209B04001A60280003F082F9200014B055 +:1028D00004BC9046F0BD1B9B002BC4D087246442EF +:1028E000F4E784246442F1E7F0B5C64600B592B03F +:1028F00080460F0015000021242209A81C00FDF7C6 +:1029000053FF2E230893434608AEF38028230593F4 +:10291000189B01210293199B802007940496069529 +:102920000393B76003F046F9041E14DD01230193FD +:1029300002AB009304AA0223002103F03DF9039A9D +:102940001A9B05001A60200003F042F9280012B01B +:1029500004BC9046F0BD84256D42F7E7F0B5C6464D +:1029600000B592B080460F0015000021242209A86E +:102970001C00FDF719FF2E230893434608AEF38091 +:1029800028230593189B01210293199B802007940B +:10299000049606950393B76003F00CF9041E14DD4A +:1029A0000123019302AB009304AA0223002103F048 +:1029B00003F9039A1A9B05001A60200003F008F936 +:1029C000280012B004BC9046F0BD84256D42F7E7A4 +:1029D000F0B5C64600B592B080460F001500002144 +:1029E000242209A81C00FDF7DFFE2F23089343468D +:1029F00008AEF38028230393189B01210693199BAB +:102A000080200594029604950793B76003F0D2F8EE +:102A1000041E10DD002300210193009302AA03335A +:102A200003F0CAF80500200003F0D2F8280012B025 +:102A300004BC9046F0BD84256D42F7E7F0B5C6466C +:102A400000B592B080460F0015000021242209A88D +:102A50001C00FDF7A9FE2F230893434608AEF38020 +:102A600028230393189B01210693199B802005942A +:102A7000029604950793B76003F09CF8041E10DDDE +:102A8000002300210193009302AA033303F094F87A +:102A90000500200003F09CF8280012B004BC90460A +:102AA000F0BD84256D42F7E7F0B595B005000C0048 +:102AB0001700002124220BA81E00FDF775FE30230D +:102AC0000A936B46DD851A9B0C94002B29D00AAB28 +:102AD0000493282305931A9B079608931B9B02AE29 +:102AE00009931C9B012102931D9B80207360069714 +:102AF00003F060F804AC0500032300282BDD01225D +:102B00000021019228002200009603F055F8726817 +:102B10001E9B04001A60280003F05AF8200015B02C +:102B2000F0BD1B9B002B19D10AAB049328230593FE +:102B30001B9B0796089309931C9B02AE02931D9B57 +:102B4000012180207360069703F034F804AC051E61 +:102B500001DD0223D3E784246442DFE78724644253 +:102B6000DCE7C046F0B595B005000C001700002169 +:102B700024220BA81E00FDF717FE31230A936B4693 +:102B8000DD851A9B0C94002B29D00AAB04932823D3 +:102B900005931A9B079608931B9B02AE09931C9BF7 +:102BA000012102931D9B80207360069703F002F8B9 +:102BB00004AC0500032300282BDD01220021019233 +:102BC00028002200009602F0F7FF72681E9B0400A6 +:102BD0001A60280002F0FCFF200015B0F0BD1B9B1E +:102BE000002B19D10AAB0493282305931B9B07964E +:102BF000089309931C9B02AE02931D9B0121802028 +:102C00007360069702F0D6FF04AC051E01DD0223B7 +:102C1000D3E784246442DFE787246442DCE7C046CC +:102C200070B590B00C0005002422002107A8FDF724 +:102C3000BBFD332306932B6806AEF36028230121E6 +:102C400003938020243B04940296059302F0B2FF84 +:102C5000041E0FDD0123019304AB00930021012327 +:102C600002AA02F0A9FF0500200002F0B1FF28002F +:102C700010B070BD84256D42F9E7C046F0B591B043 +:102C8000140006000D002422002107A8FDF78CFD8A +:102C900038230693336806AFFB6028230121802088 +:102CA000059402970393049502F084FF041E0FDD40 +:102CB0000123019304AB00930021012302AA02F037 +:102CC0007BFF0500200002F083FF280011B0F0BD5B +:102CD00084256D42F9E7C046F0B58FB005000F00BE +:102CE00016000021202206A8FDF75EFD362304937E +:102CF0002B6804ACE360282301218020A780E680B4 +:102D00000294039302F056FF041E0EDD00230021FF +:102D10000193009302AA013302F04EFF0500200048 +:102D200002F056FF28000FB0F0BD84256D42F9E790 +:102D300030B591B004002422002107A8FDF734FD2E +:102D40003A230693236806ADEB6028230121039301 +:102D50008020243B04940295059302F02BFF041E6F +:102D60000FDD0123019304AB00930021012302AA8C +:102D700002F022FF0500200002F02AFF280011B017 +:102D800030BD84256D42F9E7F0B5C64600B592B076 +:102D9000040088461700002120220AA81E00FDF723 +:102DA00003FD37230893434608ADAB802368012118 +:102DB000EB6028230593189B80200793042302943B +:102DC000EF8004950696039302F0F4FE041E11DDD5 +:102DD0000123019302AB00930021022304AA02F015 +:102DE000EBFE0500200002F0F3FE280012B004BC48 +:102DF0009046F0BD84256D42F7E7C04630B591B0EE +:102E000005000C002422002107A8FDF7CDFC3C237F +:102E1000069306AB0293282304950393002505949B +:102E2000002C02D1280011B030BD0121802002F019 +:102E3000C1FE041E0DDD0123019304AB00930021AC +:102E4000012302AA02F0B8FE0500200002F0C0FE35 +:102E5000E8E784256D42E5E730B593B00C00050046 +:102E60002422002109A8FDF79FFC3D23089308AB0D +:102E7000049328230593043B07930121223B8020E0 +:102E800002940695039302F095FE041E0FDD0123C4 +:102E9000019302AB00930021022304AA02F08CFEEE +:102EA0000500200002F094FE280013B030BD8425F8 +:102EB0006D42F9E7862040427047C0468620404276 +:102EC0007047C046862040427047C0468620404238 +:102ED0007047C046862040427047C0468620404228 +:102EE0007047C046862040427047C0468620404218 +:102EF0007047C046862040427047C0468620404208 +:102F00007047C046862040427047C046F0B5C6466E +:102F100000B592B00700884615000021242209A8B8 +:102F20001C00FDF741FC3B230893434608AEF380A9 +:102F300028230593189B01210293199B8020079455 +:102F4000049606950393B76002F034FE041E14DD68 +:102F50000123019302AB009304AA0223002102F093 +:102F60002BFE039A1A9B05001A60200002F030FE27 +:102F7000280012B004BC9046F0BD84256D42F7E7EE +:102F800070B590B004000E002422002107A8FDF7C0 +:102F90000BFC32230693236806ADEB602823012146 +:102FA00003938020243B049402950593AE6002F0C5 +:102FB00001FE041E0FDD0123019304AB00930021E9 +:102FC000012302AA02F0F8FD0500200002F000FE35 +:102FD000280010B070BD84256D42F9E770B58EB041 +:102FE00006000D002422002105A8FDF7DDFB342397 +:102FF0000493336804ACE360282301218020029409 +:103000002561039302F0D6FD041E0EDD002300218E +:103010000193009302AA013302F0CEFD05002000C7 +:1030200002F0D6FD28000EB070BD84256D42F9E790 +:10303000F0B5C64600B590B00700884615000021DF +:10304000242207A81C00FDF7AFFB35230693434657 +:1030500006AEB3803B680121F360282380200594ED +:1030600002960393049502F0A5FD041E10DD0023D3 +:1030700000210193009302AA023302F09DFD050096 +:10308000200002F0A5FD280010B004BC9046F0BD61 +:1030900084256D42F7E7C046F0B593B014000500F3 +:1030A0000E002422002109A8FDF77EFB3923089396 +:1030B000336808AFFB6028230593043B0793012185 +:1030C000223B8020029404970695039302F072FD40 +:1030D000041E0FDD0123019302AB009300210223A4 +:1030E00004AA02F069FD0500200002F071FD28002D +:1030F00013B0F0BD84256D42F9E7C04686204042FA +:103100007047C046862040427047C04686204042F5 +:103110007047C046862040427047C04686204042E5 +:103120007047C046862040427047C04686204042D5 +:103130007047C04602B4714649084900095C49001D +:103140008E4402BC7047C04603B471464908400033 +:103150004900095E49008E4403BC704703B47146C0 +:10316000490840004900095A49008E4403BC704791 +:10317000002243088B4274D303098B425FD3030AB6 +:103180008B4244D3030B8B4228D3030C8B420DD3C9 +:10319000FF22090212BA030C8B4202D31212090257 +:1031A00065D0030B8B4219D300E0090AC30B8B4295 +:1031B00001D3CB03C01A5241830B8B4201D38B0343 +:1031C000C01A5241430B8B4201D34B03C01A5241E8 +:1031D000030B8B4201D30B03C01A5241C30A8B422B +:1031E00001D3CB02C01A5241830A8B4201D38B0216 +:1031F000C01A5241430A8B4201D34B02C01A5241BA +:10320000030A8B4201D30B02C01A5241CDD2C3092B +:103210008B4201D3CB01C01A524183098B4201D3A7 +:103220008B01C01A524143098B4201D34B01C01A92 +:10323000524103098B4201D30B01C01A5241C3080A +:103240008B4201D3CB00C01A524183088B4201D379 +:103250008B00C01A524143088B4201D34B00C01A65 +:103260005241411A00D20146524110467047FFE7D1 +:1032700001B5002000F0F0F802BDC0460029F7D0EB +:1032800076E7704703460B437FD4002243088B4206 +:1032900074D303098B425FD3030A8B4244D3030BDD +:1032A0008B4228D3030C8B420DD3FF22090212BAA2 +:1032B000030C8B4202D31212090265D0030B8B421E +:1032C00019D300E0090AC30B8B4201D3CB03C01A08 +:1032D0005241830B8B4201D38B03C01A5241430BE3 +:1032E0008B4201D34B03C01A5241030B8B4201D3D3 +:1032F0000B03C01A5241C30A8B4201D3CB02C01A3E +:103300005241830A8B4201D38B02C01A5241430AB5 +:103310008B4201D34B02C01A5241030A8B4201D3A4 +:103320000B02C01A5241CDD2C3098B4201D3CB014B +:10333000C01A524183098B4201D38B01C01A5241FA +:1033400043098B4201D34B01C01A524103098B42FE +:1033500001D30B01C01A5241C3088B4201D3CB00E9 +:10336000C01A524183088B4201D38B00C01A5241CC +:1033700043088B4201D34B00C01A5241411A00D27C +:1033800001465241104670475DE0CA0F00D04942E5 +:10339000031000D34042534000229C4603098B4255 +:1033A0002DD3030A8B4212D3FC22890112BA030ADD +:1033B0008B420CD3890192118B4208D3890192115F +:1033C0008B4204D389013AD0921100E08909C309E4 +:1033D0008B4201D3CB01C01A524183098B4201D3E6 +:1033E0008B01C01A524143098B4201D34B01C01AD1 +:1033F000524103098B4201D30B01C01A5241C30849 +:103400008B4201D3CB00C01A524183088B4201D3B7 +:103410008B00C01A5241D9D243088B4201D34B00D2 +:10342000C01A5241411A00D20146634652415B1014 +:10343000104601D34042002B00D5494270476346F5 +:103440005B1000D3404201B5002000F005F802BD3A +:103450000029F8D016E770477047C0468446101C14 +:1034600062468C46191C634600E0C0461FB500F05A +:10347000BBFD002801D40021C8421FBD10B500F0DB +:1034800005FD4042013010BD10B500F0ADFD002833 +:1034900001DB002010BD012010BDC04610B500F0BA +:1034A000A3FD002801DD002010BD012010BDC04695 +:1034B00010B500F027FD002801DC002010BD012020 +:1034C00010BDC04610B500F01DFD002801DA002037 +:1034D00010BD012010BDC046994201D1801A04D010 +:1034E00002D201204042704701207047002B11D1C9 +:1034F000002A0FD1002900D1002802D00021C943A1 +:10350000081C07B4024802A14018029003BDC0463F +:1035100049FFFFFF03B4684601B5029800F080F848 +:10352000019B9E4602B00CBC7047C046F0B5150426 +:103530002D0C0F0001002E00C64684460004140C1A +:10354000000C090C46434D43604361434019340C61 +:10355000241800B5A54203D980204002804641448A +:10356000250C6D18614659437A43300449192404E7 +:10357000000C2018891804BC9046F0BD70B50500F9 +:103580000C000022002328002100FFF77DFF002807 +:1035900008D12800210000F00FF802000B001000F5 +:1035A000190070BD80231B06E118280000F004F804 +:1035B000002342428B41F2E770B500220B4B0D0015 +:1035C000040000F081FD01F045FC060001F0AAFBBB +:1035D0000022074B00F078FD02000B0020002900BC +:1035E00000F0DEFF01F036FC310070BD0000F03D60 +:1035F0000000F04170B50600080001F063FB0022F6 +:10360000064B00F061FD0D000400300001F08AFB64 +:103610002B00220000F0D0F870BDC0460000F04141 +:10362000F0B557464E464546DE46E0B504000D006F +:103630009246994683B08B4230D82DD049465046A9 +:1036400001F0FCFB29000600200001F0F7FB331A13 +:103650009846203B9B4633D45A46534693404246B5 +:103660001F00534693401E00AF423AD8AF4200D1EC +:1036700078E05B46A41BBD41002B00DA75E0002218 +:1036800000230092019301235A46934001930123A2 +:1036900042469340009328E08242CFD90022002383 +:1036A000009201930C9B002B01D01C605D60009880 +:1036B000019903B03CBC90469946A246AB46F0BD8A +:1036C000424620239B1A5246DA40414613004A469E +:1036D0008A40170042461F43534693401E00AF42A4 +:1036E000C4D900220023009201934346002BD9D075 +:1036F000FB0772081A4346467B080EE0AB4201D135 +:10370000A2420CD8A41A9D41012024196D41002128 +:10371000013E24184D41002E06D0AB42EED9013EA9 +:1037200024196D41002EF8D1009801995B460019CB +:103730006941002B24DB2B005A464446D3402A0023 +:10374000E2401C005B461500002B2ADB26009E4051 +:10375000330026004746BE403200801A994100904F +:1037600001919FE7A342BCD883E742462023002172 +:103770009B1A0022009101920122DA40019286E711 +:10378000424620239B1A2A0046469A402300F340D3 +:10379000444613432A00E2401C005B461500002B00 +:1037A000D4DA42462F002023260097409B1ADE40A1 +:1037B0003B003343CDE7C046F0B54F46D6464646BC +:1037C0000D0001001800C0B517002B035A0A4B0F5B +:1037D0001343CA00914602036E004100520AEC0FE7 +:1037E0007D0F1543760D490DC00F8246AC46FF0094 +:1037F000721A844200D198E0002A00DC81E000299E +:1038000000D1B6E0C9498E4200D172E18021280082 +:10381000090408438446382A00DD5EE11F2A00DDE2 +:10382000EEE1202039006546801A8740D14085406E +:103830000D4339004F1EB9416746D7402943DB1B72 +:103840004A46551AA945894149425B1A984643465A +:103850001B0200D4CCE043465B025B0A9846434619 +:10386000002B00D12CE1404601F0CAFA01000839D2 +:10387000202228004346521A8B40D0408D400343FB +:103880008E4200DD17E18E1B721C1F2A00DDA7E1AE +:10389000202118002E00891A8D408840D640D34040 +:1038A000691E8D4130439846002605436B0709D0B9 +:1038B0000F232B40042B05D02B1DAB42AD416D4295 +:1038C000A8441D0043461B0200D494E0974B721C91 +:1038D0009A4200D19DE04146954BED0819400B00FE +:1038E000520549075B0229431B0B520D1205134376 +:1038F000E4072343080019001CBC90469946A246E1 +:10390000F0BD002A43D08A1B002E00D02AE14C468D +:103910001C4300D1D1E1541E012A00D11FE2834D86 +:10392000AA4200D172E2220023E1002A00DC98E0E2 +:10393000002942D07D498E4200D1DAE08021280062 +:10394000090408438446382A00DD29E11F2A00DCE7 +:1039500087E1110065462039CD40202A04D040205F +:103960006146821A91400F4339004F1EB9410D4301 +:103970001BE12900394300D1B5E0511E012A00D1D5 +:10398000ABE16A48824200D1B2E10A0043E76949EB +:10399000751C0D4200D0CFE0002E00D093E14946C7 +:1039A000194300D1D1E16146394300D0E3E14946F2 +:1039B0005807C9080143DB0826E02900394300D134 +:1039C00091E0511E012A05D05848824200D18FE172 +:1039D0000A00B8E73D004D444D458941634498468F +:1039E00049428844434602261B0200D5EBE0013ED3 +:1039F0006B0700D05CE74346E9085A0711433200E1 +:103A0000DB084A48824221D01B0352051B0B520D92 +:103A10006CE70023002169E72A003A4369D04A464F +:103A20005807D108DA0880231B0308431A4207D03D +:103A30002900ED081D4203D12A00FF08480738433A +:103A4000430FC1005B07C908194313000A001A435A +:103A500000D113E28022120313431B03334A1B0BD2 +:103A600044E7002A4BD08A1B002E00D1E7E02F4804 +:103A7000814200D195E1802000040343382A00DD13 +:103A800043E11F2A00DDDBE120201D004E46801AA5 +:103A90008540D64035434E4686403000D340461ED2 +:103AA000B0419C440543ED19BD429B415B426344D8 +:103AB00098460E007FE01E4A761A13409846F5E6B7 +:103AC000280001F09DF9010018311F2900DCCFE624 +:103AD0002B00083883400025D2E662463A431100A5 +:103AE0004F1EB941ACE649465807C9080143DB08F7 +:103AF00087E749465A07C9081143DB08A6E70D497D +:103B0000701C084200D0BBE0002E00D014E14946F2 +:103B1000194300D175E12900394300D07EE14946BF +:103B20005807C9080143DB086EE7C046FF070000DD +:103B3000FFFF7FFFFE0700004946CD1B6146581A74 +:103B4000A94589414942884601004046091A8846EC +:103B5000090200D5A6E04146294300D07FE60023B4 +:103B6000002451E7C74CA14200D1C7E080242404BF +:103B70002343382A54DC1F2A00DDCCE020244846A9 +:103B8000A41A1D004E46A040D640A5400400D340D4 +:103B900062463543661EB441D31A9C46254344E031 +:103BA00062463A4315006F1EBD414D444D45894163 +:103BB00049428846984443461B0200D418E7B14B5B +:103BC00001369E4249D04246AF4B01211A401300B4 +:103BD0006A080D401543D9075B0898460D4365E612 +:103BE00018001F3EF040202A03D040218A1A93403B +:103BF0001D43691E8D410023002698460543F7E6C4 +:103C0000110065462039CD40202A04D0402061466D +:103C1000821A91400F4339004F1EB94129430FE6E4 +:103C20004A4613431D006B1E9D417D1BAF429B41C5 +:103C300062465B42D31A984654460E0007E6484651 +:103C4000184300D1B3E0501E012A00D10DE18D4D83 +:103C5000AA4200D1A5E0020010E7320000230021B3 +:103C600044E620213800891A65468F408D40D040B7 +:103C7000791E8F4105433D436746D740DB1994E7E2 +:103C8000804A904200D1ECE03900494449459241D4 +:103C9000634452429B18DD0749085B0898460600BA +:103CA0000D43A5E64A46BD1AAF42894162464942E4 +:103CB000D31A5B1A98465446D1E56C07F90821439C +:103CC000EB0804009DE64A461A4375D16146394324 +:103CD00014D1802300241B03BCE64A46D51BA9450A +:103CE0008941624649429B1A5B1A98460126AEE515 +:103CF0004A46D1085A071143DB08A7E66346F9088C +:103D00005A0754461143DB08A0E64A4613431D00F8 +:103D10006B1E9D41C7E614001E00203CE640202A91 +:103D200005D04024A21A93404A461A4391464D4674 +:103D30006B1E9D41354378E74A461A4300D06BE637 +:103D40006B07F9081943EB0880E66146394354D004 +:103D50006346F9085C072143DB08040054E64A4641 +:103D6000BD1AAF42894162464942D31A5B1A98464E +:103D7000040001266BE54A46D51BA94589416246E8 +:103D800049429A1A521A9046120232D54A46BD1A30 +:103D9000AF42894162464942D31A5B1A98460400F1 +:103DA00084E56346F9085A071143DB084EE6F90833 +:103DB00068070143EB0824E662463A4300D198E6DF +:103DC0004A46D1085A071143DA0880231B031A42D6 +:103DD00008D06046C5081D4204D154462A00F9089F +:103DE000430719434B0FC9005B07C9081943130068 +:103DF0002CE64146294300D0FAE500230A000024BE +:103E000002E66B07F9081943EB08FDE56346F9087C +:103E10005B07194363460400DB0817E63D004D4489 +:103E200063444D45894198464942884443461B02B4 +:103E300000D4DDE54246144B01261A409046D7E5F2 +:103E400010001E002038C640202A05D04020821ACB +:103E500093404A461A4391464D466B1E9D41354359 +:103E600021E602000023002140E54A46D519BD4263 +:103E700089416344984649428844B3E50021014A98 +:103E80000B0033E5FF070000FFFF7FFFF0B54F4653 +:103E90004646D646944691461A03120B184DC0B5B5 +:103EA0004C000F0392465A00060080463F0B01204B +:103EB000640DC90F520DDB0FAC420AD0AA4203D0E9 +:103EC000944201D157450DD01CBC90469946A2465C +:103ED000F0BD3D003543F7D1A242F5D152466546CB +:103EE0002A43F1D10120C845EED1994206D0002CD9 +:103EF000EAD13E433000461EB041E5E70020E3E74B +:103F0000FF070000F0B54E4645465746DE46040022 +:103F10001800E0B516001B031B0B324D0F034A00BF +:103F200099464300A446B0463F0B520DC90F5B0DA6 +:103F3000C00FAA4229D0AB4218D0002A2AD13C4354 +:103F4000A34665426541002B02D14C46264327D04B +:103F5000002D15D1814228D00220013908400138B6 +:103F60003CBC90469946A246AB46F0BD4D462E431A +:103F70002FD1002AEED13C4365426541002DE9D0A6 +:103F80000028EDD101204042EAE73D00254320D141 +:103F90009342EBD0002BDDD14C462643DAD1DBE750 +:103FA0005B460020002BDBD0D6E79A420ADCE7DB39 +:103FB0004F45D1D810D000204F45D1D20029E1D0B3 +:103FC0000800CDE7434258410223404218400138DF +:103FD000C6E702204042C3E7C445BDD80020C4451F +:103FE000BED2EBE7FF070000F0B54E464546574608 +:103FF000DE4604001800E0B516001B031B0B314D14 +:104000000F034A0099464300A446B0463F0B520DA9 +:10401000C90F5B0DC00FAA4211D0AB4214D0002AC9 +:104020002FD13C43A34665426541002B14D14C4639 +:10403000264311D15B460020002B17D010E03D0035 +:10404000254312D193421CD14D462E430DD1002A57 +:1040500004D13C4365426541002D0DD1814216D00B +:10406000022001390840013800E002203CBC9046A3 +:104070009946A246AB46F0BD0028F7D10120404248 +:10408000F4E7002BEAD14C462643E7D1E8E79A4211 +:1040900006DD434258410223404218400138E5E71B +:1040A0009A42E9DB4F45DBD806D000204F45DDD2F0 +:1040B0000029E3D00800D9E7C445D1D80020C44581 +:1040C000D4D2F5E7FF070000F0B557464E46454607 +:1040D000DE46E0B598460C034B000600924687B0DA +:1040E000240B5B0DCF0F002B6CD0DD4A934200D127 +:1040F00086E0420FE4001443802212041443D94A9C +:10410000C500944663440093002399469B4643466A +:1041100042461E03D20F5B0050469046360B5B0DA5 +:1041200000D178E0CE4A93421DD0CE49420F8C4652 +:1041300000996344F6008C46164380229C44120486 +:1041400063461643C20000200093009943460131A4 +:104150008C4649467B4001930F2900D97EE0C24B33 +:10416000890059588F465246009B324300D056E191 +:10417000BB4900268C4663444946009302231943F9 +:1041800089460220E1E74346019334001500834647 +:104190005B46022B5ED0032B00D1F3E1012B00D054 +:1041A00018E1002200240025019B12052243DB07B1 +:1041B0001A432800110007B03CBC90469946A2461D +:1041C000AB46F0BD2500054300D141E1002C00D1F4 +:1041D000ADE1200000F014FE010002000B391D23A8 +:1041E00010005B1A3100350008388440D940854002 +:1041F0000C439E48831A0093002399469B4686E70A +:104200000500254300D01CE108220093022300246E +:1042100091469B467BE75246324300D10AE1002E8D +:1042200000D176E1300000F0EBFD02000B3A1D23D7 +:1042300001009B1A52460839DA408E401643524616 +:104240008A40009B8949181A03008C466344002069 +:1042500000937AE700240025814AA5E72F0C2D045E +:104260002D0C2B00110C1204120C53439846130012 +:1042700028007B43994648434844834640460B0008 +:10428000000C824658467B4350440293814506D930 +:104290009A4680235B029946CA4453460293030C14 +:1042A0009B4643461B0400041B0C984603004344F2 +:1042B0000493330C99462B003604360C734398460E +:1042C00033007B439A464B465D435F434346554428 +:1042D000180C4019824503D980235B029A46574443 +:1042E000050CEB19059343461D042D0C00044019E1 +:1042F000250C2404240C270057436A4390462A00C7 +:104300003B0C9A464A4361434144514483448845A7 +:1043100003D980235B02984642443F040B0C3F0CB8 +:104320000904C919270098464B4677435C436E43FE +:104330005D433B0C9946A4194C4442440395A64264 +:1043400004D980235B02984645440395029B3F04B1 +:104350005B441E008342804123049846059B3F0C2A +:104360004744984676188E428941474440423D185A +:10437000A846934649428A46C3449F42BF4180456E +:104380008041039BDA449846534640427F420743AC +:10439000240C934592418A4589413F19DC0D049BC9 +:1043A00075021D43681E85415346524249420A43E5 +:1043B000BF184744F60D7F0235435A023C4315436C +:1043C000FB0100D4C1E001216A080D401543E2075A +:1043D0001543640826496144002956DD6B0709D05E +:1043E0000F222A40042A05D02A1DAA42AD416D425F +:1043F00064191500E30104D580211E4AC900144048 +:1044000061441D4A914200DD24E76207ED08640221 +:1044100049051543240B4A0DC6E60197B8E6104A34 +:104420000320944663444A46009303231A4391466B +:1044300052468AE64946012319438946002601204F +:1044400083E60C2200930323050091469B465EE61B +:104450000423994600230093013300249B4656E62B +:10446000FF07000001FCFFFFFC4E00100DFCFFFFEA +:10447000FF030000FFFFFFFEFE0700000023802473 +:104480000025444A019324038EE60120401A38286F +:1044900000DD86E61F285BDD1F2223005242511AF1 +:1044A000CB401900202803D03B4A62449440254366 +:1044B0006A1E95412A000A4307210D000024154079 +:1044C00011425BD00F2100241140042953D0111D4B +:1044D000914292415242A4180A0023024BD5012274 +:1044E0000024002560E680231B031C4209D01E42E5 +:1044F00007D133431C0343461500240B254A01937F +:1045000052E68022120314432403224A240B01970B +:104510004AE600F075FC03001A00153220301C2A10 +:1045200000DC84E65646083B00229E4089E600F007 +:1045300067FC01000200153120321C2900DC4EE628 +:10454000340008380025844053E6009B9C4641E730 +:104550001249220061442E008D408A40C640691EE7 +:104560008D4132432A43C4405307B6D00F21114036 +:104570000429ACD1B1E765076402240BD2081543C6 +:10458000002211E68022120314432403014A240B63 +:104590000AE6C046FF0700003E0400001E040000BB +:1045A000F8B557464E464546DE460400E0B51F00C6 +:1045B00010000B03620F4E00CD0F5B0A390313434B +:1045C000490AE200440F2143C24C91469246C00082 +:1045D0007A008046760D520DFF0FA24200D1B4E062 +:1045E00001246740BB46BD4200D188E0B41AA4460E +:1045F000002C00DCB2E0002A00D1C5E0B54A9642AA +:1046000000D18BE28022120411436246382A00DD79 +:10461000A1E11F2A00DD16E220270C00BF1ABC40D2 +:104620000200A0466446B840E240444614430200FB +:10463000501E82416046C14022435B1A49468C1A93 +:10464000A145924152429B1A984643461B0200D410 +:1046500017E143465B025B0A98464346002B00D1B4 +:104660006CE1404600F0CCFB0200083A202120001B +:104670004346891A9340C84094400343964200DD64 +:1046800057E1961B711C1F2900DDCBE12022180089 +:104690002600521A94409040CE40CB40621E944176 +:1046A0003043984600260443630709D00F23234074 +:1046B000042B05D0231DA342A4416442A0441C0046 +:1046C00043461B0200D4DFE0824B01369E4200D1FC +:1046D000FBE04246804BE4081A4013007105520784 +:1046E0005B0222431B0B490D0905ED0719432943C2 +:1046F00010003CBC90469946A246AB46F8BDB41AA1 +:10470000A446002C58DD002A00D19EE0714A964252 +:1047100000D13BE18022120411436246382A00DDB9 +:10472000C1E01F2A00DCBBE10C00203AD44022008B +:104730006446202C04D040273F1BB94008438046E4 +:104740004446611E8C411443B1E00C0004432AD05E +:10475000BB46BD422DD0614CA446B4446446002CF7 +:104760005CD0941BA446002E00D015E14D461D439D +:1047700000D1C3E1651E012C00D10CE2554EB442BC +:1047800000D1F8E1AC460EE10A00024300D136E167 +:104790002200013A012C00D1C6E14E4CA44500D1C3 +:1047A000F4E0944631E701246740BB46BD4200D0A7 +:1047B0001CE74A4CA446B4446446002C00D1CFE028 +:1047C000941BA446002E00D15CE1424EB24200D1BF +:1047D000ECE18026360433436446382C00DDB3E137 +:1047E0001F2C00DD38E22026361B1C00B4404F464B +:1047F000A0466446E74044463C434F46B7403E002F +:10480000771EBE4134436646F340C91824188442DB +:104810009B415B429846160088444EE0304A741C27 +:10482000144200D0D6E04A461A43002E00D05BE185 +:10483000002A00D1A5E10A00024300D0BBE14A46AC +:104840005907D2080A43DB0827E00A00024300D1D7 +:1048500074E12200013A012C05D01E4CA44500D180 +:1048600094E0944659E74844484592415B1898467D +:10487000040052429044434602261B0200D5C4E085 +:10488000013E630700D011E74346B4465907E208EA +:104890000A43DB080F498C4540D061461B0349059C +:1048A0001B0B490D20E701430C00611E8C414C4459 +:1048B0004C45924152429046984443461B02E0D5F3 +:1048C000044B01369E4200D09FE0310000230022BD +:1048D0000AE7C046FF070000FFFF7FFF01F8FFFF68 +:1048E000FE070000002A00D160E10A0002434DD01B +:1048F0004A465C07D20822438024DB082403234273 +:1049000007D0CE08264204D15D463300C2084907CD +:104910000A43510FD200D20849070A431100194334 +:1049200000D1C8E1802109030B431B03D5491B0BB0 +:10493000DAE6D549B61A0B409846B5E6200000F0F5 +:104940005FFA020018321F2A00DC8FE623000838C5 +:104950008340002492E608430200501E82416DE627 +:10496000CA4C721C224200D0ADE04A461A43002EC7 +:10497000B8D1002A00D158E10A00024300D059E121 +:104980004A465907D2080A43DB0886E74A465907D0 +:10499000D2080A43DB08C1E7BA4DAA4200D11EE1A2 +:1049A00080252D042B436446382C5DDC1F2C00DD54 +:1049B000D0E0202567462D1B4E461C00FE40AC4033 +:1049C00034434E46AE403500FB406E1EB541C91A19 +:1049D0002C434EE04A46141AA14592415242904659 +:1049E0005F1A3A004746D21B9046120200D58BE070 +:1049F0004246224300D030E6002300254DE74A46D8 +:104A00005907D2080A43DB0844E742469E4B610837 +:104A10001A401300012214400C43DA075B08984641 +:104A2000144341E61A001F3EF2401600202903D02D +:104A30004022511A8B401C43621E94410023344390 +:104A4000984600261DE70C00203AD4402200644618 +:104A5000202C04D040273F1BB940084380464446E1 +:104A6000611E8C412243E9E54C4623431C00631E32 +:104A70009C41041BA0429B415B42CB1A98465D4679 +:104A80001600E2E54E461E4300D1AEE0661E012C44 +:104A900000D1FDE07B4FBC4200D107E1B4469BE66C +:104AA00064462022121B0C00944007009040A04650 +:104AB0006446421E90416246E7404446D1403C4332 +:104AC00004435B18F3E66F4CA24200D1D5E04844A2 +:104AD0005B184845894149425B18DC0740085B0880 +:104AE000984616000443CCE6002A00D082E00A0073 +:104AF000024340D1802300251B0313E74B07C20864 +:104B00001A435D46CB08C5E64A46841AA042924144 +:104B1000CB1A52429B1A98465D469EE54A46590773 +:104B2000D2080A43DB08F9E64A46141AA145924125 +:104B30005B1A52429B1A9846012686E54A46590757 +:104B4000D2080A43DB08A5E64C4623431C00631E3B +:104B50009C415BE665461E00203DEE40202C05D0C2 +:104B600040252D1BAB404C461C43A2465446631EB9 +:104B70009C4134437DE74B07C2081A435D46CB088E +:104B8000CCE60A00024300D136E74B07C2081A43BD +:104B90005D46CB0881E64A46841AA0429241CB1A70 +:104BA00052429B1A98465D4601264EE54B07C208C5 +:104BB0001A43CB08B2E64A46141AA14592415F1A3D +:104BC0005242BA1A904612026BD54A46841AA04243 +:104BD0009241CB1A52429B1A98465D4664E54B07B8 +:104BE000C2081A435D46CB0898E64B07C2081A4331 +:104BF000CB084FE60A00024390D04A465C07D20831 +:104C000014438022DB081203134208D0CE08164258 +:104C100005D1C0084907084304005D463300610F11 +:104C2000E2004907D2080A4378E64B07C2081A4354 +:104C3000CB0832E648445B184845924198465242B8 +:104C40009044434604001B0200D41AE642460E4B31 +:104C500001261A40904614E666461F00203EF740A3 +:104C6000202C05D04026361BB3404C461C43A246A0 +:104C70005446631E9C413C43C8E5110000230022BA +:104C800032E5C046FF070000FFFF7FFFFE07000080 +:104C90004A461418844292415B1898465242904406 +:104CA000E9E54246224300D1A6E6EAE54B07C20801 +:104CB0001A43CB0832E600220149130014E5C0462E +:104CC000FF07000070B5002816D0C317C5185D4057 +:104CD000C40F280000F094F8114A121A0A2816DCB2 +:104CE00003002E0015339E400B23181AC5405305B0 +:104CF0002D032D0B5B0D03E000240023002500266F +:104D00001B052B43E40723433000190070BD0B380B +:104D1000854053052D0300262D0B5B0DF0E7C046A3 +:104D20001E04000010B5041E10D000F069F80F4BEF +:104D30001B1A0A2811DC0B222100121AD14015304F +:104D40000A035B058440120B5B0D01E00023002287 +:104D50001B0513432000190010BD22000B388240B0 +:104D60005B0512030024120B5B0DF1E71E0400002B +:104D700070B543004602C40FFE201B0E591C750A75 +:104D800008420CD0E022920094466D07360B634433 +:104D90001B053343E40723432800190070BD002B93 +:104DA00014D1002D1BD0280000F02AF80A281CDCA2 +:104DB0000B232A001B1ADA40030015339D400E4BCB +:104DC00012031B1A5B05160B5B0DE1E7002D09D0E2 +:104DD000320B80263603094B6D071643D8E70023B4 +:104DE0000026D5E70026054BD2E703002A000B3B3F +:104DF0009A400025E3E7C04689030000FF07000052 +:104E00001C2101231B04984201D3000C10391B0AFA +:104E1000984201D3000A08391B09984201D30009BE +:104E2000043902A2105C40187047C0460403020215 +:104E300001010101000000000000000010B5002980 +:104E400003D1FFF7DDFF203002E0081CFFF7D8FF99 +:104E500010BDC04670B500220C4B04000D00FEF7DB +:104E600031FB002804D12000290000F011F870BDAA +:104E7000064B002220002900FFF792FB00F008F803 +:104E800080231B069C466044F1E7C0460000E041D9 +:104E90000A0030B5134C530009030500090B00202C +:104EA0005B0DD20FA34204DD0F48834202DD0F4B9E +:104EB000D01830BD8020400301430D48C01A1F2880 +:104EC00008DD0C48C31AD9400B005842002AF0D123 +:104ED0001800EEE7084CC540A446634499400B0017 +:104EE0002B43F2E7FE0300001D040000FFFFFF7FDD +:104EF0003304000013040000EDFBFFFF5C420010D0 +:104F00008A4100108A410010864100109041001033 +:104F1000904100107C440010864100109041001028 +:104F20007C44001090410010864100101A4400108B +:104F30001A4400101A440010E64400100FB4F0B5F3 +:104F40004E46DE46574645460023E0B593B01CAEBC +:104F500004CE0993019212780596002A01D100F03F +:104F6000A6FC00259B469A4612E0013309AC01934A +:104F700064196B1C099322711F2B00D92CE10122AB +:104F800094461D00E344019B1A78002A00D111E1E8 +:104F9000019B252AE9D15B78252B00D125E1583BDF +:104FA000DBB2202B00D9DAE0984A9B00D3589F4609 +:104FB0003023974A09AC90466A1C65190027226085 +:104FC0002B711F2A0BD843460137DB5D002B11D014 +:104FD00025686A1C651922602B711F2AF3D9534674 +:104FE00020210AA823601CF0C3FE43460137DB5D85 +:104FF000002BEDD153460822002107A820CE0693AE +:10500000FBF7D2FB0F231900824A2940515CBB44B5 +:1050100006AF89463970290901D100F058FD1940C1 +:10502000515C7970290A01D100F08AFD1940515C68 +:10503000B970290B01D100F088FD1940515CF9705D +:10504000290C01D100F0E3FC1940515C3971290DA4 +:1050500001D100F089FD1940515C7971290E01D10F +:1050600000F085FD0B40D35CBB712B0F01D100F02C +:105070008BFD0825D35CFB717B19013B19782368F4 +:105080005A1CE318226019711F2A01D900F03DFC57 +:10509000AB1EF95C984623685A1CE318226019710C +:1050A0001F2A01D900F00DFC4346002B54D0EB1E03 +:1050B000F95C984623685A1CE318226019711F2A6C +:1050C00001D900F02AFC4346002B45D02B1FF95C88 +:1050D000984623685A1CE318226019711F2A01D9C7 +:1050E00000F03FFC4346002B36D06B1FF95C98461E +:1050F00023685A1CE318226019711F2A01D900F095 +:1051000054FC4346002B27D0AB1FF95C984623681C +:105110005A1CE318226019711F2A01D900F06CFC97 +:105120004346002B18D0EB1FF95C984623685A1CA5 +:10513000E318226019711F2A01D900F07BFC434655 +:10514000002B09D0494623685A1CE31822601971C4 +:105150001F2A01D900F096FCAB44256851E05B237F +:1051600009AC6A1C6519002722602B711F2A0BD815 +:10517000294B0137DB5D002B12D015006A1C651925 +:1051800022602B711F2AF3D9534620210AA82360DD +:105190001CF0EEFD204B0137DB5D2268002BECD1CB +:1051A000019B150001330193019BBB441A78002A2F +:1051B00000D0EDE6002D04D029000AA81CF0D8FD8F +:1051C0008344584613B03CBC90469946A246AB4631 +:1051D000F0BC08BC04B01847534620210AA8099324 +:1051E0001CF0C6FD099BCAE604CE09AC6B1C641911 +:1051F000099322711F2B00D912E3012294461D004E +:10520000E344019B02330193BDE6C046045C0010F9 +:10521000EC5B0010885C0010F05B00105346082225 +:10522000002107A810CE0693FBF7BEFAD44A06AFBA +:105230000F2319002140515C89463970210900D1A2 +:1052400097E31940515C7970210A00D1AAE3194013 +:10525000515CB970210B00D1BDE31940515CF9706C +:10526000210C00D1DCE31940515C3971210D00D1D2 +:10527000EFE31940515C7971210E01D100F00AFC75 +:105280000B40D35C240FBB7101D100F044FC135DD3 +:10529000FB71082398464346FB18013B1A7809AC7A +:1052A0006B1C651909932A711F2B00D9E3E2424652 +:1052B0002368951E795D5A1CE318226019711F2A14 +:1052C00000D9D1E2002D49D042462368D51E795D30 +:1052D0005A1CE318226019711F2A00D9D2E2002D4E +:1052E0003CD042462368151F795D5A1CE3182260A2 +:1052F00019711F2A00D9CCE2002D2FD04246236815 +:10530000551F795D5A1CE318226019711F2A00D9B4 +:10531000C6E2002D22D042462368951F795D5A1CB3 +:10532000E318226019711F2A00D9C3E2002D15D09D +:1053300042462368D51F795D5A1CE3182260197113 +:105340001F2A00D982E2002D08D0494623685A1C42 +:10535000E318226019711F2A00D97EE22568C34430 +:105360004FE7330040CB082299465346002107A857 +:1053700006AF0693FBF718FA002E00DA58E2002376 +:1053800009AC02930A213000FDF778FF3031CBB22F +:1053900030000A213B700393FDF7EAFE8046092E98 +:1053A00000D8A7E30A21FDF769FF30314046797044 +:1053B0000A21FDF7DDFE8046632E00D8C3E30A21F3 +:1053C000FDF75CFF30314046B9700A21FDF7D0FE91 +:1053D000FA2380469B009E4200D2BCE30A21FDF7DF +:1053E0004DFF30314046F9700A21FDF7C1FE654B93 +:1053F00080469E4200D8B0E30A21FDF73FFF3031DE +:10540000404639710A21FDF7B3FE5F4B80469E424C +:1054100000D8A4E30A21FDF731FF3031404679710D +:105420000A21FDF7A5FE594B80469E4200D8A1E314 +:105430000A21FDF723FF30314046B9710A21FDF7FB +:1054400097FE534B80469E4200D89BE30A21FDF70E +:1054500015FF30314046F9710A21FDF789FE4D4BA9 +:1054600080469E4200D895E30A21FDF707FF3031C0 +:10547000397240460A21FDF77BFE474B9E4200D819 +:105480008AE30A2630307872BB19013B1A786B1C0C +:10549000651923602A711F2B00D928E22368B51EE5 +:1054A000795D5A1CE318226019711F2A00D910E295 +:1054B000002D5ED02368F51E795D5A1CE31822602A +:1054C00019711F2A00D937E2002D52D02368351FE9 +:1054D000795D5A1CE318226019711F2A00D939E23C +:1054E000002D46D02368751F795D5A1CE318226091 +:1054F00019711F2A00D967E2002D3AD02368B51F21 +:10550000795D5A1CE318226019711F2A00D96CE2D8 +:10551000002D2ED02368F51F795D5A1CE3182260F8 +:1055200019711F2A00D97EE2002D22D03500236890 +:10553000083D795D5A1CE318226019711F2A00D9B1 +:1055400092E2002D15D035002368093D795D5A1C83 +:10555000E318226019711F2A00D99FE2002D08D09C +:10556000236803995A1CE318226019711F2A00D975 +:10557000DCE2029B25689C466644B3444E4640E606 +:10558000885C00100F2700009F8601003F420F003B +:105590007F969800FFE0F505FFC99A3B534610CE71 +:1055A0000822002107A80693FBF7FEF80A21200035 +:1055B000FDF764FE3031CBB206AF0A2120003B700C +:1055C0009846FDF7D5FD8146092C00D874E20A21E2 +:1055D000FDF754FE3031484679700A21FDF7C8FDC9 +:1055E0008146632C00D8A8E20A21FDF747FE30313E +:1055F0004846B9700A21FDF7BBFDFA2381469B009E +:105600009C4200D2A4E20A21FDF738FE3031484620 +:10561000F9700A21FDF7ACFDDB4B81469C4200D8B6 +:10562000F2E10A21FDF72AFE3031484639710A219C +:10563000FDF79EFDD54B81469C4200D891E20A21A0 +:10564000FDF71CFE3031484679710A21FDF790FDC7 +:10565000CF4B81469C4200D88EE20A21FDF70EFE18 +:1056600030314846B9710A21FDF782FDC94B8146A8 +:105670009C4200D883E20A21FDF700FE3031484603 +:10568000F9710A21FDF774FDC34B81469C4200D895 +:105690007DE20A21FDF7F2FD3031397248460A21D8 +:1056A000FDF766FDBD4B9C4200D877E20A23994680 +:1056B000303078724B46FB18013B1A7809AC6B1CF2 +:1056C000651909932A711F2B00D917E14A462368EF +:1056D000951E795D5A1CE318226019711F2A00D9A2 +:1056E000FEE0002D63D04A462368D51E795D5A1C22 +:1056F000E318226019711F2A00D916E1002D56D037 +:105700004A462368151F795D5A1CE31822601971F7 +:105710001F2A00D917E1002D49D04A462368551F9A +:10572000795D5A1CE318226019711F2A00D944E1DF +:10573000002D3CD04A462368951F795D5A1CE3181A +:10574000226019711F2A00D948E1002D2FD04A4646 +:105750002368D51F795D5A1CE318226019711F2A2E +:1057600000D96FE1002D22D04D462368083D795DB8 +:105770005A1CE318226019711F2A00D97BE1002D01 +:1057800015D04D462368093D795D5A1CE318226007 +:1057900019711F2A00D988E1002D08D041462368DD +:1057A0005A1CE318226019711F2A00D9B7E1256835 +:1057B000CB4426E508CE98461B78002B00D120E587 +:1057C000320009AC464690466A1C651900272260E3 +:1057D0002B711F2A0AD80137F35D002B11D0150059 +:1057E0006A1C651922602B711F2AF4D953462021A7 +:1057F0000AA8013723601CF0BBFAF35D2268002B76 +:10580000EDD146461500BB44FBE453460822002177 +:1058100007A810CE069306AFFAF7C6FF604A07E561 +:10582000534620210AA809931CF0A2FA099BE4E43C +:105830002D2209AC6B1C651909932A711F2B00D905 +:105840000AE11D000123764202939BE55346202185 +:105850000AA823601CF08CFA75E5534620210AA89B +:1058600023601CF085FA79E5534620210AA82360BD +:105870001CF07EFA26E5534620210AA809931CF065 +:1058800077FA14E5534620210AA823601CF070FA29 +:1058900025E5534620210AA823601CF069FA2BE570 +:1058A000534620210AA823601CF062FA31E5002348 +:1058B0009B4686E4534620210AA823601CF058FA30 +:1058C00034E5534620210AA823601CF051FAFFF763 +:1058D000EBFB534620210AA823601CF049FAE7E5B8 +:1058E000534620210AA823601CF042FAF9E65346E9 +:1058F00020210AA823601CF03BFACFE55346202163 +:105900000AA809931CF034FAE0E6534620210AA8BD +:1059100023601CF02DFAFFF7BBFB534620210AA899 +:1059200023601CF025FAFFF7CEFB534620210AA87E +:1059300023601CF01DFAE1E6534620210AA82360EB +:105940001CF016FAC0E5534620210AA823601CF07B +:105950000FFAE0E6534620210AA823601CF008FA5B +:10596000BEE5534620210AA823601CF001FAFFF788 +:10597000B9FB3A7809AC6B1C651909932A711F2B86 +:1059800048D801239846E9E40F2700009F860100CC +:105990003F420F007F969800FFE0F505FFC99A3B54 +:1059A000985C00100223984675E4534620210AA80B +:1059B00023601CF0DDF9FFF7A4FB534620210AA861 +:1059C00023601CF0D5F9B3E6534620210AA82360D2 +:1059D0001CF0CEF990E5032398465CE45346202161 +:1059E0000AA823601CF0C4F9AFE6534620210AA898 +:1059F00023601CF0BDF98BE5534620210AA82360E3 +:105A00001CF0B6F9FFF78CFB0423994652E60425F7 +:105A1000FFF732FB09910AA820211CF0A9F9B0E791 +:105A20000423984637E4534620210AA823601CF03B +:105A30009FF979E5534620210AA823601CF098F9C4 +:105A4000FFF77DFB534620210AA823601CF090F944 +:105A500088E6052398461EE4534620210AA80993A8 +:105A60001CF086F9099BECE6534620210AA8236026 +:105A70001CF07EF965E5534620210AA823601CF03E +:105A800077F97CE6534620210AA823601CF070F9C0 +:105A9000FFF762FB06239846FFF7FDFB53462021E4 +:105AA0000AA823601CF064F958E5534620210AA88F +:105AB00023601CF05DF96FE63A7809AC6B1C651940 +:105AC00009932A711F2B6CD8012399466FE623682E +:105AD00038785A1CE318226018711F2A02D8012551 +:105AE000FFF73AFB21600AA820211CF041F90125AB +:105AF000FFF732FB3A786B1C651923602A711F2B64 +:105B000001D8012635E5534620210AA82360012645 +:105B10001CF02EF92DE507239846FFF7BCFB5346F2 +:105B200020210AA823601CF023F940E653462021D7 +:105B30000AA823601CF01CF91BE502239946B9E56D +:105B40000225FFF799FA02269EE40325FFF794FA4F +:105B500003239946AEE5032696E4042694E405263D +:105B600092E405239946A5E50525FFF785FA062564 +:105B7000FFF782FA062687E4062399469AE507236B +:105B8000994697E507267FE40725FFF775FA08236E +:105B900099468FE5082677E4092675E40923994696 +:105BA00088E5534620210AA809931CF0E1F88BE709 +:105BB00011DF704710DF704700B585B00293079B77 +:105BC0000191039301A9069BFFF7F2FF05B000BD09 +:105BD00012DF70470BDF704713DF704715DF704728 +:105BE00017DF704718DF70470CDF70473078000010 +:105BF0005B556E737570706F727465642054616765 +:105C00005D0000000A5800105E5100105E51001047 +:105C10005E5100105E5100105E5100105E51001088 +:105C20005E5100105E5100105E5100105E51001078 +:105C3000E8510010625300105E5100105E510010D8 +:105C40005E5100105E510010625300105E51001052 +:105C50005E5100105E5100105E5100105E51001048 +:105C60005E510010B04F00105E5100105E510010E8 +:105C7000B45700105E5100109C5500105E5100108A +:105C80005E5100101C52001030313233343536373B +:105C900038396162636465663031323334353637A2 +:105CA00038394142434445460000000000000000EE +:105CB00000000000000000000000000000000000E4 +:105CC00030B5144C87B02369A568082B1FD1A36990 +:105CD000042B1CD104330021606804AAFFF77EFF67 +:105CE0002369834213D1A3690221606803AAFFF7E5 +:105CF00075FFA36983420AD1039B2800019363695E +:105D00000093049A059B00F01BF907B030BD812079 +:105D10004042FAE700100108F0B5CE46474680B58C +:105D20008DB000F0FFF8002829D106AB98468027F7 +:105D30006B4C08AE8021012009064042FFF74AFF64 +:105D40000300C2061CD4820653D4420647D4020084 +:105D50003A409146384200D09AE080204000034209 +:105D600026D02100FFF738FF2568002D21DAAB1C73 +:105D700000DA8CE049466068FFF734FFDAE7FEE7B7 +:105D800021001020FFF728FF2368002B06DA0233DA +:105D90000DDB00216068FFF725FFCBE7002B75D1F5 +:105DA000FFF78EFF01006068FFF71CFFC2E7FEE708 +:105DB000FEE7002D00D08AE0236A9946042B00D02C +:105DC0008BE000F015F94B4608903200290060681E +:105DD000FFF706FF29006068FFF704FFAAE721002C +:105DE0004020FFF7F9FE216800290CDA8B1CD0DA7D +:105DF000FEE721002020FFF7EFFE2168002920DACE +:105E00008B1CC6DAFEE7002962D12369082B64D116 +:105E1000226A0C2A61D142466068FFF7DFFE2369DF +:105E200098425AD1069A079B0096A06800F0BAF8EB +:105E3000051ECFD101003200236A6068FFF7D0FE53 +:105E4000C8E7002942D12369082B43D16269042A9B +:105E500040D132006068FFF7C1FE2369984239D112 +:105E600063690121606805AAFFF7B8FE636998427B +:105E700030D143460293236A0193059B0093A068A7 +:105E8000089A099B00F078F8010074E78FE7FEE7B5 +:105E900021003800FFF7A0FE2168002903DA8B1CDF +:105EA00000DB76E7FEE7002913D12369082B11D127 +:105EB00032006068FFF792FE236998420AD1089A7F +:105EC000099BA06800F07EF8010054E79AE7DEE73E +:105ED0008EE7E7E7812149424DE781256D4279E769 +:105EE00000100108084B10B502000C0058680B00A8 +:105EF0000121FFF773FE201A444260418124404291 +:105F00002040813810BDC0460010010810B50B00BC +:105F10000349020048680021FFF762FE10BDC04639 +:105F20000010010810B500F065F8002800D110BD80 +:105F300000F0A0F90028FAD100F05CF8F7E7C046BD +:105F40001900130010B50B43040082B01000002BA1 +:105F50000ED00723059A9A4307D1049B2200009391 +:105F6000059B00F08BF802B010BD86204042FAE796 +:105F700087204042F7E7C0461900130010B50B43D5 +:105F8000040082B01000002B09D0069B2200019370 +:105F9000059B0093049B00F03BF802B010BD8720E6 +:105FA0004042FAE71900130010B50B43040010003B +:105FB000002B04D02200029B00F0FCF810BD8720CB +:105FC0004042FBE71900130010B50B43040010001A +:105FD000002B06D0220000F00FF90300953303D008 +:105FE00010BD87204042FBE784204042F8E7C046CE +:105FF0000020704710B5044C200000F015FA034B48 +:10600000283C5C6010BDC0466010010830100108DB +:10601000F8B5164D1E002B0000F04CFC041E01D0FC +:106020002000F8BD124F2868390000F0EFFE041E72 +:1060300004D1FD69B54207D28724644200213800AB +:106040000C4AFAF7B1FBEBE7069BAD1B9D4200D96A +:106050001D00094829003018FFF758FF079B002151 +:106060003800044A1D60FAF79FFBD9E73010010899 +:10607000381001082808000060100108F0B55746E4 +:106080004E464546DE46E0B51700802283B09A466C +:106090000C9B06000D001201934200D96EE0414BAB +:1060A0003A00994600F006FC041E4CD003008C33E5 +:1060B0000ED03D4B9846002140463C4AFAF774FB0F +:1060C000200003B03CBC90469946A246AB46F0BDCA +:1060D000354B364A984618000021FAF765FB4346CF +:1060E0000C9A1A6252465A6202239B46002301937D +:1060F0002F4B0C9918009A46FFF7F4FE041EDAD1D4 +:1061000028235B429C46E24453460C9A4946584633 +:10611000DA6100F02DFA041ECDD14B4651461868C5 +:1061200000F0B6FE041EC6D14B463A0030002900EE +:1061300000F0A6FA041E2FD1019B002B21D100F004 +:1061400033FD0400B7E7184B190098464B46186812 +:1061500000F05CFE041EAED143465B6ADB070AD446 +:10616000434652465A620C9A1A624B461B68019388 +:1061700001239B46BCE7852464429CE78724644254 +:106180009EE700F011FD041E00D094E70021019865 +:10619000FBF7A2FD04008EE74B4600211868FBF7D1 +:1061A0009BFD88E73010010838100108280800001E +:1061B00060100108F8B50D4E1D00330000F07AFBA9 +:1061C000041E01D02000F8BD094F3068390000F0EE +:1061D0001DFE041E03D17B6AFA69AB606A60002170 +:1061E0003800044AFAF7E0FAECE7C046301001083C +:1061F0003810010828080000F8B5CE4647461A4B6B +:1062000080B506000D009146984600F053FB041E31 +:1062100004D020000CBC90469946F8BD4346134F6D +:106220001868390000F0F2FD041E04D17B6ADB0718 +:1062300007D585246442002138000D4AFAF7B4FAE4 +:10624000E7E74A463000290000F0E2FB041EF2D1E5 +:1062500043461D6800F0A8FC041EECD12800002174 +:10626000FBF73AFD0400E6E730100108381001089A +:106270002808000010B500F0BFF810BD002310B5CD +:1062800082B0040001A90120019323F025FD00281C +:1062900025D1019B9C4205D80BE0019B0133019362 +:1062A000A34206D2012023F025FD0028F5D002B03C +:1062B00010BD022001A923F00FFD00280FD1019B82 +:1062C0009C4206D80020F2E7019B01330193A342D0 +:1062D000F8D2022023F00EFD0028F5D0E7E7842055 +:1062E0004042E4E7F0B583005E58DBB0B227CA68ED +:1062F0006B460C0031007F00DA511C313A0005007A +:106300006846FAF735FAB42269463000520000F0C8 +:1063100059FD002818D02369002B04D164190133DA +:1063200023725BB0F0BD6A46D351B4226946300097 +:10633000520000F047FD431E98410123404298431C +:10634000033064192072ECE7022364192372E8E732 +:10635000F0B5C646002300B50020DEB0039323F05D +:10636000C9FC041E04D020005EB004BC9046F0BD01 +:10637000002003A923F0B0FC041EF4D100F020FC9F +:10638000041EF0D11B4D039C280000F077FC102167 +:106390006B46B2225B182900520018001C319C5039 +:1063A000FAF7E6F9B4222800520004A900F0E6FC4E +:1063B000041E1BD100F04AFC041ED4D18223C02647 +:1063C000FF33EF5C76000094984632002B000021EA +:1063D000781CFBF7FBFB041EC5D14246AB5D03985E +:1063E000AB54AF55FFF74AFF0400BCE700F02EFCAA +:1063F000B9E7C0466018010810B523F059FC002821 +:106400000ED1C422074C520000212000FAF7CCF92B +:10641000C02301225B00E25201232377FFF798FF9C +:1064200010BDC04660180108002370B588B003ADE8 +:106430002B81EB602B6102AB68600193C0234B4E54 +:1064400000220120002100965B000396FBF7E8FB89 +:10645000002801D001232B7202AB01936B6800224C +:106460000093C023022000215B00FBF7D9FB00282A +:1064700001D001236B7200F0A3FB041E02D02000A8 +:1064800008B070BD23F014FC041E05D1002006A93D +:1064900023F022FC041E02D000F0D8FBEFE701201D +:1064A00002A923F019FC041EF6D1022007A923F04B +:1064B00013FC041EF0D12B69029A934200D028618C +:1064C0002B7A012B3DD16B7A012B35D100F0BEFB2D +:1064D000041ED4D1039B1B7F012B01D001232B72FF +:1064E00069680B7F012B01D001236B7202232A897B +:1064F000FF339A4237D0C0222B7A5200012B28D08A +:106500006B7A012B2CD0022B20D0C0235B00802281 +:10651000022000215200F252FBF7DEFB041E02D0E3 +:1065200003008C33ABD1E868FFF7A8FE041EA6D1A8 +:10653000300000F099FBA2E729000120FFF7D2FE0E +:10654000C4E729000020FFF7CDFEBCE7C0220123ED +:1065500052003000B352FAF70BF901200021DBE7BB +:106560008033FF33D3E78424644288E7601801084E +:1065700070B50D00002800D17CE0404B1A6B596BC0 +:106580000A4302D10138002851D01A6D596D0A43CF +:1065900003D10138002800D15AE01A6F596F0A431D +:1065A00002D10138002855D01900903106C90A439C +:1065B00002D1013800284FD01900B03106C90A4372 +:1065C00002D10138002849D01900D03106C90A4348 +:1065D00002D10138002843D01900F03106C90A431E +:1065E00002D1013800283DD019001131FF3106C910 +:1065F0000A4302D10138002836D019003131FF3169 +:1066000006C90A4302D1013800282FD019005131A0 +:10661000FF3106C90A4302D10138002828D071335E +:10662000FF330CCB1A4310D101280ED10930C41C02 +:1066300020000021FBF750FB002802D100202C6035 +:1066400070BD03008C33FBD1F8E78E204042F7E7A2 +:106650000120ECE70220EAE70320E8E70420E6E770 +:106660000520E4E70620E2E70720E0E70820DEE770 +:106670000920DCE787204042E2E7C04660180108B5 +:10668000F0B5DE4657464E464546E0B5884C1F00FD +:10669000236B05008B46160089B0834257D0236DCB +:1066A000AB4200D194E0236FAB4200D19AE02300CB +:1066B00090331A68AA4200D19EE02300B0331A68D2 +:1066C000AA4200D1A3E02300D0331A68AA4200D125 +:1066D000A8E02300F0331A68AA4200D1ADE02300FD +:1066E0001133FF331A68AA4200D1B1E023003133DD +:1066F000FF331A68AA4200D1B6E023005133FF33BA +:106700001A68AA4200D1BBE023007133FF331A6834 +:10671000AA4200D1C0E059463A68D31E023A52015B +:106720005B01E318A4181D635963102279689E6306 +:106730002000FAF71DF8FFF70BFE051E42D12800D6 +:1067400009B03CBC90469946A246AB46F0BD636B8F +:106750008B42A4D1A36B9A42A1D1002301335B01E8 +:106760009846A044202241466846FAF701F843467D +:106770001B6920229A4643465B69002140469946A0 +:10678000FAF712F859463A68D31E023A52015B01F1 +:10679000E318A4181D635963102279689E632000D2 +:1067A000F9F7E6FFFFF7D4FD051EC8D053464A4669 +:1067B000134307D05346059269462022404604936E +:1067C000F9F7D6FF202200212000F9F7EDFFB6E708 +:1067D000636D5B4500D066E7A36D9E4200D062E723 +:1067E0000123BBE7636F5B4500D060E7A36F9E4268 +:1067F00000D05CE70223B1E75B685B4500D05CE753 +:106800009823E3589E4200D057E70323A6E75B682E +:106810005B4500D057E7B823E3589E4200D052E7CB +:1068200004239BE75B685B4500D052E7D823E3581D +:106830009E4200D04DE7052390E75B685B4500D0A2 +:106840004DE7F823E3589E4200D048E7062385E74A +:106850005B685B4500D049E78C235B00E3589E42B0 +:1068600000D043E7072379E75B685B4500D044E746 +:106870009C235B00E3589E4200D03EE708236DE76F +:106880005B685B4500D03FE7AC235B00E3589E426A +:1068900000D039E7092361E75B685B4500D03AE740 +:1068A000BC235B00E3589E4200D034E70A2355E73F +:1068B0006018010870B5554C256B854234D0256DA4 +:1068C000854243D0256F854248D0250090352E68FB +:1068D00086424BD02500B0352E6886424FD0250029 +:1068E000D0352E68864253D02500F0352E6886427A +:1068F00057D025001135FF352E6886425AD0250025 +:106900003135FF352E6886425ED025005135FF3582 +:106910002E68864262D025007135FF352E6886428A +:1069200067D08C20404270BD656B8D42C7D1A56B8E +:10693000AA42C4D10021CA1C013149011A60586819 +:1069400010226118F9F714FF0020ECE7656D8D4205 +:10695000B8D1A56DAA42B5D10121ECE7656F8D4292 +:10696000B3D1A56FAA42B0D10221E4E76D688D4290 +:10697000B0D198256559AA42ACD10321DBE76D68F7 +:106980008D42ACD1B8256559AA42A8D10421D2E7DD +:106990006D688D42A8D1D8256559AA42A4D1052198 +:1069A000C9E76D688D42A4D1F8256559AA42A0D1E6 +:1069B0000621C0E76D688D42A1D18C256D00655917 +:1069C000AA429CD10721B6E76D688D429DD19C25D6 +:1069D0006D006559AA4298D10821ACE76D688D42D7 +:1069E00099D1AC256D006559AA4200D093E70921E1 +:1069F000A1E76868884200D093E7BC21490061584C +:106A00008A4200D08DE70A2195E7C0466018010848 +:106A100030B5644B89B01C6B84423BD01C6D844202 +:106A200056D01C6F84425BD01C0090342568854290 +:106A30005ED01C00B0342568854262D01C00D03482 +:106A40002568854267D01C00F0342568854200D156 +:106A50006CE01C001134FF342568854200D170E0E1 +:106A60001C003134FF342568854200D175E01C00DC +:106A70005134FF342568854200D17AE01C0071341E +:106A8000FF342568854200D17FE08C256D422800C7 +:106A900009B030BD5C6B8C42C0D19C6BA242BDD1B1 +:106AA0000024013464011C19202221006846F9F7F2 +:106AB0005FFE202200212000F9F776FEFFF748FC58 +:106AC000051EE4D0202269462000F9F751FEDEE7DA +:106AD0005C6D8C42A5D19C6DA242A2D10124E0E75D +:106AE0005C6F8C42A0D19C6FA2429DD10224D8E75A +:106AF00064688C429DD198241C59A24299D10324E8 +:106B0000CFE764688C4299D1B8241C59A24200D0C6 +:106B100094E70424C5E764688C4200D093E7D82446 +:106B20001C59A24200D08EE70524BAE764688C4263 +:106B300000D08EE7F8241C59A24200D089E7062431 +:106B4000AFE764688C4200D08AE78C2464001C594B +:106B5000A24200D084E70724A3E764688C4200D0F7 +:106B600085E79C2464001C59A24200D07FE70824DA +:106B700097E764688C4200D080E7AC2464001C591D +:106B8000A24200D07AE709248BE76068884200D0EF +:106B90007BE7BC21490059580A248A4200D074E797 +:106BA0007FE7C04660180108822310B5034AFF330F +:106BB000D05C00210130FBF78FF810BD6018010890 +:106BC00030B58BB00021202202A8F9F7EDFD00239B +:106BD0000093C0239B000493164B01AC0593164B06 +:106BE00068460193802315492383FCF7C9F90028DF +:106BF00001D00BB030BD0C236846114A1149FCF797 +:106C000017FA00280FD1104D69462A002000FCF722 +:106C100043FA002807D16846FCF78AF80028E8D034 +:106C20002888FBF707F96846FCF782F88420404281 +:106C3000DFE7C0460210400601000040000F00B030 +:106C4000246F001001020000F4190108054B10B573 +:106C50001888FBF7EFF8002800D110BD84204042CF +:106C6000FBE7C046F4190108010010B50C220248E8 +:106C70001031F9F77DFD10BDE8190108F0B583B0BA +:106C80006C460E4923000A0060CA60C30122009EC0 +:106C9000019F002392197B41009201931A435342B2 +:106CA0005A410B008D681030AD1844CC44C30C22FF +:106CB0008D60F9F75DFD03B0F0BDC046E81901082D +:106CC000F0B51400020089B0109F05001148119E14 +:106CD000008805970F9F029304970E9F01940091DF +:106CE0000C230D49103206960397FBF74DFD041E49 +:106CF0000CD10F9B31689C4610393160102228005E +:106D00006144F9F735FD200009B0F0BD84246442E8 +:106D1000F9E7C046F419010802104006F0B5C6466E +:106D20000400904600B588B00E9E0F0098191022FE +:106D300021001D00F9F71CFD0E4B22001888119B45 +:106D400010360693109B0C4905930F9B1032049349 +:106D500043460396019302950C230097FBF76CFDC5 +:106D6000002803D108B004BC9046F0BD95204042F5 +:106D7000F8E7C046F419010802104006030030B5D8 +:106D800014008BB002000D4809AD008806950493ED +:106D900010250023009103930293094910320595B1 +:106DA00001940C33FBF7F0FC002804D1099B102B55 +:106DB00001D10BB030BD84204042FAE7F41901083C +:106DC0000210400630B503008BB0150002000D48DC +:106DD00009AC0088069400240594049410340293AE +:106DE00000910C230849103203940195FBF724FD10 +:106DF000099B184343425841952340421840953817 +:106E00000BB030BDF419010802104006F0B589B08E +:106E100005AB01930B0010330D00009300220021FD +:106E2000184B0400FAF7FCFE002801D009B0F0BDB1 +:106E3000059E0694FFF7C4FE0028F7D134002F000A +:106E4000114E0C3C1C37220039003000F9F790FC41 +:106E500007AB03930D4B04220293280033000197E4 +:106E6000009406A9FFF75AFF002805D1079B9C4212 +:106E700002D1FFF7EBFED9E7FFF7E8FE842040429E +:106E8000D4E7C04628080000F81901080C080000E3 +:106E9000F0B5CE46474680B587B005000C00CE69F8 +:106EA0000490FFF78DFE002804D007B00CBC90467C +:106EB0009946F0BD1C23370098462000FFF7DEFE00 +:106EC00005AB0393154B0C370293154BA044994621 +:106ED0000193042243462000009704A9FFF7F0FE27 +:106EE000002815D1059B9F4212D13A0049464046E1 +:106EF000F9F73EFCFFF7AAFE0028D6D123003200A6 +:106F000000900021280010331832FAF75FFECCE71A +:106F1000FFF79CFE84204042C7E7C0461C080000E3 +:106F2000F819010873746F726167655F6B657900AA +:106F30000000000000000000000000000000000051 +:106F4000F0B5CE46474680B58DB000F0F7F8002882 +:106F500038D1812706AB98466B4C08AD7F42802123 +:106F6000012009064042FEF735FEC3061ED4830603 +:106F70002AD443065AD4030625D521008020FEF7E3 +:106F80002BFE0028EBD12168002900DB7FE08B1C61 +:106F900000DAA9E000216068FEF724FE80210120CC +:106FA00009064042FEF716FEC306E0D52100102078 +:106FB000FEF712FE0028D2D12168002910DA8B1CBE +:106FC000E8DAFEE7FEE7FEE721002020FEF704FEF8 +:106FD0000028C4D12168002934DA8B1CDADAFEE7F4 +:106FE000002900D081E02369082B00D083E0A66946 +:106FF000042E00D07FE06269606891462A00FEF7A7 +:10700000EDFD082877D13300424602216068FEF783 +:10701000E5FD04286FD1069B01934B460093A068C1 +:10702000089A099B00F0BCF80100B4E72100402059 +:10703000FEF7D2FD002892D12168002939DA8B1C95 +:10704000A8DAFEE7002953D12369082B53D16669DA +:10705000042E50D1226A606891462A00FEF7BEFDD8 +:10706000082848D133000121606805AAFEF7B6FD63 +:10707000042840D1434602934B460193059B00935D +:10708000A068089A099B00F01BF9010083E700291A +:107090002DD12369082B2ED12A006068FEF79EFDB2 +:1070A000082828D1089A099BA06800F0AFF90100D0 +:1070B00071E700291AD12369082B1AD1226A0C2AF8 +:1070C00017D142466068FEF789FD082811D1069A5B +:1070D000079B0095A06800F06BF9061E0DD03100EB +:1070E0006068FEF77FFD3AE7FEE76AE7A9E7FBE79E +:1070F00075E73E00F3E739004DE70C232A00002135 +:107100006068FEF76DFDEAE78028010810B50B0006 +:107110000349020048680121FEF760FD10BDC0462A +:107120008028010810B50B000349020048680021BF +:10713000FEF756FD10BDC0468028010810B500209E +:1071400000F0AAF9144C0100200000F0E7F9002833 +:107150000BD0200000F0E8F9002800D010BD00F0AE +:107160009BF90100200000F0D9F9012000F094F90A +:107170000A4C0100200000F0D1F90028EED02000D8 +:1071800000F0D2F90028E9D1013000F085F90100C2 +:10719000200000F0C3F9E1E7B02A0108C42A010881 +:1071A000F0B5DE4657464E4645461100E0B5194358 +:1071B00085B0002900D174E007210F9C8C4368D171 +:1071C00003933A4B02929A4602AA01C312CA12C30F +:1071D00080235B00984259D0354B9B46354C514635 +:1071E0002200584600F01AFA8046031E43D08C3322 +:1071F00039D180230E9F9B009F4200D91F002E4B48 +:10720000390099461800FFF781FF4B4601930F9B09 +:107210005146009358463B000E9A00F089F980468B +:10722000002820D10E9BDD1BBB4203D11BE03F1980 +:107230002D1B18D080232C009B009D4200D91C00E0 +:1072400021004846FFF762FF4B462200009351465B +:107250003B00584600F006FA061EE8D05146584654 +:1072600000F06AFAB046404605B03CBC90469946EC +:10727000A246AB46F0BDA368DB070ED45146584684 +:1072800000F05AFA80460028B3D0ECE70B4B9B463F +:10729000A4E786235B429846E5E785235B42984650 +:1072A000E1E787235B429846DDE7C046D82A01081C +:1072B000B02A0108E42A0108B0280108C42A0108FC +:1072C000F0B55746DE464E4645468621E0B585B0C8 +:1072D0000E9F490088424AD01100194357D00393AA +:1072E0002E4B0292994602AA01C312CA12C38023EE +:1072F0005B0098424ED02A4B9A462A4C49462200BF +:10730000504600F08BF9061E27D12468BC423ED3BC +:107310000F9BE41B9C4228D8109B1C60224B984674 +:1073200080239B009B4606E029004046FFF7FAFEBB +:107330007F19641B11D025005C4501D98025AD0063 +:1073400043462A00009349463B00504600F07AFA33 +:10735000061EE9D00023109A1360300005B03CBC33 +:1073600090469946A246AB46F0BD1C00D4E71100FA +:1073700019430CD0029280220393084B5200994685 +:1073800004C302AA03CA03C3084B9A46B5E787267B +:107390007642E2E7054B9A46AFE7C046D82A010895 +:1073A000B02A0108E42A0108B0280108C42A01080B +:1073B000110070B582B0069C19431BD00F49019390 +:1073C0000B0000926A4601C360CA60C380235B0061 +:1073D00098420DD00A480B4D2A0000F01FF90028F2 +:1073E00004D1AA682B68A2602360636002B070BDFC +:1073F0000548F0E787204042F8E7C046D82A010850 +:10740000B02A0108E42A0108C42A0108862170B5BF +:10741000490082B0884220D0110019432CD01A4C68 +:107420000193230000926A4601C322CA22C380232B +:107430005B00984226D0154E154D21002A003000E1 +:1074400000F0ECF8002806D1AB68DB0717D4210068 +:10745000300000F071F902B070BD110019430BD07B +:10746000094C0092802201932300520004C36A4613 +:10747000084E03CA03C3DFE787204042EBE78520BD +:107480004042E8E7034ED7E7D82A0108B02A0108AE +:10749000E42A0108C42A0108014B8000C058704743 +:1074A00050830010F0B54E4645465746DE46E0B5DF +:1074B000C5B099464F9D4E9B06008A46984603925A +:1074C000002D29D080235B009B4610E05146300000 +:1074D000039BB768009404AAB847002815D1039B02 +:1074E000A0449C46A44463462D1B039314D02C0057 +:1074F0005D4501D9802464004346494630007768E1 +:10750000009404AAB8470028E0D045B03CBC90469F +:107510009946A246AB46F0BD0020F6E710B50160E3 +:1075200000F098FB10BDC04610B500F06DFD10BD19 +:10753000F0B54746CE4680B51D00036804009B8C1D +:107540000F00160091B0934265D304AA00F014FB1B +:10755000002860D005AB9946029308AB984601938A +:1075600004AB0093320039002000189B00F0A6FC09 +:10757000002823D1002D26D14A462000089900F08A +:1075800005FE002844D142462000049900F066FE22 +:1075900000283DD12000049900F0A8FA002837D136 +:1075A00043461B68002B01D1002D04D1200000F0C0 +:1075B000B7FB00282CD1200000F080FB11B00CBCE0 +:1075C00090469946F0BD43462A000021D86800F055 +:1075D0005DFE00281CD1199B4246019349460023B9 +:1075E0002000009500F0D6F9002811D143469D6097 +:1075F0004B461E6843462000196800F0B7FA4B4618 +:1076000018604346310020001A6800F0BBFDB3E764 +:1076100084204042D2E787204042CFE770B58AB04D +:10762000150001AA04000E0000F0A6FA002815D1EA +:107630002000019902AA00F0B9FB00280CD10C220D +:10764000300007A9F9F786F8002807D1049B2B60C2 +:10765000059B6B60069BAB600AB070BD8C204042FE +:10766000FAE7C04670B590B0160004AA04001D00E9 +:1076700000F082FA00285BD12000049908AA00F0EB +:1076800095FB002854D12000089905AA00F0DEFBE4 +:1076900000284AD10A9B03939D4246D80B9B320097 +:1076A00029001800039300F0F1FD00283DD1149B40 +:1076B0002000019300962B0008AA05A900F06AF9A2 +:1076C000002832D10A9BAD1903939D4226D8089910 +:1076D0002000059D00F04AFA2900089A0590200034 +:1076E00000F050FD2000089905AA00F04FFD002889 +:1076F0001BD12000049908AA00F0B0FD002814D185 +:107700002000049900F0F2F900280ED1089B002B0C +:1077100006D1200000F0D2FA10B070BD0A95D6E76D +:10772000200000F0FDFA0028F3D084204042F3E767 +:107730008C204042F0E7C046F0B54F46D64646465C +:10774000C0B503688EB005AA0500DF8B00F014FAFF +:10775000002800D073E02800059906AA00F026FB57 +:10776000002805D00EB01CBC90469946A246F0BD3C +:107770000BA800F097FD002861D1079B20229846B6 +:10778000099B002106A89946069EF9F70DF82800E6 +:10779000059906AA00F062FD0028E3D12B68DB8C76 +:1077A000002B30D00022002492460BE0210028005C +:1077B00006AA00F053FD0028D4D12B68DB8C0134DD +:1077C000A34222D9059AA242F9D02100280006AA94 +:1077D00000F0ECFA0028C5D1069B0393B342E5D133 +:1077E0000BA800F05FFD0028E0D1079B4345DDD9E1 +:1077F0009F4200D91F004A469B1A0793099B9C464B +:107800000393E244D2E700239A465346019343464A +:107810004A46009331003B00280000F047F800285A +:10782000A0D1002E07D0280000F07AFA002802D05C +:107830008420404296E7280000F040FA92E78C202E +:1078400040428FE7F0B58FB0170005AA04000D0085 +:107850001E0000F091F9002825D12000059906AA04 +:1078600000F0A4FA00281BD10C2228000BA9F8F77D +:1078700071FF002817D1089B3A00310018000393CC +:1078800000F004FD002801D00FB0F0BD149B3200C1 +:10789000009320003B0006A900F060F80028F3D018 +:1078A00084204042F0E78C204042EDE7F0B5C64628 +:1078B00000B588B0170005AA05000E00984600F034 +:1078C000C5FA041E04D0200008B004BC9046F0BDE8 +:1078D000079B31009C46280067440393079700F0FC +:1078E00045F90F9B0700002B21D1069A0E9B9A4267 +:1078F00009D29B1A01933900059B28680092FFF773 +:10790000D1FD002821D132002800059900F03AFC71 +:107910003100280005AA059700F038FC041E17D195 +:10792000002ED0D02868C36898470400CBE7059B99 +:10793000010003930F9B0E9A01934346286800931E +:10794000039BFFF7AFFD0028CFD084246442BAE741 +:1079500032003900280000F015FCB4E7F0B587B01C +:107960000E001500096803AA07001C0000F06EFA5B +:1079700000280BD103994B1C08D038687368009419 +:1079800044680C9AEB18A04707B0F0BD8420404231 +:10799000FAE7C046F0B54746CE46160080B50F0060 +:1079A00083B011681C00050000F0E0F873687A6885 +:1079B0009C466444A31A80460100019328683B68F2 +:1079C0000092FFF76FFD00280AD10A9B28680093F8 +:1079D0008368414699460B9A2300C847002804D083 +:1079E00003B00CBC90469946F0BDF16873688C46B4 +:1079F00063441A002968B868C98B3B68091A891A58 +:107A00000191286841460092FFF74CFD0028E7D11C +:107A10003368002BE4D02868C3689847E0E7C04685 +:107A200070B5082586B00400006800950023002189 +:107A3000466802AAB047002819D16B461B7B012B70 +:107A400015D16B46282620685A7B835D9A420FD059 +:107A5000009500230121456804AAA847002821D0E9 +:107A6000012200230020E360226106B070BD20687F +:107A70000823009301210023456804AAA847002891 +:107A80000AD16B461B7D012B06D16B465A7D2823FC +:107A90002168CB5C9A4202D184204042E5E7002273 +:107AA0000123DFE76B461B7D012BD9D16A46517D4F +:107AB0002268925D8A4215D06A46507B002909D11E +:107AC00000220128CED188429B4100225B4288429D +:107AD0005241C7E70028F6D14A1E53425341511E76 +:107AE0008A41BFE71A000023BCE7C046F0B5C6468E +:107AF00000B504000669C76800680D00038C82B0F9 +:107B0000022B31D0023B5A00D218920008326B018E +:107B10009846019331003B000092FFF7C3FC002818 +:107B20001CD124680135218C02291BD002394B005D +:107B3000591889004246E38C28329C465B01083381 +:107B400052185B18934209D963465D1B6D013B00D7 +:107B50003100200001950092FFF7A4FC02B004BCA4 +:107B60009046F0BD0C21E5E71422D0E7002901D0B2 +:107B7000406870470069FCE7F0B54746CE4691463D +:107B8000202280B5060000680F00C38C00259046B7 +:107B90008DB0002B52D0038C022B52D0023B5A00E6 +:107BA000D21892006B0108339B1842460092446839 +:107BB000F16804AAA047002806D0842040420DB0F6 +:107BC0000CBC90469946F0BD3368049A1B8C022B7E +:107BD00039D0023B9342F0D909A800F063FB00289A +:107BE00020D13068079A838C9A42E6D8069B03938B +:107BF0009A42E2D3049B05990393002B0DD1048C88 +:107C0000C38C022C21D0023CA44664006444A4002E +:107C10005B0108331B199942CFD3C08B00F036FBB0 +:107C20000028CAD10C22390009A8F8F793FD0028D2 +:107C30000DD030680135C38CAB42ACD88C204042AB +:107C4000BDE70C22AEE70123C4E70C24E0E74B4676 +:107C50001D60B4E730B50400006883B0036898473E +:107C6000002801D003B030BD2000FFF7D9FE002866 +:107C700020D12200082301CA009345680023E1684F +:107C8000A847002816D1237A012B13D12068273367 +:107C9000627AC35C9A420DD0036921699847002833 +:107CA000E0D123681A8C022ADCD9180061681A69AD +:107CB0009047D7E784204042D4E7C046282230B519 +:107CC000437A04000133DBB24372006883B0825C04 +:107CD0009A4221D008230093856800232169221D40 +:107CE000A847002804D12068C3689847002801D01D +:107CF00003B030BD2369E1682068E3602161036956 +:107D000098470028F4D123681A8C022AF0D9180069 +:107D100061681A699047EBE700236372DAE7C046AF +:107D20000C2330B5040089B0006800934568E16811 +:107D3000043B05AAA847002823D1236805991A8C7B +:107D400091422FD2079A0292069A0392D88B029AF6 +:107D5000039900F09BFA002824D1059B002202938E +:107D6000012B10D9069B029393421BD12068E36834 +:107D70002169079DC48B0092641BA41A0194FFF72C +:107D800091FB09B030BD2368198CDA8C022907D029 +:107D900002394B005B189B0052010832D218E1E710 +:107DA0000C23F9E798204042EBE7C04670B5050088 +:107DB00000681400028C82B0022A3ED0023A5300BE +:107DC0009A18920049010B0008339B182022009258 +:107DD00046682200E968B047061E2BD12B6822684E +:107DE0001B8C022B2BD0023B9A422CD22000143049 +:107DF00000F058FA00281DD12868E268838C9A4266 +:107E000021D8A3689A421ED323686168002B0CD145 +:107E1000058CC38C022D14D0023D6C006419A400A3 +:107E20005B0108331B1999420DD3C08B00F02EFA69 +:107E3000002808D1300002B070BD0C22C2E7012337 +:107E4000D2E70C24ECE798267642F3E770B51400ED +:107E50000C2205004B00006882B05B1800929B006A +:107E600022004668E9680833B047002812D12B6821 +:107E700021681A8C91421ED2D88BA268616800F0EA +:107E800005FA002817D122680023012A04D9626864 +:107E90009A4210D102B070BD2A68118CD38C02298D +:107EA00007D002394A00521892005B0108339B1830 +:107EB000EDE70C22F9E798204042EBE7F0B5574692 +:107EC0004E464546DE46E0B58DB0039308239946FD +:107ED000002398460C3304004F468A469B4646468C +:107EE0009146189D00681AE020682A68038C9A421F +:107EF00000D384E0AA68C08B696800F0C7F9021E4D +:107F00001DD12B682068012B45D90023696899424F +:107F100000D074E0AB680C37994554D90136038C16 +:107F2000022B32D0023B9E4232D25B460093436822 +:107F30002A009846E1683B00C0470028D4D0842638 +:107F400020687642C38C002B12D0002509E009A8D6 +:107F500000F0A8F900282DD123680135DB8C9D4263 +:107F600006D22900200004AAFFF720FF0028EED047 +:107F7000244B169A13608E26764230000DB03CBC1E +:107F800090469946A246AB46F0BD01239E42CCD313 +:107F90008E267642D6E7018CC38C022908D002399E +:107FA0008C464900614489005B0108335B18ADE7EA +:107FB0000C21F9E7169B1D60002EDCD1114B9D4270 +:107FC000DBD18E3ED9E7B04641461600179A4F46A0 +:107FD0001160C28B5146D31A179A10005360D760B4 +:107FE00014300C22F8F7C4FB0023179A2068936022 +:107FF0001300039A1A61AB68DF1BAF60A2E7842607 +:1080000076429FE7FFFF0000F0B5C64600B58EB090 +:108010000500FFF705FD0026002800D12E6928681D +:10802000310003699847041E60D12868714271418C +:1080300003699847041E59D168722868018C022987 +:1080400059D101230C226B602B722B61EC60C38C25 +:1080500008325B019B180493C28B0121D31A05934C +:10806000002303930C3300938468043B03AAA047C6 +:10807000041E3BD1049028680026C38B0593038C13 +:10808000022B0DD0033B9E4262D20369F11C98473C +:10809000044328680136038C022BF3D1002C23D132 +:1080A0002022002106A8F8F77FFB28680024C38C53 +:1080B0002026002B13D12DE002394B0059188900DE +:1080C0006301083300965B188768296906AAB847D8 +:1080D00000281CD128680134C38CA3421AD9018C12 +:1080E0000229E9D10C21EBE79224644220000EB072 +:1080F00004BC9046F0BD022302396B604A00013B8C +:108100002B722B61EC605218C38C9200A0E7842480 +:108110006442EBE728226B7A0133DBB26B72825C3C +:108120009A4212D0082300938468002329692A1DEB +:10813000A0470028EBD12868C3689847041ED5D112 +:10814000EB682A692B61EA60D0E700236B72E9E7EC +:10815000002CC9D114260C270FE0033B9C429FD270 +:10816000E31C0097039383682969984603AA3300A8 +:10817000C04701340C360028C9D12868038C022B73 +:10818000EBD18DE7002A00D041607047F0B5CE46B4 +:10819000474680B504000D0087B0002926D1036949 +:1081A000006813600C23009386682169043BB04784 +:1081B000002850D12669E768691C4D006D18AD0094 +:1081C0002A0020680832018C022942D002394B0073 +:1081D0005B189B005D1B31003B0001950092FFF78F +:1081E00061F907B00CBC90469946F0BD4B005B1896 +:1081F0000C2100689B000091984689468668216999 +:108200000833B047002826D10021200003AA2669A0 +:10821000E768FFF71BFE00281DD14B46206800933E +:108220008368216999460396082303AAC847002852 +:1082300011D1012DC0D943460C3B019314231422C4 +:10824000009331003B002068FFF72CF90028B3D0E1 +:10825000C7E70C23BEE784204042C2E730B50400E4 +:10826000006883B0058C022D0ED0023D6B005D19B5 +:10827000AD0049010B002169202408330094846873 +:108280005B19A04703B030BD0C25F2E7814205D849 +:10829000401A90428041862398437047872040428D +:1082A000FBE7C0460378002B24D14378002B21D173 +:1082B0008378002B1ED1C378002B1BD10379002BB0 +:1082C00018D14379002B15D18379002B12D1C379B2 +:1082D000002B0FD1037A002B0CD1437A002B09D14C +:1082E000837A002B06D1C07A434258418B23404207 +:1082F000984370470020FCE70020704710B5040049 +:108300001000E28B5143C9186369029A5918F8F7B3 +:108310002FFA002010BDC04610B50C001100C28B12 +:1083200040695443E418029A0019F8F721FA002032 +:1083300010BDC046002070470B00282110B5C28B2D +:10834000415C53434069C018F8F72EFA002010BD75 +:108350005883001084830010F9820010FD82001001 +:10836000198300103583001039830010F02A0108AA +:1083700000501C00000200100400010000020A006E +:10838000FF000000F9820010FD8200101983001028 +:108390003583001039830010F06A010800001C00CA +:1083A000000200100500010028080D00FF00000079 +:1083B00000000000000000000000000000000000BD +:1083C000024A034BD35803600020704740E0010885 +:1083D00004140000F0B5DE4657464E464546E0B56B +:1083E000A9B000F013F9002806D029B03CBC904693 +:1083F0009946A246AB46F0BD80218048890102F033 +:108400000DF805F09BFA0028EFD112AB18002822D6 +:1084100000219946F8F7C8F901235B429B46784B47 +:108420005C4698468021012009064042FDF7D2FBB8 +:10843000102318420BD018001CA9FDF7CDFB002813 +:1084400006D11C99002904DA8B1C2EDAFEE7FEE720 +:10845000FEE7002928D128234A461D98FDF7BEFBD8 +:1084600028287ED14B461C683F2C00D98AE0202268 +:10847000002102A8F8F798F9202200210AA8F8F7AD +:1084800093F91CAB1A0000930423D1691D00013B32 +:1084900000290FD1043A002BF7D184256D42290021 +:1084A0001D98FDF79FFBBDE7D0E701001D98FDF784 +:1084B00099FBB7E74B46029328230393012D28D05D +:1084C00002ABA34601261C00AA461CAF03217B6910 +:1084D000A020DA1C8A43414640010958401A8242D2 +:1084E00075D840464518A0205218414640010A5010 +:1084F0001D9A3100019201982A00FDF76FFB7B69FC +:108500000136A560E360043708345645DED15C4689 +:10851000554604261CABDA6A3700013E002A34D1E6 +:10852000043B002EF7D142461E9B02A800930099FF +:10853000344BA246D150344AA300D7582900330007 +:108540000AAAB8470AAB050000271C00B7420DD0A5 +:108550003900636822681D98FDF742FB0137083433 +:10856000F4E784256D42631C99D080E7A0220021A6 +:108570004346404652019950224B5446C150F8F7A9 +:1085800013F98CE70124644287E7A02243460320C5 +:1085900052019A5883460023A446AA460AA908E035 +:1085A00045460133AD180D604C6012180831BB42CE +:1085B0001BD0009D5E462C6A04350095A025E01C6A +:1085C0006D01B043AD1AA842EAD9644600E05C46AA +:1085D000A0220021434640468D2552019950094B67 +:1085E0006D42C150F8F7E0F859E7A020414640013C +:1085F000644655461E000A5095E7C04640C0010833 +:1086000040E0010804140000E4D80110862210B5EF +:10861000002103485201F8F7C7F8002010BDC046FA +:1086200048F401080023F0B583B0060001A80D004E +:1086300014000193FFF7C4FE00282DD12B68002BF6 +:108640004AD1002C4BD0274B20601968002926D036 +:10865000862292009A58002A36D08622D2009A5852 +:10866000002A33D0C922D2009A58002A30D086225C +:1086700012019A58002A25D01B4A9A58002A29D05C +:10868000C92212019A58002A08D0184A07219A587C +:10869000002A04D08520404203B0F0BD06214A01E3 +:1086A0005218520001275218D20094469F509F182A +:1086B000019A01317A60624610329B18BE602960CF +:1086C0002360E9E70421EAE70121E8E70221E6E780 +:1086D0000321E4E70521E2E789204042DCE7872027 +:1086E0004042D9E748F40108780A0000A80E0000CB +:1086F000F0B5C646002300B582B00568804601A8E3 +:108700000193FFF75DFE071E25D1013D072D2BD8F4 +:108710006C0163195B00164E5B19DB00F258012AED +:1087200022D1F2185168019881421DD11033F018FE +:1087300093680022013B032B12D90021F8F734F88B +:1087400000234246641964006519ED0073517519E0 +:10875000AB606B601360380002B004BC9046F0BDA3 +:10876000044A9B009A58E8E787277F42F3E7C04610 +:1087700048F40108E4D90110002370B582B0050067 +:1087800001A80E0014000193FFF71AFE002816D16D +:10879000013E072E15D87101891949000A4A891925 +:1087A000C9008B58012B0CD153189E68AE4208D1DA +:1087B0005B68019DAB4204D110318918216002B081 +:1087C00070BD89204042FAE748F40108F0B5CE4672 +:1087D00047461400002280B583B0019201292AD1B6 +:1087E000022B28D14368282B25D16368042B22D182 +:1087F00003682768DE68A36831009846E3680120B3 +:108800003E6001AA9946FFF7B7FF051E05D0280074 +:1088100003B00CBC90469946F0BD23004A46414641 +:1088200001983E600C3304F005F9051EEFD03800C6 +:10883000FFF75EFFEBE782256D42E8E7F0B5002425 +:1088400083B00194022921D1012B1FD14368282B29 +:108850001CD15368042B19D103681568D968866840 +:10886000C76801AA01202960FFF786FF041E02D015 +:10887000200003B0F0BD3A003100019804F0B8F8D0 +:10888000041EF5D02800FFF733FFF1E7822464428D +:10889000EEE7C046F0B5002483B0009401292AD148 +:1088A000012B28D15368042B25D14368282B22D1D2 +:1088B00003681668D9689F680191DD880021280047 +:1088C00000F068FB041E02D0200003B0F0BD6A4631 +:1088D000012001A9FFF7A6FE041EF5D1019B3A0075 +:1088E00029000098336004F079F8041EECD03000C1 +:1088F000FFF7FEFEE8E782246442E5E7F0B50024D6 +:1089000083B0009401292AD1012B28D15368042B6C +:1089100025D14368282B22D103681668D9689F683F +:108920000191DD880021280000F034FB041E02D0F4 +:10893000200003B0F0BD6A46012001A9FFF772FED6 +:10894000041EF5D1019B3A0029000098336004F021 +:108950004AF8041EECD03000FFF7CAFEE8E7822494 +:108960006442E5E7F0B5D6464F464646140000227D +:10897000C0B584B00392022930D1022B2ED14368B6 +:10898000282B2BD16368042B28D103682668D9686B +:10899000C36887689846A36801209946E3683160F8 +:1089A000E26003AA9A46FFF7E7FE051E06D02800FC +:1089B00004B01CBC90469946A246F0BD53460C3408 +:1089C000009342464B4639000398019404F05EF848 +:1089D000051EECD03000FFF78BFEE8E782256D42E4 +:1089E000E5E7C046F0B5C6461400002200B582B0E7 +:1089F000019201292CD1022B2AD14368282B27D19F +:108A00006368042B24D103682668D968E368A768E3 +:108A100001203160E26001AA9846FFF7ADFE051E15 +:108A200004D0280002B004BC9046F0BD23004246AA +:108A3000390001980C3304F05DF805003000002D7A +:108A400003D1FFF755FE0500EBE7FFF751FEE8E71E +:108A500082256D42E5E7C04630B5002483B001941D +:108A6000012922D1012B20D14368282B1DD1536825 +:108A7000042B1AD103681568D9680120296001AA5E +:108A8000FFF77AFE002802D0200003B030BD019825 +:108A900003F0D6FE04002800002C03D1FFF728FEC7 +:108AA0000400F1E7FFF724FEEEE782246442EBE7DF +:108AB000862040427047C046862040427047C046EC +:108AC00070B5002482B00094012923D1012B21D15B +:108AD0005368042B1ED14368282B1BD101681568ED +:108AE000CB688E6801936A4603202B6001A9FFF7CB +:108AF00099FD041E02D0200002B070BD019B310020 +:108B000000982B6002F01AFF041EF4D02800FFF733 +:108B1000EFFDF0E782246442EDE7C046F0B50024A3 +:108B200083B00194022921D1012B1FD14368282B46 +:108B30001CD15368042B19D103681568D96886685D +:108B4000C76801AA03202960FFF716FE041E02D0A1 +:108B5000200003B0F0BD3A003100019802F042FF5E +:108B6000041EF5D02800FFF7C3FDF1E7822464421C +:108B7000EEE7C046F0B5C6461400002200B582B04C +:108B8000019201292CD1022B2AD14368282B27D10D +:108B90006368042B24D103682668D968E368A76852 +:108BA00003203160E26001AA9846FFF7E5FD051E4B +:108BB00004D0280002B004BC9046F0BD2300424619 +:108BC000390001980C3302F015FF05003000002D2C +:108BD00003D1FFF78DFD0500EBE7FFF789FDE8E71F +:108BE00082256D42E5E7C046F0B5002483B00194CC +:108BF000022926D1012B24D14368282B21D1536887 +:108C0000042B1ED103681568D9688668C76801AA55 +:108C100003202960FFF7B0FD041E02D0200003B03E +:108C2000F0BD3A003100019803F044F90400280037 +:108C3000002C03D1FFF75CFD0400EFE7FFF758FDC0 +:108C4000ECE782246442E9E730B5002483B0019464 +:108C5000012922D1012B20D14368282B1DD1536833 +:108C6000042B1AD103681568D9680320296001AA6A +:108C7000FFF782FD002802D0200003B030BD01982C +:108C800002F0F4FD04002800002C03D1FFF730FDB2 +:108C90000400F1E7FFF72CFDEEE782246442EBE7E6 +:108CA00030B5002483B000940194012924D1012B14 +:108CB00022D14368282B1FD15368042B1CD1036891 +:108CC000156803206A46D968FFF756FD041E02D0D6 +:108CD000200003B030BD2900032001AAFFF7A2FC49 +:108CE000041EF5D10199009803F004F9041EEFD099 +:108CF0002800FFF7FDFCEBE782246442E8E7C0466A +:108D0000862040427047C046862040427047C04699 +:108D1000F0B5C646002400B582B0009401292FD1D9 +:108D2000012B2DD15368042B2AD14368282B27D13E +:108D300005680021EB6817680193EE88AB68300086 +:108D4000984600F027F9041E04D0200002B004BCAD +:108D50009046F0BDEB686A4602203B6001A9FFF730 +:108D600061FC041EF1D1019B4246310000983B603A +:108D700003F028FA041EE8D03800FFF7B9FCE4E756 +:108D800082246442E1E7C046F0B5C646002400B53F +:108D900082B0009401292FD1012B2DD15368042BCF +:108DA0002AD14368282B27D105680021EB68176872 +:108DB0000193EE88AB683000984600F0EBF8041E93 +:108DC00004D0200002B004BC9046F0BDEB686A46B7 +:108DD00002203B6001A9FFF725FC041EF1D1019B95 +:108DE0004246310000983B6003F0F1F9041EE8D0E0 +:108DF0003800FFF77DFCE4E782246442E1E7C046E7 +:108E0000F0B5002483B00194022921D1012B1FD198 +:108E10004368282B1CD15368042B19D103681568AB +:108E2000D9688668C76801AA02202960FFF7A4FCF8 +:108E3000041E02D0200003B0F0BD3A0031000198BA +:108E400003F0CAF9041EF5D02800FFF751FCF1E742 +:108E500082246442EEE7C046F0B5C6461400002204 +:108E600000B582B0019201292CD1022B2AD143688E +:108E7000282B27D16368042B24D103682668D9687E +:108E8000E368A76802203160E26001AA9846FFF714 +:108E900073FC051E04D0280002B004BC9046F0BD4F +:108EA00023004246390001980C3303F0C5F9050050 +:108EB0003000002D03D1FFF71BFC0500EBE7FFF7A7 +:108EC00017FCE8E782256D42E5E7C046F0B50024CF +:108ED00083B00194022926D1012B24D14368282B89 +:108EE00021D15368042B1ED103681568D9688668A0 +:108EF000C76801AA02202960FFF73EFC041E02D0C9 +:108F0000200003B0F0BD3A003100019803F0C5F92C +:108F100004002800002C03D1FFF7EAFB0400EFE770 +:108F2000FFF7E6FBECE782246442E9E730B5002472 +:108F300083B00194012922D1012B20D14368282B31 +:108F40001DD15368042B1AD103681568D968022013 +:108F5000296001AAFFF710FC002802D0200003B00E +:108F600030BD019803F002F804002800002C03D162 +:108F7000FFF7BEFB0400F1E7FFF7BAFBEEE7822440 +:108F80006442EBE7862040427047C046862040425C +:108F90007047C046002330B583B0040001A80D001F +:108FA0000193FFF70DFA002800D078E0544B9A792E +:108FB000002A03D09A88A24200D182E09A7B002A3C +:108FC00003D09A89A24200D171E09A7D002A03D091 +:108FD0009A8AA24200D176E09A7F002A03D09A8B27 +:108FE000A24200D173E026229A5C002A03D09A8C18 +:108FF000A24200D169E02E229A5C002A03D09A8D09 +:10900000A24200D167E036229A5C002A02D09A8EF2 +:10901000A2425ED03E229A5C002A02D09A8FA242DF +:109020005DD046229A5C002A03D044229A5AA2427A +:1090300053D04E229A5C002A33D156229A5C002AE1 +:1090400003D054229A5AA2424BD05E229A5C002A44 +:1090500003D05C229A5AA24245D066229A5C002A2A +:1090600003D064229A5AA2423FD06E229A5C002A10 +:1090700003D06C229A5AA24239D076229A5C002AF6 +:1090800003D074229A5AA24233D07E229A5C002ADC +:1090900003D07C229A5AA2422DD08820404203B0AD +:1090A00030BD4C229A5AA242C7D1092200E00122C7 +:1090B000D1005B5801998B421FD1002DEFD02A605F +:1090C000EDE70022F4E70222F2E70422F0E70322B0 +:1090D000EEE70622ECE70522EAE70822E8E70722A6 +:1090E000E6E70A22E4E70B22E2E70C22E0E70D22A2 +:1090F000DEE70E22DCE70F22DAE785204042CEE7EA +:1091000008050208304B9A79002A3BD09A7B002A46 +:109110003CD09A7D002A3DD09A7F002A3CD026225E +:109120009A5C002A3AD02E229A5C002A38D0362245 +:109130009A5C002A36D03E229A5C002A34D046221D +:109140009A5C002A32D04E229A5C002A30D05622F5 +:109150009A5C002A2ED05E229A5C002A2CD06622CD +:109160009A5C002A14D06E229A5C002A26D07622BD +:109170009A5C002A24D07E229B5C002B22D08D207A +:1091800040427047002303600020FAE70123FAE71A +:109190000C23F8E70223F6E70323F4E70423F2E7BE +:1091A0000523F0E70623EEE70723ECE70823EAE7C9 +:1091B0000923E8E70A23E6E70B23E4E70D23E2E7C8 +:1091C0000E23E0E70F33DEE70805020830B583B071 +:1091D000040001A80D00FFF7F3F8002807D1054AA5 +:1091E0000199E3009950D31801229D809A7103B030 +:1091F00030BDC04608050208862040427047C04680 +:10920000862040427047C046F0B5CE46474680B5FE +:109210001D0083B0032900D06DE0012B6BD14368A2 +:10922000282B68D1C368242B65D15368022B62D1E7 +:109230000369404C98464369876899460023019327 +:10924000A3791668002B5BD0A37B002B3DD0A37DB8 +:10925000002B57D0A37F002B56D02623E35C002B96 +:1092600054D02E23E35C002B52D03623E35C002B3A +:1092700050D03E23E35C002B4ED04623E35C002B12 +:109280004CD04E23E35C002B4AD05623E35C002BEA +:1092900034D05E23E35C002B44D06623E35C002BD8 +:1092A00012D06E23E35C002B3ED07623E35C002BD0 +:1092B0003CD07E23E35C002B3AD08D20404203B0AB +:1092C0000CBC90469946F0BD0C2501A8FFF778F834 +:1092D0000028F4D133004A464146380002F0CFF965 +:1092E0000028ECD1019BED00635133886419A38001 +:1092F0000123A371E3E782204042E0E70A25E4E787 +:109300000025E2E70225E0E70325DEE70425DCE7A8 +:109310000525DAE70625D8E70725D6E70825D4E7A7 +:109320000925D2E70B25D0E70D25CEE70E25CCE7A2 +:109330000F25CAE708050208022901D1012B02D036 +:109340008220404270474368282BF9D1C068042826 +:10935000F6D15368023B5A1E93415B42184086384F +:10936000F0E7C04670B51D0082B0012900D0A4E02E +:10937000002B00D0A1E04368282B00D09DE00368BB +:1093800001A8DE880195FFF71BF8002800D07CE0DB +:10939000584CA379002B03D0A388B34200D17AE0C4 +:1093A000A37B002B03D0A389B34200D188E0A37D27 +:1093B000002B03D0A38AB34200D183E0A37F002B0C +:1093C00003D0A38BB34200D17EE02623E35C002BC5 +:1093D00003D0A38CB34200D178E02E23E35C002BB2 +:1093E00003D0A38DB34200D172E03623E35C002B9F +:1093F00003D0A38EB34200D16CE03E23E35C002B8C +:1094000045D14623E35C002B04D04423E35AB34206 +:1094100000D163E04E23E35C002B03D04C23E35ADE +:10942000B3425DD05623E35C002B03D05423E35AB0 +:10943000B34257D05E23E35C002B03D05C23E35A96 +:10944000B34251D06623E35C002B03D06423E35A7C +:10945000B3424BD06E23E35C002B03D06C23E35A62 +:10946000B34245D07623E35C002B03D07423E35A48 +:10947000B34231D07E23E35C002B04D07C23E35A3B +:109480000F25B34207D08820404202B070BDA38FA1 +:10949000B342B6D107258520ED006359019A4042B9 +:1094A0009342F2D1300004F002FB0028EDD10023FA +:1094B00060516419A080A371E7E782204042E4E78D +:1094C0000125E8E70225E6E70325E4E70425E2E7CE +:1094D0000525E0E70625DEE70E25DCE70825DAE7C7 +:1094E0000925D8E70A25D6E70B25D4E70C25D2E7CE +:1094F0000D25D0E70805020870B51D0082B00129CE +:1095000000D0A4E0002B00D0A1E04368282B00D0BD +:109510009DE0036801A8DE880195FEF751FF002851 +:1095200000D07CE0584CA379002B03D0A388B34231 +:1095300000D17AE0A37B002B03D0A389B34200D1F2 +:1095400088E0A37D002B03D0A38AB34200D183E03F +:10955000A37F002B03D0A38BB34200D17EE0262350 +:10956000E35C002B03D0A38CB34200D178E02E2320 +:10957000E35C002B03D0A38DB34200D172E036230D +:10958000E35C002B03D0A38EB34200D16CE03E23FA +:10959000E35C002B45D14623E35C002B04D044233D +:1095A000E35AB34200D163E04E23E35C002B03D0C7 +:1095B0004C23E35AB3425DD05623E35C002B03D027 +:1095C0005423E35AB34257D05E23E35C002B03D00D +:1095D0005C23E35AB34251D06623E35C002B03D0F3 +:1095E0006423E35AB3424BD06E23E35C002B03D0D9 +:1095F0006C23E35AB34245D07623E35C002B03D0BF +:109600007423E35AB34231D07E23E35C002B04D0B1 +:109610007C23E35A0F25B34207D08820404202B092 +:1096200070BDA38FB342B6D107258520ED006359E5 +:10963000019A40429342F2D1300001F071FF0028BC +:10964000EDD1002360516419A080A371E7E7822067 +:109650004042E4E70125E8E70225E6E70325E4E7E1 +:109660000425E2E70525E0E70625DEE70E25DCE731 +:109670000825DAE70925D8E70A25D6E70B25D4E738 +:109680000C25D2E70D25D0E70805020810B5012901 +:109690000DD1012B0BD14368282B08D15368242B03 +:1096A00005D103681168D88801F054FF10BD8220ED +:1096B0004042FBE710B501290CD1012B0AD14368C8 +:1096C000282B07D15368242B04D1106801F037FFF1 +:1096D000002010BD82204042FBE7C04610B51400B8 +:1096E00001290BD1012B09D14368282B06D1006831 +:1096F000131DC08806CC01F097FF10BD82204042A8 +:10970000FBE7C04610B5140001290BD1012B09D18C +:109710004368282B06D10068131DC08806CC01F0D1 +:1097200098FF10BD82204042FBE7C046F0B5C64618 +:1097300000B51D0082B002296AD1012B68D14368AF +:10974000282B65D15368022B62D1C368242B5FD1CB +:1097500003683F4CDF8883681668984600230193AE +:10976000A379002B59D0A37B002B3CD0A37D002BE9 +:1097700055D0A37F002B54D02623E35C002B52D07E +:109780002E23E35C002B50D03623E35C002B4ED01D +:109790003E23E35C002B4CD04623E35C002B4AD0F5 +:1097A0004E23E35C002B48D05623E35C002B32D0E1 +:1097B0005E23E35C002B42D06623E35C002B11D0D8 +:1097C0006E23E35C002B3CD07623E35C002B3AD085 +:1097D0007E23E35C002B38D08D20404202B004BCD5 +:1097E0009046F0BD0C2501A8FEF7EAFD0028F5D152 +:1097F00032004146380001F06DFF0028EED1019B98 +:10980000ED00635133886419A3800123A371E5E758 +:1098100082204042E2E70A25E5E70025E3E702254A +:10982000E1E70325DFE70425DDE70525DBE706257E +:10983000D9E70725D7E70825D5E70925D3E70B257D +:10984000D1E70D25CFE70E25CDE70F25CBE7C046A5 +:1098500008050208F0B51D0083B0022964D1012B70 +:1098600062D14368282B5FD1C368242B5CD1536835 +:10987000022B59D100233C4C0193A37916688768C9 +:10988000002B56D0A37B002B3AD0A37D002B52D0C7 +:10989000A37F002B51D02623E35C002B4FD02E2337 +:1098A000E35C002B4DD03623E35C002B4BD03E23F2 +:1098B000E35C002B49D04623E35C002B47D04E23CA +:1098C000E35C002B45D05623E35C002B2FD05E23B6 +:1098D000E35C002B3FD06623E35C002B0FD06E23AC +:1098E000E35C002B39D07623E35C002B37D07E235A +:1098F000E35C002B35D08D20404203B0F0BD0C2539 +:1099000001A8FEF75DFD0028F7D13100380003F013 +:1099100043FF0028F1D1019BED00635133886419A6 +:10992000A3800123A371E8E782204042E5E70A25EE +:10993000E6E70025E4E70225E2E70325E0E7042562 +:10994000DEE70525DCE70625DAE70725D8E7082561 +:10995000D6E70925D4E70B25D2E70D25D0E70E255C +:10996000CEE70F25CCE7C04608050208F0B5DE4675 +:1099700057464E464546E0B514008A1E8DB0012A72 +:1099800047D8012B45D14368282B42D105686B6A23 +:10999000EE8898468368AF680993C3689946236840 +:1099A0009A4663689B46032911D000230B930A93C0 +:1099B0000023002130006360FFF7ECFA002812D08A +:1099C0000DB03CBC90469946A246AB46F0BD03693B +:1099D00000210A93436930000B9300236360FFF773 +:1099E000D9FA0028ECD15B460593534604934B46C5 +:1099F0002A000393099B043402930B9B39000193C3 +:109A00000A9B3000009314324346069403F0BEF8DC +:109A1000D6E782204042D3E7F0B5DE4657464E46B1 +:109A20004546E0B514008A1E8DB0012A47D8012BA7 +:109A300045D84368282B42D105686B6AEE88984662 +:109A40008368AF680993C368994623689A46636838 +:109A50009B46032911D000230B930A930023002176 +:109A600030006360FFF796FA002812D00DB03CBCBE +:109A700090469946A246AB46F0BD036900210A9381 +:109A8000436930000B9300236360FFF783FA0028DB +:109A9000ECD15B460593534604934B462A0003934F +:109AA000099B043402930B9B390001930A9B3000FD +:109AB000009314324346069403F0DAF8D6E7822086 +:109AC0004042D3E7862040427047C046862040424D +:109AD0007047C046862040427047C04686204042BC +:109AE0007047C046862040427047C04686204042AC +:109AF0007047C046862040427047C046862040429C +:109B00007047C046862040427047C046862040428B +:109B10007047C046F0B5D6464F464646C0B514001D +:109B200084B0022927D1012B25D14368282B22D1CB +:109B300003688768DD889E68C368002198461368BB +:109B40002800994653689A46FFF724FA002805D062 +:109B500004B01CBC90469946A246F0BD5346019302 +:109B60004B46043400933A004346310028000294E7 +:109B700002F0CCFBECE782204042E9E7F0B5CE46AC +:109B8000474680B583B0032923D1002B21D14368F8 +:109B9000282B1ED103688668DC889D680369C76826 +:109BA00098464369002120009946FFF7F3F9002801 +:109BB00004D003B00CBC90469946F0BD4B460193CF +:109BC00043463200009329003B00200002F0A4FC31 +:109BD000EFE782204042ECE7F0B54E464546DE46D0 +:109BE0005746E0B515008A1E04000E0095B0012A04 +:109BF00054D8012B52D14368282B4FD1036824221B +:109C0000DF889B680021994683689A46C3680BA841 +:109C10009B462B6807936B689846F6F7C5FD032EA5 +:109C200031D00024002600213800FFF7B3F90028C6 +:109C300006D015B03CBC90469946A246AB46F0BD56 +:109C400038000BA901F086FC0028F2D104AB9B8EF2 +:109C50000BA809930B9B089301F071FC089A114B18 +:109C60001340114A934211D043460393079B043596 +:109C7000029352465B46494638000495019400968B +:109C800002F000FDD5E726696469CCE7099B07333C +:109C9000DB089845E8D28A204042CAE78220404249 +:109CA000C7E7C046FFFFFFEF00000160F0B5DE46EA +:109CB00057464E464546E0B514008A1E89B0012A33 +:109CC00036D8012B34D14368282B31D103688768FB +:109CD000DD889E68C36898462368994663689A46FB +:109CE000032920D000239B46079300212800FFF77B +:109CF00051F9002806D009B03CBC90469946A246CE +:109D0000AB46F0BD534603934B4602935B4601932B +:109D1000079B043400933A00434631002800049422 +:109D200002F026FDE7E70369079343699B46DCE7FA +:109D300082204042DFE7C04670B5002482B0009424 +:109D4000012927D1012B25D15368042B22D1436847 +:109D5000282B1FD103681668D9686A460191042030 +:109D600001A99D68FEF75EFC041E06D1019B3360CD +:109D70000A4B9D4204D1009B1D60200002B070BDC3 +:109D80002900009803F0F8FB041EF6D03000FEF71F +:109D9000AFFCF2E782246442EFE7C046000F00B058 +:109DA00030B583B001291AD1012B18D14368282B73 +:109DB00015D15368042B12D10024036815680420C0 +:109DC000D96801AA0194FEF7D7FC002802D02C60C4 +:109DD00003B030BD2900019803F04CF9F8E7822068 +:109DE0004042F5E710B582B0012915D1002B13D1FF +:109DF0004268282A10D102680420D168146901AA97 +:109E00000193FEF7B9FC002801D002B010BD21007B +:109E1000019803F039F9F8E782204042F5E7C0469F +:109E2000F0B5C64600B582B0022949D1002B47D112 +:109E30004268282A44D1026886689588D168C76834 +:109E40006A4604200093FEF797FC041E0DD1009B88 +:109E5000984642461F4B12689A420BD03B00320094 +:109E60002900404603F0AEFB0400200002B004BC11 +:109E70009046F0BD184B9D4225D101A8FEF7A0FAEF +:109E8000041EF2D18623019A5B009A4201D10C3B59 +:109E900001933D1D2900012000F0F2FA4346D861EC +:109EA000002813D0042201A9F6F762FC4346DB69BF +:109EB0003A00181D3100F6F75BFC43461D62D4E7FB +:109EC00082246442D1E787246442CEE78D24644231 +:109ED000CBE7C046000F00B00102000030B583B0F0 +:109EE000012917D1012B15D14368282B12D130CA73 +:109EF000036801AAD968002304200193FEF73CFC03 +:109F0000002801D003B030BD2A002100019803F0E1 +:109F1000C9F8F7E782204042F4E7C04670B582B046 +:109F200001291ED1002B1CD14268282A19D10268B0 +:109F30000021D48896882000D5680193FFF72AF87D +:109F4000002801D002B070BD290001AA0430FEF73C +:109F500013FC0028F6D122003100019803F039FBF0 +:109F6000F0E782204042EDE7F0B585B002294AD102 +:109F7000012B48D14368282B45D1C368242B42D1FB +:109F80005368022B3FD103688468D96800231568A1 +:109F9000042002AA0293FEF7EFFB002801D005B0CF +:109FA000F0BD03A8FFF7AEF80028F8D102991A4BCC +:109FB0000A689A420AD02A00200003F08DFA00288D +:109FC000EDD129880398FFF701F9E8E78222238B76 +:109FD00092000733DE08934218D20B6A0F009C46AA +:109FE000C937FF37C86900230022614601960097F0 +:109FF0001DF0D8FA00280CD12B00320039002000C7 +:10A0000001F03DFBDBE782204042C8E78D20404263 +:10A01000C5E793204042C2E7000F00B030B583B0DF +:10A0200001293CD1012B3AD14368282B37D1536801 +:10A03000042B34D103681568DC68002321000193E8 +:10A0400004202C6001AAFEF797FB002825D12C6084 +:10A05000019C144B22689A420AD0200002F07AFE3A +:10A06000041E15D02800FEF743FB200003B030BDCE +:10A07000E069002806D00021226AF6F795FBE06926 +:10A0800000F006FA8222002120009200F6F78CFBF5 +:10A090002800FEF72DFB0400E7E70024E5E7822413 +:10A0A0006442E2E7000F00B0F0B5C64600B584B0E8 +:10A0B000022925D1002B23D14268282A20D1026809 +:10A0C0008668D48803939388C76800212000984647 +:10A0D000D568FEF75FFF002803D004B004BC9046AB +:10A0E000F0BD290003AA0430FEF746FB0028F4D196 +:10A0F0003300220041460398009703F091FAECE701 +:10A1000082204042E9E7C04610B5012908D1012B61 +:10A1100006D14368282B03D103CA03F0D5FA10BD3A +:10A1200082204042FBE7C04630B5140085B00229CA +:10A1300013D1012B11D14368282B0ED10568C368B8 +:10A140008268E988A868251D0295656801952468DC +:10A15000009403F0E3FA05B030BD82204042FAE7F4 +:10A1600030B591B004002422002107A8F6F71CFBAB +:10A1700006AB02932823012503930121043B802091 +:10A18000049406950593FBF715FD041E0ADD04AB48 +:10A19000009300210123019502AAFBF70DFD200089 +:10A1A000FBF716FD11B030BD03000D4A1968012000 +:10A1B000914213D10B4AD96991420FD19A688242D8 +:10A1C0000CD8DA68002A02D019698A4206D05A6986 +:10A1D000101E03D09869801A434258417047C04608 +:10A1E00055AA00FF669911EE0F4B70B59E680124C9 +:10A1F000002E0AD03000FFF7D7FF041E12D1F368FB +:10A20000002B0FD13569002D01D1200070BD280031 +:10A21000FFF7CAFF002805D1EB68B34202D12E0038 +:10A220002D69F0E70124F0E788050208F8B53B4EF8 +:10A230000F003468002C1ED0B468002C1BD00028FE +:10A240004AD0002948D00D00454301002800F8F706 +:10A250008FFFB84240D12B1D3ED8032329001D4259 +:10A2600001D099430431F46803E062688A4235D230 +:10A27000A469002CF9D12000F8BDF3603DE00B008B +:10A280002033E3189F60264F203A5A6022691F60EE +:10A29000244FDC601A61DF61002A00D0D36062467F +:10A2A00058619A61002815D083619A69002A00D00C +:10A2B00053612361002301226361A3613369A260BA +:10A2C0006160134223D120342A0000212000F6F7D8 +:10A2D0006BFAD0E7F360E8E70024CCE7A768002F2B +:10A2E00019D1A36960699C46521A232AC7D8012351 +:10A2F000A36063460028C0D08361A369002B00D00F +:10A30000586100236361A3613369DB07DBD5FFF785 +:10A310006BFF0028D7D00120F6F7FCF9880502086A +:10A3200055AA00FF669911EEF8B500285DD03A4EA7 +:10A330003368002B59D0B268002A56D0834203D824 +:10A3400072689B18984202D30120F6F7E3F920388F +:10A350000400FFF729FF0028F6D1A368012BF3D1F1 +:10A36000E568A060002D14D0AB68002B3ED1636877 +:10A370006A682033D3186B6023692B61002B00D0EF +:10A38000DD6027002000202200212C00F6F70CFAC7 +:10A390003D002069002835D08368002B32D16368E6 +:10A3A000426820339B18636062690369A169236175 +:10A3B000002A1DD1002921D1426981696261A16110 +:10A3C000002A1DD09461A269002A00D05461002B9C +:10A3D00000D0DC6020220021F6F7E6F933699B0704 +:10A3E00003D5FFF701FF0028AED1F8BD0500D0E787 +:10A3F0009161A1690029DFD04A61DDE7F160F8E7EA +:10A40000F460E0E7002DE9D1F368A361002B00D0F0 +:10A410005C61F460E2E7C0468805020870B5134E3F +:10A420000D000400002114223000F6F7BDF9104998 +:10A43000104800F035F8232D17D9032320001840C9 +:10A440001C4203D0043D241A451904342A0000217B +:10A450002000F6F7A9F9084B7560B46034602360FA +:10A46000064B203D6560E361F46070BD880502081D +:10A4700029A300102DA2001055AA00FF669911EE25 +:10A4800010B5024B1B68984710BDC04600C00108BC +:10A4900010B5024B1B68984710BDC04604C00108A8 +:10A4A000024B1860024B00201960704700C0010881 +:10A4B00004C001080A0010B5002903D0024B002196 +:10A4C0001B68984710BDC04608C001080200030081 +:10A4D00000B57F322CDAFF234042DB0118404342B3 +:10A4E0007A2800DC5AE18922D201904200D1E0E0D2 +:10A4F000724A934273DA724A934200D1D9E0714AA8 +:10A50000934238DA704A934200D1D4E06F4A9342C2 +:10A5100019DA6F4A93425BD06E4A93420DDA6E4A63 +:10A52000934200D1C1E06D4A934204D1972308E0E1 +:10A53000002800DC2EE1842303E0694A9342FAD12B +:10A5400089235B428DE0674A934227D0664A934253 +:10A5500008DA664A934200D1ABE0654A9342EAD1F9 +:10A560008723EEE7634A934200D19EE0624A93421A +:10A57000E1D19223E5E7614A934200D199E0604A34 +:10A58000934218DA5F4A9342EAD05F4A934207DA6D +:10A590005E4A9342E4D05E4A9342CCD18623D0E710 +:10A5A0005C4A9342FAD05C4A934211D05B4A934290 +:10A5B000C1D18A23C5E75A4A934200D175E0594A6E +:10A5C000934207DA584A9342CAD0584A9342B2D1CA +:10A5D0009523B6E7564A934267D0564ADCE7564A77 +:10A5E0009342C6D0554A934224DA554A93425CD0EE +:10A5F000544A93420FDA544A9342E9D0534A934261 +:10A6000001DA534AD3E7534A93428FD0524A9342D6 +:10A61000A6D0524A88E7524A93424AD0514A9342BE +:10A6200004DA514A934246D0504A97E78022934336 +:10A630004F4A93E74F4A934292D04F4A93421ADAD5 +:10A640004E4A9342AAD04E4980228B420BDAF62121 +:10A6500089015B189343581E834103205B420340EA +:10A66000873B180000BD9343F02292019B18581EAF +:10A670008341853BF5E7434A934200D18EE7424A46 +:10A6800093420BDAEA2292019B1880229343581ED0 +:10A69000834102205B420340863BE2E73B4A934210 +:10A6A00096D03B4A934200D045E7932349E7942351 +:10A6B00047E78D2345E7962343E7C04681BBFFFF6D +:10A6C00080AEFFFF81AEFFFF009EFFFF019EFFFFF8 +:10A6D000009DFFFF019DFFFF009CFFFF809CFFFF8F +:10A6E000809DFFFF809FFFFF819FFFFF809EFFFFF8 +:10A6F000009FFFFF80ADFFFF00AEFFFF80B2FFFFB6 +:10A7000081B2FFFF80B0FFFF81B0FFFF00AFFFFF0E +:10A7100080AFFFFF80B1FFFF00B2FFFF00B1FFFF7E +:10A7200080B4FFFF81B4FFFF80B3FFFF00B4FFFFE1 +:10A7300080BAFFFF00BBFFFF00C2FFFF01C2FFFFA7 +:10A7400080BEFFFF81BEFFFF80BCFFFF81BCFFFF1B +:10A7500000BCFFFF80BDFFFF00BEFFFF00BDFFFF8D +:10A7600080C0FFFF81C0FFFF00BFFFFF80BFFFFF72 +:10A7700000C1FFFF00C5FFFF01C5FFFF80C3FFFF52 +:10A7800081C3FFFF80C6FFFF81C6FFFF00C7FFFF39 +:10A7900080C7FFFF02007A3200DAA9E618007A309B +:10A7A0007A2800D9C7E6F8F7CFFC80FFC6FEC6FEC0 +:10A7B000C6FEC6FEC6FEC6FEC6FEF9FEC6FE80FF8B +:10A7C000C6FEC1FEC6FE04FFC6FE84FFC6FEDBFE5B +:10A7D000C6FEDBFEC6FEDBFEC6FEDBFEC6FEDBFE05 +:10A7E000C6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FE49 +:10A7F000C6FE13FFC6FECBFEC6FEC6FEDBFEC6FED1 +:10A80000C6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FE28 +:10A81000C6FEC6FEC6FEC6FEC6FEC6FEC6FE82FF5B +:10A82000C6FEC6FE82FF82FFC6FE82FF80FFF9FEE3 +:10A8300080FFF9FE80FF82FF80FFF9FE80FFC6FEE9 +:10A8400080FFC6FE80FFC6FE80FFC6FE80FFDBFEE7 +:10A8500080FFF9FE80FFF9FEF9FEF9FEC6FEF9FE63 +:10A86000C6FEC6FEC6FEC6FEC6FEC6FE80FFF9FEDA +:10A8700080FFF9FEC6FEDBFE80FF13FF80FF84FF32 +:10A8800013FFDBFEDBFEDBFEC6FEDBFEC6FE04FFC7 +:10A89000C6FEDBFEC6FEDBFEC6FEE4FEC6FE5CFFB9 +:10A8A0000300F0B588423AD006001F4A1F4C1640FC +:10A8B000A64205D01E4D1F4F05400020BD422ED19F +:10A8C0000A40A24205D01A4D1A4F00200D40BD4249 +:10A8D00025D11800FF254840A84321D1A64204D025 +:10A8E000134D144E1D40B54208D1DEB2002E05D0E6 +:10A8F00080256D043543104EB54213D0A24204D0DA +:10A900000B4A0C4C0A40A24209D1C9B2002909D015 +:10A91000802252041143084A914200D11800F0BD30 +:10A920000020FCE70800FAE700FFFEFF000002102D +:10A9300000FFFCFF00000410FF000001FC2270B5C6 +:10A940000C005200002105001030F5F72DFFFF210B +:10A9500022002B4B2B488A432340834202D02A4BB0 +:10A960009A4229D10C408021284B49042143CB181D +:10A97000022B36D9264BCB18012B37D9254B9942C0 +:10A9800036D0254B99421AD0244B994227D0244BDC +:10A99000994233D0234B99422AD0234B994229D054 +:10A9A000224B994224D0224B994223D0214B9942E9 +:10A9B00022D0214B994221D0862040420EE0202314 +:10A9C0001148824206D01D48824203D11C4A891890 +:10A9D0000129F1D8FF2200205343AB6070BD302322 +:10A9E000EEE7102308488242EDD1E5E71423F9E7AA +:10A9F0001C23F7E72023F5E73023F3E74023F1E7B3 +:10AA000000FDFFFF0001002000020020FFFFFFFE0D +:10AA1000FCFFFFFE08000001090000010A00000120 +:10AA20000B0000010C0000010D00000110000001EE +:10AA300011000001120000011300000100030020BA +:10AA4000F7FFFFFEF0B51F00002387B03B600C9BB3 +:10AA500006000D001400002B06D0C0220368D205AA +:10AA60001340934200D09AE0002C00D199E0C0221C +:10AA700080213368D2051A40C9058A4211D1326A51 +:10AA8000A24200D98DE0F1692800F5F771FE306A25 +:10AA90000021221A2818F5F787FE336A3B6000264A +:10AAA00020E041491A0C12048A421ED10C9B002B53 +:10AAB0004DD1338B0733DB1001939C4200D270E001 +:10AAC000F0691A0029007C3008F0A7FBFFF7FEFCB4 +:10AAD000061E07D1019B0C99E21AE818F5F764FEEF +:10AAE000019B3B60300007B0F0BD304A30491A404E +:10AAF0008A4207D02F4A13402F4A934227D08626F6 +:10AB00007642EFE704A80FF073FD2C4B0493F36932 +:10AB100005930C9B002B07D1E0223368D20513402C +:10AB2000C022D205934217D12B19290004AA03A8E9 +:10AB3000039310F033FE061E14DA220000212800D1 +:10AB4000F5F732FE3000FFF7C1FC0600CAE704A8A3 +:10AB50000FF04EFD1A4BD9E72200290004A810F08F +:10AB600083FEE8E74300A3420DD8241A2C19020003 +:10AB700021002800F5F7FCFD320000212000F5F748 +:10AB800013FE3E608BE7A042FBD2241A0200291973 +:10AB90002800F5F7F6FD22000021A819EFE7872627 +:10ABA000AEE78A26ACE7C04600000370FFFFFFEF68 +:10ABB000000001600000FFEF000003604CFD011089 +:10ABC000ECFC0110F0B50B6806000D0089B0002BFD +:10ABD00002D0026893423BD12B6A002B31D03268FD +:10ABE0001D4B13401D4A934232D102AF380008F08A +:10ABF000A7F805A808F0A4F80021F0690B000A00E6 +:10AC00000197009103F0A6F9041E0DD12A6AE969A3 +:10AC100005A808F091FA041E06D1380005A908F02D +:10AC200061FC041E00D00E4C380008F08FF805A817 +:10AC300008F08CF8002C04D02000FFF747FC09B086 +:10AC4000F0BD00202B8B8342F9D0328B9A42F6D094 +:10AC500087204042F3E7C046FFFFFFEF000001609E +:10AC600080BFFFFF70B50D001100FE22D205040069 +:10AC70000240C020C004824201D12D4A1440FA2271 +:10AC80008020D2052240C004824224D1294A944225 +:10AC900031D013D8284A94422FD006D8274A002012 +:10ACA000A4180222012C1BD970BD254A944224D03D +:10ACB00005222448844213D00020F5E7224A94421A +:10ACC0001DD005D8214A94421BD00A222048F1E722 +:10ACD00006222048EEE7204A00209442E4D10122D7 +:10ACE0001E482D180020042DDED82800F8F722FA7F +:10ACF0001E120B1A1C000322F2E70722F0E70822BB +:10AD0000EEE70422ECE70520002B00D018700AF0D3 +:10AD1000B1F9C9E703204029F6D001308029F3D1E9 +:10AD20004031F1E70720EFE70920EDE70220EBE7EC +:10AD3000FFC0FFFF0200C0040100800400FF9FFB72 +:10AD4000050080040100C004010040060300C004A7 +:10AD500005000006020040060200C002FFFFFFBF20 +:10AD6000CC235B00C358084A10B5934203D0074A6E +:10AD7000934204D010BD08300AF01EF8FAE70830FC +:10AD80000FF042F8F6E7C0460110400602104006F8 +:10AD9000030070B50120994224D00800124A134DD7 +:10ADA0001040A84205D0124C124E00200C40B44274 +:10ADB00018D11A40AA4205D00D4A0E4C00201A4064 +:10ADC000A2420FD1FF221D0000201540134209D0DE +:10ADD000802464042C43084DAC4203D15940914374 +:10ADE0004842484170BDC04600FFFEFF000002100F +:10ADF00000FFFCFF00000410FF000001F0B51F0081 +:10AE0000002385B001910B6003A91500039302F0A4 +:10AE1000E9FD041E1ED1E023039EDB0532681340CA +:10AE2000C022D205934201D101239D43F3682B40F8 +:10AE3000AB4212D1002F0BD039003069FFF7A8FFC9 +:10AE4000002805D139007069FFF7A2FF002804D05F +:10AE5000019B1E60200005B0F0BD85246442F9E727 +:10AE6000174B70B5150098420CD005D8154B984279 +:10AE70001BD08620404270BDAF231B06C018124B6A +:10AE80001842F6D107230C001C40194216D1C918EC +:10AE9000C90801206960FFF7F3FA03002860200069 +:10AEA000002BE8D18D206C60E4E740230A009A4330 +:10AEB000802AE7D080235B009942E3D08720D9E73E +:10AEC0000100005001000040FFFFFFFEF8B5150033 +:10AED0001A000023040040680F001360984205D157 +:10AEE000144BE2681A4208D0872021E00123A168B0 +:10AEF00002F0D4FD0028F3D0F8BD228B0E4B9A420D +:10AF000015D80126638BB343EED12900380002F037 +:10AF1000A5FD0028F0D129680A00A8CCA8C2A8CCB9 +:10AF2000A8C2236813601B0CB3434B83E4E786205D +:10AF30004042E1E7FCE0FFFFF8FF0000F7B50E003C +:10AF40006B46016804000D8B30002A000968073346 +:10AF5000FFF788FE6060002807D02E4B2E4A334052 +:10AF6000934204D02D4A934228D086250EE0CC236C +:10AF70002B4A5B00E25010220433E25423680E3A5D +:10AF80001B689343274A934203D087256D422800CC +:10AF9000FEBD27000837380009F0E7FE6B4622683F +:10AFA000D97938002B00D26909F0E5FEFFF78EFA57 +:10AFB000051E22D02000FFF7D3FEE8E7CC231A4A73 +:10AFC0005B00E25010220433E25423680E3A1B68FF +:10AFD0009343144A9342D8D12700083738000EF023 +:10AFE00087FC6B462268D97938002B00D2690EF0B5 +:10AFF00086FCDBE787256D42DCE7CE235B00E35C64 +:10B00000B604B60E9E42F5D89E23FF330025E654C3 +:10B01000BDE7C046FFC0FFFF01004006020040063A +:10B02000011040060100004002104006FF2310B549 +:10B030000C0001000C4A9943914212D10340802038 +:10B0400040041843094BC01806280AD8084B800052 +:10B05000C0580FF009FA01210200200003F03EF869 +:10B0600010BD0020F5E7C04600000312FBFFFFFE05 +:10B0700010DA011070B50D000400AC210120FFF7BB +:10B08000FFF9286000280ED0123CA4B20BF01DFE80 +:10B0900000210C2C01D8054B195D28680DF0E0FF4C +:10B0A000FFF714FA70BD8D204042FBE701DA011072 +:10B0B000F7B51D0000230E0001A917000193FFF74B +:10B0C000D9FF041E17D101993B0032008831019845 +:10B0D0000CF06AF9FFF7FAF9041E0CD101990198F6 +:10B0E00088310CF0CDF9FFF7F1F9041E03D1019B73 +:10B0F0002B602000FEBD01980028FAD00BF028FE3E +:10B100000198FFF7C5F9F4E7F0B514000025BFB0CA +:10B11000060006A803930F0005950AF043FE237866 +:10B120002800013BDBB20C2B01D81A4AD05C31005D +:10B130003A0005ABFFF7BCFF061E1ED101220599A0 +:10B1400006A80AF07DFEFFF7C1F9061E15D1020020 +:10B15000210006A80AF074FEFFF7B8F9061E0CD10C +:10B160000D4B039A01930D4B4599009306A8449B00 +:10B170000AF096FEFFF7AAF9060006A80AF042FEBA +:10B1800005980BF0E5FD0598FFF782F930003FB018 +:10B19000F0BDC046F4D9011020080208415D01103D +:10B1A000F7B5FF2306001D4F9E431D4B0400009181 +:10B1B00001920340BB4204D01A4B1B4A0340934206 +:10B1C0001FD1E3B2002B1CD0802252041343174A34 +:10B1D0009B18062B15D8164A9B009D5828000FF087 +:10B1E00043F9019B1870BE420DD1B44213D0002D1B +:10B1F0000ED028000FF034F9009B98420BD0872026 +:10B2000007E00025EAE70B4B9E4204D1002D02D156 +:10B2100086204042FEBD0020FCE7C0460000021030 +:10B2200000FFFEFF00FFFCFF00000410FBFFFFFE1D +:10B2300010DA011000000310C023F0B516008022C0 +:10B240000468DB0505000F0089B02340D205934256 +:10B2500026D18023F1009B059E4200D313E18B4B46 +:10B26000994200D90FE1020020001C32FFF7F8FDDF +:10B27000041E00D093E0002E04D032003900E869AB +:10B28000F5F776FAC02280212B68D2051A40C9054D +:10B290008A4200D0E3E02B6AD800002428837EE0B5 +:10B2A0007B4A230C1B04934200D07BE00023A0B216 +:10B2B000421E05931533022A39D9021F0433012A8D +:10B2C00035D9821F0533022A31D9033A0633012AC0 +:10B2D0002DD9023A1033012A29D9023A1433012A0E +:10B2E00025D9023A343B022A21D9033A0433012AF0 +:10B2F0001DD9023A0433012A19D9023A0433012A2A +:10B3000015D91033182812D0123319280FD0223B28 +:10B310001A280CD010331B2809D010331C2806D053 +:10B32000203B1D2803D018331E2800D0002387247B +:10B330009E4200D0A8E005A9FFF79CFE041E26D17E +:10B340000598320039007C3007F0F6FEFFF7BEF8B2 +:10B35000041E1CD1059905987C310CF02BF9FFF7E0 +:10B36000B5F8041E13D105984A4C030002000100F1 +:10B370000194494C28337C32883100940CF00EFC47 +:10B38000FFF7A4F8041E02D1059BEB617AE705984C +:10B39000002804D00BF0DCFC0598FFF779F82000BA +:10B3A00009B0F0BD3D4A934208D12B00A0B2320053 +:10B3B0001C33FFF77DFE041EF1D163E7384B394A99 +:10B3C000234093425FD103A80FF012F9E023DB057D +:10B3D0001C409C4236D1002332003900009303A860 +:10B3E0000FF0E4FFFFF772F8041E27D103A80FF057 +:10B3F00035F901282CD1049E300002F075FE80231F +:10B40000C0005B01984226D805A807F099FC2300EC +:10B4100022000194009405A9300002F09BFDFFF783 +:10B4200055F8041E05D105A807F02EFE430700D0ED +:10B43000863C05A807F08AFC002C0ED003A80FF06C +:10B44000DBF8ACE73200390003A810F0DBF8C9E7FD +:10B4500087246442F2E78624FBE7EE6112E7104A94 +:10B4600010491A408A4204D1E86902F03DFEC0004A +:10B4700013E70D4A00201340084A934200D00CE71E +:10B48000EB69986D09E78624644288E7F8FF0000BD +:10B490000000037020080208415D011000000360F5 +:10B4A000FFFFFFEF000001600000FFEF70B5002517 +:10B4B00003680400AB4209D0C0228021D2051A40A3 +:10B4C000C9058A4209D1E069FEF7E2FF2422002182 +:10B4D0002000F5F769F9280070BD0A4A0A491A40A8 +:10B4E0008A4203D1C06903F067FEECE7074A1340C4 +:10B4F000074A934203D1C0690BF02AFCE3E7972582 +:10B500006D42E3E7FFFFFFEF000001600000FFEF87 +:10B510000000036010B5002801D0FFF7C7FF10BD81 +:10B52000030007B50020834208D0180001A902F0EB +:10B5300059FA002802D10198FFF7B8FF0EBD10B5E7 +:10B540000400C069FEF7A4FF242200212000F5F7C3 +:10B550002BF910BDF0B5040089B008000E00FFF70C +:10B56000EEFF002320001A0004A9FFF747FC041E89 +:10B570004ED1049B31001A00A1CAA1C1A1CAA1C128 +:10B5800012680A600121120C0A4072831968234A6A +:10B590000A4023498A423BD1DD6905AF380007F0F4 +:10B5A000CFFB28002300220021000197009402F025 +:10B5B000D1FC0394051E1BD138001A4908F025F868 +:10B5C0000394051E14D0380007F07AFD0100040032 +:10B5D0000120FEF755FF039000281CD00100220037 +:10B5E000380007F01AFE051E02D1039B3462F36196 +:10B5F000380007F0ABFB002D02D00398FEF748FFA0 +:10B600002800FEF763FF041E02D03000FFF797FF0B +:10B61000200009B0F0BD10256D42E9E7FFFFFFEF04 +:10B6200000000160010001007FB51C0000230D0037 +:10B6300016002360012203A9FFF7E0FB002806D1D2 +:10B6400000902300320029000398FFF7FBF904B0B3 +:10B6500070BD7FB5160000220D001C001A6003A902 +:10B660001300FFF7CBFB002807D101233200009322 +:10B67000290023000398FFF7E5F904B070BDF0B589 +:10B680001F00002385B0050016000191029303936B +:10B690009A4219D0390003AB02AAFFF717FC041E27 +:10B6A0000CD1320001990298FFF7C6FD041E05D1A6 +:10B6B00029000298FFF786FA041E07D00298FFF7C8 +:10B6C00029FF00233B8001E087246442200005B06D +:10B6D000F0BD0000F0B595B000230BAC0592220040 +:10B6E0008446079308930E00A1C9A1C2A1C9A1C2B3 +:10B6F000A1C9A1C20222604607A90993FFF77EFBF8 +:10B70000051E73D131000798FFF75CFA051E6DD155 +:10B71000079D27692E6938003100FFF7C1F863697A +:10B72000029003936B69039819000493FFF7B8F82C +:10B73000029B002B04D1002F02D0002E00D086E007 +:10B74000002806D1039B002B03D0049B002B00D0C4 +:10B750007DE0EB68E26860611340E360029B2000DB +:10B760002361059909AB08AAFFF7B0FB051E3DD17F +:10B77000C0228021089B079E02933368D2051A409D +:10B78000C9058A4203D1348B0734E40809E0314A01 +:10B79000934234D10923348B64080134E4085C43B8 +:10B7A0003B3421000120FEF76BFE8D25071E4FD094 +:10B7B000002301000093220030000AABFFF742F99A +:10B7C000051E0AD1336839000393039A029B1A605D +:10B7D00018000A9AFFF730FD050038002100FEF737 +:10B7E00069FE3800FEF754FE002D05D00898FFF7DB +:10B7F00091FE0023059A1380280015B0F0BD164A6B +:10B80000934203D1348BE4081034CAE7134A9342BD +:10B8100005D10324338BDB085C435A34C1E7104A5B +:10B82000934205D10324338BDB085C434A34B8E7E9 +:10B830000C4A1B0C1B049342A5D00B4A04009342F4 +:10B84000AFD1348B0734E40864000134A9E78725BD +:10B850006D42CBE700000170000001600000027043 +:10B860000000026000000370000003600368114ADA +:10B8700010B5040093420AD80F4A934215D8002B02 +:10B8800010D00E4A93420AD0892040420CE00C4A64 +:10B890009B18012BF8D8083006F047F802E0083072 +:10B8A00004F08CF80020206010BD083005F069FA23 +:10B8B000F8E7C0460900000107000001050000018B +:10B8C000F6FFFFFE10B504008021E030FEF7F2FD28 +:10B8D0002000FFF7CBFF10BD70B5036805001348CB +:10B8E000834208D8124883421BD8124883420BD0A7 +:10B8F0008920404214E010481B18012BF8D828007A +:10B90000083006F005FE03E02800083005F068F96D +:10B91000041E02D02800FFF7A9FF2000FEF7D6FD85 +:10B9200070BD2800083005F007FFF1E709000001AD +:10B930000700000105000001F6FFFFFE036870B577 +:10B9400005000E00002B48D1254BC818062836D814 +:10B95000F7F7F0FB043535131D242E002C000834B6 +:10B96000200004F025F8200004F034F8041E30D143 +:10B970002E602000FEF7AAFD2AE02C0008342000EB +:10B9800005F0F9F90121200005F008FAEEE72C0096 +:10B990000834200005F0EFF90021F4E72C0008340A +:10B9A000200005F0BCFF0121200005F0CBFFDDE702 +:10B9B0002C000834200005F0B2FF0021F4E7FE203F +:10B9C000FF23C00530401B06C0184642704187382F +:10B9D00070BD2800FFF74AFFCBE789204042F7E718 +:10B9E000FBFFFFFE030010B5101E02D01800FFF78A +:10B9F00073FF10BDF7B5802401930368640417003A +:10BA0000DBB23A4A23439A1805000E001024022A9A +:10BA10002DD9374A04349A18012A28D9354A0834CE +:10BA2000934224D0344A0434934220D0334A103411 +:10BA300093421CD0324A1034934218D0314A243CED +:10BA4000934214D0304A0434934210D02F4A043C1D +:10BA500093420CD02E4A0434934208D02D4A10341D +:10BA6000934204D02C4A9B185C425C41A401019B88 +:10BA70001F60002F04D03A0021213000F4F794FE1B +:10BA8000BC422DD82B681C4A934208D8234A9342C3 +:10BA900020D8234A93420CD08926764218E0214AC6 +:10BAA0009B18012BF8D828003100083006F07EFDE5 +:10BAB00004E028003100083005F0D3F8FEF706FD59 +:10BAC000061E0FD1019B28001C60FFF7CFFE060069 +:10BAD0003000FEBD28003100083005F06EFEEDE7B5 +:10BAE0008A2676422800FFF7C1FEF1E7FFFFFFFE3E +:10BAF000FCFFFFFE08000001090000010A00000130 +:10BB00000B0000010C0000010D00000110000001FD +:10BB10001100000112000001EDFFFFFE070000010F +:10BB200005000001F6FFFFFEF0B5A5B001936B46DE +:10BB3000039280221B79520413434D4A0F00991837 +:10BB40000500102202292DD94A4904325918012929 +:10BB500028D9494908328B4224D0484904328B42C3 +:10BB600020D0474910328B421CD0464910328B42BC +:10BB700018D04549243A8B4214D0444904328B42B0 +:10BB800010D04349043A8B420CD0424904328B42D4 +:10BB900008D0414910328B4204D0404A9B185A4287 +:10BBA00053419A01019B32495B180A2B06D83C4944 +:10BBB000CE5C802E03D9862464421EE00026B24269 +:10BBC000F9D8039AB2421BD928000199FFF7B6FEB3 +:10BBD000041E0ED139002800039AFFF703FF041E4C +:10BBE00007D18022280003AB04A9FFF703FF041E3E +:10BBF0000CD0802104A8FEF75DFC200025B0F0BD2C +:10BC0000002A03D0390004A8F4F7B2FD002436203E +:10BC1000039904ABA1421FD1331B04AF1A00362194 +:10BC200038190293F4F7C0FD280000236A21E030A0 +:10BC30009C4217D15C21029A0019F4F7B5FD280047 +:10BC40000199FFF77BFE041ED3D13200280004A91E +:10BC5000FFF7C8FE0400CCE71A78013442401A709E +:10BC60000133D7E7DA5D4A40C2540133E0E7C0460A +:10BC7000FFFFFFFEFCFFFFFE0800000109000001BE +:10BC80000A0000010B0000010C0000010D00000182 +:10BC9000100000011100000112000001EDFFFFFE85 +:10BCA0002CDA011070B51E00244B0400049D9A424A +:10BCB0002ED003339A4213D00223FF3387209A42B7 +:10BCC0001BD1A378012B36D120000B002A003100B4 +:10BCD0001830FFF729FF002801D10223A37070BD9F +:10BCE0008378002B27D1002D0ED029000120FEF7EC +:10BCF000C7FB6060002802D18D204042EFE72A0098 +:10BD00003100F4F735FDA56001230020A370E6E7BC +:10BD10008378022B0FD1002D0BD029000120FEF7D4 +:10BD2000AFFBE0600028E7D02A003100F4F720FDE7 +:10BD300025610323E9E78920DFE7C046010200000F +:10BD4000F0B5C5B007001C0000910192802B2FD8E0 +:10BD5000002603AD1A006B7002AB3100981D2E70E7 +:10BD6000F4F722FD02AB06331B191E706A789E1C85 +:10BD70005A70300022000199F4F7FAFCBB783419AC +:10BD8000621B012B11D138002900009B1830FFF7EE +:10BD9000CBFE041E01D10223BB7082212800490082 +:10BDA000FEF788FB200045B0F0BD89246442F4E72B +:10BDB00087246442F6E70000F0B5002607681E4BB2 +:10BDC00095B0FB1805000091019203960A2B01D84B +:10BDD0001A4AD65C4022280003AB04A9FFF70AFEEA +:10BDE000041E25D139002800FFF7A8FD041E1BD131 +:10BDF000290032002800E031FFF7F4FD041E13D1C2 +:10BE00002800039A04A9FFF7EDFD041E0CD140227F +:10BE1000280003AB04A9FFF7EDFD041E04D1019A2D +:10BE2000009804A9F4F7A4FC039904A8FEF742FBC8 +:10BE3000200015B0F0BDC046FFFFFFFE2CDA011058 +:10BE40007FB503790D0004001100DA072CD5062216 +:10BE50001340022B28D042798A4222D80368134922 +:10BE60008B4213D16946083009F0D4FC061E04D178 +:10BE7000694628006279F4F77BFC68461021FEF7DA +:10BE800019FB3000FEF722FB04B070BD08490B40DF +:10BE9000A02189048B4207D129000830FFF78CFFCD +:10BEA000F2E78A204042EFE78920FBE70200C00268 +:10BEB0000000C07FF0B593B002AD0C001600290061 +:10BEC000402201ABFFF796FD00280AD1019FB7423F +:10BED00005D1020003009F4205D1002A01D0952020 +:10BEE000404213B0F0BDE15CEE5C013371400A43A7 +:10BEF000F1E700000B6870B505000C00002B29D19C +:10BF00000368164A934209D8154A93421BD8002B5E +:10BF100020D0144A93420CD086201CE0124A9B1871 +:10BF2000012BF9D8010020000831083005F004FD8C +:10BF300005E0010020000831083003F046FD002034 +:10BF40002B68236070BD010020000831083004F028 +:10BF50001FFFF4E789204042F4E7C04609000001D2 +:10BF60000700000105000001F6FFFFFE036810B5A1 +:10BF70000400181E20D0114A93420AD12000083034 +:10BF800009F094F81F220020237920609343237145 +:10BF900012E00B4A1340A0229204934204D12000E5 +:10BFA0000830FFF78FFCEDE7B4220021200052009B +:10BFB000F4F7FAFB8920404210BDC0460200C002DF +:10BFC0000000C07FF0B51D001E006B1E9D41802348 +:10BFD0006D421B01AD0285B0ED186A4B01910168FD +:10BFE0001340040017000093002900D0C1E01F2275 +:10BFF0000360037993430371009B1A00624B9A42DA +:10C000002AD1083009F04CF8002E03D010232279F1 +:10C01000134323713B002A00019803A9FEF7EEFEAB +:10C02000061E15D13D0AEBB201933F231D40009B34 +:10C0300003991A00544B9A424BD10F8B03000968A5 +:10C040003A000098FEF70EFE011E1DD186267642AC +:10C050002000FFF78BFF14E0A0224C4B92043B40E2 +:10C06000934201D18160CFE7FE26FE23F6053E40D4 +:10C070001B06B422F61877427E415200873EF4F741 +:10C0800093FB300005B0F0BD2600436908366371AC +:10C09000039B3000009309F033FA002805D1009B80 +:10C0A0003A003000D96909F01BFBFEF70FFA0600D1 +:10C0B000002D07D03C23019A1A42C7D06379AB42C6 +:10C0C00043D36571002EC3D1012322791343237119 +:10C0D000D7E7A0222D4B92043B4093424CD1FBB2B8 +:10C0E00080272B4A7F043B43934201D1102226E054 +:10C0F000284A9A18012AF9D9274A9A18012A2FD9C9 +:10C10000264A934228D0264A934223D0254A934276 +:10C1100024D0254A934211D0244A93421CD0244A69 +:10C12000934217D0234A934216D0234A934211D008 +:10C13000224A934212D0224A934208D1402262718D +:10C14000A2220868D20590420CD087267FE7002300 +:10C1500063717BE72022F2E71C22F0E73022EEE752 +:10C160001422ECE720000A6A0830C969FFF7DCFCFA +:10C170009DE78926764284E7002D00D166E7862672 +:10C18000764297E7FFC0FFFF0200C0020000C07FB9 +:10C1900001000001FEFFFFFEFCFFFFFE08000001A2 +:10C1A000090000010A0000010B0000010C00000161 +:10C1B0000D0000011000000111000001120000013B +:10C1C0001300000110B50123FFF7FCFE10BD10B5F0 +:10C1D0000023FFF7F7FE10BD70B505000079C30717 +:10C1E00003D489246442200070BD06230340022B3F +:10C1F000F7D0082303432B710D482B6883420BD1E2 +:10C200002800083009F096FAFEF760F9041EEAD01B +:10C210002800FFF7ABFEE6E706480340A0208004B5 +:10C220008342DED128000830FFF7DCFBEEE7C04692 +:10C230000200C0020000C07FF7B50193036805004B +:10C240000F001600002B03D1892464422000FEBD9C +:10C25000019B1A60002A03D021213800F4F7A4FAC8 +:10C260002B79DB06F0D5320039002800FFF7E8FD16 +:10C2700004002800002C0DD1FFF778FE041E03D126 +:10C280006B79019A1360E1E7320021213800F4F75D +:10C290008BFADBE7FFF76AFED8E7F0B5036893B0E7 +:10C2A000050017000191002B2DD0027910231600F4 +:10C2B0001E401A4227D14379BB421ED1402202A917 +:10C2C000FFF7BEFD330004009F420ED1002E14D1B3 +:10C2D000002C14D12800FFF749FE0400402102A8D9 +:10C2E000FEF7E8F8200013B0F0BD019A02A9D25C75 +:10C2F000C95C01334A401643E6E7952464422800AE +:10C30000FFF734FEEAE789246442EBE7F0B593B027 +:10C310001E0007921A9B199A0D001A60002A00D17C +:10C32000DEE080220B00D2000BA9FEF767FD041EA1 +:10C3300019D10B9AE0211368C905180008408842FA +:10C340004AD169498B425FD1D769310028000FAAD1 +:10C35000FEF726FF041E06D1380001F0C5FE199B2A +:10C36000834204D28A3C2121199A18982CE0FF2399 +:10C370009D435E4B9D422CD122002100380001F0EC +:10C38000ADFE2C22189B01960393079B3800029365 +:10C3900004AB9B181B78564A00935649012302F0C0 +:10C3A00061FD041E04D1380001F09EFE1A9B186046 +:10C3B0002000FEF78BF8041ED5D121211A9B1868A6 +:10C3C000199B1A1A189B1818F4F7EEF9200013B0ED +:10C3D000F0BD494B9D4202D087246442C3E72C2222 +:10C3E00004AB9B1838001A78012101F077FE189BE6 +:10C3F00038000393079B3E4A02933E49012301966E +:10C40000009402F0F7FBCCE73C4986240B403C4902 +:10C410008B42E2D13B4B3C492B408B42DCD1D7696C +:10C420000CA8BB6DDC1DE40806F08AFC0FA806F022 +:10C4300087FC63000993199B620093424ED33B0033 +:10C440007C330893EB033BD5EDB2002D36D080232F +:10C450005B041D432D4BED18062D2FD82C4BAD0042 +:10C46000E8580EF001F8224B02900493214B38005B +:10C470000393079B019600930FAA089B0CA909F050 +:10C4800081FF051E0DD1220018990CA806F0C5FEEB +:10C49000051E06D1189B220019190FA806F0BDFE33 +:10C4A00005000CA806F052FC0FA806F04FFC002D6A +:10C4B00002D11A9B099A1A6028007AE70020D0E777 +:10C4C0000B4B380003930B4B01960293079B0FAA6B +:10C4D00000930CA9089B09F045FFD2E70D4DE0E75A +:10C4E0008A24644272E7C046000001700000021016 +:10C4F00020080208415D0110000003100000FFEF5A +:10C500000000036000FFFEFF00000610FBFFFFFEBF +:10C5100010DA011000B1FFFFF0B58FB00592802254 +:10C5200004930E000B00120107A9159CFEF766FC90 +:10C53000051E37D1079A4849136848481940814277 +:10C540004CD1D769300004990BAAFEF729FE051ECD +:10C5500028D1380001F0C8FD844202D095256D42F3 +:10C5600020E0FF239E433E4B9E421ED12A0029001D +:10C57000380001F0B3FD2422149B38000393059B7F +:10C5800038490293049B019302AB9B181B78364AEF +:10C5900000932B0002F0EEFD344B9842DED0FDF705 +:10C5A00095FF050028000FB0F0BD314B9E4251D1E0 +:10C5B000242202AB9B1838001A78012101F08EFD6D +:10C5C000149B38000393059B274A0293049B25493B +:10C5D000019300952B0002F04FFDDDE725490B404C +:10C5E00025498B4234D12549254B0E409E4231D1FD +:10C5F000D76908A8BB6D0BAEDD1DED0806F0A0FBEA +:10C60000300006F09DFB6B009C42A7D12A001499D4 +:10C6100008A806F091FD041E12D1149B2A003000D8 +:10C62000591906F089FD041E0AD13B0008AA0092A0 +:10C630003800049A05998833019609F0B4FE040085 +:10C6400008A806F083FB300006F080FB2000A6E778 +:10C65000862584E7872582E7FFFFFFEF0000016062 +:10C6600000000210415D01102008020800BFFFFF1A +:10C67000000003100000FFEF0000036000FFFEFF5A +:10C6800000000610F0B51F0000238BB00792149A2B +:10C690000D0013600A00FF339A432F4B06929A4213 +:10C6A00005D0119B002B02D08724644234E0802205 +:10C6B0002B00520009A9FEF7A1FB041E2CD1099AF8 +:10C6C000C0211368C905180008408842ECD12349ED +:10C6D0000B4023498B423BD1D669300001F004FD69 +:10C6E000139B984236D81F4B9D4218D1129B3000A5 +:10C6F0000293079B1C4A01931C492300009702F0F8 +:10C7000069F8041E04D1300001F0EEFC149B18609F +:10C710002000FDF7DBFE040020000BB0F0BD069BFF +:10C720001A000D4B9A42BFD131002800FEF77EFC63 +:10C73000129B30000493079B0B4A0393119B0B49F8 +:10C740000193109B02970093230001F037FFD8E775 +:10C750008624AAE78A24A8E700000312FFFFFFEF60 +:10C76000000001600000021220080208415D011073 +:10C77000F0B58BB0079300230F001600149A0C003D +:10C780001360FF339F43294B9F4205D0119B002B21 +:10C7900002D0872040422BE080222300920009A98A +:10C7A000FEF72CFB002823D1099BE0211A68C9055C +:10C7B000100008408842ECD11D498A4233D1DD691E +:10C7C000280001F091FC079B9842E2D1194B9C4252 +:10C7D00010D1139B28000393129B174A0293149BBA +:10C7E000164900930196012302F0E0F9FDF76EFE71 +:10C7F0000BB0F0BD0D4B9F42CBD129002000FEF7BE +:10C8000015FC139B28000593129B0B4A0493149B61 +:10C810000A490293119B03960193109B00930123F5 +:10C8200001F0F8FFE2E78620B4E7C04600000312FB +:10C83000000001700000021220080208415D011092 +:10C84000036810B50400181E11D0FE22D205134053 +:10C850008022D20493420BD12000083008F026FC3D +:10C86000F8220020A38820601340A380A07110BD8F +:10C8700089204042FBE70000F0B585B004001500B8 +:10C88000802700910193012B12D0BF00216800295D +:10C8900000D094E0FE238022DB052B40D20493429B +:10C8A00008D04C222000F3F77FFF87277F4283E0E8 +:10C8B0007F00EBE7F822A38826001A4002230836FF +:10C8C00013433000A380A171256008F0E9FB3A0012 +:10C8D0002B00009803A9FEF791FA071E69D103996E +:10C8E0000B8B09680093009A03002800FEF7BAF941 +:10C8F000011E5CD0300008F003FE071E47D10399EB +:10C900003000019B009AC96908F0E8FB071E3ED180 +:10C910002C4B9D4241D02C4B9D4246D00121FF2201 +:10C9200090202379D2050B4323712A400B00C004C9 +:10C93000824213D0039B25481A68102382420DD0EF +:10C940002348083B824209D022480833824205D05E +:10C95000214BD218002391425B41DBB2A3716B02E1 +:10C9600015D5039B19491A6810238A420ED018491D +:10C97000083B8A420AD0174908338A4206D0164B30 +:10C980000121D218002391425B41DBB26371380070 +:10C99000FDF79CFD071E0FD00BE00421300008F0CE +:10C9A0006DFD0028BAD00700F1E70100F6E7862701 +:10C9B0007F422000FFF744FF380005B0F0BD892713 +:10C9C00074E7C046000160040101600401000040FA +:10C9D0000200004003000040FCFFFFBF10B5012330 +:10C9E000FFF74AFF10BD10B50023FFF745FF10BD4C +:10C9F000130070B50279040006200240022A16D105 +:10CA000062799A420DD12000083008F087FBFDF7CB +:10CA10005DFD051E07D104232279134323712800ED +:10CA200070BD87256D422000FFF70AFFF7E78925D3 +:10CA30006D42F4E770B50C00110006221E00037968 +:10CA400005001340022B1BD142798A4215D82100E0 +:10CA50000D4809F075F9002808D0FDF737FD041ED0 +:10CA600002D02800FFF7ECFE200070BD6A7921009B +:10CA700028003260FFF7BCFFF1E78A246442F0E748 +:10CA800089246442F0E7C04620080208F0B585B06A +:10CA90000393036804000F001500002B27D0FF222A +:10CAA000D205134090222E00D204934206D08679FC +:10CAB000C36A3100E818F6F75BFB46430A9B9E42C7 +:10CAC00012D820000B9B2A00390000930830039BEA +:10CAD00008F052FBFDF7FAFC051E02D02000FFF71C +:10CAE000AFFE280005B0F0BD8A256D42F6E7892526 +:10CAF0006D42F6E7F0B51E00037905000C00170043 +:10CB000085B0DA073CD506221340022B38D010231B +:10CB1000C356012B06D11C4B02689A4202D1C36A4C +:10CB2000002B28D1280032006946083008F036FC76 +:10CB300000280CD0FDF7CAFC040000236846102131 +:10CB40003360FDF7B7FC2800FFF77AFE10E032688B +:10CB5000002A05D0BA4211D869462000F3F708FE32 +:10CB600010216846FDF7A6FC2800FFF769FE0400C7 +:10CB7000200005B0F0BD87246442DEE78A24FBE78D +:10CB800089246442F4E7C04600016004F0B5F3B0C4 +:10CB90000993002315007E9A0AAE136080220B00D1 +:10CBA0000F0052003100FEF729F9041E3FD1390071 +:10CBB0003000FEF7C3F9041E39D19E27FF37F35D1D +:10CBC0007B9A7D999A188A4248D87B997C9A264804 +:10CBD0005218CC214900715881422BD105937C9B7E +:10CBE000069204937A9B01210393799B7B9A02938B +:10CBF000789B0CA80193099B00932B000DF0BFF8C4 +:10CC0000FDF764FC041E07D07D9B002B04D01A00A6 +:10CC100000217C98F3F7C8FD0AAD2800FEF7A0F8C4 +:10CC2000002C04D1EB5D7B9A9B187E9A1360200048 +:10CC300073B0F0BD0D48814213D105937C9B0492E3 +:10CC400003937A9B2A000293799B7B990193789BAB +:10CC50000CA80093099B08F0CFF8D1E78A2464421E +:10CC6000DAE786246442E2E702104006011040063B +:10CC7000F0B5F1B00793002317007C9A08AD13605C +:10CC800080220B000E0092002900FEF7B7F8041E68 +:10CC90003DD131002800FEF751F9041E37D19E2600 +:10CCA000FF36AB5D799A934247D8D11A7B9A8A4274 +:10CCB00046D3CC204000789A2858244C5218A042E1 +:10CCC00028D17A980393779B059001937898769B67 +:10CCD0000490029200933A00079B0AA80DF06AF8AC +:10CCE000FDF7F4FB041E07D07B9B002B04D01A0039 +:10CCF00000217A98F3F758FD08AD2800FEF730F8C8 +:10CD0000002C04D1AB5D799AD31A7C9A1360200071 +:10CD100071B0F0BD0E4CA04214D105937A9B0492E1 +:10CD20000393789B3A000293779B0AA80193769B22 +:10CD30000093079B08F0A2F8D2E787246442DBE760 +:10CD40008A24FBE786246442E1E7C04602104006DD +:10CD500001104006FE22C0210368D20570B51A40BA +:10CD6000040089058A4213D11D4A1340802292058E +:10CD70001343FF22190091431A4A914212D12069AC +:10CD8000FDF786FB20001830FEF79CFD050002E051 +:10CD90000025AB42EDD1822120008900FDF78AFBFE +:10CDA000280070BD104A5B0A5B02934214D160698F +:10CDB000002805D0A169FDF77DFB6069FDF768FBE0 +:10CDC000E069002805D0216AFDF774FBE069FDF7F2 +:10CDD0005FFB20002830D7E789256D42DBE7C0469E +:10CDE000FFFF03080001002000020020F0B585B01D +:10CDF0000393FE230C00C0210668DB0505003340C9 +:10CE000089058B4204D187490E40802189050E4354 +:10CE10000223FF339C421ED083496118032918D88E +:10CE200082498A4201D0002A13D1FF213200804872 +:10CE30008A43824200D0C5E00E4080217D4A4904E9 +:10CE40000E4394420AD07C4A944200D199E09C421D +:10CE500020D0872409E0A421C905E2E7FD270322A9 +:10CE60007F00EB5D134202D089246442CCE02800AD +:10CE700033000A9A03991830FEF756FE041E00D0BC +:10CE8000C2E00323EA5D9A43023B1343EB552000C3 +:10CE900005B0F0BDFD235B00EB5C032719003940B2 +:10CEA0003B420FD1280033000A001830FEF73CFE49 +:10CEB000041E00D0A8E0FD21012349006A5CBA43AA +:10CEC00013436B54FD2303225B00EB5C1340012BE7 +:10CED000CAD12F00183738000A9A0399FEF782FD4D +:10CEE000041E00D090E02900793140223800FF3143 +:10CEF000FEF762FF041E00D086E0504A1023B218ED +:10CF0000022A2DD94E4A0433B218012A28D94D4A93 +:10CF10000833964224D04C4A0433964220D04B4AE0 +:10CF2000103396421CD04A4A1033964218D0494AD0 +:10CF3000243B964214D0484A0433964210D0474AC4 +:10CF4000043B96420CD0464A0433964208D0454AE8 +:10CF50001033964204D0444BF61873425E41B3013D +:10CF6000FC225200AB54FA230022FD21FF33EA5485 +:10CF700049006B5C033293431A00022313436B5442 +:10CF800085E7FD235B00EB5CDA43920700D16BE79A +:10CF90005B0700D568E70A9B6B61002B0AD019007C +:10CFA0000120FDF76DFA2861002836D00A9A03990E +:10CFB000F3F7DEFBFD2204235200A95C00240B439F +:10CFC000AB5464E7294882420CD10E4080212800EE +:10CFD00022000A9B49040093039B31431030FEF763 +:10CFE00061FE0EE02248824219D10E4080212800C5 +:10CFF0004904103031439C420AD10A9B039AFEF740 +:10D000009FFE041E00D142E72800FFF7A3FE3EE783 +:10D010000A9B22000093039BE1E78D2425E78924E6 +:10D02000644234E7FFFF0308FFFDFFFF01000050EB +:10D03000000100200202000003020000FFFFFFFECB +:10D04000FCFFFFFE08000001090000010A000001CA +:10D050000B0000010C0000010D0000011000000198 +:10D060001100000112000001EDFFFFFE0002002090 +:10D07000000300200368002B03D0836800200B60AE +:10D08000704789204042FBE70368002B05D0836886 +:10D090008B4205D381600020704789204042FBE726 +:10D0A0008720FBE7F0B5C1B00292FE220591C021B6 +:10D0B0000368D20505001A4089058A420DD1B64A97 +:10D0C0001340802292051343AA6802998A4209D22A +:10D0D00000238F24AB606442A8E0002BF4D18924A4 +:10D0E00064427BE00299114300D1F3E102991800F8 +:10D0F000521AAA60FF22A9499043884200D0BAE0A0 +:10D10000802713407F041F43A54B1026FB18022BDA +:10D110002DD9A44B0436FB18012B28D9A24B083675 +:10D120009F4224D0A14B04369F4220D0A04B103602 +:10D130009F421CD09F4B10369F4218D09E4B243EDE +:10D140009F4214D09D4B04369F4210D09C4B043E0E +:10D150009F420CD09B4B04369F4208D09A4B10360E +:10D160009F4204D0994BFE1873425E41B601FD21E7 +:10D1700049006A5C93079B0F012B00D8A8E1530775 +:10D1800000D4A5E1032313436B54029B0093059B3A +:10D190000493009B002B20D0FC235B00E95C009BE8 +:10D1A000741AE4B29C4201D96B461C782B00B93347 +:10D1B000FF332200591804980393F3F7D9FAFC229D +:10D1C000049B52001B190493009B1B1B0093AB5C38 +:10D1D000E418009BAC54002B03D10024200041B084 +:10D1E000F0BDFA22FF32AB5CFF2B00D170E10133BE +:10D1F000FC21AB54002349006B542B002900183349 +:10D20000019379313B0032000198FF31FEF78CFC2D +:10D21000041E0BD1FA22FF32AB5C012B11D16A69DB +:10D2200029690198FEF7DEFB041E12D02E68280043 +:10D23000FFF790FD2121029A05982E60F3F7B4FACA +:10D24000CCE7320003990198FEF7CCFB041EE6D030 +:10D25000ECE72900FA3101220198FF31FEF73CFB8F +:10D26000041EE3D1402203990198FEF7A5FD041E98 +:10D2700000D18EE7DAE75648590A4902814200D0C8 +:10D280002DE7802713407F041F43454BFB1807936E +:10D2900010230093079B022B38D914230093414B92 +:10D2A000FB18012B32D91C223F4B00929F422DD0FC +:10D2B0003E4B043200929F4228D03D4B10320092E8 +:10D2C0009F4223D03B4B103200929F421ED03A4BDC +:10D2D000243A00929F4219D0384B043200929F4268 +:10D2E00014D0374B043A00929F420FD0354B043292 +:10D2F00000929F420AD0344B103200929F4205D0D8 +:10D30000324BFB185A4253419B010093029B0393FB +:10D31000059B0493039B002B00D15EE72E7C002E1F +:10D3200000D0BAE0079B022B23D91E4BFB18012B20 +:10D330002AD91D4B9F4229D01C4B9F4228D01C4B01 +:10D340009F4227D01B4B9F4211D01B4B9F421DD0A9 +:10D350001A4B9F421CD01A4B9F4217D0194B9F4229 +:10D3600016D0194B9F4215D01A4B9F4202D140262E +:10D3700000E01026E022002108A8F3F715FA6B7CE4 +:10D38000FF2B29D19724A6E61426F3E71C26F1E704 +:10D390002026EFE73026EDE7FFFF0308000100201D +:10D3A000FFFFFFFEFCFFFFFE080000010900000177 +:10D3B0000A0000010B0000010C0000010D0000013B +:10D3C000100000011100000112000001EDFFFFFE3E +:10D3D000000200201300000101336B742B0028337E +:10D3E00018002E7408A90193FEF784FD041E44D191 +:10D3F0006B7C012B4CD12A6AE9690198FEF7F2FA9D +:10D40000041E3AD1AA6969690198FEF7EBFA041E75 +:10D4100033D12B008933FF33320019000198069372 +:10D42000FEF7CAFC041E28D1019908A8FEF762FD88 +:10D43000041E22D1320006990198FEF7D3FA041E89 +:10D440001BD12A6AE9690198FEF7CCFA041E14D1AF +:10D45000AA6969690198FEF7C5FA041E0DD1290071 +:10D46000C93132000198FF31FEF7A6FC041E04D139 +:10D47000019908A8FEF73EFD040008A8FEF7F6F99A +:10D48000002C00D0D2E6002800D143E70400CDE60E +:10D49000290089313200FF31B6E7039B34009E42F8 +:10D4A00001D96B461C7B009B2200991B2B00C933C2 +:10D4B000FF33C9B259180498F3F75AF9049B1B19A2 +:10D4C0000493039B1B1B03932B7C1C1B2C7421E7D5 +:10D4D000892400E68F2403E60023F0B585B002938B +:10D4E0000393038B060000910192002B3ED001258F +:10D4F0000B792B423DD0019903AB02AAFDF7E6FC64 +:10D50000041E25D1C023029FDB053968328B0B40F6 +:10D510008021D61DF608C9058B4222D1530720D1A0 +:10D5200028003100FCF7ACFF051E1DD001003200C1 +:10D530000098FFF7B7FD041E05D13200290038001E +:10D54000FDF77AFE04002800FCF7A2FF002C05D0AE +:10D550000298FDF7DFFF0023019A1380200005B039 +:10D56000F0BD87246442F3E78D24FBE787246442FF +:10D57000F4E78524FBE70000036870B504000D00A4 +:10D58000002B18D1FE23DB0580220B40C021920521 +:10D5900089058B420BD10A492940114391420DD094 +:10D5A0002000FDF7CBF9002800D1256070BD934223 +:10D5B00004D12900F4E789204042F7E78720FBE700 +:10D5C000FFFF030807B5009313000022FFF70EFCCE +:10D5D0000EBD7FB50500100080220E002B685201A1 +:10D5E00003A9FDF70BFC041E05D02800FFF7B2FBD2 +:10D5F000200004B070BD0223FF339E4204D12A797B +:10D60000013BFF3B13432B71039A3100136A28003F +:10D610000093D3691268FFF7E9FB0400E8E7000014 +:10D62000F0B50500FE261000C0221F002B6899B03F +:10D63000F60503911E40920596423DD1802205A930 +:10D640005201FDF7DBFB041E2ED1FC2329681B04CD +:10D650000B401B49059A069033438B4227D1136830 +:10D6600018491B0C1B048B4224D106AB01934223A7 +:10D6700000933800D2691E9907ABFDF745FD041EE3 +:10D6800009D1A422069B28000093039907ABD20579 +:10D69000FFF7ACFB0400069907A8FCF70BFF002C72 +:10D6A00002D02800FFF756FB200019B0F0BD8624F9 +:10D6B0006442F0E78724FBE787246442F4E7C0462E +:10D6C0000000203000000370F8B5F023104A9B00E2 +:10D6D000D35C06000D00DB0716D580270C00FF0089 +:10D6E00071190C48091BBC4203D8220008F028FB22 +:10D6F00004E03A0008F024FB002802D0FCF7E6FE24 +:10D70000F8BD054BE418EBE789204042F8E7C04636 +:10D71000A00502082008020800FCFFFFF0B51E006B +:10D72000FE2305001700C022DB05080085B02B4052 +:10D730009205934202D0872464421DE080222B0090 +:10D74000520103A9FDF75AFB041E15D1104B039A91 +:10D750009D421BD113680F491B0C1B048B42EAD15D +:10D760000C9B310001930B9B38000093D2690A9BFC +:10D77000FDF7CAFC041E06D00B990A98FFF7A4FF18 +:10D780000C9B0B9A1A60200005B0F0BD8624D3E7ED +:10D7900000002030000003700023F0B587B0049330 +:10D7A0000593038B05000391002B00D19AE005AB94 +:10D7B00004AAFDF78BFB041E2AD1049EEB692F8B74 +:10D7C00030682D6A002B02D1002D00D088E0C022E5 +:10D7D0008021D2050240C9058A4210D132003900A9 +:10D7E0001C32FDF73DFB041E12D1316AF069FFF7D0 +:10D7F0006BFF041E0CD10024200007B0F0BD3B4A93 +:10D8000090423FD180225201974208D98624644237 +:10D810000498FDF77FFE0023039A1380ECE70722AC +:10D820003C0014401742F1D1002D12D0042DEDD848 +:10D830005D191A782402013314439D42F9D1002C5A +:10D84000E4DBAC210120FCF71BFE051E03D18D2477 +:10D85000DDE7274CF5E70022110000F031FC0094D1 +:10D860003B002800234A244901F0DEFC041E35D089 +:10D87000280001F0A1FC2800FCF70AFE2000FCF7BC +:10D8800025FEB6E71D4A030C1B049342BED1123895 +:10D8900080B200240C2801D8194B1C5C200009F030 +:10D8A000CFF9002DB2D1002CB0D00028AED08388A3 +:10D8B0009F4215D1AC210120FCF7E2FD051EC6D028 +:10D8C00009F003FA200029000A4B0B4A0AF08BFAF0 +:10D8D000041E03D0280009F03BFACCE7F5618BE782 +:10D8E000872494E78724644286E7C04600000170DD +:10D8F0000100010020080208415D011000000370D2 +:10D9000001DA011010B500F093F8F023084C9B00E9 +:10D91000E25C06231A4205D0064808F056F906488C +:10D9200063689847F22120008900FCF7C3FD10BD11 +:10D93000A005020820080208A8050208F0B5224B3D +:10D9400085B00393F023214C9B00E35C0026DB07AA +:10D9500033D42368B34201D11D4B23606368002B8D +:10D9600001D11C4B63601C4F236838009847F02599 +:10D970001A4EAD00300008F01DF90623625D30003C +:10D980009A43043B1343635503233A00144900931D +:10D9900003AB08F02BF9FCF799FD061E10D1062306 +:10D9A000625D9A43023B1343635500F035F8061E4F +:10D9B00006D10123625D13436355300005B0F0BD0D +:10D9C000FFF7A0FFF9E7C04650534100A005020849 +:10D9D00079960110C9960110A805020820080208CE +:10D9E000EB96011090230B4ADB00D35CDB070CD5D0 +:10D9F000431E98B21F280BD8242058438018036870 +:10DA0000002B05D008600020704789204042FBE7CA +:10DA10008820FBE768090208902201230349D2000D +:10DA2000885C03438B5400207047C0466809020895 +:10DA300070B50024242630006043074D013440199E +:10DA4000FDF734FD202CF6D190220121D200AB5CF1 +:10DA50008B43AB5470BDC04668090208902330B5B3 +:10DA60000D4CDB00E35C0200DB0713D520232425EB +:10DA700003801388002B03D18D200B60404230BD02 +:10DA80002800013B58432018086000680028F6D0A1 +:10DA90001380EEE78920F1E768090208002A01D027 +:10DAA0000023136001384342584187387047030010 +:10DAB00007B50020834208D0180001A9FFF792FFA4 +:10DAC000002802D10198FDF7F1FC0EBDF0B599B028 +:10DAD000019004920D004022002108A81E9E05938B +:10DAE000F2F762FE0023306807930CF0B9FC039054 +:10DAF000002D07D12C0008A84021FCF7DBFC2000FA +:10DB000019B0F0BD039B02959D4200D902933000ED +:10DB10000CF066FB041EEED13000059A04990CF05F +:10DB200085FB041EE7D10422300007A90CF07EFB20 +:10DB3000041EE0D108AF390030000CF097FB041E42 +:10DB4000D9D1029B9C4208D1019B07AA1B190193C2 +:10DB5000D3782D1B0133D370CAE7019BE25D1B5DB7 +:10DB60005340019A13550134EBE70000F0B585B03E +:10DB70000093002306000D00019202930393984244 +:10DB80003CD00CF0A7FA041E01D1374834E0300035 +:10DB900002AA03A90CF0DAFC0028F6D120000CF050 +:10DBA0005FFC029B0500C018030008337F2BECD8F4 +:10DBB0002A0002330A329342E7D3009A9342E4D810 +:10DBC00014000A3C241A0A2CDFD900230A9A033CC9 +:10DBD0001370971C01335370FF2122003800F2F7B5 +:10DBE000E3FD00233C1923709E420CD12A000199C9 +:10DBF000601CF2F7BDFD300005B0F0BD009B8B420C +:10DC0000C3D35C1ADFE730226270029FE9B23B00A7 +:10DC10000833CB18A370FBB2E2701A1D22710622E2 +:10DC2000E61D6271A3713A0030000399F2F7A0FD7E +:10DC30000523F6193370002373700433F418B3709E +:10DC4000EBB22A00F37020000199F2F791FD0A9BD4 +:10DC5000009A65199B180020AB42CDD011000A989C +:10DC6000FCF728FC91E7C04680BFFFFFF8B506002F +:10DC700008364768040030000D0005F021FA87429D +:10DC800019D180236268DB009A4214D80021300049 +:10DC900005F0BBFC00280EDD0021300005F0A2F9E4 +:10DCA000002808D0002D08D120000021143005F0F4 +:10DCB000ACFC00281DDC1C481EE026002C36002190 +:10DCC000300005F0A2FC0028F5DD0021300005F051 +:10DCD00089F90028EFD00C360021300005F095FCC2 +:10DCE0000028E8DD0021300005F07CF90028DBD1B8 +:10DCF000E1E7002D01D10020F8BD200000214430D3 +:10DD000005F083FC0028D6DD20000021503005F00E +:10DD10007CFC0028CFDD200000215C3005F075FC84 +:10DD20000028E8DCC7E7C04680BFFFFF70B50400ED +:10DD30001D0000290AD006000836300005F0FCF965 +:10DD4000002818D1300005F0BBF96060002D0AD121 +:10DD5000059B002B12D1079B002B18D1099B002B90 +:10DD60001ED1002070BD20002900049A2C3005F03F +:10DD7000E3F90028ECD00F4BC018F3E72000069A17 +:10DD80000599383005F0D8F90028E4D0F3E72000F1 +:10DD9000089A0799203005F0CFF90028DED0EAE78D +:10DDA00020000A9A0999143005F0C6F90028D8D045 +:10DDB000E1E7C04680BFFFFF0300F0B5070008336E +:10DDC0008DB000211800099305F01FFC3B002C3397 +:10DDD000002105901800079305F017FC3B0038332D +:10DDE000002103901800089305F00FFC3B0020333E +:10DDF0000021069018000A9305F007FC3B0014333D +:10DE00000400002118000B9305F0FFFB039B002B7F +:10DE100000D197E0069B002B03D0002C01D00028F6 +:10DE200025D1059B002B15D0069B002B46D018E072 +:10DE3000069D002D41D1002C39D00200531E9A417D +:10DE40000492039E069B1E43264344D10400601E99 +:10DE5000844113E0039B002B33D0069B059D002BD0 +:10DE600009D0002C01D1002831D1002500E0012586 +:10DE7000059B002B1ED1002634000496049B1D43F5 +:10DE800035432C435CD0059B002B2BD1039B002BEF +:10DE900028D0069B002B25D0089A0799099805F0F1 +:10DEA000C8FC00281AD02A4BC0180DB0F0BD2500C0 +:10DEB0000494C6E700230493C3E7039B1D00049367 +:10DEC000BFE7039E33001D001C000493D6E7250026 +:10DED00001260494D2E700242600CFE7099805F034 +:10DEE000EFF87860049B002B1AD0089B0A9A0093E5 +:10DEF0000B99079B099801F081FA0028D3D13B00C8 +:10DF00005C3301930C3B0A9A009308990C3B0798E9 +:10DF100001F012FD0E4A03008018002B0BD0C4E75D +:10DF2000002E06D00A9B0B9A0899079801F042FB35 +:10DF3000E3E7002DE3D129003800FFF797FEB4E7AF +:10DF40000348B2E7059B002B00D071E71E00BAE73B +:10DF500080BFFFFFF7B51F000300083304000D006A +:10DF6000180000211600019305F04FFB002803D193 +:10DF7000002E2FD02A483AE0200000212C3005F056 +:10DF800044FB0028F4D020000021383005F03DFB90 +:10DF90000028EDD020000021203005F036FB0028BD +:10DFA000E6D020000021143005F02FFB0028DFD040 +:10DFB000002D16D1002E1BD1002F21D1089B002B44 +:10DFC00026D1099B181E12D021000998143104F0A3 +:10DFD0002FFF0CE0002FCDD1089B002BCAD1002DC4 +:10DFE000EFD02800019904F023FF0028E2D0FEBD05 +:10DFF000210030002C3104F01BFF0028DCD0F6E7B4 +:10E0000021003800383104F013FF0028D6D0EEE7A5 +:10E0100021000898203104F00BFF0028D1D0E6E75A +:10E0200080BFFFFFF8B504000F0008300021160084 +:10E030001D0005F0EAFA002801D12048F8BD2000B3 +:10E0400000212C3005F0E1FA0028F6D02000002154 +:10E05000383005F0DAFA0028EFD020000021203017 +:10E0600005F0D3FA0028E8D020000021143005F094 +:10E07000CCFA0028E1D0002F05D1002E0DD1002DC3 +:10E0800013D10020DAE721003800443104F0D0FE3B +:10E090000028F2D0094BC018D0E7210030005031E1 +:10E0A00004F0C6FE0028EAD0F4E7210028005C3125 +:10E0B00004F0BEFE0028E4D0ECE7C04680BFFFFFBE +:10E0C00070B504000E0015000021AC22F2F76CFBC5 +:10E0D0002300A834A4331E60256070BD0300A8305F +:10E0E000A4331960026070474068704770B5002122 +:10E0F0000400FFF7BBFD051E18D1260008363000CE +:10E1000004F0C2FF7F2811D914342900200004F044 +:10E1100069FF00280AD0200004F0B6FF012805D9C5 +:10E120003100200005F0DEF9002800DB014D280059 +:10E1300070BDC04600BEFFFFF0B585B00400FFF71C +:10E14000D5FF002827D101212000FFF78FFD0028EF +:10E1500021D12500260027002300029001902000F5 +:10E1600014332C3538362037009332003B00290019 +:10E17000083001F007FB00280DD1220023005C329B +:10E180005034019231003A0028004433009401F0E9 +:10E190006FFA002800D0014805B0F0BD00BEFFFFB7 +:10E1A00070B504000D00FFF7A1FF002814D128006E +:10E1B000FFF7C2FF00280FD12900200008310830E6 +:10E1C00005F090F9002807D12900200014311430FF +:10E1D00005F088F9002800D0004870BD00BEFFFFA0 +:10E1E000F0B50C0087B0002107001500FFF73EFDD9 +:10E1F000002830D103A804F0A3FD21007A6803A809 +:10E2000004F09AFF041E19D13C000834210003A831 +:10E2100005F068F900281BDA3A007E6803A9683720 +:10E22000230008001432009705F006FE041E05D1F5 +:10E230003200290003A804F0F0FF040003A804F052 +:10E2400085FD002C01D0054BE418200007B0F0BD7F +:10E2500004246442F2E7024CF7E7C04680BDFFFFAA +:10E2600080BFFFFFF0B5A7B00291012105001C009F +:10E270000792FFF7FBFC002800D094E108A804F007 +:10E280005FFD0BA804F05CFD0EA804F059FD11A879 +:10E2900004F056FD029B002B05D01AA804F050FD97 +:10E2A0001DA804F04DFD14A804F04AFD17A804F0C1 +:10E2B00047FD20A804F044FD23A804F041FD2100FF +:10E2C0006A6808A804F038FF041E00D03CE12F0063 +:10E2D0000837390008A805F005F9002800DB5BE1E4 +:10E2E00008A920A804F0A4FD041E00D02CE12B00F6 +:10E2F000443303930C330493029B002B00D181E041 +:10E300002B00A0331B68002B00D1D9E02E008C36E7 +:10E3100032003100300005F08CFA041E00D013E109 +:10E320003A003100300005F017FD041E00D00BE16B +:10E330000C3632003100300005F07BFA041E00D0AC +:10E3400002E13A003100300005F006FD041E00D065 +:10E35000FAE02A0008A908008C3205F06AFA041EC7 +:10E3600000D0F1E008A93A00080005F0F5FC041E11 +:10E3700000D0E9E0290001222C310BA805F047FA72 +:10E38000041E00D0E0E02900012238310EA805F07B +:10E390003EFA041E00D0D7E01C21079B029A11A868 +:10E3A00005F0FEFF041E00D0CEE011AA0BA91AA8AA +:10E3B00005F03FFA041E00D0C6E01AA90800039A2F +:10E3C00005F0CBF9041E00D0BEE01C21079B029A89 +:10E3D00011A805F0E5FF041E00D0B5E011AA0EA9B2 +:10E3E0001DA805F026FA041E00D0ADE01DA9080006 +:10E3F000049A05F0B2F9041E00D0A5E01DAB049309 +:10E400001AAB03932B002C33059348330093039AE4 +:10E41000059B08A914A805F00FFD041E00D093E089 +:10E420002E002B00383680330093049A330008A95D +:10E4300017A805F001FD041E00D085E017AA14A955 +:10E4400008A805F0AEF9041E00D07DE02A0008A956 +:10E450005C3214A805F0EDF9041E75D1059A14A9D3 +:10E4600008A805F079FC041E6ED1320008A914A892 +:10E4700005F0DFF9041E67D114AA17A908A805F052 +:10E480006CF9041E60D1029B002B4ED12B002A0098 +:10E490006833009314323B0008A923A805F0CCFC94 +:10E4A000041E51D120A923A805F01CF8002800D093 +:10E4B00077E06A682C9908A804F0AFFE040043E0F6 +:10E4C0000C230693069B013B0693002B00D166E0CC +:10E4D0002B00983305936B68029A591E0598079B89 +:10E4E00005F05EFF041E2FD12E008C363A0030005E +:10E4F000059905F0DBFE041E26D10121300005F050 +:10E5000084F80028DED13A003000059906F040F882 +:10E51000041E19D12B002A006833009331003B0000 +:10E520003000143205F088FC10E72A0008A9080022 +:10E53000983205F07EF9041E06D108A93A000800B9 +:10E5400005F00AFC041EA1D00BA804F0FFFB0EA8E6 +:10E5500004F0FCFB11A804F0F9FB029B002B05D092 +:10E560001AA804F0F3FB1DA804F0F0FB08A804F0BF +:10E57000EDFB14A804F0EAFB17A804F0E7FB23A8BE +:10E5800004F0E4FB20A804F0E1FB002C01D0074BD1 +:10E59000E418200027B0F0BD04246442D4E7044C02 +:10E5A000D2E7044CD0E7044CF3E7C04600BDFFFFC0 +:10E5B00080BBFFFF80BCFFFF80BFFFFFF0B58DB0C9 +:10E5C0000290059106920793012B08D10300A43312 +:10E5D0001B68012B03D0454C20000DB0F0BD059BFE +:10E5E000002BF8D0029BA8331868C0B20BF072FD64 +:10E5F000071EF0D0029B5B6803930BF031FF4300D2 +:10E600000493149B420002339B18149A0500934212 +:10E61000E1D3039A9342DED800211698F2F7C4F8AA +:10E62000169B169A013304930023049913700698DD +:10E630002A00059B9847002802D02D4BC418CBE731 +:10E64000049B38005E193300139A12990BF02EFECA +:10E65000041EC1D1039B149A981A02386B0040190A +:10E66000C01A012330180370002A03D01599013015 +:10E67000F2F77EF809A80BF039FD0022390009A84D +:10E680000BF068FD041E18D1039E169B6F1C013E03 +:10E69000DF19761B09AB009331002B003800049A78 +:10E6A000FFF714FA041E08D109AB00933A003300B7 +:10E6B00029000498FFF70AFA040009A80BF01CFDD2 +:10E6C000002C00D088E7079B002B06D1169A0298F1 +:10E6D0001100FFF785FD04007EE7169B069A059959 +:10E6E00002980093FFF7BEFDF5E7C04680BFFFFF2D +:10E6F00080BBFFFFF0B587B006000E9C039105922A +:10E700000493012B07D10300A4331B68002B02D014 +:10E710002E4807B0F0BD0C9B75680C33F8D80C9BE5 +:10E720000B33AB42F4D80C9BED1A00232370049BEF +:10E73000033D002B30D1039B002BE9D00223ED18C1 +:10E74000A71C63706519AF4212D100232B700C9B7C +:10E75000002B04D01A000D99681CF2F709F8049BED +:10E76000002B26D1220021003000FFF739FDD0E731 +:10E7700064230293039B01223900059898473B7854 +:10E78000002B1ED1029B013B0293002B01D00028DD +:10E79000F0D00F4BC018BCE70123FF2163702300AA +:10E7A000A01C2A199A4201D14519CEE7997001336C +:10E7B000F8E723003000059A03990094FFF752FD13 +:10E7C000A7E70028E5D10137BDE7C04680BFFFFFBE +:10E7D00080BBFFFFF0B50700A4373F6887B00C9CF3 +:10E7E0000D9D0E9E002F04D0012F08D0084807B0C1 +:10E7F000F0BD029601950094FFF77CFFF7E70294C5 +:10E8000000240496039501940094FFF7D7FEEEE7E9 +:10E8100000BFFFFFF0B5684CA544069104000792C5 +:10E820000493012B09D10300A4331B68012B04D0EE +:10E83000624C2000624B9D44F0BD63681A00039354 +:10E84000FC23103A9B009A42F2D82300A8331868A0 +:10E85000C0B20BF03FFC051EEAD00BF001FE039A9C +:10E86000461C7300070005939342E1D8049B1CAA41 +:10E87000002B1ED1FFAB983320001968FFF7B0FCC6 +:10E88000041E0CD109A80BF031FC2200290009A8B4 +:10E890000BF060FC041E16D009A80BF02DFC8021A3 +:10E8A0001CA8C900FBF706FE40210CA8FBF702FEDE +:10E8B000BFE7FFAB0092983320001B68079A0699C8 +:10E8C000FFF7D0FCDCE759201CAB9E19039B06AC7C +:10E8D000013BDB1B049309AB0093001932003900A4 +:10E8E000049BFFF7F3F8041ED6D1592209AB06A901 +:10E8F000009352183B0030000499FFF7E7F8041E1C +:10E90000CAD109A80BF0F8FBFFAAFFA90CAE903200 +:10E910008C3133002800126809680BF0C7FC041E14 +:10E92000BDD1582206AB9B181D78592306AA9B1807 +:10E930000200D9196DB2BA4229D30020059A039B6F +:10E94000C9199B1A5B180E009C4602000127B445AA +:10E9500024D101208B5C584005436DB2002D27D196 +:10E960000132039B89181CAA8A1A9A1AFFABA0339A +:10E970001B689A421ED8FFAB94331B681A60002AAA +:10E980008DD0FFAB9C331868F1F7F2FE87E7935DFB +:10E99000885C013243401D43EDB2CBE7337801364A +:10E9A000184343420343DBB2DB097B40D218CEE776 +:10E9B000044C74E7044C72E78CFBFFFF80BFFFFF41 +:10E9C0007404000000BFFFFF00BCFFFFF0B5744CF3 +:10E9D0001E004368A5440393012E05D10300A43310 +:10E9E0001B68002B00D0D9E0FC24039BA400103B43 +:10E9F000A34200D9D2E0002E00D081E0FFAB08AAEC +:10EA0000196C4033FFF7ECFB041E70D106AB1F7A84 +:10EA10005B7A012E00D07BE00220210043401F439F +:10EA200008ABC25C013055422A43D2B2D2097240CF +:10EA30001443E4B262422243D2B2D2097240D2B24B +:10EA40008918039A8242ECD1FFAB039A48331B68C2 +:10EA50000B3A9A4202D9FFAB9A6C48330800083847 +:10EA6000C00F07430120039B6442E40F4440D81EBB +:10EA7000401A010027437E423E43F6175140314081 +:10EA80004140531AD80FDB17844603438820822461 +:10EA9000DB17C0011840E401444034404440604664 +:10EAA000074378423843C0170B27C043644208AE7F +:10EAB000F57A01370540F572039D0136BD42F7D165 +:10EAC00016004E401E404E4008ABA91A5918002AA5 +:10EAD0003BD1FFAB48331B68002B04D0FFAB586C15 +:10EAE0004433F1F745FEFFAB3C331B681E608021C9 +:10EAF00008A8C900FBF7DEFC20002A4B9D44F0BDAE +:10EB000008AB0093FFAB40331B68FFF7ABFB7BE721 +:10EB100001202100022643401F43082206AB9B1818 +:10EB20009A5D01365342DB0F43401C43634223434B +:10EB3000D243DD0F4540AC46DB17D2B29A43039B6C +:10EB400061441743B342E8D17EE7931B0593531802 +:10EB50000693531E70420493C517C30F2B430D0039 +:10EB6000DB1703936B1C0793069B6F1CBB420AD1F8 +:10EB7000049B039FCB181D7801302F401F70059B0D +:10EB80008342E9D1A5E72B786F78BC467B40039F91 +:10EB90003B4067467B402B70079DE3E7024CABE7A9 +:10EBA000DCFBFFFF2404000080BFFFFFF0B5040082 +:10EBB000A434246887B00D9D0E9E0F9F002C04D0B6 +:10EBC000012C0AD00A4807B0F0BD0C9C03970296AE +:10EBD00001950094FFF7FAFEF5E70C9C0597029467 +:10EBE00000240496039501940094FFF713FEEAE7CE +:10EBF00000BFFFFFF0B5A1B00A9326AB03901878D1 +:10EC00000A9B05910992012B08D1039BA4331B6831 +:10EC1000012B03D05D4C200021B0F0BD059B002BE3 +:10EC2000F8D0039B5B680293002806D00BF052FAE1 +:10EC30000028EFD00BF014FC2790039BA833186832 +:10EC4000C0B20BF047FA071EE4D00BF009FC029AA1 +:10EC5000049043009A42DDD302330600934201D967 +:10EC6000961E361A0021029A2998F1F79DFD32006E +:10EC70000998059B10A99847041E02D0444BC4185C +:10EC8000C9E7039B0DAD08331800069304F0FCF9A7 +:10EC9000049A029B10A99B1A0793299A023B9B1B7B +:10ECA000D3185A1C089201220B901A70089832004F +:10ECB000F1F75EFD28000BF019FA22003900280058 +:10ECC0000BF048FA041E48D128000BF089FA041E04 +:10ECD00043D1089B08229F19390028000BF0A6FA9F +:10ECE000041E3AD12800279A28990BF09FFA041E97 +:10ECF00033D13200280010A90BF098FA041E2CD151 +:10ED0000390028000BF0B2FA041E26D107230B9815 +:10ED100007990138184043425841299B0139091A83 +:10ED20003A0018180095049BFEF7D0FE041E14D17B +:10ED3000069804F0A9F9FF22029B4021DB00013371 +:10ED40001B1A1A41299B10A81B781340299A13708B +:10ED5000BC23049ABB54FBF7ADFB0DA80BF0CCF918 +:10ED6000002C00D057E70A9B002B06D1299A039864 +:10ED70001100FFF735FA04004DE7299B099A059920 +:10ED800003980093FFF76EFAF5E7C04680BFFFFFD8 +:10ED900080BBFFFFF0B587B01E000CAB05000F9FD6 +:10EDA000187804910592012E04D12B00A4331B681E +:10EDB000002B50D100976B680E9A0D99FEF7D6FE86 +:10EDC000041E07D1002E08D13A0039002800FFF7B1 +:10EDD00007FA0400200007B0F0BD01206968FBF7C6 +:10EDE0004FFB061E09D001206968FBF749FB039021 +:10EDF000002805D13000FBF74BFB10246442E9E703 +:10EE00003B002800059A04990096FFF72BFA041E90 +:10EE100011D131002800039AFFF7E2F9041E0AD14C +:10EE2000010003006A689A420CD1002911D1310017 +:10EE30003800F1F79DFC3000FBF72AFB0398FBF745 +:10EE400027FBC7E70398FD5CC05C013368400143C2 +:10EE5000E9E7024CEFE7024CBCE7C04600BDFFFF0C +:10EE600080BFFFFFF0B50500A43585B02D680AAC62 +:10EE700024780C9E0D9F002D04D0012D0AD0094846 +:10EE800005B0F0BD0B9D0397029601950094FFF726 +:10EE900081FFF5E70B9D0397029601950094FFF71C +:10EEA000A9FEEDE700BFFFFFF0B56E4C0500A544DD +:10EEB000FFA88C300678FFA8983000780390012BCB +:10EEC00009D12800A4300068012804D0664C200035 +:10EED000664B9D44F0BD6F68FC203C00103C8000F8 +:10EEE0008442F3D81CA8002B00D0AFE0FFABA033C6 +:10EEF000020019682800FFF773F9041EE7D17B1E92 +:10EF000005937A1E1CAB9B5CBC2B00D0A8E0002EA6 +:10EF100009D030000BF0DEF80028D7D00BF0A0FAB3 +:10EF2000FFAB9033186003980BF0D4F8041ECDD0DB +:10EF30000BF096FA08220021039007A8F1F734FCA1 +:10EF40002800083004F0A0F8431E0493012304991C +:10EF50001CADDB1B2A78DB005B181A41B6D10B0015 +:10EF60005B0703D1612504AB059FED18039B0233BA +:10EF7000BB42ABD809AE30000BF0B8F8210000223C +:10EF800030000BF0E7F8041E5CD1039B2800D94346 +:10EF9000C9196B1805930096039B6A18FEF796FD36 +:10EFA000041E4FD1FF226021049BF800C01A0241C9 +:10EFB00004AB5B181B78134004AA52181370059B0E +:10EFC0005A1E2B780135691E8A4201D9002BF8D0D0 +:10EFD000012B43D1059B5E1BFFAB9C331B680133A8 +:10EFE00004D0FFAB9C331B689E4237D109A80BF0BD +:10EFF000F7F8041E26D1082207A909A80BF016F974 +:10F00000041E1FD1FFAB90331A68FFAB943319680D +:10F0100009A80BF00BF9041E14D13200290009A82D +:10F020000BF004F9041E0DD10CA909A80BF01EF970 +:10F03000041E07D1039A05980CA9F1F78BFB041E57 +:10F0400000D00B4C09A80BF057F840E7FFAB00903D +:10F05000A03328001B68FFF705F94EE7054CF1E7E0 +:10F06000044C34E78CFBFFFF80BFFFFF74040000FB +:10F0700080BCFFFF00BFFFFF70B5050086B0A8355C +:10F080000AAC24782E682500002E00D0F5B20D9E23 +:10F090000395059601260C9D764202950B9D0496DC +:10F0A00001950094FFF700FF06B070BDF0B587B082 +:10F0B00003930CAB1C78039B476802900491059264 +:10F0C000012B04D10300A4331B68002B34D1390079 +:10F0D0000120FBF7D5F9061E30D039000120FBF7DF +:10F0E000CFF9051E2DD000903B0020000E9A0D99FF +:10F0F000FEF73CFD041E26D1039B002B0ED13200EF +:10F100000F990298FFF76CF8041E1CD1020003004F +:10F110009F420BD1002A16D0144C14E00F9B059A85 +:10F12000049902980096FFF79DF8EDE7F15CE85C22 +:10F13000013341400A43EBE70D4C14E010246442D4 +:10F1400011E01024644230003900FBF7B3F93000BD +:10F15000FBF79EF9002D06D028003900FBF7AAF92D +:10F160002800FBF795F9200007B0F0BD80BCFFFF39 +:10F1700080BFFFFFF0B50500A43585B02D680AAC4F +:10F1800024780C9E0D9F002D04D0012D0AD0094833 +:10F1900005B0F0BD0B9D0397029601950094FFF713 +:10F1A00085FFF5E70B9D0397029601950094FFF705 +:10F1B00063FFEDE700BFFFFF10B5041E32D08C30B7 +:10F1C00003F0C4FD2000983003F0C0FD200068303B +:10F1D00003F0BCFD2000203003F0B8FD20003830E3 +:10F1E00003F0B4FD20002C3003F0B0FD20001430FB +:10F1F00003F0ACFD2000083003F0A8FD20008030B3 +:10F2000003F0A4FD2000743003F0A0FD20005C306A +:10F2100003F09CFD2000503003F098FD20004430A6 +:10F2200003F094FD10BD0000F0B595B006001D0080 +:10F23000069107927F2B00D8DAE01A9B022B00DCA4 +:10F24000D6E0EB0700D5D3E08023DB00AB429B4147 +:10F250005B425B000BA8059303F072FD0EA803F060 +:10F260006FFD11A803F06CFD3300143318001A99D8 +:10F27000029303F09DFE041E00D0A6E06B080493E9 +:10F280000890C72D01D9633B089301356B0809939A +:10F290003700079B2C3700933800069B059A04998A +:10F2A00005F0EEFA041E00D08FE03500079B3835DC +:10F2B00000932800069B059A049905F0E1FA041EC4 +:10F2C00000D082E02A0039000BA804F06AFA041E7C +:10F2D00000D07AE00BA803F0D7FE089B9842D7D95C +:10F2E0000B9B002B03DA2900380003F0D4FD012228 +:10F2F0003900380004F08BFA041E66D1012229007F +:10F30000280004F084FA041E5FD12A0039000BA8FB +:10F3100004F08FFA041E58D102990BAA0EA804F02B +:10F32000C5FF041E51D101210EA804F06EF900287A +:10F33000AED12A0039000EA804F0B8FF041E44D153 +:10F3400001000EAB0BAA11A804F074FB041E3CD103 +:10F35000330020331800029911AA039305F018F91D +:10F36000041E32D1039803F08FFE099B98428FD977 +:10F3700001223900380004F038FA041E25D1012298 +:10F380002900280004F031FA041E1ED1330008338E +:10F390002A0039001800029304F04BFA041E14D11D +:10F3A000029803F08DFE33005C3301930C3B7060D8 +:10F3B000009329003800039A0C3B00F0BDFA041EAC +:10F3C00003D13000FEF7B8FE04000BA803F0BEFC2A +:10F3D0000EA803F0BBFC11A803F0B8FC002C04D06D +:10F3E0003000FFF7E9FE034BE418200015B0F0BD34 +:10F3F000014CFAE780BEFFFF80BFFFFFF0B599B078 +:10F4000005000F0014006A4936220AA81E00F1F711 +:10F41000AFF9002E04D104246442200019B0F0BDDD +:10F420001E9B002BF7D0B368002BF4D11E9B99686C +:10F430000029F0D1280004F0E8F80028EBDD0121D4 +:10F44000200004F0E2F80028E5DD2900200004F0A7 +:10F4500049F80028DFDA0121380004F0D6F8002846 +:10F46000D9DD2900380004F03DF80028D3DA07A8D8 +:10F4700003F066FC04A803F063FC21003A0004A832 +:10F4800004F0D7F9041E0FD104A90122080004F0EA +:10F49000BEF9041E08D104A803F0DAFD83B2039379 +:10F4A000002B08D10424644207A803F04FFC04A8F1 +:10F4B00003F04CFCB1E781B204A803F038FF041E4E +:10F4C000F2D1AB681F6807231F40013F7B425F41B9 +:10F4D0000AABF95C07A803F06BFD2A00300007A90E +:10F4E00004F0E4FE041EDFD10121300004F08DF8A9 +:10F4F000002804D00137BBB2352BE9D9D2E71E9BD7 +:10F5000007A9009308002B0004AA04F095FC041E30 +:10F51000CAD101230293012107A804F076F800283C +:10F520003ED007A90122080004F05FF9041EBBD1F8 +:10F530002A00300007A904F0B9FE041EB4D101214D +:10F54000300004F062F801280DD12900300003F0EA +:10F55000C9FF431C07D1210033002A001E9804F084 +:10F5600069FA0400A0E707A90122080004F04FF996 +:10F57000041E99D107AA1100100004F05AF9041EC4 +:10F5800092D107A92A00080004F0E6FB041E8BD1E3 +:10F59000029B01339BB20293029A039B9342BAD21D +:10F5A000012107A804F031F80028A3D07AE7C0466B +:10F5B00037DA0110F0B507000E0015001C0089B005 +:10F5C000002B04D104277F42380009B0F0BD002190 +:10F5D000180004F01AF801900028F3D10121380036 +:10F5E00004F013F80028EDDD0121300004F00DF8DF +:10F5F0000028E7DD2800019904F007F80028E1D091 +:10F6000002A803F09DFB05A803F09AFB3900012234 +:10F6100002A804F0FCF8071E22D10122310005A83F +:10F6200004F0F5F8071E1BD1200005AA02A904F07A +:10F630003DFE071E14D102A9080005AA04F0F9F83E +:10F64000071E0DD102AA01002300100004F0F2F9F8 +:10F65000071E05D12900200002AA04F099FF070027 +:10F6600002A803F073FB05A803F070FBACE70000F1 +:10F67000F0B587B0040068461F000D00160003F0C7 +:10F680005FFB03A803F05CFB002F07D10C9B002B52 +:10F690002CD10D9B002B46D1002402E0002C09D177 +:10F6A000364C684603F052FB03A803F04FFB2000E2 +:10F6B00007B0F0BD21000122684604F0A8F8011E41 +:10F6C00051D13900320003A804F06BF8011E4AD171 +:10F6D00003A908006A4604F03FFB011E43D103A8BA +:10F6E00003F093FF0028D1D0254CDAE7002DD7D0C6 +:10F6F00029000122684604F08AF8011E33D10C99D2 +:10F70000320003A804F04DF8011E2CD103A9080013 +:10F710006A4604F021FB011E25D103A803F075FF02 +:10F720000028B6D0E0E7002CBAD0002DB8D00D9953 +:10F730002A00684604F07DF8011E14D169460122B2 +:10F74000684604F064F8011E0DD16946220068463F +:10F7500004F002FB011E06D1684603F056FF0028A4 +:10F7600000D199E7C0E7064B9942BDD0034B9942BF +:10F7700000D195E7024BCC1893E7C04680BFFFFF4E +:10F7800000BEFFFFF0B589B00F9C050002A80E0077 +:10F790001700019303F0D4FA05A803F0D1FA002C66 +:10F7A0004FD0002E54D0220032213000109B05F0A3 +:10F7B00035F800284CD05F4C02A803F0C7FA05A822 +:10F7C00003F0C4FA002C03D05A4B9C4200D0E4183A +:10F7D000200009B0F0BD3A00310002A804F029F879 +:10F7E000041EE9D10121280003F00FFF0028E2DD0B +:10F7F000290002A803F076FE0028DCD1019B002B33 +:10F8000003D1002E32D10024D6E70E9B002BF8D076 +:10F810000121019803F0F9FE0028CCDD01210E98AA +:10F8200003F0F3FE0028C6DD2900019803F05AFE1C +:10F830000028C0DA29000E9803F054FE0028E0DB0F +:10F84000B9E7002E01D0002F0ED1002DD6D1DAE776 +:10F85000002FFAD0220032213800109B04F0DEFF86 +:10F860000028A8D1002EF0D0002DB4D1002FCAD08E +:10F87000019B002BC7D00E9B002BC4D00121300070 +:10F8800003F0C3FE002896DD0121380003F0BDFE21 +:10F89000002800DC8FE70E9A019902A803F0C9FF47 +:10F8A000041E00D088E702A90122080003F0AFFF80 +:10F8B000041E00D080E70122310005A803F0A7FF55 +:10F8C000041E00D078E702A9080005AA04F044FA53 +:10F8D000041E00D070E7010002A803F096FE002885 +:10F8E00000D068E70E9A019902A803F0A2FF041E57 +:10F8F00000D061E702A90122080003F088FF041E7E +:10F9000000D059E70122390005A803F080FF041E4A +:10F9100000D051E702A9080005AA04F01DFA041E50 +:10F9200000D049E7010002A803F06FFE002800D1D3 +:10F9300069E740E700BEFFFFF0B587B0060003A807 +:10F9400001930D00170003F0FBF9019B002B0CD174 +:10F950000C9B002B1DD10D9B1C1E14D032002900C6 +:10F960000D9804F015FE04000DE00122310003A8FB +:10F9700003F04DFF041E06D13900019803AA04F0DC +:10F98000EBF9041EE4D003A803F0E0F9200007B06F +:10F99000F0BD0122290003A803F039FF041EF2D1B3 +:10F9A00039000C9803AA04F0D7F9041ED3D0EAE773 +:10F9B00010B55C220021F0F7F7FE10BD10B500284D +:10F9C00002D05C21FAF776FD10BD10B55C22F0F78D +:10F9D000CFFE10BD03000020064A9A60064A186058 +:10F9E000DA60064A58601A61054A5A61054A9A6106 +:10F9F0007047C0460123456789ABCDEFFEDCBA985E +:10FA000076543210F0E1D2C3F0B54A780B78120286 +:10FA10001A438B7895B01B041A43CB7806001B065B +:10FA200013431BBA4A7912930B7912021A438B794A +:10FA300008001B041A43CB791B251B0613431BBA72 +:10FA40004A7A13930B7A12021A438B7A1B041A43D5 +:10FA5000CB7A1B0613431BBA05934B7B0A7B1B0215 +:10FA600013438A7B12041343CA7B12061A4313BA48 +:10FA700006934B7C0A7C1B0213438A7C12041343BB +:10FA8000CA7C097D12061A4313BA427D0993837D0D +:10FA9000120211431B041943C37D1B060B431BBAFF +:10FAA0000A93037E427E12021343827E12041A439B +:10FAB000C37E1B0613431BBA427F1093037F1202BF +:10FAC0001343827F12041A43C37F1B0613431BBADE +:10FAD0001193431CDA7F831CDB7F1B021A43C31C78 +:10FAE000DB7F1B041343021DD27F12061A4313BA95 +:10FAF00002000B93431DD97F831DDB7F08321B025D +:10FB00001943C31DDB7F1B040B43D17F2132090640 +:10FB100019430BBA0C930300127828331978120298 +:10FB200011439A7803331B7812040A431B061343CC +:10FB30001BBA0D9303002C331A7801331B781B0278 +:10FB40001A4303002E331B781B04134302002F3289 +:10FB5000127812061A4313BA0E93030030331A7840 +:10FB600001331B781B021A43030032331B781B043A +:10FB70001343020033321278376912061A4313BA5C +:10FB800002000F93030035323433127819781202D1 +:10FB900011439A7803331B7812040A431B0613435C +:10FBA0001BBA009303003833197801331B78020025 +:10FBB0001B02194303003A331B783B321B040B43EF +:10FBC0001178B468090619430BBA019303003C335A +:10FBD0001A7801331B78B1691B02134302003E32CD +:10FBE00012783F3012041A43037802201B061A438E +:10FBF00013BA02937369FE4A5F40F3688A181F4084 +:10FC00007369F1685F40B368C141EB419B18FF180D +:10FC1000129BF74ADB19039333690F004B402340D3 +:10FC2000346963407469A2189B18039A139CEA41D3 +:10FC30001B19D318B268039CC241574027404F405C +:10FC40003469BC46EA4FE719059C3F191C00EC419A +:10FC50006744A4463C006444A446039CC441039406 +:10FC60001400039F7C40E24F1C40C919069F54407A +:10FC7000C91961186446EC41C34167466418039989 +:10FC800059403940039F7940D94FD219099FD21961 +:10FC90008A182100E9418A18049262461900C2417B +:10FCA0005140214059408C46D14F0A99C919039FB0 +:10FCB000C919049F6144EF4179180791210014008C +:10FCC000C1414C402700049C039127403C001099FF +:10FCD000C74F5440CF19FB18E318079C039FEC4112 +:10FCE000E418049B0799C3415F400F4003994F40BC +:10FCF000BC461199BE4FCF19BF182200EA41674494 +:10FD0000D119079F1A00C7417A4022405A400491F6 +:10FD100094460B99B64AC4418A1803995118049A1B +:10FD20006144EA4152183900079261402200049C64 +:10FD300021400C007C40A446AD490C9C6118079CF6 +:10FD4000C918EC41049B6144C3416418110003933A +:10FD50005940079B194051400D9B8C46A4495918A6 +:10FD6000CF192100E9416744CB190799039FC1418D +:10FD700004934F40039B27405F40BC460E9B9C4F23 +:10FD8000C441DF19BF18049A6744EA41D3190A0035 +:10FD90000793049B62401A40270014000F9B944A6B +:10FDA0004C409A18039BD218A218079C049BEC4164 +:10FDB000C341A4183A0003935A40079B1A407A4063 +:10FDC000009B94468A4A9A1852182100E9416244DD +:10FDD0008B1807999C46C1410A00039B04915A4025 +:10FDE00022405A408249019BC4415918C9196746AB +:10FDF000EF415218BB1807936346049A7C4962404E +:10FE00001A40049B27005A40029B5918039BC918AB +:10FE1000079B5218EB419B1808936346C3419C46CD +:10FE2000129B059C724963400B9C6340009C63409D +:10FE30001F24E34103936346079C7B402340039CBC +:10FE40007B406218049C614612199B18089A069C14 +:10FE5000EA41D218079BC3410793139B63400C9C54 +:10FE60006340019C63401F24E341079C049361406D +:10FE7000089C2140644661401C005D4BE318DB197F +:10FE8000C918089B099CC3410893059B1700634050 +:10FE90000D9CEF416340029C7F1863401F24E341A7 +:10FEA000089C0593079B524963401340C241079C3D +:10FEB00012926340059C069A61180A9C6144624054 +:10FEC0000E9C59186240039C3B0062401F24E24193 +:10FED000EB41129C0692089A5B186240089C3A40DB +:10FEE00062404349069CC7416118079C1397091952 +:10FEF00052181900E941109C8918099A129F624012 +:10FF00000F9C6240049C62401F24E2410792139AB6 +:10FF1000079C57405F40C341364A9C46A218089C44 +:10FF20000A9B1219119CBF186340009C0A00634091 +:10FF3000059CEA4163401F24E34164460893139BF8 +:10FF4000D71963402B4A089C4B40A218129CC14110 +:10FF500012199A183B00EB411F249A181291109B1A +:10FF60000B994B4001994B4006994B40E341614648 +:10FF70000993129C61401C001E4B7940E318139CAE +:10FF8000C7411B19C9181300EB4110970C9C119F16 +:10FF9000591867403B00029C6340079C63401F0068 +:10FFA0001F24E741109C0A97129F124B67400A9C3E +:10FFB0005740E3186344FF180B00EB41DB191700AF +:10FFC000C7410D9CBC460B9F67403A00039C6240B2 +:10FFD000089C624017001F24E74164460B97109F5E +:10FFE000044A67404F40C1410B9C1191A21803E0A5 +:10FFF0009979825AA1EBD96E129C0C9912190E9C18 +:020000041001E9 +:10000000BF186140049C1A006140099CEA416140AC +:100010001F24E1410C916146119CD2196140FE4FB1 +:100020000C9C5940E719109CC3413F19C91917008E +:10003000EF411F247F1810930F990D9B4B4005999A +:100040004B400A994B40E3411199109C0D9361403C +:100050001C005140C241F04BE3186344009C94469D +:100060000E9AC9186240069C3B0062400B9CEB4113 +:1000700062401F24E24164460E92109A5B1862406F +:10008000E5490E9C7A406118119C09195218190013 +:10009000E94189183A00C241019C11920F9ADE4F42 +:1000A0006240079C62400C9C62401F24E2410F9218 +:1000B0006246119C62405A40C3410F9CE719109C54 +:1000C00010933F19009B029CD2196340089C0F00BB +:1000D00063400D9CEF4163401F24E341109C00935B +:1000E000119BBF1863404B40C141009CCA4AA218F3 +:1000F0006244039C8C4601999B186140099C3A001C +:1001000061400E9CEA4161401F24E1416446D318DE +:10011000109A019162400C00BF497A406118119C0D +:10012000C741091952181900E9411197049C029F0F +:10013000891867403A000A9C62400F9C6240170091 +:100140001F24E74102976746119CB34A67405F400E +:10015000C341029CA218109C10931219039B059C8A +:10016000BF1863400B9C0A006340009CEA41634057 +:100170001F24E341109C0393119BD7196340A64AA7 +:10018000039C4B40A21862449B183A00C141EA41CB +:100190008C461F24D2180699049B4B400C994B4067 +:1001A00001994B40E34164461099049361401C005F +:1001B000994B7940E318119CC7411B19C9181300CA +:1001C000EB411197059F079C591867403B000D9C18 +:1001D0006340029C63401F001F24E7410597674668 +:1001E000119C8D4B6740059C5740E318109C1B19D0 +:1001F000FF180B00EB41DB191700C741089C109753 +:10020000069F67403A000E9C6240039C62401700C4 +:100210001F24E741109C0697119F7F4A6740069C68 +:100220004F40A2186244BF181A00C141EA418C46EF +:10023000099C0799D71961400A000F991F244A4069 +:1002400004994A401100E141644607911099724AAD +:100250006140079C5940A218119C121989183A0054 +:10026000EA4152181900C1410A9C11910899614054 +:100270000B0000991F244B4005994B401900E141A8 +:1002800008916146119C644B6140089C7940E318D9 +:10029000109CC7411B19C9181300EB410B9C5B183C +:1002A00009996140019C6140069C61401F24E14125 +:1002B00009911199099C7940514010915649C241C8 +:1002C0006118109C614461181C00EC411292A44614 +:1002D0000A9A0C9C61446240029C6240079C624006 +:1002E0001F24E2410A92129A0A9C7A405A4094468C +:1002F000494AC341A218119C109312190C00EC41F9 +:100300000B9B6244A4460D9C62446340039C634083 +:10031000089C63401F24E3411C000B933F4BE318F0 +:100320001400EC41DF193F19109C0C432300129C70 +:100330002340109C0C40C14123438C460E9C0C99D9 +:10034000DF1961400B0004994B4009994B4019009B +:100350001F23D9410C91614611430B0010990C9C4D +:100360000B406146114019432C4BC241E318129CCB +:1003700011921B19CB183900E9410D9ACB180F992E +:10038000109C4A4005994A400A994A401F21CA4197 +:1003900011000D92214A891809191C00EC41091914 +:1003A000119C3C43220064462240119C3C40C741C2 +:1003B000224312970E9C009F51187C402200069CFD +:1003C000129F62400B9C1F40624014001F22D441C8 +:1003D0000E94129C1C432200119CC34122401743DF +:1003E0000E9C0E4AA2180C00EC416244BF181F225A +:1003F0009C46E7190F9B019C6340079C63400C9C43 +:100400006340D341054A0F939A18119B129CD2184E +:100410003B00EB41D21803E0A1EBD96EDCBC1B8F93 +:1004200063460B43234064460C4023439A180B0059 +:10043000C3411F21029C1193009B6340089C6340B1 +:100440000D9C6340CB411093119B109C3B431900C2 +:1004500063461940119B3B400B43FE49C74161185D +:10046000129C009709191400EC415B18039FE318D4 +:10047000019C7C402100099C61400E9C61400C0065 +:100480001F21CC41F349019467181C00EC416744DB +:100490003F19009C14432100119C2140009C1440F2 +:1004A00021431400C441C919A446049F029C7C4006 +:1004B00022000A9C674662400F9C1F406240140065 +:1004C0001F22D441029464461C432200009CC34175 +:1004D00022401743029CDF4AA218119C1193121963 +:1004E0000C00EC41BF18E719039B059CD94A6340F7 +:1004F0000B9C6340109C63401F24E341009C0393CA +:100500009B181B193C00EC411B19119C0C43220049 +:1005100064462240119C0C402243D2180B00C34178 +:100520001F210093069C049B63400C9C6340019C2C +:100530006340CB410493009B049C3B431900119BF7 +:100540001940009B3B400B43C249C741611814004E +:10055000EC4161445B18BC46E318079F059C7C4056 +:1005600021000D9C6140029C61400C001F21CC4188 +:10057000B84905946718119C3F191C00EC413F19BC +:10058000644614432100009C214064461440C2414B +:1005900021431192089C069AC91962400E9C624040 +:1005A000039C62401F24E2410692119A069C1A4362 +:1005B000170062461740119A1A403A43A54FC341AB +:1005C000E719009C12933F190C00EC41D219A218B4 +:1005D000079B099C9F4F63400F9C6340049C0090C5 +:1005E00063401F24E3410793DF191300EB41129C82 +:1005F00067440C43FB182700119C2740129C0C40B9 +:10060000C14127438C46FF180A99089B4B4010991B +:100610004B4005994B401F21CB41089363461299EB +:1006200013430B4061461140089C1943894BC2415A +:10063000E318119C11921B19C9183B00EB411F22B2 +:100640005B180B9C09996140019C6140069C6140CC +:10065000D141804A08008A1812996446521819003C +:10066000E9415218119939432140119C3C402143E2 +:1006700089180222D7410C9C12970A9F1D326740AD +:10068000029C6740079C6740129CD7411C43220094 +:100690000997119C129F22401F40099C17436D4AE5 +:1006A000A21862441C00BA1802230F00DC41EF417B +:1006B000A446BA180B9C0D9F7C402300039C170096 +:1006C0006340089CEF4163401C001F23DC41614BE9 +:1006D0000A94E318119C1B19DB196746129C0F43FF +:1006E000274064460C402743FF180223D94111914B +:1006F0001F210C9B0E9C6340049C63404340CB41F4 +:10070000644611990B93119B1143214013400B9C9C +:100710000B4350496118129C09195B183C000221D7 +:10072000EC41CA41E31812920F9C0D9A1D316240B0 +:10073000059C6240099C6240CA4146490C9251188E +:100740001A00EA41129C61443C438A182100119C22 +:100750002140129C3C40214389180222109CD74121 +:100760000E9A6240069C62400A9C62401F24E2414D +:100770000D921A00129C3A4322403C001C40144344 +:10078000A446344A0D9CA218119C12190C00EC418D +:100790006244A4460224E341019C11930F9B6244EE +:1007A0006340079C63400B9C63401F24E3410E930E +:1007B000119B0E9C7B404B409C46274BE318129CA0 +:1007C0001B191400EC416344A4460224E141029C3D +:1007D0001291109963446140089C61400C9C6140F7 +:1007E0001F24E141129C0F911199614051400F9CCF +:1007F0008C46194961180224CF191900E241E941D8 +:10080000039C67449446019AC919624017000D9AE7 +:10081000474057403A001F24E24164460192129A31 +:100820000D4F6240019C5A40E719119C3F190C0082 +:10083000EC41D219A2180224E341029C1093049BBC +:100840005C402700099C1F2367400E9C67403C00CA +:10085000DC4103E0DCBC1B8FD6C162CA0294644653 +:10086000109B5C402700DD4B029C4F40E318129C1C +:100870001B19FF181300EB41DF190223D941119115 +:100880001F21059C039B63400A9C63400F9C6340AF +:10089000CB41119C0393109BD0496340039C534070 +:1008A000611861445B183900E941C9180223DA4133 +:1008B000069C9446049A624013000B9A6446534087 +:1008C000019A53401A001F23DA410492119AC34B34 +:1008D0006240049C7A40E318109C1B190C00EC4108 +:1008E000D218A3183A000224E241079C1092059AFC +:1008F000624017000C9A1F245740029A57403A0052 +:10090000E24105926246109CB44F6240059C4A4009 +:10091000E719119C3F191C00EC41D219A7180222BB +:10092000D141069A119108994A400D99119C4A406B +:1009300003994A401F21CA41109906926140140050 +:10094000A64A5940A218624489183A00EA4152184E +:100950000221CB419C46079B0E9943404B40049992 +:1009600064464B401F21CB411199079361401C0005 +:100970009A4B7940E318109C1B19C9181300EB41DE +:100980005B180221CF41099C1097089F1D316740D9 +:100990000F9C6740059C6740CF4108976746109CB5 +:1009A0008E496740089C57406118119C09197F18AF +:1009B00019000224E941E241C919070011921F22DE +:1009C0000A9C6740019C6740069C6740D7413800FD +:1009D000119C109F814A67400224821862445F4044 +:1009E000BF180A00E341EA419C460B9C099BD219BF +:1009F00063401F00029B1F245F40079B5F403B003A +:100A0000E34164460993119B744F6340099C4B403A +:100A1000E719109C3F191400EC41DB19E718022379 +:100A2000D9410A9B10910C99109C4B4003994B4063 +:100A300008994B401F21CB41614661401C00129335 +:100A4000664B5140E318119C1B19C9183C00022346 +:100A5000EC41DA4161180A920D9C0B9A6240130036 +:100A6000049A0A9C534043401A001F23DA41119212 +:100A7000109A5A4B6240119C7A40E3180C00EC41EA +:100A80006344D218A3183A000224E2410E9C0B9250 +:100A90000C9A62401700059A1F245740099A574044 +:100AA0003A00E2410B9C0C920A9A4C4F62400C9C1B +:100AB0004A40E719109C3F191C00EC41D219A718B5 +:100AC00002220F9CD1410D9A6240069C6240129C0A +:100AD00062401F24E2410D920B9A0D9C4A405A40FD +:100AE00094463E4AA2180A9C12193C00EC4162440A +:100AF000A4460224E341019C05930E9B624463409B +:100B0000079C6340119C63401F24E3410793059BAE +:100B1000079C4B407B409C46304BE3180B9C1B19B9 +:100B20001400EC416344A4460224E741029C06976A +:100B30000F9F63446740089C67400C9C67401F24DC +:100B4000E741264C3F197918069C059F674057409E +:100B5000C9191F000224EF41E2417918019C039F4B +:100B6000674047401F200D9C6740C7411B4C1D3804 +:100B70003F19059C3F19069C54405C40A4460C005C +:100B8000EC416744A446029CBC44049FC3416740B7 +:100B9000099C1D306740079C6740C7410F4CB068F7 +:100BA00004193F19140006985C404C403F183F1947 +:100BB0006446EC41F0683F196044B760F060022081 +:100BC000C14130690918002031617169CB18736126 +:100BD000B3699A18B26115B0F0BDC046D6C162CAF9 +:100BE000F7B50400161E009101D10020FEBD3F257F +:100BF00003681D40D31803609A4202D94368013349 +:100C00004360002D17D040277F1BBE4213D3230023 +:100C10001C3300993A0058190193EFF7A9FD200001 +:100C20000199FEF7F1FE0028E0D176190500009B3E +:100C3000403EDB190093370005E02000FEF7E4FE9C +:100C40000028D3D1403F009B9919C91B3F2FF4D8EE +:100C5000002FCAD020001C303A004019EFF788FD61 +:100C6000C3E73F2370B506000D00802102681C36E3 +:100C700013405A1CC31804001977B018382A4CD8EE +:100C8000382300219A1AEFF78FFD22686368510F0D +:100C9000DB000B43D2001BBA12BA3100200063659F +:100CA000A265FEF7B1FE002836D1A3681B0E2B709B +:100CB000A3681B0C6B70A3681B0AAB70A368EB7076 +:100CC000E3681B0E2B71E3681B0C6B71E3681B0A56 +:100CD000AB71E368EB7123691B0E2B7223691B0C4C +:100CE0006B7223691B0AAB722369EB7263691B0E7B +:100CF0002B7363691B0C6B7363691B0AAB736369AA +:100D0000EB73A3691B0E2B74A3691B0C6B74A36993 +:100D10001B0AAB74A369EB7470BD402300219A1ABF +:100D2000EFF742FD31002000FEF76EFE0028F3D100 +:100D3000010038223000A6E7F0B599B0060001A8FE +:100D40000F001500FEF734FE01A8FEF743FE041E57 +:100D50000BD13A00310001A8FFF742FF041E04D175 +:100D6000290001A8FFF77DFF040001A8FEF726FE79 +:100D7000200019B0F0BD10B56C220021EFF714FD72 +:100D800010BD10B5002802D06C21F9F793FB10BDFF +:100D900010B56C22EFF7ECFC10BD000000230360DF +:100DA0004360994212D1114B8360114BC360114BC8 +:100DB0000361114B4361114B8361114BC361114BB3 +:100DC0000362114B43628166002070470F4B8360C2 +:100DD0000F4BC3600F4B03610F4B43610F4B83619C +:100DE0000F4BC3610F4B03620F4BEBE767E6096ADA +:100DF00085AE67BB72F36E3C3AF54FA57F520E513C +:100E00008C68059BABD9831F19CDE05BD89E05C1CB +:100E100007D57C3617DD703039590EF7310BC0FF1E +:100E200011155868A78FF964A44FFABE0200002379 +:100E3000F0B50832D7B00C900B920B9AD2580192B1 +:100E400001980EAA98500433202BF6D10C0016AB53 +:100E5000180040340A784D7812062D042A43CD78C4 +:100E60002A438D7804312D022A4304C08C42F1D1EB +:100E7000159A119F0492129A09930592149A069258 +:100E8000139A07920E9A01920F9A0292109A039265 +:100E9000DB4A1000089206220B2605991925D1413C +:100EA000059A099CF2415140059A2468EA414A405A +:100EB000016802360D19079C069952196140059C7C +:100EC000019D2140069C614052180499029C5218D1 +:100ED000B91804910221CD410199019FF141694066 +:100EE000019D0936F5416940019D2543039C25403C +:100EF000029C27403D4349198918099A446855685E +:100F0000049F6219069C079D1219059C6540049C6C +:100F10002540079C654052190625EF413E000B27EE +:100F2000049D039CFD417540049E0E37FE417540B3 +:100F300055190F000222D7413E000F000B32D74156 +:100F40003A000F0072401626F74164190394019E7F +:100F5000029C7A40019F0E430F4026403E43921967 +:100F60005219099D8468AD68039F6619079C059D09 +:100F70003619049C6540039C2540059C6540751905 +:100F80000626039CF7410536F44126007E401927CA +:100F9000039CFC416640029CAD196419029402272F +:100FA0001400FC410D2627001400F4412600140013 +:100FB0007E401627FC4166400C0014432700019C2C +:100FC000274014000C402743F7197C19099DA446BB +:100FD000ED68C468039E6519059C2D19049C744036 +:100FE00027000626029C2740049C6740029CED19BE +:100FF000F4412700029C0536F44126007E40192763 +:10100000029CFC416640019CAD19641902270594BD +:101010006446FC410D2627006446F44126006446E0 +:101020007E401627FC416640644614432700644610 +:101030000F4014402743F7197C1901940469099D56 +:10104000029E2D696519049C2D19039C744026008D +:10105000059C2640039C6640AD190626059CF4417C +:101060002700059C0536F44126007E401927059C83 +:10107000FC416640AD194C1902210D270494019CD6 +:10108000CC410199F9416140019C0937FC41614023 +:101090006446019F3C432600644616403C4026437C +:1010A0008E1909994469496977196518039C029951 +:1010B0002D19059C6140049C2140029C61406918E7 +:1010C0000625049CEC412600049C0535EC412500D6 +:1010D00075401926049CF44165404919541806943A +:1010E00002223C00D44125003C000B32D44116269C +:1010F00022003C00F4416A406240019C06263C43C9 +:10110000250064462540019C3C4025435519099A19 +:101110006C18039484699269A118029C049A0919B5 +:10112000059C54402200069C2240059C6240069C7F +:101130008A18F4410B212500069C0626CC4121008B +:1011400069401925069CEC41614064465218022111 +:10115000A4180794039CCC412500039C0B31CC417F +:10116000210069401625039CEC416140039C3C43EF +:101170002500019C2540039C3C4025434D19AC189B +:10118000099A0294D269C4692030A118059C049A76 +:101190000919069C6240079C2240049C6240079CFF +:1011A0008A18F4412500079C0536F4412100079C6C +:1011B0000E36F4416940614052180221019C0C3EF8 +:1011C000A4180594029CCC410299F1416140029C13 +:1011D0000936F441039D6140029C039E25433D4036 +:1011E000264035434D19AA180192099A20320992D6 +:1011F000044A824200D04EE61A00C0320D9203E04B +:1012000070DA0110B0DA0110112613219A6B986B75 +:10121000F241C8419C6B4240A00A50401C685A6A87 +:101220005D6811194018072229001224D1412A00B3 +:10123000E2414A40E9084A4081180A9106210B2000 +:10124000059A079CCA410599C1415140059A0E3043 +:10125000C2415140069A6240059C2240069C624071 +:101260008918089A019C126C89180A9A1A648918BC +:10127000049A51187F1809970227019AFA41100021 +:10128000019A0B37FA41424001980937F841029F11 +:10129000424001983843039F3840029F3C4020431E +:1012A0001018421813200492DA6B3700F241DE6BFB +:1012B0001224C6417240DE6BB10A514007229E6A79 +:1012C000AD199E684919D64130009E680625E64151 +:1012D00032009E684240F00842408918079E059AF5 +:1012E000073C56403200099E59643240079E5640E2 +:1012F0003000089E069A766CB446099E6244EE4120 +:10130000521882183000099E099DE6414640192076 +:10131000C5416E400225B618039A0B349219069205 +:10132000049AEA411000049A0B35EA41049D4240B8 +:10133000E54104986A40019D049C054302980540DC +:101340000198204005435519AE1903960A9E1320B3 +:10135000FE410A9F3400C7417C400A9F9E68DA6ABA +:10136000BF0AB2186740BF180722DE68D6413400B2 +:101370001226DA680798F241DE686240F40862409B +:10138000BF18099E059A0B247240069E9F64324046 +:10139000059E7240089EB66CB4466044C519521949 +:1013A0000625069E1920EE41069DE5417540069EE4 +:1013B0000234C64175400226AD18029A03985219AC +:1013C0000792039AF241039EE64156401622039C7F +:1013D000D441049A6640039C2243019C2240049C11 +:1013E00004402243B2185219112402920A00E24129 +:1013F000132510000A00EA41890A42401D6B4A4049 +:10140000D96812264919521807211D69CD41196959 +:10141000F14169401D69E80841405218069D09994B +:10142000062069400E0007990E400999059D4E401F +:101430000899029CC96CDA648C466544AD1807991A +:101440007619079DC1410530C5414D4007990E30C1 +:10145000C1414D40AD1902260199029849190591E3 +:101460000299F1410B36F04106004E4016210298D8 +:10147000C8410399464002980143049801400398EB +:101480002040014371184C1901943D001124E5419D +:101490003C0029001325EC41BF0A4C401D697C40EB +:1014A0005F6B0721EF19E41912275D69CD41596976 +:1014B000F94169405D69079FE808069D41407D400C +:1014C000059F64183D40069F1C657D40089F0620CF +:1014D0003F6DE619099FF6190B27AE19059D059971 +:1014E000C541F94108006840059D0E37FD410D21B9 +:1014F00045400198AD19C8410226049F01997F1902 +:101500000497019FF741060016207E40019FC741C6 +:101510007E40029F01980F4303990F4002990140BA +:101520000F4311201100F7197F19C1411325100035 +:10153000E84107265D694840996B920A50404A1974 +:10154000996980189A69F1410B36F2414A409969CC +:10155000059DC9084A40079980186940049D0B22DF +:101560002940079D58656940089D6D6D4619069D87 +:1015700076198E190621049DCD410499D141694007 +:10158000049D0E32D5416940039D89196D18069559 +:101590003A0002250D26EA413D00F5413E00554046 +:1015A0001622D641019A75403A431600029A164017 +:1015B000019A3A401643AD1969180391112221008E +:1015C0001325D1412200EA4107264A40A40A99691D +:1015D0005440DA6B069D5218D969A418DA69F141B2 +:1015E0000B36F2414A40D969C9084A40A418049907 +:1015F000059A9C654A4006990A4005994A4008990F +:10160000896D66180799062476180B219619069A93 +:10161000E541CA4106991334E1416A4002254A4036 +:10162000029992198918079103990C3CE941039D8D +:10163000039EE5414D401621CE4103997540394343 +:101640000E0001990E40039939400E43AE19112145 +:101650000500CD4101002C001325E9410A9D6140A0 +:10166000800A48402900DD69B218AC4602921A6A25 +:1016700007261500614440181100F5410B36F14171 +:10168000D20869405140049A069E06247240150013 +:10169000079A40181540089A0599D26D049E821841 +:1016A00052186E40B618079AD865E2410B20110017 +:1016B000079A1334C2414A4007990225E1414A4042 +:1016C0009219019E0299B6180596029E0C3CE941BA +:1016D000E6414E4002990018C14102984E400399DC +:1016E000039D014339400540294371188A1801922E +:1016F0002022089920338A1808920D9A9A4200D025 +:1017000082E5049B0F901593059B0C981293069B02 +:101710000B9A1493079B11971393019B28300E93F8 +:10172000039B10930EAB146802CB611802C2904267 +:10173000F9D1002057B0F0BDF7B50400161E009196 +:1017400001D10020FEBD3F2503681D40D318036072 +:101750009A4202D9436801334360002D17D04027D5 +:101760007F1BBE4213D32300283300993A00581937 +:101770000193EEF7FDFF20000199FFF757FB0028CA +:10178000E0D176190500009B403EDB19009337003D +:1017900005E02000FFF74AFB0028D3D1403F009B23 +:1017A0009919C91B3F2FF4D8002FCAD02000283028 +:1017B0003A004019EEF7DCFFC3E73F2370B506009F +:1017C0000D0080210268283613405A1CC3182833A4 +:1017D00004001970B018382A00D970E038230021AD +:1017E0009A1AEEF7E1FF22686368510FDB000B43A2 +:1017F000D2001BBA12BA3100200023666266FFF7DE +:1018000015FB00285AD1A3681B0E2B70A3681B0C74 +:101810006B70A3681B0AAB70A368EB70E3681B0EC8 +:101820002B71E3681B0C6B71E3681B0AAB71E368F7 +:10183000EB7123691B0E2B7223691B0C6B722369DE +:101840001B0AAB722369EB7263691B0E2B7363690E +:101850001B0C6B7363691B0AAB736369EB73A3693E +:101860001B0E2B74A3691B0C6B74A3691B0AAB744E +:10187000A369EB74E3691B0E2B75E3691B0C6B7595 +:10188000E3691B0AAB75E369EB75236A1B0E2B76C4 +:10189000236A1B0C6B76236A1B0AAB76236AEB76F2 +:1018A000A36E002B0AD1636A1B0E2B77636A1B0C95 +:1018B0006B77636A1B0AAB77636AEB7770BD402373 +:1018C00000219A1AEEF770FF31002000FFF7AEFA00 +:1018D0000028F3D101003822300082E7F0B51C0067 +:1018E0009DB0060001A80F001500FFF744FA210083 +:1018F00001A8FFF753FA041E0BD13A00310001A8EA +:10190000FFF71AFF041E04D1290001A8FFF755FFB5 +:10191000040001A8FFF735FA20001DB0F0BD10B596 +:10192000D8220021EEF740FF10BD10B5002802D0EC +:10193000D821F8F7BFFD10BD10B5D822EEF718FF7B +:1019400010BD000000220023026043608260C3607B +:10195000002923D1214A224B02614361214A224BB3 +:101960008261C361214A224B02624362214A224BB7 +:101970008262C362214A224B02634363214A224BA3 +:101980008263C363214A224B02644364214A224B8F +:101990008264C364D0300160002070471F4A204B2E +:1019A000026143611F4A204B8261C3611F4A204B81 +:1019B000026243621F4A204B8262C3621F4A204B6D +:1019C000026343631F4A204B8263C3631F4A204B59 +:1019D000026443641F4A204BDAE7C04608C9BCF3DF +:1019E00067E6096A3BA7CA8485AE67BB2BF894FEFD +:1019F00072F36E3CF1361D5F3AF54FA5D182E6AD2C +:101A00007F520E511F6C3E2B8C68059B6BBD41FBBA +:101A1000ABD9831F79217E1319CDE05BD89E05C118 +:101A20005D9DBBCB07D57C362A299A6217DD7030C5 +:101A30005A01599139590EF7D8EC2F15310BC0FFC7 +:101A40006726336711155868874AB48EA78FF964E3 +:101A50000D2E0CDBA44FFABE1D48B5470300F0B5B0 +:101A6000544C1033A544119354AB1C0050301390C8 +:101A7000119812930CC80CC4139B8342FAD164AB27 +:101A80000C009C46180080340A784B780E791206B8 +:101A90001B044F791343CA798D78360632433F04CD +:101AA0002D0217438A792B43CD7812023A432B43F8 +:101AB00008310260436008308C42E5D1102366464D +:101AC00002933000716F336F803008904F03D80C51 +:101AD00007435D03C80C05435C0FC80020430A9010 +:101AE0004C0FD80004430A989B0968408D06B268E1 +:101AF0002B437C4089095C40484000920494F26882 +:101B00000590B06CF16C30CE00196941049B059CC6 +:101B1000C0186141009BD7075B081F43009B140658 +:101B2000DD0753081D43009B0A900B911B0A1C43C1 +:101B3000009B7C401B061900130A19430B000A98EE +:101B40000B99009F6B40FF0955062F43D2097C403B +:101B5000534006940793069B079CC0186141089B5D +:101B600018605960029B01330293502BA9D1629BEC +:101B7000639C089309945C9B5D9C0A930B94609B07 +:101B8000619C0C930D945E9B5F9C0E930F94549BF1 +:101B9000559C00930194569B579C02930394589B29 +:101BA000599C049305945A9B5B9C06930794024CA2 +:101BB00004E0C046ECFBFFFF70DB01100B9B9A04B6 +:101BC0000A9B980B99040B9B10439B0B19430B9B8F +:101BD0009A030A9B9B0C1A430A9B42409D030B9B52 +:101BE0009B0C2B434B400A99480A0B99C9050143AA +:101BF0004B4061460B981593450A0A98C005284347 +:101C000042401492086849682268636812184B4180 +:101C10001498159912184B410E990C980F9D484035 +:101C20000D9969400A9D28400B9D29400C9D454017 +:101C30000D981695484017901698179912184B4111 +:101C40000898099912184B4106980799801859412C +:101C5000089009910199080100990E0F0D01019951 +:101C60000643090F0D43009988080199890701432C +:101C70000198694087080098009D800738437040AC +:101C8000EE09019D6D063543019E6940F709009EEE +:101C9000199176063E437040029918900098039D72 +:101CA00008430199029E2943049D019F2840059DF8 +:101CB0002940009D2E40039D30433D4029431A900A +:101CC0001B911A9D1B9E18981999401971418018F3 +:101CD00059416346069007919A68DB68A068E168FD +:101CE000801859410C9A0D9B801859410E9B0A9AF5 +:101CF0005A400B9B0F9D6B40089D2A40099D2B402D +:101D00000E9D55400F9A1C955A401D921C9A1D9B82 +:101D100080185941099B9A04089B9E0B9D04099BBE +:101D200016439B0B1D43099B9A03089B9B0C1A436C +:101D3000089B72409F03099B9B0C3B436B40089D93 +:101D40006E0A099DED053543099E6B40770A089E92 +:101D50001F93F6053E4372401E921E9A1F9B8018E9 +:101D60005941049A059B12184B410C920D93079B05 +:101D70001A01069B1E0F1D01079B16431B0F1D43D7 +:101D8000069B9A08079B9B071343079A6B4097088B +:101D9000069A069D92073A437240EE09079D6D062A +:101DA0003543079E6B40F709069E219376063E4316 +:101DB0007240069B2092009A079D1A43019B009E49 +:101DC0002B43029D079F2A40039D2B40069D2E40DA +:101DD000019D32433D402B4322922393229D239E1B +:101DE000209A219B5219734112184B412069616955 +:101DF0000492059363461A695B69801859410E9AEB +:101E00000F9B80185941089B0A9A099D5A400B9BC9 +:101E10006B400C9D2A400D9D2B400A9D55400B9A0E +:101E200024955A402592249A259B801859410D9B50 +:101E30009A040C9B9E0B9D040D9B16439B0B1D430C +:101E40000D9B9A030C9B9B0C1A430C9B72409F03A7 +:101E50000D9B9B0C3B436B400C9D6E0A0D9DED054D +:101E600035430D9E6B40770A0C9E2793F6053E4343 +:101E700072402692269A279B80185941029A039B0A +:101E800012184B410E920F93059B1A01049B1E0FD3 +:101E90001D01059B16431B0F1D43049B9A08059BC0 +:101EA0009B071343059A6B409708049A049D920779 +:101EB0003A437240EE09059D6D062E43059D734021 +:101EC000EF09049D29936D063D436A40049B2892C7 +:101ED000069A1A43079B059D069E2B43009D059F6E +:101EE0002A40019D2B40049D2E40079D32433D40DA +:101EF0002B432A922B932A9D2B9E289A299B521979 +:101F0000734112184B41A069E16902920393634641 +:101F10009A69DB69801859410A9A0B9B80185941CC +:101F20000C9B089A0D9D5A40099B6B400E9D2A40C0 +:101F30000F9D2B40089D5540099A2C955A402D9293 +:101F40002C9A2D9B801859410F9B9D040E9B9E0B34 +:101F50009A040F9B2E439B0B1A430F9B9D030E9BD2 +:101F60009B0C1D430E9B75409F030F9B9B0C3B439B +:101F700053400E9A560A0F9AD20516430F9A734091 +:101F8000570A0E9A2F93D2053A4355402E952E9A12 +:101F90002F9B80185941009A019B12184B410A92BD +:101FA0000B93039B1A01029B1E0F1D01039B1643FB +:101FB0001B0F1D43029B9A08039B9B071343039A25 +:101FC0006B409708029A029D92073A437240EE09CD +:101FD000039D6D063543039E6B40F709029E3193C6 +:101FE00076063E437240029B3092049A039D1A4348 +:101FF000059B049E2B43069D2A40079D2B40029D76 +:102000002E40059D039F32433D402B433292339334 +:10201000329D339E309A319B5219734112184B41B5 +:10202000206A616A0092019363461A6A5B6A8018AB +:102030005941089A099B801859410E9B0C9A0F9D93 +:102040005A400D9B6B400A9D2A400B9D2B400C9DD6 +:1020500055400D9A34955A403592349A359B8018E4 +:1020600059410B9B9A040A9B9E0B9D040B9B1643A4 +:102070009B0B1D430B9B9A030A9B9B0C1A430A9BC9 +:1020800072409F030B9B9B0C3B436B400A9D6E0A67 +:102090000B9DED0535430B9E6B40770A0A9EF605B6 +:1020A0003E43724036923793369A379B8018594197 +:1020B000069A079B12184B4108920993019B1A013B +:1020C000009B1E0F1D01019B16431B0F1D43009B10 +:1020D0009A08019B9B071343019A6B409708009A4B +:1020E000009D92073A437240EE09019D6D0635430B +:1020F000019E6B40F709009E399376063E4372407D +:10210000009B3892029A019D1A43039B029E2B4327 +:10211000049D019F2A40059D2B40009D2E40039D5C +:1021200032433D402B433A923B933A9D3B9E389A33 +:10213000399B5219734112184B4106920793A06ABA +:10214000E16A63469A6ADB6A801859410C9A0D9BD2 +:10215000801859410A9B0E9A0B9D5A400F9B6B4069 +:10216000089D2A40099D2B400E9D55400F9A3C9595 +:102170005A403D923C9A3D9B80185941099B9D04D1 +:10218000089B9E0B9A04099B2E439B0B1A43099BA9 +:102190009D03089B9B0C1D43089B75409F03099B57 +:1021A0009B0C3B435340089A560A099AD2051643A2 +:1021B000099A7340570A089A3F93D2053A4355400B +:1021C0003E953E9A3F9B80185941049A059B1218F0 +:1021D0004B410C920D93079B1A01069B1E0F1D018C +:1021E000079B16431B0F1D43069B9A08079B9B07E3 +:1021F0001343079A6B409708069A069D92073A4345 +:102200007240EE09079D6D062E43079D7340EF094E +:10221000069D41936D063D436A40069B4092009A9D +:10222000079D1A43019B009E2B43029D079F2A4056 +:10223000039D2B40069D2E40019D32433D402B4384 +:1022400042924393429D439E409A419B521973414F +:1022500012184B41206B616B0492059363461A6B15 +:102260005B6B801859410E9A0F9B80185941089B4F +:102270000A9A5A400B9B099D6B400C9D2A400D9D6C +:102280002B400A9D55400B9A44955A404592449ADA +:10229000459B801859410D9B9D040C9B9E0B9A04F5 +:1022A0000D9B2E439B0B1A430D9B9D030C9B9B0C7C +:1022B0001D430C9B75409F030D9B9B0C3B43534060 +:1022C0000C9A560A0D9AD20516430D9A7340570A76 +:1022D0000C9A4793D2053A4355404695469A479BF8 +:1022E00080185941029A039B12184B410E920F938A +:1022F000059B1A01049B1E0F1D01059B16431B0F16 +:102300001D43049B9A08059B9B071343059A6B404A +:102310009708049A049D92073A437240EE09059D7E +:102320006D062E43059D7340EF09049D49936D068C +:102330003D436A40049B4892069A059D1A43079BB9 +:10234000069E2B43009D059F2A40019D2B40049D26 +:102350002E40079D32433D402B434A924B934A9D6A +:102360004B9E489A499B5219734112184B41A06BDE +:10237000E16B0292039363469A6BDB6B80185941C1 +:102380000A9A0B9B801859410C9B089A0D9D5A4044 +:10239000099B40346B400E9D2A400F9D2B40089DA9 +:1023A0005540099A4C955A404D924C9A4D9B801835 +:1023B00059410F9B9D040E9B9E0B9A040F9B2E432D +:1023C0009B0B1A430F9B9D030E9B9B0C1D430E9B67 +:1023D00075409F030F9B9B0C3B4353400E9A560A3C +:1023E0000F9AD20516430F9A7340570A0E9A4F93CD +:1023F000D2053A4355404E954E9A4F9B801859410D +:10240000009A019B12184B410A920B93039B1A01ED +:10241000029B1E0F1D01039B16431B0F1D43029BB6 +:102420009A08039B9B071343039A6B409708029AF1 +:10243000029D92073A437240EE09039D6D062E43BA +:10244000039D7340EF09029D51936D063D436A4021 +:10245000029B5092049A1A43059B039D049E2B43B2 +:10246000069D039F2A40079D2B40029D2E40059DFF +:1024700032433D402B4352925393529D539E509A68 +:10248000519B5219734112184B4100920193402302 +:102490009C441D4BA34201D0FFF790FB089B099C75 +:1024A000629363940A9B0B9C5C935D940C9B0D9CC4 +:1024B000609361940E9B0F9C5E935F94009B019CC4 +:1024C00054935594029B039C56935794049B059CEC +:1024D00058935994069B079C5A935B94119B1299AD +:1024E0005C681B68009301940CC9129100980199D3 +:1024F00012184B4111990CC1139B11918B42EDD1D4 +:102500000020024B9D44F0BDF0DD011014040000DA +:10251000F7B50400151E009101D10020FEBD03682F +:102520007F26100000211E402268636812184B416C +:1025300022606360994209D1954207D9A068E16899 +:102540000122002312184B41A260E360002E17D035 +:102550008027BF1BBD4213D32300503300993A009C +:1025600098190193EEF704F920000199FFF776FA24 +:102570000028D3D1803DAD190600009BDB190093E4 +:102580002F0005E02000FFF769FA0028C6D1803F40 +:10259000009B5919C91B7F2FF4D8002FBDD02000F4 +:1025A00050303A008019EEF7E3F8B6E77F23F7B52D +:1025B00006000D0080210268503613405A1CC318D3 +:1025C000503304001970B018702A00D90FE1103987 +:1025D0008A1A0021EEF7E8F8A268E06863682168CB +:1025E000570FC0003843D2005F0F3A43DB004F0F54 +:1025F0003B43070EBC46270001926246C0373A7043 +:10260000020C7A70F870020A2000BA70019AC43085 +:1026100012BA02602200180EC8321070180C5070E6 +:10262000C900180A9070D37009BA516020003100B7 +:102630000432FFF713FA002800D0D7E063691B0EBD +:102640002B7063691B0C6B7063691B0AAB70636949 +:10265000EB7023691B0E2B7123691B0C6B712369B3 +:102660001B0AAB712369EB71E3691B0E2B72E369E3 +:102670001B0C6B72E3691B0AAB72E369EB72A36913 +:102680001B0E2B73A3691B0C6B73A3691B0AAB7323 +:10269000A369EB73636A1B0E2B74636A1B0C6B7468 +:1026A000636A1B0AAB74636AEB74236A1B0E2B7597 +:1026B000236A1B0C6B75236A1B0AAB75236AEB75C7 +:1026C000E36A1B0E2B76E36A1B0C6B76E36A1B0A2C +:1026D000AB76E36AEB76A36A1B0E2B77A36A1B0C1F +:1026E0006B77A36A1B0AAB77A36AEB77626B6B1CF1 +:1026F000120EDA77626BAB1C120CDA77626BEB1C92 +:10270000120ADA77626B2B1DDA77226B6B1D120EC1 +:10271000DA77226BAB1D120CDA77226BEB1D120AF3 +:10272000DA77226B0133DA77E36B1A0E2B0028334A +:102730001A70E36B1A0C2B0029331A70E36B1A0A18 +:102740002B002A331A70E26B5A70A36B1A0E2B00FF +:102750002C331A70A36B1A0C2B002D331A70A36B39 +:102760001A0A2B002E331A70A26B5A702300D03332 +:102770001B68002B3AD12A00636C30321B0E137099 +:10278000636C1B0C5370636C1B0A93702B00626CA0 +:1027900033331A702A00236C34321B0E1370236CEF +:1027A0001B0C5370236C1B0A93702B00226C373365 +:1027B0001A702A00E36C38321B0E1370E36C1B0C8A +:1027C0005370E36C1B0A93702B00E26C3B331A705E +:1027D0002A00A36C3C321B0E1370A36C3F351B0CFC +:1027E0005370A36C1B0A9370A36C2B70FEBD8A1AE6 +:1027F0000021EDF7D9FF31002000FFF72FF9002865 +:10280000F4D1010070223000E4E6F0B51C00B7B04E +:10281000060068460F001500FFF781F821006846A2 +:10282000FFF790F8041E0BD13A0031006846FFF71D +:102830006FFE041E04D129006846FFF7B7FE0400AE +:102840006846FFF772F8200037B0F0BD1300303B48 +:1028500010B5DCB2092C06D80360036800208B4257 +:1028600000D3063810BD1300413B052B02D8373A80 +:102870000260F2E7FF2303601300613B052BECD8F5 +:10288000573AF5E70023F0B50E0015001900814214 +:1028900004D189005118002B12D1F0BD2C689C4244 +:1028A000BF41E41A2C608B00F3587F429C469C4247 +:1028B0009B415B42DB196746E41B10C50131E6E72B +:1028C0000A68D01A9A429B4101C15B42E3E7F0B526 +:1028D0000E001400002587B0039004910592019327 +:1028E0000290029B27680F2B00D9B8E0039B1C09BC +:1028F00020011B1A0293049BA4011E19059B1C199D +:10290000029B072B00D896E000233068019A19003B +:10291000F0F70CFE2818A842AD410B003818B84259 +:10292000BF416942C918002320607F4270687F1848 +:10293000019A1900F0F7FAFD3818B8429B415B4242 +:1029400059186368019AC01898429B415F4200235E +:102950006060B0687F181900F0F7E8FDA3683818C8 +:10296000B842BF41C01898429B415D4200237F425C +:102970007918A060F068019A6D181900F0F7D6FD7B +:10298000E3682818A842AD41C01898429B415F42B5 +:1029900000236D426918E0603069019A7F181900C0 +:1029A000F0F7C4FD23693818B842BF41C0189842F7 +:1029B0009B415D4200237F42791820617069019A32 +:1029C0006D181900F0F7B2FD63692818A842AD41EF +:1029D000C01898429B415F4200236D4269186061B4 +:1029E000B069019A7F181900F0F7A0FDA3693818A3 +:1029F000B842BF41C01898429B415D4200237F42CC +:102A00007918A061F0696D18019A1900F0F78EFD30 +:102A10003700E3692818A842AD41C01898429B418D +:102A200020373E006D425B426D18E0615D19029BEC +:102A30002034083B02930027029B9B000293E3593A +:102A40000393029BBB4200D02FE10122E4182368CC +:102A5000EB1808C4AB4200D23CE107B0F0BD002344 +:102A60003068019A1900F0F761FD2818A842AD41BD +:102A70000B00C019B842BF416942C9180023206049 +:102A80007F427068019A7F181900F0F74FFD636864 +:102A90003818B842BF41181898429B415D42002344 +:102AA0007F4279186060B068019A6D181900F0F7DC +:102AB0003DFDA3682818A842AD41181898429B41D3 +:102AC0005F4200236D426918A060F068019A7F1888 +:102AD0001900F0F72BFDE3683818B842BF41181809 +:102AE00098429B415D4200237F427918E060306943 +:102AF000019A6D181900F0F719FD23692818A842EA +:102B0000AD41181898429B415F4200236D426918FD +:102B100020617069019A7F181900F0F707FD636959 +:102B20003818B842BF41181898429B415D420023B3 +:102B30007F4279186061B069019A6D181900F0F749 +:102B4000F5FCA3692818A842AD41181898429B418A +:102B50005F4200236D426918A061F0697F18019AF5 +:102B60001900F0F7E3FCE3693818B842BF411818C0 +:102B700098429B415D4200237F4279186D18E061C5 +:102B80001900019A306AF0F7D1FC236A2818A8428C +:102B9000AD41181898429B415F4200236D4269186D +:102BA0002062706A019A7F181900F0F7BFFC636A0F +:102BB0003818B842BF41181898429B415D42002323 +:102BC0007F4279186062B06A019A6D181900F0F7B7 +:102BD000ADFCA36A2818A842AD41181898429B4141 +:102BE0005F4200236D426918A062F06A019A7F1863 +:102BF0001900F0F79BFCE36A3818B842BF41181877 +:102C000098429B415D4200237F427918E062306B1D +:102C1000019A6D181900F0F789FC236B2818A84257 +:102C2000AD41181898429B415F4200236D426918DC +:102C30002063706B019A7F181900F0F777FC636BC3 +:102C40003818B842BF41181898429B415D42002392 +:102C50007F4279186063B06B019A6D181900F0F724 +:102C600065FCA36B2818A842AD41181898429B41F7 +:102C70005F4200236D426918A063F06B7F18019AD0 +:102C80001900F0F753FCE36B3818B842BF4118182D +:102C900098429B41E0635D42029B7F427F18103B5C +:102CA000ED190293403640341BE60023F059190019 +:102CB000019AF0F73BFC039B28180A00A8428941BF +:102CC00018189842AD41494289186D42E0516D187B +:102CD0000437B4E61500BAE6074BC9188900411855 +:102CE000884200D970470A68036812BA1BBA04C048 +:102CF00004394B60F4E7C046FFFFFF3FF7B50E0015 +:102D00004F68150000210190013F09D23368002B64 +:102D100002DA002900D0691A019B00201960FEBD6B +:102D2000B268BB009C580904200C08432900F0F746 +:102D3000A5FAA0B2090408432900F0F79FFAE3E7D7 +:102D400001230360002343608360704710B5041EB5 +:102D50000ED08068002806D063689900F7F7AAFBB8 +:102D6000A068F7F795FB0123236000236360A3604D +:102D700010BD0000124B70B504000D00994202D93D +:102D80001020404270BD636800208B42FAD20421BB +:102D90002800F7F775FB061EF2D0A16800290BD0BA +:102DA00063689A00EDF7E4FC6368A0689900F7F7A0 +:102DB00081FBA068F7F76CFB00206560A660E1E787 +:102DC00010270000194B70B50500994202D9102058 +:102DD000404270BD4268531E8A4208D8FFF7CAFFBE +:102DE000F7E7A8689A001258002A02D1013B002B8D +:102DF000F7D101330C00994200D21C0004212000BD +:102E0000F7F73EFB061EE2D0A96800290AD0A2000F +:102E1000EDF7AEFC6B68A8689900F7F74BFBA86864 +:102E2000F7F736FB00206C60AE60D2E71027000099 +:102E3000F8B505000E0000208D4217D08F6887423C +:102E400004D12800FFF782FF00200FE04B685C1ED2 +:102E5000002C0CD133686A6801342B60A2420CD27A +:102E600021002800FFF786FF00280ED0F8BDA30040 +:102E7000FB58002BEED1013CEAE7AB68121BA00027 +:102E8000002192001818EDF78FFCA868B168A20025 +:102E9000EDF76EFCD8E77FB50C2605000C0032007C +:102EA000010001A8EDF764FC320021002800EDF7D5 +:102EB0005FFC3200200001A9EDF75AFC7FBDF7B599 +:102EC0000D00496804001600FFF754FF002816D1D2 +:102ED000012172423243D2B2D30900932E68C91A3B +:102EE000009A236856434B439B1923606B680193F8 +:102EF0000300019A9A4203D166689E420ED8FEBD35 +:102F0000A2689E009719AA6801339659009A564301 +:102F10003A684A43944666443E60EAE7A5689A00E8 +:102F2000AA18156801334D431560E6E7F7B50400AC +:102F30000D001600884201D10020FEBD4968FFF750 +:102F400019FF0028F9D128006168FFF713FF002856 +:102F5000F3D127680123390072423243D2B22E687E +:102F6000D2099B1A5943564376182660296857435D +:102F70005943C91929606168019101998142DBD0E7 +:102F8000A66881007618009636680130B446AE68AF +:102F900071180E685643370066465E43BE19009F9F +:102FA0003E6067460E6857435E43F6190E60E4E7DD +:102FB00070B50C0001210500FFF7DCFE061E0FD1E5 +:102FC0006B6801009A00A868EDF7EEFBE117AB68AB +:102FD00062184A401A600123E1179943C918296011 +:102FE000300070BD42680300520100208A4208D9B7 +:102FF0004A09986893001F2218581140C8400123BD +:1030000018407047F8B505000E0014004F09012A5A +:103010001BD843685B018B420DD9AB681F21BF00F1 +:10302000DF1901230E40B340B44000203A689A43B0 +:1030300014433C60F8BD00208242FBD02800791C7C +:10304000FFF798FE0028E8D0F4E704204042F1E7BB +:10305000F7B5002104000A0043680193019B9342E5 +:1030600001D10020FEBDA06893001F5800233E0040 +:103070000125DE40C8182E42F4D15B19C818202B58 +:10308000F5D101005219E9E703004068002811D08A +:103090009A680138830000280DD1D158802200237E +:1030A00012060A4203D101335208202BF9D1013014 +:1030B0004001C01A7047D1580029EED10138E9E724 +:1030C00010B5FFF7E1FF0730C00810BDF7B50326C4 +:1030D0001640731E9E419308F618436804001500BD +:1030E0000191B3421AD100212000FFF761FF0028AF +:1030F00021D1182203009446AB421CD01A000321B0 +:1031000067468A43A168DE008A1801993E40C95C7F +:103110000133B140166831431160EDE7FFF716FE49 +:10312000012323600023310020006360A360FFF7C8 +:1031300021FE0028D7D0FEBDF7B5032515406B1E34 +:103140009D419308ED184368040017000191AB42BC +:1031500007D100212000FFF72BFF061E0FD0300003 +:10316000FEBDFFF7F3FD01232360002329002000AB +:103170006360A360FFF7FEFD061EEAD0EFE7019B48 +:10318000002BECD0A368A800C01B3A0001991818C6 +:10319000EDF7EEFA002DE2D02900A068FFF79CFDC4 +:1031A000DDE7F7B5436801919B00934222D31400F9 +:1031B0000326FF279C420FD1160000240327A642B6 +:1031C0001AD10024934205D20199D21AC8182100BD +:1031D000EDF7EAFA2000FEBD25003540E9002500A4 +:1031E0008C468168B5434D596146CD403D4211D171 +:1031F0000134DFE71E00E0E7210039402500C90067 +:103200008C468168BD434D596146CD4001990D55AD +:103210000134D4E708246442DCE7F8B505006B68A4 +:1032200008009C000326130094421CD2121B8E1827 +:103230000021EDF7B9FA30002200002303268018A0 +:1032400001389A4212D10020F8BD19003140C9005E +:103250008C461900AF68B14379586746F940FF279B +:1032600039420ED10133A342EFD1E6E719001C0029 +:10327000AF68B14379583440E400E1400133017054 +:10328000DEE708204042DFE7F7B51F2704000E0005 +:103290004D090F40FFF7F8FE636880195B01834218 +:1032A00005D31F2E0FD8002F2BD100200AE01F219D +:1032B00001404B1E9941400909182000FFF75AFDB3 +:1032C0000028EED0FEBD6368A80041428C4619007C +:1032D0009A00043AA9420CD800229D4200D8EA1A6A +:1032E0009B1800229B00043B191DDCD0A168CA502A +:1032F000F9E76046A6680139B6183658A0688650C6 +:10330000E7E7002320229C466668D31B0193AE4268 +:10331000CBD9A168AB00CB18186862460100B94050 +:1033200011431960019B0135D8408446EFE71F2205 +:10333000F8B543684D090A40AB4202D305D1002AD3 +:103340002CD00021FFF734FEF8BD1F2928D8002615 +:10335000B24203D02024A41A013B14D20020F3E788 +:1033600064468168A7008C5904367C5001218C4446 +:10337000591B6145F4D800248B42E8D986688D003A +:10338000AC510131F8E78568990069180F683D0074 +:10339000D54035433E000D60A640DDE71F29DDD94D +:1033A0000021AE008C46E3E730B504004368002BF3 +:1033B00006D14A68002A0CD11800431E984112E039 +:1033C000A0689A008218043A1268002AF1D1013BE1 +:1033D000EDE78D689000281804380068002803D0B5 +:1033E0000120934202D930BD013AE3E793420DD365 +:1033F000013B5A1C01D10020F5E7A1689A008958C9 +:10340000AA58914205D8013B9142F2D20120404294 +:10341000E9E70120E7E7F0B5140089B007930E9BB8 +:1034200006005A686368059101339A4257D30E9B90 +:103430009868002853D092000021EDF7B5F90E9B53 +:103440009B68049363680093059B009A5B680293F2 +:10345000934200D902920027009B049D01339B00F8 +:103460000193009BB0689F4214D1019B019A191FE0 +:10347000049B5918EDF77CF921003000FFF794FF09 +:10348000002828DBB268A1683800FFF7FBF90020AC +:1034900009B0F0BDBB001B5802980393059B039A2B +:1034A000996801370B6853432A689B18079A5A4357 +:1034B000039B06922A00FFF70AFA2A00069BA168DE +:1034C0000098FFF704FA0022039B2B60019B043352 +:1034D000EA500435C5E70E9BB1689A68D4E704202A +:1034E0004042D5E7020070B54368002B09D14C6813 +:1034F000002C0FD12000002B02D0A34213D910685A +:1035000070BD946898002018043800680028EED137 +:10351000013BEAE78D68A0002818043800680028FD +:10352000EBD1013CE4E70D686842A342E8D31068A0 +:10353000002803DD002D13DA0120E1E7002D0FDD67 +:1035400000280DD0012009E095688E689C002D5957 +:103550003459A542D4D8013BA54202D24042CFE71C +:10356000013B5C1CF0D10020CAE7F0B543684C6811 +:1035700087B0A34246D1036801245D102B0023408D +:1035800002930B68039423416B40029D23401D402E +:10359000156045680195029D641B0594019C651E9C +:1035A000019502D2002007B0F0BD019C86688D68AD +:1035B000A40037592D59EC1B2E00A4467E407C40B8 +:1035C00004963440664674401E00E40F2643B44619 +:1035D0007F1B049E7D4035407D40059EED0F2E40B3 +:1035E00004966646039FBF1B049E3E40029F3C40DC +:1035F000039FFB1A1C40136826431E436346166054 +:103600002B43CBE704204042CDE71FB5CA178B18E8 +:10361000534000930123C9179943C91802936B467D +:10362000019101A90393FFF75DFF05B000BDF7B558 +:1036300006000D001400904202D088422FD12500D0 +:1036400001236C683360002C2FD121003000FFF77C +:1036500091FB071E27D1AB6839001A00B3683D0003 +:10366000180001938C4229D1019AA300D218002D91 +:1036700019D0631C01937368A34208D83000611C01 +:10368000FFF778FB002829D1B368A2009A181368C5 +:10369000019CEB18AB42AD4108C26D42E7E7FFF772 +:1036A000C7FB071ECBD03800FEBDAA68A300D31805 +:1036B000043B1B68002BC8D1013CC4E78B00D358E6 +:1036C00001319C460368EB18AB42AD41634408C02E +:1036D00063459B416D425B425D19C3E70700E2E72A +:1036E000F0B50F00060085B0110038001500FFF797 +:1036F0005BFE00282EDB012301930023029303933A +:10370000B54206D1290001A8FFF792FB041E13D190 +:1037100001ADB7420AD101236868A9683360002867 +:1037200010D1B268FFF7AEF8002405E03900300090 +:10373000FFF77EFB041EEED001A8FFF707FB200079 +:1037400005B0F0BD8300CB18043B1B68002BE8D10B +:103750000138E4E70A246442F1E7F8B50D6813681C +:1037600004006B430E001700002B17DA1100300025 +:10377000FFF71AFE002808DB3A0031002000FFF7AF +:10378000AFFF002809D1256007E032003900200092 +:10379000FFF7A6FF6D420028F5D0F8BDFFF747FF01 +:1037A000EFE7F8B50D68136804006B430E001700CF +:1037B000002B17DD11003000FFF7F6FD002808DBB5 +:1037C0003A0031002000FFF78BFF002809D1256067 +:1037D00007E0320039002000FFF782FF6D42002829 +:1037E000F5D0F8BDFFF723FFEFE71FB5D417131986 +:1037F000634000930123D2179A43D21802936B4679 +:10380000019201AA0393FFF7A8FF04B010BD1FB5F2 +:10381000D4171319634000930123D2179A43D21887 +:1038200002936B46019201AA0393FFF7BAFF04B01B +:1038300010BDF0B500231600012289B005000F006D +:10384000029203930493059206930793884206D14C +:10385000010002A8FFF7ECFA041E21D102AFB54225 +:1038600006D1290005A8FFF7E3FA041E18D105AE1A +:103870007B680193019B002B1BD173680093009B15 +:10388000002B21D1019B009A28009918FFF772FAAA +:10389000041E05D101002800FFF78AFB041E28D072 +:1038A00005A8FFF753FA02A8FFF750FA200009B065 +:1038B000F0BD019BBA689B00D318043B1B68002B2A +:1038C000DBD1019B013BD4E7009BB2689B00D3187E +:1038D000043B1B68002BD5D1009B013BCEE7009B2E +:1038E000B168AA689B00D2180198CB58B968FEF756 +:1038F000EEFF009B5A1E0092F1D23A6833685343A0 +:103900002B60CDE71FB50123019302936B46009214 +:1039100001AA0393FFF78DFF05B000BDF0B58B1E24 +:1039200087B005000F0000920E2B04D904246442D6 +:10393000200007B0F0BD01230024009803930494F5 +:103940000594EDF797F806000190102F3ED18023E3 +:10395000DB059842EAD21F21830019404A1E91419B +:103960005B092800C918FFF705FA041E06D10100FB +:103970002800FFF71DFB0400071E23D003A8FFF754 +:10398000E5F9D5E7012E06D1009B1B782D2B02D13E +:103990002E3B2B60F2E7009B013E10219A5D02A8AE +:1039A000FEF754FF002842D11C21AA68FB089B00A7 +:1039B000D318BA000A400299013791400A001968E9 +:1039C0000A431A60002EDDD10024D7E72100280029 +:1039D000FFF7EEFA0400061ED0D1019B9E42F3D001 +:1039E000002E07D1009B1B782D2B03D12E3B2B6083 +:1039F0000136F2E7009B39009A5D02A8FEF726FF28 +:103A0000041EBBD13A00290003A8FFF77BFF041E68 +:103A1000B4D12B682800029A03A9012B04D1FFF727 +:103A2000E4FE041EE4D0A9E7FFF7F1FEF9E7040085 +:103A3000A4E70000F0B59DB00390019118000021AB +:103A400017000593FFF7E1FD002800D17CE1032377 +:103A5000002401251793380019AB05990A950B949A +:103A60000C940D950E940F94109511941294139537 +:103A70001494159416951893FFF796FCA04227DA34 +:103A8000039BA34206D1019B002B1AD100242000E6 +:103A90001DB0F0BD21000398FFF78AFA041EF2D092 +:103AA0000AA8FFF753F90DA8FFF750F910A8FFF780 +:103AB0004DF913A8FFF74AF90C2119A8F6F7FAFCFB +:103AC000E5E739000198FFF7B3F9041EE8D1DDE717 +:103AD00039000AA8FFF7ACF9041EE1D105990DA839 +:103AE000FFF7A6F9041EDBD17B6810A8991C0D9581 +:103AF0000A95FFF73FF9041ED2D1010010A8FFF785 +:103B000057FA041ECCD1022113A8FFF733F9041E83 +:103B1000C6D10DA8FFF7B8FA1F23184098426BD002 +:103B20001B1A19000AA80493FFF7AEFB041EB7D1B5 +:103B300004990DA8FFF7A8FB041EB1D10B9B0E9DA5 +:103B400000935B1B5E0131000DA80293FFF79CFB05 +:103B5000041EA5D1029B9B0002930DA90AA8FFF7A2 +:103B6000C1FC00284ADA31000DA8FFF7E0FB041E73 +:103B700096D1774A009B9446013B02936B1E0893B3 +:103B80009B000793734BEB189B000993009B6344C6 +:103B90005D1BAB000093089A029B93423CD8039BA9 +:103BA000002B0BD0180010A9FFF742F9002821D1F3 +:103BB000059B3A681B685343039A1360019B002BD3 +:103BC00000D16DE704990AA8FFF7B1FB002811D1D5 +:103BD0003B680AA901980A93FFF72AF9011E00D051 +:103BE000B0E00198FFF711FD002800D058E701234D +:103BF000019A1360040053E704949FE7129B029A12 +:103C00000AA99B181A68080001321A600DAAFFF76A +:103C1000C8FD041EA1D043E7029B0C9E9B00F21836 +:103C20000798116806920F9A043B1258F6180098EC +:103C3000129B1D18914202D301235B420AE001232B +:103C400030685B42002A05D00023EFF74FFC0300E9 +:103C50000029F1D1029A2B600023012A02D0069B91 +:103C6000083B1B68199333681A93069B1B681B93C8 +:103C70002B6801332B60129B009A00219B181A6855 +:103C800013A8013A1A60FFF793F90028B2D1089BF4 +:103C90000F9A002B01D0099BD058159B07991860EB +:103CA000525813A95A60129B009A08009A5806931A +:103CB000FFF728FE00289DD116A913A8FFF712FCD4 +:103CC0000028D8DC129B009A0DA99A5813A80693D5 +:103CD000FFF718FE00288DD1009B13A8DD002900F6 +:103CE000FFF7D2FA002885D10AA9080013AAFFF726 +:103CF00058FD011E26D10AA8FFF787FC00281BDA11 +:103D00000DA913A8FFF794F8002800D072E7290046 +:103D100013A8FFF7B9FA002800D06BE70AA908003A +:103D200013AAFFF71AFD002800D063E7129B009A40 +:103D30009B181A68013A1A60029B013B0293009B90 +:103D4000043B27E70C00ABE60C2464429FE6C04628 +:103D5000FFFFFF3FFEFFFF3F70B504000D001000A6 +:103D600000211600FFF751FC002825DB2A00330054 +:103D700021000020FFF75EFE051E08D0280070BD60 +:103D8000320021002000FFF7E8FC002812D10021BA +:103D90002000FFF73AFC0028F2DB31002000FFF79B +:103DA000A1FB0028EADB320021002000FFF7F9FC2C +:103DB0000028F2D00500E1E70A256D42DEE710B5E4 +:103DC000002A0FD011DB0023012A05D0022A06D1D8 +:103DD0008B68013A1B6813400360002010BDFEF79A +:103DE0008DFFFBE70C204042F8E70A20FBE70000CC +:103DF000836873B51B6804000E4DDB0713D40E20D7 +:103E0000404214E031002000FFF7FFFB00280FDDE7 +:103E10003200210001A8FFF7D2FF002807D1019B43 +:103E20000435002BEBD02E68002EEBDC002076BD95 +:103E30000120FCE7F0DD0110F0B5C74C0700A544F8 +:103E40000E00180000211D000792FFF7DEFB00287E +:103E500000DC26E2AB681C68012322001A400B92AA +:103E60001C4200D11DE200210798FFF7CEFB00287D +:103E700000DA16E208220321A31C5B0013401B1981 +:103E80000493063A049B04986343D31A58430139B8 +:103E900004900029F6D1C0220123D2001AA80E9363 +:103EA000119314930F9110911291139115911691F2 +:103EB000ECF77AFC0798FFF7E7F8A82306229B00A7 +:103EC000039298420DD205230393EF2809D8013BB2 +:103ED00003934F2805D8013B0393172801D80B9B68 +:103EE00003936B683800013319000593FEF742FF16 +:103EF000041E00D0A5E105991DA8FEF73BFF041E96 +:103F000000D09EE1059B11A85900FEF733FF041E67 +:103F100000D096E133680993013309D1310014A828 +:103F2000FEF786FF041E00D08BE1012314AE14932C +:103F3000CB230AAADB009B181B68002B08D0CB23DD +:103F4000DB009B181B689B680593002B00D09EE04C +:103F500001210EA8FFF72CF8041E00D071E16B6858 +:103F60000EA89901FFF790F9041E00D069E10EA98F +:103F70002A000800FFF7F0FE041E00D061E1CB2309 +:103F80000AAADB009B181B68002B08D0CB230C224D +:103F90000AA8DB001B1818680EA9ECF7E9FB29003A +:103FA0003000FFF79FFA002879DB2A0031001DA8B6 +:103FB000FFF7D2FE041E00D043E1049B2A005B42BF +:103FC000049311AB00930EA9049B1DA8FFF723FADD +:103FD000041E00D035E138000EA9FEF729FF041EAB +:103FE00000D02EE101260DAB199311AB00932A00EE +:103FF0003800049B17A90D9617961896FFF70BFA31 +:10400000041E00D01DE1039BB3424DD100221600D7 +:10401000079B08925B6805920693089B002B00D0D3 +:10402000A1E0069B002B00D098E0039A0133934057 +:104030000893069BB34200D0E5E001260DAB19932F +:1040400011AB00932A003800049B17A90D96179610 +:104050001896FFF7E0F9041E00D0F2E0099B013347 +:1040600000D0EEE0079B5B680493002B00D1E8E0F2 +:10407000079B9B681B68334200D1E2E0099B3A0032 +:10408000290038003B60FFF768FB0400D9E0CB2330 +:104090000AA9DB005B180C2219680EA87DE7310025 +:1040A0001DA8FEF7C5FE85E7039B013B9E400896D1 +:1040B0000C269E4005931AAB9E196B683000591C64 +:1040C000FEF758FE041E00D0BBE030001DA9FEF72D +:1040D000AFFE041E00D0B4E0069011AB00932A009E +:1040E00031003000049BFFF796F9041E00D0A8E0D1 +:1040F000069B01330693069A059B9342EDD8089BD5 +:10410000039A01330693012393400893089B069A70 +:104110000596934200D879E7059E6B680C3630000F +:10412000591CFEF727FE041E00D08AE030000599D6 +:10413000FEF77EFE041E00D083E011AB00932A0040 +:104140003000049B1DA9FFF766F9041E00D078E03B +:10415000069B01330693D9E794F9FFFF069B013BC9 +:10416000069320230893089B013B0893079B9B68B9 +:104170000A93069B0A999B005B580899CB40012142 +:104180000B40110019430ED0002B0ED1012A0CD187 +:1041900011AB00932A0039003800049BFFF73BF96C +:1041A000041E4ED101210A0037E7039A0136921B03 +:1041B0009340059A02211A43039B0592B342F2D120 +:1041C00000230A9311AB00932A0039003800049BA6 +:1041D000FFF721F9041E34D10A9B01330A939E4252 +:1041E000F0D80C21059B2A0059431AAB591811AB82 +:1041F00000933800049BFFF70EF9041E21D106003E +:104200000B990590CFE711AB00932A0039003800D5 +:10421000049BFFF700F9041E13D1059B089A5B006D +:104220000593134203D1069B0133069301E711ABBB +:1042300000932A003800049B1DA9FFF7ECF8041E28 +:10424000F1D001263500039B0C27013B9D40039BC9 +:104250009E40AE421DD81DA8FEF778FD11A8FEF7BE +:1042600075FD14A8FEF772FDCB230AAADB009B188C +:104270001B68002B06D0CB23DB009B181B689B68B8 +:10428000002B02D10EA8FEF761FD2000064B9D44D5 +:10429000F0BD380068431AABC018FEF757FD013572 +:1042A000D7E704246442F0E76C06000070B50023F1 +:1042B0001600012286B00500684600920193029321 +:1042C000039204930593FEF7B3FD041E55D131000C +:1042D00003A8FEF7ADFD041E4FD16846FEF7B8FEF9 +:1042E000060003A8FEF7B4FE864200D9060031009E +:1042F0006846FFF71CF8041E3FD1310003A8FFF702 +:1043000016F8041E39D10123039300930021684657 +:10431000FFF77BF900280BD1310003A8FEF7B4FFAB +:10432000041E2AD1280003A9FEF782FD040024E020 +:104330006846FEF78DFE01006846FEF7F8FF041E92 +:104340001BD103A8FEF784FE010003A8FEF7EFFFD0 +:10435000041E12D1684603A9FFF7C4F8002815DB34 +:104360006946684603AAFFF7BBF9041E05D101217F +:104370006846FEF7DCFF041EC8D06846FEF7E6FC80 +:1043800003A8FEF7E3FC200006B070BD03A96A464F +:104390000800FFF7A5F9041EEFD1012103A8E8E703 +:1043A000F7B503250D4001936B1E9D418B08ED1859 +:1043B000436804000F000092AB4207D100212000A7 +:1043C000FEF7F6FD061E0FD03000FEBDFEF7BEFC68 +:1043D000012323600023290020006360A360FEF70F +:1043E000C9FC061EEAD0EFE7A368A900C91B59184B +:1043F0003A000198009B9847002DE5D02900A0685D +:10440000FEF76AFCE0E70000F0B599B0069207936A +:104410000122002305910500010009A809920A93D1 +:104420000B930C920D930E930F9210931193129283 +:1044300013931493159216931793FFF7E8F9041E3C +:1044400010D109A8FEF704FE09A903900CA8FEF7F5 +:10445000EFFC041E06D103990CA8FEF768FF0400C8 +:10446000071E2ED009A8FEF771FC0CA8FEF76EFC03 +:104470000FA8FEF76BFC12A8FEF768FC15A8FEF764 +:1044800065FC200019B0F0BD09A912A8FFF72AF8B1 +:1044900000281ADA012112A8FFF7B7F8002814DD66 +:1044A00015AB12A9009308002B000CAAFFF7C4FC5F +:1044B000002868D109A912A8FFF714F800282ED106 +:1044C0000137059B9F42CDD020266B68069A990044 +:1044D00012A8079BFFF764FF002854D112A8FEF72B +:1044E000D3FD049009A8FEF7CFFD049B0100834291 +:1044F0000FD9139B254A14989A18013B5B0192002F +:104500008218D843012340185B42834011689943C5 +:104510001160013E002EB7D10E246442A2E70121B2 +:1045200012A8FFF772F801260028C9D009A912A81D +:10453000FEF7D8FF039B9E421ED2002806D1012120 +:1045400012A8FFF762F80028BAD1E5E712AA110015 +:104550000FA8FFF76EF9002815D12A000FA912A89D +:10456000FFF7FAFB00280ED1012112A8FFF74DF842 +:10457000002801D00136D9E709A912A8FEF7B2FF39 +:104580000028DCD0C8E704006CE7C046FFFFFF3F0F +:10459000F0B59FB00F000190012110001600FFF749 +:1045A00034F8002800DC36E1002301253200390010 +:1045B00003A806950793089309950A930B930C9506 +:1045C0000D930E930F9510931193039504930593F8 +:1045D0001295139314931595169317931895199391 +:1045E0001A931B951C931D93FFF760FE041E00D0C9 +:1045F0008CE0290003A8FFF708F8002800D007E1A5 +:104600003200390006A8FFF7A7FB041E00D07DE0AA +:1046100006A909A8FEF70CFC041E00D076E03100C4 +:1046200012A8FEF705FC041E70D1310015A8FEF794 +:10463000FFFB041E6AD129000CA8FEF7B9FC041E7A +:1046400064D101000FA8FEF7B3FC041E5ED1010087 +:1046500018A8FEF7ADFC041E58D129001BA8FEF7D0 +:10466000A7FC041E52D10B9B1B682B423AD0179B10 +:104670001B682B4200D17BE015A909A8FEF732FF89 +:10468000002800DA9FE009A9080015AAFFF789F8B9 +:10469000041E3BD10CA9080018AAFFF782F8041EDB +:1046A00034D11BAA0FA90800FFF77BF8041E2DD1F7 +:1046B000002109A8FEF7A9FF0028D4D1002118A8DD +:1046C000FEF7A3FF002800DA90E0310018A8FEF7FB +:1046D00009FF002800DB92E0019818A9FEF7A8FB6B +:1046E000040013E0290009A8FEF721FE041E0DD1E5 +:1046F0000E9B1B682B4227D1119B1B682B4223D199 +:1047000029000CA8FEF713FE041E2CD006A8FEF705 +:104710001DFB09A8FEF71AFB0CA8FEF717FB0FA854 +:10472000FEF714FB03A8FEF711FB12A8FEF70EFB21 +:1047300015A8FEF70BFB18A8FEF708FB1BA8FEF751 +:1047400005FB20001FB0F0BD0CA9080012AAFFF75E +:1047500004F8041EDAD10FA9080006AAFFF721F811 +:10476000041ECDD0D2E729000FA8FEF7E0FD78E7C0 +:10477000290015A8FEF7DBFD041EC7D11A9B1B6894 +:104780002B4211D11D9B1B682B420DD1290018A86B +:10479000FEF7CDFD041EB9D129001BA8FEF7C7FD09 +:1047A000041E00D163E7B1E718A9080012AAFEF7BA +:1047B000D4FF041EAAD11BA9080006AAFEF7F1FF28 +:1047C000041EE3D0A2E715A9080009AAFEF7E9FF35 +:1047D000041E00D09AE718A908000CAAFEF7E1FF12 +:1047E000041E00D092E70FAA1BA95CE718A93200AB +:1047F0000800FEF7B2FF041E00D15FE786E718A9A4 +:1048000032000800FEF7CDFF041E00D15DE77DE712 +:104810000E2464427AE70424644292E7F0B501274B +:104820001E00436887B0049383680C0003A800212E +:104830001500039701930593FEF7E7FE00281CD0AF +:10484000390003A8FEF7E1FE002816D0022103A8D4 +:10485000FEF7DBFE002806D003A8FFF7C9FA002800 +:1048600004D0B84200D1002007B0F0BD33002A00C8 +:10487000210003A8FFF7C8FDF6E70E204042F3E74A +:10488000F0B58BB00093734B0292CA1E07000E0066 +:104890009A4200D9DAE00123079300230893099391 +:1048A0001F330B405A1E934102254A099B18029A56 +:1048B0002A4200D085E0684A914213D8674A013500 +:1048C00091420FD8664A013591420BD82C3AFF3AF3 +:1048D0000435914206D20435F92903D806359529C5 +:1048E00000D809359A005B0103920193043A9B1B9F +:1048F000049205933800109B009A0399FFF750FD2E +:10490000041E00D08BE0BA680499564B52589A4264 +:10491000F0D9019B9E4200D27AE001220120B968C1 +:104920000B681A430A60029A024200D17DE003221A +:1049300013430B6006A83900FEF7E0F9041E6ED1A0 +:10494000069B002B00D07CE0082239003800FEF7DF +:104950004CFF041E63D1390007A8FEF769FA041E54 +:104960005DD1012107A8FEF7E2FC041E57D13800F3 +:10497000FFF73EFA041E14D107A8FFF739FA041E08 +:104980000FD129003800109B009AFFF73DFD041E4F +:1049900007D12900109B009A07A8FFF735FD041ED8 +:1049A0003DD023000E333AD10C2239003800FEF7F7 +:1049B0001CFF041E33D107A906220800FEF715FFCD +:1049C000D3E7294A042591428CD8284A01359142DF +:1049D00000D987E7953A0135914200D382E71F4A13 +:1049E0000135914200D97DE7214A0135914200D934 +:1049F00078E7F93A0535914200D373E70F35F92985 +:104A000000D96FE70C35952900D96BE70B3569E7BD +:104A100038000599FEF78BFC041E00D17DE707A83E +:104A2000FEF794F920000BB0F0BD109B2900380070 +:104A3000009AFFF7F3FE030004000E3300D159E79C +:104A4000EDE70422012B00D085E77EE704246442D1 +:104A5000E8E7C046FD1F00001305000051030000F9 +:104A60008902000033F304B5A90500007D040000AD +:104A7000ED020000F0B599B00993249B209E0390AD +:104A800006910292022B04D10D246442200019B039 +:104A9000F0BD249B102BF7D80123249C249A1C40A2 +:104AA0001A42F1D11E9B073B062BEDD8FF231B02B8 +:104AB0009E42E9D80F221E9B1120D9B2521AD3B2BE +:104AC000049333005A1E93419A010E235B1ADBB202 +:104AD0000893249B0CAD023B5B08DB001343089A50 +:104AE000099913432B7008ABC0181E9AEBF740FED0 +:104AF0002B00029D0134049AE4B2DD732D0A013BC0 +:104B0000A242F7D1002DBFD11022290010A8EBF747 +:104B10004BFE10AB0593102008A909181A78495DBF +:104B200001354A401A7001338542F4D10BAB009332 +:104B300010AB2A001900039800F01EFB041EA5D13B +:104B4000002E42D13120089B14AC237008AB1E9A72 +:104B50000999C018EBF70CFE1E9B0021581C049A03 +:104B60002018EBF721FE01231026E373029B002B94 +:104B700000D080E014AA110018000133049CDBB2BD +:104B8000D073013A9C42F8D10BAB0CAD00931022CC +:104B90002B00039800F0F0FA041E00D076E7059B86 +:104BA000029A1B78AA5C5340059A1370029B01334A +:104BB0000293130001330593029B102BEFD1249A2B +:104BC000239810A9EBF7D4FD60E72A0001000CA898 +:104BD000EBF7EAFD73BA08AA370013820E2E00D94C +:104BE0000E271220002508ABC0183A001F99EBF7DA +:104BF000BFFD10AB0CA81A78295C01354A401A7029 +:104C00000133102DF7D10BAB009310AB2A00190024 +:104C1000039800F0B1FA041E00D037E71F9BF61B83 +:104C2000DB190793002E8DD03700102E00D92F00EE +:104C30000CAC2A0000212000EBF7B6FD3A00200062 +:104C40000799EBF795FD002310AA1178185D013341 +:104C5000414011700132102BF7D10BAB009310AB18 +:104C60002A001900039800F087FA041E00D00DE70F +:104C7000079BF61BD4E7029D102D00D93500069B3B +:104C8000002B29D00BAB0CAF009332003B000398F4 +:104C900014A900F071FA041E00D0F7E6A8423BD335 +:104CA000069B012B41D014A90A00229B5B19229379 +:104CB000219B5B192193029B5B1B0293D37B0133E6 +:104CC000DBB2D373002B00D050E7013A8B1A049863 +:104CD000DBB28342F2D349E70CAC320006992000E4 +:104CE000EBF762FD2A0020002199EBF741FD069BBE +:104CF00010AA1178185D0133414011700132102B58 +:104D0000F7D10BAB009310AB32001900039800F001 +:104D100033FA041EB6D0B9E6219B3A5C1B5C5340C3 +:104D2000229A13540130C0B2B8E70CAC3200002113 +:104D30002000EBF739FD2A0020002299EBF718FD3F +:104D4000002310AA1178185D01334140117001321F +:104D5000102BF7D10BAB009310AB32001900039866 +:104D600000F00AFA041E9ED090E610B544220021FD +:104D7000EBF71AFD10BDF8B504001600080001227B +:104D800019001D0000F076F9071E12D04369102BA0 +:104D90000FD1200000F08AF93900200000F0B0FBAC +:104DA000002805D101232A003100200000F096F9E7 +:104DB000F8BD0D204042FBE710B5041E05D000F001 +:104DC00075F944212000F5F775FB10BD10B588B0CA +:104DD0000F9C009306940E9C130005940D9C0A00F2 +:104DE00004940C9C002103940B9C02940A9C019453 +:104DF000FFF740FE08B010BD10B586B00D9C002C2A +:104E00000ED005940C9C04940B9C03940A9C029471 +:104E1000099C0194089C0094FFF7D8FF06B010BDD0 +:104E20000D204042FAE770B50C008CB01399159D27 +:104E30000491129908AE039111990093029110996F +:104E4000130001912200012106950596FFF712FE3D +:104E5000031E08D00CB070BD149AF15CD25C013313 +:104E60004A401043DBB2AB42F6D30028F2D013988D +:104E70002100F5F71FFB0F204042EBE710B586B08D +:104E80000D9C002C0ED005940C9C04940B9C039458 +:104E90000A9C0294099C0194089C0094FFF7C3FFAC +:104EA00006B010BD0D204042FAE7002310B5891A64 +:104EB0008B4200D310BDC4180133A154DBB2F7E715 +:104EC000F0B5002821D0002A1FD04318013B1D78DF +:104ED000A9429B414E1B16606A426A415B421343E2 +:104EE00000228A4205D1581E83415842084B18407F +:104EF000F0BD845C6C40A44600246746B242644125 +:104F00007C432343DBB20132EBE70248F0E7C046C3 +:104F1000009EFFFF009FFFFF802330B500248354D5 +:104F2000891A7F3B8B4200D330BDC5180133AC5486 +:104F3000DBB2F7E770B5012300268D1AAB4203D32D +:104F400040180138057070BDC418A418013C013325 +:104F50002670DBB2F2E70000F0B500281ED0002A70 +:104F60001CD04C1E035DCD1A9942894115605A42EE +:104F700053414942194300231E009C4205D8481E54 +:104F80008141484206490840F0BD3200AB427241BF +:104F9000C75C01337A431143C9B2EEE70148F3E736 +:104FA000009EFFFF009FFFFF00238A4200D370474F +:104FB00083540132F9E70000002804D0002A02D00F +:104FC0000020116070470148FCE7C046009FFFFFCA +:104FD000F0B500281DD0002A1BD0002480231460C7 +:104FE000002905D1581E834158420B4B1840F0BD93 +:104FF0000139455C17686E1EB5410E0025436C40B3 +:1050000066433E431660465C74436340DBB22C004B +:10501000E6E70248EBE7C046009EFFFF009FFFFF68 +:1050200070B5002814D0002A12D000231360002984 +:1050300001D1080070BD4D1E445D661EB4411C4385 +:105040006340594313681943116023002900EEE7B8 +:105050000048EFE7009FFFFF0200054B586800285B +:1050600000D1704719789142FBD00833F6E7C0466B +:105070005CE4011030B50400084B5868002800D1EA +:1050800030BD85692D78A54205D145688D4202D194 +:1050900045789542F4D00833EFE7C0465CE4011050 +:1050A00010B544220021EBF77FFB10BD10B5041EA4 +:1050B00013D0006C002805D02421F5F7FBF9206CF3 +:1050C000F5F7E6F9E06B002803D023689B695B6A7B +:1050D000984744212000F5F7EDF910BD70B504683C +:1050E000002C01D10C4870BD2569AD0702D465685C +:1050F0009542F7D142600372012B03D06578033DDE +:10510000022D04D8A3699B69C06B9847EBE7002B7D +:10511000E8D1A369DB69F7E7009FFFFF036870B57B +:1051200005001400002B15D0102A11D81A69D207D7 +:1051300003D4DB689C420DD31C000026B44205D08A +:10514000280022002830EBF713FBAC63300070BD61 +:10515000014EFBE7014EF9E7809FFFFF009FFFFF35 +:1051600002680300002A02D00020586270470148FC +:10517000FCE7C046009FFFFFF0B506688BB0040057 +:105180001500109F06910793002E02D17F480BB0A7 +:10519000F0BD00233B607369059373780893012B7E +:1051A0000DD1059B9A4200D0EAE00821B3693A602C +:1051B00041565D68069A079BC06BA847E7E7089BC6 +:1051C000062B07D13A602900079B069AC06B04F0B2 +:1051D000F8FCDCE7059B002B00D1D3E0069B079A87 +:1051E000934208D1436A002BD0D128000599EEF7ED +:1051F00045F80029CAD1089B022B00D084E008237F +:10520000626AE3560892002B12D1059B9B1AE26852 +:10521000002A12D0AB4212D308982A001430069903 +:105220002018EBF7A5FA636A5D1965620020AEE706 +:10523000012B04D1059B089A9B1AAB42ECD8089B22 +:10524000002B2FD0089A059B10009B1A14301A00CF +:10525000069920180993EBF78BFA079A236808211F +:105260009B6901922200143200929B6861561E00D5 +:105270002300059AE06B2833B047002800D086E76A +:10528000059A3B6894469B183B60099A079B6062AD +:10529000634494460793069B63440693089BED186A +:1052A000059BED1A002DC1D028000599EDF7E6FF0A +:1052B0000E1E07D10823E356002B03D1E368002B11 +:1052C00000D0059E2000069BAD1B320059191430FA +:1052D000EBF74EFA636A9E196662002DA6D0230092 +:1052E0000821079822686156926901900698283330 +:1052F00000909668E06B2A00B047002800D046E78F +:105300003B685D193D6042E7089B032B13D107986A +:10531000B2690290069823000190200008212830ED +:105320000090D66861562A00E06B2433B04700280D +:1053300000D02CE7E6E7089B042B0DD123002200C8 +:105340000798B16901900698283300900E69E06BC8 +:1053500029002432B047EAE7089B052B14D10798AF +:10536000B1690290069823000190200022001430B9 +:1053700000904E69E06B290028332432B047D6E70D +:10538000034804E7034802E7034800E7009FFFFFE4 +:10539000809DFFFF809CFFFF809FFFFFF7B50768A0 +:1053A00004000E001500002F5BD000222A607B78DD +:1053B0001000D91E042910D9092B0ED0397848398C +:1053C00001290AD9012B09D1606A43425841C522FB +:1053D000274B4042D2011040C018FEBD022B42D1E3 +:1053E0000823E356626A012B29D1E368002B02D11E +:1053F00050425041EBE72000A16B1430002900D14E +:10540000F968984720000821226814309369615692 +:10541000019600909F6823005269E06B2833B847DB +:105420000028DAD10822A2562368002A13D1191EB7 +:10543000246900D059692A003000A047CDE77B6974 +:105440009342DFD0E368002B0FD1501E82415042BF +:10545000074A1040C1E70200002B00D05A692A60B9 +:10546000BBE70448B9E70448B7E70148B5E7C046D9 +:10547000809DFFFF009FFFFF809FFFFF03001A68D2 +:10548000080000B5002A20D05278022A1DD1042934 +:105490001DD8EDF74FFE03090D1115000D4ADA6016 +:1054A0000D4A00201A6100BD0C4ADA600C4AF8E788 +:1054B0000C4ADA600C4AF4E70C4ADA600C4AF0E76E +:1054C00000200C4AD8601A61EDE70B48EBE70B4867 +:1054D000E9E7C046AB4E0110C14E0110194F011053 +:1054E000D14F0110354F0110594F0110A94F011034 +:1054F00021500110B94F0110009FFFFF809FFFFF57 +:1055000070B504000D1E10D044220021EBF74CF9B9 +:10551000AB691B6A9847E063002808D0002120008F +:105520002560FFF7ABFF002070BD0248FCE7024892 +:10553000FAE7C046009FFFFF809EFFFF7FB50A9CF1 +:1055400005001E00FFF7EAFD002819D12B68002B8B +:1055500018D0686231002800099B089A0094FFF770 +:105560000BFE00280CD12268099B2800991803AA79 +:10557000FFF714FF002803D12368039A9B182360C8 +:1055800004B070BD0048FBE7009FFFFF10B50400AA +:10559000FFF712FC2000F4F77BFF10BD10B544218B +:1055A0000120F4F76DFF041E01D0FFF7DEFB2000A1 +:1055B00010BD10B513000A000221FFF7DCFB10BD7F +:1055C00010B5040004F020FC2000F4F761FF10BDCA +:1055D000C82110B501204900F4F752FF041E01D084 +:1055E00004F086F9200010BD10B513000A00022156 +:1055F00004F085F910BD10B5040006F0C2FB2000D0 +:10560000F4F746FF10BD8C2110B501204900F4F7D6 +:1056100037FF041E01D006F0ADFB200010BD10B511 +:1056200006F09AFC10BD10B506F0B4FB10BD1FB516 +:10563000089C0294079C0194069C009407F030FAA1 +:1056400004B010BD13B5059C0194049C009407F0B0 +:10565000F9F916BD1FB5089C0294079C0194069C9D +:10566000009407F0AFF904B010BD13B5059C019488 +:10567000049C009407F054F916BD10B507F044F9E6 +:1056800010BD000070B5102A04D01B26082A02D0D5 +:105690000C480DE08726013A00231500002A08DA9D +:1056A0000023CB56425DDB1133405340435500206D +:1056B00070BD8C5C64001C4384548B5C013ADB0934 +:1056C000ECE7C046009FFFFF70B500249C4200D16C +:1056D00070BD0D5D165D754005550134F6E700009F +:1056E00070B5051E0FD00368002B0CD000290AD01E +:1056F0000123FFF7F3FC041E13D12B681B78042B46 +:1057000003D8012B03D8094C0BE0242BFBD1242117 +:105710000120F4F7B5FE002805D010212864F4F725 +:10572000C9FE200070BD024CFBE7C046009FFFFF92 +:10573000809EFFFFF0B589B00F0003900292002811 +:1057400063D00368002B60D000295ED0046C002C6D +:105750005BD0206A5E69002820D0029B321A9A42F0 +:105760001CD210302018EBF703F821003300220080 +:1057700020001031FFF7A8FF07AB00933200230091 +:1057800021000398FFF7F8FC051E24D1226A20624D +:10579000B31AFF18029BD218931B0293029B701E30 +:1057A000C0183100EDF7E4FC012305900493049B3D +:1057B000059A934212D30025029BAB420BD0206A7C +:1057C0001A00103039002018EAF7D2FF216A029B34 +:1057D0008C4663442362280009B0F0BD33002200E8 +:1057E00039002000FFF770FF07AB00933200230061 +:1057F00021000398FFF7C0FC051EECD1029BBF19E6 +:105800009B1B0293049B0133D0E7014DE3E7C046A5 +:10581000009FFFFFF0B593B0051E039100D17DE01E +:105820000368002B00D179E0046C002C00D175E0F6 +:10583000002900D172E0102106A85E69F4F73AFE53 +:1058400010210AA8F4F736FE10210EA8F4F732FE54 +:105850002B6828005F6905AB00930EAB3A00190076 +:10586000FFF78AFC00280BD13A000EA906A8FFF723 +:1058700009FF002804D13A0006A90AA8FFF702FF91 +:10588000270010210EA8F4F715FE216A1037B14247 +:105890003FD200220EAB96422FD10EA93300080052 +:1058A0000AAAFFF711FF3300220020000EA9FFF71C +:1058B0000BFF05AB28000093320023002100FFF707 +:1058C0005BFC051E04D1320021000398EAF750FF6B +:1058D000102106A8F4F7EEFD10210AA8F4F7EAFD5E +:1058E0000023102138002362F4F7E4FD102120008A +:1058F000F4F7E0FD280013B0F0BD914204D9B85C84 +:10590000187001320133C6E780209142F8D00020A0 +:10591000F6E73300390006AA0EA8C2E7004DE9E712 +:10592000009FFFFFC023F0B5544C0E00A5441500A6 +:1059300002905B009A4200D99DE0D02262AF002124 +:1059400052003800EAF730FF1CA806F013FA6BBAD1 +:105950007B82002430232A00310068A8FB753C823A +:10596000EAF706FF8022CAAB5B19893BFF3B1A703E +:1059700008A964540134202CFBD180221CA85200B9 +:1059800006F008FA041E57D119350395009010222D +:10599000002104A8EAF708FF66AB039E0193019A71 +:1059A00004AB103A1978107801324140197001990E +:1059B00001338A42F6D13300102E00D9102304ADF2 +:1059C0002A000121F61A1CA82B0006F09DFF041ED8 +:1059D00032D1019B10330193002EE0D1009B10AA1D +:1059E0009B1807CD07C32A681A6062AAD3780133CF +:1059F000D370009B10330093302BC8D1802210A9A4 +:105A000052001CA806F0C6F9041E15D1029B029E86 +:105A10003033009318AD2B002A0001211CA806F09A +:105A200073FF041E08D1330007CD07C32A68103660 +:105A30001A60009BB342EDD11CA806F0A2F9D02158 +:105A400038004900F4F736FD302110A8F4F732FD94 +:105A5000202108A8F4F72EFD102104A8F4F72AFD50 +:105A6000002C03D030210298F4F724FD2000CB2332 +:105A70009B009D44F0BD38246442F7E7D4FCFFFF4F +:105A8000F0B58FB0019105003022002102A8EAF79D +:105A90008BFE0027290002AEBB190F3100E0110078 +:105AA0000A780132D2B20A70002A02D14A1E8D420F +:105AB000F5D12A002032009201212A00009806F038 +:105AC00023FF041E1AD11037302FE3D101990A00A9 +:105AD00030323378087801314340337001369142D7 +:105AE000F7D180220098520002A906F053F9041E53 +:105AF00004D1102228000AA9EAF73AFE02A83021B0 +:105B0000F4F7D8FC20000FB0F0BDF0B5E3B0009280 +:105B1000C022866904001D0001915200964247D8B8 +:105B2000931BAB4244D30099531B9B1B8B423FD327 +:105B300027000021FC3702A8EAF736FE3200386C55 +:105B4000FB6B02A99847002802D034256D422CE057 +:105B5000A669002D07D02A00FB6B386C02A9984774 +:105B60000028F2D17619019B002B0AD0009B002B54 +:105B700007D002ABF018009A0199EAF7F9FD009BF3 +:105B8000F61802A932000800FFF7CCFE051E07D167 +:105B9000200002A9FFF774FF051E01D10123236134 +:105BA000C02102A84900F4F785FC280063B0F0BDCD +:105BB0003825CBE7A02210B5002152000400EAF7F7 +:105BC000F3FD01235B42236110BD10B5041E07D015 +:105BD000203006F0D6F8A02120004900F4F76AFC36 +:105BE00010BD10B50023FFF790FF10BDF0B5040005 +:105BF00027008BB00E0001920021202202A820373E +:105C00001D00EAF7D1FD380006F0B4F82300019A30 +:105C1000FC33DE631A64A369002B01D13033A36126 +:105C20002669002E05DAA36900262F2B01D85E1CF9 +:105C300076088022084B3800E361520002A906F082 +:105C4000A9F8002805D1330029002000109AFFF799 +:105C50005CFF0BB0F0BDC04610270000F0B51E0081 +:105C6000802393B004001500189F0191DB009A4235 +:105C700061D880235B009F4260D83022002106A8B3 +:105C8000EAF792FD2369E269934202DC6369002B23 +:105C900013D031003A002000FFF7A3FF061E23D1E6 +:105CA0001027002D23D1200006A9FFF7E9FE061ECC +:105CB00012D12369013323610EE0002FF0D03100AF +:105CC0003A0006A8FFF72EFE061E05D1200006A901 +:105CD000FFF7D6FE061EE3D0302106A8F4F7EAFB54 +:105CE000102102A8F4F7E6FB300013B0F0BD22004B +:105CF0000F3213780133DBB21370002B02D1531E25 +:105D0000944216D120002200012102AB203006F07F +:105D1000FBFD061EE0D12E00102D00D93E00320002 +:105D2000019802A9EAF724FD019BAD1B9B19019381 +:105D3000B7E71A00DDE736267642D5E73826FBE7D7 +:105D4000002307B50093FFF789FF0EBDF0B58FB0B4 +:105D5000040005A817001E000D0000F088FF0023B6 +:105D60000293159B20000193149B3200009305A918 +:105D70003B0001F05BFC041E09D105A801F0A4FA68 +:105D800000280AD1280005A9FDF752F8040005A84B +:105D900000F0A8FF20000FB0F0BD014CF7E7C046AF +:105DA00080B0FFFF10B5E02200210400EAF7FCFC00 +:105DB0000023A370237010BD002370B5040003708E +:105DC000061D01334170837030000D0000F05CFF50 +:105DD00020008030FCF7B4FF20008C3000F047FF3B +:105DE0002000B03000F043FF2000D430FCF7A8FFC3 +:105DF0002900300003F034F9002800D0004870BDBD +:105E000080B1FFFF10B5041E18D08378012B12D18A +:105E1000043000F06DFF20008030FCF797FF200079 +:105E20008C3000F05FFF2000B03000F05BFF2000FE +:105E3000D430FCF78BFF00232380A37010BD00003B +:105E400070B543780D00040016000978002B08D1C6 +:105E5000FFF7B2FF002803D1A378012B04D00F482D +:105E600070BD8B42F8D0FAE7012E06D12900200040 +:105E70008831B03000F07AFFF2E7002EEFD1290030 +:105E8000200088318C3000F071FF0028E8D1290013 +:105E900020007C318030FCF7CBFFE1E780B0FFFFD2 +:105EA000F0B585B00393837804000D001700012B33 +:105EB00002D01A4805B0F0BD031D0293C36D002B3C +:105EC000F7D00B9B060001930A9B0200009303008E +:105ED000D43631008033B0320430FFF737FF00286A +:105EE000E8D13000FDF7ECF8039B8342E1D30723B0 +:105EF000E26D02981340591E8B41D2089B182B600B +:105F000000F0ACFE39002A68022803D13000FDF70A +:105F100048F9CFE73000FDF780F9CBE780B0FFFF0D +:105F2000F8B50F001100C26D0600D41DE4089C42B4 +:105F300000D91C0022003800FDF7FEF8051E17D11D +:105F4000F16DE4008C420CD84C3631003800FDF77E +:105F5000C9FA00280CDB320039003800FDF721FCBB +:105F600005E03800611AFDF7E2F90028ECD00500E1 +:105F70002800F8BD042398430938431E9841704710 +:105F8000F0B506009FB00078150007910893FFF761 +:105F9000F1FF002800D1BCE0736D002B00D1B8E008 +:105FA00001210898FDF731FB002803DA5A4C200044 +:105FB0001FB0F0BD37004C3739000898FDF792FA52 +:105FC0000028F3DA15A800F052FE0CA8FCF7B8FE82 +:105FD0000FA8FCF7B5FE12A8FCF7B2FE00230B9346 +:105FE0000BAB06930AAB0593069B1B6809930A2B20 +:105FF00000DD8CE00023059A1360059B059A1B6861 +:10600000043205920A2B00DD81E03000279B269A9E +:106010000CA901F03FFE041E6CD1299B0290019354 +:10602000289B3000009333000CAA283315A901F0F7 +:10603000FDFA041E5ED13A00079815A9FDF78CFE03 +:10604000041E57D101000798FDF7DFFA0028D4D0CD +:106050003000259B249A0FA9FFF762FF041E49D147 +:106060003000299B289A12A901F014FE041E41D188 +:106070002800089A0799FDF7DCFB041E3AD10FA906 +:106080002A000800FDF769FB041E33D10FA90800A0 +:1060900012AAFDF7CEFB041E2CD10CA9080012AAEF +:1060A000FDF7C7FB041E25D10CA93A000800FDF737 +:1060B00053FE041E1ED13A0028000CA9FEF768FA10 +:1060C000041E17D1290028000FAAFDF7B2FB041EF9 +:1060D00010D13A0029002800FDF73EFE041E09D128 +:1060E00001002800FDF791FA069B0433069300286F +:1060F00000D179E715A800F0F5FD0CA8FCF726FE05 +:106100000FA8FCF723FE12A8FCF720FE4FE7034C74 +:10611000F0E7034C4BE7C04680B3FFFF00B3FFFF3F +:1061200080B0FFFFF0B50600E1B0079368AB1878C8 +:10613000F36D699FDD1D0891099203F0CBFFED0817 +:106140000690002800D167E00AA8FCF7F9FD0DA829 +:1061500003F065FE2A0007983FA9FDF75EF8041ECC +:106160002AD13000679B669A0AA9FFF7D9FE041E60 +:1061700022D13FAB2A0059190AA8FDF74EF8041E98 +:106180001AD16D002B0006993FAA0DA803F0FDFE61 +:10619000002F1AD06A9B300005930DAB03931F4B61 +:1061A000099A0293679B08990193669B0497009351 +:1061B000079BFFF7E5FE04000DA803F080FF0AA887 +:1061C000FCF7C4FD200061B0F0BD26AF380003F03D +:1061D00026FE2B0006993FAA380003F0D6FE1022B7 +:1061E00038000F4903F021FE041E03D0380003F0ED +:1061F00066FFE1E7094B0DAA04930293679B0392A4 +:106200000193669B30000093099A079B08990597B4 +:10621000FFF7B6FE0400E9E7024CD3E7B3A0011094 +:106220000CE5011080B0FFFFF0B505009DB013A88C +:10623000140004910593239F00F019FD07A8FCF7B3 +:106240007FFD0AA8FCF77CFD0DA8FCF779FD10A8DE +:10625000FCF776FD2878FFF78DFE002800D17BE063 +:106260006B6D002B00D177E001212298FDF7CDF96D +:1062700000285EDB2E004C3631002298FDF732F903 +:10628000002856DA01213800FDF7BFF9002850DB5D +:1062900031003800FDF726F900284ADA23002800EB +:1062A000049A07A9FFF73CFE041E43D132003900CF +:1062B0000AA8FEF76DF9041E3CD10AAA07A90DA889 +:1062C000FDF7B7FA041E35D10DA932000800FDF71D +:1062D00043FD041E2ED110AF380022990AAAFDF703 +:1062E000A8FA041E26D1320039003800FDF734FD2B +:1062F000041E1FD12B00059A02900192280028331A +:1063000000970DAA13A901F08DFC041E12D113A849 +:1063100000F0DAFF00280CD113A932000800FDF7C5 +:106320001BFD041E06D1229913A8FDF7DBF8041EFD +:1063300000D00A4C13A800F0D5FC07A8FCF706FD16 +:106340000AA8FCF703FD0DA8FCF700FD10A8FCF758 +:10635000FDFC20001DB0F0BD014CFAE700B2FFFFCC +:1063600080B0FFFF30B587B00C9C0D9D0494029463 +:106370000B9C059501940A9C03950094FFF700FE81 +:1063800007B030BD30B587B00CAC24780E9D0294B8 +:106390000B9C049501940D9D0A9C03950094FFF7B6 +:1063A000C1FE07B030BD13B5059C0194049C009458 +:1063B000FFF73AFF16BDF0B50400B1B007A81E0004 +:1063C0000F001500FCF7BCFC0AA8FCF7B9FC230081 +:1063D000399A01960492389A200003927C330297EE +:1063E00000950AAA07A9FFF79DFE061E2AD1BF2322 +:1063F0000AAA6B440DA906A8069306F06FFD041EB9 +:106400001FDB07AA0DA906A806F068FD002822DBFD +:1064100025182A000DA906A806F0A2FC041E10DB10 +:1064200030220DA906A806F002FD002815DB64192C +:106430000419220006993698EAF79AF9379B1C60EE +:106440003400260007A8FCF781FC0AA8FCF77EFCB4 +:10645000300031B0F0BD0400F3E70400F1E710B5FF +:10646000002486B004940B9C03940A9C0294099C1B +:106470000194089C0094FFF79EFF06B010BD000039 +:10648000F0B51C008DB0049306AE129B070009AD59 +:106490003000E41802910392FCF752FC2800FCF74C +:1064A0004FFC3023210005AA04A806F083FB002836 +:1064B0000AD0184BC7183000FCF748FC2800FCF73E +:1064C00045FC38000DB0F0BD049B059A9B189C421A +:1064D0001DD13200210004A806F0B9FB0028E8D144 +:1064E0002A00210004A806F0B2FB0028E1D13B00FD +:1064F0003800039A0299883301950096FFF794FEBD +:10650000071ED8D1049BA342D5D0034FD3E7034F36 +:10651000D1E7C04680B0FFFF00B4FFFF1AB0FFFF15 +:1065200013B500240194049C0094FFF7A9FF16BD45 +:1065300010B500F0CAFB10BD10B5002801D000F066 +:1065400007FC10BD70B505000E0000F025FC041E10 +:106550000FD1310028007C317C30FCF769FC041E2F +:1065600007D1310028008831883000F0FFFB041E7D +:1065700002D02800FFF7E0FF200070BD7FB50D00BE +:1065800004000C3501A81600FCF7DAFB211D2A00D7 +:1065900001A8FDF706F9041E0CD101002800FDF743 +:1065A00034F80200501E824101A928003240FCF755 +:1065B00086FC040001A8FCF7C9FB200004B070BDF4 +:1065C000F8B54B6E04000E00002B05D10A1D01002A +:1065D000FDF7C2FB05000AE00368002B09DB200081 +:1065E000FCF752FDB36D5B00984208D9164D2800A8 +:1065F000F8BD0021FDF709F80028F0D0F6E72000EB +:10660000736E9847051EF2D12368371D002B05DAFB +:1066100000212000FCF7F9FF00280DD139002000EF +:10662000FCF760FF0028E2DB3A0021002000FDF7C4 +:1066300057F80028F2D0CDE73A0021002000FDF7FE +:106640008CF80028E0D0C5E780B0FFFF70B50C00E3 +:106650000500110020001A00FDF7EBF8002803D117 +:1066600029002000FFF7ACFF70BDF0B50F00183710 +:1066700006000D003800002187B0FCF7C6FF041E9D +:1066800038D06846FCF75CFB03A8FCF759FB3900DF +:106690006846321DFDF77CFF041E25D16B466A4615 +:1066A000300003A9FFF7D2FF041E1DD12A002900E4 +:1066B000300003ABFFF7CAFF041E15D10C352A00CA +:1066C0002900300003ABFFF7C1FF041E0CD16B465D +:1066D0002A0029003000FFF7B9FF041E04D1012170 +:1066E0003800FCF765FC04006846FCF72FFB03A8A4 +:1066F000FCF72CFB200007B0F0BD0000F0B591B016 +:1067000005000E000392012A06D80968FFF7ADFFC5 +:106710000400200011B0F0BD0C210398F3F7B0FE87 +:106720000090002800D1B0E00C21039B04004B43F3 +:106730000593059A03009446634402900493200055 +:10674000FCF7FEFA049B0C349C42F8D107A8FCF736 +:10675000F7FA0AA8FCF7F4FA0DA8FCF7F1FA316889 +:1067600000981831FCF764FB041E33D1009B371DE1 +:106770000C3301933B68019A2800019918330C3AB5 +:10678000FFF764FF041E25D1019B04370C330193EE +:10679000019A049B9342EDD10599009B0C392A1D67 +:1067A000591807A8FDF7F4FE041E13D1039F013FFB +:1067B000B9007618002F24D107A90AA8FCF738FBE6 +:1067C000041E07D10AAB1A0028000DA9FFF73EFFEF +:1067D000041E2AD007A8FCF7B9FA0AA8FCF7B6FAF3 +:1067E0000DA8FCF7B3FA0298FCF7B0FA029B0C3341 +:1067F0000293029A049B9342F5D10098F3F748FE66 +:1068000087E70C237B43009A28000C3A9B180AA9BF +:1068100007AAFFF71BFF041EDCD1336807AA11008B +:1068200028001833FFF712FFCAE73268280011006A +:106830000DABFFF70BFF041ECCD1316828000C31E3 +:106840000A000DABFFF702FF041EC3D13168280018 +:106850000C310A000AABFFF7F9FE041EBAD1A96891 +:106860003068FCF7AFFA041EB4D13068A9680C3068 +:10687000FCF7A8FA041EADD13068043E1830FCF7CE +:1068800065FA002FA6D0013F94E7014C41E7C046CE +:1068900080B2FFFF70B505000C002E1D31002000F6 +:1068A000FCF720FE002801DA002006E0320021007B +:1068B0002000FCF715FF0028EFD070BD70B50C006C +:1068C0000500110020001A00FCF747FF002803D143 +:1068D00021002800FFF7DEFF70BD70B50C00060038 +:1068E000110020001A00FCF75CFF051E08D02800EC +:1068F00070BD21002000321DFCF72FFF002809D1B8 +:106900002368002BF3DA00212000FCF77EFE00282C +:10691000EFD1ECE70500EAE70C32F0B50E00150008 +:10692000002785B003930AAB1B78029000935B06A7 +:106930009B0E0193039B9F4206D1009B310002985E +:10694000DA09FFF71BFE17E0019BFCB2E41A634271 +:106950005C412900E4B2220030000C39FCF7AFFAA8 +:10696000002809D13000290022000C30FCF7A7FADA +:10697000013724350028DDD005B0F0BD10B5040086 +:10698000FCF7E4F920000C30FCF7E0F920001830A7 +:10699000FCF7DCF910BD70B50C00050001212000EA +:1069A000FCF772FC002803D121002800FFF772FFDA +:1069B00070BDF0B505008FB002A816000191FCF77C +:1069C000BFF905A8FCF7BCF908A8FCF7B9F90BA8B2 +:1069D000FCF7B6F9AB69002B00D0C3E032001832E7 +:1069E0001300280005A9FFF731FE041E00D0FAE0CD +:1069F0003200280005AB08A9FFF760FF041E00D095 +:106A0000F1E03200280005AB0BA9FFF766FF041E7A +:106A100000D0E8E028000BAB08AA05A9FFF716FE96 +:106A2000041E00D0DFE0032205A902A8FCF76AFFDC +:106A3000041E00D0D7E02C1D210002A8FCF752FD57 +:106A4000002800DB88E037000C373B003A002800C4 +:106A500008A9FFF7FBFD041E00D0C4E0280008A928 +:106A6000FFF799FF041E00D0BDE03200280008ABFC +:106A700005A9FFF7EBFD041E00D0B4E0280005A92E +:106A8000FFF789FF041E00D0ADE008AB1A00280014 +:106A90000BA9FFF7DBFD041E00D0A4E028000BA922 +:106AA000FFF779FF041E00D09DE002AB1A0028001A +:106AB00008A9FFF7CBFD041E00D094E008AA11003E +:106AC000280005ABFFF709FF041E00D08BE008AAE1 +:106AD0001100280005ABFFF700FF041E00D082E084 +:106AE00005AA1100280008ABFFF7F7FE041E00D02E +:106AF00079E005AA1100280002ABFFF7A7FD041EEC +:106B000071D105AA110028000BABFFF7E6FE041EA9 +:106B100069D133003A00280018330BA9FFF796FD1E +:106B2000041E60D128000BA9FFF735FF041E5AD1BF +:106B3000019808A9FCF77CF9041E54D1019805A915 +:106B40000C30FCF775F9041E4DD101980BA91830D3 +:106B5000FCF76EF9040046E002A922000800FCF7E9 +:106B6000BFFD65E733003200280005A9FFF76EFD81 +:106B7000041E38D1032205A902A8FCF7C3FE041E97 +:106B800031D12C1D210002A8FCF7ACFC002839DA19 +:106B90002F00103700213800FCF737FD002800D106 +:106BA00051E7320018321300280005A9FFF74EFD07 +:106BB000041E18D105AB1A00280008A9FFF746FDEE +:106BC000041E10D13B00280008AA05A9FFF73EFDCE +:106BD000041E08D102AA1100280005ABFFF76EFEC3 +:106BE000041E00D12FE702A8FCF7B0F805A8FCF7B7 +:106BF000ADF808A8FCF7AAF80BA8FCF7A7F8200046 +:106C00000FB0F0BD02A922000800FCF769FDB6E74D +:106C100010B5084C08482368002B09D010BD0C3172 +:106C200001330A78C254002AF9D101232360F5E721 +:106C30000249F6E7F80D0208EC0D0208A0E5011084 +:106C4000020005480378002B01D1180070479342D9 +:106C5000FCD00C30F6E7C046A0E501100300006B45 +:106C6000002803D0D86B434258410130704710B51B +:106C70000400FCF765F820000C30FCF761F82000F8 +:106C80001830FCF75DF810BD70B5002504000570E4 +:106C90000430FCF755F820001030FCF751F82000C4 +:106CA0001C30FCF74DF820002830FFF7E0FF2000F3 +:106CB0004C30FCF745F8A565E56525666566A56673 +:106CC000E56625676567A56770BD10B50400FFF729 +:106CD000DBFF20007C30FCF733F820008830FFF722 +:106CE000C6FF10BD10B5002801D0FFF747FE10BD4C +:106CF00070B5041E1ED0036E012B12D00430FCF7B9 +:106D000025F820001030FCF721F820001C30FCF79B +:106D10001DF820002830FFF7E5FF20004C30FCF77D +:106D200015F80025636F2426AB420AD17C21200090 +:106D3000F3F7C0FB70BD33006B43C018FFF7D2FF01 +:106D40000135A36F606FAB42F5D8F3F7A1FBEDE718 +:106D500010B5041E09D0FFF7CBFF20007C30FBF7F5 +:106D6000F5FF20008830FFF7BDFF10BD70B50400AF +:106D70000D00FCF75DF800280DD1290020000C3132 +:106D80000C30FCF755F8002805D1290020001831F7 +:106D90001830FCF74DF870BD10B5097802F060F9B5 +:106DA00010BD012110B50400FCF702F9011E0BD142 +:106DB000200001310C30FCF7FBF8011E04D120004B +:106DC0001830FCF7F5F80100080010BDF0B51F0001 +:106DD0001300183399B005000E001800002100922E +:106DE0000193FCF712FC3900002800D17BE03B6ADC +:106DF000002B6FD103A8FBF7A3FF06A8FBF7A0FFAA +:106E000009A8FBF79DFF0CA8FBF79AFF0FA8FBF75B +:106E100097FF12A8FBF794FF15A8FBF791FF019BC2 +:106E200028001A0003A9FFF711FC041E3CD128001A +:106E3000019B03AA06A9FFF709FC041E34D103AA8B +:106E40003B0011002800FFF701FC041E2CD13B0081 +:106E500006AA110028000C33FFF7F8FB041E23D10B +:106E600003AA11002800009BFFF737FD041E1BD169 +:106E7000009F06AA0C373B0011002800FFF72DFDEC +:106E8000041E11D1010003A8FCF7BFFB002842D16A +:106E9000210006A8FCF7B9FB002838D131002800F2 +:106EA000009AFFF786FD040003A8FBF74FFF06A832 +:106EB000FBF74CFF09A8FBF749FF0CA8FBF746FFBF +:106EC0000FA8FBF743FF12A8FBF740FF15A8FBF73D +:106ED0003DFF0CE03C00183400212000FCF795FB3E +:106EE000002807D100993000FFF740FF0400200080 +:106EF00019B0F0BD3B6A002B00D17BE701212000D7 +:106F0000FCF783FB002800D174E7434CEFE7300027 +:106F1000FFF747FFC7E72800019A03AB15A9FFF762 +:106F200095FB041EC0D103AB1A00280009A9FFF786 +:106F30008DFB041EB8D1280003AB09AA0CA9FFF7EA +:106F400085FB041EB0D109AA11002800009BFFF7A1 +:106F50007DFB041EA8D109A903A8FBF769FF041E45 +:106F6000A2D1280003A9FFF716FD041E9CD106AB91 +:106F70001A0028000FA9FFF769FB041E00D093E751 +:106F80000FAA1100280003ABFFF7A7FC041E00D0D6 +:106F90008AE70FAA110028000CABFFF79EFC041E25 +:106FA00000D081E709AA110028000FABFFF795FC7C +:106FB000041E00D078E709AA1100280006ABFFF7ED +:106FC00045FB041E00D06FE70CAA3B00110028000F +:106FD000FFF73CFB041E00D066E728000CAB09AAB3 +:106FE00012A9FFF77AFC041E00D05DE730000FA95C +:106FF000FBF71EFF041E00D056E7300012A90C302C +:10700000FBF716FF041E00D04EE7300015A918301C +:10701000FBF70EFF47E7C04680B0FFFFF0B5050065 +:10702000DDB0079362AB1B780EA8089363AB1B78A7 +:107030000F0009931600FBF783FE11A8FBF780FEF3 +:107040002B004C33002118000293FBF7CBFF0128E3 +:1070500003D09B4C20005DB0F0BD00213000FBF759 +:10706000C1FF434258413100C3B20EA80693FBF75B +:10707000DFFE041E22D13200029911A8FCF791FB19 +:10708000041E1BD1069A11A90EA8FBF718FF041EB7 +:1070900014D1649B01005A1C1AA8E9F785FB1AABAE +:1070A000029304930394649B039A934200D0A1E05B +:1070B00000260121649B8B4200D39FE011A8FBF7BF +:1070C00045FE0EA8FBF742FE002CC3D111A8FFF726 +:1070D000CEFD649A5CAB9B18093BFF3B1B783900E3 +:1070E00000932800089B079AFFF716FC041E00D0A7 +:1070F000CEE03B001833012118000293FBF758FF44 +:10710000041E00D0C4E0659B002B00D1BDE0AB6D38 +:107110000BA80733DB080493FBF712FE0EA8FBF75E +:107120000FFE0C230393669B659A04990BA8FDF749 +:1071300037F9061E3AD1291D0BA8FCF7D3F9002810 +:1071400000DB7FE0039B013B0393002B00D1B5E004 +:1071500001210BA8FCF759FA0028E4DD029A280067 +:1071600011000BABFFF772FA061E1FD10BAB1A0012 +:1071700028000EA9FFF76AFA061E17D13A00390057 +:1071800028000EABFFF762FA061E0FD10EAA1100FF +:1071900028000BABFFF75AFA061E07D139000C3155 +:1071A0000A0028000EABFFF751FA06000BA8FBF708 +:1071B000CDFD0EA8FBF7CAFD002E66D0340067E0B7 +:1071C00005990EA8FBF70EFF0300B340049A0136A1 +:1071D000107818431070649A059B94466344059395 +:1071E000099B9E42ECD3039B01330393049B013321 +:1071F000049358E7039B00260593F1E70122029BC5 +:1072000001315B78039373409A430492029A5BB214 +:10721000127810009446049A504340B202001A407B +:107220000592039A43401640059A1643029AF6B215 +:107230005370049BDA0163461A43029B1A700133B0 +:10724000029337E701210BA8FCF771F871E7649B03 +:107250003A00013B390028006493FFF7AAFB00289D +:107260002AD1649A1AABD35C28000093079A089B32 +:1072700011A9FFF751FB00281ED13A003900280060 +:1072800011ABFFF7A3FD002816D1649B002BDED1C4 +:1072900011A8FFF773FB002C00D0DBE639002800B3 +:1072A000069AFFF76BF9041E00D0D3E639002800D8 +:1072B000FFF7DBF90400CDE60400E9E7014CE7E75E +:1072C00080B0FFFF00B3FFFF10B500211830FCF7BE +:1072D0009CF94342584110BDF7B5009004300F00AF +:1072E0001E000192FBF7ECFE05000098FFF7B6FCCC +:1072F000022823D1099B35609D4202D9284C2000E9 +:10730000FEBD2A0038000899FBF74BFF041EF6D19A +:107310000098FFF7A3FC00900128F0D1380000216D +:107320001830FCF772F900280AD1099B002BE5D030 +:10733000089B1870009B33600400E0E7194CE7E7F6 +:10734000019B002B18D16B00099A013333609342E3 +:10735000D4D80423089A38001370511C2A00FBF774 +:107360005CFF041ECBD138002A00089B691C591809 +:107370000C30FBF752FFDFE7019B012BBFD1099ACD +:107380006B1C33609342B9D8380000210C30FBF7F6 +:1073900029FE089B023018702A003800591CE8E7C3 +:1073A00000B1FFFF80B1FFFFF7B507000D001E1E03 +:1073B000019202D1304C2000FEBD0430FBF780FE6C +:1073C00000903800FFF74AFC022831D1009B9E4212 +:1073D000F0D1320028000199FBF778FE041EEAD1B3 +:1073E00028000C30FBF7B2FC3B78092B17D02800A3 +:1073F00001211830FBF7DCFD041EDCD13800FFF75B +:107400002DFC07000128D6D1019B1B78002B11D140 +:10741000012ECFD12800FFF7C4FC0400CBE7F10018 +:10742000220028000139FBF7EDFD041EDFD0C2E782 +:10743000124CE3E7042B1DD1009B5B000133B342E8 +:10744000B8D1019B2800009A591CFBF775FE041E59 +:10745000B1D12800009B009A591C019B0C3059188F +:10746000FBF76AFE041EA6D1280039001830FBF78E +:107470009FFDD2E7014C9EE780B0FFFF80B1FFFF88 +:10748000F0B5050008000E0089B001211830FCF7A6 +:10749000BCF8041E0CD12800FFF7E0FB02280BD13A +:1074A0003000FBF70DFEEB6D0733DB08984200D987 +:1074B0003E4C200009B0F0BD012874D121003000FD +:1074C000FCF7A3F80028F3DB37000C372100380065 +:1074D000FCF79BF80028EBDB2B1D19003000009314 +:1074E000FCF700F80028E3DA3800291DFBF7FAFF63 +:1074F0000028DDDA02A8FBF723FC05A8FBF720FC37 +:107500003B003A00280002A9FFF7A0F8041E43D16F +:1075100033003200280005A9FFF798F8041E3BD17C +:10752000AB69002B2FD105A903220800FCF76FF9E6 +:10753000041E31D1059B0193002B18DB05AA3300F3 +:1075400011002800FFF782F8041E25D12B0005AAA0 +:10755000110028001C33FFF7B1F9041E1CD105A946 +:1075600002A8FBF7BFFF041E16D0104C14E0002148 +:1075700005A8FCF74AF80028E0D005A90800009A01 +:10758000FCF7EBF8D4E72B0005AA11002800103314 +:10759000FFF794F9041ED1D002A8FBF7D7FB05A88A +:1075A000FBF7D4FB85E7024C83E7C04680B3FFFFBF +:1075B00080B0FFFF70B505000C00FFF74FFB060021 +:1075C00002281CD100212000FBF70CFD002825D14A +:1075D00001212000FBF706FD00281FD12000FBF74A +:1075E00053FDEB6D0138984218D1FE2805D13100CA +:1075F0002000FBF7F7FC002810D1002070BD012807 +:107600000ED101002000FCF700F8002806DB29005D +:1076100020004C31FBF766FF0028EEDB0148EDE768 +:107620000148EBE780B3FFFF80B0FFFFF0B5D1B0BA +:107630000691110007000D920993FFF7BBFF041E8E +:1076400068D138000999FFF71BFF041E079061D12C +:107650003800FFF703FB022800D092E131A8FFF7C2 +:1076600006FB13A8FBF76CFB099913A8FBF7E0FBDB +:10767000041E46D1099931A8FFF778FB041E40D1BA +:1076800001210698FBF794FC041E3AD1069D079948 +:1076900018352800FBF78CFC041E32D106980C30FC +:1076A000FBF754FB3B1D190031A80A93FBF71AFFA7 +:1076B00000281FDA569B002B2FD10D98FBF7E4FC16 +:1076C000431E0893089B013361D1290028000A9AC0 +:1076D000FCF75EFF041E14D1069A2B00110038003F +:1076E000FEF7B4FF041E0CD101212800FBF760FC5B +:1076F000040006E031A908000A9AFBF7F1FF041E16 +:10770000D0D031A8FFF73AF913A8FBF71FFB002CE4 +:1077100000D137E1200051B0F0BDBB6D2EA807337A +:10772000DB0808930C26FBF70BFB579B569A08992E +:107730002EA8FCF735FE041E1ED10A992EA8FBF7D1 +:10774000D1FE00281EDA013E002E00D11EE20121EA +:107750002EA8FBF75AFF0028E7DD31AA11003800F8 +:107760002EABFEF773FF041E06D137AA11003800B6 +:107770002EABFEF76BFF04002EA8FBF7E7FA002CF8 +:107780009BD0BEE701212EA8FBF7D1FDD3E70899D6 +:107790000D98FBF727FCC6B23200069831A9FBF71B +:1077A000C5FB041EADD13200280037A9FBF7BEFB94 +:1077B000041EA6D116A8FBF7C3FA19A8FBF7C0FA56 +:1077C0001CA8FBF7BDFA1FA8FBF7BAFA22A8FBF723 +:1077D000B7FA25A8FBF7B4FA28A8FBF7B1FA2BA84B +:1077E000FBF7AEFA2EA8FBF7ABFA2B003800069A8F +:1077F00016A9FFF763F8041E00D08FE016AB1A003D +:10780000380019A9FEF722FF041E00D086E02B00E5 +:107810003800069A1CA9FFF760F8041E00D07DE02E +:107820001CAB1A0038001FA9FEF710FF041E00D081 +:1078300074E038001FAB19AA22A9FFF74EF8041E06 +:107840006CD1380037AB31AA25A9FFF737F8041EF1 +:1078500064D1380037AB31AA28A9FFF73EF8041EDF +:107860005CD1380016AB28AA2BA9FEF7EFFE041E48 +:1078700054D138001CAB25AA2EA9FEF7E7FE041E42 +:107880004CD12EAA2BA931A8FBF767FF041E45D1C6 +:10789000390031A8FEF794FE041E3FD131AB1A0027 +:1078A00019003800FEF7D2FE041E37D138002EAB87 +:1078B0002BAA37A9FFF711F8041E2FD137AB1A00F6 +:1078C00019003800FEF7C2FE041E27D137AB19009D +:1078D000380013AAFEF7BAFE041E1FD1380006991D +:1078E0001FAB19AAFEF7B2FE041E17D13A002900F9 +:1078F000380022AB1032FEF7A9FE041E0ED12B0079 +:10790000290038001FAAFEF7D9FF041E06D12B005C +:107910002900380022AAFEF799FE040016A8FBF7FA +:1079200015FA19A8FBF712FA1CA8FBF70FFA1FA803 +:10793000FBF70CFA22A8FBF709FA25A8FBF706FAD1 +:1079400028A8FBF703FA2BA8FBF700FA2EA8FBF7F1 +:10795000FDF9002C00D0D4E63200069831A9FBF7DF +:10796000E5FA041E00D0CCE63200280037A9FBF768 +:10797000DDFA089B0400013B0893002800D1A1E632 +:10798000BFE6834C3800FFF769F910900B9001288F +:1079900000D0BFE63900099834310C30FBF7A2FD66 +:1079A000002807D1390009982831FBF79BFD434295 +:1079B00043410793C0220023F86D520090425B417F +:1079C000079A511E8A41D218131D0893984201D874 +:1079D00002230893089B0138013B0E9301230E9A62 +:1079E000934030220C936B469B181B780A93089B9C +:1079F0001900C018EBF7BCFB079B0F90002B02D0BF +:107A00007D6F002D61D124210C98F2F739FD051E00 +:107A100000D1B9E000242426300060434019FFF76C +:107A200026F901340A9AE3B29A42F5D82800099956 +:107A3000FFF79CF9041E6ED10F9B0E9A09905343D9 +:107A40001193099B119A934251D131AE310000221A +:107A50002424109823004343EB1808C140000A9BDC +:107A6000C0B201328342F5D8380031A9FEF746FE94 +:107A7000041E50D10B9B0B9A099324235343EB18FC +:107A80001093099B1A00013A0992002B6CD10B9BB1 +:107A90005B00DBB20B930B9A0A9B9342EAD8242338 +:107AA0000E992A008B402432EB18934269D10C9B2B +:107AB00038005A1E31A9FEF721FE041E2BD1079B68 +:107AC000002B02D00C9B7D67BB67579B380004934B +:107AD000569B0D9A03930F9B06990293089B019363 +:107AE0000A9B00932B00FFF799FA040013E00F990B +:107AF0000998EBF7C3FB0122FF268240242316409E +:107B00005E43AE19002921D0320031003800FEF763 +:107B100050FF041E24D07B6FAB4210D0002D0ED03E +:107B200000262427380070432818FFF7DBF80136B9 +:107B30000A9AF3B29A42F5D82800F2F7A9FC002C71 +:107B400000D1E7E50698FFF7CDF8E3E5D1B24908A3 +:107B5000594330006918FFF709F9041ED4D0DAE759 +:107B6000099B013309936CE72421099B3800594391 +:107B7000109B6A185918FFF729F9041E00D180E7F5 +:107B8000C9E704C6243290E7024CC4E7024CB8E5CA +:107B900080B0FFFF80B2FFFF00B3FFFF1FB50024DE +:107BA0000294079C0194069C0094FFF73FFD04B0EB +:107BB00010BDF0B504000D0085B0012110001600C5 +:107BC0001F00FBF722FD002805D139002800FFF730 +:107BD000CDF805B0F0BD012130004942FBF715FD9D +:107BE000002812D139002800FFF7C0F80028F0D192 +:107BF0000C3501002800FBF708FD0028E9D02A0019 +:107C00002800211DFBF7CDFDE3E70A9B320002931C +:107C1000002329000193009320003B00FFF706FD9D +:107C2000D7E70000F0B58DB004000D0016001F006E +:107C3000FFF714F8012829D103A8FFF718F8149BBF +:107C40003200009320003B0003A9FFF7B2FF061E9D +:107C500016D1149B290000932000139B129AFFF762 +:107C6000A8FF061E0CD12B002900200003AAFFF755 +:107C7000ADF8061E04D129002000FEF7F6FC060030 +:107C800003A8FEF77BFE30000DB0F0BD004EFAE712 +:107C900080B1FFFFF0B587B00393C36D06000733D3 +:107CA0000D0002920193DF08FEF7D8FF02285CD195 +:107CB00039002800039B029AFCF772FB041E51D185 +:107CC0002800FBF7E1F90028F2D02800FBF7DCF9E7 +:107CD000F16D0138814239D2411A2800FBF727FBA8 +:107CE000041E3FD1002228001100FBF78BF9041E6F +:107CF00038D1020001212800FBF784F9002848D17F +:107D0000F36DFE2B27D000243000FEF7A7FF0128DB +:107D100028D1002305931F33009339002800039BCB +:107D2000029AFCF73DFB041E1CD107230199280091 +:107D30009943F36DC91AFBF7FAFA041E12D1009B9E +:107D4000013B0093002B12D1134C0BE001222800C1 +:107D5000FBF758F9C4E7220002212800FBF752F98B +:107D6000041ED0D0200007B0F0BD0C4CCCE7310091 +:107D7000280005AA4C31FBF7F8FB041EF2D10121C3 +:107D80002800FBF742FC0028C7DB059B012BC4D170 +:107D9000E8E70400E6E7C04600B3FFFF80B0FFFF5E +:107DA000F7B515000F001E002900099B089A040072 +:107DB000FFF770FF002809D1099B2A000193089B57 +:107DC0003100009320003B00FFF7E8FEFEBD37B511 +:107DD0000C000100069D009301951300283122003C +:107DE000FFF7DEFF3EBD73B50C000100200015005B +:107DF0001E0001F035F9002808D1220021002B00D7 +:107E0000200088327C310096FFF7E1FF76BD00004C +:107E1000F0B5037805000C00ADB0002B03D1294C60 +:107E200020002DB0F0BD0A789A42F8D10F008837B3 +:107E300039008830FBF756FB0028F0D126002800D7 +:107E4000943631009430FBF74DFB0028E7D1230036 +:107E50002800A0331900A0300393FBF743FB051E55 +:107E6000DDD104A8FEF703FF0DA8FEF70DFF2100EA +:107E70000DA8FEF791FF2300220028337C320195E4 +:107E8000009504A90DA8FFF789FE041E12D1390040 +:107E900004A8FBF727FB00280BD1310007A8FBF74C +:107EA00021FB002805D103990AA8FBF71BFB041E40 +:107EB00000D0044C04A8FEF761FD0DA8FEF718FFE2 +:107EC000AEE7C04680B0FFFF30B50B6804681B19F1 +:107ED00003600C68A3429B415C424368E318436023 +:107EE0004D685D1945604968A3429B418D42AD4193 +:107EF00010685B426D421B185B19136030BD03684C +:107F0000CB1803608B429B4111785B425B18137066 +:107F10007047036810B58B429B4114785B42E31AAB +:107F200013700368591A016010BD0000F0B546686F +:107F30000500A7B000200E2E57D93700012303AC4F +:107F40000E3F039367600E2F59D817AB01003C22F8 +:107F50001800A360E8F728FCAB68BA000093383338 +:107F6000190017A80193E8F703FC009AB6009619C8 +:107F70000022019B04C39E42FCD12200290028005C +:107F8000FBF7EBFB002830D106AE3300220083CA9A +:107F900083C309A817A93822B060E8F7E9FBE021FC +:107FA0003000FBF7C4F900281FD132002900280057 +:107FB000FBF7D3FB002818D10723844662689A4256 +:107FC00015D8320021002000FBF7C7FB00280CD198 +:107FD0000F23E02120006360FBF756F9002804D14D +:107FE000220029002800FBF7B8FB27B0F0BD542081 +:107FF00002AF3F186046990078500133DFE701482F +:10800000F3E7C04680B0FFFF70B54568040090B04C +:108010000020072D33D90123073D03930495092D33 +:1080200034D806AE0100282230000596E8F7BCFBE4 +:10803000A16830001C31AA00E8F79AFB1F2103A8B1 +:10804000FBF775F900281AD1049B02000193FF2168 +:10805000013320000493FAF7D5FF00280FD108233D +:1080600062689A420DD803A913220800FBF74AFC64 +:10807000002804D12100200003AAFBF7D8FA10B091 +:1080800070BDA568990048510133EAE70048F6E75A +:1080900080B0FFFF30B54368040099B00020102B7A +:1080A00022D90122103B0392122B1FD80493049B68 +:1080B000A16806A840319A0005900193E8F758FBA3 +:1080C000092103A8FBF733F900280DD1A2686168E4 +:1080D000136CDB05DB0D13641123994208D82100D2 +:1080E000200003AAFBF7A3FA19B030BD1223DDE785 +:1080F0009D0050510133F0E7130010B504005268A1 +:10810000084849421218986892001150220019003C +:108110002000FBF7E5FA002802D101235B4223602F +:1081200010BDC046FFFFFF3FF0B593B000216B4686 +:10813000D970012304003422029305A80C33039361 +:108140000490E8F731FB18212000FAF713FE051E12 +:1081500000D0B7E2A36801A81A68196B01926A46B9 +:108160000332FFF7CCFE6A46A3680332596D01A8BB +:10817000FFF7C5FE6A46A3680332196D01A8FFF731 +:10818000BEFE6A46A3680332D96D01A8FFF7C1FE9F +:10819000A368019A03211A605B6801936B465956E4 +:1081A000DD70002900DB90E24942DA1C01A8FFF7EC +:1081B000B0FE6A46A3680332596B01A8FFF79FFE21 +:1081C0006A46A3680332996D01A8FFF798FE6A46D4 +:1081D000A3680332D96D01A8FFF791FE6A46A36830 +:1081E0000332196B01A8FFF794FE6A46A3680332B5 +:1081F000196D01A8FFF78DFE019AA36803215A604B +:108200009B686A4601936B4659560023D370994286 +:1082100000DB60E24942033201A8FFF77AFE6A46BA +:10822000A3680332996B01A8FFF769FE6A46A36849 +:108230000332D96D01A8FFF762FE6A46A3680332D4 +:10824000596B01A8FFF765FE6A46A3680332596DB2 +:1082500001A8FFF75EFE019AA36803219A60DB681C +:108260006A4601936B4659560023D370994200DB4E +:1082700036E24942033201A8FFF74BFE6A46A36883 +:108280000332D96B01A8FFF73AFE6A46A3680332AE +:10829000196B01A8FFF733FE6A46A3680332196D14 +:1082A00001A8FFF72CFE6A46A3680332596D01A8A6 +:1082B000FFF725FE6A46A3680332996B01A8FFF712 +:1082C00028FE6A46A3680332996D01A8FFF721FED4 +:1082D0006A46A3680332D96D01A8FFF71AFE019A16 +:1082E000A3680321DA601B696A4601936B465956FD +:1082F0000023D370994200DBF7E14942033201A821 +:10830000FFF707FE6A46A3680332596D01A8FFF71D +:10831000F6FD6A46A3680332596D01A8FFF7EFFD29 +:108320006A46A3680332196C01A8FFF7E8FD6A46A4 +:10833000A3680332596B01A8FFF7E1FD6A46A36801 +:108340000332196B01A8FFF7DAFD6A46A36803320E +:10835000196D01A8FFF7D3FD6A46A3680332996D32 +:1083600001A8FFF7CCFD6A46A3680332D96B01A8C8 +:10837000FFF7CFFD6A46A3680332D96D01A8FFF766 +:10838000C8FD6A46A3680332D96D01A8FFF7C1FD95 +:10839000019AA36803211A615B696A4601936B46DF +:1083A00059560023D370994200DBA3E149420332BE +:1083B00001A8FFF7AEFD6A46A3680332996D01A8D4 +:1083C000FFF79DFD6A46A3680332996D01A8FFF788 +:1083D00096FD6A46A3680332596C01A8FFF78FFD2A +:1083E0006A46A3680332996B01A8FFF788FD6A46C5 +:1083F000A3680332596B01A8FFF781FD6A46A368A1 +:108400000332596D01A8FFF77AFD6A46A36803326B +:10841000D96D01A8FFF773FD6A46A3680332196C92 +:1084200001A8FFF776FD019AA36803215A619B69B1 +:108430006A4601936B4659560023D370994200DB7C +:108440005DE14942033201A8FFF763FD6A46A36874 +:108450000332D96D01A8FFF752FD6A46A3680332C3 +:10846000D96D01A8FFF74BFD6A46A3680332996CEA +:1084700001A8FFF744FD6A46A3680332D96B01A83F +:10848000FFF73DFD6A46A3680332996B01A8FFF729 +:1084900036FD6A46A3680332996D01A8FFF72FFDE8 +:1084A0006A46A3680332596C01A8FFF732FD019AAE +:1084B000A36803219A61DB696A4601936B465956AA +:1084C0000023D370994200DB1EE14942033201A828 +:1084D000FFF71FFD6A46A3680332D96C01A8FFF7B6 +:1084E0000EFD6A46A3680332196C01A8FFF707FD69 +:1084F0006A46A3680332D96B01A8FFF700FD6A46FC +:10850000A3680332D96D01A8FFF7F9FC6A46A36896 +:108510000332996C01A8FFF7FCFC019AA3680321C0 +:10852000DA611B6A6A4601936B4659560023D37081 +:10853000994200DBEDE04942033201A8FFF7E9FC74 +:108540006A46A3680332196D01A8FFF7D8FC6A4692 +:10855000A3680332596C01A8FFF7D1FC6A46A368EF +:108560000332196C01A8FFF7CAFC6A46A3680332FC +:10857000D96C01A8FFF7CDFC019AA36803211A6208 +:108580005B6A6A4601936B4659560023D370994241 +:1085900000DBC3E04942033201A8FFF7BAFC6A4698 +:1085A000A3680332596D01A8FFF7A9FC6A46A368C6 +:1085B0000332996C01A8FFF7A2FC6A46A368033254 +:1085C000596C01A8FFF79BFC6A46A3680332196D3A +:1085D00001A8FFF79EFC019AA36803215A629B6AD7 +:1085E0006A4601936B4659560023D370994200DBCB +:1085F00099E04942033201A8FFF78BFC6A46A36861 +:108600000332996D01A8FFF77AFC6A46A36803322A +:10861000D96C01A8FFF773FC6A46A3680332996C12 +:1086200001A8FFF76CFC6A46A3680332596D01A8E4 +:10863000FFF76FFC019AA36803219A62DB6A6A461E +:1086400001936B4659560023D370994200DB6FE0CB +:108650004942033201A8FFF75CFC6A46A368033273 +:10866000D96D01A8FFF74BFC6A46A3680332196D68 +:1086700001A8FFF744FC6A46A3680332D96C01A83D +:10868000FFF73DFC6A46A3680332996D01A8FFF726 +:1086900040FC019BA2680321D3626B4659560B1C18 +:1086A000002900DA00235BB213630023666801939C +:1086B0000C3301339E4240D8002903DA200002AA7D +:1086C000FFF71AFD280013B0F0BD6B4601A8DA1CB5 +:1086D000FFF715FC6DE5033201A8FFF710FC9EE5DE +:1086E000033201A8FFF70BFCC8E5033201A8FFF72E +:1086F00006FC07E6033201A8FFF701FC5BE6033244 +:1087000001A8FFF7FCFBA1E6033201A8FFF7F7FB86 +:10871000E0E6033201A8FFF7F2FB11E7033201A8FC +:10872000FFF7EDFB3BE7033201A8FFF7E8FB65E746 +:10873000033201A8FFF7E3FB8FE7019F9800175072 +:10874000B7E7F0B58FB000216B46D9700123040064 +:108750002422029305A8083303930490E8F724F831 +:1087600010212000FAF706FB051E00D01EE2A368C8 +:1087700001A81A68196A01926A460332FFF7BFFB23 +:108780006A46A3680332596A01A8FFF7B8FB6A4634 +:10879000A3680332D96A01A8FFF7BBFB6A46A36846 +:1087A0000332196B01A8FFF7B4FB6A46A3680332D2 +:1087B000596B01A8FFF7ADFB6A46A3680332996BBA +:1087C00001A8FFF7A6FBA368019A03211A605B6862 +:1087D00001936B465956DD70002900DBE9E14942FF +:1087E000DA1C01A8FFF795FB6A46A3680332596AB1 +:1087F00001A8FFF784FB6A46A3680332996A01A8BF +:10880000FFF77DFB6A46A3680332196B01A8FFF7E7 +:1088100080FB6A46A3680332596B01A8FFF779FB16 +:108820006A46A3680332996B01A8FFF772FB6A4698 +:10883000A3680332D96B01A8FFF76BFB019AA36809 +:1088400003215A609B686A4601936B465956002380 +:10885000D370994200DBB2E14942033201A8FFF72D +:1088600058FB6A46A3680332996A01A8FFF747FBE1 +:108870006A46A3680332D96A01A8FFF740FB6A463B +:10888000A3680332596B01A8FFF743FB6A46A3684C +:108890000332996B01A8FFF73CFB6A46A3680332D9 +:1088A000D96B01A8FFF735FB019AA36803219A60F1 +:1088B000DB686A4601936B4659560023D370994290 +:1088C00000DB81E14942033201A8FFF722FB6A463F +:1088D000A3680332D96A01A8FFF711FB6A46A368AF +:1088E0000332D96A01A8FFF70AFB6A46A36803327C +:1088F000196B01A8FFF703FB6A46A3680332196BE3 +:1089000001A8FFF7FCFA6A46A3680332596B01A875 +:10891000FFF7F5FA6A46A3680332D96B01A8FFF79F +:10892000F8FA6A46A3680332196A01A8FFF7F1FA58 +:108930006A46A3680332596A01A8FFF7EAFA019A66 +:10894000A3680321DA601B696A4601936B46595696 +:108950000023D370994200DB3BE14942033201A876 +:10896000FFF7D7FA6A46A3680332196B01A8FFF72D +:10897000C6FA6A46A3680332196B01A8FFF7BFFA6B +:108980006A46A3680332596B01A8FFF7B8FA6A4632 +:10899000A3680332596B01A8FFF7B1FA6A46A368CE +:1089A0000332996B01A8FFF7AAFA6A46A36803325B +:1089B000596A01A8FFF7ADFA6A46A3680332996ABB +:1089C00001A8FFF7A6FA019AA36803211A615B695F +:1089D0006A4601936B4659560023D370994200DBD7 +:1089E000FCE04942033201A8FFF793FA6A46A36804 +:1089F0000332596B01A8FFF782FA6A46A368033273 +:108A0000596B01A8FFF77BFA6A46A3680332996B9A +:108A100001A8FFF774FA6A46A3680332996B01A8AC +:108A2000FFF76DFA6A46A3680332D96B01A8FFF716 +:108A300066FA6A46A3680332996A01A8FFF769FAE1 +:108A40006A46A3680332D96A01A8FFF762FA019A5D +:108A5000A36803215A619B696A4601936B46595684 +:108A60000023D370994200DBBDE04942033201A8E4 +:108A7000FFF74FFA6A46A3680332996B01A8FFF724 +:108A80003EFA6A46A3680332996B01A8FFF737FAEA +:108A90006A46A3680332D96B01A8FFF730FA6A4629 +:108AA000A3680332D96B01A8FFF729FA6A46A368C5 +:108AB0000332996B01A8FFF722FA6A46A3680332D2 +:108AC000596B01A8FFF71BFA6A46A3680332196ABB +:108AD00001A8FFF71EFA6A46A3680332596A01A883 +:108AE000FFF717FA019AA36803219A61DB696A46C6 +:108AF00001936B4659560023D370994200DB77E00F +:108B00004942033201A8FFF704FA6A46A368033218 +:108B1000D96B01A8FFF7F3F96A46A3680332D96B52 +:108B200001A8FFF7ECF96A46A3680332D96B01A8E4 +:108B3000FFF7E5F96A46A3680332196A01A8FFF74F +:108B4000DEF96A46A3680332996A01A8FFF7E1F9E2 +:108B50006A46A3680332D96A01A8FFF7DAF96A46C0 +:108B6000A3680332196B01A8FFF7D3F96A46A3681B +:108B70000332596B01A8FFF7CCF9019BA2680321CE +:108B8000D3616B4659560B1C002900DA00235BB2F7 +:108B90001362002366680193083301339E422CD888 +:108BA000002903DA200002AAFFF7A6FA28000FB076 +:108BB000F0BD6B4601A8DA1CFFF7A1F914E60332F9 +:108BC00001A8FFF79CF94CE6033201A8FFF797F9DB +:108BD0007DE6033201A8FFF792F9C3E6033201A84C +:108BE000FFF78DF902E7033201A8FFF788F941E7A3 +:108BF000033201A8FFF783F987E7019F9800175018 +:108C0000CBE7F0B58FB000216B46D971012304008A +:108C10002022039306A8073304930590E7F7C4FDC9 +:108C20000E212000FAF7A6F8051E00D000E1A36887 +:108C300002A81A68D96902926A460732FFF769F9F1 +:108C40006A46A3680732D96A02A8FFF762F9A368E7 +:108C5000029A07211A605B6802936B465956DD71D0 +:108C6000002900DBE7E04942DA1D02A8FFF751F9CD +:108C70006A46A3680732196A02A8FFF74AF96A46EA +:108C8000A3680732196B02A8FFF743F9029AA36899 +:108C900007215A609B686A4602936B465956002327 +:108CA000D371994200DBCCE04942073202A8FFF7BA +:108CB00030F96A46A3680732596A02A8FFF729F912 +:108CC0006A46A3680732596B02A8FFF722F9029A95 +:108CD000A36807219A60DB686A4602936B4659567F +:108CE0000023D371994200DBB0E04942073202A869 +:108CF000FFF70FF96A46A3680732996A02A8FFF7DF +:108D000008F96A46A3680732D96902A8FFF7F7F89D +:108D10006A46A3680732D96A02A8FFF7F0F8029AF8 +:108D2000A3680721DA601B696A4602936B465956AD +:108D30000023D371994200DB8DE04942073202A83B +:108D4000FFF7E7F86A46A3680732D96A02A8FFF777 +:108D5000E0F86A46A3680732196A02A8FFF7CFF85D +:108D60006A46A3680732196B02A8FFF7C8F8029A8F +:108D7000A36807211A615B696A4602936B465956DC +:108D80000023D371994200DB6AE04942073202A80E +:108D9000FFF7BFF86A46A3680732196B02A8FFF70E +:108DA000B8F86A46A3680732596A02A8FFF7A7F81D +:108DB0006A46A3680732596B02A8FFF7A0F8029A27 +:108DC000A36807215A619B696A4602936B4659560C +:108DD0000023D371994248DA4942073202A8FFF7CB +:108DE00098F86A46A3680732596B02A8FFF791F812 +:108DF0006A46A3680732996A02A8FFF780F8029BC7 +:108E0000A268072193616B4659560B1C002900DAB2 +:108E100000235BB2D36100236668029307330133FA +:108E20009E4227D8002903DA200003AAFFF764F93D +:108E300028000FB0F0BD6B4602A8DA1DFFF75FF8FF +:108E400016E7073202A8FFF75AF832E7073202A8FE +:108E5000FFF755F84EE7073202A8FFF750F871E721 +:108E6000073202A8FFF74BF894E7073202A8FFF792 +:108E700046F8B6E7029F98001750D0E7F0B5436870 +:108E800097B00500140000200193934259D30123A9 +:108E9000022208930593019B0BAF0A910992079751 +:108EA0001B1B9C424FD306932C2200213800E7F76E +:108EB0007BFCAB68069E0293A3000393029BA10078 +:108EC000B20059183800E7F753FC2300002202369D +:108ED00006960199994238D105A9080008AAFAF71F +:108EE000A8FC00282DD12900280005AAFAF79FFB2D +:108EF000002826D16B6801931B1B9C422AD3069342 +:108F00002C2200210BA8E7F74FFC069F039BAE68BD +:108F1000BA00F1180BA8E7F72BFC099BDF190293A5 +:108F200000230697019AA24216D805A9080008AAAC +:108F3000FAF77FFC002804D12900280005AAFAF7D7 +:108F400076FB17B0F0BD0694AEE702989900425048 +:108F50000133BEE70694D3E7A200B3500134E1E742 +:108F600010B506220149FFF789FF10BD0CC00108AA +:108F700010B507220149FFF781FF10BD14C0010899 +:108F800010B508220149FFF779FF10BD1CC0010888 +:108F90000023F0B50C2185B005000393F9F7EAFE34 +:108FA000061E57D16B68AC689B00E3180193230041 +:108FB00018331900200003AA0093FEF785FFA96863 +:108FC0002000283103AAFEF77FFF039AA368270039 +:108FD000D318A36093429B41E2685B429A189A427D +:108FE0009B41A96808375B423800E260183103AA48 +:108FF0000393FEF769FFA9683800203103AAFEF742 +:1090000063FFA9683800283103AAFEF75DFF039AC1 +:109010002369A968D318236193429B4162695B422B +:109020009A189A429B4108375B42380062612031AE +:1090300003AA0393FEF748FFA96803AA3800283162 +:10904000FEF742FF039A009BA261320001990433AC +:10905000994202D8300005B0F0BD1A60F6E7000072 +:109060007FB50D000400FDF743FE681E25700C2837 +:1090700000D982E2EAF772F80D003700500068006C +:109080008000ED00070121013B019800B400D100F0 +:109090001A02BD4B012563660623BC4AA360E26049 +:1090A000BB4A23626262BB4A23656265BA4AE362D5 +:1090B000A363BA4B6560E561E564A56222636563FD +:1090C000E363B74B25646564A364201DF9F7DCFFF7 +:1090D000A06520004C30F9F7D7FF25660025E06534 +:1090E000280004B070BDAF4B012563660823A36060 +:1090F000AD4BAE4AE36007236262AD4A236262650C +:10910000AC4A2365E362A3636560AB4BE561E5644C +:10911000A56222636563D3E7A84B01256366082334 +:10912000A74AA360E260A74A23626262A64A236557 +:109130006265A64AE362A3636560A54BE561E564E9 +:10914000A56222636563BBE7A24B012563660C231E +:10915000A14AA360E260A14A23626262A04A236539 +:109160006265A04AE362A36365609F4BE561E564C5 +:10917000A56222636563A3E79C4B01256366112307 +:109180009B4AA360E2609B4A236262629A4A23651B +:1091900062659A4AE362A3636560994BE561E564A1 +:1091A000A562226365638BE7964B01256366062300 +:1091B000954AA360E260954A2365A261944AE362FE +:1091C0006262944AA3636265934A944B6560256129 +:1091D0006561E5612562E564A562226365636FE709 +:1091E0008F4A904BE260904A0125A2618F4A6366E4 +:1091F00062620822072322658D4AA36062658D4A58 +:10920000E362A36365608C4B25616561E56125625E +:10921000E564A5622263656352E7884B01256366B6 +:109220000823874AA360E260864A2365A261864AD2 +:10923000E3626262854AA3636265854A854B656025 +:1092400025616561E5612562E564A5622263656368 +:1092500036E708230125804AA360E2607F4A636104 +:10926000A2617F4A236262627E4A236562657E4A0A +:10927000E362A36365607D4B2561E561E564A562FA +:10928000226365631CE70C230125794AA360E26031 +:10929000784A6361A261784A23626262774A2365F1 +:1092A0006265774AE362A3636560764B2561E56199 +:1092B000E564A5622263656302E710230125724A13 +:1092C000A360E260714A6361A261714A23626262D3 +:1092D000704A23656265704AE362A36365606F4B01 +:1092E0002561E561E564A56222636563E8E6102116 +:1092F0006B4B6C4A63666018FAF710FB051E00D0D2 +:1093000037E1261D01213000F9F752FE051E00D07D +:109310002FE1FF213000F9F7B7FF051E00D028E14B +:10932000132231003000FAF772FA051E00D020E156 +:109330003000F9F7A9FE4836A065102130005A4ADE +:10934000FAF7ECFA051E00D013E10122FC213000EF +:10935000F9F758FE051E00D00BE120000921283046 +:10936000F9F726FE051E00D003E120000121403060 +:10937000F9F71EFE051E00D0FBE020003430F9F79F +:10938000E5FCFE23E365ABE6918F0110C0EA011016 +:1093900060EA0110A8EA011078EA011090EA0110D1 +:1093A00024C00108038C0110C4EB011054EB011020 +:1093B000A8EB011070EB01108CEB0110438701103A +:1093C000ECEC01106CEC0110CCEC01108CEC0110F9 +:1093D000ACEC011029810110CCED01100CED011055 +:1093E0009CED01103CED01106CED01109580011019 +:1093F0000CEF0110FCED0110C8EE011040EE011061 +:1094000084EE0110618F011048EA0110F8E90110A3 +:10941000FCE9011030EA011000EA011018EA01101D +:1094200038EB0110718F0110D8EA0110DCEA01104D +:1094300018EB0110E0EA0110FCEA0110818F011025 +:109440004CEC0110E4EB0110E8EB01102CEC0110E6 +:10945000ECEB01100CEC011038E7011098E601105C +:10946000B8E6011018E70110D8E60110F8E601107F +:1094700048E8011058E7011088E7011018E80110CA +:10948000B8E70110E8E70110B8E9011078E8011029 +:10949000B8E8011078E90110F8E8011038E9011086 +:1094A0000980011030E6011037E60110354B01A8A4 +:1094B0006366F9F745FC1021334A6018FAF72EFA73 +:1094C000051E50D1261D01213000F9F771FD051E42 +:1094D00049D1E0213000F9F7D7FE051E43D1012222 +:1094E00031003000FAF793F9051E3CD1E02130003D +:1094F000F9F7CAFE051E36D1012231003000FAF715 +:1095000086F9051E2FD13000F9F7BEFDA0652000B9 +:1095100005212830F9F74CFD051E24D1200001213A +:109520004030F9F745FD051E1DD120003430F9F714 +:109530000DFCDF214836012230004900F9F762FDB9 +:10954000051E10D11021114A01A8FAF7E7F9051EEE +:1095500009D13100300001AAFAF723F9051E02D122 +:10956000C023FF33E36501A8F9F7F0FB002D00D11C +:10957000B6E52000FDF7BCFBB2E50023044D2370E7 +:10958000AEE5C0462D7F011058E601105DE60110E2 +:1095900080B1FFFFF0B595B006000F001D000192ED +:1095A000402B0AD900232900019804AAF9F72DF9C4 +:1095B000041E1FD1402504AB019302AB1F7137007D +:1095C00031685D71083700290FD00123022238006D +:1095D000336003A9F8F79CFF041E0BD12A00380062 +:1095E0000199F8F795FF040004E03800F8F7AAF9AC +:1095F000041EEAD004A84021F0F75CFF200015B05B +:10960000F0BD0023F0B504003C2506001F00A5B006 +:10961000E43401936D423300E0331B689F420BDB5F +:10962000019B002B01D13D256D4204A88021F0F75C +:1096300041FF280025B0F0BD2369012B00D1019323 +:109640000023256803938022606803AB04A9A84720 +:10965000051EEAD1039B002B0AD03000F9B204AA00 +:10966000FFF798FF0028E5D1A368039A9B18A36031 +:1096700001371434CFE7000070B505000026C8227A +:109680000400E035310052002E60E430E7F78CF83A +:10969000200026600830F8F742F92B68132B0FDC06 +:1096A00014205843241822000649E4321160566001 +:1096B00021000122F031F4349B180A6022602B60F3 +:1096C00070BDC046DB97011070B504000830F8F794 +:1096D0002CF9230000252000C821E0331D60E43070 +:1096E0004900F0F7E7FE256070BDF0B595B00500C4 +:1096F00003910292402A00D96CE081267600013E57 +:10970000002E62D02F00E0373B68002B60D028008D +:10971000FFF777FF041E3FD13B6802009C462B00F9 +:109720000121EC33019384453DDC0029E7D03F2A39 +:10973000E5D92F004022002104A80837E7F734F8C4 +:10974000380004A9F8F732FF041E25D13800F8F7D5 +:10975000ECF83800F8F7E3F821003800F8F7F2F8F1 +:10976000041E19D14022380004A9F8F7D1FE041EC6 +:1097700012D104AA030040211000F9F746F8041E94 +:109780000AD103001421E0352A689A4217DC029AB4 +:10979000039804A9E6F7ECFF402104A8F0F78AFE3D +:1097A000200015B0F0BD1C685F68BC4200D20021EB +:1097B0009F68012F00D1121901301433B3E70D0057 +:1097C0005D43019E01337051DFE73C246442E3E7CF +:1097D0004024FBE73C246442E2E7511E8A4100201A +:1097E0001A607047F0B50F2589B00290C87B029BC4 +:1097F0002840C00018180300C8331C6803915B6838 +:10980000816CC06C0195019E039D0707AD5D0F261D +:109810002E402D0905950F2504960D40334EED0081 +:1098200075590E092D0406953E43250707093D434A +:1098300007951F0725093D43AC46019D1F090F2DC4 +:1098400011D0049B0699D800029B079D18180300AD +:10985000C8331C685B684B4061464C40816CC06CEF +:109860007B407140684005070E092E43000925071B +:109870002843059DB446029EED0075192E001F0772 +:10988000C83624093C43376876681B0973400F26A5 +:109890003140164EC9007158AE6C09044B40614608 +:1098A000ED6C7C406840019D71406E1E0196AAD20D +:1098B0001D0E15701D0C5570D3701D0A230E1371EB +:1098C000230C5371230A9371030E1372030C53720A +:1098D000030A93720B0E13730B0C53730B0A9570E0 +:1098E000D471D0729373D17309B0F0BD50EF0110F1 +:1098F000C82210B500215200E6F756FF10BDF0B5A2 +:1099000093B0039017000800012219001D00FBF717 +:10991000B1FB041E00D1A3E04669102E00D09FE0E9 +:109920000398FBF7C3FB21000398FBF7E9FD002830 +:1099300000D093E001232A0039000398FBF7CEFB07 +:10994000002800D08AE0010032000D900EA8E6F752 +:109950002BFF0DAB00930EAB320019000398FBF701 +:109960000BFC00287AD11199039C0EBA10990F9B19 +:10997000883409BA266061601ABA039C0E9BF834D9 +:109980001BBA0025226163610024039FC8373C6035 +:109990007D60039FBC64FD6404340325A446012755 +:1099A000E124374024066743CC0704944908059115 +:1099B000049976080E430599D40721435208DC0721 +:1099C000224364465B087B40039FE4003C19A66485 +:1099D000E164C8340CC46446013D6410A446002D03 +:1099E000DDD103230493013B05933B0048330693E9 +:1099F00080330793059BDB009C46069B634419005C +:109A0000079B63441D001B6808936B6809930B68F0 +:109A10000A934B680B930823039A089ED2181700E9 +:109A2000C8373C687440EE1834607C68099E0A9F11 +:109A30007440EE187460946CCE187C403460D26C24 +:109A40000B9C0833624072606345E5D1059B5B0067 +:109A50000593049B013B0493002BCBD113B0F0BDC5 +:109A600014204042FAE7F0B500278DB004000E0044 +:109A7000039202930797BB4200D19FE0050069352E +:109A8000FF35102239002800E6F78EFE23007933D7 +:109A9000FF333900180010220493E6F785FEC42333 +:109AA0005B00E650230000200021F833186559655B +:109AB0009865D965029B0C2B1FD11A0028000399C9 +:109AC000E6F756FE78230122FF33E25407AB0093FA +:109AD00023005933290010222000FF33FBF74CFBF1 +:109AE000051E07D12300139AF8339A65D865139B96 +:109AF000002B46D128000DB0F0BD08AE0C22390075 +:109B00003000E6F751FE029BDB001A0E32731A0C8E +:109B100072731A0AB273F373029F102F00D91027C1 +:109B20002600039B6936FA18FF3605923200117839 +:109B300008001978013348400599107001328B42B2 +:109B4000F5D12A0029002000FFF74CFE029BDB1B09 +:109B50000293039BDB190393029B002BDCD12100B2 +:109B6000793108ABFF3132781878013342403270D6 +:109B700001368E42F7D12A0029002000FFF732FE7D +:109B8000A4E7139E102E00D910262200129B7932D2 +:109B9000FF32981911781F78013379401170013222 +:109BA0009842F7D1049A20001100FFF71BFE139B87 +:109BB0009B1B1393129B9B19129398E714256D42DC +:109BC00098E7F0B58DB0049300230793049B04003D +:109BD0000D001600934203D99B1A8B4200D26AE013 +:109BE00027002A000023F837386D796D12184B4191 +:109BF000994260D801D190425DD80F2B5BD802D139 +:109C00001100203157D83A657B65002D02D128001C +:109C10000DB0F0BD0395102D01D910230393220040 +:109C2000210078327431FF32FF3113780133DBB217 +:109C30001370002B02D1013A9142F6D1210007ABFB +:109C400008AF6931009310223B002000FF31FBF781 +:109C500093FA0028DCD123007933FF33C422520069 +:109C6000A2580592002A03D11A78315C4A401A7032 +:109C7000315CC25D4A4004990A54C42149006158CC +:109C80000591012902D119784A401A70039A0130CE +:109C900001338242E2D121007931FF310A002000F4 +:109CA000FFF7A0FD039A039B9446ED1AF618049B58 +:109CB00063440493A9E714204042A9E70300F0B5E8 +:109CC000F83389B001921A6D0F00510FD200029241 +:109CD0009A6DDD6D0600586DD3000393019BC4009F +:109CE0000C43ED00510F043B0D430C2B44D83100C5 +:109CF0005931019AFF313800E6F73AFD2200029B04 +:109D000003992A430B43134302D1002009B0F0BD4D +:109D100004AA2B0E13702B0C53702B0A9370039B09 +:109D2000D5701BBA0593230E1372230C5372D47291 +:109D3000230A340030007934FF3493722200029BEE +:109D400089301BBA0793FF3004AB11781D780133BB +:109D50006940117001328242F7D1220021003000A7 +:109D6000FFF740FD0023FA5CE15C4A40FA54019A97 +:109D700001339A42F7D1C8E714204042C6E737B50D +:109D800015001A00089B04000193079B0093069B93 +:109D9000FFF769FE00280CD1290020000A9B099AD0 +:109DA000FFF70FFF002804D120000B9A0C99FFF752 +:109DB00085FF3EBD70B50C008CB01599139D0491C4 +:109DC000149908AE03911199009302911099130010 +:109DD00001912200002106960595FFF7D0FF031E92 +:109DE00007D00CB070BD129AF15CD25C01334A40CE +:109DF0001043AB42F7D10028F3D015982100F0F7BB +:109E000059FB12204042ECE710B5041E06D0FBF7C8 +:109E10004DF9C82120004900F0F74CFB10BD10B5EA +:109E200064220021E6F7C0FC10BDF0B5050097B034 +:109E300000680291039200F013FB01230193029B3F +:109E40000600002B04D0039B5A1E9341013301935B +:109E5000002205AB1A70280000F0EAFA041E18D19F +:109E60002F000C3732003900280000F09FFA041E42 +:109E70000FD10122280005A900F098FA041E08D18C +:109E8000019B022B0CD0280006A900F09FFA041EAB +:109E90000ED006A84021F0F70DFB200017B0F0BD52 +:109EA0002800039A029900F081FA041EEBD0F0E733 +:109EB0003200280006A900F01FFA041EE9D1320082 +:109EC0003900280000F072FA041EE2D1390028009F +:109ED00000F07CFA041EDCD105AA13780133DBB252 +:109EE0001370019A9342B6D3D3E7F0B5E3B0019370 +:109EF0001600056D019A04000F002B00002A02D005 +:109F000003236B435B088022520096423BD89B1987 +:109F10008032934237D8002102A8E6F745FC2A0098 +:109F2000206EE36D02A99847002802D009267642E8 +:109F300026E0019B256D002B0AD002ABE918206EAC +:109F4000E36D6A0898470028F0D1236D5B08ED188F +:109F5000002F08D0002E06D002ABE81832003900DE +:109F6000E6F706FCAD192A00200002A9FFF75DFF05 +:109F7000061E01D10123E364290002A8F0F79AFA32 +:109F8000300063B0F0BD0526D1E7F7B5019201229C +:109F900004000D001E0000F0DDF8002818D1270095 +:109FA000280000F05DFA0C3702003900200000F0B4 +:109FB000A3F900280CD1280000F052FA0121020078 +:109FC0003800E6F7F1FB320020000199FFF72DFF82 +:109FD000FEBD10B50023FFF788FF10BDF0B50400EB +:109FE00085B000681D001600029100F039FA802348 +:109FF0000390DB009E4257D880230A9A5B009A4266 +:10A0000055D8E36D002B1CD0636D012B03D0E36C9E +:10A01000A26D934215DD290020000A9AFFF7D9FFAF +:10A0200000281AD100230A93002E18D129002000FD +:10A030000A9AFFF7FAFE00280FD1E36C0133E364BC +:10A040000BE0002DF0D00A9B002BEBD01A0029006A +:10A050002000FFF7EAFE0028E6D005B0F0BD039B24 +:10A0600001969E4200D90193200000F0E1F90028FA +:10A07000F3D127000C3739002000039A00F096F93D +:10A080000028EAD13900200000F0A0F90028E4D12E +:10A09000019A39000298E6F76BFB019A029B9446FD +:10A0A00063440293B61ABFE703204042D5E7052078 +:10A0B000FBE7002307B50093FFF790FF0EBD10B537 +:10A0C000041E05D000F018F864212000F0F7F2F922 +:10A0D00010BD0000031FDBB20020042B02D8024A8F +:10A0E0009B0098587047C046D4EF011010B50C2261 +:10A0F0000021E6F759FB10BD10B5041E1DD0036802 +:10A10000002B1AD04068002808D01B79062B15D8E0 +:10A11000042B1CD818D06068F0F7BAF9A0680028A2 +:10A1200007D0236899794900F0F7C4F9A068F0F7DF +:10A13000AFF90C212000F0F7BDF910BD073B012B52 +:10A14000E9D8F7F7F2FBE6E7F5F738FCE3E7F6F7CF +:10A1500018FEE0E770B504000D001600002907D0D6 +:10A16000002805D00B79062B04D8042B27D80ED055 +:10A17000194814E0073B012BFAD8D8210120F0F749 +:10A180007FF96060002809D0F7F7C9FB0AE05C217D +:10A190000120F0F775F96060002801D10F4870BD0B +:10A1A000F5F706FC002E14D00220A979F0F768F923 +:10A1B000A06000280DD12000FFF79EFFEEE76C2184 +:10A1C0000120F0F75DF960600028E7D0F6F7D3FDD5 +:10A1D000E8E700202560E2E700AFFFFF80AEFFFF69 +:10A1E000030010B500281DD00268002A1AD010798B +:10A1F0000438042816D8E8F79DFF03070C0E130057 +:10A200005868F5F7E7FB10BD01215868F6F7C6FD61 +:10A21000F9E70021F9E701215868F7F793FBF2E726 +:10A220000021F9E70048EEE700AFFFFF10B5002876 +:10A2300008D00368002B05D01B79062B04D8042B0B +:10A240000DD808D0084809E0073B012BFAD8406830 +:10A25000F8F75EF902E04068F6F7C2FC10BD40680E +:10A26000F7F76AFAFAE7C04600AFFFFF10B500281B +:10A2700008D00368002B05D01B79062B04D8042BCB +:10A280000DD808D0084809E0073B012BFAD84068F0 +:10A29000F8F78CF902E04068F6F7E3FC10BD40687F +:10A2A000F7F78BFAFAE7C04600AFFFFF10B50C00D6 +:10A2B00011001A0000281AD000790438042816D892 +:10A2C000E8F738FF03070C0E13002000F6F734FD03 +:10A2D00010BD01232000F7F701FBF9E70023F9E7A0 +:10A2E00001232000F8F791FAF2E70023F9E701488B +:10A2F000EEE7C04600AFFFFFF0B593B005000E00DB +:10A30000019200284DD00368002B4AD08268002AB1 +:10A3100047D09B79019A934214D2FFF761FF041E44 +:10A320002ED131002800019AFFF780FF041E27D1AB +:10A33000280002A9FFF79AFF041E21D12B6802AE64 +:10A340005B7901932B68AF689A7936213800BC1885 +:10A35000E6F72AFA2B685C219A792000E6F724FABE +:10A360000023019A9A4212D12800FFF739FF041EF8 +:10A3700006D12B68390028009A79FFF757FF0400AF +:10A38000402102A8F0F796F8200013B0F0BDF15C70 +:10A39000FA5C4A40FA54E25CF15C4A40E254013310 +:10A3A000DFE7014CF0E7C04600AFFFFF10B5002823 +:10A3B00008D00368002B05D08368002B02D0FFF77C +:10A3C00035FF10BD0048FCE700AFFFFFF0B504000B +:10A3D0000E0091B0002826D00368002B23D085689A +:10A3E000002D20D069469F79FFF740FF002818D143 +:10A3F0002000FFF7F5FE002813D1236820009A798A +:10A40000E919FFF713FF00280BD1236869462000E4 +:10A410005A79FFF70BFF002803D131002000FFF726 +:10A4200025FF11B0F0BD0148FBE7C04600AFFFFFBC +:10A4300070B5041E10D00368002B0DD08568002D68 +:10A440000AD0FFF7CDFE002805D12368290020009F +:10A450009A79FFF7EBFE70BD0048FCE700AFFFFF05 +:10A46000002800D040797047002800D0007970475C +:10A4700070B505000E000C4C00280CD12E20404277 +:10A480000DE062686B689A4204D1A968E6F762F948 +:10A49000002805D0143420680028F2D12E3870BD71 +:10A4A000237C3370FBE7C046F4FB011070B5050058 +:10A4B0000E000C4C00280CD12E2040420DE06268AA +:10A4C0006B689A4204D1A968E6F744F9002805D0E0 +:10A4D000143420680028F2D12E3870BD237C3370EC +:10A4E000FBE7C04614FA011030B5084B1C68002C7D +:10A4F00002D12E20404206E01D7C854204D100207E +:10A500005B680C60136030BD1433EFE714FA011080 +:10A5100070B505000E000C4C00280CD12E204042D6 +:10A520000DE062686B689A4204D1A968E6F712F9F7 +:10A53000002805D0143420680028F2D12E3870BDD0 +:10A54000237C3370FBE7C046D8F9011030B5084BC7 +:10A550001C68002C02D12E20404206E01D7C854262 +:10A5600004D100205B680C60136030BD1433EFE74A +:10A5700004FB011070B505000E000C4C00280CD136 +:10A580002E2040420DE062686B689A4204D1A968AF +:10A59000E6F7E0F8002805D0143420680028F2D14E +:10A5A0002E3870BD237C3370FBE7C0467CFB011066 +:10A5B000F8B505000F0016000C4C00280CD12E2019 +:10A5C00040420DE062686B689A4204D1A968E6F7E0 +:10A5D000C1F8002805D0143420680028F2D12E38A4 +:10A5E000F8BD237C3B70637C3370F9E744FC0110B9 +:10A5F000002303604360704710B5041E09D0036850 +:10A60000002B02D09B6A4068984708212000EFF792 +:10A6100051FF10BD0138C3B20020032B02D8024AFB +:10A620009B0098587047C04680FC011070B505002B +:10A630000E1E0AD00468002C07D14B6A9847686048 +:10A64000002804D020002E6070BD0248FCE70248BC +:10A65000FAE7C04680C1FFFF80C0FFFF002803D09B +:10A660000368181E00D0187870470300012802D034 +:10A67000063B584258417047064A01234A6002008F +:10A680000B700B73044B083214308A600B61486105 +:10A690007047C04690FC011096FC01100238C3B20E +:10A6A000022200209A4240417047806D70470000AE +:10A6B00002230B70024B88304B6088607047C046A5 +:10A6C0009CFC01100238C3B2012200209A42404192 +:10A6D0007047043843425841704710B50400F4F7FE +:10A6E0006BFD2000EFF7D4FE10BD10B5AC210120AA +:10A6F000EFF7C6FE041E03D000221100F3F7E0FCC2 +:10A70000200010BD10B5F3F74BFD10BD10B5F3F7E9 +:10A71000EBFCC00010BD0000F0B585B01F000400C8 +:10A720000E001500F3F7E0FC0A9B18600B9B9842A3 +:10A730000AD8002320000D9A0C99029701960095E3 +:10A74000F4F748F805B0F0BD0048FBE700BCFFFF98 +:10A75000F0B585B0170004000D001E00F3F7C4FC2F +:10A76000B8420DD10B9B200003930A9B0D9A0093D6 +:10A770000C99012302960195F4F718FA05B0F0BD83 +:10A780000048FBE780BFFFFFF0B585B00D00170064 +:10A790001E000400F3F7A8FC0B9B0D9A18600A9B9F +:10A7A000200003930C990123029701960095F4F77A +:10A7B00059FB05B0F0BD0000F0B587B0059305006A +:10A7C0000F001600F3F790FC0D9B0400984213D87D +:10A7D0000C9B28000393059B02960193002300978E +:10A7E0001A001900F4F7C6FC002803D10D9B9C4207 +:10A7F00000D2024807B0F0BD0148FBE700C7FFFFE9 +:10A8000080BCFFFF10B50400FCF7A2FA2000EFF7B0 +:10A810003FFE10BD10B5AC210120EFF731FE041E44 +:10A8200001D0FCF752FA200010BD10B5FDF7F0FA88 +:10A8300010BD10B5AC210120EFF722FE041E01D09F +:10A84000FBF776FE200010BD10B50400FBF774FE88 +:10A850002000EFF71DFE10BD1FB5099C0394089C56 +:10A860000294079C0194069C0094FBF7F8FD04B049 +:10A8700010BDF0B50400B1B005A80D0016001F0012 +:10A88000FBF756FE210005A8FBF75CFE041E0ED167 +:10A89000399B32000393389B29000293379B05A80C +:10A8A0000193369B00933B00FBF7D9FD040005A8FC +:10A8B000FBF742FE200031B0F0BD000007B51100EB +:10A8C0001A00059B0093049BFBF72AFE024B98425B +:10A8D00000D102480EBDC04600B4FFFF00C7FFFF15 +:10A8E000F0B50400AFB003A80D0016001F00FBF781 +:10A8F0001FFE210003A8FBF725FE041E0AD1359B8D +:10A9000032000193349B2900009303A83B00FFF71A +:10A91000D5FF040003A8FBF70FFE20002FB0F0BD09 +:10A9200070B58AB01600302309AA04000D0002F0A9 +:10A9300041F9002803D02B4BC0180AB070BD236822 +:10A94000099A9B189D424AD102232900200009AA96 +:10A9500002F030F9031E02D0224A8018EDE706907B +:10A96000059004900390029001900090099A3000A5 +:10A970002168F3F7DBF9002801D01A48DDE72368E6 +:10A98000099A29009B1823602000022309AA02F0DB +:10A9900011F9011E02D0134BC018CEE7099B02002B +:10A9A000069323680490059303900300029001909E +:10A9B00000903000F3F7BAF90028DED12368099A35 +:10A9C00030009B182360F3F7F7F90028D5D1300049 +:10A9D000F3F78CFB0028D0D12368AB42ADD00248FE +:10A9E000ABE7C04600C5FFFF9AC4FFFFF0B50368A0 +:10A9F00004000E00C3B0062B10D103A9FFF756FDCB +:10AA0000002800D05DE1337803AA1178002B00D034 +:10AA100052E13000FEF724FB04003AE004A8FCF702 +:10AA200033F9A56863680295ED18290023AA02A8E6 +:10AA300002F007F9002822D0A34BC418002C23D120 +:10AA400023A8FCF721F9FCF7E3F805002B78002B8D +:10AA500000D122E123A8FCF74BF9297823A8FEF7BF +:10AA6000FFFA041E00D019E11A9B0093399B019351 +:10AA7000019A009B934200D1D3E00135E6E7239B86 +:10AA8000013B022B08D9904C04A8FCF731F9002CAB +:10AA9000B9D0200043B0F0BD3023290003AA02A89A +:10AAA00002F088F8041EEFD1029B039A02A89F18B7 +:10AAB0003900062303AA02F07DF8041EE4D1039AAC +:10AAC000072A00D0ABE0029C80492000E5F742FE57 +:10AAD000002800D0A3E00734390005AA02A8029498 +:10AAE00002F0B5F80028A7D105A8F8F7CDFA029B27 +:10AAF0001A909F4200D090E03023290003AA02A8B8 +:10AB000002F058F8041EBFD1029B039A02A89F18B6 +:10AB10003900042303AA02F04DF8002800D08BE787 +:10AB2000039A029908A8F8F707FB002800D083E7EA +:10AB3000029B039A39009B18029303AA042302A8DC +:10AB400002F038F8002800D076E7039A02990BA8A3 +:10AB5000F8F7F2FA002800D06EE7029B039A39005A +:10AB60009B18029303AA032302A802F023F80028EB +:10AB700003D1029B039A9B180293029B9F424CD1E4 +:10AB80000423290003AA02A802F014F8002800D028 +:10AB900052E7039B029A0EA904A8FCF705FC0028C3 +:10ABA0002AD04B4B984200D06DE7029B1B78023BAA +:10ABB000012B00D967E705A8F8F782FA0399431C2F +:10ABC00002008B4200D05EE7029B0EA8591CF8F7EA +:10ABD000B3FA002800D056E7029B11A81978023971 +:10ABE000F8F7E6F9002800D04DE7012114A8F8F79E +:10ABF000DFF9002800D046E7029B039A29009B1842 +:10AC000002A817AA029302F022F8002800D013E746 +:10AC100017A8F8F739FA1B9012E72E4C34E72E4CA0 +:10AC200032E73A9A1B9B0092934200D025E724A971 +:10AC300005A8F8F757FC002800D01EE727A908A8A8 +:10AC4000F8F750FC002800D017E72AA90BA8F8F75E +:10AC500049FC002800D010E736A917A8F8F742FCF5 +:10AC6000002800D009E72DA90EA8F8F73BFC002822 +:10AC700000D002E733A914A8F8F734FC002800D06C +:10AC8000FBE6002111A8F8F7ADF90021040030A877 +:10AC9000F8F7A8F9844200D0EFE6002423A8FCF7D7 +:10ACA00027F82B7803AA1370002C00D0ECE6002BB9 +:10ACB00000D0E9E6064CE7E68B4200D1A9E6024C5B +:10ACC000E7E6064CE5E6C04600C3FFFF7CFD011049 +:10ACD00080B1FFFF9AC2FFFF80C6FFFF00C6FFFFE3 +:10ACE00070B50C0016008EB005000BA8F8F728F818 +:10ACF0003023A11909AA0AA80A9401F05BFF0028D1 +:10AD000004D06B4BC41820000EB070BD099A0A9B8A +:10AD10000AA89E18310008AA01F093FF0028F0D17C +:10AD2000089B002B00D0C0E03100023309AA0AA81A +:10AD300001F040FF041E00D0A6E00300069005903D +:10AD400004900390029001900090099A28000A99BB +:10AD5000F2F7ECFF041E00D096E00A9B099A31003E +:10AD60009B180A9309AA02230AA801F023FF041ED4 +:10AD700000D089E0099B020006930A9B010005931D +:10AD80000490030003900290019000902800F2F7D5 +:10AD9000CDFF041E00D077E00A9B099A31009B1872 +:10ADA0000A9309AA02230AA801F004FF041E6BD12A +:10ADB000099B020004930A9B0100069005900393EF +:10ADC00002900300019000902800F2F7AFFF041EEC +:10ADD0005AD10A9B099A31009B180A9309AA0223A7 +:10ADE0000AA801F0E7FE041E4ED10021099B0A00CB +:10ADF000009328000A9B069105910491039102910A +:10AE00000191F2F793FF041E3ED10A9B099A31008B +:10AE10009B180A9309AA02230AA801F0CBFE041E7C +:10AE200032D1099B020002930A9B01000690059013 +:10AE3000049003900193009003002800F2F776FF3E +:10AE4000041E21D10A9B099A28009B180A93F2F745 +:10AE5000B3FF041E18D131000BAA0AA801F0F7FEB7 +:10AE6000041E11D131000BAA0AA801F0F0FE041E45 +:10AE70000AD131000BAA0AA801F0E9FE041E03D191 +:10AE80000A9BB34200D00B4C0BA8F7F75FFF002CD6 +:10AE900000D138E7084B1C4205D1054BE4182800C7 +:10AEA000F4F78AF92FE7024CF9E7044C2BE7C04688 +:10AEB00000C3FFFF9AC2FFFF80FF000080C2FFFFB8 +:10AEC000F0B506000F001C0085B000211800150029 +:10AED0000C22E5F769FC23003900300001AA01F0DB +:10AEE000E0FE002803D00C4BC01805B0F0BD2900CF +:10AEF00001A8FFF7BDFA00280CD12B78012BF4D163 +:10AF00002368052B01D0002B02D16368002BECD005 +:10AF10000148EAE70148E8E780C5FFFF80C3FFFF7B +:10AF2000F0B58BB0050006913023891806A805AA54 +:10AF300001F040FE002804D05A4BC41820000BB08A +:10AF4000F0BD059A069B06A89F18390004AA01F0D7 +:10AF500078FE0028F0D1049B012B00D09EE0390040 +:10AF6000033305AA06A801F025FE0028E4D12E002F +:10AF70007C363000059A0699F8F7DEF8041E05D0F5 +:10AF80002800FBF7E5FE474BE418D7E7069B059A38 +:10AF90009B180693BB426BD0A023390005AA06A8D4 +:10AFA00001F008FE041E2DD1069B059A9C18002A6C +:10AFB00024DD1B780793062B01D0302B20D12100F4 +:10AFC00008AA06A801F0F6FD00280DD0354BC418DC +:10AFD000002C05D1290007A8FFF708FD041E14D096 +:10AFE0002800FBF7B5FEA9E7069B089A09939B1872 +:10AFF000039206939C42EDD02B4CF1E72B4CEFE7EC +:10B000002B4CEDE703006233BAD1069BBB422FD035 +:10B01000A123390005AA06A801F0CCFD041E24D105 +:10B02000059A069B06A89F18390005AA01F022FE82 +:10B03000002800D080E7069A059BD3189F422FD1A5 +:10B040002C00883421002800BB1AFCF7ADF9002839 +:10B0500003D121002800FCF713FA0697002815D029 +:10B06000144B984204D00F4C68E70300623387D139 +:10B0700000232900019300932B003200280028337D +:10B080008831FCF78BFD041E00D079E731002800E1 +:10B09000FCF790FA041E00D150E7A1E7064C4DE7FB +:10B0A000014C4BE700C3FFFF9AC2FFFFA0C2FFFFA6 +:10B0B0009EC2FFFF80B1FFFF80C2FFFFF0B589B0E5 +:10B0C0006B46DE1D00230500049133708918303370 +:10B0D00003AA04A801F06EFD002804D0284BC41870 +:10B0E000200009B0F0BD039A049B04A89F18390002 +:10B0F00002AA01F0A6FD0028F0D1029B002B3BD153 +:10B100003200390005AB04A8FFF7DAFE0028E5D1CC +:10B110000423390003AA04A801F04CFD0028DDD166 +:10B12000039B002B2AD03078FFF774FA011E01D15F +:10B13000144CD5E72800FFF779FA041ED0D13378F4 +:10B14000012B0AD1039A04996868FFF7C9FD041E10 +:10B15000C6D02800FFF750FAC2E7023B012BE7D820 +:10B16000696805A8FFF742FC041EF2D1039A04990E +:10B170006868FFF7D5FEEAE7034CB1E7034CAFE799 +:10B1800000C3FFFF80C3FFFF80C2FFFFA0C2FFFF1D +:10B19000F0B593B01D00189B0B9107908918002BF8 +:10B1A00000D172E030230AAA0BA801F003FD0028A9 +:10B1B00003D0384BC01813B0F0BD0B9B0A9A0BA8F4 +:10B1C0009C1821000FAB0CAA01F06BFD0028F0D1F8 +:10B1D000042321000AAA0BA801F0ECFC0028E8D106 +:10B1E0001E261F2702ABF618FF18390032000CA8E4 +:10B1F0000B9CFFF7DDF9011E13D10A983B783278DA +:10B2000003900B98049402901898009501900FA851 +:10B2100002F07CF800281CD01F4B9842CBD11F486D +:10B22000C9E70D9A0A2A1AD10E991D48E5F792FA34 +:10B23000011E2CD10A9B2A0001930B9B02940093C0 +:10B240000FA8189B01F06CFF0028B4D12378302B95 +:10B25000E5D121000A9A0798FFF730FFABE7092AEA +:10B2600015D10E990F48E5F775FA011E0FD10A9B0B +:10B270002A0001930B9B029400930FA8189B02F0E5 +:10B280009BF90028E5D0084BC7E7084893E7084832 +:10B2900091E7C04600C3FFFF00E2FFFF80C4FFFF4D +:10B2A00084FD01108FFD011000D2FFFF00C4FFFFDD +:10B2B00080C6FFFFF0B58BB004ABDD1D0023170087 +:10B2C0002B7006AA3033060001F074FC002804D06D +:10B2D000324BC41820000BB0F0BD069A3368944678 +:10B2E000634401932A003000019907ABFFF7E8FDA2 +:10B2F000041EEFD13000019906AA01F0BBFC002822 +:10B3000001D0274BE5E7069A33689B18019A9A42C9 +:10B3100040D12878FFF77EF9011E3DD03800FFF7B5 +:10B3200085F9041ED6D12B78012B0BD130007A6819 +:10B330000199FFF7F5FA051E24D03800FFF75CF9F4 +:10B340002C00C7E7023B012B22D8796807A8FFF73A +:10B350004DFB051EF1D17B6832680293883303935D +:10B36000019B039902989B1AFCF71EF8051E04D155 +:10B3700003990298FCF784F80500019B3360002DC7 +:10B38000A8D0DAE73368019A9342A3D0054DD4E7F9 +:10B39000054DD2E7034C9DE7034C9BE700C3FFFF3D +:10B3A00000C5FFFF9AC4FFFF80C3FFFFF0B58BB05D +:10B3B00005000E00171E049300D1F2E007A801F06B +:10B3C00006FE7B1EF218F35C0592002B00D093E082 +:10B3D00006AB0293109B7C4A0193049B7B4900932C +:10B3E00007A8330001F0FAFD041E16D10120FFF773 +:10B3F00011F901002800FFF719F9041E06D1089A77 +:10B4000007996868FFF76CFC041E02D02800FFF75C +:10B41000F3F807A801F070FE03E06D4B984203D1EA +:10B420006C4C20000BB0F0BD6B4B984201D16B4CC3 +:10B43000F7E76B4B9842F4D1059B1B78002B5BD14F +:10B4400006AB0293109B674A0193049B66490093E5 +:10B4500007A8330001F0C2FD041E0ED10220FFF741 +:10B46000D9F801002800FFF7E1F8041ECED1089AB0 +:10B4700007996868FFF754FDC6E7554B9842CFD04F +:10B48000554B9842D3D0564B9842CAD1059B1B7856 +:10B49000002B31D106AA029201930093534A330044 +:10B4A000534907A801F09AFD041E05D12800089A07 +:10B4B0000799FFF703FEA7E7494B9842B1D1059BD7 +:10B4C0001B78002B18D106AA029201930093494AD7 +:10B4D0003300494907A801F081FD041E08D1109BE3 +:10B4E00028000093089A049B0799FFF751FE8BE709 +:10B4F0003B4B984200D094E739000120EEF7C0FFA3 +:10B50000041E01D13D4C8CE73A0031002000E5F7E4 +:10B510002FF9109B3A00210000932800049BFFF7AD +:10B5200037FE390004902000EEF7C4FF2000EEF74C +:10B53000AFFF049B002B01D1002472E72800FFF726 +:10B540005BF82800FFF754F8224B049A9A4200D186 +:10B5500066E73A0031002800FFF7B0FD0028EBD085 +:10B560002800FFF749F82800FFF742F80120FFF70D +:10B5700051F801002800FFF759F8002813D02800DF +:10B58000FFF73AF82800FFF733F80220FFF742F8F8 +:10B5900001002800FFF74AF800280CD02800FFF728 +:10B5A0002BF8174C3DE73A0031006868FFF798FB2D +:10B5B0000028E4D1C0E73A0031006868FFF7B0FC2A +:10B5C0000028B9D0EAE7C04699FD0110B7FD011087 +:10B5D00080ECFFFF80C4FFFF00EDFFFF00C4FFFF12 +:10B5E00080EFFFFFD7FD0110F4FD011013FE0110E5 +:10B5F0002DFE011049FE01106DFE011080C0FFFFFD +:10B6000000C3FFFFF0B505000E0017008DB0002A43 +:10B6100000D17AE009A801F0DAFC7B1EF218F35C95 +:10B620000592002B4DD108AA029201930093384A4B +:10B630003300384909A801F0D1FC041E20D1099B30 +:10B64000012005930793FEF7E5FF011E03D1324C5D +:10B6500020000DB0F0BD2800FEF7E8FF041EF7D172 +:10B660000A99079B6A68591807A8FFF759F9041E39 +:10B6700002D02800FEF7C0FF09A801F03DFDE7E772 +:10B68000264B9842F8D1059B1B78002B19D108AAAC +:10B69000029201930093224A3300224909A801F043 +:10B6A0009DFC041E0AD109990A9B07912A00C9181A +:10B6B00007A80593FFF7FEFD0400DDE7174B98424E +:10B6C000DAD109A801F018FD0120FEF7A3FF011E41 +:10B6D000BDD02800FEF7AAFF041EB9D1F719390022 +:10B6E0006A6807A80796FFF71BF9041EB0D0280068 +:10B6F000FEF782FF0C4B9C42AAD12A00390007A812 +:10B700000796FFF7D7FD0400A2E7084CA0E7C04664 +:10B7100093FE0110B0FE011080C3FFFF80EFFFFF1A +:10B72000CFFE0110E8FE01109EC4FFFF00C3FFFF23 +:10B7300070B50500100085230C0001000022A6B0A2 +:10B7400004AE01938831009603AB0392FBF7C4FD6E +:10B7500000280CD12868A0420BD3039A041B944202 +:10B7600007D3801A31002860E5F702F8039826B065 +:10B7700070BD6C204042FAE737B504000D001000A0 +:10B78000694601AAFEF7B0FE002805D12900200075 +:10B79000019B009A01F0DEFB3EBD0000F0B58BB0CE +:10B7A000049010000F001400FEF758FF01284BD141 +:10B7B0000025636807AE30000593F7F7C1FA2B0048 +:10B7C0002A002900059801960095F2F7C3FB03951E +:10B7D0000400A8421FD132003900049801F07EFB1A +:10B7E00003950400A84216DB03902B002A003100C9 +:10B7F000059801950095F2F7ADFB0400A8420AD127 +:10B8000032003900049801F069FB0400A84202DB11 +:10B81000039B1B1803933000F7F798FA002C10DBFA +:10B820003900039A049801F09BFA041E09DB039B7C +:10B830003022C6183900049801F0F9FA041E00DB22 +:10B84000841920000BB0F0BD2000FEF707FF02288E +:10B8500006D1626839000498FFF76AFF0400F0E738 +:10B86000004CEEE780C6FFFFF0B504000F009BB070 +:10B87000002A04D16C24644220001BB0F0BD8A1859 +:10B880000892FEF7EBFE012800D0C2E0636809A829 +:10B890000293F7F755FA00220298110009ABF2F76C +:10B8A000C1FB00250400A84200D08FE0390009AA9E +:10B8B00008A801F013FB0400A84200DA86E0002388 +:10B8C00005001900029809AAF2F7ACFB041E00D08B +:10B8D0007CE0390009AA08A801F000FB041E75DB12 +:10B8E00000232D181A00029809A9F2F79BFB041EE9 +:10B8F0006CD1390009AA08A801F0F0FA041E65DB32 +:10B9000000212D180A0002980191009109ABF2F76D +:10B9100021FB041E5AD1390009AA08A801F0DEFA59 +:10B92000041E53DB00262D183300310002980196C7 +:10B93000009609AAF2F70EFB0400B04246D1390086 +:10B9400009AA08A801F0CAFA0400B0423EDB09AB1C +:10B9500000933200330031002D1801960298F2F75F +:10B96000F9FA0400B04231D1390009AA08A801F05F +:10B97000B5FA0400B04229DB09AB01933200330071 +:10B9800031002D1800960298F2F7E4FA0400B04254 +:10B990001CD1390009AA08A801F0A0FA0400B0429D +:10B9A00014DB330032002D1801960298009609A985 +:10B9B000F2F7D0FA0400B04208D1390009AA08A869 +:10B9C00001F08CFA0400B04200DB2D1809A8F7F74B +:10B9D000BDF9002C00DA4FE70022390008A801F079 +:10B9E000D5FA041E00DA47E745192A00390008A8ED +:10B9F00001F0B6F9041E00DA3EE73022390008A84B +:10BA000001F015FA031E00DA9EE060191818040010 +:10BA100032E72000FEF722FE022800D092E066689E +:10BA20003900320008A8FFF783FE041E00DA23E77E +:10BA3000089BDA1B002A00DC1CE70022013B451CA6 +:10BA4000089339001A7008A82A0001F089F9041E29 +:10BA500000DA11E70322390008A801F0E8F9031E13 +:10BA600072DB641903191A00390008A8059301F064 +:10BA700077F9041E029000DAFEE6A122390008A838 +:10BA800001F0D5F9041E039000DAF5E639003278AA +:10BA900008A8FFF771FE041E00DAEDE6020004902C +:10BAA000390008A801F05CF9041E069000DAE3E60C +:10BAB000A022390008A801F0BAF9041E079000DAA4 +:10BAC000DAE63000B36D7C30DD1DED082A0009A9EF +:10BAD000F7F7A3FB041E06D12B00390009AA08A81A +:10BAE00001F059FA0400290009A8EEF7E3FC002C44 +:10BAF00000DAC1E60122390008A801F047FA061E63 +:10BB000024DB059A029B944663441800039B39008A +:10BB10001818049BC018069BC018079BC018201853 +:10BB20003618320008A801F01BF9041E00DAA3E65B +:10BB30003022390008A801F07AF9051E08DBA019A7 +:10BB4000281864E7034C97E61C0095E6040093E68A +:10BB5000040091E680C6FFFFF0B5794C0123A544AF +:10BB6000002080241B25820008A95350FFA99A00B9 +:10BB70002431505019005A002140234200D029009E +:10BB800053404B408022FF2101300B405200904235 +:10BB9000E9D10123002280251B276A4E1C0090005A +:10BBA00083512C4058002B4200D03C00030001324E +:10BBB00063400B400A2AF1D100210124FF26624B89 +:10BBC00059321A70614BFFAD9B18197024350292DF +:10BBD000A3005B5908AAF31A9B00D758F911780003 +:10BBE00008433040C211410011433140CB114A009B +:10BBF0001A433240530001921A00019BDB111A4391 +:10BC0000130033407B405840019A029B41404A4018 +:10BC10005A404E4F4C4BBC541A55802201345200AE +:10BC20009442D5D1AA6B029304926A6A0197059255 +:10BC30006A6B0692EA6A00250792029BFF26197832 +:10BC40001B2348B2C01703404A005A4008040B02A5 +:10BC50003240434053404A40120653403C4A190088 +:10BC600053511822D1413B4A515119001022D14160 +:10BC7000394A51510822D341384A5351019B1C780B +:10BC8000002C5AD0FFAA2432A3009B583100039302 +:10BC9000039A049B9818E7F7DBFB059A8900944602 +:10BCA00008ABCF58039B310063441800E7F7D0FB83 +:10BCB00008AB8900CB581B025F4000239C420CD08C +:10BCC000FFAAA30024329858069BFF211818E7F713 +:10BCD000BFFB08AB8900CB581B045F4000239C428C +:10BCE0000CD0FFAB2433A400E058079BFF211818A9 +:10BCF000E7F7AEFB08AB8900CB581B065F40184B3B +:10BD00003A005F511823DA41164B5A513A0010237A +:10BD1000DA41154B5A510823DF41144B5F51029B06 +:10BD2000043501330293019B013301938023DB002F +:10BD30009D4282D10E4B9D44F0BD27002300BBE7FE +:10BD4000DCF7FFFFFC1E0208FC0D0208241F02089E +:10BD5000FC0E0208FC120208FC160208FC1A02087B +:10BD6000242002082424020824280208242C020883 +:10BD7000240800008C2210B500215200E4F714FDC5 +:10BD800010BD10B5002803D08C214900EEF792FBBE +:10BD900010BD0000F7B504000E001500C02A09D040 +:10BDA00080235B009A424BD0F63B802A03D02020B0 +:10BDB000404244E00C23654F23603B68002B03D1D5 +:10BDC000FFF7CAFE01233B6023000833310018004F +:10BDD0006D09AD00636075198D4233D122680C2A5C +:10BDE0003DD00E2A6AD000200A2A28D12000A8308F +:10BDF0008446FF26564F574DD96818680A0A3240C4 +:10BE0000AC5C04CF424062400C0E2C5D58682404A8 +:10BE100062400C0034402C5D240662400C0C34401F +:10BE20002C5D240262401A61424098685A61424087 +:10BE30009A614A40DA6110336345DDD10020FEBDCE +:10BE40000E23B8E74A788E781202360432430E7811 +:10BE50003243CE7804313606324304C0BCE72000BA +:10BE6000C8308446FF253A4E3A4C596918680A0A88 +:10BE70002A40A75C04CE42407A400F0EE75D586826 +:10BE80003F047A400F002F40E75D3F067A400F0CD9 +:10BE90002F40E75D3F027A409A6142409868DA613C +:10BEA0004240D8681A62424018695A6242409A6217 +:10BEB0004A40DA6218336345D7D1BFE72000FF2537 +:10BEC000E830234E23490190DC691868220A2A4091 +:10BED0008F5C04CE42407A40270ECF5D58683F0405 +:10BEE0007A4027002F40CF5D3F067A40270C2F4035 +:10BEF000CF5D3F027A401A62424098685A624240DF +:10BF0000D8689A6242401700DA622F40CF5D186904 +:10BF10007840170ECF5D3F064740100A2840120CAC +:10BF2000085C2A408A5C000278401204424058694A +:10BF30001A63424098695A6342409A636240DA63E6 +:10BF4000019A20339342BFD178E7C04624300208DB +:10BF5000FC1E0208FC0D0208F0B50500CDB006A8D5 +:10BF60000C001600FFF706FF2B00083332002100FB +:10BF70006B6006A8FFF70EFF0390002834D1069AE5 +:10BF8000314813010493079B11015B181968103B9A +:10BF9000A96059692A60E960996929612900183105 +:10BFA0000191D96902936961511E8C461D00019B64 +:10BFB000059100936346002B1CDC00239A4201DDAF +:10BFC000049B103B0199CB1800218A4202DD059A9F +:10BFD00011014942029A51180A681A604A685A6067 +:10BFE0008A689A60CA68DA6006A8FFF7CAFE0398F2 +:10BFF0004DB0F0BD0021FF266B58144C1E40865DED +:10C000001F0EC75DB6003659114CBF003F59FF24C3 +:10C010007E401F0A2740C75D0E4CBF003F59FF24DA +:10C020001B0C2340C35C7E400B4F9B00DB595E40E2 +:10C03000009B5E5004311029DDD1103300930123A1 +:10C040005B429C44103DB5E7FC0D02082420020829 +:10C05000242C02082424020824280208F0B54C7875 +:10C060000B7824021C438B7899B01B041C43CB78BB +:10C0700000921B06426823431093146863404C7976 +:10C0800010930B7924021C438B791B041C43CB793E +:10C090001B062343546863404C7A11930B7A2402A5 +:10C0A0001C438B7A1B041C43CB7A1B0623439468E6 +:10C0B00063404C7B12930B7B24021C438B7B1B0441 +:10C0C0001C43CB7B11001B06D268234353401393C0 +:10C0D000036810315B100593013B03910F910693A8 +:10C0E000049300230800FF220193119BEC491B0AD3 +:10C0F00013409B00129D5B58EA491E002B0C134015 +:10C100009B005B58E64C9C462B0A13409B001399FE +:10C110001B59E44C02930B0C13409B001B59E04C41 +:10C120000B930B0A13409B001B59DE4C0C93109B86 +:10C13000DD4F1B0C13409B001B59D94C0D93109BDA +:10C140001B0A13409B001B59D64C0793119B1B0CD9 +:10C1500013409B001B590C001440A400E4590893A1 +:10C1600009942B0ED14C9B001B59099C090E5C4075 +:10C170002B000994119CCD4D1340240E9B00A4006C +:10C180006459DB5963400A93119B109C13409B0038 +:10C19000DD59240EC54BA400E3588C005D40109B74 +:10C1A00013409B00D959C14BE358644659403300B2 +:10C1B00063409C46029C0B9B0D9E5C400C9B734015 +:10C1C000049E002E00DDCDE000220598904201DDA6 +:10C1D000069A5201039882180198002800D00F9205 +:10C1E00062460F9F386842404A40019214927A6832 +:10C1F000019954406C40FF25BA68029453400A9A52 +:10C20000159453400393089C1693099BA84A5C40DD +:10C21000FB6829405C40079B505C5C40210E3B69F9 +:10C22000515C5840029B09064840190A2940515C5C +:10C23000039B09024840190C2940515C7B690904A1 +:10C240004840029917942940565C10905E40019B2B +:10C25000190E515C039B090671401E0A2E40965D23 +:10C2600036027140260C2E40965D360471401E0049 +:10C270002E40965DBB69119173409C46029B1E0E39 +:10C280006346965D36065E40230A2B40D35C2C4005 +:10C290001B0273409C46019B145D1E0C63462E409E +:10C2A000965D36045E4020239C46BC4463460F9353 +:10C2B000039BFF691B0E7C40D75C019B3F061B0A5A +:10C2C0002B407C40D75C029B3F021B0C1D40009B17 +:10C2D0007C40575D009A1870030A5370030C9370EA +:10C2E0000B0A53713F040B0C117193716740330AB1 +:10C2F000000E090ED070D1711672129613975372F8 +:10C30000330C93723B0A17735373360E3B0C3F0E7C +:10C31000D6729373D77310A80421EEF7CBF811A847 +:10C320000421EEF7C7F812A80421EEF7C3F813A80A +:10C330000421EEF7BFF814A80421EEF7BBF815A806 +:10C340000421EEF7B7F816A80421EEF7B3F817A802 +:10C350000421EEF7AFF80FA80421EEF7ABF80020A8 +:10C3600019B0F0BD66464E40310006686540714028 +:10C37000149144686C40159401940A9C089D634094 +:10C3800084686340079C16936C40099D02936C403F +:10C39000C568464B6C400D00260E1540AD00B6003A +:10C3A000F658ED591794754006697540019E2B00AB +:10C3B000360A1640B600B4466546394EAD591E00E1 +:10C3C0006E40029D33002E0C1640B600B446654602 +:10C3D000344EAD591E006E40019D344B10961540F1 +:10C3E0000E0EAD00B600F658ED5975404669754021 +:10C3F0002B00029D2E0A1640B600B4466546284E14 +:10C40000AD591E006E403300260C1640B600B446EF +:10C410006546244EAD591E006E401196029D019E48 +:10C42000224B1540360EAD00B600F658ED5975405A +:10C4300086697540260A1640B600B4462B0065464C +:10C44000174E1440AD591E006E4033000E0C1640BE +:10C45000B600B4466546134EA400AD591E00029BBB +:10C460006E401B0E114D9B005B59E45912965C40C7 +:10C47000C369090A5C401140094B8900CB580199F6 +:10C4800063400C0C14400749A400645820306340FA +:10C490001393049B013B04930123019325E6C046BB +:10C4A000FC120208FC160208FC0E0208FC1A020824 +:10C4B000FC0D0208F0B54C780B7824021C438B78F5 +:10C4C00099B01B041C43CB7800921B06426823439F +:10C4D0001093146863404C7910930B7924021C4329 +:10C4E0008B791B041C43CB791B06234354686340A0 +:10C4F0004C7A11930B7A24021C438B7A1B041C4345 +:10C50000CB7A1B062343946863404C7B12930B7BCE +:10C5100024021C438B7B1B041C43CB7B11001B069A +:10C52000D268234353401393036810315B10059383 +:10C53000013B03910F910693049300230800FF220F +:10C540000193139DEB492B0A13409B005B58EA496A +:10C550001E00129BE74C1B0C13409B005B5811996B +:10C560009C46109BE54F1B0A13409B001B59E24C55 +:10C5700002932B0C13409B001B59DE4C0B930B0AB0 +:10C5800013409B001B59DC4C0C93109B1B0C13405D +:10C590009B001B59D74C0D93129B1B0A13409B0009 +:10C5A0001B59D54C07930B0C13409B001B592C00B7 +:10C5B0001440A400E4590893109B09941B0ED04C1E +:10C5C0009B001B59099C5C40129B099413402C0E44 +:10C5D000CB4D9B00A4006459DB5963400C000A93C7 +:10C5E0001440129BA400E5591B0EC54C9B001B591F +:10C5F000090E5D40109B8C0013409B00D959C04B25 +:10C60000E35864465940330063409C46029C0B9BB0 +:10C610000D9E5C400C9B7340049E002E00DDCBE021 +:10C6200000220598904201DD069A52010398821873 +:10C630000198002800D00F9262460F9F3868424050 +:10C640004A40019214927A68019954406C40FF2547 +:10C65000BA68029453400A9A159453400393089C75 +:10C660001693099BA74A5C40FB6829405C40079BE6 +:10C67000505C5C403B6917945840029B190E515C1A +:10C68000039B09064840210A2940515C09024840A1 +:10C69000190C2940515C7B690904484002991090AB +:10C6A0002940565C5E40039B190E515C019B0906B4 +:10C6B00071401E0A2E40965DBB6936027140260C01 +:10C6C0002E40965D36047140039E11912E40965D7A +:10C6D0007340260E965D2C4036065E40029B145D2C +:10C6E0001B0A2B40D35C1B0273409C46019B1E0C13 +:10C6F00063462E40965D36045E4020239C46BC4433 +:10C700006346FF690F93019B7C401F0E039BD75D1F +:10C710001B0A2B403F067C40D75C029B3F021B0C50 +:10C720001D40009B7C40575D009A1870030A5370AF +:10C73000030C93700B0A53713F040B0C117193712E +:10C740006740330A000E090ED070D171129613970C +:10C7500016725372330C93723B0A17735373360E6F +:10C760003B0C3F0ED6729373D77310A80421EDF7DC +:10C77000A1FE11A80421EDF79DFE12A80421EDF7FA +:10C7800099FE13A80421EDF795FE14A80421EDF7F6 +:10C7900091FE15A80421EDF78DFE16A80421EDF7F2 +:10C7A00089FE17A80421EDF785FE0FA80421EDF7F7 +:10C7B00081FE002019B0F0BD66464E40310006688B +:10C7C00065407140149144686C40159401940A9C32 +:10C7D000089D63408468019E6340079C16936C40EB +:10C7E000099D02936C40C568454B6C400D00360EA8 +:10C7F0001540AD00B600F658ED591794754006691E +:10C800007540260A1640B600B4462B006546394EE0 +:10C81000AD591E006E40029D33002E0C1640B6002E +:10C82000B4466546344EAD591E00029B6E40019DD4 +:10C83000109615401E0E324BAD00B600F658ED595D +:10C840007540466975400E0A1640B600B4462B0086 +:10C850006546284EAD591E006E403300260C16402A +:10C86000B600B4466546244EAD591E006E40029D8A +:10C870001196234B260E1540AD00B600F658ED5923 +:10C88000144075408669A4007540019E2B00360A4D +:10C890001640B600B4466546164EE459AD591E0022 +:10C8A0006E4033000E0C1640B600B4466546124E7C +:10C8B000090EAD591E006E40114D89004959029B69 +:10C8C00012964C40C1691B0A4C40134009499B0019 +:10C8D0005958019B61401C0C1440074BA400E458BC +:10C8E000049B6140013B0493012313912030019389 +:10C8F00027E6C0462424020824280208242002082F +:10C90000242C0208241F020810B50C0011001A0084 +:10C91000012C02D1FFF7A2FB10BDFFF7CBFDFBE717 +:10C92000F0B589B017001E0002900391130746D19D +:10C93000002942D001920E9B019ADB199B1A0F9A93 +:10C94000D519019AAD1A002A34D000241A5D315D40 +:10C950004A402A550134102CF8D12B002A000399A3 +:10C960000298FFF7D1FF220029003000E3F700FF13 +:10C97000019B103B0193DEE710220E9904A8E3F718 +:10C98000F7FE22000E990298FFF794FD0022A35CA7 +:10C99000B15C4B40A3540132102AF8D1300004A9F5 +:10C9A000E3F7E6FE0E9B103410330E930F9BDB195A +:10C9B0009C42E1D1002009B0F0BD0F9CF6E7222097 +:10C9C0004042F8E7F0B51C6885B00A9E01900293DA +:10C9D0000F2C34D80B9B0B9D9B180C9F03930029A5 +:10C9E00025D0039B9D4225D0002C04D1320031007C +:10C9F0000198FFF733FB335D2A78013553403B70D4 +:10CA000033550F2301341C400137EAE7002C04D1D1 +:10CA1000320031000198FFF721FB2A78335D0135A0 +:10CA200053403B700F23325501341C400137039BA8 +:10CA3000AB42EBD10020029B1C6005B0F0BD212071 +:10CA40004042FAE7F0B5146885B017001E00039065 +:10CA50000F2C22D80B9B0A9D01936B180293029B0B +:10CA6000AB4202D100203C6015E0002C0CD02A78AB +:10CA7000335D01345340019A013513700F231C407C +:10CA8000130001330193EAE7320031000398FFF706 +:10CA9000E5FA0028EBD005B0F0BD21204042FAE7CE +:10CAA000F0B5146885B017001E0003900F2C2DD828 +:10CAB0000C9B0B9D01936B180293029B9D4203D12B +:10CAC00000203C6005B0F0BD002C0FD10A9A310067 +:10CAD0000398FFF7C3FA32000F3213780133DBB249 +:10CAE0001370002B02D1531E96420DD10A9B2A7857 +:10CAF0001B5D01345340019A013513700F231C4014 +:10CB0000130001330193D8E71A00E6E721204042E1 +:10CB1000D8E7036870B50400CD1A002D0EDD00269D +:10CB20009E571878002E0CDB581C20601B78136071 +:10CB300023680020C91A13688B4201D96020404243 +:10CB400070BD7F2630400138032831D8E6F7F2FA6D +:10CB500002091420012DF1D05878023310602360AF +:10CB6000E6E7022DEADD98785D780002284340BAB6 +:10CB700080B210600333F2E7032DDFDD58789D7833 +:10CB800000042D022843DD78043328431060E6E7D3 +:10CB9000042DD3DD9D7858782D020543D878000404 +:10CBA0000543187905330006284300BA1060D6E71C +:10CBB0006420C4E770B504680D1B002D07DD2578DF +:10CBC0009D4207D101340460FFF7A3FF70BD6020D0 +:10CBD0004042FBE76220FBE737B51D00130001AAC6 +:10CBE0000400FFF7E7FF002804D1019B002B02D1CE +:10CBF000642040423EBD23681B787F2BF8D8019A01 +:10CC0000002A09D021680B78002B15D0042AEFD810 +:10CC100002D15BB2002BEBDB00232B60019B5A1E81 +:10CC20000192002BE6D022682B6811781B020B437F +:10CC300001322B602260F1E70131013A216001925B +:10CC4000DDE710B513000222FFF7C6FF10BD37B5B0 +:10CC50000223150001AA0400FFF7ACFF002808D149 +:10CC6000019A28002168F6F767FA2368019A9B1851 +:10CC700023603EBD70B5032304001500FFF79AFF43 +:10CC8000002804D12B68002B02D16820404270BDDF +:10CC9000013B2B6023681A78002AF6D10133236008 +:10CCA000F5E7F0B585B001921F0003AA3023050017 +:10CCB0000E00FFF77FFF041E1BD12B68F61A002E13 +:10CCC0002EDD1978019A280002C203995E183100FE +:10CCD0000623FFF76FFF041E0BD12B68019A9360A8 +:10CCE00052689B182B60B34206D10C213800EDF737 +:10CCF000E1FB200005B0F0BD3A001978013302C213 +:10CD0000280031002B60FFF704FF041EF1D12B68CF +:10CD10007A68BB609B182B60B342EAD0663CE8E7B8 +:10CD200060246442E5E77FB504000D001600002191 +:10CD30000C2201A8E3F738FD32002900200001ABE6 +:10CD4000FFF7AFFF002809D1019B052B01D0002B75 +:10CD500002D1029B002B01D06820404204B070BD7C +:10CD6000036810B5591A7F2A06D800295CDD013BFB +:10CD7000036001201A7010BDFF2A0BD8012953DD72 +:10CD8000013B03601A7081220368013B03600220AB +:10CD90001A70F0E780246402A24210D2022943DD17 +:10CDA000013B03601A700368120A013B03601A70AA +:10CDB00082220368013B036003201A70DBE78024B2 +:10CDC0006404A24215D203292EDD013B03601A70D0 +:10CDD0000368110A013B036019700368120C013BE0 +:10CDE00003601A7083220368013B036004201A70F9 +:10CDF000C1E7042918DD013B03601A700368110ABA +:10CE0000013B036019700368110C013B036019704A +:10CE10000368120E013B03601A7084220368013B11 +:10CE2000036005201A70A6E76C204042A3E7036860 +:10CE3000591A002904DD013B036001201A70704774 +:10CE40006C204042FBE7F7B50F000500002101937D +:10CE50002B68D81B002805DC6C2464422000FEBD32 +:10CE60003100F5E7013B2B604E1C1A701212002AAC +:10CE7000F6DC2B681A787F2A07D9DA1B002AEBDD4B +:10CE80000022013B2B608E1C1A70320039002800F2 +:10CE9000FFF766FF041EE1DB6B46390028001A79B4 +:10CEA000FFF7C5FF002802DBA4190419D6E7040028 +:10CEB000D4E770B5060000680D001C001100A84200 +:10CEC00009D3451B9D4206D3C01A1A003060E3F710 +:10CED0004FFC200070BD6C204042FBE7F7B5060018 +:10CEE00010000F000192F6F7EBF831680500B94227 +:10CEF00003D26C2464422000FEBDCB1B8342F8D3D6 +:10CF0000091A020031600198F6F787F9041EF2D180 +:10CF1000019B1B68012B0AD133681A787F2A06D936 +:10CF2000DA1B002AE5DD013B3360013518702A0069 +:10CF300039003000FFF714FF041EDCDB0222390049 +:10CF40003000FFF774FF002802DB64190419D2E7F0 +:10CF50000400D0E7F8B506000F00FFF7AAFF041E93 +:10CF600010DB0200050039003000FFF7F9FE041E57 +:10CF700008DB062239003000FFF759FF002803DBE9 +:10CF8000641904192000F8BD0400FBE710B5022362 +:10CF9000FFF759FF10BDF8B506000F00FFF789FF36 +:10CFA000041E10DB0200050039003000FFF7D8FE38 +:10CFB000041E08DB042239003000FFF738FF002888 +:10CFC00003DB641904192000F8BD0400FBE710B569 +:10CFD0000C220021E3F7E8FB10BD0000F0B587B09C +:10CFE00006000C001F000392002800D16AE0180020 +:10CFF000E3F747FD0290002866D038000399E3F775 +:10D0000040FD051E60D0029B83425DD22000E3F705 +:10D0100031FD029B1C181B5C203B5A425341E41813 +:10D0200023780D3B5A425341E41823780A2B4BD105 +:10D030000398E3F71FFD2A5C2B18203A51424A411E +:10D040009B181A7801340D3A51424A419B181A78BC +:10D050000A3A51424A419B180E9ADB1B13602F1B60 +:10D06000152F06DD162220001C49E3F773FB00286C +:10D070002CD0A5422CD9002123000800009705AA36 +:10D0800000F09AFB2C3025D001200599EDF7F8F936 +:10D09000051E21D023000599009705AA00F08CFBFE +:10D0A000041E0BD028000599EDF704FA2800EDF7CF +:10D0B000EFF90B4BE418200007B0F0BD059B35607D +:10D0C0007360F8E7074CF6E7074CF4E7074CF2E724 +:10D0D000034CF0E7064CEEE7064CECE703FF0110CB +:10D0E00000EFFFFF80EBFFFF80EFFFFF00ECFFFF93 +:10D0F000D4EEFFFF80EEFFFF10B5040000680028AB +:10D1000005D06168EDF7D6F92068EDF7C1F9A068A0 +:10D11000EDF7BEF90C212000EDF7CCF910BD0000B1 +:10D120000048704700E1FFFFF0B5754CA54404933B +:10D13000A2AB0390009118780592802900D9DAE01B +:10D14000049B402B00D9D6E0A19B402B00D9D2E014 +:10D15000FCF7C0FF0290002800D1CEE007A8FCF742 +:10D16000C5FF0022029907A8FCF7F4FF002878D138 +:10D170000298FDF775F940270190202800D9FF1982 +:10D18000A39B3A00D9B21AA8E3F70EFB3C003AAED3 +:10D19000A19DA54200D9250030002A00A099E3F7FF +:10D1A000E7FA7619641BF3D13C005AAE049DA54200 +:10D1B00000D9250030002A000599E3F7D9FA76193D +:10D1C000641BF3D1009B002B36D007A8FDF708F8AD +:10D1D000041E32D13A001AA907A8FDF727F8041E49 +:10D1E0002BD13A003AA907A8FDF720F8041E24D154 +:10D1F0003A005AA907A8FDF719F8041E1DD10AA97B +:10D2000007A8FDF733F8041E17D10125A49BAB42F4 +:10D210002BD8009C019A944200D914002200039854 +:10D220000AA9E3F7A5FA009B1B1B0093039B1B199C +:10D230000393009B002B22D1002480213AA8EDF714 +:10D2400039F980215AA8EDF735F980217AA8EDF750 +:10D2500031F940210AA8EDF72DF907A8FCF74CFF9A +:10D2600020009B239B009D44F0BD0AAB1900019A4E +:10D270000298FDF71BF8041EDFD10135C6E73C001C +:10D280007AAE019DA54200D9250030002A000AA9E6 +:10D29000E3F76EFA7619641BF3D139007C1E7AAB82 +:10D2A0001B191A7801390132D2B21A70002A02D140 +:10D2B000013B0029F5D13AAB1A1900203B007AAEA8 +:10D2C000013B11789D5D013A49190918080A51700E +:10D2D000C0B2002BF4D139005AAA14197AAD013921 +:10D2E0002278485D013C1218D218130A6270DBB232 +:10D2F0000029F4D166E70348B3E70348B1E7C04625 +:10D3000094FDFFFF80E0FFFF00E1FFFFF0B5002488 +:10D31000DDB005001000099107930A94F7F79CFE11 +:10D320000600A04200D1B7E043680B940893C3689D +:10D330000693639B802B03D9594C20005DB0F0BD50 +:10D3400021000C220CA8E3F72FFA812221002C00E7 +:10D3500052001BA8E3F728FAAB686A6808349F18E4 +:10D360002B68302B00D099E0390020002C3B0DAA0F +:10D37000FFF720FC002865D04A4BC418002CDCD1F4 +:10D38000629B63991BAA591899426CD1089B1BAAEE +:10D39000DF08639B39005D1C0B9B6D000493012328 +:10D3A0000393079B13A802930D9B01930E9B089375 +:10D3B00000932B00FFF7B8FE041EBED1069B002B86 +:10D3C00056D11BA8F7F76CFE31001BA8F8F798F8A8 +:10D3D000041E2BD124226B469B181B78FA005BB2EB +:10D3E00013A91BA8F7F77AFE041E1FD1F2680FA934 +:10D3F0001BA8F7F793FE041E18D11BA8F7F7B0FE81 +:10D40000041E13D10AAD669B659A649900951BA80A +:10D41000F7F7B2FE041E09D10A9A669B1BA8991859 +:10D420002A00F7F7BBFF041E00D01F4C13A82021D1 +:10D43000EDF740F80FA81021EDF73CF81BA8F7F71F +:10D4400035FE7AE7AB680D9A0E939B1839002000E1 +:10D45000AB600BAAFFF7F5FB00288DD1AB689F42AC +:10D460008ED0124C69E718780133507002328BE786 +:10D470000B9B0699049302230393079B1BAA029319 +:10D480000D9B0FA8079301930E9B00932B00FFF7B2 +:10D490004BFE041E95D050E7054C4EE7054C4CE77B +:10D4A00080E0FFFF80E1FFFF00E2FFFF1AE1FFFFE6 +:10D4B00000E1FFFF1EE1FFFFF0B50400A5B000682A +:10D4C0000D0016000193FCF7CBFF03AF03220021F0 +:10D4D00000903800E3F768F90123290032002000AA +:10D4E000FB70FCF709FF051E40D0280025B0F0BDF9 +:10D4F00020002A9A0199FCF759FF00285AD10422EA +:10D50000200003A9FCF752FF002853D1200014A9E2 +:10D51000FCF75CFF00284DD12000FCF789FF0028B4 +:10D5200048D1009A14A904A8E3F722F901272B9BFC +:10D530009F421FD3009E2C9A964200D916003200BB +:10D5400014A92D98E3F714F904212C9B03AA9B1B23 +:10D550002C932D9B9B192D93D37801390133DBB28A +:10D56000D370002B02D1013A0029F5D12C9B002B5E +:10D57000BED1BAE704AE31002000009AFCF716FFD6 +:10D58000002817D131002000FCF720FF002811D11E +:10D590002000FCF74DFF00280CD114AB009A82420A +:10D5A00001DC0137C3E71A78815D01304A401A7007 +:10D5B0000133F3E7050098E7F0B51E000023C1B082 +:10D5C000069212220424876809930A930C934368F5 +:10D5D00005910B9704A9FF18036852181470302B9B +:10D5E0001DD1390013AB0DAA0BA8FFF75AFB002879 +:10D5F00002D06B4BC418CEE00E9A092A01D0694CB8 +:10D60000C9E00F996848E3F7A5F80028F7D1149B03 +:10D61000159D07932795ED18139B302B01D0634C74 +:10D62000B9E0230029001AAA27A8FFF7C3FA0028A7 +:10D6300000D17AE05A4BC418002C00D0ABE0122382 +:10D6400004AA9B181878FCF745FD041ED7D03900B2 +:10D6500016AB10AA0BA8FFF724FB0028C9D113258D +:10D6600004ABED18290010A8FCF752FF0028C6D122 +:10D670002878F7F7F1FC051EC1D04368DB080A9350 +:10D68000169B0793042B00D088E0179BC268079372 +:10D69000934200D082E01CA8FCF728FD2FA8F7F7E2 +:10D6A000FFFC1899179A27A8E3F762F821000122D6 +:10D6B0001CA8FCF74FFD041E30D10A9B1FAF02933C +:10D6C000099B320001931A9B0699079300930397D5 +:10D6D0001B9B1CA8FFF7F0FE041E1FD129002FA8DA +:10D6E000F7F70EFF041E19D16B460A9A1B7D39000D +:10D6F0005BB2D2002FA8F7F7F1FC041E0ED10CABE1 +:10D700000293489B179A0193479B27A900932FA840 +:10D71000469BF7F713FF041E00D0254C1CA8FCF70E +:10D72000EBFC2FA8F7F7C2FC35E0279B1A9A1B9356 +:10D7300029009B1827A809AA2793FFF782FA002837 +:10D7400000D077E7279B9D4200D178E729000AAAFD +:10D7500027A8FFF776FA002803D00300623300D031 +:10D7600068E7279B9D4200D169E729002FAA27A8D7 +:10D77000FFF7D9FA002800D05CE7122104ABC918E2 +:10D780002FA8FCF7F7FE002800D038E7279B9D4222 +:10D7900000D154E7074C200041B0F0BD004CFAE73F +:10D7A00000D1FFFF80D1FFFF1AFF01109ED0FFFFC5 +:10D7B00000D2FFFF9AD0FFFFF0B5002485B00190A2 +:10D7C0000391200021000A9D0292A9420BD30D0073 +:10D7D00003E0013101378D4206D100282CD1029B94 +:10D7E000186005B0F0BD00275E5C202EF1D08D42A0 +:10D7F000F3D06A1A012A07D90D2E05D15A1852788A +:10D800000A2A03D10131E0E70A2EFBD0002F04D110 +:10D810003D2E04D10134022C04D92C202EE077B205 +:10D82000002FFADB2D4A965D7F2EF6D03F2E01D8D1 +:10D83000002CF2D10130E5E70721062601407143B3 +:10D84000C00870430731019AC908041B0C19002A4B +:10D8500011D0039A94420ED800215A1903240D00C6 +:10D8600001980392039A93420AD1019BC01A029B2A +:10D8700018600020B5E72A20029B1C604042B0E7F8 +:10D880001F783E000A3EF6B2162E05D8144AF24022 +:10D8900016000122B24315D0104A8901D65D013528 +:10D8A0003700403F7A427A41A41A3F221640314362 +:10D8B000042D07D10025AC4204D00E0C0670012CBB +:10D8C00002D101300133CDE70E0A4670022C01D19E +:10D8D0000230F7E781700330F4E7C04624FF0110FF +:10D8E000090040008D960010B59600103993001085 +:10D8F0006593001009920010F9940010DD96001055 +:10D90000059700102D970010098D0010018D001053 +:10D91000C18A00101D8B0010758B0010E98B001060 +:10D92000498C0010A18C0010858F00108D8F001085 +:10D93000118D0010898D0010018E0010598E00107D +:10D94000CD8E00102D8F0010B18A0010B98A001002 +:10D9500095880010FD880010CD8700103D880010CC +:10D9600065890010E5890010598A00106D99001032 +:10D97000199A0010C59A0010CD9A0010E59A00106F +:10D98000ED9A0010F59A0010059B0010FD9A00100A +:10D99000DD9A00100D9B0010D59A0010159B001009 +:10D9A0007D9B0010D99B0010AD9C0010399D00108C +:10D9B000A19D0010E59D0010219E00101D9F0010EC +:10D9C000A9A00010DD9E0010699F00101DA000108E +:10D9D00029A1001009A1001055980010F99100101C +:10D9E000019200104C00000068010000E0000000FF +:10D9F0000802000013151718191A1B1C1D12141603 +:10DA00001E0A010B020C030405060708090D00009D +:10DA1000E8EF01100000000000000000F0EF01102E +:10DA2000F8EF011000F0011008F001101040404024 +:10DA300040000040408080020305070B0D111317C2 +:10DA40001D1F25292B2F353B3D4347494F53596116 +:10DA500065676B6D717F83898B95979DA3A7ADB328 +:10DA6000B5BFC1C5C7D3DFE3E5E9EFF1FB000000B7 +:10DA7000982F8A4291443771CFFBC0B5A5DBB5E939 +:10DA80005BC25639F111F159A4823F92D55E1CABAD +:10DA900098AA07D8015B8312BE853124C37D0C553B +:10DAA000745DBE72FEB1DE80A706DC9B74F19BC183 +:10DAB000C1699BE48647BEEFC69DC10FCCA10C2473 +:10DAC0006F2CE92DAA84744ADCA9B05CDA88F97657 +:10DAD00052513E986DC631A8C82703B0C77F59BFC1 +:10DAE000F30BE0C64791A7D55163CA0667292914ED +:10DAF000850AB72738211B2EFC6D2C4D130D38538A +:10DB000054730A65BB0A6A762EC9C281852C72924B +:10DB1000A1E8BFA24B661AA8708B4BC2A3516CC779 +:10DB200019E892D1240699D685350EF470A06A10B2 +:10DB300016C1A419086C371E4C774827B5BCB03401 +:10DB4000B30C1C394AAAD84E4FCA9C5BF36F2E689F +:10DB5000EE828F746F63A5781478C8840802C78C2E +:10DB6000FAFFBE90EB6C50A4F7A3F9BEF27871C631 +:10DB700022AE28D7982F8A42CD65EF239144377182 +:10DB80002F3B4DECCFFBC0B5BCDB8981A5DBB5E9F4 +:10DB900038B548F35BC2563919D005B6F111F159C1 +:10DBA0009B4F19AFA4823F9218816DDAD55E1CABF2 +:10DBB000420203A398AA07D8BE6F7045015B831287 +:10DBC0008CB2E44EBE853124E2B4FFD5C37D0C5542 +:10DBD0006F897BF2745DBE72B196163BFEB1DE803A +:10DBE0003512C725A706DC9B942669CF74F19BC12B +:10DBF000D24AF19EC1699BE4E3254F388647BEEFC8 +:10DC0000B5D58C8BC69DC10F659CAC77CCA10C247F +:10DC100075022B596F2CE92D83E4A66EAA84744AF1 +:10DC2000D4FB41BDDCA9B05CB5531183DA88F97629 +:10DC3000ABDF66EE52513E981032B42D6DC631A85E +:10DC40003F21FB98C82703B0E40EEFBEC77F59BF42 +:10DC5000C28FA83DF30BE0C625A70A934791A7D52D +:10DC60006F8203E05163CA06706E0E0A6729291499 +:10DC7000FC2FD246850AB72726C9265C38211B2EE1 +:10DC8000ED2AC45AFC6D2C4DDFB3959D130D38530E +:10DC9000DE63AF8B54730A65A8B2773CBB0A6A7621 +:10DCA000E6AEED472EC9C2813B358214852C7292B7 +:10DCB0006403F14CA1E8BFA2013042BC4B661AA834 +:10DCC0009197F8D0708B4BC230BE5406A3516CC7ED +:10DCD0001852EFD619E892D110A96555240699D6A5 +:10DCE0002A20715785350EF4B8D1BB3270A06A1066 +:10DCF000C8D0D2B816C1A41953AB4151086C371E15 +:10DD000099EB8EDF4C774827A8489BE1B5BCB0342F +:10DD1000635AC9C5B30C1C39CB8A41E34AAAD84E11 +:10DD200073E363774FCA9C5BA3B8B2D6F36F2E68D8 +:10DD3000FCB2EF5DEE828F74602F17436F63A5789E +:10DD400072ABF0A11478C884EC39641A0802C78C4D +:10DD5000281E6323FAFFBE90E9BD82DEEB6C50A45F +:10DD60001579C6B2F7A3F9BE2B5372E3F27871C6E8 +:10DD70009C6126EACE3E27CA07C2C021C7B886D119 +:10DD80001EEBE0CDD67DDAEA78D16EEE7F4F7DF5E1 +:10DD9000BA6F1772AA67F006A698C8A2C57D630A73 +:10DDA000AE0DF9BE04983F111B471C13350B711BB8 +:10DDB000847D0423F577DB289324C7407BABCA32EC +:10DDC000BCBEC9150ABE9E3C4C0D109CC4671D43C9 +:10DDD000B6423ECBBED4C54C2A7E65FC9C297F59F9 +:10DDE000ECFAD63AAB6FCB5F1758474A8C19446CA4 +:10DDF0000300000005000000070000000B00000009 +:10DE00000D000000110000001300000017000000CA +:10DE10001D0000001F000000250000002900000078 +:10DE20002B0000002F000000350000003B00000028 +:10DE30003D000000430000004700000049000000D2 +:10DE40004F00000053000000590000006100000076 +:10DE500065000000670000006B0000006D0000001E +:10DE6000710000007F0000008300000089000000B6 +:10DE70008B00000095000000970000009D0000004E +:10DE8000A3000000A7000000AD000000B3000000E8 +:10DE9000B5000000BF000000C1000000C500000088 +:10DEA000C7000000D3000000DF000000E300000016 +:10DEB000E5000000E9000000EF000000F1000000B4 +:10DEC000FB00000001010000070100000D0100003F +:10DED0000F01000015010000190100001B010000E6 +:10DEE0002501000033010000370100003901000066 +:10DEF0003D0100004B010000510100005B010000EA +:10DF00005D01000061010000670100006F01000079 +:10DF1000750100007B0100007F0100008501000009 +:10DF20008D0100009101000099010000A301000093 +:10DF3000A5010000AF010000B1010000B701000021 +:10DF4000BB010000C1010000C9010000CD010000BB +:10DF5000CF010000D3010000DF010000E701000055 +:10DF6000EB010000F3010000F7010000FD010000DB +:10DF7000090200000B0200001D0200002302000045 +:10DF80002D02000033020000390200003B020000B5 +:10DF9000410200004B020000510200005702000045 +:10DFA000590200005F0200006502000069020000E3 +:10DFB0006B02000077020000810200008302000073 +:10DFC000870200008D02000093020000950200000D +:10DFD000A1020000A5020000AB020000B302000095 +:10DFE000BD020000C5020000CF020000D702000001 +:10DFF000DD020000E3020000E7020000EF02000083 +:10E00000F5020000F9020000010300000503000012 +:10E01000130300001D030000290300002B03000070 +:10E0200035030000370300003B0300003D03000000 +:10E030004703000055030000590300005B03000084 +:10E040005F0300006D030000710300007303000014 +:10E05000770300008B0300008F030000970300008C +:10E06000A1030000A9030000AD030000B3030000FA +:10E07000B9030000C7030000CB030000D103000078 +:10E08000D7030000DF030000E503000099FFFFFF56 +:10E090004145532D3235362D43434D004145532DD7 +:10E0A0003139322D43434D004145532D3132382D06 +:10E0B00043434D004145532D3235362D47434D00E6 +:10E0C0004145532D3139322D47434D004145532DA4 +:10E0D0003132382D47434D004145532D3235362DD1 +:10E0E000435452004145532D3139322D435452008F +:10E0F0004145532D3132382D435452004145532D63 +:10E100003235362D4F4642004145532D3139322D9F +:10E110004F4642004145532D3132382D4F46420083 +:10E120004145532D3235362D434642313238004178 +:10E1300045532D3139322D43464231323800414565 +:10E14000532D3132382D4346423132380041455348 +:10E150002D3235362D434243004145532D3139325E +:10E160002D434243004145532D3132382D43424324 +:10E17000004145532D3235362D454342004145532C +:10E180002D3139322D454342004145532D3132382E +:10E190002D45434200000000050200008000000001 +:10E1A00065E10110100000000000000010000000F8 +:10E1B000E4E301102B08000080000000A8E001103B +:10E1C0000C00000001000000100000000CE4011031 +:10E1D00008030000800000003EE101101000000074 +:10E1E0000000000010000000E4E301100B05000037 +:10E1F00080000000F0E001101000000000000000AE +:10E2000010000000E4E301100201000080000000A3 +:10E2100089E1011000000000000000001000000073 +:10E22000E4E301100E06000080000000CCE00110C5 +:10E230000C000000010000001000000034E4011098 +:10E24000430400008000000014E1011010000000F1 +:10E250000000000010000000E4E3011006020000CE +:10E26000C000000059E10110100000000000000093 +:10E2700010000000E4E301102C080000C0000000C2 +:10E280009CE001100C0000000100000010000000E4 +:10E290000CE4011009030000C00000002FE1011090 +:10E2A000100000000000000010000000E4E3011076 +:10E2B0000C050000C0000000E4E0011010000000A8 +:10E2C0000000000010000000E4E301100301000062 +:10E2D000C00000007DE1011000000000000000000F +:10E2E00010000000E4E301100F060000C000000071 +:10E2F000C0E001100C000000010000001000000050 +:10E3000034E4011044040000C000000008E10110E2 +:10E31000100000000000000010000000E4E3011005 +:10E3200007020000000100004DE101101000000094 +:10E330000000000010000000E4E301102D080000C0 +:10E340000001000090E001100C000000010000003E +:10E35000100000000CE401100A030000000100009E +:10E3600020E101101000000000000000100000007B +:10E37000E4E301100D05000000010000D8E00110E9 +:10E38000100000000000000010000000E4E3011095 +:10E39000040100000001000071E101100000000014 +:10E3A0000000000010000000E4E30110100600006F +:10E3B00000010000B4E001100C00000001000000AA +:10E3C0001000000034E401104504000000010000CA +:10E3D000FCE0011010000000000000001000000030 +:10E3E000E4E30110020000007B5601106B5601109F +:10E3F00055560110455601102F5601102756011091 +:10E400001F56011007560110F755011002000000B9 +:10E4100000000000000000000000000000000000FC +:10E4200000000000B3550110B35501109D550110B7 +:10E430008D550110020000000000000000000000E7 +:10E44000000000000000000000000000E95501107D +:10E45000E9550110D1550110C1550110020000000D +:10E4600008E2011003000000CCE2011004000000EB +:10E4700090E301100500000098E101100600000083 +:10E480005CE201100700000020E30110080000001A +:10E49000D0E101100900000094E201100A00000020 +:10E4A00058E301104300000040E201104400000066 +:10E4B00004E3011045000000C8E301100B00000058 +:10E4C000ECE101100C000000B0E201100D000000B2 +:10E4D00074E301100E00000024E201100F000000A0 +:10E4E000E8E2011010000000ACE301102B00000076 +:10E4F000B4E101102C00000078E201102D000000B2 +:10E500003CE301100000000000000000424C494EB6 +:10E5100044494E4720434F4E544558540073656359 +:10E5200070353231723100627261696E706F6F6C7A +:10E530005035313272310073656370333834723163 +:10E5400000627261696E706F6F6C50333834723173 +:10E5500000736563703235367231007365637032F3 +:10E5600035366B3100627261696E706F6F6C50325C +:10E570003536723100736563703232347231007334 +:10E580006563703232346B310073656370313932D8 +:10E59000723100736563703139326B3100000000F5 +:10E5A00005001900090200001DE5011008001C000B +:10E5B0000002000027E5011004001800800100009F +:10E5C00037E5011007001B008001000041E5011044 +:10E5D000030017000001000051E501100C001600B7 +:10E5E000000100005BE5011006001A0000010000B8 +:10E5F00065E5011002001500E000000075E501105E +:10E600000B001400E00000007FE501100100130082 +:10E61000C000000089E501100A001200C0000000DF +:10E6200093E5011000000000000000000000000061 +:10E630003031444234320031344445463944454156 +:10E640003246373943443635383132363331413545 +:10E65000434635443345440039384141003833336B +:10E660003544433136334242313234423635313229 +:10E6700039433936464445393333443844373233E5 +:10E6800041373041414443383733443644353441CF +:10E690003742423044000000D9B530F3444B4AE9D8 +:10E6A0006C5CDC26C15580FBE7FF7A413075F6EEE5 +:10E6B00057302CFC75095A7DB6078CFF18DCCC6BE3 +:10E6C000CEE1F75C29168495BF7CD7BBD9B530F372 +:10E6D000444B4AE96C5CDC266232CE9ABD53443A24 +:10E6E000C223BDE3E127DEB9AFB781FC2F484B2C35 +:10E6F000CB577ECBB9AED28B9769042FC7541D5C24 +:10E70000548EED2D134577C2C91D61141A46F89732 +:10E71000FDC4DAC335F87E54A7564897820E1E9082 +:10E72000F7A661B5A37A398C718D839D900A663EF8 +:10E73000BCA9EEA1DB57FBA977536E1F1D48132020 +:10E74000282026D523F63B6E728D839D900A663E67 +:10E75000BCA9EEA1DB57FBA92628CE22DDC7A80461 +:10E76000EBD43A504A81A58A0FF991BAEF6591131B +:10E770008727B24F8EA2BEC2A0AF05CE0A08723C58 +:10E780000C158C3DC682C37B114C50FA9686B73A65 +:10E7900094C9DB950239B47CD562EB3EA50E882E78 +:10E7A000A6D2DC07E17DB72F7C44F01654B5398B37 +:10E7B0002628CE22DDC7A8041EAFD447E2B287EFD9 +:10E7C000AA46D63634E026E8E810BD0CFECA7FDB48 +:10E7D000E34FF17EE7A347886B3FC1B7813AA6A21A +:10E7E000FF45CF68F0641C1D15533C26410382424F +:10E7F000118191772146460E282991F94F059CE118 +:10E800006458ECFE290BB76252D5CF958EEBB15C04 +:10E81000A4C2F920751DBE8A656504E90232883BF1 +:10E8200010C37F6BAFB63ACFA72504AC6C6E161F32 +:10E83000B35654ED09712F15DF41E6507E6F5D0F21 +:10E84000286D38A3821EB98C53EC0731130047871B +:10E85000711A1D9029A7D3AC2311B77F19DAB11211 +:10E86000B45654ED09712F15DF41E6507E6F5D0FF0 +:10E87000286D38A3821EB98CCA94FC774DACC1E7D1 +:10E88000B9C7F22BA717117FB5C89A8BC9F12E0A09 +:10E89000A13A25A85A5DED2DBC6398EACA4134A877 +:10E8A0001016F93D8DDDCB94C54C23AC457132E299 +:10E8B000893B608B31A3307823F7168063BD09282C +:10E8C000DDE5BA5EB7504098673E08DCCA94FC7735 +:10E8D0004DACC1E7B9C7F22BA717117FB5C89A8B0A +:10E8E000C9F12E0AA13A25A85A5DED2DBC6398EA1C +:10E8F000CA4134A81016F93D22F8B9BC0922358B5B +:10E90000685E6A4047506D7C5F7DB9937B68D150EB +:10E910008DD4D0E2781F3BFF8E09D0F4EE623BB479 +:10E92000C116D9B5709FED85936A4C9C2E32215A41 +:10E9300064D92ED8BDE4AE819208D83A0F1ECD78A6 +:10E940000654F0A82F2BCAD1AE63278AD84BCA5BD6 +:10E950005E485F4A49DEDCB211811F885BC500A0BA +:10E960001A7BA52400F709F2FD2278CFA9BFEAC0DF +:10E97000EC3263565D38DE7D6900A99C829687B5CE +:10E98000DDDA5D0881D3B11D4710AC7F1961864186 +:10E990001926A94C415C3E5570083370CA9C63D659 +:10E9A0000ED2C9B3B38D30CB07FCC933AEE6D43F2A +:10E9B0008BC4E9DBB89DDDAAF3483A585660AA2813 +:10E9C00085C6822D2FFF8128E680A3E62AA1CDAE41 +:10E9D0004268C69B009B4D7D71083370CA9C63D60C +:10E9E0000ED2C9B3B38D30CB07FCC933AEE6D43FEA +:10E9F0008BC4E9DBB89DDDAA000000000300000025 +:10EA00007D6CE0EAB1D1A51D34F4B780027DB0265B +:10EA1000AEE957C00EF14FDB9D2F5ED988AA824028 +:10EA20003486BE15D0634184A728569C6D2F2F9B3A +:10EA30008DFDDE746A46690F17FCF226FEFFFFFFAC +:10EA4000FFFFFFFFFFFFFFFF37EEFFFFFEFFFFFFB0 +:10EA5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:10EA6000B1B946C1ECDEB8FE49302472ABE9A70F5C +:10EA7000E7809CE5190521641210FF82FD0AFFF46E +:10EA80000088A143EB20BF7CF69030B00EA88D1813 +:10EA90001148791EA177F973D5CD246BED11106360 +:10EAA00078DAC8FF952B19073128D2B4B1C96B1495 +:10EAB00036F8DE99FFFFFFFFFFFFFFFFFFFFFFFFBD +:10EAC000FFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF57 +:10EAD000FFFFFFFFFFFFFFFF000000000500000039 +:10EAE0005CA4B7B60E657E0FA97570E4E967A469EA +:10EAF000A128FC30DF99F04D335B45A1A5616D5530 +:10EB0000DB4BCAE259BDB0C0F719E3F7D6FBCA82A6 +:10EB10004234BA7FED9F087EF7B19F7671A9F0CAA3 +:10EB20008461ECD2E8DC010000000000000000007D +:10EB300000000000010000006DE5FFFFFEFFFFFF89 +:10EB4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10EB5000FFFFFFFFB4FF552343390B27BAD8BFD7B8 +:10EB6000B7B04450563241F5ABB3040C850A05B436 +:10EB7000211D5C11D68032342211C256D3C1034A02 +:10EB8000B99013327FBFB46BBD0C0EB7347E0085D5 +:10EB90009981D5446447075AA07543CDE6DF224CDE +:10EBA000FB23F7B5886337BD3D2A5C5C4529DD133F +:10EBB0003EF0B8E0A216FFFFFFFFFFFFFFFFFFFFE1 +:10EBC000FFFFFFFF01000000000000000000000048 +:10EBD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:10EBE0000000000000000000070000009817F81661 +:10EBF0005B81F259D928CE2DDBFC9B02070B87CE17 +:10EC00009562A055ACBBDCF97E66BE79B8D410FB2A +:10EC10008FD0479C195485A648B417FDA808110E3B +:10EC2000FCFBA45D65C4A32677DA3A48414136D09F +:10EC30008C5ED2BF3BA048AFE6DCAEBAFEFFFFFF62 +:10EC4000FFFFFFFFFFFFFFFFFFFFFFFF2FFCFFFFA7 +:10EC5000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10EC6000FFFFFFFFFFFFFFFFFFFFFFFF4B60D2270C +:10EC70003E3CCE3BF6B053CCB0061D65BC869876C4 +:10EC800055BDEBB3E7933AAAD835C65A96C298D881 +:10EC90004539A1F4A033EB2D817D0377F240A463C5 +:10ECA000E5E6BCF847422CE1F2D1176BF551BF37CE +:10ECB0006840B6CBCE5E316B5733CE2B169E0F7CA1 +:10ECC0004AEBE78E9B7F1AFEE242E34F512563FC3D +:10ECD000C2CAB9F3849E17A7ADFAE6BCFFFFFFFFD7 +:10ECE000FFFFFFFF00000000FFFFFFFFFFFFFFFF30 +:10ECF000FFFFFFFFFFFFFFFF00000000000000001C +:10ED00000000000001000000FFFFFFFFEF2AECD32E +:10ED1000EDC8852A9DD12E8A8D3956C65A87135043 +:10ED20008F081403124181FE6E9C1D18192DF8E303 +:10ED30006B058E98E4E73EE2A72F31B3B70A7672EF +:10ED4000385E543A6C2955BF5DF20255382A548218 +:10ED5000E041F759989BA78B623B1D6E74AD20F381 +:10ED60001EC7B18E37058BBE22CA87AA5F0EEA90F6 +:10ED70007C1D437A9D817E1DCEB1600AC0B8F0B57E +:10ED80001331DAE97C149A28BD1DF4F829DC92923B +:10ED9000BF989E5D6F2C26964ADE17367329C5CC28 +:10EDA0006A19ECEC7AA7B048B20D1A58DF2D37F487 +:10EDB000814D63C7FFFFFFFFFFFFFFFFFFFFFFFF67 +:10EDC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:10EDD0000000000000000000FFFFFFFFFEFFFFFF3C +:10EDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10EDF000FFFFFFFFFFFFFFFFFFFFFFFF003F506B25 +:10EE0000D41F45EFF1342C3D88DF733507BFB13B8C +:10EE1000BDC052167B937EEC51391956E109F18E33 +:10EE20009189B4B8F315B3995B72DAA2EE4085B656 +:10EE3000A0219A921F9A1C8E61B93E955100000044 +:10EE400066BDE5C2317E7EF99B426A85C1B3483317 +:10EE5000DEA8FFA227C11DFE2859E7EF775E4BA170 +:10EE6000BA3D4D6B60AF28F821B53F053981649CF0 +:10EE700042B4952366CB3E9ECDE90404B7068E8549 +:10EE8000C60000005066D19F7694BE8840C272A230 +:10EE900086703C356107AD3F01B950C54026F45E30 +:10EEA0009972EE972C663E2717BDAF1768449B57A3 +:10EEB0004944F598D91B7D2CB45F8A5C04C03B9A09 +:10EEC000786A293918010000096438911EB76FBBB0 +:10EED000AE479C89B8C9B53BD0A509F74801CC7F9E +:10EEE0006B962FBF83878651FAFFFFFFFFFFFFFF5F +:10EEF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:10EF0000FFFFFFFFFFFFFFFFFF010000FFFFFFFF0D +:10EF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10EF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:10EF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:10EF4000FFFFFFFFFFFFFFFFFFFFFFFFFF010000CD +:10EF50000000000000000000201C00000000000075 +:10EF600040380000000000006024000000000000A5 +:10EF70008070000000000000A06C00000000000095 +:10EF8000C048000000000000E05400000000000045 +:10EF900000E100000000000020FD00000000000073 +:10EFA00040D900000000000060C500000000000023 +:10EFB0008091000000000000A08D00000000000013 +:10EFC000C0A9000000000000E0B500000000000043 +:10EFD00053484100E8EF0110F0EF0110F8EF011085 +:10EFE00000F0011008F00110B0F30110041440000B +:10EFF000DBF30110051C400008F40110062040005E +:10F0000035F401100730800062F4011008408000E0 +:10F010002A864886F70D010C010300706265576966 +:10F020007468534841416E64332D4B65795472695D +:10F03000706C654445532D43424300504245207750 +:10F04000697468205348413120616E6420332D4B30 +:10F0500065792033444553002A864886F70D010C14 +:10F0600001040070626557697468534841416E64D9 +:10F07000322D4B6579547269706C654445532D434C +:10F08000424300504245207769746820534841311B +:10F0900020616E6420322D4B657920334445530046 +:10F0A0002A864886F70D020700686D616353484160 +:10F0B0003100484D41432D5348412D31002A8648A7 +:10F0C00086F70D020800686D61635348413232349F +:10F0D00000484D41432D5348412D323234002A8699 +:10F0E0004886F70D020900686D6163534841323567 +:10F0F0003600484D41432D5348412D323536002AC4 +:10F10000864886F70D020A00686D616353484133F3 +:10F11000383400484D41432D5348412D3338340095 +:10F120002A864886F70D020B00686D6163534841DB +:10F1300035313200484D41432D5348412D35313250 +:10F14000002B0E03021A0069642D736861310060A0 +:10F1500086480165030402040069642D7368613206 +:10F160003234006086480165030402010069642DA1 +:10F170007368613235360060864801650304020217 +:10F180000069642D73686133383400608648016516 +:10F19000030402030069642D736861353132002B6A +:10F1A0000E03020700646573434243002A864886C3 +:10F1B000F70D0307006465732D656465332D636285 +:10F1C00063004445532D454445332D434243002AB3 +:10F1D0008648CE3D030101002A8648CE3D03010743 +:10F1E000002B240303020801010700627261696EAB +:10F1F000706F6F6C3235367231002B2403030208B6 +:10F2000001010B00627261696E706F6F6C3338348C +:10F210007231002B240303020801010D00627261A8 +:10F22000696E706F6F6C3531327231002A86488694 +:10F23000F70D01010100727361456E63727970749C +:10F24000696F6E00525341002A8648CE3D0201008C +:10F2500069642D65635075626C69634B657900471D +:10F26000656E65726963204543206B6579002B816B +:10F2700004010C0069642D65634448004543206B1C +:10F28000657920666F722045434448002A86488687 +:10F29000F70D010105007368612D315769746852DB +:10F2A0005341456E6372797074696F6E00525341B9 +:10F2B00020776974682053484131002A864886F7D0 +:10F2C0000D01010E0073686132323457697468525F +:10F2D0005341456E6372797074696F6E0052534189 +:10F2E0002077697468205348412D323234002A86D1 +:10F2F0004886F70D01010B00736861323536576996 +:10F300007468525341456E6372797074696F6E0010 +:10F310005253412077697468205348412D32353665 +:10F32000002A864886F70D01010C007368613338A6 +:10F330003457697468525341456E637279707469C9 +:10F340006F6E005253412077697468205348412DF5 +:10F35000333834002A864886F70D01010D007368A2 +:10F360006135313257697468525341456E63727921 +:10F370007074696F6E00525341207769746820532E +:10F3800048412D353132002B0E03021D002A8648DC +:10F39000CE3D04010065636473612D776974682D47 +:10F3A00053484131004543445341207769746820F4 +:10F3B00053484131002A8648CE3D0403010065636D +:10F3C0006473612D776974682D534841323234007B +:10F3D0004543445341207769746820534841323291 +:10F3E00034002A8648CE3D040302006563647361DD +:10F3F0002D776974682D53484132353600454344B2 +:10F400005341207769746820534841323536002AC9 +:10F410008648CE3D0403030065636473612D7769FC +:10F4200074682D53484133383400454344534120D8 +:10F430007769746820534841333834002A8648CEAF +:10F440003D0403040065636473612D776974682D5E +:10F450005348413531320045434453412077697464 +:10F460006820534841353132002A864886F70D011D +:10F47000010A005253415353412D50535300616EC2 +:10F4800079506F6C69637900416E7920506F6C69B7 +:10F490006379002B060105050703010069642D6BE4 +:10F4A000702D7365727665724175746800544C53A3 +:10F4B00020576562205365727665722041757468C5 +:10F4C000656E7469636174696F6E002B06010505D2 +:10F4D0000703020069642D6B702D636C69656E749F +:10F4E0004175746800544C532057656220436C6921 +:10F4F000656E742041757468656E746963617469C2 +:10F500006F6E002B060105050703030069642D6B70 +:10F51000702D636F64655369676E696E6700436F32 +:10F520006465205369676E696E67002B06010505E7 +:10F530000703040069642D6B702D656D61696C5063 +:10F54000726F74656374696F6E00452D6D61696CCF +:10F550002050726F74656374696F6E002B0601052D +:10F56000050703080069642D6B702D74696D655380 +:10F5700074616D70696E670054696D6520537461C4 +:10F580006D70696E67002B060105050703090069A8 +:10F59000642D6B702D4F4353505369676E696E67CE +:10F5A000004F435350205369676E696E67002B0606 +:10F5B00001040182E425010069642D6B702D7769D7 +:10F5C00073756E2D66616E2D64657669636500578F +:10F5D000692D53554E20416C6C69616E6365204600 +:10F5E00069656C642041726561204E6574776F7245 +:10F5F0006B202846414E2900551D130069642D6378 +:10F60000652D6261736963436F6E73747261696EB5 +:10F61000747300426173696320436F6E7374726127 +:10F62000696E747300551D0F0069642D63652D6B41 +:10F630006579557361676500551D250069642D6303 +:10F64000652D6578744B65795573616765004578FC +:10F6500074656E646564204B6579205573616765D8 +:10F6600000551D110069642D63652D7375626A650F +:10F670006374416C744E616D65005375626A6563B5 +:10F680007420416C74204E616D650060864801866F +:10F69000F84201010069642D6E65747363617065E1 +:10F6A0002D6365727474797065004E65747363615F +:10F6B000706520436572746966696361746520547E +:10F6C00079706500551D200069642D63652D6365A3 +:10F6D000727469666963617465506F6C69636965AA +:10F6E0007300436572746966696361746520506F65 +:10F6F0006C6963696573005504030069642D617466 +:10F700002D636F6D6D6F6E4E616D6500436F6D6D36 +:10F710006F6E204E616D6500434E00550406006912 +:10F72000642D61742D636F756E7472794E616D65B1 +:10F7300000436F756E747279005504070069642D7B +:10F7400061742D6C6F63616C697479004C6F6361D7 +:10F750006C697479004C005504080069642D61746B +:10F760002D737461746500537461746500535400A3 +:10F7700055040A0069642D61742D6F7267616E69AA +:10F780007A6174696F6E4E616D65004F7267616E6C +:10F79000697A6174696F6E004F0055040B006964EB +:10F7A0002D61742D6F7267616E697A6174696F6E15 +:10F7B000616C556E69744E616D65004F72672055BE +:10F7C0006E6974004F55002A864886F70D010901BD +:10F7D00000656D61696C4164647265737300452DE9 +:10F7E0006D61696C20616464726573730055040512 +:10F7F0000069642D61742D73657269616C4E756D5D +:10F800006265720053657269616C206E756D626528 +:10F8100072005504100069642D61742D706F73744B +:10F82000616C4164647265737300506F7374616CD2 +:10F830002061646472657373005504110069642D5E +:10F8400061742D706F7374616C436F646500506FE9 +:10F850007374616C20636F6465005504040069640F +:10F860002D61742D7375724E616D65005375726EE6 +:10F87000616D6500534E0055042A0069642D617462 +:10F880002D676976656E4E616D6500476976656EB8 +:10F89000206E616D6500474E0055042B0069642D94 +:10F8A00061742D696E697469616C7300496E697465 +:10F8B00069616C730055042C0069642D61742D67B7 +:10F8C000656E65726174696F6E5175616C696669A8 +:10F8D00065720047656E65726174696F6E2071753F +:10F8E000616C69666965720055040C0069642D617C +:10F8F000742D7469746C65005469746C65005504EA +:10F900002E0069642D61742D646E5175616C696699 +:10F910006965720044697374696E677569736865B7 +:10F9200064204E616D65207175616C6966696572F0 +:10F93000005504410069642D61742D707365756410 +:10F940006F6E796D0050736575646F6E796D000927 +:10F9500092268993F22C6401190069642D646F6DFD +:10F9600061696E436F6D706F6E656E7400446F6D8C +:10F9700061696E20636F6D706F6E656E74004443D5 +:10F980000055042D0069642D61742D756E697175C3 +:10F99000654964656E74696669657200556E697162 +:10F9A0007565204964656E746966696572002B81AE +:10F9B000040021002B81040022002B81040023007D +:10F9C0002B8104001F002B81040020002B810400E8 +:10F9D0000A00551D200000009FF1011005000000E5 +:10F9E000A5F101107BF0011021000000ACF1011025 +:10F9F00008000000B5F10110C2F10110250000005F +:10FA000000000000000000000000000000000000F6 +:10FA100000000000CFF101100800000089E501108E +:10FA200089E5011001000000AEF901100500000099 +:10FA300075E5011075E5011002000000D8F1011014 +:10FA40000800000051E5011051E50110030000001D +:10FA5000B4F901100500000037E5011037E5011089 +:10FA600004000000BAF90110050000001DE50110B6 +:10FA70001DE5011005000000C0F90110050000009F +:10FA800093E5011093E501100A000000C6F901108A +:10FA9000050000007FE501107FE501100B0000006C +:10FAA000CCF90110050000005BE501105BE50110D9 +:10FAB0000C000000E1F101100900000065E50110F3 +:10FAC000EBF1011006000000FAF10110090000003E +:10FAD00041E5011004F201100700000013F20110CB +:10FAE0000900000027E501101DF2011008000000C8 +:10FAF0000000000000000000000000000000000006 +:10FB00000000000041F101100500000047F1011064 +:10FB1000B7F00110040000004FF1011009000000CF +:10FB200059F10110E6F201100500000063F1011027 +:10FB3000090000006DF1011019F30110060000002A +:10FB400077F101100900000081F101104CF3011060 +:10FB5000070000008BF101100900000095F1011071 +:10FB60007FF301100800000000000000000000000A +:10FB7000000000000000000000000000A0F00110E4 +:10FB800008000000A9F00110B2F00110040000000C +:10FB9000BDF0011008000000C6F00110D1F0011006 +:10FBA00005000000DEF0011008000000E7F0011081 +:10FBB000F2F0011006000000FFF001100800000044 +:10FBC00008F1011013F101100700000020F10110ED +:10FBD0000800000029F1011034F1011008000000B4 +:10FBE0000000000000000000000000000000000015 +:10FBF000000000002CF201100900000036F2011094 +:10FC000044F201100100000048F20110070000005A +:10FC100050F201105FF20110020000006EF20110BC +:10FC20000500000074F201107CF2011003000000D6 +:10FC300000000000000000000000000000000000C4 +:10FC40000000000010F001100A0000001BF001107D +:10FC50003BF001100425000058F001100A000000DC +:10FC600063F0011083F00110042300000000000085 +:10FC70000000000000000000000000000000000084 +:10FC80004CFD0110ECFC01101CFD0110BCFC01102E +:10FC90007273612E4E007273612E450065636B6551 +:10FCA000792E51005253412D616C740045434453E9 +:10FCB000410045435F444800454300000400000004 +:10FCC000ACFC0110ABA60110D3A60110BDA8011019 +:10FCD00059A8011000000000000000002BA801102E +:10FCE00033A8011049A80110B1A6011002000000BC +:10FCF000B8FC0110ABA601109DA60110E1A80110EF +:10FD000073A8011000000000000000002BA80110E3 +:10FD100015A8011005A80110B1A6011003000000EC +:10FD2000B2FC0110ABA60110C5A601100000000036 +:10FD30000000000000000000000000002BA80110DF +:10FD400015A8011005A80110B1A6011001000000BE +:10FD500044F201100DA701106BA60110B9A7011004 +:10FD600089A7011051A7011019A7011005A70110BB +:10FD7000EBA60110DBA6011079A601102A8648CE59 +:10FD80003D0101002A864886F70D010C0101002A79 +:10FD9000864886F70D01050D002D2D2D2D2D454E84 +:10FDA00044205253412050524956415445204B451E +:10FDB000592D2D2D2D2D002D2D2D2D2D4245474911 +:10FDC0004E205253412050524956415445204B45F4 +:10FDD000592D2D2D2D2D002D2D2D2D2D454E442011 +:10FDE00045432050524956415445204B45592D2DED +:10FDF0002D2D2D002D2D2D2D2D424547494E2045D1 +:10FE0000432050524956415445204B45592D2D2DE4 +:10FE10002D2D002D2D2D2D2D454E4420505249566F +:10FE2000415445204B45592D2D2D2D2D002D2D2D87 +:10FE30002D2D424547494E205052495641544520A8 +:10FE40004B45592D2D2D2D2D002D2D2D2D2D454E74 +:10FE50004420454E4352595054454420505249562F +:10FE6000415445204B45592D2D2D2D2D002D2D2D47 +:10FE70002D2D424547494E20454E43525950544539 +:10FE8000442050524956415445204B45592D2D2D63 +:10FE90002D2D002D2D2D2D2D454E4420525341202A +:10FEA0005055424C4943204B45592D2D2D2D2D00A9 +:10FEB0002D2D2D2D2D424547494E20525341205086 +:10FEC00055424C4943204B45592D2D2D2D2D002DAC +:10FED0002D2D2D2D454E44205055424C4943204B4D +:10FEE00045592D2D2D2D2D002D2D2D2D2D424547E4 +:10FEF000494E205055424C4943204B45592D2D2DFC +:10FF00002D2D0050726F632D547970653A20342C7A +:10FF1000454E43525950544544002A864886F70DB1 +:10FF200001050C007F7F7F7F7F7F7F7F7F7F7F7FCB +:10FF30007F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FD1 +:10FF40007F7F7F7F7F7F7F7F7F7F7F7F7F7F7F3E02 +:10FF50007F7F7F3F3435363738393A3B3C3D7F7FB2 +:10FF60007F407F7F7F000102030405060708090A1E +:10FF70000B0C0D0E0F101112131415161718197FF4 +:10FF80007F7F7F7F7F1A1B1C1D1E1F2021222324A1 +:10FF900025262728292A2B2C2D2E2F303132337F4E +:10FFA0007F7F7F7F00000000000000000000000055 +:10FFB0000000000000000000000000000000000041 +:10FFC000F0B50125B5B024AE14AF8021012009069B +:10FFD0004042E5F7FFFDC30618D4830624D5202050 +:10FFE00008A9E5F7F9FD089C002C1EDAA31C57DBD5 +:10FFF000099B002118000093E5F7F4FD8021012002 +:020000041002E8 +:1000000009064042E5F7E6FDC306E6D531001020BB +:10001000E5F7E2FD3368002B44DA02334EDB0021C2 +:100020007068E5F7DFFDD0E7FEE7002C39D1082244 +:10003000002104A8E0F7B8FB0822002106A8E0F799 +:10004000B3FB3C22002115A83C60E0F7ADFB3C224D +:10005000002125A83460E0F7A7FB0F9B03940093D1 +:10006000002B2CD10E9B0093002B28D10D9B0093CD +:10007000002B49D10C9B2C005A1E9341139ADBB2E2 +:1000800000920099129A11430192119A0092114321 +:1000900001D1002B19D121000998E5F7A3FD94E7C0 +:1000A000FEE7FDE7002B08D1E1F71AFC2900041E4A +:1000B00007D07068E5F796FD87E7FEE7FDE72C00BF +:1000C000E9E707F045FA2100F3E70423099803AABA +:1000D000109CE5F783FD0021042812D1002C35D0B7 +:1000E000109B402B0DD806AA03980793069607F09D +:1000F0003DFA00210400079B069A0998E5F770FD78 +:10010000C9E781246442C6E7139B00930099129BC0 +:1001100019430193119B00931943D0D104230998EB +:1001200003AA109CE5F75AFD0428EAD10D9B402B49 +:10013000E7D83A0029000998E5F750FD0D9B009398 +:100140009842DED10497059004A9C7E722000398DE +:1001500007F00CFA04009EE7000000000000000019 +:1001600030B5184C0569A54414AB0293036A04AA80 +:100170000400009201950393402D20D88168124B12 +:10018000406819602B000021E5F728FD854213D156 +:1001900001230121684602AA00F014FB051E04D0C9 +:1001A0002800A9239B009D4430BD0021039B029A97 +:1001B0006068E5F715FDF3E784256D42F0E78725D4 +:1001C0006D42EDE75CFDFFFF50570208F0B5C646F3 +:1001D00000B5A8B000F0E2FA00281CD141275A4E21 +:1001E00017AC8021012009064042E5F7F3FCC30665 +:1001F0003DD4830654D443060ED540200BA9E5F721 +:10020000EBFC0B9B002B08DA023348DB00210C9837 +:10021000E5F7E8FCE5E7FEE7FEE7002B6ED103AB70 +:1002200007930223089304AB099304230A93149BB6 +:10023000059498460697022B76D1159B0193042BC3 +:1002400072D100210D9B05AA01933360080003239E +:1002500000F024FB139A049B050001929A4270D38C +:1002600000284FD029000C98E5F7BCFCB9E7210025 +:100270001020E5F7B1FC2368002B06DA02333EDBE1 +:1002800000216068E5F7AEFCABE7002B38D1200019 +:10029000FFF766FF01006068E5F7A4FCA1E7FEE751 +:1002A00021002020E5F798FC2168002902DA8B1C48 +:1002B000E6DAFEE7002924D103AB059304AB2269FB +:1002C0000B93236A06920C93042A30D1042B2ED16F +:1002D000A2686068326003AAE5F780FC236998424F +:1002E00025D101230BAA190005A800F0A7FA051EC5 +:1002F00020D029006068E5F775FC72E7CFE7FEE7DC +:10030000FDE7D6E7220001000C98E5F769FC089BA1 +:100310000C9803AA0121E5F763FC41460A9B0C985F +:1003200004AAE5F75DFC9DE787256D429AE78725DE +:100330006D42DEE701000C9B0B9A6068E5F750FC0C +:10034000D7E78A256D428DE750570208F0B5DE46A3 +:1003500057464E464546E0B5D3B006000C009246DF +:1003600000F0E4FA051E09D000F040FB280053B06D +:100370003CBC90469946A246AB46F0BD07230022FE +:10038000002100945B4216A800F062FB002804D014 +:1003900002250128E8D00525E6E73200C44916A861 +:1003A00000F0AEFB0BAB1800082200219946E0F7E5 +:1003B000FBF9C04B0DAE9B461B8800241F003F235A +:1003C000350098463000BC4B9F4227D15B465E8883 +:1003D0005E44002C00D158E121000422E0F7C8F966 +:1003E00028006B88E418A64204D817E06B88E4184C +:1003F000A64213D904222100E0F7BAF941462B881E +:1004000028009A111142F1D16A881942DBD14B467A +:100410000434043A2E000B945A600BE006000100ED +:10042000202006F03FFD002800D02CE120234A4682 +:100430000B9653604A46A14916A800F061FB0023C1 +:100440000A9304AB0A229C4609A9624408A800F05A +:10045000E9FA002800D016E199490AA8E1F744FF1B +:10046000002800D00FE1099A08990AA8E1F76AFF6D +:10047000002800D007E104A884462521202207ABEC +:1004800061440AA8E1F78EFF002800D0FBE00123B9 +:100490004A463370079B8B49013316A80793536074 +:1004A0000B9600F02DFB202331000AA80A9306F0DA +:1004B00009FD002800D0E6E04B460A9A82495A60BE +:1004C00016A84A460B9600F01BFB300000F0B8FE61 +:1004D000051E00D048E70D9B0D9ADB177B4916A837 +:1004E00000F000FB5B461B88002403933F239846E3 +:1004F000039B1A00704B9A4200D1C8E007F018F82D +:100500000200C023DB019A4200D944E7002370496E +:1005100016A800F0E7FA16A800F0E2FA01239846C0 +:10052000534604934B46AA46039005935B46624AA2 +:100530001B88934200D0A6E05B465D883F23654C54 +:100540005D4499460DAFA54225D930002E004546A1 +:1005500004E07B88E418A64200D8E7E004222100EA +:10056000E0F706F94A463B8838009B111340AB423E +:10057000EFD101239C46E2445346A8463E007D88C5 +:10058000012B00D1F8E0221D2B1F092103980D92A9 +:100590000E9300F07BFB01239C46E0444346072B6F +:1005A000C4D15546049B9A46059B9946002D00D11F +:1005B000D9E000220421039800F074FC484606F0BC +:1005C000BBFF0D90002806D00B9B3200424916A8B5 +:1005D000736000F0A7FA484606F0B4FF0D900028BB +:1005E00006D00B9B32003D4916A8736000F09AFAC2 +:1005F00012230822002148460A93E0F7D5F83F234A +:100600000025984630005B462B4A1B88934200D059 +:100610009DE05B465E885E44002D00D1AAE0290083 +:100620000422E0F7A5F80DA84388ED18AE4200D8E3 +:100630008DE00DAC04E06388ED18AE4200D886E092 +:1006400004222900E0F794F84146238820009A11FB +:100650001142F0D162880B40012BD4D14B460435B6 +:10066000043A0B955A601E4916A84A4600F05AFAF9 +:10067000514616A800F068FA002800D088E600F07D +:10068000B5F9050072E603256EE61C1DABE65B4678 +:100690005F885F44002C47D0210030000422E0F73F +:1006A00067F804ABDB8C0DAEE418A7421FD825E732 +:1006B00000DBFEFF005502081620000004DBFEFFF1 +:1006C00009000001FFDAFEFF05DBFEFF07DBFEFF8E +:1006D00006DBFEFF04550208FEDAFEFF08DBFEFF24 +:1006E00003DBFEFF7388E418A74200D806E7042264 +:1006F00021003000E0F73CF8414633889A1111425E +:10070000F0D172880B40022B00D0F1E6211D131F9F +:10071000062A13D0042B0CD0012B00D03BE6237902 +:100720000D930D9B9AB2ECE61C1DBEE7A8463E0059 +:1007300031E704223000E0F71BF8F2E748460222D6 +:10074000E0F716F80BAB99461B880D93E9E7060016 +:1007500001000AA806F0C8FB002894D14B460A9A6B +:100760000B965A607FE701220023094916A800F082 +:10077000B9F923E7074D59E70123039F064A3800DB +:100780005B4200F021FA0421380000F063FBFAE636 +:1007900001DBFEFF0455020802DBFEFF802210B5DC +:1007A00001200649920000F053FD052803D8044BB0 +:1007B0008000C05810BD84204042FBE7005502086D +:1007C0005C120210030010B55968136886B0006807 +:1007D000029353681400009001910393402908D0BC +:1007E00010230A009A43202A03D08720404206B0F3 +:1007F00010BD012200F022FD002808D10399002934 +:10080000F3D00222029800F019FD002804D0052838 +:100810000ED984204042EAE7684604AA02A9FFF7FD +:1008200095FD0028F3D1049B2360059B6360DEE700 +:10083000014B8000C058DAE75C120210002110B5AD +:10084000036886B01B6814680091029152681149D0 +:1008500001930391032A05D9402B07D0102293431B +:10086000202B03D08720404206B010BD684604AA62 +:1008700002A9FFF76BFD002802D1059B2360F3E777 +:10088000052802D984204042EEE7034B8000C0587F +:10089000EAE7C046FFFFFF7F5C12021070B514004C +:1008A00084B0002901D1032B03D08720404204B03B +:1008B00070BDD368022BF8D15369042BF5D11668AB +:1008C000556830000222290000F0B8FC002804D04E +:1008D000052821D984204042E9E70222E168A06886 +:1008E00000F0ACFC0028F3D16B4603A99A1D02A8C6 +:1008F00000F098F80028EBD1039A954210D330000D +:100900000299DFF735FF6B46A268DB880020138071 +:100910002369039A1A60CAE7034B8000C058C6E7F0 +:100920008A204042C3E7C0465C12021030B5ABB02B +:100930001822002103A8DFF737FF002302AA538003 +:100940000021242209A8DFF72FFF224D2B88002B3E +:1009500039D1602102AB03AA12A806F033FE041EAF +:1009600031D1039900292ED08023DB000C931A4B40 +:100970001A480D9302AB1B881843109B0193002B60 +:1009800025D001000023002209A8E2F793FA039979 +:1009900002AB049A023309A8E1F71AFA002812D12F +:1009A00002AB58880E4B28801A68002A0CD10D49DA +:1009B0004132E1F7C7FA002805D102AB1A880A4B89 +:1009C00000241A8000E0052420002BB030BD0990DF +:1009D000DEE7C04606570208090006100000037053 +:1009E0004C570208085702080457020810B5064C75 +:1009F0002088002805D0E1F71DFA002801D12080C9 +:100A000010BD0520FCE7C04606570208044B1B88B2 +:100A1000002B02D00380002070470520FCE7C04671 +:100A200006570208074B10B51B68002B07D0064C71 +:100A3000046000200B60054B1B88138010BD05204F +:100A4000FCE7C0464C570208085702080457020842 +:100A5000F0B51F0006009823A036C1500433C250E1 +:100A600083B00D000400502200213000DFF79CFE0F +:100A700080235B0273646B46ED0F3762B563981D8C +:100A8000FFF7C4FF002826D16B46DA88DC23022753 +:100A9000E0500433E050183BE7542300D033586053 +:100AA0001A60089B200006CB00F078F82100300087 +:100AB00000F0C2FA051E07D003280ED0193D681EAB +:100AC00085416D423D4001350521200000F0C2F90D +:100AD000280003B0F0BD0E25FAE70425F4E7C04670 +:100AE0007047C04670B516001D0004000A00CB1701 +:100AF00000F06AF832002B00200000F065F870BDAD +:100B000070B504001668556882B00A00CB1700F073 +:100B10005BF82B0032000221200000F0B7F802B091 +:100B200070BDC04670B504001668556882B00A00F2 +:100B3000CB1700F049F82B0032000321200000F011 +:100B4000A5F802B070BDC04670B5040082B00D00BB +:100B50000022052100F0A6F920002100A03000F0BD +:100B6000E3FA00280AD0032814D01938431E98410C +:100B7000022340421840013002B070BD6E46200092 +:100B8000310000F039FA0128F6D0002804D10CCE4B +:100B90000CC5F1E70420EFE70220EDE710B50400F3 +:100BA00082B00091019200219822DFF7FDFD019AA9 +:100BB000200000990EF078FA220094231432E250BB +:100BC000903BA37602B010BDF0B54E46DE465746C8 +:100BD0004546E0B5017C89B00600019100293FD16E +:100BE000002B44DB1C0000239946B36802A98C4605 +:100BF0009846152363449C461900002C01D1172AFE +:100C000018D92048002382465046C05C002833D0C3 +:100C10000D00013D27062A70120A3A43240A4F1B91 +:100C2000B842F6DC1500091A2543581C002D24D1C2 +:100C300018331A00634601394A440A7030005A1AC0 +:100C40004346039104920EF03FFA9423F1580E4A62 +:100C50008B88D21A012A12DD01338B80019B3374F9 +:100C600009B03CBC90469946A246AB46F0BDDC4379 +:100C70002023D2439946B8E7581C0300C4E7032356 +:100C80000193EBE774120210FEFF0000F0B5574627 +:100C90004546DE464E46E0B58BB002920393037C98 +:100CA00002AF04000D009846002B47D1092930D02F +:100CB00003990B2D49D083689A469F230C2D0BD1A5 +:100CC00007AD2B72012309A9069301225346200088 +:100CD00005910EF0F9F91DE020330D2DF0D00A003A +:100CE000002617296AD86B01DBB25B1802A98C4673 +:100CF0001D2262441100DBB2019201390B70019B8D +:100D000020005A1A5346059106920EF0DDF90B2D7C +:100D100009D007AD3B0006CB06C52000A3680799A4 +:100D20007A680EF0D1F99423E1582A4A8B88D21AB6 +:100D3000012A40DD01338B80434623740BB03CBC59 +:100D400090469946A246AB46F0BD83680A009A4693 +:100D5000002640231729C8D9009302A98C461D23D9 +:100D600063441900019300239C461B4BA9469B46F4 +:100D70006546A4465B46585D002819D00B00013B30 +:100D800034061A70120A2243360ACC1AA042F6DC44 +:100D90001300091A3343681C002B0AD16446AC4681 +:100DA000009A63469446183363444D46DBB2A4E789 +:100DB000681C0500DEE703239846BDE7072D05D133 +:100DC000E02300931F29C8D1FF2379E76B01DBB231 +:100DD000C2E7C046FEFF000074120210F0B5D6460E +:100DE0004F4646461C008368C0B59A46152386B018 +:100DF0006B449C461900002C01D1172A17D9144BBB +:100E0000002699464D46AF5D002F1ED00D00013DD6 +:100E100023062A70120A1A43240A4B1B9F42F6DC4F +:100E2000C91B1700751C274310D1320018326346C6 +:100E30000139403A0A705A1A53460EF045F906B085 +:100E40001CBC90469946A246F0BD751C2E00D9E701 +:100E50007412021070B594254459114AA388D21A0D +:100E6000012A17DD0133A380836800221E0002746B +:100E7000663602D90723037470BD06008C36B4426F +:100E80000BD0260008364651A3600023A281A1732F +:100E90000374F1E703230374EEE702230374EBE723 +:100EA000FEFF0000F0B54546DE4657464E46E0B52B +:100EB000037C0400150089B0002B0BD10200943391 +:100EC000C358143293420CD09A79914691420BD078 +:100ED0000F23037409B03CBC90469946A246AB462A +:100EE000F0BD04230374F5E71A680192826848464E +:100EF000022867D04A469888052A6ED09F230C297D +:100F000027D102A98C46152262449246110001396C +:100F10000B705346019E5A1A200033000EF0D4F88D +:100F2000002D0AD0210005A80EF004F9069B059AB1 +:100F30009E4207D90027002284C59422A358083B6B +:100F4000A350C7E70199002A01D08C4662445F1A7A +:100F5000F2E7BF230D29D4D0020003000026172892 +:100F600036D94A46072A01D11F2840D0002B36D057 +:100F700002A98C4615226244924611000022904636 +:100F80001C4A93465A464046175C002F17D008006B +:100F90000138320603701B0A1343360A0A1A9742B5 +:100FA000F6DC4246501C1A00C91B324308D14346A6 +:100FB0001833DBB24A4652019B18DBB2A7E7013077 +:100FC0008046DFE7019B0026D21A1300172ACDD8EE +:100FD0004B465B019B18DBB293E74008BCE702A9D4 +:100FE0008C4615226244172392461100E2E7FF2344 +:100FF00087E7C0467412021070B5837B0D0082B083 +:10100000002B05D0012301240374200002B070BD21 +:10101000047C002CF9D19423C258030014339A4263 +:1010200001D00A24F1E76E46010030000EF082F88C +:101030000CCE0CC5E9E7C046F0B50400ABB0006AC1 +:101040000D000CF0EFF8002868D0A36B9B075FD56C +:1010500004212800FFF7FEFE1822210004A8266ABA +:10106000FFF79CFD052104A8FFF7F4FE01220023F1 +:1010700004A8FFF7A9FDF317320004A8FFF7A4FDA9 +:101080000022052104A8FFF70DFF02A904A8FFF71D +:10109000B3FF061E35D1029B039AA361E261002BC8 +:1010A00040D021000822183104A8DFF761FB059B1E +:1010B00002212800049AFFF7E9FDA36BDB072FD478 +:1010C000E76B246C05212800FFF7C4FE002C0ED02E +:1010D000002F0CD0042200232800FFF775FD3A00F2 +:1010E00023000221280004970594FFF7CFFD280074 +:1010F00000220521FFF7D6FE02212800FFF7AAFEF5 +:1011000003E000230226A361E36130002BB0F0BDB1 +:10111000122200232800FFF761FE99E70126F4E779 +:101120001C26F2E70226F0E7F0B557464546DE46B4 +:101130004E46E0B5ADB00CAB98461CAB42460C93A6 +:1011400040230C00536014AB0E93202310AE050017 +:101150003200022120000F93FFF7A4FEA37B0EAF05 +:10116000002B0AD001231926237430002DB03CBC7B +:1011700090469946A246AB46F0BD237C012B5AD03F +:10118000002B3BD12368002B26D008AB04939A4652 +:1011900002AB994606CF06C36B4606CE06C30023B4 +:1011A000A969EA69286A0CF045F8061EDDD1AB6B27 +:1011B000DB0725D50AAF3900082212A8DFF7D8FAD5 +:1011C0002000129A0221139BFFF760FD00220421E8 +:1011D0002000FFF767FEC8E729002E6A08220A935D +:1011E00030310BAB68460293DFF7C2FA3000AA6ACF +:1011F000EB6A0CF0D5FB0AAF0600DCE71826B4E773 +:1012000042462B6A0AAF06979B4604AB03CA03C348 +:101210004B46524603CA03C32900082268463031B0 +:10122000DFF7A6FA5846AA6AEB6A0CF07FFB0028A3 +:10123000C1D0060099E7192697E7C04600207047FD +:10124000024B1B68036000207047C04650570208DD +:1012500010B5E0F747FB431E984110BD00000000A9 +:1012600070FFFFFF76FFFFFF7CFFFFFF79FFFFFFAF +:101270007CFFFFFF010102040000000000000000ED +:10128000F0B557464546DE464E4601230822E0B5F6 +:10129000B54DC9B002AF2B60BA18CF33D418802136 +:1012A000012009064042E4F795FCC30616D521004B +:1012B0001020E4F791FC0028F1D12168002941DADF +:1012C0008B1CECDB00216068E4F78CFC80210120A2 +:1012D00009064042E4F77EFCC306E8D4830639D40D +:1012E00043064BD4030659D480235B0018425CD1DB +:1012F00080239B00184266D18023DB00184200D077 +:10130000A2E080231B01184200D096E080235B01FD +:10131000184200D091E0830400D579E28023DB01FC +:10132000184200D07DE280231B021842B7D0210072 +:101330001800E4F751FC0028B1D123680233022BD6 +:10134000C0D9ACE70029AAD12B68002BBBD10C2156 +:101350004942B8E721002020E4F73EFC00289ED156 +:101360002368002B02DA0233ACDA98E7002B96D11F +:10137000032160684942E4F735FC90E721004020F2 +:10138000E4F72AFC00288AD12368002BEBDB86D106 +:101390000D2160684942E4F725FC80E721008020A8 +:1013A000E4F71AFC0028EFD079E721001800E4F7F1 +:1013B00013FC002800D072E72668002E1BDAB31C4D +:1013C00000DB7FE76BE708212022791818008918D5 +:1013D000E4F702FC002800D061E7BB6A002B00DBC9 +:1013E000D0E0023300DA5AE7FB6A002118007B6084 +:1013F000E4F7F8FB53E7002E00D050E701215B48EB +:10140000E4F7D8FB8046002800DC2CE20023002211 +:10141000002101960096E4F7CFFB8146031E40466B +:1014200000DA06E2E4F7D4FB4B46012B00D01AE2C7 +:1014300031006068E4F7D6FB31E721001800E4F7DB +:10144000CBFB0028A0D02AE721001800E4F7C4FB5A +:10145000002800D023E72368002B84DB00D01EE7A0 +:1014600008260820B4469021414A3B18BC445B182A +:101470006144B4460A6094213E4ABC446144B44687 +:101480000A6098213C4ABC446144B4460A609C21ED +:101490003A4ABC4461440A6008218C469522BB62EA +:1014A0000523BC4462443A630B226146FB62FB6540 +:1014B00010237A6395328918B9653966304801215D +:1014C0007B66E4F777FB804600284ADD082202238A +:1014D000944608210193BC444E3363448C46183231 +:1014E000BC440093002102236244E4F765FB061E1E +:1014F000404600DAAEE1E4F76BFB002E31D1FB6A27 +:10150000FA6D5B087A609A422BD17B6B7A6E5B082E +:101510007A609A4225D1082084469122BB6DBC4452 +:1015200062441978127891421BD108218C465A786E +:101530009323BC4463441B789A4212D1844696227A +:101540003B6EBC44624419781278914209D108215B +:101550008C469822BC44624412785B789A4200D14F +:1015600066E70326764263E70062020840F0000067 +:1015700000010203040101020305080D1522375979 +:1015800042F00000002B00D089E6082050263B18CE +:10159000402200219819DFF707F908209023381816 +:1015A000C01840220021DFF7FFF8BB6B402B00D9A9 +:1015B00055E1FA6B042A00D051E1BA6C402A00D9F7 +:1015C0004DE1FA6A7A600822B9188A197868002110 +:1015D000E4F704FBBB6B984200D040E10822FB6AB1 +:1015E00001217B6078680423BA18E4F7F7FA814692 +:1015F000042800D033E1BE68402E00D92FE14022FC +:1016000000212000DFF7D0F86A46B3009A4607337E +:10161000DB08DB00D31AEB469D4602AB98463B61E4 +:1016200053467B614346BB615346FB610C23FB1869 +:101630003B624B467B62102E00D917E1002E0CD086 +:101640000821502379185246C9182000DFF790F876 +:10165000524621004046DFF78BF801218648E4F727 +:10166000A9FA7860002800DCEFE008220223944603 +:1016700008210193BC440E3363448C46BC44009360 +:101680000021012362447860E4F796FA8146031E44 +:10169000786800DAD7E0E4F79BFA4B46002B00D0DD +:1016A000D3E0002E00D19EE043461A682368DB4356 +:1016B0009A4200D0C2E02260012E00D18BE0424667 +:1016C00063685268DB43934200D0B7E06360022E48 +:1016D00000D180E043469A68A368DB439A4200D079 +:1016E000ACE0A260032E76D04246E368D268DB43CA +:1016F000934200D0A2E0E360042E6CD042462369FE +:101700001269DB43934200D098E02361052E62D03A +:1017100043465A696369DB439A4200D08EE06261B6 +:10172000062E58D04246A3699269DB43934200D00B +:1017300084E0A361072E4ED04246E369D269DB43C1 +:1017400093427BD1E361082E45D043461A6A236A4F +:10175000DB439A4272D12262092E3CD04246636A30 +:10176000526ADB43934269D163620A2E33D0424608 +:10177000A36A926ADB43934260D1A3620B2E2AD004 +:101780004246E36AD26ADB43934257D1E3620C2EAE +:1017900021D043461A6B236BDB439A424ED122631E +:1017A0000D2E18D04246636B526BDB43934245D1FA +:1017B00063630E2E0FD04246A36B926BDB439342C2 +:1017C0003CD1A3630F2E06D04346DA6BE36BDB43B9 +:1017D0009A4233D1E2630820902338185246210000 +:1017E000C018DEF7C5FF0821FA6A8C467A6090229D +:1017F000BB68BC44DD46002178689B006244E4F786 +:10180000EFF9FB6A494618007B60E4F7EBF946E51F +:10181000802021008001E4F7DFF9002800D1B3E542 +:101820003DE521001800E4F7D7F9002800D197E53D +:1018300035E50826E4F7CCF97642F9E507235B4263 +:10184000DD469946DDE7E4F7C3F908235B42DD4650 +:101850009946D6E70326E4F7BBF97642E8E501238B +:101860005B429946CDE708267642E1E503235B42D9 +:10187000DD469946C5E7C04643F000000000000081 +:1018800010B58EB0802110200906E4F7A3F91020CE +:1018900002A9E4F7A1F9029B002B08DA0233F1DB7D +:1018A000039B002118000193E4F79CF9EAE7002B61 +:1018B000E8D1039C00F0D2FB00212000E4F792F96C +:1018C000E0E7C046F8B5CE46474680B507000E00B3 +:1018D000032000F049F939002A48E3F72FFB336869 +:1018E000002B0FD0350003E06B691435002B09D0B5 +:1018F000280000F07FF8041EF6D020000CBC9046B3 +:101900009946F8BD032000F02FF939001E48E3F78F +:1019100015FB33680024002B18D01C4B1C4D994636 +:101920001C4B9846072000F01FF92800F168E3F7E8 +:1019300005FB337C002B11D1022000F015F9143681 +:101940004046E3F7FBFA3368002BEBD1032000F0AD +:101950000BF939001048E3F7F1FACEE7012000F067 +:1019600003F914364846E3F7E9FA33680324002BF9 +:10197000D8D1032000F0F8F839000748E3F7DEFA81 +:10198000BBE7C046781B0210AC1B0210F41B021010 +:10199000D01B0210E81B0210001C021010B5002B17 +:1019A00004D0D860002059609A6010BD012000F07A +:1019B000DBF803490348E3F7C1FA0120F5E7C04625 +:1019C000241C0210441C021010B5002B05D0012469 +:1019D00058601C709960DA6010BD012000F0C4F8F6 +:1019E00002490348E3F7AAFAF6E7C046541C02107E +:1019F000441C0210F0B5D6464F4646460500C0B519 +:101A0000002809D00368002B06D09847EB68002B0C +:101A100002D0AB68002B0CD1012000F0A5F845499D +:101A20004548E3F78BFA01201CBC90469946A24634 +:101A3000F0BD032000F098F8E9684048E3F77EFA2B +:101A4000AB686C68002B6BD0002398463C4B00269B +:101A500099463C4B3C4F9A460AE0022000F084F83D +:101A60004846E3F76BFAAB6801361C34B34231D910 +:101A70002368002B4BD06368002B48D0072000F070 +:101A800073F8A26861683800E3F758FA0023200071 +:101A900023730C3023689847237B012BDDD1012071 +:101AA00000F062F82169002929D02848E3F746FAB6 +:101AB0006169002903D0A2692548E3F73FFA50463F +:101AC000E3F73CFA01239C46AB680136E0441C3442 +:101AD000B342CDD84346002B22D0012000F044F879 +:101AE0001C48E3F72BFA032000F03EF84146AA68B1 +:101AF0001948E3F723FA012300202B7494E7616966 +:101B00000029DCD0A2691548E3F718FAD7E70120CD +:101B100000F02AF812490848E3F710FA022083E798 +:101B2000022000F021F80F48E3F708FA0023002014 +:101B30002B7479E7241C0210441C0210781C02103C +:101B4000081D0210F41C0210941C0210C01C02108C +:101B5000C81C0210301D0210441D0210E01C0210AF +:101B6000541C02101C1D021010B501000148E3F7BF +:101B7000E5F910BD681D02100D0A2323232320451B +:101B80007865637574652074657374207375697402 +:101B9000657320666F7220746865202573206172FA +:101BA000656120232323230D0A0000000D0A2A2A41 +:101BB0002A202573207465737420737569746573A6 +:101BC0002073756D6D617279202A2A2A0D0A000032 +:101BD00054657374207375697465202725732720F5 +:101BE0006861732000000000205041535345440DAC +:101BF0000A000000204641494C45440D0A000000FF +:101C00000D0A2A2A2A20456E64206F66202573203B +:101C10007465737420737569746573202A2A2A0D9C +:101C20000A000000544553545F53554954455F45DD +:101C300052525F494E56414C49445F444154412100 +:101C4000000000004572726F722028202573202941 +:101C50000D0A0000544553545F53554954455F45A0 +:101C600052525F494E56414C49445F544553545F6C +:101C7000444154412100000052756E6E696E672028 +:101C8000546573742053756974652025732E2E2E48 +:101C90000D0A00003E20457865637574696E672003 +:101CA00027257327200D0A2020446573637269700D +:101CB00074696F6E3A20272573270D0A0000000013 +:101CC000202025730000000020284661696C6564AF +:101CD0002061742025733A2564290D0A0000000054 +:101CE00020204661696C65642061742025733A2563 +:101CF000640D0A00202054455354204641494C4568 +:101D000044210D0A00000000202054455354205067 +:101D10004153534544210D0A0000000054455354DB +:101D2000535549544520504153534544210D0A0011 +:101D3000544553545355495445204641494C454414 +:101D4000210D0A004E756D626572206F6620666116 +:101D5000696C65642074657374733A202564206F20 +:101D6000662025640D0A00001B5B3325646D0000AE +:101D700070B5094E82B0736901939847002809D164 +:101D80000124F56AA8470442FCD1336A01939847BD +:101D900002B070BD0020FBE72420021030B50B4CD0 +:101DA00083B06369080011000193984700280BD1A4 +:101DB0000125E36A0193019B98470542FBD1236A01 +:101DC0000193984703B030BD0020FBE724200210A8 +:101DD00010B5084C0020A368984723690220984753 +:101DE000E121A46A49020120A04701211520A04752 +:101DF00010BDC04624200210044B82B01B681A0C90 +:101E000018041204000C104302B070472020021086 +:101E100001207047012801D900207047042040426A +:101E2000FBE7C046042040427047C046014B58685B +:101E30007047C04600660208014B98687047C0466C +:101E400000660208002382B00193019802B0704737 +:101E5000042040427047C046002382B0019301989D +:101E600002B0704770B50C0000280AD0002908D0D5 +:101E7000054D0A000100286803F07CFE0020AC60DC +:101E800070BD05204042FBE70066020810B5054C16 +:101E90000021206804F03CF8206804F007F80020D6 +:101EA00010BDC04600660208FF2370B50340040061 +:101EB000012B12D1244D0021286804F029F8E023D9 +:101EC000A022DB002340D20093420DD008D9C023CA +:101ED0002200DB001A409A4206D00420404270BD26 +:101EE000C023DB001C42F8D1C02380229B01234089 +:101EF0009201934201D01442EFD1C02380221B02F1 +:101F000023401202934201D01442E6D1C122802123 +:101F10002B689200985849020843985098580B4CE7 +:101F2000204098509A588122920098580143995025 +:101F300099580020214099509A5880221968120619 +:101F40000A431A60CBE7C04600660208FFFFFEFFA7 +:101F500070B50C00002817D0002915D00C4D0A00D0 +:101F60000100286803F04AFE8221012628688900C2 +:101F700042584358D205DB0B3340D20D9B18002B3F +:101F8000F6D100206C6070BD05204042FBE7C046E2 +:101F90000066020870B51D4D90B0E86040221C49F3 +:101FA0006846DEF7E5FB00226946286803F07EFEFE +:101FB000C12280212B6892009D5849020D439D50FB +:101FC0009D58144E35409D509A58812292009D583C +:101FD000294399509958314099509A58002808D16E +:101FE00080220024196812060A431A60200010B0EB +:101FF00070BD094B9842F9D8084B984203D8F5D1E7 +:1020000005246442F2E702246442EFE70066020816 +:10201000C8030310FFFFFEFF0360AA000160AA00CF +:1020200003020202F91D0210111E0210951F021078 +:102030008D1E0210151E0210511F0210651E021087 +:10204000251E02102D1E0210391E0210A91E02109C +:10205000451E0210511E0210591E021010B50249F1 +:102060000248FFF72FFC10BD106602087020021016 +:10207000536563757265000070B584B003AB00935F +:102080008023134E134D04003200212128009B00B1 +:10209000DFF768FC873007D02300A5220E490F48E0 +:1020A000FFF792FC04B070BD03AB00933200102325 +:1020B00040212800DFF756FC8A3002D1002323702C +:1020C000F0E72300B22204490548FFF77DFCE9E769 +:1020D000006702089023021030210210F021021044 +:1020E0002822021010B504000AF03CFC002801D19F +:1020F000207010BD01000548E2F720FF2300882270 +:1021000003490448FFF760FCF3E7C0465C22021075 +:10211000302102108422021010B50300022202496D +:102120000248FFF73BFC10BDC4660208B82202104B +:102130002F686F6D652F6A6165616D6530312F4362 +:102140006F64652F6D6265642D6F732D74662D6DE0 +:102150002D72656772657373696F6E2D7465737424 +:10216000732F6D6265642D6F732F66656174757270 +:1021700065732F464541545552455F5053412F5486 +:1021800041524745545F54464D2F544152474554A0 +:102190005F49474E4F52452F747275737465642DB5 +:1021A0006669726D776172652D6D2F746573742F1A +:1021B0007375697465732F61747465737461746980 +:1021C0006F6E2F7365637572652F617474657374B8 +:1021D0006174696F6E5F735F696E74657266616367 +:1021E000655F7465737473756974652E63000000B0 +:1021F0004174746573746174696F6E2073686F7570 +:102200006C64206661696C207769746820746F6FF4 +:1022100020626967206368616C6C656E6765206F1A +:10222000626A65637400000041747465737461745C +:10223000696F6E2073686F756C64206661696C20CD +:102240007769746820746F6F20736D616C6C207493 +:102250006F6B656E20627566666572006465636F9C +:1022600064655F746573745F6E6F726D616C5F73CC +:10227000696728292072657475726E65643A202535 +:10228000640D0A0041747465737420746F6B656E1D +:10229000206465636F64655F746573745F6E6F72ED +:1022A0006D616C5F736967282920686173206661BE +:1022B000696C656400000000496E697469616C2096 +:1022C0004174746573746174696F6E2053657276BE +:1022D0006963652073656375726520696E746572E4 +:1022E000666163652074657374732854464D5F415D +:1022F00054544553545F544553545F3158585829EA +:102300000000000054464D5F4154544553545F54FF +:102310004553545F3130303400000000454344538E +:1023200041207369676E617475726520746573749A +:10233000206F662061747465737420746F6B656EB2 +:102340000000000054464D5F4154544553545F54BF +:102350004553545F31303035000000004E656761F1 +:102360007469766520746573742063617365732086 +:10237000666F7220696E697469616C20617474653E +:1023800073746174696F6E2073657276696365003A +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E000704BF0B5D6469A4601234F4646465B42AF +:1023F0009946813B9846C0B56B4C9EB00AAD802192 +:10240000012009064042E3F7E5FB102606422AD1E7 +:10241000202606421AD18026760030420BD03000AA +:1024200012A9E3F7D9FB129B5A1C05D0002B32D01E +:10243000023364D0FEE7FEE7236841461A003240CB +:10244000334258D01398E3F7CDFBD8E7202012A9E8 +:10245000E3F7C2FB129B5A1CEED0002B00D18DE09B +:10246000023340D0FEE72B00524683CA83C383CA9F +:1024700083C3116810201960928812A99A800023E2 +:10248000EB83E3F7A9FB129B5A1CD5D0002B05D098 +:10249000023328D0FEE781214942D3E7169B0193FE +:1024A000002B32D11A9B0193002B60D1179B019313 +:1024B000002B55D11B9B0193002B4AD1189B0193F4 +:1024C000002B3FD11C9B0193002B34D1199B01930E +:1024D000002B29D11D9B0193002B1DD100211398A6 +:1024E000E3F780FB8BE723680021B3432360139855 +:1024F000E3F778FB83E71E4311002660A2E722681A +:102500002A4B002113402360E9E720230021139880 +:1025100002AAE3F763FBC5E7032120232A001398EF +:10252000E3F75EFB0021DAE720230321139802AAD8 +:10253000E3F754FBCEE720232A0002211398E3F7A8 +:102540004FFBC3E720230221139802AAE3F746FBBF +:10255000B8E720232A0001211398E3F741FBADE7F8 +:1025600020230121139802AAE3F738FBA2E72023D6 +:102570002A0000211398E3F733FB97E7169B01939A +:10258000002BABD004232A0000211398E3F726FB8D +:102590000A9B1A78412A03D1422200211A709EE731 +:1025A00049464FE7B025021000760208FFFEFFFF04 +:1025B0004974206973206A75737420666F722049AC +:1025C00050432063616C6C20746573742E000000AE +:1025D00000000000000000000000000000000000FB +:1025E00010B58EB0802110200906E3F7F3FA102011 +:1025F00002A9E3F7F1FA029B002B08DA0233F1DBC0 +:10260000039B002118000193E3F7ECFAEAE7002BA3 +:10261000E8D1039CE3F7EEFC01002000E3F7E2FAC7 +:10262000E0E7C046000000000000000000000000DD +:10263000000000000000000000000000000000009A +:10264000F0B5CE46474680B5A1B081464022002174 +:10265000684610ADDEF7A8F8402200212800DEF71A +:10266000A3F800234F46984610373B68402B2FD8DD +:10267000002B0CD101239C46E04443460437042B35 +:10268000F3D1002021B00CBC90469946F0BD4846DD +:102690006A4641464068E3F7A1FA3B68834217D196 +:1026A0003A695808824213D3012B09D96A46511C52 +:1026B00001220E78541002322E5502319342F8D87E +:1026C000030048462A0041464068E3F789FAD1E70B +:1026D00001204042D6E7C046F0B50400A3B0402236 +:1026E000002102A8DEF760F84022002112A8DEF7E0 +:1026F0005BF82369226A9A423AD3402B38D89A076A +:1027000036D1626A032A33D90021606802AAE3F74E +:1027100065FA276987422BD101235B42BD080193EB +:10272000802D28D8002D12D0144EAD0002A92A0009 +:102730003000DEF71DF8330071191A68D24304C364 +:102740008B42FAD12A00310012A8DEF711F80023DB +:1027500000216068019312AA3B00E3F741FA606828 +:102760000423012101AAE3F73BFA002023B0F0BDC6 +:1027700001204042FAE709204042F7E788100008AC +:1027800070B501257D4C90B06D4280210120090675 +:102790004042E3F71FFAC30618D5102004A9E3F757 +:1027A0001BFA0028F1D1049B002B29DA0233ECDB61 +:1027B000059B002118000193E3F714FA8021012002 +:1027C00009064042E3F706FAC306E6D4830620D49E +:1027D000430630D4030642D480235B0018424CD118 +:1027E00080239B001842D0D0180004A9E3F7F4F925 +:1027F0000028CAD1049E002E74DAB31CD8DAC4E7CC +:10280000002BC2D1059B012118000193E3F7EAF9DF +:10281000BBE7202004A9E3F7DFF90028B5D1049B2A +:10282000002BC3DBB1D10D21059B49421800019358 +:10283000E3F7D8F9A9E7402004A9E3F7CDF9002888 +:10284000A3D1049B002BB1DB9FD104A8FFF7F8FEB6 +:102850000100059B18000193E3F7C4F995E7802078 +:1028600004A9E3F7B9F900288FD1049B002B9DDB65 +:102870008BD104A8FFF730FFEAE7180004A9E3F7BB +:10288000ABF9002800D080E7049B002B8EDB00D042 +:102890007BE7089B0193042B69D1099B0193042BCF +:1028A00065D1059B002101930198042302AAE3F757 +:1028B00095F9089B0193984259D1059B01210193F9 +:1028C0000198042303AAE3F789F9099B019398422D +:1028D0004DD1039B2360029B591E0423C9B28B4236 +:1028E0008941B6E7002E00D04FE7089B0193042BE7 +:1028F00034D1059B002101930198042303AAE3F737 +:102900006DF9089B0193984228D1039BDBB2042BFD +:1029100014D8022B0BD8012B09D02E00022B06D184 +:1029200022681668002E25D11368002BFCD0059B69 +:10293000310018000193E3F755F926E7052B0DD177 +:1029400022685668002E15D15368002BFCD0059BD9 +:10295000310018000193E3F745F916E70126059BBE +:102960007642310018000193E3F73CF90DE70121AD +:1029700049426EE703267642D9E7C0468010000838 +:10298000F0B5DE46574645464E46E0B5ABB005AB22 +:102990009B465B4D0AAC16AF8021012009064042E0 +:1029A000E3F718F91EA90600E3F716F910233342DE +:1029B00010D1202333420CD01E9A91461F9A924682 +:1029C0004A46013210D04A46002A65D002325ED013 +:1029D000FEE7FEE71F991E9A8846511C4FD0002A39 +:1029E00018D002320BD0FEE72A68110019401A42B3 +:1029F0000DD113432B605046E3F7F4F8CCE72A6877 +:102A00009A432A6000214046E3F7ECF8C4E78221AC +:102A10004942F0E75A46269B01219A46394B3A48EB +:102A200004933A4B0126136004AB069304230793E7 +:102A300009930EAB2360202308926360A760E360D4 +:102A4000E3F7B8F87642814600280DDD0223002125 +:102A50000193009406AAE3F7AFF80123C6179E433B +:102A60004846F618E3F7B4F853461696002BC9D03B +:102A700004233A0000214046E3F7B2F8C2E72A688F +:102A8000110019401A4238D082214942BBE72A6816 +:102A90009A432A600021AEE7269B0121039341233C +:102AA00023700EAB3B600423194801260E947B6013 +:102AB000E3F780F87642804600280DDD4B463A0069 +:102AC0000193009300210123E3F776F82378422B4A +:102AD0000ED04046E3F77CF8039B1696002BD9D026 +:102AE000002104233A005046E3F77AF8002182E7F8 +:102AF000413BC6179E43F618EBE713432B6082E772 +:102B0000801500083132330080F000003435360083 +:102B100081F0000000000000000000000000000044 +:102B2000F0B5DE46454657464E468020E0B50006E5 +:102B300091B0DEF7D9FE644B80249946634B0125A2 +:102B4000984603235B429B46614F24066D428021D9 +:102B5000012009064042E3F73DF8002810DBC306D8 +:102B60001DD48306F3D5202004A9E3F735F8002807 +:102B7000EDD1049900294FDA8B1CE8DB002119E024 +:102B80004B4601221B681A6005F0E2F843461B78A9 +:102B9000052B03D84F4A9B00D3589F46FEE704A954 +:102BA0001020E3F719F8011ED1D1049E002E06DA99 +:102BB000B31CCCDB0598E3F715F8C8E7FEE7002E59 +:102BC000C5D1089B0193042B5DD1099B9A46042B28 +:102BD00059D13100059802AAE3F700F8089B019348 +:102BE000984250D153460121059803AAE2F7F6FF17 +:102BF000099B0193984246D14146029B039ADBB25E +:102C00000B70494616600A60042B3AD9053B19003F +:102C10004B1E99414942CDE7002998D104230598DC +:102C200003AAE2F7DBFF089B984231D14246039B9F +:102C300012789A422CD1042B38D034D8022B24D9C4 +:102C4000032B25D14B461B681B68002B29D13B6801 +:102C5000002B26DC059B3B6021002000E2F7BAFF39 +:102C60000028F9DA73E73868002800DCFEE7002165 +:102C7000E2F7B8FF3D602000E2F7B6FF67E7FEE746 +:102C8000FEE7002B09D1290094E7002B00D075E75F +:102C900029000598E2F7A6FF59E705F039F8002169 +:102CA00088E7594686E7052BF2D167E72100200027 +:102CB000E2F790FF0028F9DA05F04AF82000E2F781 +:102CC00093FF002176E7C046201900082419000868 +:102CD00000190008D82C02107E2C0210762C02104D +:102CE000762C0210662C0210BC2B0210802C0210D5 +:102CF00000000000000000000000000000000000D4 +:102D0000F0B5214E95B005AD04AC80211020090628 +:102D1000E2F760FF102008A9E2F75EFF0028F4D177 +:102D2000089B0393023319D2099B00210393039854 +:102D3000082306AAE2F752FF089B099FB34217D067 +:102D4000124A934211D102280FD102AB188ADFF741 +:102D500071F801003800E2F745FFD6E7099B002132 +:102D600018000393E2F73EFFCFE781214942F1E7E4 +:102D70000828FAD1069807990123002201950094AA +:102D8000DEF74EFF0100E5E7E9030000D107000090 +:102D90000000000000000000000000000000000033 +:102DA00030B51025234C8FB0802101200906404208 +:102DB000E2F710FF05421AD1830624D5202002A98C +:102DC000E2F70AFF0028EFD1029B002B1CDA023346 +:102DD0002ADB039B002118000193E2F703FF802107 +:102DE000012009064042E2F7F5FE0542E4D010203A +:102DF00002A9E2F7F1FE0028D6D1029B002B15DADA +:102E000002330CDAFEE7FEE7002B0ED12368220026 +:102E100001332360002104230398E2F7E1FE00213F +:102E20000398E2F7DFFEBFE7FEE7FDE7002BEDD0FA +:102E3000E8E7C04600210008000000000000000094 +:102E400010B5064C2378002B07D1054B002B02D080 +:102E5000044800E000BF0123237010BDA0880208D1 +:102E60000000000028490310044B10B5002B03D0CC +:102E70000349044800E000BF10BDC0460000000048 +:102E8000A488020828490310010010B5431C0FD084 +:102E9000094B5C68002C0CD09B680020603303E079 +:102EA00001306C33A04204D01A6852688A42F7D1CC +:102EB00010BD01204042FBE78C7E020870B5804CBB +:102EC0006268002A00D1F0E0A3687E491966012AF1 +:102ED00000D8EEE00D00CC201C351D50022A5BD03E +:102EE0000D0018003835D8300566032A54D00D007F +:102EF0006C3054350566042A4ED00D006C307035A8 +:102F00000566052A48D087200D0080008C351818EA +:102F10000566062A40D0A2200D008000A8351818AA +:102F20000566072A38D0BD200D008000C43518186A +:102F30000566082A30D0D8208000E03118180166D4 +:102F4000092A29D0F32060498000181801660A2A4E +:102F500022D087200D00C0001C35181805660B2AEA +:102F60001AD00D0059483835181805660C2A13D0A8 +:102F7000A2200D00C0005435181805660D2A0BD08C +:102F80000D0053487035181805660E2A04D0BD2070 +:102F9000C0008C3118180166D0254E4908684E686B +:102FA00058664D4898665E510600043528365E51D5 +:102FB000022A7AD01D008E68D8356E66060050361B +:102FC000AE66032A71D0CE686C356E660600783620 +:102FD000AE66042A69D00E696C356E660600A036AE +:102FE000AE66052A61D087254E69AD005D196E6613 +:102FF0000600C836AE66062A57D0A2258E69AD00F7 +:103000005D196E660600F036AE66072A4DD0BD2506 +:10301000CE69AD005D196E6606001936FF36AE66E4 +:10302000082A42D0D8250E6AAD005D196E660600EA +:103030004136FF36AE66092A37D0F3254E6AAD0019 +:103040005D196E6606006936FF36AE660A2A2CD018 +:1030500087258E6AED0091305D19FF306E66A86697 +:103060000B2A22D019481D18C86A68661B48A86632 +:103070000C2A1AD0A2250E6BED005D196E660600B3 +:103080002836AE660D2A10D0114D4E6B5D196E6656 +:1030900006005036AE660E2A07D0BD22D2009446F6 +:1030A0008A6B634478305A66986601230020236057 +:1030B00070BD084A12685A66074A9A66F5E7C04624 +:1030C0008C7E020844F5021040F60210A4040000B1 +:1030D0007C050000A87E0208ECF20210A4F40210A5 +:1030E0006C22034B42439B689B181B6E9868704789 +:1030F0008C7E02088007C00F7047C04600207047D2 +:1031000070B504000B480D0000F0BAFF00280ED087 +:103110009C23C450002343600300A021A268A03375 +:10312000856008345360425023605C6070BD0020AD +:10313000FCE7C046188F020870B504000D000100BE +:10314000074800F0B7FF002807D0A068401B411EC9 +:10315000884104494042084070BD0248FCE7C0462F +:10316000188F02081F00008010B50C1E0CD0002321 +:10317000E360A033E2580433E358200053601A6040 +:1031800000F08EFF002010BD01F0AEFAEFE7C04660 +:1031900070B50C001500002902D00020256070BD1C +:1031A00001F0A2FAF9E7C04670B5050003690C35D5 +:1031B00006000C009D4203D109E05B689D420BD0E4 +:1031C00018001C3802689268A242F6D170BD01F066 +:1031D0008BFA33699D42F3D10020F7E7F8B54746F3 +:1031E000CE4680B5154F04007B68002B20D0042309 +:1031F000002600259846BB6828009946FFF770FF17 +:10320000434603420FD04B469B1919001B690C31F2 +:10321000994208D018001C380268D268A24208D02F +:103220005B689942F6D17B6801356C36AB42E2D8D7 +:1032300000200CBC90469946F8BDC0468C7E020822 +:103240009C23C0587047C04610B5FFF71DFE431CB5 +:1032500005D06C23034A43439068C01810BD00207A +:10326000FCE7C0468C7E020810B500F0FBFDC36C85 +:103270005868FFF709FE431C05D06C23034A4343FB +:103280009068C01810BD0020FCE7C0468C7E020884 +:103290000368986900280ED001280AD15869401A9D +:1032A00041424841064B40421840064B9C46604410 +:1032B00070470448FCE75B698B424041F2E7C04637 +:1032C000FEFFFF7F0200008010B50400002A05D039 +:1032D0000B681B7C002B1FD0002010BD00F0C2FD2E +:1032E000C36C5868FFF7D0FD431C17D06C230E4AFF +:1032F00043439068C018002810D0036E5969002914 +:103300000AD09869002302E00133994204D09A0060 +:103310008258A242F8D1DFE70448DEE701F0E4F981 +:1033200000231B6EFFDEC0468C7E02081F0000805B +:10333000010010B50C3904000A4800F0BBFE00285B +:103340000DD0094B22689A4209D100F08BFD6368C9 +:103350005B681A6EC36C52685B689A4200D00024A6 +:10336000200010BD188F0208434315150C3070471C +:10337000F8B5DE464746040080B58B4616000021AE +:1033800090229846099F0B9D01F084FA334B0D9AC9 +:10339000E36000232361324BA66023605B466360D9 +:1033A0008423E250089BE361434663610A9B002B40 +:1033B0001ED07B6863620A9B012B4CD9FB68A36219 +:1033C0000A9B022B06D07B69E3620A9B032B01D088 +:1033D000FB6923633B686364BB68E3640A9B022B5D +:1033E00006D03B6963650A9B032B01D0BB69E3658B +:1033F0000C9B002B1ED01A006B6863632B686366FE +:103400000023A366012A15D9EA68A263AA68236784 +:10341000E2660C9A022A0DD06A69E2632A69A36700 +:1034200062670C9A032A05D0EA692264AA69E267F6 +:103430008022A350A461002E01D033682362089B30 +:10344000002B03DB0CBC90469B46F8BD1900200006 +:1034500001F0E2FAF6E73B686364C9E7746E7665EB +:1034600043431515F8B54768050010300C0000F00F +:10347000ABFD061E18D12B6838009968BB6819434C +:10348000FB6DB960194000F08BFD002C02D0E369A0 +:10349000002B05DD20000C3000F076FD3000F8BD7B +:1034A0002369002BF6D1F9E7004EF7E71F000080F3 +:1034B00010B500F0D7FCC36C586810BD10B50029DA +:1034C0000BD0002811D0CC43A0420CD8022B06D040 +:1034D000029B01F0A9FC002805D1002010BD029B31 +:1034E00001F0F0FCF7E70248F8E780200006F5E776 +:1034F00003000080F0B5DE46454657464E46B521EE +:10350000E0B51023A82285B06848090100F084FDC9 +:103510000023674D03936A68002A1DD06C339A46D6 +:10352000644B002699465346734398468021AB6806 +:10353000490043441C001B6E1B688B4209D1676E17 +:10354000002F00D087E03000FFF7CAFD430740D4CA +:103550006A6801369642E6D3574B6C2798461E00A0 +:10356000AF23DB009A4600239946544CA24460687E +:103570003460FFF789FC431C00D18CE0AB687843D2 +:103580009C466044002800D185E03368826D9B68CA +:1035900070601343836533000833F360B360C2681F +:1035A00014335360F261C36001239C460C301C3419 +:1035B0003062E1442436A245D9D1039C200000F0BA +:1035C000C1FCE06B05B03CBC90469946A246AB46B8 +:1035D000F0BD0823A16D19434B461868A16500286A +:1035E0000FD00022B446236E5F68354B1E68BE4282 +:1035F00002D15E683143A165013210338242F5D1B8 +:103600006646304B23600023636023000C33236144 +:10361000E360AB6843441F0014239B46BA6E396EC7 +:10362000536A126ABB44096958460092002200F0AE +:103630001FFCAB6843441B6EDB687B62236E5B68D8 +:10364000002B22D0584600F01FFC002800D17FE755 +:1036500001F04AF87CE73968002900D173E73000AF +:1036600003F04AFE002809D179680437002900D107 +:1036700069E7300003F040FE0028F5D0043701F080 +:1036800033F839680029EAD15DE703F04DFE5B4667 +:10369000B8610393D6E701F027F84A462423534341 +:1036A000002243445A60936DFFDEC046188F020823 +:1036B0008C7E020878020310689A020890FC0210BF +:1036C00068020310746E766570B5050000F0BCFBEF +:1036D000040000F0C7FB0100002C05D0844203D099 +:1036E0002200280000F03CFC01F084F970BDC046C7 +:1036F000010070B5002813D0AC240A4D2B68185B6C +:103700001B6AC000C01801F0FBFF002806D12A6820 +:10371000135B126ADB009B18586070BD0248FCE71F +:103720000248FAE70CAE02080300008001000080A6 +:10373000010070B5002813D0AC240A4D2B68185B2B +:103740001B6AC000C01801F0DBFF002806D12A6800 +:10375000135B126ADB009B18586070BD0248FCE7DF +:103760000248FAE70CAE0208030000800100008066 +:10377000AC2110B5094B02001B68595A1B6AC800DE +:103780004018C018202101F0ADFF43425841044BBE +:1037900040421840034B9C46604410BD0CAE0208EA +:1037A000FEFFFF7F02000080094B80221B6810B5DE +:1037B000186A86235B011C00C1185200CB681B0CE1 +:1037C0001342FBD080235B040351035910BDC04654 +:1037D0000CAE020810B572B6032003F077FE0C2081 +:1037E000FF30FFF731FD041E0BD08021A3680906CE +:1037F0001943E36DA1602000194000F0D1FB62B6CF +:1038000010BD00F071FFF0E7F0B54546DE464E46CC +:103810005746E0B5036889B004000D009846FFF7ED +:1038200023FD061E34D0336E9868FFF763FC0090CA +:10383000060002232A000C216068FFF73FFE0028E3 +:1038400020D161680C2205A800F0B6FF069B059FF9 +:103850009A46079B9B46A368E4689946002F14DBB1 +:103860005B464A460193390053464046039602950B +:10387000009400F0A1FC09B03CBC90469946A246D9 +:10388000AB46F0BD00F030FFDBE700F02DFFE7E7CF +:1038900000F02AFFC7E7C046F0B54746CE4680B5E0 +:1038A0008B691700C44A04000D0083B0934222D3F1 +:1038B000C24A93421FD201264B699E43FFF7D4FCB4 +:1038C0008046002800D1BBE243461B6E002E17D075 +:1038D0005B68002B23D143461A6A2B00283393429E +:1038E00001D000F001FF053CE0B2172810D8B44B1E +:1038F00080001B589F46FFF7B7FC061E05D0336EAD +:103900005B680026002BEED1EBE700F0EDFEF6E75A +:103910008420404203B00CBC90469946F0BD00F0B4 +:10392000E3FED8E700F0DCFBF4E7FFF79DFC041EA4 +:1039300000D160E2A3681A0700D424E2082293436E +:103940000020A360E6E72D68280000F0B3FE002801 +:1039500000D112E2FFF788FC061E00D136E20C23EC +:10396000326EFF3352689A4204D180231B069D4277 +:1039700000D159E200F0B8FE0024B3682B4200D118 +:1039800005E2AB432000B36003F086FD200003F0A6 +:1039900091FD0020BEE72E686D68FFF765FC041EF0 +:1039A00000D110E2A36D334200D1D0E1E665002DD5 +:1039B00000DA8EE1A0683040ACE72D68280000F006 +:1039C00079FE002800D1DBE1FFF74EFC041E00D198 +:1039D0000EE20C23226EFF3352689A4204D18023F8 +:1039E0001B069D4200D11DE200F07EFE002003F088 +:1039F0006DFD00208EE7AB6828689846EB686F681D +:103A00009946FFF795FC051E00D1E5E16B685B6800 +:103A10001B6E9868FFF76EFB6B690400002B00DAE1 +:103A2000B9E1032F00D99BE1BE00AE19736A0020F3 +:103A3000002B00D16EE70223002249464046009445 +:103A4000FFF73CFD002800D0E6E1746A4C4500D940 +:103A50004C46FF00ED1922004046696C00F0ACFEB8 +:103A60006B6C20001B196B64736A1B1B736251E73C +:103A700041CDFFF75DFC041E00D1A1E13200A16839 +:103A800060682662FFF784FB002043E703F07CFDBB +:103A900000203FE7C0CD300000F000FE012801D03B +:103AA00000F022FEFFF7E0FB041E00D191E1236E3F +:103AB0009868FFF71FFB0223009000223021380096 +:103AC000FFF7FCFC002800D054E1A368002B00D1D4 +:103AD0004CE1334200D146E131002000FFF764FBA6 +:103AE000051E00D181E11035280000F083FA00287E +:103AF00000D1A2E101220100836814315A6038002C +:103B00002F3200F059FE280000F082FA002800D180 +:103B100000E7A3680020B343A360FBE628686E6853 +:103B2000AC68FFF705FC051E00D15BE16B69002B5B +:103B300000DA36E1032E00D90FE1B200AA18536A69 +:103B4000002B00D18BE020009C4200D91800F60029 +:103B5000AD19696C1B1A091869645362DAE6FFF73C +:103B6000CDFAD7E6280000F05BFD0020D2E62D68F4 +:103B7000280000F09FFD002800D1E5E0FFF774FB6E +:103B8000041E00D13AE10C23226EFF3352689A42A0 +:103B900004D180231B069D4200D147E100F0A4FD23 +:103BA000002003F087FC0020B4E62868310000F014 +:103BB0009DFC0020AEE6C04600070010C05C00106F +:103BC000080203103A0031002800FFF71DFEA1E6AD +:103BD000320003CD00F09CFA9CE63100286800F02A +:103BE00083FA97E66B682868AF68EE689946FFF736 +:103BF0009FFB051E00D1DAE06B685B681B6E98685E +:103C0000FFF778FA6B698046002B00DACCE04B4670 +:103C1000032B00D995E04B46DC000C339B002C199C +:103C2000EB185B68A26E9B1A9E4200D986E0434661 +:103C300000220093310001233800FFF73FFC0028E9 +:103C400000D087E0A26E636E944663441800320091 +:103C5000390000F0B1FDA36E9C466644A6660020C4 +:103C600058E62C68002C00DC98E02000FFF7ECFA06 +:103C7000041E00D1B3E00821A36820001943E36DBE +:103C8000A160194000F08CF9002043E641CDFFF718 +:103C90004FFB041E00D190E06568002D00D189E043 +:103CA00063699A1C44D05A1C2DD1002E00D0A8E084 +:103CB000A6683300813316D00022A3685A60E369F6 +:103CC000002B17DD200031000C3000F069F90020D6 +:103CD00020E6A36818003040334200D01AE62000E6 +:103CE00000F052F966E6E369002B00DB97E0022260 +:103CF000A3685A602369002BE4D12000310000F052 +:103D000081FE002006E6002B00DA81E0636B002BC9 +:103D1000CFD08423A26EE3585A60A26B002AC8D089 +:103D2000226FDA60E26B002AC3D0A26F5A61C0E74B +:103D30002800A168FFF718FA0026BDE700F0D4FCC0 +:103D400075E700F0D1FC66E700F0CEFC16E700F066 +:103D5000CBFC2BE600F0C8FC74E700F0C5FCECE6F9 +:103D600000F0C2FC60E600F0BFFCB5E600F0BCFC71 +:103D7000A368AEE600F0B8FCA7E600F0B5FCE9E504 +:103D800000F0B2FC20E600F0AFFCA368D6E500F03E +:103D9000ABFCB368F5E500F0A7FC42E600F0A4FC3C +:103DA00063E700F0A1FCC5E600F09EFC2FE700F001 +:103DB0009BFC21E700F098FC72E700F095FC6BE7B4 +:103DC00000F092FC5AE600F08FFCEBE500F08CFC72 +:103DD000C5E500F089FC6AE600F086FC16E600F016 +:103DE00083FC48E700F080FCA0E600F07DFC7AE66A +:103DF00000F07AFCEDE500F077FC9BE500F074FC48 +:103E0000C1E63300823313D03300833300D153E74C +:103E100000F06AFC00264FE700F066FC15E600F0B3 +:103E200063FC4CE70320E2E50324A6E50320B8E6A3 +:103E30002800A168FFF798F93EE78C20404269E529 +:103E400000F052FC40E5C046054B1868002803D13D +:103E500005E0006C002802D04369012BF9D17047BE +:103E600074A10208014B18687047C04670A102088F +:103E700010B57F24046100244260029A446101600D +:103E80008260C36010BDC04670B54569040082B051 +:103E9000002D08D10268002A05D08368002B02D0CB +:103EA000C168002903D10125280002B070BD00912E +:103EB0004168183003F05AF8124B1A68002A1AD0D9 +:103EC00021691069814216D9130002E01E69B142CE +:103ED00003D918001B6C002BF8D123640464012360 +:103EE0006361094B1968002909D009692069884272 +:103EF00005D31A60D8E722641C602200EFE71C603B +:103F0000D2E7C04678A1020874A10208074B4161BC +:103F1000012903D0064A1068186070471A68002A01 +:103F2000FAD0126901699142F6D3F3E774A102084D +:103F300078A102088022024B52055A607047C046A1 +:103F400000ED00E0836B83F309888022024B520569 +:103F50001860024B5A60704770A1020800ED00E043 +:103F600070B505001400183108002822290000F05F +:103F700023FC210028002822183100F01DFC014BF1 +:103F80001C6070BD70A1020810B50400FFF76AFF45 +:103F900002216060FFF7BAFFFFF7CCFF10BDC046FB +:103FA00070B5040040680D00002802D04369022B60 +:103FB00000D070BD0121FFF7A9FF63689B6B1D60F6 +:103FC000FFF7B8FFF5E7C04610B500280FD000296D +:103FD0000DD08368002B07D08C224468A15041602B +:103FE00001338360002010BD01604160F8E780204C +:103FF0000006F8E7031E09D08268002A06D08C214B +:104000000068013A41589A60196070470020FCE747 +:104010008068434258417047F0B5C6460400904658 +:104020001E0000B5002828D0002B26D017001A004B +:104030000C377A4310328A421FD1002100F02AFC4B +:104040002300210008331031E160A160A4612361E5 +:104050006361C919012E0AD90120A56801308C605D +:1040600069600D60A1604B60C9198642F5D1434675 +:10407000002048C404BC9046F0BD80200006F9E74B +:1040800000280AD0C3680830834206D019685A68ED +:104090000C3318004A60116070470020FCE7C046EE +:1040A0000C3883689A680833506002601860436077 +:1040B0007047C04610B5040010340B0006C8A34278 +:1040C0000CD30C314A431219934207D20C3B181BF4 +:1040D000DFF7D4F848424841C0B200E0002010BDEC +:1040E000802040007047C04670B505000E00FFF705 +:1040F00075F8041E09D0010032002800FFF7E4F82B +:10410000002802D12368586900E0002070BDC04635 +:10411000F0B5C64600B586B0050088461600FFF724 +:104120005DF8041E41D0002E2FD000F0C9FD3200F2 +:10413000070021002800FFF7C7F800282FD1390019 +:104140002000FEF7DDFF051E32D041462000FFF7BC +:104150009FF8002826D12800FFF708F9061E27D06F +:1041600000232A00210005930493039302930193F3 +:104170000097013BFFF7FCF831002000FFF772F9D0 +:10418000002006B004BC9046F0BDFFF791F9320064 +:10419000070021002800FFF797F80028CFD000F093 +:1041A000A3FACCE700F0A0FAD5E700F09DFABAE751 +:1041B00083204042E5E7C046F0B557464E46DE460E +:1041C0004546E0B59BB01F0026AB824691461E785F +:1041D0000991042F03D8259B042B00D838E100F067 +:1041E00083FA002E00D13AE100F06AFD010006904A +:1041F0005046FEF7A1FF002800D03AE15046FFF7F5 +:104200001FF80890002800D13CE153465B68012B61 +:1042100000D13EE1022B00D165E1279BFC00009319 +:104220003200012321004846FFF748F9002800D05A +:1042300037E1259B3200DB0019000793279B249868 +:1042400000930223FFF73AF9002800D026E10AADD7 +:1042500020220021280000F01DFB12AB98462022EE +:104260000021180000F016FB22004946280000F04B +:10427000A3FA4046079A249900F09EFA002F00D135 +:10428000A4E0A1463300A9444E46AB46B9462C00F3 +:104290001F00279B3A000093616801232068FFF705 +:1042A0000DF9002800D0D0E00834B442F1D13E002E +:1042B0004F46012F00D889E0A968EB680A9ACB180D +:1042C0009A4205D26B689C466244914200D2F8E063 +:1042D000022F7BD029696B690A9ACB189A4205D2C2 +:1042E0006B689C466244914200D2F0E0032F0CD0F0 +:1042F000A969EB690A9ACB189A4206D26B689C4668 +:104300006244914201D200F0EFF929696B69AA6811 +:10431000CB189A4205D2EB689C466244914200D287 +:10432000D2E0032F52D0A969EB69AA68CB189A4250 +:1043300006D2EB689C466244914201D200F0D4F967 +:10434000042F06D0296A6B6AAA68CB189A4200D259 +:10435000AEE00324B14626005C46B7422FD9A169DE +:10436000E3692269CB189A4206D263699C4662448B +:10437000914201D200F0B8F9731C9B469F4220D9AC +:10438000216A636A2269CB189A4205D263699C4606 +:104390006244914200D2A0E00236B7420BD9A16A32 +:1043A000E36A2269CB189A4205D263699C4662444B +:1043B000914200D294E05E460834B742CFD8731CD5 +:1043C0009B465E4608345F45C7D14E46259B002B71 +:1043D00015D0079BBB46434437001E00279B44462D +:1043E00099464B4600933A00022361682068FFF724 +:1043F00065F8002826D10834B442F2D15F46504611 +:10440000FEF7B4FF041E65D0249B01950593259B00 +:10441000089D049343460393069B290020000093C4 +:104420005246099B0297FEF7A3FF21002800FFF7E1 +:1044300019F8002838D11BB03CBC90469946A246DA +:10444000AB46F0BD00F050F9D5E700F04DF92BE791 +:10445000FB18042B00D9C2E6002E00D0C4E6FFF7FB +:1044600027F8010006905046FEF766FE002800D1AE +:10447000C4E600F039F95046FEF7E2FE0890002845 +:1044800000D0C2E600F030F953465B68012B00D043 +:10449000C0E600F029F953465B68BBE600F024F95A +:1044A000D5E600F021F9C4E600F01EF90020C2E7CD +:1044B000EB689C466244914200D34AE700F014F94D +:1044C00047E700F011F903E700F00EF929E700F0E3 +:1044D0000BF90BE700F008F996E700F005F95BE748 +:1044E00000F002F967E781204042A4E7F0B504003C +:1044F00087B0002828D0002928D1FEF7D9FF07006F +:1045000020003900FEF718FE002828D12000FEF711 +:1045100097FE051E2AD02000FEF728FF061E2CD08D +:104520006368012B2ED000232900300005930493EB +:1045300003930293019322000097023BFEF718FFBA +:1045400031002800FEF78EFF07B0F0BD00F0B8FB89 +:10455000070020003900FEF7EFFD0028D6D000F05C +:10456000C3F82000FEF76CFE051ED4D100F0BCF8A5 +:104570002000FEF7FBFE061ED2D100F0B5F86368FE +:10458000012BD0D100F0B0F8CDE7C046F8B502F06D +:10459000B3FF002833D102F0B1FF00282FD102F081 +:1045A000AFFF00282BD102F099FE002827D102F09E +:1045B000DFFF002823D11648E0F7C0FC0121154891 +:1045C000E0F7BCFC00F0B2F802F092FF051E16D135 +:1045D000114B1F68002F14D0104C09E0002130004F +:1045E00002F084FF00280AD101351034BD4208D002 +:1045F00026686168300002F003FF0028EED01F201B +:10460000F8BD02F045FF03000020002BF8D0F6E7CC +:104610007C020310B402031078020310700203102E +:10462000036810B50400002B02D00323036010BD03 +:10463000FEF71AFE002802D000232360F7E700F0FF +:1046400053F8F9E710B5FFF7A1FF002818D1FEF7DE +:1046500035FC00281AD102F085FC052000214042DB +:1046600002F0CEFE00280ED10A490B4A0B6A1A400E +:10467000C0231B0413430B6200F056F8002010BD4A +:1046800000F032F8E3E700F02FF8F5E700F02CF83F +:10469000E1E7C04600ED00E0FFFF00FF002807D083 +:1046A00000230133421EDBB21040FAD118007047DC +:1046B0000020FCE703000020002B04D0581E03401C +:1046C00058425841C0B2704710B5CC43844208D319 +:1046D000904206D301394018834280411F2318407D +:1046E00010BD1F20FCE7C04610B502F04DFF10BD05 +:1046F00070B583690500023B18780C00062806D0C7 +:104700000D2809D102F030FCFEF7F4FE70BD280040 +:1047100000F012F82000F9E70A002900FFF7BCF8C2 +:1047200028602000F2E7C0460DDF70470122014BF0 +:104730001A6070477CA10208F0B5C64600B5036850 +:1047400082B00400984647688668FEF78DFD051E16 +:104750002AD02B6E9868FEF7CDFC3104009002231E +:1047600000223800090CFEF7A9FE051E03D1104BEC +:104770001B68012B05D00323236002B004BC9046C4 +:10478000F0BDFEF795FE0623FF339842F3D1434672 +:10479000DBB2012BEFD1B6B2032EECD9054B3B8037 +:1047A00004237B802560E8E7FFF79EFFD1E7C04642 +:1047B0007CA1020816200000F0B5060003244E403C +:1047C00005000B00344225D1002A0ED020420DD026 +:1047D000032603E00B002500264208D0591C1B7855 +:1047E000013A6C1C2B70002AF4D1F0BD04002500A6 +:1047F0000B00032A45D9161FB608B6000B1DF61884 +:10480000641A0B1D6518096802C51900B342F8D176 +:1048100003210A40511E8C46002AE6D000210E00DA +:104820002C1DA3424E4134001E1DB5424941214377 +:1048300008246445A44164420C4222D02900194353 +:1048400089071ED119009408A400E418EE1A0F6815 +:1048500077500431A142FAD1032114008C43210086 +:1048600064464D19671ACB189142BED01A782A7047 +:10487000002FBAD05A786A70012FB6D09B78AB70EF +:10488000B3E79A18EE1A1978F15401339342FAD12A +:10489000ABE7C046F0B50400CEB2002A0BD08307C8 +:1048A0000AD0032702E01C001F4206D0013A631C15 +:1048B0002670002AF7D1F0BD0300032A26D9FF2570 +:1048C000FF270C060D403F040904394025430D43E2 +:1048D000111F89088C46240C25436446191DA70026 +:1048E000CF1900E004311D600C000B008F42F9D19C +:1048F0006346511F9B00C91A9307DCD0267000291C +:10490000D9D066700129D6D0A670D4E71C00511EFC +:10491000F4E7C0467047C0467047C0460020704765 +:1049200010B5FFF7DDFB10BD10B50068FFF7DCFB2D +:1049300010BDC04610B50A00C1690068FFF7E8FB6A +:1049400010BDC04670B50D000026040084B0036998 +:10495000C2688168406803960295A56901956469FB +:104960000094FFF729FC04B070BDC04610B5406844 +:10497000FFF7BCFD10BDC04630B500281CD0026852 +:10498000002A19D04168002916D08068002813D069 +:104990000A4B0B4C1D68A5420CD10A4C5D68A54220 +:1049A00008D1094C9D68A54204D1986000201A6086 +:1049B000596030BD0548FCE70548FAE7E47E020887 +:1049C00015490210194902101D4902100200008009 +:1049D00001000080034B044A1A60044A5A60044AEA +:1049E0009A607047E47E02081549021019490210C6 +:1049F0001D49021010B5024B1B68984710BDC046F8 +:104A0000E47E0208882310B5C058024B5B689847C3 +:104A100010BDC046E47E0208044B10B59B6804003C +:104A2000080098478823E05010BDC046E47E020885 +:104A3000A823054A0020D35C032B04D80133980037 +:104A4000C018C0008018704780A10208F0B583B07C +:104A5000002834D0A422254D0368AE58002B3DD049 +:104A6000013BDCB2032C30D801272300A7402A6881 +:104A70003A4222D19A00D418E400019104342C2047 +:104A8000D218D200AA182432137801A9013358434E +:104A900004223018FFF790FE282200212819FFF782 +:104AA000F9FE2B683B432B6002F0ECF9B3681F431F +:104AB000B76002F0EFF902F097F903B0F0BDA4235C +:104AC0000A4D0127EE580023D1E701270191042266 +:104AD000002001A9FFF770FEA740E5E72A68D2078A +:104AE000EBD40424012700220191C8E780A1020829 +:104AF000F0B5DE4657464E464546A423E0B55B4E2C +:104B00008BB0F3589A4602F0BDF953465B689B465A +:104B1000002B00D1A6E002F0BDF90C2353449846C7 +:104B200084235B42009300230024351D0193012759 +:104B3000E3B29946A7405B4601341F4248D0336830 +:104B40004A46BB43336020234146EA5428002022D2 +:104B5000FFF732FE4A46A8236C62F2542B682022EB +:104B60009946002102A8DBF71FFE4B46052B27D8EC +:104B70003F4A9B00D3589F466B68012102A80393CC +:104B8000FFF7F4FEA8230422F2542B685A1E012AD0 +:104B900005D9033B012B1BD8009B002B18D0019B90 +:104BA0002C203B430193009BA42202932023EB5C27 +:104BB00002A901334343B058A03AC018FFF7FCFDE7 +:104BC000282200212800FFF765FE33681F43376065 +:104BD0002C239C462835E044042CA8D102F052F93D +:104BE00053465A465B68019D93435246536093680F +:104BF00000242B43936002F04DF9002D2FD12000AB +:104C00000BB03CBC90469946A246AB46F0BD6B68E3 +:104C100001210393AB6802A80493EB6805932B6909 +:104C200006936B690793AB690893FFF78BFE0090BF +:104C3000A8E76B6801210293AB6802A80993FFF70C +:104C400079FE00909EE76B68012102A80293FFF7AE +:104C50006BFE009096E7FFF763FE009092E702F08C +:104C6000C3F8CCE702F016F9024CC8E780A10208AD +:104C7000D40203100400008010B5FFF739FF10BD07 +:104C800010B50C4CAC2200212000FFF703FE0F23CF +:104C900009482360FFF770FE002809D1200002F0C8 +:104CA000C1F8041E01D1200010BDFFF793FEFAE702 +:104CB000024CF8E780A10208EC0203100600008015 +:104CC000012040427047C04610B50648E0F736F96B +:104CD00002F024FB02F02EFB02F04AFBFFF7D0FFAC +:104CE000FEE7C046F8020310012370B513701400EC +:104CF000144B154A06000D00FFF7E6FC002802D110 +:104D00000023637070BD29003000104B104AFFF77C +:104D1000DBFC0028F4D08022290030000D4B120566 +:104D2000FFF7D2FC002802D101236370EAE72900D3 +:104D30003000094B094AFFF7C7FC0028F4D00023D4 +:104D40002370DFE7FF7F0E0800000308FFFB16104B +:104D500000040510FFFF0208FFFB04100004001010 +:104D6000F0B50023C646012500B514001370557038 +:104D7000802298461205104B06000F00FFF7A4FC96 +:104D8000002807D1E57025716571A571A57004BC77 +:104D90009046F0BD39003000084B094AFFF794FCFB +:104DA000002802D043466370F1E7E5702071657119 +:104DB000A071A070EBE7C046FFFF0208FFFB0410E4 +:104DC00000040010F0B50023C646012500B514000C +:104DD000137098465570104B104A06000F00FFF7ED +:104DE00073FC002807D1E57025716571A571A57068 +:104DF00004BC9046F0BD39003000094B094AFFF76A +:104E000063FC002802D043466370F1E7E57020712F +:104E10006571A071A070EBE7FF7F0E08000003082A +:104E2000FFFB161000040510F0B5C64600B50400DF +:104E30000D001F2084B0012B36D80027002A37D060 +:104E4000002C30D0EB439C422DD8EFF30583002B90 +:104E500030D0802301AE5B00320029002000338077 +:104E600002F002FB3378002B1DD07378BB421AD1BD +:104E700080235B020293002302AE3200290020004F +:104E8000B380B371002F18D102F0FEFA7378F27874 +:104E90007079002B07D0002A12D143425841434277 +:104EA0001F20184000E01F2004B004BC9046F0BD55 +:104EB0000127C5E7FFF718FCCBE702F0D9FAE5E7D1 +:104EC0000020F1E7F0B5C64600B504000D001F2034 +:104ED00084B0012B40D8002A42D1002301279846F4 +:104EE000002C41D0EB439C423ED8EFF30583002BCE +:104EF0003FD0802301AE5B003200290020003380C8 +:104F000002F0B2FA3378002B2ED07378BB422BD14B +:104F100080235B020293002302AE320029002000AE +:104F2000B380B371002F21D102F0AEFA7378F1781B +:104F300034797579B279002B16D04346002B1BD1FA +:104F4000002902D11F20002D06D0002C22D1504272 +:104F500042411F205242104004B004BC9046F0BDB4 +:104F6000122300279846BBE71F20F5E702F080FADE +:104F7000DCE7FFF7B9FBBCE7002907D0002C09D11B +:104F800053425A411F2052421040E5E71F20002D96 +:104F9000E2D0F3E70020DFE7014B18607047C0461E +:104FA0000CAE02082F4B1A68B023116AD3588C46F6 +:104FB00063441B68002B4DDB2B4B1868A0231B069A +:104FC00098424DD010D8802848D020D980235B004B +:104FD00098423BD0254B984231D1012352689360CF +:104FE0009368002BFCD17047214B984234D014D9E0 +:104FF000204B984228D0204B9C466044431E984149 +:105000004342FC2018401D4B9C466044E5E71028B5 +:105010001ED0402811D11A48DFE71A4B984210D011 +:10502000194B9C466044431E98414342FF20184060 +:10503000A423DB039C466044CFE70028CDD013486F +:10504000CBE7A020C003C8E71148C6E70748C4E77C +:105050001048C2E70A48C6E70F48BEE70F48BCE75A +:105060000020BAE70CAE02082CA20208060052008B +:10507000030000F0040000F0FBFFFF0F03005200EC +:1050800002005000090000A0FFFFFF0FFF005200C8 +:1050900002005200010050000100520005005200C1 +:1050A000F0B5DE4657464E464546E0B583B000288B +:1050B00000D1B3E0002A00D1B0E001248C40136895 +:1050C000A046002B00D1A7E084605D4B8D001B68DB +:1050D0009B4679235C46E75C0F242600AE403F18D0 +:1050E0003B68B34356683440AC4023435C463B6066 +:1050F000137A64699C465B46A1469B69C31ADB0927 +:105100001B014B44032900D98AE01E681F27019622 +:10511000CE00B1463E004C46A6403400019EA64358 +:105120003400664637404E46B74027431F604B0069 +:1051300099465C467823E35C03249C464E46270050 +:1051400084446346B7401B68BB43D7682740B740D9 +:1051500066463B43336001239C4666461369876974 +:10516000334046468B40B7433B4383615E467A23D8 +:10517000F35C5769C3181E68B246664637408F40D5 +:10518000564601974746BE43019F37431F60102391 +:105190005E469A466B33F75C6646C7193B68D14456 +:1051A0009A46936933408B404E461900D369234099 +:1051B000B340B440194343461C435346A3431943E9 +:1051C00039607C235946CB5CC018536A01685C0087 +:1051D00002232340946AA6000424344023436446F7 +:1051E000166A34402343D46A126BE6001824344014 +:1051F0002343FF24520122401343FE229200154014 +:10520000AB40A1430B430360002003B03CBC90467D +:105210009946A246AB46F0BD446056E70948F4E71C +:105220001F260C1FE400A6405F68A146B7436446F2 +:105230001F2634404E46B4403C435C6077E7C0468E +:105240000CAE020801005A00F0B54F46D64646465D +:10525000C0B508AC2578012427001C408F408C4045 +:1052600006681E4BBE4334431E6879230460F75C16 +:105270008B009C460F23924699461A0063469A403B +:105280003F183C684B469443524613406246934055 +:1052900023433B60B369C01AC00973690001C01899 +:1052A00003290ED81F231C00C9008C402B408B40C3 +:1052B0000268A243134303601CBC90469946A24671 +:1052C000F0BD1F231C000439C9008C402B408B40CB +:1052D0004268A24313434360EEE7C0460CAE0208A7 +:1052E000F0B5CE4647468C4680B507A9040008783D +:1052F00061469E004D000C23032133400A401A43AF +:105300004342584100010243130299466346D80ABA +:10531000E3681C318B43614616041706090500D566 +:1053200013433A490B40810701D549460B4338499D +:105330000B40410700D5334336490B40010700D5E8 +:105340003B43E360E0681F21181A431E9841324B2B +:10535000404218402B0A9C46A3688B43E90500D5C0 +:1053600013432A490B406146890701D549460B433F +:1053700027490B406146490700D5334325490B4077 +:105380006146090700D53B43A360A1688B4200D06A +:1053900021481F212B099C4663688B43E90600D5F1 +:1053A00013431A4A13406246920701D54A461343F3 +:1053B000174A13406246520700D53343154A13403B +:1053C0006246120700D53B4363606268934200D097 +:1053D00011482368114A1340AA0701D54A461343CE +:1053E0000B4A13406A0700D533430A4A1A402B0779 +:1053F00000D53A432260236853401F22934300D0D4 +:1054000005480CBC90469946F0BDC046FFE0FFFF42 +:10541000FFFFE0FFFFFFFFE00300C200E0E0FFFF4F +:10542000F02310B51B030C041C400F231A000A4084 +:105430001443084A80021268126982188020C00151 +:10544000145010581840401A431E9841024B4042D5 +:10545000184010BD0CAE02080300C200044B10300F +:105460001B6880021B69C3580F2018407047C04654 +:105470000CAE020830B54A8904007F23100098431F +:1054800016D18D79783B2B40520213434A7ACD795D +:10549000920713433822ED002A4013430A7A012170 +:1054A0004A40920113431A0006490A409A4201D029 +:1054B000054830BD6262636A19409142F9D00348E1 +:1054C000F7E7C046DBFEFFE00100C2000300C200B8 +:1054D00070B54D8902007F232800984329D10C68BC +:1054E00080339C434B798E791C4307236D023340F4 +:1054F0002B434D7ACE79AD072B433825F600354046 +:1055000001262B430D7A09797540AD012B43F8250F +:1055100009066D0529400B43536014601168A142D0 +:1055200001D0054870BD526804490A409A42F8D13A +:10553000F8E70348F6E7C0460300C200FFFEFFFF9E +:105540000100C2008023426A1B0613434362406A83 +:10555000024BC00F013818407047C0460300C2001C +:10556000802342681B06134343604068024BC00F10 +:10557000013818407047C0460300C20070B582B0C1 +:1055800006AC2678064C25682C242C5D1F2C05D9EA +:1055900030300096FFF7A4FE02B070BD0148FBE773 +:1055A0000CAE02080200C20030B5124C03002568A0 +:1055B0002C242C5D1F2C1AD903208143F82019605C +:1055C000400514065D6804400B4805402C435C60B0 +:1055D0001868814201D0094830BD5868074BC000A7 +:1055E000C00E101A421E904140421840F4E7044891 +:1055F000F2E7C0460CAE0208FFFFFFE00300C20066 +:105600000200C20070B582B006AC2678064C256850 +:105610002C242C5D1F2C05D910300096FFF760FE5E +:1056200002B070BD0148FBE70CAE02080200C200E8 +:10563000094B1A682C23D35C1F2B0AD9802342689C +:105640001B06134343604068044BC00F01381840E9 +:1056500070470348FCE7C0460CAE02080300C200D6 +:105660000200C20070B582B006AC2678064C2568F0 +:105670002C242C5D1F2C05D930300096FFF730FE0E +:1056800002B070BD0148FBE70CAE02080200C20088 +:1056900070B582B006AC2678064C25682C242C5DAB +:1056A0001F2C05D910300096FFF71AFE02B070BD0E +:1056B0000148FBE70CAE02080200C200074B1A6863 +:1056C000B023D358C3181B68002B04DA0904090C53 +:1056D0004160002070470248FCE7C0460CAE02085B +:1056E00001008A000368002B05DA0904090CC26076 +:1056F0008160002070470148FCE7C04601008A0035 +:10570000064B1A68B023D358C3181B68002B03DA62 +:10571000C36800200B6070470148FCE70CAE02082C +:1057200001008A00034B1A68002A00D070471860F5 +:10573000FCE7C04640A202080821425EF0B5574689 +:105740009246DE464E4645465146E0B5036A87B06E +:105750000293394B466A04AA11801A680396938E05 +:1057600090460268816A944604AA63445380334B8E +:1057700001911D68FF212C2342680C000592C26A2A +:10578000A9460092C26807695A4380339B463C4051 +:10579000A44643465E464A4414603C0A0C403F0C13 +:1057A000546097609E5B6346734345469C462D6AF2 +:1057B000B046AC4466468034166164013E042C1940 +:1057C00037435461A760019F5646D761009C96817C +:1057D0001462002494612C22039E029B370A5343D7 +:1057E0000A00394047464B4432401A607A435960B8 +:1057F000360C521980311A61490132049E606918D1 +:10580000164359618E60016BDC611C629C6104A8C7 +:1058100000F04CFD04AB00229B5E002B05DB1F2239 +:105820001A4001239340064A136007B03CBC9046DF +:105830009946A246AB46F0BD0CAE020840A2020853 +:1058400000E100E0F0B52C26124C704325684E4371 +:105850002C182169AD1900291AD0A869002815D182 +:105860000E68002E12DA64686E68A44601242700D0 +:10587000B74016883F043E431660CA606B626346B9 +:10588000AC619C402404240C8C6000E00248F0BD14 +:105890000248FCE740A2020807028A0004028A00CC +:1058A00070B52C24244B44431868002382B004199B +:1058B00001936369DD682A0C0BD012041A601A6820 +:1058C0001E4A20691168B0228A5882181268002A7C +:1058D00017DB2D042A0C002D0AD01A601A68626AA0 +:1058E000002A08D090470023636263690022A26106 +:1058F0001B6802B070BDA26A002AF7D090476369A6 +:10590000F4E701A9FFF7FCFE002600280DD1FF23D4 +:1059100001980268160C1340E269934205D2226A8C +:105920009B009B58002B00D0984731002069FFF75F +:10593000C5FE6369CDE7C04640A202080CAE02086E +:1059400070B50400101E26D0002901D11C4870BD7E +:105950001C4D1D4B6A602E221B6829609A5C944284 +:10596000F4D2CA06F2D1AC229A5A1B6A5443174E9B +:10597000E418CA0800213460DAF716FF002120007D +:10598000FFF79CFE2A0000213068FFF7ABFE0028DD +:105990000ED00F48DBE70029D8D1AC220A4B1B6898 +:1059A000985A4443186A094B24181C600020CEE71B +:1059B00000213068FFF782FE0028C8D0E9E7C04622 +:1059C00003018A00D00600100CAE020844A20208AF +:1059D00001018A00F0B5C646254E0300306800B5C7 +:1059E000C5682A689A422FD91F2201245F091340F3 +:1059F0009C40002910D00368002B31DA6B68BF008F +:105A0000DF193B681D002540234222D11C430021A1 +:105A10003C60FFF753FE18E002F073F980463068EF +:105A20000368002B1ADA6B68BF00DF193B681D00A2 +:105A30002540234216D11C4300213C60FFF73EFE67 +:105A4000404602F062F900E00A4D280004BC90468E +:105A5000F0BD0021FFF732FE074DF6E7074DEFE7F7 +:105A6000064DF2E70021FFF729FE034DE8E7C046A7 +:105A700044A2020804018A00020188000301880090 +:105A8000F0B5C646244D0300286800B5C4682268F6 +:105A90009A422DD91F2201275E0913409F400029F9 +:105AA0000FD00368002B2FDA6368B6009E193368A5 +:105AB0003B4222D0BB4300213360FFF7FFFD0024AF +:105AC00017E002F01EF9804628680368002B19DAF7 +:105AD0006368B6009E1933683B4217D0BB43002170 +:105AE0003360FFF7EBFD0024404602F00EF900E0C2 +:105AF0000A4C200004BC9046F0BD0021FFF7DEFDFB +:105B0000074CF6E7074CEFE7064CF2E70021FFF7FA +:105B1000D5FD034CE8E7C04644A2020804018A0010 +:105B200002018800030188000B4B1B68DB681A68C0 +:105B300082420FD959681F2342090340012098402F +:105B40000300920050581840431E9841034B9C4656 +:105B5000604470470248FCE744A202080001880044 +:105B600004018A00024B1B68DB6818687047C04656 +:105B700044A20208F0B557464E46DE464546E0B51B +:105B8000C0260827B60083591F40002A25D0C2230B +:105B90009B0098460823D025B3469C46AD0043465B +:105BA000C358DB05DB0D934200D913005C46664603 +:105BB0000459264217D0002B08D05E00B1460C00D5 +:105BC00089444659268002344C45FAD11C00002FE6 +:105BD00000D05C000919D21AE1D13CBC904699462C +:105BE000A246AB46F0BD002BF0D05E180C00B246CA +:105BF000465926700134A245FAD1E7E7F0B5574679 +:105C0000DE464E464546E0B580270824BF00C3590E +:105C100083B01C40002A35D080231B019A464023C4 +:105C20009946C9339026FF33984625000197B60060 +:105C30005446036823405C1EA3415C424B461C4013 +:105C40004346C3584034DB05DB0DE31A934200D9C9 +:105C500013000827019C045927421AD0002B0AD0B0 +:105C60005F00BC460C009B468C4423880234835161 +:105C70006445FAD15B461C00002D00D05C00091978 +:105C8000D21AD5D103B03CBC90469946A246AB4649 +:105C9000F0BD002BEFD05F180C00BB469C4623786C +:105CA000013483515C45FAD16346E4E7F0B5DE4642 +:105CB00057464E464546E0B583B0002800D1C9E0BE +:105CC000002900D1C6E00F78022F00D1BAE04B685E +:105CD0005C1E0F231C400B7F8E685D1EAB411B04B6 +:105CE000082E02D880252D012C4323438024A404B0 +:105CF0002343C0240360A4043B06234003644B7F7A +:105D00004D7B5C1EA3419B019A468B7C013D5C1E32 +:105D1000A3419B0299460B7C5C1EA3411B02984643 +:105D20004B7C5C1EA34107245B029C46302325402C +:105D30008C7B24011C400194F024CB6A2403013B9A +:105D40001B042340019C2B432343544623434C46CE +:105D50002343444623436446234383640B7B5C1EF6 +:105D6000A341CC7B1B02A446002C5ED1022F00D1A4 +:105D70007CE0741E0F2626401E43C0246346A40008 +:105D800033430351FF248B6924041B0423400C7DFF +:105D90002343C424A4000351CB7F002B49D0012FFF +:105DA0005AD0019C2C43446480239B00C650C124DC +:105DB000FF260B6BA400334003512023CB5C5F1EF6 +:105DC000BB415F062123CD5C013D6B426B411D064B +:105DD0002823CC5C013C63425C414B6A2404334081 +:105DE0003B432B43234303658B6B4C6B1E4081234A +:105DF0009B00C650284B2340284C0351CB6B2849AD +:105E00000B4028494350002A22D000230020536031 +:105E100093601360D36013621363D36203B03CBC1E +:105E200090469946A246AB46F0BD8024A400A44605 +:105E30009FE7019C2C434464012FB5D180235B0272 +:105E40001E43B1E78B7F0024002B00D143E73EE7E0 +:105E50000020E3E71448E1E78023019C5B002C432A +:105E60001C4380235B0244641E439DE70F27013ED1 +:105E70003E401E438023C0279B003343BF00C351D5 +:105E8000FF278B693F041B043B400F7D3B43C42726 +:105E9000BF00C35185E7C0466D0B0000C80F00006E +:105EA00073070000880F00000160AA00114B082250 +:105EB0000360C0210F3B03640023FF328900836429 +:105EC0004250043143500C3143501139FF3943647F +:105ED0004250FD328350084A03658350074A83507D +:105EE000074A8350074A8350074A8350074A835022 +:105EF0007047C0460F000003C80E0000880E000067 +:105F0000C80F0000880F0000080F0000480F0000B5 +:105F100003685B005B080360002904D000234B602A +:105F20000B600B62CB627047104B1A683A23D35C4C +:105F3000834219D9042911D94B1EFF3B132B13D8C7 +:105F40001F2319400A4B04229C46C0238000604452 +:105F50009B00C1504033C25000207047044BD030EA +:105F60008000C1500020F8E70248F6E70CAE0208B6 +:105F70000000264001004A00094A83009446D022CE +:105F80000720634492009A581040042806D1C0228A +:105F900092009B581B300340E13018437047C046C5 +:105FA00000002640B023254ADB00D35870B5002BF3 +:105FB00042DB0368C2799B039B0B002A38D1B021D6 +:105FC0001E4AC9005350038981881D4C1B04C90413 +:105FD000C90C23400B431B491B4D5350FF23C17A6F +:105FE000E02609010B408189F600090229400B4394 +:105FF0000F21857A2940C0250B43817BAD05090718 +:1060000029400B43B121C900535081790F4D09023A +:10601000535931400E4E334019435151038A51595F +:106020000C481B040140002023400B43535170BD1A +:10603000802252041343C2E70748F8E700002640D5 +:106040000000FF018405000000FF1F008C05000018 +:10605000FFF8FFFFFFFF00FE03004A008021F0B5BC +:10606000C646B2264B4D4C4A0906AB5800B50B4309 +:10607000AB50F600AB5980465B075BD4002800D1DB +:1060800077E00400042701E0002C67D0012000F035 +:10609000D5F9AB59013C1F42F6D0B121C9006B586C +:1060A0003E4A1A4080239B0513436B50002C5ED060 +:1060B000B0228023B226374DD200A9581B060B43CD +:1060C000AB50F600AB59DB0702D50DE0002C17D022 +:1060D000012000F0B3F9AB59013CDB07F6D543468C +:1060E000002B01D0002C0ED0B122C0232949D200B0 +:1060F00088589B05034300208B5004BC9046F0BD9C +:106100004346002BF0D0B120224BC0001A5823493F +:106110001140802292050A43B0211A50C9005A58F2 +:106120001F48520052085A501B495A5852005208F0 +:106130005A50E2E7B120C0002B58184A44461A4092 +:1061400080239B0513432B504346002BB0D1B02234 +:10615000D200AB581943A950AB59C5E7B121C900CA +:106160006B580E4A1A4080239B0513436B50AB5962 +:10617000C9E7B120C0002B58084A1A4080239B056C +:1061800013432B50B023DB00EA581143E950AB59BD +:10619000AAE7C046000026408C050000FFFFFFCFA5 +:1061A00002004A00204B70B51A683B23D35C83423F +:1061B00019D31E4B80009C461D4B6044C358002BD6 +:1061C00013DB8B789A1E0E2A0DD84A78541E112C98 +:1061D00009D8CD780C78002D03D0122C03D938269D +:1061E00006E0152C03D8134870BD1348FCE7702651 +:1061F000B442F8D80979022909D07F261202344026 +:106200001B0422431A43ED06094B1543C550C02415 +:10621000074AA405090783582140084C2340194325 +:1062200081500020E0E7C0460CAE02080000264086 +:10623000FC05000001004A0003004A00FFFFFFCFF9 +:10624000144B70B51A683B23D25C431E0C009A4273 +:106250001CD9114B8000C5188023104A1B06A95871 +:106260000F4E0B43AB50AB59DB070DD4002C02D1C2 +:106270000AE0002C0CD0012000F0E0F8AB59013C02 +:10628000DB07F6D5002C03D0002070BD0548FCE7E5 +:106290000548FAE70CAE020800002640FC050000A5 +:1062A0003C06000001004A0002004A00F0B5002848 +:1062B00066D00023C25E002A1BDA324CFF25A446BA +:1062C00003240F2340681440E40080012840A540C7 +:1062D000A0401340083B9B089B006344DE69AE432B +:1062E0003043D8612848274C284DA368AB421ED0C4 +:1062F000F0BD2825264C43882468655D1F2D1DD8D8 +:1063000095082F000726AD00B74325D10327174076 +:10631000FF00BB402468203464192668B4465E4000 +:10632000FF23BB40334066467340236014E0A468FB +:10633000A342DDD110329200D150D9E7266807255B +:106340008024154024062C438025AD01AC466344CF +:106350009B0095089C51AD000E4B03249C4643685E +:10636000FF20C0261440E4009B010340A040A3404E +:106370006544B600AF5987433B430020AB51B2E7B9 +:106380000148B5E700ED00E0010056000000000004 +:106390000CAE020800E100E0282230B5144B1B6867 +:1063A0009A5C1F2A16D884080722250095432A1EC6 +:1063B0000FD103321040C00081400A00FF2181400C +:1063C0001B68A40020331B191C6862401140614007 +:1063D000196030BD1A680723034080200006184367 +:1063E00080239B019C46614489008850F1E7C046A8 +:1063F0000CAE0208F8B5802506002D02A8420FD980 +:1064000004000A4F386801F073FC094B9C46644451 +:10641000AC42F7D8074BF318DB0BDB036644F61AE4 +:10642000054B1868704301F063FCF8BD447F020817 +:106430000080FFFFFF7FFFFF4C7F020810B5034B7A +:106440001B78584301F054FC10BDC046507F020831 +:10645000FEE7C04602680A4B10B51A6042685A60EF +:1064600082689A60C268DA6002691A6142695A6198 +:1064700082699A61C269DA61FFF7EAFF10BDC0461E +:10648000D806001003005A1E93414A22F0B5A424F6 +:106490005B429343643303278B429B41254A5B4213 +:1064A0001268145B156866193568BD431D43356075 +:1064B0001568214EAC4664442568B44635402560D5 +:1064C000A6241568145B66193568BD432B436546E1 +:1064D00033601368E3181C682C401C6000280ED041 +:1064E0000023102904D921338B429B415B420133A5 +:1064F0000F2052681168814319431160F0BD512388 +:10650000D05C00238842F3D25233D05C513B8842A6 +:10651000EED25233D05C513B8842E9D25233D05C48 +:10652000513B8842E4D25233D35C8B429B415B4265 +:106530000433DDE70CAE0208FFFCFFFF042810D097 +:106540009C210A4B00061A681368525898399B1808 +:10655000C02292041040064A186013688B431360EF +:106560007047034A136818431060F9E70CAE02083D +:1065700010E000E0F0B5002800D17FE0002A00D153 +:106580007CE080279468FF02A4043C40C027536845 +:10659000D5681B061B0C2343147FBF0223432C0426 +:1065A0003C40E02716692343FF0434063C40234364 +:1065B0000C1DA4012350002D59D0012D60D00124C1 +:1065C000890143180933FF3315681C60002E09D177 +:1065D00043181C0056690D34FF342660113394694A +:1065E000FF331C60441823001533FF331D60956C86 +:1065F0006B1C19D0F026F027136B36011B023340B9 +:10660000966B3F0336043E4033430F26976A2D01B5 +:106610003E403343166C21343607360C3343FF2695 +:1066200035402B43FF342360D36AC0251C0130233F +:106630002340546BAD0024022C4023430324556AAD +:1066400040182C402343D46B0100A501FF242C40AB +:106650002343546C2531A5000C242C402343FF31E7 +:106660000B603930136AFF3003600020F0BD8901F0 +:1066700043180933FF331D601568A7E70448F5E7A1 +:106680008901431815680933FF331D609EE7C04632 +:106690000100B600C0228020064952008B58C00578 +:1066A0009B009B0803438B50802388581B060343A1 +:1066B0008B5070470000264010B500F0CBF800F07A +:1066C00007F800F0B7F800F05BF800F087F810BDAD +:1066D000F0B557464E464546DE4680248021702060 +:1066E000254BE0B51B68E4009A68C9051151185A9A +:1066F000224D8246524410686E27284010606C225A +:1067000090469A5C6F2093460326A94684461D5CFA +:106710005846AE40DD5D9A68A840802506432D06A8 +:106720002E4316511659584601263040014348461B +:1067300011510432524411680840D82189010143A3 +:1067400011604246995C9A680320904662469A5CC2 +:10675000DB5D90400E40994002000B003243134332 +:1067600042462B43135143461B593CBC9046994625 +:10677000A246AB46F0BDC0460CAE0208FF00FFFFCC +:10678000124B1A683D23D05C2F280FD90020916846 +:106790000F4BC8506C23D25C6B3B13400D4A8B509F +:1067A0000D4A8B50C42212018B5070470528FCD92A +:1067B0006C230121D35C0B409168064A8B500F2853 +:1067C000F3D9054A8B501028ECD1EEE70CAE020845 +:1067D000BC0C0000140C00003C0C000010B50E4C6A +:1067E000002120000D4AFEF75BFC20000C4C01212B +:1067F0000C4AFEF755FC042120000B4AFEF750FC22 +:1068000006212000094AFEF74BFC07212000084A18 +:10681000FEF746FC10BDC04600003140A404031042 +:1068200000033140D8040310700403103C0403102B +:10683000080403103322034B03495A5003495A50AA +:106840007047C046000030400820000010200000C3 +:10685000FEE7C046F0B5CE46474680B596210020FB +:1068600083B0FFF70FFE3C22D54F3B689A5C002AAD +:1068700006D0E0213024D34889004258A243425038 +:10688000196884228C4680259A58CF4C624410683F +:106890002040106058591A688446802062441100D4 +:1068A000126840041202120A02430A6019685A5917 +:1068B0008C4662441168214011603B229A5C131E91 +:1068C0001FD0C249C24E894680218905884603E00F +:1068D0003B233A68D25C2B005D1E95420FD2B94A29 +:1068E0009B009C184A46A35901201340424613437B +:1068F000A351FFF7A3FDA3595B005B08A351002D33 +:10690000E6D1E0240F26AF4D00210120A400FFF7BF +:106910000BFB2B591E4200D125E1B121A94CC90026 +:106920006358AA4A00201A4080239B051343B022D3 +:106930006350D200A35800215B005B08A350A54A16 +:10694000A3585B005B08A350FFF7EEFA3C233A68BC +:10695000D35C002B05D0E0220F219200A3588B437B +:10696000A35000240023002200219B480094FEF73E +:106970006BFC00230022012197480094FEF764FC81 +:106980000822964D2B6813432B602B695B070FD4AD +:106990000426934C02E0002C00D1E0E00120FFF738 +:1069A0004DFD2B69013C1E42F5D0002C00D1D6E0F4 +:1069B000A02203210125834CD200A35882488B4397 +:1069C0002B43A3503B68842219689A588C46624432 +:1069D0001168802601401160802294469A581968F7 +:1069E000904641440A6876041202120A32430A6051 +:1069F00061461A685B580021D3181A6802401A6071 +:106A00000120FFF791FA3C233A68D35C002B06D0B3 +:106A1000E0220F219200A3588B431D43A550002173 +:106A20000020FFF781FA00210220FFF77DFA6D4870 +:106A3000FFF7B8FA002800D0BDE06B48FFF70EFB67 +:106A4000002800D0B3E03C233A68D35C002B0AD086 +:106A5000E0230F205B4A9B00D1588143D150D1588D +:106A600021308143D15000210120FFF75DFA012040 +:106A70005E49FFF797FB002800D094E001205C49B5 +:106A8000FFF7DEFB002800D089E002205949FFF71C +:106A900089FB002800D07EE002205549FFF7D0FB9B +:106AA000002800D073E03C233A68D05C022829D942 +:106AB000E2220F2530241026424B92009958A94318 +:106AC00099509958A1433143995080219E58090605 +:106AD0000E439E50032815D004329E58AE439E505C +:106AE0009E58A6439E509E580E439E50042809D09F +:106AF00004329858A84398509858A04398509858F2 +:106B00000143995080252F4C3B4B3C49E2582D06C0 +:106B100052005208E250E25800200A40E250E25887 +:106B200037490A40E250E2582A43E250FFF706FD97 +:106B30002A49344A0B681A4080235B0013430B60D8 +:106B40000121314BE2581543E550E2580A43E25027 +:106B500000F038FA03B00CBC90469946F0BD052011 +:106B6000FFF776FE24E70020FFF706FA1223FF3333 +:106B7000984200D0D1E63A68D53BD35C002B00D1D7 +:106B8000CBE601222B59B34313432B51C5E6032017 +:106B9000FFF75EFE87E70320FFF75AFE7CE703203E +:106BA000FFF756FE71E70320FFF752FE66E7042069 +:106BB000FFF74EFE47E70420FFF74AFE3DE7C046D9 +:106BC0000CAE020800002640FF00FFFFFFFFFFCFD2 +:106BD000FC0500008C05000000003140000027404B +:106BE00040420F000C050310400D03002005031068 +:106BF000102700002805031004050000FEFCFFFF1D +:106C0000FFFF00FFFFFCFFFF0C05000010B50E4862 +:106C1000FEF7C2F9FFF750FD00F046FB0B490C48A8 +:106C2000FFF744FB002804D100F0E2FA032807D064 +:106C300010BD0848D9F702FF00F0DAFA0328F7D1AF +:106C400000F018FBF4E7C04614030310D537021018 +:106C50001410000830050310002070470020704712 +:106C600010B506210E20FEF7DBFB002800D010BD7A +:106C700007210F30FEF7D4FB0028F8D10121FEF7E1 +:106C8000CFFBF4E770B5084D2C001434206800F0F9 +:106C9000ABFD2300043C9D42F8D100F0BFFDBFF3E3 +:106CA0004F8FBFF36F8F70BD087F020830B510485B +:106CB00083B0D9F7C3FE0F4C0F4823681900019326 +:106CC000D9F730FE63680D4819000193D9F72AFE01 +:106CD000A3680B4819000193D9F724FE094C25003D +:106CE000183501CC00F090FCAC42FAD103B030BDB5 +:106CF000740503101406031084050310B005031077 +:106D0000E0050310087F020870B5064C2500183511 +:106D100001CC00F0A5FFAC42FAD1BFF34F8FBFF317 +:106D20006F8F70BDF07E02081B4B30B51B680002F0 +:106D30001C6A09040143226818480143002A1BDA2F +:106D40000122E160A260AF32995861180B68002BF4 +:106D50000BDA0023124801E0834216D00A6801339F +:106D6000002AF9DB0E4A93420FD0A023E0681B06ED +:106D7000984200D1002030BD0022094D2068013228 +:106D8000002805DA06488242DAD101204042F2E7C3 +:106D9000AA42F3D1F9E7C0460CAE02080100003A5E +:106DA000983A000086220D4B00B51B6852011B6A01 +:106DB00083B09918C968C90103D580214904995045 +:106DC0009B5801A8FCF7B4FC054B019A9A4203D1E9 +:106DD0008022044B52055A6003B000BD0CAE02087D +:106DE000C650CFA500ED00E0AC2210B5094B202124 +:106DF0001B689A5A1B6AD0008018C018064AFEF712 +:106E000071FC43425841054B40421840044B9C469C +:106E1000604410BD0CAE02085AFC05C6FBFFFF7FA4 +:106E200005000080002310B582B004000193FEF736 +:106E300099FE102820D9AE20FCF79AFCFCF7B4FC90 +:106E400001A8FCF755FCA423019A1D21E25007205C +:106E5000FFF7A2FAC120C021084A80001358090692 +:106E60001B021B0A0B43135080231360C320FCF743 +:106E70007FFC002002B010BD0148FBE700E100E00C +:106E80000700008010B500211020FEF7A3FD0028A8 +:106E9000F9D110BD10B500211020FEF7F1FD00283A +:106EA000F9D110BD0B00012210B5202805D11F32E9 +:106EB00018000349D9F75CFC0022100010BDC04641 +:106EC0002006031010B50400236808001F2B07D903 +:106ED00020220449D9F74CFC20230020236010BD58 +:106EE0000120FCE74406031010B5040023680800E5 +:106EF000112B07D912220449D9F73AFC122300209A +:106F0000236010BD0120FCE768060310EFF3098041 +:106F100001B5F0B444464D4656465F46F0B4684667 +:106F2000FCF7D2FBF0BCA046A946B246BB46F0BC7B +:106F300003BC8E4680F309887047C04603235B423A +:106F4000016243627047C04604207146084202D085 +:106F5000EFF3098000E070477146FDF7C9FB004779 +:106F6000FEE770477047C0467047C046F0B5C6465A +:106F7000884600B5069C0600203C15000021202212 +:106F800020001F00FDF786FC434623600123A56116 +:106F90009D4380235B0430006561E361282200216A +:106FA000FDF778FC3A0030002100FFF7C7FF04BC72 +:106FB0009046F0BD10B50020FEF772FC10BDC04633 +:106FC0007047C046E023594A9B00D3580F2207213F +:106FD0001340564A08009446D02270B59C00644481 +:106FE0009200A2581040114200D199E0042800D12B +:106FF00086E04F48002B54D1B223B12503224B49E0 +:10700000DB00ED00CE584B594C591B0F240F134099 +:10701000224200D06BE0F20700D46EE0B022434B76 +:107020004449D2009C5859589D58C904C90CDCF7F2 +:107030009FF8A303E9019B0BC90F58430131DCF70B +:1070400097F8E023394A9B00D3583B4A9B069B0F95 +:10705000D8403A4B18603A4BD458D158090E0131F8 +:10706000DCF786F8374B2104090E18600131DCF794 +:107070007FF8354B04001860344B35491860354BA8 +:10708000C018DCF775F8FA21334B89001870334BC0 +:10709000E018DCF76DF8324B1860324BC003186013 +:1070A00070BD013B012BCCD803252F4B2F49E6584F +:1070B00063586258120F154234D06258120F1540AF +:1070C000012D2FD09B009B0F032BBAD17F23274A82 +:1070D000A558A1582B401F25A458090A29405843F8 +:1070E000DCF746F8210C2940DCF742F8A9E74959BA +:1070F000090F0A40012A00D18DE7032BA1D18DE7AA +:10710000C0229200A2581B3010401138421E9041FC +:10711000174A40421040802212029446604469E7B8 +:10712000144867E7F207D1D4CCE7C04600002640F8 +:1071300000366E0184050000000020403C7F0208FC +:1071400008100000407F0208387F0208487F0208CC +:1071500040420F003F420F00507F0208E70300004B +:107160004C7F0208447F02083C060000FC0500003A +:1071700000FDFFFF00127A0010B51648FDF70CFF66 +:10718000154A164BE0219A60B0223020144CD200F0 +:10719000A35889005B005B08A35063588343635086 +:1071A00080235B04A3500F4B0F4AE250A02204330C +:1071B0009201E250FF220D4BE250FFF76BFAC02222 +:1071C00001215200A3588B43A350FFF7F9FEFFF7AC +:1071D000F9FE10BD140303100004001000ED00E0E0 +:1071E0000000264084050000010002008C0500001C +:1071F00090230320024A5B01D35818407047C046D1 +:1072000000002040F8B59027164C7F01060000F0E2 +:1072100078FDE3590500DB439B0713D080239020C2 +:10722000104A9B00D650400113580F4919400F4B8C +:107230000B431021135053681942FCD0280000F072 +:1072400064FDF8BD00F05DFDE359074A1A40084BA4 +:1072500013431022E35163681A42FCD000F055FD3D +:10726000DCE7C04600002040FCFF00000300FA05F8 +:107270000100FA0510B5902400F043FD074A6401AF +:10728000135907491940074B0B43102113515368F9 +:107290001942FCD000F039FD10BDC046000020406E +:1072A000FCFF00000000FA050022002110B50320B9 +:1072B000FEF746FB0648FEF735FA064B1A684D23E3 +:1072C000D35C002B00D110BD0348FEF735FAFAE776 +:1072D00068A202080CAE02087C06031010B505482F +:1072E000FDF75AFEFFF7CEFCFFF70EFDFFF7B8FCE7 +:1072F000002010BD1403031010B50C00054806490A +:10730000D9F710FB611E8C41022360429843033081 +:1073100010BDC046B0060310F0070310014B1868FB +:107320007047C04614060310014B1B68586870472D +:107330001406031010B50400FFF7B8FC012101206A +:10734000FFF7F2FC002807D021000748D9F7EAFA36 +:107350002000FFF757FF10BD6430FFF74BF80348DC +:10736000D9F76CFBF0E7C046D8060310BC06031043 +:107370008621F0B58026AC2486251D4F49013A6848 +:107380007604136A83B059188E60125B2021D000F6 +:107390008018C018174AFEF7A5F93B686D01195B04 +:1073A000186AC900543486235B01C218D3681B0CC9 +:1073B0002342FBD046514359081801A9FEF7A0F912 +:1073C000031E05D0AC223B68995A186AC900EAE747 +:1073D000AC213A68515A106AC9000A185360064B2A +:1073E000019A9A42DFD10548D9F728FB03B0F0BDD6 +:1073F0000CAE020811E0AD7DEE1F5282F8060310BC +:1074000030B503B2020415D4154AC02594460322B0 +:107410001040C000FC3282409B089B006344AD00DA +:107420005C5994432200C0242140814011435951AA +:10743000002030BD03240F230A4A03409446204015 +:10744000C000FC348440083B9B089B006344DA691D +:10745000A243C024214081401143D961E8E7C046DE +:1074600000E100E000ED00E010B5FDF73DFC10BDCF +:1074700010B51400FDF774FC0020FDF7EFFF013894 +:1074800043425841207010BD10B5FDF79BFC10BD64 +:1074900010B5FFF7E3FB10BD030407D41F23C02280 +:1074A00018401E3B8340024952008B507047C04633 +:1074B00000E100E0030405D41F2318401E3B834075 +:1074C000014A13607047C04600E100E003040AD49B +:1074D0001F2318401E3B8340802203498B50BFF37B +:1074E0004F8FBFF36F8F704700E100E000207047BF +:1074F00010B5FFF7B1FB10BD0020704700207047AA +:107500000020704700B5B9B0FFF780FBE022684665 +:107510000549D9F72DF9E02269460448D9F728F939 +:10752000002039B000BDC04610070310000001085C +:10753000C02080017047C046172303600048704791 +:107540002C0803101123036000487047180803102B +:10755000BFF34F8F034B044ADA60BFF34F8FC0462F +:10756000FDE7C04600ED00E00400FA050320704787 +:1075700010B5FFF7C7FF041E02D00124200010BD84 +:1075800062B6FAF725FCF9E7BFF34F8F034B044AC5 +:10759000DA60BFF34F8FC046FDE7C04600ED00E064 +:1075A0000400FA0510B5039A102A07D8002A03D060 +:1075B00003490298D9F7DCF8002010BD0120FCE750 +:1075C0006C08031070B514000C4A060015688D4253 +:1075D00011D80B4A12881A80002D03D02A000949BD +:1075E000D9F7C6F80023002026606560A360E36039 +:1075F0002361636170BD0120FCE7C0466808031089 +:107600004408031048080310F0B5CE46474680B53D +:1076100003684D4A050083B0934200D192E021DC1B +:107620004A4A934200D189E059DD494A934200D148 +:107630007CE0484A93424DD147490123287A6A6841 +:1076400001308340687A00281FD0444800904448A5 +:10765000D9F768F96B7A002B1FD103B00CBC9046A8 +:107660009946F0BD3F4A934266D046DD3E4A93427A +:107670005ED03E4A93423BD10123287A3C490130F7 +:107680008340687A6A680028DFD13A48009034481D +:10769000D9F748F96B7A002BDFD001212B7A3648D5 +:1076A00001339940C908D9F73DF9344B0024994674 +:1076B000334B01269846334F6B7A424623411E4294 +:1076C00000D14A46210038000134D9F72BF9082CA3 +:1076D000F2D1C2E72C4A934232D12C49ADE72C4A71 +:1076E000934227D011DD2B4A934229D12A49A4E79E +:1076F0002A4A934224D12A499FE72A4A934213D027 +:10770000294A934209D1294997E7294A934209D046 +:10771000284A934214D128498FE7284A93420FD12F +:1077200027498AE7274988E7274986E7274984E7E1 +:10773000274982E7274980E727497EE727497CE7F1 +:1077400027497AE7274978E7002223400021234090 +:1077500080212340C0212340B008031014090310E6 +:107760001C0903100023234080232340C02323400F +:10777000E8080310100903105809031098090310B2 +:10778000780903108409031040212340E008031006 +:1077900080202340C0202340B8080310402323400A +:1077A0000809031080222340C0222340C808031088 +:1077B0000020234040202340A00803104022234003 +:1077C000F008031090080310D8080310C008031035 +:1077D000F808031000090310D008031098080310DC +:1077E0007C080310A8080310010010B5040001C9AB +:1077F000FDF76EFE002800D010BD2100206810317A +:10780000FDF738FE0028F7D12068FDF7A9FE002813 +:10781000F2D12068FDF796FEEEE7C04600B585B0D0 +:107820000A22002101A8D8F7BFFF6A46B64BB74924 +:1078300053810123D381B64BB64A9A585B58002A2C +:1078400002DB002B00DBBBE0B34AB24BB049D3589C +:10785000B24A8A58002B02DB002A00DBBDE0AE4AA8 +:10786000AF4BAB49D358AF4A8A58002B02DB002AF2 +:1078700000DBBFE0A84AAC4BA549D358AB4A8A58B5 +:10788000002B02DB002A00DBC1E0A34AA84BA04981 +:10789000D358A84A8A58002B02DB002A00DBC3E039 +:1078A0009D4AA54B9A49D358A44A8A58002B02DB1B +:1078B000002A00DBC5E0984AA14B9549D358A14A5C +:1078C0008A58002B02DB002A00DBC7E0924A9E4B5D +:1078D0008F49D3589D4A8A58002B02DB002A00DBCF +:1078E000C9E08D4A9A4B8A49D3589A4A8A58002B44 +:1078F00002DB002A00DBCBE0874A974B8449D35850 +:10790000964A8A58002B02DB002A00DBCEE0824A2E +:10791000934B7F49D358934A8A58002B0CDB002A9B +:107920000ADB914801A9FDF7A5FD002846D18E4844 +:10793000FDF708FE002841D1774A8C4B7449D35893 +:107940008B4A8A58002B0CDB002A0ADB894801A9E4 +:10795000FDF790FD002831D18648FDF7F3FD0028A2 +:107960002CD16D4A844B6A49D358844A8A58002BDB +:1079700002DB002A00DBB0E0674A814B6449D35840 +:10798000804A8A58002B02DB002A00DB1AE1624A97 +:107990007D4B5F49D3587D4A8A58002B02DB002A71 +:1079A00000DB26E15C4A7A4B5949D358794A8A5818 +:1079B000002B02DB002A00DB32E1002005B000BD15 +:1079C000754801A9FDF756FD0028F7D17248FDF76B +:1079D000B9FD002800D137E7F0E7704801A9FDF7AD +:1079E00049FD0028EAD16D48FDF7ACFD002800D123 +:1079F00035E7E3E76A4801A9FDF73CFD0028DDD142 +:107A00006748FDF79FFD002800D133E7D6E76548BA +:107A100001A9FDF72FFD0028D0D16248FDF792FDA6 +:107A2000002800D131E7C9E75F4801A9FDF722FD31 +:107A30000028C3D15C48FDF785FD002800D12FE761 +:107A4000BCE75A4801A9FDF715FD0028B6D15748F3 +:107A5000FDF778FD002800D12DE7AFE7544801A9D4 +:107A6000FDF708FD0028A9D15148FDF76BFD00285E +:107A700000D12BE7A2E74F4801A9FDF7FBFC002846 +:107A80009CD14C48FDF75EFD002800D129E795E721 +:107A9000494801A9FDF7EEFC002800D08EE74648D2 +:107AA000FDF750FD002800D126E787E7434801A9EC +:107AB000FDF7E0FC002800D080E74048FDF742FDDC +:107AC000002800D07AE7144A254B1149D358254A9B +:107AD0008A58002B00DB22E72EE7394801A9FDF781 +:107AE000C9FC002800D069E73548FDF72BFD0028C8 +:107AF00000D063E7084A224B0549D358214A8A58E7 +:107B0000002B00DB40E742E70103000024200000D7 +:107B100000002340042000004000234064200000B7 +:107B200044200000A420000084200000E420000085 +:107B3000C420000024210000042100006421000072 +:107B400044210000A421000084210000E421000061 +:107B5000C42100002422000004220000642200004E +:107B600044220000A422000080222340842200003E +:107B7000E4220000C0222340C4220000242300008D +:107B8000042300006423000044230000A423000019 +:107B900084230000E42300000020234040202340F1 +:107BA00080202340C0202340002123404021234047 +:107BB00080212340C0212340002223404022234033 +:107BC000002323401D4801A9FDF754FC002800D0E4 +:107BD000F4E61A48FDF7B6FC002800D0EEE6184A95 +:107BE000184B1949D358194A8A58002B00DBD6E69E +:107BF000D8E6174801A9FDF73DFC002800D0DDE6D6 +:107C00001348FDF79FFC002800D0D7E60C4A114B23 +:107C10000D49D358104A8A58002B00DBCAE6CCE63F +:107C20000E4801A9FDF726FC002800D0C6E60B4847 +:107C3000FDF788FC002800D1BFE6BFE640232340C3 +:107C4000400023404423000000002340A423000000 +:107C50008023234084230000E4230000C02323402A +:107C600010B50178040082B0002907D0012925D081 +:107C70001C48D8F757FE1C4802B010BD2423016AE7 +:107C8000C25C4068FDF790FC0028F5D1207EE37DC2 +:107C9000A27DA18A00906068FDF7B4FC0028EBD1BA +:107CA0006068FDF7C5FC0028E6D1E37AA27A218955 +:107CB0006068247B0094FDF761FCDDE7C37D827D75 +:107CC000818A007E00906068FDF7E2FC0028D3D135 +:107CD000E37AA27A21896068247B0094FDF7C2FCD4 +:107CE000CAE7C046480A03100100C20000000000B5 +:107CF0000230800803D001300238FCD1C046C046B3 +:107D00007047EFF3108072B6704780F310887047A9 +:107D100070B50D4C2378002B06D00123A168626852 +:107D20008B409360936170BD01252B00A168606852 +:107D30008B4022694360054B13605361FEF71AFCC8 +:107D40000028F0D12570E8E70010000848E801009D +:107D5000034B99685A6801238B4053607047C046B3 +:107D600000100008002303707047C04670B58CB047 +:107D700003AC2200204B050043CB43C243CB43C29C +:107D800003CB03C21B880120138000232122009310 +:107D900000212300D9F74AFE00281ED10123242206 +:107DA000009301200021154BD9F740FE061E0DD18E +:107DB00080231B0600932122230003200021D9F7F2 +:107DC00035FE863010D12E700CB070BD2B00D32242 +:107DD0000B490C48F9F7F8FDF6E72B00C7220849D4 +:107DE0000948F9F7F1FDEFE72B00DA2204490748CB +:107DF000F9F7EAFDE8E7C046BC0C0310300C0310AD +:107E0000580B0310580C03100C0C0310900C0310AB +:107E100010B586B00C220021040003A8D8F7C4FCDA +:107E20000320002103AAD9F75FFE8C3017D1049BF1 +:107E30000193002B22D1059B0193002B17D1002029 +:107E4000002103AAD9F750FE87301FD1049B01936C +:107E5000002B23D1059B002B27D1237005E02300A5 +:107E6000154A16491648F9F7AFFD06B010BD2300B4 +:107E7000144A12491448F9F7A7FDF6E7C422230073 +:107E80000E4912489200F9F79FFDEEE7C722230042 +:107E90000A490F489200F9F797FDE6E723000D4ADB +:107EA00006490A48F9F790FDDFE723000A4A03492B +:107EB0000548F9F789FDD8E70A030000580B0310BD +:107EC000E00C0310150300002C0D03100C0D031023 +:107ED0004C0D0310220300002703000010B586B0EC +:107EE0000C220021040003A8D8F75EFC0120002129 +:107EF00003AAD9F7F9FD002810D1049B0193242B84 +:107F000005D1059B012B10D1207006B010BD2300B8 +:107F1000094A0A490A48F9F757FDF6E72300094AD2 +:107F200006490948F9F750FDEFE72300074A0349DE +:107F30000748F9F749FDE8E7C1020000580B0310B4 +:107F4000A80D0310BB0200007C0D0310C602000048 +:107F5000CC0D0310F0B59BB00C220021040003A847 +:107F6000D8F722FC06AB1900324A61CA61C161CA66 +:107F700061C121CA21C112880FAD0A8029002E4A91 +:107F8000C1CAC1C1C1CAC1C1C1CAC1C110680860EA +:107F9000928802208A8000220021029200922132DF +:107FA000D9F744FD00281BD102200021D9F7C4FDD8 +:107FB000061E0ED10220002103AAD9F795FD8C30B0 +:107FC00015D023001D4A1E491E48F9F7FDFC1BB0C1 +:107FD000F0BD23001C4A1A491C48F9F7F5FCF6E7E6 +:107FE00023001B4A16491B48F9F7EEFCEFE702ABEA +:107FF000019300222123022000210095D9F740FDA2 +:108000008C3007D102200021D9F796FD8C3009D1A0 +:108010002670DCE7E022230009490F489200F9F7B7 +:10802000D3FCD4E723000D4A05490D48F9F7CCFCF1 +:10803000CDE7C046BC0C0310B00E0310790300005E +:10804000580B03102C0E031072030000040E0310D3 +:108050006B030000F00D03105C0E0310870300009B +:10806000840E031070B58CB003AB1900154A0400E0 +:1080700061CA61C161CA61C121CA21C112880420DB +:108080000A800022002100922132D9F7CFFC00287B +:1080900008D104200021D9F74FFD00280AD1207013 +:1080A0000CB070BDCF222300074908489200F9F7B1 +:1080B0008BFCF5E72300064A03490648F9F784FCE0 +:1080C000EEE7C046BC0C0310580B0310F00D031074 +:1080D00052030000040E031070B590B00C22002172 +:1080E000040004A8D8F760FB07AB1900264A61CA50 +:1080F00061C161CA61C121CA21C1128802200A80FE +:108100000022002100922132D9F790FC002815D1DD +:108110000220002104AAD9F7E7FC00281ED1059B04 +:108120000393212B13D1069B002B1ED1022000218B +:10813000D9F702FD00281FD1207006E0B7222300E6 +:10814000124913489200F9F73FFC10B070BD2300AC +:10815000104A0E491048F9F737FCF6E723000F4A9A +:108160000A490F48F9F730FCEFE723000D4A0749A9 +:108170000D48F9F729FCE8E723000C4A03490C48AD +:10818000F9F722FCE1E7C046BC0C0310580B0310C2 +:10819000F00D0310E9020000040F0310E3020000D9 +:1081A000DC0E0310EE020000240F0310F5020000A5 +:1081B000040E031070B58CB003AB19001E4A040006 +:1081C00061CA61C161CA61C121CA21C1128804208A +:1081D0000A8000220021029200922132D9F726FC67 +:1081E00000281BD102AB0193009000230022042041 +:1081F0000021D9F745FC002808D104200021D9F737 +:108200009BFC002811D120700CB070BDA822230067 +:108210000A490B489200F9F7D7FBF5E72300094A12 +:1082200006490948F9F7D0FBEEE72300074A03495E +:108230000748F9F7C9FBE7E7BC0C0310580B03101C +:10824000440F031099020000F00D0310A702000074 +:10825000040E031030B5234B85B01B7803AC23709C +:108260000023050000930022230002200021D9F7FB +:10827000DDFB002820D100902300002202200021F5 +:10828000D9F7D4FB002810D1009023000022002051 +:108290000021D9F7CBFB873015D02B00A82212493B +:1082A0001248F9F791FB05B030BD2B00A1220E4911 +:1082B0000F48F9F789FBF6E72B009A220A490D4887 +:1082C000F9F782FBEFE702200021D9F735FC0028FF +:1082D00001D12870E7E72B00AF2203490648F9F7E0 +:1082E00073FBE0E7B0020310580B0310D80F031024 +:1082F000A40F0310800F0310040E0310F0B52D4DD2 +:108300008FB003AC23002A00060083CA83C383CA4C +:1083100083C383CA83C31168022019609288002135 +:108320009A800023029302AB019304AB00930022D6 +:108330000123D9F7A5FB8C3024D12A222900200063 +:10834000D8F708FA002815D102AB019304AB0093CB +:108350000022012300200021D9F792FB873019D198 +:108360002A2229002000D8F7F5F900281AD1307008 +:108370000FB0F0BDF52233000F4910485200F9F755 +:1083800023FBF5E7F22233000B490D485200F9F7C1 +:108390001BFBEDE7F922330007490A485200F9F7C1 +:1083A00013FBE5E7FC223300034904485200F9F7C8 +:1083B0000BFBDDE7B00E0310580B03102810031061 +:1083C0000410031054100310F0B599B003AB19005A +:1083D000274A040061CA61C161CA61C121CA21C1C1 +:1083E00012880CAD0A802900224AC1CAC1C1C1CA83 +:1083F000C1C1C1CAC1C141CA41C1127801200A70BC +:1084000000220021029200922132D9F70FFB853021 +:1084100008D02E22230018491848FF32F9F7D4FA61 +:1084200019B0F0BD02AB01930DAB009300222423E1 +:1084300001200021D9F724FB002808D12D22280093 +:108440000F49D8F787F9002809D12070E8E73622CC +:10845000230009490B48FF32F9F7B6FAE0E73C225E +:10846000230005490848FF32F9F7AEFAD8E7C046BD +:10847000BC0C031008110310580B031074100310E8 +:10848000B01003109C100310E0100310F0B5DE468E +:1084900045464E465746E0B54B4D91B0290018224F +:1084A000039004AC0AA8D8F763F92300183507CD68 +:1084B00007C3464BA0469946454B0AAD9B462E68DE +:1084C0006F6843461B680C22002107A89A46D8F71C +:1084D0006BF98022002112014846D8F765F9002384 +:1084E0005246009330005B463900D9F79FFA0028C6 +:1084F00036D13000390007AAD9F7F6FA002836D16C +:10850000089C54453AD1099B0293002B3DD1314B35 +:10851000002201934B463000009339002300D9F725 +:10852000AFFA002839D1220059464846D8F712F947 +:1085300000283AD130003900D9F7FEFA00283BD1A3 +:1085400004239C46083510ABE0449D42B7D1039B01 +:10855000187011B03CBC90469946A246AB46F0BD9F +:10856000039B1D4A1D491E48F9F72EFAF1E7039BAC +:108570001C4A1A491C48F9F727FAEAE7039B1B4AE9 +:1085800016491B48F9F720FAE3E79522039B1349A4 +:108590001848D200F9F718FADBE79622039B0F4937 +:1085A0001548D200F9F710FAD3E7039B134A0B4999 +:1085B0001348F9F709FACCE7039B124A0749124816 +:1085C000F9F702FAC5E7C046601B0310E8A30208EA +:1085D000841B0310E8AB020896040000580B03103C +:1085E000800F03109D040000DC0E0310A3040000A4 +:1085F000040F0310240F031038110310B6040000F9 +:108600005C110310BD040000040E031070B53F4B55 +:1086100094B004933E4B09AC05933E4B05001A6899 +:1086200007929B8802AA138322003B4B43CB43C291 +:1086300043CB43C243CB43C21968032011609B88DC +:1086400000219380002304220693009304ABD9F702 +:10865000EDF9002831D1009004220320002105AB60 +:10866000D9F7E4F9002820D1009006220320002148 +:1086700007ABD9F7DBF9002833D106AB0193002211 +:108680000623032000210094D9F7FAF900282FD1FE +:10869000079B0393039A2368934215D02B001F4A2C +:1086A0001F492048F9F790F905E02B001E4A1C49A4 +:1086B0001E48F9F789F914B070BD2B001C4A1849FF +:1086C0001C48F9F781F9F6E702ABA2881B8B9A42A6 +:1086D000E4D103200021D9F72FFA00280FD1287008 +:1086E000E9E72B00144A0E491448F9F76DF9E2E75F +:1086F0002B00134A0A491348F9F766F9DBE72B0008 +:10870000114A07491148F9F75FF9D4E74F4E450080 +:1087100054574F001C120310B00E031057040000F2 +:10872000580B0310E411031043040000AC110310B4 +:108730003C040000901103104A040000C81103100B +:10874000510400009C1003105E040000041203108A +:10875000F0B599B004AB19002F4A060031CA31C1F7 +:1087600031CA31C111CA11C112880DAF0A80390056 +:108770002A4A31CA31C131CA31C131CA31C1106846 +:108780000860928802208A800022002103920092D1 +:108790002132D9F74BF9002828D1002403AD02E09B +:1087A0000134212C13D00EAB1B190093220001239E +:1087B000022000210195D9F763F90028F0D0330099 +:1087C000174A18491848F9F7FFF819B0F0BD2A22DE +:1087D00038001649D7F7BEFF00280ED1022000212D +:1087E000D9F7AAF900280FD13070EEE73300104A0C +:1087F0000C491048F9F7E8F8E7E733000E4A094951 +:108800000E48F9F7E1F8E0E733000D4A05490D4855 +:10881000F9F7DAF8D9E7C046BC0C0310B00E031024 +:1088200014040000580B0310241203104C12031000 +:108830000A040000F00D03101C040000E4110310F2 +:108840002304000004120310F0B5C64600B59AB028 +:1088500003AB1900404A804621CA21C1108806ADE9 +:10886000088092788A7029003C4AC1CAC1C1C1CA35 +:10887000C1C141CA41C112880FAE0A803100384AD5 +:1088800091CA91C191CA91C191CA91C11068086001 +:10889000928803208A8000220021029200920B32EB +:1088A000D9F7C4F8002834D100902B0021220420ED +:1088B0000021D9F7BBF8002821D103200021D9F7E6 +:1088C0003BF9002833D102AB019310AB0093002297 +:1088D000212304200021D9F7D3F800282ED12A2201 +:1088E00030002049D7F736FF002819D10420002195 +:1088F000D9F722F94346002827D1187005E04346EE +:10890000194A1A491A48F9F75FF81AB004BC904698 +:10891000F0BD4346174A15491748F9F755F8F4E7EB +:108920004346164A11491648F9F74EF8EDE7434613 +:10893000144A0E491448F9F747F8E6E74346134A44 +:108940000A491348F9F740F8DFE7124A0749124885 +:10895000F9F73AF8D9E7C04620130310BC0C03100E +:10896000B00E03104C120310D2030000580B03107A +:1089700098120310CB03000078120310EA030000E2 +:10898000E4110310DB030000B8120310E50300003C +:10899000DC120310F1030000FC120310F0B5C64610 +:1089A00000B598B004AB1900614A050051CA51C125 +:1089B00051CA51C111CA11C112880DAE0A805D4A57 +:1089C00090463200414691C991C291C991C291C964 +:1089D00091C20868106089880320918000220021DC +:1089E000039200922132D9F721F800285DD103AB20 +:1089F00001930EAB00932222012303200021D9F71B +:108A00003FF8873047D12A2241463000D7F7A2FEEF +:108A1000002859D103AB01930EAB0093002222230F +:108A200003200021D9F72CF8002854D1039B212BD7 +:108A300043D12A2230004049D7F78CFE002852D17A +:108A40003300444607CC07C307CC07C307CC07C392 +:108A5000226803201A60A28800219A8003AB019348 +:108A60000EAB009301222123D9F70AF8002850D138 +:108A7000039B202B46D12A2230003049D7F76AFECB +:108A8000002838D103200021D9F756F8002848D112 +:108A900000232B7005E02B00294A2A492A48F8F7C1 +:108AA00093FF18B004BC9046F0BD85222B002549E9 +:108AB00026489200F8F788FFF3E72B00244A214963 +:108AC0002448F8F781FFECE72B00234A1D4923488F +:108AD000F8F77AFFE5E78C222B001A49204892002C +:108AE000F8F772FFDDE78F222B0016491B48920032 +:108AF000F8F76AFFD5E72B001A4A12491748F8F72A +:108B000063FFCEE72B00184A0E491848F8F75CFFC0 +:108B1000C7E793222B000B4915489200F8F754FF42 +:108B2000BFE72B00134A07491348F8F74DFFB8E792 +:108B3000BC0C0310B00E03104C120310A41403104D +:108B40001F020000580B03102C130310F00D03102C +:108B500036020000CC130310250200005C13031042 +:108B60008C1303105902000052020000501403102D +:108B7000001403107D020000040E0310F0B5C64679 +:108B800000B598B004AB1900414A050051CA51C163 +:108B900051CA51C111CA11C112880DAC0A803D4A97 +:108BA000904622004146C1C9C1C2C1C9C1C2C1C9A2 +:108BB000C1C20868106089880420918000220021C9 +:108BC000039200922132D8F731FF00282DD103AB58 +:108BD00001930EAB00930022002304200021D8F75C +:108BE0004FFF00283CD12A2241462000D7F7B2FD92 +:108BF000002825D103AB01930EAB0093052200237F +:108C000004200021D8F73CFF002831D12A22414618 +:108C10002000D7F79FFD00281AD104200021D8F7A3 +:108C20008BFF00282CD1287006E0D3222B001A4994 +:108C30001A485200F8F7C8FE18B004BC9046F0BDC0 +:108C4000DA222B00144916485200F8F7BDFEF3E76C +:108C5000E2222B00104912485200F8F7B5FEEBE76C +:108C6000D7222B000C490F485200F8F7ADFEE3E77E +:108C7000DF222B0008490C485200F8F7A5FEDBE77D +:108C8000CC222B0004490948FF32F8F79DFED3E7B8 +:108C9000BC0C0310B00E0310580B0310F00D0310A2 +:108CA0005C130310D01403109C100310040E031067 +:108CB000F0B5C64600B598B004AB19005E4A050091 +:108CC00051CA51C151CA51C111CA11C112880DAE48 +:108CD0000A805A4A90463200414691C991C291C9D0 +:108CE00091C291C991C2086810608988032091805F +:108CF00000220021039200922132D8F797FE00282B +:108D000044D103AB01930EAB009300222123032037 +:108D10000021D8F7B5FE00284BD12A22300048495F +:108D2000D7F718FD00283CD13300444607CC07C3D1 +:108D300007CC07C307CC07C3226803201A60A288A8 +:108D400000219A8003AB01930EAB009302221D23F6 +:108D5000D8F796FE002834D13A4B0D9A9A4252D158 +:108D600012211D2269440EA8D7F7F4FC002852D125 +:108D70006B4655229B181B785F2B2AD086222B002E +:108D800031493248FF32F8F71FFE06E056222B0029 +:108D90002D492F48FF32F8F717FE18B004BC904653 +:108DA000F0BD64222B0028492A48FF32F8F70CFE58 +:108DB000F3E75E222B0024492748FF32F8F704FE30 +:108DC000EBE772222B0020492348FF32F8F7FCFD25 +:108DD000E3E76B4601329B181B785F2BCED16B46C5 +:108DE00001329B181B785F2BC8D16B4601329B1850 +:108DF0001B785F2BC2D103200021D8F79DFE0028ED +:108E000011D12870C9E778222B000F491348FF328F +:108E1000F8F7DAFDC1E7BF222B000B4910485200DA +:108E2000F8F7D2FDB9E7C6222B0007490D485200DA +:108E3000F8F7CAFDB1E7C046BC0C0310B00E031032 +:108E40004C1203105F5F5F5F580B03106415031033 +:108E5000F00D0310F81403109C10031024150310D8 +:108E600048150310040E0310002310B582B004004F +:108E70000022042000210093D8F7D8FD002802D159 +:108E8000207002B010BD2300F42202490248F8F716 +:108E90009BFDF6E7580B03108C15031010B500214D +:108EA00004000020D8F748FE873002D10023237049 +:108EB00010BD2300024A03490348F8F785FDF7E790 +:108EC000AD030000580B0310C815031010B50021A6 +:108ED00004000120D8F730FE853002D10023237032 +:108EE00010BD2300024A03490348F8F76DFDF7E778 +:108EF0009A030000580B0310F415031010B504007A +:108F0000D8F746FE002801D1207010BD2300034A87 +:108F100003490448F8F758FDF7E7C0466E0400001F +:108F2000580B03102416031010B503001622024933 +:108F30000248F8F733FD10BD547F020840160310B5 +:108F4000F0B545464E46DE465746E0B59DB006AB09 +:108F5000984642463F4B039013CB13C213CB13C228 +:108F600013CB13C21B7810AC137023003A4A0026AF +:108F700023CA23C323CA23C323CA23C303CA03C3E5 +:108F800012781A7000230593344B9A4600239946B1 +:108F9000334B9B4601360F2231005046DBF7CEFFA4 +:108FA0004B4624220093022043460021D8F73EFD81 +:108FB000002833D105AB019311AB00930022242389 +:108FC00002200021D8F75CFD00282ED12D22594621 +:108FD0002000D7F7BFFB00282ED102200021D8F7B0 +:108FE000ABFD00282FD123001B4AA2CAA2C3A2CAEC +:108FF000A2C3A2CAA2C322CA22C312781A700F2E19 +:10900000C8D107001748DBF799FF039B1F701DB0FD +:109010003CBC90469946A246AB46F0BD8222039BDB +:1090200011491248F8F7D0FCF1E78B22039B0E4957 +:109030000F48F8F7C9FCEAE79122039B0A490D485B +:10904000F8F7C2FCE3E79822039B07490A48F8F7C0 +:10905000BBFCDCE7300C0310081103108423031061 +:10906000B0100310D00203109C230310800F0310D4 +:109070009C10031050240310040E0310F0B5454655 +:1090800057464E46DE46E0B59DB006AB9846424692 +:109090003E4B039013CB13C213CB13C213CB13C29B +:1090A0001B7810AC13702300394A002623CA23C34F +:1090B00023CA23C323CA23C303CA03C3127805AF39 +:1090C0001A7000230593334B9A4600239946324B7E +:1090D0009B4601360F2231005046DBF72FFF4B46EF +:1090E00024220093022043460021D8F79FFC002849 +:1090F00031D111AB009300222423022000210197DB +:10910000D8F7BEFC00282DD12D2259462000D7F7D4 +:1091100021FB00282DD123001D4A23CA23C323CAC3 +:1091200023C323CA23C303CA03C312781A700F2EA2 +:10913000CFD11A48DBF702FF02200021D8F7FCFC50 +:10914000039B00281CD118701DB03CBC904699466A +:10915000A246AB46F0BD4A22039B11491148F8F7DD +:1091600033FCF1E75322039B0D490F48F8F72CFC21 +:10917000EAE75922039B0A490C48F8F725FCE3E784 +:10918000662207490A48F8F71FFCDDE7300C031098 +:109190000811031084230310B0100310D002031031 +:1091A0009C230310800F03109C1003105024031005 +:1091B000040E031010B50300022202490248F8F71A +:1091C000EDFB10BDBC8102087424031070B58CB097 +:1091D00002AB1900464A040061CA61C161CA61C19B +:1091E00061CA61C1127802200A7000220021009237 +:1091F0002432D8F71BFC002823D1002000F0AAFD60 +:10920000002815D1002000F0A5FD002828D101205C +:1092100000F0A0FD00281BD1D8F788FB843026D0B1 +:10922000B9222300334934489200F8F7CDFB06E019 +:10923000B32223002F4931489200F8F7C5FB0CB048 +:1092400070BD23002E4A2B492E48F8F7BDFBF6E7E8 +:10925000B6222300274929489200F8F7B5FBEEE72C +:109260002300294A23492548F8F7AEFBE7E7002009 +:1092700000F086FD00281DD1002000F081FD0028AF +:1092800011D1012000F07CFD00281AD1D8F74EFB47 +:1092900000281DD102200021D8F74EFC00281FD144 +:1092A00000232370CBE72300184A12491848F8F727 +:1092B0008BFBC4E72300174A0E491548F8F784FBD7 +:1092C000BDE72300144A0B491148F8F77DFBB6E7C8 +:1092D000C2222300074911489200F8F775FBAEE758 +:1092E00023000F4A03490F48F8F76EFBA7E7C04673 +:1092F000300C031018250310EC250310D0250310A3 +:10930000C3020000800F0310D2020000FB02000025 +:1093100004260310F50200000103000020260310BC +:109320000F030000040E031070B58CB002AB1900DF +:10933000384A040061CA61C161CA61C161CA61C1C0 +:10934000127802200A700022002100922432D8F7FD +:109350006DFB00282BD1002000F0FCFC00281ED162 +:10936000022000F00DFD002830D1D8F7DFFA84305C +:1093700024D1002000F004FD002836D1022000F0A6 +:10938000E9FC002838D1D8F7D1FA002826D10220EC +:109390000021D8F7D1FB002835D1207005E023004B +:1093A0001D4A1E491E48F8F70FFB0CB070BD230084 +:1093B0001C4A1A491C48F8F707FBF6E7A2222300CB +:1093C00016491A489200F8F7FFFAEEE79F222300A9 +:1093D000124917489200F8F7F7FAE6E72300154A12 +:1093E0000E491548F8F7F0FADFE72300134A0B4956 +:1093F0000F48F8F7E9FAD8E72300114A0749084867 +:10940000F8F7E2FAD1E723000E4A04490E48F8F7CC +:10941000DBFACAE7300C03107602000018250310AF +:10942000D02503106D020000800F031044260310A6 +:1094300004260310A6020000202603109902000053 +:109440009F020000AD020000040E031070B58CB046 +:1094500002AB1900474A040061CA61C161CA61C117 +:1094600061CA61C1127802200A70002200210092B4 +:109470002432D8F7DBFA002822D1002000F06AFC61 +:10948000002815D1012000F065FC002826D102201B +:1094900000F060FC00281AD1D8F748FA843024D0B4 +:1094A00084222300344935485200F8F78DFA05E04C +:1094B0002300F02230493248F8F786FA0CB070BD2C +:1094C0002300E9222C492F48F8F77EFAF6E723001B +:1094D000FC2229492A48F8F777FAEFE72300F62219 +:1094E00025492748F8F770FAE8E7002000F048FC23 +:1094F00000281ED1012000F043FC002811D10220D9 +:1095000000F03EFC00281CD1D8F710FA002820D12A +:1095100002200021D8F710FB002822D1002323705D +:10952000CCE72022230014491748FF32F8F74CFA01 +:10953000C4E71A22230010491348FF32F8F744FA0F +:10954000BCE7262223000C490F48FF32F8F73CFA0B +:10955000B4E79622230008490C485200F8F734FA81 +:10956000ACE73422230004490948FF32F8F72CFA0B +:10957000A4E7C046300C031018250310642603101E +:10958000D0250310800F031004260310202603109B +:10959000040E0310F0B59BB004AB1900444A04005C +:1095A00061CA61C161CA61C161CA61C112780EAD8F +:1095B0000A7029003F4AC1CAC1C1C1CAC1C1C1CADA +:1095C000C1C141CA41C1127802200A7000220021A3 +:1095D000039200922432D8F729FA002835D10120CD +:1095E00000F0CEFB002828D1022000F0C9FB0028A3 +:1095F00039D1022000F0C4FB00282DD1D8F796F90C +:10960000002837D103AB01930FAB00930022242332 +:1096100002200021D8F734FA00283AD12D22280060 +:109620002549D7F797F800282BD102200021D8F739 +:1096300083FA002834D1207005E023001F4A204916 +:109640002048F8F7C1F91BB0F0BD23001E4A1C49A1 +:109650001E48F8F7B9F9F6E723001D4A18491948DA +:10966000F8F7B2F9EFE723001A4A15491548F8F759 +:10967000ABF9E8E72300184A11491848F8F7A4F9AC +:10968000E1E7942223000E4915489200F8F79CF96F +:10969000D9E72300134A0A491348F8F795F9D2E7A6 +:1096A0002300124A06491248F8F78EF9CBE7C04664 +:1096B000300C031008110310B01003102B0200002F +:1096C000182503100426031022020000800F031047 +:1096D0003702000031020000420200002026031081 +:1096E000502403104A0200009C100310570200008F +:1096F000040E0310F0B59BB004AB1900404A0400FF +:1097000061CA61C161CA61C161CA61C112780EAD2D +:109710000A7029003B4AC1CAC1C1C1CAC1C1C1CA7C +:10972000C1C141CA41C1127802200A700022002141 +:10973000039200922432D8F779F9002831D1012020 +:1097400000F01EFB002823D1022000F019FB0028A6 +:1097500037D1D8F7EBF800282BD103AB01930FAB2F +:1097600000930022242302200021D8F789F9002841 +:1097700036D12D2228002449D6F7ECFF002828D125 +:1097800002200021D8F7D8F9002831D1207006E056 +:10979000E42223001D491E48FF32F8F715F91BB0DB +:1097A000F0BDED22230019491A485200F8F70CF9D0 +:1097B000F5E7FA222300154917485200F8F704F993 +:1097C000EDE7EA22230011491148FF32F8F7FCF8CF +:1097D000E5E72300114A0D491148F8F7F5F8DEE7EF +:1097E000FE22230009490F485200F8F7EDF8D6E7AA +:1097F00023000D4A05490D48F8F7E6F8CFE7C046C3 +:10980000300C031008110310B010031018250310BA +:1098100004260310800F031020260310020200000C +:10982000502403109C10031009020000040E0310C2 +:10983000F0B59BB004AB19003A4A040061CA61C19B +:1098400061CA61C161CA61C112780EAD0A70290096 +:10985000354AC1CAC1C1C1CAC1C1C1CAC1C141CA57 +:1098600041C1127802200A70002200210392009266 +:109870002432D8F7DBF800282CD1002000F06AFA57 +:1098800000281ED1D8F752F8002833D103AB01933A +:109890000FAB00930022242302200021D8F7F0F818 +:1098A00000282FD12D2228002049D6F753FF002869 +:1098B00018D102200021D8F73FF900282AD12070C2 +:1098C00006E09E2223001A491A48FF32F8F77CF876 +:1098D0001BB0F0BDCA222300154917485200F8F703 +:1098E00073F8F5E7B822230011491448FF32F8F75E +:1098F0006BF8EDE7AA2223000D491148FF32F8F773 +:1099000063F8E5E7B222230009490E48FF32F8F771 +:109910005BF8DDE7DF22230005490B485200F8F72A +:1099200053F8D5E7300C031008110310B0100310E2 +:1099300018250310D0250310800F031050240310A6 +:10994000202603109C100310040E0310F0B59BB0EA +:1099500004AB19003A4A040061CA61C161CA61C11D +:1099600061CA61C112780EAD0A702900354AC1CAB8 +:10997000C1C1C1CAC1C1C1CAC1C141CA41C11278B4 +:1099800002200A7000220021039200922432D8F7AC +:109990004DF800282CD1022000F0F2F900281ED149 +:1099A000D7F7C4FF002833D103AB01930FAB00936B +:1099B0000022242302200021D8F762F800282FD1AA +:1099C0002D2228002049D6F7C5FE002818D10220F4 +:1099D0000021D8F7B1F800282AD1207006E05822DB +:1099E00023001A491A48FF32F7F7EEFF1BB0F0BD0B +:1099F000A7222300154917485200F7F7E5FFF5E7BE +:109A00007222230011491448FF32F7F7DDFFEDE71A +:109A1000642223000D491148FF32F7F7D5FFE5E72F +:109A20006C22230009490E48FF32F7F7CDFFDDE72E +:109A3000BC22230005490B485200F7F7C5FFD5E7C4 +:109A4000300C031008110310B01003101825031078 +:109A500004260310800F0310502403102026031047 +:109A60009C100310040E0310F0B59FB008AC220048 +:109A7000654B050043CB43C243CB43C243CB43C2F8 +:109A80001B7812AE13703200604B83CB83C283CB42 +:109A900083C283CB83C203CB03C21B780220137023 +:109AA000002324220793009300212300D7F7BEFF51 +:109AB00000283CD1002003A900F03EF900282ED157 +:109AC00000902300242202200021D7F7AFFF0028B6 +:109AD0003BD1002004A900F02FF900283CD1039BC2 +:109AE000049A0133934229D1012005A900F024F9F9 +:109AF00000283FD1049B059A934234D1022006A945 +:109B000000F01AF900285BD1059B069A934238D0E1 +:109B10002B00B2223E493F48F7F756FF05E02B00E5 +:109B200080223B493C48F7F74FFF1FB0F0BD2B00A8 +:109B3000792237493948F7F747FFF6E72B009A2291 +:109B400033493748F7F740FFEFE72B0087223049CA +:109B50003248F7F739FFE8E72B0092222C492E48CC +:109B6000F7F732FFE1E72B00A62229492D48F7F746 +:109B70002BFFDAE72B00A12225492748F7F724FF1E +:109B8000D3E7D7F7D3FE002821D107AB019313AB5E +:109B900000930022242302200021D7F771FF002820 +:109BA00023D12D2230002049D6F7D4FD002815D12D +:109BB00002200021D7F7C0FF00281DD12870B4E78C +:109BC0002B00AD2212491448F7F7FEFEADE72B003B +:109BD000BE220F491548F7F7F7FEA6E72B00CC2267 +:109BE0000B491348F7F7F0FE9FE72B00C622084900 +:109BF0001048F7F7E9FE98E72B00D32204490E48F6 +:109C0000F7F7E2FE91E7C046300C0310081103108D +:109C1000182503101427031098260310800F031033 +:109C2000B0260310E4260310B010031044270310DD +:109C3000502403109C100310040E031070B58CB058 +:109C400002AC2200104B050043CB43C243CB43C2BE +:109C500043CB43C200261B78137000F061F8230049 +:109C60002422022000210096D7F7E0FE843007D09E +:109C70002B00064A06490748F7F7A6FE0CB070BD50 +:109C800000F054F82E70F9E7300C03102A0300009E +:109C9000182503106027031010B50300092202499C +:109CA0000248F7F77BFE10BDF4810208A4270310D9 +:109CB000074B1A78002A08D12A212A20054A106069 +:109CC00051602A21916001221A7000207047C0461D +:109CD000ECAB0208F0AB0208022805D8044B800068 +:109CE000C35800200B60704784204042FBE7C04609 +:109CF000F0AB0208084B1B78002B01D0022802D9D8 +:109D0000842040427047054A80008358591CF7D090 +:109D1000013383500020F5E7F0820208F0AB02081F +:109D20000022014B1A707047F08202080122014B99 +:109D30001A707047F0820208022805D8044B800090 +:109D4000C35800200B60704784204042FBE7C046A8 +:109D5000F0AB0208084B1B78002B01D0022802D977 +:109D6000842040427047054A80008358591CF7D030 +:109D7000013383500020F5E7F0820208F0AB0208BF +:109D8000022808D8054A80008358002B03D0013BE5 +:109D90008350002001E0842040427047F0AB02086D +:109DA000002303707047C0462A22002310B584B0F8 +:109DB000029203930023040000932A200021174BF2 +:109DC000093AD7F703FF002817D10822144802A93F +:109DD000D7F78CFD8C3008D12A200021D7F77CFFE3 +:109DE000002812D1207004B010BD0E2223000D49AE +:109DF0000D48FF32F7F7E8FDF5E782222300094915 +:109E00000A485200F7F7E0FDEDE78A2223000549F2 +:109E100007485200F7F7D8FDE5E7C046BC0C031031 +:109E2000E9030000282C0310DC2C0310F00D0310B4 +:109E3000040E031070B58CB003AB1900144A040073 +:109E400061CA61C161CA61C121CA21C112880420ED +:109E50000A800022002100922132D7F7B7FE0028A5 +:109E600008D104200021D7F737FF002809D120703E +:109E70000CB070BD2300D92206490748F7F7A4FDAE +:109E8000F6E72300EF2203490448F7F79DFDEFE7CB +:109E9000BC0C0310282C0310F00D0310040E03104B +:109EA000002303707047C04610B503001722024913 +:109EB0000248F7F773FD10BDF4820208102D03105D +:109EC000F0B545464E46DE465746E0B59BB006AB7C +:109ED000984642463F4B039013CB13C213CB13C299 +:109EE00003CB03C21B880FAC138023003A4A002621 +:109EF00023CA23C323CA23C323CA23C311681960F7 +:109F000092889A8000230593344B9A460023994601 +:109F1000334B9B4601360F2231005046DBF70EF8DB +:109F20004B4621220093022043460021D7F74EFEE4 +:109F3000002833D105AB019310AB009300222123FD +:109F400002200021D7F76CFE00282ED12A22594684 +:109F50002000D6F7FFFB00282ED102200021D7F7E2 +:109F6000BBFE00282FD123001B4AA2CAA2C3A2CA4B +:109F7000A2C3A2CAA2C31168196092889A800F2E48 +:109F8000C8D107001748DAF7D9FF039B1F701BB031 +:109F90003CBC90469946A246AB46F0BD8522039B49 +:109FA00011491248F7F710FDF1E78E22039B0E4985 +:109FB0000F48F7F709FDEAE79422039B0A490D4889 +:109FC000F7F702FDE3E79B22039B07490A48F7F7EF +:109FD000FBFCDCE7BC0C0310B00E03108423031061 +:109FE0004C120310D0020310982F0310800F03109F +:109FF0009C10031050240310040E0310F0B54546C6 +:10A0000057464E46DE46E0B59BB006AB9846424604 +:10A010003E4B039013CB13C213CB13C203CB03C22B +:10A020001B880FAC13802300394A002623CA23C3A0 +:10A0300023CA23C323CA23C3116805AF19609288BA +:10A040009A8000230593334B9A4600239946324B5E +:10A050009B4601360F2231005046DAF76FFF4B4620 +:10A0600021220093022043460021D7F7AFFD0028AC +:10A0700031D110AB0093002221230220002101974F +:10A08000D7F7CEFD00282DD12A2259462000D6F739 +:10A0900061FB00282DD123001D4A23CA23C323CAF4 +:10A0A00023C323CA23C31168196092889A800F2E94 +:10A0B000CFD11A48DAF742FF02200021D7F70CFE71 +:10A0C000039B00281CD118701BB03CBC90469946DD +:10A0D000A246AB46F0BD4B22039B11491148F7F74E +:10A0E00073FCF1E75422039B0D490F48F7F76CFC12 +:10A0F000EAE75A22039B0A490C48F7F765FCE3E7B5 +:10A10000672207490A48F7F75FFCDDE7BC0C03103C +:10A11000B00E0310842303104C120310D00203105E +:10A12000982F0310800F03109C100310502403106D +:10A13000040E031010B50300022202490248F7F78B +:10A140002DFC10BD788502084C30031030B5234B30 +:10A1500085B01B7803AC2370002305000093002218 +:10A16000230002200021D7F731FD002820D10090E4 +:10A170002300002202200021D7F728FD002810D15B +:10A1800000902300002200200021D7F71FFD873018 +:10A1900015D02B002F2212491248F7F715FC05B0F5 +:10A1A00030BD2B0028220E490F48F7F70DFCF6E7CB +:10A1B0002B0021220A490D48F7F706FCEFE70220A1 +:10A1C0000021D7F789FD002801D12870E7E72B008F +:10A1D000362203490648F7F7F7FBE0E7B002031021 +:10A1E000A0300310D80F0310A40F0310800F03102A +:10A1F000040E031070B58CB003AC2200204B050098 +:10A2000043CB43C243CB43C203CB03C21B880120D1 +:10A21000138000232122009300212300D7F7D6FCCE +:10A2200000281ED101232422009301200021154B78 +:10A23000D7F7CCFC061E0DD180231B0600932122EC +:10A24000230003200021D7F7C1FC863010D12E70E7 +:10A250000CB070BD2B0054220B490C48F7F7B4FB2F +:10A26000F6E72B00482208490948F7F7ADFBEFE76E +:10A270002B005B2204490748F7F7A6FBE8E7C04636 +:10A28000BC0C0310300C0310A0300310580C03104A +:10A290000C0C0310900C0310002310B582B00400C6 +:10A2A0000022042000210093D7F790FC002802D15F +:10A2B000207002B010BD23006C2202490248F7F75B +:10A2C00083FBF6E7A03003108C150310F0B599B0AE +:10A2D00003AB19002A4A040061CA61C161CA61C1A5 +:10A2E00021CA21C112880CAD0A802900254AC1CAA1 +:10A2F000C1C1C1CAC1C1C1CAC1C141CA41C112782B +:10A3000001200A7000220021029200922132D7F728 +:10A310005DFC853007D0230083221B491B48F7F7DB +:10A3200053FB19B0F0BD02AB01930DAB00930022BB +:10A33000242301200021D7F773FC00280BD12D2204 +:10A3400028001349D6F706FA002812D1029B242BC5 +:10A3500008D12070E5E723008B220B490D48F7F761 +:10A3600033FBDEE723009D2207490B48F7F72CFB60 +:10A37000D7E72300972204490848F7F725FBD0E7E1 +:10A38000BC0C031008110310A0300310741003104C +:10A39000B01003109C10031040310310E0100310A4 +:10A3A000F0B5C64600B598B004AB1900604A050088 +:10A3B00051CA51C151CA51C111CA11C112880DAE41 +:10A3C0000A805C4A90463200414691C991C291C9C7 +:10A3D00091C291C991C20868106089880320918058 +:10A3E00000220021039200922132D7F7EFFB0028D0 +:10A3F0001FD103AB01930EAB009300222123032056 +:10A400000021D7F70DFC002853D12A2230004A49F9 +:10A41000D6F7A0F9002845D1039B212B10D02B00A3 +:10A42000CC2246494648F7F7CFFA18B004BC90460C +:10A43000F0BD2B00B32241494248F7F7C5FAF4E7D3 +:10A440003300444607CC07C307CC07C307CC07C378 +:10A45000226803201A60A28800219A8003AB01932E +:10A460000EAB009302221D23D7F7DAFB002827D179 +:10A47000354B0D9A9A4244D112211D2269440EA8EF +:10A48000D6F768F9002843D16B4655229B181B78F4 +:10A490005F2B1CD002222B0028492C48FF32F7F7F3 +:10A4A00093FAC2E72B00C62224492948F7F78CFA11 +:10A4B000BBE72B00BB2221492648F7F785FAB4E712 +:10A4C0002B00DE221D492348F7F77EFAADE76B46E5 +:10A4D00001329B181B785F2BDCD16B4601329B1835 +:10A4E0001B785F2BD6D16B4601329B181B785F2BF4 +:10A4F000D0D103200021D7F7EFFB00280FD128701F +:10A5000093E72B00E9220D491348F7F75DFA8CE732 +:10A510002B00F52209491148F7F756FA85E78422FE +:10A520002B0006490E485200F7F74EFA7DE7C04669 +:10A53000BC0C0310B00E03104C120310A03003101B +:10A5400070310310F00D03105F5F5F5F641503103F +:10A55000F81403109C100310241503104815031061 +:10A56000040E0310F0B5C64600B598B004AB190050 +:10A570004D4A050051CA51C151CA51C111CA11C138 +:10A5800012880DAC0A80494A904622004146C1C952 +:10A59000C1C2C1C9C1C2C1C9C1C208680127106016 +:10A5A00089880420918000220021009221320397A3 +:10A5B000D7F70CFB002834D103AB01930EAB00930B +:10A5C0000022002304200021D7F72AFB002843D1D2 +:10A5D0002A2241462000D6F7BDF800282CD1039B43 +:10A5E000002B31D103AB01930EAB00930522002366 +:10A5F000042000210397D7F713FB00283CD12A221F +:10A6000041462000D6F7A6F800283DD1039B002B39 +:10A610002AD104200021D7F75FFB00283CD1287005 +:10A6200006E08F222B00224922485200F7F7CCF98E +:10A6300018B004BC9046F0BD32222B001C491E48C5 +:10A64000FF32F7F7C1F9F3E738222B0018491B480E +:10A65000FF32F7F7B9F9EBE793222B0014491848BA +:10A660005200F7F7B1F9E3E754222B0010491348E1 +:10A67000FF32F7F7A9F9DBE7A1222B000C491148BB +:10A680005200F7F7A1F9D3E74E222B0008490A48F8 +:10A69000FF32F7F799F9CBE7AD222B0004490A48BE +:10A6A0005200F7F791F9C3E7BC0C0310B00E03108A +:10A6B000A0300310F00D03105C130310AC31031035 +:10A6C000D01403109C100310040E0310F0B52D4D90 +:10A6D0008FB003AC23002A00060083CA83C383CA59 +:10A6E00083C383CA83C31168022019609288002142 +:10A6F0009A800023029302AB019304AB00930022E3 +:10A700000123D7F78DFA8C3024D12A22290020008A +:10A71000D6F720F8002815D102AB019304AB0093C3 +:10A720000022012300200021D7F77AFA873019D1BF +:10A730002A2229002000D6F70DF800281AD13070FF +:10A740000FB0F0BDBD2233000F4910485200F7F79B +:10A750003BF9F5E7702233000B490D48FF32F7F75C +:10A7600033F9EDE7C122330007490A485200F7F7F1 +:10A770002BF9E5E78E22330003490448FF32F7F74F +:10A7800023F9DDE7B00E0310A030031028100310EA +:10A790000410031054100310F0B5C64600B598B06D +:10A7A00004AB1900644A050051CA51C151CA51C1D4 +:10A7B00011CA11C112880DAE0A80604A904632005B +:10A7C000414691C991C291C991C291C991C208688B +:10A7D000106089880320918000220021039200925A +:10A7E0002132D7F7F3F900285ED103AB01930EAB0A +:10A7F00000932222012303200021D7F711FA87308A +:10A8000047D12A2241463000D5F7A4FF00285BD16A +:10A8100003AB01930EAB00930022222303200021FF +:10A82000D7F7FEF9002857D1039B212B44D12A22C8 +:10A8300030004349D5F78EFF002855D133004446F8 +:10A8400007CC07C307CC07C307CC07C32268032084 +:10A850001A60A28800219A8003AB01930EAB00938B +:10A8600001222123D7F7DCF9002855D1039B202BA7 +:10A870004AD12A2230003349D5F76CFF00283BD15A +:10A8800003200021D7F728FA00284DD100232B7090 +:10A8900006E0D7222B002C492C485200F7F794F8F9 +:10A8A00018B004BC9046F0BDA4222B0026492848CD +:10A8B000FF32F7F789F8F3E7E5222B002249254814 +:10A8C0005200F7F781F8EBE7BA222B001E49224825 +:10A8D000FF32F7F779F8E3E7E2222B001A491F4825 +:10A8E0005200F7F771F8DBE7D6222B0016491C4817 +:10A8F000FF32F7F769F8D3E7FC222B001249194819 +:10A90000FF32F7F761F8CBE7F0222B000E4916482B +:10A91000FF32F7F759F8C3E7EA222B000A49134838 +:10A92000FF32F7F751F8BBE72B00114A06491148EF +:10A93000F7F74AF8B4E7C046BC0C0310B00E03109A +:10A940004C120310A4140310A03003102C13031096 +:10A95000F00D0310CC1303105C1303108C130310C1 +:10A96000D8310310083203105014031000140310E0 +:10A9700003020000040E031070B58CB003AB190085 +:10A98000234A040061CA61C161CA61C121CA21C1EF +:10A99000128804200A8000220021029200922132B3 +:10A9A000D7F714F9002816D102AB019300900023C9 +:10A9B000002204200021D7F733F9002819D1029B87 +:10A9C000002B0FD104200021D7F786F9002817D1DA +:10A9D00020700CB070BD23000E4A0F490F48F6F7E7 +:10A9E000F3FFF6E723000E4A0B490E48F6F7ECFF9B +:10A9F000EFE723000C4A08490C48F6F7E5FFE8E7C3 +:10AA000023000B4A04490B48F6F7DEFFE1E7C04696 +:10AA1000BC0C031016020000A0300310F00D031050 +:10AA200023020000483203101D020000440F0310EF +:10AA30002B020000040E031010B586B00C2200217A +:10AA4000040003A8D5F7B0FE0120002103AAD7F720 +:10AA50001BF9002814D1049B0193242B09D1039BDB +:10AA60000193242B13D1059B012B17D1207006B025 +:10AA700010BD23000D4A0E490E48F6F7A5FFF6E774 +:10AA800023000D4A0A490D48F6F79EFFEFE7230021 +:10AA90000B4A07490B48F6F797FFE8E723000A4AF5 +:10AAA00003490A48F6F790FFE1E7C046410200007B +:10AAB000A0300310A80D03103B0200007C0D031012 +:10AAC000460200008C3203104B020000CC0D031034 +:10AAD00070B590B00C220021040004A8D5F764FEE4 +:10AAE00007AB19002C4A61CA61C161CA61C121CAA0 +:10AAF00021C1128802200A80002200210092213206 +:10AB0000D7F764F8002819D10220002104AAD7F74A +:10AB1000BBF8002829D1059B0393212B16D1049B58 +:10AB20000393212B29D1069B002B16D10220002153 +:10AB3000D7F7D2F8002827D1207005E02300174A64 +:10AB400017491848F6F740FF10B070BD2300164AA9 +:10AB500013491648F6F738FFF6E79D2223001049FF +:10AB600013489200F6F730FFEEE7992223000C49D4 +:10AB700010489200F6F728FFE6E723000E4A08493E +:10AB80000E48F6F721FFDFE723000D4A04490D4880 +:10AB9000F6F71AFFD8E7C046BC0C03105D020000B0 +:10ABA000A0300310F00D03106A020000040F031020 +:10ABB000240F0310DC0E03106F020000B4320310E8 +:10ABC0007B020000040E031010B586B00C22002199 +:10ABD000040003A8D5F7E8FD0320002103AAD7F756 +:10ABE00053F88C301FD1049B0193002B13D100200C +:10ABF000002103AAD7F748F887301BD1049B0193A3 +:10AC0000002B1FD1039B0193002B22D1059B002B0E +:10AC100026D1237005E02300154A16491648F6F799 +:10AC2000D3FE06B010BD2300144A12491448F6F7AB +:10AC3000CBFEF6E7A62223000E4912489200F6F753 +:10AC4000C3FEEEE72300104A0A490B48F6F7BCFEA4 +:10AC5000E7E723000D4A07490D48F6F7B5FEE0E7A0 +:10AC6000AA22230003490B489200F6F7ADFED8E76D +:10AC700091020000A03003100C0D03108B020000A5 +:10AC8000E00C03104C0D03109E020000A302000014 +:10AC9000D83203102C0D0310F0B59BB00C2200210C +:10ACA000040003A8D5F780FD06AB1900324A61CA3B +:10ACB00061C161CA61C121CA21C112880FAD0A8078 +:10ACC00029002E4AC1CAC1C1C1CAC1C1C1CAC1C1BC +:10ACD00010680860928802208A8000220021029277 +:10ACE00000922132D6F772FF00281CD102200021E9 +:10ACF000D6F7F2FF061E0ED10220002103AAD6F7D6 +:10AD0000C3FF8C3016D023001D4A1E491E48F6F79B +:10AD10005BFE1BB0F0BDB12223001A491B48920014 +:10AD2000F6F752FEF5E72300194A16491948F6F7D7 +:10AD30004BFEEEE702AB019300222123022000210B +:10AD40000095D6F76DFF8C3007D102200021D6F791 +:10AD5000C3FF8C3008D12670DBE723000E4A094977 +:10AD60000E48F6F731FED4E723000D4A05490D4899 +:10AD7000F6F72AFECDE7C046BC0C0310B00E031058 +:10AD8000CB020000A03003102C0E0310040E0310A1 +:10AD9000BD020000F00D0310D20200005C0E031093 +:10ADA000D9020000840E031010B500210400012018 +:10ADB000D6F792FF853002D10023237010BDBA224E +:10ADC0002300034903489200F6F7FEFDF6E7C0466C +:10ADD000A0300310F415031010B50021040000206A +:10ADE000D6F77AFF873002D10023237010BD2300ED +:10ADF000024A03490348F6F7E7FDF7E7F7020000C8 +:10AE0000A0300310C8150310F0B5C64600B59AB0BF +:10AE100003AB1900454A804621CA21C1108806ADFE +:10AE2000088092788A702900414AC1CAC1C1C1CA4A +:10AE3000C1C141CA41C112880FAE0A8031003D4AEA +:10AE400091CA91C191CA91C191CA91C1106808601B +:10AE5000928803208A8000220021029200920B3205 +:10AE6000D6F7B4FE002836D100902B002122042012 +:10AE70000021D6F7ABFE002823D103200021D6F70E +:10AE80002BFF00282ED102AB019310AB00930022C0 +:10AE9000212304200021D6F7C3FE002832D12A2224 +:10AEA00030002549D5F756FC002832D1029B212BD2 +:10AEB0001FD0CE224346214921489200F6F784FD57 +:10AEC00005E043461F4A1D491F48F6F77DFD1AB0AD +:10AED00004BC9046F0BD43461C4A18491C48F6F78E +:10AEE00073FDF4E743461B4A14491B48F6F76CFD13 +:10AEF000EDE704200021D6F7EFFE434600280FD1EE +:10AF00001870E4E74346154A0C491548F6F75CFD0E +:10AF1000DDE74346134A09491348F6F755FDD6E7DE +:10AF2000124A06491248F6F74FFDD0E720130310E6 +:10AF3000BC0C0310B00E03104C120310A030031011 +:10AF4000FC32031016030000981203100F030000D8 +:10AF5000781203101F030000B81203102903000029 +:10AF6000DC12031033030000E41103103F03000060 +:10AF7000FC120310F0B599B004AB19002F4A06007B +:10AF800031CA31C131CA31C111CA11C112880DAFE4 +:10AF90000A8039002A4A31CA31C131CA31C131CAA5 +:10AFA00031C110680860928802208A800022002146 +:10AFB000039200922132D6F709FE002828D10024FE +:10AFC00003AD02E00134212C13D00EAB1B1900930A +:10AFD00022000123022000210195D6F721FE00283E +:10AFE000F0D03300174A18491848F6F7EDFC19B0AD +:10AFF000F0BD2A2238001649D5F7ACFB00280ED147 +:10B0000002200021D6F768FE00280FD13070EEE74D +:10B010003300104A0C491048F6F7D6FCE7E7330036 +:10B020000E4A09490E48F6F7CFFCE0E733000D4A17 +:10B0300005490D48F6F7C8FCD9E7C046BC0C03101B +:10B04000B00E03105F030000A030031024120310A1 +:10B050004C12031055030000F00D03106A030000AA +:10B06000E4110310710300000412031070B5464B85 +:10B0700094B00493454B09AC0593454B05001A6801 +:10B0800007929B8802AA13832200424B43CB43C200 +:10B0900043CB43C243CB43C21968032011609B8852 +:10B0A00000219380002304220693009304ABD6F77B +:10B0B0008DFD002832D1009004220320002105AB31 +:10B0C000D6F784FD002821D100900622032000211C +:10B0D00007ABD6F77BFD002837D106AB01930022E2 +:10B0E0000623032000210094D6F79AFD002833D1CF +:10B0F000079B0393039A2368934217D0EA222B00FD +:10B10000254926489200F6F75FFC05E02B00244A0B +:10B1100021492448F6F758FC14B070BDE2222B00F8 +:10B120001D4921489200F6F74FFCF5E702ABA288D3 +:10B130001B8B9A42E2D1069B062B14D02B001B4A94 +:10B1400015491B48F6F740FCE6E72B00194A12495F +:10B150001948F6F739FCDFE72B00184A0E49184862 +:10B16000F6F732FCD8E703200021D6F7B5FD00281A +:10B1700001D12870D0E7ED222B0007491148920039 +:10B18000F6F722FCC8E7C0464F4E450054574F0023 +:10B190001C120310B00E0310A0300310E4110310B2 +:10B1A0008F030000AC11031090110310AD030000D9 +:10B1B000FC32031096030000C81103109D03000029 +:10B1C0009C10031004120310F0B5DE4645464E46AF +:10B1D00057460023E0B5504D93B029001822039044 +:10B1E00006AC0CA80593D5F7C3FA2300183507CD94 +:10B1F00007C34A4BA0469946494B0CAD9B462E6867 +:10B200006F6843461B680C22002109A89A46D5F7AF +:10B21000CBFA8022002192004846D5F7C5FA0023D8 +:10B220005246009330005B463900D6F7CFFC002829 +:10B2300039D13000390009AAD6F726FD00283AD1C5 +:10B240000A9C54453ED10B9B0293002B41D105AB88 +:10B2500001934B4600220093300023003900D6F7BB +:10B26000DFFC00283CD1220059464846D5F772FA47 +:10B2700000283CD1059BA34240D130003900D6F7CD +:10B280002BFD002841D104239C46083512ABE04435 +:10B290009D42B4D1039B187013B03CBC90469946B4 +:10B2A000A246AB46F0BDF722039B1E491E48920002 +:10B2B000F6F78AFBF0E7039B1C4A1A491C48F6F78D +:10B2C00083FBE9E7039B1B4A16491B48F6F77CFB07 +:10B2D000E2E7039B194A13491948F6F775FBDBE7C8 +:10B2E000039B184A0F491848F6F76EFBD4E7039BF7 +:10B2F000164A0C491648F6F767FBCDE7039B154A3B +:10B3000008491548F6F760FBC6E7039B134A054951 +:10B310001348F6F759FBBFE738330310FCAB0208BC +:10B320005C330310A0300310800F0310E303000010 +:10B33000DC0E0310E9030000040F0310EE0300000D +:10B34000240F0310F603000038110310010400005D +:10B350005C11031006040000FC3203100D04000011 +:10B36000040E031070B58EB001AC22001E4B050018 +:10B3700043CB43C21B680021136005A82422D5F7E4 +:10B3800013FA01230893194B102205936B462100F1 +:10B39000023305A8D6F71CFD002816D16B46022201 +:10B3A0001348991CD6F7A2FA853007D16B46588806 +:10B3B000D6F740FD00280FD10EB070BD2B00EC2257 +:10B3C0000C490D48F6F700FBF6E72B00E32209498C +:10B3D0000A48F6F7F9FAEFE72B00F3220549084887 +:10B3E000F6F7F2FAE8E7C0468036031001000040A5 +:10B3F000D10700005C3503102C36031014360310FF +:10B400006836031010B501F079F810BD10B501F0E1 +:10B4100071F810BD10B502000249034800F0E6FEC5 +:10B4200010BDC046021040060100004010B50200E9 +:10B430000249034800F0DAFE10BDC0460110400684 +:10B440000100004010B502000121024800F026FD75 +:10B4500010BDC0460500800210B502000021024860 +:10B4600000F01CFD10BDC0460B00800210B50200AC +:10B470000021024800F012FD10BDC0460A00800203 +:10B4800010B502000021024800F008FD10BDC046C2 +:10B490000900800210B502000021024800F0FEFC05 +:10B4A00010BDC0460500800210B50100014800F043 +:10B4B00027FC10BD0B00000110B50100014800F091 +:10B4C0001FFC10BD0A00000110B50100014800F08A +:10B4D00017FC10BD0900000110B50100014800F083 +:10B4E0000FFC10BD0800000110B50100014800F07C +:10B4F00007FC10BD050000010300A22010B51022BA +:10B500000249C00500F0A6FB10BDC0460200C00401 +:10B5100010B5030010220249024800F09BFB10BD49 +:10B52000021040060100004010B500F0AFFF10BD52 +:10B5300010B502000249034800F058F910BDC0469A +:10B540000100C0040100004010B502000249034898 +:10B5500000F04CF910BDC0460200C00401000040DC +:10B5600010B502000249034800F040F910BDC04682 +:10B57000000160040100004010B50100014800F026 +:10B580000FF810BD0100004010B50300162202495B +:10B590000248F6F703FA10BDB08502089036031092 +:10B5A000F0B5C64600B59CB000266B4602AC220042 +:10B5B0005E80834B0500884683CB83C21B680021D5 +:10B5C000136007A80C220696D5F7EEF82422002176 +:10B5D0000AA80196D5F7E8F82422002113A8D5F788 +:10B5E000E3F801230D936B461022210002330AA8D1 +:10B5F0000A95D6F7EDFB002800D09FE06B4613A913 +:10B600005888D6F73FFC002800D0AFE06B46642294 +:10B610009B181B88802B00D0A1E0139B9D4200D07B +:10B6200096E013A8DEF79CFD6B461022588806A909 +:10B6300001ABD6F753FC002800D0ACE0019B102BE7 +:10B6400000D0A1E06B461A7E23789A4200D094E0A5 +:10B650006B465A7E63789A4200D08EE06B469A7EA3 +:10B66000A3789A4200D088E06B46DA7EE3789A426B +:10B6700000D082E06B461A7F23799A4200D07CE0AA +:10B680006B465A7F63799A4200D076E06B469A7F88 +:10B69000A3799A4200D070E06B46DA7FE3799A4250 +:10B6A00000D06AE020226B469B181A78237A9A42CF +:10B6B00063D121226B469B181A78637A9A425CD137 +:10B6C00022226B469B181A78A37A9A4255D12322DC +:10B6D0006B469B181A78E37A9A424ED124226B4625 +:10B6E0009B181A78237B9A4247D125226B469B18D8 +:10B6F0001A78637B9A4240D126226B469B181A78AF +:10B70000A37B9A4239D127226B469B181A78E37B98 +:10B710009A4232D16B465888D6F78CFB041E41D131 +:10B720006B4613A95888D6F7ADFB883041D0434605 +:10B73000572224492448F6F747F905E043462222D8 +:10B7400020492248F6F740F91CB004BC9046F0BDF1 +:10B75000434632221B491E48F6F736F9F4E74346C2 +:10B7600018491C48373AF6F72FF9EDE743462822E7 +:10B7700014491948F6F728F9E6E743464A221149E1 +:10B780001648F6F721F9DFE7434643220D491448EE +:10B79000F6F71AF9D8E743463E220A491148F6F768 +:10B7A00013F9D1E74346512206490F48F6F70CF941 +:10B7B000CAE713A8DEF7D4FC43461C70C4E7C046B2 +:10B7C00080360310943C0310683E0310383D03108C +:10B7D000A03D03106C3D0310503D0310203E0310AC +:10B7E000E83D0310D03D03104C3E0310F0B5574622 +:10B7F0004E464546DE46E0B50023AFB009AD8A4669 +:10B800002900069307939C46BE4B0400160085CB87 +:10B8100085C11B680B60BC4B9C4269D0BB4B9C42F2 +:10B8200063D0BB4B9C4263D001216246B94BE31805 +:10B830009942524191460DAB9B465A46B64B83CB3B +:10B8400083C21B68136011AB98464246B34B83CB4F +:10B8500083C200271B680021136016A81C221597BD +:10B86000D4F7A2FF1C2200211EA808971D97D4F729 +:10B870009BFF2422002125A8D4F796FFC0239B001C +:10B880002893534602AA944629930E231022290096 +:10B890003770634425A82594D6F79AFA00282AD150 +:10B8A00002ABD88925A9D6F7EDFA00284CD1A422FD +:10B8B00002AB9B181B88802B3FD1259B9C4235D126 +:10B8C00025A8DEF74DFC02AB5246D98906A8D6F76B +:10B8D00007FC00283FD03300863000D177E0A52256 +:10B8E0008F499048F6F770F80BE008239946A2E7D5 +:10B8F000102399469FE73300892289498A48F6F741 +:10B9000063F802ABD889D6F795FA002806D12FB094 +:10B910003CBC90469946A246AB46F0BD342233006B +:10B920007F498248FF32F6F74FF8F0E7330099225B +:10B930007B497F48F6F748F8E3E7330078497D48CC +:10B94000103AF6F741F8DCE733008F2274497A4861 +:10B95000F6F73AF8D5E74A46594606A8D6F790FBD7 +:10B9600000283AD108AB01932023102200934146CE +:10B970001DAB06A8D6F714FC002815D1089B102B88 +:10B980003FD0674C6D483300C4222100F6F71CF805 +:10B9900006A8D6F743FC0028B3D03300C722210005 +:10B9A0006748F6F711F8ACE75D4C66483300BB22F8 +:10B9B0002100F6F709F806A8D6F730FC0028A0D039 +:10B9C0003300BE2221005E48F5F7FEFF99E7A3226F +:10B9D00053495D48F5F7F8FF93E7514C5B48330056 +:10B9E000AD222100F5F7F0FF06A8D6F717FC0028D6 +:10B9F00000D186E73300B02221005148F5F7E4FF7B +:10BA00007FE7102208AB21A906A8D6F733FC00284F +:10BA10005DD1089B002B6ED14D4B9A4548D002ABAF +:10BA200007AC52462000D989D6F78AFB002847D1B7 +:10BA30004A4659462000D6F723FB002800D0BDE037 +:10BA4000202708AB019310222000009715AB1DA9F9 +:10BA5000D6F7A6FB002800D0DAE0089D08AA15ABAF +:10BA60007F1B0192200010225B19009721A9D6F7B5 +:10BA700097FB002800D0CBE0159B0393039A119B02 +:10BA800093426DD08922264D32483300290052005E +:10BA9000F5F79AFF2000D6F7C1FB002800D130E768 +:10BAA0001622330029002648FF32F5F78DFF28E7DC +:10BAB00002AB07AC52462000D989D6F711FBB5E797 +:10BAC0003300E82216491748F5F77EFF19E7144CB2 +:10BAD00021483300D2222100F5F776FF06A8D6F7D9 +:10BAE0009DFB002800D10CE73300D522210014482B +:10BAF000F5F76AFF05E73300DB2209491748F5F738 +:10BB000063FFFEE6803603100100004002000040A3 +:10BB100003000040FCFFFFBF94400310A44003104B +:10BB2000943C0310BC3E0310383D031068360310EC +:10BB3000A03D03106C3D0310503D0310683F0310FF +:10BB40001C3F03103C3F03108C3E0310E83E0310E3 +:10BB50000200C00434400310A43F0310CC3F031084 +:10BB6000169B03934346039A5B6893428AD1179BC3 +:10BB700003934346039A9B68934200D082E743466F +:10BB8000189ADB680392934200D07BE710222000D2 +:10BB900008AB15A9089FD6F76DFB002822D1089B9A +:10BBA000ED199C466544202D00D1AAE62C223300D5 +:10BBB00022492348FF32F5F707FFA2E61F4D21482F +:10BBC0003300EF222900F5F7FFFE2000D6F726FB11 +:10BBD000002800D195E63300F22229001A48F5F733 +:10BBE000F3FE8EE62022154D184833002900FF325F +:10BBF000F5F7EAFE2000D6F711FB002800D180E619 +:10BC000091223300290010485200F5F7DDFE78E656 +:10BC100080220A4D0E48330029005200F5F7D4FE69 +:10BC20002000D6F7FBFA002800D16AE60422330090 +:10BC300029000548FF32F5F7C7FE62E6943C031081 +:10BC400064400310F83F03101C3F0310A43F03108F +:10BC50001C400310F0B51F0000239DB01400060027 +:10BC60000D002422002103A80293D4F79DFDC023D8 +:10BC700022009B0041210CA8069307950396D4F758 +:10BC800093FD6B46220006330CA903A8D6F7A0F853 +:10BC900000281CD16B462A00D98802A8D6F720FAC2 +:10BCA000002808D06B46D888D6F7C4F8002816D1EB +:10BCB00038701DB0F0BDAD223B000D490D4852005B +:10BCC000F5F782FE6B46D888D6F7B4F8F1E7542230 +:10BCD0003B0007490848FF32F5F776FEE9E7B12255 +:10BCE0003B00034905485200F5F76EFEE1E7C04608 +:10BCF000943C0310B4400310383D03106836031021 +:10BD0000002330B583B004000D00010001A80193A9 +:10BD1000D6F7EAFA002829D11922474901A8D6F70F +:10BD200011FB002834D12022444901A8D6F70AFB90 +:10BD300000282DD1424B9C423BD0424A944243D0F2 +:10BD4000414B9C4243D0414B9C4243D0FF20044096 +:10BD500080203F4B40040443E318022B20D93D4B85 +:10BD6000E318012B39D814223B491BE02B00863005 +:10BD700007D0AA2239493A48FF32F5F725FE03B029 +:10BD800030BDA62235493748FF32F5F71DFEF6E7EC +:10BD9000D9222B00314934485200F5F715FEEEE761 +:10BDA00010222D4901A8D6F737FB002804D12870AE +:10BDB000E5E714222D49F5E7BE222B0027492C4840 +:10BDC000FF32F5F701FEDAE71C222A49EAE72022D2 +:10BDD0002949E7E730222949E4E7944220D01A4B69 +:10BDE0009C4220D0194B9C4220D0254B9C4214D021 +:10BDF000244B9C4214D0244B9C4214D0234B9C4295 +:10BE00000ED0234B9C420ED0224B9C420ED0224B94 +:10BE100011499C420DD00022C4E740220E49C1E7DF +:10BE20001C220D49BEE720220B49BBE730220A49FC +:10BE3000B8E74022B6E7C046303C03104C3C031044 +:10BE40000500000108000001090000010A000001CE +:10BE5000FFFFFFFEFCFFFFFEE8440310943C0310CD +:10BE6000E44003108C3E03100C410310E843031020 +:10BE7000384103102844031068440310A8440310F9 +:10BE80000B0000010C0000010D000001100000017A +:10BE9000110000011200000113000001F0B5CE46B0 +:10BEA000474680B5A1B002AD16002A00AC4B8846CB +:10BEB000070013CB13C21B68136006AB99464C46B0 +:10BEC000A84B07CB07C407CB07C406CB06C4002486 +:10BED000242200210EA80194D4F766FC242200211C +:10BEE00017A8D4F761FC80231B011193A223DB0563 +:10BEF0000E93434634701297012B3ED06B469C1C28 +:10BF00002300102229000EA8D5F762FF002800D0D8 +:10BF100095E0208817A98025D5F7B4FF00283ED1E9 +:10BF20006B4674229B181B889D4214D1A223179A3A +:10BF3000DB059A423BD033008B4A8C498C48F5F79D +:10BF400043FD2088D5F776FF00280FD121B00CBC27 +:10BF500090469946F0BD87483300874A8349F5F7F4 +:10BF600033FD2088D5F766FF0028EFD03300834AE1 +:10BF70007E498348F5F728FDE8E76B469C1C2300C3 +:10BF8000202249460EA8D5F723FF002857D1802547 +:10BF9000208817A96D00D5F775FF0028C0D087222B +:10BFA0003300724977489200F5F70EFDC9E717A8EC +:10BFB000DEF7D6F83A00218801A8D6F7EFFA002874 +:10BFC00045D11922704901A8D6F718FB002800D0E6 +:10BFD000ABE020226D4901A8D6F710FB002800D065 +:10BFE000A3E0FF3007408020694B400407439F4295 +:10BFF00000D189E0674B9F4200D18BE0664B9F42A6 +:10C0000000D18CE0654B9F4200D195E0434604216E +:10C01000012B23D0624B8901C918624B1022FB18F7 +:10C02000022B4BD801A8D6F753FB002800D188E794 +:10C0300033005D4A4D495D48F5F7C6FC81E784222F +:10C0400033004A495A489200F5F7BEFC7EE73300B8 +:10C05000584A46495848F5F7B7FC72E7514B102249 +:10C06000FB18022B25D9554B1422FB18012B20D984 +:10C07000484B9F4268D0484B9F4269D0474B9F42F4 +:10C080006AD04F4B9F4269D04E4B9F425CD04E4B83 +:10C090009F425DD04D4B9F4256D04D4B9F4257D053 +:10C0A0004C4B9F4258D04C4B9C4667447A427A4155 +:10C0B00092014A4901A8D6F70BFBB6E73F4BFB18A4 +:10C0C000012B25D9334B9F4238D0334B9F4237D079 +:10C0D000324B9F423AD03A4B9F423BD0394B9F4222 +:10C0E0002CD0394B9F422BD0384B9F4226D0384B17 +:10C0F0009F4225D0374B9F4228D0374B9C46674400 +:10C100007A427A4192018DE74346012B1AD02449A5 +:10C11000142287E74346012BA0D03149D2E7022100 +:10C120004346012B00D075E79DE733002D4A0F49A8 +:10C130002D48F5F749FC04E70321F1E71C2271E7DC +:10C1400020226FE71422B4E71C22B2E7302269E70D +:10C150002022AEE7402265E73022AAE74022A8E786 +:10C1600080360310D441031026020000943C0310D3 +:10C17000A03D03106C3D0310210200005602000098 +:10C180004C3E0310503D0310303C0310703C031034 +:10C190000500000108000001090000010A0000017B +:10C1A00028450310FFFFFFFE4E020000A8410310C8 +:10C1B000383D03102F02000064410310FCFFFFFE16 +:10C1C0000B0000010C0000010D0000011000000137 +:10C1D0001100000112000001EDFFFFFE6846031090 +:10C1E00068450310390200008C410310F0B5DE46AB +:10C1F000574645464E46E0B58E4BBFB016000BAADB +:10C200008046894623CB23C20EAB9B465A468A4BB7 +:10C2100023CB23C21B6816AD13602A00874B83CB48 +:10C2200083C283CB83C200271C2200211DA81C9738 +:10C23000D4F7BAFA00211C2225A809970A97249757 +:10C24000D4F7B2FA12AB9A4652467D4B13CB13C2C7 +:10C250001B68002113602CA82422D4F7A5FA2422FD +:10C26000002135A8D4F7A0FAC0239B002F934B469A +:10C27000309343462C9322231022514637706B444F +:10C280002CA8D5F7A5FD00283FD16B4635A9588CC1 +:10C29000D5F7F8FD002855D16B46EC229B181B887A +:10C2A000802B48D1359B98453DD135A8DDF758FF07 +:10C2B0006B46588C09AB0693202305931CAB049363 +:10C2C000102303935B46029318234946019300957C +:10C2D0000C3B0BAAD6F758FA00283AD03300863028 +:10C2E00000D176E0574A58495848F5F76DFB6B4640 +:10C2F000588CD5F79FFD00280ED0B4223300524948 +:10C3000053489200F5F760FB06E09E2233004E4949 +:10C3100050489200F5F758FB3FB03CBC9046994618 +:10C32000A246AB46F0BDA222330047494A489200DC +:10C33000F5F74AFBDBE73300484A43494848F5F73D +:10C3400043FBD4E73300474A3F494748F5F73CFBF6 +:10C35000CDE7FE224B46C021D2051A40C904002376 +:10C360008A4230D0099A9A4225D16A46508C0AAA4C +:10C370000692039320221CAB02931823059224AA51 +:10C38000904604920193494600950C3B0BAAD6F7C0 +:10C3900053FA002823D10A9B102B29D143460E9A29 +:10C3A0001B689A422BD0B222330027492F489200B3 +:10C3B000F5F70AFB9BE7A922330023492C4892009A +:10C3C000F5F702FB93E74B469B049B0ECAD0103354 +:10C3D000C8E7284A1C492848F5F7F6FA87E73300EA +:10C3E00086301FD0254A18492548F5F7EDFA7EE733 +:10C3F0003300244A14492448F5F7E6FA77E75B4608 +:10C4000042465B6852689342CDD15B4642469B6888 +:10C4100092689342C7D15B46DA684346DB689A422A +:10C42000C1D164E7AD22084913489200F5F7CCFA70 +:10C430005DE7C046A4420310A4400310B0420310BD +:10C44000803603109E020000943C0310F441031058 +:10C4500068360310383D0310A03D0310830200002E +:10C460006C3D03107E020000503D03103440031069 +:10C47000184203109A0200008C3E0310B60200001E +:10C480004C420310BD0200007042031030B500257D +:10C4900091B024220021040007A8D4F785F90F22C7 +:10C4A000002103A80295D4F77FF980235B000A934B +:10C4B0000B4B13220B930B4B02A907936B4607A858 +:10C4C0000633D5F785FC873002D1257011B030BD19 +:10C4D0002300054A05490648F5F776FAF6E7C0460F +:10C4E0000001600401000040E3020000943C0310DE +:10C4F000C8420310002303707047C046F0B5002502 +:10C5000095B00400242200210BA80195D4F74CF922 +:10C5100003A90A00354BC1CBC1C21B680BA813602D +:10C52000C0239B000E93324B25700B936B46314D0D +:10C53000102202330F95D5F74BFC002836D16B46FD +:10C540002A00598801A8D5F7CBFD002820D101A8E1 +:10C55000D5F764FE002841D16B46274A598801A8C7 +:10C56000D5F7BEFD853029D0D222230023482449A7 +:10C570009200F5F729FA6B465888D5F75BFC00283E +:10C5800012D023001F4A1E491F48F5F71DFA0BE081 +:10C5900023001E4A1A491E48F5F716FA6B465888BA +:10C5A000D5F748FC0028ECD115B0F0BDCD22230012 +:10C5B000134918489200F5F707FAF5E76B46102281 +:10C5C000588807A902ABD5F789FC8530E6D023004F +:10C5D000114A0B491148F5F7F7F9DFE72300104A34 +:10C5E00007491048F5F7F0F9D8E7C0468036031040 +:10C5F00001000040000160040200C0046443031015 +:10C60000943C031056030000D04303103B0300008A +:10C610001C430310044303104F030000984303100E +:10C620004103000040430310F0B5C6460138010045 +:10C6300000B5481E8141C54C4022A5444024CD0789 +:10C640000FA80021D4F7B0F80FAB2100002218008A +:10C650004093419402F00CFD002800D02AE14021D3 +:10C660000FA81FAE942300969B0040AAD5F77AF935 +:10C6700040AB03931F9B041E049311D129000BA808 +:10C6800000F076F90399049A0BA800F07DF9041ED6 +:10C6900006D12FAD29000BA800F0B4F9041E06D076 +:10C6A0002000D4239B009D4404BC9046F0BD2B6C1D +:10C6B000DB0700D414E100214022300009AFD4F799 +:10C6C00073F83B002A0003CA03C34023079608936C +:10C6D00032000998696802F0B9FC002826D0309B26 +:10C6E000032B20D92F9A9046002A02D00422944688 +:10C6F000E0441C1F402B16D1434621000022404637 +:10C7000009930A9402F0B4FC431C0CD143463C212B +:10C7100020A807934246230009900A91089402F04A +:10C7200095FC002802D033246442B9E72B6C9A07A9 +:10C7300000D4EEE05B0700D4D5E0854B984633008B +:10C74000424613CA13C313CA13C303CA03C33A002E +:10C7500033AB03CB03C22023320009987968372416 +:10C760000796089302F072FC6442002898D12B6C63 +:10C770001A076ED4DB0600D4B8E0444632002034F9 +:10C780000BCC0BC20BCC0BC20ACC0AC23A00202441 +:10C7900037AB03CB03C223003200099879680796B0 +:10C7A000089402F053FC002800D0B5E02B6C5A0628 +:10C7B00000D4B6E01C4200D1B0E01A0659D4DB0523 +:10C7C00067D402A90BA800F0FBF9041E00D067E7AC +:10C7D000029B002B00DAADE000D161E732000021BE +:10C7E0000BA800F023FA002878D1B36A9A0700D486 +:10C7F000A9E01A0700D4A3E09A0600D49DE05B06E6 +:10C8000077D4029B012B00D84AE7320001210BA804 +:10C8100000F00CFA002861D1B36A9A0700D492E0C4 +:10C820001A0700D48CE09A0600D486E05B0600D498 +:10C8300036E73A0027AB03CB03C20623454A0998E3 +:10C84000796802F003FC041E00D129E76F246442DA +:10C8500026E7320035AB03CB03C212233E4A3068D1 +:10C86000716809920A9302F0F1FB00285CD12B6CED +:10C8700080E732003BAB03CB03C21123374A306859 +:10C88000716809920A9302F0E1FB00284FD12B6CEA +:10C8900095E732003DAB03CB03C21723304A1F9804 +:10C8A000716809920A9302F0D1FB002889D04324D1 +:10C8B0006442F5E60FAB1FAE1F9330006B462FA905 +:10C8C000409141942094220090C890C305A8002371 +:10C8D00002F0A0FB059806992F95C3E60400DFE659 +:10C8E00032246442DCE636246442D9E63A246442C7 +:10C8F000D6E63A0027AB03CB03C20623154A0998B4 +:10C9000079680792089302F0A1FB002800D178E72C +:10C910009CE734246442C3E65B3CC1E63E246442A7 +:10C92000BEE63C246442BBE639246442B8E64124B6 +:10C930006442B5E605246442B2E66C246442AFE684 +:10C940006A246442ACE666246442A9E6B0FCFFFFB8 +:10C95000C4460310BC4603107C46031090460310E7 +:10C96000A446031010B50120FFF75EFE10BDC046BF +:10C9700070B510220D0000210400D3F715FF10231D +:10C98000A560237370BDC04630B583688DB0DB0FE2 +:10C990000291039204001022002106A80A93D3F703 +:10C9A00003FF16236B44180000F0F8F9002825D186 +:10C9B0006B4602226946DB8A0A760893099000904A +:10C9C00023000299039A06A800F06CFB16280BD8E6 +:10C9D0000B4B1D5C6B462573D88A00F025FA0028A6 +:10C9E0000AD128000DB030BD03256B462573D88AC7 +:10C9F00000F01AFA0028F4D00325F2E70F25F0E73B +:10CA00002047031070B5644C0600A5440C00442276 +:10CA100000212000D3F7C8FE0123604A5B421C922C +:10CA20001D9301235E4A1CAD5B422A636B630123A5 +:10CA30005C4A5B422A666B6601235B4A5B4240921A +:10CA400041930123594A5B424C924D930123584A2A +:10CA50005B42589259930123564A5B426492659314 +:10CA60000123554A5B42709271930123534A5B4202 +:10CA70007C927D930022002388928993307B00284A +:10CA800003D094239B009D4470BD01A806CE0023D3 +:10CA900001F0D6FA290001A800F0F8F90028F0D139 +:10CAA0002B7A062B07D1220020AB42CB42C20123B6 +:10CAB000226C134323643823EB5C062B08D123003C +:10CAC0002CAA083342CA42C30223226C13432364B4 +:10CAD0006823EB5C062B08D1230038AA103342CA26 +:10CAE00042C30423226C134323649823EB5C072B7B +:10CAF00008D1230044AA183342CA42C30823226C37 +:10CB000013432364C823EB5C062B08D1230050AAEF +:10CB1000203342CA42C31023226C13432364F823F8 +:10CB2000EB5C022B05D15C9B226CE3622023134358 +:10CB3000236494235B00EB5C022B1ED0AC235B00D0 +:10CB4000EB5C072B08D1230074AA303342CA42C3DE +:10CB50008023226C13432364C4235B00EB5C072B0C +:10CB600000D08EE7230080AA383322CA22C3802354 +:10CB7000226C5B001343236483E7699B689A002B54 +:10CB8000DCDC05D04023A262226C13432364D5E78A +:10CB9000931CD3D8F6E7C046B0FDFFFF00DBFEFFD5 +:10CBA000FFDAFEFF04DBFEFF03DBFEFF05DBFEFF1B +:10CBB00007DBFEFF06DBFEFF08DBFEFFFEDAFEFF03 +:10CBC00030B50400007B0D008FB0002801D00FB0FD +:10CBD00030BD04AB0093134A04232068616800F061 +:10CBE00011FA002813D01128F1D103CC04AB009323 +:10CBF0000D4A022300F006FA00280ED1069B03938B +:10CC0000012B0CD1079B002B09D12860DFE702AB79 +:10CC10001B8A002B03D02B60D9E71128D7D1122013 +:10CC2000D5E7C04602DBFEFF01DBFEFFF0B54F4655 +:10CC30004646D646C0B5067B0C001700BCB0002E99 +:10CC400006D030003CB01CBC90469946A246F0BDD0 +:10CC500006C8002321A801F0F3F94E4902AA21A831 +:10CC600000F084F9061EECD16B461B7A042B18D118 +:10CC70006B460CAD5E7B0CE06B79B34213D9002C94 +:10CC800013D00022290021A8013C00F0DDF8002883 +:10CC900005D1290021A801F0D9FD0028ECD00526F6 +:10CCA000CFE70726CDE71126CBE72E78052E01D05A +:10CCB0000626C6E72C2200213800D3F775FD364B37 +:10CCC00016AC984640239A46203B9946210021A85D +:10CCD00001F0BCFD0028B4D1A378022B19D1A069C2 +:10CCE000E16906220023D6F7F7FB0130012810D8AE +:10CCF0004246A3699B00D3589F462378072BD0D187 +:10CD00003B0018AA203303CA03C35246BB6A13432D +:10CD1000BB62210001AA21A800F096F8002800D0EB +:10CD20008FE76B79019A9342D0D9002689E723785F +:10CD3000062BB6D13B0018AA183303CA03C34A46D0 +:10CD4000BB6A1343BB62E4E72378072BA9D13B00FE +:10CD500018AA103303CA03C30823BA6A1343BB6279 +:10CD6000D7E72378072B9CD13A0018AB03CB03C23B +:10CD70000123BA6A1343BB62CBE72378062B90D119 +:10CD80003B0018AA083303CA03C30223BA6A134339 +:10CD9000BB62BEE702DBFEFF0447031070B59EB026 +:10CDA00024220021060004A8D3F7FEFC00233D2224 +:10CDB00000210EA80D93D3F7F7FC184D2C68002C1A +:10CDC00025D102AB4121023303AA0DA8D4F70CFEF2 +:10CDD00000281CD180231B010793114B1149089394 +:10CDE00002AB5B8819430B9B0193002B13D00023EC +:10CDF000002204A8D6F75EF83300039A0DA904A810 +:10CE0000D4F7E6FF002802D101232B6000E00524BF +:10CE100020001EB070BD0491EEE7C046FCAD0208D4 +:10CE2000090006100000036010B5064C2368012BB2 +:10CE300001D0052010BDD4F7FDFF0028F9D12060F6 +:10CE4000F8E7C046FCAD020870B50B780500043B5E +:10CE50000C0016008AB0012B0BD9002A10D000203C +:10CE60004B7913600AB070BD6B4661795B7999426A +:10CE700008D86946280001F0E9FC0028F4D0F1E761 +:10CE80000020EFE7002EEDD03360EBE7F0B557461A +:10CE90004E46DE464546E0B54B680A680F001A4329 +:10CEA00006000B0095B00021002A05D019721A6BFC +:10CEB000586B30330243F9D16946300001F0C6FCAB +:10CEC0006B461B789946052B4CD16B465B780AADB7 +:10CED00098466B465B79434512D96946300001F0AC +:10CEE000B5FC00280ED16B469B78022B1ED06B46FA +:10CEF0001B78043B012B12D96B465B794345ECD878 +:10CF000000239946484615B03CBC90469946A24637 +:10CF1000AB46F0BD6A466B7952799A42DBD829005C +:10CF2000300001F093FC0028F4D0EBE73B687A680E +:10CF300019001143DBD006993C008A4607998B46BD +:10CF400005E0236B626B190030341143CFD0534599 +:10CF5000F7D15A45F5D12000282269460830D3F789 +:10CF600007FCEEE706239946CCE7C046F0B54746F6 +:10CF7000CE4680B595B00F0069460600140001F05A +:10CF800065FC6B461B789846052B34D1FB179946F8 +:10CF90000AAD04E063796A4652799A422ED821009C +:10CFA000300001F053FC002816D1A378022B19D0D1 +:10CFB0002378043B012BEDD82900300001F046FC1A +:10CFC000002809D163796A799A42E4D329003000B4 +:10CFD00001F03CFC0028F5D0404615B00CBC904652 +:10CFE0009946F0BDA369BB42E2D1E3694B45DFD16D +:10CFF00000239846F0E706239846EDE7112398466C +:10D00000EAE7C04670B5C0B0019114001D00011ED2 +:10D0100030D00023019A25A801F012F80022002345 +:10D020000C940CA9E41725A80D9418921993FFF7F6 +:10D030002DFF041E19D16B4638229B181E7811341F +:10D04000002E12D028220EA902A8D3F791FB25A802 +:10D0500001F0BAFF041E0FD1AE4209D16B4628225F +:10D0600044981E7202A9D3F783FB200040B070BD24 +:10D070000724FAE70A24F8E70A3C604244410534F1 +:10D08000F3E7C046002303707047C04610B50300A5 +:10D09000012202490248F4F781FC10BD18880208F9 +:10D0A00038470310F0B5CE46474680B55C4C0600C5 +:10D0B000A5441C0020AB0C9320230D93002333A820 +:10D0C0002360636028AD00F0BBFF290033A801F0A6 +:10D0D000BDFB2B780CAF042B18D132691A4208D053 +:10D0E00012220023290033A801F088FE002800D175 +:10D0F00090E0B02200217AA8D3F756FB290033A88C +:10D1000028AD01F0A3FB2B78062B07D00820A7231E +:10D110009B009D440CBC90469946F0BD2AAB19007B +:10D1200008220AA89846D3F723FB7AAB00930A9803 +:10D130000B994EAB19AA00F04FFB0028E7D17AAA51 +:10D1400012A933A800F064FB0028E0D133699B07E3 +:10D1500002D5139B002B5FD04EA97AA800F07AFA73 +:10D160000028D4D1AE9A12A919A800F057FB0028C4 +:10D17000CDD1290033A801F069FBA0236A46D2185B +:10D180001378062BC2D12200414609C909C22900E1 +:10D1900033A801F05BFB6A46A023D3181B78062B4B +:10D1A000B4D110AD02330822414628009946D3F786 +:10D1B000DFFA33A801F008FF00282FD14A4633696F +:10D1C0001342A4D10EAB0493994602AB984606CF06 +:10D1D00006C36B4606CC06C301230A990B9A19981D +:10D1E00000F028F8002892D106AB06CD06C34A46C7 +:10D1F00004AB03CA03C3424613AB03CB03C23100E3 +:10D20000082268460831D3F7B3FA0CCE199800F01B +:10D210005DFB7CE720207AE70C2078E7092076E7A1 +:10D2200064FDFFFF0730434258410F2340429843BB +:10D230007047C046F0B5BDB06F4600917A600AA94C +:10D240003022040016A81D00F3F7A8FC042116A83C +:10D25000F3F700FE0A23314A032116A808AE08920C +:10D260000993F3F713FD33003A0003CA03C3022105 +:10D27000089A7B6816A8F3F709FD00230022022113 +:10D2800016A808930993F3F701FD002D35D12B0063 +:10D290000022022116A808950995F3F7F7FC01353D +:10D2A000042116A80022F3F7FDFD04A916A8F3F740 +:10D2B000A3FE00282DD10734614261410F2349426A +:10D2C000994306A800F096FB002814D1059B049909 +:10D2D0005A1B93421FD306A87260089100F0ACFB62 +:10D2E0004299439A06A800F0A7FB469B4499459AA9 +:10D2F00006A800F0B1FB3DB0F0BD330042AA03CA5E +:10D3000003C30B21089A439B16A8F3F7BFFC002523 +:10D31000C6E71520EFE700220021DCE79047031065 +:10D3200070B51E008B7805000C008AB0022B2DD042 +:10D330000A20072B01D00AB070BD1100906D0023A8 +:10D3400060315832002809D00A0008310800083836 +:10D35000006801330028F7D10A2B4CD0E369A1699A +:10D360000AC22378043B012B08D96379002033607B +:10D37000E1E76B4662795B799A4232D869462800C8 +:10D3800001F064FA0028F4D00920D4E7136851684A +:10D390000B4332D09368D1680B4330D01369516985 +:10D3A0000B432ED09369D1690B432CD0136A516A79 +:10D3B0000B4318D0936AD16A0B4326D0136B516B81 +:10D3C0000B4324D0936BD16B0B4322D0136C516C65 +:10D3D0000B4320D0936CD16C1A200B43ABD1093393 +:10D3E00002E03360A7E70423A069E169DB00D218FB +:10D3F00010605160B5E71A209DE70023F4E7012390 +:10D40000F2E70223F0E70323EEE70523ECE7062328 +:10D41000EAE70723E8E70823E6E7C046F0B5DE467B +:10D4200057464E46454688469246E0B51C229BB07C +:10D430000600002140460193D3F7B6F95346002B6E +:10D4400004D0B02200215046D3F7AEF906AC21003B +:10D45000300001F0FBF9162800D191E0002800D03F +:10D460008CE02378052B22D1637800931A0063792E +:10D470000593934200D883E0B3462100584601F05B +:10D48000E5F9051E00D079E0A378022B68D1A069E8 +:10D49000E1696779062200230597D6F71DF8013068 +:10D4A00001285DD8A3696A4A9B00D3589F460A2584 +:10D4B00028001BB03CBC90469946A246AB46F0BD46 +:10D4C0002378062BF3D143469B69002B60D143465A +:10D4D00008AA143303CA03C34BE02378062BE6D112 +:10D4E00043461B69002B4DD1434608AA0C3303CA9F +:10D4F00003C33EE02378062BD9D143469B68002B1B +:10D500004CD1434608AA043303CA03C331E053464F +:10D51000002B00D19AE052461B685268134306D193 +:10D520005346DA6D996D002A3ED000293CD0222561 +:10D53000BEE75346002B00D188E02378022B00D0B1 +:10D540007EE0A268E3681100194379D0002B77DCF4 +:10D5500072D043461B68002BE9D143461A6008E0AD +:10D5600021005846019A05ABFFF7DAFE00286BD17F +:10D57000059F009BBB4200D27FE799E7092597E70B +:10D58000002595E74346DB68002BADD022258FE7C9 +:10D5900043465B69002B9AD0222589E743465B68A6 +:10D5A000002BAED0222583E72378042B42D1637869 +:10D5B00018009F423AD9002302951F001D004346E0 +:10D5C000814610AE039311E0072B33D1092D31D8DA +:10D5D00028006B1C98460B30C0000822504412A94A +:10D5E000D3F7C6F845467379994512D231005846AB +:10D5F00001F02CF90028C1D13378022BE4D1092F96 +:10D6000018D8B168F268FB00534419605A600137BA +:10D61000E9E71F00039B52469846534652681B6831 +:10D62000029D13430ED15346996DDA6D002A01D045 +:10D63000002907D124253BE780231B069A4288D383 +:10D640001E2535E7059794E7050031E723252FE7E9 +:10D650009C470310F0B5D6464F4646460B68C0B50A +:10D660001A000400486884B0024300D166E00D004F +:10D6700062682668904608353243AA469446624658 +:10D68000002A51D09E4200D180E0A268E7681500D0 +:10D690003D4349D09A4200D17CE022696769150078 +:10D6A0003D4341D09A4200D178E0A269E769150074 +:10D6B0003D4339D0934200D174E0226A676A150075 +:10D6C0003D4331D0934200D170E0A26AE76A150071 +:10D6D0003D4329D0934200D16CE0226B676B15006B +:10D6E0003D4321D0934269D0A26BE76B15003D43C7 +:10D6F0001AD0934266D0226C676C15003D4313D05C +:10D70000934262D0A26CE76C15003D430CD093426B +:10D710005ED0236D626D134306D01B2004B01CBC89 +:10D7200090469946A246F0BD08239946CA445246FF +:10D73000083A136850681A000243A0D18B6D002B81 +:10D7400022D058310E002500A36D5835002B04D18E +:10D7500016E0AB680835002B12D008222900684675 +:10D76000D3F706F80822310002A8D3F701F8029A8D +:10D77000039B0098019901F069FC0028E9D1CCE7EE +:10D78000B3680836002BDED10020C7E7804500D003 +:10D790007BE7C2E7874200D07FE7BEE7874200D041 +:10D7A00083E7BAE7B84200D087E7B6E7B84200D0CF +:10D7B0008BE7B2E7B84200D08FE7AEE7B84200D0BF +:10D7C00092E7AAE7B84296D1A7E7B8429AD1A4E770 +:10D7D000B8429ED1A1E7C04670B50E0014001D00EE +:10D7E0009EB001000023320003A800F029FC2A00AB +:10D7F0002100229B03A8FFF711FE002801D01EB0D4 +:10D8000070BD03A801F0E0FB0028F8D00920F6E77E +:10D8100010B513000022FFF701FE10BD0300F0B5A4 +:10D82000002A07D010000C00E0CCE0C0E0CCE0C043 +:10D83000246804601868002805D00C68002C37D1D3 +:10D84000002A00D01060986800280BD05868002883 +:10D8500008D08868002828D1002A03D0101D1C1D7C +:10D8600060CC60C0186900280DD0D86800280AD0A4 +:10D87000086900281ED1002A05D010001C000C30B9 +:10D880000C3460CC60C09C690020002C0CD05C691A +:10D89000002C09D08869002811D1002A14D0143234 +:10D8A000143303CB03C20020F0BD48680028D3D056 +:10D8B0002220F9E7C8680028DDD02220F4E7496972 +:10D8C0000029EAD02220EFE70020EDE782B000B582 +:10D8D00083B004920593C31D04D0012003B008BC9B +:10D8E00002B01847069B0A9A98B20D9B0E49019305 +:10D8F0000C9B00930B9BD5F7A1F80028EED00300FA +:10D9000095330DD003008633E7D003008D3309D063 +:10D910009730434258410423404298431730DDE793 +:10D920000D20DBE71020D9E70900061082B010B502 +:10D9300086B008920993C31D05D0012006B010BC23 +:10D9400008BC02B018470A9B0E9C98B205AB029324 +:10D950000F9B0C9A019311490D9B0094D4F7FEFF85 +:10D96000002810D00300953313D003008633E4D091 +:10D9700003008D330FD09730434258410423404277 +:10D9800098431730DAE7109B059A00201C605A6014 +:10D99000D4E70D20D2E71020D0E7C04609000610DA +:10D9A00082B010B58AB00C920D93C31D05D0012032 +:10D9B0000AB010BC08BC02B018470E9B24229CB2CF +:10D9C000002101A8D2F7F0FE200001A9D4F75AFAED +:10D9D00003000020002BEBD16B460722998B00201F +:10D9E0000A40CB08511E8A419B18109A5B001360B5 +:10D9F000DEE7C04610314B4259410D4B49421940B8 +:10DA00000C4B10B59C460023614403600400D4F71E +:10DA10006BFC030060600020002B06D01A008632E9 +:10DA200004D08A3358425841043010BD0320FCE72B +:10DA30000A00FF00FFFF000010B5436882B0040039 +:10DA400000910192002B04D1002902D0D4F77AFC76 +:10DA5000606002B010BDC04670B582B001924268ED +:10DA600004001D000091002A07D01300863311D056 +:10DA70008A325042504104300AE0019A04330E00C9 +:10DA8000D4F790FC606002002E600020002AECD1E8 +:10DA900002B070BD0320FBE7F0B5DE464E464546BA +:10DAA000574689468046E0B58DB00021039248462E +:10DAB0002822D2F779FE0121404601F053FB0028CD +:10DAC00000D179E003785A1193461F221A401300BF +:10DAD000183B0292032B3AD894468D4B6344183B73 +:10DAE0001B789A46002B00D17CE0002400232500FF +:10DAF0001C00200E030029020B4322020121404694 +:10DB000014001D0001F02EFB002803D0002706782A +:10DB1000A4197D4101235B429C46E2445346002BFD +:10DB2000E7D143469E7B002E56D15B46062B00D1A3 +:10DB300096E0072B18D14A46029B1370143BDBB2C8 +:10DB40000B2B00D9ABE0734A9B00D3589F461300C0 +:10DB50001C3B0526022B41D830000DB03CBC904642 +:10DB60009946A246AB46F0BD032B13DD062B00D130 +:10DB700082E0002D00D08EE0674B9C4200D98AE005 +:10DB8000029B1F2B01D1654B1C004B465A461C8142 +:10DB90001A70E1E7012B00DCA9E0029B1F2B26D1C4 +:10DBA0005B46023B5A1E93414A46063313700123DB +:10DBB0005B429660D360CFE743469B7B002B0BD143 +:10DBC0000024002325001C004B464A469C60DD6073 +:10DBD000022300261370BFE70626BDE700231400CA +:10DBE0001D009EE70024002325001C0099E721006A +:10DBF000002D52D1230005334FD8404601F0B2FA30 +:10DC00002500041EE8D0039B002B6AD082CB0022A3 +:10DC10002B0004A8B847049B002B66D004A9082257 +:10DC200008A8D2F7A5FD6A460694079506AB03CB74 +:10DC300003C200230899099A0AA801F0EBF94846A3 +:10DC400008220AA90830D2F793FD01234A46D3706F +:10DC50005B46023B5A1E93414A46063313707BE7EC +:10DC6000029B1F2B0BD04B462A0021009960DA60E3 +:10DC7000FE234A4613706FE7029B1F2B01D1152626 +:10DC80006AE7002D2BDB4A46E3439360EB43D36006 +:10DC90000223137060E703265EE718265CE74A4616 +:10DCA0000D231472137057E74B464A469C60DD60A3 +:10DCB0001B23137050E7201CD7F75AF84B464A46EF +:10DCC0009860D9601B23137046E7A0B201F06AFA8E +:10DCD000F4E7002DE3D11F2CE1D80C263CE7082601 +:10DCE0003AE74B469860DD60B2E7122634E7029BC4 +:10DCF0001F2BC4D05B46002BC3D1002D00DB63E794 +:10DD00004B464A469C60DD600323137024E7C046FF +:10DD1000F0480310B8470310FEFF0000FFFF0000AB +:10DD2000F0B54546DE4657464E46E0B504000D00C8 +:10DD3000904697B0002A01D000231370002303936C +:10DD40000493E36D002B00D1A4E026005836627CDA +:10DD50002900531E9A41524220003240FFF79CFE98 +:10DD60000290002846D12B789946063B012B54D8C7 +:10DD7000EB68013300D0F1E0002E00D1FBE000237E +:10DD80004A469B46A146AA461C000CAF059221E0DC +:10DD90003B781F2B36D0059A9A4200D0E8E0FB680A +:10DDA0005A1C00D1E4E01B195A46316875680AA86C +:10DDB000A8470A9B002B00D1E0E06A460EAB03CBDC +:10DDC00003C223000A990B9A08A801F023F9089BC3 +:10DDD000099C9B46002239004846FFF75DFE00285B +:10DDE000D6D002905B46002B04D012CE00235A46B8 +:10DDF00006A8A047029817B03CBC90469946A24698 +:10DE0000AB46F0BD55465B46A246AB605346EB6061 +:10DE10000123EB702B784C4699464B46FE2B00D0E5 +:10DE20009CE0E868AA68002836D180235B029A4209 +:10DE300032D20023814903E001330231192B2BD068 +:10DE40000E88B242F8D1202149425E1800D58AE0FE +:10DE50002131B14001269E40039B33430393049B31 +:10DE60000B4304934346002B00D16AE741461B78DD +:10DE70004978994200D896E046467668D900B4467B +:10DE800061440A604246013348601370E36D002B21 +:10DE900000D05AE700265AE7A16E0029E2D00B789D +:10DEA000102BA7D8002BDDD049680E68964268D0A9 +:10DEB000012BD7D08E68964269D0022BD2D00E6942 +:10DEC00096426AD0032BCDD08E6996426ED0042B39 +:10DED000C8D00E6A96426FD0052BC3D08E6A964288 +:10DEE00070D0062BBED00E6B964271D0072BB9D0E6 +:10DEF0008E6B964272D0082BB4D00E6C964273D0C3 +:10DF0000092BAFD08E6C964274D00A2BAAD00E6D1E +:10DF1000964275D00B2BA5D08E6D964276D00C2BE9 +:10DF2000A0D00E6E964277D00D2B9BD08E6E96426F +:10DF300078D00E2B96D00E6F964279D0102B91D1BF +:10DF40008B6F93428ED1CB6F83428BD10F233033B3 +:10DF5000202149425E1800D47AE704E0039B2B623B +:10DF6000049B6B6246E720260121F61AF14071E717 +:10DF70001123029336E7102302933BE71223029307 +:10DF800030E74E68864293D100233033E0E7CE6815 +:10DF9000864292D101233033DAE74E69864291D12D +:10DFA00002233033D4E71423029323E7CE69864259 +:10DFB0008DD103233033CBE74E6A86428CD10423C4 +:10DFC0003033C5E7CE6A86428BD105233033BFE7B5 +:10DFD0004E6B86428AD106233033B9E7CE6B864238 +:10DFE00089D107233033B3E74E6C864288D10823AA +:10DFF0003033ADE7CE6C864287D109233033A7E7B3 +:10E000004E6D864286D10A233033A1E7CE6D86421B +:10E0100085D10B2330339BE74E6E864284D10C238F +:10E02000303395E7CE6E864283D10D2330338FE7B0 +:10E030004E6F864282D10E23303389E7F4480310B5 +:10E04000F0B5040083B00F001600002168220430F0 +:10E050001D00D2F7A9FB0023A373054B2760A38102 +:10E060002300143366602574636503B0F0BDC046B9 +:10E070000FB0FFFFF0B5D6464F464646C0B59246B4 +:10E08000854B828904000D008CB09A4204D18268CD +:10E0900043689A4200D805D12300626D14339A4236 +:10E0A00000D1A9E0524629002000FFF739FE061EE4 +:10E0B00059D12B7899461F2B61D0237C022B00D19C +:10E0C00093E02700636D1437BB4202D09A78052A8B +:10E0D00027D04A46111FC9B2DA1B9210D2B26A7019 +:10E0E000012900D870E09F4219D06C490AE0013A3A +:10E0F00092B21A80002A00D0CBE0043B63659F42B5 +:10E1000000D16FE01A888A42F1D19F4200D169E0C4 +:10E110001A8862498A4234D0DB1B9B10DAB26A71DA +:10E1200026E0EB7829009846AA68EB682000009268 +:10E1300001935246FFF7F4FD002800D08BE04346E0 +:10E140002B714B46072B00D177E0237C012B09D0A4 +:10E150004B46022B00D170E0032B00D17FE0062B51 +:10E1600000D16AE00926282200212800D2F71CFBF2 +:10E1700030000CB01CBC90469946A246F0BD132658 +:10E18000F1E7A08944498842C6D191468046A268F9 +:10E19000924662689245BFD876D00022200002A93C +:10E1A000FFF77AFC002856D102AB1B781F2B5DD1FC +:10E1B000636DBB42E3D01A884A45E0D1A289043B93 +:10E1C00063654245E3D0A7E72989002916D02200DC +:10E1D0005032934241D21A1D62654A469A71636D6C +:10E1E000198092E700226A71C2E74B46052B17D0CF +:10E1F0002700636D14376CE71626B4E7BB4200D1E5 +:10E200008DE7264908E0013A92B21A80002A40D1EF +:10E21000043B6365BB42E5D01A888A42F3D174E7B8 +:10E22000202327002B702B8914375B002B81636D13 +:10E23000DA1B9210D2B26A7055E7009A019BAA616C +:10E24000EB614B46AB702B7899461F2B97D0191F6B +:10E25000C9B2636D40E7060085E7022683E7009AAE +:10E26000019BAA61EB610323AB70ECE763689A45FD +:10E2700007D90123A373626DD21B9210D2B26A71C7 +:10E2800076E75346A360F6E7DA1B9210D2B26A71C2 +:10E290006EE7636D39E7C0460FB00000FFFF000076 +:10E2A000F0B54F46D6464646C0B59146C14B828929 +:10E2B00004000D0096B09A4204D1826843689A42E5 +:10E2C00000D805D12300626D14339A4200D1A6E133 +:10E2D0004A4629002000FFF723FD8046002800D091 +:10E2E00082E02E781F2E00D184E0237C022B00D107 +:10E2F00058E12700636D1437BB4202D09A78052A93 +:10E3000051D0311FC9B2DA1B9210D2B26A70012902 +:10E3100000D838E1BB4219D0A7490AE0013A92B2CD +:10E320001A80002A00D08CE2043B6365BB4200D116 +:10E3300036E11A888A42F1D1BB4200D130E11E8811 +:10E340009D498E425ED0DB1B9B10DAB23F262F6ABE +:10E350006B6A3E406A7199462022002330000021FA +:10E36000D5F7BAF80130012811D8944BB6009B5963 +:10E370009F46002300222A616B612B78032B00D17A +:10E3800057E11B2B00D1E0E0022B00D1F8E00D2378 +:10E39000984600232B70AB70404616B01CBC9046CC +:10E3A0009946A246F0BDEB7829009A46AA68EB6828 +:10E3B0002000009201934A46FFF7B2FC002800D0EB +:10E3C00035E153462B71072E00D11DE1237C012B33 +:10E3D00008D0022E00D117E1032E00D1A8E1062EAD +:10E3E00000D111E109239846282200212800D2F704 +:10E3F000DBF9CEE7282200212800D2F7D5F9132334 +:10E400009846C6E7A2896B498A429CD19246A26887 +:10E4100091466268914596D800D1F9E1002220002A +:10E420000CA9FFF739FB002800D000E1282202AB3D +:10E430009B181B781F2B00D08AE1636DBB4200D173 +:10E440006EE11A88B24200D06AE1A289043B63659A +:10E450005245DCD077E72B78062B98D1023B1F4042 +:10E460007B425F4109372F7096E72B78042B62D1EE +:10E470000023534A6E7802320133192B00D1E1E0B8 +:10E480000232911E09880429F6D1202252429A189C +:10E4900000D548E10121914001229A4013004A46EB +:10E4A0003B400A4013435F427B4103225B421340DF +:10E4B0000E33002220002B7002A9FFF7DBFD8046FF +:10E4C000002800D065E702AB5B7801369E4232D16E +:10E4D00002AB1B78022B2ED1049A059B2000AA6068 +:10E4E000EB600CA90022FFF7DBFE8046002800D07D +:10E4F0004FE7292202AB9B181B789E421BD102AB2F +:10E50000013A9B181C78022C00D11AE12300093B28 +:10E51000012B10D8280008220EA91030D2F728F9B4 +:10E520002B78083C1C192C702D2202AB9B181B78F1 +:10E530009E4200D030E7172398462AE72B78072B16 +:10E5400000D024E704332B7026E70222AE68EF6880 +:10E550001C4B300039005242D4F7AAFF00286BD17F +:10E5600030003900D5F70AF8A860E960D5F742F81D +:10E5700002000B0030003900D6F712F828616961FB +:10E580000C232B7008E7298900291DD02200503266 +:10E59000934254D21A1D62659E71636D1980CBE659 +:10E5A0000022D3E6052E22D02700311F636D1437D9 +:10E5B000C9B2A8E60FB00000FFFF0000E847031053 +:10E5C000F4480310FFFFDF43BB4200D1BEE69E4983 +:10E5D00009E0013A92B21A80002A00D031E1043BEE +:10E5E0006365BB42DCD01A888A42F2D1A4E62023BC +:10E5F00027002B702B8914375B002B81636DDA1B8E +:10E600009210D2B26A7085E6009A019BAA61EB6112 +:10E61000AE702E781F2E00D1ECE6636D71E62822D5 +:10E6200000212800D2F7C0F816239846B1E68046AC +:10E63000DAE6EB68002BA3DA0B239846A9E602235F +:10E640009846D1E6A36E002B79D01A78102A5FD8AD +:10E65000002A5DD059680B68042B00D182E0012AA2 +:10E6600056D08B68042B00D182E0022A50D00B696F +:10E67000042B00D183E0032A4AD08B69042B00D1FC +:10E6800084E0042A44D00B6A042B00D185E0052ADB +:10E690003ED08B6A042B00D186E0062A38D00B6B63 +:10E6A000042B00D191E0072A32D08B6B042B00D1D0 +:10E6B00084E0082A2CD00B6C042B00D18CE0092AB2 +:10E6C00026D08B6C042B00D18DE00A2A20D00B6D54 +:10E6D000042B00D195E00B2A1AD08B6D042B00D1AE +:10E6E00088E00C2A14D00B6E042B00D1A2E00D2A76 +:10E6F0000ED08B6E042B00D195E00E2A08D00B6F44 +:10E70000042B00D188E0102A02D18B6F042B01D09A +:10E710001123CEE6CB6F002BFAD10F333033B4E6A2 +:10E720001323984660E620220121D21AD140B3E695 +:10E73000009A019BAA61EB610323AB7069E7113377 +:10E74000B7E60E9B0F9C009301942B616C61EBE686 +:10E75000636899452FD90123A373636DDA1B921067 +:10E76000D2B2F3E54B68002B00D078E730338CE66B +:10E77000CB68002B00D078E70123303385E64B6966 +:10E78000002B00D077E7022330337EE6CB69002BE5 +:10E7900000D076E70323303377E64B6A002B00D0B6 +:10E7A00075E70423303370E6CB6A002B00D074E7A2 +:10E7B0000523303369E64B46A360CEE7CB6B002BD5 +:10E7C00000D076E7072330335FE64B6B002B00D099 +:10E7D00069E70623303358E64B6C002B00D06EE718 +:10E7E0000823303351E6CB6C002B00D06DE70923B2 +:10E7F00030334AE6CB6D002B00D072E70B23303369 +:10E8000043E64B6D002B00D065E70A2330333CE62E +:10E81000DA1B9210D2B299E54B6F002B00D072E751 +:10E820000E23303331E6CB6E002B00D065E70D238D +:10E8300030332AE64B6E002B00D058E70C233033E0 +:10E8400023E6636D78E5C046FFFF0000F0B545465E +:10E85000DE4657464E46E0B5C24B828904000D00A5 +:10E8600097B09A4204D1826843689A4200D805D191 +:10E870002300626D14339A4200D1A8E100222900DE +:10E880002000FFF74DFA8046002800D083E02E7864 +:10E890001F2E00D185E0237C022B00D159E12700F7 +:10E8A000636D1437BB4202D09A78052A52D0311FCB +:10E8B000C9B2DA1B9210D2B26A70012900D839E1CC +:10E8C000BB4219D0A8490AE0013A92B21A80002A44 +:10E8D00000D08EE2043B6365BB4200D137E11A8869 +:10E8E0008A42F1D1BB4200D131E11E889E498E425D +:10E8F0005FD0DB1B9B10DAB23F262F6A6B6A3E406B +:10E900006A7199462022002330000021D4F7E4FDEB +:10E910000130012811D8954BB6009B599F46002322 +:10E9200000222A616B612B78032B00D159E11B2B4C +:10E9300000D1E1E0022B00D1F9E00D23984600233D +:10E940002B70AB70404617B03CBC90469946A2462F +:10E95000AB46F0BDEB7829009B46AA68EB68200027 +:10E96000009201930022FFF7DBF9002800D036E186 +:10E970005B462B71072E00D11EE1237C012B08D0B2 +:10E98000022E00D118E1032E00D1A9E1062E00D1FC +:10E9900012E109239846282200212800D1F704FF1C +:10E9A000CDE7282200212800D1F7FEFE1323984648 +:10E9B000C5E7A2896B498A429BD19146A2689246DB +:10E9C0006268924595D800D1FAE1002220000CA996 +:10E9D000FFF762F8002800D001E1282202AB9B1863 +:10E9E0001B781F2B00D08BE1636DBB4200D16FE120 +:10E9F0001A88B24200D06BE1A289043B63654A45A4 +:10EA0000DCD076E72B78062B97D1023B1F407B4268 +:10EA10005F4109372F7095E72B78042B62D10023D3 +:10EA2000534A6E7802320133192B00D1E2E00232F0 +:10EA3000911E09880429F6D1202252429A1800D545 +:10EA400049E10121914001229A4013004A463B408E +:10EA50000A4013435F427B4103225B4213400E3363 +:10EA6000002220002B7002A9FFF704FB804600283B +:10EA700000D064E702AB5B7801369E4232D102AB34 +:10EA80001B78022B2ED1049A059B2000AA60EB6014 +:10EA90000CA90022FFF704FC8046002800D04EE7B6 +:10EAA000292202AB9B181B789E421BD102AB013A74 +:10EAB0009B181C78022C00D11BE12300093B012B81 +:10EAC00010D8280008220EA91030D1F751FE2B785B +:10EAD000083C1C192C702D2202AB9B181B789E42FF +:10EAE00000D02FE71723984629E72B78072B00D073 +:10EAF00023E704332B7025E70222AE68EF681D4B35 +:10EB0000300039005242D4F7D3FC00286CD13000D9 +:10EB10003900D4F733FDA860E960D4F76BFD02003B +:10EB20000B0030003900D5F73BFD286169610C23EB +:10EB30002B7007E7298900291ED02200503293420A +:10EB400055D21A1D62659E71636D1980CAE6002256 +:10EB5000D2E6052E23D02700311F636D1437C9B2CA +:10EB6000A7E6C0460FB00000FFFF00006C4803108E +:10EB7000F4480310FFFFDF43BB4200D1BCE69E49CF +:10EB800009E0013A92B21A80002A00D031E1043B38 +:10EB90006365BB42DBD01A888A42F2D1A2E6202309 +:10EBA00027002B702B8914375B002B81636DDA1BD8 +:10EBB0009210D2B26A7083E6009A019BAA61EB615F +:10EBC000AE702E781F2E00D1EBE6636D6FE6282223 +:10EBD00000212800D1F7E8FD16239846AFE68046CD +:10EBE000D9E6EB68002BA2DA0B239846A7E60223AE +:10EBF0009846D0E6A36E002B79D01A78102A5FD8F9 +:10EC0000002A5DD059680B68042B00D182E0012AEC +:10EC100056D08B68042B00D182E0022A50D00B69B9 +:10EC2000042B00D183E0032A4AD08B69042B00D146 +:10EC300084E0042A44D00B6A042B00D185E0052A25 +:10EC40003ED08B6A042B00D186E0062A38D00B6BAD +:10EC5000042B00D191E0072A32D08B6B042B00D11A +:10EC600084E0082A2CD00B6C042B00D18CE0092AFC +:10EC700026D08B6C042B00D18DE00A2A20D00B6D9E +:10EC8000042B00D195E00B2A1AD08B6D042B00D1F8 +:10EC900088E00C2A14D00B6E042B00D1A2E00D2AC0 +:10ECA0000ED08B6E042B00D195E00E2A08D00B6F8E +:10ECB000042B00D188E0102A02D18B6F042B01D0E5 +:10ECC0001123CDE6CB6F002BFAD10F333033B3E6EF +:10ECD000132398465FE620220121D21AD140B2E6E2 +:10ECE000009A019BAA61EB610323AB7069E71133C2 +:10ECF000B6E60E9B0F9C009301942B616C61EAE6D3 +:10ED000063689A452FD90123A373636DDA1B9210B0 +:10ED1000D2B2F1E54B68002B00D078E730338BE6B8 +:10ED2000CB68002B00D078E70123303384E64B69B1 +:10ED3000002B00D077E7022330337DE6CB69002B30 +:10ED400000D076E70323303376E64B6A002B00D001 +:10ED500075E7042330336FE6CB6A002B00D074E7ED +:10ED60000523303368E65346A360CEE7CB6B002B18 +:10ED700000D076E7072330335EE64B6B002B00D0E4 +:10ED800069E70623303357E64B6C002B00D06EE763 +:10ED90000823303350E6CB6C002B00D06DE70923FD +:10EDA000303349E6CB6D002B00D072E70B233033B4 +:10EDB00042E64B6D002B00D065E70A2330333BE67B +:10EDC000DB1B9A10D2B297E54B6F002B00D072E795 +:10EDD0000E23303330E6CB6E002B00D065E70D23D9 +:10EDE000303329E64B6E002B00D058E70C2330332C +:10EDF00022E6636D76E5C046FFFF000070B5002B8C +:10EE00001DD180246402A24219D200246D4D03E07A +:10EE100001340235192C12D02E88B242F8D12023A9 +:10EE20005B42E21864D4213393400120A0400A6A77 +:10EE300010404A6A13401843431E984170BD846EC7 +:10EE4000002C53D02078102850D800284ED0646869 +:10EE5000256895425CD0012848D0A56895425DD0D0 +:10EE6000022843D0256995425ED003283ED0A5698B +:10EE700095425FD0042839D0256A954260D0052894 +:10EE800034D0A56A954261D006282FD0256B9542D3 +:10EE900062D007282AD0A56B954263D0082825D0D8 +:10EEA000256C954264D0092820D0A56C954265D088 +:10EEB0000A281BD0256D954266D00B2816D0A56D6B +:10EEC000954267D00C2811D0256E954268D00D2848 +:10EED0000CD0A56E954269D00E2807D0256F9542BB +:10EEE0006AD0102802D1A06F904206D00020A5E77A +:10EEF00020220123121BD34097E7E26F0F249A428E +:10EF0000F4D1303420235B42E21800D48BE7EFE7E2 +:10EF100065689D429FD100243034F3E7E5689D4247 +:10EF20009ED101243034EDE765699D429DD10224D4 +:10EF30003034E7E7E5699D429CD103243034E1E7B2 +:10EF4000656A9D429BD104243034DBE7E56A9D422B +:10EF50009AD105243034D5E7656B9D4299D10624BA +:10EF60003034CFE7E56B9D4298D107243034C9E7B0 +:10EF7000656C9D4297D108243034C3E7E56C9D420F +:10EF800096D109243034BDE7656D9D4295D10A24A0 +:10EF90003034B7E7E56D9D4294D10B243034B1E7AE +:10EFA000656E9D4293D10C243034ABE7E56E9D42F3 +:10EFB00092D10D243034A5E7656F9D4291D10E2486 +:10EFC00030349FE7F4480310030030B5426D14332A +:10EFD0000A2483B09A4204D182890D4B00249A42BC +:10EFE0000AD0C56D002D04D0816D00230022684633 +:10EFF000A847200003B030BD836842689342F0D830 +:10F000009B1A5C425C410D2364429C430E34E8E74A +:10F010000FB00000F0B583B004001D0000919342D2 +:10F0200003D8099ED21AB24205D20023236063603E +:10F03000200003B0F0BD009F32000899F818AD1908 +:10F04000D1F796FB27606560F2E7C04600B585B052 +:10F05000009202900A00994207D304D80099D1F790 +:10F0600079FB05B000BD0120FBE701204042F8E735 +:10F0700010B582B000900191081E0ED0009C002CAB +:10F080000DD06018A0420CD9230002E00133984251 +:10F0900007D019789142F9D0181B02B010BD00209A +:10F0A000FBE701204042F8E782B06B465A60054A10 +:10F0B0000091828100228260827306CB06C002B07A +:10F0C0007047C0460F0B000070B582B000910192EE +:10F0D000827B04001D00002A05D1154B82899A42CB +:10F0E00003D00123A37302B070BD836842689342CA +:10F0F000F7D8019ED21AB242F3D3AB42F1D30168E2 +:10F100005A1B4819AB4208D000290DD083190100C1 +:10F110001800D1F736FB21684819002903D03200C6 +:10F120000099D1F72EFBA368F318A360DBE7C04674 +:10F130000F0B00008B7B10B5002B0DD1084A8C897A +:10F14000944204D18B680A684360026010BD0122BA +:10F1500003608A734360F9E7002303604360F5E7C7 +:10F160000F0B000010B5827B0300002A16D18489A2 +:10F170000B48844207D091420CD89A6818685118FD +:10F180008018996010BD98685C68A042F3D8221A74 +:10F190009142F2D9012200209A73F3E70020F1E7AF +:10F1A0000FB00000F0B54604F40E00250F2676429D +:10F1B000F71736196F4181058B0DC10BC6468C467A +:10F1C000310098461A0000B500230F3120D0102ED0 +:10F1D0000FD0FC239B059846002624059202444448 +:10F1E00063462243DB0713433000190004BC9046FA +:10F1F000F0BD002FEDD14146002925D0154D154019 +:10F200002E000022830523D58022134C1203E7E74A +:10F21000791CDCD1002A13D0802700250120404230 +:10F22000C1170E4CFF00160092185B4124184D4187 +:10F230001742F8D00A4BF2021A4000262405CFE705 +:10F24000002400260022CBE700260022024CC7E75C +:10F25000014CC5E7FFFDFFFF0000F07FF103000058 +:10F2600000FC0F0058220120014B40421A607047F9 +:10F270001CAE020858220120014B40421A60704720 +:10F280001CAE02085822024B00201A607047C0468C +:10F290001CAE020858220120014B40421A60704700 +:10F2A0001CAE020858220120014B40421A607047F0 +:10F2B0001CAE0208044A03001068002802D0C318DC +:10F2C000136070470148FAE708AE02080000000822 +:10F2D000FEE7C046F8B5C046F8BC08BC9E4670477D +:10F2E000F8B5C046F8BC08BC9E4670470000000058 +:10F2F00000000000000000000000000000080108FD +:10F3000000000000000000000000000000080108EC +:10F3100000100108C05C0010406F0010C05C0010BD +:10F32000406F0010001001080010010800100108D3 +:10F33000202201088022010880280108406F001067 +:10F34000C0830010406F0010C083001080280108A7 +:10F35000802801088028010800BB010800BB0108C3 +:10F3600000C00108C0830010C0FF0110C08300105E +:10F37000C0FF011000C0010840C0010840C00108E2 +:10F38000403002088030020880500208C0FF01109F +:10F3900060010210C0FF01106001021080500208DD +:10F3A0008050020880500208A05002080051020854 +:10F3B0000055020860010210801202106001021064 +:10F3C000801202100055020800550208005502087C +:10F3D000605702088057020800620208801202107B +:10F3E00080180210801202108018021000620208B9 +:10F3F00000620208006202082062020880620208BD +:10F4000000660208402602108029021040260210E1 +:10F410008029021080100008801000088010000869 +:10F42000A0120008001300088015000880180210C0 +:10F43000E023021080180210E02302100066020888 +:10F4400000670208006702080069020800690208F4 +:10F4500000760208E0230210E0250210E0230210EB +:10F46000E025021000760208007602080076020805 +:10F470002076020880760208A0780208802902100F +:10F48000202B021080290210202B0210801500086A +:10F490008015000880150008A01500080016000857 +:10F4A00000190008202B0210002D0210202B021042 +:10F4B000002D02100019000820190008201900086A +:10F4C0004019000880190008801D0008E02502107E +:10F4D00040260210E025021040260210A078020803 +:10F4E000A0780208A0780208C07802080079020813 +:10F4F000007E0208002D0210A02D0210002D021027 +:10F50000A02D0210801D0008801D0008801D00082D +:10F51000A01D0008001E000800210008A02D0210F8 +:10F52000402E0210A02D0210402E021000210008D3 +:10F530000021000800210008202100088021000887 +:10F54000802200080001000000000000060000000A +:10F55000FF000000C94C0210000000000000000085 +:10F560000001000000010000070000007F00000013 +:10F57000195D001005000000787E020800010000FF +:10F5800001010000070000007F000000416F001033 +:10F590000000000000000000000100000301000066 +:10F5A000070000007F000000D5830010000000006D +:10F5B000000000000001000004010000070000003E +:10F5C0007F000000C1FF01100000000000000000EB +:10F5D0000001000005010000070000007F0000009E +:10F5E000CD010210010000000C7E020800010000A5 +:10F5F00006010000070000007F00000081120210D9 +:10F6000003000000007E0208000100000701000066 +:10F61000050000007F0000008127021000000000AC +:10F6200000000000000100000801000007000000C9 +:10F630007F0000008118021011000000287E0208DF +:10F6400000010000090100000700000000000000A8 +:10F65000E123021000000000000000000001000093 +:10F660000A010000050000007F000000812902104F +:10F6700004000000107E0208000100000B010000E1 +:10F68000050000007F000000212B02100000000098 +:10F6900000000000000100000C0100000700000055 +:10F6A0007F000000E1250210030000006C7E0208CC +:10F6B000000100000D010000050000007F000000B7 +:10F6C000012D021002000000207E0208000100004F +:10F6D0000E010000050000007F000000A12D0210B7 +:10F6E000000000000000000054464D5F5353545F7B +:10F6F0005345540054464D5F5353545F474554009F +:10F7000054464D5F5353545F4745545F494E464FEF +:10F710000000000054464D5F5353545F52454D4F17 +:10F720005645000054464D5F5353545F4745545F60 +:10F73000535550504F52540054464D5F4954535FF7 +:10F740005345540054464D5F4954535F4745540058 +:10F7500054464D5F4954535F4745545F494E464FA9 +:10F760000000000054464D5F4954535F52454D4FD1 +:10F770005645000054464D5F43525950544F0000C7 +:10F7800054464D5F53505F504C4154464F524D5F6D +:10F7900053595354454D5F524553455400000000A2 +:10F7A00054464D5F53505F504C4154464F524D5F4D +:10F7B000494F43544C00000054464D5F415454455A +:10F7C00053545F4745545F544F4B454E0000000073 +:10F7D00054464D5F4154544553545F4745545F541C +:10F7E0004F4B454E5F53495A4500000054464D5F0C +:10F7F0004154544553545F4745545F5055424C491A +:10F80000435F4B455900000053504D5F434F5245F5 +:10F810005F544553545F494E49545F5355434345E4 +:10F820005353000053504D5F434F52455F5445536F +:10F83000545F4449524543545F52454355525349DE +:10F840004F4E000053504D5F434F52455F54455358 +:10F85000545F4D50555F41434345535300000000F2 +:10F8600053504D5F434F52455F544553545F4D4590 +:10F870004D4F52595F5045524D495353494F4E5386 +:10F880000000000053504D5F434F52455F544553B5 +:10F89000545F53535F544F5F5353000053504D5FB9 +:10F8A000434F52455F544553545F53535F544F5F2A +:10F8B00053535F42554646455200000053504D5F3A +:10F8C000434F52455F544553545F4F55545645433B +:10F8D0005F5752495445000053504D5F434F5245C6 +:10F8E0005F544553545F5045524950484552414C2E +:10F8F0005F4143434553530053504D5F434F52457F +:10F900005F544553545F4745545F43414C4C455207 +:10F910005F434C49454E545F4944000053504D5F8E +:10F92000434F52455F544553545F53504D5F5245CA +:10F93000515545535400000053504D5F434F5245BD +:10F940005F544553545F424C4F434B0053504D5FFF +:10F95000434F52455F544553545F4E535F54485292 +:10F960004541440053504D5F434F52455F5445530A +:10F97000545F325F534C4156455F5345525649439D +:10F980004500000053504D5F434F52455F5445536F +:10F99000545F325F434845434B5F43414C4C4552B3 +:10F9A0005F434C49454E545F4944000053504D5FFE +:10F9B000434F52455F544553545F325F4745545F50 +:10F9C00045564552595F5345434F4E445F42595443 +:10F9D0004500000053504D5F434F52455F5445531F +:10F9E000545F325F494E56455254000053504D5FAC +:10F9F000434F52455F544553545F325F5052455018 +:10FA00004152455F544553545F5343454E4152491B +:10FA10004F00000053504D5F434F52455F544553D4 +:10FA2000545F325F455845435554455F54455354E0 +:10FA30005F5343454E4152494F00000054464D5FCD +:10FA40005345435552455F434C49454E545F5346D9 +:10FA50004E5F52554E5F5445535453004950435FD7 +:10FA6000534552564943455F544553545F424153B1 +:10FA7000494300004950435F534552564943455F4F +:10FA8000544553545F5053415F4143434553535F83 +:10FA90004150505F4D454D004950435F53455256CC +:10FAA0004943455F544553545F5053415F4143437D +:10FAB0004553535F4150505F524541445F4F4E4C58 +:10FAC000595F4D454D0000004950435F5345525624 +:10FAD0004943455F544553545F4150505F41434350 +:10FAE0004553535F5053415F4D454D004950435F6F +:10FAF000534552564943455F544553545F434C491F +:10FB0000454E545F50524F4752414D4D45525F450F +:10FB100052524F52000000004950435F434C494548 +:10FB20004E545F544553545F4241534943000000D3 +:10FB30004950435F434C49454E545F544553545FCD +:10FB40005053415F4143434553535F4150505F4DD4 +:10FB5000454D00004950435F434C49454E545F5466 +:10FB60004553545F5053415F4143434553535F41B5 +:10FB700050505F524541445F4F4E4C595F4D454D8B +:10FB8000000000004950435F434C49454E545F54C8 +:10FB90004553545F4150505F4143434553535F5079 +:10FBA00053415F4D454D00004950435F434C49452B +:10FBB0004E545F544553545F4D454D5F4348454354 +:10FBC0004B00000053504D5F434F52455F49525127 +:10FBD0005F544553545F315F505245504152455F29 +:10FBE000544553545F5343454E4152494F00000022 +:10FBF00053504D5F434F52455F4952515F544553F7 +:10FC0000545F315F455845435554455F54455354FF +:10FC10005F5343454E4152494F00000054464D5FEB +:10FC20005353545F544553545F50524550415245CD +:10FC30000000000054464D5F5345435552455F4315 +:10FC40004C49454E545F32004D554C54495F434F2B +:10FC500052455F4D554C54495F434C49454E545FA6 +:10FC600043414C4C5F544553545F30004D554C5408 +:10FC7000495F434F52455F4D554C54495F434C4992 +:10FC8000454E545F43414C4C5F544553545F3100E3 +:10FC9000E8F6021000010000100000006000000003 +:10FCA000010000000100000001000000F4F6021055 +:10FCB00000010000200000006100000001000000C1 +:10FCC000010000000100000000F702100001000028 +:10FCD0004000000062000000010000000100000080 +:10FCE0000100000014F70210000100008000000075 +:10FCF000630000000100000001000000010000009E +:10FD000024F7021000010000000100006400000060 +:10FD100001000000010000000100000038F702109F +:10FD20000101000010000000700000000100000050 +:10FD3000010000000100000044F702100101000072 +:10FD40002000000071000000010000000100000020 +:10FD50000100000050F70210010100004000000007 +:10FD6000720000000100000001000000010000001E +:10FD700064F7021001010000800000007300000021 +:10FD800001000000010000000100000074F70210F3 +:10FD900003010000100000008000000001000000CE +:10FDA000010000000100000080F7021004010000C3 +:10FDB00010000000400000000100000001000000F1 +:10FDC00001000000A0F70210040100002000000064 +:10FDD00041000000010000000100000001000000DF +:10FDE000B8F702100501000010000000200000001C +:10FDF000010000000100000001000000D0F7021027 +:10FE000005010000200000002100000001000000AA +:10FE10000100000001000000ECF7021005010000E5 +:10FE2000400000002200000001000000010000006E +:10FE30000100000008F80210060100001000000098 +:10FE400020F000000100000001000000010000009F +:10FE500024F80210060100002000000021F000003C +:10FE600001000000010000000100000044F8021041 +:10FE7000060100004000000022F000000100000028 +:10FE8000010000000100000060F8021006010000FF +:10FE90008000000023F000000100000001000000CD +:10FEA0000100000084F802100601000000010000BB +:10FEB00024F000000100000001000000010000002B +:10FEC0009CF80210060100000002000025F000006E +:10FED000010000000100000001000000BCF8021059 +:10FEE000060100000004000026F0000001000000F0 +:10FEF0000100000001000000D8F802100601000017 +:10FF00000008000027F000000100000001000000D0 +:10FF100001000000F8F802100601000000100000C7 +:10FF200028F00000010000000100000001000000B6 +:10FF30001CF90210060100000020000029F000005A +:10FF400001000000010000000100000038F902106B +:10FF500006010000004000002AF00000010000003F +:10FF600001000000010000004CF902100601000031 +:10FF7000008000002BF000000100000001000000E4 +:10FF80000100000064F902100701000010000000E9 +:10FF900040F000000100000001000000010000002E +:10FFA00084F90210070100002000000041F0000069 +:10FFB000010000000100000001000000ACF9021087 +:10FFC000070100004000000042F0000001000000B6 +:10FFD0000100000001000000D4F902100701000038 +:10FFE0008000000043F0000001000000010000005C +:10FFF00001000000ECF90210070100000001000000 +:020000041003E7 +:1000000044F00000010000000100000001000000B9 +:1000100014FA0210070100000002000045F0000081 +:100020000100000001000000010000003CFA021085 +:10003000080100001000000000F0000001000000B6 +:1000400001000000010000005CFA0210090100003C +:100050001000000080F0000001000000010000001E +:100060000100000074FA02100901000020000000E5 +:1000700081F000000100000001000000010000000C +:1000800098FA0210090100004000000082F0000010 +:10009000010000000100000001000000C8FA021089 +:1000A000090100008000000083F000000100000052 +:1000B0000100000001000000ECFA0210090100003C +:1000C0000001000084F000000100000001000000B9 +:1000D0000100000018FB02100A01000010000000DF +:1000E00060F00000010000000100000001000000BD +:1000F00030FB02100A0100002000000061F0000047 +:1001000001000000010000000100000054FB02108B +:100110000A0100004000000062F000000100000041 +:10012000010000000100000084FB02100A01000031 +:100130008000000063F000000100000001000000EA +:1001400001000000A8FB02100A01000000010000ED +:1001500064F0000001000000010000000100000048 +:10016000C4FB02100B01000010000000A0F0000012 +:10017000010000000100000001000000F0FB02107F +:100180000B01000020000000A1F0000001000000B1 +:1001900001000000010000001CFC02100C01000026 +:1001A00010000000C0F0000000000000010000008E +:1001B0000100000034FC02100D01000010000000DE +:1001C000E0F000000000000001000000010000005D +:1001D00048FC02100E0100001000000000F10000B9 +:1001E0000100000001000000010000006CFC021092 +:1001F0000E0100002000000001F1000001000000DD +:100200000100000001000000643B021010390210E0 +:1002100010390210103902106E3B0210BA39021068 +:100220009639021046390210103902102439021092 +:10023000DA3B0210D03B0210C43B0210AA3B021072 +:10024000943A0210703A0210F63902101C3B021068 +:10025000E43B02108C3C0210623C02102A3902106E +:100260008C3A02105E3B02100B010000000000807F +:100270000300000040000000010000001B5B313B58 +:1002800033346D5B536563205468726561645D202F +:1002900053656375726520696D61676520696E6974 +:1002A0007469616C697A696E67211B5B306D0D0A38 +:1002B0000000000054462D4D2069736F6C61746915 +:1002C0006F6E206C6576656C2069733A2025640D2D +:1002D0000A000000C04B0210564C0210464C02109F +:1002E000324C02100E4C0210784B0210794C021066 +:1002F0004D4A0210314A0210456E61626C696E67A8 +:10030000206E6F6E2D73656375726520636F726505 +:100310002E2E2E000000204000002440000000404F +:100320000000000000002340000030400000314089 +:1003300000009F40000022400000104020202020AC +:10034000201010101D1D800017007500FF0306020D +:1003500006360410200000007FC0000000040000EA +:10036000000000000019324B647D00804000080B43 +:10037000100000000000FF012002001F00800004A8 +:10038000FF081018001000140018001C4044484CCE +:1003900050000000081000000800000004000000E9 +:1003A00004100000001200000421000000210000E1 +:1003B0000016000040114002C41300138013A01364 +:1003C000200000001C0000000000000008000000E9 +:1003D0000800000000020000000000000000000013 +:1003E000000000000000000000000000000000000D +:1003F000000000000B0000003F00000000000000B3 +:100400003F00000000000000010000000B000000A1 +:100410001D000000000000000000000000000000BF +:1004200000000000010000000000000000000000CB +:1004300000000000000000000000000001000000BB +:100440000A0000001D000000000000000000000085 +:10045000000000000000000001000000000000009B +:10046000000000000000000000000000000000008C +:1004700001000000060000001D0000000000000058 +:10048000000000000000000000000000010000006B +:10049000000000000000000000000000000000005C +:1004A000000000000100000000000000000000004B +:1004B000000000000000000000000000000000003C +:1004C000010000000000000000000000000000002B +:1004D000000000000000000001000000000000001B +:1004E000000000000000000000000000000000000C +:1004F00000000000010000000000000000000000FB +:10050000000000000000000000000000F4010000F6 +:10051000140004010A00090508000300630100003B +:1005200024010200000000001E0105000000000080 +:100530005741524E494E473A204661696C20746FCC +:1005400020696E697469616C697A652074696D658A +:100550007220696E746572727570742028495251E8 +:100560002054455354206D69676874206661696C36 +:10057000292100000A534D505520636F6E6669674C +:100580003A0000006D656D6F72795F726567696F23 +:100590006E732E6E6F6E5F7365637572655F636FEA +:1005A00064655F7374617274203D202523780A00AE +:1005B0006D656D6F72795F726567696F6E732E6EB0 +:1005C0006F6E5F7365637572655F70617274697475 +:1005D000696F6E5F62617365203D202523780A0094 +:1005E0006D656D6F72795F726567696F6E732E6E80 +:1005F0006F6E5F7365637572655F70617274697445 +:10060000696F6E5F6C696D6974203D202523780ADF +:10061000000000000004051000000510FFFF161088 +:10062000A0A1A2A3A4A5A6A7A8A9AAABACADAEAF52 +:10063000B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF42 +:1006400000000000AAAAAAAAAAAAAAAABBBBBBBB6E +:10065000BBBBBBBBCCCCCCCCCCCCCCCCDDDDDDDDDA +:10066000DDDDDDDD0000000030363034353635327A +:100670003732383239313030313000000300000079 +:100680000100000001000000000000000503600000 +:100690000400000001000000000000000100000054 +:1006A0000604600008000000C8A30208B56F02102D +:1006B000496E20257328290A00000000456E6162FA +:1006C0006C656420434D345F4150204441502063A9 +:1006D0006F6E74726F6C00005374617274696E6730 +:1006E00020436F727465782D4D342061742030780A +:1006F00025780D0A000000000A0D436F7265732013 +:1007000073796E6320737563636573732E0D0000D8 +:100710001620D9000311070053504500110900307D +:100720002E302E30021108000000000008112400B5 +:10073000970A176C5E664556A62B6EDB744DFFA4B8 +:10074000DBD734FD829A44673009FD75F9A915AAF3 +:1007500009110A0053484132353601112400BFE621 +:10076000D86F8826F4FF97FB96C4E6FBC4993E46F3 +:1007700019FC565DA26ADF34C329489ADC3843115C +:1007800008004E53504540110900302E302E3042A3 +:1007900011080000000000481124007E9A22D95F51 +:1007A0005F2A67E9EAE1AA3172D71485BC263B7F4C +:1007B0007AF27E2CD247609C9FBB3749110A0053C6 +:1007C000484132353641112400B360CAF5C98C6BFB +:1007D000942A4882FA9D4823EFB166A9EF6A6E4ACF +:1007E000A37C1919ED1FCCC04900000000000000D7 +:1007F00074666D5F73706D5F68616C5F636F6E666A +:1008000069677572655F64656661756C745F69734D +:100810006F6C6174696F6E005053415F494F545F54 +:1008200050524F46494C455F310000007777772E94 +:10083000747275737465646669726D776172652E22 +:100840006F72670017000000A9B454B26D6F90A4D6 +:10085000EA31193564CBA91FEC6F9A002A7DC0508C +:100860004B92A1937134585F2000000000010203F5 +:100870000405060708090A0B0C0D0E0F556E72656C +:10088000636F676E6973656420534D5055000000B7 +:10089000534D505520300000534D5055203400002A +:1008A000534D505520310000534D50552038000015 +:1008B000534D505520370000534D50552033000004 +:1008C000534D505520360000534D505520313100C6 +:1008D000534D505520313200534D5055203130008A +:1008E000534D505520350000534D505520313500A3 +:1008F000534D505520390000534D50552031340090 +:10090000534D505520320000534D50552031330087 +:10091000616C6C00736F6D65000000002573202D05 +:100920002061646472657373203D2025702C2073F0 +:10093000697A65203D202523782062797465732CBF +:1009400020257320737562726567696F6E73206509 +:100950006E61626C65640A0009737562726567692D +:100960006F6E2073697A65203D2025237820627997 +:100970007465730A0000000064697361626C6564E9 +:100980000000000009737562726567696F6E20254B +:10099000642025730A000000656E61626C65640066 +:1009A000002023400000001012E0070700000700AD +:1009B000000000000000010300000100802223402D +:1009C00000F002080B000005000007000000000016 +:1009D0000000010300000100402023400000171028 +:1009E0000F000303000007000000000000000103E7 +:1009F00000000100802023400000181012000303B3 +:100A000000000700000000000000010300000100DA +:100A100080212340000000080F00030300000700AE +:100A2000000000000000010300000100C02123407D +:100A30000000000811C300030000070000000000D0 +:100A40000000010300000100556E65787065637455 +:100A50006564207065726970686572616C20747974 +:100A600070652025640A000001000000000B0140B1 +:100A70007F000101000000000000000007000003EB +:100A80000000000000000000000000000000000066 +:100A900001000000C00B01407F00010100000000C8 +:100AA000000000000700000300000000000000003C +:100AB000000000000000000001000000C00A01402A +:100AC0007F0001010000000000000000070000039B +:100AD0000000000000000000000000000000000016 +:100AE00001000000400B01407F00010100000000F8 +:100AF00000000000070000030000000000000000EC +:100B0000000000000000000001000000800B014018 +:100B10007F0001010000000000000000070000034A +:100B200000000000000000000000000000000000C5 +:100B300001000000800A01407F0001010000000068 +:100B4000000000000700000300000000000000009B +:100B500000000000000000002F686F6D652F6A61C3 +:100B600065616D6530312F436F64652F6D6265641B +:100B70002D6F732D74662D6D2D726567726573739D +:100B8000696F6E2D74657374732F6D6265642D6F5C +:100B9000732F66656174757265732F4645415455B0 +:100BA00052455F5053412F5441524745545F54467C +:100BB0004D2F5441524745545F49474E4F52452FA0 +:100BC000747275737465642D6669726D7761726590 +:100BD0002D6D2F746573742F7375697465732F731E +:100BE00073742F7365637572652F7073615F7073B3 +:100BF0005F735F696E746572666163655F74657368 +:100C00007473756974652E63000000005365742069 +:100C100073686F756C64206E6F74206661696C20F8 +:100C200077697468206E6F20666C616773000000DE +:100C30005448455F464956455F424F58494E475FC5 +:100C400057495A415244535F4A554D505F51554997 +:100C5000434B4C59000000005365742073686F7556 +:100C60006C64206E6F74206661696C2077697468AB +:100C70002076616C696420666C6167732028616E00 +:100C800064206578697374696E672055494429004A +:100C90005365742073686F756C64206E6F74207375 +:100CA000756363656564207769746820696E766131 +:100CB0006C696420666C616773000000544845519C +:100CC0005549434B42524F574E464F584A554D5047 +:100CD000534F564552414C415A59444F470000002A +:100CE00047657420696E666F2073686F756C642049 +:100CF0006E6F7420737563636565642077697468CB +:100D000020756E73657420554944000053697A65F7 +:100D10002073686F756C64206E6F742068617665EF +:100D2000206368616E67656400000000466C61675F +:100D3000732073686F756C64206E6F7420686176C1 +:100D400065206368616E6765640000004765742014 +:100D5000696E666F2073686F756C64206E6F7420A7 +:100D600073756363656564207769746820696E765E +:100D7000616C696420554944000000004765742097 +:100D8000696E666F2073686F756C64206E6F742077 +:100D90006661696C20666F72207772697465206F76 +:100DA0006E6365205549440053697A6520696E6316 +:100DB0006F727265637420666F72207772697465F2 +:100DC000206F6E636520554944000000466C6167E2 +:100DD0007320696E636F727265637420666F722030 +:100DE0007772697465206F6E636520554944000011 +:100DF0005365742073686F756C64206E6F74206621 +:100E000061696C0052656D6F76652073686F756CF3 +:100E100064206E6F74206661696C20776974682045 +:100E200076616C6964205549440000004765742070 +:100E3000696E666F2073686F756C64206E6F7420C6 +:100E40007375636365656420776974682072656D86 +:100E50006F766564205549440000000047657420A2 +:100E600073686F756C64206E6F742073756363654F +:100E7000656420776974682072656D6F766564209B +:100E80005549440052656D6F76652073686F756CC7 +:100E900064206E6F74207375636365656420776981 +:100EA00074682072656D6F76656420554944000052 +:100EB0005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F42 +:100EC0005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F32 +:100ED0005F5F5F5F5F5F5F5F5F000000476574207B +:100EE000696E666F2073686F756C64206E6F742016 +:100EF0006661696C20776974682076616C6964202A +:100F00005549440053697A6520696E636F72726552 +:100F1000637420666F722076616C69642055494461 +:100F200000000000466C61677320696E636F727227 +:100F300065637420666F722076616C696420554920 +:100F4000440000004765742073686F756C642073FB +:100F50007563636565642077697468204E554C4CF1 +:100F6000206461746120706F696E74657220616EB7 +:100F700064207A65726F206C656E6774680000008B +:100F80005365742073686F756C64206E6F7420668F +:100F900061696C20776974682076616C696420559A +:100FA000494400005365742073686F756C64206E4B +:100FB0006F74206661696C20746865207365636F67 +:100FC0006E642074696D6520776974682076616C41 +:100FD00069642055494400005365742073686F7537 +:100FE0006C64206E6F74207375636365656420772D +:100FF00069746820616E20696E76616C6964205541 +:1010000049440000476574207375636365656465D2 +:10101000642077697468206E6F6E2D6578697374CB +:10102000616E7420554944005265616420646174A6 +:1010300061206E6F7420657175616C20746F206F14 +:10104000726967696E616C207265616420646174A5 +:1010500061000000476574207375636365656465AE +:1010600064207769746820696E76616C69642055C4 +:10107000494400005365742073686F756C64206E7A +:101080006F74207265777269746520612077726968 +:101090007465206F6E636520554944004765742070 +:1010A00073686F756C64206E6F74206661696C0084 +:1010B000232323235448455F464956455F424F58F2 +:1010C000494E475F57495A415244535F4A554D5024 +:1010D0005F515549434B4C59232323230000000003 +:1010E0005772697465206F6E636520646174612056 +:1010F00073686F756C64206E6F742068617665200C +:101100006368616E676564002323232323232323FD +:10111000232323232323232323232323232323239F +:10112000232323232323232323232323232323238F +:1011300023232323000000004765742073686F7524 +:101140006C64206E6F74206661696C2077697468C6 +:101150002076616C696420554944000052656164E1 +:1011600020646174612073686F756C64206265200F +:10117000657175616C20746F206F726967696E614B +:101180006C207772697465206461746100000000EE +:101190004669727374207365742073686F756C642C +:1011A000206E6F74206661696C0000005365636F88 +:1011B0006E64207365742073686F756C64206E6F45 +:1011C00074206661696C00005468697264207365FC +:1011D000742073686F756C64206E6F74206661692B +:1011E0006C0000005265616420627566666572205D +:1011F00068617320696E636F7272656374206461E5 +:101200007461000052656D6F76652073686F756C50 +:1012100064206E6F74206661696C0000544852450A +:10122000450000004765742073686F756C64206E1C +:101230006F74206661696C20666F722070617274D1 +:1012400069616C2072656164000000005F5F5F5F30 +:10125000544845515549434B42524F574E464F58BB +:101260004A554D50534F564552414C415A59444F9F +:10127000475F5F5F5F0000005365742073686F75A0 +:101280006C64206E6F74206661696C20666F7220DA +:1012900055494420310000005365742073686F7510 +:1012A0006C64206E6F74206661696C20666F7220BA +:1012B000554944203200000052656D6F76652073F9 +:1012C000686F756C64206E6F74206661696C20664F +:1012D0006F7220554944203100000000476574209A +:1012E00073686F756C64206E6F74206661696C2022 +:1012F000666F7220554944203200000052656D6FC0 +:1013000076652073686F756C64206E6F74206661FB +:10131000696C20666F72205549442032000000003D +:101320005549442031204441544100004765742010 +:1013300073686F756C64206E6F742073756363657A +:1013400065642077697468206F66667365742074BD +:101350006F6F206C61726765000000005265616408 +:1013600020646174612073686F756C64206265200D +:10137000657175616C20746F206F726967696E6149 +:101380006C2072656164206461746100476574203B +:1013900073686F756C64207375636365656420772B +:1013A0006974682064617461206C656E677468207C +:1013B0006C6172676572207468616E2055494427BC +:1013C00073206C656E67746800000000526561648C +:1013D0002064617461206C656E6774682073686F47 +:1013E000756C6420626520657175616C20746F2076 +:1013F0005549442773206C656E67746800000000CF +:101400004765742073686F756C64207375636365DA +:1014100065642077697468206F6666736574202B35 +:101420002064617461206C656E67746820746F6FEE +:10143000206C617267652C2062757420696E646926 +:1014400076696475616C6C792076616C6964000002 +:10145000526561642064617461206C656E677468B4 +:101460002073686F756C6420626520657175616CAE +:1014700020746F2074686520554944277320726575 +:101480006D61696E696E672073697A652073746136 +:101490007274696E672066726F6D206F6666736521 +:1014A000740000005F5F5F5F4845515549434B4200 +:1014B000524F574E464F584A554D50534F5645522E +:1014C000414C415A59444F475F5F5F5F5F000000E6 +:1014D0004765742073686F756C64206E6F74206646 +:1014E00061696C2077697468207A65726F20646125 +:1014F0007461206C656E00005265616420646174E3 +:10150000612073686F756C64206265206571756118 +:101510006C20746F20726573756C742064617461E3 +:101520000000000052656164206461746120636F93 +:101530006E7461696E7320696C6C6567616C207094 +:1015400072652D6461746100526561642064617428 +:101550006120696E636F7272656374005F5F5F5FC5 +:101560000000000052656164206461746120636F53 +:101570006E7461696E7320696C6C6567616C207054 +:101580006F73742D646174610000000053657420F2 +:1015900073686F756C642073756363656564207729 +:1015A000697468204E554C4C206461746120706FE2 +:1015B000696E74657220616E64207A65726F206C4A +:1015C000656E67746800000052656D6F7665207304 +:1015D000686F756C64206E6F7420737563636565E6 +:1015E00064207769746820696E76616C696420553F +:1015F0004944000052656D6F76652073686F756CA5 +:1016000064206E6F74207375636365656420776909 +:101610007468207772697465206F6E636520554920 +:1016200044000000537570706F727420666C6167BF +:10163000732073686F756C64206265203000000051 +:101640005053412070726F746563746564207374C5 +:101650006F72616765205320696E7465726661639D +:1016600065207465737473202854464D5F5353543A +:101670005F544553545F32585858290054464D5FC3 +:101680005353545F544553545F323030310000009F +:1016900053657420696E746572666163650000004D +:1016A00054464D5F5353545F544553545F3230306A +:1016B0003200000053657420696E74657266616360 +:1016C0006520776974682063726561746520666C53 +:1016D0006167730054464D5F5353545F54455354F0 +:1016E0005F3230303300000053657420696E7465DA +:1016F00072666163652077697468204E554C4C2092 +:101700006461746120706F696E746572000000001E +:1017100054464D5F5353545F544553545F323030F9 +:101720003400000053657420696E746572666163ED +:1017300065207769746820696E76616C69642064DD +:10174000617461206C656E677468000054464D5F7B +:101750005353545F544553545F32303035000000CA +:1017600053657420696E746572666163652077697C +:101770007468207772697465206F6E6365205549BF +:101780004400000054464D5F5353545F5445535436 +:101790005F3230303600000047657420696E746532 +:1017A000726661636520776974682076616C69642C +:1017B000206461746100000054464D5F5353545FD0 +:1017C000544553545F323030370000004765742071 +:1017D000696E746572666163652077697468207AE2 +:1017E00065726F2064617461206C656E6774680057 +:1017F00054464D5F5353545F544553545F32303019 +:101800003800000047657420696E74657266616314 +:1018100065207769746820696E76616C696420550B +:101820004944730054464D5F5353545F54455354D9 +:101830005F3230303900000047657420696E74658E +:101840007266616365207769746820696E76616C81 +:1018500069642064617461206C656E6774687320CC +:10186000616E64206F6666736574730054464D5FE5 +:101870005353545F544553545F32303130000000AD +:1018800047657420696E7465726661636520776967 +:101890007468204E554C4C206461746120706F69EF +:1018A0006E7465720000000054464D5F5353545FE0 +:1018B000544553545F323031310000004765742085 +:1018C000696E666F20696E74657266616365207704 +:1018D000697468207772697465206F6E636520553E +:1018E0004944000054464D5F5353545F544553548C +:1018F0005F3230313200000047657420696E666FD8 +:1019000020696E746572666163652077697468200A +:1019100076616C69642055494400000054464D5F6F +:101920005353545F544553545F32303133000000F9 +:1019300047657420696E666F20696E7465726661B2 +:101940006365207769746820696E76616C696420CC +:10195000554944730000000054464D5F5353545F93 +:10196000544553545F3230313400000047657420D1 +:10197000696E666F20696E74657266616365207753 +:10198000697468204E554C4C20696E666F20706FEC +:10199000696E74657200000054464D5F5353545F86 +:1019A000544553545F3230313500000052656D6F3D +:1019B000766520696E746572666163652077697407 +:1019C000682076616C6964205549440054464D5F37 +:1019D0005353545F544553545F3230313600000046 +:1019E00052656D6F766520696E74657266616365B8 +:1019F0002077697468207772697465206F6E6365FB +:101A0000205549440000000054464D5F5353545F35 +:101A1000544553545F3230313700000052656D6FCA +:101A2000766520696E746572666163652077697496 +:101A30006820696E76616C69642055494400000035 +:101A400054464D5F5353545F544553545F323031C5 +:101A500038000000426C6F636B20636F6D706163D0 +:101A600074696F6E2061667465722072656D6F7641 +:101A70006500000054464D5F5353545F5445535422 +:101A80005F323031390000004D756C7469706C65DF +:101A9000207061727469616C206765747300000066 +:101AA00054464D5F5353545F544553545F32303264 +:101AB000300000004D756C7469706C65207365743E +:101AC0007320746F2073616D6520554944206672E0 +:101AD0006F6D2073616D65207468726561640000CC +:101AE00054464D5F5353545F544553545F32303224 +:101AF0003100000047657420737570706F72742038 +:101B0000696E7465726661636500000054464D5FDE +:101B10005353545F544553545F3230323200000007 +:101B20005365742C2067657420616E642072656D46 +:101B30006F766520696E746572666163652077698A +:101B4000746820646966666572656E74206173737B +:101B500065742073697A657300000000000000005E +:101B60000200000000000000030000000000000070 +:101B7000040000000000000000020000000400005B +:101B800000080000BF00000000000000000000008E +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:102380000000000020203E20497465726174696F6E +:102390006E202564206F662025640D002F686F6D08 +:1023A000652F6A6165616D6530312F436F64652FFC +:1023B0006D6265642D6F732D74662D6D2D7265676A +:1023C00072657373696F6E2D74657374732F6D62AC +:1023D00065642D6F732F66656174757265732F4622 +:1023E0004541545552455F5053412F544152474542 +:1023F000545F54464D2F5441524745545F49474E10 +:102400004F52452F747275737465642D6669726DD1 +:10241000776172652D6D2F746573742F7375697490 +:1024200065732F7373742F7365637572652F707383 +:10243000615F70735F735F72656C696162696C691B +:1024400074795F7465737473756974652E630000C5 +:1024500054686520646174612073686F756C6420D2 +:102460006E6F742068617665206368616E6765646D +:10247000000000005353542072656C696162696CFE +:10248000697479207465737473202854464D5F53C2 +:1024900053545F544553545F335858582900000033 +:1024A00054464D5F5353545F544553545F3330305B +:1024B0003100000072657065746974697665207317 +:1024C00065747320616E64206765747320696E2F74 +:1024D00066726F6D20616E20617373657400000019 +:1024E00054464D5F5353545F544553545F3330301B +:1024F00032000000726570657469746976652073D6 +:102500006574732C206765747320616E6420726536 +:102510006D6F7665730000002F686F6D652F6A61BF +:1025200065616D6530312F436F64652F6D62656441 +:102530002D6F732D74662D6D2D72656772657373C3 +:10254000696F6E2D74657374732F6D6265642D6F82 +:10255000732F66656174757265732F4645415455D6 +:1025600052455F5053412F5441524745545F5446A2 +:102570004D2F5441524745545F49474E4F52452FC6 +:10258000747275737465642D6669726D77617265B6 +:102590002D6D2F746573742F7375697465732F7344 +:1025A00073742F7365637572652F7373745F726FC5 +:1025B0006C6C6261636B5F70726F74656374696F7A +:1025C0006E5F7465737473756974652E63000000C3 +:1025D000496E6372656D656E742073686F756C64A7 +:1025E000206E6F74206661696C000000414D2070A0 +:1025F0007265706172652073686F756C64206661C6 +:10260000696C000044656372656D656E7420736863 +:102610006F756C64206E6F74206661696C000000D9 +:102620005353542073797374656D207072657061B3 +:1026300072652073686F756C64206E6F74206661BC +:10264000696C00005353542073797374656D207066 +:102650007265706172652073686F756C6420666165 +:10266000696C00005353542073797374656D207046 +:102670007265706172652073686F756C6420666145 +:10268000696C2061732076657273696F6E2069735F +:10269000206F6C6400000000526561642073686FF5 +:1026A000756C64206E6F74206661696C00000000B8 +:1026B0004E5620636F756E746572203120686173A9 +:1026C000206265656E20696E637265617365642062 +:1026D0006D6F7265207468616E203120756E69744B +:1026E000000000004E5620636F756E7465722031D5 +:1026F00020616E6420322073686F756C642068619D +:102700007665207468652073616D652076616C75EF +:10271000650000004E5620636F756E74657220323E +:1027200020616E6420332073686F756C642068616B +:102730007665207468652073616D652076616C75BF +:1027400065000000414D20707265706172652073F4 +:10275000686F756C64206E6F74206661696C000030 +:102760005365742073686F756C64206661696C20B2 +:10277000617320746865206E6F6E2D766F6C617466 +:10278000696C6520636F756E746572732063616E2A +:10279000206E6F7420626520696E63726561736577 +:1027A0006400000053535420726F6C6C6261636B61 +:1027B0002070726F74656374696F6E2074657374D2 +:1027C00073202854464D5F5353545F544553545F10 +:1027D000345858582900000054464D5F5353545FF5 +:1027E000544553545F343030310000004368656312 +:1027F0006B20535354206172656120766572736952 +:102800006F6E207768656E204E5620636F756E740C +:1028100065727320312F322F332068617665207402 +:1028200068652073616D652076616C7565000000D8 +:1028300054464D5F5353545F544553545F343030C6 +:1028400032000000436865636B205353542061726B +:1028500065612076657273696F6E207768656E209A +:10286000697420697320646966666572656E742098 +:1028700066726F6D204E5620636F756E746572734D +:1028800020312F322F33000054464D5F5353545F95 +:10289000544553545F34303033000000436865635F +:1028A0006B205353542061726561207665727369A1 +:1028B0006F6E207768656E204E5620636F756E745C +:1028C000657273203120616E642032206172652050 +:1028D000657175616C732C2033206973206469669F +:1028E000666572656E742C20616E642053535420AB +:1028F000617265612076657273696F6E206D6174B7 +:102900006368204E5620636F756E74657273203154 +:1029100020616E642032000054464D5F5353545F73 +:10292000544553545F3430303400000043686563CD +:102930006B20535354206172656120766572736910 +:102940006F6E207768656E204E5620636F756E74CB +:10295000657273203220616E6420332061726520BD +:10296000657175616C732C20312069732064696610 +:10297000666572656E7420616E64205353542061E5 +:102980007265612076657273696F6E206D61746324 +:1029900068204E5620636F756E7465722032206118 +:1029A0006E6420330000000054464D5F5353545F63 +:1029B000544553545F34303035000000436865633C +:1029C0006B20535354206172656120766572736980 +:1029D0006F6E207768656E204E5620636F756E743B +:1029E000657273203220616E64203320617265202D +:1029F000657175616C732C20312069732064696680 +:102A0000666572656E7420616E6420535354206154 +:102A10007265612076657273696F6E206D61746393 +:102A200068204E5620636F756E7465722031000009 +:102A300054464D5F5353545F544553545F343030C4 +:102A400036000000436865636B2053535420617265 +:102A500065612076657273696F6E207768656E2098 +:102A60004E5620636F756E7465727320312C203260 +:102A700020616E6420332068617665206469666633 +:102A80006572656E742076616C75657320616E6425 +:102A90002053535420617265612076657273696FAB +:102AA0006E206D61746368204E5620636F756E747E +:102AB000657220312076616C7565000054464D5F6B +:102AC0005353545F544553545F3430303700000043 +:102AD000436865636B2053535420617265612076AF +:102AE000657273696F6E207768656E204E5620633D +:102AF0006F756E7465727320312C203220616E64A4 +:102B00002033206861766520646966666572656E4B +:102B1000742076616C75657320616E642053535424 +:102B200020617265612076657273696F6E206D61D8 +:102B3000746368204E5620636F756E746572203220 +:102B40002076616C7565000054464D5F5353545FA9 +:102B5000544553545F343030380000004368656397 +:102B60006B205353542061726561207665727369DE +:102B70006F6E207768656E204E5620636F756E7499 +:102B800065727320312C203220616E6420332068FE +:102B900061766520646966666572656E742076612B +:102BA0006C75657320616E642053535420617265A7 +:102BB000612076657273696F6E206D617463682041 +:102BC0004E5620636F756E74657220332076616C8B +:102BD0007565000054464D5F5353545F544553543C +:102BE0005F34303039000000436865636B20535315 +:102BF0005420617265612076657273696F6E20770B +:102C000068656E204E5620636F756E746572203154 +:102C10002063616E6E6F7420626520696E637265F9 +:102C20006D656E74656400002F686F6D652F6A6155 +:102C300065616D6530312F436F64652F6D6265642A +:102C40002D6F732D74662D6D2D72656772657373AC +:102C5000696F6E2D74657374732F6D6265642D6F6B +:102C6000732F66656174757265732F4645415455BF +:102C700052455F5053412F5441524745545F54468B +:102C80004D2F5441524745545F49474E4F52452FAF +:102C9000747275737465642D6669726D776172659F +:102CA0002D6D2F746573742F7375697465732F6937 +:102CB00074732F7365637572652F7073615F6974C8 +:102CC000735F735F696E746572666163655F746577 +:102CD000737473756974652E630000004765742012 +:102CE00073686F756C64206E6F74207375636365B1 +:102CF00065642066726F6D20612064696666657226 +:102D0000656E7420706172746974696F6E00000082 +:102D100050534120696E7465726E616C20747275D7 +:102D2000737465642073746F7261676520532069E2 +:102D30006E746572666163652074657374732028B0 +:102D400054464D5F4954535F544553545F3258586D +:102D50005829000054464D5F4954535F544553541D +:102D60005F3230303100000054464D5F4954535FAC +:102D7000544553545F3230303200000054464D5FAA +:102D80004954535F544553545F3230303300000090 +:102D900054464D5F4954535F544553545F3230306D +:102DA0003400000054464D5F4954535F544553541A +:102DB0005F3230303500000054464D5F4954535F58 +:102DC000544553545F3230303600000054464D5F56 +:102DD0004954535F544553545F323030370000003C +:102DE00054464D5F4954535F544553545F3230301D +:102DF0003800000047657420696E7465726661630F +:102E00006520776974682064617461206C656E6701 +:102E100074687320616E64206F66667365747320D6 +:102E200067726561746572207468616E20554944EB +:102E3000206C656E6774680054464D5F4954535F5B +:102E4000544553545F3230303900000054464D5FD2 +:102E50004954535F544553545F32303130000000C1 +:102E600054464D5F4954535F544553545F3230319B +:102E70003100000054464D5F4954535F544553544C +:102E80005F3230313200000054464D5F4954535F89 +:102E9000544553545F3230313300000054464D5F87 +:102EA0004954535F544553545F323031340000006D +:102EB00054464D5F4954535F544553545F3230314B +:102EC0003500000054464D5F4954535F54455354F8 +:102ED0005F3230313600000054464D5F4954535F35 +:102EE000544553545F3230313700000054464D5F33 +:102EF0004954535F544553545F3230313800000019 +:102F000054464D5F4954535F544553545F323031FA +:102F10003900000054464D5F4954535F54455354A3 +:102F20005F3230323000000054464D5F4954535FE9 +:102F3000544553545F3230323100000054464D5FE7 +:102F40004954535F544553545F32303232000000CD +:102F500054464D5F4954535F544553545F323032A9 +:102F600033000000417474656D707420746F2067C5 +:102F7000657420612055494420736574206279206E +:102F80006120646966666572656E74207061727432 +:102F90006974696F6E0000002F686F6D652F6A613C +:102FA00065616D6530312F436F64652F6D626564B7 +:102FB0002D6F732D74662D6D2D7265677265737339 +:102FC000696F6E2D74657374732F6D6265642D6FF8 +:102FD000732F66656174757265732F46454154554C +:102FE00052455F5053412F5441524745545F544618 +:102FF0004D2F5441524745545F49474E4F52452F3C +:10300000747275737465642D6669726D776172652B +:103010002D6D2F746573742F7375697465732F69C3 +:1030200074732F7365637572652F7073615F697454 +:10303000735F735F72656C696162696C6974795FF3 +:103040007465737473756974652E630049545320F5 +:1030500072656C696162696C6974792074657374F6 +:1030600073202854464D5F4954535F544553545F71 +:10307000335858582900000054464D5F4954535F57 +:10308000544553545F3330303100000054464D5F97 +:103090004954535F544553545F333030320000007D +:1030A0002F686F6D652F6A6165616D6530312F43E3 +:1030B0006F64652F6D6265642D6F732D74662D6D61 +:1030C0002D72656772657373696F6E2D74657374A5 +:1030D000732F6D6265642D6F732F666561747572F1 +:1030E00065732F464541545552455F5053412F5407 +:1030F00041524745545F54464D2F54415247455421 +:103100005F49474E4F52452F747275737465642D35 +:103110006669726D776172652D6D2F746573742F9A +:103120007375697465732F6974732F6974735F7431 +:10313000657374735F636F6D6D6F6E2E6300000057 +:103140005772697465206F6E6365206461746120D5 +:103150006C656E6774682073686F756C64206E6F41 +:10316000742068617665206368616E67656400003D +:10317000526561642064617461206C656E67746877 +:103180002073686F756C6420626520657175616C71 +:1031900020746F2072657175657374656420646155 +:1031A0007461206C656E677468000000526561642C +:1031B0002064617461206C656E6774682073686F49 +:1031C000756C6420626520657175616C20746F2078 +:1031D0007A65726F0000000052656164206461745A +:1031E000612073686F756C6420626520657175611C +:1031F0006C20746F206E65776C7920726561642035 +:10320000646174610000000052656164206461744F +:10321000612073686F756C642062652065717561EB +:103220006C20746F206E65776C7920726561642004 +:1032300064617461207374617274696E6720617473 +:10324000206F666673657400526561642064617402 +:1032500061206C656E6774682073686F756C64209C +:10326000626520302077697468204E554C4C20648C +:1032700061746120706F696E74657220616E642084 +:103280007A65726F206C656E677468004361706167 +:103290006369747920696E636F7272656374206606 +:1032A0006F72207772697465206F6E63652055496F +:1032B00044000000436170616369747920696E6342 +:1032C0006F727265637420666F722076616C6964D8 +:1032D00020554944000000004361706163697479BE +:1032E0002073686F756C64206E6F742068617665FA +:1032F000206368616E676564000000005265616468 +:103300002064617461206C656E6774682073686FF7 +:10331000756C6420626520657175616C20746F2026 +:10332000726573756C742064617461206C656E677E +:1033300074680000000000000200000000000000AF +:103340000300000000000000040000000000000076 +:10335000800000000001000000020000BF0000002B +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:103550000000000000000000000000002F686F6DF8 +:10356000652F6A6165616D6530312F436F64652F2A +:103570006D6265642D6F732D74662D6D2D72656798 +:1035800072657373696F6E2D74657374732F6D62DA +:1035900065642D6F732F66656174757265732F4650 +:1035A0004541545552455F5053412F544152474570 +:1035B000545F54464D2F5441524745545F49474E3E +:1035C0004F52452F747275737465642D6669726D00 +:1035D000776172652D6D2F746573742F73756974BF +:1035E00065732F63727970746F2F7365637572657D +:1035F0002F63727970746F5F7365635F696E746552 +:1036000072666163655F7465737473756974652E42 +:10361000630000004661696C656420746F20696D09 +:10362000706F7274206B65790000000053686F75CD +:103630006C64206E6F742062652061626C6520741A +:103640006F2064657374726F79206B657920667280 +:103650006F6D20616E6F746865722070617274693D +:1036600074696F6E000000004572726F72206465AD +:103670007374726F79696E672061206B65790000E1 +:1036800054484953204953204D59204B4559310046 +:1036900043727970746F2073656375726520696E0B +:1036A0007465726661636520746573747320285451 +:1036B000464D5F43525950544F5F544553545F3504 +:1036C000585858290000000054464D5F4352595045 +:1036D000544F5F544553545F353030310000000083 +:1036E000536563757265204B6579206D616E616706 +:1036F000656D656E7420696E7465726661636500E0 +:1037000054464D5F43525950544F5F544553545F94 +:103710003530303200000000536563757265205308 +:10372000796D6D657472696320656E63727970740A +:10373000696F6E20284145532D3132382D43424365 +:103740002920696E746572666163650054464D5F39 +:1037500043525950544F5F544553545F35303033C2 +:10376000000000005365637572652053796D6D65C7 +:103770007472696320656E6372797074696F6E200C +:10378000284145532D3132382D4346422920696E58 +:10379000746572666163650054464D5F43525950CB +:1037A000544F5F544553545F3530303500000000AE +:1037B0005365637572652053796D6D6574726963C5 +:1037C00020656E6372797074696F6E20284145536D +:1037D0002D3132382D4354522920696E746572663A +:1037E0006163650054464D5F43525950544F5F54D6 +:1037F0004553545F35303037000000005365637522 +:1038000072652053796D6D657472696320656E63AE +:1038100072797074696F6E20696E76616C6964206C +:1038200063697068657220284145532D3132382D07 +:1038300047434D290000000054464D5F4352595004 +:10384000544F5F544553545F35303038000000000A +:103850005365637572652053796D6D657472696324 +:1038600020656E6372797074696F6E20696E76611F +:103870006C69642063697068657220284145532D26 +:103880003135322D434243290000000054464D5F3C +:1038900043525950544F5F544553545F353030397B +:1038A000000000005365637572652053796D6D6586 +:1038B0007472696320656E6372797074696F6E20CB +:1038C000696E76616C69642063697068657220282E +:1038D000484D41432D3132382D43464229000000E6 +:1038E00054464D5F43525950544F5F544553545FB3 +:1038F0003530313000000000536563757265204833 +:1039000061736820285348412D312920696E746500 +:10391000726661636500000054464D5F4352595022 +:10392000544F5F544553545F35303131000000002F +:103930005365637572652048617368202853484158 +:103940002D3232342920696E7465726661636500B8 +:1039500054464D5F43525950544F5F544553545F42 +:1039600035303132000000005365637572652048C0 +:1039700061736820285348412D3235362920696EFD +:10398000746572666163650054464D5F43525950D9 +:10399000544F5F544553545F3530313300000000BD +:1039A00053656375726520486173682028534841E8 +:1039B0002D3338342920696E746572666163650041 +:1039C00054464D5F43525950544F5F544553545FD2 +:1039D000353031340000000053656375726520484E +:1039E00061736820285348412D3531322920696E92 +:1039F000746572666163650054464D5F4352595069 +:103A0000544F5F544553545F353031390000000046 +:103A100053656375726520484D41432028534841E2 +:103A20002D312920696E746572666163650000003E +:103A300054464D5F43525950544F5F544553545F61 +:103A400035303230000000005365637572652048E0 +:103A50004D414320285348412D3235362920696E87 +:103A6000746572666163650054464D5F43525950F8 +:103A7000544F5F544553545F3530323100000000DD +:103A800053656375726520484D4143202853484172 +:103A90002D3338342920696E746572666163650060 +:103AA00054464D5F43525950544F5F544553545FF1 +:103AB000353032320000000053656375726520486E +:103AC0004D414320285348412D3531322920696E1C +:103AD000746572666163650054464D5F4352595088 +:103AE000544F5F544553545F35303234000000006A +:103AF00053656375726520484D414320776974684A +:103B0000206C6F6E67206B657920285348412D31FA +:103B10002920696E746572666163650054464D5F65 +:103B200043525950544F5F544553545F35303330EE +:103B300000000000536563757265204145414420D3 +:103B4000284145532D3132382D43434D2920696E8C +:103B5000746572666163650054464D5F4352595007 +:103B6000544F5F544553545F3530333100000000EB +:103B70005365637572652041454144202841455392 +:103B80002D3132382D47434D2920696E7465726698 +:103B90006163650054464D5F43525950544F5F5422 +:103BA0004553545F35303332000000005365637570 +:103BB0007265206B657920706F6C69637920696E1E +:103BC000746572666163650054464D5F4352595097 +:103BD000544F5F544553545F353033330000000079 +:103BE000536563757265206B657920706F6C6963CE +:103BF0007920636865636B207065726D69737369A2 +:103C00006F6E730054464D5F43525950544F5F548A +:103C10004553545F35303334000000004B65792044 +:103C200061636365737320636F6E74726F6C000001 +:103C300054686973206973206D79207465737420EA +:103C40006D6573736167652C20000000706C6561A1 +:103C500073652067656E65726174652061206861B7 +:103C6000736820666F7220746869732E000000000C +:103C7000706C656173652067656E6572617465203F +:103C80006120686D616320666F7220746869732EAD +:103C9000000000002F686F6D652F6A6165616D65BA +:103CA00030312F436F64652F6D6265642D6F732D06 +:103CB00074662D6D2D72656772657373696F6E2DF5 +:103CC00074657374732F6D6265642D6F732F6665F1 +:103CD0006174757265732F464541545552455F5066 +:103CE00053412F5441524745545F54464D2F544140 +:103CF000524745545F49474E4F52452F7472757372 +:103D00007465642D6669726D776172652D6D2F74AF +:103D10006573742F7375697465732F63727970742A +:103D20006F2F63727970746F5F74657374735F6300 +:103D30006F6D6D6F6E2E63004572726F7220696DCC +:103D4000706F7274696E672061206B657900000086 +:103D50004572726F722067657474696E67206B6557 +:103D600079206D6574616461746100005468652038 +:103D70006E756D626572206F66206B657920626971 +:103D8000747320697320646966666572656E742059 +:103D900066726F6D206578706563746564000000FD +:103DA0005468652074797065206F6620746865209A +:103DB0006B657920697320646966666572656E74E7 +:103DC0002066726F6D2065787065637465640000AD +:103DD0004572726F72206578706F7274696E6720B9 +:103DE00061206B65790000004E756D626572206F11 +:103DF00066206279746573206F66206578706F72D3 +:103E0000746564206B657920646966666572656EA9 +:103E1000742066726F6D20657870656374656400E8 +:103E20004578706F72746564206B657920646F6586 +:103E3000736E2774206D61746368207468652069EF +:103E40006D706F72746564206B6579004572726F76 +:103E5000722064657374726F79696E672074686527 +:103E6000206B6579000000004B65792068616E6405 +:103E70006C652073686F756C6420626520696E766E +:103E8000616C6964206E6F7700000000416C676FA1 +:103E9000726974686D204E4F5420535550504F52E4 +:103EA0005445442062792074686520696D706C65A2 +:103EB0006D656E746174696F6E0000004572726F9B +:103EC000722073657474696E672075702063697001 +:103ED000686572206F7065726174696F6E206F62C1 +:103EE0006A656374000000004572726F722073652A +:103EF0007474696E6720746865204956206F6E205F +:103F000074686520637970686572206F706572618E +:103F100074696F6E206F626A656374004572726FB8 +:103F2000722061626F7274696E6720746865206FB9 +:103F30007065726174696F6E000000004572726F87 +:103F40007220656E6372797074696E67206F6E653A +:103F5000206368756E6B206F6620696E666F726D88 +:103F60006174696F6E000000457870656374656404 +:103F700020656E6372797074656420646174612079 +:103F80006C656E6774682069732064696666657223 +:103F9000656E742066726F6D2065787065637465F8 +:103FA000640000004572726F722066696E616C6910 +:103FB00073696E6720746865206369706865722034 +:103FC0006F7065726174696F6E000000556E657880 +:103FD000706563746564206F7574707574206C65AA +:103FE0006E6774682061667465722066696E616CC4 +:103FF00069736174696F6E004572726F72207365C8 +:104000007474696E672074686520495620666F7203 +:104010002064656372797074696F6E004572726FA7 +:104020007220647572696E6720646563727970745A +:10403000696F6E00446563727970746564206461B1 +:10404000746120646F65736E2774206D617463689A +:10405000207769746820706C61696E20746578746B +:104060000000000041667465722066696E616C69CB +:1040700073696E672C20756E65787065637465640E +:1040800020646563727970746564206C656E677412 +:10409000680000003031323334353637383930314A +:1040A000323334005369787465656E2062797465C3 +:1040B0007321210053686F756C64206E6F742073D8 +:1040C00075636365737366756C6C7920736574755D +:1040D0007020616E20696E76616C6964206369701E +:1040E000686572004572726F722073657474696ED0 +:1040F000672075702068617368206F7065726174E5 +:10410000696F6E206F626A65637400004572726F3A +:1041100072207570646174696E67207468652068C8 +:10412000617368206F7065726174696F6E206F6271 +:104130006A656374000000004572726F72207665D4 +:1041400072696679696E6720746865206861736852 +:10415000206F7065726174696F6E206F626A65634B +:10416000740000004572726F722073657474696E1A +:1041700067207570206D6163206F7065726174696E +:104180006F6E206F626A6563740000004572726F23 +:104190007220647572696E67206D6163206F70654F +:1041A000726174696F6E00004572726F722064757F +:1041B00072696E672066696E616C6973696E6720EB +:1041C000746865206D6163206F7065726174696FDA +:1041D0006E00000054484953204953204D59205542 +:1041E0004E434F4D4D4F4E4C59204C4F4E47204B58 +:1041F000455931004572726F7220706572666F7238 +:104200006D696E67204145414420656E6372797027 +:1042100074696F6E00000000456E6372797074659A +:10422000642064617461206C656E677468206973D2 +:1042300020646966666572656E74207468616E20BC +:104240006578706563746564000000004572726F84 +:104250007220706572666F726D696E6720414541AC +:10426000442064656372797074696F6E00000000A9 +:104270004465637279707465642064617461206C54 +:10428000656E677468206973206469666665726527 +:104290006E742066726F6D20706C61696E2074653B +:1042A00078740000303132333435363738393000E5 +:1042B00054686973206973206173736F63696174F3 +:1042C000656420646174610053686F756C64206E6E +:1042D0006F74207375636365737366756C6C792096 +:1042E000696D706F7274207769746820616E2069DF +:1042F0006E76616C6964206B6579206C656E67749D +:10430000680000004661696C656420746F20696D07 +:10431000706F72742061206B657900004661696C72 +:10432000656420746F2073657475702063697068AC +:104330006572206F7065726174696F6E00000000B5 +:104340004661696C656420746F2061626F727420CD +:10435000636970686572206F7065726174696F6EF1 +:10436000000000005761732061626C6520746F204B +:10437000736574757020636970686572206F70650D +:10438000726174696F6E20776974682077726F6EDE +:104390006720616C6700000053686F756C64206E65 +:1043A0006F742062652061626C6520746F2065788F +:1043B000706F7274206B657920776974686F75749B +:1043C00020636F72726563742075736167650000A6 +:1043D0004661696C656420746F2064657374726FE4 +:1043E00079206B6579000000564A0E35F1C7BCD0C4 +:1043F0007DCFB1BCC916FA2EF5BE96B20000000002 +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000D290E20E4EC17EAD +:104430007A95F5105C7674046EB5565EE5E7BA15AC +:104440006C2347F3000000000000000000000000A3 +:10445000000000000000000000000000000000005C +:1044600000000000000000006B22092A371EF5142E +:10447000F7394DCFAD4D174666CB33A039D8414EF5 +:10448000F12AD34D69C3B53E0000000000000000D2 +:10449000000000000000000000000000000000001C +:1044A0000000000000000000647911BB474E47592E +:1044B0003E4DBC60A5F9BF9CC0BA550F93CA72DFD0 +:1044C000571E5056F94A01D6A56FF762344F48FD82 +:1044D0009D150742B77294B800000000000000006C +:1044E0000000000000000000B41CA36CA9671DAD13 +:1044F000341FBE1B83C4402A474279BB21CAF060E7 +:10450000E4D26E9B7012343F552C09310A5B402176 +:1045100001A83B58E748131A7ECDE1D24610583423 +:1045200049144BAA89A9F5B10DA69D0243173E7EF9 +:10453000E73BC6A951068AEA12B0A71D0000000099 +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:104560000000000000000000C19F19AC05655F025B +:104570001B6432D9B149BA750560524E78FA61C9E7 +:10458000375D7F58000000000000000000000000C0 +:10459000000000000000000000000000000000001B +:1045A00000000000000000009437BEB57F7C5CB0C6 +:1045B0000A924DD3BA7EB11ADBA225B2828EDFBB3E +:1045C00061BF911D28234A04000000000000000084 +:1045D00000000000000000000000000000000000DB +:1045E000000000000000000094219BC3D5EDE6EE22 +:1045F00042105A58A44D678716A2A76C2EC585B7DE +:104600006A4C90B273EE583C591667F36F30991CA0 +:104610002AF7B15F4583F59F00000000000000000D +:1046200000000000000000008F76EF120B92C2061F +:10463000CE0118758496D96F2388D4F8CF79F8CF36 +:1046400027129FA67E879A68EEE2E71D4BF287C08D +:10465000056ABD7F9DFFAAF39A1CB7B7BD0361A38E +:10466000A96A5DB281E16F1FB5067B9AB9E7473C45 +:104670002D44461F4ABD22539C0534343036303415 +:10468000353635323732383239313030313000005A +:104690005053415F494F545F50524F46494C455F1C +:1046A000310000007777772E7472757374656466D5 +:1046B00069726D776172652E6F726700534841327F +:1046C00035360000A0A1A2A3A4A5A6A7A8A9AAABBD +:1046D000ACADAEAFB0B1B2B3B4B5B6B7B8B9BABBA2 +:1046E000BCBDBEBFAAAAAAAAAAAAAAAABBBBBBBB98 +:1046F000BBBBBBBBCCCCCCCCCCCCCCCCDDDDDDDDFA +:10470000DDDDDDDD12CD021062CD02107ACD0210AA +:1047100012CD021048CD02102ECD0210FACC02109C +:10472000000B030403030303090509090A09030C29 +:10473000030D0F0F090A000049504320736563758C +:10474000726520696E746572666163652074657355 +:1047500074202854464D5F4950435F544553545F7D +:10476000315858582900000054464D5F4950435F66 +:10477000544553545F313030310000005365637548 +:1047800072652066756E6374696F6E616C000000FF +:104790005369676E617475726531000060D50210EF +:1047A00032D502100ED5021060D50210F4D40210DA +:1047B000DAD40210C0D4021058DB021058DB021009 +:1047C00058DB021058DB0210D2DC0210CADC0210E7 +:1047D000B6DC0210A8DC02109EDC02109EDC021087 +:1047E0009EDC021058DB021098E302103CE5021038 +:1047F00072E302108EE3021056E402108EE3021000 +:104800008EE302108EE3021056E402108EE30210D3 +:104810008EE302108EE302108EE302108EE302108C +:104820008EE302108EE302106AE402108EE302109F +:104830008EE302108EE302108EE302108EE302106C +:104840008EE302108EE302108EE302108EE302105C +:104850008EE302108EE302108EE302108EE302104C +:104860008EE302108EE302106AE4021044E90210A3 +:10487000EAEA02101EE902103AE9021004EA021004 +:104880003AE902103AE902103AE9021004EA021089 +:104890003AE902103AE902103AE902103AE9021044 +:1048A0003AE902103AE902103AE9021018EA021055 +:1048B0003AE902103AE902103AE902103AE9021024 +:1048C0003AE902103AE902103AE902103AE9021014 +:1048D0003AE902103AE902103AE902103AE9021004 +:1048E0003AE902103AE902103AE9021018EA021015 +:1048F000010204080000010002000300040005009A +:1049000010001100120015001600170018002000FA +:10491000210022002300240025003D0060006100EA +:0C49200062006700F7D9000000000000F2 +:1049400000000000000038400000000048E80100BE +:104950001C10000803007B000200000048E8010072 +:104960000300000000000000000000000000000044 +:1049700048E8010000000000000000000200000004 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000300000001000000000000000000000003 +:1049B00000000000000000000000000000000000F7 +:1049C000FFFFFFFF000000000000000000000000EB +:1049D00000000000000000000000000000000000D7 +:1049E0000107001041070010A9070010C9110000BD +:1049F00001000000931A000001000000D103000034 +:104A000001000000010000000000000000000000A4 +:104A10000000000000000000000000000000000096 +:104A200000006540000000000000000000000000E1 +:104A3000298F0210000000000000000000000000AC +:104A400000000000B591021000000000000000000E +:104A50000000000000000000999C0210000000000F +:104A6000000000000000000000000000A99E0210ED +:104A70000000000000000000000000000000000036 +:104A800035A102100000000000000000000000003E +:104A90000000000089B502100000000000000000C6 +:104AA00000000000000000001921021000000000BA +:104AB0000000000000000000000000008DD0021087 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE00000000000E5200210042302101C23021025 +:104AF00000000000000000000000000000000000B6 +:104B000079200210442302105C23021000000000F0 +:104B10000000000000000000000000000000000095 +:104B200043F0000042F0000040F000008000000070 +:104B300082F0000081F0000080F0000083F00000AF +:104B40007100000080000000E0F000008000000024 +:104B500060000000610000006200000063000000CF +:104B6000640000007000000071000000720000008E +:104B7000730000002000000021000000220000005F +:104B8000C0F0000040000000410000008000000074 +:104B90007100000073000000800000007000000041 +:104BA00071000000720000007300000000000000AF +:104BB0000F000000BC8802082C7F020800000000E3 +:104BC000207F02080000000000000000000000003C +:104BD00000000000000000000000000000000000D5 +:104BE000108F020800000000A07E020800000000F4 +:104BF00000000000987E0208000000000000000095 +:104C00000000000015490210194902101D49021048 +:104C1000300B0310B80A0310680A0310E00A0310EF +:104C2000080B0310900A0310A0090310D809031001 +:104C3000F4090310100A03102C0A0310BC09031016 +:104C400000006540FF0F6540FFFFFFFF0000384098 +:104C5000FF083840FFFFFFFF00093D0000127A0007 +:104C600000093D000000D00700093D00A00F000032 +:104C700004000000558202107C16031090160310E9 +:104C80000000000000000000000000000000000024 +:104C90006D7D0210A0160310B41603100000000072 +:104CA000000000000000000000000000698E0210FB +:104CB000D4160310E81603100000000000000000E6 +:104CC0000000000000000000657D021010170310B6 +:104CD0002417031000000000000000000000000086 +:104CE00000000000C98302104C1703106017031066 +:104CF00000000000000000000000000000000000B4 +:104D0000B18C0210841703109817031000000000E4 +:104D10000000000000000000000000007D8B021079 +:104D2000B8170310CC1703100000000000000000AB +:104D30000000000000000000FD820210F0170310C8 +:104D40000418031000000000000000000000000034 +:104D5000000000009D890210241803103818031069 +:104D60000000000000000000000000000000000043 +:104D7000B58102106C1803108018031000000000A9 +:104D8000000000000000000000000000DD7E0210B6 +:104D9000A8180310BC180310000000000000000059 +:104DA0000000000000000000D9800210E418031089 +:104DB000F8180310000000000000000000000000D0 +:104DC00000000000117E02101C190310301903109E +:104DD00000000000000000000000000000000000D3 +:104DE00065800210581903106C19031000000000B0 +:104DF000000000000000000000000000557F0210CD +:104E000098190310AC190310000000000000000006 +:104E10000000000000000000CD8E0210CC1903102D +:104E2000E019031000000000000000000000000076 +:104E3000000000009D8E0210081A03101C1A0310B7 +:104E40000000000000000000000000000000000062 +:104E500049880210401A0310541A03100000000081 +:104E60000000000000000000000000005187021058 +:104E7000741A0310881A03100000000000000000DC +:104E800000000000000000000D860210A01A0310B0 +:104E9000B41A031000000000000000000000000031 +:104EA00000000000FD8E0210E01A0310F41A031037 +:104EB00000000000000000000000000000000000F2 +:104EC0008D8402100C1B0310201B03100000000037 +:104ED0000000000000000000000000007D900210B3 +:104EE000A0240310B4240310000000000000000000 +:104EF0000000000000000000418F0210E0240310B9 +:104F0000F424031000000000000000000000000076 +:104F100000000000699A0210D8270310EC27031044 +:104F20000000000000000000000000000000000081 +:104F30004D94021030280310442803100000000094 +:104F40000000000000000000000000004D99021069 +:104F5000882803109C2803100000000000000000B7 +:104F60000000000000000000319802101829031012 +:104F70002C290310000000000000000000000000C9 +:104F800000000000F5960210A8290310BC290310A8 +:104F90000000000000000000000000000000000011 +:104FA00095950210302A0310442A031000000000D7 +:104FB0000000000000000000000000002993021023 +:104FC000BC2A0310D02A03100000000000000000DB +:104FD0000000000000000000CD910210482B0310DB +:104FE0005C2B031000000000000000000000000027 +:104FF000000000003D9C0210D42B0310E82B03108E +:1050000000000000000000000000000000000000A0 +:10501000010000004DA10210542D03109016031042 +:105020000000000000000000000000000000000080 +:10503000F5A10210682D0310B41603100000000043 +:1050400000000000000000000000000099A2021013 +:105050007C2D0310E8160310000000000000000083 +:105060000000000000000000CDA20210902D0310EF +:1050700060170310000000000000000000000000A6 +:1050800000000000A1A30210A42D03109817031024 +:105090000000000000000000000000000000000010 +:1050A00065A50210B82D0310CC17031000000000F6 +:1050B000000000000000000000000000CDA602106B +:1050C000CC2D0310041803100000000000000000A5 +:1050D000000000000000000099A70210E02D03105E +:1050E000F42D03100000000000000000000000008C +:1050F0000000000079A90210382E03108018031058 +:10510000000000000000000000000000000000009F +:1051100039AA02104C2E0310BC1803100000000026 +:10512000000000000000000000000000D1AA0210F2 +:10513000602E0310F81803100000000000000000AB +:105140000000000000000000C9AB0210742E031024 +:1051500030190310000000000000000000000000F3 +:105160000000000099AC0210882E0310AC19031047 +:10517000000000000000000000000000000000002F +:10518000A9AD02109C2E0310E019031000000000CE +:10519000000000000000000000000000D9AD021077 +:1051A000B02E03101C1A03100000000000000000C5 +:1051B000000000000000000009AE0210C42E031021 +:1051C000541A03100000000000000000000000005E +:1051D0000000000075AF0210D82E0310881A0310CB +:1051E00000000000000000000000000000000000BF +:1051F0006DB00210EC2E0310B41A03100000000072 +:10520000000000000000000000000000C9B1021012 +:10521000002F0310201B03100000000000000000FE +:105220000000000000000000A19D0210142F0310D8 +:105230002417031000000000000000000000000020 +:1052400000000000A19E0210282F03103818031040 +:10525000000000000000000000000000000000004E +:10526000359E02103C2F03106C1903100000000043 +:10527000000000000000000000000000A99D0210D6 +:10528000502F0310642F03100000000000000000E6 +:105290000000000000000000FD9F021078300310A5 +:1052A000B424031000000000000000000000000013 +:1052B00000000000C19E02108C300310F424031083 +:1052C00000000000000000000000000000000000DE +:1052D00079B50210C8360310E03603100000000054 +:1052E00000000000000000000000000061B5021096 +:1052F0000037031018370310000000000000000002 +:10530000000000000000000049B502104C370310F7 +:1053100064370310000000000000000000000000DF +:105320000000000031B5021098370310B0370310A9 +:10533000000000000000000000000000000000006D +:1053400011B50210E4370310FC3703100000000011 +:1053500000000000000000000000000029B502105D +:10536000383803105038031000000000000000001F +:105370000000000000000000F9B402108C38031097 +:10538000A43803100000000000000000000000002E +:1053900000000000E9B40210E0380310F8380310F0 +:1053A00000000000000000000000000000000000FD +:1053B000D9B402101839031030390310000000006E +:1053C000000000000000000000000000C9B402104E +:1053D000503903106839031000000000000000007D +:1053E0000000000000000000B9B40210883903106A +:1053F000A0390310000000000000000000000000C1 +:1054000000000000A9B40210C0390310D8390310FD +:10541000000000000000000000000000000000008C +:1054200095B40210F8390310103A03100000000080 +:1054300000000000000000000000000081B4021025 +:10544000303A0310483A031000000000000000004A +:1054500000000000000000006DB40210683A031064 +:10546000803A03100000000000000000000000006F +:105470000000000059B40210A03A0310B83A03101B +:10548000000000000000000000000000000000001C +:1054900045B40210D83A0310F03A0310000000009F +:1054A0000000000000000000000000002DB4021009 +:1054B0001C3B0310343B0310000000000000000000 +:1054C000000000000000000015B40210583B03105B +:1054D000703B03100000000000000000000000000E +:1054E000000000000DB40210943B0310AC3B03100D +:1054F00000000000000000000000000000000000AC +:1055000005B40210C83B0310E03B0310000000008C +:1055100000000000000000000000000065B3021061 +:10552000043C03101C3C03100000000000000000BD +:10553000000000000000000085D002106847031042 +:105540007C47031000000000000000000000000085 +:1055500000000000388802080000000068180010F1 +:10556000881800104818001000000000000000001B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B0000000000000000000692E0210412E0210C1 +:1055C000000430B5450B00281FD0104B1C68AC23DD +:1055D000E35AD800C01A236AC2181368002BFCDAF9 +:1055E0003E220B4B06211A600A4B0B4A1A60A3237A +:1055F0000A4ADB00D1500A4955505358236AC01853 +:10560000002343605358002BFCDA30BD0CAE020877 +:1056100004012640080126401E1F0000000026400D +:105620001C05000010B54378FF2B00D010BD00F022 +:10563000F3F90A4B1A68AC23D15A126A4B005B1873 +:1056400001219B18DB685A6813680B4313601368C9 +:105650001942FCD100F0F8F9E8E7C0460CAE0208A8 +:10566000F0B5454657464E46DE46E0B5B0264F4DAE +:1056700083B02B6801909A591F6A8846BC184C2247 +:105680009B5C002B50D000F0A7F98146032835D150 +:105690002A68116A93598C46AC21515A63444A00D6 +:1056A000521852009B181B68002B3BDB002000F0B7 +:1056B0009BF93F4B9A46984234D03E4B00211A68E2 +:1056C0000120002300F0A0F9061E2BD13A4B9B4687 +:1056D00002E05E4526D00136002000F085F95045F5 +:1056E000F7D1354B9E421DD000F096F9334A344B2A +:1056F0000600D358002B4ADB324C41E000F08CF915 +:105700002E4A2F4B0600D358002B23DB2D4C3000A4 +:1057100000F09AF9200003B03CBC90469946A2469E +:10572000AB46F0BD274CF5E700F076F90121060005 +:10573000254A380000F060F90028E7D1019B002BD2 +:1057400001D1224CE3E72368002BFCDB00F074F965 +:105750000400DCE7012138001B4A00F04DF9002865 +:10576000D4D14046FFF72CFF019B002BE9D02368E2 +:10577000002BFCDB00F060F94B460400032BC6D184 +:105780000121002000F050F90028F9D1BFE70121E4 +:1057900038000D4A00F030F90028ADD14046FFF73F +:1057A0000FFF019B002BE2D1084CE9E70CAE020889 +:1057B000010188003CA20208F049020000002640D6 +:1057C0001C050000050052002CA202080100500038 +:1057D000F0B54546DE4657464E46AC23E0B5744D1F +:1057E00083B02968CB5A4A68DC00E41A0B6A01923C +:1057F000E3181A68002AFCDAB02252055778002F05 +:105800002BD05278212A28D06A4ADA601A00002167 +:105810000424516068490A6922430A61012800D1C1 +:1058200099E030BF1A68002AFCDAB0235B055A7889 +:10583000002A58D05B78212B55D08623019A5B0033 +:10584000D358002B00D188E0AC232A680020D15A1D +:10585000126ACB005B1A9B1854E00227DA683A43BD +:10586000DA60DF681A00FF07D1D5DA680F68924660 +:10587000802290468A58BA181668B3468426B446E1 +:105880008E59B1464F443E68B1465E463702FF2608 +:105890003604374056463604360C37434E46360AF1 +:1058A00036063743DF601768444EB14637409026CE +:1058B00036013743B246664617608E590A68B346CA +:1058C0004E465A4417683740564637434646176097 +:1058D0008F5966460A68D7193F688F59D2191268DE +:1058E0000A6AA21893E7AC2329680020CB5ADA0091 +:1058F000D21A0B6AD318DC68E4070CD40221DA68E8 +:105900008A43DA6000225A6003B03CBC9046994654 +:10591000A246AB46F0BD0C688030A4460858274E1E +:1059200060440568DB6835401B0C1B061B0C2B43D1 +:1059300003608423C8580B689C460B6A6044D518E2 +:105940000468EB6834401B0E1B02234303600B6AA0 +:105950000120D318D2E720BF64E7A3211848194AD1 +:105960000368194E9C46194BC90057581C680660BD +:10597000062050503E211960442315495350535876 +:10598000002BFCDA8623019812495B00C150614666 +:105990000B4B01201960A323DB00D7500B4B2A6867 +:1059A0001C60AC23D15A126ACB005B1A9B18A9E782 +:1059B0000CAE020848A2020800ED00E0FF00FFFF65 +:1059C00008012640000026401E1F0000040126405A +:1059D0001C050000AAAAAAAA01B40248844601BC78 +:1059E000604700BFF171021001B40248844601BC57 +:1059F000604700BF295B021001B40248844601BC25 +:105A0000604700BFE556021001B40248844601BC5D +:105A1000604700BF4558021001B40248844601BCEB +:105A2000604700BF037D021001B40248844601BCF8 +:105A3000604700BF815A021001B40248844601BC8D +:105A4000604700BFA54F021001B40248844601BC64 +:085A5000604700BF0B7D02104E +:085A58008841FD070100000078 +:040000051000049152 +:00000001FF diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/sb-tools/keys/USERAPP_CM4_KEY_PRIV.pem b/targets/TARGET_Cypress/TARGET_PSOC6/sb-tools/keys/USERAPP_CM4_KEY_PRIV.pem new file mode 100644 index 00000000000..e1f8e15623c --- /dev/null +++ b/targets/TARGET_Cypress/TARGET_PSOC6/sb-tools/keys/USERAPP_CM4_KEY_PRIV.pem @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQguR/Jq6LjMgp8DVtE +7pKguttNo6L239aEcijzGOr5C72hRANCAAT/NroNASdTGo6bS8r0+C+30YcG0WLV +chWs+99DnOr3SZoalv6/pCNIVrwFv3KkJsmsZUbNNmxeMPr+IlfGGPg0 +-----END PRIVATE KEY----- diff --git a/targets/targets.json b/targets/targets.json index 2ba15bc75fc..70c15e90da7 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -5,11 +5,7 @@ "default_toolchain": "ARM", "supported_toolchains": null, "extra_labels": [], - "components": [ - "PSA_SRV_IMPL", - "PSA_SRV_EMUL", - "NSPE" - ], + "components": [], "is_disk_virtual": false, "macros": [], "device_has": [], @@ -91,116 +87,64 @@ } }, "PSA_Target": { + "inherits": [ + "Target" + ], + "features": [ + "PSA" + ], "public": false, - "config": { - "secure-rom-start": { - "help": "Starting address of Secure ROM", - "value": null, - "macro_name": "PSA_SECURE_ROM_START", - "conflicts": [ - "target.mbed_rom_start" - ] - }, - "secure-rom-size": { - "help": "Size in bytes of Secure ROM", - "value": null, - "macro_name": "PSA_SECURE_ROM_SIZE", - "conflicts": [ - "target.mbed_rom_size" - ] - }, - "non-secure-rom-start": { - "help": "Starting address of Non-secure ROM", - "value": null, - "macro_name": "PSA_NON_SECURE_ROM_START", - "conflicts": [ - "target.mbed_rom_start" - ] - }, - "non-secure-rom-size": { - "help": "Size in bytes of Non-secure ROM", - "value": null, - "macro_name": "PSA_NON_SECURE_ROM_SIZE", - "conflicts": [ - "target.mbed_rom_size" - ] - }, - "secure-ram-start": { - "help": "Starting address of Secure RAM", - "value": null, - "macro_name": "PSA_SECURE_RAM_START", - "conflicts": [ - "target.mbed_ram_start" - ] - }, - "secure-ram-size": { - "help": "Size in bytes of Secure RAM", - "value": null, - "macro_name": "PSA_SECURE_RAM_SIZE", - "conflicts": [ - "target.mbed_ram_size" - ] - }, - "non-secure-ram-start": { - "help": "Starting address of Non-secure RAM", - "value": null, - "macro_name": "PSA_NON_SECURE_RAM_START", - "conflicts": [ - "target.mbed_ram_start" - ] - }, - "non-secure-ram-size": { - "help": "Size in bytes of Non-secure RAM", - "value": null, - "macro_name": "PSA_NON_SECURE_RAM_SIZE", - "conflicts": [ - "target.mbed_ram_size" - ] - }, - "shared-ram-start": { - "help": "Starting address of Shared RAM between Secure and Non-secure worlds", - "value": null, - "macro_name": "PSA_SHARED_RAM_START" - }, - "shared-ram-size": { - "help": "Size in bytes of Shared RAM between Secure and Non-secure worlds", - "value": null, - "macro_name": "PSA_SHARED_RAM_SIZE" - }, - "public-ram-start": { - "help": "Starting address of Public RAM for variables accessible from Non-secure worlds", - "value": null, - "macro_name": "PSA_PUBLIC_RAM_START" - }, - "public-ram-size": { - "help": "Size in bytes of Public RAM variables accessible from Non-secure worlds", - "value": null, - "macro_name": "PSA_PUBLIC_RAM_SIZE" - } - } + "config": {} }, - "NSPE_Target": { + "PSA_V7_M": { "inherits": [ "PSA_Target" ], - "components": [ - "PSA_SRV_IPC", - "NSPE" + "extra_labels": [ + "MBED_PSA_SRV" ], - "device_has_add": [ + "device_has": [ "TRNG" ], "public": false }, - "SPE_Target": { + "PSA_DUAL_CORE": { "inherits": [ "PSA_Target" ], - "components": [ - "PSA_SRV_IMPL", - "PSA_SRV_IPC", - "SPE" + "extra_labels": [ + "TFM", + "TFM_DUALCPU" + ], + "device_has": [ + "TRNG" ], + "macros_add": [ + "TFM_MULTI_CORE_MULTI_CLIENT_CALL=1" + ], + "tfm_target_name": "", + "tfm_bootloader_supported": "", + "tfm_default_toolchain": "ARMCLANG", + "tfm_supported_toolchains": null, + "tfm_delivery_dir": "", + "public": false + }, + "PSA_V8_M": { + "inherits": [ + "PSA_Target" + ], + "extra_labels": [ + "TFM", + "TFM_V8M" + ], + "device_has": [ + "TRNG" + ], + "tfm_target_name": "", + "tfm_bootloader_supported": "", + "tfm_default_toolchain": "ARMCLANG", + "tfm_supported_toolchains": null, + "tfm_delivery_dir": "", "public": false }, "CM4_UARM": { @@ -759,7 +703,7 @@ "GCC_ARM", "IAR" ], - "extra_labels": [ + "extra_labels_add": [ "Freescale", "MCUXpresso_MCUS", "KSDK2_MCUS", @@ -767,24 +711,22 @@ "KPSDK_MCUS", "KPSDK_CODE", "MCU_K64F", - "Freescale_EMAC", - "PSA", - "MBED_PSA_SRV" + "Freescale_EMAC" ], "is_disk_virtual": true, - "macros": [ + "macros_add": [ "CPU_MK64FN1M0VMD12", "FSL_RTOS_MBED", "MBED_SPLIT_HEAP", "MBED_TICKLESS" ], "inherits": [ - "Target" + "PSA_V7_M" ], "detect_code": [ "0240" ], - "device_has": [ + "device_has_add": [ "USTICKER", "LPTICKER", "RTC", @@ -1020,29 +962,27 @@ "GCC_ARM", "IAR" ], - "extra_labels": [ + "extra_labels_add": [ "Freescale", "MCUXpresso_MCUS", "KSDK2_MCUS", "FRDM", - "Freescale_EMAC", - "PSA", - "MBED_PSA_SRV" + "Freescale_EMAC" ], "is_disk_virtual": true, - "macros": [ + "macros_add": [ "CPU_MK66FN2M0VMD18", "FSL_RTOS_MBED", "MBED_SPLIT_HEAP", "MBED_TICKLESS" ], "inherits": [ - "Target" + "PSA_V7_M" ], "detect_code": [ "0311" ], - "device_has": [ + "device_has_add": [ "USTICKER", "LPTICKER", "RTC", @@ -2023,10 +1963,12 @@ "macro_name": "CLOCK_SOURCE" } }, + "features_add": [ + "PSA" + ], "extra_labels_add": [ "STM32F4", "STM32F429xI", - "PSA", "MBED_PSA_SRV" ], "macros_add": [ @@ -4698,33 +4640,21 @@ ] }, "ARM_MUSCA_A1": { - "public": false, "inherits": [ - "Target" + "PSA_V8_M" ], "default_toolchain": "ARMC6", - "extra_labels": [ - "ARM_SSG", - "MUSCA_A1" - ], "features_add": [ "EXPERIMENTAL_API" ], "forced_reset_timeout": 7, "release_versions": [ "5" - ] - }, - "ARM_MUSCA_A1_NS": { - "inherits": [ - "NSPE_Target", - "ARM_MUSCA_A1" ], "core": "Cortex-M33-NS", "supported_toolchains": [ "ARMC6", - "GCC_ARM", - "IAR" + "GCC_ARM" ], "device_has_add": [ "INTERRUPTIN", @@ -4733,7 +4663,7 @@ "SLEEP", "USTICKER" ], - "macros": [ + "macros_add": [ "__STARTUP_CLEAR_BSS", "MBED_FAULT_HANDLER_DISABLED", "CMSIS_NVIC_VIRTUAL", @@ -4741,44 +4671,39 @@ "MBED_MPU_CUSTOM" ], "extra_labels_add": [ - "MUSCA_A1_NS", - "PSA", - "MBED_PSA_SRV", - "TFM" + "ARM_SSG", + "MUSCA_A1", + "MUSCA_A1_NS" ], "post_binary_hook": { "function": "ArmMuscaA1Code.binary_hook" }, - "secure_image_filename": "tfm.bin", - "overrides": { - "non-secure-rom-start": "0x000a0400", - "non-secure-rom-size": "0x5f800", - "non-secure-ram-start": "0x20011000", - "non-secure-ram-size": "0xf000" - } + "secure_image_filename": "tfm_s.bin", + "tfm_target_name": "MUSCA_A", + "tfm_bootloader_supported": true, + "tfm_default_toolchain": "ARMCLANG", + "tfm_supported_toolchains": [ + "ARMCLANG", + "GNUARM" + ], + "tfm_delivery_dir": "TARGET_ARM_SSG/TARGET_MUSCA_A1" + }, + "ARM_MUSCA_A1_NS": { + "inherits": [ + "ARM_MUSCA_A1" + ] }, "ARM_MUSCA_B1": { - "public": false, "inherits": [ - "Target" + "PSA_V8_M" ], "default_toolchain": "ARMC6", - "extra_labels": [ - "ARM_SSG", - "MUSCA_B1" - ], "features_add": [ "EXPERIMENTAL_API" ], "forced_reset_timeout": 20, "release_versions": [ "5" - ] - }, - "ARM_MUSCA_B1_NS": { - "inherits": [ - "NSPE_Target", - "ARM_MUSCA_B1" ], "core": "Cortex-M33-NS", "supported_toolchains": [ @@ -4794,29 +4719,36 @@ "SLEEP", "USTICKER" ], - "macros": [ + "macros_add": [ "__STARTUP_CLEAR_BSS", "MBED_FAULT_HANDLER_DISABLED", "CMSIS_NVIC_VIRTUAL", "LPTICKER_DELAY_TICKS=3", - "MBED_MPU_CUSTOM" + "MBED_MPU_CUSTOM", + "BL2" ], "extra_labels_add": [ - "MUSCA_B1_NS", - "PSA", - "MBED_PSA_SRV", - "TFM" + "ARM_SSG", + "MUSCA_B1", + "MUSCA_B1_NS" ], "post_binary_hook": { "function": "ArmMuscaB1Code.binary_hook" }, - "secure_image_filename": "tfm.bin", - "overrides": { - "non-secure-rom-start": "0x0A070400", - "non-secure-rom-size": "0x7f800", - "non-secure-ram-start": "0x20040000", - "non-secure-ram-size": "0x40000" - } + "secure_image_filename": "tfm_s.bin", + "tfm_target_name": "MUSCA_B1", + "tfm_bootloader_supported": true, + "tfm_default_toolchain": "ARMCLANG", + "tfm_supported_toolchains": [ + "ARMCLANG", + "GNUARM" + ], + "tfm_delivery_dir": "TARGET_ARM_SSG/TARGET_MUSCA_B1" + }, + "ARM_MUSCA_B1_NS": { + "inherits": [ + "ARM_MUSCA_B1" + ] }, "RZ_A1XX": { "inherits": [ @@ -6327,15 +6259,19 @@ ], "public": false, "extra_labels": [ - "ARM_FM", - "PSA", - "MBED_PSA_SRV" + "ARM_FM" ] }, "FVP_MPS2": { "inherits": [ "ARM_FM" ], + "features_add": [ + "PSA" + ], + "extra_labels_add": [ + "MBED_PSA_SRV" + ], "public": false, "supported_toolchains": [ "GCC_ARM", @@ -6589,7 +6525,7 @@ ], "core": "Cortex-M4F", "OUTPUT_EXT": "hex", - "device_has": [ + "device_has_add": [ "ANALOGIN", "ANALOGOUT", "CRC", @@ -6622,7 +6558,7 @@ "release_versions": [ "5" ], - "extra_labels": [ + "extra_labels_add": [ "Cypress", "PSOC6", "MXCRYPTO" @@ -6777,8 +6713,9 @@ "inherits": [ "MCU_PSOC6_M4" ], - "features": [ - "BLE" + "features_add": [ + "BLE", + "PSA" ], "components_add": [ "WHD", @@ -6798,11 +6735,14 @@ "extra_labels_add": [ "PSOC6_02", "MXCRYPTO_02", - "CORDIO" + "CORDIO", + "TFM", + "TFM_DUALCPU" ], "macros_add": [ "CYB0644ABZI_S2D44", - "CYBSP_WIFI_CAPABLE" + "CYBSP_WIFI_CAPABLE", + "TFM_MULTI_CORE_MULTI_CLIENT_CALL=1" ], "detect_code": [ "190A" @@ -6814,14 +6754,23 @@ "overrides": { "network-default-interface-type": "WIFI" }, - "program_cycle_s": 10 + "program_cycle_s": 10, + "tfm_target_name": "psoc64", + "tfm_bootloader_supported": false, + "tfm_default_toolchain": "GNUARM", + "tfm_supported_toolchains": [ + "GNUARM" + ], + "tfm_delivery_dir": "TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064S2_4343W", + "TFM_OUTPUT_EXT": "hex" }, "CYESKIT_064B0S2_4343W": { "inherits": [ "MCU_PSOC6_M4" ], - "features": [ - "BLE" + "features_add": [ + "BLE", + "PSA" ], "components_add": [ "WHD", @@ -6841,11 +6790,14 @@ "extra_labels_add": [ "PSOC6_02", "MXCRYPTO_02", - "CORDIO" + "CORDIO", + "TFM", + "TFM_DUALCPU" ], "macros_add": [ "CYB0644ABZI_S2D44", - "CYBSP_WIFI_CAPABLE" + "CYBSP_WIFI_CAPABLE", + "TFM_MULTI_CORE_MULTI_CLIENT_CALL=1" ], "detect_code": [ "190A" @@ -6857,7 +6809,15 @@ "overrides": { "network-default-interface-type": "WIFI" }, - "program_cycle_s": 10 + "program_cycle_s": 10, + "tfm_target_name": "psoc64", + "tfm_bootloader_supported": false, + "tfm_default_toolchain": "GNUARM", + "tfm_supported_toolchains": [ + "GNUARM" + ], + "tfm_delivery_dir": "TARGET_Cypress/TARGET_PSOC6/TARGET_CY8CKIT_064B0S2_4343W", + "TFM_OUTPUT_EXT": "hex" }, "CY8CKIT_062_WIFI_BT": { "inherits": [ @@ -7104,7 +7064,7 @@ "Target" ], "public": false, - "extra_labels": [ + "extra_labels_add": [ "GigaDevice" ], "supported_toolchains": [ @@ -7112,7 +7072,7 @@ "IAR", "GCC_ARM" ], - "device_has": [ + "device_has_add": [ "USTICKER", "ANALOGIN", "INTERRUPTIN", @@ -7179,9 +7139,11 @@ "GD32F4XX", "GD32F450ZI", "GD_EMAC", - "PSA", "MBED_PSA_SRV" ], + "features_add": [ + "PSA" + ], "device_has_add": [ "RTC", "I2C", diff --git a/tools/config/__init__.py b/tools/config/__init__.py index bc4d95092df..9cc2056b2cc 100755 --- a/tools/config/__init__.py +++ b/tools/config/__init__.py @@ -1,6 +1,6 @@ """ mbed SDK -Copyright (c) 2016 ARM Limited +Copyright (c) 2016-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. @@ -69,7 +69,7 @@ ALLOWED_FEATURES = [ - "BOOTLOADER", "BLE", "LWIP", "STORAGE", "NANOSTACK", "CRYPTOCELL310", + "BOOTLOADER", "BLE", "LWIP", "STORAGE", "NANOSTACK", "CRYPTOCELL310", "PSA", "EXPERIMENTAL_API", ] @@ -707,14 +707,6 @@ def _get_primary_memory_override(self, memory_type): ) if hasattr(self.target, "mbed_{}_size".format(memory_type)): mem_size = getattr(self.target, "mbed_{}_size".format(memory_type)) - if self.target.is_PSA_non_secure_target: - config, _ = self.get_config_data() - mem_start = config.get( - "target.non-secure-{}-start".format(memory_type), mem_start - ).value - mem_size = config.get( - "target.non-secure-{}-size".format(memory_type), mem_size - ).value if mem_start and not isinstance(mem_start, int): mem_start = int(mem_start, 0) if mem_size and not isinstance(mem_size, int): diff --git a/tools/psa/__init__.py b/tools/psa/__init__.py index 6498cec529e..1b5e10d257f 100644 --- a/tools/psa/__init__.py +++ b/tools/psa/__init__.py @@ -14,39 +14,3 @@ # 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 os -from tools.resources import FileType - -def find_secure_image(notify, resources, ns_image_path, - configured_s_image_filename, image_type): - """ Find secure image. """ - if configured_s_image_filename is None: - return None - - assert ns_image_path and configured_s_image_filename, \ - 'ns_image_path and configured_s_image_path are mandatory' - assert image_type in [FileType.BIN, FileType.HEX], \ - 'image_type must be of type BIN or HEX' - - image_files = resources.get_file_paths(image_type) - assert image_files, 'No image files found for this target' - - secure_image = next( - (f for f in image_files if - os.path.basename(f) == configured_s_image_filename), None) - secure_image = next( - (f for f in image_files if - os.path.splitext(os.path.basename(f))[0] == - os.path.splitext(os.path.basename(ns_image_path))[0]), - secure_image - ) - - if secure_image: - notify.debug("Secure image file found: %s." % secure_image) - else: - notify.debug("Secure image file %s not found. Aborting." - % configured_s_image_filename) - raise Exception("Required secure image not found.") - - return secure_image diff --git a/tools/psa/tfm/bin_utils/assemble.py b/tools/psa/tfm/bin_utils/assemble.py index 143d92bdb0c..5a754246994 100644 --- a/tools/psa/tfm/bin_utils/assemble.py +++ b/tools/psa/tfm/bin_utils/assemble.py @@ -25,7 +25,7 @@ import re import os import shutil -from . import macro_parser +import macro_parser offset_re = re.compile(r"^\s*RE_([0-9A-Z_]+)_IMAGE_OFFSET\s*=\s*(.*)") size_re = re.compile(r"^\s*RE_([0-9A-Z_]+)_IMAGE_MAX_SIZE\s*=\s*(.*)") diff --git a/tools/psa/tfm/bin_utils/imgtool.py b/tools/psa/tfm/bin_utils/imgtool.py index cfc372743fc..2d1d97bbb9b 100644 --- a/tools/psa/tfm/bin_utils/imgtool.py +++ b/tools/psa/tfm/bin_utils/imgtool.py @@ -19,36 +19,15 @@ import os import re import argparse -from .imgtool_lib import keys -from .imgtool_lib import image -from .imgtool_lib import version +from imgtool_lib import keys +from imgtool_lib import image +from imgtool_lib import version import sys +import macro_parser sign_bin_size_re = re.compile(r"^\s*RE_SIGN_BIN_SIZE\s*=\s*(.*)") image_load_address_re = re.compile(r"^\s*RE_IMAGE_LOAD_ADDRESS\s*=\s*(.*)") -def find_load_address(args): - load_address_re = re.compile(r"^#define\sIMAGE_LOAD_ADDRESS\s+(0x[0-9a-fA-F]+)") - - if os.path.isabs(args.layout): - configFile = args.layout - else: - scriptsDir = os.path.dirname(os.path.abspath(__file__)) - configFile = os.path.join(scriptsDir, args.layout) - - ramLoadAddress = None - with open(configFile, 'r') as flash_layout_file: - for line in flash_layout_file: - m = load_address_re.match(line) - if m is not None: - ramLoadAddress = int(m.group(1), 0) - print("**[INFO]** Writing load address from the macro in " - "flash_layout.h to the image header.. " - + hex(ramLoadAddress) - + " (dec. " + str(ramLoadAddress) + ")") - break - return ramLoadAddress - # Returns the last version number if present, or None if not def get_last_version(path): if (os.path.isfile(path) == False): # Version file not present @@ -131,7 +110,7 @@ def do_sign(args): else: sw_type = "NSPE_SPE" - pad_size = args.pad + pad_size = macro_parser.evaluate_macro(args.layout, sign_bin_size_re, 0, 1) img = image.Image.load(args.infile, version=version_num, header_size=args.header_size, @@ -139,7 +118,7 @@ def do_sign(args): included_header=args.included_header, pad=pad_size) key = keys.load(args.key, args.public_key_format) if args.key else None - ram_load_address = find_load_address(args) + ram_load_address = macro_parser.evaluate_macro(args.layout, image_load_address_re, 0, 1) img.sign(sw_type, key, ram_load_address, args.dependencies) if pad_size: diff --git a/tools/psa/tfm/bin_utils/imgtool_lib/boot_record.py b/tools/psa/tfm/bin_utils/imgtool_lib/boot_record.py index 97212fd7168..76eed98ce05 100644 --- a/tools/psa/tfm/bin_utils/imgtool_lib/boot_record.py +++ b/tools/psa/tfm/bin_utils/imgtool_lib/boot_record.py @@ -15,7 +15,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import print_function import os import sys import cbor diff --git a/tools/psa/tfm/bin_utils/imgtool_lib/image.py b/tools/psa/tfm/bin_utils/imgtool_lib/image.py index 93a454b313f..d790a75f7e4 100644 --- a/tools/psa/tfm/bin_utils/imgtool_lib/image.py +++ b/tools/psa/tfm/bin_utils/imgtool_lib/image.py @@ -209,7 +209,7 @@ def sign(self, sw_type, key, ramLoadAddress, dependencies=None): else: tlv.add('KEY', pub) - sig = key.sign(bytes(self.payload)) + sig = key.sign(self.payload) tlv.add(key.sig_tlv(), sig) self.payload += tlv.get() diff --git a/tools/psa/tfm/bin_utils/imgtool_lib/keys.py b/tools/psa/tfm/bin_utils/imgtool_lib/keys.py index 7ee9671bd57..d129116b0e2 100644 --- a/tools/psa/tfm/bin_utils/imgtool_lib/keys.py +++ b/tools/psa/tfm/bin_utils/imgtool_lib/keys.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # Copyright (c) 2017,2019 Linaro Limited. # Copyright (c) 2017-2019, Arm Limited. # diff --git a/tools/targets/ARM_MUSCA_A1.py b/tools/targets/ARM_MUSCA_A1.py index be1a67dfc40..de541ebe959 100644 --- a/tools/targets/ARM_MUSCA_A1.py +++ b/tools/targets/ARM_MUSCA_A1.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright (c) 2017-2018 ARM Limited +# Copyright (c) 2017-2020 ARM Limited # # SPDX-License-Identifier: Apache-2.0 # @@ -39,7 +39,7 @@ def musca_tfm_bin(t_self, non_secure_bin, secure_bin): if not isdir(tempdir): os.makedirs(tempdir) flash_layout = path_join(MUSCA_A1_BASE, 'partition', 'flash_layout.h') - mcuboot_bin = path_join(MUSCA_A1_BASE, 'prebuilt', 'mcuboot.bin') + mcuboot_bin = path_join(MUSCA_A1_BASE, 'mcuboot.bin') image_macros = path_join(MUSCA_A1_BASE, 'partition', 'image_macros_preprocessed.c') ns_bin_name, ns_bin_ext = splitext(basename(non_secure_bin)) concatenated_bin = path_join(tempdir, 'tfm_' + ns_bin_name + ns_bin_ext) diff --git a/tools/targets/ARM_MUSCA_B1.py b/tools/targets/ARM_MUSCA_B1.py index 41981ebd2d6..64d659ff7ad 100644 --- a/tools/targets/ARM_MUSCA_B1.py +++ b/tools/targets/ARM_MUSCA_B1.py @@ -39,44 +39,64 @@ def musca_tfm_bin(t_self, non_secure_bin, secure_bin): if not isdir(tempdir): os.makedirs(tempdir) flash_layout = path_join(MUSCA_B1_BASE, 'partition', 'flash_layout.h') - mcuboot_bin = path_join(MUSCA_B1_BASE, 'prebuilt', 'mcuboot.bin') - image_macros = path_join(MUSCA_B1_BASE, 'partition', 'image_macros_preprocessed.c') + mcuboot_bin = path_join(MUSCA_B1_BASE, 'mcuboot.bin') + image_macros_s = path_join(MUSCA_B1_BASE, 'partition', 'image_macros_preprocessed_s.c') + image_macros_ns = path_join(MUSCA_B1_BASE, 'partition', 'image_macros_preprocessed_ns.c') + s_bin_name, s_bin_ext = splitext(basename(secure_bin)) + s_signed_bin = path_join(tempdir, s_bin_name + '_signed' + s_bin_ext) ns_bin_name, ns_bin_ext = splitext(basename(non_secure_bin)) - concatenated_bin = path_join(tempdir, 'tfm_' + ns_bin_name + ns_bin_ext) - signed_bin = path_join(tempdir, 'tfm_' + ns_bin_name + '_signed' + ns_bin_ext) + ns_signed_bin = path_join(tempdir, 'tfm_' + ns_bin_name + '_signed' + ns_bin_ext) + concatenated_bin = path_join(tempdir, s_bin_name + '_' + ns_bin_name + '_concat' + ns_bin_ext) - assert os.path.isfile(image_macros) + assert os.path.isfile(image_macros_s) + assert os.path.isfile(image_macros_ns) - #1. Concatenate secure TFM and non-secure mbed binaries - output = Assembly(image_macros, concatenated_bin) - output.add_image(secure_bin, "SECURE") - output.add_image(non_secure_bin, "NON_SECURE") + #1. Run imgtool to sign the secure binary + sign_args = Namespace( + layout=image_macros_s, + key=path_join(SCRIPT_DIR, 'musca_b1-root-rsa-3072.pem'), + public_key_format=None, + align=1, + dependencies=None, + version=version.decode_version('1.0'), + header_size=0x400, + security_counter=None, + rsa_pkcs1_15=False, + included_header=False, + infile=secure_bin, + outfile=s_signed_bin + ) + do_sign(sign_args) - #2. Run imgtool to sign the concatenated binary + #2. Run imgtool to sign the non-secure mbed binary sign_args = Namespace( - layout=image_macros, + layout=image_macros_ns, key=path_join(SCRIPT_DIR, 'musca_b1-root-rsa-3072.pem'), public_key_format=None, align=1, dependencies=None, version=version.decode_version('1.0'), header_size=0x400, - pad=0xE0000, security_counter=None, rsa_pkcs1_15=False, included_header=False, - infile=concatenated_bin, - outfile=signed_bin + infile=non_secure_bin, + outfile=ns_signed_bin ) do_sign(sign_args) + #1. Concatenate signed secure TFM and non-secure mbed binaries + output = Assembly(image_macros_s, concatenated_bin) + output.add_image(s_signed_bin, "SECURE") + output.add_image(ns_signed_bin, "NON_SECURE") + #3. Concatenate mcuboot and signed binary and overwrite mbed built binary file mcuboot_image_size = find_bl2_size(flash_layout) - with open(mcuboot_bin, "rb") as mcuboot_fh, open(signed_bin, "rb") as signed_fh: + with open(mcuboot_bin, "rb") as mcuboot_fh, open(concatenated_bin, "rb") as concat_fh: with open(non_secure_bin, "w+b") as out_fh: out_fh.write(mcuboot_fh.read()) out_fh.seek(mcuboot_image_size) - out_fh.write(signed_fh.read()) + out_fh.write(concat_fh.read()) def find_bl2_size(configFile): diff --git a/tools/targets/PSOC6.py b/tools/targets/PSOC6.py index 8d2a4a72b23..b906937ccc0 100644 --- a/tools/targets/PSOC6.py +++ b/tools/targets/PSOC6.py @@ -1,6 +1,7 @@ # # Copyright (c) 2017-2018 Future Electronics # Copyright (c) 2018-2019 Cypress Semiconductor Corporation +# 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. @@ -134,8 +135,6 @@ def find_cm0_image(toolchain, resources, elf, hexf, hex_filename): from tools.resources import FileType hex_files = resources.get_file_paths(FileType.HEX) m0hexf = next((f for f in hex_files if os.path.basename(f) == hex_filename), None) - if toolchain.target.is_PSA_non_secure_target: - m0hexf = next((f for f in hex_files if os.path.basename(f) == os.path.basename(hexf)), m0hexf) if m0hexf: toolchain.notify.info("M0 core image file found: %s." % m0hexf) diff --git a/tools/targets/__init__.py b/tools/targets/__init__.py index 4db6d21fdc9..9bb5467f6b7 100644 --- a/tools/targets/__init__.py +++ b/tools/targets/__init__.py @@ -22,14 +22,20 @@ import shutil import inspect import sys + from collections import namedtuple from copy import copy from future.utils import raise_from from tools.resources import FileType +from tools.settings import ROOT from tools.targets.LPC import patch from tools.paths import TOOLS_BOOTLOADERS from tools.utils import json_file_to_dict, NotSupportedException -from tools.psa import find_secure_image + +# Add PSA TF-M binary utility scripts in system path +from os.path import dirname, abspath, join +TFM_SCRIPTS = abspath(join(dirname(__file__), '..', 'psa', 'tfm', 'bin_utils')) +sys.path.insert(0, TFM_SCRIPTS) __all__ = ["target", "TARGETS", "TARGET_MAP", "TARGET_NAMES", "CORE_LABELS", @@ -396,12 +402,12 @@ def is_TrustZone_target(self): return self.is_TrustZone_non_secure_target @property - def is_PSA_non_secure_target(self): - return 'NSPE_Target' in self.labels + def is_PSA_target(self): + return 'PSA' in self.features @property def is_TFM_target(self): - return getattr(self, 'tfm_target_name', False) + return 'TFM' in self.labels def get_post_build_hook(self, toolchain_labels): """Initialize the post-build hooks for a toolchain. For now, this @@ -646,7 +652,6 @@ def binary_hook(t_self, resources, elf, binf): from tools.targets.REALTEK_RTL8195AM import rtl8195a_elf2bin rtl8195a_elf2bin(t_self, elf, binf) - class PSOC6Code(object): @staticmethod def complete(t_self, resources, elf, binf): @@ -709,20 +714,38 @@ def binary_hook(t_self, resources, elf, binf): ) musca_tfm_bin(t_self, binf, secure_bin) -class LPC55S69Code(object): - """LPC55S69 Hooks""" - @staticmethod - def binary_hook(t_self, resources, elf, binf): - from tools.targets.LPC55S69 import lpc55s69_complete - configured_secure_image_filename = t_self.target.secure_image_filename - secure_bin = find_secure_image( - t_self.notify, - resources, - binf, - configured_secure_image_filename, - FileType.BIN - ) - lpc55s69_complete(t_self, binf, secure_bin) +def find_secure_image(notify, resources, ns_image_path, + configured_s_image_filename, image_type): + """ Find secure image. """ + if configured_s_image_filename is None: + return None + + assert ns_image_path and configured_s_image_filename, \ + 'ns_image_path and configured_s_image_path are mandatory' + assert image_type in [FileType.BIN, FileType.HEX], \ + 'image_type must be of type BIN or HEX' + + image_files = resources.get_file_paths(image_type) + assert image_files, 'No image files found for this target' + + secure_image = next( + (f for f in image_files if + os.path.basename(f) == configured_s_image_filename), None) + secure_image = next( + (f for f in image_files if + os.path.splitext(os.path.basename(f))[0] == + os.path.splitext(os.path.basename(ns_image_path))[0]), + secure_image + ) + + if secure_image: + notify.debug("Secure image file found: %s." % secure_image) + else: + notify.debug("Secure image file %s not found. Aborting." + % configured_s_image_filename) + raise Exception("Required secure image not found.") + + return secure_image class M2351Code(object): """M2351 Hooks""" diff --git a/tools/test/examples/examples.json b/tools/test/examples/examples.json index 8ab2edecc4d..3e0ae311865 100644 --- a/tools/test/examples/examples.json +++ b/tools/test/examples/examples.json @@ -333,6 +333,22 @@ "compare_log": ["mbed-os-example-mbed-crypto/tests/getting-started.log"], "auto-update" : true }, + { + "name": "mbed-os-example-psa", + "github":"https://github.com/ARMmbed/mbed-os-example-psa", + "sub-repo-example": false, + "subs": [], + "features" : [], + "targets" : ["ARM_MUSCA_A1", "ARM_MUSCA_B1", "K64F", "CY8CKIT_064S2_4343W"], + "toolchains" : ["GCC_ARM", "ARM"], + "exporters": [], + "compile" : true, + "export": true, + "test" : true, + "baud_rate": 115200, + "compare_log": ["mbed-os-example-psa/tests/psa.log"], + "auto-update" : true + }, { "name": "mbed-os-example-nfc", "github": "https://github.com/ARMmbed/mbed-os-example-nfc", diff --git a/tools/test/psa/psa_target_config_test.py b/tools/test/psa/psa_target_config_test.py new file mode 100644 index 00000000000..518d03c907f --- /dev/null +++ b/tools/test/psa/psa_target_config_test.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +""" +Copyright (c) 2019-2020 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. +""" + + +import pytest + +from tools.targets import TARGETS + +def test_psa_target_attributes(): + psa_targets = (tar for tar in TARGETS + if tar.is_TFM_target) + + for tar in psa_targets: + msg = "tfm_target_name attribute cannot be empty" + assert(tar.tfm_target_name != ""), msg + msg = "tfm_bootloader_supported attribute cannot be empty" + assert(tar.tfm_bootloader_supported != ""), msg + msg = "tfm_default_toolchain attribute cannot be empty" + assert(tar.tfm_default_toolchain != ""), msg + msg = "tfm_supported_toolchains attribute cannot be empty" + assert(tar.tfm_supported_toolchains != ""), msg + msg = "delivery_dir attribute cannot be empty" + assert(tar.tfm_delivery_dir != ""), msg + diff --git a/tools/test/targets/target_test.py b/tools/test/targets/target_test.py index d81bf9e35d2..9fc7b2662c4 100644 --- a/tools/test/targets/target_test.py +++ b/tools/test/targets/target_test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ mbed - Copyright (c) 2017-2017 ARM Limited + Copyright (c) 2017-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. @@ -29,8 +29,10 @@ from contextlib import contextmanager import pytest -from tools.targets import TARGETS, TARGET_MAP, Target, update_target_data +from tools.targets import TARGETS, TARGET_MAP, Target, update_target_data, find_secure_image from tools.arm_pack_manager import Cache +from tools.notifier.mock import MockNotifier +from tools.resources import Resources, FileType def test_device_name(): @@ -166,3 +168,38 @@ def test_modify_existing_target(): # The existing target should not be modified by custom targets assert TARGET_MAP["Test_Target"].default_toolchain != 'GCC_ARM' assert TARGET_MAP["Test_Target"].bootloader_supported != True + +def test_find_secure_image(): + mock_notifier = MockNotifier() + mock_resources = Resources(mock_notifier) + ns_image_path = os.path.join('BUILD', 'TARGET_NS', 'app.bin') + ns_test_path = os.path.join('BUILD', 'TARGET_NS', 'test.bin') + config_s_image_name = 'target_config.bin' + default_bin = os.path.join('prebuilt', config_s_image_name) + test_bin = os.path.join('prebuilt', 'test.bin') + + with pytest.raises(Exception, match='ns_image_path and configured_s_image_path are mandatory'): + find_secure_image(mock_notifier, mock_resources, None, None, FileType.BIN) + find_secure_image(mock_notifier, mock_resources, ns_image_path, None, FileType.BIN) + find_secure_image(mock_notifier, mock_resources, None, config_s_image_name, FileType.BIN) + + with pytest.raises(Exception, match='image_type must be of type BIN or HEX'): + find_secure_image(mock_notifier, mock_resources, ns_image_path, config_s_image_name, None) + find_secure_image(mock_notifier, mock_resources, ns_image_path, config_s_image_name, FileType.C_SRC) + + with pytest.raises(Exception, match='No image files found for this target'): + find_secure_image(mock_notifier, mock_resources, ns_image_path, config_s_image_name, FileType.BIN) + + dummy_bin = os.path.join('path', 'to', 'dummy.bin') + mock_resources.add_file_ref(FileType.BIN, dummy_bin, dummy_bin) + + with pytest.raises(Exception, match='Required secure image not found'): + find_secure_image(mock_notifier, mock_resources, ns_image_path, config_s_image_name, FileType.BIN) + + mock_resources.add_file_ref(FileType.BIN, default_bin, default_bin) + mock_resources.add_file_ref(FileType.BIN, test_bin, test_bin) + secure_image = find_secure_image(mock_notifier, mock_resources, ns_image_path, config_s_image_name, FileType.BIN) + assert secure_image == default_bin + + secure_image = find_secure_image(mock_notifier, mock_resources, ns_test_path, config_s_image_name, FileType.BIN) + assert secure_image == test_bin diff --git a/tools/tests.py b/tools/tests.py index 8109f43cdbc..ba42e0d3e98 100644 --- a/tools/tests.py +++ b/tools/tests.py @@ -1,6 +1,6 @@ """ mbed SDK -Copyright (c) 2011-2013 ARM Limited +Copyright (c) 2011-2020 ARM Limited SPDX-License-Identifier: Apache-2.0 Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,13 +25,16 @@ CORTEX_ARM_SUPPORT = {} for target in TARGETS: - DEFAULT_SUPPORT[target.name] = target.supported_toolchains - - if target.core.startswith('Cortex'): - CORTEX_ARM_SUPPORT[target.name] = [ - t for t in target.supported_toolchains - if (t == 'ARM' or t == 'uARM') - ] + # Do not check for Mbed OS target default attributes in case of targets + # which support TF-M. + if not target.is_TFM_target: + DEFAULT_SUPPORT[target.name] = target.supported_toolchains + + if target.core.startswith('Cortex'): + CORTEX_ARM_SUPPORT[target.name] = [ + t for t in target.supported_toolchains + if (t == 'ARM' or t == 'uARM') + ] TEST_CMSIS_LIB = join(TEST_DIR, "cmsis", "lib") TEST_MBED_LIB = join(TEST_DIR, "mbed", "env") diff --git a/tools/toolchains/gcc.py b/tools/toolchains/gcc.py index 8656b2c510c..c3a4ef8266f 100644 --- a/tools/toolchains/gcc.py +++ b/tools/toolchains/gcc.py @@ -1,6 +1,6 @@ """ mbed SDK -Copyright (c) 2011-2013 ARM Limited +Copyright (c) 2011-2020 ARM Limited SPDX-License-Identifier: Apache-2.0 Licensed under the Apache License, Version 2.0 (the "License"); @@ -92,7 +92,8 @@ def __init__(self, target, notify=None, macros=None, build_profile=None, self.flags["ld"].append(minimal_printf_wrap) self.cpu = [] - if target.is_TrustZone_non_secure_target: + # Enable DOMAIN_NS macro for TF-M NS targets + if target.is_TFM_target: # Add linking time preprocessor macro DOMAIN_NS # (DOMAIN_NS is passed to compiler and assembler via CORTEX_SYMBOLS # in mbedToolchain.get_symbols)