From 094683d291f32c1a4c134c69c662e03f47e6ce17 Mon Sep 17 00:00:00 2001 From: ChickenLover Date: Thu, 9 May 2024 15:13:43 +0700 Subject: [PATCH] Feat/roman/poseidon2 (#507) This PR adds support for poseidon2 permutation function as described in https://eprint.iacr.org/2023/323.pdf Reference implementations used (and compared against): https://github.com/HorizenLabs/poseidon2/tree/main https://github.com/Plonky3/Plonky3/tree/main Tasks: - [x] Remove commented code and prints - [ ] Add doc-comments to functions and structs - [x] Fix possible issue with Plonky3 imports - [x] Update NTT/Plonky3 test - [x] Add Plonky3-bn254 test (impossible) --- .gitignore | 3 +- icicle/include/fields/field.cuh | 11 + .../poseidon2/constants/babybear_poseidon2.h | 1068 +++++++++++++ .../poseidon2/constants/bn254_poseidon2.h | 1365 +++++++++++++++++ .../constants/poseidon2_rust_params.sage | 705 +++++++++ icicle/include/poseidon2/poseidon2.cuh | 130 ++ icicle/src/fields/CMakeLists.txt | 5 + icicle/src/poseidon2/.gitignore | 2 + icicle/src/poseidon2/Makefile | 7 + icicle/src/poseidon2/constants.cu | 120 ++ icicle/src/poseidon2/extern.cu | 63 + icicle/src/poseidon2/kernels.cu | 233 +++ icicle/src/poseidon2/poseidon.cu | 76 + icicle/src/poseidon2/test.cu | 1101 +++++++++++++ wrappers/rust/icicle-core/Cargo.toml | 3 +- wrappers/rust/icicle-core/src/field.rs | 7 + wrappers/rust/icicle-core/src/lib.rs | 1 + .../rust/icicle-core/src/poseidon/tests.rs | 7 +- .../rust/icicle-core/src/poseidon2/mod.rs | 384 +++++ .../rust/icicle-core/src/poseidon2/tests.rs | 105 ++ wrappers/rust/icicle-core/src/traits.rs | 1 + .../icicle-curves/icicle-bn254/src/lib.rs | 2 + .../icicle-bn254/src/poseidon2/mod.rs | 35 + .../icicle-fields/icicle-babybear/Cargo.toml | 11 +- .../icicle-fields/icicle-babybear/src/lib.rs | 1 + .../icicle-babybear/src/ntt/mod.rs | 4 +- .../icicle-babybear/src/poseidon2/mod.rs | 633 ++++++++ 27 files changed, 6070 insertions(+), 13 deletions(-) create mode 100644 icicle/include/poseidon2/constants/babybear_poseidon2.h create mode 100644 icicle/include/poseidon2/constants/bn254_poseidon2.h create mode 100644 icicle/include/poseidon2/constants/poseidon2_rust_params.sage create mode 100644 icicle/include/poseidon2/poseidon2.cuh create mode 100644 icicle/src/poseidon2/.gitignore create mode 100644 icicle/src/poseidon2/Makefile create mode 100644 icicle/src/poseidon2/constants.cu create mode 100644 icicle/src/poseidon2/extern.cu create mode 100644 icicle/src/poseidon2/kernels.cu create mode 100644 icicle/src/poseidon2/poseidon.cu create mode 100644 icicle/src/poseidon2/test.cu create mode 100644 wrappers/rust/icicle-core/src/poseidon2/mod.rs create mode 100644 wrappers/rust/icicle-core/src/poseidon2/tests.rs create mode 100644 wrappers/rust/icicle-curves/icicle-bn254/src/poseidon2/mod.rs create mode 100644 wrappers/rust/icicle-fields/icicle-babybear/src/poseidon2/mod.rs diff --git a/.gitignore b/.gitignore index 29fb6b74..efe26533 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.so *.nsys-rep *.ncu-rep +*.sage.py **/target **/.vscode **/.*lock*csv# @@ -17,5 +18,3 @@ **/icicle/build/ **/wrappers/rust/icicle-cuda-runtime/src/bindings.rs **/build* -**/icicle/appUtils/large_ntt/work -icicle/appUtils/large_ntt/work/test_ntt diff --git a/icicle/include/fields/field.cuh b/icicle/include/fields/field.cuh index 11558e35..2c2bdd0a 100644 --- a/icicle/include/fields/field.cuh +++ b/icicle/include/fields/field.cuh @@ -125,6 +125,17 @@ public: struct Wide { ff_wide_storage limbs_storage; + static constexpr Wide HOST_DEVICE_INLINE from_field(const Field& xs) + { + Wide out{}; +#ifdef __CUDA_ARCH__ + UNROLL +#endif + for (unsigned i = 0; i < TLC; i++) + out.limbs_storage.limbs[i] = xs.limbs_storage.limbs[i]; + return out; + } + static constexpr Field HOST_DEVICE_INLINE get_lower(const Wide& xs) { Field out{}; diff --git a/icicle/include/poseidon2/constants/babybear_poseidon2.h b/icicle/include/poseidon2/constants/babybear_poseidon2.h new file mode 100644 index 00000000..b537ff1d --- /dev/null +++ b/icicle/include/poseidon2/constants/babybear_poseidon2.h @@ -0,0 +1,1068 @@ +#pragma once +#ifndef BABYBEAR_POSEIDON2_H +#define BABYBEAR_POSEIDON2_H + +namespace poseidon2_constants_babybear { + + namespace t2 { + int internal_rounds = 24; + + int alpha = 7; + + unsigned char mat_diag_m_1[] = { + 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + }; + + unsigned char round_constants[] = { + 0x2a, 0x93, 0xa8, 0x76, + 0x43, 0x25, 0xb3, 0x0b, + 0x80, 0x1a, 0xa1, 0x54, + 0x89, 0x93, 0xf0, 0x29, + 0xc1, 0x8e, 0x8a, 0x4b, + 0xa2, 0xf7, 0xa2, 0x3f, + 0x0c, 0xfd, 0xe3, 0x2b, + 0x3d, 0x0c, 0xb7, 0x6a, + 0xf1, 0xe8, 0xd8, 0x0c, + 0xf0, 0xc8, 0x34, 0x3a, + 0x77, 0xbf, 0x11, 0x3c, + 0xf3, 0x37, 0xeb, 0x27, + 0xcd, 0xaf, 0xdc, 0x06, + 0x2a, 0x4b, 0xfd, 0x19, + 0xc3, 0x65, 0xcd, 0x1c, + 0xc2, 0xa0, 0x33, 0x37, + 0x54, 0x37, 0xb4, 0x18, + 0x76, 0x40, 0xd7, 0x2e, + 0xa6, 0x93, 0x8f, 0x36, + 0xcd, 0x24, 0x80, 0x0e, + 0x9a, 0x28, 0x8f, 0x3b, + 0x7b, 0xfa, 0x5a, 0x4f, + 0x68, 0x2b, 0xc8, 0x64, + 0x80, 0x56, 0x24, 0x76, + 0x2f, 0xac, 0xb4, 0x1a, + 0x8e, 0xf6, 0xa5, 0x3c, + 0xb1, 0x49, 0xbd, 0x14, + 0x15, 0x3b, 0xd0, 0x52, + 0xb3, 0x74, 0xcd, 0x08, + 0x2a, 0x15, 0xdb, 0x1e, + 0x7a, 0x49, 0x37, 0x30, + 0xec, 0x68, 0x8a, 0x49, + 0x28, 0xf2, 0x11, 0x6b, + 0x94, 0x41, 0x21, 0x21, + 0xba, 0xe0, 0x0b, 0x64, + 0x41, 0x82, 0xd1, 0x4b, + 0x34, 0x46, 0x09, 0x20, + 0xd8, 0x22, 0x6e, 0x12, + 0xd1, 0x13, 0xd2, 0x42, + 0x27, 0xb6, 0x7d, 0x66, + 0xa8, 0x5e, 0x34, 0x29, + 0xfa, 0xed, 0x79, 0x4e, + 0x20, 0xbc, 0x2a, 0x02, + 0xca, 0xe6, 0xa8, 0x36, + 0x45, 0x1d, 0xf1, 0x05, + 0x22, 0x46, 0x1d, 0x31, + 0x98, 0x75, 0x6d, 0x34, + 0xf3, 0x8e, 0xb1, 0x61, + }; + } + + + namespace t3 { + int internal_rounds = 17; + + int alpha = 7; + + unsigned char mat_diag_m_1[] = { + 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + }; + + unsigned char round_constants[] = { + 0x97, 0x6c, 0x0c, 0x46, + 0x45, 0x13, 0x3f, 0x76, + 0x69, 0xb9, 0x4f, 0x35, + 0x4d, 0x24, 0x50, 0x06, + 0xad, 0x7b, 0x2c, 0x74, + 0xe6, 0xe4, 0x0a, 0x42, + 0x2f, 0x92, 0xb1, 0x24, + 0x87, 0x84, 0xb3, 0x54, + 0x25, 0xa5, 0xd8, 0x67, + 0xd8, 0x21, 0x37, 0x0e, + 0x61, 0xf2, 0xb8, 0x4b, + 0x12, 0x0d, 0x83, 0x67, + 0x6c, 0x9a, 0x12, 0x70, + 0xe0, 0x69, 0xba, 0x11, + 0x41, 0xf8, 0x3b, 0x46, + 0x2f, 0xa6, 0xd4, 0x32, + 0x81, 0x89, 0x27, 0x67, + 0x1f, 0x5c, 0x95, 0x13, + 0x20, 0x90, 0x60, 0x26, + 0x76, 0x77, 0xf5, 0x38, + 0x0d, 0x14, 0x84, 0x46, + 0x72, 0xfa, 0x37, 0x09, + 0xd0, 0x9e, 0x9c, 0x03, + 0x4e, 0x4f, 0x8c, 0x0a, + 0x4d, 0x32, 0x53, 0x43, + 0x28, 0xac, 0x70, 0x00, + 0x9b, 0xe9, 0xb3, 0x1b, + 0xd0, 0x72, 0xbe, 0x4e, + 0xd3, 0xc2, 0x5d, 0x26, + 0xf7, 0x49, 0x77, 0x01, + 0x86, 0x5d, 0x26, 0x69, + 0x42, 0x98, 0x8c, 0x0e, + 0x82, 0xd7, 0x0c, 0x4c, + 0x61, 0x43, 0x37, 0x64, + 0x74, 0x51, 0x8e, 0x15, + 0x75, 0x65, 0x5c, 0x0b, + 0xc2, 0x66, 0x7a, 0x08, + 0x98, 0xa4, 0xaf, 0x67, + 0x22, 0x09, 0x7f, 0x1b, + 0xdd, 0x8c, 0xb4, 0x25, + 0xfc, 0x9a, 0x91, 0x01, + 0x57, 0xff, 0x3a, 0x52, + 0xf8, 0x0c, 0x00, 0x3c, + 0x9a, 0x7c, 0x00, 0x21, + 0xa1, 0x14, 0xf6, 0x3d, + 0x29, 0xa3, 0x9c, 0x6f, + 0xcf, 0x10, 0xfe, 0x17, + 0xa1, 0xc1, 0x58, 0x18, + 0xfe, 0xc6, 0x79, 0x67, + 0x2c, 0xa1, 0x4c, 0x0a, + 0x4d, 0x0c, 0x18, 0x36, + 0x59, 0x7e, 0xd1, 0x54, + 0xd8, 0xab, 0xbc, 0x23, + }; + } + + + namespace t4 { + int internal_rounds = 21; + + int alpha = 7; + + unsigned char mat_diag_m_1[] = { + 0x47, 0x6f, 0xbf, 0x35, + 0x9f, 0x66, 0x82, 0x69, + 0xb2, 0x52, 0xf8, 0x41, + 0xb8, 0xda, 0x5c, 0x37, + }; + + unsigned char round_constants[] = { + 0x6a, 0x9b, 0x14, 0x1b, + 0x3b, 0xda, 0x0a, 0x55, + 0x72, 0x0f, 0x88, 0x22, + 0xde, 0x76, 0x29, 0x16, + 0x5b, 0x03, 0x59, 0x14, + 0x51, 0xb8, 0x23, 0x5b, + 0x50, 0x6c, 0xcb, 0x0e, + 0x6e, 0x90, 0x25, 0x5e, + 0x64, 0x79, 0x62, 0x2e, + 0x43, 0xaf, 0xed, 0x13, + 0x1a, 0xa9, 0x39, 0x0f, + 0xb2, 0x36, 0x10, 0x4d, + 0x71, 0x1a, 0x15, 0x07, + 0x2c, 0xd3, 0x88, 0x06, + 0x08, 0x23, 0x0c, 0x64, + 0xc0, 0x3a, 0x82, 0x4a, + 0x1a, 0x06, 0x4a, 0x66, + 0x76, 0x92, 0x5f, 0x73, + 0x59, 0xaa, 0x33, 0x1d, + 0xad, 0x66, 0x42, 0x44, + 0xc1, 0x8d, 0xa9, 0x65, + 0x1c, 0x7e, 0x0f, 0x21, + 0xeb, 0x29, 0xc4, 0x05, + 0xd5, 0xf1, 0xc9, 0x12, + 0x08, 0x69, 0xe1, 0x56, + 0x0f, 0x00, 0xc4, 0x2c, + 0x5d, 0x17, 0xc1, 0x4c, + 0x0c, 0x83, 0x96, 0x46, + 0x5e, 0xab, 0x76, 0x72, + 0x80, 0xe5, 0x29, 0x04, + 0x35, 0xdf, 0xad, 0x1e, + 0x4b, 0x81, 0x04, 0x3d, + 0x0c, 0xd1, 0xe9, 0x0c, + 0xb2, 0xd2, 0x1b, 0x0c, + 0x62, 0xfe, 0x0a, 0x5c, + 0x5c, 0xd0, 0xd3, 0x41, + 0xa8, 0xfb, 0xa8, 0x4e, + 0x73, 0x59, 0x41, 0x36, + 0x2b, 0x2a, 0x6c, 0x1f, + 0xc9, 0x47, 0xc4, 0x0f, + 0x31, 0xec, 0x06, 0x0e, + 0x3b, 0x0d, 0x9e, 0x75, + 0x9d, 0x8b, 0x92, 0x53, + 0x41, 0x1a, 0x03, 0x1f, + 0xdc, 0x57, 0x43, 0x08, + 0x08, 0x4a, 0xa4, 0x18, + 0x22, 0x99, 0x97, 0x4e, + 0x7e, 0x77, 0x1b, 0x59, + 0x28, 0xaa, 0x98, 0x16, + 0xe2, 0xed, 0x89, 0x6c, + 0xeb, 0x1e, 0x94, 0x49, + 0x66, 0x14, 0xd7, 0x23, + 0x20, 0xef, 0xa1, 0x4c, + }; + } + + + namespace t8 { + int internal_rounds = 12; + + int alpha = 7; + + unsigned char mat_diag_m_1[] = { + 0x1b, 0x69, 0xa3, 0x17, + 0x79, 0x98, 0x84, 0x00, + 0xe3, 0x62, 0x7b, 0x1f, + 0x10, 0x7b, 0x96, 0x05, + 0x5a, 0x86, 0x7c, 0x42, + 0xae, 0x41, 0x33, 0x3f, + 0x5b, 0x0f, 0x49, 0x52, + 0xc5, 0x46, 0x88, 0x46, + }; + + unsigned char round_constants[] = { + 0xde, 0x8c, 0x97, 0x11, + 0xcd, 0xaa, 0x1b, 0x53, + 0x61, 0x3e, 0xfc, 0x62, + 0xd7, 0x43, 0x54, 0x6c, + 0xea, 0x7b, 0x3f, 0x21, + 0x50, 0xaf, 0x1d, 0x44, + 0xca, 0xb0, 0x73, 0x5b, + 0x8a, 0x45, 0xac, 0x37, + 0x2a, 0x45, 0x8d, 0x57, + 0x69, 0xd8, 0x05, 0x11, + 0x21, 0x25, 0x97, 0x5f, + 0x88, 0xc6, 0x8a, 0x63, + 0x6c, 0x20, 0xbb, 0x22, + 0x4b, 0xb7, 0x2b, 0x3d, + 0x9e, 0x65, 0xb3, 0x08, + 0x35, 0x40, 0x99, 0x5c, + 0xb5, 0x23, 0xf8, 0x0b, + 0x71, 0x6f, 0x12, 0x0f, + 0x22, 0x0e, 0x3f, 0x4b, + 0x79, 0xc9, 0x74, 0x32, + 0xde, 0x2f, 0x7e, 0x2a, + 0x43, 0xfc, 0x5e, 0x4c, + 0x78, 0x0a, 0xc1, 0x51, + 0x9b, 0x54, 0x63, 0x1b, + 0x23, 0x48, 0x6b, 0x3f, + 0xa4, 0x9d, 0x3d, 0x4e, + 0x1c, 0xe9, 0x9f, 0x66, + 0x31, 0x72, 0xf2, 0x51, + 0x6c, 0x6c, 0xeb, 0x47, + 0xdb, 0x68, 0xbe, 0x2c, + 0x0d, 0xb2, 0x09, 0x3a, + 0x02, 0x3c, 0xcd, 0x19, + 0x5e, 0xb9, 0x69, 0x3d, + 0x02, 0x8f, 0xe0, 0x47, + 0x24, 0x1f, 0xd5, 0x73, + 0x99, 0x9a, 0x68, 0x18, + 0x9d, 0x8b, 0x7d, 0x2d, + 0x71, 0xc9, 0x19, 0x2a, + 0x15, 0xbd, 0xfe, 0x0a, + 0xff, 0xa7, 0xb8, 0x69, + 0x3b, 0x0d, 0xb2, 0x1b, + 0x59, 0x27, 0xfa, 0x24, + 0x1d, 0xf7, 0x34, 0x73, + 0xb1, 0x30, 0xe2, 0x09, + 0x0d, 0xf5, 0x94, 0x07, + 0x12, 0x22, 0x4d, 0x07, + 0x20, 0x8f, 0x6c, 0x1a, + 0xf5, 0xe8, 0xab, 0x1b, + 0x2e, 0x5c, 0xd1, 0x16, + 0xfc, 0xb5, 0xfb, 0x49, + 0x83, 0xf3, 0xcd, 0x1e, + 0xbc, 0xc7, 0x3d, 0x06, + 0x85, 0x4a, 0x5d, 0x54, + 0x4c, 0x50, 0x49, 0x6a, + 0x0c, 0x67, 0x43, 0x38, + 0x69, 0x05, 0x6e, 0x58, + 0xdd, 0x01, 0xa8, 0x2a, + 0x42, 0xaf, 0xb4, 0x38, + 0xae, 0xcc, 0x37, 0x59, + 0xa6, 0x72, 0x7d, 0x2d, + 0xd1, 0x5b, 0x1a, 0x51, + 0x54, 0xf5, 0xc9, 0x0d, + 0x6e, 0x28, 0x3e, 0x2c, + 0xbe, 0x45, 0x2b, 0x30, + 0xcc, 0x5f, 0xe0, 0x6e, + 0x46, 0x86, 0x63, 0x27, + 0xa2, 0xc4, 0x6f, 0x2b, + 0x13, 0xb9, 0x10, 0x4c, + 0xd2, 0x71, 0x04, 0x42, + 0xd2, 0x08, 0xb9, 0x29, + 0xd5, 0x7f, 0xf9, 0x33, + 0xc5, 0x4f, 0x83, 0x06, + 0xed, 0xe4, 0xbe, 0x70, + 0x41, 0x75, 0xe5, 0x4f, + 0x99, 0x9e, 0x0e, 0x62, + 0xe6, 0xad, 0x55, 0x63, + }; + } + + + namespace t12 { + int internal_rounds = 10; + + int alpha = 7; + + unsigned char mat_diag_m_1[] = { + 0x7f, 0xd1, 0xe6, 0x5c, + 0x07, 0x01, 0x2b, 0x39, + 0x4c, 0x12, 0xbd, 0x0c, + 0xb6, 0x99, 0xf0, 0x06, + 0xb4, 0xeb, 0xb3, 0x6c, + 0xb1, 0x69, 0x30, 0x36, + 0x37, 0x7c, 0xe4, 0x4d, + 0x0b, 0x5a, 0xaf, 0x06, + 0x5e, 0x04, 0xa0, 0x52, + 0x0d, 0x38, 0x9f, 0x3e, + 0x1e, 0xc1, 0xf8, 0x0d, + 0x85, 0x29, 0xa3, 0x63, + }; + + unsigned char round_constants[] = { + 0x88, 0xbb, 0xd3, 0x44, + 0xc9, 0x48, 0x41, 0x77, + 0x5e, 0x42, 0x62, 0x15, + 0x8b, 0x62, 0x70, 0x50, + 0x90, 0x94, 0x79, 0x68, + 0x2e, 0x43, 0x6f, 0x04, + 0x58, 0x43, 0x2e, 0x0f, + 0x49, 0x90, 0xc9, 0x53, + 0x51, 0x60, 0x1c, 0x75, + 0x5a, 0xbc, 0x9e, 0x5b, + 0xf0, 0x93, 0x88, 0x05, + 0x7d, 0xdd, 0xd5, 0x0d, + 0xac, 0x4e, 0x2b, 0x4c, + 0xe0, 0x8b, 0x52, 0x5a, + 0xc3, 0xbc, 0x5f, 0x67, + 0x60, 0x9d, 0x0c, 0x74, + 0xc2, 0xde, 0xc6, 0x4b, + 0xe4, 0xa8, 0xc5, 0x23, + 0x8c, 0xbd, 0x89, 0x31, + 0x5c, 0x18, 0xce, 0x11, + 0x90, 0xbb, 0xb9, 0x68, + 0x8f, 0x9d, 0x0e, 0x67, + 0xbc, 0xad, 0x3e, 0x70, + 0xf0, 0xfa, 0x02, 0x71, + 0xaa, 0x38, 0x68, 0x57, + 0xc6, 0x76, 0x6c, 0x1b, + 0xb4, 0x00, 0xf5, 0x51, + 0xb6, 0x39, 0xd6, 0x15, + 0xc9, 0x45, 0x02, 0x5c, + 0xbb, 0xf3, 0x8d, 0x6f, + 0x2b, 0xc3, 0x0c, 0x4d, + 0x8b, 0xc0, 0xb3, 0x47, + 0x3c, 0x2b, 0x29, 0x19, + 0xbe, 0x30, 0x62, 0x09, + 0x43, 0x9b, 0x3c, 0x17, + 0xfa, 0x58, 0x35, 0x25, + 0xae, 0x7b, 0x78, 0x72, + 0xb3, 0x9d, 0xca, 0x47, + 0x4b, 0x4b, 0x23, 0x44, + 0x93, 0xde, 0x47, 0x4f, + 0x57, 0xf5, 0x09, 0x73, + 0xf8, 0x13, 0x71, 0x0e, + 0x02, 0xa8, 0xcf, 0x5c, + 0x30, 0x4e, 0xf8, 0x45, + 0x5f, 0x06, 0x8a, 0x51, + 0x59, 0xf5, 0x6d, 0x2f, + 0x68, 0x5d, 0x81, 0x69, + 0xa1, 0xe8, 0x3f, 0x27, + 0x63, 0x77, 0x31, 0x43, + 0x9e, 0xc8, 0xe4, 0x74, + 0x7e, 0x2b, 0x16, 0x42, + 0xa5, 0xf9, 0xa3, 0x2e, + 0x04, 0x0c, 0xb3, 0x2b, + 0x74, 0x44, 0x74, 0x24, + 0x0b, 0xa4, 0xe8, 0x69, + 0x70, 0x1c, 0x95, 0x50, + 0xbf, 0x91, 0xff, 0x47, + 0xc6, 0x98, 0x7f, 0x5d, + 0xc0, 0xac, 0xce, 0x2b, + 0x3b, 0x2f, 0xa2, 0x32, + 0x64, 0x46, 0x4b, 0x6e, + 0x7c, 0x90, 0xd5, 0x45, + 0x10, 0x3f, 0xa6, 0x2a, + 0x6d, 0xb3, 0xed, 0x48, + 0xf9, 0xa0, 0xe8, 0x4c, + 0xfe, 0x73, 0x06, 0x19, + 0x23, 0x83, 0x87, 0x74, + 0x5b, 0x3e, 0x95, 0x0c, + 0xb8, 0x1b, 0x25, 0x6c, + 0x31, 0x00, 0x1b, 0x6a, + 0x44, 0x31, 0xc8, 0x66, + 0x9a, 0x7c, 0xe5, 0x29, + 0xbc, 0xd4, 0xc4, 0x70, + 0x94, 0x5f, 0xef, 0x4a, + 0x14, 0x70, 0x8a, 0x35, + 0xae, 0x8e, 0x8d, 0x07, + 0x10, 0xe8, 0x6b, 0x41, + 0x86, 0xcb, 0xda, 0x77, + 0xc3, 0x8c, 0x95, 0x36, + 0xbd, 0x5d, 0x12, 0x3d, + 0xf2, 0x3b, 0xe4, 0x6c, + 0xe0, 0xb7, 0xe0, 0x16, + 0x32, 0x32, 0xde, 0x50, + 0xa8, 0xfe, 0x66, 0x34, + 0x6d, 0xba, 0xab, 0x1d, + 0xb6, 0xe2, 0xef, 0x5c, + 0xe4, 0x3d, 0xcb, 0x0f, + 0x6a, 0xa8, 0xd0, 0x16, + 0x47, 0xda, 0xb9, 0x2b, + 0x29, 0x3a, 0xab, 0x1a, + 0x0b, 0xda, 0x0a, 0x2e, + 0xb6, 0xe3, 0x3e, 0x3c, + 0xe3, 0x8b, 0x67, 0x3a, + 0x90, 0xe5, 0xfe, 0x19, + 0x04, 0xff, 0x84, 0x00, + 0x25, 0x6b, 0xae, 0x35, + 0x7d, 0xaf, 0x1e, 0x76, + 0xa7, 0xfc, 0xd3, 0x0e, + 0xc4, 0x59, 0x6b, 0x15, + 0xf5, 0x73, 0xe2, 0x55, + 0xf5, 0x07, 0x19, 0x2f, + 0x1d, 0xdd, 0x30, 0x34, + 0xc6, 0x00, 0x16, 0x10, + 0x47, 0x89, 0xb3, 0x66, + 0xe0, 0x50, 0x22, 0x21, + 0x2c, 0xfa, 0xbe, 0x62, + }; + } + + + namespace t16 { + int internal_rounds = 13; + + int alpha = 7; + + unsigned char mat_diag_m_1[] = { + 0x94, 0x2d, 0x63, 0x0a, + 0xb7, 0x57, 0xb6, 0x6d, + 0x9e, 0xdc, 0xfb, 0x56, + 0x8a, 0x3d, 0x2b, 0x05, + 0x01, 0x52, 0x74, 0x33, + 0x8c, 0x10, 0x03, 0x5c, + 0x7b, 0xa3, 0xeb, 0x0b, + 0x8b, 0x2e, 0x8c, 0x25, + 0x39, 0x9f, 0x02, 0x12, + 0xce, 0x09, 0x49, 0x69, + 0x24, 0x17, 0x23, 0x6d, + 0x22, 0xb2, 0xc3, 0x21, + 0xa5, 0x04, 0x09, 0x3c, + 0xda, 0xac, 0xd6, 0x01, + 0x83, 0x5c, 0x70, 0x27, + 0x02, 0xc8, 0x31, 0x52, + }; + + unsigned char round_constants[] = { + 0xaf, 0xb6, 0xcb, 0x69, + 0xf9, 0x93, 0xad, 0x46, + 0x4e, 0x0f, 0xa0, 0x60, + 0xcd, 0x97, 0x12, 0x6b, + 0xfe, 0x9a, 0x18, 0x23, + 0xef, 0x7b, 0x2e, 0x73, + 0xde, 0x46, 0xc2, 0x72, + 0x00, 0x19, 0x94, 0x2c, + 0xde, 0xee, 0x57, 0x05, + 0x6f, 0x49, 0x80, 0x15, + 0x7b, 0xa7, 0x3e, 0x3a, + 0x71, 0xf2, 0xf3, 0x54, + 0x29, 0xb0, 0x49, 0x0f, + 0xe1, 0x2f, 0x87, 0x47, + 0x36, 0x2e, 0x1e, 0x22, + 0x2e, 0x20, 0xb7, 0x1a, + 0xa6, 0x79, 0x77, 0x48, + 0xd8, 0xc9, 0x51, 0x38, + 0xc0, 0x17, 0xdc, 0x38, + 0x49, 0x88, 0x9f, 0x20, + 0xe8, 0xce, 0x8d, 0x26, + 0xda, 0x48, 0x0c, 0x35, + 0x2e, 0xd3, 0x9a, 0x5b, + 0x2b, 0x27, 0x23, 0x05, + 0x5b, 0x05, 0x89, 0x3f, + 0xb2, 0x94, 0xe8, 0x01, + 0xde, 0xed, 0xdd, 0x13, + 0x34, 0xf3, 0x2e, 0x1b, + 0xb4, 0xd8, 0x07, 0x75, + 0x4e, 0xb9, 0xee, 0x6c, + 0xa2, 0x6b, 0xeb, 0x52, + 0x05, 0x29, 0x64, 0x50, + 0x3f, 0x3f, 0x45, 0x05, + 0xfc, 0x9e, 0x34, 0x06, + 0x7c, 0x78, 0x22, 0x69, + 0x9c, 0xff, 0xbf, 0x04, + 0x4a, 0x71, 0x8c, 0x76, + 0x1a, 0xf2, 0x9f, 0x3e, + 0x9c, 0x7c, 0x73, 0x15, + 0x07, 0xc8, 0x29, 0x22, + 0x8c, 0xf8, 0x47, 0x0d, + 0xcc, 0x0e, 0x7e, 0x09, + 0xa0, 0xdb, 0xea, 0x27, + 0xe4, 0x29, 0x7d, 0x2d, + 0xa0, 0xaa, 0x02, 0x35, + 0xd7, 0x5f, 0x47, 0x0f, + 0x49, 0xda, 0xfb, 0x29, + 0xfd, 0xff, 0x8a, 0x01, + 0x18, 0xb6, 0x15, 0x03, + 0xd1, 0x97, 0x44, 0x6d, + 0x9e, 0x1d, 0x17, 0x1b, + 0xbd, 0x1a, 0x86, 0x52, + 0x01, 0x05, 0x5d, 0x2e, + 0x6c, 0x64, 0xc8, 0x3e, + 0x0a, 0x25, 0x5f, 0x6e, + 0xe6, 0xe8, 0x8a, 0x14, + 0x4a, 0xfa, 0xf5, 0x17, + 0x84, 0xd2, 0x66, 0x3e, + 0x3b, 0xaa, 0x51, 0x00, + 0x13, 0x79, 0x3f, 0x48, + 0x15, 0x5f, 0xfe, 0x2c, + 0xca, 0x27, 0x34, 0x02, + 0x15, 0x83, 0xc7, 0x2c, + 0x47, 0xea, 0x36, 0x1e, + 0xc0, 0x53, 0x80, 0x5a, + 0x39, 0xe6, 0x3b, 0x69, + 0x7d, 0x86, 0x58, 0x38, + 0x6b, 0x4f, 0x33, 0x19, + 0xd8, 0x0f, 0x8f, 0x12, + 0xcb, 0x1c, 0x2b, 0x4e, + 0xe0, 0x0c, 0x21, 0x61, + 0x39, 0x89, 0x31, 0x3c, + 0x22, 0x2f, 0x5b, 0x0b, + 0xd5, 0x11, 0xdb, 0x2e, + 0xdf, 0xff, 0x3e, 0x21, + 0x06, 0x46, 0xac, 0x0c, + 0x6d, 0xf1, 0x1a, 0x24, + 0x0d, 0xa8, 0x90, 0x72, + 0x29, 0x53, 0x7e, 0x6f, + 0xa8, 0xc8, 0x8e, 0x59, + 0xa0, 0x59, 0xa8, 0x76, + 0x68, 0xe8, 0x59, 0x65, + 0xaf, 0x83, 0x7b, 0x65, + 0x3f, 0x1d, 0x27, 0x13, + 0x63, 0x60, 0x87, 0x1f, + 0x37, 0xae, 0xee, 0x0a, + 0xa6, 0x9c, 0x6e, 0x70, + 0xee, 0x0c, 0x40, 0x46, + 0x26, 0x5c, 0xa0, 0x72, + 0x9e, 0x9c, 0x58, 0x2c, + 0xa7, 0x37, 0xbd, 0x20, + 0x10, 0x3d, 0x2d, 0x6a, + 0x67, 0x37, 0x52, 0x20, + 0xc4, 0xe9, 0x8f, 0x5b, + 0xd6, 0x01, 0xa5, 0x2a, + 0x3e, 0xac, 0x01, 0x1e, + 0x54, 0xbc, 0x48, 0x14, + 0x1c, 0xad, 0xe5, 0x5c, + 0x4d, 0xa1, 0x18, 0x49, + 0x3f, 0xa8, 0x46, 0x2c, + 0x76, 0x68, 0xcf, 0x4f, + 0xc8, 0xd5, 0xd8, 0x61, + 0xf9, 0x4f, 0xdf, 0x6d, + 0xd3, 0xa4, 0xfd, 0x11, + 0x8f, 0x3a, 0x93, 0x02, + 0x81, 0xaf, 0x0e, 0x17, + 0x4f, 0x31, 0x9c, 0x5a, + 0x90, 0x25, 0xa1, 0x49, + 0xa1, 0x52, 0xec, 0x35, + 0x11, 0x16, 0xeb, 0x58, + 0x65, 0x1e, 0x48, 0x5e, + 0xc9, 0x25, 0x71, 0x36, + 0xba, 0x33, 0xba, 0x0e, + 0xed, 0x8d, 0xc2, 0x1f, + 0xad, 0x99, 0x63, 0x06, + 0xea, 0xc0, 0xbe, 0x0c, + 0xf0, 0x1a, 0xfd, 0x75, + 0x4e, 0xbf, 0xf5, 0x50, + 0x41, 0x5f, 0x3d, 0x64, + 0x18, 0xe7, 0x4f, 0x6f, + 0xde, 0xbb, 0x3c, 0x5b, + 0x3e, 0xfb, 0x3a, 0x1e, + 0x27, 0xb0, 0x6f, 0x29, + 0x7b, 0x54, 0xe1, 0x45, + 0xab, 0xb2, 0x8d, 0x4a, + 0x19, 0x6d, 0x98, 0x59, + 0xa3, 0xdf, 0xbc, 0x30, + 0x32, 0x39, 0xb6, 0x1d, + 0x24, 0x28, 0x7c, 0x1d, + 0x81, 0x36, 0xb3, 0x53, + 0x47, 0xb7, 0x73, 0x06, + 0xa3, 0x98, 0x8a, 0x03, + 0x60, 0xce, 0x5b, 0x2c, + 0xcd, 0x79, 0x19, 0x35, + 0x73, 0xfb, 0x08, 0x50, + 0x78, 0xca, 0x7b, 0x54, + 0x81, 0xf4, 0x1a, 0x71, + 0x64, 0xbf, 0x93, 0x3f, + 0x7b, 0x98, 0x4d, 0x64, + 0x87, 0xcd, 0x8b, 0x3c, + 0xb8, 0x58, 0x87, 0x60, + }; + } + + + namespace t20 { + int internal_rounds = 18; + + int alpha = 7; + + unsigned char mat_diag_m_1[] = { + 0xa3, 0x1d, 0x53, 0x60, + 0xdb, 0x32, 0x29, 0x33, + 0x57, 0x5e, 0xf0, 0x61, + 0xf8, 0x50, 0x40, 0x61, + 0xdd, 0xc6, 0x23, 0x43, + 0x47, 0x35, 0xb3, 0x10, + 0xd8, 0xe1, 0x5c, 0x5e, + 0x85, 0x40, 0xa2, 0x19, + 0x93, 0x7e, 0x69, 0x3c, + 0xb9, 0xe6, 0x5d, 0x36, + 0x68, 0x50, 0xf9, 0x71, + 0x28, 0x92, 0x0c, 0x35, + 0x25, 0xd1, 0x83, 0x38, + 0x2e, 0x2e, 0x50, 0x51, + 0x74, 0x81, 0x4a, 0x1a, + 0xb2, 0x81, 0xe0, 0x01, + 0x6a, 0x08, 0xc1, 0x54, + 0x2a, 0xbc, 0x53, 0x12, + 0x34, 0x9b, 0x59, 0x50, + 0xc3, 0x97, 0x5b, 0x02, + }; + + unsigned char round_constants[] = { + 0x97, 0x44, 0xcd, 0x30, + 0x92, 0x7d, 0xcf, 0x67, + 0x86, 0xa7, 0x3c, 0x11, + 0xf7, 0x11, 0xf5, 0x28, + 0x11, 0x03, 0x85, 0x4c, + 0xe8, 0x7b, 0xc0, 0x3d, + 0xb9, 0x14, 0x82, 0x0c, + 0x97, 0x0d, 0x09, 0x18, + 0xfb, 0x35, 0x4f, 0x68, + 0x68, 0xba, 0xee, 0x11, + 0xa7, 0x0c, 0x7d, 0x56, + 0xbc, 0xbe, 0x3f, 0x6d, + 0x60, 0x84, 0x02, 0x47, + 0x33, 0xd4, 0xa8, 0x09, + 0x5c, 0x5d, 0xbc, 0x46, + 0xb2, 0x05, 0x08, 0x11, + 0x82, 0xdc, 0xdd, 0x50, + 0xfa, 0xe4, 0x1e, 0x00, + 0x19, 0x47, 0xed, 0x55, + 0xce, 0xbd, 0x08, 0x47, + 0x2b, 0x0b, 0x53, 0x1a, + 0x00, 0x24, 0x37, 0x6d, + 0x42, 0x1d, 0x10, 0x32, + 0xd0, 0xd7, 0xb0, 0x02, + 0x12, 0xf5, 0x64, 0x30, + 0x64, 0x3c, 0x0f, 0x67, + 0x31, 0x5e, 0x73, 0x35, + 0x44, 0x61, 0x2b, 0x5a, + 0xa6, 0x6b, 0x0d, 0x21, + 0x6a, 0xe6, 0x74, 0x12, + 0x09, 0x3e, 0x2e, 0x21, + 0xf0, 0x2f, 0xe6, 0x57, + 0x74, 0x18, 0x63, 0x6b, + 0x1b, 0x7a, 0x57, 0x6b, + 0xaa, 0xfd, 0x17, 0x0d, + 0x1b, 0xe8, 0xeb, 0x24, + 0xfe, 0xc9, 0xf6, 0x34, + 0x55, 0x5a, 0x1d, 0x59, + 0x42, 0xa9, 0x45, 0x5f, + 0x3f, 0x4f, 0x45, 0x5e, + 0x33, 0x56, 0xb7, 0x23, + 0x70, 0x61, 0x07, 0x55, + 0x82, 0x94, 0xaa, 0x3c, + 0x00, 0xbf, 0x2c, 0x6a, + 0x1b, 0x80, 0x24, 0x72, + 0x64, 0x2d, 0xbb, 0x74, + 0x90, 0x09, 0x6d, 0x2e, + 0x21, 0xb9, 0xea, 0x23, + 0xa8, 0x03, 0x36, 0x66, + 0x7f, 0xe9, 0xe8, 0x03, + 0x3d, 0x5d, 0xdb, 0x04, + 0x27, 0xe8, 0xc1, 0x64, + 0xfe, 0x78, 0xc4, 0x37, + 0x05, 0xc8, 0xef, 0x35, + 0xf9, 0xae, 0x5a, 0x55, + 0x0c, 0xad, 0x63, 0x65, + 0xac, 0xae, 0xc9, 0x14, + 0x72, 0xe1, 0xd6, 0x16, + 0xe9, 0xcb, 0x4f, 0x42, + 0x55, 0x08, 0x38, 0x30, + 0xbf, 0xe5, 0xd4, 0x74, + 0x83, 0xba, 0x75, 0x12, + 0x2d, 0x2a, 0xf3, 0x56, + 0x89, 0x7f, 0xf9, 0x3c, + 0x11, 0x57, 0x0c, 0x44, + 0x8a, 0x7e, 0x68, 0x48, + 0xf8, 0x00, 0x66, 0x49, + 0x9f, 0x42, 0x0e, 0x0b, + 0x26, 0x1e, 0x4b, 0x15, + 0xce, 0xb8, 0x9b, 0x37, + 0xe5, 0x83, 0x76, 0x27, + 0x94, 0xe0, 0x03, 0x44, + 0x40, 0x32, 0x03, 0x12, + 0xd7, 0x06, 0xd0, 0x3b, + 0x1b, 0xee, 0xe6, 0x4e, + 0x4c, 0x76, 0xc6, 0x62, + 0x2f, 0x55, 0x30, 0x72, + 0xe7, 0x1d, 0x34, 0x4f, + 0x49, 0x8c, 0x8f, 0x3c, + 0xe2, 0xbe, 0xc6, 0x6f, + 0x4d, 0xf7, 0x3e, 0x0a, + 0x07, 0x01, 0x71, 0x23, + 0x82, 0x0c, 0x65, 0x24, + 0xd4, 0xeb, 0xba, 0x12, + 0xce, 0xf3, 0xc2, 0x46, + 0xd9, 0x6f, 0x81, 0x57, + 0x1c, 0xe5, 0x3f, 0x44, + 0xab, 0x05, 0x78, 0x2a, + 0xf1, 0x8e, 0x50, 0x3f, + 0x6c, 0x83, 0x0b, 0x15, + 0xfa, 0x4f, 0x01, 0x1c, + 0xbe, 0x86, 0x07, 0x1c, + 0x90, 0x51, 0x64, 0x10, + 0x0a, 0x9c, 0x7b, 0x60, + 0x05, 0x15, 0x96, 0x48, + 0xbb, 0xb7, 0x20, 0x6f, + 0x23, 0xea, 0x5a, 0x5b, + 0x5c, 0x35, 0xe5, 0x1f, + 0xaa, 0x98, 0xef, 0x27, + 0x0b, 0x12, 0x3e, 0x04, + 0xcd, 0x5c, 0x7d, 0x64, + 0xb2, 0x81, 0x5c, 0x45, + 0x3f, 0x7d, 0xc2, 0x6a, + 0x26, 0x61, 0x9f, 0x27, + 0x58, 0x57, 0xa1, 0x76, + 0xa6, 0xb0, 0xc1, 0x58, + 0x01, 0x39, 0xf8, 0x4a, + 0x4f, 0x1d, 0x64, 0x45, + 0x33, 0x8c, 0xfe, 0x1d, + 0x88, 0x0c, 0x72, 0x03, + 0x0d, 0xd4, 0x82, 0x34, + 0x60, 0x89, 0x0d, 0x77, + 0x30, 0xb7, 0x08, 0x61, + 0x84, 0xc0, 0x3f, 0x06, + 0x34, 0x2a, 0x6e, 0x09, + 0xa0, 0x14, 0x05, 0x13, + 0xff, 0x3e, 0xbc, 0x42, + 0x48, 0x58, 0x77, 0x43, + 0xe4, 0x60, 0x29, 0x70, + 0x79, 0x9c, 0xf1, 0x6c, + 0xdd, 0x30, 0x30, 0x4c, + 0x32, 0x79, 0xd2, 0x6d, + 0xe9, 0x0d, 0x35, 0x64, + 0x11, 0x83, 0x0e, 0x48, + 0x2c, 0x63, 0x22, 0x6a, + 0xf6, 0xbc, 0x14, 0x28, + 0xe3, 0x97, 0x71, 0x11, + 0x19, 0xd4, 0x44, 0x48, + 0xa6, 0x81, 0xe1, 0x76, + 0xb4, 0xd7, 0x55, 0x61, + 0x26, 0xed, 0xdb, 0x42, + 0x7b, 0xc2, 0xe9, 0x62, + 0x11, 0x4f, 0x5b, 0x10, + 0x58, 0x58, 0xd4, 0x51, + 0x98, 0x02, 0xfa, 0x33, + 0x28, 0x82, 0xa0, 0x26, + 0x1f, 0x58, 0x14, 0x5f, + 0x37, 0x97, 0xd8, 0x3b, + 0x8f, 0x96, 0x25, 0x23, + 0xba, 0x12, 0x85, 0x41, + 0x2f, 0x44, 0x47, 0x2f, + 0xf5, 0x0a, 0x68, 0x0e, + 0xba, 0x4c, 0x42, 0x0c, + 0xae, 0x85, 0x38, 0x6d, + 0xbe, 0x8c, 0x9c, 0x0a, + 0xa9, 0xf2, 0x85, 0x24, + 0x7f, 0x35, 0x99, 0x1f, + 0x31, 0xd5, 0x58, 0x0f, + 0xb1, 0xf6, 0xd6, 0x32, + 0x6d, 0x87, 0x26, 0x2c, + 0x8e, 0xd3, 0xe3, 0x2d, + 0xc9, 0x6c, 0x7b, 0x5a, + 0xf0, 0xc7, 0xae, 0x1c, + 0x75, 0xf5, 0xa1, 0x4a, + 0xcd, 0x0c, 0xaf, 0x77, + 0x5c, 0xbe, 0xd3, 0x19, + 0xd8, 0x19, 0xa6, 0x0a, + 0x78, 0xea, 0xcf, 0x04, + 0x76, 0xab, 0xb3, 0x0d, + 0xa3, 0xfa, 0xdf, 0x2d, + 0x67, 0x67, 0x24, 0x52, + 0x18, 0xf0, 0xd7, 0x50, + 0x9f, 0xeb, 0x8c, 0x31, + 0x06, 0xa5, 0x69, 0x2e, + 0xfa, 0xd1, 0xd9, 0x4b, + 0x9a, 0x57, 0x0b, 0x2a, + 0xc2, 0x38, 0x12, 0x56, + 0x9a, 0xbb, 0x77, 0x28, + 0x79, 0x2c, 0xed, 0x06, + 0xba, 0x98, 0x99, 0x22, + 0x85, 0x01, 0x7f, 0x73, + 0x31, 0xad, 0x9a, 0x60, + 0x51, 0x35, 0xee, 0x2c, + 0x17, 0xbd, 0x34, 0x44, + 0x6f, 0x54, 0xa8, 0x1d, + 0xe6, 0xfb, 0x32, 0x35, + 0x6d, 0xb9, 0x37, 0x26, + 0x84, 0x40, 0xb0, 0x02, + }; + } + + + namespace t24 { + int internal_rounds = 21; + + int alpha = 7; + + unsigned char mat_diag_m_1[] = { + 0xf0, 0x33, 0x91, 0x40, + 0xa1, 0xa8, 0x67, 0x16, + 0xb6, 0xc7, 0xa6, 0x06, + 0x0e, 0x16, 0x53, 0x6f, + 0xd1, 0x11, 0x3b, 0x27, + 0x5d, 0x6c, 0x17, 0x03, + 0xf9, 0xbb, 0xf9, 0x72, + 0x91, 0xba, 0xce, 0x73, + 0x1d, 0xf8, 0xde, 0x5c, + 0x85, 0x32, 0x39, 0x01, + 0x06, 0xee, 0xda, 0x46, + 0xa6, 0x7b, 0x5d, 0x06, + 0x6f, 0x2d, 0xd7, 0x52, + 0xe0, 0x05, 0xdd, 0x05, + 0x63, 0x4b, 0xab, 0x3b, + 0x42, 0x38, 0xda, 0x6a, + 0xec, 0xfb, 0xc5, 0x2f, + 0xb0, 0x61, 0x0d, 0x77, + 0xe9, 0xaa, 0x15, 0x57, + 0x90, 0x0e, 0xef, 0x03, + 0x70, 0xc7, 0xb6, 0x75, + 0x5f, 0xdf, 0x2a, 0x24, + 0x4c, 0xca, 0xd0, 0x00, + 0x88, 0xe3, 0xc0, 0x36, + }; + + unsigned char round_constants[] = { + 0x37, 0x0c, 0xa2, 0x0f, + 0x97, 0xbb, 0x95, 0x07, + 0x9c, 0x0b, 0xc6, 0x12, + 0x8e, 0xd8, 0xab, 0x0e, + 0xca, 0x85, 0x64, 0x09, + 0x27, 0x35, 0x09, 0x07, + 0x50, 0x4e, 0x1d, 0x1b, + 0xce, 0x1a, 0xa0, 0x30, + 0x5a, 0x6f, 0xd8, 0x3b, + 0x28, 0x7c, 0xaf, 0x69, + 0x5f, 0x77, 0x94, 0x3f, + 0xe8, 0x60, 0x15, 0x73, + 0xcd, 0x0e, 0x5a, 0x46, + 0x07, 0xf8, 0x4e, 0x57, + 0x70, 0x48, 0xfd, 0x62, + 0x44, 0xfe, 0xcc, 0x52, + 0x14, 0x2b, 0x77, 0x14, + 0x71, 0xf3, 0xed, 0x4d, + 0x7c, 0xcd, 0x0a, 0x26, + 0x58, 0xdc, 0x51, 0x1f, + 0x32, 0x55, 0x12, 0x75, + 0x7b, 0x4d, 0x6a, 0x68, + 0x79, 0xc1, 0xba, 0x54, + 0x06, 0x77, 0x94, 0x31, + 0x3b, 0x9d, 0x79, 0x29, + 0x90, 0xae, 0x01, 0x6e, + 0x64, 0x7a, 0x3a, 0x20, + 0xbe, 0x25, 0x7e, 0x4f, + 0x77, 0x3f, 0x50, 0x72, + 0x69, 0x3b, 0xbd, 0x45, + 0xb4, 0xd6, 0x9b, 0x76, + 0x08, 0x7f, 0x86, 0x5a, + 0x82, 0xa0, 0xdb, 0x4f, + 0x18, 0x43, 0x1c, 0x25, + 0x01, 0x62, 0xf0, 0x28, + 0x3a, 0xc4, 0x88, 0x67, + 0x99, 0x6a, 0x6d, 0x4c, + 0xa8, 0x84, 0x77, 0x35, + 0x51, 0xf0, 0xba, 0x2a, + 0xe6, 0x7d, 0x0f, 0x77, + 0x84, 0xb7, 0x94, 0x17, + 0x7a, 0xc5, 0x96, 0x47, + 0x10, 0x7a, 0x4b, 0x72, + 0xa7, 0x89, 0x99, 0x44, + 0xf1, 0x5c, 0x93, 0x64, + 0xac, 0x4a, 0xe1, 0x59, + 0xb8, 0x0b, 0x62, 0x0e, + 0x3b, 0xa3, 0xf5, 0x3a, + 0x0e, 0xcc, 0x65, 0x44, + 0x8f, 0xf6, 0x9d, 0x01, + 0x68, 0xd0, 0xf8, 0x4a, + 0x82, 0x4f, 0x78, 0x08, + 0xae, 0xde, 0xef, 0x0c, + 0x67, 0xa4, 0x37, 0x63, + 0x16, 0x7a, 0xfa, 0x32, + 0xd6, 0x62, 0x6f, 0x48, + 0x80, 0x74, 0x6a, 0x38, + 0x4a, 0x7c, 0xf1, 0x20, + 0xa8, 0x0d, 0xe5, 0x54, + 0x03, 0xcf, 0x12, 0x20, + 0x50, 0x29, 0xe5, 0x5f, + 0xcd, 0xb6, 0xaf, 0x09, + 0x4e, 0x04, 0x23, 0x25, + 0xef, 0xd0, 0x54, 0x5c, + 0x3c, 0x1f, 0xc0, 0x71, + 0xfb, 0xc4, 0xb2, 0x60, + 0x79, 0xb3, 0x50, 0x40, + 0xa5, 0x70, 0x6a, 0x5e, + 0xf5, 0x43, 0x85, 0x41, + 0x56, 0xbe, 0xde, 0x71, + 0x94, 0x29, 0xad, 0x1a, + 0x83, 0xa4, 0x68, 0x33, + 0x3a, 0x6f, 0xa8, 0x07, + 0xf1, 0x3f, 0xa4, 0x5e, + 0x0e, 0x78, 0x43, 0x24, + 0xf7, 0x44, 0xe4, 0x4c, + 0x82, 0x98, 0x6f, 0x14, + 0x89, 0xb0, 0x32, 0x31, + 0x56, 0xa8, 0x7e, 0x19, + 0xc3, 0x30, 0x70, 0x66, + 0xdc, 0xd5, 0x17, 0x23, + 0xa7, 0x48, 0x2c, 0x0c, + 0x66, 0xdf, 0xb2, 0x56, + 0xe9, 0x81, 0xbd, 0x67, + 0x19, 0xfb, 0xcd, 0x4f, + 0x32, 0xef, 0xaa, 0x4b, + 0x0a, 0xd3, 0x28, 0x03, + 0x0d, 0x76, 0x35, 0x62, + 0x12, 0x29, 0x43, 0x12, + 0x58, 0xe2, 0x49, 0x0a, + 0x70, 0x1b, 0x0e, 0x03, + 0x03, 0xeb, 0xca, 0x48, + 0xe9, 0xd9, 0xe4, 0x49, + 0xc6, 0xb5, 0x51, 0x10, + 0xbe, 0xdb, 0x36, 0x6a, + 0xa5, 0x27, 0xff, 0x4c, + 0xc2, 0x8e, 0xa7, 0x1d, + 0x24, 0x09, 0x0b, 0x73, + 0xf3, 0x6c, 0xb5, 0x3e, + 0x73, 0x30, 0xd9, 0x5b, + 0x97, 0x4c, 0x20, 0x37, + 0x89, 0x2d, 0x64, 0x51, + 0xe8, 0x43, 0xe9, 0x66, + 0xde, 0x72, 0x3e, 0x1a, + 0xe9, 0xb1, 0xbe, 0x70, + 0x3f, 0x3b, 0xff, 0x30, + 0xc4, 0xd1, 0x40, 0x42, + 0x8d, 0x7b, 0x64, 0x12, + 0x65, 0x69, 0xd8, 0x65, + 0x7c, 0x4d, 0xef, 0x49, + 0x97, 0x56, 0x78, 0x47, + 0x9f, 0x96, 0xb3, 0x46, + 0x0e, 0x7a, 0x7b, 0x5c, + 0x60, 0xfc, 0x78, 0x70, + 0x82, 0xd4, 0x22, 0x4f, + 0xee, 0x9a, 0x2a, 0x48, + 0x9d, 0x83, 0xeb, 0x6b, + 0xad, 0x59, 0x29, 0x03, + 0x6a, 0xaf, 0x18, 0x2b, + 0x8c, 0xdc, 0xd3, 0x55, + 0xc8, 0x26, 0xbd, 0x43, + 0x5f, 0x59, 0x41, 0x0c, + 0xe2, 0xd2, 0x48, 0x70, + 0x83, 0x89, 0xdb, 0x00, + 0xd7, 0x63, 0xf5, 0x2a, + 0x8f, 0x75, 0x84, 0x6e, + 0xe1, 0x64, 0x1d, 0x61, + 0xe2, 0x77, 0x99, 0x1f, + 0x0a, 0x3a, 0x16, 0x64, + 0x7b, 0xc2, 0x5f, 0x5c, + 0x61, 0x25, 0xe2, 0x02, + 0xdb, 0x75, 0x2d, 0x3a, + 0x1a, 0xb7, 0xa7, 0x1b, + 0x64, 0x3f, 0x34, 0x34, + 0x5d, 0xb3, 0x06, 0x74, + 0x99, 0x82, 0xdf, 0x19, + 0x0a, 0x48, 0xf4, 0x6f, + 0xc8, 0x81, 0x4a, 0x51, + 0xce, 0x52, 0xab, 0x57, + 0x52, 0x9f, 0xd6, 0x6a, + 0x0d, 0x0e, 0x0c, 0x3e, + 0x14, 0x61, 0x12, 0x48, + 0xcc, 0x62, 0x9d, 0x2a, + 0x23, 0x1f, 0x44, 0x17, + 0xbb, 0x62, 0x57, 0x48, + 0x74, 0x86, 0x21, 0x2f, + 0x4a, 0xc6, 0xfd, 0x06, + 0xf2, 0xb7, 0x61, 0x08, + 0xe6, 0xee, 0x36, 0x3b, + 0x40, 0x10, 0xa1, 0x70, + 0x37, 0x17, 0xb3, 0x04, + 0x72, 0xa8, 0x22, 0x37, + 0x63, 0x1c, 0x35, 0x2a, + 0xdc, 0x60, 0x35, 0x62, + 0xb2, 0x4a, 0x58, 0x62, + 0x04, 0x7c, 0x2c, 0x38, + 0xc7, 0xed, 0xf9, 0x3b, + 0x51, 0xfe, 0x38, 0x0e, + 0x10, 0x3b, 0x6f, 0x37, + 0x78, 0xe1, 0x81, 0x53, + 0xc7, 0x61, 0xfc, 0x3a, + 0x4d, 0xcb, 0x1b, 0x5c, + 0x1f, 0xce, 0x43, 0x66, + 0xc1, 0xf1, 0x0a, 0x2d, + 0xcc, 0x83, 0xf5, 0x08, + 0x0f, 0xf6, 0x6f, 0x5d, + 0xe5, 0xc1, 0x24, 0x63, + 0xb7, 0x2f, 0x41, 0x74, + 0x2e, 0x19, 0xc0, 0x70, + 0x41, 0xf1, 0x72, 0x0b, + 0x11, 0xa1, 0x67, 0x40, + 0x4f, 0x8c, 0x38, 0x57, + 0xec, 0x09, 0x10, 0x35, + 0x59, 0xc1, 0x74, 0x09, + 0xb3, 0x58, 0x9a, 0x53, + 0xff, 0x0c, 0x8c, 0x03, + 0x92, 0x03, 0x6c, 0x47, + 0x5f, 0xc1, 0x7b, 0x3f, + 0x2c, 0xdd, 0x91, 0x44, + 0x55, 0xef, 0x1f, 0x4d, + 0xe3, 0x6a, 0x93, 0x04, + 0xd4, 0x4d, 0x21, 0x58, + 0xad, 0x6a, 0x3c, 0x68, + 0x6b, 0xf1, 0x42, 0x1b, + 0x35, 0x91, 0xc7, 0x6d, + 0xec, 0x71, 0x4e, 0x2d, + 0xea, 0x46, 0x29, 0x3e, + 0xdb, 0xe8, 0xdc, 0x59, + 0x2a, 0x89, 0xee, 0x6c, + 0x50, 0x73, 0xf0, 0x47, + 0x93, 0xce, 0x06, 0x71, + 0xa9, 0xa7, 0xd4, 0x3b, + 0x6a, 0x63, 0xfe, 0x2b, + 0xe9, 0x11, 0x00, 0x43, + 0x6a, 0xd6, 0x1c, 0x00, + 0x5b, 0xaf, 0x7f, 0x30, + 0xfe, 0xf3, 0x9e, 0x0d, + 0x3a, 0x04, 0x40, 0x6d, + 0x0c, 0x47, 0x8f, 0x2e, + 0xe8, 0x65, 0x68, 0x1b, + 0x01, 0x6c, 0x0e, 0x0c, + 0x1f, 0x98, 0x41, 0x4d, + 0x3d, 0x9d, 0x3b, 0x42, + 0xcc, 0x08, 0x04, 0x41, + 0x84, 0x08, 0x3f, 0x26, + 0xd0, 0xbb, 0x11, 0x53, + 0xd8, 0x58, 0xae, 0x4d, + 0xea, 0x1c, 0x40, 0x30, + 0x75, 0xa5, 0xaf, 0x09, + 0x42, 0x5b, 0x3d, 0x4b, + 0x37, 0x0b, 0xac, 0x63, + 0x14, 0xbb, 0xe5, 0x5f, + 0xd4, 0xe9, 0x44, 0x52, + }; + } + +} +#endif diff --git a/icicle/include/poseidon2/constants/bn254_poseidon2.h b/icicle/include/poseidon2/constants/bn254_poseidon2.h new file mode 100644 index 00000000..f4e056a1 --- /dev/null +++ b/icicle/include/poseidon2/constants/bn254_poseidon2.h @@ -0,0 +1,1365 @@ +#pragma once +#ifndef BN254_POSEIDON2_H +#define BN254_POSEIDON2_H + +namespace poseidon2_constants_bn254 { + + namespace t2 { + int internal_rounds = 56; + + int alpha = 5; + + unsigned char mat_diag_m_1[] = { + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + unsigned char round_constants[] = { + 0xa7, 0xd7, 0xab, 0xd0, 0xdb, 0xc0, 0x7d, 0x6c, 0x1b, 0xdd, 0x4c, 0x53, 0x77, 0xa1, 0x1a, 0xa7, 0x38, 0xba, 0x4c, 0x29, 0xba, 0xaa, 0x1f, 0xfe, 0xd4, 0x9b, 0x8e, 0xc6, 0x9e, 0x6e, 0xc4, 0x09, + 0x81, 0xcb, 0x04, 0xa6, 0xff, 0x83, 0x1d, 0x3c, 0x34, 0xb8, 0x05, 0xe4, 0x3a, 0x2b, 0x14, 0xc5, 0xcf, 0x35, 0x31, 0x7f, 0x93, 0xed, 0x97, 0x2a, 0xc4, 0xee, 0x96, 0x08, 0x53, 0x56, 0x03, 0x0c, + 0x30, 0x4a, 0x15, 0xcc, 0x77, 0xa9, 0x7e, 0x31, 0xbd, 0x68, 0x62, 0xbd, 0xaa, 0xa5, 0x0e, 0xa0, 0xf4, 0x4c, 0xb5, 0x2b, 0x18, 0x51, 0x2e, 0x14, 0xd1, 0x8a, 0x69, 0x35, 0xd9, 0xa1, 0x28, 0x1e, + 0x1f, 0x25, 0x91, 0x2b, 0xb1, 0xe2, 0xf9, 0x4c, 0x96, 0xdb, 0x08, 0xe0, 0xc3, 0x57, 0x57, 0x0e, 0xe4, 0x98, 0xe2, 0x30, 0xdb, 0x65, 0x09, 0x08, 0x48, 0x27, 0x9d, 0x1a, 0x83, 0x2d, 0xaf, 0x27, + 0x03, 0x4e, 0xb7, 0x45, 0x35, 0xf4, 0xaa, 0x79, 0x08, 0xcd, 0x14, 0xf2, 0x62, 0x14, 0x29, 0x41, 0x5a, 0x17, 0xae, 0x16, 0xfe, 0x3c, 0x6a, 0x3a, 0x51, 0x8f, 0xfc, 0x60, 0xce, 0x11, 0x6f, 0x1e, + 0xd3, 0x42, 0xd1, 0x68, 0x62, 0x20, 0x19, 0xf7, 0xd8, 0x13, 0x36, 0x4c, 0xd1, 0x2e, 0x46, 0x04, 0xbe, 0xf0, 0x81, 0xb6, 0x9c, 0x81, 0x41, 0x85, 0x43, 0x5e, 0xbd, 0x3b, 0x4d, 0x38, 0x67, 0x2a, + 0xd0, 0x45, 0x9f, 0x5c, 0x5d, 0x8f, 0x40, 0x36, 0x89, 0x18, 0x25, 0xf0, 0x81, 0xe3, 0x85, 0xb9, 0xf0, 0xec, 0xbf, 0x2f, 0xe1, 0xf8, 0x09, 0x16, 0x61, 0x3a, 0x09, 0x56, 0xf3, 0xfd, 0x66, 0x0b, + 0x21, 0x9e, 0xb0, 0xbd, 0x2d, 0x85, 0xa6, 0xda, 0xed, 0xbe, 0xce, 0xc5, 0x3c, 0xc8, 0x26, 0x0b, 0x37, 0xde, 0x2a, 0x3c, 0x09, 0x61, 0x0c, 0x83, 0x70, 0xd4, 0x78, 0x1e, 0xec, 0xe3, 0x2e, 0x01, + 0xb9, 0xb1, 0x5b, 0x44, 0x7b, 0x8e, 0x10, 0x2d, 0xbb, 0xb6, 0x99, 0xb0, 0x31, 0xc4, 0xd1, 0x6c, 0xfd, 0xe3, 0x75, 0x81, 0x7f, 0xf6, 0x88, 0xfd, 0xbd, 0xbf, 0x60, 0x67, 0x5f, 0xba, 0x52, 0x02, + 0xf1, 0x32, 0xa9, 0x7c, 0xad, 0xea, 0x5a, 0xef, 0xd6, 0x71, 0xff, 0x35, 0x89, 0x1a, 0x39, 0x54, 0x63, 0x29, 0x54, 0xef, 0x3c, 0xec, 0x6b, 0x6c, 0x67, 0xff, 0xa5, 0xec, 0xcc, 0x74, 0x94, 0x17, + 0x91, 0x2b, 0xed, 0xbb, 0x89, 0x25, 0x1a, 0x7e, 0xb3, 0x69, 0x49, 0x26, 0x4a, 0x97, 0x1f, 0x9c, 0xed, 0xd4, 0x3f, 0x50, 0x4a, 0xff, 0x28, 0x92, 0xfa, 0x1b, 0xa5, 0x79, 0x13, 0x26, 0x24, 0x2c, + 0x05, 0x1b, 0x80, 0x51, 0x05, 0x6c, 0xe6, 0x53, 0xc5, 0x0f, 0xfc, 0x01, 0x50, 0x3f, 0xf6, 0xc2, 0x43, 0x5b, 0x69, 0xd0, 0x8b, 0x28, 0x2f, 0xac, 0x3e, 0xe6, 0x92, 0x26, 0xb6, 0xd7, 0xc1, 0x1c, + 0x56, 0x1b, 0xc9, 0xd9, 0x5f, 0xff, 0x9e, 0x5d, 0xd0, 0xac, 0xfb, 0x17, 0xbf, 0x4d, 0x78, 0x00, 0x96, 0x9e, 0x97, 0x52, 0xf8, 0x55, 0xed, 0xb2, 0x8b, 0xa9, 0xad, 0x1a, 0x30, 0x59, 0x50, 0x25, + 0xd9, 0xef, 0x59, 0x7e, 0xce, 0x29, 0x1c, 0xb1, 0x93, 0x81, 0x0a, 0x97, 0x34, 0x42, 0xa2, 0xae, 0xb3, 0x32, 0xcd, 0xec, 0xc0, 0xf5, 0xe1, 0x79, 0xe4, 0xb2, 0x1c, 0xac, 0xe3, 0x7b, 0x43, 0x28, + 0x43, 0x20, 0x5f, 0x7f, 0xc3, 0x62, 0x87, 0x33, 0xd4, 0x78, 0x4f, 0xfb, 0xa8, 0x8d, 0x54, 0x18, 0xb1, 0x6e, 0x76, 0x53, 0x6b, 0xfa, 0xa4, 0x1c, 0x71, 0x1f, 0x2e, 0x2f, 0x44, 0x6a, 0x21, 0x28, + 0xc9, 0x82, 0x34, 0x32, 0x77, 0x23, 0x1f, 0x13, 0x81, 0x45, 0x09, 0x03, 0xce, 0xef, 0xe1, 0xee, 0x3f, 0xd0, 0x6d, 0x05, 0xe7, 0xf4, 0x39, 0x1f, 0xdf, 0x5a, 0xfa, 0x17, 0xcd, 0x47, 0x1f, 0x2c, + 0xc9, 0xaf, 0x21, 0xa6, 0x66, 0x85, 0x6b, 0x64, 0x63, 0x8a, 0x63, 0x76, 0xa2, 0xfc, 0xda, 0xd9, 0x7d, 0xeb, 0x6c, 0x35, 0xc9, 0xbc, 0x32, 0x86, 0xc4, 0xeb, 0xa5, 0xb7, 0x02, 0xad, 0xab, 0x07, + 0x3c, 0x6c, 0xf9, 0x15, 0x4d, 0x0c, 0xda, 0x37, 0xd1, 0x9c, 0xa6, 0x80, 0x08, 0xf9, 0x29, 0x94, 0xfe, 0x1d, 0xb5, 0xaa, 0xff, 0x33, 0x5b, 0x27, 0x29, 0xdf, 0xff, 0x01, 0x46, 0x26, 0x30, 0x02, + 0xa9, 0xa0, 0x9a, 0x89, 0x66, 0x5d, 0x7e, 0x71, 0x9e, 0x28, 0xee, 0x57, 0x45, 0x41, 0x64, 0xa8, 0x40, 0xca, 0x97, 0x64, 0x65, 0x68, 0xf1, 0xa0, 0x05, 0xd9, 0x51, 0x4e, 0x05, 0x73, 0xc9, 0x1b, + 0xfc, 0x67, 0x0a, 0x8f, 0x28, 0x22, 0x6b, 0x2a, 0x1f, 0x42, 0xd8, 0xc2, 0xf5, 0xaf, 0x49, 0xd2, 0xed, 0x41, 0x63, 0xe8, 0x57, 0x31, 0x6c, 0x20, 0x08, 0x50, 0x43, 0x64, 0xf9, 0x22, 0x1c, 0x2e, + 0xb8, 0x86, 0xba, 0x2b, 0xbc, 0x52, 0x04, 0xa7, 0xf7, 0xc9, 0x46, 0x8e, 0x59, 0xa1, 0x8e, 0x9e, 0x50, 0xbc, 0x1b, 0x46, 0x5f, 0x1d, 0x1c, 0x12, 0x78, 0x53, 0x7c, 0xf6, 0x8d, 0xf3, 0x24, 0x12, + 0x0e, 0xe2, 0xcd, 0x86, 0x91, 0x98, 0xd2, 0x69, 0x19, 0xda, 0xfe, 0x9d, 0xcd, 0xe8, 0xbf, 0xd7, 0x8f, 0x06, 0xd0, 0x9e, 0xbd, 0xb4, 0x80, 0x92, 0x51, 0x9e, 0xa5, 0x8b, 0x9d, 0xe6, 0xe4, 0x02, + 0x8e, 0x01, 0x98, 0x5d, 0x73, 0xe9, 0x47, 0x6d, 0x07, 0x3f, 0x65, 0x4e, 0x36, 0xee, 0x19, 0x4f, 0xee, 0xf3, 0x4f, 0xc0, 0x1f, 0xf8, 0x5d, 0x7f, 0x13, 0xa0, 0xab, 0x4a, 0xc3, 0xcc, 0x1e, 0x1f, + 0x82, 0xf5, 0x84, 0x42, 0x4d, 0x8a, 0xcb, 0xea, 0x19, 0x18, 0xcd, 0x32, 0x80, 0x44, 0x24, 0x14, 0x31, 0xa7, 0xa9, 0x39, 0x30, 0x6c, 0x26, 0x74, 0x39, 0x35, 0x9a, 0x70, 0x3d, 0xad, 0x72, 0x16, + 0xc7, 0x8f, 0x8c, 0xdf, 0x02, 0xd6, 0x2e, 0x1d, 0x99, 0x24, 0x4d, 0x28, 0x1f, 0x96, 0xa6, 0xcd, 0xe9, 0x4a, 0x2b, 0x19, 0xf5, 0x4a, 0xf4, 0x56, 0x0c, 0x42, 0x6e, 0x2c, 0xdc, 0x3f, 0x3e, 0x28, + 0xcc, 0x4b, 0x39, 0xff, 0x69, 0xbd, 0x4f, 0x61, 0xd6, 0x59, 0xff, 0xfd, 0xf8, 0x51, 0x37, 0x68, 0x13, 0xa0, 0x0f, 0x17, 0x57, 0x09, 0xdb, 0xd0, 0xcf, 0x0e, 0x55, 0x0c, 0x12, 0x3d, 0x2a, 0x1c, + 0xbd, 0x3f, 0x65, 0x77, 0x81, 0x6b, 0xcb, 0x96, 0xf2, 0xa6, 0x3e, 0x77, 0x43, 0x9a, 0x3a, 0x14, 0xfe, 0x6e, 0x45, 0x23, 0x73, 0x7a, 0x89, 0xf7, 0x72, 0x61, 0xac, 0x7a, 0x87, 0x84, 0x6f, 0x21, + 0x88, 0x47, 0xf9, 0x52, 0x15, 0xf5, 0xa1, 0x11, 0xa4, 0x59, 0xca, 0x61, 0xea, 0x47, 0xaa, 0xce, 0x2b, 0xd1, 0x28, 0x3e, 0x8e, 0x7e, 0xba, 0x64, 0x57, 0xa7, 0xf2, 0xec, 0x2b, 0x27, 0x0d, 0x2c, + 0x43, 0x6f, 0x54, 0x89, 0x3d, 0x6c, 0x4a, 0xcb, 0x8f, 0x50, 0xe0, 0xab, 0x80, 0x54, 0x0a, 0x17, 0x9f, 0x4e, 0x45, 0x4c, 0xa7, 0xe7, 0x4e, 0x48, 0x28, 0x0e, 0x5c, 0x86, 0x99, 0x42, 0xe3, 0x16, + 0xc5, 0x8f, 0x48, 0x55, 0x97, 0x93, 0xcd, 0x48, 0x0f, 0x29, 0x02, 0x58, 0x76, 0x47, 0x20, 0x77, 0x71, 0xcc, 0xb9, 0x6f, 0x2a, 0x23, 0x5a, 0x37, 0x5b, 0x6f, 0xe9, 0x99, 0xa5, 0xeb, 0x5c, 0x17, + 0x32, 0xee, 0xa1, 0x44, 0xbb, 0xff, 0xc5, 0xd8, 0x54, 0x4f, 0x35, 0xbc, 0xbf, 0x10, 0xa4, 0x6a, 0x06, 0x28, 0xb0, 0x58, 0x17, 0x9e, 0xad, 0xfe, 0x16, 0x8c, 0xc4, 0x0d, 0x44, 0x94, 0x75, 0x0c, + 0x8d, 0xfd, 0x19, 0xd9, 0x82, 0x98, 0x47, 0x92, 0x2c, 0x91, 0xcf, 0x3c, 0x01, 0x20, 0x0e, 0x76, 0x8f, 0xfd, 0xb6, 0x7e, 0x7d, 0xdb, 0x66, 0xc4, 0xb5, 0x1b, 0xf2, 0x39, 0xbc, 0x29, 0x3c, 0x1a, + 0x8f, 0xe6, 0x22, 0xcd, 0xab, 0xee, 0xc8, 0x95, 0x66, 0x5a, 0x4f, 0x07, 0x49, 0xd3, 0x55, 0x08, 0x40, 0x53, 0xb2, 0x49, 0xa0, 0x6e, 0x98, 0xc0, 0xe5, 0x26, 0x34, 0x6f, 0x90, 0xdd, 0xcf, 0x0c, + 0x96, 0xe7, 0xd9, 0x7d, 0xb6, 0x99, 0xe6, 0xe0, 0x3c, 0x5b, 0x06, 0xfd, 0xa3, 0xa8, 0xa7, 0x66, 0x18, 0x41, 0xc9, 0xe6, 0x5c, 0x47, 0xdb, 0x2b, 0xf6, 0x86, 0xf1, 0xd9, 0x81, 0xbc, 0xf6, 0x14, + 0x52, 0x70, 0xb9, 0x86, 0x73, 0xeb, 0xed, 0x88, 0xc8, 0x95, 0xc4, 0xc9, 0x10, 0x98, 0x09, 0xcc, 0xaa, 0xc5, 0xf6, 0xb2, 0x70, 0xca, 0x02, 0x97, 0x12, 0x3d, 0xfb, 0x89, 0x27, 0xb8, 0x62, 0x09, + 0x6d, 0xa8, 0x31, 0x6a, 0x8f, 0x0c, 0xef, 0xaf, 0x75, 0x25, 0xf0, 0x1e, 0xb0, 0x4a, 0x28, 0x13, 0xbc, 0x27, 0x51, 0xe2, 0x9d, 0xc7, 0x20, 0xbf, 0xb3, 0x18, 0x4d, 0x07, 0xf7, 0x0a, 0x88, 0x1a, + 0x1b, 0x31, 0xe9, 0x7a, 0xbb, 0x12, 0x30, 0x4c, 0x3f, 0xff, 0x20, 0xfc, 0x24, 0x29, 0xaf, 0x20, 0x4b, 0x15, 0x1c, 0x21, 0xf0, 0x77, 0x5e, 0xcd, 0x32, 0xa3, 0xa6, 0x19, 0x84, 0xa1, 0xcb, 0x10, + 0x0d, 0xf1, 0x02, 0xf3, 0x49, 0x28, 0x6a, 0x75, 0x06, 0x34, 0xae, 0x9c, 0x31, 0xb7, 0x27, 0xfa, 0xa8, 0xac, 0x9e, 0x3a, 0xa6, 0x6b, 0xc7, 0xbd, 0x3e, 0x9b, 0xf8, 0xa8, 0xa9, 0x62, 0x7e, 0x05, + 0xee, 0x0c, 0x28, 0x44, 0x3b, 0x41, 0xa0, 0xaf, 0xf5, 0xcf, 0x65, 0xbf, 0x3b, 0x30, 0x61, 0xb9, 0x8c, 0x98, 0xb4, 0x84, 0x53, 0xdf, 0x4a, 0xd4, 0xab, 0xc0, 0x1d, 0xe9, 0x1d, 0x97, 0x7c, 0x28, + 0x1d, 0x89, 0x06, 0xe3, 0x60, 0x79, 0x7f, 0x6f, 0x4e, 0xba, 0x4a, 0x6d, 0xc4, 0x2b, 0x56, 0x1e, 0x8f, 0x90, 0xca, 0x0c, 0xda, 0xa9, 0xbc, 0xb3, 0xbb, 0x87, 0x16, 0xaf, 0x88, 0x33, 0xdf, 0x21, + 0xb3, 0x82, 0x16, 0x0e, 0x56, 0x8b, 0xff, 0x3e, 0xd8, 0x8f, 0x49, 0x0b, 0xf7, 0xf8, 0x9d, 0x78, 0xcd, 0x34, 0x09, 0x4d, 0x97, 0xcc, 0x25, 0x3e, 0x70, 0xce, 0x5b, 0xd2, 0x87, 0xc8, 0xe5, 0x1b, + 0xc1, 0xd5, 0xa0, 0x06, 0x27, 0x9c, 0xd5, 0x48, 0xea, 0xac, 0xa5, 0xfd, 0x42, 0x5d, 0xcb, 0xd2, 0x0d, 0xcd, 0xa2, 0xce, 0x75, 0x71, 0x11, 0x68, 0xfb, 0x68, 0xe5, 0x76, 0x6f, 0xa3, 0x8d, 0x26, + 0xd6, 0x5e, 0x6a, 0xc2, 0x0c, 0x46, 0x06, 0xbd, 0x05, 0xbd, 0x5e, 0x13, 0x74, 0xbb, 0xd8, 0xc5, 0xec, 0xec, 0x10, 0x55, 0xaf, 0xbe, 0x09, 0xc6, 0x50, 0xae, 0x6e, 0x1f, 0x09, 0xab, 0x17, 0x0e, + 0x40, 0xaf, 0x62, 0x1f, 0xaa, 0x5c, 0x0f, 0x04, 0x70, 0xd2, 0x83, 0xcf, 0xd8, 0x62, 0xef, 0x91, 0x30, 0xa4, 0x74, 0xb0, 0x5a, 0x53, 0xee, 0x7a, 0xa6, 0xa0, 0xff, 0x28, 0xe7, 0x27, 0xd7, 0x04, + 0x6e, 0xca, 0x39, 0x7e, 0x7d, 0x41, 0x15, 0x2b, 0x86, 0xfd, 0x1b, 0x0f, 0xc1, 0x2a, 0x70, 0x33, 0xed, 0x22, 0xc0, 0x2b, 0x76, 0x49, 0xb5, 0x81, 0x15, 0x34, 0x29, 0x9c, 0xbf, 0xd7, 0xdb, 0x0d, + 0x4b, 0x65, 0x89, 0x87, 0x9c, 0xc4, 0x29, 0x8a, 0x58, 0x9b, 0xaf, 0xd3, 0xd1, 0xb0, 0xf5, 0x34, 0xc2, 0xc6, 0x89, 0x29, 0xe8, 0x62, 0x81, 0x76, 0x52, 0x17, 0x62, 0x51, 0x33, 0xeb, 0x90, 0x27, + 0xe9, 0xf9, 0x42, 0x61, 0x20, 0x64, 0xb7, 0x84, 0x09, 0xfd, 0xb2, 0xb8, 0x9a, 0x3d, 0x5f, 0x39, 0x70, 0xa5, 0xd8, 0x93, 0x01, 0x95, 0x71, 0x44, 0x3e, 0xb7, 0x63, 0x1a, 0x60, 0x7c, 0x45, 0x1e, + 0xb0, 0x91, 0xe0, 0x46, 0xfc, 0x86, 0xc6, 0xc4, 0x1f, 0xf9, 0x3f, 0xc4, 0xd0, 0xec, 0x90, 0xfa, 0x5f, 0x13, 0xe7, 0xbb, 0xb2, 0x6a, 0x8d, 0x63, 0x25, 0x96, 0xca, 0x1d, 0x30, 0x64, 0xae, 0x21, + 0x0b, 0x35, 0x8d, 0xed, 0x4e, 0x53, 0x58, 0x58, 0x55, 0x09, 0x2e, 0x43, 0xe3, 0xe9, 0x4b, 0x85, 0x28, 0x49, 0x49, 0x6f, 0x16, 0x93, 0xa2, 0x4d, 0x8d, 0x46, 0xe3, 0x8c, 0x3c, 0xf6, 0x79, 0x03, + 0x49, 0x50, 0xc3, 0x24, 0xa3, 0x58, 0x9f, 0x8c, 0xac, 0x86, 0x66, 0xa4, 0x21, 0x49, 0x0e, 0xca, 0x54, 0xe0, 0x09, 0x08, 0x08, 0x4a, 0x74, 0x6a, 0x26, 0xd0, 0x59, 0x03, 0x42, 0x56, 0x2d, 0x00, + 0xa6, 0x15, 0x35, 0x96, 0xaf, 0xc5, 0xc2, 0x0f, 0x09, 0xf4, 0x21, 0x9e, 0x45, 0x62, 0x8d, 0xda, 0xbe, 0x0b, 0xe1, 0x32, 0xcd, 0xb3, 0x68, 0x1d, 0x9b, 0x5d, 0x5b, 0x96, 0xe5, 0x58, 0x31, 0x12, + 0xc1, 0x9e, 0xad, 0x9c, 0xb4, 0x0e, 0xc8, 0x60, 0x4e, 0x6d, 0x83, 0x52, 0x6f, 0x2b, 0xbb, 0x0f, 0x42, 0xe0, 0xcb, 0xf6, 0xbb, 0x14, 0x1d, 0x66, 0x41, 0xa9, 0x47, 0x08, 0xc4, 0x9f, 0xe2, 0x0b, + 0x1a, 0x4c, 0xdf, 0x4f, 0xf2, 0x02, 0x38, 0x23, 0x9a, 0x5f, 0xad, 0x9c, 0x85, 0x9d, 0xdb, 0x36, 0x3c, 0x45, 0x5a, 0x01, 0x42, 0x61, 0x71, 0x57, 0x05, 0xbb, 0xc2, 0xde, 0x91, 0x69, 0xc9, 0x1a, + 0x7e, 0x62, 0xb0, 0xbc, 0x55, 0x33, 0xca, 0x51, 0x92, 0x8a, 0xf1, 0x97, 0xfa, 0xc9, 0x12, 0x5e, 0x3e, 0x3b, 0xd2, 0x61, 0xfc, 0x64, 0x49, 0x5f, 0xc2, 0xbc, 0x3d, 0x76, 0x3f, 0x44, 0x96, 0x15, + 0x12, 0x32, 0xba, 0xe3, 0xea, 0x49, 0xd0, 0xd6, 0xae, 0x15, 0xe7, 0x17, 0x9f, 0x7d, 0x85, 0xf1, 0xe0, 0xea, 0x3a, 0xec, 0xd4, 0x61, 0x28, 0x6b, 0xa7, 0xdf, 0x4b, 0x65, 0xd3, 0xbc, 0xe0, 0x12, + 0xba, 0x64, 0xf9, 0x7c, 0x6c, 0xc7, 0xe6, 0x04, 0x19, 0x4b, 0x15, 0x37, 0x7f, 0xac, 0xab, 0xce, 0x50, 0x2a, 0xaf, 0xf9, 0x4a, 0x3d, 0xa7, 0x9e, 0x2b, 0xa8, 0xbe, 0x1b, 0x4f, 0x2b, 0xc9, 0x0f, + 0x62, 0x27, 0x87, 0x33, 0x52, 0x96, 0x7e, 0x9c, 0x4f, 0x6f, 0x23, 0x22, 0x77, 0x7c, 0x4f, 0xb1, 0x40, 0x3f, 0x01, 0xa8, 0x92, 0xe5, 0xf2, 0xd6, 0x42, 0x64, 0x44, 0x10, 0x16, 0x0b, 0x9c, 0x1f, + 0xd3, 0xf4, 0xbb, 0x3d, 0x64, 0x9f, 0x15, 0x8d, 0x05, 0x4c, 0x8b, 0xa3, 0x4d, 0x91, 0x0d, 0x05, 0xf4, 0x82, 0xa7, 0x57, 0x61, 0xe0, 0xcd, 0xf8, 0x75, 0x26, 0xe7, 0x4a, 0x24, 0x74, 0xbd, 0x0e, + 0xd1, 0xc6, 0xcf, 0xdc, 0x39, 0x98, 0x83, 0x7a, 0x39, 0xee, 0x46, 0x73, 0xe9, 0x71, 0x06, 0x3b, 0xc0, 0x51, 0xb9, 0x4a, 0xfd, 0xfa, 0xa9, 0x69, 0x9f, 0x6e, 0xe1, 0x39, 0xed, 0xf0, 0xb7, 0x2c, + 0xbf, 0xd9, 0x52, 0x73, 0xca, 0x2b, 0xc7, 0x90, 0x66, 0x52, 0xce, 0x14, 0x05, 0x1d, 0x76, 0xce, 0x20, 0xab, 0x1b, 0xe4, 0x3e, 0x44, 0x05, 0x56, 0xcc, 0x22, 0xf0, 0xcf, 0x2e, 0x6e, 0x9d, 0x1a, + 0x2f, 0xc7, 0x8e, 0x64, 0x2d, 0x18, 0xda, 0x87, 0x30, 0xba, 0xa7, 0xa9, 0x26, 0x33, 0xc1, 0xd0, 0x31, 0x93, 0x4a, 0xc4, 0x3b, 0x3c, 0xa8, 0x5e, 0x5a, 0x33, 0x7f, 0x60, 0x39, 0x54, 0x11, 0x2a, + 0x60, 0xc0, 0xa4, 0xc5, 0x15, 0xc1, 0x35, 0x95, 0xf2, 0x44, 0xcd, 0x05, 0x63, 0xb5, 0x38, 0xe7, 0x10, 0x34, 0x3e, 0xee, 0x7a, 0xfa, 0xb8, 0x15, 0x0d, 0x04, 0x5d, 0x9b, 0x52, 0xb6, 0xf9, 0x23, + 0xa7, 0xe8, 0xe6, 0xf0, 0x39, 0xb9, 0x0e, 0x26, 0x8b, 0xb6, 0x58, 0x6d, 0xc1, 0x97, 0xce, 0xa3, 0xc3, 0xb9, 0x4b, 0x48, 0xba, 0xc6, 0x9a, 0x24, 0xa2, 0x72, 0x0f, 0xdb, 0x16, 0x2c, 0x87, 0x05, + 0xa7, 0xf6, 0xdd, 0xde, 0x7c, 0x4a, 0x62, 0x2b, 0xc5, 0xb5, 0x55, 0x1d, 0x15, 0xb6, 0x19, 0x02, 0xf4, 0x75, 0x80, 0x11, 0x80, 0xfb, 0x20, 0xca, 0x24, 0x78, 0xbb, 0x08, 0xee, 0xbd, 0x00, 0x13, + 0x76, 0xb3, 0x52, 0x7d, 0x7b, 0x4e, 0x2e, 0x07, 0xb1, 0x8c, 0xd9, 0x16, 0x99, 0xd2, 0x7a, 0x8d, 0x28, 0x6c, 0x8f, 0x3a, 0x86, 0x17, 0x38, 0xe6, 0x17, 0x8e, 0x10, 0x2f, 0x3d, 0xb6, 0xb9, 0x19, + 0x7f, 0x4f, 0x1b, 0x48, 0x28, 0x01, 0xa2, 0x24, 0x42, 0xec, 0xb5, 0x26, 0x87, 0xc8, 0xd1, 0x13, 0xf6, 0x22, 0x85, 0x66, 0x37, 0xa2, 0xbd, 0xb5, 0x15, 0xc0, 0xe3, 0x57, 0x13, 0xee, 0x5b, 0x01, + 0xd1, 0xff, 0x28, 0xb1, 0x85, 0xc7, 0x92, 0xea, 0xcb, 0x18, 0xb2, 0xba, 0xe4, 0x1c, 0x1e, 0xfe, 0x4e, 0x5e, 0x61, 0xf1, 0xa4, 0x07, 0x97, 0x1b, 0x9f, 0x6b, 0xbb, 0x94, 0x6e, 0x73, 0x53, 0x29, + 0xfc, 0x8d, 0x60, 0xd6, 0x6e, 0x26, 0xe7, 0x4c, 0x54, 0x5f, 0xb4, 0x72, 0xd3, 0x98, 0x1b, 0x85, 0x5f, 0x38, 0xc0, 0x80, 0x61, 0x80, 0x2f, 0x86, 0x18, 0x16, 0x09, 0xba, 0x53, 0x93, 0x06, 0x0b, + 0x29, 0xf4, 0x81, 0x7d, 0xc9, 0x8a, 0x58, 0x4f, 0x4e, 0xb6, 0x06, 0x93, 0xeb, 0xb7, 0xae, 0x55, 0x7e, 0x81, 0x93, 0xfb, 0xbc, 0xe0, 0xe4, 0x15, 0x31, 0xc1, 0xcc, 0x61, 0xd4, 0x74, 0x4f, 0x30, + 0xfc, 0x13, 0xe9, 0xcd, 0x15, 0x54, 0xee, 0xb8, 0x4c, 0x7a, 0x61, 0xa4, 0x64, 0xa1, 0xd2, 0xaa, 0xf5, 0xe4, 0xdf, 0x77, 0x5e, 0x3f, 0xa3, 0xe8, 0x09, 0xca, 0x9b, 0xce, 0x46, 0xf1, 0xbb, 0x15, + 0xc6, 0xc8, 0x72, 0x95, 0x85, 0x23, 0xff, 0xa9, 0x0c, 0xc1, 0x05, 0x04, 0x85, 0x4b, 0x8f, 0x9b, 0xed, 0x64, 0x79, 0x48, 0x31, 0x10, 0x90, 0x44, 0xde, 0x2c, 0x74, 0xc2, 0xe0, 0xdf, 0xb4, 0x0a, + 0x9a, 0x77, 0x39, 0x96, 0x9f, 0xe3, 0x1d, 0x25, 0xa9, 0xde, 0x46, 0xa5, 0xfe, 0xed, 0x5e, 0xef, 0x75, 0x96, 0xa1, 0x49, 0x76, 0x5f, 0xf4, 0x97, 0x31, 0x4e, 0x04, 0x0a, 0x32, 0xdb, 0x32, 0x0e, + }; + } + + + namespace t3 { + int internal_rounds = 56; + + int alpha = 5; + + unsigned char mat_diag_m_1[] = { + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + unsigned char round_constants[] = { + 0x16, 0x28, 0x05, 0x97, 0x1a, 0x9a, 0xa0, 0x59, 0x7a, 0xc3, 0xb4, 0x8b, 0xe4, 0xcd, 0x8f, 0x7f, 0xef, 0x04, 0x78, 0x3f, 0xa9, 0xd3, 0xdd, 0x8b, 0xfd, 0xb7, 0x17, 0x55, 0x25, 0x6a, 0x06, 0x1d, + 0x10, 0x16, 0x2c, 0xd3, 0x47, 0x85, 0x23, 0xb7, 0x8e, 0xb6, 0x67, 0x13, 0xf3, 0xfe, 0xc6, 0xb7, 0x20, 0x61, 0xcc, 0xeb, 0x9c, 0x08, 0x3f, 0xac, 0xc6, 0x2d, 0x6f, 0x5f, 0xb5, 0xef, 0xda, 0x29, + 0xd1, 0xe1, 0xb4, 0xb0, 0xd7, 0x7a, 0x8b, 0x9e, 0x4f, 0x5c, 0xec, 0x08, 0x6f, 0xd7, 0x72, 0x25, 0x01, 0xd7, 0x59, 0xd9, 0x8a, 0xd8, 0xcb, 0x1e, 0x00, 0xee, 0x78, 0x4a, 0x62, 0xb1, 0x2c, 0x1f, + 0xe5, 0x31, 0x4f, 0xd8, 0xde, 0x72, 0x06, 0xdb, 0xe1, 0xc6, 0xbb, 0x53, 0x2a, 0x09, 0x1f, 0xb1, 0x27, 0xaa, 0x14, 0x3d, 0xed, 0xc0, 0x77, 0xbd, 0xf2, 0x35, 0x57, 0xf1, 0x79, 0x2e, 0xad, 0x0a, + 0x28, 0x3f, 0xb4, 0x95, 0x15, 0xcf, 0x1c, 0x09, 0x66, 0xce, 0xde, 0xf1, 0x98, 0x8a, 0x02, 0x37, 0x5f, 0x37, 0x94, 0x40, 0xdd, 0x61, 0xf6, 0xd6, 0x8c, 0x73, 0x17, 0x86, 0x4f, 0x62, 0x52, 0x22, + 0x35, 0xd7, 0x18, 0x90, 0x2c, 0x4f, 0x9f, 0xd4, 0x87, 0x2b, 0x4b, 0x52, 0x26, 0x06, 0xc2, 0x91, 0xff, 0xa1, 0x1d, 0x29, 0x4a, 0xa8, 0x65, 0x5a, 0x48, 0x38, 0x8b, 0x92, 0x3a, 0x91, 0x24, 0x1a, + 0x7a, 0xc4, 0x8f, 0x50, 0xe1, 0xda, 0xd6, 0x4f, 0xb1, 0x97, 0xf4, 0xdf, 0x5d, 0x51, 0x41, 0x0a, 0xb1, 0xeb, 0x11, 0x5f, 0x7b, 0x42, 0xfc, 0x7b, 0x4d, 0xb7, 0x59, 0x17, 0x8f, 0x46, 0xfc, 0x22, + 0x4d, 0x6e, 0x7f, 0x61, 0x15, 0x55, 0xd6, 0xef, 0xd5, 0x21, 0x41, 0x0b, 0xff, 0x56, 0x19, 0xe6, 0x7a, 0x10, 0xca, 0xc9, 0xe9, 0x26, 0xd0, 0x9c, 0xed, 0x89, 0x1f, 0x7f, 0x78, 0xca, 0x59, 0x10, + 0xce, 0x81, 0xb9, 0xe8, 0xfa, 0xbb, 0x5c, 0xa4, 0x55, 0xf1, 0xf6, 0x0b, 0x1f, 0x01, 0x23, 0x21, 0x98, 0xde, 0x77, 0xd8, 0x36, 0x35, 0x1f, 0xf6, 0xd8, 0x61, 0x84, 0x35, 0x73, 0x94, 0xbe, 0x02, + 0xa4, 0x84, 0x50, 0x1a, 0x44, 0x3a, 0xff, 0xa1, 0x36, 0x87, 0x5b, 0xac, 0x69, 0xb6, 0xa9, 0xab, 0x23, 0xd6, 0x2e, 0xc8, 0x49, 0xa7, 0x78, 0x27, 0x46, 0x2d, 0x96, 0x32, 0x8e, 0x6c, 0xc9, 0x0e, + 0x7e, 0xf5, 0x4d, 0x81, 0x4d, 0x2e, 0xfb, 0x48, 0x96, 0x9f, 0xc9, 0xb8, 0xcd, 0xa7, 0x47, 0x5a, 0x3f, 0xfa, 0x45, 0x3c, 0x55, 0xd9, 0x42, 0x54, 0x40, 0x77, 0x36, 0x07, 0x6e, 0x90, 0x2f, 0x29, + 0x7e, 0x65, 0xe5, 0xff, 0xb2, 0xf0, 0x63, 0x0c, 0x46, 0xea, 0x94, 0xa3, 0x60, 0x11, 0x61, 0xcc, 0xa5, 0x39, 0x5e, 0x0f, 0x9a, 0x1b, 0xc1, 0x26, 0x67, 0xb8, 0x57, 0x41, 0x44, 0x82, 0x49, 0x27, + 0xb5, 0xd4, 0x97, 0x35, 0xf2, 0x73, 0x95, 0x49, 0x31, 0x87, 0x30, 0x47, 0x2f, 0x19, 0xdd, 0xce, 0xb8, 0x15, 0xf0, 0xbf, 0x55, 0x18, 0x3e, 0xb6, 0x64, 0xe7, 0xb1, 0x54, 0x3e, 0x06, 0x1d, 0x1a, + 0x37, 0x7c, 0x25, 0x5b, 0x2c, 0x00, 0x1b, 0xb9, 0x93, 0x37, 0xaa, 0xc1, 0xcc, 0x5d, 0x23, 0x08, 0x37, 0x06, 0x59, 0x62, 0x95, 0x10, 0x9d, 0x83, 0x68, 0x8e, 0xdf, 0x3f, 0x6f, 0xc6, 0xab, 0x26, + 0xe8, 0x7b, 0x4d, 0xff, 0x12, 0x2b, 0x3c, 0x0b, 0xa7, 0x92, 0xca, 0xab, 0x7a, 0x42, 0x54, 0x07, 0x37, 0xed, 0x5a, 0xed, 0xcf, 0x78, 0xa5, 0x81, 0x53, 0x38, 0x87, 0xd8, 0xa9, 0x64, 0x7c, 0x0c, + 0x95, 0xb4, 0x54, 0x13, 0x83, 0x83, 0xd3, 0xed, 0xb0, 0x86, 0xc3, 0x0d, 0xc3, 0xba, 0x2e, 0xba, 0x1e, 0x2d, 0x8b, 0xd0, 0xb6, 0xf0, 0x17, 0x9e, 0xb7, 0xfa, 0xe9, 0x69, 0x87, 0x99, 0xf5, 0x1c, + 0x09, 0x01, 0x6b, 0xe6, 0x97, 0x0b, 0xba, 0x7a, 0xc1, 0x9b, 0x66, 0xa9, 0x64, 0x87, 0x82, 0x19, 0x8b, 0xe0, 0xe9, 0x61, 0x04, 0xa6, 0x4c, 0x56, 0xb7, 0x31, 0xbe, 0x66, 0x85, 0x3a, 0x5e, 0x0f, + 0x6e, 0x97, 0x1c, 0x53, 0x7a, 0x3d, 0xbf, 0x42, 0x4b, 0x7d, 0x0b, 0x18, 0x3a, 0xa5, 0x59, 0xf3, 0x01, 0x4a, 0x79, 0xb0, 0x4d, 0x0e, 0xe6, 0x95, 0xd8, 0x90, 0xea, 0x19, 0x9d, 0x6a, 0xdf, 0x18, + 0xdc, 0x23, 0x31, 0xfa, 0x55, 0x40, 0x32, 0x4e, 0xef, 0x25, 0x9d, 0x3b, 0x3a, 0x1d, 0xea, 0xd0, 0x1a, 0x60, 0x6e, 0x3c, 0x2c, 0x78, 0x4b, 0x6e, 0xac, 0x38, 0x05, 0x5c, 0x2c, 0xbf, 0xf7, 0x04, + 0xe6, 0xeb, 0x89, 0x8b, 0x62, 0x54, 0x5d, 0xe5, 0x8c, 0x32, 0xa2, 0x4a, 0x58, 0xc0, 0x70, 0xe7, 0x31, 0x85, 0x74, 0x23, 0x85, 0x05, 0x40, 0x3c, 0x6e, 0x20, 0x55, 0x22, 0xe2, 0x6c, 0xc7, 0x29, + 0x15, 0xff, 0xc5, 0xdb, 0x45, 0xe9, 0xe0, 0x00, 0xbe, 0x8d, 0x10, 0xc6, 0xe9, 0xb8, 0xb1, 0x65, 0x5d, 0x7f, 0x34, 0xb4, 0x9a, 0x65, 0x53, 0xc0, 0x85, 0x8e, 0xb7, 0x45, 0x5a, 0x42, 0x8d, 0x19, + 0x74, 0xdf, 0x3f, 0x0c, 0xa9, 0xa9, 0xd3, 0x49, 0x9d, 0xc4, 0xb3, 0x78, 0x68, 0x7f, 0xff, 0xa7, 0xda, 0xa1, 0x98, 0xc5, 0x79, 0xcc, 0xf3, 0x6a, 0x5e, 0xcd, 0x96, 0x62, 0xab, 0x27, 0xee, 0x25, + 0x81, 0x13, 0x6d, 0xa9, 0x87, 0x86, 0xf8, 0xc0, 0xb2, 0xb1, 0x55, 0x0c, 0x7d, 0x5d, 0x84, 0x05, 0x15, 0xeb, 0xb6, 0xc0, 0x01, 0x10, 0x56, 0x24, 0xe0, 0xa1, 0x41, 0xaf, 0xe0, 0xa8, 0x8e, 0x13, + 0x87, 0x56, 0xd9, 0x01, 0x0a, 0x37, 0x13, 0x40, 0xca, 0xf2, 0x11, 0x98, 0x5b, 0x1b, 0x85, 0x42, 0x0e, 0xfd, 0xee, 0xa2, 0xcb, 0xc2, 0xe7, 0xf6, 0x1e, 0x67, 0xab, 0x3f, 0xfb, 0x97, 0x61, 0x30, + 0x20, 0xf6, 0xe8, 0x00, 0xaf, 0x9e, 0x41, 0x86, 0x04, 0x25, 0xb4, 0xe5, 0x65, 0x75, 0xdb, 0x21, 0x1a, 0x4f, 0x4d, 0x89, 0xb4, 0xf0, 0x66, 0x2b, 0x43, 0xa4, 0x32, 0xdc, 0x52, 0x7d, 0x0c, 0x1a, + 0x9f, 0x4a, 0xc5, 0xa2, 0x7d, 0x99, 0x52, 0xaa, 0x6c, 0xcd, 0x63, 0x51, 0xf5, 0xe5, 0xfb, 0xeb, 0xcc, 0xdf, 0x8b, 0x5c, 0x8e, 0x6a, 0xf8, 0x3f, 0x5f, 0x91, 0x80, 0xde, 0x18, 0xb4, 0x46, 0x2b, + 0x64, 0x9f, 0x82, 0xb5, 0x12, 0xe3, 0x46, 0xfb, 0x5b, 0xe0, 0x48, 0xdb, 0xf5, 0x1a, 0x3a, 0x61, 0xf9, 0x3a, 0x67, 0xb9, 0x77, 0xb7, 0xf8, 0x01, 0x37, 0x87, 0x85, 0x00, 0xdc, 0xe0, 0xd3, 0x12, + 0x1f, 0x3a, 0x9b, 0xb1, 0x5c, 0x8a, 0x33, 0xba, 0x8d, 0x64, 0x0f, 0x23, 0x68, 0xf7, 0x2b, 0xfb, 0x9f, 0x08, 0x1d, 0xd2, 0x2e, 0x00, 0xf5, 0x70, 0x88, 0x3a, 0xdc, 0x74, 0xcf, 0x90, 0x33, 0x26, + 0xcd, 0x3d, 0x00, 0x2b, 0xb5, 0x3d, 0x54, 0x7d, 0x1d, 0x6f, 0xf9, 0x40, 0xaf, 0xb5, 0xab, 0xf8, 0xd0, 0x7a, 0x60, 0xca, 0xb4, 0x84, 0xc8, 0x0a, 0xa6, 0x68, 0xe6, 0x5f, 0x3a, 0xf3, 0x14, 0x0a, + 0xb9, 0x83, 0xc6, 0x9b, 0x82, 0xdf, 0x47, 0xd8, 0x1d, 0x1a, 0x17, 0x01, 0x4f, 0x3a, 0xbe, 0x27, 0xda, 0xb2, 0x68, 0x9d, 0x50, 0x86, 0x5e, 0x1a, 0xab, 0x3e, 0x51, 0x86, 0xc5, 0xd9, 0xea, 0x28, + 0x6c, 0x41, 0xa7, 0xe1, 0xa6, 0xcd, 0x16, 0xea, 0xff, 0x1c, 0xe7, 0xab, 0xa1, 0x0e, 0x8f, 0x88, 0xc9, 0x2a, 0xdb, 0x1b, 0x1f, 0x03, 0x72, 0x09, 0x43, 0xc6, 0xc3, 0x28, 0xc3, 0xb1, 0x6a, 0x1c, + 0x94, 0x2c, 0xb4, 0xc5, 0x15, 0x60, 0x34, 0x32, 0xa9, 0x98, 0xcb, 0x08, 0xd6, 0xec, 0x6d, 0x4f, 0xe0, 0x8d, 0x7f, 0x9f, 0x23, 0x00, 0x25, 0x2b, 0x79, 0x19, 0xb8, 0xc0, 0x1b, 0xe7, 0xc7, 0x1f, + 0xa8, 0xda, 0x0d, 0x3a, 0xb9, 0x85, 0xdd, 0xe6, 0x0e, 0x65, 0x52, 0xc9, 0x97, 0xe1, 0xc1, 0xc0, 0x17, 0x8f, 0x29, 0x60, 0xd8, 0xe0, 0x80, 0xe3, 0xec, 0xb2, 0x42, 0x3a, 0xeb, 0x07, 0xe1, 0x03, + 0xcd, 0x78, 0x1d, 0x94, 0xf6, 0x05, 0x45, 0x45, 0x7f, 0x69, 0x08, 0x7c, 0xa5, 0x2c, 0x45, 0x46, 0x2c, 0x77, 0x8b, 0xf8, 0x2b, 0xd5, 0xc0, 0x69, 0x46, 0x1a, 0x38, 0x1f, 0x25, 0x4a, 0x35, 0x2d, + 0x4b, 0x79, 0x6f, 0x82, 0x06, 0x46, 0x4b, 0xd1, 0xa3, 0xed, 0x06, 0x16, 0xd6, 0x51, 0x25, 0x52, 0x1c, 0x6d, 0x56, 0xbc, 0x14, 0xef, 0x87, 0xf6, 0xba, 0x94, 0x5d, 0xb0, 0x8a, 0xf8, 0x4a, 0x09, + 0xf7, 0x96, 0x13, 0x9d, 0x24, 0x2d, 0x2b, 0xd5, 0xa9, 0x95, 0x31, 0x2e, 0x6f, 0x5b, 0xab, 0xe1, 0xa5, 0x8c, 0x2f, 0xf0, 0xab, 0xae, 0xbc, 0x19, 0xdc, 0xd2, 0xf3, 0x3b, 0x78, 0x5b, 0x70, 0x19, + 0x0e, 0x20, 0x71, 0x22, 0x85, 0xf6, 0xce, 0x60, 0x3e, 0x0a, 0x74, 0x7d, 0x6b, 0xb1, 0x23, 0x87, 0xb2, 0xc5, 0x4f, 0xe5, 0xfe, 0x33, 0xcc, 0x1f, 0x3f, 0xce, 0x8b, 0x3a, 0xcc, 0x4a, 0xbf, 0x09, + 0x4e, 0x5e, 0x3b, 0x3f, 0x3f, 0x07, 0x3a, 0x54, 0x58, 0x70, 0x1f, 0x30, 0x2f, 0x73, 0x13, 0x34, 0x84, 0x62, 0xab, 0x8f, 0x0c, 0x3c, 0xf8, 0x50, 0x3c, 0x01, 0xb6, 0x0d, 0x20, 0xf8, 0x03, 0x18, + 0x5c, 0x3e, 0xaf, 0x2f, 0xef, 0x7f, 0x1f, 0xd4, 0xad, 0xc0, 0x54, 0x44, 0x2d, 0xb0, 0x6f, 0xbf, 0x38, 0x1f, 0x8d, 0x0b, 0x16, 0x5b, 0x59, 0x30, 0xde, 0x44, 0x62, 0x04, 0xb5, 0xaf, 0x80, 0x0f, + 0x78, 0x9d, 0x52, 0x19, 0x82, 0xf9, 0xc3, 0x7d, 0xea, 0x6f, 0x4a, 0x3f, 0x64, 0xcf, 0xcf, 0xab, 0x64, 0xc9, 0xcf, 0xc1, 0x88, 0x00, 0x7f, 0xd7, 0xc3, 0x15, 0x4f, 0x50, 0xf8, 0xe1, 0x6e, 0x12, + 0x91, 0xa5, 0xd0, 0xd7, 0x91, 0xf9, 0x86, 0xef, 0xf8, 0xdd, 0x75, 0x31, 0xe6, 0x4e, 0xfb, 0x0f, 0xa1, 0x2c, 0x55, 0x19, 0xd9, 0xb3, 0xbf, 0x69, 0x0f, 0xc6, 0xfc, 0x0c, 0xd1, 0x03, 0xc2, 0x23, + 0x94, 0xfb, 0x44, 0x77, 0x9f, 0x33, 0x5a, 0x7c, 0x74, 0xcf, 0xc2, 0xee, 0xe4, 0x1e, 0xec, 0x3d, 0x30, 0xa6, 0xa3, 0x5f, 0x70, 0x09, 0x0d, 0xec, 0x09, 0x37, 0x14, 0x8b, 0x5d, 0xe1, 0x2a, 0x2a, + 0x2b, 0x0b, 0x97, 0x81, 0x90, 0xd8, 0xb5, 0xb6, 0xbb, 0x61, 0xb4, 0x6c, 0x00, 0xb3, 0xd3, 0xc3, 0xec, 0x43, 0x63, 0xab, 0x81, 0xc3, 0xe5, 0x47, 0xef, 0xd6, 0x6e, 0x58, 0xee, 0x0d, 0xb6, 0x07, + 0xbd, 0x11, 0x93, 0x3c, 0x58, 0xfe, 0x2c, 0x13, 0x52, 0xd1, 0xa7, 0xba, 0x20, 0xa3, 0x98, 0x8a, 0x3d, 0xae, 0xc1, 0x94, 0xc4, 0x95, 0x5d, 0x88, 0xfd, 0xed, 0xe3, 0x9b, 0x55, 0x6b, 0x31, 0x27, + 0x76, 0x2e, 0x34, 0xc0, 0xf0, 0x9a, 0x5f, 0x2f, 0x66, 0xed, 0x43, 0xa7, 0xc2, 0x4c, 0x83, 0xef, 0x11, 0x43, 0xf8, 0xd3, 0xb2, 0x7c, 0x93, 0xd8, 0xb8, 0x32, 0x7c, 0x15, 0xba, 0x49, 0x5c, 0x1d, + 0x88, 0x84, 0x96, 0x40, 0x59, 0xbd, 0x24, 0x7c, 0xf6, 0x38, 0x99, 0x97, 0xf6, 0x1b, 0xc0, 0x09, 0xec, 0xb5, 0x50, 0xb8, 0xe0, 0x74, 0x27, 0x33, 0x2f, 0x3b, 0x16, 0x78, 0x4e, 0x12, 0x8b, 0x2f, + 0xd5, 0xb3, 0x13, 0x01, 0x26, 0x75, 0x5f, 0x66, 0x84, 0x1d, 0xe5, 0x54, 0x65, 0xba, 0x4c, 0x1d, 0x1b, 0xe2, 0x9c, 0x9a, 0xa0, 0x7a, 0x5b, 0xdc, 0xb6, 0x16, 0x74, 0x45, 0xa5, 0x43, 0x68, 0x1e, + 0x4b, 0x1d, 0x64, 0x21, 0x9f, 0xc7, 0x5b, 0x1f, 0xab, 0x89, 0xa1, 0xc6, 0x9a, 0xaf, 0x8d, 0xa6, 0xd9, 0x8a, 0x9c, 0x92, 0xc9, 0x25, 0xca, 0x5f, 0xc5, 0x50, 0xf6, 0x35, 0x0a, 0xf0, 0xcd, 0x11, + 0xbc, 0x60, 0xb5, 0x7e, 0x9b, 0x5b, 0x2b, 0xe8, 0xb7, 0x55, 0x73, 0xc7, 0x15, 0x28, 0x8b, 0x60, 0xd4, 0xd6, 0x58, 0x81, 0x58, 0x6e, 0xf3, 0x2e, 0xe4, 0xc5, 0xbb, 0xd3, 0xe3, 0x2d, 0x63, 0x21, + 0x8a, 0x49, 0x18, 0x1c, 0xc5, 0xb5, 0xd7, 0x49, 0xe4, 0x29, 0xa3, 0xf2, 0x8e, 0xe4, 0x5a, 0x25, 0xe0, 0x45, 0xd2, 0xfb, 0x25, 0x70, 0xb2, 0x97, 0xbd, 0xef, 0x52, 0x84, 0x75, 0x25, 0xe6, 0x0d, + 0x98, 0x80, 0x83, 0xa0, 0x6b, 0x54, 0x09, 0x9b, 0xb0, 0xb6, 0x0f, 0x6f, 0x1c, 0x1e, 0x9e, 0xdd, 0x01, 0xcc, 0x76, 0xd9, 0xd4, 0xbf, 0xfe, 0xe2, 0x13, 0x52, 0xe7, 0x53, 0xc0, 0x53, 0xd2, 0x2a, + 0x77, 0xb0, 0x60, 0x8d, 0xe3, 0x02, 0x57, 0xd3, 0xb7, 0x13, 0xc8, 0x13, 0xdd, 0x9c, 0xd4, 0x3d, 0xe9, 0x3b, 0x9b, 0xc3, 0x1e, 0x68, 0xc7, 0x6e, 0xdc, 0x72, 0x38, 0xd6, 0x9e, 0x16, 0x6b, 0x1d, + 0xfe, 0xf7, 0xfe, 0x6c, 0x70, 0x4e, 0xa5, 0xc3, 0x68, 0x55, 0x4d, 0xa2, 0x70, 0xea, 0xe3, 0x0b, 0xed, 0x7f, 0xb6, 0x41, 0x49, 0x7c, 0x12, 0xb9, 0x4b, 0x66, 0x43, 0xa1, 0x40, 0xb7, 0x60, 0x16, + 0xfe, 0xcb, 0x6c, 0x37, 0x10, 0x9f, 0xa2, 0x96, 0x90, 0x87, 0xcf, 0x12, 0xdb, 0xdd, 0xac, 0xce, 0xe0, 0x76, 0xef, 0xde, 0xa2, 0x4c, 0x4f, 0x11, 0x34, 0x1f, 0xe8, 0x1d, 0x2d, 0xa9, 0x65, 0x00, + 0x0d, 0x04, 0x71, 0x58, 0x0a, 0xd5, 0x30, 0xcf, 0x9b, 0x86, 0xc4, 0xcb, 0x2c, 0xbe, 0x3e, 0x35, 0x2c, 0x67, 0x7d, 0xda, 0x23, 0xf8, 0x67, 0x73, 0x98, 0x35, 0x25, 0x20, 0x65, 0xf0, 0x11, 0x1f, + 0x3e, 0x69, 0xf0, 0x7d, 0xd1, 0x52, 0x08, 0x11, 0xba, 0x59, 0x67, 0x9b, 0xa3, 0xd1, 0xd1, 0x3b, 0xdd, 0xc3, 0xa2, 0x14, 0x7b, 0xce, 0x37, 0xb4, 0xd1, 0xa5, 0xd5, 0x5d, 0x5c, 0x6f, 0x59, 0x26, + 0x0f, 0x86, 0x91, 0xaf, 0x15, 0xdb, 0x43, 0x67, 0x70, 0x1e, 0x5f, 0x3a, 0x16, 0xc4, 0x39, 0x85, 0xd3, 0xb6, 0xf8, 0xfc, 0x6e, 0x05, 0xf3, 0x7b, 0x2f, 0x5a, 0xe4, 0x27, 0xc7, 0x9b, 0xf4, 0x16, + 0x5f, 0x9e, 0xd3, 0x8d, 0x43, 0xe7, 0xa4, 0xe1, 0xc5, 0x3d, 0x8b, 0xea, 0xf7, 0xea, 0x8f, 0x56, 0xf4, 0x1b, 0x33, 0xfb, 0x5e, 0x17, 0x54, 0x99, 0x11, 0xe3, 0xb3, 0x45, 0xeb, 0x1d, 0xbe, 0x1a, + 0x59, 0xba, 0x5f, 0xa1, 0xae, 0x34, 0x0d, 0x02, 0x02, 0xf1, 0xc5, 0xae, 0x2a, 0xb9, 0x5d, 0x9f, 0x77, 0x8b, 0x54, 0xca, 0x74, 0x3a, 0x99, 0xd8, 0xd1, 0x84, 0x69, 0xb6, 0xca, 0x6c, 0x42, 0x0e, + 0xc6, 0xa6, 0xf6, 0x03, 0x43, 0x92, 0x41, 0xa8, 0x4f, 0x53, 0x2d, 0x90, 0x4b, 0x68, 0x71, 0x00, 0x1f, 0x3f, 0x05, 0x42, 0x19, 0xbd, 0x33, 0x49, 0x7f, 0x95, 0xe8, 0xe2, 0xc2, 0x30, 0x7c, 0x0e, + 0x9d, 0xc6, 0x3f, 0x1d, 0xf3, 0xe1, 0x76, 0x4c, 0xad, 0x8e, 0x52, 0xe3, 0xd6, 0xde, 0x66, 0x61, 0x1d, 0xff, 0xed, 0xc7, 0x8f, 0x70, 0x22, 0x16, 0x0a, 0xcf, 0x92, 0xca, 0x17, 0xa0, 0x12, 0x08, + 0x54, 0x0d, 0x01, 0xcf, 0x47, 0x6b, 0x27, 0x2e, 0x9c, 0x7a, 0xdd, 0x6e, 0x02, 0xe5, 0xaf, 0x68, 0x00, 0x04, 0x96, 0xdb, 0xd1, 0x49, 0xa9, 0xbb, 0xb5, 0xc1, 0x2b, 0xdf, 0xe3, 0xad, 0xa5, 0x21, + 0xce, 0x49, 0x87, 0x3f, 0x23, 0xa5, 0xb1, 0x72, 0xfe, 0x5a, 0x0e, 0xf5, 0x45, 0x19, 0x10, 0xbd, 0xc6, 0xc6, 0x58, 0xa0, 0xf1, 0x1b, 0x71, 0xad, 0x84, 0x6c, 0x81, 0x63, 0x54, 0x03, 0xf3, 0x01, + 0x8b, 0x1c, 0x0c, 0x0f, 0x2b, 0xa8, 0xca, 0x4d, 0xdf, 0x0f, 0xbd, 0x8d, 0x39, 0xf9, 0xf2, 0x8b, 0x5e, 0x6a, 0xd0, 0xc2, 0xaf, 0x2a, 0x8c, 0x02, 0xe2, 0xc0, 0x38, 0xf0, 0x72, 0x55, 0x11, 0x0b, + 0x2f, 0x9e, 0xf5, 0x6e, 0x3b, 0x61, 0x60, 0x34, 0x0a, 0x91, 0xbc, 0x42, 0xdb, 0x24, 0xfc, 0x27, 0x2e, 0x0d, 0xf5, 0x43, 0x55, 0x25, 0xef, 0xf0, 0xd4, 0x2f, 0xb6, 0x99, 0x0b, 0xec, 0x38, 0x1c, + 0x3e, 0xc5, 0x80, 0xd8, 0x54, 0xb2, 0xd0, 0xb1, 0xd4, 0x97, 0xa2, 0x06, 0x46, 0x31, 0x5d, 0x2f, 0x7b, 0x73, 0xac, 0xf4, 0xf1, 0x3f, 0x5c, 0x42, 0xe8, 0x72, 0x62, 0x66, 0xd9, 0xc6, 0x89, 0x1c, + 0x8f, 0x8f, 0xb8, 0x1b, 0x31, 0xe2, 0x71, 0x8b, 0xb3, 0x5e, 0x7a, 0x09, 0x80, 0x48, 0xad, 0x21, 0x2a, 0x04, 0x4c, 0xae, 0x08, 0x40, 0xd4, 0xf6, 0x6b, 0x35, 0x80, 0x35, 0x64, 0x6e, 0x32, 0x03, + 0xc9, 0xa4, 0x10, 0x99, 0x29, 0xe2, 0xdd, 0x5b, 0xeb, 0xdc, 0xb5, 0x34, 0x64, 0x7a, 0xf2, 0x50, 0xad, 0xe3, 0x51, 0x0e, 0xea, 0xe9, 0xce, 0x67, 0x3f, 0xb7, 0x4f, 0x05, 0xb0, 0x76, 0x80, 0x26, + 0xd0, 0x7a, 0x74, 0xf8, 0xa6, 0x4a, 0xd0, 0x78, 0x01, 0xf1, 0xe4, 0xd8, 0xa9, 0x8e, 0xa1, 0x5d, 0x2e, 0xa3, 0xbd, 0x91, 0x34, 0xd9, 0x6e, 0x62, 0xb1, 0x9a, 0xbc, 0x7f, 0xc6, 0x63, 0xcd, 0x1a, + 0xa5, 0xb5, 0x28, 0x2a, 0xcd, 0x86, 0x8c, 0xca, 0xc3, 0x3e, 0x32, 0xe2, 0x75, 0x33, 0xf9, 0x1b, 0x90, 0xf6, 0x8e, 0xe5, 0x4b, 0x14, 0xe3, 0xc4, 0x66, 0xab, 0xe8, 0x70, 0xd6, 0xa5, 0xf8, 0x19, + 0x93, 0x68, 0x9b, 0x7b, 0x5f, 0xbb, 0xcf, 0xe1, 0x2a, 0xc9, 0xf6, 0x51, 0xea, 0x93, 0x81, 0x06, 0x11, 0xa0, 0x10, 0xdf, 0xd2, 0x40, 0xfa, 0x6e, 0xa8, 0xd7, 0x9a, 0x51, 0x43, 0xc4, 0x0d, 0x1c, + 0x3d, 0x7d, 0x98, 0x24, 0x32, 0x4c, 0x0e, 0x18, 0xc4, 0xa2, 0xf6, 0xb4, 0x3c, 0xb3, 0xea, 0xfb, 0x19, 0xdc, 0x21, 0xe4, 0x90, 0x71, 0xfe, 0x50, 0xbe, 0x8d, 0x06, 0xa4, 0x7a, 0x9e, 0xb3, 0x14, + 0x5e, 0x79, 0xb0, 0x28, 0x5e, 0xe3, 0xb1, 0xaf, 0x21, 0xf0, 0x01, 0x9f, 0x51, 0xfc, 0x20, 0xb8, 0xb7, 0x61, 0xc5, 0xa6, 0x3e, 0xc6, 0x28, 0x8f, 0xc5, 0x6e, 0x82, 0xbd, 0x71, 0x9b, 0x44, 0x1d, + 0xfc, 0x87, 0xe9, 0xa9, 0xc0, 0x4d, 0x52, 0x76, 0x22, 0x25, 0xd1, 0x89, 0x16, 0x14, 0xde, 0x89, 0x8e, 0x9d, 0xfe, 0x60, 0xfe, 0x97, 0xfa, 0x60, 0xbb, 0xdd, 0xaa, 0x9b, 0xa8, 0xc9, 0xa2, 0x1e, + 0xf1, 0x7f, 0x3c, 0xdb, 0xef, 0x5c, 0x4d, 0x13, 0x58, 0xc0, 0xe9, 0xa0, 0x46, 0x9a, 0x1f, 0x59, 0xd7, 0x2b, 0x6a, 0x3d, 0x1c, 0x9c, 0x7e, 0xb5, 0x8c, 0x5a, 0x53, 0x43, 0x6d, 0xd6, 0x78, 0x04, + 0xbe, 0xbe, 0x00, 0x7b, 0x4a, 0x5e, 0xde, 0x1c, 0xb2, 0x00, 0xc4, 0x86, 0xad, 0x26, 0x2e, 0x66, 0xd2, 0x9c, 0x7f, 0x71, 0xb2, 0xf3, 0x08, 0xf6, 0xa6, 0xe6, 0xec, 0x1e, 0xb7, 0x2d, 0x27, 0x19, + 0x66, 0x41, 0x13, 0xaf, 0x46, 0xe8, 0x9b, 0x03, 0x75, 0xef, 0x87, 0x6a, 0xd6, 0x1b, 0xdd, 0xb2, 0xab, 0x08, 0x92, 0xf0, 0x46, 0xc7, 0x49, 0xc7, 0x33, 0xab, 0x5c, 0x33, 0x37, 0x65, 0x22, 0x14, + 0xce, 0xa9, 0xf9, 0x61, 0x49, 0xf4, 0x12, 0xf9, 0x23, 0xe8, 0xc2, 0xa1, 0xe4, 0x21, 0x1c, 0xb2, 0x88, 0xa0, 0x76, 0xd9, 0xc0, 0x38, 0xfe, 0x9d, 0x4f, 0x29, 0x56, 0x59, 0xf1, 0x6a, 0xfd, 0x01, + 0x57, 0x2a, 0x5f, 0x4e, 0x8d, 0x51, 0xd8, 0x5a, 0x5a, 0xba, 0x29, 0xd2, 0x2e, 0xe6, 0xe2, 0xae, 0x1a, 0xab, 0x2c, 0x8b, 0x0b, 0x19, 0xca, 0x7b, 0x30, 0xec, 0x26, 0xd6, 0xed, 0xab, 0xe5, 0x18, + 0xa6, 0xfd, 0x84, 0x1c, 0xdc, 0x54, 0x2d, 0x0e, 0x6d, 0x92, 0x09, 0xa4, 0xa3, 0x21, 0xc0, 0x97, 0x32, 0x5e, 0xb3, 0xd3, 0xa6, 0xff, 0xbd, 0xab, 0xf5, 0x90, 0x05, 0xba, 0xce, 0xbb, 0xc1, 0x0f, + }; + } + + + namespace t4 { + int internal_rounds = 56; + + int alpha = 5; + + unsigned char mat_diag_m_1[] = { + 0xe7, 0xb6, 0xd3, 0x19, 0xfd, 0x21, 0x68, 0xb5, 0x7f, 0x1d, 0xca, 0x29, 0x89, 0xf9, 0x03, 0x0d, 0x0c, 0x49, 0xd9, 0x4b, 0x3b, 0xe0, 0xb1, 0x04, 0x8b, 0xa3, 0x6e, 0x00, 0x9c, 0x6e, 0xdc, 0x10, + 0x0b, 0x74, 0x5a, 0xb4, 0xcf, 0x38, 0x6b, 0xa8, 0x84, 0x9b, 0xdd, 0xd4, 0x56, 0x97, 0xdf, 0x99, 0xb5, 0x3b, 0x0b, 0xa3, 0xd0, 0xb3, 0x49, 0x01, 0x3e, 0xdf, 0x44, 0x6a, 0x5b, 0x14, 0x28, 0x0c, + 0x15, 0xac, 0x1c, 0x14, 0x00, 0x7d, 0x06, 0x70, 0x61, 0x59, 0xe3, 0x60, 0xbb, 0x75, 0x1f, 0xb2, 0x98, 0x27, 0x39, 0x50, 0x5a, 0x64, 0xc7, 0xb2, 0x18, 0x15, 0x79, 0x38, 0x83, 0x4b, 0x54, 0x00, + 0x8b, 0x42, 0xee, 0x33, 0x44, 0x53, 0xbc, 0x13, 0x26, 0x85, 0xfa, 0xb8, 0xa3, 0x05, 0xe1, 0x52, 0xe3, 0x89, 0x27, 0x12, 0xeb, 0x82, 0x2e, 0x2e, 0x6f, 0x38, 0x18, 0x57, 0x17, 0x01, 0x2c, 0x22, + }; + + unsigned char round_constants[] = { + 0xe5, 0x23, 0xed, 0x69, 0xe2, 0x78, 0x08, 0x8b, 0x23, 0x26, 0xdc, 0x4e, 0x74, 0x86, 0xbb, 0x02, 0x43, 0x4a, 0x5e, 0xbd, 0x39, 0x1d, 0xda, 0x48, 0x68, 0xb0, 0x50, 0x94, 0xf6, 0x49, 0xb8, 0x19, + 0xd6, 0x34, 0xcf, 0x8d, 0x0c, 0xf8, 0x47, 0xad, 0x1d, 0xcc, 0x0a, 0x45, 0xc7, 0x2c, 0xeb, 0x20, 0x13, 0x0a, 0x8f, 0x75, 0x7b, 0x34, 0x39, 0x72, 0xbd, 0x51, 0xdd, 0x27, 0xe1, 0xdf, 0x5d, 0x26, + 0xaa, 0xd8, 0x97, 0xb4, 0xba, 0x36, 0xfc, 0x3d, 0xaa, 0xc2, 0x15, 0x50, 0x84, 0xac, 0x08, 0x41, 0x62, 0x51, 0x1e, 0x5e, 0x54, 0x6a, 0xf6, 0xe0, 0x09, 0x18, 0x2f, 0x47, 0xec, 0x50, 0x97, 0x19, + 0xf8, 0xcd, 0xf1, 0xc7, 0x87, 0xf7, 0x32, 0xd0, 0xff, 0xf0, 0x67, 0x50, 0xa2, 0x3e, 0x74, 0x4d, 0xb1, 0x02, 0x43, 0xf7, 0xa5, 0x06, 0x0f, 0x11, 0x08, 0x72, 0xac, 0x65, 0xfe, 0xf3, 0x7f, 0x15, + 0x02, 0x49, 0xc9, 0x6a, 0x89, 0xf4, 0x18, 0xfe, 0xee, 0x8b, 0x2f, 0x69, 0x90, 0xc5, 0x15, 0x0b, 0xf1, 0x33, 0xca, 0x5f, 0xc4, 0x5a, 0xd3, 0x5f, 0x9c, 0xdd, 0x69, 0x45, 0x3c, 0xc4, 0x49, 0x2e, + 0x1e, 0x1f, 0x2d, 0xfa, 0x5f, 0x34, 0x31, 0x27, 0xa8, 0x4f, 0xc2, 0x73, 0x69, 0x0b, 0x2f, 0xcb, 0xc3, 0x06, 0x65, 0x6d, 0x2b, 0xef, 0x4a, 0x0d, 0x52, 0x90, 0x18, 0x98, 0x89, 0xfb, 0x35, 0x0e, + 0x96, 0xb9, 0xe0, 0x02, 0x30, 0x72, 0xfe, 0xc6, 0xfe, 0x7f, 0x66, 0x6d, 0x80, 0xe7, 0xd9, 0xa9, 0x1b, 0x4f, 0x94, 0x5e, 0xae, 0x09, 0xf1, 0x05, 0x11, 0x4f, 0x5c, 0xb1, 0x7c, 0xd4, 0x1a, 0x25, + 0x4e, 0xdf, 0x22, 0x9c, 0x9d, 0xa3, 0x3f, 0x56, 0xf3, 0xe5, 0x05, 0xdd, 0x6f, 0xb5, 0xbe, 0xf8, 0x41, 0x46, 0x23, 0x60, 0x71, 0xe9, 0x73, 0x98, 0x36, 0x28, 0xd4, 0x64, 0xdc, 0x07, 0xda, 0x13, + 0x38, 0x47, 0xfd, 0x55, 0x90, 0xb8, 0xe7, 0x46, 0xcd, 0x50, 0xd3, 0x89, 0x96, 0x93, 0x53, 0xa5, 0x83, 0x74, 0xef, 0xcc, 0x7d, 0x0c, 0xc0, 0x3d, 0xd2, 0xe6, 0x50, 0xe6, 0x84, 0x9b, 0x00, 0x0c, + 0x06, 0xca, 0xfd, 0xbe, 0x74, 0xec, 0x3d, 0x20, 0xb0, 0x5e, 0x53, 0x6d, 0x0c, 0x65, 0xeb, 0x04, 0x8b, 0x2d, 0xf4, 0x56, 0x39, 0x2e, 0x99, 0x01, 0x4f, 0x85, 0x3a, 0xc6, 0xb1, 0x16, 0x1f, 0x01, + 0x49, 0x75, 0x36, 0x3f, 0x09, 0x07, 0xdf, 0x85, 0x54, 0xd4, 0x7a, 0x46, 0xd0, 0x78, 0x3f, 0x2f, 0x61, 0x79, 0xaa, 0x1d, 0x56, 0x9a, 0x9d, 0x20, 0x8f, 0x68, 0x3a, 0x38, 0x5e, 0x9e, 0xd6, 0x0e, + 0x9b, 0x78, 0x9f, 0x4c, 0x26, 0x72, 0x36, 0x46, 0x3f, 0xd3, 0xb3, 0x5e, 0x7f, 0x50, 0xec, 0x3a, 0xbe, 0x6b, 0x2b, 0x47, 0x41, 0xad, 0xac, 0x21, 0xe2, 0xe9, 0x0c, 0x7b, 0x4a, 0xa9, 0xdb, 0x04, + 0xe8, 0x28, 0xfa, 0xd4, 0xf1, 0x2f, 0x73, 0xce, 0xf7, 0x0b, 0xb5, 0x4b, 0x7d, 0x75, 0x36, 0x60, 0x7b, 0x23, 0x9d, 0x1c, 0x27, 0x94, 0xb0, 0x6e, 0xa1, 0xf3, 0x40, 0xd8, 0x37, 0x26, 0x3f, 0x0a, + 0x3f, 0x32, 0x82, 0x11, 0x5d, 0x48, 0x4a, 0xe5, 0xb6, 0x64, 0x95, 0x56, 0x75, 0xf0, 0xb1, 0x39, 0xfa, 0x38, 0xdb, 0x2f, 0x50, 0x1c, 0x8a, 0x8f, 0x19, 0xea, 0x9e, 0x12, 0x6f, 0x66, 0x9a, 0x25, + 0xa1, 0xd6, 0xe0, 0xed, 0xf7, 0xfd, 0x32, 0x7a, 0x15, 0xe5, 0x38, 0x10, 0x27, 0xd4, 0x45, 0x77, 0x7f, 0xa4, 0xe3, 0x4e, 0x6a, 0xd0, 0xe7, 0xd8, 0xc6, 0xf4, 0xb2, 0xc9, 0x59, 0x74, 0xbf, 0x28, + 0x47, 0x24, 0x43, 0x41, 0x69, 0xbd, 0x91, 0xec, 0xae, 0xa2, 0xe6, 0xcc, 0xbb, 0x85, 0x7c, 0xc3, 0xd4, 0xe8, 0x9b, 0x48, 0x0f, 0x20, 0xea, 0x26, 0x75, 0x03, 0x57, 0xf0, 0x41, 0xa9, 0x1c, 0x0a, + 0xcf, 0x61, 0x63, 0x92, 0xfd, 0x26, 0x3a, 0xb4, 0xdc, 0x51, 0xf0, 0x39, 0x15, 0xed, 0x35, 0x55, 0x85, 0x12, 0x45, 0xc5, 0x4f, 0xfd, 0xd7, 0x53, 0x30, 0xe9, 0xe0, 0x8b, 0x95, 0x8f, 0x6f, 0x0c, + 0x11, 0xf8, 0xaa, 0x9c, 0xe6, 0x57, 0xdd, 0x84, 0xe0, 0x96, 0xe2, 0x08, 0x07, 0xa0, 0xe8, 0xa9, 0x0a, 0xd9, 0xc9, 0x8a, 0x12, 0xe8, 0x26, 0xd4, 0x78, 0x75, 0xd1, 0x3c, 0xa9, 0x06, 0x31, 0x12, + 0x75, 0xee, 0x2d, 0xcd, 0x67, 0x48, 0x07, 0x7b, 0x87, 0xf1, 0xe8, 0xf1, 0x3f, 0xa8, 0x8f, 0x5e, 0x08, 0x40, 0xe8, 0xf8, 0x52, 0xab, 0xd3, 0x7d, 0xd9, 0x85, 0x92, 0xad, 0x52, 0xba, 0xe1, 0x26, + 0xc5, 0xe2, 0x4a, 0x6a, 0x7e, 0x53, 0x71, 0x44, 0x86, 0x95, 0xe0, 0xf9, 0x7b, 0x8b, 0x4d, 0xbe, 0x7c, 0xc9, 0xb9, 0x47, 0x5c, 0x4c, 0xa6, 0x18, 0xde, 0x33, 0xd1, 0x7b, 0xad, 0x5c, 0xb5, 0x1c, + 0xd0, 0x55, 0x90, 0x6e, 0x8e, 0xf0, 0x43, 0x71, 0x1c, 0xa4, 0x60, 0x50, 0x3d, 0x04, 0x53, 0x2a, 0x6d, 0x7f, 0xde, 0x4b, 0xe0, 0x7c, 0x2c, 0x0e, 0x8e, 0x8f, 0xcd, 0x6a, 0xe4, 0x73, 0xcd, 0x1d, + 0x74, 0x55, 0x2e, 0x51, 0xb4, 0x9b, 0x2b, 0xb1, 0xb9, 0xe9, 0xb4, 0x0e, 0x4a, 0x29, 0xda, 0x0c, 0xef, 0x4d, 0x4a, 0x47, 0x05, 0x2f, 0x85, 0xf5, 0x66, 0x9c, 0x6d, 0x2f, 0xe3, 0x03, 0x10, 0x01, + 0x8c, 0xae, 0x87, 0x22, 0xdd, 0x08, 0xc5, 0xd7, 0xfe, 0xba, 0x58, 0x3f, 0x90, 0xe5, 0xdf, 0xba, 0xfe, 0x7d, 0xa5, 0x03, 0x0d, 0xf2, 0xd5, 0x9a, 0xb2, 0x0a, 0xd1, 0xc1, 0x9a, 0x80, 0x1e, 0x2b, + 0xa5, 0xc0, 0xce, 0x7b, 0xe8, 0x9a, 0xa6, 0xea, 0xfa, 0xc5, 0x2f, 0xab, 0x05, 0x5d, 0x99, 0xef, 0xd0, 0x7e, 0xe1, 0x5e, 0xc3, 0xda, 0xb4, 0x9f, 0x99, 0x35, 0xb7, 0x85, 0x17, 0xde, 0x39, 0x25, + 0x1d, 0x95, 0x77, 0x1d, 0xb1, 0x2c, 0x98, 0x43, 0x6e, 0xd4, 0x86, 0x1c, 0xd4, 0xc3, 0xe1, 0xf4, 0x0e, 0x0a, 0x3e, 0x2b, 0x22, 0x7f, 0x49, 0x26, 0x01, 0xee, 0xf8, 0x2e, 0x5a, 0x6c, 0x24, 0x0c, + 0x7b, 0x52, 0x3b, 0xd0, 0xf5, 0x05, 0x03, 0x3f, 0x2f, 0x1c, 0x1a, 0xad, 0xa6, 0xe6, 0x09, 0xbb, 0xed, 0x32, 0x06, 0x7c, 0x8f, 0x14, 0x08, 0x54, 0xe9, 0x68, 0x4f, 0x97, 0xc4, 0x89, 0x20, 0x19, + 0x85, 0x0d, 0xa6, 0xb5, 0x2f, 0xdc, 0x8f, 0x6d, 0x75, 0x6b, 0x09, 0x91, 0x7d, 0x09, 0x29, 0x85, 0x05, 0x0c, 0x0d, 0xeb, 0x6e, 0xe3, 0x0e, 0x6a, 0xf0, 0xb2, 0x68, 0xab, 0xd8, 0x0a, 0xae, 0x1e, + 0xfb, 0x6b, 0xd0, 0xc5, 0x98, 0xbd, 0x68, 0x97, 0xe6, 0x99, 0xee, 0x0d, 0xdc, 0x2f, 0x6e, 0xdb, 0x88, 0xbc, 0x2a, 0x87, 0x82, 0x82, 0x6f, 0xe4, 0x79, 0x21, 0xe2, 0xd0, 0xe5, 0x90, 0x91, 0x17, + 0x1c, 0xcd, 0xb3, 0xa9, 0x94, 0xe7, 0xaf, 0x6c, 0xbf, 0x31, 0x0f, 0xb0, 0x7d, 0x8f, 0x52, 0x14, 0x32, 0xb8, 0xc4, 0x7a, 0x1c, 0xa8, 0xe9, 0x76, 0x25, 0x73, 0x76, 0x90, 0x2c, 0x9e, 0xbb, 0x29, + 0x08, 0x1e, 0x69, 0x6e, 0x0e, 0x59, 0x0e, 0xb1, 0x35, 0xac, 0x2a, 0x88, 0x45, 0x26, 0x65, 0x52, 0x0d, 0xa9, 0x64, 0x24, 0x0c, 0xfd, 0x3e, 0x40, 0x99, 0x75, 0x20, 0x42, 0x4e, 0x39, 0x5d, 0x22, + 0x59, 0xfd, 0x23, 0x4b, 0x45, 0xfd, 0x9e, 0xe0, 0x7d, 0x08, 0x1c, 0x45, 0x57, 0x35, 0xe1, 0x2b, 0x53, 0x44, 0xb4, 0x55, 0x80, 0x23, 0x3d, 0x75, 0xcf, 0xc8, 0x25, 0x3c, 0x62, 0x60, 0x47, 0x06, + 0x87, 0x5b, 0x6b, 0x8f, 0xa7, 0x10, 0x29, 0x92, 0x10, 0x5c, 0xa7, 0x42, 0xbf, 0xf4, 0x67, 0x4d, 0x39, 0x8a, 0x6d, 0x71, 0x4b, 0x1c, 0x30, 0x7f, 0xe8, 0x92, 0xdf, 0x01, 0x0e, 0x3a, 0xba, 0x10, + 0x1c, 0x47, 0x21, 0x3f, 0x69, 0x77, 0x1b, 0x36, 0x9d, 0xeb, 0x42, 0xc2, 0xc0, 0x1b, 0x51, 0xcb, 0x01, 0xa8, 0xc2, 0xb0, 0x96, 0x6e, 0x9c, 0x4f, 0xb2, 0x51, 0x84, 0x3f, 0xf5, 0x0b, 0x07, 0x0e, + 0xfb, 0x52, 0xe2, 0x4d, 0x01, 0x21, 0xf9, 0xa7, 0x8a, 0x1d, 0x49, 0xd2, 0x11, 0xcb, 0xd6, 0xcc, 0x73, 0x1a, 0x82, 0x93, 0xff, 0x55, 0x97, 0xd3, 0x4d, 0xb0, 0x51, 0xb0, 0x61, 0xcd, 0x94, 0x1b, + 0x0b, 0x07, 0x74, 0x7d, 0xaa, 0xb5, 0x87, 0x04, 0x05, 0xbb, 0x13, 0x57, 0x7d, 0x91, 0x4e, 0x9d, 0x0f, 0x23, 0x70, 0x2e, 0x7a, 0x78, 0x48, 0xe1, 0x44, 0xc7, 0xb8, 0xaf, 0x9b, 0xb3, 0x7c, 0x1d, + 0xdb, 0x17, 0x3b, 0x30, 0x1f, 0xac, 0x74, 0xbb, 0x01, 0xf7, 0x29, 0x18, 0x96, 0xc2, 0x85, 0x87, 0xff, 0x80, 0x0c, 0x98, 0xfe, 0xd0, 0x17, 0x91, 0xf6, 0xb4, 0x1a, 0xbd, 0x89, 0x31, 0xc9, 0x2e, + 0x26, 0x79, 0x51, 0x83, 0xbd, 0x46, 0xea, 0x82, 0x90, 0x7a, 0xe0, 0x9a, 0xa1, 0x04, 0xc4, 0xea, 0x5b, 0x27, 0x86, 0x5b, 0x82, 0xbb, 0x92, 0xa6, 0x77, 0xd2, 0x36, 0xdd, 0xbf, 0x66, 0xb3, 0x2d, + 0xb8, 0x11, 0x07, 0x96, 0xc6, 0xce, 0x99, 0xdc, 0x9a, 0x35, 0x50, 0x84, 0x42, 0x75, 0x52, 0x98, 0x32, 0x85, 0xa6, 0x86, 0xf1, 0x5c, 0x65, 0x69, 0x62, 0xb0, 0x5d, 0x48, 0xeb, 0x00, 0x21, 0x06, + 0x9b, 0xa5, 0xf5, 0x41, 0xbf, 0x67, 0xc5, 0x00, 0xf9, 0xe4, 0x59, 0xfa, 0x92, 0x3f, 0x24, 0x20, 0x11, 0xca, 0x44, 0x82, 0x1e, 0x7f, 0x0e, 0x57, 0xaa, 0x4a, 0x61, 0x66, 0x3c, 0xd3, 0x61, 0x07, + 0x0d, 0xad, 0x55, 0x48, 0x49, 0x2e, 0xa7, 0xf7, 0xcc, 0xe4, 0x7d, 0x0f, 0x8a, 0x60, 0x78, 0x5d, 0x31, 0x3f, 0x4e, 0x03, 0xaa, 0x05, 0x27, 0x2c, 0x99, 0x13, 0x4d, 0x11, 0x1a, 0x41, 0xfc, 0x20, + 0x5a, 0xbc, 0x50, 0x72, 0x31, 0x0f, 0xa3, 0xc3, 0x5f, 0xfb, 0xef, 0xb3, 0xe8, 0x67, 0x2c, 0x10, 0xba, 0x19, 0xb2, 0x9a, 0x4e, 0xec, 0xd9, 0xad, 0xb5, 0xfc, 0xbd, 0xa4, 0x04, 0xc0, 0xb5, 0x25, + 0x4b, 0x7f, 0xb3, 0x62, 0xff, 0x7d, 0x7e, 0xd8, 0x5a, 0x15, 0x74, 0x84, 0x6d, 0x18, 0x8b, 0x03, 0xed, 0xf5, 0xf6, 0x6d, 0x8f, 0xe5, 0x94, 0xa4, 0x32, 0xd6, 0x8e, 0x27, 0x2d, 0x82, 0xb1, 0x23, + 0xe0, 0x69, 0x2f, 0xcc, 0x29, 0x2a, 0x10, 0x16, 0xaa, 0xcc, 0xfc, 0xfc, 0x3b, 0xd1, 0x14, 0x0f, 0xbf, 0x99, 0x24, 0x01, 0xa9, 0x4b, 0x6c, 0x60, 0x93, 0x94, 0x3f, 0x5c, 0x4c, 0x4b, 0x73, 0x22, + 0xe5, 0x5c, 0x79, 0xad, 0x3f, 0x3d, 0x41, 0x54, 0x02, 0x61, 0xa3, 0x9a, 0x40, 0xff, 0xbd, 0xe5, 0x47, 0x23, 0x49, 0x33, 0xdc, 0x74, 0x7a, 0xe2, 0xb7, 0x30, 0xeb, 0x09, 0xfe, 0xc8, 0xc0, 0x26, + 0xd9, 0xca, 0x8c, 0x34, 0xdf, 0x26, 0xd6, 0xbb, 0x29, 0x98, 0x80, 0x3a, 0x08, 0xe3, 0x6b, 0x19, 0x26, 0xbb, 0x1f, 0xfa, 0x03, 0xac, 0x8e, 0xe8, 0xba, 0x7b, 0xbd, 0xb6, 0xcc, 0xd0, 0x0d, 0x07, + 0xda, 0x50, 0x42, 0xfd, 0xeb, 0xc4, 0x67, 0x60, 0xad, 0xc5, 0xd8, 0x46, 0xde, 0xa6, 0xc0, 0xc2, 0xbe, 0xc3, 0x28, 0xbb, 0x78, 0xba, 0x43, 0xb0, 0x6f, 0x9b, 0x32, 0xdb, 0x5b, 0x59, 0xb6, 0x12, + 0x29, 0xd7, 0xe8, 0xb7, 0x5b, 0xd9, 0x33, 0x5e, 0x1c, 0x67, 0x5c, 0x27, 0x9b, 0xca, 0x6f, 0xc0, 0x11, 0x6c, 0x87, 0xa5, 0xe7, 0x30, 0xec, 0x3b, 0xd6, 0x83, 0x62, 0xf7, 0xd7, 0x97, 0x8d, 0x24, + 0xaa, 0xaa, 0x9b, 0xbd, 0xd9, 0x15, 0x6d, 0x10, 0xaa, 0xe4, 0xdd, 0x9d, 0x75, 0xeb, 0x45, 0x8b, 0x31, 0x39, 0xc9, 0x4c, 0xd6, 0x6f, 0xfc, 0x16, 0x08, 0x3b, 0x46, 0x9d, 0x43, 0x6d, 0x30, 0x1a, + 0xcf, 0x56, 0x7c, 0xec, 0xd6, 0xd3, 0x62, 0x0d, 0x1b, 0x82, 0x27, 0xdc, 0x4d, 0xb5, 0xf1, 0xf4, 0x21, 0x46, 0xcb, 0x21, 0x04, 0xc0, 0xd7, 0xce, 0xda, 0x38, 0x3c, 0x2e, 0x37, 0xf8, 0xa8, 0x28, + 0x7e, 0xce, 0xe2, 0xe1, 0x83, 0x21, 0x85, 0xbc, 0x88, 0xf3, 0x29, 0xc8, 0x20, 0xe3, 0x1c, 0x07, 0x94, 0x32, 0xd4, 0x24, 0x2f, 0x15, 0x35, 0xbb, 0xa8, 0xa8, 0xf9, 0x17, 0x57, 0x97, 0x94, 0x00, + 0x65, 0x8d, 0x2e, 0xdb, 0x46, 0x32, 0x10, 0xf4, 0x83, 0xae, 0x53, 0xf6, 0xd4, 0x74, 0x3f, 0x59, 0xd3, 0x80, 0x64, 0x71, 0x0d, 0xe6, 0xfd, 0x80, 0x7d, 0x8f, 0xa7, 0x3a, 0x4c, 0xee, 0xd5, 0x04, + 0x87, 0xe1, 0xfd, 0x2e, 0xc1, 0x95, 0x84, 0xd0, 0x76, 0xcc, 0x22, 0x88, 0x4b, 0xf5, 0xbe, 0xc7, 0x69, 0x22, 0xed, 0xb8, 0x6f, 0xad, 0x49, 0x63, 0x33, 0xd4, 0x03, 0xaa, 0xe9, 0xf5, 0x6c, 0x2a, + 0xf3, 0xa3, 0xcb, 0xef, 0xd7, 0x48, 0xae, 0xba, 0x43, 0x6e, 0xfd, 0x08, 0x08, 0x18, 0x92, 0xf7, 0xb7, 0xde, 0x9d, 0xe1, 0x43, 0xda, 0x74, 0x92, 0xba, 0x60, 0xb9, 0xaa, 0x1e, 0xd3, 0x04, 0x23, + 0xb0, 0xf0, 0x99, 0xd1, 0x39, 0x1d, 0xc1, 0xe1, 0xb4, 0xfc, 0x26, 0x07, 0x7e, 0x8a, 0xf0, 0xbf, 0x49, 0x72, 0x81, 0x85, 0x97, 0x00, 0xe7, 0xd5, 0xa6, 0xb2, 0xa4, 0x65, 0xc8, 0x9a, 0xfd, 0x03, + 0x64, 0x0b, 0x3b, 0xd6, 0xd4, 0x54, 0x79, 0x3f, 0x07, 0x93, 0x91, 0x20, 0x3a, 0xfc, 0x8a, 0x79, 0x44, 0x50, 0xee, 0x55, 0x4d, 0x40, 0x48, 0x22, 0xda, 0xbb, 0x52, 0xed, 0x8d, 0x25, 0xb7, 0x00, + 0x9a, 0x2d, 0xe9, 0x65, 0xca, 0xc5, 0x72, 0x62, 0xb3, 0x8d, 0x29, 0xf3, 0x74, 0x3a, 0x3d, 0xb1, 0xeb, 0x65, 0xbf, 0xd4, 0xa2, 0xfc, 0x38, 0xec, 0x99, 0x17, 0x77, 0xa0, 0xad, 0x81, 0x9f, 0x15, + 0x1f, 0x43, 0x64, 0x42, 0xcf, 0x44, 0xe1, 0x71, 0x54, 0x0c, 0x5f, 0xa2, 0x0e, 0x13, 0x00, 0x90, 0xbb, 0xe3, 0x28, 0xbc, 0x75, 0x7a, 0x23, 0x50, 0x85, 0xbc, 0x7f, 0x43, 0x67, 0x0e, 0xf9, 0x1e, + 0x0d, 0xe3, 0x32, 0x29, 0xd8, 0x9e, 0xa7, 0x95, 0xec, 0x08, 0x6b, 0x17, 0xbc, 0x39, 0xf7, 0x8d, 0x56, 0xd2, 0xa2, 0x41, 0xaa, 0x49, 0x6b, 0x19, 0xf0, 0x5f, 0x5e, 0x51, 0x38, 0xf8, 0x65, 0x1e, + 0x3f, 0xc3, 0x94, 0x8c, 0x06, 0xc1, 0x75, 0x65, 0x82, 0x1f, 0x0e, 0x57, 0x4e, 0x84, 0x8c, 0xb1, 0x74, 0xba, 0x79, 0xd0, 0x68, 0xe7, 0x6c, 0xec, 0x6c, 0x16, 0x3a, 0xef, 0x5d, 0x04, 0x1b, 0x2b, + 0x73, 0xb1, 0x8b, 0x16, 0x7c, 0xe0, 0xc6, 0xf1, 0xe3, 0x15, 0xf7, 0xbe, 0x73, 0x2d, 0xdc, 0x65, 0xc1, 0x29, 0x92, 0x10, 0xb1, 0x43, 0x25, 0x40, 0xf6, 0x0f, 0xeb, 0x3c, 0x75, 0xe5, 0x32, 0x08, + 0x16, 0xad, 0xb6, 0x90, 0xc3, 0xe3, 0xa8, 0xc5, 0x1b, 0x45, 0xb6, 0xe8, 0xc2, 0x41, 0xb8, 0xb1, 0xba, 0x41, 0x7d, 0xa3, 0xe0, 0x2a, 0x76, 0x6b, 0xdc, 0xb3, 0xdf, 0xce, 0xe9, 0x14, 0xf6, 0x02, + 0x05, 0xd7, 0x7e, 0x7e, 0xe2, 0x0b, 0x6a, 0x0f, 0xf4, 0xdf, 0xbe, 0x77, 0xb7, 0xeb, 0x70, 0x73, 0x96, 0xad, 0x2c, 0x36, 0x8e, 0x0b, 0x64, 0xdd, 0x60, 0x6a, 0xd4, 0x8b, 0xd3, 0x27, 0x24, 0x0e, + 0x3a, 0xa5, 0x14, 0x92, 0xe2, 0xbb, 0x68, 0x07, 0xc5, 0xc7, 0xc3, 0x98, 0xc0, 0x0e, 0x9f, 0x04, 0x79, 0xce, 0xe7, 0x14, 0xd4, 0x84, 0x7c, 0xeb, 0x6d, 0x0b, 0x67, 0x7c, 0x0b, 0x63, 0x93, 0x04, + 0xa9, 0xce, 0x27, 0x53, 0xc8, 0x6c, 0xc0, 0x3d, 0x1a, 0x46, 0xd5, 0x55, 0x53, 0x51, 0xb1, 0x6b, 0xa2, 0xc5, 0x66, 0x70, 0xb1, 0xda, 0xec, 0x4d, 0x67, 0x82, 0xe4, 0xe8, 0x00, 0xd1, 0xea, 0x22, + 0x16, 0x6f, 0x2a, 0x6d, 0x0b, 0x4e, 0x08, 0xe5, 0x4d, 0xd0, 0x26, 0x56, 0xe3, 0x1a, 0x3f, 0x58, 0x48, 0x4d, 0x55, 0xd2, 0x6e, 0x62, 0xe2, 0xaa, 0xcd, 0x42, 0x5b, 0x65, 0x6e, 0xe5, 0xb3, 0x25, + 0xd0, 0xf9, 0xf6, 0x0c, 0x0a, 0xdc, 0x4f, 0x4b, 0x58, 0x4c, 0x9e, 0x34, 0x36, 0xc3, 0x99, 0xb5, 0xdb, 0x13, 0xff, 0xe8, 0xcd, 0xa6, 0x37, 0x58, 0xef, 0x36, 0x88, 0xda, 0x2a, 0x75, 0x32, 0x1e, + 0xe5, 0x12, 0xd4, 0x74, 0x40, 0x86, 0xa9, 0x72, 0xf6, 0x78, 0x50, 0xf0, 0x95, 0x09, 0xc0, 0x23, 0x5b, 0x45, 0xc3, 0xf3, 0xf6, 0x68, 0x0f, 0xc5, 0x7c, 0x38, 0x5a, 0xc1, 0x71, 0xa8, 0xa2, 0x2f, + 0x05, 0x35, 0xd8, 0xa7, 0xc7, 0xe7, 0x18, 0xcd, 0x7f, 0xab, 0x1b, 0x66, 0x10, 0xbf, 0xcc, 0x54, 0x9f, 0x88, 0x1e, 0x31, 0xb7, 0x1d, 0x8e, 0x27, 0xc9, 0x24, 0x44, 0x9a, 0x8a, 0x9b, 0x56, 0x2f, + 0x3d, 0xb4, 0x46, 0xb2, 0x74, 0x53, 0x16, 0x44, 0x21, 0xfd, 0x2f, 0x33, 0xf7, 0x93, 0xdf, 0xa7, 0x18, 0xc5, 0x34, 0x02, 0x53, 0xde, 0x1a, 0x53, 0xdd, 0x8f, 0x0a, 0x11, 0x55, 0xb4, 0x4c, 0x04, + 0x25, 0x90, 0x31, 0xa5, 0x23, 0xc7, 0xdd, 0x78, 0x81, 0x11, 0xfe, 0xad, 0x90, 0x8c, 0xfe, 0x91, 0xb1, 0x42, 0x2e, 0x7f, 0x15, 0x46, 0x02, 0x42, 0x5d, 0x6d, 0x90, 0x93, 0xde, 0x08, 0x78, 0x22, + 0x55, 0x03, 0x80, 0xa6, 0xe7, 0xd2, 0x79, 0x85, 0x4a, 0xad, 0x90, 0xe0, 0x1a, 0x78, 0x03, 0x5d, 0x86, 0x79, 0x35, 0x87, 0xad, 0xde, 0x3a, 0x62, 0xbc, 0x46, 0xe0, 0x34, 0x29, 0xca, 0xfc, 0x02, + 0xac, 0xef, 0x8b, 0x0d, 0x06, 0x2e, 0xec, 0xcb, 0xdd, 0xa8, 0x91, 0xab, 0xc5, 0xf3, 0xd3, 0xba, 0x36, 0x1d, 0x4a, 0x34, 0xeb, 0xcc, 0xbc, 0x6a, 0x87, 0x0b, 0x12, 0xac, 0xf0, 0x15, 0xf9, 0x0e, + 0x38, 0x5d, 0x40, 0xb1, 0xf2, 0x6e, 0xb1, 0xf3, 0x09, 0x3b, 0xe6, 0x6b, 0x5f, 0xb8, 0x0f, 0xab, 0xf6, 0x87, 0xf2, 0xc6, 0x7b, 0x75, 0xeb, 0x77, 0x17, 0x3e, 0x7a, 0x4b, 0x0f, 0x13, 0x97, 0x17, + 0xe5, 0xc6, 0xec, 0x5d, 0x55, 0x68, 0xc6, 0x36, 0x4d, 0x6d, 0x15, 0x20, 0x7c, 0x49, 0x7f, 0x8c, 0x60, 0x9e, 0xb5, 0xba, 0x5a, 0xc8, 0x06, 0x33, 0xae, 0x70, 0x41, 0xc0, 0x5d, 0x22, 0x76, 0x0a, + 0x5c, 0x1a, 0xa3, 0x26, 0x53, 0x4b, 0x17, 0x96, 0x47, 0x66, 0xcb, 0x8a, 0xd4, 0x76, 0xfa, 0xf8, 0xf6, 0x9a, 0x20, 0x93, 0x7b, 0x7a, 0xe7, 0xa1, 0x6b, 0xd6, 0x92, 0x19, 0xec, 0xb9, 0xff, 0x1f, + 0x5f, 0x9c, 0x7b, 0x79, 0x9b, 0x88, 0x11, 0x06, 0x09, 0xc6, 0xb9, 0xc6, 0xa6, 0xbb, 0x8f, 0x5f, 0xd8, 0x38, 0xa5, 0x8f, 0x33, 0x7c, 0xb5, 0x53, 0x28, 0x3f, 0x5a, 0xc1, 0x4f, 0x1c, 0x72, 0x25, + 0x5a, 0xf7, 0xca, 0xbf, 0x82, 0xb9, 0x63, 0xeb, 0x95, 0xda, 0x05, 0x07, 0x79, 0xc3, 0xb4, 0xad, 0x16, 0x72, 0x19, 0xba, 0x07, 0x3d, 0x5e, 0x21, 0x41, 0x7a, 0x5f, 0x2d, 0xd4, 0x7f, 0x81, 0x0c, + 0x96, 0x5a, 0x2b, 0xe5, 0x66, 0x58, 0xc1, 0x2b, 0x00, 0x22, 0x0a, 0xe0, 0x6c, 0xf8, 0x8c, 0xdf, 0xb6, 0x70, 0x49, 0xc2, 0xc2, 0x13, 0x7e, 0x9f, 0xd3, 0x15, 0x99, 0x23, 0xf5, 0xe3, 0xab, 0x13, + 0xce, 0x91, 0xd3, 0xb4, 0xac, 0x60, 0xcd, 0x92, 0x7a, 0xbd, 0xbd, 0x29, 0xdc, 0xc3, 0x1b, 0x5c, 0xc8, 0x46, 0x7a, 0x98, 0x39, 0x7f, 0xef, 0x12, 0xea, 0x24, 0x62, 0x54, 0xea, 0xfe, 0x06, 0x21, + 0x59, 0xf9, 0xb0, 0x5b, 0x34, 0xb3, 0xe1, 0x57, 0x71, 0xbc, 0x48, 0xc7, 0x28, 0x5a, 0xca, 0xf1, 0x49, 0xab, 0x7d, 0xa3, 0x74, 0x94, 0xa7, 0xaa, 0xb6, 0x46, 0xa7, 0x68, 0x94, 0x85, 0xca, 0x21, + 0x5b, 0x18, 0x34, 0x9e, 0x99, 0x48, 0x1a, 0x8f, 0x2a, 0x66, 0x21, 0x03, 0x4d, 0xd1, 0x11, 0x29, 0xc6, 0x94, 0x41, 0x93, 0xdf, 0xf0, 0xf1, 0x5c, 0x0c, 0x6f, 0x1e, 0x5c, 0x25, 0xd6, 0xcc, 0x05, + 0xa4, 0x90, 0x94, 0xb0, 0x8c, 0x67, 0x28, 0xea, 0xe6, 0x4f, 0xe4, 0x7f, 0x26, 0xfb, 0xc4, 0x16, 0x88, 0x4c, 0x4c, 0x67, 0x46, 0xd8, 0x64, 0xe4, 0x26, 0xa6, 0x70, 0x4b, 0xa6, 0x34, 0x0e, 0x0f, + 0xbf, 0xd4, 0xe0, 0x2d, 0x8a, 0x1a, 0x5b, 0x8f, 0x83, 0x64, 0x0d, 0x35, 0xfe, 0xfc, 0xdb, 0x47, 0x96, 0x0e, 0x6d, 0xa3, 0x4c, 0x79, 0x57, 0x61, 0x0c, 0x47, 0x25, 0x4e, 0x1a, 0x53, 0x58, 0x05, + 0x55, 0x14, 0x1f, 0x96, 0x64, 0x58, 0x2f, 0xb7, 0x60, 0x5a, 0x65, 0x3f, 0xad, 0xad, 0x4c, 0x92, 0x18, 0x3d, 0x68, 0x57, 0x51, 0x12, 0xea, 0xce, 0xfa, 0xd2, 0x3e, 0x17, 0xa9, 0xdc, 0xd3, 0x09, + 0x35, 0x43, 0xbd, 0xe5, 0x22, 0xc7, 0xd4, 0x17, 0x86, 0xc4, 0xae, 0x8a, 0xd6, 0x92, 0x3f, 0xf2, 0x8b, 0x21, 0x3d, 0xd0, 0x6e, 0x86, 0x3f, 0x49, 0x13, 0x09, 0x8c, 0x4e, 0xd5, 0xcb, 0x28, 0x03, + 0x4b, 0xd3, 0x29, 0x53, 0xdd, 0x47, 0x33, 0xee, 0x48, 0xc6, 0x98, 0x97, 0xcc, 0x7b, 0x9e, 0xe7, 0x07, 0x4e, 0x09, 0xa7, 0xb1, 0x87, 0xa4, 0x23, 0xa2, 0xf0, 0xaf, 0xe2, 0x16, 0x72, 0xf0, 0x2b, + 0xdf, 0x12, 0xe4, 0x3f, 0xa6, 0x11, 0x1e, 0x11, 0x82, 0xfc, 0xdf, 0xa6, 0xd6, 0x8e, 0xf7, 0xd6, 0x16, 0xc3, 0x76, 0xcb, 0x83, 0xc5, 0x99, 0x64, 0x73, 0x6b, 0x00, 0x58, 0x5a, 0x34, 0xaf, 0x1d, + 0x04, 0xc4, 0xd2, 0x93, 0x22, 0x6f, 0x1e, 0x39, 0xff, 0xc7, 0xed, 0xb2, 0x39, 0x90, 0xf3, 0x1e, 0x61, 0x23, 0x18, 0x0e, 0xc6, 0x94, 0xb6, 0x46, 0xa7, 0xaa, 0x56, 0x24, 0x47, 0x63, 0x65, 0x17, + }; + } + + + namespace t8 { + int internal_rounds = 57; + + int alpha = 5; + + unsigned char mat_diag_m_1[] = { + 0x6d, 0x67, 0x05, 0xdb, 0x1b, 0x04, 0xce, 0xe5, 0xef, 0x48, 0x9a, 0xac, 0xb7, 0x5f, 0x72, 0x71, 0x6b, 0x5b, 0x16, 0xb2, 0x4e, 0xe2, 0x35, 0x8c, 0x46, 0x8c, 0x1d, 0x30, 0x5e, 0xfb, 0xbf, 0x05, + 0xc7, 0xcd, 0x88, 0x78, 0xdf, 0xc0, 0x5e, 0xaf, 0x22, 0xed, 0xb0, 0x5d, 0x50, 0xc5, 0xf4, 0x75, 0x6d, 0x99, 0x12, 0x33, 0x07, 0x78, 0x6d, 0xfc, 0x43, 0x83, 0x68, 0x12, 0x18, 0xa8, 0xa7, 0x2a, + 0x00, 0xaf, 0x8f, 0x22, 0xdd, 0xc1, 0xac, 0x10, 0xea, 0x4c, 0x9a, 0x84, 0x89, 0xa1, 0x1b, 0xd6, 0xe4, 0xc1, 0x89, 0x5a, 0xf1, 0x3a, 0xcc, 0x78, 0x0d, 0xb6, 0xda, 0x71, 0xfd, 0x56, 0x58, 0x2f, + 0x48, 0x13, 0xa6, 0xff, 0x1f, 0x25, 0x79, 0xd7, 0x43, 0xcf, 0x6d, 0x7a, 0x87, 0x58, 0x43, 0xbd, 0x40, 0xda, 0x8c, 0x96, 0x84, 0xe1, 0x71, 0xd2, 0x95, 0xac, 0x99, 0x09, 0x26, 0x9a, 0x29, 0x12, + 0xfb, 0x85, 0x96, 0x08, 0x01, 0x9d, 0x5f, 0x27, 0x7c, 0xd2, 0xa3, 0x83, 0x87, 0x0c, 0x3f, 0x12, 0x3a, 0x64, 0xd5, 0x03, 0x1f, 0xe2, 0xa8, 0x62, 0x2a, 0x69, 0x3d, 0x69, 0xd4, 0xaa, 0x43, 0x14, + 0x37, 0x99, 0xec, 0x69, 0x63, 0x31, 0x4b, 0xdc, 0xae, 0x33, 0x82, 0x27, 0xbb, 0x79, 0xc1, 0xad, 0xa3, 0x85, 0x58, 0x2f, 0x47, 0x31, 0x2e, 0x08, 0x88, 0x44, 0xa4, 0x04, 0x02, 0x1b, 0x56, 0x21, + 0x7d, 0xe9, 0x34, 0x5e, 0xd5, 0x92, 0x17, 0x02, 0x9b, 0xa4, 0x0c, 0xae, 0xe1, 0x76, 0x21, 0x6b, 0x4f, 0xe2, 0xa4, 0x94, 0xb2, 0x69, 0x0a, 0xf3, 0x98, 0x98, 0x3f, 0xa5, 0xaf, 0xc2, 0x7c, 0x0c, + 0x53, 0x7b, 0xf4, 0xdf, 0xc1, 0x46, 0x12, 0x0d, 0x13, 0xee, 0x58, 0xb7, 0xae, 0x22, 0x5e, 0xb5, 0x3a, 0xc4, 0xa5, 0xca, 0xe7, 0x88, 0xae, 0x9f, 0x38, 0xde, 0x53, 0x60, 0x09, 0x21, 0xd2, 0x2d, + }; + + unsigned char round_constants[] = { + 0x10, 0x0c, 0x59, 0x97, 0x0a, 0x9a, 0xba, 0x9e, 0x1f, 0x55, 0x53, 0xe9, 0x85, 0x4c, 0x25, 0xc5, 0xa7, 0x77, 0x96, 0x4b, 0xc3, 0xff, 0xa5, 0xd4, 0x81, 0x8d, 0x6b, 0x8a, 0xd0, 0x22, 0xad, 0x0d, + 0x39, 0x10, 0xbd, 0x59, 0xf2, 0xfa, 0x5d, 0x43, 0x60, 0xa4, 0x8d, 0x2d, 0xfc, 0xae, 0x17, 0x2d, 0xe9, 0x74, 0x02, 0x9f, 0x7b, 0x95, 0x75, 0x6e, 0xab, 0x1b, 0x1f, 0x11, 0x41, 0xc4, 0xcf, 0x03, + 0x92, 0x63, 0x7d, 0x44, 0x6c, 0x6c, 0x97, 0xe7, 0x49, 0xca, 0xf6, 0x83, 0x08, 0x29, 0xe4, 0x08, 0x2a, 0x2a, 0x19, 0x70, 0x29, 0xcd, 0x76, 0x03, 0x67, 0xce, 0xe2, 0xa2, 0xb8, 0xd1, 0xc6, 0x27, + 0x2d, 0x6c, 0x3e, 0xe2, 0x3e, 0xe9, 0xf4, 0xee, 0x07, 0x04, 0x7d, 0xc6, 0x53, 0x3a, 0x31, 0xd5, 0xd2, 0x71, 0xc8, 0xa0, 0x1d, 0x12, 0x2d, 0xfc, 0x8e, 0xda, 0xbf, 0x9a, 0x2b, 0x88, 0xf2, 0x28, + 0xd5, 0x62, 0x12, 0x3f, 0x3a, 0x61, 0x5e, 0xfe, 0xfc, 0xae, 0xbf, 0xd2, 0xce, 0x07, 0xa1, 0x3a, 0xc9, 0xc7, 0x94, 0x80, 0xe1, 0x31, 0xe9, 0xa2, 0x9f, 0x93, 0xe4, 0x0f, 0x39, 0x43, 0x39, 0x0a, + 0x56, 0x54, 0x80, 0x55, 0x07, 0x7b, 0x6c, 0xad, 0xc1, 0x84, 0xb7, 0x5b, 0x55, 0xa3, 0xfb, 0x57, 0x8b, 0x40, 0x07, 0x90, 0x90, 0xf8, 0x88, 0xe1, 0x19, 0x23, 0x8f, 0xda, 0xd8, 0x37, 0x8f, 0x2a, + 0x0f, 0x4f, 0xff, 0xa4, 0x93, 0xd6, 0xad, 0x34, 0x35, 0x49, 0xf8, 0x83, 0x56, 0xc7, 0x98, 0x31, 0xd0, 0xf5, 0x3e, 0x35, 0x8f, 0x52, 0x49, 0x96, 0xc3, 0x20, 0x3f, 0xe3, 0x58, 0x86, 0xef, 0x0c, + 0x2b, 0xe5, 0xc3, 0x01, 0x6e, 0x7b, 0x9a, 0xaf, 0xfa, 0x71, 0x51, 0x09, 0xb7, 0x8d, 0xa4, 0x63, 0x13, 0xd1, 0x4f, 0xad, 0x0c, 0x1c, 0xee, 0x62, 0x6c, 0x7c, 0x0e, 0x0f, 0x6f, 0x2a, 0xdc, 0x1c, + 0xd6, 0x39, 0x01, 0x06, 0x28, 0x43, 0xe6, 0xb4, 0x76, 0xb0, 0xc0, 0xa8, 0xfc, 0x35, 0x0d, 0x83, 0xd9, 0xb3, 0xb7, 0xf0, 0x28, 0x0c, 0xfb, 0x1c, 0x8d, 0x9c, 0xb1, 0x2d, 0x1a, 0x68, 0x2e, 0x0a, + 0x17, 0x27, 0x0d, 0xd3, 0xaf, 0xfb, 0x67, 0xda, 0x85, 0x88, 0x80, 0x8a, 0x8e, 0x85, 0x7f, 0x99, 0xc2, 0x7c, 0xc6, 0xe5, 0x1c, 0x36, 0xb4, 0x16, 0xde, 0xe7, 0x3b, 0x70, 0xcd, 0x13, 0xf0, 0x16, + 0xb8, 0xeb, 0x36, 0xa9, 0xf9, 0x35, 0x5d, 0xdc, 0x4d, 0xcf, 0xcc, 0x76, 0x7a, 0xe1, 0xbe, 0x90, 0x6d, 0x5e, 0x67, 0x6c, 0xe7, 0x9f, 0x66, 0xbe, 0x48, 0xf5, 0x9c, 0x1c, 0x13, 0x57, 0xaf, 0x29, + 0x3b, 0x5b, 0x20, 0xf5, 0x1b, 0x11, 0x50, 0xf9, 0xbd, 0xb1, 0x38, 0x81, 0xae, 0x9e, 0x11, 0xee, 0x5d, 0x81, 0x0b, 0xa9, 0x9d, 0x15, 0xed, 0x55, 0xb1, 0x8b, 0x25, 0xc6, 0x1e, 0x7b, 0x80, 0x21, + 0x09, 0x69, 0xbc, 0x4a, 0x1c, 0xab, 0xad, 0xe5, 0xa4, 0x91, 0x78, 0x74, 0xb8, 0xbc, 0xbd, 0x50, 0x43, 0xa5, 0x34, 0xd2, 0xeb, 0xb8, 0xbc, 0x0f, 0x86, 0x8c, 0x0a, 0xc5, 0xb8, 0x0d, 0xc0, 0x07, + 0x65, 0x77, 0x74, 0xc1, 0xbe, 0x5e, 0xf2, 0x4c, 0x25, 0xa1, 0x49, 0x5c, 0x20, 0x33, 0x4c, 0x3a, 0x37, 0xde, 0xd0, 0x96, 0x43, 0x09, 0xb6, 0xdb, 0xa3, 0x08, 0x4d, 0x05, 0xfc, 0x08, 0xbc, 0x22, + 0x2e, 0xbb, 0x13, 0xa8, 0x75, 0xd3, 0xf7, 0x43, 0x7d, 0xe6, 0xdc, 0xfe, 0x56, 0x89, 0xd5, 0xfa, 0x8a, 0x9b, 0x4d, 0x08, 0xde, 0x46, 0x11, 0xf2, 0x78, 0x4c, 0xe2, 0xf3, 0xbd, 0x58, 0xad, 0x2d, + 0x91, 0x6e, 0x1d, 0x6f, 0x90, 0x17, 0xd4, 0xce, 0x13, 0x62, 0xb8, 0x7d, 0x57, 0xb4, 0x60, 0x8f, 0x23, 0x6e, 0x67, 0x6e, 0x03, 0x74, 0x8a, 0x5a, 0xdc, 0x64, 0x9a, 0xc1, 0x6b, 0xee, 0x2c, 0x29, + 0x8c, 0x7a, 0x38, 0x22, 0x9a, 0x93, 0x75, 0xf3, 0x9e, 0x0a, 0x2a, 0xb3, 0x02, 0x30, 0xc2, 0xa0, 0x4c, 0xb7, 0x93, 0x45, 0xa5, 0xbb, 0x48, 0x6b, 0xad, 0x28, 0x59, 0x12, 0xae, 0x55, 0xd6, 0x27, + 0xa8, 0xa2, 0xbf, 0x8f, 0xb6, 0x56, 0x0e, 0xe9, 0xce, 0xec, 0x99, 0x1c, 0xd4, 0xea, 0xd1, 0x15, 0xa4, 0x59, 0xb3, 0xc7, 0x61, 0xd9, 0xf0, 0x97, 0x0a, 0xac, 0xe9, 0x1f, 0x78, 0x2e, 0x0e, 0x0e, + 0x72, 0x16, 0x9f, 0xf0, 0xc2, 0xaa, 0xd8, 0xce, 0xd7, 0xde, 0x44, 0x63, 0xb9, 0x6a, 0x11, 0x89, 0x22, 0x21, 0xd8, 0x8e, 0xed, 0xda, 0xb6, 0x43, 0x99, 0x1c, 0x8d, 0x67, 0x3e, 0xc2, 0xfe, 0x13, + 0xc2, 0x73, 0xde, 0x2c, 0x4b, 0x20, 0x58, 0xfd, 0x43, 0x54, 0x54, 0xc1, 0xb1, 0x69, 0x06, 0x81, 0x07, 0xcb, 0x02, 0x4e, 0x68, 0x40, 0x16, 0xc3, 0x7f, 0xe3, 0x47, 0x16, 0xd2, 0x0d, 0x55, 0x27, + 0x09, 0x8f, 0xcb, 0x74, 0x46, 0x05, 0x42, 0xc2, 0xbe, 0xc0, 0x99, 0xc7, 0xdb, 0x6a, 0x0a, 0x6e, 0x21, 0xa6, 0xc8, 0x45, 0xaa, 0xf6, 0xb9, 0xc7, 0x48, 0x2c, 0xa9, 0x56, 0xf3, 0xd5, 0xe6, 0x1d, + 0x9d, 0xf3, 0xa3, 0xf3, 0xe1, 0xf6, 0x84, 0xaf, 0x0b, 0xb1, 0x92, 0x08, 0x49, 0x3e, 0x95, 0x1d, 0xc6, 0x78, 0xb3, 0xfb, 0xd1, 0x85, 0xc8, 0x74, 0x3f, 0x36, 0x80, 0x45, 0x7c, 0x34, 0xc5, 0x14, + 0x83, 0x86, 0xd7, 0xcb, 0x12, 0xd2, 0xcc, 0xdf, 0xcd, 0xe1, 0x3a, 0x97, 0x76, 0xca, 0xc4, 0x98, 0x4e, 0x03, 0x14, 0x7f, 0x96, 0x0d, 0xca, 0x52, 0x79, 0xdf, 0xc4, 0x23, 0x80, 0x76, 0xf2, 0x27, + 0x95, 0x8f, 0xb8, 0xa7, 0x1b, 0xbf, 0x4f, 0x6b, 0x51, 0x3c, 0x96, 0x28, 0xbd, 0x5b, 0xe1, 0x77, 0x7f, 0x46, 0x9c, 0x26, 0xd2, 0xd6, 0x9a, 0x18, 0x7e, 0x3f, 0x85, 0xc4, 0x9f, 0x49, 0x4f, 0x1f, + 0xf1, 0x2b, 0xe7, 0xb0, 0xff, 0xdc, 0x12, 0xfa, 0xba, 0x46, 0xff, 0x99, 0xf2, 0x23, 0xad, 0xfb, 0x27, 0xf0, 0xa7, 0x97, 0x5a, 0x42, 0xa5, 0x72, 0x7c, 0xb9, 0xe3, 0x8d, 0x9a, 0xba, 0x62, 0x0d, + 0x04, 0x3f, 0x51, 0x4c, 0xab, 0x70, 0xc9, 0xbe, 0xe6, 0x54, 0x0c, 0x0c, 0xa4, 0x4e, 0xe1, 0x4b, 0xba, 0xa9, 0x2b, 0x93, 0x5d, 0x43, 0xfb, 0xcb, 0xc7, 0x20, 0x8f, 0x46, 0xae, 0x49, 0xb6, 0x22, + 0x95, 0x8e, 0x1a, 0xe8, 0xb2, 0xca, 0x55, 0x6e, 0xc1, 0x42, 0xd0, 0xa6, 0x3d, 0x3a, 0x06, 0x3e, 0x26, 0x5e, 0xda, 0x13, 0x55, 0x6d, 0x18, 0x14, 0x7e, 0x7e, 0xe4, 0x39, 0xe4, 0xaa, 0xa1, 0x03, + 0x6c, 0x0e, 0x1e, 0x6c, 0x04, 0xbd, 0xad, 0x7e, 0x21, 0x63, 0x27, 0xf6, 0x03, 0xe8, 0xee, 0xcc, 0x99, 0x2e, 0x3f, 0x32, 0x78, 0x1e, 0x5b, 0x0f, 0x60, 0x22, 0xe4, 0xfc, 0xe1, 0xee, 0xc7, 0x25, + 0x83, 0xa3, 0x11, 0xb0, 0xc3, 0x5d, 0x80, 0x98, 0x2b, 0xc3, 0xa2, 0x97, 0xea, 0x6a, 0xff, 0x34, 0xba, 0x9b, 0x16, 0x56, 0xde, 0x71, 0xed, 0x74, 0x52, 0x95, 0x3a, 0x10, 0x8f, 0x25, 0x66, 0x1c, + 0x4b, 0x6e, 0x35, 0xaa, 0x40, 0x7f, 0x6d, 0x4d, 0x89, 0x45, 0x3d, 0x74, 0x95, 0x0f, 0x83, 0xad, 0x20, 0xf4, 0xae, 0x94, 0x10, 0x69, 0xa3, 0x71, 0x76, 0x64, 0x7a, 0x75, 0x00, 0x3b, 0x40, 0x29, + 0x0e, 0x3e, 0x13, 0x8a, 0x63, 0xe0, 0x3c, 0x8a, 0xd2, 0x0a, 0x8a, 0x5d, 0xd0, 0x90, 0x51, 0x9c, 0x26, 0xc0, 0x5d, 0xfd, 0x19, 0x13, 0xfd, 0x91, 0x0e, 0x7d, 0x5f, 0xef, 0x63, 0x63, 0x49, 0x13, + 0xc5, 0xed, 0xd7, 0x1e, 0x2a, 0xed, 0x7d, 0xb8, 0xcf, 0x9d, 0xc4, 0x1f, 0x8c, 0xa8, 0xe1, 0xb6, 0xe2, 0x04, 0xc2, 0xd7, 0x21, 0x69, 0x68, 0xa1, 0x38, 0x46, 0x5c, 0xc1, 0x86, 0x45, 0x6a, 0x1c, + 0x5a, 0xe7, 0x2f, 0x6b, 0x55, 0x69, 0x2d, 0xb9, 0x92, 0xe4, 0x6a, 0xc6, 0x0b, 0x2d, 0x55, 0x0f, 0xc2, 0x86, 0x93, 0x18, 0xee, 0x15, 0x2f, 0xb9, 0x7b, 0xf4, 0x0b, 0x2d, 0xf1, 0x3d, 0xa2, 0x0d, + 0x5e, 0x5d, 0x54, 0x4e, 0x00, 0x0b, 0x5a, 0x1d, 0xb6, 0xbb, 0xb9, 0x55, 0xa4, 0x79, 0x92, 0x55, 0xdd, 0x5d, 0xdd, 0x6c, 0x28, 0x41, 0xc7, 0xc6, 0xe0, 0xf8, 0xdd, 0xc5, 0x8b, 0xe8, 0x5b, 0x15, + 0x36, 0x2c, 0x11, 0xdf, 0xb4, 0xa8, 0x8f, 0xa1, 0x35, 0xd3, 0x04, 0x87, 0xea, 0xb1, 0xbd, 0xdb, 0xe0, 0xb4, 0xaa, 0xf3, 0xce, 0x12, 0xbb, 0xe0, 0x60, 0xb8, 0x2d, 0xb3, 0xb5, 0xfb, 0x53, 0x05, + 0xd6, 0x0a, 0xb8, 0x5c, 0xf7, 0xf6, 0xac, 0xfc, 0x2d, 0x93, 0x99, 0x24, 0x94, 0x00, 0x0c, 0x58, 0x42, 0xb9, 0x55, 0xf4, 0x5c, 0x87, 0xb5, 0x1c, 0x22, 0x39, 0x31, 0x1a, 0xa6, 0xa3, 0xf6, 0x12, + 0x05, 0x1e, 0x07, 0x04, 0xc1, 0xbc, 0x19, 0x88, 0xac, 0x5f, 0x25, 0x81, 0xbb, 0x52, 0x6f, 0xf7, 0x67, 0xda, 0xad, 0xfa, 0xa1, 0xe8, 0x1d, 0xc6, 0xb3, 0x81, 0x77, 0x45, 0x95, 0x9e, 0xaf, 0x2f, + 0xdb, 0xd1, 0xcc, 0xb4, 0x50, 0x07, 0xea, 0x77, 0xb6, 0xe7, 0x01, 0x97, 0xc2, 0xd0, 0x76, 0xa1, 0xeb, 0xd4, 0x1d, 0x1a, 0x5d, 0x79, 0x3d, 0x9f, 0xa6, 0xcf, 0xd3, 0x68, 0xcb, 0x39, 0x76, 0x1c, + 0xdd, 0xa0, 0xbe, 0xbe, 0x87, 0x6d, 0xa2, 0xb4, 0x2a, 0xae, 0xfe, 0xd2, 0x02, 0xc5, 0x04, 0xb5, 0x8a, 0xd0, 0xf4, 0x30, 0xb4, 0xcf, 0xfb, 0x02, 0x15, 0xf8, 0x81, 0x62, 0xa4, 0x85, 0x9d, 0x0d, + 0xd3, 0x12, 0x38, 0x69, 0xc7, 0x01, 0xc1, 0xed, 0x4c, 0xf1, 0x3d, 0x41, 0x36, 0xaa, 0x7a, 0x77, 0x98, 0xf3, 0x52, 0x69, 0xf1, 0x4a, 0xcf, 0x31, 0x99, 0x1d, 0xa1, 0x4e, 0x07, 0xb7, 0xa9, 0x00, + 0xa3, 0x05, 0x67, 0x40, 0x2b, 0xe6, 0x6a, 0xfa, 0xd8, 0x08, 0xb8, 0xca, 0xdc, 0xe5, 0x34, 0x56, 0x71, 0x00, 0xb3, 0x62, 0x6a, 0x0b, 0xdc, 0x5e, 0x2a, 0xd6, 0xb7, 0xdd, 0x49, 0xb3, 0xfa, 0x07, + 0x2d, 0xf5, 0x4c, 0x97, 0xac, 0x21, 0xef, 0x63, 0x7f, 0x39, 0x1d, 0xb3, 0x55, 0x81, 0x0c, 0xc4, 0xe9, 0x3d, 0xab, 0x36, 0xa5, 0x55, 0xd0, 0xa7, 0xbd, 0xe6, 0x6f, 0xbd, 0xaf, 0xf3, 0xf8, 0x11, + 0x30, 0xe8, 0x50, 0xae, 0x37, 0xa4, 0x6d, 0xd0, 0xdf, 0x0a, 0x3e, 0x99, 0x58, 0xf0, 0x3c, 0x8a, 0x96, 0x83, 0x08, 0x93, 0xa1, 0x22, 0x5d, 0x80, 0x99, 0x98, 0xf4, 0xf8, 0x69, 0xc5, 0x07, 0x00, + 0x92, 0xcc, 0x38, 0x33, 0x8a, 0x52, 0x7e, 0xcf, 0xfc, 0x5a, 0xca, 0x8f, 0xfe, 0x9f, 0x54, 0x34, 0x45, 0xb3, 0xa7, 0x89, 0x21, 0x8f, 0x63, 0x0e, 0x7c, 0x08, 0xb6, 0xf1, 0x8b, 0xb1, 0xdf, 0x15, + 0x6a, 0xac, 0xf0, 0xa2, 0xea, 0x64, 0x66, 0xb9, 0x24, 0xfa, 0x0d, 0xb9, 0xda, 0x43, 0x40, 0x53, 0x9f, 0xbc, 0x1b, 0xb7, 0x8f, 0xd4, 0x2a, 0x72, 0x72, 0xfa, 0xd2, 0x62, 0xa0, 0xca, 0x40, 0x21, + 0x15, 0xb7, 0x51, 0x42, 0xfe, 0xde, 0x33, 0x9b, 0x59, 0xdd, 0x23, 0x20, 0x1d, 0xdd, 0x89, 0xb1, 0x07, 0x3b, 0x02, 0xe6, 0x84, 0x1b, 0x27, 0x04, 0x47, 0x8d, 0x39, 0xe5, 0xe4, 0x6f, 0xc0, 0x11, + 0xdf, 0xc0, 0x78, 0x08, 0x86, 0xb2, 0xee, 0x66, 0x46, 0x3b, 0xdf, 0xf0, 0x1c, 0x76, 0x44, 0x4d, 0xb7, 0x69, 0xae, 0xc7, 0xbb, 0x73, 0xeb, 0x57, 0x81, 0x8f, 0x5f, 0xae, 0x0b, 0xf9, 0x75, 0x07, + 0x9f, 0x6b, 0x9d, 0xf8, 0x5f, 0x32, 0x79, 0xdc, 0x68, 0x87, 0x9d, 0x55, 0x53, 0x36, 0x89, 0x0d, 0x51, 0x5e, 0x4d, 0x10, 0x5e, 0x30, 0xa4, 0x37, 0xb8, 0x58, 0xb7, 0x64, 0xfb, 0xbe, 0x25, 0x02, + 0x4f, 0xac, 0x3c, 0xb0, 0x19, 0xcd, 0xbd, 0xbb, 0xd1, 0xd3, 0x5e, 0x66, 0x40, 0xba, 0x1f, 0xfa, 0x8c, 0xc1, 0x86, 0xf4, 0x02, 0xcc, 0x32, 0x12, 0x7f, 0x22, 0xd9, 0x45, 0x02, 0x73, 0x1a, 0x20, + 0xcb, 0x0a, 0x29, 0x1e, 0x4f, 0xb6, 0x4a, 0x43, 0xaa, 0x8c, 0xc1, 0x5d, 0x47, 0x3f, 0xa3, 0xc1, 0x63, 0x05, 0x5b, 0xb1, 0xaa, 0x6a, 0x68, 0x0c, 0xf8, 0x47, 0x66, 0x2a, 0xb1, 0x63, 0x8b, 0x12, + 0x39, 0x08, 0xfb, 0x0e, 0x3b, 0x97, 0x1a, 0x67, 0x3b, 0x9f, 0xe0, 0xc7, 0x16, 0x9c, 0x74, 0x3c, 0xcf, 0x30, 0x65, 0x27, 0x5d, 0xe0, 0x8d, 0x15, 0xe1, 0xe2, 0xd4, 0x53, 0x81, 0xce, 0x34, 0x0a, + 0xce, 0x95, 0x24, 0x08, 0x15, 0x99, 0x55, 0x2b, 0x8f, 0x19, 0xa1, 0xbc, 0x99, 0x36, 0xa4, 0xab, 0xe3, 0x08, 0xdc, 0xa4, 0x6e, 0xa9, 0xc4, 0xc8, 0x13, 0x55, 0x66, 0x23, 0xd3, 0xc5, 0x09, 0x28, + 0xe3, 0x8b, 0x31, 0xce, 0xc9, 0xa0, 0x78, 0xed, 0x61, 0xf0, 0x78, 0x26, 0x62, 0x16, 0x3c, 0xf8, 0xbb, 0x68, 0x9a, 0x5e, 0x97, 0x32, 0x6f, 0xf3, 0x25, 0xe4, 0x1f, 0xd7, 0xe7, 0x29, 0xb9, 0x23, + 0xa9, 0x74, 0x7e, 0x5a, 0xdd, 0x71, 0x27, 0x04, 0x25, 0xd6, 0x5a, 0xd2, 0xc3, 0xc0, 0x89, 0x1f, 0xd0, 0xc0, 0x88, 0x6b, 0x5c, 0xf9, 0x73, 0xb7, 0x8a, 0x44, 0xae, 0x02, 0x3d, 0xa9, 0xa1, 0x1c, + 0x7e, 0x4e, 0x47, 0x7b, 0xdc, 0x60, 0x7f, 0xd4, 0x9d, 0x5d, 0xa5, 0xb1, 0xd2, 0x24, 0x2b, 0x47, 0x3f, 0xc3, 0x58, 0xa0, 0x27, 0x56, 0xba, 0x8c, 0x9a, 0x20, 0xfd, 0xcd, 0x1c, 0x38, 0xc7, 0x03, + 0x15, 0x30, 0x1c, 0xd6, 0xd4, 0x71, 0xe3, 0x12, 0x98, 0xbe, 0xc4, 0x8f, 0x9e, 0x22, 0x88, 0x06, 0xc9, 0x01, 0x6c, 0xef, 0xcc, 0xff, 0xed, 0xea, 0x25, 0x8a, 0x66, 0xbb, 0x29, 0x1a, 0xbe, 0x00, + 0x26, 0x46, 0xaf, 0x89, 0x01, 0x2f, 0xc8, 0xb8, 0x65, 0xa8, 0x46, 0x69, 0x82, 0xee, 0x56, 0x52, 0x9e, 0xab, 0xed, 0x95, 0x38, 0xc8, 0x6f, 0x07, 0xfc, 0x15, 0xc4, 0xd5, 0xfb, 0x1b, 0x82, 0x2c, + 0x77, 0xba, 0x0c, 0x7a, 0xdb, 0x29, 0x0a, 0x6d, 0xe4, 0x0f, 0xc9, 0x82, 0x98, 0x73, 0x78, 0x16, 0xac, 0xe7, 0xc1, 0x44, 0x01, 0xf9, 0xcf, 0x15, 0x6a, 0x2f, 0x18, 0x52, 0xb2, 0xf5, 0x8f, 0x0b, + 0x5c, 0x7d, 0xeb, 0x9d, 0x72, 0x52, 0x2f, 0xe4, 0xa5, 0xc4, 0x13, 0xd2, 0x1f, 0xe8, 0x2e, 0x40, 0xc5, 0xd4, 0xb8, 0x88, 0x38, 0x62, 0x17, 0xb0, 0xf1, 0xba, 0x06, 0x53, 0xb1, 0x94, 0x0e, 0x1c, + 0xd4, 0x1c, 0xca, 0xc5, 0xb5, 0xde, 0xff, 0xa8, 0x83, 0x73, 0x65, 0xc7, 0xc2, 0x48, 0x33, 0xe2, 0x10, 0x04, 0x5a, 0xcf, 0xba, 0xed, 0x44, 0x5b, 0x7a, 0xe1, 0x3c, 0xf1, 0xb0, 0xde, 0x31, 0x20, + 0xac, 0x18, 0x20, 0x00, 0xa4, 0xb6, 0xd5, 0xf3, 0x24, 0x3d, 0xb1, 0xae, 0xfb, 0x49, 0x42, 0x03, 0xc3, 0x18, 0xb7, 0x0e, 0xc9, 0x8e, 0x07, 0xac, 0x98, 0xeb, 0xe8, 0x44, 0x4f, 0xd1, 0x34, 0x0e, + 0xca, 0x4c, 0xcb, 0xc2, 0x91, 0x88, 0x86, 0xb9, 0x28, 0x79, 0xb0, 0x43, 0x5a, 0x77, 0xfb, 0xeb, 0x23, 0x3d, 0x8b, 0xc5, 0x30, 0x00, 0x82, 0x29, 0xc4, 0x1c, 0x8b, 0x6f, 0xb7, 0xf1, 0x10, 0x2a, + 0xb7, 0xd1, 0xdb, 0xf1, 0x12, 0xb5, 0x22, 0x52, 0xb3, 0x5f, 0x23, 0xe2, 0x85, 0xc3, 0x1a, 0x46, 0x7a, 0x23, 0xd2, 0xec, 0xc7, 0xc0, 0xd2, 0x81, 0xf9, 0x63, 0xb7, 0x7f, 0x4f, 0xbf, 0x35, 0x05, + 0x18, 0xcc, 0x76, 0x55, 0x6d, 0xe8, 0x28, 0x96, 0x19, 0x6b, 0x5e, 0x3b, 0x4e, 0xe3, 0x7f, 0x0d, 0xdc, 0x09, 0xf6, 0x43, 0x99, 0x3b, 0xce, 0xb7, 0x4f, 0xf7, 0xef, 0xff, 0xfb, 0xb3, 0xcc, 0x12, + 0x6c, 0x12, 0x3e, 0x8e, 0x51, 0x6d, 0x45, 0xcf, 0x91, 0x65, 0x47, 0xeb, 0xc3, 0x22, 0x7f, 0xa4, 0x98, 0xc4, 0xff, 0xbc, 0xb3, 0x9e, 0x6c, 0xbe, 0x66, 0x2e, 0x0a, 0x22, 0x78, 0xcd, 0x44, 0x1f, + 0x73, 0xc0, 0xab, 0xf9, 0xd6, 0x53, 0x63, 0x43, 0x46, 0xa0, 0xdf, 0xfc, 0x23, 0xb7, 0x90, 0x62, 0x53, 0x5c, 0x82, 0x0e, 0xd1, 0xd7, 0x22, 0x8c, 0x8b, 0x74, 0x4a, 0x44, 0xe3, 0xe9, 0x60, 0x1d, + 0x88, 0x66, 0x4b, 0xff, 0x78, 0x8d, 0xb8, 0x1a, 0x86, 0x67, 0xaf, 0x40, 0x4e, 0x95, 0x48, 0xe3, 0x58, 0xff, 0x96, 0x9b, 0x7f, 0x92, 0x44, 0x25, 0xef, 0x14, 0xd0, 0x7b, 0xc6, 0xcc, 0xa3, 0x05, + 0x6d, 0xdc, 0x86, 0x69, 0x43, 0xa3, 0xf5, 0x23, 0x62, 0x23, 0xcb, 0xbd, 0x64, 0xed, 0x72, 0x52, 0x38, 0x4c, 0x73, 0x98, 0xb8, 0x3e, 0x9d, 0x3b, 0xc2, 0x9e, 0x6e, 0x89, 0x95, 0xb1, 0xe5, 0x1b, + 0xab, 0xcd, 0x73, 0xa8, 0x27, 0x48, 0x8b, 0x5b, 0x27, 0xc9, 0x49, 0x88, 0xa1, 0x94, 0x7e, 0x8e, 0xde, 0x04, 0x8c, 0x2e, 0xa8, 0xca, 0xba, 0x8e, 0x6a, 0xb4, 0xa0, 0x07, 0xdd, 0x27, 0x64, 0x1d, + 0x9a, 0xad, 0x35, 0xa7, 0xba, 0x37, 0xd3, 0xf7, 0xf8, 0xb4, 0xdc, 0x93, 0x7f, 0x3a, 0xc9, 0x41, 0x54, 0x62, 0x69, 0xae, 0xd5, 0xe4, 0x4f, 0x70, 0x92, 0xb6, 0x46, 0xf9, 0x03, 0xa4, 0x09, 0x2f, + 0x37, 0x1b, 0xf4, 0x81, 0x3e, 0x82, 0xd3, 0xa8, 0x4a, 0xa6, 0x6c, 0x1b, 0x73, 0x71, 0x8c, 0x74, 0x7b, 0xf6, 0x6f, 0x7b, 0x29, 0xb7, 0x84, 0xe0, 0x88, 0x34, 0x59, 0x11, 0x05, 0x54, 0x07, 0x18, + 0x1d, 0x2e, 0x52, 0x99, 0x01, 0x38, 0x70, 0xe4, 0x92, 0x73, 0xe5, 0xeb, 0x64, 0x35, 0x2f, 0x73, 0x4b, 0xa0, 0xbd, 0x45, 0x48, 0xb2, 0x08, 0xd1, 0x80, 0xac, 0x02, 0xa7, 0xb7, 0xaa, 0x1d, 0x0f, + 0xca, 0x65, 0x17, 0xb5, 0xa0, 0xd5, 0x33, 0x97, 0x06, 0xf1, 0x5c, 0xe5, 0x0a, 0x3b, 0x5e, 0xbc, 0x39, 0x14, 0x26, 0xdf, 0x82, 0xaf, 0xce, 0x45, 0x7a, 0xb4, 0xf0, 0x2b, 0xf7, 0xd0, 0x97, 0x17, + 0xad, 0xbd, 0xcf, 0x00, 0x5e, 0xf3, 0xfd, 0x1d, 0xc6, 0xeb, 0x6f, 0xc8, 0x81, 0x52, 0xd2, 0xd4, 0x75, 0x0c, 0x93, 0x59, 0xe9, 0x2c, 0xd0, 0xe3, 0xc5, 0x31, 0x36, 0x00, 0xb4, 0xb9, 0xdb, 0x2a, + 0xd6, 0x35, 0xb3, 0x5d, 0x05, 0xf2, 0xd2, 0x07, 0xd5, 0x79, 0xda, 0x46, 0x56, 0xdf, 0xbd, 0xf9, 0x8e, 0x32, 0x48, 0xa5, 0xa2, 0x0f, 0x80, 0xd2, 0x28, 0xf9, 0x3e, 0x39, 0x87, 0xad, 0x47, 0x13, + 0x1e, 0xdf, 0xd2, 0x39, 0x95, 0x23, 0xc7, 0x74, 0x7b, 0xde, 0x8c, 0x16, 0x59, 0xb9, 0x0c, 0xd3, 0xcc, 0x2e, 0x65, 0x85, 0xa9, 0xf6, 0xad, 0x0d, 0x20, 0x2c, 0x1e, 0xd3, 0x02, 0x8e, 0x65, 0x15, + 0xd0, 0xe8, 0x6f, 0x1a, 0x19, 0xed, 0x3a, 0x4f, 0xda, 0x0c, 0xc6, 0x9b, 0xb2, 0x8b, 0x6f, 0x6d, 0x99, 0xfa, 0xd3, 0x7d, 0x68, 0xce, 0xc3, 0x74, 0x2a, 0xd1, 0xce, 0x8b, 0xc2, 0x0d, 0xf0, 0x01, + 0xf7, 0x91, 0x94, 0xd8, 0x8b, 0x3a, 0xb0, 0x3c, 0x26, 0x7b, 0xe7, 0xb3, 0xcb, 0xa2, 0x2e, 0xa9, 0x41, 0x05, 0xff, 0x56, 0x1a, 0xf5, 0xa8, 0xb9, 0x68, 0x4b, 0x24, 0x30, 0xc2, 0xbc, 0x4e, 0x15, + 0xf9, 0x6c, 0xea, 0x41, 0xf7, 0xc4, 0x80, 0x4b, 0xa9, 0xde, 0xec, 0x2e, 0x0e, 0x81, 0x3f, 0x7a, 0x6c, 0x94, 0xd1, 0x93, 0x8e, 0x37, 0x85, 0x58, 0x87, 0x8c, 0x3a, 0x52, 0x4b, 0xf7, 0x65, 0x1f, + 0x78, 0x57, 0x50, 0xf0, 0xda, 0x58, 0x00, 0xe4, 0xcc, 0xb8, 0xe2, 0x92, 0x96, 0xb2, 0xa6, 0x79, 0x24, 0x06, 0xb4, 0x6c, 0x9b, 0xcc, 0x9a, 0x68, 0xed, 0x23, 0xbd, 0xa4, 0x59, 0xa5, 0x04, 0x25, + 0x06, 0x32, 0xc4, 0xbf, 0xe1, 0x9c, 0x27, 0xbc, 0x46, 0xd0, 0xab, 0x99, 0xca, 0x87, 0x9c, 0x68, 0x35, 0x29, 0x6a, 0x39, 0x52, 0x0e, 0x86, 0xef, 0x65, 0xe5, 0xe4, 0x26, 0x99, 0x6d, 0x49, 0x24, + 0x38, 0x98, 0x92, 0xbb, 0x2f, 0xc8, 0xbd, 0x71, 0x1a, 0xcd, 0x48, 0xea, 0x54, 0x93, 0x5c, 0x4a, 0x14, 0xe7, 0x60, 0x19, 0x6d, 0x84, 0x83, 0xd4, 0xd8, 0xf4, 0x43, 0xb1, 0x22, 0xcd, 0x9c, 0x2c, + 0xc4, 0xf8, 0xdd, 0x0d, 0x69, 0x6f, 0x7d, 0xf1, 0xa4, 0xcf, 0x5f, 0xeb, 0xf6, 0x74, 0x72, 0xc4, 0x6d, 0x7a, 0x2a, 0x21, 0xcd, 0xa1, 0x21, 0xb3, 0x8d, 0x4a, 0x06, 0x1b, 0x2e, 0xd0, 0x9b, 0x2b, + 0x72, 0x04, 0xe0, 0x16, 0x68, 0x0c, 0x5f, 0xea, 0xb6, 0xd3, 0x42, 0xae, 0x73, 0x18, 0xe4, 0x8a, 0xa3, 0xc0, 0x36, 0xbf, 0x1f, 0x44, 0xfe, 0x32, 0x2f, 0x38, 0x18, 0x41, 0x00, 0xf0, 0x21, 0x0b, + 0x2c, 0x60, 0xb7, 0x23, 0x06, 0xb3, 0x8e, 0x75, 0xf1, 0x5f, 0xee, 0xa1, 0xb0, 0xaa, 0xab, 0xeb, 0x3b, 0x5a, 0x60, 0x8b, 0xe4, 0xf3, 0x59, 0x70, 0x58, 0x52, 0x18, 0x49, 0xfb, 0x6e, 0x75, 0x10, + 0x4a, 0x06, 0xb5, 0xba, 0x6c, 0xbc, 0xb6, 0x69, 0xf9, 0x85, 0xc6, 0xb3, 0xa8, 0x5a, 0xe3, 0xef, 0x67, 0x9d, 0xe2, 0x40, 0xb5, 0x41, 0x48, 0x1f, 0x6d, 0x88, 0x23, 0x88, 0xa3, 0x74, 0x75, 0x12, + 0xd0, 0xf9, 0x7f, 0x63, 0x8d, 0x2f, 0xbd, 0x28, 0x8e, 0xf3, 0x87, 0xaa, 0xe7, 0xea, 0x5b, 0xb8, 0x66, 0xb6, 0x33, 0x8c, 0x5b, 0x26, 0x82, 0x43, 0xdb, 0xa3, 0xd2, 0x0e, 0x62, 0x1d, 0x75, 0x24, + 0x3d, 0x45, 0x2f, 0xa0, 0x3d, 0xc4, 0x76, 0xfc, 0xa9, 0x41, 0x36, 0x44, 0xbc, 0x94, 0xe9, 0x0f, 0x8d, 0x4d, 0xe0, 0xcf, 0xcc, 0xfc, 0x87, 0xe8, 0x92, 0x8a, 0x2e, 0x89, 0x08, 0x72, 0x3d, 0x2e, + 0x2b, 0xd6, 0xb9, 0x07, 0x35, 0xe4, 0xd5, 0x4c, 0x43, 0x15, 0xbf, 0x66, 0x81, 0x0d, 0xd0, 0x9e, 0x8b, 0x85, 0xb1, 0xe1, 0x20, 0xbe, 0x99, 0x06, 0x81, 0xe6, 0x71, 0x90, 0x71, 0xf6, 0xc3, 0x11, + 0xf9, 0xa2, 0x0a, 0xf3, 0x27, 0xad, 0x35, 0xa4, 0xd4, 0x82, 0x7f, 0xa8, 0x51, 0xfe, 0x7a, 0x4a, 0xd2, 0x04, 0x3f, 0xcc, 0xdf, 0xea, 0xc4, 0x3a, 0x7f, 0x4e, 0x3a, 0x69, 0x12, 0x61, 0xb8, 0x00, + 0x29, 0x79, 0xa9, 0xa5, 0x1c, 0xcc, 0xb4, 0xa6, 0xd7, 0xee, 0x17, 0xed, 0xe8, 0x90, 0xf5, 0x57, 0xc8, 0x06, 0x7a, 0x6a, 0x28, 0x94, 0xe2, 0x80, 0x01, 0x7f, 0xa8, 0x00, 0x84, 0x34, 0x77, 0x1a, + 0x7d, 0x15, 0x56, 0x4f, 0xa0, 0xc9, 0x19, 0x23, 0x7f, 0x95, 0x49, 0x6f, 0x31, 0x01, 0xc6, 0xdc, 0xd2, 0xbd, 0xab, 0x44, 0xd5, 0x7d, 0x96, 0xbc, 0x19, 0xe4, 0xf2, 0xff, 0x0f, 0xeb, 0x7f, 0x20, + 0x48, 0xba, 0x96, 0x31, 0xed, 0xba, 0x61, 0x5e, 0xa8, 0xd1, 0x46, 0xfc, 0x04, 0x40, 0xc8, 0x0b, 0x38, 0x90, 0x5a, 0x83, 0x62, 0xc4, 0x3f, 0xaa, 0x65, 0x32, 0x48, 0xe6, 0xc4, 0xaa, 0xf4, 0x0d, + 0x4f, 0xbb, 0xea, 0x8a, 0xd8, 0xb5, 0xdb, 0xdb, 0x35, 0x85, 0x45, 0xc2, 0x69, 0xcc, 0x5c, 0x2e, 0xfc, 0x57, 0x7f, 0xfe, 0x1d, 0x20, 0x51, 0x31, 0x7d, 0xe2, 0xd0, 0x6e, 0xdb, 0xf3, 0x2d, 0x2f, + 0x7e, 0x4b, 0xf7, 0x95, 0x4b, 0x18, 0x89, 0xe2, 0x42, 0x85, 0xe9, 0x2c, 0xcb, 0x5b, 0x9b, 0xbf, 0x1b, 0x8b, 0x5c, 0x8c, 0x83, 0x86, 0x6f, 0x39, 0xae, 0xdb, 0x68, 0x35, 0x1c, 0x81, 0x51, 0x2f, + 0x19, 0x02, 0x23, 0x22, 0x1d, 0xda, 0x61, 0x44, 0xcf, 0xd4, 0x25, 0x13, 0x89, 0x28, 0x59, 0x83, 0x0e, 0x49, 0xc0, 0xea, 0x69, 0x83, 0x04, 0x5b, 0xf5, 0xc3, 0xc8, 0x6d, 0x46, 0xec, 0x98, 0x11, + 0x43, 0xc0, 0x86, 0xfa, 0xfd, 0x05, 0xf0, 0x9b, 0xc3, 0xdf, 0xdf, 0x90, 0xe2, 0x02, 0x24, 0x19, 0xdf, 0x67, 0x86, 0x3d, 0x65, 0xdd, 0x4f, 0xee, 0xa1, 0x14, 0x07, 0xeb, 0x27, 0x68, 0x03, 0x19, + 0x69, 0x90, 0x34, 0x36, 0x64, 0xb7, 0x16, 0x55, 0x96, 0x2a, 0x2d, 0xc5, 0xc8, 0xa6, 0x82, 0x40, 0xce, 0x71, 0x23, 0x31, 0x65, 0xf3, 0x8d, 0x81, 0xf2, 0x29, 0x8c, 0x01, 0x74, 0xd7, 0x78, 0x09, + 0xe5, 0xdc, 0xd1, 0x8f, 0x2c, 0x81, 0xa5, 0x66, 0xe3, 0xd7, 0xf6, 0xe3, 0x14, 0x72, 0x03, 0xee, 0x3f, 0x23, 0x7b, 0x31, 0xf9, 0x1a, 0x11, 0xce, 0x9a, 0xeb, 0x67, 0x47, 0xd9, 0xd2, 0x1e, 0x23, + 0xc2, 0x56, 0x34, 0x65, 0x06, 0xd6, 0xb9, 0x67, 0x04, 0x8e, 0x4e, 0xac, 0xac, 0xe8, 0x3b, 0x4c, 0x5f, 0xd2, 0x35, 0xb5, 0x1d, 0x4d, 0xb0, 0x3e, 0xb9, 0x8a, 0xba, 0xce, 0x02, 0x85, 0xbd, 0x0f, + 0xbb, 0xd4, 0x78, 0x84, 0x3f, 0x46, 0x34, 0x33, 0xa4, 0xbf, 0xb4, 0xd5, 0x12, 0xb7, 0xc9, 0x52, 0x5b, 0xdd, 0x4c, 0xae, 0x2e, 0x4d, 0x6a, 0x43, 0x4e, 0x46, 0xda, 0x5d, 0xc3, 0xfa, 0xe9, 0x20, + 0x00, 0xba, 0x45, 0x14, 0x82, 0x82, 0x61, 0xa2, 0x69, 0xdb, 0xde, 0x3b, 0x92, 0x9b, 0xd0, 0x6d, 0xb0, 0x21, 0x01, 0xee, 0x39, 0xab, 0xa5, 0x12, 0x8a, 0x27, 0x75, 0xb1, 0xc4, 0x9f, 0xba, 0x15, + 0xd3, 0x54, 0xa6, 0x22, 0x5e, 0x57, 0xbf, 0x66, 0x24, 0x38, 0x18, 0x29, 0x4f, 0x70, 0xe8, 0x1a, 0x7a, 0x41, 0x63, 0x5b, 0x67, 0x62, 0xd0, 0x06, 0x0a, 0xb1, 0x48, 0x90, 0xec, 0x9a, 0x3c, 0x0c, + 0xf0, 0xdd, 0x1c, 0xa9, 0xf3, 0x0b, 0xd5, 0x7e, 0x35, 0x3c, 0xb2, 0x53, 0x41, 0x76, 0x2f, 0xf9, 0xaa, 0xf0, 0x24, 0xc5, 0x91, 0x21, 0xde, 0xa9, 0x95, 0x95, 0xc7, 0xb4, 0x6e, 0xa4, 0x95, 0x27, + 0x1a, 0xa8, 0xca, 0x28, 0x48, 0xe2, 0x50, 0xaa, 0xe4, 0xdd, 0xb6, 0x5f, 0x98, 0x69, 0x0c, 0xb9, 0x86, 0xeb, 0x29, 0xf2, 0x30, 0xea, 0x76, 0x12, 0x86, 0x3d, 0x25, 0xc4, 0x93, 0x78, 0xab, 0x10, + 0x59, 0xd3, 0x5f, 0x0a, 0x09, 0xaa, 0xf2, 0x8d, 0xc5, 0x75, 0xba, 0xd8, 0xce, 0x6d, 0x0c, 0xe9, 0x53, 0xe9, 0x01, 0xfc, 0x64, 0x3f, 0x50, 0x44, 0x2c, 0xf6, 0x9a, 0x15, 0xd8, 0x09, 0x45, 0x2d, + 0xb9, 0xe7, 0x04, 0x7f, 0xee, 0xc9, 0xa6, 0x24, 0x75, 0xb6, 0x31, 0x0e, 0x7b, 0xea, 0x07, 0xd1, 0x04, 0x22, 0x27, 0x6c, 0x9a, 0x9b, 0xe0, 0xea, 0x94, 0xeb, 0x4f, 0x7f, 0x95, 0x46, 0x79, 0x15, + 0x6a, 0x13, 0x0f, 0x0d, 0x1a, 0x75, 0x7a, 0xe6, 0x9a, 0xd2, 0xc3, 0xcd, 0x65, 0x3e, 0x39, 0x4b, 0x93, 0xd6, 0xa6, 0xfe, 0x59, 0x0b, 0x9a, 0x2f, 0x86, 0x5b, 0xb6, 0x02, 0xfe, 0x4e, 0x46, 0x30, + 0x01, 0xc9, 0x24, 0x13, 0x8b, 0x8f, 0xcd, 0x4d, 0xf7, 0x70, 0x0e, 0x76, 0x1d, 0xa4, 0x2b, 0x74, 0x0c, 0x02, 0xed, 0xe5, 0xc4, 0xda, 0xfc, 0x8f, 0xd3, 0x66, 0x56, 0xd0, 0xa2, 0xb3, 0x65, 0x09, + 0x55, 0xec, 0xeb, 0x68, 0x16, 0x97, 0xcc, 0xda, 0x85, 0x65, 0x0f, 0xd7, 0xbb, 0xee, 0x79, 0xa7, 0x38, 0x20, 0x15, 0x8f, 0x0a, 0x8f, 0x92, 0x39, 0x76, 0xd5, 0x63, 0x46, 0x78, 0x1c, 0x53, 0x24, + 0x1d, 0x17, 0xb6, 0x7c, 0xae, 0x8d, 0x71, 0x01, 0x2e, 0x37, 0xa9, 0x26, 0x0f, 0x37, 0x30, 0xcf, 0xf2, 0xc0, 0x9c, 0x4a, 0xf2, 0xeb, 0x7d, 0xbf, 0x79, 0x5b, 0xf8, 0xf8, 0x0d, 0x07, 0x02, 0x22, + 0x5a, 0x74, 0x6e, 0x80, 0x5a, 0x38, 0xd5, 0x35, 0x64, 0xbe, 0x68, 0xb1, 0x37, 0x1f, 0x8f, 0xc7, 0xb9, 0x5d, 0x40, 0xb2, 0x9a, 0x7b, 0x16, 0x76, 0xeb, 0xe9, 0xa2, 0xba, 0xc0, 0x2f, 0x28, 0x08, + 0xe7, 0x95, 0x77, 0xc5, 0x84, 0x83, 0x89, 0x8d, 0x73, 0x93, 0x13, 0xdd, 0xaa, 0x54, 0xbf, 0x0d, 0xca, 0xdb, 0xd8, 0x8a, 0xec, 0x11, 0x03, 0x57, 0xe5, 0x33, 0xcd, 0x47, 0x6e, 0x3d, 0x8c, 0x17, + 0xea, 0xd1, 0x5e, 0xff, 0x3e, 0x20, 0x57, 0x68, 0x3d, 0xfc, 0xf4, 0xc3, 0x1e, 0x8d, 0x81, 0xeb, 0xff, 0xef, 0xdc, 0x90, 0xfb, 0xfe, 0xb1, 0x43, 0x36, 0xf3, 0x82, 0x9d, 0x5f, 0x90, 0xad, 0x12, + 0xc4, 0xb4, 0x66, 0x06, 0x48, 0x85, 0x8b, 0x22, 0xe0, 0x2c, 0xf4, 0x52, 0x3b, 0x7d, 0x1c, 0x7b, 0xbb, 0xc8, 0xa1, 0x14, 0x0c, 0x87, 0xa2, 0xd1, 0x6e, 0x5b, 0x16, 0xe4, 0xc9, 0x82, 0x96, 0x22, + 0xc9, 0xd4, 0x88, 0x2c, 0xe4, 0x1c, 0x24, 0xff, 0xf1, 0xdb, 0x18, 0xcf, 0x47, 0x3d, 0x33, 0x2a, 0x30, 0x40, 0x96, 0x47, 0x5e, 0xde, 0x55, 0xd1, 0x11, 0xdc, 0x44, 0x37, 0x85, 0x0d, 0x19, 0x25, + 0xbc, 0xe7, 0xfb, 0x0c, 0x60, 0xa8, 0x7c, 0x16, 0x1f, 0xac, 0x39, 0xa9, 0x9d, 0x39, 0x2d, 0xb4, 0x8a, 0xe4, 0x8f, 0x90, 0x26, 0xfe, 0xdc, 0xd8, 0x4f, 0xbf, 0x76, 0xdc, 0xfa, 0x47, 0xdb, 0x00, + 0x4c, 0xe9, 0xe2, 0x39, 0xa4, 0x2b, 0x2f, 0x31, 0x8f, 0x83, 0x5a, 0x12, 0xd4, 0xc6, 0x14, 0x7d, 0x55, 0xf0, 0x35, 0x49, 0x65, 0xc8, 0xf2, 0x60, 0x57, 0x02, 0xbe, 0xdc, 0x8a, 0xe8, 0xa5, 0x2b, + 0x1b, 0xa4, 0x8c, 0xd0, 0x58, 0xeb, 0x52, 0x1e, 0x0a, 0x3e, 0xbc, 0x39, 0x31, 0xff, 0x51, 0x0e, 0x37, 0x4b, 0x8b, 0x85, 0x0c, 0x85, 0x4f, 0x29, 0xcc, 0x9d, 0x69, 0x85, 0xae, 0xbb, 0x76, 0x13, + 0x42, 0x6a, 0x3b, 0x08, 0xc6, 0x42, 0x60, 0x7b, 0xc3, 0x2a, 0xee, 0x3e, 0x28, 0xea, 0x33, 0x69, 0x52, 0x75, 0x50, 0x1d, 0x36, 0xc7, 0xf5, 0x47, 0x07, 0x8e, 0xd5, 0xe3, 0xa1, 0xfd, 0x33, 0x13, + 0x2a, 0xa0, 0x99, 0xb7, 0x4b, 0xb6, 0x5b, 0x1d, 0x4d, 0x4e, 0x2d, 0x74, 0x3d, 0x14, 0xe2, 0x79, 0xb9, 0xfe, 0xf4, 0x79, 0x4b, 0x74, 0x87, 0xd6, 0xad, 0xe9, 0x94, 0x95, 0xdc, 0xc4, 0xbf, 0x28, + }; + } + + + namespace t12 { + int internal_rounds = 57; + + int alpha = 5; + + unsigned char mat_diag_m_1[] = { + 0xfa, 0x4f, 0x8f, 0xdd, 0x79, 0xad, 0x75, 0x10, 0xc3, 0x18, 0x12, 0xf6, 0x6f, 0x14, 0x1f, 0xea, 0xa2, 0x13, 0xea, 0x85, 0xc8, 0xf2, 0xe2, 0xb8, 0x80, 0xfe, 0x0b, 0xf4, 0x98, 0x1e, 0xbb, 0x20, + 0xb2, 0x9f, 0x64, 0x5c, 0x5e, 0x8d, 0x5f, 0x8f, 0x51, 0xa6, 0x5f, 0x91, 0x49, 0xf2, 0x8a, 0x1f, 0xfa, 0x02, 0x0f, 0xd9, 0x77, 0x0c, 0x4c, 0xa1, 0x8f, 0x67, 0x8d, 0x5c, 0xd0, 0xab, 0xd6, 0x1e, + 0x46, 0xcf, 0xe2, 0xb4, 0xf9, 0x81, 0xcb, 0xc7, 0x96, 0x07, 0x7e, 0x77, 0x81, 0x2b, 0x38, 0x04, 0xc5, 0xbb, 0xd6, 0x75, 0x39, 0x06, 0xf5, 0x66, 0xd5, 0x47, 0x8b, 0x65, 0x18, 0x7b, 0x10, 0x29, + 0x23, 0xe9, 0x9a, 0x47, 0x9c, 0x1d, 0x09, 0x17, 0xeb, 0xdb, 0xf5, 0x6f, 0x98, 0x46, 0x56, 0x7c, 0xc2, 0xc2, 0x29, 0xf0, 0x4f, 0x80, 0xc9, 0x6f, 0xd7, 0x9d, 0x06, 0xec, 0xc3, 0xee, 0x4c, 0x13, + 0xf9, 0x86, 0xc2, 0x98, 0xf8, 0x4d, 0x88, 0x5c, 0x85, 0x74, 0x6f, 0xab, 0x8f, 0xd6, 0xb8, 0x04, 0x25, 0x40, 0xea, 0x95, 0x1a, 0x4d, 0x83, 0x71, 0x1b, 0x3a, 0xc2, 0xa3, 0xf4, 0xe4, 0xe2, 0x0e, + 0xe5, 0x71, 0x07, 0xb8, 0xe5, 0x8b, 0x4c, 0x74, 0x75, 0x73, 0x8f, 0xfe, 0x52, 0x1c, 0x9b, 0x34, 0xce, 0xda, 0x27, 0x82, 0x0c, 0xe7, 0xc1, 0x1c, 0x18, 0x50, 0xb2, 0x3c, 0x3f, 0x9d, 0x46, 0x0a, + 0xd6, 0x70, 0xca, 0x9c, 0xde, 0x0d, 0x97, 0x81, 0x6a, 0x72, 0x68, 0x99, 0xde, 0x15, 0xa2, 0x17, 0xcb, 0xd1, 0x3a, 0x08, 0xcc, 0x4e, 0xc2, 0xcd, 0xf1, 0x16, 0xd1, 0x38, 0xab, 0x92, 0xfa, 0x0c, + 0x4a, 0x68, 0x4d, 0xa8, 0xef, 0x82, 0x83, 0x80, 0x66, 0xca, 0xfc, 0xe1, 0x10, 0xf8, 0xf1, 0xad, 0xcc, 0x58, 0x1f, 0x8b, 0x57, 0xf9, 0x05, 0x36, 0x53, 0xf4, 0x85, 0xdf, 0xa0, 0xf1, 0x3d, 0x17, + 0xd4, 0xdc, 0xd8, 0x7f, 0x6c, 0x94, 0x98, 0x54, 0x8c, 0xc2, 0x70, 0x4e, 0x89, 0x6a, 0x87, 0x88, 0x33, 0x66, 0x07, 0x41, 0x6b, 0xb1, 0x11, 0xa3, 0x12, 0x1c, 0x64, 0xcf, 0xf3, 0x3b, 0xed, 0x2c, + 0x3b, 0xf1, 0xa8, 0x7c, 0x1f, 0xcf, 0x05, 0x94, 0x3c, 0xc2, 0x87, 0x55, 0xac, 0x00, 0x81, 0x16, 0x6d, 0xdf, 0x8a, 0x10, 0x70, 0x61, 0xbb, 0xbf, 0x84, 0x8c, 0x42, 0x16, 0x3a, 0x07, 0x12, 0x09, + 0x54, 0x1d, 0xd7, 0x0d, 0x33, 0x2e, 0x3a, 0xc2, 0x66, 0x91, 0xc9, 0x2f, 0x4d, 0x46, 0x8f, 0x96, 0x53, 0x48, 0x43, 0xc1, 0x80, 0x86, 0xc7, 0x49, 0xee, 0x63, 0x30, 0xd1, 0x0c, 0x31, 0x0b, 0x25, + 0x37, 0x2e, 0xc8, 0xd1, 0xc8, 0x87, 0x18, 0x6f, 0x4c, 0x45, 0x60, 0xd4, 0x96, 0x28, 0xe0, 0x88, 0xc3, 0x46, 0xe5, 0xee, 0xa3, 0x03, 0x5a, 0x09, 0xad, 0xf7, 0x52, 0x98, 0xb3, 0x93, 0xb5, 0x08, + }; + + unsigned char round_constants[] = { + 0x34, 0x56, 0x08, 0x8b, 0xeb, 0x41, 0x28, 0x23, 0x90, 0x61, 0x4e, 0xc3, 0x3d, 0x86, 0x57, 0xcf, 0xc9, 0xfb, 0xb6, 0x3a, 0x0b, 0x18, 0x52, 0x4e, 0x9c, 0xaf, 0xc4, 0x15, 0x1f, 0x62, 0x43, 0x0f, + 0x41, 0xed, 0x14, 0x8b, 0x6f, 0x14, 0xb5, 0x0b, 0xd7, 0xa4, 0xa7, 0x2f, 0x65, 0x9a, 0x5c, 0x13, 0x3b, 0x1d, 0x4d, 0x5a, 0xd5, 0xe1, 0x89, 0x78, 0x38, 0xe5, 0x07, 0x49, 0xe5, 0xba, 0x68, 0x16, + 0x42, 0x76, 0x48, 0x00, 0x69, 0xa5, 0x49, 0x2a, 0xcf, 0xd6, 0x24, 0xcd, 0x73, 0x96, 0x10, 0x3a, 0x89, 0x6f, 0xa8, 0x3a, 0xb4, 0x5f, 0x14, 0xec, 0xb3, 0x09, 0x68, 0xf4, 0xff, 0xad, 0x87, 0x0a, + 0x0d, 0xc8, 0x28, 0x96, 0x40, 0x5e, 0x4b, 0x1c, 0xc5, 0xfb, 0x62, 0x74, 0x5d, 0x1b, 0xed, 0x82, 0xc3, 0x82, 0xdf, 0xf6, 0x81, 0x11, 0x2b, 0x0c, 0x67, 0x66, 0xab, 0x0a, 0x94, 0xde, 0x9f, 0x1e, + 0xb1, 0x01, 0xe4, 0x74, 0x6e, 0x5d, 0x10, 0x39, 0xac, 0x1e, 0x7e, 0xa2, 0x37, 0x57, 0x13, 0x7d, 0xc1, 0x0e, 0x5e, 0xc9, 0x74, 0x45, 0xd8, 0xf4, 0x7f, 0x57, 0x57, 0xbc, 0xe9, 0x1f, 0x36, 0x29, + 0x8b, 0x48, 0x9f, 0x57, 0x25, 0x6d, 0x10, 0x42, 0xef, 0xa6, 0xb8, 0xd1, 0x5b, 0x85, 0xe8, 0x3e, 0x66, 0x31, 0x11, 0x1e, 0xb3, 0x9c, 0x1c, 0x7c, 0x33, 0x00, 0x07, 0xb5, 0x79, 0xde, 0x59, 0x02, + 0x79, 0x89, 0x32, 0xdb, 0xa5, 0x91, 0xb8, 0x85, 0x54, 0x30, 0x0a, 0x4a, 0xab, 0x1a, 0x1f, 0x00, 0x70, 0x81, 0x20, 0x8d, 0x78, 0x57, 0x59, 0x72, 0xe3, 0x5c, 0x46, 0xc9, 0x23, 0x59, 0x6f, 0x0f, + 0xf1, 0xbb, 0x0b, 0xa8, 0xc9, 0x4f, 0x2c, 0x3b, 0x5a, 0xb5, 0x91, 0xa5, 0x59, 0xec, 0x32, 0x8b, 0x89, 0x27, 0x3f, 0x24, 0x61, 0x3c, 0xec, 0xe8, 0x1a, 0x50, 0xfd, 0x34, 0xd9, 0xa6, 0xaa, 0x02, + 0xc9, 0xf9, 0xe0, 0xfc, 0x1d, 0x53, 0x60, 0x09, 0xd7, 0x1b, 0xef, 0x60, 0xc5, 0xf7, 0xc9, 0x2c, 0x57, 0x20, 0x9a, 0xa0, 0x95, 0x50, 0x23, 0x7c, 0xb3, 0x76, 0x96, 0xd0, 0x65, 0x56, 0x27, 0x1f, + 0x09, 0xc6, 0x4d, 0xde, 0x6f, 0x3d, 0xf0, 0xb7, 0xc4, 0x95, 0x95, 0x48, 0x9b, 0xfe, 0xa6, 0x6c, 0xf6, 0x49, 0x75, 0xe7, 0x0f, 0xe6, 0x2f, 0x35, 0x30, 0x6f, 0x74, 0xe4, 0x54, 0x6d, 0x37, 0x0a, + 0xd1, 0xac, 0x19, 0x63, 0x4a, 0xcc, 0xf3, 0x82, 0xcb, 0xfb, 0x7a, 0x84, 0x7c, 0x0c, 0xb2, 0x15, 0x63, 0x95, 0x79, 0xaf, 0x54, 0xa8, 0xf6, 0x06, 0x6b, 0x07, 0xed, 0xa9, 0x9b, 0xb9, 0x9f, 0x0f, + 0x90, 0x5a, 0x28, 0xba, 0xad, 0xd4, 0x25, 0x2a, 0xa8, 0xfe, 0x1e, 0xaf, 0xa3, 0x40, 0xbf, 0xca, 0x8a, 0xf8, 0x78, 0xf6, 0x36, 0xcb, 0x74, 0x39, 0xc2, 0x2d, 0x20, 0x64, 0xf7, 0xfd, 0x47, 0x26, + 0x60, 0xaa, 0xa3, 0x7c, 0x1f, 0x80, 0xa3, 0x6d, 0xd4, 0x80, 0xf2, 0xbd, 0xeb, 0x0c, 0x5a, 0xc3, 0x62, 0x4d, 0xa5, 0xe5, 0x17, 0xd8, 0x29, 0x1b, 0x9e, 0xa2, 0x78, 0xaa, 0x24, 0x40, 0x3d, 0x16, + 0x82, 0xf1, 0x3c, 0x22, 0x46, 0x09, 0x32, 0x6c, 0xba, 0x8d, 0x9d, 0xb0, 0xe4, 0x74, 0xd9, 0x43, 0xbf, 0x3e, 0x2d, 0x9a, 0x89, 0xdc, 0x4c, 0x16, 0x79, 0xe4, 0xa4, 0xe0, 0xe8, 0x29, 0xd1, 0x18, + 0x47, 0x7b, 0x89, 0xd2, 0xee, 0xdf, 0xa1, 0x17, 0x67, 0x8e, 0xb9, 0xd5, 0xb7, 0x7e, 0x90, 0xfe, 0xb6, 0xb9, 0xf0, 0x78, 0xfc, 0xe0, 0x10, 0xfb, 0x14, 0x5b, 0xfb, 0xc0, 0x0a, 0x49, 0xec, 0x23, + 0x35, 0x8a, 0x03, 0xf1, 0x5d, 0x52, 0x41, 0xea, 0x48, 0x98, 0x16, 0x00, 0xc8, 0xe9, 0xd9, 0x05, 0x39, 0xa3, 0x90, 0x36, 0x3a, 0x6c, 0x61, 0xf1, 0xb3, 0xd2, 0xce, 0xc1, 0xde, 0xb6, 0x8b, 0x03, + 0x5c, 0xe0, 0xec, 0x8a, 0x4f, 0xfe, 0x6b, 0xfd, 0xd7, 0xfa, 0x12, 0x39, 0x5f, 0xe6, 0xba, 0xad, 0x4c, 0x4e, 0x9d, 0x46, 0x17, 0x80, 0x53, 0x5b, 0xda, 0xa8, 0x78, 0x34, 0xec, 0x40, 0xfa, 0x0e, + 0x20, 0xa0, 0x52, 0x46, 0xc8, 0x0c, 0x71, 0xee, 0xf0, 0xfa, 0xa8, 0xa5, 0x53, 0x1a, 0x1d, 0xb3, 0x72, 0x88, 0xb5, 0x8a, 0x5e, 0x69, 0xb8, 0x6a, 0x99, 0xf2, 0xc6, 0x24, 0xd2, 0x20, 0xee, 0x07, + 0x4a, 0xfe, 0x17, 0xfa, 0xc4, 0x37, 0x33, 0x50, 0x53, 0x5e, 0xbc, 0x66, 0x3c, 0x45, 0x04, 0x51, 0x02, 0x27, 0x23, 0x94, 0x49, 0xeb, 0xc3, 0xca, 0xed, 0xa1, 0xf6, 0x85, 0xde, 0xf3, 0x96, 0x12, + 0x30, 0x49, 0xcd, 0x14, 0x47, 0x9b, 0xd3, 0xb6, 0x7a, 0xcb, 0xc5, 0xae, 0xe6, 0x06, 0xdb, 0xc5, 0x1a, 0x10, 0xf3, 0x1d, 0xcd, 0xa7, 0xa3, 0x76, 0x70, 0x54, 0x9d, 0xbd, 0xa8, 0x0f, 0x9f, 0x0b, + 0x05, 0x3e, 0xa5, 0xdc, 0x73, 0x2f, 0x91, 0xe9, 0xcf, 0x05, 0xd9, 0x6a, 0x7e, 0x50, 0xd7, 0x14, 0x4f, 0x01, 0xcd, 0xed, 0x76, 0x37, 0x68, 0xfd, 0x87, 0x3b, 0x07, 0xee, 0x33, 0x77, 0x53, 0x03, + 0xa2, 0xa8, 0x22, 0xe1, 0x08, 0xc3, 0x2b, 0x04, 0x45, 0x0b, 0x7a, 0xf0, 0xd4, 0xd5, 0x70, 0xce, 0x17, 0x29, 0x77, 0x66, 0xfe, 0x81, 0x97, 0xfb, 0x19, 0xf9, 0xc4, 0xe0, 0x72, 0x02, 0x3f, 0x23, + 0xdf, 0xbd, 0x2e, 0xbb, 0x59, 0x8b, 0xa0, 0x6c, 0xcd, 0xfa, 0xca, 0x2d, 0x5f, 0x9b, 0xa5, 0x18, 0x03, 0x0d, 0xbc, 0xa6, 0x28, 0xb9, 0x3d, 0x1c, 0x56, 0xd9, 0xa5, 0x4b, 0xba, 0xb9, 0x59, 0x30, + 0x01, 0x5f, 0x28, 0x26, 0xeb, 0x80, 0xcd, 0x2a, 0xd4, 0x65, 0xaf, 0x71, 0xa6, 0x6b, 0x24, 0x80, 0xda, 0x73, 0xcc, 0xe6, 0xbb, 0x6a, 0x84, 0x51, 0x7c, 0xcc, 0x40, 0xc3, 0x19, 0x94, 0x5a, 0x2d, + 0xf8, 0x07, 0x10, 0x97, 0x84, 0x5c, 0x0f, 0xa9, 0xa3, 0x4b, 0xac, 0x1a, 0xe6, 0x2d, 0xb1, 0x16, 0x86, 0xbd, 0x90, 0x30, 0xfb, 0x6d, 0x30, 0x2c, 0xee, 0x42, 0x43, 0x15, 0xcf, 0xed, 0xcb, 0x28, + 0x78, 0x13, 0x9c, 0x29, 0x83, 0xe0, 0x47, 0x08, 0xc8, 0x60, 0xd4, 0xd2, 0xc6, 0xe2, 0xb4, 0x8b, 0x19, 0x89, 0x27, 0x3c, 0xc3, 0x80, 0xe9, 0xb5, 0x69, 0xa7, 0xaf, 0x17, 0x6a, 0xdf, 0x3b, 0x21, + 0x60, 0x91, 0x2c, 0xdf, 0xb1, 0x99, 0x13, 0xf2, 0x50, 0x31, 0x06, 0xe4, 0x98, 0xd5, 0x46, 0x5e, 0xc2, 0x1c, 0xce, 0xb4, 0x77, 0x8c, 0x26, 0xb9, 0xf1, 0x9c, 0x1f, 0x97, 0xcf, 0xc7, 0x56, 0x18, + 0xa3, 0x28, 0x6c, 0xf5, 0x7b, 0xbe, 0x48, 0xa5, 0xd3, 0xec, 0x1b, 0x76, 0x4b, 0x57, 0x1c, 0x0a, 0x3f, 0x3b, 0xba, 0xbc, 0x42, 0x52, 0x07, 0x7e, 0x32, 0x05, 0x3b, 0x34, 0x4c, 0x78, 0xa4, 0x16, + 0xcd, 0xc5, 0x87, 0xc8, 0xc2, 0x86, 0x21, 0xe6, 0x5b, 0x80, 0xd6, 0x30, 0x39, 0x9f, 0x31, 0x25, 0xaa, 0x02, 0x3e, 0xd5, 0xf4, 0xfa, 0xb5, 0x7e, 0x1b, 0xf7, 0x62, 0xeb, 0xba, 0x15, 0x70, 0x22, + 0x5e, 0x6c, 0x75, 0x13, 0xe1, 0xbd, 0xf0, 0x78, 0xbb, 0x17, 0x95, 0xa3, 0x6c, 0xf1, 0x0b, 0x24, 0x8e, 0xf0, 0xb1, 0x7e, 0x41, 0xbd, 0xa0, 0x48, 0x52, 0x7d, 0x74, 0x65, 0x5d, 0xbc, 0xba, 0x2e, + 0x17, 0xba, 0x0d, 0xfe, 0x44, 0x77, 0xc8, 0x6d, 0x40, 0x77, 0x29, 0x93, 0x01, 0xe8, 0xf7, 0x16, 0xeb, 0x38, 0x9c, 0xe6, 0x5a, 0xa3, 0xee, 0x25, 0x82, 0x29, 0x45, 0x31, 0x63, 0x4c, 0x29, 0x04, + 0x1e, 0xa7, 0x16, 0xe4, 0x43, 0xae, 0x2b, 0xe6, 0xc7, 0x37, 0xd6, 0x49, 0x9d, 0x77, 0xe4, 0x0e, 0x7d, 0x43, 0xfe, 0x35, 0xbd, 0xa9, 0x58, 0x9d, 0x54, 0x74, 0xf4, 0xb2, 0x4c, 0xfd, 0xa7, 0x20, + 0xa4, 0x8c, 0x27, 0x19, 0xf5, 0x67, 0x4c, 0x47, 0xaf, 0xab, 0x56, 0x2a, 0x6b, 0x5e, 0x48, 0xbc, 0x37, 0xfa, 0x9f, 0xd4, 0x11, 0xee, 0x54, 0x00, 0xea, 0x4f, 0x9d, 0xf3, 0x64, 0xc2, 0x07, 0x24, + 0x6f, 0xc7, 0x8d, 0xae, 0x73, 0x4a, 0x6c, 0x85, 0x90, 0xd2, 0x08, 0x01, 0xaa, 0x05, 0xd0, 0x62, 0xf5, 0x12, 0xb1, 0xf7, 0xc5, 0x68, 0x68, 0x88, 0x97, 0xe5, 0x7f, 0xd6, 0x90, 0xa5, 0xd6, 0x26, + 0x90, 0x9c, 0x4f, 0x84, 0x43, 0xbe, 0x90, 0x19, 0x8b, 0x61, 0x64, 0x93, 0xb2, 0xe0, 0xe8, 0x14, 0xc5, 0x0e, 0x47, 0x45, 0xac, 0x6d, 0xcd, 0x60, 0xac, 0xf7, 0xf3, 0x4f, 0x14, 0xe0, 0x88, 0x05, + 0xbf, 0x5c, 0x88, 0xdc, 0x7a, 0x8a, 0x98, 0xea, 0x34, 0xd2, 0xc9, 0x97, 0xa9, 0xf2, 0x82, 0xbf, 0xa6, 0x17, 0x79, 0xec, 0x72, 0x8b, 0xd6, 0x81, 0xb9, 0x34, 0xd0, 0x17, 0x88, 0xa2, 0x55, 0x16, + 0x7a, 0x43, 0x4c, 0x28, 0x21, 0x37, 0x7f, 0x37, 0x0a, 0xfc, 0xf7, 0x1e, 0x58, 0xdb, 0xbd, 0x59, 0xa6, 0x3a, 0xd9, 0xc7, 0xf9, 0xff, 0xf9, 0xd2, 0xd5, 0x9b, 0x75, 0x0b, 0x3b, 0xc6, 0x4d, 0x19, + 0x59, 0xb2, 0x76, 0xa9, 0x99, 0xee, 0xa4, 0x35, 0xdb, 0x0a, 0xe3, 0xe6, 0x74, 0x95, 0x7d, 0xbb, 0x87, 0xf4, 0x4c, 0xa3, 0xe8, 0x48, 0xda, 0xba, 0x89, 0x5f, 0x16, 0xbf, 0x66, 0x6e, 0xf6, 0x27, + 0xdc, 0x84, 0xb5, 0x17, 0xaa, 0x27, 0xe9, 0x74, 0x35, 0x2a, 0xdc, 0xa9, 0x9d, 0xbb, 0x29, 0x60, 0xbd, 0x31, 0xbe, 0x8a, 0xbe, 0x6e, 0x56, 0xd8, 0x3f, 0x12, 0xcd, 0x68, 0x2b, 0x5d, 0xc5, 0x08, + 0x31, 0xd6, 0x4d, 0x1c, 0x11, 0x5c, 0x23, 0xd3, 0x30, 0xc8, 0xe5, 0x8e, 0xed, 0x2d, 0x06, 0xd0, 0xc7, 0xf8, 0x37, 0x69, 0x05, 0xf1, 0xde, 0x5d, 0xee, 0xc1, 0x8b, 0x6a, 0x0c, 0xc6, 0xdd, 0x0b, + 0x4f, 0x1f, 0x80, 0xd6, 0x1c, 0x1c, 0x53, 0x48, 0x82, 0x1c, 0x10, 0x85, 0x04, 0xe2, 0xa4, 0x94, 0x72, 0xb4, 0xc4, 0x76, 0x69, 0xea, 0xc4, 0x7b, 0x11, 0x46, 0x46, 0x62, 0x5f, 0x51, 0xbd, 0x19, + 0x1c, 0x01, 0x77, 0x33, 0xaa, 0x31, 0x5f, 0x11, 0x36, 0xeb, 0x8c, 0x52, 0x3f, 0x86, 0x2f, 0x16, 0xac, 0xdb, 0x85, 0xa8, 0xef, 0x3a, 0x75, 0xe6, 0x4f, 0xd8, 0x67, 0x97, 0xf9, 0x8d, 0x6a, 0x21, + 0x99, 0xbd, 0x1e, 0xd3, 0xc2, 0x98, 0x95, 0x8a, 0xbf, 0xb8, 0xd7, 0x86, 0xf4, 0x81, 0x7f, 0x63, 0xa6, 0x7e, 0xd4, 0x28, 0x17, 0xa2, 0xea, 0x76, 0x15, 0x09, 0xcb, 0xe0, 0xa5, 0x51, 0x4f, 0x0d, + 0xa0, 0xf4, 0x0c, 0x5b, 0x1c, 0x70, 0x8e, 0xe3, 0xc8, 0x8f, 0xcf, 0x6f, 0x8e, 0xd8, 0x6e, 0x6e, 0x8d, 0xee, 0x2a, 0xae, 0x57, 0x82, 0xf9, 0x93, 0xda, 0xd0, 0xab, 0xae, 0x75, 0xdf, 0xa2, 0x1b, + 0x32, 0x00, 0x5f, 0xf3, 0x02, 0x01, 0x5f, 0x8e, 0x4e, 0xd7, 0x8d, 0x59, 0x89, 0xd0, 0xcb, 0xf6, 0xc1, 0x6a, 0xc4, 0xd3, 0x94, 0x23, 0xfe, 0xf4, 0xbb, 0xa2, 0x2f, 0x73, 0xf1, 0x3f, 0x3b, 0x2e, + 0x42, 0x57, 0x0f, 0xc4, 0x01, 0x28, 0xd6, 0xec, 0x14, 0x6e, 0x02, 0xdc, 0x27, 0xe7, 0x89, 0x0b, 0x0c, 0x47, 0xe8, 0x84, 0xa9, 0xfc, 0x66, 0x79, 0x40, 0x9f, 0x1c, 0x53, 0x3f, 0xf6, 0x8f, 0x2b, + 0x92, 0x5e, 0x9b, 0x62, 0xef, 0xe3, 0x03, 0x59, 0xaa, 0x16, 0x0d, 0xa6, 0x6c, 0x1e, 0xf6, 0x28, 0x2d, 0x08, 0xe4, 0x91, 0xfa, 0x35, 0x74, 0xf4, 0x4f, 0xa1, 0x85, 0xf7, 0xad, 0xac, 0xae, 0x26, + 0x7e, 0x79, 0x43, 0xdd, 0x22, 0x29, 0x9b, 0x8e, 0x4e, 0xd1, 0x9a, 0xe1, 0xd9, 0x2e, 0x1e, 0x05, 0xad, 0xa2, 0x9f, 0xf9, 0x03, 0x8a, 0x1c, 0x96, 0x20, 0xca, 0xdb, 0xb6, 0xda, 0x17, 0x70, 0x0a, + 0x9e, 0xd0, 0x79, 0x04, 0x2b, 0xf7, 0x2f, 0x18, 0xea, 0x97, 0x26, 0x24, 0x90, 0x61, 0xe4, 0x93, 0xaf, 0xa5, 0x4e, 0x01, 0x14, 0x5a, 0xce, 0xcd, 0x17, 0x76, 0x82, 0x63, 0xc9, 0x24, 0xcd, 0x2f, + 0xf9, 0xd5, 0x2a, 0xc2, 0x04, 0xe7, 0xa6, 0x49, 0x01, 0x4d, 0xc8, 0x30, 0x32, 0xe0, 0x01, 0x2d, 0x68, 0x9a, 0x7c, 0x23, 0x4b, 0x2c, 0xe2, 0x56, 0x6f, 0x0b, 0xc6, 0x06, 0xdf, 0x13, 0x84, 0x29, + 0x5d, 0x13, 0x80, 0x0c, 0xfd, 0xd0, 0x12, 0x5b, 0x46, 0x97, 0x55, 0xe5, 0x0b, 0xd0, 0x45, 0xd8, 0x10, 0x9d, 0x3c, 0x70, 0xf4, 0xc2, 0xa0, 0xa2, 0x52, 0x33, 0x3f, 0xbd, 0x25, 0x70, 0xd8, 0x23, + 0x7f, 0xd1, 0xc5, 0x3d, 0x75, 0xfd, 0x86, 0x5a, 0x99, 0x73, 0x2f, 0x36, 0x6b, 0x94, 0xec, 0xe6, 0x4f, 0x4a, 0x08, 0x6b, 0x75, 0x37, 0x45, 0x0a, 0x99, 0xf1, 0x70, 0xc1, 0x7d, 0x7b, 0x77, 0x25, + 0x38, 0xf5, 0xe6, 0x2f, 0x67, 0xa4, 0x9e, 0x44, 0xe2, 0xf3, 0xf5, 0xab, 0xac, 0x0e, 0x2c, 0x91, 0x02, 0x52, 0x5a, 0x64, 0x8f, 0x92, 0x3e, 0xbd, 0x4d, 0xdb, 0x71, 0xa7, 0x70, 0xec, 0x05, 0x1a, + 0x70, 0xda, 0xa2, 0x70, 0x4a, 0xc2, 0x02, 0x14, 0x44, 0x7f, 0xb4, 0x11, 0x73, 0xa0, 0xcf, 0x37, 0xae, 0x8d, 0x23, 0xb5, 0x99, 0xce, 0xbc, 0xd5, 0x84, 0xcd, 0x40, 0x0a, 0x3a, 0x38, 0x7d, 0x15, + 0xc8, 0x76, 0x57, 0x0a, 0x49, 0x8a, 0x05, 0x7f, 0x5e, 0xb3, 0x53, 0x93, 0xc9, 0x49, 0xd3, 0x1d, 0x6e, 0xe5, 0xce, 0x44, 0x4f, 0xdd, 0xac, 0xc0, 0x6e, 0x24, 0x95, 0x70, 0x7a, 0xce, 0xad, 0x23, + 0x38, 0xae, 0xa6, 0x68, 0x30, 0x61, 0xd9, 0x55, 0x76, 0xa0, 0x4c, 0x50, 0x20, 0xbb, 0x70, 0x65, 0x38, 0x74, 0x1c, 0x39, 0x25, 0xd9, 0xf4, 0xb3, 0x17, 0x29, 0xbe, 0x74, 0x8c, 0x8a, 0xa7, 0x28, + 0xa6, 0x99, 0xad, 0x81, 0x02, 0x5b, 0x8b, 0xaa, 0x71, 0x35, 0x81, 0xcc, 0x29, 0x1d, 0x2b, 0x29, 0xf2, 0x40, 0x11, 0xcb, 0xa6, 0x42, 0x6a, 0xdb, 0x79, 0xa0, 0x89, 0x7b, 0x10, 0xc6, 0x98, 0x29, + 0x15, 0xab, 0xae, 0x33, 0x6e, 0x53, 0x4a, 0xf9, 0x6a, 0x97, 0xbd, 0x01, 0x38, 0x69, 0xf7, 0x95, 0x5d, 0x9d, 0xe6, 0xc3, 0xc5, 0x0b, 0x50, 0x2d, 0x36, 0x35, 0xdc, 0x14, 0xc7, 0x17, 0x64, 0x1d, + 0xbb, 0xd2, 0xd8, 0xc2, 0x79, 0x34, 0xed, 0x0b, 0x1d, 0x1b, 0xa3, 0x3c, 0x65, 0xa4, 0xde, 0xed, 0x51, 0x03, 0x06, 0xd3, 0x48, 0x65, 0x93, 0x26, 0x94, 0x60, 0xbf, 0xf0, 0xfc, 0xd2, 0xb5, 0x0c, + 0xb7, 0x27, 0x26, 0x5c, 0xe0, 0x34, 0xae, 0x83, 0x17, 0x6b, 0xd4, 0x1a, 0x3e, 0xda, 0x46, 0x00, 0x0c, 0xad, 0x1b, 0x94, 0x62, 0x85, 0x9e, 0xa8, 0xec, 0x1a, 0xde, 0x2b, 0x55, 0x72, 0xa7, 0x05, + 0xe8, 0xcb, 0xc6, 0xc8, 0x05, 0x9e, 0xe1, 0xa2, 0xbc, 0x36, 0x27, 0xbe, 0xc4, 0x21, 0x67, 0xb9, 0xbd, 0xf2, 0xb2, 0xed, 0x99, 0x6f, 0xd2, 0x75, 0x42, 0xec, 0xdc, 0xc4, 0x3b, 0x2f, 0x2e, 0x22, + 0x90, 0xa2, 0x5b, 0xd8, 0xc6, 0x8d, 0x40, 0xce, 0x0c, 0x75, 0x61, 0xb1, 0x4a, 0x6c, 0xac, 0xc7, 0xf7, 0x36, 0x5f, 0x4d, 0xa8, 0x22, 0x6d, 0x48, 0xae, 0xd4, 0x0e, 0x0a, 0x6e, 0x3e, 0x69, 0x01, + 0xc1, 0x13, 0x19, 0x09, 0xda, 0x7a, 0xe3, 0xe0, 0xd5, 0x85, 0x35, 0x71, 0x9b, 0x74, 0xc4, 0x37, 0xeb, 0x16, 0xf6, 0x5e, 0xc0, 0x2f, 0xc4, 0x58, 0xe1, 0x51, 0x73, 0x59, 0x8a, 0x27, 0xd7, 0x2d, + 0x59, 0x7c, 0x4e, 0xa4, 0xd1, 0x5a, 0x62, 0x6e, 0x1c, 0xbd, 0x2d, 0x63, 0xe6, 0xcd, 0xad, 0x81, 0xab, 0xf9, 0xd9, 0xaf, 0x05, 0x5a, 0xe1, 0xc5, 0xdb, 0x0a, 0xfe, 0xd9, 0xaa, 0x7b, 0x8a, 0x13, + 0x06, 0x5f, 0x29, 0x12, 0x1e, 0x1b, 0x0f, 0x19, 0x56, 0x99, 0x20, 0x23, 0x27, 0x44, 0x59, 0x8e, 0x5f, 0xf6, 0xf1, 0x62, 0xcb, 0x26, 0x31, 0xaf, 0x16, 0x49, 0xbd, 0xc2, 0x34, 0x93, 0x44, 0x27, + 0x97, 0x97, 0x4f, 0xfc, 0xfb, 0xe8, 0x7a, 0x35, 0xc2, 0x9c, 0xa9, 0x54, 0x6c, 0xc6, 0x43, 0xf5, 0xd5, 0x0d, 0x2e, 0x84, 0xf0, 0x0f, 0x86, 0xc7, 0xd7, 0xdd, 0x10, 0xf0, 0x05, 0x5c, 0x2d, 0x08, + 0xd4, 0x9c, 0x92, 0x98, 0x29, 0x78, 0xad, 0xb2, 0xbb, 0x34, 0x87, 0x12, 0x2b, 0x7a, 0xbc, 0x9b, 0x01, 0x75, 0xf7, 0xc8, 0x4e, 0x22, 0x46, 0xf7, 0x6e, 0x85, 0xbc, 0x93, 0x58, 0xd8, 0x58, 0x0e, + 0x58, 0x7b, 0xaf, 0x14, 0xc9, 0x14, 0x84, 0xc3, 0x52, 0x47, 0x9f, 0xa3, 0xef, 0x13, 0x4f, 0x06, 0xec, 0x0e, 0x1d, 0xa9, 0xd8, 0x7b, 0x5e, 0xfc, 0xfe, 0xcc, 0x2f, 0x1f, 0x56, 0x15, 0xe6, 0x19, + 0x9d, 0xb4, 0x90, 0x24, 0x91, 0xdc, 0xfa, 0x97, 0xfd, 0x3d, 0x41, 0x52, 0xde, 0xfa, 0xa9, 0x0b, 0x58, 0x11, 0x72, 0xed, 0xe0, 0xcb, 0x14, 0x4f, 0x7a, 0x5e, 0xf2, 0xcf, 0x9d, 0x07, 0xb0, 0x06, + 0xd0, 0x70, 0xa5, 0xc9, 0xc5, 0x8d, 0x93, 0xeb, 0xf0, 0xd5, 0x2e, 0x6b, 0x2a, 0xb1, 0x90, 0x81, 0x6d, 0xbd, 0x7e, 0xd4, 0xe9, 0x5f, 0x00, 0xb3, 0x6f, 0x43, 0x63, 0x38, 0x6c, 0x16, 0xad, 0x1c, + 0x87, 0xbc, 0x35, 0x08, 0x41, 0x3a, 0x99, 0x16, 0xbb, 0x66, 0x92, 0x87, 0x43, 0x75, 0x6b, 0xd5, 0x6b, 0x24, 0x05, 0xe4, 0xc5, 0xa7, 0x7c, 0xc8, 0x7e, 0x4b, 0xf9, 0x89, 0x8d, 0x3c, 0x37, 0x00, + 0x53, 0x20, 0xbe, 0xe0, 0x61, 0x25, 0x16, 0xe1, 0x51, 0xc4, 0x9b, 0x1c, 0xab, 0xc3, 0xc8, 0x3d, 0x5a, 0x34, 0x80, 0x35, 0x02, 0xc5, 0xdf, 0x96, 0x76, 0x97, 0x04, 0xb1, 0x85, 0xe6, 0x5c, 0x0b, + 0x53, 0xb9, 0x25, 0x61, 0x94, 0x93, 0x55, 0xd6, 0xd6, 0xcd, 0x1b, 0x80, 0xff, 0x85, 0xda, 0xfc, 0x33, 0xc9, 0x14, 0x30, 0x03, 0xaa, 0x5e, 0xeb, 0xbe, 0x04, 0x10, 0xcf, 0xfd, 0xa7, 0x40, 0x29, + 0xfa, 0xa3, 0x40, 0x28, 0x8b, 0xe0, 0x3e, 0xbc, 0x38, 0xc9, 0x65, 0x8d, 0xd2, 0x90, 0xd3, 0xe4, 0x9a, 0xff, 0x02, 0x46, 0xee, 0xb7, 0xaf, 0xa8, 0xd9, 0xec, 0x92, 0xd0, 0x50, 0x4b, 0x19, 0x0c, + 0xf8, 0x21, 0xd5, 0x59, 0x11, 0xe5, 0x5d, 0xde, 0x69, 0x43, 0x5a, 0x55, 0x36, 0x91, 0xc6, 0xf2, 0x11, 0xae, 0x69, 0x28, 0xa6, 0x21, 0x56, 0xb2, 0x8b, 0xca, 0x00, 0x9b, 0x76, 0xbb, 0xae, 0x0c, + 0xed, 0xf4, 0x67, 0xb0, 0x79, 0xea, 0x42, 0x7f, 0xc3, 0x6d, 0xe4, 0xf3, 0x95, 0x5a, 0x73, 0x34, 0x8d, 0x72, 0x2e, 0x96, 0x1c, 0xc3, 0xd4, 0xe5, 0x5e, 0x72, 0xe1, 0x0c, 0x15, 0xf5, 0xf3, 0x0c, + 0xb7, 0xb9, 0x71, 0x11, 0x45, 0xf3, 0xab, 0x61, 0xae, 0xd3, 0x21, 0xf1, 0x42, 0x63, 0xbb, 0x91, 0x03, 0x5b, 0xc5, 0xe6, 0x9e, 0xa5, 0x34, 0xe5, 0xd7, 0x00, 0x8e, 0x69, 0x7f, 0x4a, 0xf9, 0x2e, + 0xff, 0xf2, 0x6a, 0xf8, 0xe2, 0xe3, 0xd5, 0xa2, 0x4e, 0x2a, 0xeb, 0x9e, 0xb0, 0x46, 0x78, 0x21, 0x04, 0x00, 0x3d, 0x1b, 0x13, 0xf1, 0x78, 0x51, 0x30, 0xbe, 0xd3, 0xf3, 0xa8, 0xce, 0x96, 0x25, + 0x76, 0x90, 0x62, 0xb8, 0x25, 0x2e, 0x4b, 0xfc, 0x49, 0xea, 0x8f, 0xe2, 0xb7, 0xb1, 0x7e, 0xce, 0xab, 0x73, 0x2d, 0x75, 0xcd, 0x28, 0x1a, 0x58, 0x40, 0x00, 0x4c, 0x3a, 0x26, 0x09, 0xfd, 0x0f, + 0x39, 0xd8, 0x6c, 0x48, 0xa5, 0xa1, 0x98, 0xdc, 0xac, 0x72, 0x65, 0x65, 0x6a, 0x78, 0x96, 0xb4, 0xb9, 0x60, 0xea, 0x15, 0x5c, 0x72, 0x36, 0xa4, 0x92, 0x34, 0xd8, 0xfc, 0x51, 0xb8, 0x7a, 0x0b, + 0x12, 0x7d, 0xc4, 0x99, 0xce, 0x3f, 0x84, 0x11, 0x4e, 0xac, 0x48, 0xd2, 0xfe, 0x2d, 0x06, 0xef, 0xc6, 0x8e, 0xce, 0x45, 0x09, 0xac, 0x72, 0x2c, 0x8c, 0x0c, 0x00, 0xb9, 0xca, 0xe2, 0x57, 0x00, + 0xa7, 0xce, 0x20, 0xc8, 0x4f, 0xc9, 0x7e, 0xb4, 0xdd, 0x3a, 0x93, 0x15, 0xfa, 0xaf, 0x93, 0x46, 0xfe, 0xc0, 0x9d, 0x8c, 0x72, 0xbb, 0xae, 0x38, 0xa6, 0x4b, 0xd0, 0x87, 0xb7, 0x95, 0xd7, 0x20, + 0x61, 0xa4, 0x20, 0x6d, 0xd4, 0x39, 0x27, 0x44, 0x1d, 0x4c, 0x93, 0x69, 0x4c, 0x43, 0xf3, 0xbf, 0xe3, 0x08, 0xc5, 0xcc, 0x89, 0x98, 0xe3, 0x96, 0x5c, 0x5f, 0xbd, 0x60, 0xec, 0x5c, 0xa3, 0x0f, + 0x57, 0xea, 0x97, 0xaf, 0x0a, 0xf3, 0xff, 0xe9, 0xf3, 0x2f, 0x38, 0xdd, 0x05, 0x18, 0xd2, 0x31, 0xc3, 0x22, 0x14, 0x5a, 0x1c, 0x01, 0xe7, 0xeb, 0x50, 0x9c, 0xa0, 0x78, 0xed, 0xb5, 0x8a, 0x19, + 0x74, 0x4b, 0x88, 0x82, 0xa0, 0x4f, 0xae, 0x5f, 0x7a, 0xa6, 0xa4, 0xf6, 0xc8, 0x63, 0x6d, 0xf9, 0xba, 0x8c, 0xe9, 0x5f, 0x12, 0x5d, 0x18, 0x1b, 0xa6, 0xb7, 0xac, 0x07, 0xff, 0xcd, 0x79, 0x24, + 0x3c, 0x6b, 0x4e, 0xc7, 0xda, 0x37, 0x5c, 0x02, 0x19, 0xa5, 0x4c, 0xe3, 0x51, 0x5f, 0x84, 0x13, 0x5b, 0x21, 0x8b, 0xce, 0x7f, 0xb9, 0xf6, 0x05, 0x55, 0x6b, 0xa3, 0x73, 0xb2, 0xff, 0x1d, 0x23, + 0x26, 0xe2, 0x55, 0x3e, 0xf9, 0x06, 0xbb, 0x07, 0x84, 0x3f, 0xbf, 0x1d, 0x35, 0x43, 0xf9, 0x5f, 0xe7, 0x1d, 0xc7, 0xf8, 0x96, 0xa3, 0x6c, 0x60, 0xef, 0xc2, 0xf8, 0xbf, 0x84, 0x65, 0x4e, 0x0b, + 0x62, 0xd9, 0x19, 0xe6, 0x16, 0x03, 0xb4, 0x42, 0x6c, 0x86, 0xc0, 0xc6, 0xdc, 0x07, 0x41, 0x73, 0x30, 0x0e, 0x30, 0xe1, 0x88, 0xc0, 0xd8, 0xc6, 0x8c, 0x68, 0x19, 0x81, 0x89, 0x89, 0x11, 0x01, + 0x4d, 0x1d, 0x28, 0x42, 0x0f, 0xe8, 0x1e, 0x00, 0xbd, 0xdb, 0x14, 0xff, 0xac, 0x3e, 0x99, 0x31, 0x4e, 0xbb, 0x1e, 0xa8, 0xba, 0xaa, 0xbd, 0x09, 0x7d, 0x5c, 0x20, 0x67, 0x93, 0x97, 0xcd, 0x17, + 0xd9, 0xd7, 0xf2, 0x90, 0x66, 0x1e, 0x7c, 0x98, 0x52, 0xde, 0x6e, 0xe7, 0x11, 0x9c, 0xdd, 0x9f, 0x08, 0x3c, 0xfd, 0x1c, 0x62, 0x2d, 0x52, 0xbc, 0x82, 0x82, 0x17, 0x85, 0x26, 0xa3, 0xf7, 0x00, + 0xfa, 0xfe, 0x77, 0xcb, 0xf1, 0xdd, 0xe7, 0xee, 0xa7, 0x08, 0x6d, 0x46, 0x01, 0x2e, 0xda, 0x8a, 0xb1, 0x60, 0x18, 0xe6, 0xe0, 0xad, 0x70, 0x62, 0xc7, 0x8d, 0xe2, 0x97, 0x0a, 0xc4, 0xf8, 0x04, + 0x9b, 0xbe, 0xbe, 0x1f, 0x80, 0x90, 0xbe, 0x73, 0x39, 0xdf, 0x21, 0x87, 0xe3, 0x1d, 0xf1, 0x25, 0xf3, 0xda, 0x74, 0x63, 0x27, 0x41, 0x5c, 0x58, 0xcd, 0xb5, 0x41, 0x86, 0x1e, 0xca, 0x85, 0x1a, + 0xf5, 0x48, 0x9b, 0x12, 0x7a, 0x1c, 0x75, 0x10, 0x16, 0x6f, 0x89, 0x99, 0xae, 0xd9, 0x97, 0xaf, 0xbb, 0xd9, 0xc2, 0xbe, 0x9a, 0x96, 0xa9, 0xc3, 0xfd, 0xe9, 0xca, 0x63, 0x7a, 0x4a, 0xa5, 0x18, + 0x30, 0x06, 0x04, 0x7a, 0x9c, 0xbe, 0x0b, 0x77, 0x85, 0xae, 0xf9, 0x32, 0x28, 0xc0, 0x25, 0x8a, 0x4e, 0xce, 0x31, 0x46, 0x24, 0x6a, 0x1f, 0x70, 0x9b, 0x92, 0x08, 0x15, 0xf8, 0xe5, 0x3e, 0x0e, + 0x19, 0xc1, 0xec, 0x55, 0x94, 0x84, 0x9f, 0xca, 0x22, 0xf2, 0x09, 0x85, 0x71, 0xec, 0x86, 0x45, 0x8c, 0xf9, 0x53, 0xdb, 0xda, 0x59, 0xc6, 0x46, 0xbb, 0x46, 0xab, 0x3d, 0x8f, 0x07, 0x09, 0x1f, + 0x66, 0xbe, 0x7f, 0xda, 0x4a, 0xaa, 0x40, 0xc5, 0x21, 0x86, 0x04, 0x67, 0x55, 0xbb, 0x11, 0x29, 0x55, 0x5e, 0x1f, 0x55, 0x0c, 0x33, 0xbf, 0xc5, 0xd3, 0x89, 0x86, 0x06, 0x38, 0xf1, 0x30, 0x2d, + 0xb1, 0x44, 0xac, 0x4a, 0x57, 0xea, 0x7d, 0xfc, 0x21, 0x24, 0x7a, 0xd8, 0xc5, 0x08, 0xd1, 0xaf, 0x3d, 0xc4, 0x09, 0xb5, 0xf7, 0x08, 0xe1, 0x69, 0x4d, 0xdf, 0x1a, 0x8f, 0xf7, 0x8a, 0x16, 0x09, + 0x98, 0x2c, 0xe8, 0xcf, 0x1a, 0xdb, 0x66, 0x5b, 0x02, 0x4f, 0x31, 0x32, 0xac, 0x40, 0x53, 0x0e, 0x92, 0xd6, 0xc6, 0x61, 0x49, 0x04, 0xda, 0xa2, 0xbb, 0x3f, 0xd0, 0xd8, 0x31, 0xa4, 0x19, 0x2f, + 0x07, 0x6c, 0x7a, 0xcc, 0x41, 0xc8, 0x30, 0x9c, 0xcf, 0xe3, 0x85, 0x1b, 0xcd, 0x24, 0x56, 0xa4, 0x6e, 0xa0, 0xd8, 0xde, 0xd1, 0x5e, 0x49, 0xa5, 0x95, 0x73, 0xa5, 0xd6, 0xc8, 0x7f, 0xa1, 0x04, + 0xb3, 0xc8, 0x11, 0x85, 0x66, 0x26, 0x9b, 0x0f, 0xba, 0x51, 0x42, 0xd0, 0x12, 0x15, 0x88, 0x87, 0x7b, 0x1c, 0x1e, 0xcb, 0xd8, 0x7c, 0x7a, 0x80, 0x9d, 0x38, 0x99, 0x4d, 0x3a, 0x50, 0x1b, 0x0b, + 0x6a, 0x6b, 0x10, 0x35, 0xdf, 0xc0, 0xfe, 0x85, 0x7c, 0xed, 0x06, 0x7e, 0xa9, 0x82, 0x80, 0x22, 0x69, 0xa9, 0x2f, 0xd4, 0x12, 0x0b, 0xa0, 0x44, 0xdc, 0xb0, 0x35, 0x4d, 0xf6, 0xde, 0x27, 0x1a, + 0xbc, 0xa5, 0x21, 0xf6, 0x4b, 0x13, 0x79, 0x05, 0x1e, 0x13, 0xbc, 0x2e, 0x04, 0x78, 0x49, 0xf3, 0x24, 0x2a, 0x3c, 0x6e, 0x17, 0xff, 0xae, 0x80, 0x7c, 0xac, 0x62, 0x5a, 0xb2, 0x59, 0xa3, 0x0d, + 0xe5, 0x68, 0x5f, 0xe4, 0x9a, 0xf7, 0xa9, 0xd4, 0x9b, 0xd8, 0x4c, 0x4c, 0x74, 0xa6, 0xb5, 0x19, 0x4e, 0x5e, 0xe9, 0x9f, 0x59, 0xf9, 0xd2, 0x1e, 0xce, 0x65, 0x13, 0xaf, 0x9d, 0xba, 0x87, 0x22, + 0x1b, 0x5b, 0xcd, 0xbe, 0x88, 0xb9, 0x42, 0xb5, 0x9c, 0xea, 0x50, 0xb2, 0x7e, 0xc8, 0x96, 0xff, 0x37, 0xd9, 0x70, 0x43, 0xf5, 0x26, 0x9a, 0x91, 0x70, 0x26, 0x86, 0x3d, 0x12, 0xa8, 0xd1, 0x21, + 0xa8, 0x48, 0x26, 0xaf, 0x91, 0x34, 0xc2, 0x65, 0x50, 0x84, 0xfd, 0x80, 0xc5, 0x05, 0x1f, 0x13, 0x5d, 0x76, 0xf8, 0x0b, 0xe7, 0x81, 0x8d, 0xb7, 0x86, 0x40, 0x12, 0x2b, 0x79, 0xd5, 0x3c, 0x16, + 0xcd, 0x04, 0x7e, 0x32, 0x84, 0x84, 0xe9, 0xf7, 0xbe, 0xf3, 0xce, 0x73, 0x17, 0xfc, 0x22, 0xe5, 0xa6, 0xfe, 0xd6, 0x91, 0x47, 0x76, 0x57, 0x1b, 0xe4, 0xe4, 0x38, 0x4d, 0x23, 0x41, 0x97, 0x09, + 0xcb, 0x21, 0x53, 0x5e, 0x6a, 0xce, 0x4f, 0xfe, 0x82, 0x5f, 0x5a, 0xed, 0x2b, 0x3f, 0x10, 0xe5, 0x2e, 0xc3, 0xc9, 0x03, 0xc3, 0x67, 0x44, 0xb4, 0xbc, 0x21, 0x9c, 0x8e, 0x6b, 0x1f, 0x1c, 0x0d, + 0x2d, 0x43, 0x14, 0x5c, 0x21, 0x3a, 0x43, 0x73, 0x55, 0x02, 0x9d, 0x1f, 0xfe, 0x01, 0x31, 0xa0, 0xea, 0x89, 0x6b, 0x5e, 0x6c, 0xf9, 0xfc, 0x97, 0x61, 0x79, 0xf8, 0x3f, 0x45, 0xe9, 0x46, 0x2b, + 0xe1, 0x8d, 0xa1, 0xbf, 0x6f, 0x61, 0xa3, 0x2f, 0x82, 0x3f, 0x7e, 0x09, 0x99, 0x6c, 0xf5, 0xa0, 0x98, 0x20, 0x4e, 0xe3, 0x5f, 0x2f, 0xd9, 0x1b, 0x9d, 0x04, 0xfd, 0xe1, 0xe2, 0x33, 0xfa, 0x08, + 0x5a, 0x9d, 0x68, 0xe7, 0xbb, 0xf0, 0xc0, 0xc5, 0x73, 0x9b, 0xd2, 0x85, 0xea, 0x10, 0xc7, 0xdd, 0x0e, 0xc4, 0x4f, 0x89, 0x9d, 0x3e, 0xbe, 0x4d, 0x21, 0xd6, 0xdf, 0x19, 0x67, 0xff, 0xc6, 0x06, + 0xeb, 0x2e, 0xe0, 0x3f, 0x4b, 0x38, 0x94, 0x45, 0xd7, 0x77, 0x42, 0x09, 0xcb, 0xfe, 0x86, 0xcf, 0xfa, 0xb8, 0x1a, 0xfd, 0x5a, 0x36, 0xb1, 0x80, 0x9e, 0x89, 0xdf, 0x13, 0x22, 0x64, 0xa5, 0x27, + 0x10, 0x75, 0xcb, 0xb1, 0x26, 0xf2, 0x2c, 0x8f, 0x85, 0x33, 0x0e, 0xda, 0x1f, 0xda, 0xce, 0xb1, 0x8a, 0xb9, 0xad, 0xed, 0xb2, 0xdb, 0x4a, 0x23, 0xac, 0x04, 0xbf, 0xcb, 0xaf, 0xc7, 0xf5, 0x21, + 0x15, 0xb8, 0xa4, 0xee, 0x74, 0x2b, 0x94, 0xd0, 0xc8, 0x4f, 0x01, 0x77, 0xf6, 0xe4, 0x76, 0xbc, 0x03, 0x1e, 0x86, 0x5a, 0x1c, 0x3b, 0x9d, 0xa3, 0x14, 0xce, 0x47, 0xfb, 0x28, 0x36, 0x17, 0x08, + 0xac, 0x46, 0x94, 0xcb, 0xdb, 0x0d, 0xa6, 0x0b, 0x69, 0x63, 0xea, 0x9c, 0xab, 0x50, 0x0f, 0x64, 0x61, 0x52, 0xdb, 0x7e, 0xc2, 0xc0, 0x15, 0xe4, 0x45, 0x4d, 0xb4, 0x47, 0x86, 0x5f, 0x57, 0x12, + 0xc3, 0x69, 0x1e, 0x7d, 0x74, 0x5f, 0xc9, 0x62, 0xd2, 0x09, 0xed, 0x5d, 0x31, 0xe6, 0x78, 0x3b, 0xda, 0xb3, 0xe0, 0xe4, 0xbd, 0xad, 0x2a, 0x50, 0xbd, 0x62, 0x22, 0x84, 0x1e, 0x07, 0x1f, 0x24, + 0xe8, 0xc1, 0xd7, 0xb0, 0xa1, 0x82, 0xe7, 0x40, 0xe8, 0xf0, 0x79, 0x2b, 0x54, 0x31, 0x97, 0x05, 0x5e, 0x1b, 0x07, 0x58, 0xaf, 0xaa, 0x8a, 0x09, 0xbb, 0x5b, 0x34, 0x61, 0x06, 0x65, 0x59, 0x02, + 0x4f, 0xe1, 0xe3, 0x23, 0x31, 0x38, 0x0e, 0x5b, 0x32, 0xf0, 0x86, 0xe0, 0x99, 0x51, 0xdf, 0x72, 0x3e, 0x51, 0xd9, 0x0e, 0x61, 0xfc, 0xc9, 0x98, 0xd7, 0x5a, 0x15, 0xbb, 0x58, 0xea, 0xe5, 0x10, + 0xb7, 0x9f, 0x5a, 0x01, 0xe4, 0x0f, 0x56, 0x76, 0x64, 0x55, 0xc9, 0xb5, 0xe1, 0x48, 0x8e, 0x11, 0xcf, 0x64, 0x02, 0x10, 0x55, 0x52, 0x86, 0x89, 0xed, 0x14, 0xf2, 0x40, 0x0c, 0x8f, 0xb2, 0x2c, + 0x53, 0x08, 0x2f, 0xd6, 0xbc, 0x84, 0x80, 0xd5, 0x96, 0x54, 0x62, 0x5a, 0xeb, 0xa7, 0x20, 0x35, 0xdd, 0xe2, 0xcd, 0xc9, 0xf7, 0xc1, 0xd1, 0x66, 0x87, 0xa1, 0x8e, 0x51, 0x45, 0x22, 0x8c, 0x2b, + 0x3a, 0x3c, 0xa0, 0xe6, 0x46, 0xc6, 0x58, 0x29, 0x2e, 0x2d, 0xf3, 0x27, 0xf0, 0xa3, 0x94, 0xfd, 0xb4, 0x79, 0xa9, 0xdc, 0x65, 0x9c, 0x76, 0x6c, 0x94, 0x29, 0x33, 0xce, 0xaa, 0x52, 0x0c, 0x21, + 0x1b, 0x4d, 0xff, 0xa1, 0xbc, 0x98, 0xff, 0xe5, 0xf4, 0xd6, 0x3e, 0x1b, 0xf4, 0x12, 0x8a, 0xaf, 0xdd, 0x86, 0x2d, 0xbf, 0x2b, 0xbf, 0x4e, 0xc8, 0xa3, 0x1b, 0xec, 0x55, 0x14, 0x7e, 0xcd, 0x2a, + 0x09, 0x85, 0x69, 0x31, 0xe1, 0x9d, 0x99, 0x6f, 0x14, 0xf5, 0xca, 0x71, 0xb8, 0xe9, 0x66, 0x51, 0x05, 0x8b, 0x1b, 0xe3, 0xaf, 0x6b, 0x4f, 0x46, 0xb8, 0x1e, 0xa8, 0x47, 0x4a, 0x81, 0x1a, 0x0b, + 0x40, 0x5d, 0xcc, 0xdd, 0xc7, 0x97, 0x2b, 0x32, 0x08, 0x13, 0x30, 0x07, 0x90, 0x2a, 0x2c, 0x3e, 0x64, 0x41, 0x52, 0x22, 0x2d, 0x2f, 0x38, 0x3f, 0xda, 0x4e, 0xa6, 0xd7, 0x01, 0x58, 0x10, 0x0c, + 0xa9, 0xaf, 0x98, 0xdf, 0xea, 0x26, 0x49, 0xfb, 0xad, 0x1d, 0xec, 0x68, 0xde, 0x26, 0x4e, 0x0a, 0x70, 0x86, 0xf3, 0x87, 0x3c, 0xae, 0xe8, 0x7a, 0xaf, 0x6d, 0x05, 0x76, 0x65, 0x5f, 0xaa, 0x26, + 0xf2, 0x09, 0x51, 0xe2, 0x1f, 0xe7, 0x91, 0x6e, 0xf6, 0x74, 0x92, 0xc4, 0x77, 0x9b, 0x2c, 0x91, 0x44, 0x3a, 0xf0, 0x97, 0x07, 0xcc, 0x94, 0xb4, 0x8f, 0x78, 0x71, 0xd5, 0x78, 0x0c, 0x4f, 0x1a, + 0x55, 0x51, 0xf7, 0xb8, 0x92, 0xb4, 0x39, 0x86, 0x4e, 0x5f, 0x6a, 0xa1, 0x27, 0xd3, 0xd1, 0xad, 0x66, 0x1d, 0x29, 0xa2, 0x69, 0x5a, 0xec, 0xa1, 0xd6, 0xa0, 0xf3, 0x45, 0x62, 0x5d, 0x4e, 0x13, + 0x24, 0x52, 0x8d, 0x25, 0x36, 0x5a, 0x38, 0x38, 0xe7, 0x09, 0xdf, 0xdf, 0x9b, 0x3b, 0xa1, 0xee, 0xaf, 0xbc, 0x57, 0x43, 0x1a, 0xa6, 0x96, 0x0e, 0x77, 0xdb, 0xfc, 0xf1, 0x9b, 0xff, 0xe6, 0x11, + 0xa2, 0x12, 0x3e, 0xa5, 0xb6, 0xb1, 0xe4, 0x63, 0x09, 0xb1, 0xd9, 0x0c, 0xc2, 0x41, 0x17, 0xbf, 0xbc, 0xde, 0x4d, 0x96, 0xed, 0x35, 0x23, 0x13, 0xfc, 0x98, 0x8c, 0x5e, 0x79, 0x03, 0x8b, 0x19, + 0x84, 0x2b, 0x8d, 0xbb, 0x77, 0xb9, 0xe9, 0xa9, 0xdf, 0xdf, 0x32, 0x72, 0x2e, 0xb6, 0x76, 0xff, 0xee, 0x27, 0xfd, 0x3f, 0xd8, 0x52, 0xc7, 0x07, 0xd1, 0xdd, 0x47, 0x2a, 0x92, 0xe6, 0xb4, 0x27, + 0x68, 0x26, 0xae, 0x6c, 0x96, 0x00, 0xeb, 0x08, 0xe9, 0x52, 0x72, 0x0f, 0x72, 0xb7, 0xbe, 0x66, 0x38, 0xdb, 0x64, 0xb1, 0xa2, 0xfb, 0x3c, 0xa1, 0xf0, 0xe2, 0x4c, 0x80, 0x78, 0x1c, 0xc9, 0x2e, + 0x53, 0x2d, 0xdf, 0xbc, 0x6d, 0xfb, 0xfe, 0x15, 0xa7, 0xe9, 0x27, 0xf7, 0x88, 0xee, 0x52, 0x7b, 0x66, 0x72, 0x53, 0x4e, 0x8d, 0xb3, 0x83, 0x6f, 0xb3, 0xd6, 0xf9, 0xbf, 0x9b, 0x22, 0x88, 0x24, + 0xed, 0xb1, 0x4e, 0xf3, 0xd1, 0xf7, 0xcd, 0x0d, 0x46, 0x77, 0x6d, 0x53, 0x01, 0x5e, 0xee, 0x93, 0x8e, 0xe1, 0x06, 0x95, 0xb1, 0x80, 0x57, 0xe0, 0x1f, 0xd8, 0x83, 0x2e, 0x6c, 0xde, 0xeb, 0x05, + 0x4d, 0xda, 0xc1, 0x8d, 0xea, 0x24, 0xda, 0x3b, 0x60, 0x8e, 0x18, 0xf2, 0x84, 0xf4, 0x7f, 0x97, 0xce, 0x22, 0xef, 0x9a, 0xe1, 0x2b, 0xc3, 0x7f, 0xb6, 0xe2, 0xc6, 0x5d, 0xcb, 0xa0, 0xd8, 0x1c, + 0x49, 0x0a, 0x05, 0x18, 0xe3, 0x8f, 0x66, 0x2c, 0x9f, 0x8c, 0xa5, 0x06, 0x37, 0x55, 0x47, 0x18, 0xa0, 0x1d, 0x3a, 0x75, 0x8e, 0xd7, 0x03, 0xfd, 0xcd, 0x9d, 0xa8, 0xa7, 0xe4, 0x35, 0x51, 0x08, + 0xf3, 0x8c, 0x0a, 0x0b, 0xc0, 0x83, 0x19, 0xcb, 0x66, 0x44, 0xa7, 0xf3, 0x21, 0xbb, 0x5e, 0x06, 0xc8, 0x7c, 0x84, 0x58, 0x6a, 0xe5, 0x26, 0x03, 0x81, 0x6c, 0x0a, 0x6d, 0x8e, 0xb8, 0x02, 0x17, + 0x00, 0x64, 0x07, 0xf3, 0xf4, 0x74, 0x01, 0x7b, 0x89, 0xa0, 0xc0, 0xff, 0x3e, 0x0d, 0x1a, 0xf0, 0x09, 0x2c, 0x3f, 0xca, 0x33, 0x6c, 0xb7, 0x3f, 0x37, 0xa0, 0x8a, 0xb6, 0xb2, 0xbc, 0x18, 0x22, + 0x82, 0x41, 0x02, 0xd6, 0x8c, 0x42, 0x01, 0x82, 0xc6, 0x0c, 0x80, 0x47, 0x70, 0xe9, 0x3b, 0x90, 0x04, 0xb6, 0x02, 0x0e, 0x6e, 0xec, 0xda, 0x94, 0xff, 0xdf, 0xdd, 0x64, 0xc9, 0xd3, 0xe1, 0x2e, + 0xda, 0x3b, 0x77, 0x0e, 0x45, 0x07, 0xd7, 0xf3, 0x81, 0x87, 0x11, 0x6e, 0x86, 0x66, 0xc0, 0xa5, 0xeb, 0x71, 0x16, 0xbd, 0x50, 0x33, 0x78, 0x1f, 0xe8, 0xa3, 0x57, 0x56, 0x75, 0xd8, 0x49, 0x01, + 0x83, 0x22, 0xbf, 0xb2, 0xda, 0x11, 0xa1, 0xa1, 0xb8, 0x0b, 0xac, 0xca, 0xe2, 0x1b, 0xa5, 0x65, 0x5f, 0xde, 0x46, 0x30, 0x44, 0x55, 0xb7, 0x83, 0xa6, 0xad, 0xeb, 0xbe, 0xac, 0x18, 0x38, 0x03, + 0x0e, 0x07, 0xc8, 0x2c, 0x24, 0x7c, 0x40, 0x37, 0x93, 0x79, 0xd8, 0x3d, 0xf7, 0x3b, 0x8b, 0x08, 0x9c, 0xad, 0xe7, 0xb2, 0x47, 0x13, 0x70, 0xd5, 0xb5, 0x2e, 0x6a, 0xf0, 0x1c, 0x3f, 0x24, 0x10, + 0x8f, 0x56, 0x42, 0xad, 0x3d, 0xc4, 0x1a, 0x1f, 0xea, 0xbb, 0x5f, 0x52, 0x88, 0x7b, 0x58, 0x72, 0x0b, 0x6e, 0x0e, 0xe3, 0xc6, 0x0b, 0xee, 0x88, 0x66, 0x35, 0x5c, 0x47, 0x3d, 0x14, 0xaa, 0x24, + 0xe4, 0xab, 0x0f, 0x1c, 0x1f, 0x47, 0xe7, 0x87, 0x81, 0x9b, 0xb1, 0xd0, 0x77, 0xba, 0x7d, 0xe7, 0xc6, 0xa3, 0xd2, 0xda, 0xbd, 0x00, 0x7b, 0xe3, 0x58, 0x33, 0xcf, 0x4d, 0xd6, 0x2c, 0x71, 0x04, + 0x18, 0x63, 0x75, 0x1c, 0x81, 0x31, 0xfe, 0x2e, 0xa7, 0x14, 0x00, 0xdb, 0x1c, 0x74, 0x8a, 0x07, 0xc7, 0x9f, 0x59, 0x97, 0xf2, 0xd8, 0x56, 0xfd, 0xf7, 0xae, 0x73, 0xab, 0x70, 0x30, 0x12, 0x22, + 0xfc, 0xd7, 0x2b, 0xe5, 0x75, 0xf6, 0x79, 0x75, 0x76, 0xf2, 0xa0, 0x39, 0xde, 0x54, 0x20, 0x6f, 0x06, 0x02, 0xcc, 0xdb, 0x54, 0x37, 0xcf, 0xe5, 0x8f, 0xd2, 0xb1, 0xfa, 0x52, 0xc2, 0xa7, 0x24, + 0xaf, 0xbc, 0xd7, 0xe0, 0xd9, 0x3c, 0x31, 0x10, 0xbd, 0xd7, 0x51, 0x6a, 0xc9, 0x97, 0xb4, 0xb1, 0x1c, 0x64, 0x5d, 0x18, 0x97, 0x60, 0x14, 0x31, 0x15, 0xdb, 0x51, 0x5e, 0x4c, 0xfd, 0xf3, 0x09, + 0x30, 0x61, 0x03, 0x3b, 0x33, 0xb9, 0x06, 0x52, 0x55, 0xb7, 0xa8, 0x6d, 0x30, 0xf9, 0xfa, 0x90, 0xcd, 0x6d, 0xb2, 0xcb, 0x23, 0xde, 0x51, 0x87, 0xc7, 0xd7, 0x39, 0x54, 0x58, 0x52, 0x1a, 0x1a, + 0x77, 0xa6, 0x09, 0x97, 0x1b, 0x33, 0xb0, 0x3b, 0xd2, 0x2a, 0x0a, 0x68, 0xd5, 0x17, 0x04, 0x44, 0x5f, 0x8d, 0x3a, 0x83, 0xf0, 0xc3, 0xdb, 0x77, 0x86, 0x46, 0x08, 0xc6, 0xb4, 0x58, 0x69, 0x04, + 0x5a, 0xf1, 0xdd, 0x3c, 0xfe, 0x1e, 0x03, 0x47, 0xc3, 0x7d, 0x66, 0x3b, 0xb6, 0xde, 0xbd, 0xc2, 0xea, 0x6f, 0x36, 0xd4, 0x45, 0x6a, 0x22, 0x57, 0x7c, 0xce, 0x1f, 0xee, 0x60, 0x1b, 0x23, 0x21, + 0xec, 0x68, 0xfc, 0xf6, 0xe7, 0x02, 0xf4, 0x16, 0x28, 0xb8, 0x68, 0xc7, 0x4b, 0xbb, 0x91, 0xa7, 0x2d, 0x20, 0x45, 0xa6, 0x44, 0x94, 0xa8, 0x73, 0x6b, 0x49, 0x98, 0x2b, 0xcc, 0x25, 0x8c, 0x1e, + 0xf7, 0xb1, 0x01, 0xca, 0x0a, 0x9a, 0xaa, 0x05, 0xfe, 0x00, 0x50, 0x5b, 0x33, 0x4b, 0x0b, 0x15, 0x5c, 0xa8, 0xfe, 0x05, 0x79, 0xba, 0x82, 0x7a, 0xfb, 0x70, 0xd7, 0x4a, 0x59, 0xbd, 0x68, 0x0d, + 0xf7, 0x0f, 0x8a, 0x42, 0x28, 0xa4, 0x05, 0x08, 0xda, 0xc8, 0xa4, 0x9f, 0x32, 0xca, 0x53, 0x30, 0x81, 0x12, 0x40, 0x15, 0x4c, 0x51, 0xfa, 0x64, 0x70, 0x13, 0x8c, 0xe0, 0xee, 0xce, 0xc9, 0x13, + 0xa1, 0xb5, 0xf6, 0x41, 0x12, 0xfc, 0x70, 0x2d, 0x63, 0x3b, 0x08, 0xb0, 0xa2, 0xcc, 0x7b, 0x9e, 0xf3, 0x6a, 0x4e, 0x15, 0x84, 0x51, 0xb2, 0x75, 0xbe, 0xbb, 0xec, 0x46, 0xa5, 0xd6, 0xfa, 0x23, + 0x3d, 0x0b, 0x6c, 0xea, 0x44, 0x49, 0xc6, 0xc4, 0x2f, 0x36, 0x9f, 0x27, 0x53, 0x89, 0x5d, 0x97, 0x58, 0xc0, 0x7c, 0xa1, 0xe1, 0xa9, 0xb6, 0x8b, 0x2c, 0xa8, 0xb1, 0x35, 0xfb, 0x79, 0xea, 0x11, + }; + } + + + namespace t16 { + int internal_rounds = 57; + + int alpha = 5; + + unsigned char mat_diag_m_1[] = { + 0xe4, 0x68, 0x57, 0x23, 0xae, 0xa1, 0xb5, 0x33, 0x2b, 0xfb, 0xd9, 0xa7, 0x0c, 0x1c, 0xf2, 0x3e, 0x6a, 0x36, 0x7c, 0x13, 0xcd, 0xb7, 0xc1, 0x09, 0xa7, 0xe1, 0x0a, 0x0e, 0x7c, 0xaf, 0x9a, 0x26, + 0xe3, 0x1d, 0xeb, 0x30, 0x0c, 0xa2, 0x82, 0xfb, 0xb2, 0xec, 0x35, 0x2f, 0x79, 0xd0, 0x0d, 0xa1, 0x7d, 0xb2, 0xf3, 0xfa, 0xed, 0x29, 0x72, 0x31, 0x4e, 0x61, 0x32, 0x40, 0xe0, 0x3e, 0x54, 0x30, + 0xc4, 0x5f, 0x3c, 0xb8, 0xb8, 0x69, 0x84, 0xd6, 0x4b, 0xad, 0x32, 0xe3, 0x02, 0xd0, 0xf1, 0x42, 0xe6, 0x5c, 0xc7, 0xef, 0x44, 0xfd, 0x3f, 0xd7, 0xd8, 0xb7, 0x60, 0x31, 0xb1, 0x16, 0x74, 0x01, + 0xaf, 0x9e, 0x93, 0x14, 0x06, 0x49, 0x81, 0x6c, 0xd3, 0x02, 0xd9, 0x66, 0xb9, 0x73, 0xd7, 0x43, 0xc4, 0xd3, 0x90, 0x34, 0x5d, 0xbc, 0xb6, 0xab, 0x1a, 0x3f, 0xa4, 0x38, 0xf4, 0x03, 0xb1, 0x09, + 0x30, 0xdb, 0xfc, 0x83, 0x49, 0x61, 0x13, 0x15, 0x18, 0xab, 0x51, 0x94, 0x48, 0xc4, 0x62, 0x14, 0x26, 0x0d, 0x83, 0x2c, 0xe4, 0xbd, 0x55, 0xda, 0x82, 0xa8, 0x1a, 0xa2, 0x1e, 0xe8, 0xf9, 0x08, + 0xe5, 0x4b, 0x3e, 0xb5, 0x0e, 0x43, 0x6e, 0xcb, 0x8a, 0xc9, 0x9a, 0x54, 0x79, 0x36, 0xcb, 0xaf, 0xac, 0x17, 0xbf, 0xc3, 0xf7, 0x97, 0xb7, 0x7f, 0x77, 0x85, 0xf4, 0x7c, 0xf7, 0x2c, 0x6d, 0x02, + 0x7b, 0x7a, 0x1d, 0xec, 0x6e, 0xf3, 0x63, 0x9b, 0x28, 0xa8, 0x9a, 0x35, 0x08, 0xfe, 0xde, 0x61, 0xde, 0xc3, 0xd3, 0xf0, 0x73, 0x32, 0x0b, 0x71, 0x0b, 0x59, 0x09, 0xfa, 0x2b, 0x44, 0x52, 0x06, + 0x7b, 0xc2, 0xf9, 0x78, 0xf7, 0xe5, 0x95, 0x71, 0x11, 0xd1, 0x4c, 0x9b, 0x34, 0x52, 0xc1, 0x05, 0x7d, 0xdb, 0x21, 0x23, 0x60, 0x82, 0x4f, 0x88, 0xff, 0x25, 0x37, 0x1e, 0xbf, 0x46, 0x6e, 0x0d, + 0x42, 0x05, 0x4d, 0x77, 0x37, 0xa0, 0x45, 0xcc, 0x42, 0xf8, 0x55, 0xa7, 0x87, 0xa6, 0x33, 0xfc, 0xd3, 0x59, 0x73, 0xb0, 0xc9, 0xa3, 0xe4, 0x02, 0x5f, 0x1a, 0x29, 0x89, 0xe6, 0x54, 0x57, 0x28, + 0xc4, 0x4d, 0x5a, 0x34, 0x94, 0x7d, 0x8e, 0x12, 0x3d, 0x2c, 0xb6, 0x4c, 0xaa, 0x70, 0x7e, 0x56, 0x65, 0xdd, 0x26, 0x15, 0x18, 0x7e, 0xee, 0x8e, 0xdc, 0xa5, 0xe2, 0x8c, 0x4b, 0x88, 0xa4, 0x09, + 0x4d, 0x59, 0x5a, 0x55, 0xbd, 0x70, 0x9d, 0xea, 0x4b, 0x93, 0x94, 0xca, 0x23, 0x16, 0x71, 0xfa, 0xde, 0x07, 0x76, 0x90, 0x20, 0x2a, 0x69, 0x5e, 0xc9, 0x6c, 0xca, 0xc4, 0xda, 0x44, 0xaf, 0x06, + 0xd5, 0x2a, 0x5d, 0xab, 0x65, 0xe1, 0x4a, 0x07, 0x6f, 0x40, 0xd1, 0x19, 0x45, 0x7a, 0xc6, 0xe2, 0x4b, 0x48, 0xf7, 0x0b, 0x97, 0x58, 0xcb, 0x66, 0x0d, 0xbd, 0xe6, 0xaf, 0x38, 0x77, 0x8b, 0x0f, + 0x1a, 0xc7, 0x28, 0xb1, 0xa7, 0x3b, 0xfe, 0xc6, 0x7a, 0x7f, 0xef, 0x76, 0x84, 0xa8, 0x02, 0xb9, 0xaa, 0xc3, 0x0a, 0xbb, 0x11, 0x72, 0x6d, 0xcc, 0xcd, 0xac, 0x73, 0xe6, 0x90, 0xbe, 0x4d, 0x29, + 0x39, 0xe0, 0x4a, 0x3d, 0xee, 0xa4, 0x3a, 0xfa, 0x2c, 0xce, 0x4f, 0x9b, 0x42, 0xc9, 0x40, 0xcf, 0x3c, 0x71, 0xd7, 0xd7, 0xf9, 0xe3, 0xac, 0x4b, 0xb1, 0x33, 0xd5, 0xca, 0xce, 0xf9, 0xc3, 0x05, + 0xe1, 0xd7, 0x10, 0x05, 0xf4, 0x38, 0x40, 0x0f, 0xb8, 0x26, 0x11, 0xb4, 0xca, 0x1d, 0x4f, 0xad, 0xb6, 0x28, 0xee, 0x24, 0x8f, 0x87, 0x87, 0x37, 0x2a, 0xdf, 0xc3, 0x2a, 0x87, 0xff, 0xcb, 0x26, + 0xce, 0xbd, 0x79, 0xe3, 0x61, 0x55, 0x60, 0x6a, 0x6d, 0xca, 0x71, 0xaa, 0x17, 0xe7, 0x05, 0xc0, 0x0d, 0x10, 0xba, 0x39, 0x92, 0xde, 0x4e, 0x42, 0xc1, 0xb9, 0x87, 0xc9, 0x93, 0xb4, 0xa0, 0x1b, + }; + + unsigned char round_constants[] = { + 0xff, 0xac, 0xce, 0xaa, 0xfb, 0xad, 0xf0, 0x63, 0xa2, 0xdf, 0x8f, 0x44, 0x57, 0xc5, 0xde, 0x2c, 0x00, 0x6f, 0x32, 0xc7, 0x72, 0xc6, 0xb3, 0xe8, 0xf5, 0xf9, 0xba, 0xe2, 0x0a, 0xc5, 0xa8, 0x11, + 0x43, 0x4e, 0xc3, 0x6a, 0x59, 0x54, 0x8e, 0x94, 0x33, 0x42, 0xd1, 0xa7, 0x5a, 0x71, 0x3f, 0x0e, 0x92, 0xe8, 0x40, 0xe8, 0x0e, 0xf0, 0x54, 0x87, 0xc1, 0xaa, 0x3d, 0x37, 0xc4, 0xf6, 0x2a, 0x06, + 0x99, 0x50, 0x73, 0xde, 0xa1, 0x62, 0xf6, 0x1d, 0x0a, 0x56, 0x9d, 0x1f, 0x54, 0x8b, 0xe1, 0x4e, 0x46, 0x36, 0xb9, 0x79, 0xad, 0x62, 0x2f, 0x00, 0xdc, 0xc8, 0x69, 0x27, 0x74, 0x68, 0x76, 0x06, + 0x04, 0x29, 0x72, 0x87, 0x45, 0xf3, 0xf4, 0xea, 0x20, 0x79, 0xcf, 0xa1, 0x82, 0x62, 0x5a, 0xb8, 0xa7, 0x05, 0xc6, 0xc5, 0x23, 0x0f, 0xd6, 0xfd, 0xc4, 0xed, 0xb5, 0xce, 0xab, 0x66, 0x25, 0x09, + 0x8a, 0xac, 0xa8, 0xee, 0xdd, 0xc4, 0x41, 0x6d, 0x6f, 0x8a, 0x92, 0xf4, 0xe8, 0x52, 0xf9, 0x98, 0x7f, 0x93, 0x3d, 0x0d, 0xb8, 0x0e, 0xb9, 0xd6, 0x69, 0xb5, 0x89, 0xf0, 0x8a, 0x67, 0xce, 0x1d, + 0xc3, 0xad, 0xa2, 0xca, 0x02, 0x1d, 0x05, 0xa6, 0xb7, 0x5e, 0xb6, 0xe6, 0xf6, 0x1b, 0x9e, 0xc7, 0xd4, 0x26, 0x47, 0x88, 0xfc, 0x27, 0x60, 0xdb, 0x75, 0x51, 0xe5, 0x83, 0xd9, 0x0b, 0x0f, 0x0a, + 0xa1, 0x73, 0x8b, 0xc0, 0x77, 0xcd, 0xd4, 0x55, 0x78, 0xb5, 0x21, 0x2c, 0x69, 0x5b, 0x3e, 0xab, 0x55, 0x15, 0x53, 0xa5, 0x6d, 0x2c, 0x47, 0x90, 0xbb, 0xf2, 0xf4, 0xbe, 0xd5, 0x87, 0xb8, 0x2a, + 0x73, 0x0b, 0x87, 0x63, 0x91, 0x7e, 0x34, 0xbc, 0xfd, 0x6c, 0x68, 0x28, 0x1a, 0x0d, 0x93, 0xbf, 0xd7, 0x9d, 0xb2, 0xab, 0x84, 0x33, 0x60, 0xbe, 0xd2, 0x43, 0x74, 0x5a, 0x01, 0xf9, 0x29, 0x0e, + 0xd2, 0x7a, 0x72, 0xd8, 0x25, 0x71, 0xa5, 0x42, 0x2c, 0xbb, 0xa8, 0x58, 0xe1, 0x12, 0xd7, 0x61, 0xbc, 0xf0, 0x8c, 0x8e, 0xd2, 0xd1, 0x36, 0x74, 0x4a, 0x93, 0x68, 0xe0, 0xf0, 0xa5, 0xb3, 0x21, + 0x26, 0xc1, 0xa1, 0x3e, 0xa7, 0x1b, 0x43, 0xd3, 0x4e, 0xff, 0x10, 0xfc, 0xd2, 0x9f, 0x9a, 0x74, 0xf1, 0x22, 0x54, 0xe4, 0x6f, 0xf2, 0x16, 0xfd, 0x2e, 0x9e, 0xcc, 0x55, 0xa9, 0x8e, 0x1f, 0x0e, + 0x6a, 0xd0, 0x66, 0x62, 0xb4, 0x5e, 0xd2, 0x79, 0x03, 0x7b, 0x17, 0xc8, 0x8d, 0x40, 0xc5, 0x7b, 0x7c, 0x07, 0xf5, 0xb8, 0x30, 0xf5, 0x97, 0x89, 0xad, 0x23, 0xc0, 0x65, 0x33, 0x51, 0x30, 0x21, + 0x1a, 0xe8, 0xd9, 0x47, 0xda, 0xc3, 0xe1, 0x73, 0x3b, 0x0d, 0xf7, 0xaf, 0x0d, 0x7d, 0x0e, 0x51, 0xa3, 0xd6, 0x20, 0x21, 0xaa, 0x7e, 0xf1, 0x9e, 0x41, 0x07, 0xa3, 0x24, 0x3e, 0xa1, 0x96, 0x19, + 0x32, 0xfe, 0x0f, 0xb7, 0x20, 0x2e, 0x7d, 0x80, 0x65, 0x4f, 0x92, 0xb8, 0x9f, 0x91, 0x6e, 0x33, 0x95, 0xfe, 0x0e, 0x3e, 0x6f, 0x14, 0x10, 0x68, 0xd6, 0x91, 0xb5, 0xed, 0xa9, 0x28, 0xe8, 0x2a, + 0x86, 0xba, 0xee, 0xac, 0xcf, 0xa9, 0x7e, 0x70, 0x19, 0x97, 0x5a, 0x4f, 0x92, 0x50, 0x4b, 0x02, 0xcf, 0x6d, 0xcb, 0xad, 0xf0, 0xbe, 0x59, 0xc4, 0xcf, 0x10, 0xba, 0xdd, 0xc3, 0x7f, 0x61, 0x2f, + 0x6a, 0xad, 0x60, 0x23, 0xd5, 0x01, 0x4b, 0x43, 0xdf, 0xf2, 0x14, 0x90, 0x30, 0xb2, 0x9b, 0xe3, 0x24, 0xad, 0xc6, 0x6b, 0xdd, 0x1e, 0x5e, 0xb3, 0x59, 0xea, 0x1f, 0xd2, 0xf9, 0x4a, 0x03, 0x26, + 0xc1, 0x2d, 0xcb, 0x97, 0x1d, 0xad, 0x22, 0x88, 0x8a, 0xf8, 0x8e, 0x82, 0xc3, 0x4d, 0x6e, 0xc3, 0xd7, 0xc8, 0xb3, 0xba, 0x41, 0xc7, 0x9b, 0xe9, 0x74, 0xda, 0x0e, 0xb5, 0xa9, 0xd9, 0x61, 0x08, + 0x0a, 0x23, 0x82, 0x7f, 0x74, 0x2a, 0xc0, 0xa9, 0xb9, 0xa5, 0xaa, 0xc8, 0x87, 0x0e, 0x5f, 0x8b, 0xbc, 0xb6, 0xb6, 0xb1, 0x8c, 0x31, 0x59, 0x29, 0xf1, 0x80, 0x13, 0x25, 0xc6, 0x07, 0xd3, 0x09, + 0xee, 0xf6, 0xe5, 0x12, 0x26, 0x00, 0x4d, 0x40, 0xc5, 0x9c, 0x0c, 0xcf, 0x18, 0xfa, 0x81, 0x31, 0x91, 0xd9, 0x3e, 0x5f, 0x6a, 0x40, 0xb6, 0xc5, 0x81, 0x36, 0x89, 0x15, 0xc0, 0x49, 0x72, 0x2d, + 0x3c, 0x7c, 0xba, 0x0a, 0x1b, 0x5e, 0xec, 0x0f, 0x1d, 0x6d, 0xc6, 0x7f, 0x4a, 0x16, 0x05, 0xfa, 0x4f, 0x34, 0xc8, 0xe4, 0xd3, 0x04, 0xb6, 0x79, 0x35, 0x9e, 0x16, 0xb0, 0x4a, 0x39, 0x0c, 0x30, + 0x5f, 0xbc, 0xbe, 0xe3, 0x2a, 0x52, 0x7a, 0x58, 0x4f, 0x75, 0xd4, 0x28, 0xa2, 0x95, 0xd0, 0x8d, 0x0d, 0xb4, 0x1b, 0x5e, 0x7f, 0xca, 0xda, 0x78, 0x9b, 0x74, 0x07, 0x05, 0xa3, 0x46, 0x32, 0x05, + 0x85, 0x6c, 0xbc, 0x20, 0x9f, 0xf6, 0x5d, 0x5b, 0xe8, 0xa3, 0xe3, 0x4c, 0xcb, 0x78, 0xe2, 0x2d, 0x9f, 0x8e, 0xa5, 0x10, 0x41, 0x81, 0xf0, 0x4a, 0xbc, 0xb6, 0x59, 0x99, 0x9e, 0xc8, 0xb8, 0x2b, + 0xb5, 0x83, 0x59, 0xcf, 0x75, 0x62, 0x13, 0xce, 0x49, 0x9c, 0xc5, 0x45, 0x16, 0xb0, 0xe5, 0x73, 0xa0, 0x3a, 0xd6, 0xa7, 0x8e, 0x89, 0x85, 0xb7, 0xe2, 0xdc, 0x08, 0x00, 0x49, 0x87, 0xd0, 0x03, + 0x83, 0x14, 0x71, 0x0a, 0x4d, 0x07, 0xba, 0x0d, 0x0e, 0x72, 0xe9, 0x0a, 0x01, 0xb1, 0xa8, 0x2e, 0xe4, 0x00, 0xe7, 0xfe, 0xe5, 0x50, 0xe2, 0x67, 0x34, 0xb3, 0x80, 0x6b, 0x48, 0x60, 0x18, 0x1b, + 0xa9, 0xe6, 0x1a, 0xd3, 0xc8, 0x78, 0xa8, 0x87, 0x5c, 0x27, 0xb8, 0xac, 0xa8, 0x71, 0x36, 0xd5, 0xe9, 0x9a, 0x0d, 0x24, 0x04, 0x72, 0x40, 0xd6, 0xe0, 0x02, 0x35, 0xe3, 0x19, 0xdf, 0xc2, 0x07, + 0x5b, 0x57, 0x80, 0x8f, 0xba, 0xdc, 0x5c, 0x49, 0x4c, 0x16, 0x8a, 0x00, 0xfb, 0x80, 0xaa, 0x1e, 0x2d, 0xc3, 0x9a, 0x8d, 0x6d, 0xd4, 0x3d, 0x9d, 0x7e, 0x30, 0x7f, 0x63, 0x0e, 0x36, 0x81, 0x26, + 0x60, 0x8c, 0x2f, 0x06, 0x49, 0x60, 0x55, 0xd9, 0xb5, 0x2b, 0xf1, 0xff, 0x8c, 0xb3, 0xd2, 0x5a, 0x99, 0xb8, 0x46, 0x50, 0xcd, 0xe4, 0x1f, 0x59, 0x07, 0xfd, 0xa8, 0xde, 0x31, 0x0b, 0xe4, 0x26, + 0x5b, 0xd4, 0x0b, 0x02, 0x6c, 0xfc, 0xaa, 0xb2, 0x76, 0x02, 0xa8, 0xe7, 0x24, 0x56, 0x0a, 0x1d, 0xe6, 0x7c, 0x44, 0x40, 0x86, 0x9e, 0x28, 0x1e, 0xb9, 0x81, 0x5d, 0x20, 0xb3, 0xb0, 0x2d, 0x14, + 0xbf, 0x0b, 0x82, 0xf6, 0x71, 0x28, 0x6e, 0xab, 0x6e, 0x36, 0xcc, 0x58, 0x08, 0xfa, 0x44, 0x13, 0xda, 0xb4, 0x6b, 0xf0, 0xcd, 0x23, 0x9a, 0xb2, 0x53, 0x44, 0x1f, 0xce, 0xe8, 0x1a, 0x48, 0x11, + 0x9d, 0x2d, 0x2c, 0x60, 0xbe, 0x03, 0xe1, 0xea, 0xe7, 0xae, 0x6f, 0xec, 0xf2, 0xfd, 0x32, 0x1b, 0xf6, 0xe6, 0xe6, 0xd4, 0x16, 0x05, 0x05, 0xdc, 0x85, 0xf9, 0xfc, 0xed, 0x14, 0xa4, 0xaf, 0x14, + 0x5b, 0x0f, 0x47, 0xac, 0x21, 0xf6, 0x04, 0x77, 0x6a, 0x67, 0xe3, 0x7d, 0xfe, 0x53, 0x8d, 0x6f, 0xf9, 0xb1, 0xad, 0xe8, 0x24, 0x19, 0xc7, 0x71, 0x69, 0xdb, 0xf0, 0x2d, 0xec, 0xf3, 0xfc, 0x07, + 0x6f, 0x9e, 0x77, 0xb0, 0x65, 0x1d, 0xe5, 0x22, 0x58, 0xc5, 0x73, 0x31, 0x90, 0x58, 0xba, 0x9b, 0xc0, 0x9e, 0xc0, 0xe4, 0xd5, 0x19, 0x44, 0xf5, 0x36, 0x01, 0xf0, 0x6d, 0xe3, 0xa5, 0xda, 0x21, + 0x3f, 0x7d, 0xac, 0xee, 0x83, 0xf8, 0xf6, 0x0a, 0x38, 0xc1, 0x5e, 0x96, 0x5e, 0xed, 0xb5, 0xe4, 0x7a, 0xea, 0xef, 0x0b, 0x43, 0x06, 0x82, 0xf0, 0x10, 0xdd, 0xba, 0x7a, 0x62, 0x4f, 0x32, 0x2e, + 0x86, 0xbe, 0x9d, 0x82, 0xd8, 0x43, 0x2a, 0xde, 0x1f, 0xec, 0x6c, 0x22, 0x8a, 0x3c, 0x9a, 0x94, 0x3f, 0x19, 0xf6, 0x01, 0x19, 0x65, 0x1e, 0x19, 0x7b, 0xbd, 0xcc, 0xcf, 0x84, 0xb3, 0x5b, 0x0b, + 0x18, 0x5f, 0xdf, 0x18, 0xad, 0xe8, 0x56, 0x07, 0xb3, 0x54, 0x66, 0x4f, 0x21, 0x4a, 0x0d, 0x2d, 0xbd, 0x07, 0xb9, 0xad, 0x4e, 0xdc, 0x50, 0x33, 0xf7, 0xba, 0xaa, 0x7f, 0x00, 0xdb, 0x9d, 0x06, + 0x3c, 0xdd, 0x86, 0xcf, 0xb6, 0xba, 0x70, 0xf4, 0x65, 0x13, 0x03, 0xa5, 0xe5, 0xc4, 0xe8, 0x1a, 0x89, 0x35, 0xb2, 0xcb, 0x14, 0xfb, 0xa3, 0x3e, 0x78, 0x47, 0xb4, 0x89, 0x5f, 0x46, 0x8b, 0x20, + 0x4c, 0xe1, 0xc7, 0x8f, 0xd7, 0x3d, 0x61, 0xe7, 0xc4, 0x44, 0x19, 0xa3, 0xda, 0x14, 0xa7, 0xeb, 0xa4, 0xd0, 0xaf, 0x98, 0xdb, 0x24, 0xb0, 0x40, 0x96, 0xfb, 0x31, 0xe8, 0xf9, 0x97, 0x62, 0x13, + 0xe8, 0xd9, 0x3e, 0x3b, 0x9f, 0x08, 0x8b, 0xfc, 0xad, 0x7a, 0xad, 0x94, 0xcf, 0xb9, 0xe7, 0xf4, 0x18, 0xf5, 0x4c, 0x78, 0x4a, 0x9a, 0xf5, 0x99, 0xae, 0x8f, 0xb6, 0x7d, 0x9a, 0x85, 0xa7, 0x10, + 0xbc, 0x2e, 0x21, 0xa5, 0x66, 0xd1, 0x84, 0x86, 0x02, 0xc6, 0x3f, 0x10, 0x89, 0x84, 0x18, 0xb3, 0xec, 0x98, 0xdd, 0xb3, 0x21, 0xe4, 0x6e, 0xee, 0xd0, 0x15, 0xd4, 0x27, 0xda, 0xb4, 0x62, 0x08, + 0x4c, 0x40, 0xa4, 0x9f, 0x78, 0x47, 0x43, 0xa8, 0xe6, 0x48, 0xeb, 0x8a, 0xf0, 0xa2, 0xd2, 0xf7, 0x16, 0x34, 0xf3, 0x3f, 0x10, 0xeb, 0x8f, 0xff, 0x40, 0x77, 0x6f, 0x7f, 0x96, 0xf2, 0x3a, 0x23, + 0x92, 0xd5, 0x08, 0x89, 0x07, 0x97, 0x07, 0x2d, 0xf2, 0xf7, 0x32, 0x57, 0xfd, 0x4d, 0x73, 0x8f, 0xf2, 0xab, 0x2f, 0x73, 0x17, 0x96, 0x75, 0xab, 0xf0, 0xb8, 0x8a, 0x94, 0xb5, 0x69, 0xe0, 0x2a, + 0xb8, 0x54, 0xd6, 0xe0, 0xb6, 0xfd, 0xc4, 0x8b, 0x5e, 0xea, 0x10, 0x05, 0x93, 0x3f, 0x91, 0x33, 0xc6, 0xd6, 0xa8, 0x78, 0xd2, 0x69, 0x00, 0xba, 0x63, 0x02, 0x88, 0x42, 0x3b, 0x3f, 0x58, 0x00, + 0x0a, 0x73, 0x42, 0xb3, 0x12, 0xbe, 0x76, 0x77, 0xaf, 0x11, 0xa2, 0x2b, 0xd9, 0x6f, 0x08, 0xf6, 0xf5, 0xb2, 0x19, 0x25, 0x91, 0x42, 0x6e, 0x53, 0x7b, 0xe4, 0xa6, 0x32, 0x96, 0xf2, 0xe2, 0x12, + 0xf1, 0x3b, 0x06, 0xb3, 0x88, 0x41, 0x2d, 0x74, 0x90, 0x8a, 0x05, 0xbb, 0xa8, 0xcf, 0x74, 0x8a, 0x69, 0xc4, 0x7f, 0x2b, 0x61, 0x28, 0xe1, 0x0a, 0x82, 0x8c, 0x44, 0xb8, 0xc7, 0xb6, 0xdb, 0x06, + 0xa7, 0x6d, 0x3a, 0x2f, 0xb9, 0xb1, 0x18, 0xab, 0xee, 0x0e, 0x59, 0xed, 0xb5, 0x94, 0xe8, 0xdc, 0x30, 0xe8, 0xe3, 0x29, 0x8b, 0x3f, 0xd5, 0xec, 0x3d, 0x24, 0x53, 0xd3, 0x80, 0x93, 0x50, 0x18, + 0x61, 0xe5, 0xcf, 0x57, 0x73, 0xe9, 0x88, 0x89, 0xbb, 0xf1, 0x2f, 0xe3, 0x5b, 0x2c, 0x73, 0xa2, 0xa4, 0xef, 0xa7, 0x32, 0x16, 0xa5, 0xd2, 0x36, 0xa8, 0x8b, 0x3a, 0x5d, 0x9e, 0xc9, 0x6f, 0x0c, + 0x52, 0x39, 0x1e, 0x2f, 0x94, 0xce, 0xb3, 0x3c, 0x73, 0x3c, 0xe8, 0x8a, 0x1a, 0xb1, 0xdf, 0x8d, 0x15, 0xa8, 0xd5, 0x5c, 0xa9, 0x5a, 0xde, 0x03, 0x72, 0x99, 0x47, 0xf4, 0xce, 0x96, 0x21, 0x04, + 0x41, 0xd3, 0x62, 0x07, 0xcc, 0xea, 0xb5, 0x75, 0x51, 0x10, 0x63, 0x79, 0x1b, 0xd4, 0x78, 0xd8, 0x94, 0x93, 0xa0, 0xf7, 0x13, 0x2b, 0x44, 0x48, 0xfc, 0x39, 0x9a, 0x8a, 0x55, 0x1b, 0x74, 0x2d, + 0x7a, 0x10, 0x01, 0x9e, 0x51, 0x2f, 0x14, 0xfc, 0x84, 0xc9, 0x01, 0x86, 0x1a, 0xcc, 0x39, 0xda, 0xa9, 0x72, 0x68, 0xc5, 0x55, 0x9a, 0x5f, 0x46, 0x5b, 0xc5, 0x9f, 0xe4, 0x83, 0x13, 0x56, 0x28, + 0xda, 0x36, 0x8e, 0x2f, 0x6b, 0x7a, 0x5c, 0xb1, 0x48, 0x26, 0x00, 0x22, 0x83, 0x2d, 0xc4, 0xaf, 0xd8, 0x3a, 0x84, 0x93, 0xf8, 0xbe, 0xda, 0xf2, 0xfa, 0x49, 0x41, 0x39, 0xef, 0x11, 0x3c, 0x28, + 0x5d, 0xea, 0x71, 0xd7, 0x0c, 0x86, 0xe1, 0x0c, 0x08, 0x8a, 0xa3, 0x9f, 0x16, 0x4e, 0x2d, 0x95, 0x60, 0x9d, 0x3d, 0x9b, 0xa5, 0xb8, 0xc8, 0x18, 0x10, 0x23, 0x77, 0x75, 0x2b, 0x50, 0xe5, 0x16, + 0x58, 0x74, 0xa9, 0xef, 0xe2, 0x1e, 0x5f, 0x89, 0xae, 0x37, 0x4a, 0xb4, 0x73, 0xa6, 0x0f, 0xd4, 0x5e, 0xc2, 0x88, 0x6c, 0x9b, 0x51, 0x9b, 0x84, 0xdd, 0x9b, 0x99, 0xb1, 0xeb, 0x43, 0xc3, 0x1d, + 0x1e, 0xcb, 0x26, 0xc7, 0x3f, 0xa8, 0xe4, 0xa0, 0x20, 0xeb, 0xcf, 0x6a, 0x33, 0x11, 0xf6, 0x11, 0x28, 0x1c, 0x34, 0x6d, 0x13, 0x74, 0x5d, 0x7b, 0x35, 0xd9, 0xd8, 0x63, 0xfb, 0x8a, 0x2b, 0x19, + 0xb8, 0x43, 0xe2, 0xfb, 0xee, 0xd2, 0xdc, 0x7a, 0xb5, 0xb6, 0x09, 0xbb, 0x6c, 0x68, 0xdf, 0x61, 0x6a, 0xe8, 0x9a, 0xec, 0x29, 0xb3, 0x65, 0x12, 0x87, 0xd0, 0xaf, 0x40, 0x09, 0xb6, 0x30, 0x1a, + 0xfc, 0x48, 0x40, 0xae, 0xed, 0xbd, 0x19, 0x6b, 0xc8, 0x90, 0x72, 0xcb, 0xf2, 0xfd, 0xfc, 0x13, 0xef, 0xa2, 0xfd, 0x38, 0x4a, 0x7d, 0x60, 0x1d, 0x15, 0x9f, 0x23, 0xfb, 0x04, 0x0f, 0xa0, 0x20, + 0xda, 0x29, 0xd5, 0x5e, 0x0e, 0x69, 0xa1, 0xad, 0xd9, 0x4c, 0x3e, 0x75, 0x56, 0x1a, 0xa6, 0x7f, 0x92, 0xf4, 0x2d, 0x01, 0x2e, 0x11, 0x7e, 0x73, 0xae, 0xd2, 0xe8, 0x83, 0x20, 0xb4, 0x93, 0x02, + 0x07, 0xf8, 0x60, 0x65, 0x90, 0x51, 0x74, 0xa1, 0xc3, 0xbf, 0x33, 0x60, 0xea, 0x59, 0xe9, 0xcf, 0xe3, 0x8d, 0x5c, 0xfe, 0x13, 0x19, 0xc0, 0x2a, 0xb4, 0xb3, 0x5c, 0x9e, 0xa8, 0x03, 0xb1, 0x2d, + 0x3c, 0xc7, 0x80, 0xdd, 0x1c, 0x78, 0x0b, 0x25, 0x70, 0x14, 0x07, 0x21, 0xf3, 0xff, 0xe0, 0x3c, 0x98, 0x84, 0x81, 0xa6, 0x95, 0xda, 0xa2, 0x97, 0x93, 0x8c, 0x93, 0xfa, 0x2d, 0x1d, 0xb8, 0x1c, + 0x16, 0xd2, 0x9a, 0x0c, 0xc5, 0x8b, 0x35, 0xcd, 0x02, 0x0f, 0x72, 0xb3, 0xb7, 0x68, 0x1f, 0x30, 0x87, 0x67, 0x94, 0x19, 0x3b, 0x81, 0x37, 0x78, 0x7d, 0xf3, 0x18, 0x9f, 0x5c, 0x35, 0xf1, 0x03, + 0xf5, 0xa3, 0xca, 0x12, 0xcf, 0xbc, 0x9b, 0xf3, 0x88, 0xf0, 0xce, 0xf3, 0xb9, 0xb0, 0xe8, 0xa4, 0x75, 0x97, 0xbc, 0x43, 0x07, 0xc3, 0xa1, 0x25, 0x26, 0xa9, 0x17, 0x96, 0xa1, 0x73, 0xaf, 0x13, + 0x24, 0x49, 0x55, 0x9a, 0x8d, 0xae, 0x1d, 0xe6, 0x8e, 0xd6, 0x21, 0x7e, 0xa8, 0xc4, 0x5a, 0x26, 0x2a, 0x53, 0xd1, 0xc5, 0x7e, 0xf8, 0xcf, 0x76, 0x61, 0x8d, 0x61, 0x9f, 0xf0, 0x38, 0x49, 0x11, + 0x8a, 0xa9, 0x03, 0xcc, 0xaf, 0x35, 0x68, 0xbc, 0x86, 0x3b, 0x90, 0x51, 0x0f, 0x63, 0x03, 0x9e, 0x3c, 0xf9, 0x7e, 0xa0, 0x2e, 0x73, 0x8e, 0x52, 0x61, 0xd6, 0x8d, 0x2f, 0x5d, 0x45, 0xcb, 0x0a, + 0x44, 0x17, 0xdc, 0x23, 0x9b, 0x5d, 0x82, 0x7e, 0x68, 0x7b, 0x9d, 0x9f, 0x83, 0x46, 0xd5, 0x4d, 0xd8, 0x19, 0xd3, 0xae, 0x73, 0xfe, 0x7a, 0x43, 0x77, 0xfa, 0xd8, 0xd2, 0x5d, 0xdb, 0x1a, 0x15, + 0x64, 0x34, 0x61, 0x8f, 0x43, 0x4c, 0x5c, 0x39, 0xa0, 0x76, 0x54, 0x0d, 0xea, 0x02, 0xea, 0x4d, 0xe2, 0x49, 0x25, 0xd5, 0x64, 0x9b, 0xf1, 0x6a, 0x34, 0xac, 0x39, 0xd0, 0x23, 0x85, 0x54, 0x25, + 0x40, 0xd1, 0xbd, 0xb4, 0x79, 0xa8, 0x52, 0xc6, 0x9f, 0xbc, 0xea, 0x61, 0x14, 0x11, 0x65, 0x69, 0xef, 0xd1, 0x85, 0xae, 0x40, 0x25, 0xdb, 0x64, 0xa2, 0xff, 0x37, 0x2a, 0xc2, 0x75, 0xcc, 0x09, + 0xc2, 0xe6, 0xa8, 0x6a, 0xc8, 0x81, 0x17, 0x1a, 0x5e, 0x96, 0xcf, 0x2d, 0xe9, 0x8d, 0x93, 0xc8, 0xa1, 0x44, 0x85, 0xd2, 0xb7, 0xd0, 0x4b, 0x2f, 0xff, 0xb0, 0x4f, 0x4f, 0x93, 0x39, 0x11, 0x0f, + 0x47, 0x2d, 0xc1, 0x0a, 0x07, 0x83, 0x35, 0xc8, 0x11, 0x84, 0xa7, 0x7d, 0xdc, 0xc3, 0xf7, 0xa3, 0xdb, 0x6c, 0x06, 0xea, 0x83, 0x76, 0x85, 0xe8, 0x5a, 0xd4, 0x2a, 0xe5, 0x7f, 0x9a, 0x6f, 0x2b, + 0xd8, 0xb6, 0x7e, 0xfa, 0x5d, 0xc6, 0x57, 0x2e, 0x80, 0xb0, 0xfc, 0xcf, 0xab, 0xf3, 0x48, 0x61, 0x95, 0x23, 0xc5, 0x23, 0xef, 0xd0, 0x06, 0xfd, 0xdc, 0x9e, 0x2e, 0xbe, 0x96, 0xc8, 0xfc, 0x18, + 0x68, 0xcf, 0xfc, 0xc2, 0x2e, 0xb5, 0xa5, 0x81, 0x41, 0xab, 0x2c, 0x2b, 0x67, 0x95, 0xa5, 0xa5, 0xd4, 0xb4, 0xc0, 0xb9, 0x3f, 0x9c, 0x99, 0x81, 0xc1, 0xae, 0x50, 0xc4, 0x93, 0x74, 0xae, 0x13, + 0x26, 0x15, 0x7c, 0x49, 0xc7, 0xcf, 0xd6, 0xb5, 0x7f, 0x47, 0x14, 0x69, 0x5f, 0xc9, 0x81, 0x90, 0xc7, 0x80, 0xf6, 0x86, 0xcf, 0x1b, 0x98, 0x60, 0xf9, 0x38, 0x31, 0xb8, 0x58, 0x6c, 0x37, 0x21, + 0x8c, 0xbf, 0xa4, 0x00, 0x36, 0xe7, 0xf5, 0xd4, 0xee, 0x29, 0xaf, 0x46, 0x45, 0x20, 0x15, 0x2e, 0xb1, 0xcc, 0x92, 0x3f, 0xbd, 0xae, 0xc6, 0xaa, 0x2a, 0x46, 0x77, 0x5e, 0xa5, 0x35, 0x23, 0x14, + 0x33, 0xdf, 0x1f, 0x37, 0x3b, 0x59, 0x32, 0x93, 0xce, 0x49, 0xa3, 0xbd, 0x3e, 0x65, 0x3d, 0x8a, 0x40, 0xf6, 0xb7, 0x25, 0x9c, 0x41, 0x9f, 0x1c, 0x05, 0xdc, 0x04, 0x6b, 0xe1, 0xda, 0x5d, 0x0c, + 0x75, 0x7b, 0xe8, 0x61, 0xfa, 0x99, 0xb0, 0xe8, 0x6a, 0x05, 0xaa, 0x8a, 0x95, 0xb6, 0x65, 0xc0, 0x35, 0x9b, 0x5c, 0xb2, 0x6f, 0x0b, 0xcf, 0x00, 0x46, 0xa8, 0x92, 0x83, 0x67, 0xb4, 0x89, 0x26, + 0xe5, 0x7b, 0x60, 0x84, 0x6b, 0xe5, 0x30, 0xee, 0x91, 0xef, 0x60, 0x04, 0x54, 0xd0, 0xc1, 0x0a, 0x3c, 0xb7, 0xf7, 0x85, 0xc6, 0xf1, 0x9c, 0x9b, 0xec, 0xd8, 0xd2, 0x9e, 0xc3, 0xaf, 0x57, 0x2c, + 0x9a, 0x26, 0x2c, 0x43, 0x97, 0xe7, 0xa5, 0xe8, 0xdb, 0x84, 0x48, 0x5d, 0xa0, 0x46, 0xea, 0xc6, 0x7f, 0x23, 0xa2, 0x96, 0x4c, 0x74, 0x5c, 0x84, 0x50, 0x6b, 0x8b, 0x30, 0x60, 0xb8, 0x78, 0x1b, + 0x3b, 0xbe, 0xc3, 0x62, 0x0d, 0xc4, 0x07, 0xe3, 0x1f, 0x9b, 0xcb, 0x6f, 0x83, 0x5f, 0x34, 0xbc, 0x14, 0x67, 0xb8, 0x4a, 0x50, 0xbf, 0xd5, 0x6b, 0x94, 0x7f, 0x32, 0x96, 0xf4, 0x94, 0xcc, 0x13, + 0x14, 0x10, 0x7c, 0xfc, 0x8b, 0x67, 0x1e, 0x91, 0xdc, 0x6a, 0xcf, 0x8a, 0xc8, 0x46, 0xfd, 0xbb, 0x12, 0xc2, 0x65, 0xba, 0xc2, 0x50, 0xcd, 0xaa, 0x6b, 0xa8, 0x38, 0x35, 0x09, 0xde, 0xd6, 0x24, + 0xeb, 0x3a, 0x85, 0x0c, 0x34, 0xbb, 0x76, 0x2a, 0xa1, 0xc8, 0x95, 0x29, 0xa2, 0x65, 0xd1, 0x39, 0x8f, 0x0e, 0x1c, 0xb7, 0xf9, 0x44, 0x39, 0xe2, 0x2a, 0xe1, 0x7e, 0x01, 0x7f, 0x06, 0x58, 0x22, + 0xfc, 0x42, 0x55, 0x29, 0x89, 0x32, 0x0d, 0xde, 0x5b, 0xe2, 0x47, 0xe5, 0x2e, 0xca, 0x8b, 0xca, 0x79, 0xf8, 0x2b, 0x9d, 0x15, 0xd0, 0x23, 0xea, 0xe6, 0x05, 0x3c, 0xf3, 0x02, 0xd1, 0xb3, 0x14, + 0xbb, 0x9c, 0xcd, 0xfd, 0x13, 0x2d, 0x28, 0x3d, 0xd1, 0xb6, 0x8c, 0xb0, 0x15, 0x50, 0xe4, 0x07, 0x86, 0xc5, 0xc8, 0x0e, 0xee, 0x74, 0x33, 0xba, 0xc5, 0x8d, 0xc9, 0xff, 0x7f, 0x9c, 0xb8, 0x2a, + 0x84, 0xf1, 0x6e, 0x7f, 0x6e, 0x2b, 0x8c, 0x24, 0xca, 0x7c, 0x7c, 0xb3, 0x8a, 0x54, 0xdf, 0xfa, 0x38, 0x8b, 0x2f, 0x27, 0xcb, 0x37, 0x42, 0x07, 0x1e, 0xfe, 0x57, 0x79, 0x14, 0x6c, 0x7b, 0x2b, + 0x0d, 0x4b, 0x1b, 0x2c, 0xc2, 0xc2, 0x75, 0x8b, 0x85, 0xdc, 0x51, 0x56, 0x30, 0x30, 0xdb, 0xd3, 0xf1, 0x9b, 0x1a, 0x3c, 0xf7, 0x0c, 0x5b, 0x0f, 0xcd, 0xad, 0x86, 0xb8, 0xe1, 0xd3, 0xe4, 0x22, + 0x6f, 0x38, 0x04, 0x9a, 0x86, 0x8f, 0x2c, 0xa5, 0x17, 0x3a, 0xfc, 0xef, 0x82, 0x4c, 0x20, 0x85, 0x82, 0xa1, 0x59, 0xf6, 0xeb, 0x1b, 0x62, 0xe1, 0xdc, 0xf7, 0x5d, 0x0d, 0x9b, 0xfa, 0x68, 0x0b, + 0xe6, 0x3c, 0xf9, 0xab, 0xbb, 0xfe, 0x02, 0xac, 0x7d, 0x4f, 0x09, 0x66, 0xdf, 0x23, 0x73, 0x4b, 0x24, 0x76, 0x6f, 0x67, 0x3c, 0x63, 0x22, 0x68, 0xed, 0xe6, 0x27, 0x44, 0x3a, 0x37, 0x34, 0x16, + 0x8c, 0xa8, 0xa8, 0x4d, 0x77, 0x1c, 0xae, 0xc6, 0x21, 0x09, 0x18, 0x81, 0x28, 0x4d, 0x6a, 0xe3, 0x91, 0x2d, 0xd3, 0x6b, 0xb3, 0x9d, 0x76, 0x47, 0x96, 0xa5, 0xa5, 0xe4, 0xea, 0x16, 0x18, 0x16, + 0x4d, 0x73, 0x93, 0x7f, 0xde, 0xa5, 0x21, 0xcc, 0x75, 0x71, 0x77, 0x45, 0x49, 0xfb, 0x44, 0x01, 0xb8, 0x2e, 0x14, 0xd9, 0xd5, 0x02, 0xa2, 0xf0, 0xb8, 0x19, 0x52, 0x6f, 0xcd, 0xc7, 0x8d, 0x0e, + 0x89, 0xc9, 0xa9, 0xb6, 0xc7, 0x3d, 0xa5, 0x2b, 0x52, 0x78, 0x26, 0xeb, 0x89, 0x13, 0xc5, 0x6e, 0x6a, 0xbb, 0xff, 0x90, 0x55, 0x30, 0x98, 0x82, 0x4d, 0xc8, 0xbf, 0x18, 0x9c, 0x7c, 0x5c, 0x12, + 0xf9, 0x93, 0xb7, 0xb9, 0x89, 0x88, 0x46, 0xb7, 0x8c, 0x85, 0x27, 0x90, 0x0b, 0x4f, 0xf4, 0xfd, 0x86, 0xed, 0x4d, 0xc2, 0xb9, 0x03, 0xb8, 0xef, 0x54, 0xd7, 0x58, 0xfb, 0xe5, 0x05, 0xa7, 0x0f, + 0x79, 0xe7, 0x6d, 0x1f, 0x5d, 0x89, 0x8d, 0x91, 0x6e, 0xb5, 0x17, 0x17, 0x18, 0x4b, 0xb6, 0xb6, 0x31, 0x25, 0x23, 0x7e, 0xe6, 0x56, 0x38, 0xb1, 0xfd, 0xca, 0xd8, 0xa0, 0x6f, 0xb1, 0xb7, 0x2d, + 0xd1, 0xc3, 0xb7, 0xef, 0x17, 0xe5, 0x2c, 0x30, 0x49, 0xed, 0x42, 0xbc, 0xd3, 0x3f, 0x76, 0x4c, 0xa8, 0x1c, 0xd5, 0x46, 0x43, 0x48, 0x23, 0x0f, 0x9e, 0xe4, 0x9d, 0xe9, 0xa8, 0x21, 0xee, 0x20, + 0x10, 0x7b, 0x22, 0xfd, 0x39, 0x25, 0xcc, 0xcc, 0x63, 0x4d, 0x38, 0xb6, 0xc6, 0xc7, 0xf5, 0x3c, 0x10, 0x04, 0xa6, 0x5e, 0xc2, 0xf1, 0xd9, 0x6c, 0x62, 0x89, 0x7c, 0xd5, 0x0c, 0x17, 0x64, 0x24, + 0x6e, 0x0e, 0x90, 0x19, 0xd2, 0x24, 0xe7, 0x5c, 0x9f, 0x06, 0x3a, 0x12, 0x0a, 0x3a, 0x42, 0x17, 0x7b, 0x1b, 0x47, 0x2e, 0x90, 0x3a, 0x1a, 0x67, 0xd8, 0x5e, 0xad, 0xe4, 0xe6, 0x2e, 0xd9, 0x18, + 0x3d, 0xee, 0x28, 0xca, 0xea, 0x58, 0xaa, 0xd5, 0xa8, 0x4f, 0x7b, 0xd9, 0xa9, 0xad, 0x1a, 0x1b, 0x3b, 0x59, 0x69, 0x75, 0x99, 0x6e, 0x4e, 0xf6, 0xc9, 0x77, 0x2f, 0xaa, 0x25, 0xeb, 0xe7, 0x06, + 0x22, 0x94, 0x48, 0x31, 0xb4, 0x33, 0xfe, 0xfd, 0x2a, 0x27, 0x82, 0xe6, 0x34, 0x04, 0x6a, 0xb4, 0xda, 0x05, 0x7e, 0x97, 0x9f, 0x99, 0xfc, 0x04, 0x91, 0xbe, 0xe3, 0xa6, 0x70, 0x36, 0x5f, 0x24, + 0x31, 0x67, 0xa9, 0x98, 0x17, 0xca, 0x27, 0x26, 0x10, 0xab, 0x5e, 0x4a, 0x26, 0x6c, 0x42, 0x01, 0x1b, 0xa0, 0x91, 0x96, 0x4e, 0x06, 0xb4, 0xf9, 0xc3, 0x27, 0xe5, 0x82, 0x4c, 0xe4, 0x38, 0x23, + 0xc2, 0xd8, 0x02, 0x5b, 0x53, 0xb7, 0xec, 0xca, 0x23, 0xfe, 0x7a, 0xd6, 0x13, 0xf6, 0xb0, 0x88, 0x59, 0x7b, 0x36, 0x2c, 0x05, 0xbe, 0x90, 0x3b, 0xd0, 0x4d, 0x3c, 0xc4, 0x64, 0xa9, 0x5b, 0x02, + 0xd0, 0xb8, 0x9b, 0x5e, 0x3d, 0xa6, 0x85, 0x52, 0x5d, 0xf7, 0x47, 0xde, 0x74, 0x30, 0xb7, 0x43, 0xb4, 0x66, 0xeb, 0xcf, 0x5b, 0xbb, 0x2f, 0xbf, 0x9d, 0xb9, 0xec, 0x59, 0x63, 0x92, 0x7a, 0x22, + 0xcd, 0x6f, 0x03, 0x40, 0xed, 0xc5, 0x76, 0xda, 0x80, 0x3e, 0xfe, 0x5c, 0x05, 0x5a, 0x9d, 0xb2, 0xf7, 0x67, 0x7d, 0x73, 0xb9, 0xda, 0xaf, 0x91, 0x80, 0xab, 0xc7, 0x35, 0x70, 0x98, 0x0e, 0x08, + 0xe2, 0x71, 0x9a, 0x5d, 0xac, 0xc7, 0x01, 0x2d, 0x7f, 0xb1, 0x17, 0xe8, 0x85, 0x20, 0xce, 0x48, 0x69, 0xfe, 0x61, 0xf8, 0xc4, 0xc6, 0xd2, 0x13, 0xcb, 0x87, 0x97, 0xfa, 0x27, 0x97, 0x7d, 0x28, + 0x86, 0xa2, 0x6e, 0xde, 0x17, 0xc1, 0xad, 0xb9, 0x28, 0x8b, 0x61, 0xc6, 0x73, 0x4f, 0xd8, 0x81, 0xdb, 0x18, 0xa8, 0x36, 0xdd, 0xc6, 0xa7, 0x03, 0x04, 0x7d, 0x54, 0x71, 0x76, 0x9c, 0xff, 0x0c, + 0xdf, 0x78, 0xc9, 0x3b, 0x93, 0x1b, 0x9b, 0x66, 0x3e, 0x6c, 0xea, 0xaa, 0x20, 0xf5, 0x46, 0x7c, 0x90, 0x7f, 0x0f, 0x09, 0x49, 0x45, 0xdb, 0x9b, 0x31, 0x39, 0x13, 0xbd, 0x6d, 0xbd, 0x1c, 0x23, + 0x0b, 0xa1, 0x09, 0x8f, 0x86, 0x13, 0xc8, 0x88, 0xaf, 0x9d, 0xe7, 0x84, 0x1a, 0x8c, 0x71, 0xf7, 0x4f, 0x58, 0x61, 0x94, 0x96, 0x48, 0xf2, 0xee, 0xf5, 0x32, 0x0d, 0xbf, 0x7b, 0xe1, 0x3f, 0x00, + 0x76, 0xbc, 0xd7, 0x41, 0xc7, 0xf0, 0x0e, 0x22, 0x32, 0xe8, 0x34, 0xbd, 0xbb, 0xb9, 0x79, 0x93, 0x2a, 0x7b, 0x02, 0x08, 0xe7, 0x10, 0x15, 0xf2, 0x77, 0x80, 0x23, 0xaa, 0x55, 0x82, 0x76, 0x13, + 0x60, 0x41, 0x04, 0x95, 0x2f, 0xcb, 0x24, 0xed, 0x23, 0x0c, 0xff, 0x1d, 0x6b, 0x59, 0xbf, 0xa0, 0x9d, 0x3f, 0xa7, 0xed, 0x17, 0xa7, 0x5f, 0x95, 0x30, 0x92, 0x73, 0x31, 0x31, 0xf2, 0xf3, 0x19, + 0xdc, 0x7d, 0xd3, 0xe8, 0x08, 0xe3, 0xc7, 0x09, 0x1e, 0xf9, 0x78, 0xfe, 0x92, 0xb9, 0x42, 0xc7, 0x34, 0x0e, 0x2d, 0xa8, 0x0e, 0x5e, 0x32, 0x76, 0x9d, 0xd2, 0x83, 0x38, 0x6b, 0x10, 0x24, 0x2b, + 0xfc, 0x19, 0x65, 0xfb, 0xfb, 0x6a, 0x0f, 0x9e, 0x25, 0x94, 0xe3, 0x19, 0x75, 0x9e, 0xf2, 0x10, 0x34, 0x4a, 0xea, 0x06, 0x8a, 0x14, 0x5e, 0xd3, 0xc9, 0x86, 0x9e, 0x0c, 0xd4, 0xe2, 0x0f, 0x00, + 0x89, 0x0e, 0x11, 0xb4, 0x40, 0xcc, 0x83, 0xca, 0x7c, 0x29, 0x05, 0x20, 0x27, 0xbb, 0x6b, 0x8e, 0xec, 0x52, 0x12, 0xf6, 0xf7, 0xe4, 0xab, 0xcc, 0x79, 0x9c, 0xcf, 0x37, 0x58, 0x2a, 0xae, 0x27, + 0x9c, 0xa1, 0x02, 0x5b, 0x31, 0xe5, 0x2e, 0x4e, 0x6f, 0xf6, 0x1f, 0xf7, 0x34, 0x61, 0x07, 0xa2, 0x67, 0x2a, 0x50, 0xc3, 0x64, 0x35, 0x87, 0xa4, 0x2b, 0xb3, 0x12, 0xda, 0xef, 0x4f, 0x68, 0x15, + 0xda, 0x1d, 0xe6, 0x55, 0x94, 0xd4, 0x0d, 0x76, 0x29, 0x5a, 0xe7, 0xf8, 0x5a, 0x80, 0x93, 0x56, 0x23, 0x46, 0x9a, 0x94, 0xc0, 0x40, 0x70, 0x6e, 0x2e, 0x9e, 0xec, 0x63, 0x60, 0x5f, 0x04, 0x21, + 0x10, 0xeb, 0x85, 0x30, 0xe5, 0xca, 0xf2, 0xbc, 0xce, 0xa4, 0xda, 0x62, 0x29, 0xd0, 0xad, 0x01, 0x74, 0xf4, 0x67, 0x54, 0xae, 0xc3, 0x35, 0xce, 0xe3, 0x30, 0x17, 0x31, 0xa0, 0x37, 0xff, 0x00, + 0xdd, 0x14, 0x7e, 0xe8, 0xbe, 0xd9, 0xf3, 0x62, 0xac, 0x3d, 0x55, 0x71, 0xa8, 0xe7, 0xc6, 0x5d, 0xf0, 0x9e, 0x69, 0x08, 0x7c, 0xb9, 0x47, 0x95, 0x50, 0xdb, 0x75, 0xad, 0x8d, 0xf6, 0xa8, 0x12, + 0xff, 0x20, 0xe9, 0x06, 0x8a, 0x8c, 0xba, 0xcf, 0xca, 0x72, 0x0c, 0x65, 0x86, 0xfe, 0x0d, 0x4f, 0x28, 0x59, 0x90, 0xae, 0xe4, 0x42, 0x69, 0xf3, 0x4a, 0x06, 0x8c, 0xe6, 0x1d, 0x81, 0x44, 0x04, + 0x50, 0x3d, 0xa4, 0xd6, 0x1d, 0xc4, 0xb6, 0x40, 0xe5, 0xfa, 0x2f, 0x78, 0x60, 0x1e, 0xf6, 0x4c, 0x0c, 0xec, 0xac, 0x42, 0x09, 0x5d, 0xb6, 0x05, 0x67, 0x20, 0xa7, 0xf1, 0x3d, 0x76, 0xc1, 0x21, + 0x69, 0x1e, 0xd8, 0xc2, 0x81, 0x88, 0xcf, 0x92, 0x99, 0x8f, 0x34, 0xfd, 0xc6, 0x27, 0x2e, 0x50, 0xa1, 0x1e, 0xd2, 0x31, 0x80, 0x60, 0x48, 0xd7, 0x74, 0x54, 0xa0, 0x55, 0x04, 0x34, 0x75, 0x25, + 0x0e, 0x76, 0x19, 0x1b, 0xe0, 0xc5, 0xc5, 0x97, 0xe3, 0x0b, 0x87, 0x89, 0x5b, 0xc4, 0x1b, 0xf7, 0xf0, 0xe3, 0x23, 0x34, 0xad, 0x61, 0x20, 0x37, 0x49, 0xb5, 0x8e, 0x02, 0xb2, 0x01, 0xf5, 0x08, + 0x54, 0xbb, 0xab, 0x0d, 0xc9, 0x54, 0x2b, 0xaa, 0x59, 0x17, 0x81, 0x5b, 0xd3, 0xf1, 0x6f, 0xe4, 0xbd, 0x67, 0x37, 0x0b, 0xfb, 0x6e, 0x13, 0x94, 0x6c, 0xa3, 0x9f, 0xeb, 0x75, 0x22, 0xb6, 0x05, + 0x58, 0x4d, 0x74, 0xc4, 0xac, 0x98, 0xbb, 0x70, 0x7b, 0x81, 0xce, 0xb9, 0xd9, 0xac, 0xd7, 0xc7, 0xd0, 0x3b, 0x60, 0x54, 0x33, 0x0c, 0x3f, 0x92, 0x38, 0xb5, 0xa9, 0xc1, 0x5d, 0xec, 0x19, 0x05, + 0x82, 0x1e, 0x1e, 0xe9, 0xce, 0x9d, 0x89, 0xaa, 0x59, 0x53, 0x87, 0x48, 0x8c, 0xe0, 0xd9, 0x0e, 0x2e, 0x4b, 0xf3, 0x89, 0x91, 0x04, 0x73, 0xfb, 0xb1, 0x93, 0x67, 0x85, 0xa9, 0xa0, 0x49, 0x15, + 0x6d, 0x6d, 0xb4, 0xf6, 0xf1, 0x47, 0xc3, 0x06, 0x5a, 0x1b, 0x73, 0x2a, 0x4f, 0x3a, 0xb3, 0x58, 0xe4, 0xb2, 0x6b, 0x5a, 0x09, 0x8b, 0x94, 0x7b, 0xd9, 0x6b, 0x93, 0xf7, 0x3f, 0x1e, 0x19, 0x06, + 0x5b, 0xf2, 0x95, 0x63, 0x47, 0x96, 0x6c, 0xdb, 0x06, 0x81, 0x1f, 0x91, 0x7d, 0xdd, 0xa7, 0xa3, 0x94, 0x03, 0x6b, 0x18, 0xea, 0xbb, 0xaf, 0x41, 0x03, 0x93, 0xb4, 0x70, 0x0c, 0x69, 0x3d, 0x2a, + 0xb0, 0xc5, 0x05, 0x95, 0x3c, 0x92, 0x4b, 0xb2, 0xef, 0x74, 0xa1, 0xd1, 0x6e, 0x8b, 0x8a, 0x2a, 0x86, 0x3b, 0xdc, 0x22, 0xd4, 0x17, 0xd7, 0x41, 0x20, 0x37, 0x5f, 0x0b, 0x7a, 0x9a, 0xd3, 0x04, + 0x26, 0x5b, 0x06, 0x64, 0x8e, 0x07, 0x86, 0x89, 0x70, 0xf1, 0x81, 0x0f, 0xb5, 0xa5, 0xc5, 0xad, 0x50, 0x6f, 0x86, 0x19, 0xd3, 0x80, 0xbf, 0x7b, 0x28, 0x3e, 0x40, 0x2d, 0x89, 0x47, 0x3b, 0x08, + 0xd8, 0x32, 0x31, 0x21, 0xc8, 0x82, 0x76, 0x76, 0xb9, 0x00, 0xdb, 0xd5, 0x57, 0x8e, 0xec, 0x7b, 0x3e, 0xbf, 0x38, 0xa6, 0x57, 0x75, 0x65, 0xad, 0x08, 0x3f, 0x94, 0x62, 0x41, 0x72, 0x4b, 0x1c, + 0xf1, 0x95, 0x91, 0x0f, 0x01, 0xd6, 0xfa, 0x34, 0x42, 0xda, 0x44, 0x46, 0x2a, 0xe2, 0x68, 0xe5, 0x74, 0xea, 0x33, 0x70, 0x19, 0xbf, 0x56, 0x40, 0x89, 0x01, 0xe3, 0x27, 0x42, 0x61, 0x35, 0x20, + 0x45, 0x85, 0x15, 0x63, 0x5c, 0x8a, 0xf8, 0xd3, 0x00, 0xb3, 0x4d, 0x83, 0x85, 0x62, 0x40, 0x28, 0x55, 0x15, 0xe3, 0x34, 0xe7, 0xf7, 0x0a, 0x62, 0x0e, 0x56, 0xa0, 0x25, 0x8d, 0xe2, 0x67, 0x28, + 0x77, 0x9b, 0xbc, 0x46, 0xde, 0x89, 0x0a, 0x8e, 0x71, 0x0b, 0x0b, 0x65, 0x29, 0x95, 0x22, 0x4d, 0x57, 0x9c, 0x05, 0x35, 0x3f, 0x67, 0x7c, 0x81, 0xae, 0x67, 0x9b, 0x83, 0x98, 0xba, 0x9a, 0x2d, + 0x23, 0x28, 0x56, 0x15, 0x76, 0x12, 0x06, 0xe1, 0xdb, 0x66, 0xcb, 0x00, 0x6c, 0xa9, 0x95, 0xd0, 0x8c, 0x5f, 0x20, 0xed, 0x9e, 0x21, 0x34, 0x1c, 0x2c, 0x4a, 0xbd, 0x5a, 0xb3, 0xdc, 0x20, 0x26, + 0x9d, 0x9f, 0xda, 0x88, 0xd0, 0x46, 0x5b, 0x69, 0xb6, 0xa8, 0x53, 0x68, 0x00, 0xd3, 0xbe, 0xeb, 0x7a, 0xba, 0x65, 0x74, 0x14, 0x14, 0xb4, 0xcd, 0x66, 0x7b, 0xf3, 0x51, 0xff, 0x93, 0x96, 0x18, + 0x80, 0x1d, 0x11, 0x6a, 0xb6, 0xba, 0x96, 0x38, 0xd4, 0x68, 0xef, 0xab, 0xf0, 0x3a, 0x0b, 0x3c, 0x72, 0x61, 0x26, 0xc5, 0x36, 0xee, 0x0a, 0x4b, 0x91, 0x09, 0xa3, 0x7a, 0xb6, 0x0b, 0xcf, 0x0d, + 0xd5, 0x6e, 0x67, 0xf6, 0x05, 0x7c, 0x6c, 0x96, 0xb0, 0xe7, 0xc5, 0xcf, 0x4b, 0x73, 0xdf, 0x55, 0x3d, 0xde, 0x77, 0x85, 0x46, 0x21, 0xe4, 0xde, 0x1b, 0xb8, 0xca, 0x76, 0xc6, 0xba, 0x7a, 0x20, + 0x8b, 0xf6, 0x81, 0x3a, 0x5b, 0x33, 0xed, 0x7b, 0x82, 0xcb, 0x8b, 0x9d, 0x08, 0xb8, 0x04, 0xf4, 0xbe, 0x7e, 0xa5, 0xd6, 0xac, 0x6c, 0xe5, 0xa1, 0x66, 0x0c, 0xc4, 0x9c, 0x66, 0x51, 0x27, 0x07, + 0x31, 0x3b, 0x7a, 0x19, 0x5e, 0xf4, 0xc5, 0xc6, 0x79, 0xa1, 0x02, 0x71, 0x0f, 0xe7, 0xac, 0x3d, 0xd3, 0x39, 0x01, 0x47, 0xf4, 0x0e, 0x6a, 0xdc, 0x05, 0x65, 0xab, 0x2f, 0x6e, 0x61, 0xd0, 0x2d, + 0x1c, 0x42, 0xe5, 0x5d, 0xe8, 0x7b, 0xe9, 0xa6, 0x79, 0xfd, 0x49, 0xdc, 0x9b, 0x87, 0x0c, 0x09, 0x4d, 0xfc, 0xe1, 0xbe, 0x59, 0xa0, 0x74, 0x97, 0x22, 0x10, 0x9b, 0x0c, 0xa5, 0x0c, 0x6d, 0x2b, + 0xac, 0xd7, 0xb2, 0x84, 0x52, 0x93, 0xbe, 0xb3, 0x2e, 0x06, 0x46, 0x65, 0xf2, 0xd2, 0x0e, 0xe3, 0x0a, 0xb5, 0x8c, 0x96, 0xb5, 0xc6, 0x3a, 0x71, 0xa3, 0x68, 0xa3, 0x27, 0x77, 0x94, 0x15, 0x13, + 0xbc, 0xf7, 0x7a, 0xbb, 0xcd, 0x2b, 0x82, 0xbf, 0x57, 0xdc, 0x4b, 0x0f, 0xd1, 0x85, 0xc8, 0x05, 0xf9, 0xee, 0x80, 0x51, 0x01, 0x28, 0x54, 0xd4, 0x5d, 0x80, 0x9e, 0x60, 0x8a, 0x01, 0x50, 0x2c, + 0xd4, 0x6e, 0xe2, 0xc5, 0xc6, 0xd5, 0x1e, 0xe5, 0xb6, 0xb3, 0xb1, 0xeb, 0xf6, 0x96, 0x98, 0x0e, 0x1f, 0x85, 0x70, 0x54, 0x0b, 0x8a, 0x10, 0xfb, 0x63, 0xa9, 0xdb, 0xbe, 0x5b, 0xc1, 0x51, 0x1a, + 0x57, 0x27, 0x95, 0xed, 0x37, 0x48, 0x22, 0xdd, 0x6e, 0xce, 0xbd, 0xe5, 0xd2, 0x82, 0x79, 0x45, 0x70, 0x3d, 0xb0, 0x5d, 0x21, 0x49, 0x39, 0x1a, 0x2b, 0xdb, 0xea, 0x8c, 0x96, 0x70, 0x1a, 0x22, + 0x36, 0x0b, 0xed, 0xdd, 0x69, 0xa6, 0x28, 0x36, 0x06, 0xdc, 0x51, 0x2b, 0x12, 0xb7, 0xc7, 0xc3, 0x06, 0x9d, 0xbd, 0x8c, 0xa3, 0xb6, 0xcc, 0x99, 0x5c, 0x66, 0xfe, 0xad, 0x53, 0x67, 0x53, 0x11, + 0x9e, 0x47, 0x61, 0x5c, 0xfe, 0xb8, 0xf6, 0xb4, 0xfd, 0xdb, 0xa2, 0xe9, 0x3a, 0x44, 0x0b, 0xb5, 0x8f, 0xd5, 0x6e, 0x14, 0xbd, 0x12, 0xb2, 0x12, 0x0a, 0xe5, 0x96, 0x07, 0xf3, 0x97, 0x18, 0x03, + 0x9a, 0x75, 0x0d, 0xed, 0xff, 0x70, 0xd1, 0xe6, 0xe7, 0x6f, 0xa9, 0x4b, 0xc1, 0xc9, 0xc1, 0x13, 0xfa, 0x68, 0xdb, 0x6d, 0x2c, 0x35, 0x77, 0x8d, 0xa3, 0x12, 0x20, 0x2c, 0x93, 0xaf, 0x56, 0x1f, + 0xdf, 0x95, 0xed, 0x7a, 0xe5, 0x8f, 0x2f, 0xb0, 0xe4, 0x86, 0xc6, 0x3c, 0x9c, 0x74, 0x54, 0x88, 0x10, 0xd2, 0x98, 0x48, 0x58, 0xe6, 0x72, 0xcf, 0x8b, 0x50, 0xcb, 0xe8, 0xda, 0x95, 0xcd, 0x1e, + 0xaf, 0x5c, 0x34, 0xfd, 0x67, 0x2e, 0xf0, 0x4a, 0x0a, 0x8f, 0xc2, 0xd9, 0x41, 0x4a, 0x70, 0x10, 0x12, 0x88, 0x2b, 0x9d, 0x3d, 0xc3, 0x68, 0x1f, 0x72, 0x7c, 0xc2, 0x28, 0xa8, 0xba, 0xfa, 0x02, + 0xe4, 0xd6, 0x12, 0x9b, 0xc5, 0x37, 0x74, 0x6c, 0x76, 0x5e, 0xd7, 0x43, 0x66, 0xc3, 0xae, 0x2c, 0xe7, 0x0e, 0x33, 0x44, 0x6e, 0xf1, 0x1a, 0x92, 0xc2, 0x37, 0x3c, 0x07, 0x3d, 0xfc, 0xa2, 0x1d, + 0x17, 0x5d, 0xeb, 0xa0, 0x44, 0x8c, 0x86, 0x70, 0x93, 0x83, 0xf3, 0xfe, 0x40, 0x8e, 0x19, 0x7c, 0x54, 0x2f, 0x73, 0x2f, 0x42, 0xd4, 0x20, 0x56, 0x4d, 0xcb, 0x03, 0xea, 0x40, 0x0f, 0xe2, 0x1e, + 0xcc, 0xa9, 0x96, 0x8c, 0xe9, 0x27, 0x5f, 0x8b, 0xe0, 0x74, 0x72, 0x4d, 0x4c, 0x57, 0x3b, 0xe9, 0xe4, 0x39, 0xde, 0xe5, 0xa8, 0x85, 0x52, 0xc1, 0x6c, 0xac, 0x94, 0x2a, 0x7d, 0xdb, 0x79, 0x1c, + 0x8d, 0x4d, 0x4b, 0xbd, 0xbd, 0x4f, 0x2b, 0x54, 0xab, 0x8c, 0x39, 0x1b, 0x11, 0xe7, 0x23, 0x23, 0x77, 0x05, 0x89, 0x3f, 0xb4, 0x23, 0x62, 0xd4, 0x9b, 0x51, 0xe3, 0x3d, 0x13, 0x23, 0x93, 0x03, + 0xe3, 0x88, 0xce, 0x99, 0x4f, 0x32, 0x1e, 0xc8, 0x0e, 0x40, 0x4a, 0x4c, 0x5d, 0xfb, 0x96, 0x7f, 0xe6, 0xa1, 0x3d, 0xca, 0x5c, 0xf9, 0x51, 0x57, 0xd8, 0xfe, 0x78, 0x67, 0x34, 0x1c, 0xe2, 0x02, + 0x2b, 0x91, 0x01, 0x1f, 0x5e, 0x68, 0xd7, 0x80, 0x4b, 0x3b, 0xe8, 0xa2, 0x37, 0xa3, 0x8e, 0x80, 0x47, 0x9c, 0xe0, 0xe8, 0x76, 0x90, 0x1f, 0x96, 0xd9, 0xab, 0x9b, 0x6b, 0xbd, 0x99, 0x41, 0x17, + 0x14, 0x6d, 0x83, 0xe2, 0xa8, 0xa0, 0xec, 0xa9, 0xe8, 0x99, 0xc7, 0x8a, 0x06, 0x81, 0x4e, 0xf8, 0x8d, 0xcc, 0x33, 0x2c, 0xfd, 0x76, 0x6d, 0x35, 0x6a, 0xd7, 0x5e, 0xd1, 0x2b, 0xcc, 0xa0, 0x29, + 0x4a, 0x48, 0x3f, 0x94, 0x90, 0xad, 0x46, 0xdc, 0xf8, 0xce, 0xd8, 0xb8, 0x5e, 0x65, 0x84, 0x75, 0x66, 0x69, 0x85, 0x7f, 0x9a, 0x09, 0x3c, 0xc2, 0x56, 0xef, 0x80, 0xe0, 0x95, 0x6a, 0x13, 0x05, + 0x3c, 0x09, 0x13, 0x9f, 0x00, 0x1b, 0x05, 0x81, 0x6e, 0xbd, 0x34, 0x27, 0xdf, 0x07, 0xd8, 0xbd, 0xe9, 0x27, 0xa6, 0x03, 0x76, 0x45, 0x9a, 0xdf, 0xee, 0x5a, 0xbf, 0x7a, 0x35, 0xe3, 0x20, 0x28, + 0x6c, 0x27, 0x20, 0xda, 0x2f, 0xa8, 0xca, 0x4e, 0xaa, 0xe0, 0x7b, 0x9d, 0x54, 0xdd, 0xf9, 0xf0, 0x16, 0x57, 0x64, 0x44, 0xaf, 0xc0, 0x9a, 0x62, 0x31, 0x87, 0xad, 0x1b, 0x63, 0x6b, 0x5e, 0x20, + 0xe2, 0x91, 0xee, 0x04, 0x1f, 0xe0, 0xc8, 0x7a, 0x84, 0x22, 0x70, 0x5f, 0xaa, 0x6d, 0x13, 0xd6, 0x59, 0xea, 0x84, 0x9f, 0x92, 0xc9, 0x09, 0xf8, 0x30, 0x6e, 0x42, 0xd7, 0x4d, 0xab, 0xb9, 0x1e, + 0x0c, 0x8b, 0x1d, 0x44, 0x65, 0xfb, 0x13, 0x4c, 0x8b, 0xba, 0x9b, 0x01, 0x0c, 0xc3, 0x85, 0x15, 0x6d, 0xfe, 0xe0, 0xff, 0xc1, 0x88, 0x01, 0x4e, 0xa2, 0xb9, 0xf5, 0x53, 0x92, 0xf5, 0x89, 0x2d, + 0xf3, 0x96, 0x84, 0xb7, 0x36, 0x79, 0x93, 0x7d, 0x5b, 0x62, 0xa3, 0x23, 0xe0, 0x3e, 0x4a, 0x17, 0x23, 0x7d, 0xfd, 0x49, 0xea, 0x39, 0x3d, 0xd0, 0x25, 0x69, 0x39, 0xfc, 0x4a, 0x2d, 0xba, 0x2b, + 0xbd, 0x9c, 0x34, 0xd3, 0x60, 0xf5, 0x53, 0x5f, 0x52, 0xe5, 0x39, 0xfa, 0xea, 0x39, 0x8a, 0x18, 0x56, 0x23, 0x6a, 0x79, 0x10, 0x2a, 0xca, 0xe2, 0xa9, 0x4c, 0x2d, 0x60, 0x8b, 0xa5, 0x59, 0x0e, + 0xa7, 0x89, 0xe7, 0x00, 0x9f, 0xbc, 0x8f, 0xef, 0x57, 0x01, 0x2c, 0xc1, 0x56, 0x95, 0xc2, 0xc8, 0x32, 0x6c, 0x45, 0x8c, 0x8f, 0x9d, 0xdb, 0xe8, 0x4f, 0x72, 0x61, 0x05, 0x78, 0x83, 0xc1, 0x1c, + 0x32, 0xed, 0xe7, 0xff, 0xb5, 0x19, 0x3e, 0xfd, 0xe7, 0xda, 0xc0, 0xc4, 0xaa, 0x17, 0x1a, 0x62, 0xf8, 0xa1, 0x5b, 0xf5, 0x68, 0x89, 0xde, 0x8d, 0x77, 0xfd, 0x04, 0x1f, 0x82, 0x20, 0x41, 0x05, + 0xa9, 0x04, 0x4d, 0xd7, 0xc9, 0x78, 0x23, 0xc9, 0x13, 0x75, 0x22, 0xf3, 0xe2, 0x1e, 0xae, 0xa6, 0x3a, 0xc1, 0x0b, 0x71, 0x38, 0xd6, 0xab, 0x60, 0xd8, 0x61, 0x8c, 0x85, 0x3a, 0x89, 0x02, 0x1f, + 0x78, 0x40, 0x0a, 0xd2, 0xed, 0x1e, 0xba, 0x39, 0x13, 0xfd, 0x06, 0x5b, 0xed, 0x74, 0x20, 0x1c, 0x85, 0x8c, 0xfb, 0x1d, 0x4f, 0x86, 0x93, 0xca, 0x93, 0x2d, 0xcd, 0x8b, 0x91, 0xfd, 0x71, 0x03, + 0x0a, 0xf1, 0xd3, 0xaf, 0x45, 0xe7, 0x96, 0xc1, 0xfb, 0x73, 0x9a, 0x6b, 0x72, 0x78, 0x67, 0xe7, 0xbe, 0xcd, 0x59, 0x9f, 0x13, 0x33, 0x5f, 0x1b, 0x18, 0xcc, 0x1c, 0xfc, 0x1a, 0xb6, 0x3f, 0x1f, + 0xfd, 0xc9, 0x64, 0x0d, 0xfa, 0xfd, 0x92, 0x46, 0x22, 0xd7, 0x1d, 0x50, 0xbb, 0xbe, 0x6a, 0x63, 0xe9, 0x44, 0xe4, 0x96, 0xa7, 0xdc, 0x1a, 0x31, 0xf4, 0x16, 0xa7, 0xea, 0x1f, 0xb6, 0x6a, 0x1f, + 0x89, 0x35, 0x66, 0x7e, 0xb3, 0x63, 0x4c, 0x97, 0xab, 0x4e, 0x88, 0xbc, 0x0b, 0x88, 0x66, 0x75, 0x16, 0x97, 0x48, 0x46, 0xd3, 0x49, 0x00, 0x3a, 0xe7, 0x31, 0x0f, 0x7c, 0xa1, 0x08, 0xbc, 0x0b, + 0x5c, 0x26, 0x8f, 0x36, 0x5e, 0x6b, 0x2d, 0x70, 0xd5, 0xb7, 0x19, 0xde, 0xfe, 0xf0, 0xa8, 0xf8, 0x81, 0x80, 0x67, 0x14, 0x30, 0x97, 0x5d, 0x03, 0xb2, 0xff, 0x7c, 0xf9, 0x68, 0x6c, 0x6e, 0x2f, + 0x93, 0x9b, 0x8e, 0xe5, 0x1f, 0x89, 0x5d, 0x14, 0x2f, 0x91, 0xc5, 0xde, 0x77, 0x49, 0x1b, 0x24, 0xb5, 0x76, 0x60, 0x07, 0xc9, 0x42, 0xb8, 0xe2, 0xa3, 0xeb, 0x59, 0x30, 0x66, 0xe0, 0xea, 0x10, + 0xb5, 0x37, 0xc7, 0x4f, 0x17, 0xe8, 0xb6, 0xed, 0xe5, 0x51, 0xef, 0x5f, 0x2d, 0x1c, 0x7c, 0x49, 0xca, 0xaa, 0x99, 0xdc, 0xaa, 0xeb, 0xb4, 0xfb, 0x51, 0x40, 0xc1, 0x6c, 0xec, 0x4b, 0x23, 0x0f, + 0x9a, 0x9f, 0xb0, 0xfc, 0x7f, 0xda, 0x0f, 0x41, 0x21, 0x9f, 0xf3, 0x07, 0xdf, 0x7f, 0xcb, 0x2d, 0xe0, 0xd7, 0x53, 0x46, 0x57, 0xee, 0x13, 0xf0, 0x03, 0x07, 0x23, 0xa5, 0x7d, 0xa6, 0xd7, 0x11, + 0x32, 0x34, 0x84, 0x46, 0x76, 0xd1, 0xb8, 0x31, 0x82, 0xcf, 0x7d, 0xdb, 0x98, 0xba, 0xf9, 0x71, 0x07, 0x72, 0x2b, 0x73, 0xbd, 0xa6, 0xb4, 0x94, 0xe0, 0xf1, 0x44, 0x54, 0x2c, 0x56, 0xee, 0x0f, + 0xd3, 0x47, 0xe0, 0x0c, 0xe3, 0x42, 0x88, 0x45, 0xa8, 0xd0, 0x70, 0x58, 0xc0, 0x0c, 0x9e, 0x71, 0x2c, 0x30, 0x16, 0x26, 0x20, 0xd3, 0x63, 0x77, 0x3a, 0x60, 0xa9, 0xe3, 0x67, 0x64, 0x07, 0x0a, + 0xf9, 0xdd, 0x34, 0x62, 0x19, 0xe1, 0xb2, 0xd1, 0xad, 0x72, 0x8c, 0xae, 0x6a, 0x98, 0xd3, 0xe2, 0x06, 0x20, 0xa3, 0x4e, 0xf5, 0xf6, 0xac, 0x7f, 0x31, 0x20, 0x52, 0x81, 0x34, 0x3d, 0x73, 0x1c, + 0xa9, 0xa3, 0xd5, 0x8d, 0xd8, 0xca, 0x5e, 0xe6, 0x73, 0x10, 0xb7, 0x63, 0xfd, 0x70, 0x1d, 0xee, 0x73, 0xc3, 0x70, 0xa7, 0xcb, 0x2e, 0x0b, 0x79, 0xe7, 0xb1, 0x94, 0x69, 0x68, 0x4f, 0x6d, 0x18, + 0x13, 0xc3, 0x44, 0xcf, 0xcb, 0xd1, 0xe0, 0x16, 0xdb, 0xe1, 0x9d, 0xbf, 0x83, 0xb1, 0xfa, 0x48, 0xbb, 0x73, 0x1b, 0x98, 0x45, 0xd5, 0x6c, 0x7d, 0x99, 0xb4, 0xcc, 0xd3, 0x77, 0xd2, 0xd1, 0x12, + 0xdd, 0x5b, 0x80, 0xd6, 0x42, 0x78, 0x70, 0x45, 0x94, 0xea, 0xa7, 0x2b, 0x5b, 0xee, 0xd1, 0x94, 0xd5, 0x89, 0x31, 0x7d, 0x25, 0x34, 0x32, 0x75, 0xa5, 0x33, 0xc7, 0xab, 0x40, 0x97, 0x16, 0x16, + 0xb1, 0x32, 0x96, 0xaf, 0x4d, 0x2f, 0x4c, 0x9f, 0x7c, 0xa5, 0xe8, 0xad, 0x45, 0x6a, 0x43, 0x09, 0xcc, 0x9c, 0xd3, 0x9d, 0x6e, 0x14, 0xaa, 0x83, 0xb5, 0x1c, 0xc3, 0x2f, 0x9b, 0xd9, 0x66, 0x25, + 0xda, 0xdc, 0xaa, 0x91, 0x4f, 0x2a, 0x9a, 0x85, 0xd9, 0x63, 0x9d, 0xb9, 0x6e, 0xcc, 0x96, 0xa8, 0xc4, 0x6f, 0xb3, 0xe6, 0xda, 0xba, 0x2c, 0x96, 0x31, 0x1f, 0x4e, 0xb2, 0xa6, 0x2b, 0x6f, 0x14, + 0xea, 0x17, 0xce, 0xa1, 0x33, 0xa1, 0x5b, 0x2b, 0x6b, 0x78, 0x6c, 0x5a, 0xc8, 0x16, 0x42, 0xd5, 0xb0, 0x7f, 0x94, 0xac, 0xc2, 0xb6, 0x75, 0xe2, 0xb5, 0x9b, 0x37, 0xf6, 0xe9, 0xae, 0xd5, 0x2a, + 0xa7, 0x83, 0x6d, 0x76, 0xd0, 0x65, 0x90, 0x66, 0xaf, 0x55, 0xb9, 0xa0, 0x89, 0xe3, 0xac, 0xbf, 0x02, 0xf9, 0xc4, 0x28, 0x7e, 0x4e, 0x7c, 0x87, 0x8c, 0xe1, 0x10, 0xf1, 0x8e, 0xf0, 0xcd, 0x2f, + 0x6a, 0xc0, 0x85, 0xd6, 0xcb, 0x84, 0xca, 0x8c, 0xdd, 0xe4, 0x06, 0xb1, 0x2f, 0xd6, 0x49, 0x8f, 0x3a, 0x9d, 0x9c, 0x6d, 0xf0, 0x02, 0xf4, 0x55, 0x0c, 0xc2, 0xfa, 0x99, 0xde, 0x57, 0x9f, 0x2d, + 0x03, 0x2e, 0x63, 0xf3, 0xec, 0x96, 0xff, 0x01, 0x72, 0x5d, 0x75, 0xee, 0xa4, 0xe7, 0xb1, 0xce, 0xeb, 0x94, 0xe1, 0x09, 0xc9, 0x0f, 0xd6, 0x8e, 0x99, 0x61, 0x41, 0x3e, 0xc1, 0x9f, 0x03, 0x1c, + 0x02, 0x02, 0x02, 0xfd, 0xdb, 0x57, 0x5d, 0xef, 0xa3, 0xdb, 0xec, 0x24, 0x10, 0x4a, 0xfe, 0x8c, 0xb5, 0xbc, 0x17, 0x8d, 0xea, 0x6a, 0x4b, 0xb0, 0x5d, 0x3e, 0xaf, 0xca, 0x6e, 0xad, 0xf2, 0x17, + 0x06, 0x14, 0xa2, 0xe0, 0x26, 0xe8, 0x15, 0x87, 0x86, 0x22, 0xb8, 0x79, 0xb3, 0xd6, 0x6c, 0x76, 0xa6, 0x98, 0x6a, 0x4b, 0x28, 0x61, 0x89, 0x37, 0x8b, 0x45, 0xab, 0x7e, 0xe2, 0xc1, 0x6e, 0x19, + 0x96, 0xa8, 0x48, 0xf8, 0xf3, 0x84, 0x66, 0x38, 0x4b, 0x60, 0x02, 0x3a, 0x41, 0x58, 0x71, 0x7f, 0x08, 0xb2, 0x20, 0x0f, 0xa7, 0xcf, 0xbe, 0x99, 0xac, 0xfb, 0xc4, 0x34, 0x2d, 0xfa, 0x9a, 0x10, + 0x7c, 0xb3, 0x2f, 0x28, 0xd3, 0x08, 0xe6, 0xcf, 0x5b, 0x8f, 0xc3, 0x49, 0x37, 0x01, 0xfe, 0x9b, 0xc1, 0xa8, 0x11, 0x8c, 0x6b, 0x26, 0xef, 0x51, 0xe9, 0xf7, 0xf2, 0xaa, 0xcb, 0xfc, 0x8b, 0x14, + 0x40, 0x1e, 0x91, 0x98, 0xda, 0x12, 0xac, 0xc5, 0x2e, 0x31, 0x7e, 0xf7, 0xb4, 0x3c, 0x06, 0x40, 0x41, 0xd3, 0xb6, 0xb7, 0x84, 0xb6, 0x03, 0x7e, 0xc8, 0xd5, 0x1e, 0x8d, 0x1a, 0xd1, 0x25, 0x0a, + 0x26, 0xc5, 0x70, 0xeb, 0x8e, 0x7d, 0x92, 0xa5, 0xbf, 0xe2, 0x17, 0x59, 0x9d, 0x0a, 0x5d, 0x3e, 0x8a, 0x3a, 0x06, 0x89, 0xda, 0x26, 0xf1, 0x43, 0x91, 0x9b, 0x1a, 0xbb, 0x50, 0xd8, 0x79, 0x24, + 0x81, 0x17, 0x33, 0xca, 0x02, 0x64, 0x4f, 0x76, 0x9c, 0xb9, 0x4c, 0x03, 0x5c, 0x1e, 0x30, 0x15, 0x7a, 0xf6, 0xa2, 0xa2, 0xca, 0xa1, 0xd8, 0xcb, 0xfa, 0xf6, 0x02, 0x29, 0xe6, 0x07, 0x51, 0x11, + }; + } + + + namespace t20 { + int internal_rounds = 57; + + int alpha = 5; + + unsigned char mat_diag_m_1[] = { + 0x95, 0x94, 0xf6, 0xe2, 0x1e, 0x94, 0x1e, 0x70, 0xad, 0xd3, 0x22, 0x26, 0x86, 0xc8, 0x99, 0xef, 0xcc, 0x63, 0x27, 0xfc, 0xd5, 0xb1, 0x18, 0x22, 0x86, 0xd4, 0x1d, 0xd0, 0x5c, 0x16, 0x47, 0x12, + 0x6c, 0x0e, 0xc2, 0xf2, 0xb7, 0xc6, 0xf6, 0x08, 0xd2, 0xdf, 0xbe, 0x9e, 0xd0, 0x12, 0x29, 0xf3, 0x86, 0x84, 0xe7, 0x5e, 0xa0, 0xfb, 0x05, 0xf2, 0x34, 0xf1, 0xb0, 0xe3, 0x46, 0xcc, 0x50, 0x05, + 0xa8, 0x3c, 0xcb, 0xfd, 0xb5, 0x09, 0x0b, 0x35, 0x77, 0x7e, 0x2f, 0xd4, 0x70, 0x3a, 0x95, 0xd2, 0x1c, 0xfb, 0xc8, 0x0c, 0x65, 0x6f, 0xf3, 0xc3, 0x9c, 0xf3, 0x39, 0x1c, 0xa0, 0xf1, 0x64, 0x0e, + 0x1d, 0x21, 0xdd, 0x57, 0x20, 0x03, 0xcf, 0x4f, 0x8b, 0xea, 0x49, 0x43, 0x10, 0x9f, 0x2e, 0xd5, 0x86, 0x41, 0xe8, 0xd9, 0xb6, 0xee, 0x93, 0x89, 0x0f, 0x4d, 0x4c, 0x74, 0x4c, 0x57, 0x97, 0x18, + 0x0e, 0xed, 0x36, 0xbe, 0x94, 0x74, 0x14, 0x50, 0x8e, 0x4d, 0x70, 0x8b, 0x76, 0x88, 0x3b, 0xc9, 0xf2, 0x50, 0x77, 0x27, 0x1d, 0xee, 0xff, 0x32, 0x73, 0xf4, 0x8b, 0x9c, 0x4b, 0xb6, 0xb1, 0x13, + 0xbf, 0x86, 0xd1, 0xfb, 0x98, 0xd0, 0x61, 0xea, 0x58, 0x1c, 0x9f, 0xef, 0x92, 0x97, 0x0d, 0x9e, 0x76, 0x0c, 0x78, 0xa4, 0xa1, 0xad, 0x5b, 0xf4, 0xa9, 0xc8, 0x8c, 0x03, 0x72, 0x18, 0xf5, 0x08, + 0xe7, 0xa9, 0xe9, 0x99, 0xbf, 0x73, 0xa7, 0x1c, 0x85, 0xc5, 0xb2, 0xb1, 0x8d, 0x6f, 0x5f, 0xce, 0x6d, 0xe9, 0x9c, 0xf5, 0xcb, 0x4a, 0xea, 0xf4, 0x75, 0x5e, 0xe3, 0x68, 0x3d, 0x4e, 0x86, 0x05, + 0x19, 0xfa, 0x7f, 0xaf, 0x93, 0x04, 0xab, 0x95, 0x51, 0x77, 0x48, 0x8c, 0xf0, 0x36, 0xe2, 0x58, 0x08, 0xf4, 0x5e, 0xfd, 0x67, 0x0c, 0xeb, 0xbf, 0x72, 0xba, 0x91, 0xee, 0x42, 0x80, 0x99, 0x10, + 0x45, 0x63, 0x6f, 0x9c, 0x40, 0x90, 0x63, 0x76, 0x5b, 0xa9, 0xc0, 0x98, 0x89, 0xd2, 0xa8, 0x0c, 0xba, 0x8f, 0x94, 0x6b, 0x99, 0x3e, 0x5c, 0xc0, 0x76, 0x53, 0xdc, 0xbd, 0x84, 0xda, 0x77, 0x01, + 0xd1, 0xf8, 0x86, 0x12, 0xf7, 0x0d, 0x41, 0x13, 0x54, 0x7b, 0x79, 0xac, 0xa1, 0x32, 0x86, 0x12, 0xd6, 0xb2, 0xf2, 0xce, 0xa3, 0x33, 0x40, 0xda, 0x92, 0x69, 0x0e, 0x56, 0x75, 0x96, 0x62, 0x01, + 0x8f, 0xbd, 0xf1, 0xc0, 0x4a, 0xd3, 0x8a, 0xb6, 0xfb, 0xdd, 0xfa, 0x27, 0xa5, 0x2d, 0xa2, 0x19, 0x2b, 0xdf, 0xae, 0x06, 0xc1, 0x2b, 0x55, 0x4f, 0xf9, 0x62, 0x70, 0x11, 0x01, 0xdb, 0x6f, 0x2b, + 0xd2, 0x0f, 0xb5, 0xd6, 0x05, 0x13, 0x61, 0xe4, 0x9a, 0x47, 0x71, 0x4f, 0xe3, 0x90, 0xcb, 0x22, 0x95, 0xa5, 0xb4, 0x89, 0x1a, 0x11, 0x22, 0x45, 0xdf, 0xda, 0x57, 0x69, 0xc1, 0x79, 0xc7, 0x0e, + 0x22, 0x0d, 0xba, 0xe1, 0x54, 0x0c, 0x75, 0x89, 0xab, 0x7b, 0x07, 0xed, 0x87, 0x4b, 0xec, 0x29, 0x35, 0xbc, 0xd7, 0x5a, 0xf3, 0x8d, 0xc2, 0x71, 0x16, 0x1a, 0x58, 0x00, 0x18, 0xa6, 0x51, 0x14, + 0x83, 0xd4, 0x5f, 0xc6, 0x6b, 0x61, 0x84, 0x28, 0x85, 0x3a, 0x68, 0xb5, 0x0c, 0xff, 0xe0, 0xb9, 0x6b, 0xc9, 0x31, 0xd2, 0x99, 0x59, 0x6a, 0x02, 0x01, 0x41, 0x7c, 0x37, 0x2e, 0xbc, 0x18, 0x03, + 0xe2, 0xa9, 0xb9, 0xdf, 0xa5, 0x0a, 0xe3, 0xc1, 0xc2, 0xca, 0x0b, 0xb3, 0x4c, 0x3d, 0x68, 0x99, 0xfd, 0xad, 0x29, 0xd1, 0xf7, 0xdd, 0x9c, 0x72, 0x82, 0x67, 0x30, 0xda, 0x73, 0x83, 0x92, 0x0f, + 0x53, 0xa1, 0x2f, 0xcf, 0x08, 0x3a, 0x9d, 0x9c, 0x37, 0x4b, 0xfd, 0x92, 0x77, 0x9c, 0x2b, 0x85, 0xf2, 0x03, 0x3c, 0xf8, 0x80, 0x31, 0xf8, 0xb8, 0x6a, 0xaf, 0x71, 0x2f, 0x6b, 0xae, 0xdb, 0x07, + 0x91, 0x97, 0xf7, 0x33, 0x63, 0x64, 0xa4, 0x73, 0x10, 0x09, 0x18, 0x83, 0xa8, 0x94, 0xae, 0x00, 0xae, 0x66, 0xfa, 0x5e, 0x0e, 0x5e, 0x49, 0x54, 0x10, 0x46, 0x0e, 0x19, 0x51, 0x52, 0xe6, 0x0f, + 0x1a, 0x4b, 0x9e, 0x10, 0xf8, 0xe4, 0x34, 0x8a, 0x32, 0x11, 0x4f, 0xb6, 0xe0, 0x8a, 0x16, 0xf9, 0x28, 0xea, 0x7a, 0x27, 0x2e, 0xfa, 0x75, 0x18, 0xfa, 0xbb, 0x0f, 0x03, 0xd0, 0x90, 0x54, 0x30, + 0x10, 0xd5, 0xa5, 0xf2, 0xf9, 0xc6, 0x5c, 0xfa, 0xdf, 0x08, 0xdb, 0x94, 0x6d, 0xa0, 0x00, 0x6b, 0x45, 0xb9, 0x86, 0x39, 0x72, 0xb2, 0x50, 0x5a, 0xb5, 0xa0, 0x29, 0x5e, 0x37, 0x5b, 0x67, 0x02, + 0xcd, 0x44, 0x0f, 0xe1, 0x7a, 0x30, 0x01, 0x6b, 0x26, 0x1c, 0x7f, 0xcb, 0xc4, 0x3f, 0x1c, 0xb7, 0x65, 0xdc, 0xa0, 0x4b, 0xfa, 0xea, 0xd8, 0xd4, 0x49, 0x86, 0x71, 0xe6, 0xa1, 0x54, 0x8b, 0x2d, + }; + + unsigned char round_constants[] = { + 0x13, 0x90, 0x8b, 0x85, 0xd2, 0x26, 0x36, 0x53, 0x99, 0x1c, 0xd0, 0x36, 0x23, 0xd8, 0x13, 0x32, 0xd4, 0xc5, 0x7c, 0x09, 0x47, 0x8b, 0x76, 0xfe, 0x58, 0x29, 0x86, 0x80, 0x1e, 0xf3, 0x65, 0x28, + 0x02, 0xe1, 0xb0, 0xad, 0xe2, 0xbb, 0x78, 0xdf, 0x21, 0x7d, 0xcf, 0x8b, 0xc7, 0x99, 0xfd, 0xea, 0xe7, 0x88, 0x74, 0xa1, 0xad, 0xcb, 0xfa, 0x89, 0x6f, 0x25, 0x41, 0x84, 0x20, 0x58, 0x64, 0x04, + 0xe2, 0xc6, 0x25, 0x47, 0xa8, 0x88, 0x27, 0xaf, 0xc2, 0xf2, 0xa1, 0xdd, 0x97, 0xc0, 0x5f, 0x8e, 0x5f, 0xe6, 0xc0, 0xc1, 0xe0, 0x4f, 0x9c, 0xbf, 0x65, 0xfe, 0x64, 0xed, 0x25, 0x45, 0xf4, 0x2e, + 0x50, 0x86, 0x8b, 0xd4, 0xf3, 0xdb, 0x75, 0xc1, 0xee, 0x62, 0x1a, 0x4d, 0xfe, 0x47, 0x29, 0xcb, 0x34, 0x75, 0x40, 0x43, 0xb9, 0x60, 0x58, 0x2a, 0x90, 0xc1, 0xf7, 0xcb, 0x2f, 0x6d, 0xe0, 0x13, + 0x7c, 0x3a, 0xec, 0xe5, 0xff, 0xdf, 0x1f, 0x46, 0x09, 0x90, 0xa8, 0xeb, 0x19, 0x7f, 0xc2, 0x19, 0x4a, 0x73, 0x7b, 0x44, 0x82, 0x3b, 0x5a, 0xaf, 0x61, 0x67, 0xe6, 0x5c, 0x53, 0x50, 0xec, 0x07, + 0xd9, 0x5f, 0xc7, 0x7e, 0x64, 0xd2, 0xc7, 0x5a, 0xf5, 0x08, 0x92, 0x45, 0x54, 0x7a, 0xa6, 0xe5, 0xde, 0xb7, 0x15, 0x80, 0x5b, 0x60, 0xe5, 0xf3, 0xb9, 0x1f, 0x80, 0x57, 0x9d, 0xe4, 0xd3, 0x23, + 0x32, 0x63, 0x1b, 0x59, 0x7e, 0x36, 0xaf, 0x51, 0x2a, 0xea, 0xa2, 0xe9, 0xf9, 0x98, 0x3d, 0xa4, 0x09, 0x36, 0x7b, 0xb5, 0xa0, 0xf2, 0xf2, 0x83, 0xc8, 0xa6, 0x68, 0xac, 0xb9, 0x3d, 0xb5, 0x0a, + 0xef, 0x3e, 0x09, 0x30, 0xc7, 0xa8, 0xc7, 0x57, 0x1f, 0x3b, 0x62, 0x70, 0xb1, 0xd0, 0xda, 0x68, 0xf5, 0x45, 0xaf, 0x0e, 0x40, 0x96, 0x12, 0x29, 0xf1, 0x2c, 0x4e, 0xe3, 0x93, 0x79, 0x6d, 0x16, + 0x7d, 0x6c, 0xf3, 0xa6, 0xfa, 0xfc, 0xa2, 0x61, 0x09, 0xb5, 0xfb, 0xe5, 0xaf, 0x4f, 0x10, 0xce, 0x76, 0xc2, 0x16, 0x9d, 0x77, 0xe8, 0xa5, 0x4b, 0x47, 0xc1, 0xe4, 0xbd, 0xf6, 0xd9, 0xa0, 0x08, + 0xf4, 0xc9, 0xcb, 0xd5, 0xde, 0xcb, 0xf7, 0x10, 0x68, 0x67, 0x47, 0xf8, 0x4b, 0x19, 0xb6, 0xae, 0x54, 0x01, 0x7c, 0x91, 0x3b, 0x7e, 0x32, 0x90, 0xde, 0x9a, 0x1f, 0x2f, 0x95, 0x31, 0x3e, 0x19, + 0xb1, 0xf4, 0x26, 0x8b, 0x68, 0x2e, 0xba, 0x1c, 0xd0, 0xe5, 0xe4, 0xdf, 0xf2, 0xfa, 0xa2, 0xfb, 0xd6, 0xe5, 0xbc, 0x6a, 0x84, 0x15, 0x0c, 0x78, 0x6d, 0x42, 0xb6, 0x65, 0x34, 0x27, 0x78, 0x0b, + 0x3e, 0x04, 0x28, 0x17, 0x59, 0xf5, 0x4a, 0x79, 0x1c, 0x20, 0xc7, 0xe4, 0xa0, 0x07, 0xd2, 0x03, 0xf3, 0xb9, 0x13, 0x2f, 0x55, 0x92, 0x5e, 0x4b, 0xaa, 0x13, 0x61, 0x1d, 0xa1, 0x44, 0xc1, 0x1a, + 0x3e, 0x5f, 0x82, 0x2f, 0xa7, 0xf3, 0xa3, 0xf6, 0x5c, 0x20, 0xc0, 0xd0, 0x82, 0x3a, 0x62, 0xd9, 0xd6, 0x47, 0x62, 0x55, 0xb0, 0x5a, 0xd3, 0x70, 0x41, 0xb3, 0x78, 0x6f, 0x60, 0xf4, 0xb0, 0x03, + 0xa7, 0xba, 0x27, 0x9f, 0x14, 0x3d, 0x17, 0xb2, 0x35, 0x5b, 0x93, 0x37, 0x7c, 0x6b, 0xb3, 0x20, 0xf5, 0x8e, 0xd2, 0xbc, 0x5e, 0xf2, 0xa9, 0x54, 0xfa, 0x0c, 0x10, 0x97, 0xff, 0x52, 0x4f, 0x08, + 0x9b, 0xb1, 0xc4, 0x40, 0xf9, 0x0e, 0x42, 0x53, 0xf8, 0x4d, 0x43, 0x67, 0x71, 0x14, 0xc4, 0x12, 0x37, 0x4e, 0x39, 0x9d, 0x25, 0x68, 0x1e, 0xf4, 0x5c, 0xc0, 0xeb, 0xcc, 0xba, 0x0a, 0x45, 0x2e, + 0xea, 0xbb, 0x33, 0xd0, 0x87, 0x1b, 0x7b, 0x91, 0xb7, 0x65, 0x82, 0x4f, 0x8f, 0x8e, 0x8e, 0x4c, 0xa4, 0xb4, 0xcf, 0x1e, 0x4e, 0x3f, 0xe5, 0xea, 0xd4, 0x45, 0x0b, 0x1b, 0xf5, 0x15, 0x19, 0x07, + 0x6c, 0x82, 0xf8, 0xf9, 0x6a, 0x68, 0xad, 0x20, 0x0d, 0x2a, 0xd4, 0xe2, 0x37, 0x96, 0x2a, 0x56, 0x78, 0x28, 0xb5, 0xf1, 0x88, 0x6a, 0xf9, 0xd6, 0x90, 0xb8, 0x03, 0x5e, 0x6a, 0x6d, 0xd1, 0x2d, + 0x9d, 0x22, 0xfa, 0x1e, 0x95, 0xb1, 0x22, 0x36, 0x86, 0x5a, 0xf5, 0xaf, 0xc0, 0xa2, 0x81, 0x97, 0xb2, 0x23, 0xef, 0x0f, 0x50, 0x00, 0x63, 0xb3, 0x0d, 0xc4, 0x7f, 0x60, 0x2e, 0x94, 0x8f, 0x07, + 0x4f, 0xc4, 0xda, 0x88, 0xa1, 0x59, 0x0c, 0x64, 0x52, 0x42, 0xe0, 0x3b, 0x81, 0xb5, 0x14, 0x8e, 0x8a, 0xad, 0x9b, 0x7f, 0xd7, 0x49, 0xc8, 0xdc, 0x83, 0x6b, 0x50, 0xf8, 0x73, 0xe5, 0xaf, 0x18, + 0x20, 0xae, 0xaa, 0x30, 0x63, 0x25, 0x74, 0xf3, 0x60, 0xf4, 0x54, 0x7f, 0x2a, 0x1f, 0x54, 0x8a, 0x7e, 0xd5, 0xf0, 0x50, 0xdb, 0x1d, 0xe1, 0x27, 0x7a, 0x6a, 0xa7, 0x76, 0x50, 0xd1, 0xad, 0x07, + 0x6b, 0x54, 0x1d, 0x6b, 0x44, 0x92, 0x74, 0x7c, 0x8e, 0x04, 0xa4, 0x6e, 0x51, 0x28, 0x4a, 0xd7, 0x35, 0xd9, 0xbe, 0x84, 0xdd, 0x8f, 0xff, 0xf4, 0xb5, 0xc6, 0x94, 0xb2, 0x31, 0x6a, 0xb2, 0x17, + 0x76, 0x65, 0x06, 0xb7, 0xa1, 0x74, 0x8d, 0xcd, 0x50, 0x16, 0xe6, 0xaf, 0x2a, 0x8f, 0x0b, 0xd5, 0x17, 0xb4, 0x7f, 0x21, 0xbb, 0x85, 0xd6, 0x2e, 0x20, 0x3f, 0xff, 0x53, 0x04, 0x7c, 0x2b, 0x15, + 0x4a, 0x96, 0xad, 0x6e, 0x00, 0x54, 0xdf, 0x72, 0xe8, 0xa3, 0xb2, 0xcc, 0x08, 0x80, 0xd6, 0xbc, 0x76, 0x8e, 0xb9, 0x46, 0x36, 0x57, 0x88, 0xd8, 0x20, 0x4d, 0xc8, 0x43, 0x4c, 0xbf, 0x97, 0x2d, + 0x91, 0x84, 0xda, 0x64, 0x22, 0x45, 0x33, 0xc3, 0x92, 0x32, 0x7b, 0x0e, 0x0a, 0x4e, 0xc5, 0x20, 0x21, 0x2a, 0xb0, 0x86, 0xe9, 0x61, 0x06, 0x40, 0xd7, 0x2c, 0x59, 0xc5, 0xd4, 0x8e, 0x11, 0x28, + 0xc6, 0x93, 0x05, 0x3f, 0x02, 0x93, 0xfe, 0xf4, 0xd7, 0x32, 0xa4, 0x7f, 0x2a, 0xfa, 0x6e, 0xfe, 0x1d, 0xce, 0x47, 0x63, 0xb5, 0x97, 0x48, 0x56, 0xbe, 0xf5, 0x84, 0xe5, 0xf3, 0x58, 0x6c, 0x24, + 0x1f, 0xb1, 0x13, 0x38, 0x8c, 0x25, 0xac, 0x01, 0x67, 0xaf, 0xa5, 0x68, 0x8a, 0x4a, 0x53, 0xee, 0xc7, 0x49, 0xc8, 0xbd, 0x0d, 0x00, 0x3e, 0x07, 0xbc, 0x73, 0xd0, 0x7a, 0x61, 0xb6, 0xe2, 0x04, + 0xc4, 0x44, 0xe3, 0xa4, 0x13, 0xd9, 0xbf, 0xb7, 0x6b, 0xc9, 0xfb, 0x19, 0x0a, 0xa8, 0x9c, 0xd0, 0x90, 0x13, 0xa1, 0xa4, 0x8f, 0xc0, 0xb3, 0x17, 0x88, 0x8c, 0xdc, 0x80, 0xfe, 0xcf, 0xa5, 0x13, + 0x6a, 0x48, 0xb5, 0xfe, 0x25, 0x66, 0xa9, 0xa7, 0xe1, 0x3b, 0x9a, 0x63, 0xcb, 0x35, 0x15, 0xc9, 0x7b, 0xd5, 0x8e, 0x72, 0xb7, 0xc8, 0x71, 0x95, 0x13, 0x8e, 0xc9, 0x64, 0xde, 0x8c, 0xc0, 0x2e, + 0x1b, 0x65, 0x6c, 0xbf, 0xf7, 0xd6, 0xb7, 0xa8, 0x1d, 0xf3, 0x1e, 0x52, 0x68, 0x17, 0xd4, 0xf2, 0x3b, 0xa5, 0x42, 0xcc, 0x2e, 0xd7, 0x13, 0xdf, 0xf7, 0x9b, 0x74, 0x07, 0x64, 0xfb, 0x65, 0x0f, + 0x0a, 0x7e, 0x14, 0x9e, 0x8e, 0x83, 0x1e, 0x9b, 0x66, 0x0d, 0xe7, 0xb6, 0xe9, 0xb2, 0xfb, 0x61, 0x07, 0xd2, 0x11, 0x6b, 0x5c, 0x06, 0x0b, 0xb2, 0xaa, 0x90, 0xc0, 0xac, 0x17, 0x56, 0x31, 0x21, + 0xb0, 0xbf, 0xcf, 0x66, 0x91, 0x6d, 0x35, 0x26, 0xb7, 0x6e, 0x7c, 0xd8, 0x56, 0x01, 0x80, 0xa4, 0xdb, 0x62, 0x47, 0xe4, 0x71, 0xf0, 0x62, 0x3e, 0x5c, 0x06, 0x6b, 0xd6, 0xb8, 0x23, 0x76, 0x1c, + 0xc0, 0xe9, 0xb0, 0xdb, 0x5b, 0xbe, 0x26, 0x50, 0xbd, 0x19, 0xc7, 0x90, 0x7c, 0xe2, 0x5f, 0xe9, 0x52, 0x04, 0xd7, 0xb3, 0x98, 0xda, 0x08, 0xf6, 0xd3, 0xa6, 0x52, 0xfd, 0x83, 0x00, 0x04, 0x12, + 0xac, 0x63, 0xc1, 0x0a, 0x7b, 0x0d, 0x27, 0x40, 0x1b, 0x8b, 0xc1, 0x2c, 0x24, 0xc0, 0xd1, 0x9c, 0x14, 0x7b, 0x66, 0x83, 0xd2, 0x24, 0xcd, 0xe5, 0x34, 0x77, 0x83, 0x68, 0x64, 0x1d, 0xc3, 0x19, + 0x81, 0x9b, 0xbb, 0x60, 0x18, 0x90, 0x10, 0xb3, 0x9a, 0xac, 0x13, 0x47, 0xf8, 0x69, 0xa6, 0x1e, 0xee, 0x66, 0x06, 0xbd, 0x80, 0xb7, 0x21, 0x54, 0x9e, 0xa6, 0x57, 0x29, 0xa5, 0x28, 0xe8, 0x1b, + 0x9d, 0x92, 0x3f, 0x38, 0x01, 0x15, 0x75, 0x81, 0xde, 0x98, 0x70, 0x83, 0xac, 0x3d, 0x21, 0x8e, 0x79, 0xc1, 0x3f, 0x12, 0x1a, 0xf9, 0xf9, 0x54, 0xf0, 0x0a, 0xf2, 0xaa, 0x1a, 0x60, 0x94, 0x15, + 0x81, 0xb6, 0xea, 0x97, 0x89, 0x22, 0xb5, 0x57, 0x5e, 0x10, 0x53, 0x74, 0x2a, 0x96, 0x7a, 0x1f, 0x0e, 0x89, 0x5c, 0x36, 0x95, 0x64, 0xa8, 0x22, 0x5c, 0x9e, 0xd8, 0x18, 0x82, 0xfd, 0x69, 0x10, + 0xcb, 0xdc, 0x51, 0x34, 0x5a, 0xf1, 0x91, 0x92, 0x94, 0x38, 0x23, 0xbd, 0x32, 0x05, 0x5e, 0xdd, 0x5d, 0xb7, 0xa2, 0xe1, 0xe8, 0x5f, 0xfd, 0x5a, 0x3b, 0x78, 0xde, 0x0b, 0x4e, 0x8e, 0xce, 0x17, + 0x69, 0x50, 0xce, 0xe5, 0xf3, 0x4e, 0xaf, 0xa1, 0xc9, 0x54, 0x2f, 0x0c, 0xb4, 0x6c, 0xcd, 0xe8, 0xa0, 0xae, 0x3e, 0x92, 0x0d, 0x89, 0x53, 0xa9, 0x67, 0x98, 0xdc, 0x0a, 0x4c, 0x11, 0x17, 0x0e, + 0xe6, 0xa0, 0x8d, 0x29, 0x51, 0x69, 0x8e, 0x54, 0x42, 0x28, 0xce, 0xb2, 0xf7, 0x6d, 0x77, 0x0c, 0x77, 0x78, 0xc5, 0xde, 0x1f, 0x8a, 0x72, 0x8e, 0x61, 0x24, 0x79, 0xcd, 0xb8, 0x22, 0xf7, 0x02, + 0xbc, 0x35, 0x1a, 0x6e, 0xbc, 0x7a, 0x94, 0x18, 0x50, 0xda, 0x57, 0xa2, 0xf6, 0x14, 0xcc, 0x02, 0x35, 0x52, 0xd2, 0x76, 0x3c, 0x83, 0x1f, 0x20, 0x32, 0x4f, 0x88, 0xce, 0xda, 0xf3, 0x9e, 0x16, + 0xa0, 0xd4, 0x8a, 0xba, 0x05, 0x60, 0x03, 0x38, 0x4d, 0x5b, 0x79, 0x21, 0xb4, 0x4f, 0x44, 0x6a, 0x37, 0xdc, 0x12, 0xc8, 0xa8, 0x30, 0x03, 0xd8, 0x71, 0x41, 0x5c, 0x1d, 0x44, 0x13, 0xf4, 0x28, + 0x29, 0x9b, 0x26, 0xef, 0x59, 0x56, 0xa3, 0x58, 0xed, 0xe4, 0x6c, 0xb5, 0x27, 0xc9, 0x65, 0x0d, 0x08, 0xc7, 0xe6, 0x02, 0xed, 0x81, 0x60, 0xb7, 0xad, 0x43, 0x5a, 0x58, 0xc5, 0x8d, 0x3f, 0x29, + 0xbd, 0xa2, 0xad, 0xd1, 0x21, 0x4e, 0x4e, 0x16, 0x01, 0x8c, 0xdf, 0xc7, 0xf5, 0x9c, 0xb9, 0x94, 0x5e, 0x49, 0x56, 0xe4, 0xa9, 0x01, 0x6a, 0x19, 0x11, 0xe6, 0x95, 0x40, 0x4c, 0x9c, 0x07, 0x0e, + 0x2a, 0x54, 0xbc, 0x39, 0xd2, 0x36, 0x03, 0xed, 0xc8, 0xb4, 0x90, 0x3a, 0x38, 0x80, 0xbd, 0xc2, 0xbc, 0x49, 0x3a, 0x1c, 0xf1, 0xb4, 0x91, 0x2b, 0xdb, 0xe3, 0x47, 0x0f, 0x84, 0x41, 0x40, 0x17, + 0xdb, 0xb6, 0xde, 0x62, 0x84, 0x44, 0xac, 0x1e, 0x37, 0x00, 0xce, 0x94, 0xab, 0x5f, 0xea, 0x3f, 0x2c, 0xb7, 0x8a, 0x46, 0xfd, 0x3e, 0xbc, 0xaf, 0x51, 0x6b, 0xcb, 0x72, 0x77, 0x6f, 0x00, 0x05, + 0xcb, 0x59, 0xb9, 0xa3, 0xe1, 0x67, 0x95, 0x2e, 0x19, 0x29, 0xd7, 0x34, 0xec, 0x1f, 0x07, 0x56, 0xd4, 0x5f, 0x30, 0x95, 0x30, 0xa5, 0x08, 0x6c, 0x04, 0x3a, 0xbf, 0x50, 0x2a, 0x16, 0xcc, 0x0a, + 0xc5, 0x7e, 0x35, 0x39, 0x98, 0xc5, 0x84, 0xa1, 0xea, 0xff, 0x2f, 0x46, 0xe7, 0x80, 0xd4, 0x00, 0x00, 0xf6, 0xb6, 0x21, 0x38, 0x67, 0x0a, 0xa2, 0xb6, 0x4b, 0xaf, 0x3a, 0x44, 0xaa, 0x48, 0x17, + 0x2a, 0x0d, 0x84, 0x04, 0xe4, 0xd6, 0xfc, 0x3c, 0x1d, 0xfa, 0x5b, 0x52, 0xa8, 0x8f, 0xc7, 0xbc, 0x91, 0xf3, 0x0d, 0x1a, 0xce, 0xc3, 0xec, 0xfb, 0x2f, 0x20, 0x7e, 0x9d, 0x81, 0xcb, 0xb9, 0x06, + 0xf4, 0x3e, 0xed, 0x3c, 0xf3, 0x94, 0xee, 0x9f, 0xe8, 0xba, 0xb7, 0xe5, 0x2d, 0x18, 0xef, 0x37, 0x54, 0x0d, 0xbc, 0xbf, 0x5f, 0x26, 0xe8, 0xad, 0xe1, 0xbf, 0x8b, 0xb3, 0x66, 0x47, 0x9d, 0x18, + 0x3c, 0x3e, 0x5c, 0x3b, 0x69, 0x85, 0x76, 0x74, 0x9f, 0x26, 0x19, 0xbf, 0xd3, 0x3c, 0x06, 0x6c, 0xfb, 0xf9, 0xa9, 0x21, 0x1b, 0x91, 0x54, 0x83, 0x57, 0xa6, 0xd5, 0xc5, 0xfb, 0x94, 0xcb, 0x15, + 0x78, 0x64, 0x15, 0xb2, 0x37, 0x29, 0x95, 0x83, 0xf0, 0xb4, 0x31, 0x91, 0xdd, 0xaf, 0x85, 0x7c, 0xa1, 0x87, 0xf0, 0xf5, 0xc4, 0xa2, 0x51, 0x53, 0xae, 0x44, 0xff, 0x6d, 0xba, 0x1a, 0xbe, 0x06, + 0x53, 0xea, 0x62, 0x61, 0x8a, 0xe8, 0xb2, 0xc1, 0x89, 0xb9, 0x62, 0x0e, 0xc6, 0x4c, 0xfe, 0xda, 0xc5, 0x6e, 0x19, 0x88, 0x0c, 0x24, 0xb6, 0xd5, 0x53, 0xd8, 0xa6, 0x43, 0xca, 0xa0, 0x73, 0x0b, + 0xa3, 0x03, 0x39, 0x25, 0x2c, 0x2e, 0xbe, 0xcf, 0xba, 0xb2, 0x00, 0x2a, 0x6a, 0x6e, 0xb4, 0x31, 0xff, 0xe2, 0x14, 0xfb, 0xf9, 0x83, 0x9f, 0x02, 0x83, 0xb8, 0x83, 0xe1, 0x08, 0x05, 0x40, 0x0c, + 0xec, 0x2c, 0x45, 0xfd, 0x10, 0x20, 0x70, 0x5f, 0xa8, 0xec, 0xf8, 0x88, 0x59, 0x8e, 0x4a, 0x3c, 0xd0, 0xfe, 0x6f, 0x2f, 0x15, 0x31, 0x38, 0xcc, 0xb2, 0xf9, 0xa6, 0x58, 0x8d, 0xea, 0x7d, 0x18, + 0x3c, 0x60, 0xa3, 0x3c, 0x50, 0x7c, 0xa8, 0xa9, 0xd6, 0xcd, 0x29, 0x58, 0x90, 0xa3, 0x16, 0xf6, 0xaa, 0xc8, 0xa4, 0x81, 0xff, 0x94, 0x4a, 0x48, 0xac, 0x09, 0xa1, 0x93, 0x6e, 0x5f, 0xf8, 0x20, + 0xd1, 0x02, 0x80, 0x90, 0x47, 0xc2, 0x2f, 0x8d, 0xef, 0x09, 0x11, 0x57, 0x05, 0xb5, 0x9c, 0xdf, 0x0f, 0xcf, 0x39, 0x30, 0xab, 0x7e, 0x64, 0xb1, 0x99, 0x29, 0x8a, 0x16, 0xab, 0xd8, 0xc7, 0x25, + 0xb7, 0x26, 0x0c, 0x07, 0x02, 0x1a, 0xaf, 0x41, 0xbd, 0x21, 0x22, 0xb0, 0x6e, 0x10, 0x30, 0x20, 0x04, 0xf5, 0x54, 0x32, 0x61, 0xf6, 0x1e, 0x6b, 0x01, 0x01, 0x1e, 0xad, 0xf3, 0xdf, 0x5c, 0x11, + 0x14, 0x2f, 0x4d, 0xe9, 0x99, 0x1d, 0x6d, 0xdd, 0x40, 0xf1, 0xda, 0x91, 0xb5, 0xfa, 0xb9, 0xac, 0x3e, 0xcf, 0x9e, 0x1e, 0x04, 0xe4, 0x4a, 0x61, 0xc6, 0xc5, 0xd2, 0x69, 0x6e, 0xdb, 0xef, 0x1c, + 0x86, 0xe0, 0xf0, 0x97, 0x80, 0x34, 0x08, 0xbb, 0x96, 0xf8, 0xf0, 0x13, 0x81, 0xb5, 0x7c, 0xfe, 0xc8, 0x9b, 0xb2, 0xf9, 0xa1, 0xdc, 0xc0, 0x63, 0x9e, 0xe3, 0xe9, 0xcb, 0xfb, 0x1a, 0xab, 0x2f, + 0x2a, 0xac, 0xfb, 0x63, 0x8e, 0xd5, 0xf0, 0x6d, 0x45, 0xfc, 0xb8, 0xa3, 0xc6, 0xfe, 0x7b, 0x56, 0x9c, 0x5b, 0xc8, 0xc1, 0xe3, 0x16, 0xc8, 0x74, 0x04, 0x95, 0x16, 0x11, 0x3f, 0xc1, 0xa2, 0x07, + 0x1c, 0x27, 0x5a, 0xa7, 0x94, 0xf8, 0xb9, 0x88, 0xbb, 0xe4, 0x3e, 0x8a, 0xf3, 0xb9, 0x3c, 0xcc, 0xaf, 0x82, 0x27, 0xe6, 0x96, 0x79, 0x2d, 0xec, 0xa9, 0x00, 0x73, 0x3f, 0x55, 0x4a, 0x86, 0x2b, + 0xed, 0xab, 0xdd, 0x44, 0x69, 0x27, 0x0b, 0x8f, 0x32, 0xd1, 0x66, 0x54, 0xef, 0x40, 0x18, 0x4c, 0xdf, 0x71, 0xfc, 0x41, 0x08, 0x04, 0xcc, 0x92, 0x4a, 0x9d, 0x3a, 0xd0, 0x08, 0x3e, 0xd8, 0x2a, + 0x07, 0x63, 0x0a, 0xc8, 0x98, 0xe2, 0xef, 0x50, 0x96, 0x20, 0xac, 0x83, 0x18, 0x5c, 0x8e, 0x9b, 0x5a, 0x74, 0x03, 0xaa, 0xa0, 0xf8, 0x04, 0x99, 0x6e, 0x9d, 0x11, 0xa8, 0xe4, 0x41, 0x9a, 0x18, + 0x04, 0xe7, 0x58, 0xb7, 0xd6, 0x1d, 0x3c, 0x07, 0x70, 0x64, 0xdc, 0x8a, 0x5c, 0x71, 0x65, 0x5b, 0xf9, 0x14, 0xea, 0xe7, 0x28, 0x14, 0xae, 0xc1, 0xa0, 0x41, 0xdc, 0x97, 0x1b, 0x1b, 0xcb, 0x25, + 0x9b, 0x7f, 0x8d, 0xa2, 0x75, 0x2b, 0x93, 0xa8, 0xe9, 0x44, 0x91, 0x01, 0x6f, 0x19, 0xfd, 0x96, 0xd0, 0x44, 0x34, 0xc8, 0x69, 0x37, 0xaf, 0x32, 0xc0, 0x4c, 0xd6, 0xfa, 0xca, 0xb8, 0x99, 0x0f, + 0x5d, 0x60, 0x27, 0x82, 0x65, 0xfb, 0x32, 0x5a, 0x0e, 0xd5, 0x1a, 0x05, 0x5a, 0x60, 0x09, 0xe3, 0x4b, 0x23, 0x9d, 0x05, 0xb5, 0xbe, 0x0d, 0xf9, 0x07, 0xf5, 0x3a, 0xf8, 0x32, 0x52, 0xa8, 0x2e, + 0x0d, 0x0e, 0x72, 0x5d, 0x46, 0x69, 0x86, 0xc0, 0x0f, 0xae, 0x1e, 0x83, 0x63, 0xee, 0x1e, 0x45, 0x82, 0xe5, 0x62, 0x6f, 0xe3, 0xec, 0xdd, 0xb3, 0x5e, 0x58, 0xa6, 0x6d, 0x19, 0x60, 0xe2, 0x24, + 0x21, 0x4c, 0xfe, 0x0f, 0x31, 0x14, 0x80, 0x9a, 0x65, 0xd8, 0x7c, 0xd7, 0xef, 0xf9, 0xe6, 0xb1, 0x48, 0xa6, 0xd7, 0xb9, 0x53, 0x49, 0x50, 0x32, 0x60, 0x3b, 0xa8, 0xcd, 0x12, 0xba, 0xa9, 0x01, + 0x56, 0x68, 0x4c, 0x95, 0x6c, 0x76, 0xae, 0x7c, 0xd3, 0x0b, 0xb8, 0x4d, 0x8f, 0xbb, 0x3e, 0x67, 0xb0, 0x9a, 0x92, 0xc3, 0x62, 0x12, 0x50, 0xb3, 0x4d, 0x43, 0x51, 0x04, 0xe3, 0x8d, 0x0c, 0x2b, + 0x37, 0xf9, 0x0f, 0x58, 0x2f, 0x0a, 0x52, 0x39, 0xb9, 0x24, 0xf0, 0xed, 0x5d, 0xcf, 0xed, 0xc8, 0x6c, 0x11, 0xcd, 0x1d, 0xcb, 0xc4, 0x00, 0x2a, 0x1e, 0xc2, 0x0d, 0x22, 0x93, 0x9b, 0xf4, 0x0e, + 0xac, 0x11, 0xed, 0x9a, 0xae, 0x08, 0x41, 0xdd, 0x54, 0xfd, 0x0b, 0x51, 0xa0, 0x67, 0x6a, 0x86, 0x57, 0x93, 0x45, 0x1f, 0xd1, 0xfd, 0x8d, 0xb8, 0x40, 0xd2, 0x0d, 0x10, 0xbd, 0x2c, 0x57, 0x17, + 0xe6, 0xd4, 0x94, 0xf6, 0x5a, 0x08, 0x2a, 0xb5, 0xb6, 0xeb, 0xab, 0xf8, 0x00, 0x12, 0xd5, 0xcb, 0x6e, 0xba, 0x02, 0x4d, 0x5f, 0x95, 0x48, 0xbb, 0x92, 0xf5, 0x76, 0x6f, 0x80, 0x1e, 0x64, 0x2a, + 0xec, 0x3f, 0x42, 0xe4, 0xf1, 0xfa, 0x69, 0x03, 0xd4, 0xf1, 0xc3, 0xcd, 0xc7, 0xb9, 0x76, 0x74, 0x5b, 0xee, 0x2c, 0xc7, 0xc5, 0x15, 0x0e, 0x09, 0xb1, 0x54, 0xac, 0xfe, 0x99, 0x52, 0x82, 0x06, + 0x71, 0x80, 0x1d, 0x1a, 0x31, 0xba, 0x23, 0x43, 0x92, 0xf7, 0x04, 0x59, 0x29, 0xf7, 0xb4, 0xc3, 0x8e, 0xf9, 0x05, 0x38, 0xbf, 0x94, 0xd5, 0xb3, 0x4b, 0xe1, 0xad, 0x6f, 0x2e, 0x13, 0x1d, 0x05, + 0x3a, 0x3c, 0xec, 0x4f, 0x71, 0xd7, 0x47, 0x2f, 0x09, 0xee, 0x64, 0xb2, 0xb4, 0x0c, 0x2e, 0xb1, 0x20, 0x15, 0xa1, 0x42, 0x3d, 0x8b, 0x12, 0x23, 0xaa, 0x30, 0xbf, 0x85, 0xfa, 0xde, 0x0a, 0x22, + 0xd4, 0x6f, 0x67, 0x46, 0x9c, 0x6c, 0x3a, 0x26, 0x36, 0x33, 0xe7, 0x81, 0x2e, 0xa3, 0x43, 0xf9, 0xda, 0x43, 0x31, 0x4c, 0xc4, 0xe6, 0xd4, 0x79, 0x02, 0x22, 0xd7, 0xfd, 0xde, 0x1d, 0x1e, 0x22, + 0xa6, 0x02, 0x12, 0xbd, 0x7f, 0x16, 0x6f, 0xb7, 0x04, 0xc4, 0x59, 0xa8, 0x75, 0xef, 0x4e, 0xfb, 0x10, 0x62, 0x50, 0x98, 0x09, 0x98, 0xf6, 0x4c, 0xb3, 0x91, 0x28, 0x65, 0x65, 0x74, 0x7f, 0x1f, + 0xa4, 0x9e, 0x9d, 0x7d, 0xb3, 0x75, 0x36, 0x30, 0x12, 0x98, 0xfc, 0xaa, 0x95, 0x6d, 0x3f, 0xc9, 0xd4, 0x61, 0x26, 0xe3, 0xbc, 0x54, 0xb4, 0x06, 0xa2, 0x59, 0xc2, 0xa9, 0xa3, 0x9f, 0x8e, 0x01, + 0x78, 0x3c, 0xdf, 0xcf, 0x39, 0xf0, 0x8c, 0x02, 0x7d, 0xe6, 0x54, 0x60, 0xdd, 0x5e, 0x7a, 0x3d, 0xcf, 0xd9, 0x92, 0x94, 0x64, 0x44, 0xba, 0x20, 0x1b, 0xb3, 0xf6, 0xfa, 0x4b, 0xad, 0x94, 0x1c, + 0x6b, 0x40, 0x80, 0xeb, 0xec, 0x94, 0xa6, 0x2b, 0xe5, 0xdd, 0x28, 0x8d, 0xc1, 0xdc, 0x2d, 0xdf, 0xbe, 0x96, 0x97, 0x58, 0xa7, 0x0a, 0x60, 0xb2, 0x47, 0xe6, 0x2a, 0x4e, 0xa0, 0x76, 0x94, 0x17, + 0x46, 0xb7, 0xf3, 0xd9, 0xdb, 0xd4, 0xfb, 0x12, 0x4a, 0x1a, 0x9e, 0x3d, 0x34, 0xf2, 0x6d, 0x57, 0x5a, 0x44, 0x98, 0x81, 0x75, 0xb6, 0x12, 0x69, 0xd9, 0xce, 0xce, 0xad, 0xa0, 0x87, 0x27, 0x23, + 0x93, 0xc4, 0x98, 0xd7, 0x35, 0x21, 0x6f, 0x5f, 0x6f, 0x64, 0xe1, 0x2e, 0x78, 0x5c, 0x06, 0x03, 0x89, 0xab, 0xc8, 0x36, 0xcf, 0xc0, 0x58, 0x89, 0xac, 0x97, 0xa0, 0xf0, 0x69, 0xcf, 0xf4, 0x18, + 0x8a, 0x18, 0x57, 0x22, 0xef, 0x6d, 0xd0, 0xc4, 0x19, 0x51, 0x6c, 0xd8, 0x51, 0x3e, 0x77, 0xda, 0x3f, 0xe0, 0x15, 0x37, 0x1d, 0x91, 0x4f, 0xfc, 0xb8, 0x85, 0xba, 0x78, 0xca, 0xf9, 0x4c, 0x1f, + 0xb6, 0x84, 0xbb, 0x96, 0xef, 0x87, 0x4a, 0x26, 0xa1, 0x7f, 0x0a, 0x32, 0xa8, 0x59, 0xb4, 0x42, 0x98, 0x1b, 0x42, 0xf7, 0xf2, 0xe8, 0x05, 0xa1, 0xf8, 0x27, 0x66, 0x5c, 0x47, 0xfb, 0xf6, 0x2b, + 0x9b, 0xc8, 0x24, 0xa0, 0xe8, 0x44, 0xd8, 0xe6, 0x55, 0x1c, 0xce, 0x43, 0x50, 0x95, 0x6f, 0xd6, 0xf0, 0xb0, 0xe9, 0x82, 0xb2, 0x70, 0x48, 0x62, 0xdf, 0xe7, 0x60, 0xa5, 0x9d, 0x51, 0x38, 0x2c, + 0xb4, 0xb0, 0x35, 0x58, 0x4f, 0xac, 0x8d, 0x39, 0x91, 0x45, 0x0f, 0x34, 0x99, 0x2a, 0x49, 0xfc, 0x45, 0x22, 0xec, 0x10, 0x73, 0x10, 0x18, 0xbe, 0x45, 0xd7, 0xdc, 0x10, 0x84, 0x8b, 0x01, 0x1b, + 0x63, 0xb5, 0xbf, 0x88, 0xcc, 0xa0, 0xec, 0xc9, 0x2f, 0x2c, 0x13, 0x4a, 0x3e, 0x0a, 0x1a, 0xa0, 0x5a, 0x8e, 0x64, 0x0e, 0x43, 0x7d, 0x72, 0xf6, 0x8e, 0x3b, 0xd7, 0xf0, 0xbc, 0x41, 0xa4, 0x0a, + 0xb3, 0xdd, 0xef, 0x5e, 0xf5, 0x14, 0xed, 0xff, 0x0c, 0x8c, 0x32, 0x21, 0x39, 0xbf, 0xb1, 0x93, 0x82, 0x66, 0xf1, 0xa0, 0x07, 0x91, 0x26, 0xbd, 0x01, 0x85, 0xc1, 0xcb, 0x77, 0x87, 0xb7, 0x15, + 0x07, 0x41, 0x5f, 0x72, 0x6c, 0xa4, 0xbe, 0xea, 0x05, 0xa3, 0xf3, 0x66, 0x38, 0x77, 0x62, 0x9b, 0x21, 0xe7, 0xc4, 0x8a, 0x6f, 0xbe, 0xb9, 0xe7, 0x5f, 0xb0, 0xae, 0xe4, 0xf8, 0x67, 0x9a, 0x21, + 0xae, 0x85, 0xbb, 0xf5, 0x3b, 0xa1, 0xc6, 0x2c, 0xd5, 0x68, 0x12, 0xf4, 0x6e, 0x7c, 0x18, 0x81, 0xed, 0x3a, 0xe9, 0x23, 0x08, 0x7a, 0x0d, 0x88, 0x93, 0x3f, 0x4b, 0x4f, 0xb9, 0xb1, 0x7c, 0x28, + 0x20, 0xdc, 0xe9, 0xfd, 0x76, 0x5b, 0x1a, 0x7a, 0x27, 0xe3, 0xa3, 0x97, 0xf6, 0x0d, 0x09, 0xbb, 0x0c, 0xc6, 0xe3, 0xd7, 0xeb, 0x5b, 0x2a, 0xc7, 0x3f, 0x4d, 0x4d, 0x3d, 0x3a, 0x1f, 0x67, 0x09, + 0x6a, 0x3a, 0x8f, 0x1a, 0x2b, 0x9e, 0x35, 0x0e, 0x3b, 0x9e, 0x82, 0x1f, 0xf9, 0x64, 0xfc, 0x9b, 0x59, 0x2e, 0xed, 0x82, 0x4b, 0xe1, 0x4e, 0xf7, 0xb5, 0xcc, 0x94, 0x7a, 0x83, 0xa3, 0x06, 0x0c, + 0x18, 0x07, 0x2a, 0xe5, 0x0b, 0xb9, 0xbc, 0xbe, 0x60, 0x7e, 0x2c, 0x0a, 0x89, 0xdc, 0x17, 0x24, 0xaa, 0xf9, 0xf9, 0xf5, 0xde, 0x22, 0xd0, 0xa7, 0x12, 0x17, 0x5e, 0x59, 0xa5, 0x0b, 0x5f, 0x17, + 0x29, 0x95, 0x48, 0xe1, 0xdc, 0x5c, 0x9b, 0x67, 0x84, 0x8a, 0x8a, 0x78, 0xb4, 0x76, 0xdc, 0xe3, 0xfa, 0x49, 0x72, 0x9e, 0xe0, 0x17, 0x11, 0x6f, 0x35, 0xe6, 0x6c, 0xf1, 0xf4, 0xfb, 0xba, 0x25, + 0x92, 0x93, 0x30, 0xf2, 0x55, 0x1f, 0x70, 0x02, 0xc1, 0x6d, 0x07, 0x4b, 0x64, 0xfb, 0x54, 0x92, 0x0d, 0x79, 0x55, 0xd5, 0x93, 0xaa, 0x3e, 0xbd, 0x65, 0x7c, 0x74, 0x31, 0x3b, 0x49, 0xe1, 0x14, + 0xd4, 0xdb, 0x40, 0xf4, 0x77, 0xf5, 0x5b, 0x51, 0xda, 0xaa, 0x1a, 0xf5, 0x3b, 0x8c, 0x64, 0xb0, 0xc0, 0x2d, 0x3f, 0xd3, 0xe5, 0xae, 0x16, 0xfc, 0xb6, 0xee, 0xa7, 0x44, 0x71, 0x4f, 0x48, 0x1f, + 0xfc, 0xf1, 0xee, 0xc1, 0xef, 0xee, 0x23, 0x7c, 0x4b, 0xfe, 0xdc, 0x63, 0x72, 0x96, 0x4f, 0xb6, 0xb7, 0xb2, 0x3b, 0x34, 0x78, 0x2c, 0xc5, 0x76, 0xab, 0x14, 0xf3, 0x36, 0xcf, 0x4d, 0x74, 0x12, + 0x35, 0x24, 0x74, 0xf9, 0x39, 0x48, 0xc0, 0x98, 0xbb, 0xcc, 0xf6, 0xa3, 0x26, 0xc0, 0x2a, 0x3f, 0x72, 0x63, 0x11, 0x33, 0xc8, 0xc5, 0x67, 0x19, 0x24, 0x42, 0x66, 0xa9, 0x05, 0x8c, 0x9b, 0x19, + 0x7b, 0xbb, 0x1e, 0x50, 0x5d, 0x19, 0x61, 0x4f, 0x60, 0x6b, 0x5a, 0x9d, 0x2b, 0xa4, 0xd5, 0xd4, 0x12, 0x33, 0xef, 0x72, 0x01, 0xdd, 0x2e, 0x73, 0xa7, 0x2c, 0x76, 0xef, 0xd3, 0xa2, 0x67, 0x23, + 0x05, 0x87, 0x76, 0x5d, 0x0b, 0x7b, 0xf5, 0xa0, 0xb9, 0x76, 0x3e, 0x8b, 0xdb, 0x2b, 0x50, 0xf8, 0xb7, 0x35, 0x05, 0xac, 0x50, 0x4d, 0x53, 0xa7, 0x09, 0xe4, 0x69, 0xb9, 0x39, 0xb8, 0x5e, 0x04, + 0xf5, 0xa7, 0x0f, 0xc8, 0x1c, 0x57, 0x56, 0x48, 0x33, 0x40, 0xc2, 0x4e, 0x99, 0x91, 0x62, 0xac, 0xae, 0x6a, 0xcd, 0x5a, 0x67, 0x1c, 0xf9, 0x10, 0x19, 0x28, 0xcc, 0x73, 0x0e, 0xa7, 0x18, 0x16, + 0x7a, 0x43, 0xbe, 0xd8, 0x29, 0xc8, 0xf0, 0xcd, 0x61, 0x39, 0xb4, 0xf6, 0x6d, 0x04, 0x85, 0x2e, 0xc6, 0x99, 0x02, 0xcf, 0x43, 0x34, 0x71, 0x8e, 0xdc, 0x59, 0x29, 0x76, 0x45, 0xe6, 0xa6, 0x13, + 0xc8, 0x96, 0xca, 0x01, 0x20, 0x7f, 0x2d, 0xe7, 0x76, 0xf9, 0x91, 0xbb, 0x92, 0xd7, 0x43, 0x63, 0x87, 0x54, 0x66, 0x68, 0x0b, 0xe6, 0xce, 0xa3, 0x68, 0xa3, 0x03, 0x36, 0x2f, 0x25, 0xaa, 0x26, + 0xe9, 0x97, 0xca, 0x32, 0x0f, 0xd6, 0x90, 0x84, 0xf0, 0x7b, 0x5b, 0xdf, 0x69, 0x6c, 0x8f, 0x71, 0xac, 0xc0, 0x90, 0x69, 0x83, 0x5f, 0x53, 0x20, 0xdb, 0xfa, 0x69, 0xea, 0xd7, 0x44, 0x2c, 0x25, + 0x2a, 0x7a, 0x0c, 0x1a, 0xd3, 0xa3, 0x95, 0x93, 0x9e, 0x09, 0xa7, 0x80, 0x28, 0xa7, 0xd8, 0x4d, 0x79, 0x88, 0xdb, 0xca, 0x61, 0xae, 0x86, 0xdc, 0x53, 0x04, 0x3b, 0x4f, 0x83, 0x9f, 0x0f, 0x0f, + 0x38, 0xe1, 0x1c, 0xa6, 0x2a, 0x0a, 0xd9, 0x1c, 0x0e, 0x60, 0xf8, 0x9b, 0x19, 0xb3, 0x10, 0xea, 0x2e, 0xac, 0x48, 0xb6, 0xfa, 0x02, 0x91, 0x13, 0xf4, 0x97, 0xf5, 0x53, 0x98, 0x6c, 0x17, 0x15, + 0x72, 0xca, 0xb5, 0x43, 0xf1, 0xa4, 0x71, 0x9b, 0x80, 0x41, 0xb0, 0xfb, 0xa1, 0x4a, 0x87, 0x93, 0x64, 0x00, 0x34, 0x7d, 0x4d, 0x30, 0x1f, 0xac, 0xcd, 0x6f, 0xec, 0x27, 0xef, 0x15, 0x7b, 0x26, + 0x5b, 0xb8, 0xec, 0x5b, 0xfb, 0x5f, 0xab, 0xd3, 0x31, 0x3e, 0xac, 0x33, 0x03, 0xd0, 0x46, 0xc7, 0x70, 0xc9, 0x62, 0x82, 0xed, 0xc1, 0x68, 0x70, 0xc1, 0x52, 0x89, 0xe6, 0x1f, 0xea, 0x37, 0x2e, + 0xcc, 0x84, 0xfa, 0xe0, 0xda, 0xc8, 0xa1, 0xd5, 0x14, 0x75, 0x73, 0x62, 0xb7, 0x09, 0xe2, 0x21, 0xde, 0x4d, 0xd5, 0x51, 0x13, 0x28, 0x92, 0x75, 0x44, 0x16, 0x53, 0xf6, 0xb6, 0x7e, 0x22, 0x2b, + 0xf6, 0xd4, 0xc1, 0x1d, 0xc1, 0x6f, 0xb0, 0x78, 0x95, 0x7d, 0x84, 0x90, 0x84, 0xca, 0x87, 0xfa, 0xc9, 0x6d, 0xa1, 0x56, 0x91, 0xb0, 0x3d, 0x7e, 0x5b, 0x54, 0xab, 0xd0, 0x5f, 0xa7, 0xfa, 0x24, + 0x05, 0xae, 0xf9, 0x2c, 0x15, 0xaf, 0xb9, 0x65, 0x24, 0x5e, 0x55, 0xc4, 0x6a, 0x9e, 0x1e, 0x01, 0xd7, 0x1e, 0x4b, 0x63, 0x9e, 0xcf, 0xea, 0x25, 0xe9, 0x36, 0x14, 0xf6, 0xe3, 0x26, 0x4e, 0x16, + 0x89, 0x82, 0xff, 0x2a, 0x9c, 0xcf, 0xe6, 0x5a, 0x7e, 0x72, 0xfa, 0x0e, 0xc5, 0xac, 0x4d, 0x7d, 0x3d, 0x0c, 0x27, 0xa1, 0xcb, 0x70, 0xb1, 0x59, 0xa4, 0x1b, 0x01, 0x5f, 0x9a, 0xe2, 0x8d, 0x2f, + 0xf1, 0xeb, 0x90, 0x86, 0x46, 0xa2, 0x95, 0x51, 0x5a, 0xb1, 0x97, 0xfd, 0x43, 0x42, 0x70, 0xf8, 0xbf, 0x77, 0x0e, 0x07, 0xc7, 0x7b, 0xc2, 0xae, 0xa8, 0x29, 0x57, 0xfd, 0x63, 0x78, 0x13, 0x25, + 0xe8, 0x6b, 0x3e, 0x90, 0x9b, 0xfc, 0x81, 0x51, 0xf3, 0x21, 0x1b, 0xa2, 0xa6, 0x7f, 0x34, 0xe0, 0x19, 0x43, 0x1c, 0x4f, 0x86, 0xae, 0x8c, 0xc5, 0x06, 0x06, 0x23, 0xc2, 0x3f, 0x67, 0xad, 0x11, + 0x07, 0x49, 0xa9, 0x74, 0xec, 0xeb, 0x5e, 0x1c, 0x44, 0xe7, 0x15, 0x21, 0xb5, 0x2a, 0xa9, 0x35, 0x3f, 0x5c, 0x87, 0x4f, 0x60, 0x00, 0x6d, 0xb9, 0xe1, 0xca, 0x5a, 0xeb, 0x64, 0x48, 0x79, 0x2b, + 0x3d, 0xe2, 0xf1, 0xeb, 0x31, 0xae, 0xba, 0xad, 0x3b, 0x8a, 0xf6, 0x3f, 0x3c, 0x03, 0x4b, 0xc1, 0x5c, 0x65, 0x82, 0x28, 0xd1, 0xa2, 0xba, 0x56, 0xbe, 0x7e, 0x69, 0x77, 0x3f, 0x75, 0xc6, 0x1b, + 0x3b, 0xdb, 0xd8, 0xca, 0xa8, 0x8f, 0xa8, 0x4d, 0x1b, 0xc8, 0x4f, 0xb5, 0xbe, 0xf1, 0x00, 0x47, 0x67, 0x81, 0x34, 0x1b, 0x5c, 0xb8, 0x59, 0x86, 0x15, 0x20, 0x5d, 0x72, 0xd4, 0x6d, 0xc0, 0x09, + 0x4c, 0x63, 0x93, 0xfb, 0x0f, 0xc4, 0xa9, 0x2c, 0x81, 0xd4, 0x0c, 0xb9, 0xfd, 0xf0, 0x9a, 0x64, 0x1b, 0x31, 0x6b, 0x8d, 0x2f, 0x1b, 0xa4, 0xef, 0x99, 0xd0, 0xc4, 0x4b, 0x59, 0xcc, 0x26, 0x24, + 0xe3, 0x21, 0x51, 0x97, 0x73, 0xe2, 0x14, 0xfd, 0xd5, 0xe4, 0xfc, 0x91, 0x8e, 0xff, 0x00, 0x7c, 0xf1, 0x56, 0xf0, 0xb4, 0xb5, 0xd2, 0x45, 0x45, 0xf7, 0x0c, 0x1f, 0x5d, 0xe4, 0xf3, 0x98, 0x10, + 0xe1, 0xa2, 0x55, 0x34, 0xed, 0x6b, 0x1e, 0xab, 0xec, 0xb2, 0x7d, 0x36, 0xdd, 0x43, 0x3b, 0xc1, 0xad, 0xdb, 0x12, 0x33, 0x5b, 0x0b, 0xd1, 0x21, 0xcb, 0x0d, 0x30, 0x4b, 0xe1, 0xd7, 0xc8, 0x0c, + 0xe5, 0x49, 0xcd, 0x12, 0xb5, 0x4a, 0x5f, 0x9f, 0x70, 0x01, 0x67, 0x0e, 0x5b, 0x4a, 0xa4, 0xba, 0x1a, 0x7b, 0xd5, 0xd6, 0x9d, 0x3a, 0x8e, 0xd8, 0x4a, 0x89, 0xc7, 0x2f, 0x76, 0x9f, 0xcc, 0x0e, + 0xf4, 0x49, 0x41, 0xc4, 0x7b, 0x5c, 0x0d, 0xe4, 0x00, 0x93, 0x70, 0x5b, 0x0d, 0x15, 0x05, 0x15, 0xc7, 0x46, 0xbf, 0xac, 0x60, 0xdf, 0x28, 0xc9, 0x4b, 0xa9, 0x1e, 0x4d, 0x38, 0x8c, 0xd2, 0x0c, + 0xeb, 0x9c, 0x2e, 0x16, 0xe7, 0xb9, 0x27, 0x1f, 0x59, 0xd9, 0x81, 0x8e, 0x88, 0xfa, 0x50, 0x8b, 0xaf, 0x3e, 0x48, 0x65, 0x1b, 0xf4, 0x3f, 0x35, 0x05, 0x6f, 0xee, 0xe2, 0xf5, 0x5c, 0xfe, 0x0c, + 0x46, 0xb1, 0x4e, 0x3b, 0xb4, 0x2d, 0xc5, 0x48, 0xa8, 0x9f, 0x9d, 0x37, 0x6d, 0x63, 0x8c, 0x56, 0xf2, 0xa8, 0xbe, 0xc8, 0x1b, 0x69, 0x31, 0xee, 0x96, 0xa7, 0x4e, 0x34, 0x2c, 0x48, 0xd7, 0x0e, + 0xb6, 0xfc, 0xc8, 0xd9, 0xd1, 0x8b, 0xc4, 0x0d, 0xb6, 0x33, 0x8f, 0xed, 0x6b, 0x1f, 0x20, 0x1e, 0xc7, 0x21, 0xe6, 0xbb, 0x90, 0xb5, 0x6a, 0xb1, 0x3d, 0x89, 0x02, 0xdc, 0x7d, 0x8f, 0x41, 0x26, + 0x10, 0x66, 0x3b, 0xac, 0xd0, 0xf4, 0x32, 0x5a, 0xbe, 0x57, 0xef, 0xd3, 0x8d, 0x10, 0x33, 0x41, 0xc8, 0x4b, 0xab, 0x8a, 0x12, 0x9c, 0xa6, 0x04, 0xd8, 0x1a, 0xc9, 0xb7, 0x16, 0x76, 0xcf, 0x15, + 0xef, 0x95, 0x79, 0x10, 0x97, 0x79, 0x7e, 0x91, 0xc8, 0xe9, 0x15, 0xd6, 0xd1, 0x29, 0xad, 0xa2, 0xd1, 0x1a, 0xf8, 0xe2, 0x63, 0x1d, 0xc4, 0x97, 0xb8, 0xab, 0xf1, 0x22, 0x08, 0x0a, 0xaf, 0x11, + 0x6a, 0x6e, 0xb1, 0x15, 0x78, 0x89, 0xbf, 0xe5, 0xb4, 0x8e, 0xa7, 0x49, 0x72, 0xe2, 0x7b, 0xa6, 0xac, 0xb7, 0x2c, 0x06, 0xd0, 0x2e, 0xac, 0xa9, 0x24, 0x19, 0x17, 0x9e, 0xe8, 0xc0, 0x5a, 0x29, + 0xcd, 0xbf, 0x2e, 0xf7, 0x2b, 0x50, 0xec, 0xb0, 0xf6, 0xe8, 0xe5, 0x8e, 0xb9, 0xf8, 0x41, 0x28, 0xa0, 0xce, 0x6a, 0x08, 0xd4, 0x45, 0x30, 0xdb, 0x0a, 0xbf, 0xe1, 0xa4, 0x69, 0x4c, 0x44, 0x0c, + 0xb7, 0x1d, 0x65, 0xed, 0xbf, 0xd3, 0x0e, 0x74, 0x38, 0x9c, 0xda, 0x61, 0xa5, 0xe9, 0xdb, 0x93, 0x5d, 0xa1, 0xf8, 0xc1, 0xea, 0x79, 0x69, 0xe6, 0x10, 0x2a, 0xbf, 0x6c, 0x01, 0x47, 0x96, 0x0d, + 0xd2, 0xf3, 0xd9, 0xaf, 0x91, 0x14, 0x0d, 0xee, 0xf9, 0xe8, 0x71, 0x36, 0x7f, 0x1b, 0x34, 0x06, 0x27, 0x3b, 0xe9, 0x9b, 0x52, 0xce, 0x3b, 0xc1, 0x6d, 0xc8, 0x73, 0xe7, 0x74, 0x47, 0xff, 0x05, + 0x65, 0xb4, 0xf4, 0x9f, 0xfb, 0x50, 0x80, 0x9f, 0x73, 0x4c, 0x04, 0x65, 0xa3, 0xd0, 0xf6, 0x35, 0x5b, 0x24, 0xc8, 0x60, 0xa9, 0x4b, 0x04, 0xfb, 0x22, 0x15, 0x16, 0xd6, 0x2e, 0xc6, 0xfd, 0x2e, + 0x92, 0xd2, 0xdc, 0x59, 0x26, 0x92, 0x0f, 0x04, 0x49, 0xe1, 0x6b, 0xc9, 0x1a, 0x67, 0xe2, 0xb1, 0xb7, 0x01, 0x56, 0x97, 0x14, 0xcf, 0x0b, 0xdc, 0x35, 0x9b, 0x28, 0xbd, 0x50, 0x3f, 0x9a, 0x25, + 0x65, 0xc3, 0xd3, 0xde, 0xd9, 0x95, 0xd7, 0x2d, 0x3a, 0x99, 0xbd, 0xa4, 0x24, 0x6c, 0xda, 0x89, 0x22, 0xf6, 0x21, 0x4b, 0x2f, 0xd0, 0x57, 0x88, 0x98, 0xad, 0x84, 0x8d, 0x5c, 0x76, 0x65, 0x23, + 0x30, 0x9f, 0xac, 0xca, 0x92, 0x8c, 0x56, 0x97, 0xa0, 0x8c, 0xaf, 0x33, 0x92, 0xcf, 0x15, 0x7b, 0xc2, 0xc1, 0xd9, 0xee, 0x61, 0xc8, 0xc4, 0xd8, 0xc8, 0x88, 0xf1, 0x21, 0xf9, 0xdb, 0x35, 0x06, + 0x8b, 0x3a, 0x42, 0xde, 0x63, 0xd0, 0xa0, 0x19, 0xaa, 0x9b, 0xf0, 0x08, 0xcf, 0x8c, 0x48, 0xe0, 0x4b, 0x6d, 0x05, 0x6f, 0x9d, 0x47, 0x64, 0xfb, 0xfa, 0xcf, 0xf0, 0xad, 0x31, 0xa9, 0x0f, 0x07, + 0x0b, 0x51, 0xbb, 0xee, 0xc9, 0xab, 0xc7, 0xef, 0xe7, 0x8b, 0x17, 0x63, 0x1b, 0xcd, 0xc8, 0x04, 0xa3, 0xcc, 0x57, 0x05, 0xea, 0x29, 0x41, 0xc8, 0xde, 0x2b, 0x06, 0xe9, 0x3c, 0x78, 0xe0, 0x0c, + 0x86, 0xbf, 0xde, 0xd9, 0x8f, 0x9c, 0x41, 0x05, 0xd7, 0x8d, 0x9c, 0xf7, 0xeb, 0x7c, 0x94, 0xbe, 0xd8, 0xb9, 0x9c, 0x18, 0x79, 0x5c, 0x04, 0x6c, 0xd7, 0x00, 0x5b, 0xa0, 0xd8, 0xc5, 0x3f, 0x25, + 0xe5, 0x53, 0x1c, 0x56, 0xe8, 0x8b, 0xe0, 0x63, 0x59, 0xaf, 0x90, 0xad, 0xbf, 0x9e, 0x49, 0x63, 0x19, 0x63, 0x7b, 0xd4, 0x6d, 0x5f, 0x20, 0x7d, 0x36, 0xc8, 0xc5, 0xb9, 0xc8, 0x63, 0xee, 0x2b, + 0x0d, 0xe1, 0x1a, 0x9e, 0x83, 0x42, 0xe4, 0xb0, 0x23, 0x4e, 0x31, 0xef, 0xab, 0x01, 0xe0, 0x82, 0x10, 0xbe, 0x6d, 0x20, 0x00, 0x67, 0xa7, 0x7c, 0x77, 0x24, 0x8c, 0xf4, 0x44, 0xa9, 0x1b, 0x0e, + 0xdb, 0x4c, 0x48, 0x6c, 0x9d, 0x8a, 0xf6, 0xfd, 0xfb, 0xa6, 0x7e, 0x4c, 0xd1, 0xf7, 0xb3, 0x75, 0x76, 0x35, 0x1d, 0x21, 0x05, 0xfb, 0xc2, 0x12, 0x02, 0x97, 0x1b, 0xe6, 0xd4, 0xb1, 0xe7, 0x0a, + 0x0d, 0x34, 0xf6, 0x3f, 0xa0, 0x16, 0xad, 0xd0, 0xc7, 0x3f, 0xe0, 0xa4, 0x54, 0x57, 0xfb, 0x4c, 0x29, 0x48, 0xbe, 0x17, 0x12, 0xc9, 0x18, 0x34, 0x6d, 0x62, 0xb3, 0x7b, 0x47, 0x8e, 0x77, 0x15, + 0x39, 0x8b, 0x34, 0xc4, 0x3f, 0x27, 0x69, 0xcd, 0x63, 0xde, 0x56, 0xc8, 0x2c, 0x36, 0x0e, 0x50, 0xae, 0x59, 0xe4, 0xc3, 0x54, 0x25, 0xbd, 0x54, 0xc9, 0x6f, 0x8e, 0xcd, 0xe8, 0xe8, 0xc3, 0x1d, + 0x6a, 0x51, 0x6b, 0x8a, 0x67, 0xdc, 0xd3, 0x99, 0xf0, 0x0d, 0x26, 0x21, 0xd0, 0x35, 0x61, 0x0f, 0x57, 0x85, 0x39, 0x9a, 0x5f, 0xc1, 0x98, 0xd8, 0xf5, 0xdf, 0x83, 0x7f, 0x40, 0x07, 0x99, 0x2c, + 0x8f, 0xfb, 0x65, 0x2f, 0x53, 0x2a, 0xe9, 0xd4, 0xa7, 0x6f, 0x5a, 0x4c, 0xd0, 0x7c, 0x09, 0x95, 0xe9, 0xd5, 0x83, 0x31, 0xa6, 0x08, 0xf5, 0x57, 0x3a, 0x95, 0xe0, 0x19, 0x6e, 0x01, 0x48, 0x30, + 0x16, 0xa2, 0x37, 0xfd, 0x00, 0x37, 0xe7, 0x51, 0xbb, 0xca, 0x50, 0x4b, 0xd4, 0x4d, 0xbb, 0x42, 0x53, 0x82, 0x66, 0x58, 0x8a, 0x7b, 0x78, 0x6c, 0x66, 0x08, 0x73, 0xba, 0x2e, 0x15, 0xe9, 0x15, + 0xb0, 0x61, 0xbd, 0x99, 0xa4, 0xee, 0x84, 0xf1, 0xac, 0x0a, 0x09, 0xc9, 0xac, 0x74, 0x97, 0x1d, 0xf0, 0x36, 0x8a, 0xc8, 0x4b, 0x56, 0x77, 0xce, 0xbf, 0x91, 0xdb, 0xfb, 0x55, 0x88, 0x1c, 0x29, + 0x8c, 0xd4, 0x4c, 0x7c, 0x1f, 0x1f, 0x58, 0xf6, 0x25, 0x06, 0x99, 0x38, 0x24, 0x53, 0xe0, 0x57, 0x5f, 0xc4, 0x8f, 0xa3, 0x77, 0x22, 0x0b, 0x71, 0x02, 0x9e, 0x89, 0xa1, 0x32, 0x2d, 0xa0, 0x00, + 0x03, 0xda, 0xad, 0xff, 0xc3, 0x1a, 0x2d, 0x10, 0xdd, 0x3e, 0x6d, 0xaa, 0x2a, 0x72, 0xc7, 0x00, 0xf2, 0xd5, 0xdd, 0xdb, 0x1f, 0xc5, 0x0d, 0x77, 0x3a, 0x15, 0xd4, 0x1c, 0x51, 0xe2, 0x46, 0x21, + 0xa8, 0x86, 0x15, 0x88, 0x0a, 0xbb, 0xd2, 0xfc, 0xd4, 0x27, 0x13, 0x72, 0x8c, 0x0f, 0x77, 0x97, 0xfd, 0x52, 0x42, 0xfe, 0xed, 0xe7, 0x75, 0x34, 0x7c, 0x2d, 0x08, 0x9b, 0xf8, 0xda, 0xa1, 0x11, + 0xe2, 0x85, 0x57, 0xd2, 0x8b, 0xc9, 0x73, 0xd9, 0x75, 0x78, 0xa9, 0x8c, 0x1d, 0xcb, 0x39, 0x34, 0x3b, 0x49, 0x7f, 0xa1, 0xff, 0xc9, 0x19, 0x45, 0x6a, 0xb6, 0xf6, 0x79, 0xe7, 0x73, 0x75, 0x2a, + 0xf9, 0x04, 0xcd, 0x84, 0x31, 0xe9, 0x37, 0xea, 0x91, 0xae, 0x4a, 0x17, 0x41, 0xa4, 0x90, 0x89, 0x74, 0xf1, 0x9a, 0x12, 0x6f, 0x57, 0x14, 0x57, 0xce, 0x89, 0xd5, 0x79, 0x15, 0x85, 0xab, 0x1c, + 0xdf, 0x9a, 0xa8, 0x79, 0xe9, 0xb5, 0xe3, 0x2a, 0xb3, 0xc9, 0x62, 0x1f, 0xd4, 0x97, 0x51, 0x8a, 0x01, 0xd1, 0xff, 0x1c, 0x36, 0xad, 0x23, 0x31, 0xee, 0xc3, 0xc6, 0xe2, 0xd8, 0xac, 0x7a, 0x0d, + 0x2b, 0xe6, 0x1b, 0x97, 0x44, 0x7e, 0x78, 0xec, 0xc7, 0x81, 0x40, 0x0b, 0x91, 0xb1, 0x93, 0x29, 0x3f, 0x28, 0x4c, 0x37, 0x0f, 0xd0, 0x0e, 0xb5, 0xd5, 0xf9, 0x75, 0x05, 0x71, 0xa6, 0xdd, 0x22, + 0x28, 0xcd, 0xb1, 0x7f, 0x1f, 0xaa, 0xac, 0xf2, 0x90, 0x05, 0xed, 0x8d, 0xbe, 0x6e, 0x1c, 0x4f, 0xdd, 0xc4, 0xaf, 0x06, 0x5f, 0xdd, 0x89, 0xae, 0x39, 0x24, 0x35, 0x42, 0x7f, 0x91, 0x5f, 0x30, + 0x2e, 0x72, 0x88, 0xbb, 0xe3, 0x5e, 0x7f, 0x3f, 0xd9, 0x73, 0x9c, 0x5e, 0xbd, 0x7a, 0x53, 0x74, 0xff, 0xf1, 0xff, 0xc9, 0x13, 0x2a, 0x52, 0x21, 0x2c, 0x3c, 0x1e, 0x26, 0x59, 0x5b, 0x72, 0x22, + 0x58, 0xf8, 0xd9, 0x1e, 0x0d, 0xb0, 0x35, 0x51, 0x3b, 0x90, 0x0e, 0x85, 0x59, 0x4d, 0x78, 0xe8, 0x3e, 0x79, 0x67, 0x0e, 0xb4, 0xbc, 0xc5, 0x14, 0x89, 0xd4, 0x39, 0x3f, 0x9c, 0x04, 0x31, 0x13, + 0x36, 0x39, 0x14, 0x19, 0x7a, 0xe4, 0xd9, 0x3e, 0xf4, 0x07, 0x91, 0x01, 0xb7, 0x52, 0x19, 0x06, 0x52, 0x38, 0xf4, 0xe8, 0xa1, 0x9e, 0x77, 0xa8, 0xe8, 0xf9, 0xe2, 0x61, 0x66, 0xcf, 0x02, 0x06, + 0x99, 0xed, 0xe5, 0x0a, 0x4f, 0x71, 0xb9, 0xf4, 0x6a, 0x22, 0x0a, 0xfd, 0xae, 0x80, 0x6f, 0xed, 0x5a, 0x12, 0x4e, 0x76, 0x45, 0x19, 0x3d, 0x73, 0xf9, 0x9a, 0xc6, 0x76, 0x44, 0xc1, 0x3f, 0x25, + 0x02, 0xa8, 0xa7, 0x90, 0xb6, 0x4a, 0x85, 0x5f, 0x26, 0x79, 0x43, 0xad, 0x9b, 0x66, 0x96, 0x7c, 0x06, 0xa7, 0x86, 0x65, 0xe3, 0xb6, 0x7e, 0xfa, 0x96, 0x24, 0x89, 0x9d, 0xdb, 0x58, 0xe8, 0x03, + 0xa8, 0x61, 0x2a, 0x84, 0xe7, 0x97, 0xba, 0x10, 0x91, 0x74, 0xce, 0x4d, 0x2e, 0xf0, 0x6c, 0x5f, 0x5e, 0x46, 0xb2, 0x09, 0xc9, 0xe0, 0xc5, 0x42, 0xc6, 0x20, 0x1d, 0x30, 0x11, 0xda, 0x31, 0x0d, + 0x7c, 0x8c, 0xbc, 0x95, 0x5f, 0x15, 0x31, 0x31, 0xda, 0x21, 0x1a, 0x91, 0x10, 0x1a, 0xe5, 0x8d, 0x11, 0x58, 0x4a, 0xf7, 0x6b, 0x7b, 0x15, 0xcd, 0x05, 0x8a, 0x2c, 0x68, 0xbb, 0x37, 0xe8, 0x25, + 0xf1, 0x94, 0x91, 0xe4, 0x4b, 0x23, 0x16, 0x02, 0x5b, 0x57, 0x40, 0x4a, 0x77, 0xdf, 0xba, 0xdc, 0xed, 0x4e, 0x3e, 0x44, 0xfe, 0x4c, 0xc9, 0xc1, 0x95, 0x32, 0x2d, 0x25, 0x2e, 0x67, 0x89, 0x2b, + 0xb4, 0x5c, 0xc9, 0x87, 0xa7, 0x49, 0x58, 0x31, 0x87, 0x12, 0x4d, 0x01, 0xf6, 0x01, 0xee, 0x09, 0xd3, 0xc1, 0x32, 0x27, 0xb0, 0x98, 0x31, 0xa1, 0xa6, 0x33, 0x3c, 0x69, 0x64, 0x17, 0xaf, 0x01, + 0x08, 0x57, 0x70, 0x7a, 0x1f, 0x80, 0xf0, 0x53, 0x9c, 0xed, 0x5d, 0xd6, 0x60, 0xdd, 0x45, 0xdb, 0xa6, 0x1b, 0x3b, 0x2e, 0x13, 0x77, 0xb5, 0xd5, 0x99, 0x18, 0x4c, 0xcf, 0xc7, 0x5e, 0x34, 0x08, + 0x52, 0x9e, 0xbe, 0xf0, 0xd4, 0x19, 0x28, 0x85, 0x64, 0x22, 0x7d, 0x55, 0x8e, 0x91, 0x41, 0x2d, 0xb8, 0x98, 0xb7, 0x5f, 0x26, 0x0c, 0xe6, 0x8f, 0x8a, 0x64, 0x39, 0x31, 0x53, 0xf5, 0x56, 0x2d, + 0x67, 0x44, 0xba, 0xc6, 0x82, 0x19, 0xa1, 0x0a, 0xa1, 0xa0, 0x43, 0x23, 0xc0, 0x59, 0x8c, 0x8a, 0x32, 0x69, 0xed, 0x50, 0x42, 0x36, 0xa4, 0xd5, 0xc8, 0x62, 0x42, 0xcc, 0xb2, 0x7d, 0xda, 0x16, + 0xd2, 0x43, 0x05, 0x43, 0x03, 0xeb, 0x6d, 0x66, 0xd0, 0x01, 0x07, 0x60, 0x0d, 0xc7, 0xdb, 0x50, 0x5d, 0xb1, 0x28, 0x6b, 0x42, 0xd8, 0xa0, 0x00, 0xbd, 0x9e, 0xb9, 0x70, 0x10, 0x53, 0xb4, 0x13, + 0xb4, 0x18, 0xca, 0x02, 0xb9, 0x0f, 0x69, 0x55, 0x19, 0x8e, 0xcc, 0x40, 0xc1, 0xdb, 0x5e, 0x81, 0x7f, 0x33, 0xc2, 0xe3, 0x11, 0xff, 0xa4, 0x66, 0x19, 0xaa, 0x23, 0x4f, 0x7f, 0x3b, 0xaa, 0x1e, + 0x32, 0x41, 0xfe, 0xed, 0x2f, 0xe8, 0xd8, 0x97, 0xbd, 0x45, 0x5b, 0xff, 0xd0, 0x82, 0x12, 0x6a, 0x06, 0xa6, 0xa7, 0x38, 0x02, 0x96, 0xc5, 0x7b, 0x6b, 0x64, 0xde, 0xdc, 0xea, 0x38, 0x15, 0x12, + 0x9b, 0x92, 0x3a, 0xde, 0x39, 0x0f, 0x1e, 0xbe, 0x1b, 0x61, 0x7f, 0xc4, 0x22, 0xd9, 0xc6, 0x87, 0x7c, 0x06, 0x31, 0x4b, 0x61, 0xeb, 0x29, 0x76, 0x6a, 0x38, 0xf1, 0xc9, 0x01, 0x63, 0x53, 0x21, + 0x72, 0xb1, 0x00, 0x49, 0xcd, 0xd7, 0xbf, 0xe5, 0x61, 0x4d, 0xa1, 0x50, 0x63, 0xca, 0x61, 0x24, 0x97, 0xf5, 0x9e, 0xfc, 0x1e, 0x7f, 0x71, 0x04, 0xff, 0x85, 0xab, 0xa8, 0x03, 0x35, 0x60, 0x28, + 0x10, 0xdf, 0x37, 0x8b, 0xbd, 0xbc, 0x07, 0xb8, 0x62, 0xb3, 0xe4, 0x0e, 0x50, 0xa8, 0x90, 0xc5, 0x00, 0xf5, 0xa2, 0x84, 0x34, 0x1b, 0xbb, 0x75, 0x6d, 0x47, 0x38, 0x01, 0xb3, 0x36, 0xc7, 0x29, + 0xa1, 0x8e, 0x4e, 0xfd, 0x5d, 0xa0, 0x53, 0xaa, 0xdd, 0xe4, 0x56, 0xe7, 0xe3, 0x64, 0xcd, 0xe0, 0x8a, 0xb0, 0x35, 0x0a, 0xde, 0xfd, 0x9b, 0x7a, 0xfb, 0x6e, 0x66, 0x1e, 0x2a, 0x43, 0x54, 0x17, + 0xc9, 0x1f, 0x9c, 0x2c, 0x8c, 0x8d, 0xd6, 0xf3, 0x8b, 0xd9, 0x35, 0x8b, 0x14, 0x6b, 0xfb, 0x3c, 0x31, 0x88, 0xaa, 0xe0, 0xef, 0xfa, 0xfc, 0x42, 0x57, 0xb4, 0xc3, 0x86, 0xd2, 0xf9, 0x46, 0x05, + 0x70, 0xc5, 0xfb, 0x86, 0x4f, 0xe3, 0x3f, 0xd5, 0xc3, 0xf4, 0x92, 0x8b, 0xbd, 0x27, 0xe2, 0x7c, 0xcb, 0xc1, 0x32, 0xd8, 0xa1, 0x4c, 0x3a, 0xfe, 0x1b, 0x82, 0x9c, 0xbc, 0x12, 0x75, 0x36, 0x16, + 0x95, 0xfc, 0x1b, 0x51, 0x84, 0x75, 0xba, 0x57, 0x0d, 0x31, 0x6c, 0xa0, 0x73, 0xdb, 0x7c, 0xab, 0xd7, 0x5d, 0xd4, 0x37, 0x13, 0x1c, 0x17, 0xaa, 0x02, 0x5f, 0xd5, 0x8a, 0xe6, 0x1e, 0x6d, 0x09, + 0x26, 0xd5, 0xc1, 0x0e, 0x87, 0xf7, 0x4f, 0xcd, 0x2d, 0x10, 0x61, 0x87, 0xe8, 0x7d, 0x6b, 0x8e, 0xc2, 0xda, 0x46, 0xd9, 0x97, 0x25, 0x21, 0xcc, 0xb9, 0x63, 0x7a, 0xff, 0xd0, 0x0b, 0x76, 0x0c, + 0xf4, 0x57, 0x54, 0xf0, 0xb2, 0x36, 0xe0, 0xf9, 0x7d, 0xf4, 0xd9, 0xfa, 0xf5, 0xbc, 0xd3, 0xe8, 0x22, 0x23, 0x78, 0x55, 0x03, 0xaa, 0x5b, 0x8c, 0xc6, 0xe6, 0xb4, 0xf2, 0xa7, 0x72, 0x96, 0x2c, + 0xc5, 0x35, 0xd4, 0xfe, 0x93, 0x9e, 0x5e, 0x4e, 0x80, 0xd1, 0xac, 0x50, 0x95, 0x0c, 0x18, 0xaa, 0x68, 0x71, 0x66, 0xea, 0x1c, 0x26, 0x34, 0xd5, 0x03, 0xf7, 0x92, 0x5a, 0x1c, 0x4b, 0xd1, 0x21, + 0x4a, 0x2f, 0x48, 0xab, 0x76, 0xea, 0xdb, 0xe7, 0x44, 0x8f, 0x24, 0x92, 0x2f, 0x3f, 0x93, 0x37, 0x4c, 0xa9, 0x00, 0x7b, 0x79, 0xf8, 0x05, 0xcf, 0x1e, 0xd8, 0x24, 0xb1, 0x51, 0xdf, 0x02, 0x09, + 0x02, 0xf7, 0x0a, 0xa0, 0x9e, 0xf3, 0x75, 0xb0, 0x8f, 0x19, 0xe5, 0x76, 0xca, 0x97, 0x78, 0xed, 0x95, 0x06, 0xa6, 0x04, 0x23, 0x6f, 0x3b, 0x3a, 0x3b, 0x6c, 0x98, 0x1b, 0x64, 0xc5, 0x2f, 0x0c, + 0x52, 0x64, 0x5c, 0xa4, 0x84, 0x20, 0x40, 0xfb, 0x42, 0xec, 0x6b, 0xe3, 0x78, 0x85, 0x66, 0x81, 0xed, 0x36, 0xa0, 0x6c, 0xb3, 0x83, 0x84, 0x99, 0xed, 0x37, 0xac, 0x2b, 0x25, 0x64, 0x2f, 0x2f, + 0x61, 0x19, 0xef, 0x15, 0x95, 0x09, 0x7b, 0x0b, 0x3e, 0x12, 0x34, 0xad, 0x09, 0xf8, 0xb5, 0x53, 0x05, 0x04, 0xf1, 0x22, 0x6a, 0xd3, 0x90, 0x91, 0x3a, 0x27, 0xb7, 0x72, 0x70, 0x16, 0x4d, 0x2d, + 0x2d, 0x5e, 0x15, 0xf3, 0x5a, 0xaf, 0xe3, 0x67, 0x28, 0x26, 0xc8, 0xca, 0x3a, 0xea, 0x1b, 0x26, 0xce, 0x27, 0x8a, 0x39, 0x91, 0x79, 0x95, 0xc1, 0x92, 0xbb, 0xb8, 0x46, 0x85, 0xa0, 0x77, 0x0e, + 0x99, 0xaf, 0xb2, 0xce, 0xaa, 0x4c, 0x58, 0xf2, 0xb9, 0xe9, 0x55, 0x17, 0x7a, 0x7f, 0x69, 0x27, 0xc6, 0xe5, 0x83, 0x8e, 0xaa, 0x56, 0xf4, 0xfc, 0x3a, 0x1d, 0x3a, 0xf7, 0x07, 0x6b, 0x9d, 0x2a, + 0xe2, 0x36, 0xd6, 0x60, 0x6e, 0x1e, 0x32, 0xed, 0xae, 0x8f, 0xf6, 0x98, 0x83, 0xa8, 0x60, 0xb2, 0x40, 0x3c, 0x0d, 0xd9, 0x40, 0x8e, 0xed, 0x23, 0x7e, 0x13, 0xe5, 0x5a, 0x09, 0x61, 0xac, 0x2e, + 0xc2, 0x79, 0x86, 0x9e, 0xf5, 0x09, 0x2b, 0x2a, 0x56, 0xa0, 0x29, 0xbc, 0x1e, 0x69, 0x67, 0x1b, 0x4c, 0xeb, 0x5d, 0x6b, 0xfc, 0xb5, 0xc8, 0x95, 0xd3, 0xc4, 0x58, 0x52, 0xa7, 0x52, 0x96, 0x22, + 0xbb, 0x08, 0xb3, 0xeb, 0x6f, 0xcf, 0x43, 0x62, 0xae, 0xd0, 0x4d, 0x0b, 0x64, 0x50, 0x78, 0x3d, 0xcb, 0xbc, 0x18, 0xe7, 0xf2, 0xe2, 0xcf, 0x00, 0x5a, 0x15, 0x9c, 0x58, 0x21, 0xbe, 0x5d, 0x11, + 0x37, 0x07, 0x07, 0xf8, 0xfd, 0xc7, 0xea, 0x66, 0xf0, 0xe2, 0x8c, 0x2b, 0x1d, 0xa4, 0x75, 0x4a, 0x57, 0x47, 0xf9, 0x3c, 0x21, 0x12, 0x4b, 0x3b, 0x72, 0xb8, 0x8f, 0xe0, 0x0b, 0x5c, 0x65, 0x29, + 0x97, 0x02, 0x27, 0x91, 0x9a, 0x48, 0x93, 0xbd, 0x81, 0x2e, 0x08, 0xd2, 0x35, 0x03, 0xc9, 0xb5, 0x93, 0x3c, 0x33, 0xce, 0x82, 0x38, 0x88, 0x5a, 0x2a, 0x30, 0x98, 0x96, 0xb4, 0xdd, 0xd4, 0x10, + 0xcb, 0x03, 0x93, 0x45, 0x1f, 0x0f, 0xef, 0x9f, 0xab, 0x9a, 0xd8, 0xc0, 0xf3, 0x19, 0xe3, 0xb1, 0xfa, 0x60, 0x21, 0x69, 0xd1, 0xab, 0x46, 0x70, 0x3b, 0x75, 0x47, 0x29, 0x2b, 0x36, 0x90, 0x08, + 0x73, 0x09, 0xd8, 0x18, 0x4b, 0x8d, 0xb5, 0xe7, 0x93, 0xb3, 0x95, 0xd7, 0x6a, 0xe2, 0x73, 0xab, 0x7b, 0xd4, 0x1e, 0x73, 0xf0, 0x2c, 0xe0, 0xbe, 0x0e, 0x04, 0x6e, 0x23, 0x72, 0x58, 0x7a, 0x2f, + 0xa3, 0x36, 0x55, 0x6d, 0xa4, 0xe8, 0x11, 0xc8, 0x7b, 0x00, 0x55, 0x90, 0x71, 0xc8, 0x4b, 0xf7, 0x48, 0xb5, 0x9a, 0xff, 0x18, 0x9b, 0xf1, 0x26, 0x9b, 0x87, 0xda, 0xeb, 0x23, 0x5f, 0x97, 0x2f, + 0x1e, 0xf4, 0xd5, 0xf2, 0x3f, 0x80, 0xfb, 0xc1, 0x7d, 0xff, 0x93, 0xbe, 0xf4, 0x3a, 0xfc, 0x37, 0x19, 0xd5, 0xaa, 0xc2, 0x07, 0xe9, 0x06, 0x4b, 0xac, 0xca, 0x5c, 0xe3, 0x25, 0xb7, 0xed, 0x11, + 0x7e, 0xca, 0x11, 0xd2, 0x83, 0xcb, 0x4c, 0xea, 0x0f, 0x31, 0xcf, 0x49, 0x87, 0x97, 0x5b, 0x06, 0xb5, 0x8b, 0x8a, 0xab, 0xa9, 0x53, 0x67, 0xa3, 0x04, 0x89, 0x9d, 0x22, 0xf7, 0xa4, 0x8c, 0x12, + 0x49, 0x36, 0x44, 0x9f, 0xe9, 0x5a, 0x2e, 0x1b, 0x65, 0x35, 0x12, 0x79, 0x74, 0xeb, 0x62, 0xa0, 0x25, 0xba, 0x27, 0xab, 0xe4, 0x13, 0xaf, 0x09, 0x1a, 0x9d, 0x45, 0x0e, 0x59, 0x1b, 0xc1, 0x28, + 0x0f, 0x89, 0xa0, 0x2c, 0x6a, 0x2e, 0xa9, 0xd0, 0x61, 0xcb, 0x72, 0x9b, 0x6c, 0x88, 0x69, 0x20, 0xb3, 0x0d, 0x71, 0x95, 0xfc, 0x57, 0xd2, 0x44, 0xb6, 0xe4, 0x5f, 0x3c, 0xc0, 0xae, 0x64, 0x1c, + 0xe5, 0x74, 0xd0, 0xa8, 0x6f, 0x8c, 0xf7, 0x5c, 0x68, 0xb8, 0x03, 0x0e, 0xdb, 0xdd, 0xb3, 0x68, 0x09, 0xd9, 0x9f, 0xb7, 0x87, 0xd4, 0xba, 0x36, 0x1a, 0xf4, 0x93, 0x28, 0x8d, 0x23, 0x89, 0x0e, + 0xc6, 0x68, 0xa5, 0xc8, 0x8e, 0x13, 0x09, 0x31, 0x76, 0xcd, 0xd0, 0xbf, 0x5a, 0x5a, 0x43, 0xe9, 0x9e, 0x21, 0x56, 0x06, 0x9b, 0x3d, 0x17, 0x4f, 0xd6, 0x45, 0x7e, 0xd1, 0x31, 0xea, 0xd3, 0x17, + 0x00, 0xf0, 0x81, 0xb1, 0xcb, 0xee, 0x37, 0x57, 0x57, 0xca, 0x23, 0x9e, 0x74, 0x54, 0x1d, 0xef, 0x07, 0xfc, 0x52, 0x2e, 0x9b, 0xc6, 0xa0, 0x49, 0x01, 0x68, 0xae, 0x74, 0xf6, 0xa7, 0xb0, 0x0c, + 0x21, 0x6a, 0x84, 0x6c, 0xb5, 0xec, 0x15, 0x43, 0xc8, 0x25, 0x90, 0x08, 0xe8, 0x97, 0x02, 0x05, 0x26, 0xd4, 0x3d, 0xac, 0xbc, 0x3c, 0xb6, 0x20, 0x26, 0x5a, 0x7b, 0x61, 0x3f, 0xf7, 0x77, 0x27, + 0xae, 0x3e, 0xa6, 0xfb, 0x59, 0x40, 0x5b, 0x03, 0x35, 0x2b, 0x65, 0x50, 0x14, 0x34, 0x2b, 0x8d, 0x1a, 0x99, 0x8f, 0xc2, 0x45, 0x90, 0x84, 0x90, 0x84, 0x50, 0x38, 0x78, 0x57, 0x0c, 0x88, 0x04, + 0xd0, 0x95, 0x79, 0x19, 0xd1, 0xcf, 0x58, 0x8b, 0x52, 0x8a, 0x80, 0xa6, 0x5f, 0x98, 0xb8, 0xb3, 0x76, 0x0c, 0x14, 0xf6, 0xe4, 0xad, 0xcc, 0xc9, 0x90, 0x8e, 0x9b, 0x21, 0xcc, 0x0a, 0xda, 0x16, + 0x47, 0x89, 0xb9, 0xa7, 0xc6, 0x7d, 0xfc, 0xb3, 0x6f, 0x3b, 0x8c, 0xc0, 0xad, 0xf9, 0xde, 0x7d, 0x00, 0x3f, 0x6c, 0x78, 0xb4, 0x8d, 0xdb, 0xe6, 0x60, 0x4c, 0x23, 0x8a, 0x15, 0x54, 0x26, 0x00, + 0x24, 0xc9, 0xf6, 0xb5, 0xf3, 0x87, 0x38, 0x14, 0xb0, 0x4b, 0xfb, 0x4d, 0x26, 0x0b, 0x24, 0x49, 0x1f, 0x5c, 0x5b, 0x88, 0xb4, 0x66, 0xfb, 0xe8, 0x12, 0x49, 0xc6, 0xe6, 0x6d, 0x77, 0x44, 0x0a, + 0x84, 0x2f, 0x65, 0xa1, 0xfe, 0xdd, 0x3b, 0xa0, 0xc7, 0xed, 0x20, 0x3a, 0xda, 0x5e, 0x2b, 0xbe, 0xaf, 0x49, 0xc4, 0xca, 0x00, 0x06, 0xb6, 0x3b, 0x38, 0x16, 0xf2, 0x2f, 0xa4, 0x39, 0x12, 0x29, + 0x78, 0x94, 0x77, 0x0b, 0x69, 0x0c, 0xb8, 0xe1, 0xa0, 0x51, 0xb7, 0x78, 0x66, 0x12, 0x5a, 0x23, 0xfd, 0x1d, 0x95, 0x18, 0xf5, 0xf7, 0x36, 0x4e, 0x06, 0xc1, 0xeb, 0x05, 0x0a, 0xd2, 0x39, 0x28, + 0x27, 0xbf, 0x2b, 0x58, 0xaf, 0x36, 0xb4, 0x14, 0x43, 0xc3, 0x75, 0x80, 0x63, 0x39, 0xa7, 0x7f, 0x99, 0x6d, 0xb8, 0x9f, 0x86, 0x83, 0x41, 0x00, 0x73, 0x81, 0x04, 0xb9, 0xbf, 0x75, 0x21, 0x1d, + 0x6c, 0xfa, 0x72, 0x82, 0xe2, 0x02, 0xa2, 0xd8, 0x0a, 0xd3, 0x5b, 0x96, 0xf7, 0x21, 0x63, 0xf3, 0x75, 0x39, 0xf8, 0xc9, 0x70, 0xec, 0xe2, 0x10, 0xa7, 0xac, 0x57, 0xf3, 0xdf, 0x35, 0x79, 0x2d, + 0xd3, 0x36, 0x06, 0xa3, 0x1e, 0x8f, 0x28, 0xa9, 0xb3, 0xc5, 0xee, 0x7c, 0x91, 0x06, 0x6f, 0x0e, 0x63, 0x48, 0xe4, 0x30, 0xe6, 0x60, 0x85, 0xc1, 0x5c, 0x68, 0x6b, 0x0d, 0x54, 0x40, 0xb7, 0x03, + 0xaa, 0xbe, 0xac, 0xd7, 0xd0, 0x69, 0xf9, 0x8d, 0x0a, 0x9a, 0xca, 0x2f, 0x71, 0xee, 0x75, 0xe4, 0xf5, 0xe7, 0xf5, 0x61, 0x95, 0xa5, 0x95, 0xeb, 0xd5, 0x67, 0x0e, 0xdc, 0xc8, 0x3c, 0x80, 0x2e, + 0x0a, 0x38, 0x34, 0xe4, 0x4d, 0x6b, 0xfe, 0xcd, 0x36, 0xec, 0x57, 0xa8, 0x2e, 0x01, 0xf6, 0x4c, 0x8f, 0x1f, 0xdf, 0xc2, 0xff, 0x3e, 0x34, 0x40, 0x5b, 0xcf, 0xfd, 0x7d, 0x94, 0x14, 0x68, 0x2b, + 0x46, 0xde, 0xb7, 0x5d, 0xbf, 0xb9, 0x71, 0x52, 0xff, 0x39, 0xcc, 0xe8, 0x21, 0x09, 0x3c, 0x8f, 0xdc, 0x81, 0x3c, 0xad, 0x10, 0x1c, 0x46, 0x71, 0x7b, 0x65, 0xcd, 0x4d, 0x54, 0x45, 0x64, 0x2c, + 0xec, 0xa1, 0x23, 0x72, 0xbf, 0x01, 0x21, 0xe2, 0x04, 0x12, 0x28, 0x66, 0xa3, 0x0d, 0x10, 0x51, 0x4c, 0xd7, 0x1e, 0x46, 0xb0, 0x28, 0xf1, 0xaf, 0x68, 0x0a, 0x45, 0x00, 0x7f, 0xc7, 0x1c, 0x1f, + 0x15, 0x54, 0x6a, 0x2a, 0x56, 0xf2, 0xb8, 0xe9, 0x84, 0x4d, 0xed, 0x54, 0x25, 0xe1, 0x81, 0xa8, 0x85, 0x0e, 0x13, 0xf6, 0x6a, 0xbd, 0x23, 0x37, 0x0d, 0xc9, 0xf6, 0x21, 0xa4, 0xb3, 0x12, 0x30, + 0xe3, 0xc8, 0x32, 0x3e, 0x01, 0x75, 0xe6, 0x3e, 0xfb, 0x7d, 0x39, 0x20, 0x91, 0xf6, 0x33, 0xaa, 0xc4, 0xaa, 0x73, 0x5f, 0x44, 0x1d, 0xb1, 0x6d, 0x7b, 0x51, 0xb2, 0x3f, 0x0f, 0xfa, 0x6a, 0x20, + }; + } + + + namespace t24 { + int internal_rounds = 57; + + int alpha = 5; + + unsigned char mat_diag_m_1[] = { + 0xf9, 0x2c, 0x67, 0xca, 0xaa, 0x08, 0x62, 0xa9, 0x85, 0xac, 0x27, 0x7b, 0xb3, 0xc0, 0xb5, 0x67, 0x6b, 0x7c, 0xc0, 0x0a, 0xd8, 0xb5, 0x46, 0x88, 0xa0, 0xc2, 0x70, 0x52, 0x5e, 0x50, 0x1d, 0x07, + 0xbe, 0xaf, 0x39, 0xcd, 0x23, 0x45, 0x6a, 0x45, 0x29, 0xf8, 0x91, 0x9e, 0x9a, 0x53, 0x56, 0x4f, 0x73, 0x21, 0x57, 0x32, 0xab, 0x0b, 0xe2, 0xc4, 0xb9, 0x5a, 0xf3, 0x59, 0x36, 0xf7, 0xe8, 0x16, + 0xc6, 0x5e, 0x7d, 0xb7, 0xc5, 0x14, 0xe1, 0x15, 0xf2, 0xcf, 0x91, 0xa7, 0x79, 0x07, 0x1f, 0x81, 0xda, 0x38, 0xb1, 0xaf, 0x55, 0x86, 0xa9, 0x54, 0x05, 0xc7, 0xbd, 0xcf, 0xee, 0xea, 0x33, 0x00, + 0x8a, 0x8c, 0x4b, 0xeb, 0x9f, 0xe7, 0xc4, 0xd8, 0x7e, 0x31, 0xf7, 0x0d, 0xa5, 0x38, 0x44, 0x2a, 0xb7, 0xb0, 0x4c, 0x93, 0x78, 0xfa, 0xe1, 0xcd, 0x05, 0x3c, 0x8a, 0xcf, 0x39, 0xe9, 0x63, 0x01, + 0x67, 0x51, 0x04, 0xab, 0xed, 0x6f, 0xba, 0x52, 0x15, 0x34, 0xef, 0x7b, 0x5e, 0x17, 0x46, 0x3f, 0xb5, 0x8c, 0x30, 0x4f, 0xaa, 0x41, 0x25, 0x62, 0x58, 0x7c, 0x75, 0x17, 0x21, 0xbc, 0xe3, 0x00, + 0x5a, 0xd8, 0x3e, 0x53, 0x53, 0xb7, 0x2a, 0x5b, 0xcf, 0x8e, 0x49, 0x2f, 0x78, 0x1c, 0x0a, 0xcc, 0x5e, 0xfe, 0xb9, 0x08, 0x94, 0x3c, 0xd7, 0xc8, 0x34, 0x9b, 0x60, 0xc5, 0x4a, 0x17, 0x66, 0x0f, + 0x30, 0x17, 0x51, 0x7f, 0xc2, 0xe0, 0xd9, 0xa1, 0x89, 0xe2, 0x1f, 0x53, 0xc3, 0x7b, 0xc7, 0xca, 0x1e, 0x84, 0x37, 0x92, 0x21, 0x88, 0x68, 0x31, 0xc0, 0xf8, 0x43, 0x85, 0x18, 0xa4, 0x11, 0x00, + 0x84, 0xf7, 0x5c, 0x70, 0xbe, 0xd6, 0x15, 0x0f, 0x98, 0xec, 0x3f, 0xee, 0x31, 0xda, 0x80, 0xaf, 0xf9, 0x96, 0xd2, 0x34, 0x06, 0xee, 0x41, 0x46, 0x65, 0x4a, 0x20, 0x5b, 0xa3, 0xcd, 0x79, 0x2a, + 0xc0, 0x27, 0x65, 0x89, 0x3a, 0x29, 0x23, 0x2c, 0xfd, 0x69, 0x45, 0xe7, 0x23, 0x59, 0x5a, 0x54, 0x8f, 0x1d, 0x0e, 0x40, 0xf3, 0x94, 0x94, 0x1f, 0x1a, 0xaf, 0xac, 0x00, 0xc4, 0x39, 0x55, 0x08, + 0x0c, 0x77, 0xf1, 0x9c, 0x38, 0x2f, 0xef, 0xa2, 0xb8, 0xe2, 0xd2, 0x70, 0x11, 0x69, 0x9d, 0x69, 0xf8, 0xdd, 0xdb, 0xff, 0xb3, 0x22, 0x52, 0x39, 0x39, 0xc5, 0x2f, 0xc3, 0x16, 0x84, 0xfe, 0x01, + 0xcf, 0x15, 0x24, 0x16, 0x2b, 0x79, 0xae, 0xa2, 0xa6, 0x46, 0x07, 0x7b, 0x94, 0x04, 0x22, 0xab, 0xe6, 0xf7, 0xbf, 0x71, 0xbd, 0x97, 0x5d, 0x17, 0xa1, 0x6b, 0x12, 0x96, 0xac, 0xf5, 0x11, 0x1c, + 0x2e, 0x3f, 0x5e, 0xe3, 0xe0, 0x2a, 0x57, 0xb2, 0x9a, 0xe8, 0xac, 0x24, 0x01, 0x89, 0x04, 0x67, 0xba, 0x5b, 0xe5, 0xab, 0x12, 0x80, 0xcb, 0x5f, 0x19, 0x84, 0x7c, 0x0e, 0x45, 0xee, 0x12, 0x2b, + 0x42, 0x5d, 0x53, 0xa0, 0xbd, 0xda, 0xe0, 0x59, 0x77, 0x66, 0x86, 0x64, 0xa2, 0x66, 0x89, 0x8c, 0x78, 0x51, 0x71, 0x71, 0xd3, 0x28, 0xa1, 0xfc, 0xb9, 0xa6, 0x6b, 0x90, 0x51, 0xdf, 0x65, 0x01, + 0xc7, 0x0c, 0x24, 0xaa, 0x33, 0x95, 0xd4, 0x50, 0xaa, 0x8e, 0xd3, 0x77, 0x75, 0xfd, 0x4f, 0xae, 0x83, 0x20, 0xad, 0xfb, 0xd6, 0x63, 0x6c, 0x51, 0xd9, 0xbc, 0x52, 0xd9, 0x88, 0x90, 0x99, 0x10, + 0x8c, 0x7e, 0x28, 0x5a, 0xaa, 0xb3, 0xb6, 0x43, 0xa9, 0xd6, 0x94, 0xe1, 0x41, 0x7f, 0x2d, 0x1f, 0x73, 0x54, 0x04, 0x7f, 0xe8, 0xdb, 0xb8, 0x7a, 0x69, 0xc3, 0x23, 0x53, 0x44, 0xe4, 0xab, 0x16, + 0xcf, 0x1b, 0xb4, 0x27, 0xa3, 0x65, 0x9f, 0xf0, 0x93, 0xaf, 0x3a, 0xa0, 0x54, 0x78, 0xd4, 0x30, 0x6a, 0xef, 0x9c, 0x8b, 0x75, 0x7b, 0x42, 0x9b, 0x57, 0xb7, 0xa5, 0x47, 0x98, 0x34, 0x47, 0x0a, + 0x57, 0x62, 0xec, 0x29, 0x6d, 0x74, 0x1b, 0x17, 0x1e, 0xf4, 0x6a, 0xc9, 0xff, 0xbf, 0x3c, 0x21, 0x55, 0x9b, 0x23, 0x60, 0x2a, 0x63, 0xf1, 0x70, 0xb0, 0x87, 0x9d, 0x7d, 0x48, 0x71, 0x8c, 0x2c, + 0x1b, 0xa9, 0xda, 0x17, 0x5c, 0x2f, 0x13, 0x3c, 0x0a, 0xa3, 0x52, 0xeb, 0x53, 0x70, 0xd4, 0x5b, 0x70, 0xfc, 0xd3, 0x6f, 0x0c, 0xc1, 0x15, 0xac, 0xc3, 0x2a, 0xc9, 0x23, 0x17, 0xeb, 0x72, 0x01, + 0x83, 0x05, 0x7e, 0x21, 0x3f, 0xaf, 0x48, 0xd0, 0xbb, 0x3d, 0xf3, 0x38, 0x8e, 0xe4, 0x25, 0xae, 0x02, 0xcc, 0x3b, 0x9b, 0xd7, 0xe5, 0xdf, 0xfe, 0x1d, 0xcd, 0x6e, 0x0c, 0x98, 0x03, 0x8a, 0x00, + 0x42, 0xc6, 0x51, 0xce, 0xe0, 0xe2, 0xc5, 0x58, 0xd4, 0xbc, 0xef, 0x6d, 0xae, 0x86, 0x8c, 0xbc, 0xd0, 0x87, 0xd1, 0x40, 0x86, 0xd8, 0xa8, 0x1d, 0x0e, 0xd8, 0x83, 0x3d, 0x84, 0x92, 0x52, 0x00, + 0x2e, 0x40, 0x99, 0xf6, 0x69, 0x1c, 0xac, 0xbb, 0x27, 0x76, 0xe3, 0xbb, 0x2e, 0x6a, 0x10, 0x6e, 0x4b, 0x44, 0x9c, 0xc2, 0xff, 0xee, 0x14, 0x48, 0xc4, 0x56, 0xeb, 0x12, 0x9d, 0x3b, 0xad, 0x14, + 0x49, 0xda, 0x81, 0xc0, 0xd5, 0x85, 0x05, 0x00, 0x2e, 0x4c, 0x66, 0x18, 0x2b, 0xf8, 0x11, 0xbb, 0x17, 0xdc, 0x08, 0xf5, 0xb9, 0x81, 0xe4, 0x5d, 0xf7, 0xf1, 0xa3, 0x14, 0x3b, 0x08, 0x74, 0x2a, + 0xff, 0xc6, 0x88, 0xf2, 0xb9, 0x40, 0xb2, 0x29, 0x50, 0x23, 0x32, 0x8f, 0xf0, 0x56, 0x8a, 0x04, 0x5b, 0x78, 0xdf, 0x68, 0x4d, 0x61, 0x1b, 0xe9, 0x08, 0x28, 0x34, 0xef, 0xde, 0x45, 0x7a, 0x0b, + 0x00, 0x8f, 0x04, 0xf0, 0xcf, 0x89, 0x97, 0x2c, 0xd4, 0xaa, 0x67, 0x8a, 0x8e, 0x60, 0x58, 0xb3, 0x34, 0x2b, 0x66, 0x08, 0xb2, 0x63, 0x1c, 0x9c, 0x4b, 0xd5, 0xe5, 0x90, 0x68, 0xfb, 0x0b, 0x00, + }; + + unsigned char round_constants[] = { + 0x98, 0x4c, 0x99, 0x3d, 0xf5, 0x6d, 0x52, 0x5b, 0x6b, 0x90, 0xe0, 0xf2, 0x5f, 0x1b, 0x1e, 0x8d, 0xd5, 0x14, 0x80, 0xf1, 0x42, 0x9a, 0xf5, 0x78, 0x48, 0x15, 0xaf, 0x6b, 0x43, 0x45, 0x6d, 0x06, + 0x9f, 0x2d, 0x9c, 0xf2, 0xb6, 0xce, 0x77, 0x0d, 0x0d, 0x60, 0xf4, 0x49, 0xf8, 0xb0, 0x34, 0x44, 0x27, 0xac, 0xfa, 0xd8, 0x04, 0xaa, 0xf7, 0x1a, 0xf5, 0xcb, 0x33, 0x1a, 0x88, 0x2b, 0xba, 0x12, + 0xfe, 0x7e, 0x9a, 0x6e, 0x18, 0x34, 0x20, 0xac, 0xb4, 0xc8, 0x2e, 0x0d, 0x85, 0x92, 0x0f, 0x67, 0xb0, 0xa2, 0xcc, 0xba, 0x10, 0xdc, 0x75, 0xca, 0x94, 0xa9, 0x9e, 0xa0, 0xa6, 0xf2, 0x49, 0x13, + 0x2f, 0x6d, 0xd2, 0xd9, 0xa4, 0x4d, 0x7f, 0x1d, 0x08, 0x10, 0x40, 0x01, 0x32, 0x9c, 0xb1, 0xca, 0x4e, 0x11, 0x76, 0xdf, 0xf1, 0xb6, 0xd5, 0xe4, 0xf9, 0x59, 0x5f, 0x89, 0x2d, 0x29, 0xce, 0x17, + 0x2e, 0x29, 0xd0, 0x71, 0x11, 0x47, 0x05, 0x0b, 0xca, 0xcb, 0x96, 0x84, 0xb7, 0x13, 0x1b, 0x8d, 0xe6, 0x22, 0x66, 0x29, 0x20, 0x95, 0xa3, 0xbc, 0x11, 0x4f, 0xbd, 0x11, 0xa0, 0x6f, 0xca, 0x10, + 0x24, 0x81, 0x73, 0xcc, 0x87, 0x2d, 0x8a, 0x4b, 0xf8, 0x5f, 0xfa, 0x27, 0xff, 0x87, 0x8f, 0x94, 0xbc, 0x35, 0x7b, 0xfa, 0x98, 0x57, 0xcc, 0x50, 0x4a, 0xe2, 0x19, 0x59, 0xde, 0xcd, 0x67, 0x2f, + 0x81, 0xef, 0xfd, 0x44, 0xe6, 0xbe, 0x27, 0xd6, 0xe7, 0xbc, 0x28, 0x56, 0x59, 0xd1, 0x07, 0x56, 0x0c, 0xfa, 0x96, 0x1e, 0x5d, 0x96, 0x06, 0xf5, 0x4c, 0xf6, 0xe6, 0x66, 0xf8, 0xfd, 0x25, 0x28, + 0x56, 0x2e, 0x7c, 0x79, 0xcc, 0x09, 0xc4, 0x16, 0xfd, 0x89, 0x3b, 0x5c, 0x66, 0xd5, 0x84, 0xb9, 0xc0, 0x97, 0x5f, 0x4e, 0x0b, 0x7d, 0x12, 0x53, 0x16, 0xb0, 0x9f, 0x57, 0x66, 0xdb, 0xf0, 0x02, + 0xca, 0xa5, 0xbe, 0x35, 0x0e, 0xfa, 0x31, 0xb2, 0xb4, 0x6b, 0x1e, 0x0b, 0x89, 0xa8, 0x5d, 0x50, 0x1a, 0xff, 0xb2, 0x8d, 0x77, 0xc0, 0xff, 0x3b, 0x7e, 0x45, 0x45, 0xc6, 0xbd, 0x5a, 0x83, 0x0f, + 0x53, 0xe1, 0x78, 0xf8, 0x2f, 0x54, 0x77, 0x2a, 0x10, 0xff, 0x03, 0xc2, 0x75, 0x93, 0x9e, 0xe0, 0xfc, 0x6b, 0x96, 0x86, 0x90, 0x5e, 0x40, 0x8e, 0x9c, 0x45, 0x08, 0xb2, 0xf9, 0x41, 0x2d, 0x06, + 0x0a, 0x08, 0xc5, 0x4c, 0xfc, 0xad, 0x7c, 0xf4, 0x6f, 0xca, 0x50, 0x64, 0x97, 0x6a, 0xc2, 0x71, 0xef, 0x49, 0xe9, 0x6b, 0x58, 0xc5, 0xd1, 0xb3, 0xcc, 0x5e, 0xfd, 0x24, 0xa9, 0x5f, 0xfc, 0x28, + 0x1e, 0x3e, 0x53, 0xe7, 0x25, 0x43, 0x4e, 0x84, 0x5e, 0xf0, 0x4b, 0x68, 0x69, 0xdf, 0x7f, 0x14, 0x95, 0xd0, 0x46, 0x41, 0x09, 0x09, 0x33, 0x3b, 0x9b, 0x23, 0x20, 0xc0, 0xf6, 0x37, 0x12, 0x0e, + 0x9f, 0x95, 0x9b, 0xb7, 0x61, 0x7d, 0x00, 0x18, 0x3d, 0x24, 0x39, 0x1d, 0x89, 0x00, 0xad, 0x94, 0x8a, 0xf6, 0xab, 0x34, 0xfb, 0x37, 0x21, 0x41, 0x0f, 0xd4, 0xbc, 0xb4, 0x9a, 0x41, 0x82, 0x24, + 0x15, 0x4f, 0x9c, 0x00, 0x7a, 0xb0, 0xcf, 0xa0, 0xf1, 0xb5, 0x75, 0xc3, 0x5d, 0x18, 0x16, 0xa9, 0x5f, 0xf0, 0x10, 0xc3, 0x83, 0xa9, 0x2d, 0xbe, 0x95, 0xde, 0xc9, 0x46, 0x40, 0x39, 0x71, 0x00, + 0xf7, 0x14, 0xcc, 0x60, 0xc3, 0x97, 0x1f, 0x88, 0x0f, 0x9b, 0x82, 0xde, 0xd9, 0x15, 0xe8, 0x85, 0xfe, 0x0e, 0x99, 0xb0, 0x45, 0xf1, 0xb2, 0x7b, 0xb7, 0x71, 0xe9, 0x49, 0x24, 0x23, 0x91, 0x14, + 0x08, 0xbe, 0x02, 0x80, 0x5e, 0x87, 0xbd, 0xff, 0xeb, 0x4b, 0xd4, 0x11, 0xdc, 0x9a, 0x18, 0x45, 0x70, 0x26, 0x6e, 0x3c, 0xea, 0x98, 0x36, 0xcb, 0x77, 0x03, 0x5c, 0x72, 0xf8, 0xb6, 0xb9, 0x16, + 0x88, 0x44, 0x7b, 0x0d, 0xa3, 0x33, 0x1c, 0x7c, 0xe3, 0xb3, 0xd7, 0xd8, 0xe0, 0x0f, 0x73, 0x75, 0xa1, 0x1f, 0x33, 0xd1, 0xf9, 0xed, 0x77, 0xb4, 0xa4, 0xe5, 0x9b, 0x3a, 0x17, 0x67, 0x2f, 0x1c, + 0xe9, 0xd3, 0xdb, 0x51, 0x20, 0xa4, 0x0f, 0x99, 0x64, 0xc0, 0x66, 0xbc, 0xb1, 0xd4, 0xad, 0x75, 0x52, 0xbe, 0x6a, 0x62, 0x1e, 0x24, 0xd5, 0x90, 0xdf, 0xfe, 0xae, 0x4d, 0x8b, 0xbf, 0x76, 0x0d, + 0xdd, 0x3d, 0x83, 0x11, 0xe6, 0x23, 0xd3, 0x96, 0xb4, 0x5d, 0x12, 0xb3, 0x91, 0xf1, 0x55, 0xd8, 0x33, 0x38, 0xc1, 0xa5, 0xcc, 0x2f, 0x65, 0x62, 0x93, 0x81, 0xd7, 0x4a, 0x4f, 0xde, 0x35, 0x2a, + 0xcf, 0xa9, 0xfe, 0xc6, 0x06, 0x6b, 0xf0, 0x36, 0xcf, 0xe0, 0x96, 0xb5, 0x1e, 0x8e, 0xf2, 0x8d, 0x33, 0xa0, 0x91, 0x95, 0x9f, 0xce, 0xab, 0x6c, 0x2a, 0xea, 0x58, 0x02, 0x3e, 0x81, 0x1f, 0x10, + 0x5b, 0x9a, 0x94, 0x88, 0x1e, 0xce, 0xfc, 0xfa, 0x73, 0xb8, 0xad, 0xf3, 0xd2, 0x19, 0xf5, 0x1b, 0xe2, 0x5e, 0x87, 0xe9, 0x21, 0xbb, 0xf3, 0x85, 0x28, 0xb4, 0x77, 0xb1, 0x48, 0x79, 0x0a, 0x2c, + 0xc3, 0x83, 0x6c, 0xe8, 0xe0, 0x5b, 0x0d, 0xb6, 0x8a, 0xa7, 0x05, 0x32, 0xd6, 0x07, 0x94, 0xf0, 0x22, 0xf7, 0xfc, 0x40, 0x39, 0x20, 0x9b, 0x76, 0x75, 0x0f, 0x44, 0xcd, 0x9e, 0x0e, 0x54, 0x18, + 0x67, 0x41, 0x5a, 0x48, 0xe4, 0x95, 0xd5, 0x6c, 0xda, 0x06, 0x17, 0x70, 0x91, 0x82, 0x60, 0xc1, 0xfa, 0xb2, 0x2e, 0x5b, 0x5f, 0xd9, 0x48, 0x3d, 0x05, 0xdd, 0xc2, 0x53, 0xa9, 0x00, 0x76, 0x08, + 0xe0, 0x36, 0x19, 0x0c, 0xd3, 0x26, 0x47, 0xb4, 0x85, 0x04, 0x7e, 0x15, 0xfb, 0x4a, 0x13, 0x0c, 0x49, 0xfb, 0x17, 0xf3, 0x0b, 0x18, 0xb4, 0x82, 0x16, 0xcd, 0xe8, 0x7e, 0xa8, 0xa8, 0x1b, 0x00, + 0x4a, 0x07, 0x6b, 0x11, 0xd1, 0xea, 0xb8, 0x19, 0x46, 0x49, 0x8d, 0xd7, 0x43, 0xd1, 0x3c, 0xe3, 0x5f, 0x84, 0xa4, 0xfd, 0x84, 0xc2, 0xc1, 0xd6, 0x25, 0xdf, 0x59, 0xf7, 0x73, 0xcc, 0x94, 0x04, + 0x64, 0x4a, 0x02, 0x51, 0x42, 0x4a, 0x17, 0xf6, 0xcf, 0x93, 0x7c, 0x20, 0xdc, 0x27, 0xd1, 0x75, 0x5e, 0xe4, 0x12, 0x25, 0xaf, 0x93, 0x2d, 0xe4, 0x4d, 0xf0, 0x25, 0xf4, 0x1c, 0xbb, 0x10, 0x1c, + 0xa7, 0xfc, 0xd8, 0xa2, 0x0b, 0x0d, 0x6e, 0xcf, 0x83, 0xe0, 0x38, 0xed, 0xaa, 0x65, 0xd8, 0xa8, 0x5a, 0xdd, 0xe9, 0x0c, 0x97, 0x58, 0x0f, 0x58, 0x35, 0x50, 0xa8, 0x11, 0x7c, 0xca, 0x92, 0x08, + 0x75, 0x8d, 0x6f, 0x6c, 0x04, 0xcd, 0x84, 0x1d, 0xa3, 0xfa, 0x69, 0x54, 0x5e, 0x08, 0xa0, 0x6d, 0x00, 0x63, 0xaa, 0xf9, 0x4b, 0x75, 0x4b, 0x5d, 0xe5, 0xa3, 0xcd, 0xad, 0x93, 0x42, 0x0b, 0x08, + 0x57, 0x6d, 0x66, 0x7a, 0x57, 0x7a, 0xe1, 0x60, 0x66, 0xe8, 0x00, 0xb1, 0xd7, 0xe3, 0xb7, 0x40, 0x08, 0x03, 0x5b, 0xca, 0xed, 0x6b, 0x7b, 0x2a, 0xdd, 0x12, 0xaa, 0x92, 0xa5, 0xf6, 0xa6, 0x08, + 0x47, 0x8f, 0x11, 0x70, 0xba, 0xf9, 0x35, 0x8c, 0x02, 0x65, 0x61, 0x2b, 0xfc, 0xc0, 0x55, 0x00, 0xb3, 0xec, 0xec, 0x83, 0x75, 0xc1, 0x17, 0xf2, 0xcb, 0x45, 0xf9, 0xce, 0xc4, 0x65, 0x82, 0x0b, + 0x5c, 0xbe, 0x5c, 0xf9, 0xb8, 0x31, 0x9d, 0x77, 0x51, 0x8c, 0xfa, 0x85, 0x1a, 0x8b, 0x29, 0x75, 0x36, 0x2a, 0xae, 0xfc, 0xbc, 0xcf, 0x1d, 0x62, 0x5c, 0xe7, 0xfa, 0x1c, 0x4f, 0x8b, 0xa9, 0x0c, + 0xc1, 0x1f, 0x12, 0xea, 0xd8, 0x47, 0xab, 0x68, 0x0e, 0x8e, 0xc5, 0xf6, 0x33, 0x88, 0x4d, 0xa8, 0x3b, 0xe5, 0xf1, 0x0e, 0x85, 0x7a, 0x52, 0xc8, 0xf4, 0x71, 0x57, 0x30, 0xba, 0xff, 0x6a, 0x2e, + 0xe3, 0x5a, 0xbf, 0x91, 0xa2, 0x68, 0x83, 0x4d, 0x0b, 0x48, 0xdd, 0x56, 0x5c, 0x5b, 0x09, 0x8e, 0x7f, 0x7b, 0x71, 0x1c, 0x90, 0x8d, 0x4d, 0x6e, 0x04, 0x88, 0x05, 0x5b, 0xf1, 0x44, 0xa7, 0x27, + 0x84, 0x26, 0x12, 0x94, 0x06, 0x1b, 0xc0, 0xa2, 0xbf, 0x62, 0x59, 0xd6, 0x2b, 0xbf, 0x65, 0x7d, 0x24, 0x75, 0xf6, 0x54, 0xac, 0x95, 0x6f, 0x30, 0xd5, 0xf9, 0x05, 0xd4, 0xd2, 0xa7, 0x5b, 0x1a, + 0xbc, 0x88, 0x3e, 0x20, 0xe2, 0xfb, 0x7d, 0x6d, 0xa8, 0x18, 0x69, 0x32, 0x21, 0xe1, 0xea, 0xe2, 0xd5, 0xd8, 0x12, 0x24, 0xe2, 0xfe, 0x76, 0x80, 0xca, 0x25, 0xbf, 0x5b, 0xe4, 0xbb, 0x1e, 0x1f, + 0xd5, 0x8f, 0x72, 0x93, 0xac, 0xfc, 0x8d, 0xf7, 0x9c, 0xcd, 0x86, 0xbb, 0x59, 0x4e, 0xbc, 0x0a, 0x64, 0x23, 0x85, 0xb6, 0x69, 0x13, 0x61, 0xd0, 0x3a, 0x83, 0x21, 0x89, 0xbb, 0x5a, 0x5c, 0x1e, + 0xf0, 0x54, 0x55, 0x11, 0x3e, 0x01, 0xd1, 0x33, 0xae, 0xbe, 0xc4, 0x9f, 0x97, 0x2a, 0x33, 0xbe, 0xef, 0xcb, 0x08, 0x06, 0x8b, 0x28, 0x24, 0x1c, 0x33, 0xfb, 0x57, 0x48, 0xf1, 0x20, 0x6b, 0x20, + 0x19, 0x3b, 0xef, 0x82, 0x42, 0x23, 0xc4, 0x82, 0xb0, 0x80, 0x32, 0x36, 0x56, 0x18, 0x14, 0xe2, 0x2d, 0xec, 0x56, 0xe1, 0x20, 0xfd, 0x3c, 0xea, 0x74, 0x4f, 0x47, 0x8a, 0x40, 0x45, 0x0d, 0x18, + 0x1e, 0xbe, 0xf5, 0x60, 0x90, 0x8c, 0x1a, 0xe7, 0x16, 0x63, 0xb6, 0x85, 0x38, 0x27, 0x48, 0x45, 0x34, 0x3c, 0xcc, 0x80, 0xb7, 0x4a, 0x18, 0x4b, 0x58, 0x4e, 0x65, 0x51, 0x5b, 0x8b, 0x32, 0x0a, + 0x7c, 0xa5, 0x57, 0x3c, 0x8c, 0x50, 0xae, 0x45, 0xbf, 0xbf, 0xd3, 0x89, 0xdf, 0x04, 0xaf, 0x1f, 0x4e, 0xee, 0x17, 0x0e, 0x74, 0x2f, 0xbb, 0x1b, 0x1c, 0x91, 0xc3, 0xa4, 0x6e, 0x43, 0xc8, 0x0d, + 0x83, 0xb0, 0xd5, 0x8c, 0xd1, 0xed, 0xbb, 0x91, 0x9b, 0xfc, 0xc7, 0x76, 0x36, 0xe6, 0xc0, 0x39, 0xc9, 0x63, 0xee, 0x7d, 0x6b, 0x5a, 0x56, 0x23, 0x4b, 0x9e, 0xa7, 0xa9, 0xcc, 0xbe, 0x10, 0x07, + 0x8a, 0xaf, 0x73, 0xd6, 0x1a, 0x6b, 0x5f, 0x02, 0xae, 0xfe, 0x52, 0xee, 0x68, 0xe6, 0x2d, 0x08, 0xc6, 0xc6, 0x24, 0xd0, 0x04, 0x76, 0x2f, 0x45, 0x33, 0xf7, 0x58, 0xa9, 0xff, 0x00, 0x83, 0x0b, + 0x85, 0xd9, 0x43, 0xb0, 0x8c, 0xeb, 0xe9, 0x94, 0x91, 0x4c, 0x22, 0x26, 0x8c, 0x1d, 0xc8, 0x4d, 0x37, 0x3f, 0x99, 0x44, 0x7a, 0x6c, 0x7d, 0x5f, 0xe6, 0xd4, 0xb1, 0x22, 0xcf, 0xb4, 0x23, 0x1d, + 0x62, 0x34, 0xc4, 0xac, 0x1a, 0x67, 0xe9, 0xd1, 0xf8, 0x51, 0x68, 0xe3, 0xcd, 0x24, 0x5d, 0x60, 0x46, 0xfa, 0xd8, 0x41, 0x83, 0xb0, 0x13, 0x00, 0x5a, 0x64, 0x27, 0xf4, 0x5c, 0x28, 0x74, 0x1f, + 0x19, 0x72, 0x49, 0x46, 0xa4, 0x95, 0xae, 0xb6, 0xad, 0x7f, 0xfe, 0x8e, 0xce, 0xf1, 0xa7, 0xf6, 0x35, 0x59, 0x83, 0x04, 0x5f, 0x3e, 0x0b, 0x4e, 0x82, 0xfd, 0xaf, 0xd3, 0x8b, 0xfc, 0x32, 0x00, + 0xfd, 0x61, 0x7b, 0x4a, 0x8e, 0x3f, 0x2f, 0x01, 0x4f, 0x06, 0xab, 0xf4, 0xd9, 0x2a, 0x28, 0x52, 0x2e, 0x35, 0xf7, 0x3c, 0x26, 0x9b, 0x69, 0x97, 0x7e, 0x5c, 0x6c, 0xf1, 0xc4, 0xa9, 0x22, 0x2b, + 0xde, 0x6b, 0x61, 0xdf, 0x6a, 0xff, 0xa4, 0xdc, 0x88, 0x9c, 0x41, 0x4d, 0xb0, 0x30, 0x78, 0xad, 0x55, 0x93, 0xcb, 0x44, 0xc4, 0x0c, 0x4e, 0x02, 0xb8, 0x17, 0x39, 0x63, 0x6f, 0x99, 0xba, 0x2f, + 0x18, 0x4f, 0xcb, 0x30, 0x28, 0xa0, 0xe5, 0x04, 0xa1, 0x27, 0xdf, 0x10, 0x09, 0xa3, 0xc2, 0x1b, 0x98, 0xa2, 0x83, 0x07, 0x72, 0x7e, 0x46, 0xea, 0x02, 0xe2, 0xa8, 0xdd, 0x5f, 0xab, 0xb6, 0x17, + 0x4f, 0xd6, 0x23, 0x0b, 0xc5, 0x77, 0x6c, 0xbf, 0xaa, 0x15, 0x3c, 0xd1, 0xdd, 0xa4, 0x79, 0x91, 0x5d, 0xe1, 0x1f, 0x75, 0x70, 0x74, 0x65, 0xf5, 0x21, 0xbf, 0x98, 0xc3, 0xd2, 0x5b, 0xab, 0x16, + 0x58, 0x1b, 0xc9, 0x93, 0x9e, 0x4b, 0xc3, 0xa0, 0xac, 0xc5, 0x77, 0xf7, 0x6e, 0x29, 0x5f, 0x20, 0xd8, 0x24, 0xfd, 0x25, 0xa9, 0x3e, 0x46, 0x51, 0x4b, 0xe6, 0xa5, 0x91, 0xa0, 0xd6, 0x63, 0x17, + 0x8d, 0x45, 0x32, 0xbe, 0x4e, 0x90, 0x58, 0x67, 0x16, 0x1a, 0x43, 0xe6, 0x60, 0xe0, 0xcc, 0x55, 0x1f, 0x89, 0x65, 0x1f, 0xde, 0xe2, 0xc2, 0xcd, 0x9f, 0x06, 0x1b, 0x9a, 0xf2, 0xe2, 0x07, 0x1a, + 0xdf, 0xe8, 0x5e, 0x52, 0x0e, 0xe4, 0xf9, 0x0b, 0x3e, 0xf8, 0x88, 0x59, 0x58, 0x3b, 0x31, 0x35, 0x1a, 0x46, 0xf6, 0xb5, 0xdc, 0xa6, 0x67, 0xe3, 0x49, 0x8a, 0x9f, 0xbe, 0xcb, 0x62, 0x60, 0x12, + 0x70, 0xa8, 0xa4, 0xed, 0x88, 0xa3, 0x9b, 0xa1, 0xb6, 0x32, 0x13, 0xb2, 0x42, 0x8f, 0x29, 0x30, 0xa5, 0x2d, 0xe5, 0xe3, 0xb1, 0x31, 0x1d, 0x58, 0xad, 0x6f, 0xdf, 0x6a, 0x0f, 0x6d, 0x29, 0x18, + 0xff, 0xd8, 0x16, 0xf5, 0xec, 0x78, 0x99, 0x99, 0xb9, 0x49, 0xcc, 0x1b, 0x18, 0xeb, 0x92, 0x87, 0x2a, 0x27, 0x71, 0x24, 0xb0, 0xe0, 0xc0, 0x0c, 0xf0, 0x7f, 0x6a, 0x41, 0x74, 0xf2, 0xe1, 0x1a, + 0x75, 0x34, 0xbf, 0x5e, 0xe9, 0xc7, 0xb0, 0x36, 0xda, 0x6d, 0x8e, 0x18, 0x6d, 0x0f, 0xbf, 0x10, 0x1c, 0x04, 0x56, 0x33, 0xf2, 0xb3, 0x46, 0x4d, 0x26, 0x69, 0x34, 0xe0, 0xd9, 0xd8, 0x1d, 0x18, + 0x13, 0xad, 0xa9, 0x30, 0xb0, 0xc5, 0x68, 0x20, 0x84, 0x08, 0x9c, 0x9d, 0x7a, 0x50, 0x1c, 0x3f, 0x78, 0x51, 0xa0, 0x06, 0xe2, 0x75, 0x46, 0x9c, 0x80, 0x42, 0xd3, 0xa5, 0xa6, 0xa9, 0x0f, 0x07, + 0x04, 0x91, 0xf3, 0x36, 0xea, 0xeb, 0xbd, 0x03, 0x72, 0xf7, 0xf5, 0x9e, 0x8c, 0xe0, 0x87, 0x94, 0xe4, 0xad, 0xc2, 0xa0, 0x09, 0x9a, 0xbd, 0x1e, 0x8e, 0x2e, 0xa7, 0xf0, 0xd3, 0x93, 0x47, 0x25, + 0x48, 0x15, 0x6b, 0xd2, 0x2d, 0x5b, 0x76, 0x20, 0x63, 0xd2, 0xe8, 0x0c, 0xb8, 0x23, 0x6c, 0x8b, 0xcb, 0x0a, 0xde, 0x3f, 0x30, 0x40, 0x39, 0x1c, 0xfa, 0x6b, 0x92, 0x50, 0x0b, 0x64, 0x8a, 0x1c, + 0x2c, 0xa7, 0xa3, 0xa2, 0x66, 0x96, 0xef, 0x2b, 0x39, 0x68, 0xfc, 0x4c, 0x6a, 0xc9, 0x81, 0x8b, 0x8f, 0x3c, 0x1a, 0x3b, 0x30, 0x0e, 0x50, 0x31, 0x95, 0xf7, 0x0a, 0xd6, 0x4c, 0xd5, 0x10, 0x13, + 0x5d, 0xbf, 0x2f, 0xf8, 0x33, 0x16, 0x4d, 0x6d, 0x47, 0x44, 0xc6, 0xb9, 0x4b, 0xb1, 0x6a, 0x8c, 0x6b, 0xf6, 0x2a, 0x0b, 0xca, 0x6d, 0x43, 0x69, 0xc7, 0xe0, 0x42, 0xe7, 0xba, 0x3f, 0xe1, 0x2e, + 0x13, 0xc7, 0x7b, 0x93, 0x4b, 0xf7, 0xd5, 0x81, 0x1e, 0x67, 0x0c, 0xa0, 0xde, 0x6a, 0xe1, 0x9c, 0xe4, 0x5c, 0x01, 0x37, 0x01, 0x6f, 0x95, 0xd9, 0xcf, 0x98, 0xc2, 0x3b, 0x37, 0x23, 0xd5, 0x27, + 0x9e, 0x1f, 0xff, 0x06, 0x0a, 0x21, 0x2b, 0x21, 0x2d, 0x15, 0x3d, 0xb1, 0x84, 0xfb, 0xfe, 0x4c, 0x22, 0x26, 0xa1, 0x88, 0x79, 0xa2, 0x4a, 0xdf, 0x28, 0x47, 0x69, 0x41, 0x38, 0x8f, 0xde, 0x24, + 0xe2, 0x05, 0x23, 0x7a, 0x02, 0x8e, 0xcb, 0xdb, 0x95, 0xa9, 0xae, 0xa0, 0xa6, 0xd8, 0x80, 0xd9, 0x2c, 0xee, 0x61, 0x13, 0x45, 0x12, 0xb5, 0xe1, 0x1a, 0x53, 0x62, 0x94, 0xc0, 0x2d, 0x32, 0x15, + 0x38, 0x9a, 0xea, 0xaf, 0x66, 0x45, 0xd6, 0x59, 0x39, 0xf4, 0x91, 0x52, 0x1a, 0x72, 0x9d, 0x02, 0xe9, 0x5a, 0xcc, 0x98, 0x3e, 0x68, 0x25, 0x46, 0x7c, 0x75, 0xd1, 0x76, 0x97, 0x77, 0x33, 0x0c, + 0x10, 0xe7, 0x37, 0xa0, 0x44, 0xfd, 0x02, 0xaf, 0x5e, 0x2b, 0x19, 0xee, 0x1d, 0x83, 0xef, 0xb7, 0xa7, 0xdd, 0x99, 0x95, 0x76, 0x8b, 0x39, 0x82, 0x05, 0xcd, 0xeb, 0xc0, 0x48, 0x3a, 0x71, 0x13, + 0x10, 0x48, 0xad, 0x97, 0xe4, 0x4c, 0x9f, 0x45, 0x24, 0x3f, 0x89, 0x46, 0xa3, 0x38, 0xc7, 0x55, 0xad, 0x41, 0x26, 0x99, 0x66, 0xec, 0xe6, 0x08, 0x28, 0xbc, 0x29, 0xa7, 0x68, 0x7b, 0xf9, 0x02, + 0x71, 0x78, 0xa1, 0xff, 0x35, 0xa9, 0xf0, 0x63, 0x72, 0x7c, 0xa9, 0xb6, 0x79, 0x62, 0x94, 0xbb, 0xbd, 0x2e, 0x9d, 0x45, 0x08, 0x23, 0xf7, 0x78, 0x0e, 0x11, 0xe3, 0x8b, 0xb1, 0xcf, 0x52, 0x00, + 0xc8, 0x2c, 0x45, 0x84, 0x2f, 0x83, 0xcd, 0x86, 0x84, 0x45, 0xa4, 0x59, 0xf0, 0xa2, 0x23, 0x7a, 0x28, 0x7c, 0x8a, 0x76, 0x43, 0x18, 0x3f, 0xa3, 0xeb, 0x3b, 0xf3, 0x9a, 0x2c, 0x35, 0x24, 0x11, + 0x76, 0xa6, 0xa8, 0xeb, 0x7e, 0x13, 0x20, 0x5e, 0x06, 0x64, 0x5b, 0xec, 0xdf, 0x03, 0x8b, 0xfc, 0xb8, 0xe3, 0xaf, 0xe5, 0x33, 0x4c, 0xc7, 0x45, 0xc7, 0x45, 0xf3, 0xae, 0x79, 0xa0, 0xba, 0x22, + 0x61, 0x56, 0x01, 0xe2, 0x3a, 0x38, 0x0b, 0x6a, 0xec, 0x0f, 0xa0, 0xa6, 0x69, 0x4a, 0xe4, 0xf1, 0xc6, 0xeb, 0x65, 0xb5, 0x85, 0x93, 0xa8, 0x30, 0x14, 0x8b, 0xb9, 0x09, 0xba, 0x29, 0xd1, 0x2a, + 0x86, 0xda, 0x2b, 0x4b, 0x54, 0x68, 0x0d, 0xdc, 0x91, 0x6a, 0xfb, 0xc8, 0x45, 0x5d, 0x0a, 0xe4, 0x23, 0xdb, 0x56, 0xfb, 0x05, 0x7b, 0x15, 0x85, 0xb4, 0xd0, 0xc4, 0xa0, 0x92, 0x67, 0x19, 0x1d, + 0x1a, 0x02, 0x39, 0xae, 0x3b, 0x23, 0x76, 0x48, 0xdc, 0x57, 0x81, 0x84, 0x92, 0x0d, 0x8b, 0xcc, 0x6c, 0x4c, 0xd7, 0xfa, 0x49, 0x65, 0x4a, 0x25, 0x47, 0xd3, 0x8c, 0x1c, 0x60, 0xfa, 0x95, 0x13, + 0xa0, 0x0f, 0x79, 0x32, 0xa2, 0xa9, 0x87, 0xf1, 0xf2, 0xfb, 0x1e, 0x85, 0x09, 0xec, 0x6d, 0x4c, 0xfa, 0xe1, 0x0a, 0xe6, 0xda, 0x6b, 0x2d, 0xc2, 0x9e, 0x3c, 0xf9, 0x5f, 0xe1, 0x60, 0x43, 0x23, + 0xb9, 0x8b, 0x51, 0xb3, 0x5d, 0xfd, 0xf3, 0x62, 0xb8, 0xc2, 0xa3, 0xcf, 0xd3, 0x7c, 0xee, 0x52, 0x15, 0xc7, 0xbe, 0xe0, 0xad, 0xb8, 0xc1, 0x44, 0xd8, 0x7e, 0x75, 0x33, 0xe5, 0x5c, 0x13, 0x25, + 0x93, 0xf5, 0xa8, 0xd5, 0x97, 0x48, 0x8f, 0x1f, 0xb6, 0xc8, 0x43, 0x80, 0x99, 0xce, 0xe4, 0x99, 0x0e, 0x88, 0x36, 0x19, 0xd4, 0xf8, 0x5b, 0xff, 0x99, 0x51, 0x2e, 0xc1, 0x63, 0xa8, 0x7c, 0x09, + 0x28, 0x46, 0x4f, 0x4c, 0x84, 0x0a, 0xdd, 0xcd, 0xa8, 0x3d, 0x74, 0x86, 0x21, 0xc9, 0xec, 0xf7, 0x60, 0x64, 0x46, 0xb7, 0x19, 0x48, 0x15, 0x80, 0x5e, 0x95, 0x89, 0xbe, 0xe6, 0x68, 0x99, 0x06, + 0x3b, 0x62, 0xf3, 0x85, 0xdf, 0xd6, 0x1e, 0x5d, 0x93, 0x32, 0x7a, 0xc7, 0x5d, 0x9a, 0x3e, 0x66, 0x82, 0x9f, 0x45, 0x03, 0x85, 0xc4, 0xe2, 0x53, 0x03, 0x4e, 0xa2, 0xc3, 0xec, 0x01, 0xfb, 0x02, + 0xd7, 0x6d, 0xca, 0xfa, 0x05, 0x1d, 0x68, 0xac, 0xe0, 0xd6, 0x2e, 0x8b, 0x66, 0x06, 0x3f, 0x4d, 0x9a, 0x58, 0x4d, 0x7a, 0xc0, 0xa9, 0x47, 0xaf, 0xa1, 0x70, 0x34, 0x4d, 0x61, 0xc7, 0x86, 0x29, + 0x34, 0x1b, 0xd5, 0x92, 0xb2, 0x56, 0x69, 0x77, 0x5b, 0x83, 0x28, 0x77, 0xf0, 0x91, 0x87, 0x1c, 0x1a, 0xe2, 0x7b, 0xb5, 0x00, 0xf9, 0x3d, 0xef, 0xa0, 0xc5, 0x83, 0x4f, 0x0a, 0xd9, 0x7b, 0x21, + 0x93, 0x24, 0xbb, 0x5f, 0x62, 0xd8, 0x07, 0x3a, 0x89, 0x82, 0x62, 0x07, 0xaf, 0x90, 0x07, 0x5c, 0xfa, 0xb5, 0x5e, 0xa9, 0x2d, 0x4d, 0x09, 0xf3, 0x12, 0xa0, 0x5b, 0xd6, 0x3f, 0x12, 0x1c, 0x04, + 0x05, 0x76, 0xbc, 0x3f, 0xb3, 0x83, 0xd8, 0x1c, 0xda, 0xaf, 0x1e, 0xd4, 0xf3, 0x98, 0x72, 0x95, 0x30, 0x3f, 0xf4, 0x22, 0xca, 0x4a, 0xfb, 0xdc, 0x2b, 0xfe, 0x66, 0x73, 0x2d, 0x35, 0xe1, 0x20, + 0x00, 0x3b, 0xd4, 0x87, 0x22, 0x3b, 0x6b, 0x7b, 0x8f, 0x59, 0x9e, 0x38, 0xce, 0xf5, 0xbe, 0x3e, 0xa4, 0x95, 0x3a, 0x07, 0xdb, 0x73, 0xa4, 0x95, 0x8f, 0x2d, 0x8e, 0xc6, 0x87, 0xc5, 0x4e, 0x2c, + 0x9f, 0xfb, 0xba, 0xf7, 0x8b, 0xaa, 0xf3, 0x6e, 0x94, 0xb8, 0xe4, 0x06, 0xfd, 0x9e, 0x71, 0x48, 0x43, 0x50, 0xf3, 0x51, 0x4a, 0xa0, 0x3d, 0x11, 0xa6, 0x7a, 0x02, 0x7e, 0x63, 0xa7, 0xd3, 0x17, + 0x1b, 0xc2, 0x14, 0xa7, 0x05, 0x79, 0xbe, 0xe5, 0x6b, 0x29, 0x08, 0xdd, 0x5f, 0x71, 0x8b, 0x3c, 0x88, 0x0b, 0xa1, 0x56, 0x42, 0xfc, 0x35, 0x96, 0x0d, 0xcb, 0xac, 0xf2, 0x5e, 0x16, 0x4f, 0x1f, + 0x23, 0xc3, 0xf2, 0xaa, 0x8c, 0xf2, 0xe5, 0x94, 0xe2, 0x8f, 0x5d, 0xe4, 0xbe, 0x0b, 0xeb, 0xa9, 0xfc, 0xb4, 0x44, 0xef, 0x3b, 0x10, 0x46, 0xc2, 0x17, 0xd2, 0xb5, 0x22, 0x33, 0x05, 0x03, 0x11, + 0xad, 0x1f, 0x99, 0x3f, 0xd9, 0x43, 0x4d, 0xce, 0xb8, 0x79, 0x14, 0xfb, 0xf4, 0x31, 0xe1, 0x21, 0x12, 0x8f, 0xa6, 0x79, 0x14, 0x6c, 0xbf, 0x5c, 0xfc, 0x51, 0xa9, 0x89, 0x23, 0xfa, 0x6e, 0x12, + 0x14, 0x6c, 0xe9, 0xad, 0x84, 0x9a, 0xfc, 0x2a, 0x00, 0x6d, 0xe3, 0x6f, 0xe8, 0x36, 0x13, 0x1c, 0x60, 0xce, 0xf8, 0x08, 0xa5, 0x50, 0xbe, 0x27, 0x06, 0x71, 0x34, 0x90, 0x1b, 0x6a, 0x43, 0x26, + 0x76, 0xa9, 0xbe, 0xc3, 0x62, 0x1d, 0x66, 0x1e, 0xcc, 0x3f, 0xd9, 0xa6, 0xab, 0xf6, 0xa5, 0x9a, 0xe5, 0xb2, 0xf0, 0x90, 0xa2, 0x48, 0x5a, 0xb3, 0xd9, 0xbd, 0x45, 0xad, 0xdd, 0xd9, 0xaf, 0x03, + 0xa0, 0x7b, 0x36, 0x52, 0xdd, 0x22, 0x51, 0x42, 0xff, 0x59, 0xfb, 0x0f, 0xf2, 0x6b, 0x0b, 0x8d, 0x2b, 0xa4, 0x00, 0x57, 0x06, 0xc8, 0x6c, 0x63, 0x2c, 0xd7, 0x91, 0xbf, 0x90, 0x63, 0x7a, 0x09, + 0x52, 0x07, 0xf9, 0x4b, 0xcd, 0x19, 0xda, 0xc6, 0x01, 0x24, 0x19, 0x80, 0x22, 0x2d, 0xc5, 0x78, 0x8b, 0x55, 0x75, 0x44, 0x68, 0x9c, 0xa1, 0xb4, 0x26, 0x66, 0x19, 0x49, 0x26, 0x6a, 0xb5, 0x06, + 0xde, 0xdb, 0x18, 0x01, 0xbf, 0xf3, 0x74, 0xa4, 0x23, 0x7a, 0xe1, 0xe8, 0x13, 0x08, 0x04, 0x5c, 0x23, 0x9e, 0x72, 0x82, 0x1d, 0xf3, 0xfb, 0xad, 0x1f, 0x3e, 0x81, 0x42, 0x0b, 0x3a, 0x7a, 0x03, + 0x07, 0x3d, 0x74, 0x91, 0x29, 0x9c, 0x3d, 0x88, 0x61, 0x97, 0x6e, 0x9a, 0x8e, 0x48, 0xeb, 0x10, 0xf7, 0x74, 0x66, 0xdd, 0xbf, 0x49, 0xe1, 0xad, 0x70, 0xd8, 0x38, 0x56, 0x09, 0xc4, 0xda, 0x14, + 0x27, 0xb7, 0xf2, 0x86, 0x96, 0x3d, 0x0c, 0xae, 0xd2, 0x7f, 0x26, 0x73, 0x16, 0xa4, 0x5f, 0xcb, 0x32, 0xd0, 0x43, 0x00, 0x23, 0xa8, 0x41, 0x53, 0xdb, 0xf2, 0x61, 0x84, 0x92, 0xd4, 0x72, 0x17, + 0xd6, 0x3a, 0x7c, 0x7d, 0x62, 0x39, 0x0e, 0xce, 0x96, 0xb5, 0x77, 0xf2, 0x7c, 0x66, 0xfb, 0xb5, 0xc4, 0x96, 0x26, 0x45, 0x89, 0xd5, 0xe0, 0xac, 0x09, 0x9c, 0x74, 0x76, 0xc0, 0xdd, 0x7c, 0x08, + 0x2f, 0x17, 0xc6, 0xa1, 0x41, 0x41, 0x40, 0x38, 0x73, 0xbf, 0x8d, 0xe4, 0xac, 0x87, 0xdf, 0xe3, 0x6d, 0x6b, 0x5d, 0x13, 0xd3, 0x54, 0xad, 0x25, 0x4c, 0xb0, 0x8b, 0xf4, 0x9e, 0x51, 0xa4, 0x0b, + 0x28, 0xcc, 0xf0, 0x6f, 0x22, 0x6a, 0x2b, 0x7a, 0x9d, 0x1b, 0xed, 0x72, 0x50, 0x27, 0xec, 0x2e, 0x44, 0xa2, 0x76, 0x67, 0x7d, 0x33, 0xb9, 0xd1, 0x70, 0x91, 0xbd, 0x36, 0x5b, 0x2c, 0x27, 0x20, + 0x19, 0x1f, 0xe0, 0x8f, 0x5c, 0x85, 0x31, 0x77, 0x58, 0xcb, 0x1d, 0x6b, 0x7d, 0x04, 0xc6, 0x8d, 0xef, 0x3e, 0x1d, 0x9d, 0xdb, 0x6d, 0xb4, 0xe0, 0x1a, 0xbc, 0xc9, 0x90, 0xcf, 0x52, 0x1b, 0x15, + 0x08, 0x8c, 0x8e, 0x54, 0x2d, 0x05, 0x58, 0x0e, 0x2b, 0xf9, 0x3f, 0x07, 0x83, 0xd1, 0xd8, 0x4e, 0xc1, 0x4e, 0x06, 0xda, 0x1e, 0xb1, 0x8f, 0x86, 0x59, 0x37, 0x85, 0x9b, 0xf4, 0x00, 0x53, 0x23, + 0x73, 0x71, 0xe0, 0xfb, 0xad, 0xdd, 0xbd, 0xf0, 0xc3, 0xb6, 0x63, 0x09, 0xa4, 0x96, 0xc3, 0xb0, 0x50, 0xbf, 0xad, 0x0d, 0x40, 0x86, 0xb0, 0xf6, 0x9b, 0xcb, 0xc8, 0xec, 0x97, 0x5a, 0xb8, 0x0e, + 0xec, 0x4a, 0x0f, 0x90, 0xd7, 0x44, 0x12, 0xed, 0x31, 0xdb, 0xd7, 0x02, 0xf5, 0x74, 0x9d, 0x94, 0x01, 0x8c, 0x60, 0xb4, 0x65, 0xd9, 0xea, 0x53, 0x0c, 0xac, 0x77, 0xe3, 0x59, 0x90, 0xfa, 0x00, + 0xea, 0xe1, 0x8b, 0x51, 0x51, 0x3c, 0x52, 0x50, 0x6b, 0x9b, 0x31, 0xff, 0x9a, 0x9b, 0xda, 0xd8, 0x7a, 0xb4, 0x95, 0x6d, 0x38, 0xa7, 0xa8, 0x26, 0x81, 0x8c, 0x51, 0x7e, 0xf9, 0x3a, 0xa9, 0x26, + 0x3f, 0x44, 0xb5, 0x93, 0xdc, 0x54, 0x64, 0xe8, 0x23, 0xeb, 0x9d, 0xd0, 0xc2, 0x4b, 0xac, 0xab, 0x0f, 0x28, 0x8b, 0x5c, 0xe4, 0x79, 0xfd, 0x4e, 0x83, 0x7d, 0x41, 0x23, 0x48, 0x44, 0x75, 0x02, + 0x01, 0x79, 0xb8, 0x10, 0x02, 0xb2, 0xd4, 0x2a, 0xd6, 0xc1, 0xec, 0x2f, 0x29, 0xc3, 0xc7, 0x44, 0xdc, 0x1c, 0x70, 0xfc, 0xb8, 0xf9, 0x38, 0x36, 0x9e, 0x40, 0x51, 0xaf, 0x7a, 0xd3, 0xbb, 0x28, + 0x02, 0xb0, 0x42, 0xf0, 0x80, 0x7e, 0x22, 0x1f, 0xc9, 0x1e, 0xc7, 0xcc, 0x9c, 0x9e, 0xfc, 0x0a, 0xd0, 0xc6, 0x21, 0xe0, 0x54, 0x44, 0x19, 0xea, 0xd3, 0xad, 0x8e, 0x68, 0x5d, 0xa1, 0x32, 0x1f, + 0x81, 0x01, 0x7f, 0xfc, 0x93, 0x2a, 0xeb, 0xc2, 0xcf, 0xb5, 0x7c, 0xdc, 0x33, 0x09, 0x37, 0x81, 0xe0, 0x27, 0xe2, 0x09, 0x3f, 0x35, 0x87, 0xbc, 0xfc, 0x9a, 0xbf, 0x17, 0x85, 0x51, 0xdc, 0x2e, + 0xf3, 0x16, 0x20, 0x5d, 0x1a, 0xed, 0x84, 0x68, 0xd8, 0x46, 0x22, 0x9c, 0x81, 0xb5, 0x84, 0x8a, 0x9e, 0x88, 0x04, 0xf7, 0xae, 0x76, 0x07, 0xd4, 0x02, 0x24, 0x85, 0xc1, 0x71, 0xe2, 0x0e, 0x07, + 0x5f, 0x3a, 0x0c, 0x99, 0x8e, 0xce, 0x60, 0xb6, 0xdc, 0xb1, 0x01, 0x04, 0x5e, 0x25, 0x2f, 0xbc, 0xef, 0xca, 0xfd, 0xd9, 0x85, 0x5c, 0xf4, 0xcc, 0xa4, 0x9c, 0x84, 0xa5, 0xb5, 0x47, 0xe0, 0x1d, + 0xe2, 0x46, 0x24, 0x50, 0xd1, 0x6d, 0xb3, 0xa0, 0x85, 0xb0, 0x19, 0xa9, 0x6c, 0x32, 0xcc, 0xd9, 0x27, 0x66, 0x43, 0xb1, 0x5e, 0xc7, 0x92, 0x74, 0xc0, 0x69, 0xa2, 0xce, 0xb6, 0x00, 0xe0, 0x1f, + 0xc1, 0xce, 0xa7, 0xcc, 0xff, 0x5b, 0x28, 0x8b, 0xa4, 0xc3, 0x70, 0x46, 0xf1, 0x8a, 0x8d, 0x4e, 0x9a, 0x3e, 0x3f, 0x5b, 0x69, 0xab, 0xd2, 0xbe, 0x75, 0x37, 0xc8, 0x93, 0x23, 0x42, 0xdd, 0x13, + 0x65, 0x00, 0x04, 0x43, 0xb6, 0xdf, 0xc5, 0x4d, 0xb6, 0x01, 0x81, 0x96, 0x9a, 0x19, 0xd6, 0x99, 0xa0, 0xb2, 0x93, 0xbe, 0x15, 0xdf, 0x2e, 0xac, 0x28, 0xaa, 0xd2, 0x7e, 0x79, 0xcc, 0xf3, 0x11, + 0xaf, 0xa3, 0xe2, 0x5a, 0x17, 0x18, 0x29, 0xd0, 0x8f, 0xb7, 0x45, 0xec, 0x21, 0x2d, 0xe4, 0x50, 0xe0, 0x54, 0xd8, 0xa3, 0x87, 0xd9, 0x39, 0x3b, 0x71, 0x97, 0x5a, 0x95, 0xc1, 0x15, 0xbc, 0x04, + 0xa5, 0x7a, 0xc1, 0x3d, 0x34, 0xa8, 0x42, 0x19, 0x35, 0x3c, 0x21, 0xb1, 0xbf, 0x8b, 0x6c, 0xcc, 0xf1, 0x47, 0xdd, 0x5a, 0x72, 0x1c, 0xa4, 0xb0, 0x36, 0xb1, 0xac, 0x56, 0x22, 0xaa, 0x55, 0x15, + 0x6e, 0x9e, 0x40, 0x62, 0x98, 0xfe, 0x45, 0x06, 0x86, 0x37, 0x89, 0x7d, 0x2d, 0x7d, 0x38, 0x25, 0x98, 0x52, 0x8b, 0x35, 0x7d, 0xc1, 0xd4, 0x7f, 0x40, 0x5c, 0xbb, 0xf4, 0x4d, 0xab, 0xa1, 0x0e, + 0x6f, 0x38, 0x9f, 0x1e, 0x3b, 0x6f, 0x54, 0x37, 0xd2, 0x6e, 0x77, 0xa5, 0xb1, 0x74, 0x81, 0xe5, 0xf1, 0x1f, 0xb7, 0xe3, 0xe2, 0x67, 0x9d, 0x42, 0x08, 0xd4, 0xc2, 0x2c, 0x88, 0x5e, 0xef, 0x1d, + 0x71, 0xc3, 0x07, 0x0a, 0xff, 0x97, 0xb0, 0x1e, 0x4a, 0x7c, 0x22, 0x24, 0x3d, 0x42, 0x44, 0xb1, 0x34, 0x3d, 0x75, 0x92, 0xbf, 0xb4, 0x9a, 0xfa, 0xad, 0x12, 0x2e, 0xc1, 0xb3, 0xb0, 0xfb, 0x27, + 0x09, 0x73, 0xb9, 0x9d, 0x3c, 0x25, 0xe8, 0x6d, 0x62, 0x50, 0x3a, 0x6c, 0xea, 0x7a, 0xc9, 0xa5, 0x78, 0xa9, 0xc7, 0x70, 0x93, 0xe6, 0x88, 0xc4, 0x12, 0x4e, 0xb6, 0xd7, 0x9a, 0x81, 0x38, 0x0a, + 0x05, 0xa9, 0xbe, 0xa0, 0xc6, 0x21, 0xb9, 0x43, 0x99, 0x61, 0x02, 0xcb, 0x3e, 0xa1, 0x48, 0xca, 0x8c, 0xfc, 0x5e, 0xbe, 0x74, 0x5a, 0xa9, 0x26, 0x98, 0xf2, 0x6d, 0x57, 0xec, 0x03, 0x3a, 0x29, + 0x3e, 0x79, 0x70, 0xd1, 0xa0, 0xb5, 0x5e, 0xd5, 0xd7, 0xa0, 0x64, 0xf2, 0x9c, 0x96, 0x2c, 0x8d, 0xd9, 0xc6, 0xe5, 0x47, 0xc5, 0x5e, 0x2f, 0xd3, 0x79, 0x58, 0xa6, 0xe2, 0xc4, 0x63, 0x71, 0x28, + 0xef, 0x62, 0x41, 0x45, 0x21, 0x55, 0x10, 0x33, 0x2d, 0xf5, 0xb8, 0x2b, 0x73, 0x17, 0x86, 0xde, 0x05, 0x48, 0x1f, 0xab, 0xaa, 0x7d, 0x12, 0xd2, 0xe7, 0xa6, 0xab, 0xb1, 0x32, 0x3f, 0xa2, 0x0e, + 0x19, 0xee, 0x90, 0x60, 0x61, 0x0f, 0x78, 0x7c, 0x22, 0x9e, 0xef, 0xea, 0xf7, 0x83, 0x93, 0x6f, 0x08, 0x27, 0x50, 0xaa, 0x46, 0x0c, 0x2a, 0xe2, 0xd7, 0xdd, 0x19, 0x76, 0xcf, 0x49, 0x5f, 0x06, + 0x6b, 0xed, 0x9d, 0xe6, 0x1d, 0xf4, 0xbc, 0x88, 0x24, 0xaf, 0x32, 0x06, 0xa9, 0x5b, 0x89, 0xe9, 0x83, 0x09, 0x26, 0x82, 0x26, 0xa1, 0x5f, 0xe4, 0xbb, 0xe2, 0x50, 0xa0, 0x36, 0x80, 0x70, 0x08, + 0x8c, 0xd1, 0xc2, 0xf8, 0x83, 0x61, 0x2b, 0x83, 0xc0, 0xd2, 0x09, 0xde, 0xf0, 0xcb, 0x29, 0x13, 0x1d, 0x85, 0xd6, 0xce, 0x3a, 0xdc, 0xbe, 0x5d, 0xb6, 0x13, 0x70, 0x51, 0x53, 0xd9, 0x43, 0x28, + 0x40, 0x30, 0xf0, 0xdb, 0x74, 0x40, 0x43, 0x9c, 0x9c, 0x7b, 0x54, 0x20, 0xaf, 0x13, 0xc3, 0xbe, 0xd6, 0xc6, 0xc7, 0x17, 0x85, 0x4f, 0xc4, 0xf6, 0x08, 0xd7, 0x36, 0xb5, 0xc5, 0x05, 0x99, 0x1e, + 0xfc, 0xaf, 0x45, 0xf2, 0x28, 0x6f, 0x05, 0x76, 0xca, 0x4c, 0xa0, 0x84, 0x7c, 0xe7, 0x70, 0xb6, 0x50, 0xd7, 0xc2, 0x60, 0xc0, 0xda, 0xda, 0xa6, 0x19, 0x70, 0x4b, 0x71, 0xeb, 0xdd, 0x01, 0x00, + 0x3a, 0x9d, 0xec, 0xad, 0x75, 0x82, 0x60, 0xb2, 0x49, 0xb7, 0x3d, 0x6f, 0x50, 0x71, 0x7b, 0x7d, 0x6a, 0x50, 0xc0, 0x93, 0x73, 0xc7, 0x05, 0x75, 0x78, 0x55, 0x11, 0xd0, 0xbe, 0x4b, 0x21, 0x16, + 0xd0, 0xa8, 0xb1, 0xfe, 0x9b, 0x76, 0x80, 0x13, 0xe8, 0x02, 0x95, 0xe1, 0xfa, 0x21, 0x11, 0xd8, 0xf7, 0x46, 0xe5, 0x12, 0xa0, 0x03, 0x28, 0x1a, 0x04, 0x10, 0xeb, 0xe9, 0x02, 0xbe, 0x6c, 0x13, + 0x41, 0x99, 0x72, 0x9b, 0x8a, 0xec, 0xf9, 0x83, 0x7e, 0xaa, 0xed, 0x3b, 0x2e, 0xff, 0xae, 0xb3, 0x02, 0xd1, 0x45, 0xcc, 0xc5, 0xb4, 0xf0, 0xb7, 0x98, 0x91, 0xc5, 0x7b, 0x6c, 0xf0, 0xb2, 0x1a, + 0x5d, 0x16, 0x95, 0x9d, 0xd0, 0xd7, 0x2d, 0xb8, 0x46, 0x52, 0x5a, 0x3b, 0x47, 0x4b, 0x11, 0xbc, 0xbc, 0x2f, 0x04, 0x52, 0xfe, 0x36, 0x13, 0x81, 0x63, 0xf5, 0xb4, 0xb7, 0xba, 0xc4, 0xd4, 0x12, + 0xd3, 0x31, 0xcf, 0x22, 0x23, 0x32, 0xcb, 0xc9, 0xe7, 0xac, 0xf3, 0x31, 0xe7, 0x9d, 0xf3, 0x6d, 0xa2, 0x04, 0x4e, 0xc2, 0xe7, 0x83, 0x1f, 0xfc, 0x6e, 0xc3, 0x00, 0x9a, 0x17, 0xa2, 0x28, 0x1b, + 0x3b, 0x7a, 0xd1, 0x0c, 0x67, 0x19, 0x2a, 0xb9, 0x92, 0x51, 0xe1, 0x44, 0x0b, 0xb9, 0x29, 0xed, 0xc0, 0x4c, 0x93, 0x39, 0x2b, 0xcb, 0x6f, 0x0a, 0x32, 0x3a, 0x08, 0x1e, 0x11, 0x72, 0xee, 0x1d, + 0x1a, 0x09, 0x03, 0x3e, 0x62, 0x3c, 0xeb, 0x29, 0x47, 0x62, 0xc5, 0x01, 0x68, 0xb3, 0x5b, 0x46, 0x46, 0x0f, 0x13, 0xb2, 0x82, 0xf2, 0xf9, 0xca, 0x57, 0xb3, 0x32, 0x6b, 0x29, 0xf5, 0x0d, 0x2a, + 0xc6, 0x90, 0xb8, 0x00, 0x0c, 0x92, 0xc6, 0x3d, 0x13, 0x09, 0xda, 0x61, 0x4d, 0x0e, 0xe7, 0x75, 0x5b, 0xfc, 0x9d, 0x77, 0xc0, 0xc2, 0xfb, 0xa2, 0x8b, 0xad, 0x6d, 0x87, 0xdb, 0x4a, 0x4f, 0x20, + 0x71, 0xfd, 0xed, 0x54, 0x11, 0x75, 0x07, 0x01, 0xfb, 0xb2, 0xbb, 0x91, 0x1d, 0xea, 0xeb, 0x81, 0x64, 0x7f, 0x48, 0xa7, 0x56, 0xc6, 0xfb, 0x42, 0x2a, 0x58, 0x7f, 0x97, 0xde, 0x8d, 0x68, 0x0e, + 0xb6, 0x60, 0x85, 0x00, 0xc9, 0x97, 0x7b, 0x6c, 0x2b, 0xc4, 0x81, 0x25, 0x41, 0x74, 0x98, 0x65, 0x9b, 0xa5, 0x43, 0xad, 0x68, 0xc5, 0x72, 0x9a, 0x1b, 0xd9, 0x4f, 0xa0, 0xb0, 0x20, 0xca, 0x00, + 0x21, 0x5b, 0x74, 0xa6, 0x08, 0xa7, 0xf6, 0xcd, 0xee, 0xfd, 0x53, 0x3e, 0x98, 0xc3, 0xe7, 0x54, 0x42, 0xf2, 0x9c, 0xc5, 0x8e, 0x8a, 0xa6, 0x9e, 0xf2, 0xae, 0x00, 0x5c, 0x66, 0x43, 0x2f, 0x2a, + 0x68, 0x3f, 0xa8, 0x7a, 0xf5, 0x39, 0xfb, 0x9c, 0xae, 0xcb, 0xb8, 0xba, 0x39, 0x97, 0xbc, 0x81, 0xb6, 0x92, 0xf7, 0x2d, 0x8e, 0x89, 0x5e, 0xaa, 0xc0, 0x0f, 0x64, 0x49, 0xa3, 0xb1, 0x75, 0x1f, + 0x2a, 0xae, 0x65, 0xd4, 0x18, 0xaa, 0x0a, 0xa1, 0xa3, 0x28, 0x3f, 0x2b, 0x32, 0x65, 0x33, 0xb4, 0xa1, 0x14, 0x95, 0x99, 0x92, 0xb8, 0xad, 0x7c, 0x19, 0x9e, 0x04, 0xb4, 0x60, 0x3c, 0xcc, 0x1d, + 0xda, 0x6b, 0xf7, 0xcd, 0x66, 0xfb, 0xf2, 0x9b, 0x65, 0x64, 0x7c, 0xf0, 0xb7, 0x3e, 0x6b, 0x69, 0x28, 0x35, 0xc3, 0xfa, 0x6a, 0xeb, 0xe0, 0x68, 0xe8, 0xf0, 0x97, 0x15, 0xfd, 0xe2, 0xa0, 0x2f, + 0xbb, 0x46, 0x16, 0x81, 0x2e, 0xf0, 0x30, 0xe8, 0x72, 0xd1, 0xf3, 0x5e, 0xfd, 0x25, 0x98, 0x65, 0xc5, 0x3d, 0x63, 0x07, 0xd1, 0xe7, 0xf1, 0xe9, 0x4e, 0x74, 0xa8, 0xc6, 0x5f, 0x05, 0x70, 0x08, + 0x3f, 0x07, 0x30, 0xbe, 0x18, 0x34, 0xf8, 0x9c, 0x7c, 0x35, 0xd7, 0xd8, 0x8e, 0x19, 0xac, 0x3c, 0xe4, 0xbe, 0x02, 0x5a, 0x67, 0x48, 0x18, 0xf0, 0x6e, 0x1e, 0xeb, 0x75, 0x95, 0x9a, 0x5d, 0x29, + 0x80, 0x16, 0x85, 0x53, 0xc8, 0xd1, 0xac, 0x60, 0x29, 0x61, 0x73, 0x0b, 0x4a, 0xee, 0x3f, 0x45, 0x14, 0x21, 0x33, 0xce, 0x4a, 0x98, 0xdc, 0x97, 0x1a, 0xc4, 0xc3, 0x03, 0xe5, 0xa7, 0xce, 0x1a, + 0x05, 0x47, 0x44, 0x3f, 0x4d, 0x1f, 0xdf, 0xee, 0xd8, 0x63, 0x51, 0x6a, 0xc4, 0x47, 0xcd, 0x25, 0x69, 0x69, 0x4d, 0x58, 0xa6, 0x85, 0xbc, 0x37, 0xdf, 0xbe, 0x25, 0x43, 0x1b, 0x2c, 0xe4, 0x08, + 0x48, 0x9f, 0x67, 0xac, 0x54, 0x2d, 0x40, 0x82, 0x85, 0x3e, 0xd6, 0x73, 0x18, 0xd0, 0x73, 0x2c, 0xca, 0x78, 0xb9, 0xf6, 0x34, 0x28, 0xe4, 0x62, 0x08, 0xba, 0x91, 0x85, 0x90, 0x47, 0xa5, 0x08, + 0x36, 0xb7, 0x9c, 0x60, 0x18, 0x0b, 0x17, 0x01, 0xcd, 0x86, 0x59, 0x6f, 0xfb, 0xa7, 0x8e, 0x14, 0xad, 0xb8, 0xf5, 0xe7, 0xe2, 0x5d, 0x23, 0x67, 0x3b, 0xee, 0xa1, 0x0e, 0xb9, 0xb9, 0xed, 0x24, + 0x23, 0x70, 0x3c, 0xef, 0xd3, 0x05, 0x37, 0x51, 0x72, 0x21, 0xd3, 0xba, 0x96, 0xb5, 0xbc, 0xce, 0xe3, 0x3f, 0xf0, 0xc7, 0x3f, 0xe1, 0xc6, 0x63, 0x29, 0x55, 0xe7, 0x5a, 0x90, 0x13, 0xeb, 0x1a, + 0xc6, 0xe2, 0x21, 0x96, 0xa8, 0xe2, 0x28, 0x56, 0x80, 0x18, 0xfe, 0x22, 0x9a, 0x46, 0x65, 0x45, 0x28, 0x7e, 0xdb, 0xa6, 0x01, 0x53, 0x2d, 0xc5, 0xeb, 0x7a, 0x28, 0x43, 0x30, 0x60, 0xab, 0x0a, + 0x4a, 0xf1, 0x6b, 0x35, 0xb3, 0x9d, 0xe3, 0xb9, 0x5d, 0xba, 0x7f, 0x98, 0x5d, 0x9a, 0x54, 0xc7, 0x92, 0x82, 0x7c, 0xbf, 0xa6, 0x65, 0xd7, 0x80, 0x63, 0xc1, 0x41, 0xd2, 0x5e, 0x96, 0x96, 0x21, + 0x28, 0xa8, 0x81, 0x58, 0x0b, 0x32, 0xa7, 0xc5, 0x10, 0x28, 0xa6, 0x2d, 0xcc, 0xe9, 0x7d, 0x55, 0x28, 0xa9, 0xe1, 0x81, 0xa9, 0x8f, 0x84, 0x46, 0x62, 0x16, 0xb2, 0x1e, 0xbd, 0xe3, 0x73, 0x2b, + 0x43, 0x5d, 0x95, 0xfd, 0xa3, 0xa3, 0x0f, 0xa5, 0xe7, 0xee, 0xb3, 0xe6, 0xb0, 0xa4, 0x2c, 0xfd, 0x48, 0x55, 0x93, 0xc1, 0xe3, 0x23, 0xb3, 0xc6, 0x95, 0x35, 0xe2, 0x70, 0x03, 0xfd, 0x53, 0x00, + 0xf0, 0x68, 0xa4, 0xf4, 0xa0, 0xa2, 0xaf, 0x4c, 0x71, 0xda, 0x47, 0x42, 0x39, 0xbb, 0x89, 0xa6, 0xba, 0x7e, 0x17, 0x86, 0xd5, 0x64, 0xd4, 0xa2, 0xc8, 0x53, 0x29, 0xc9, 0x3f, 0x14, 0x93, 0x06, + 0x74, 0xc4, 0x1b, 0x43, 0x48, 0xe7, 0x76, 0xf6, 0x4a, 0xb4, 0x0e, 0xb9, 0x56, 0x8d, 0xcb, 0xdb, 0xfc, 0x52, 0x7e, 0x59, 0x8b, 0xef, 0xc1, 0xa7, 0xf1, 0x49, 0xc9, 0x05, 0xc3, 0x7b, 0x3d, 0x0f, + 0x01, 0xbc, 0x01, 0x7b, 0x19, 0xca, 0x01, 0x08, 0x1a, 0x94, 0x9f, 0xcb, 0x7e, 0xc6, 0xff, 0x57, 0xb4, 0x91, 0x15, 0x46, 0x33, 0x0d, 0x78, 0x4f, 0xef, 0xff, 0x2f, 0x8d, 0x93, 0x7e, 0x7f, 0x17, + 0x36, 0x3c, 0x7b, 0xba, 0x74, 0xfe, 0x1e, 0x3a, 0x52, 0xc9, 0xf5, 0x93, 0x4f, 0x2b, 0x80, 0x84, 0x10, 0xdc, 0x27, 0x81, 0x3c, 0x43, 0x03, 0xd2, 0x25, 0x01, 0x07, 0xc7, 0x46, 0xa4, 0x44, 0x16, + 0x56, 0x4e, 0x54, 0x73, 0xa8, 0x6b, 0xd9, 0xb7, 0xe5, 0x62, 0x1a, 0x91, 0xd6, 0xeb, 0xee, 0x1b, 0xe9, 0xd4, 0xa0, 0x90, 0x53, 0x15, 0x4f, 0x16, 0x6f, 0xcd, 0x4f, 0x43, 0xab, 0xec, 0xa7, 0x1d, + 0x13, 0xae, 0x4f, 0x99, 0xce, 0x6a, 0xb3, 0x09, 0x3c, 0x23, 0xe4, 0xfd, 0x82, 0x15, 0x29, 0xa3, 0x5f, 0xec, 0xa6, 0xf2, 0xd0, 0xe8, 0x9f, 0x75, 0xad, 0xa5, 0x3f, 0x06, 0x41, 0xb9, 0xe5, 0x2b, + 0x6f, 0x63, 0x37, 0xcf, 0xa3, 0x68, 0xf8, 0x5d, 0xf8, 0x90, 0x30, 0xde, 0x1f, 0x90, 0xe8, 0x96, 0x9d, 0x6b, 0xa8, 0x2c, 0x34, 0xc0, 0x3c, 0x67, 0xb7, 0x9b, 0x7f, 0xee, 0x99, 0xf4, 0x0a, 0x29, + 0x25, 0xa8, 0xe4, 0x94, 0x42, 0xdd, 0xbb, 0x40, 0x22, 0xba, 0x19, 0x44, 0x92, 0x11, 0x8c, 0xc2, 0x0a, 0xfd, 0xb3, 0xcc, 0xa7, 0x68, 0x11, 0x2e, 0x7a, 0xec, 0x34, 0xdc, 0xed, 0x11, 0xc5, 0x15, + 0xea, 0x27, 0xb4, 0x67, 0x73, 0xbe, 0x1c, 0xab, 0xc9, 0x43, 0x3d, 0xf0, 0xa6, 0x54, 0xf5, 0xc0, 0x08, 0xae, 0xfa, 0xa1, 0x62, 0x54, 0x6a, 0x10, 0xb2, 0xe0, 0x24, 0x6b, 0x61, 0xea, 0xc1, 0x2e, + 0x41, 0xb0, 0x88, 0xbd, 0x3a, 0x3e, 0xb0, 0x64, 0xd1, 0x53, 0xa4, 0x8d, 0x75, 0xa3, 0xaa, 0xea, 0xe8, 0xfb, 0x36, 0x48, 0xb4, 0x95, 0xb2, 0x52, 0x5d, 0x0b, 0xb1, 0xdc, 0x82, 0x35, 0x7a, 0x2f, + 0x77, 0xec, 0xa3, 0xad, 0x24, 0x98, 0x0d, 0x0f, 0xb9, 0x67, 0x24, 0x19, 0x7d, 0x5f, 0x2f, 0x9c, 0x1c, 0x6c, 0xe3, 0x62, 0x87, 0xe4, 0xf4, 0xe0, 0xfd, 0x34, 0xde, 0x5e, 0x8c, 0xf2, 0xa5, 0x1a, + 0xdd, 0x8a, 0x8d, 0x49, 0x6d, 0x08, 0xb5, 0xcd, 0x81, 0xce, 0xca, 0x13, 0x1c, 0x51, 0x7b, 0x9c, 0xf9, 0x1f, 0xba, 0x3e, 0x0d, 0xf0, 0x3d, 0x88, 0xc1, 0xcf, 0xd8, 0xb4, 0x5a, 0x34, 0x9b, 0x1e, + 0xd2, 0x02, 0x78, 0x0b, 0xbe, 0xd9, 0xe8, 0x1f, 0x0e, 0xf9, 0x6b, 0xc3, 0x7c, 0x47, 0x2d, 0x6e, 0x53, 0x0f, 0x92, 0x27, 0xb8, 0x3f, 0x9f, 0x74, 0x69, 0xdf, 0x8d, 0x55, 0x62, 0x0b, 0x49, 0x1d, + 0x88, 0x0d, 0x31, 0xa4, 0x13, 0x9c, 0xd7, 0x9d, 0x43, 0xb1, 0x1b, 0xb4, 0xef, 0xd6, 0x58, 0xe5, 0xa2, 0xee, 0x8f, 0x84, 0x39, 0x76, 0x55, 0x23, 0xed, 0x63, 0xd6, 0x55, 0xf2, 0x9a, 0x71, 0x09, + 0x76, 0x40, 0x30, 0xf0, 0x00, 0xa0, 0xdf, 0xd6, 0x0d, 0xc7, 0xa4, 0x8b, 0xe2, 0x99, 0x2b, 0x2a, 0x02, 0x3f, 0x16, 0x7c, 0xed, 0xd6, 0x03, 0x2e, 0xef, 0xc8, 0x08, 0x21, 0x3b, 0x3b, 0x03, 0x22, + 0x58, 0x44, 0xf6, 0x40, 0xdf, 0x57, 0xd0, 0xd1, 0x7e, 0xcb, 0x6f, 0xf2, 0xc8, 0x98, 0x75, 0x22, 0x12, 0xbd, 0x3d, 0x28, 0x35, 0xa9, 0x28, 0x7d, 0x1a, 0x6c, 0xd5, 0x8d, 0xd6, 0x34, 0xf6, 0x1d, + 0x68, 0x13, 0x11, 0x17, 0xd5, 0xb0, 0xdb, 0xdc, 0xa1, 0xaf, 0x63, 0xd0, 0x1c, 0x2c, 0xd7, 0x99, 0x99, 0x7e, 0x2f, 0xdf, 0xfb, 0x63, 0xa3, 0x81, 0x85, 0x3d, 0xc7, 0xb8, 0x16, 0x46, 0xfa, 0x23, + 0x1f, 0x22, 0xfa, 0x92, 0x35, 0x61, 0xfd, 0x64, 0x3f, 0x93, 0xe3, 0x73, 0x54, 0x57, 0xe5, 0x52, 0x9a, 0xa2, 0x28, 0x14, 0x07, 0x4f, 0x59, 0xf4, 0x71, 0x18, 0xed, 0xad, 0xa7, 0x98, 0x3c, 0x05, + 0x14, 0xb8, 0x80, 0x5d, 0x3e, 0xd4, 0xdf, 0x92, 0x3b, 0xfe, 0xe6, 0x97, 0xb4, 0x51, 0xc2, 0x49, 0x31, 0x7c, 0x65, 0xf5, 0x03, 0x2b, 0x3f, 0x42, 0x53, 0x1d, 0x30, 0xe4, 0xe3, 0x39, 0x25, 0x21, + 0x1b, 0x5e, 0x25, 0x85, 0x10, 0x46, 0x7c, 0xe6, 0x45, 0xaa, 0x21, 0x08, 0xf8, 0xdc, 0xda, 0x0b, 0x4c, 0xac, 0xed, 0x7f, 0x28, 0x7f, 0x81, 0xbe, 0x2f, 0x91, 0x29, 0xdf, 0x5e, 0xf4, 0xd5, 0x2f, + 0xdd, 0x77, 0x9d, 0x3a, 0xb8, 0x2b, 0xa0, 0xa0, 0x9a, 0x42, 0xff, 0x19, 0x6b, 0xa8, 0xa4, 0x49, 0x9a, 0xf3, 0xbf, 0xd7, 0xfd, 0x59, 0xbf, 0x35, 0xb9, 0x95, 0x65, 0x19, 0x13, 0xae, 0xc0, 0x12, + 0x4d, 0x4b, 0x63, 0x1d, 0x07, 0xd6, 0xb1, 0x4b, 0x8b, 0xaa, 0x0b, 0xd5, 0xa7, 0x25, 0xa1, 0xcf, 0x3e, 0x72, 0x64, 0xfc, 0x2c, 0x16, 0xe4, 0x50, 0x9f, 0xbb, 0xae, 0x3e, 0xa2, 0x8d, 0xda, 0x15, + 0xea, 0x0c, 0x66, 0x74, 0xa6, 0x4c, 0x6b, 0xc2, 0x18, 0x22, 0xc9, 0x40, 0x9a, 0x7d, 0xd3, 0x9a, 0x05, 0xc6, 0xb0, 0xa8, 0x48, 0x88, 0xbb, 0x26, 0xee, 0x28, 0x29, 0x37, 0x47, 0x45, 0x46, 0x10, + 0x0c, 0x56, 0xa8, 0x05, 0x9a, 0xa2, 0xfe, 0xab, 0x52, 0xe5, 0x18, 0xb0, 0xde, 0x15, 0x84, 0x71, 0x15, 0xc2, 0x5d, 0xe0, 0x11, 0x81, 0x83, 0x20, 0xe7, 0x40, 0x1d, 0xa8, 0x85, 0xc0, 0x7f, 0x29, + 0xe8, 0xe6, 0x86, 0xb2, 0x9e, 0xf7, 0x27, 0x53, 0x3a, 0xc9, 0x14, 0xeb, 0xac, 0x2a, 0x2a, 0x37, 0x5b, 0x92, 0x1d, 0x10, 0x29, 0xef, 0x96, 0xdf, 0xb7, 0x18, 0x8a, 0x59, 0xa3, 0xe1, 0x0e, 0x1d, + 0xee, 0x1e, 0xf3, 0x82, 0xa5, 0x66, 0x28, 0xce, 0xf4, 0xcd, 0xb5, 0x7e, 0x1e, 0xa0, 0x04, 0x06, 0x65, 0xd9, 0x90, 0xdf, 0x79, 0x6d, 0x9f, 0xc1, 0x50, 0x18, 0xc5, 0xb3, 0x3f, 0xb7, 0x1c, 0x1b, + 0xbb, 0xdc, 0x46, 0x91, 0xcb, 0x89, 0x9e, 0x2c, 0x11, 0x0a, 0xdd, 0x23, 0x3e, 0xf5, 0x98, 0xff, 0x63, 0x49, 0xa8, 0xe3, 0xbf, 0x31, 0xf6, 0xd9, 0xea, 0x58, 0xcf, 0xb8, 0x78, 0xfb, 0x98, 0x11, + 0x48, 0xed, 0x75, 0xad, 0x7e, 0x7a, 0xc6, 0x9c, 0xb8, 0x3a, 0x4b, 0xf7, 0xcc, 0xc8, 0xaa, 0xa8, 0xfb, 0x13, 0x41, 0x82, 0x5c, 0x3d, 0x50, 0x39, 0xfc, 0xbd, 0x8f, 0x4f, 0xf9, 0xf4, 0xad, 0x05, + 0x92, 0x11, 0x9e, 0x0f, 0xf2, 0xfc, 0x65, 0x16, 0x86, 0x96, 0x81, 0x67, 0xda, 0x6f, 0xd7, 0x75, 0x80, 0x3b, 0x89, 0xbe, 0xa5, 0x74, 0x0e, 0x11, 0x41, 0x2d, 0x2e, 0xf5, 0xb4, 0x17, 0xec, 0x12, + 0x82, 0xd2, 0xe9, 0xde, 0x65, 0xc0, 0x79, 0xef, 0x8c, 0xb2, 0xb6, 0x81, 0x36, 0xd6, 0x6e, 0xe0, 0x8d, 0x66, 0x02, 0x24, 0x36, 0x17, 0x1b, 0x92, 0x82, 0xdb, 0x74, 0x75, 0x5c, 0x9c, 0x34, 0x15, + 0x1c, 0xa1, 0x68, 0x8b, 0xd0, 0xd6, 0x1a, 0x7e, 0xfc, 0x37, 0xab, 0x91, 0xd4, 0xb7, 0x68, 0x3d, 0xd8, 0xd5, 0x10, 0x0a, 0x4a, 0x66, 0x89, 0x63, 0x79, 0x4d, 0x9a, 0x0c, 0x4d, 0x26, 0xc2, 0x16, + 0x7d, 0x1d, 0x1a, 0x7d, 0xbc, 0xe9, 0x22, 0xf2, 0x4c, 0x56, 0x3c, 0x52, 0x24, 0xca, 0x83, 0x21, 0x6b, 0xac, 0x57, 0x2f, 0x0b, 0x66, 0xc6, 0xf7, 0x93, 0xba, 0xb9, 0x28, 0x60, 0x4f, 0x03, 0x0e, + 0x30, 0x5d, 0xc3, 0x16, 0x67, 0xcd, 0xc4, 0x60, 0xf5, 0xff, 0x3e, 0xf4, 0x2b, 0x0d, 0x63, 0x76, 0x0c, 0xac, 0xdd, 0x90, 0xed, 0x0c, 0x38, 0x3b, 0x1f, 0x0a, 0x9d, 0xcd, 0x5a, 0x06, 0xac, 0x0a, + 0x64, 0x0c, 0xb8, 0x55, 0x2d, 0x29, 0x5a, 0x87, 0x92, 0xeb, 0x95, 0x8b, 0x06, 0xfd, 0x3e, 0xd8, 0xe5, 0xbd, 0x38, 0xaf, 0x75, 0xa9, 0x0e, 0x70, 0xed, 0x61, 0xf6, 0x50, 0xda, 0x6c, 0xe6, 0x0e, + 0xa6, 0x4e, 0xa1, 0x4c, 0x07, 0x5d, 0x32, 0x06, 0x52, 0x7b, 0x0a, 0xc9, 0xc5, 0xfa, 0xaf, 0x2e, 0xfd, 0xe1, 0x8c, 0x4a, 0x29, 0xe5, 0xe8, 0xe9, 0x83, 0xa5, 0x6c, 0x3b, 0x06, 0xc6, 0x47, 0x10, + 0xb7, 0x7b, 0x71, 0xc6, 0xb9, 0x61, 0xd1, 0xc3, 0xf0, 0x91, 0x48, 0x8c, 0xc5, 0xaa, 0x04, 0x2b, 0xf8, 0xef, 0x4b, 0x93, 0xf2, 0xc2, 0x31, 0x5a, 0x19, 0x94, 0xe4, 0x50, 0x8d, 0x28, 0xae, 0x0f, + 0x2c, 0xd1, 0x57, 0xb1, 0x1a, 0x8c, 0x62, 0xcb, 0x73, 0xdd, 0x3d, 0x8c, 0xbb, 0xe5, 0x0a, 0x51, 0xb1, 0x01, 0xaa, 0xc9, 0x8c, 0xe7, 0xa5, 0x67, 0x14, 0xa4, 0xc8, 0x84, 0x28, 0x00, 0xf9, 0x12, + 0xe1, 0x80, 0x43, 0x79, 0x00, 0x3a, 0xf4, 0x1f, 0xad, 0x18, 0xe6, 0x97, 0x5b, 0xbe, 0xc6, 0x71, 0xde, 0xc2, 0x92, 0xe6, 0x36, 0x62, 0xfa, 0x98, 0x15, 0xe0, 0x1d, 0x26, 0x99, 0x81, 0x23, 0x15, + 0x96, 0x57, 0x3c, 0x7f, 0xdc, 0xa6, 0xf0, 0xbd, 0x22, 0x1a, 0x7b, 0xb4, 0x9e, 0xee, 0x52, 0x10, 0xfc, 0x46, 0x43, 0x12, 0x78, 0xed, 0x95, 0x3b, 0x86, 0x96, 0x45, 0xff, 0x65, 0x1f, 0x48, 0x0c, + 0x5e, 0x8f, 0x82, 0x1e, 0x1c, 0x4a, 0x46, 0xd7, 0x68, 0x42, 0x45, 0xa8, 0x87, 0x22, 0x9e, 0x22, 0xe7, 0x36, 0xbf, 0xe8, 0x19, 0x36, 0x29, 0x01, 0xbc, 0xc5, 0x42, 0x66, 0x60, 0x5a, 0x99, 0x1c, + 0x79, 0x26, 0x13, 0xf5, 0x7b, 0xaf, 0xa4, 0xd3, 0x5f, 0xfb, 0x64, 0x96, 0x07, 0x8f, 0xfa, 0x9e, 0x7b, 0xd1, 0xef, 0xe5, 0xcb, 0x85, 0x0c, 0x67, 0xf8, 0x29, 0x8b, 0xf3, 0x23, 0x54, 0xd9, 0x0a, + 0x22, 0xb7, 0xf7, 0xc3, 0x68, 0x45, 0xca, 0x40, 0x46, 0x7b, 0xf2, 0xa8, 0x54, 0xa9, 0xb8, 0x35, 0xfd, 0x28, 0x31, 0x7c, 0x9e, 0xba, 0xae, 0x9c, 0x5c, 0xa7, 0xaf, 0xfa, 0xac, 0xff, 0x82, 0x23, + 0xa6, 0x57, 0x6b, 0x89, 0xc3, 0x06, 0xcf, 0x0f, 0xee, 0x0e, 0xee, 0xce, 0x38, 0x1c, 0xe3, 0x19, 0x0d, 0x32, 0x5c, 0x9f, 0x5b, 0x6f, 0xcb, 0x82, 0x3d, 0x77, 0x6b, 0x64, 0x1a, 0x12, 0xfa, 0x1e, + 0x03, 0x9f, 0xb9, 0xdf, 0x29, 0x28, 0xaf, 0xe4, 0x38, 0xfe, 0x2e, 0x3e, 0x67, 0xd7, 0x42, 0x42, 0x54, 0x96, 0x4f, 0xfa, 0x95, 0x96, 0x1d, 0xb3, 0x7d, 0x55, 0x06, 0x56, 0x66, 0x65, 0x25, 0x17, + 0x30, 0xf1, 0x10, 0xa1, 0xfc, 0xb8, 0x25, 0x4e, 0xef, 0x2a, 0x33, 0x12, 0x04, 0x75, 0x63, 0x13, 0x4a, 0xb1, 0x0d, 0x4b, 0x45, 0x28, 0xa3, 0x22, 0xe7, 0xaa, 0x51, 0x87, 0xd6, 0x70, 0xd6, 0x0d, + 0x01, 0x22, 0x21, 0xd2, 0x2f, 0x65, 0xb9, 0xec, 0x57, 0x21, 0xc6, 0xf0, 0xb9, 0xac, 0x31, 0x4b, 0x39, 0xb1, 0xe4, 0x76, 0x17, 0x2a, 0x76, 0xeb, 0xec, 0xf3, 0x2f, 0x30, 0xea, 0x83, 0x50, 0x22, + 0x65, 0x06, 0x6e, 0x68, 0xcc, 0xbd, 0x5f, 0x08, 0x04, 0x07, 0x3d, 0x28, 0x8c, 0x6e, 0xf0, 0xa7, 0x33, 0x53, 0xd9, 0xda, 0xe5, 0xa4, 0xc9, 0x22, 0xc3, 0x14, 0x87, 0xac, 0x96, 0xb6, 0x7b, 0x2a, + 0x9f, 0xf9, 0x91, 0xdc, 0x1a, 0xb4, 0x34, 0x8b, 0xc4, 0xaf, 0xa1, 0x6b, 0x38, 0xcf, 0x70, 0x5a, 0x79, 0x7b, 0xa2, 0xfa, 0x22, 0x14, 0x70, 0x34, 0x35, 0x63, 0x04, 0x1a, 0x73, 0x9e, 0xa5, 0x07, + 0x50, 0xcf, 0x97, 0xdb, 0x70, 0x6e, 0x42, 0xab, 0x76, 0x28, 0x6c, 0x5c, 0xbe, 0xe6, 0x5c, 0xb6, 0x6b, 0x4f, 0x9e, 0xea, 0xdc, 0x86, 0x71, 0x83, 0x73, 0xab, 0x52, 0x28, 0x0b, 0x1c, 0xbe, 0x16, + 0xa1, 0xdd, 0x22, 0xb4, 0xff, 0x53, 0x0e, 0x11, 0x22, 0x6e, 0x0e, 0x9f, 0x8f, 0x8d, 0xa1, 0x1c, 0x15, 0x29, 0xdc, 0xee, 0x9e, 0xa0, 0x4b, 0x81, 0xc3, 0x93, 0x42, 0xed, 0x49, 0xf1, 0xc3, 0x25, + 0x95, 0x71, 0x0a, 0xb0, 0x05, 0x24, 0xbc, 0x8e, 0x82, 0x78, 0x77, 0x60, 0x05, 0x66, 0x18, 0x9a, 0x3a, 0x3c, 0x44, 0x09, 0xf9, 0x12, 0x24, 0xcd, 0xcf, 0xab, 0xe4, 0x3f, 0x79, 0xcb, 0x90, 0x25, + 0x5e, 0x71, 0x9b, 0xe9, 0x31, 0x71, 0xe0, 0x53, 0xef, 0x70, 0xe0, 0x95, 0xb6, 0x6f, 0xe0, 0x8a, 0x1c, 0x67, 0xed, 0x6e, 0x68, 0x0a, 0x78, 0x8a, 0x90, 0x96, 0x82, 0x26, 0x07, 0x2d, 0x6b, 0x29, + 0x6e, 0x7d, 0x76, 0xe7, 0xcb, 0x94, 0x99, 0xec, 0xa1, 0x81, 0x01, 0xd3, 0xeb, 0x26, 0x47, 0x5b, 0x91, 0xf7, 0x45, 0x70, 0xed, 0x1f, 0xfb, 0xa5, 0x86, 0xcd, 0xe3, 0x08, 0x80, 0x2e, 0x01, 0x01, + 0xa0, 0xd4, 0x5d, 0xee, 0xa4, 0x61, 0xa0, 0x0b, 0x3a, 0x31, 0xb1, 0x2a, 0x01, 0x55, 0x3d, 0x34, 0xf8, 0xd5, 0x95, 0xde, 0x39, 0x10, 0x37, 0x8a, 0x8a, 0x2d, 0xe6, 0x74, 0x49, 0xae, 0xe5, 0x25, + 0xa5, 0x41, 0x1f, 0xfa, 0x30, 0xe2, 0xa4, 0xd5, 0xc0, 0xe4, 0x70, 0x39, 0x03, 0xf2, 0xc8, 0xd0, 0x1a, 0x0c, 0xdc, 0xfb, 0x3a, 0x24, 0xc7, 0x2f, 0xc4, 0x1c, 0x8b, 0xfa, 0x3f, 0x12, 0x08, 0x0f, + 0x76, 0x29, 0x8e, 0xf8, 0xc4, 0xb8, 0x35, 0x92, 0xd9, 0x8d, 0x70, 0x61, 0x3d, 0x61, 0xfc, 0xdd, 0xa4, 0xb8, 0xd2, 0x28, 0xa1, 0xff, 0x80, 0x65, 0x6a, 0xb6, 0xed, 0x48, 0x32, 0x7c, 0x74, 0x2c, + 0x89, 0x3a, 0x57, 0x3f, 0xd5, 0x1e, 0x92, 0x24, 0x7f, 0xa5, 0x73, 0x7c, 0x35, 0x9a, 0x70, 0x31, 0x07, 0x9a, 0x1e, 0x7b, 0x5b, 0x7b, 0xa5, 0x17, 0x39, 0x76, 0x7b, 0x3d, 0x1f, 0xa9, 0xb1, 0x12, + 0x4e, 0xfd, 0xb7, 0x74, 0xc2, 0x94, 0x28, 0xdc, 0xad, 0xf2, 0x49, 0xf7, 0x6a, 0xbc, 0x1c, 0x20, 0x9b, 0x83, 0xcf, 0xac, 0x48, 0x90, 0xa8, 0x00, 0x39, 0xb2, 0x15, 0x22, 0x7f, 0xd1, 0x4e, 0x24, + 0xb3, 0x2d, 0x40, 0xf9, 0x19, 0x39, 0x80, 0xe4, 0xdc, 0x3b, 0xa7, 0x5e, 0x6f, 0x0e, 0x48, 0x38, 0x1c, 0xfe, 0x85, 0x8c, 0x4b, 0xce, 0xbd, 0xc9, 0xe8, 0x1d, 0xf3, 0xdd, 0xca, 0x13, 0xf8, 0x1d, + 0x38, 0xe6, 0xa0, 0x45, 0xdb, 0xe1, 0x02, 0x98, 0x2a, 0xef, 0x6d, 0xf5, 0x6c, 0x72, 0x31, 0xe7, 0xcb, 0xe0, 0x7d, 0xc4, 0xf9, 0x55, 0xec, 0x1d, 0x63, 0xf5, 0xc5, 0xaa, 0xba, 0xe3, 0xcd, 0x1c, + 0xf7, 0xc2, 0xf6, 0x31, 0x02, 0x83, 0xe7, 0xf1, 0x6a, 0x2c, 0x74, 0x30, 0xab, 0xd4, 0xb3, 0x26, 0x13, 0xd0, 0x1b, 0xf3, 0x95, 0x25, 0xcb, 0xce, 0x6f, 0x93, 0xd2, 0xc0, 0xa6, 0xca, 0x30, 0x2c, + 0x5b, 0xd6, 0x74, 0x0f, 0x5d, 0x7e, 0xc1, 0x95, 0xfc, 0x9b, 0xe6, 0x4e, 0x61, 0x5e, 0x78, 0x92, 0x9f, 0x73, 0x79, 0xf2, 0x28, 0x00, 0x00, 0x14, 0xb6, 0x10, 0x86, 0x1e, 0xd7, 0x39, 0x29, 0x0b, + 0xba, 0x28, 0x9d, 0xb1, 0x50, 0x93, 0xe6, 0xa5, 0x70, 0xa3, 0xbd, 0x43, 0x38, 0xe1, 0xd8, 0x3e, 0xc3, 0x93, 0x0b, 0x57, 0x3b, 0xb3, 0x0b, 0xee, 0xeb, 0x70, 0xba, 0x85, 0xc1, 0x47, 0xd9, 0x0d, + 0xfc, 0xca, 0x8a, 0xda, 0x2c, 0x9f, 0xc0, 0xf3, 0x24, 0x6b, 0x95, 0x01, 0x40, 0x11, 0x91, 0x37, 0x6d, 0x76, 0x8a, 0xa4, 0x99, 0x01, 0x5d, 0xd5, 0x71, 0x0b, 0xcc, 0x12, 0x7f, 0x8f, 0x79, 0x0f, + 0x92, 0x8d, 0x58, 0xb4, 0x39, 0x41, 0xfb, 0x5b, 0x34, 0x10, 0xde, 0x8c, 0xc1, 0x40, 0x3e, 0x25, 0x39, 0x7e, 0x46, 0xf7, 0xe0, 0x90, 0x23, 0xda, 0x57, 0xa4, 0x69, 0xb3, 0x4a, 0x4d, 0x07, 0x09, + 0x8f, 0xda, 0x57, 0x0e, 0x98, 0x53, 0xe1, 0x46, 0x73, 0x31, 0x53, 0xed, 0x77, 0x3d, 0x07, 0xaa, 0xd0, 0x80, 0x64, 0x4d, 0x6d, 0xab, 0x62, 0xc9, 0xe5, 0x6d, 0x0a, 0xbb, 0xd1, 0x94, 0xaa, 0x11, + 0x5e, 0xda, 0xa6, 0x07, 0xc2, 0x90, 0x53, 0xef, 0x17, 0x1a, 0x63, 0x47, 0x2d, 0x73, 0xb4, 0xb0, 0x87, 0xe5, 0x99, 0x1b, 0x2b, 0x07, 0xa0, 0x3c, 0xe8, 0x38, 0xbe, 0x78, 0x8d, 0xff, 0x32, 0x09, + 0xc8, 0x34, 0x35, 0x59, 0x84, 0xa5, 0x75, 0x3f, 0xac, 0x3e, 0x0c, 0x43, 0x9a, 0xc0, 0x9c, 0xab, 0xb6, 0x2e, 0x0f, 0x79, 0x0b, 0xbc, 0xc1, 0x41, 0xf8, 0x1b, 0x36, 0xf5, 0x5f, 0xb3, 0x17, 0x29, + 0x12, 0xd5, 0x36, 0xd5, 0x56, 0x3b, 0x61, 0x27, 0xb6, 0xf2, 0x46, 0x6c, 0xb7, 0xa1, 0x7d, 0x82, 0xb3, 0x5b, 0xf5, 0x13, 0x72, 0x65, 0xb0, 0xda, 0x1b, 0xc5, 0x0a, 0xf0, 0x8d, 0x15, 0x06, 0x17, + 0xbc, 0x34, 0x8d, 0xbf, 0x72, 0x47, 0xed, 0xcc, 0xbc, 0x7d, 0x65, 0x23, 0x49, 0x20, 0xf5, 0xf9, 0x39, 0x50, 0x8f, 0xbc, 0xad, 0x3e, 0x9e, 0x84, 0x1a, 0xda, 0x0c, 0xa2, 0xd3, 0x22, 0x82, 0x2f, + 0x56, 0xe6, 0xab, 0xfe, 0x93, 0x86, 0x1e, 0x4f, 0x54, 0x7c, 0x04, 0x02, 0xa4, 0xfe, 0x3a, 0xb4, 0xb7, 0x9b, 0x4e, 0xc1, 0xf1, 0xb3, 0xf2, 0x8b, 0x16, 0x6a, 0xad, 0x8f, 0x65, 0x07, 0x4e, 0x08, + 0xf3, 0xf7, 0x38, 0x5e, 0x25, 0xc6, 0xfd, 0xa5, 0xda, 0x20, 0x74, 0x53, 0x92, 0x5d, 0xa2, 0x5d, 0xfb, 0x3b, 0xd7, 0x9c, 0x71, 0xa5, 0x5a, 0x7b, 0x0a, 0xcb, 0x86, 0x53, 0x53, 0x92, 0x81, 0x2f, + 0x0d, 0x5b, 0x08, 0x3b, 0x01, 0x3f, 0xdb, 0x7e, 0x3a, 0xc9, 0x3e, 0xb3, 0x9e, 0x57, 0x3e, 0x6c, 0x0d, 0x10, 0x21, 0x63, 0x94, 0xd5, 0x1a, 0x7d, 0x10, 0xd3, 0xeb, 0x67, 0x8e, 0x89, 0x95, 0x18, + 0x04, 0x9d, 0x13, 0x66, 0x73, 0xb0, 0xff, 0x67, 0x96, 0xf4, 0x9b, 0x52, 0x21, 0xc2, 0xcb, 0x0c, 0x4b, 0xd7, 0x80, 0x18, 0xa8, 0x37, 0x9a, 0xd1, 0x30, 0xf8, 0x52, 0x91, 0x97, 0xb9, 0x35, 0x16, + 0x66, 0xfd, 0x7d, 0x1e, 0x97, 0x22, 0xeb, 0xa2, 0xf8, 0xfc, 0x59, 0x23, 0x53, 0x7e, 0x0a, 0xba, 0x3b, 0x40, 0xd9, 0x9f, 0xc6, 0x4f, 0xa4, 0x16, 0x4d, 0x7e, 0x4c, 0xc1, 0x4a, 0x62, 0x6f, 0x1f, + 0x7b, 0x77, 0x89, 0x7c, 0x60, 0xc9, 0xe2, 0xd0, 0x73, 0x7a, 0x0b, 0x57, 0xcc, 0x01, 0x6e, 0xfd, 0x5c, 0x3e, 0x2d, 0x8d, 0xb1, 0x0c, 0xb2, 0x28, 0xd4, 0xa0, 0xeb, 0xb6, 0x29, 0x26, 0x05, 0x14, + 0x68, 0xf3, 0xca, 0xdd, 0x9a, 0x67, 0x3c, 0x53, 0xb5, 0xa9, 0x80, 0xe5, 0x6d, 0xf6, 0x10, 0x9c, 0x86, 0x21, 0x5d, 0x58, 0x42, 0xc3, 0x96, 0xd5, 0xd4, 0xd6, 0xb6, 0x72, 0x55, 0xa3, 0xdb, 0x1c, + 0xbb, 0x5f, 0x89, 0x8a, 0x5d, 0x71, 0x70, 0x13, 0xce, 0xd4, 0xf5, 0x39, 0x5c, 0xe2, 0x0f, 0x20, 0xa6, 0x55, 0xa0, 0x16, 0xdd, 0x2e, 0x51, 0xe3, 0xab, 0xcb, 0x5d, 0x45, 0x66, 0xee, 0xf3, 0x0b, + 0x7d, 0xa0, 0x4a, 0x24, 0xf6, 0xd5, 0xbd, 0xc7, 0xb4, 0xa4, 0x7c, 0x65, 0x06, 0x69, 0x47, 0xf5, 0xd4, 0x4d, 0x0a, 0x35, 0x71, 0x18, 0xe4, 0xa4, 0x76, 0x19, 0xcc, 0xd8, 0xc4, 0x86, 0xfc, 0x27, + 0xf0, 0x73, 0xd9, 0xa2, 0x63, 0xd7, 0xbd, 0x83, 0x2a, 0xcb, 0x70, 0x3d, 0xb8, 0xa0, 0x16, 0xee, 0x22, 0xe0, 0xef, 0x12, 0x14, 0xd6, 0xf2, 0x89, 0x3b, 0xfd, 0x9f, 0xdf, 0xf1, 0x64, 0xe3, 0x18, + 0x6a, 0x59, 0x8a, 0x02, 0x3c, 0x70, 0x18, 0x01, 0xe7, 0xd1, 0x27, 0xe1, 0x8a, 0x71, 0xb3, 0x73, 0x05, 0x34, 0x4d, 0xd1, 0x80, 0x1f, 0xc8, 0x8a, 0xe8, 0xb7, 0x27, 0x07, 0x97, 0xfb, 0x82, 0x09, + 0x2a, 0x89, 0xf0, 0x83, 0x4c, 0x16, 0x8e, 0x9c, 0x32, 0x8b, 0xef, 0x82, 0x5f, 0xb4, 0x14, 0xb8, 0xab, 0x02, 0xe5, 0x2a, 0x53, 0x89, 0x6d, 0x2a, 0xba, 0x1f, 0xac, 0x46, 0xaa, 0xee, 0xa4, 0x2e, + 0x37, 0x47, 0xa0, 0x51, 0x14, 0x5f, 0xb4, 0xf7, 0x3e, 0x98, 0x48, 0x44, 0x71, 0xde, 0xbf, 0x4a, 0x15, 0x17, 0x99, 0x60, 0x91, 0xf0, 0x8d, 0xbe, 0x61, 0xba, 0x46, 0x80, 0xe5, 0x0d, 0x59, 0x20, + 0x05, 0x4b, 0x7d, 0xc7, 0xd2, 0x8f, 0x2d, 0x0e, 0x3e, 0xfa, 0xf1, 0x86, 0x8e, 0xf2, 0xe6, 0x98, 0x4e, 0x20, 0x8e, 0xde, 0xc2, 0x93, 0x1c, 0x7f, 0x7c, 0x7d, 0xbd, 0xdf, 0x17, 0xcd, 0x39, 0x1b, + 0x03, 0xe0, 0xef, 0x39, 0x48, 0xb4, 0xa7, 0xbb, 0x3e, 0x46, 0x0c, 0xd2, 0x4a, 0x15, 0x2e, 0xe7, 0x32, 0xf6, 0xba, 0x2e, 0x69, 0xcb, 0x4b, 0xdc, 0x95, 0x32, 0x92, 0x4c, 0xfb, 0x10, 0xd7, 0x2e, + 0xe2, 0xaf, 0x90, 0x87, 0x87, 0x0f, 0x56, 0x85, 0x29, 0xc7, 0x90, 0x1d, 0xcd, 0x55, 0x80, 0x52, 0x48, 0x5c, 0xcb, 0x37, 0x46, 0x99, 0x79, 0x37, 0x45, 0x1f, 0x07, 0x77, 0x51, 0x56, 0xbc, 0x02, + 0xbf, 0x28, 0xe7, 0xd8, 0x21, 0xa2, 0x8c, 0x22, 0x0c, 0x24, 0x1f, 0x92, 0x15, 0x53, 0xca, 0xf6, 0x9d, 0x7a, 0xbb, 0xfe, 0xb4, 0x3f, 0x02, 0x12, 0x84, 0x1b, 0x33, 0xda, 0xca, 0x14, 0x79, 0x24, + 0x18, 0x5f, 0x65, 0xb1, 0x86, 0x63, 0x25, 0x25, 0x32, 0x25, 0x4d, 0xb4, 0xd7, 0xd4, 0x0c, 0x5d, 0x20, 0xb1, 0x68, 0x75, 0xba, 0x05, 0xcd, 0x98, 0xa6, 0x74, 0x4f, 0xf5, 0xda, 0x7a, 0x91, 0x1d, + 0xdc, 0x2a, 0x5c, 0xab, 0xa6, 0x7d, 0xd9, 0x9b, 0x92, 0x66, 0x38, 0xf6, 0x84, 0x58, 0x0c, 0xc4, 0x12, 0xb8, 0x94, 0x74, 0xec, 0x4f, 0xb0, 0xa8, 0xb1, 0x3a, 0x51, 0x26, 0x2e, 0x0b, 0xf2, 0x21, + 0x59, 0x42, 0x2f, 0x2d, 0x79, 0x71, 0x81, 0x4e, 0x0f, 0x20, 0xa6, 0x8f, 0x43, 0xe1, 0x62, 0xe3, 0xea, 0xe5, 0x18, 0x5f, 0x89, 0x39, 0xaa, 0xf0, 0xe7, 0x01, 0xc4, 0x9f, 0x43, 0x2f, 0x6f, 0x12, + 0x0d, 0x58, 0x92, 0x63, 0x72, 0xcd, 0x48, 0x0c, 0x3d, 0xe4, 0xa5, 0x30, 0xf9, 0x0b, 0x15, 0x1a, 0xd4, 0xba, 0x48, 0x08, 0x91, 0x8b, 0xc0, 0x13, 0x83, 0x05, 0xa5, 0x11, 0x68, 0x67, 0xfd, 0x24, + 0xe6, 0x63, 0x93, 0x9d, 0x7f, 0x76, 0x5e, 0x02, 0x60, 0x64, 0x4a, 0x5c, 0xbc, 0xe1, 0x8a, 0xd9, 0x19, 0x5a, 0x53, 0x84, 0x8b, 0xa1, 0x52, 0x6f, 0x14, 0xc3, 0x04, 0x82, 0x19, 0xc0, 0x26, 0x2a, + 0x1c, 0xbb, 0xe1, 0x16, 0xc7, 0xb4, 0x58, 0x25, 0x81, 0x21, 0x56, 0xab, 0xd6, 0x37, 0xe5, 0xd0, 0x2c, 0xa2, 0xce, 0x90, 0xdb, 0x3b, 0x9a, 0xfe, 0xbb, 0x9a, 0x9e, 0xca, 0xfe, 0x36, 0x8c, 0x1e, + 0xae, 0xc9, 0xbd, 0xfa, 0x8a, 0xea, 0x97, 0x52, 0xea, 0x20, 0x50, 0x1a, 0x05, 0x8f, 0x71, 0x33, 0x62, 0xe7, 0xd8, 0xe4, 0x90, 0x1f, 0xa2, 0x62, 0xf0, 0xc9, 0x23, 0xbe, 0x95, 0x2d, 0x4a, 0x1f, + 0x42, 0xc3, 0x6c, 0xc8, 0x70, 0x5a, 0xa7, 0x1b, 0xab, 0xf4, 0x1c, 0x24, 0x4e, 0x5c, 0x15, 0x8e, 0x56, 0x02, 0xf7, 0xa1, 0x36, 0xec, 0x0a, 0xe3, 0xc0, 0x1a, 0xed, 0xf1, 0x01, 0x62, 0x41, 0x16, + 0x00, 0x06, 0xaa, 0x76, 0x28, 0xb5, 0x55, 0xce, 0x32, 0x39, 0x15, 0x64, 0x4e, 0xc4, 0x74, 0x3c, 0xd7, 0xa0, 0xac, 0xae, 0xc5, 0x55, 0x6b, 0xb0, 0x57, 0x89, 0x44, 0x85, 0x52, 0xd9, 0x06, 0x19, + 0xcb, 0x22, 0x54, 0x64, 0x87, 0xe4, 0x7a, 0x29, 0xe1, 0x01, 0xfc, 0xf7, 0xda, 0x1d, 0xb2, 0x5d, 0xe0, 0x91, 0x49, 0x6b, 0x6a, 0x87, 0xf8, 0x2e, 0xa0, 0xa0, 0x88, 0x4b, 0x60, 0xb7, 0x4c, 0x29, + 0xf9, 0x4d, 0x30, 0x53, 0x5b, 0x5d, 0xa9, 0x85, 0xd5, 0xb4, 0xf3, 0xd4, 0xce, 0xcc, 0xd5, 0xf5, 0xae, 0xff, 0x9f, 0x6f, 0x5f, 0xe7, 0x98, 0x8e, 0x62, 0xe6, 0xa3, 0xa4, 0xaf, 0x26, 0x0b, 0x2b, + 0xbf, 0x5a, 0x32, 0x59, 0xa1, 0xe6, 0xac, 0x55, 0x92, 0x6e, 0xcd, 0x02, 0xbc, 0x7c, 0x2e, 0xb3, 0x89, 0xb2, 0x0d, 0xdf, 0xe9, 0xed, 0x32, 0xea, 0x47, 0x78, 0xb4, 0x76, 0xa0, 0x0c, 0xc3, 0x1b, + 0x77, 0xa3, 0xee, 0xdf, 0xc0, 0x43, 0xe1, 0x7b, 0xa3, 0x2b, 0xf0, 0xfe, 0xe3, 0xd0, 0x10, 0x60, 0xdd, 0xc1, 0x94, 0xf5, 0x58, 0x41, 0xe6, 0x5b, 0x5e, 0xa4, 0x7a, 0xad, 0x75, 0xa8, 0x78, 0x1b, + }; + } + +} +#endif diff --git a/icicle/include/poseidon2/constants/poseidon2_rust_params.sage b/icicle/include/poseidon2/constants/poseidon2_rust_params.sage new file mode 100644 index 00000000..e14ae010 --- /dev/null +++ b/icicle/include/poseidon2/constants/poseidon2_rust_params.sage @@ -0,0 +1,705 @@ +# Remark: This script contains functionality for GF(2^n), but currently works only over GF(p)! A few small adaptations are needed for GF(2^n). +from sage.rings.polynomial.polynomial_gf2x import GF2X_BuildIrred_list +from math import * +import itertools + +CURVE_NAME = "bn254" + +########################################################################### +# p = 18446744069414584321 # GoldiLocks +# p = 2013265921 # BabyBear +# p = 52435875175126190479447740508185965837690552500527637822603658699938581184513 # BLS12-381 +p = 21888242871839275222246405745257275088548364400416034343698204186575808495617 # BN254/BN256 +# p = 28948022309329048855892746252171976963363056481941560715954676764349967630337 # Pasta (Pallas) +# p = 28948022309329048855892746252171976963363056481941647379679742748393362948097 # Pasta (Vesta) + +n = len(p.bits()) # bit +# t = 12 # GoldiLocks (t = 12 for sponge, t = 8 for compression) +# t = 16 # BabyBear (t = 24 for sponge, t = 16 for compression) +# t = 3 # BN254/BN256, BLS12-381, Pallas, Vesta (t = 3 for sponge, t = 2 for compression) + +TS = [2, 3, 4, 8, 12, 16, 20, 24] + +FIELD = 1 +SBOX = 0 +FIELD_SIZE = n + +def get_alpha(p): + for alpha in range(3, p): + if gcd(alpha, p-1) == 1: + break + return alpha + +alpha = get_alpha(p) + +def get_sbox_cost(R_F, R_P, N, t): + return int(t * R_F + R_P) + +def get_size_cost(R_F, R_P, N, t): + n = ceil(float(N) / t) + return int((N * R_F) + (n * R_P)) + +def poseidon_calc_final_numbers_fixed(p, t, alpha, M, security_margin): + # [Min. S-boxes] Find best possible for t and N + n = ceil(log(p, 2)) + N = int(n * t) + cost_function = get_sbox_cost + ret_list = [] + (R_F, R_P) = find_FD_round_numbers(p, t, alpha, M, cost_function, security_margin) + min_sbox_cost = cost_function(R_F, R_P, N, t) + ret_list.append(R_F) + ret_list.append(R_P) + ret_list.append(min_sbox_cost) + + # [Min. Size] Find best possible for t and N + # Minimum number of S-boxes for fixed n results in minimum size also (round numbers are the same)! + min_size_cost = get_size_cost(R_F, R_P, N, t) + ret_list.append(min_size_cost) + + return ret_list # [R_F, R_P, min_sbox_cost, min_size_cost] + +def find_FD_round_numbers(p, t, alpha, M, cost_function, security_margin): + n = ceil(log(p, 2)) + N = int(n * t) + + sat_inequiv = sat_inequiv_alpha + + R_P = 0 + R_F = 0 + min_cost = float("inf") + max_cost_rf = 0 + # Brute-force approach + for R_P_t in range(1, 500): + for R_F_t in range(4, 100): + if R_F_t % 2 == 0: + if (sat_inequiv(p, t, R_F_t, R_P_t, alpha, M) == True): + if security_margin == True: + R_F_t += 2 + R_P_t = int(ceil(float(R_P_t) * 1.075)) + cost = cost_function(R_F_t, R_P_t, N, t) + if (cost < min_cost) or ((cost == min_cost) and (R_F_t < max_cost_rf)): + R_P = ceil(R_P_t) + R_F = ceil(R_F_t) + min_cost = cost + max_cost_rf = R_F + return (int(R_F), int(R_P)) + +def sat_inequiv_alpha(p, t, R_F, R_P, alpha, M): + N = int(FIELD_SIZE * NUM_CELLS) + + if alpha > 0: + R_F_1 = 6 if M <= ((floor(log(p, 2) - ((alpha-1)/2.0))) * (t + 1)) else 10 # Statistical + R_F_2 = 1 + ceil(log(2, alpha) * min(M, FIELD_SIZE)) + ceil(log(t, alpha)) - R_P # Interpolation + R_F_3 = (log(2, alpha) * min(M, log(p, 2))) - R_P # Groebner 1 + R_F_4 = t - 1 + log(2, alpha) * min(M / float(t + 1), log(p, 2) / float(2)) - R_P # Groebner 2 + R_F_5 = (t - 2 + (M / float(2 * log(alpha, 2))) - R_P) / float(t - 1) # Groebner 3 + R_F_max = max(ceil(R_F_1), ceil(R_F_2), ceil(R_F_3), ceil(R_F_4), ceil(R_F_5)) + + # Addition due to https://eprint.iacr.org/2023/537.pdf + r_temp = floor(t / 3.0) + over = (R_F - 1) * t + R_P + r_temp + r_temp * (R_F / 2.0) + R_P + alpha + under = r_temp * (R_F / 2.0) + R_P + alpha + binom_log = log(binomial(over, under), 2) + if binom_log == inf: + binom_log = M + 1 + cost_gb4 = ceil(2 * binom_log) # Paper uses 2.3727, we are more conservative here + + return ((R_F >= R_F_max) and (cost_gb4 >= M)) + else: + print("Invalid value for alpha!") + exit(1) + +def grain_sr_generator(): + bit_sequence = INIT_SEQUENCE + for _ in range(0, 160): + new_bit = bit_sequence[62] ^^ bit_sequence[51] ^^ bit_sequence[38] ^^ bit_sequence[23] ^^ bit_sequence[13] ^^ bit_sequence[0] + bit_sequence.pop(0) + bit_sequence.append(new_bit) + + while True: + new_bit = bit_sequence[62] ^^ bit_sequence[51] ^^ bit_sequence[38] ^^ bit_sequence[23] ^^ bit_sequence[13] ^^ bit_sequence[0] + bit_sequence.pop(0) + bit_sequence.append(new_bit) + while new_bit == 0: + new_bit = bit_sequence[62] ^^ bit_sequence[51] ^^ bit_sequence[38] ^^ bit_sequence[23] ^^ bit_sequence[13] ^^ bit_sequence[0] + bit_sequence.pop(0) + bit_sequence.append(new_bit) + new_bit = bit_sequence[62] ^^ bit_sequence[51] ^^ bit_sequence[38] ^^ bit_sequence[23] ^^ bit_sequence[13] ^^ bit_sequence[0] + bit_sequence.pop(0) + bit_sequence.append(new_bit) + new_bit = bit_sequence[62] ^^ bit_sequence[51] ^^ bit_sequence[38] ^^ bit_sequence[23] ^^ bit_sequence[13] ^^ bit_sequence[0] + bit_sequence.pop(0) + bit_sequence.append(new_bit) + yield new_bit + +def grain_random_bits(num_bits): + random_bits = [next(grain_gen) for i in range(0, num_bits)] + # random_bits.reverse() ## Remove comment to start from least significant bit + random_int = int("".join(str(i) for i in random_bits), 2) + return random_int + +def init_generator(field, sbox, n, t, R_F, R_P): + # Generate initial sequence based on parameters + bit_list_field = [_ for _ in (bin(FIELD)[2:].zfill(2))] + bit_list_sbox = [_ for _ in (bin(SBOX)[2:].zfill(4))] + bit_list_n = [_ for _ in (bin(FIELD_SIZE)[2:].zfill(12))] + bit_list_t = [_ for _ in (bin(NUM_CELLS)[2:].zfill(12))] + bit_list_R_F = [_ for _ in (bin(R_F)[2:].zfill(10))] + bit_list_R_P = [_ for _ in (bin(R_P)[2:].zfill(10))] + bit_list_1 = [1] * 30 + global INIT_SEQUENCE + INIT_SEQUENCE = bit_list_field + bit_list_sbox + bit_list_n + bit_list_t + bit_list_R_F + bit_list_R_P + bit_list_1 + INIT_SEQUENCE = [int(_) for _ in INIT_SEQUENCE] + +def generate_constants(field, n, t, R_F, R_P, prime_number): + round_constants = [] + # num_constants = (R_F + R_P) * t # Poseidon + num_constants = (R_F * t) + R_P # Poseidon2 + + if field == 0: + for i in range(0, num_constants): + random_int = grain_random_bits(n) + round_constants.append(random_int) + elif field == 1: + for i in range(0, num_constants): + random_int = grain_random_bits(n) + while random_int >= prime_number: + # print("[Info] Round constant is not in prime field! Taking next one.") + random_int = grain_random_bits(n) + round_constants.append(random_int) + # Add (t-1) zeroes for Poseidon2 if partial round + if i >= ((R_F/2) * t) and i < (((R_F/2) * t) + R_P): + round_constants.extend([0] * (t-1)) + return round_constants + +def print_round_constants(round_constants, n, field): + print("Number of round constants:", len(round_constants)) + + if field == 0: + print("Round constants for GF(2^n):") + elif field == 1: + print("Round constants for GF(p):") + hex_length = int(ceil(float(n) / 4)) + 2 # +2 for "0x" + print(["{0:#0{1}x}".format(entry, hex_length) for entry in round_constants]) + +def create_mds_p(n, t): + M = matrix(F, t, t) + + # Sample random distinct indices and assign to xs and ys + while True: + flag = True + rand_list = [F(grain_random_bits(n)) for _ in range(0, 2*t)] + while len(rand_list) != len(set(rand_list)): # Check for duplicates + rand_list = [F(grain_random_bits(n)) for _ in range(0, 2*t)] + xs = rand_list[:t] + ys = rand_list[t:] + # xs = [F(ele) for ele in range(0, t)] + # ys = [F(ele) for ele in range(t, 2*t)] + for i in range(0, t): + for j in range(0, t): + if (flag == False) or ((xs[i] + ys[j]) == 0): + flag = False + else: + entry = (xs[i] + ys[j])^(-1) + M[i, j] = entry + if flag == False: + continue + return M + +def generate_vectorspace(round_num, M, M_round, NUM_CELLS): + t = NUM_CELLS + s = 1 + V = VectorSpace(F, t) + if round_num == 0: + return V + elif round_num == 1: + return V.subspace(V.basis()[s:]) + else: + mat_temp = matrix(F) + for i in range(0, round_num-1): + add_rows = [] + for j in range(0, s): + add_rows.append(M_round[i].rows()[j][s:]) + mat_temp = matrix(mat_temp.rows() + add_rows) + r_k = mat_temp.right_kernel() + extended_basis_vectors = [] + for vec in r_k.basis(): + extended_basis_vectors.append(vector([0]*s + list(vec))) + S = V.subspace(extended_basis_vectors) + + return S + +def subspace_times_matrix(subspace, M, NUM_CELLS): + t = NUM_CELLS + V = VectorSpace(F, t) + subspace_basis = subspace.basis() + new_basis = [] + for vec in subspace_basis: + new_basis.append(M * vec) + new_subspace = V.subspace(new_basis) + return new_subspace + +# Returns True if the matrix is considered secure, False otherwise +def algorithm_1(M, NUM_CELLS): + t = NUM_CELLS + s = 1 + r = floor((t - s) / float(s)) + + # Generate round matrices + M_round = [] + for j in range(0, t+1): + M_round.append(M^(j+1)) + + for i in range(1, r+1): + mat_test = M^i + entry = mat_test[0, 0] + mat_target = matrix.circulant(vector([entry] + ([F(0)] * (t-1)))) + + if (mat_test - mat_target) == matrix.circulant(vector([F(0)] * (t))): + return [False, 1] + + S = generate_vectorspace(i, M, M_round, t) + V = VectorSpace(F, t) + + basis_vectors= [] + for eigenspace in mat_test.eigenspaces_right(format='galois'): + if (eigenspace[0] not in F): + continue + vector_subspace = eigenspace[1] + intersection = S.intersection(vector_subspace) + basis_vectors += intersection.basis() + IS = V.subspace(basis_vectors) + + if IS.dimension() >= 1 and IS != V: + return [False, 2] + for j in range(1, i+1): + S_mat_mul = subspace_times_matrix(S, M^j, t) + if S == S_mat_mul: + print("S.basis():\n", S.basis()) + return [False, 3] + + return [True, 0] + +# Returns True if the matrix is considered secure, False otherwise +def algorithm_2(M, NUM_CELLS): + t = NUM_CELLS + s = 1 + + V = VectorSpace(F, t) + trail = [None, None] + test_next = False + I = range(0, s) + I_powerset = list(sage.misc.misc.powerset(I))[1:] + for I_s in I_powerset: + test_next = False + new_basis = [] + for l in I_s: + new_basis.append(V.basis()[l]) + IS = V.subspace(new_basis) + for i in range(s, t): + new_basis.append(V.basis()[i]) + full_iota_space = V.subspace(new_basis) + for l in I_s: + v = V.basis()[l] + while True: + delta = IS.dimension() + v = M * v + IS = V.subspace(IS.basis() + [v]) + if IS.dimension() == t or IS.intersection(full_iota_space) != IS: + test_next = True + break + if IS.dimension() <= delta: + break + if test_next == True: + break + if test_next == True: + continue + return [False, [IS, I_s]] + + return [True, None] + +# Returns True if the matrix is considered secure, False otherwise +def algorithm_3(M, NUM_CELLS): + t = NUM_CELLS + s = 1 + + V = VectorSpace(F, t) + + l = 4*t + for r in range(2, l+1): + next_r = False + res_alg_2 = algorithm_2(M^r, t) + if res_alg_2[0] == False: + return [False, None] + + # if res_alg_2[1] == None: + # continue + # IS = res_alg_2[1][0] + # I_s = res_alg_2[1][1] + # for j in range(1, r): + # IS = subspace_times_matrix(IS, M, t) + # I_j = [] + # for i in range(0, s): + # new_basis = [] + # for k in range(0, t): + # if k != i: + # new_basis.append(V.basis()[k]) + # iota_space = V.subspace(new_basis) + # if IS.intersection(iota_space) != iota_space: + # single_iota_space = V.subspace([V.basis()[i]]) + # if IS.intersection(single_iota_space) == single_iota_space: + # I_j.append(i) + # else: + # next_r = True + # break + # if next_r == True: + # break + # if next_r == True: + # continue + # return [False, [IS, I_j, r]] + + return [True, None] + +def check_minpoly_condition(M, NUM_CELLS): + max_period = 2*NUM_CELLS + all_fulfilled = True + M_temp = M + for i in range(1, max_period + 1): + if not ((M_temp.minimal_polynomial().degree() == NUM_CELLS) and (M_temp.minimal_polynomial().is_irreducible() == True)): + all_fulfilled = False + break + M_temp = M * M_temp + return all_fulfilled + +def generate_matrix(FIELD, FIELD_SIZE, NUM_CELLS): + if FIELD == 0: + print("Matrix generation not implemented for GF(2^n).") + exit(1) + elif FIELD == 1: + mds_matrix = create_mds_p(FIELD_SIZE, NUM_CELLS) + result_1 = algorithm_1(mds_matrix, NUM_CELLS) + result_2 = algorithm_2(mds_matrix, NUM_CELLS) + result_3 = algorithm_3(mds_matrix, NUM_CELLS) + while result_1[0] == False or result_2[0] == False or result_3[0] == False: + mds_matrix = create_mds_p(FIELD_SIZE, NUM_CELLS) + result_1 = algorithm_1(mds_matrix, NUM_CELLS) + result_2 = algorithm_2(mds_matrix, NUM_CELLS) + result_3 = algorithm_3(mds_matrix, NUM_CELLS) + return mds_matrix + +def generate_matrix_full(NUM_CELLS): + M = None + if t == 2: + M = matrix.circulant(vector([F(2), F(1)])) + elif t == 3: + M = matrix.circulant(vector([F(2), F(1), F(1)])) + elif t == 4: + M = matrix(F, [[F(5), F(7), F(1), F(3)], [F(4), F(6), F(1), F(1)], [F(1), F(3), F(5), F(7)], [F(1), F(1), F(4), F(6)]]) + elif (t % 4) == 0: + M = matrix(F, t, t) + # M_small = matrix.circulant(vector([F(3), F(2), F(1), F(1)])) + M_small = matrix(F, [[F(5), F(7), F(1), F(3)], [F(4), F(6), F(1), F(1)], [F(1), F(3), F(5), F(7)], [F(1), F(1), F(4), F(6)]]) + small_num = t // 4 + for i in range(0, small_num): + for j in range(0, small_num): + if i == j: + M[i*4:(i+1)*4,j*4:(j+1)*4] = 2* M_small + else: + M[i*4:(i+1)*4,j*4:(j+1)*4] = M_small + else: + print("Error: No matrix for these parameters.") + exit() + return M + +def generate_matrix_partial(FIELD, FIELD_SIZE, NUM_CELLS): ## TODO: Prioritize small entries + entry_max_bit_size = FIELD_SIZE + if FIELD == 0: + print("Matrix generation not implemented for GF(2^n).") + exit(1) + elif FIELD == 1: + M = None + if t == 2: + M = matrix(F, [[F(2), F(1)], [F(1), F(3)]]) + elif t == 3: + M = matrix(F, [[F(2), F(1), F(1)], [F(1), F(2), F(1)], [F(1), F(1), F(3)]]) + else: + M_circulant = matrix.circulant(vector([F(0)] + [F(1) for _ in range(0, NUM_CELLS - 1)])) + M_diagonal = matrix.diagonal([F(grain_random_bits(entry_max_bit_size)) for _ in range(0, NUM_CELLS)]) + M = M_circulant + M_diagonal + # while algorithm_1(M, NUM_CELLS)[0] == False or algorithm_2(M, NUM_CELLS)[0] == False or algorithm_3(M, NUM_CELLS)[0] == False: + while check_minpoly_condition(M, NUM_CELLS) == False: + M_diagonal = matrix.diagonal([F(grain_random_bits(entry_max_bit_size)) for _ in range(0, NUM_CELLS)]) + M = M_circulant + M_diagonal + + if(algorithm_1(M, NUM_CELLS)[0] == False or algorithm_2(M, NUM_CELLS)[0] == False or algorithm_3(M, NUM_CELLS)[0] == False): + print("Error: Generated partial matrix is not secure w.r.t. subspace trails.") + exit() + return M + +def generate_matrix_partial_small_entries(FIELD, FIELD_SIZE, NUM_CELLS): + if FIELD == 0: + print("Matrix generation not implemented for GF(2^n).") + exit(1) + elif FIELD == 1: + M_circulant = matrix.circulant(vector([F(0)] + [F(1) for _ in range(0, NUM_CELLS - 1)])) + combinations = list(itertools.product(range(2, 6), repeat=NUM_CELLS)) + for entry in combinations: + M = M_circulant + matrix.diagonal(vector(F, list(entry))) + print(M) + # if M.is_invertible() == False or algorithm_1(M, NUM_CELLS)[0] == False or algorithm_2(M, NUM_CELLS)[0] == False or algorithm_3(M, NUM_CELLS)[0] == False: + if M.is_invertible() == False or check_minpoly_condition(M, NUM_CELLS) == False: + continue + return M + +def matrix_partial_m_1(matrix_partial, NUM_CELLS): + M_circulant = matrix.identity(F, NUM_CELLS) + return matrix_partial - M_circulant + +def print_linear_layer(M, n, t): + print("n:", n) + print("t:", t) + print("N:", (n * t)) + print("Result Algorithm 1:\n", algorithm_1(M, NUM_CELLS)) + print("Result Algorithm 2:\n", algorithm_2(M, NUM_CELLS)) + print("Result Algorithm 3:\n", algorithm_3(M, NUM_CELLS)) + hex_length = int(ceil(float(n) / 4)) + 2 # +2 for "0x" + print("Prime number:", "0x" + hex(PRIME_NUMBER)) + matrix_string = "[" + for i in range(0, t): + matrix_string += str(["{0:#0{1}x}".format(int(entry), hex_length) for entry in M[i]]) + if i < (t-1): + matrix_string += "," + matrix_string += "]" + print("MDS matrix:\n", matrix_string) + +def calc_equivalent_matrices(MDS_matrix_field): + # Following idea: Split M into M' * M'', where M'' is "cheap" and M' can move before the partial nonlinear layer + # The "previous" matrix layer is then M * M'. Due to the construction of M', the M[0,0] and v values will be the same for the new M' (and I also, obviously) + # Thus: Compute the matrices, store the w_hat and v_hat values + + MDS_matrix_field_transpose = MDS_matrix_field.transpose() + + w_hat_collection = [] + v_collection = [] + v = MDS_matrix_field_transpose[[0], list(range(1,t))] + + M_mul = MDS_matrix_field_transpose + M_i = matrix(F, t, t) + for i in range(R_P_FIXED - 1, -1, -1): + M_hat = M_mul[list(range(1,t)), list(range(1,t))] + w = M_mul[list(range(1,t)), [0]] + v = M_mul[[0], list(range(1,t))] + v_collection.append(v.list()) + w_hat = M_hat.inverse() * w + w_hat_collection.append(w_hat.list()) + + # Generate new M_i, and multiplication M * M_i for "previous" round + M_i = matrix.identity(t) + M_i[list(range(1,t)), list(range(1,t))] = M_hat + M_mul = MDS_matrix_field_transpose * M_i + + return M_i, v_collection, w_hat_collection, MDS_matrix_field_transpose[0, 0] + +def calc_equivalent_constants(constants, MDS_matrix_field): + constants_temp = [constants[index:index+t] for index in range(0, len(constants), t)] + + MDS_matrix_field_transpose = MDS_matrix_field.transpose() + + # Start moving round constants up + # Calculate c_i' = M^(-1) * c_(i+1) + # Split c_i': Add c_i'[0] AFTER the S-box, add the rest to c_i + # I.e.: Store c_i'[0] for each of the partial rounds, and make c_i = c_i + c_i' (where now c_i'[0] = 0) + num_rounds = R_F_FIXED + R_P_FIXED + R_f = R_F_FIXED / 2 + for i in range(num_rounds - 2 - R_f, R_f - 1, -1): + inv_cip1 = list(vector(constants_temp[i+1]) * MDS_matrix_field_transpose.inverse()) + constants_temp[i] = list(vector(constants_temp[i]) + vector([0] + inv_cip1[1:])) + constants_temp[i+1] = [inv_cip1[0]] + [0] * (t-1) + + return constants_temp + +def poseidon(input_words, matrix, round_constants): + + R_f = int(R_F_FIXED / 2) + + round_constants_counter = 0 + + state_words = list(input_words) + + # First full rounds + for r in range(0, R_f): + # Round constants, nonlinear layer, matrix multiplication + for i in range(0, t): + state_words[i] = state_words[i] + round_constants[round_constants_counter] + round_constants_counter += 1 + for i in range(0, t): + state_words[i] = (state_words[i])^alpha + state_words = list(matrix * vector(state_words)) + + # Middle partial rounds + for r in range(0, R_P_FIXED): + # Round constants, nonlinear layer, matrix multiplication + for i in range(0, t): + state_words[i] = state_words[i] + round_constants[round_constants_counter] + round_constants_counter += 1 + state_words[0] = (state_words[0])^alpha + state_words = list(matrix * vector(state_words)) + + # Last full rounds + for r in range(0, R_f): + # Round constants, nonlinear layer, matrix multiplication + for i in range(0, t): + state_words[i] = state_words[i] + round_constants[round_constants_counter] + round_constants_counter += 1 + for i in range(0, t): + state_words[i] = (state_words[i])^alpha + state_words = list(matrix * vector(state_words)) + + return state_words + +def poseidon2(input_words, matrix_full, matrix_partial, round_constants): + + R_f = int(R_F_FIXED / 2) + + round_constants_counter = 0 + + state_words = list(input_words) + + # First matrix mul + state_words = list(matrix_full * vector(state_words)) + + # First full rounds + for r in range(0, R_f): + # Round constants, nonlinear layer, matrix multiplication + for i in range(0, t): + state_words[i] = state_words[i] + round_constants[round_constants_counter] + round_constants_counter += 1 + for i in range(0, t): + state_words[i] = (state_words[i])^alpha + state_words = list(matrix_full * vector(state_words)) + + # Middle partial rounds + for r in range(0, R_P_FIXED): + # Round constants, nonlinear layer, matrix multiplication + for i in range(0, t): + state_words[i] = state_words[i] + round_constants[round_constants_counter] + round_constants_counter += 1 + state_words[0] = (state_words[0])^alpha + state_words = list(matrix_partial * vector(state_words)) + + # Last full rounds + for r in range(0, R_f): + # Round constants, nonlinear layer, matrix multiplication + for i in range(0, t): + state_words[i] = state_words[i] + round_constants[round_constants_counter] + round_constants_counter += 1 + for i in range(0, t): + state_words[i] = (state_words[i])^alpha + state_words = list(matrix_full * vector(state_words)) + + return state_words + +def to_bytes(value, indent): + l = len(hex(p - 1)) + if l % 2 == 1: + l = l + 1 + value = hex(int(value))[2:] + value = value.zfill(l - 2) + value_bytes = reversed(["0x" + value[i:i + 2] for i in range(0, len(value), 2)]) + print(" " * indent + ", ".join(value_bytes) + ",") + +print("#pragma once") +print(f"#ifndef {CURVE_NAME.upper()}_POSEIDON2_H") +print(f"#define {CURVE_NAME.upper()}_POSEIDON2_H") +print() +print(f"namespace poseidon2_constants_{CURVE_NAME} {{") + +for t in TS: + NUM_CELLS = t + R_F_FIXED, R_P_FIXED, _, _ = poseidon_calc_final_numbers_fixed(p, t, alpha, 128, True) + + INIT_SEQUENCE = [] + + PRIME_NUMBER = p + + F = GF(PRIME_NUMBER) + + grain_gen = grain_sr_generator() + + # Init + init_generator(FIELD, SBOX, FIELD_SIZE, NUM_CELLS, R_F_FIXED, R_P_FIXED) + + # Round constants + round_constants = generate_constants(FIELD, FIELD_SIZE, NUM_CELLS, R_F_FIXED, R_P_FIXED, PRIME_NUMBER) + # print_round_constants(round_constants, FIELD_SIZE, FIELD) + + # Matrix + # MDS = generate_matrix(FIELD, FIELD_SIZE, NUM_CELLS) + MATRIX_FULL = generate_matrix_full(NUM_CELLS) + MATRIX_PARTIAL = generate_matrix_partial(FIELD, FIELD_SIZE, NUM_CELLS) + MATRIX_PARTIAL_DIAGONAL_M_1 = [matrix_partial_m_1(MATRIX_PARTIAL, NUM_CELLS)[i,i] for i in range(0, NUM_CELLS)] + + print() + print(f" namespace t{t} {{") + print(f" int internal_rounds = {R_P_FIXED};") + print() + print(f" int alpha = {alpha};") + print() + + # # MDS + # print("pub static ref MDS{}: Vec> = vec![".format(t)) + # for vec in MDS: + # print("vec![", end="") + # for val in vec: + # to_hex(val) + # print("],") + # print("];") + # print() + + # Efficient partial matrix (diagonal - 1) + print(" unsigned char mat_diag_m_1[] = {") + for val in MATRIX_PARTIAL_DIAGONAL_M_1: + to_bytes(val, 6) + print(" };") + print() + + # # Efficient partial matrix (full) + # print(" unsigned char mat_internal[] = {") + # for vec in MATRIX_PARTIAL: + # for val in vec: + # to_bytes(val, 6) + # print() + # print(" };") + # print() + + # Round constants + print(" unsigned char round_constants[] = {") + for (i,val) in enumerate(round_constants): + if (i % t == 0 or (i < (R_F_FIXED / 2) * t) or (i > (R_F_FIXED / 2 + R_P_FIXED) * t)): + to_bytes(val, 6) + print(" };") + print(" }") + print() + + # state_in = vector([F(i) for i in range(t)]) + # # state_out = poseidon(state_in, MDS, round_constants) + # state_out = poseidon2(state_in, MATRIX_FULL, MATRIX_PARTIAL, round_constants) + + # for (i,val) in enumerate(state_in): + # if i % t == 0: + # print("vec![", end="") + # to_bytes(val) + # if i % t == t - 1: + # print("],") + # print("];") + + # for (i,val) in enumerate(state_out): + # if i % t == 0: + # print("vec![", end="") + # to_bytes(val) + # if i % t == t - 1: + # print("],") + # print("];") + +print("}") +print("#endif") diff --git a/icicle/include/poseidon2/poseidon2.cuh b/icicle/include/poseidon2/poseidon2.cuh new file mode 100644 index 00000000..ce6efa83 --- /dev/null +++ b/icicle/include/poseidon2/poseidon2.cuh @@ -0,0 +1,130 @@ +#pragma once +#ifndef POSEIDON2_H +#define POSEIDON2_H + +#include +#include +#include "gpu-utils/device_context.cuh" +#include "gpu-utils/error_handler.cuh" +#include "utils/utils.h" + +/** + * @namespace poseidon2 + * Implementation of the [Poseidon2 hash function](https://eprint.iacr.org/2019/458.pdf) + * Specifically, the optimized [Filecoin version](https://spec.filecoin.io/algorithms/crypto/poseidon/) + */ +namespace poseidon2 { + /** + * For most of the Poseidon2 configurations this is the case + */ + const int EXTERNAL_ROUNDS_DEFAULT = 8; + + enum DiffusionStrategy { + DEFAULT_DIFFUSION, + MONTGOMERY, + }; + + enum MdsType { DEFAULT_MDS, PLONKY }; + + enum PoseidonMode { + COMPRESSION, + PERMUTATION, + }; + + /** + * @struct Poseidon2Constants + * This constants are enough to define a Poseidon2 instantce + * @param round_constants A pointer to round constants allocated on the device + * @param mds_matrix A pointer to an mds matrix allocated on the device + * @param non_sparse_matrix A pointer to non sparse matrix allocated on the device + * @param sparse_matrices A pointer to sparse matrices allocated on the device + */ + template + struct Poseidon2Constants { + int width; + int alpha; + int internal_rounds; + int external_rounds; + S* round_constants = nullptr; + S* internal_matrix_diag = nullptr; + MdsType mds_type; + DiffusionStrategy diffusion; + }; + + /** + * @struct Poseidon2Config + * Struct that encodes various Poseidon2 parameters. + */ + struct Poseidon2Config { + device_context::DeviceContext ctx; /**< Details related to the device such as its id and stream id. */ + bool are_states_on_device; /**< True if inputs are on device and false if they're on host. Default value: false. */ + bool are_outputs_on_device; /**< If true, output is preserved on device, otherwise on host. Default value: false. */ + PoseidonMode mode; + int output_index; + bool loop_state; /**< If true, hash results will also be copied in the input pointer in aligned format */ + bool + is_async; /**< Whether to run the Poseidon2 asynchronously. If set to `true`, the poseidon_hash function will be + * non-blocking and you'd need to synchronize it explicitly by running + * `cudaStreamSynchronize` or `cudaDeviceSynchronize`. If set to false, the poseidon_hash + * function will block the current CPU thread. */ + }; + + static Poseidon2Config default_poseidon2_config( + int t, const device_context::DeviceContext& ctx = device_context::get_default_device_context()) + { + Poseidon2Config config = { + ctx, // ctx + false, // are_states_on_device + false, // are_outputs_on_device + PoseidonMode::COMPRESSION, + 1, // output_index + false, // loop_state + false, // is_async + }; + return config; + } + + template + cudaError_t create_optimized_poseidon2_constants( + int width, + int alpha, + int internal_rounds, + int external_rounds, + const S* round_constants, + const S* internal_matrix_diag, + MdsType mds_type, + DiffusionStrategy diffusion, + device_context::DeviceContext& ctx, + Poseidon2Constants* poseidon_constants); + + /** + * Loads pre-calculated optimized constants, moves them to the device + */ + template + cudaError_t init_optimized_poseidon2_constants( + int width, + MdsType mds_type, + DiffusionStrategy diffusion, + device_context::DeviceContext& ctx, + Poseidon2Constants* constants); + + /** + * Compute the poseidon hash over a sequence of preimages. + * Takes {number_of_states * (T-1)} elements of input and computes {number_of_states} hash images + * @param T size of the poseidon state, should be equal to {arity + 1} + * @param states a pointer to the input data. May be allocated on device or on host, regulated + * by the config. May point to a string of preimages or a string of states filled with preimages. + * @param output a pointer to the output data. May be allocated on device or on host, regulated + * by the config. Must be at least of size [number_of_states](@ref number_of_states) + * @param number_of_states number of input blocks of size T-1 (arity) + */ + template + cudaError_t poseidon2_hash( + S* states, + S* output, + size_t number_of_states, + const Poseidon2Constants& constants, + const Poseidon2Config& config); +} // namespace poseidon2 + +#endif \ No newline at end of file diff --git a/icicle/src/fields/CMakeLists.txt b/icicle/src/fields/CMakeLists.txt index fb098ea6..26c144f3 100644 --- a/icicle/src/fields/CMakeLists.txt +++ b/icicle/src/fields/CMakeLists.txt @@ -3,6 +3,7 @@ if (EXT_FIELD) endif () SET(SUPPORTED_FIELDS_WITHOUT_NTT grumpkin) +SET(SUPPORTED_FIELDS_WITHOUT_POSEIDON2 bls12_381;bls12_377;grumpkin;bw6_761;stark252) set(TARGET icicle_field) @@ -27,6 +28,10 @@ if (DEFINED CURVE) list(APPEND FIELD_SOURCE ${SRC}/poseidon/tree/merkle.cu) endif() +if (NOT FIELD IN_LIST SUPPORTED_FIELDS_WITHOUT_POSEIDON2) + list(APPEND FIELD_SOURCE ${SRC}/poseidon2/extern.cu) +endif() + if (NOT FIELD IN_LIST SUPPORTED_FIELDS_WITHOUT_NTT) list(APPEND FIELD_SOURCE ${SRC}/ntt/extern.cu) list(APPEND FIELD_SOURCE ${SRC}/ntt/kernel_ntt.cu) diff --git a/icicle/src/poseidon2/.gitignore b/icicle/src/poseidon2/.gitignore new file mode 100644 index 00000000..bf4d73d8 --- /dev/null +++ b/icicle/src/poseidon2/.gitignore @@ -0,0 +1,2 @@ +test_poseidon +test_poseidon_release \ No newline at end of file diff --git a/icicle/src/poseidon2/Makefile b/icicle/src/poseidon2/Makefile new file mode 100644 index 00000000..4fce6e87 --- /dev/null +++ b/icicle/src/poseidon2/Makefile @@ -0,0 +1,7 @@ +test_poseidon: test.cu poseidon.cu kernels.cu constants.cu + nvcc -o test_poseidon -I../../include -DFIELD=bn254 -DFIELD_ID=1 -DCURVE_ID=1 -DDEVMODE -DDEBUG extern.cu test.cu + ./test_poseidon + +test_poseidon_release: test.cu poseidon.cu kernels.cu constants.cu + nvcc -o test_poseidon_release -I../../include -DFIELD=bn254 -DFIELD_ID=1 -DCURVE_ID=1 extern.cu test.cu + ./test_poseidon_release \ No newline at end of file diff --git a/icicle/src/poseidon2/constants.cu b/icicle/src/poseidon2/constants.cu new file mode 100644 index 00000000..3087acc3 --- /dev/null +++ b/icicle/src/poseidon2/constants.cu @@ -0,0 +1,120 @@ +#include "poseidon2/poseidon2.cuh" + +/// These are pre-calculated constants for different curves +#include "fields/id.h" +#if FIELD_ID == BN254 +#include "poseidon2/constants/bn254_poseidon2.h" +using namespace poseidon2_constants_bn254; +#elif FIELD_ID == BLS12_381 +#include "poseidon2/constants/bls12_381_poseidon2.h" +using namespace poseidon2_constants_bls12_381; +#elif FIELD_ID == BLS12_377 +#include "poseidon2/constants/bls12_377_poseidon2.h" +using namespace poseidon2_constants_bls12_377; +#elif FIELD_ID == BW6_761 +#include "poseidon2/constants/bw6_761_poseidon2.h" +using namespace poseidon2_constants_bw6_761; +#elif FIELD_ID == GRUMPKIN +#include "poseidon2/constants/grumpkin_poseidon2.h" +using namespace poseidon2_constants_grumpkin; +#elif FIELD_ID == BABY_BEAR +#include "poseidon2/constants/babybear_poseidon2.h" +using namespace poseidon2_constants_babybear; +#endif + +namespace poseidon2 { + template + cudaError_t create_optimized_poseidon2_constants( + int width, + int alpha, + int internal_rounds, + int external_rounds, + const S* round_constants, + const S* internal_matrix_diag, + MdsType mds_type, + DiffusionStrategy diffusion, + device_context::DeviceContext& ctx, + Poseidon2Constants* poseidon_constants) + { + cudaFree(nullptr); // Temporary solution + if (!(alpha == 3 || alpha == 5 || alpha == 7 || alpha == 11)) { + THROW_ICICLE_ERR(IcicleError_t::InvalidArgument, "Invalid alpha value"); + } + if (external_rounds % 2) { THROW_ICICLE_ERR(IcicleError_t::InvalidArgument, "Invalid external rounds"); } + + CHK_INIT_IF_RETURN(); + cudaStream_t& stream = ctx.stream; + + int round_constants_len = width * (external_rounds) + internal_rounds; + int internal_matrix_len = width; + + // Malloc memory for copying round constants and internal matrix + S* d_constants; + CHK_IF_RETURN(cudaMallocAsync(&d_constants, sizeof(S) * (internal_matrix_len + round_constants_len), stream)); + + S* d_internal_matrix = d_constants; + S* d_round_constants = d_constants + internal_matrix_len; + + // Copy internal matrix + CHK_IF_RETURN(cudaMemcpyAsync( + d_internal_matrix, internal_matrix_diag, sizeof(S) * internal_matrix_len, cudaMemcpyHostToDevice, stream)); + // Copy round constants + CHK_IF_RETURN(cudaMemcpyAsync( + d_round_constants, round_constants, sizeof(S) * round_constants_len, cudaMemcpyHostToDevice, stream)); + + // Make sure all the constants have been copied + CHK_IF_RETURN(cudaStreamSynchronize(stream)); + *poseidon_constants = {width, alpha, internal_rounds, external_rounds, d_round_constants, d_internal_matrix, + mds_type, diffusion}; + + return CHK_LAST(); + } + + template + cudaError_t init_optimized_poseidon2_constants( + int width, + MdsType mds_type, + DiffusionStrategy diffusion, + device_context::DeviceContext& ctx, + Poseidon2Constants* poseidon2_constants) + { + cudaFree(nullptr); // Temporary solution + CHK_INIT_IF_RETURN(); + +#define P2_CONSTANTS_DEF(width) \ + case width: \ + internal_rounds = t##width::internal_rounds; \ + round_constants = t##width::round_constants; \ + internal_matrix = t##width::mat_diag_m_1; \ + alpha = t##width::alpha; \ + break; + + int alpha; + int external_rounds = EXTERNAL_ROUNDS_DEFAULT; + int internal_rounds; + unsigned char* round_constants; + unsigned char* internal_matrix; + switch (width) { + P2_CONSTANTS_DEF(2) + P2_CONSTANTS_DEF(3) + P2_CONSTANTS_DEF(4) + P2_CONSTANTS_DEF(8) + P2_CONSTANTS_DEF(12) + P2_CONSTANTS_DEF(16) + P2_CONSTANTS_DEF(20) + P2_CONSTANTS_DEF(24) + default: + THROW_ICICLE_ERR( + IcicleError_t::InvalidArgument, + "init_optimized_poseidon2_constants: #width must be one of [2, 3, 4, 8, 12, 16, 20, 24]"); + } + S* h_round_constants = reinterpret_cast(round_constants); + S* h_internal_matrix = reinterpret_cast(internal_matrix); + + create_optimized_poseidon2_constants( + width, alpha, internal_rounds, external_rounds, h_round_constants, h_internal_matrix, mds_type, diffusion, ctx, + poseidon2_constants); + + return CHK_LAST(); + } +} // namespace poseidon2 \ No newline at end of file diff --git a/icicle/src/poseidon2/extern.cu b/icicle/src/poseidon2/extern.cu new file mode 100644 index 00000000..ae70f559 --- /dev/null +++ b/icicle/src/poseidon2/extern.cu @@ -0,0 +1,63 @@ +#include "utils/utils.h" + +#include "fields/field_config.cuh" +using namespace field_config; + +#include "poseidon.cu" + +namespace poseidon2 { + extern "C" cudaError_t CONCAT_EXPAND(FIELD, create_optimized_poseidon2_constants_cuda)( + int width, + int alpha, + int internal_rounds, + int external_rounds, + const scalar_t* round_constants, + const scalar_t* internal_matrix_diag, + MdsType mds_type, + DiffusionStrategy diffusion, + device_context::DeviceContext& ctx, + Poseidon2Constants* poseidon_constants) + { + return create_optimized_poseidon2_constants( + width, alpha, internal_rounds, external_rounds, round_constants, internal_matrix_diag, mds_type, diffusion, ctx, + poseidon_constants); + } + + extern "C" cudaError_t CONCAT_EXPAND(FIELD, init_optimized_poseidon2_constants_cuda)( + int width, + MdsType mds_type, + DiffusionStrategy diffusion, + device_context::DeviceContext& ctx, + Poseidon2Constants* constants) + { + return init_optimized_poseidon2_constants(width, mds_type, diffusion, ctx, constants); + } + + extern "C" cudaError_t CONCAT_EXPAND(FIELD, poseidon2_hash_cuda)( + scalar_t* input, + scalar_t* output, + int number_of_states, + int width, + const Poseidon2Constants* constants, + Poseidon2Config* config) + { +#define P2_HASH_T(width) \ + case width: \ + return poseidon2_hash(input, output, number_of_states, *constants, *config); + + switch (width) { + P2_HASH_T(2) + P2_HASH_T(3) + P2_HASH_T(4) + P2_HASH_T(8) + P2_HASH_T(12) + P2_HASH_T(16) + P2_HASH_T(20) + P2_HASH_T(24) + default: + THROW_ICICLE_ERR( + IcicleError_t::InvalidArgument, "PoseidonHash: #arity must be one of [2, 3, 4, 8, 12, 16, 20, 24]"); + } + return CHK_LAST(); + } +} // namespace poseidon2 \ No newline at end of file diff --git a/icicle/src/poseidon2/kernels.cu b/icicle/src/poseidon2/kernels.cu new file mode 100644 index 00000000..6b94ede3 --- /dev/null +++ b/icicle/src/poseidon2/kernels.cu @@ -0,0 +1,233 @@ +#include "poseidon/poseidon.cuh" +#include "gpu-utils/modifiers.cuh" + +namespace poseidon2 { + template + DEVICE_INLINE S sbox_el(S element, const int alpha) + { + S result2 = S::sqr(element); + switch (alpha) { + case 3: + return result2 * element; + case 5: + return S::sqr(result2) * element; + case 7: + return S::sqr(result2) * result2 * element; + case 11: + S result8 = S::sqr(S::sqr(result2)); + return result8 * result2 * element; + } + } + + template + DEVICE_INLINE S sbox(S state[T], const int alpha) + { + for (int i = 0; i < T; i++) { + state[i] = sbox_el(state[i], alpha); + } + } + + template + DEVICE_INLINE S add_rc(S state[T], size_t rc_offset, const S* rc) + { + for (int i = 0; i < T; i++) { + state[i] = state[i] + rc[rc_offset + i]; + } + } + + template + __device__ S mds_light_4x4(S s[4]) + { + S t0 = s[0] + s[1]; + S t1 = s[2] + s[3]; + S t2 = s[1] + s[1] + t1; + S t3 = s[3] + s[3] + t0; + S t4 = S::template mul_unsigned<4>(t1) + t3; + S t5 = S::template mul_unsigned<4>(t0) + t2; + s[0] = t3 + t5; + s[1] = t5; + s[2] = t2 + t4; + s[3] = t4; + } + + // Multiply a 4-element vector x by: + // [ 2 3 1 1 ] + // [ 1 2 3 1 ] + // [ 1 1 2 3 ] + // [ 3 1 1 2 ]. + // https://github.com/Plonky3/Plonky3/blob/main/poseidon2/src/matrix.rs#L36 + template + __device__ S mds_light_plonky_4x4(S s[4]) + { + S t01 = s[0] + s[1]; + S t23 = s[2] + s[3]; + S t0123 = t01 + t23; + S t01123 = t0123 + s[1]; + S t01233 = t0123 + s[3]; + s[3] = t01233 + S::template mul_unsigned<2>(s[0]); + s[1] = t01123 + S::template mul_unsigned<2>(s[2]); + s[0] = t01123 + t01; + s[2] = t01233 + t23; + } + + template + __device__ S mds_light(S state[T], MdsType mds) + { + S sum; + switch (T) { + case 2: + // Matrix circ(2, 1) + // [2, 1] + // [1, 2] + sum = state[0] + state[1]; + state[0] = state[0] + sum; + state[1] = state[1] + sum; + break; + case 3: + // Matrix circ(2, 1, 1) + // [2, 1, 1] + // [1, 2, 1] + // [1, 1, 2] + sum = state[0] + state[1] + state[2]; + state[0] = state[0] + sum; + state[1] = state[1] + sum; + state[2] = state[2] + sum; + break; + case 4: + case 8: + case 12: + case 16: + case 20: + case 24: + for (int i = 0; i < T; i += 4) { + switch (mds) { + case MdsType::DEFAULT_MDS: + mds_light_4x4(&state[i]); + break; + case MdsType::PLONKY: + mds_light_plonky_4x4(&state[i]); + } + } + + S sums[4] = {state[0], state[1], state[2], state[3]}; + for (int i = 4; i < T; i += 4) { + sums[0] = sums[0] + state[i]; + sums[1] = sums[1] + state[i + 1]; + sums[2] = sums[2] + state[i + 2]; + sums[3] = sums[3] + state[i + 3]; + } + for (int i = 0; i < T; i++) { + state[i] = state[i] + sums[i % 4]; + } + break; + } + } + + template + __device__ S internal_round(S state[T], size_t rc_offset, const Poseidon2Constants& constants) + { + S element = state[0]; + element = element + constants.round_constants[rc_offset]; + element = sbox_el(element, constants.alpha); + + S sum; + switch (T) { + case 2: + // [2, 1] + // [1, 3] + sum = element + state[1]; + state[0] = element + sum; + state[1] = S::template mul_unsigned<2>(state[1]) + sum; + break; + case 3: + // [2, 1, 1] + // [1, 2, 1] + // [1, 1, 3] + sum = element + state[1] + state[2]; + state[0] = element + sum; + state[1] = state[1] + sum; + state[2] = S::template mul_unsigned<2>(state[2]) + sum; + break; + case 4: + case 8: + case 12: + case 16: + case 20: + case 24: + typename S::Wide wide_sum = S::Wide::from_field(element); + for (int i = 1; i < T; i++) { + wide_sum = wide_sum + S::Wide::from_field(state[i]); + } + sum = S::reduce(wide_sum); + switch (constants.diffusion) { + case DiffusionStrategy::DEFAULT_DIFFUSION: + state[0] = element * constants.internal_matrix_diag[0] + sum; + for (int i = 1; i < T; i++) { + state[i] = state[i] * constants.internal_matrix_diag[i] + sum; + } + break; + case DiffusionStrategy::MONTGOMERY: + state[0] = S::from_montgomery(element * constants.internal_matrix_diag[0] + sum); + for (int i = 1; i < T; i++) { + state[i] = S::from_montgomery(state[i] * constants.internal_matrix_diag[i] + sum); + } + break; + } + } + } + + template + __global__ void + poseidon2_permutation_kernel(S* states, S* states_out, size_t number_of_states, const Poseidon2Constants constants) + { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= number_of_states) { return; } + + S state[T]; + UNROLL + for (int i = 0; i < T; i++) { + state[i] = states[idx * T + i]; + } + unsigned int rn; + + mds_light(state, constants.mds_type); + + size_t rc_offset = 0; + // External rounds + for (rn = 0; rn < constants.external_rounds / 2; rn++) { + add_rc(state, rc_offset, constants.round_constants); + sbox(state, constants.alpha); + mds_light(state, constants.mds_type); + rc_offset += T; + } + + // Internal rounds + for (; rn < constants.external_rounds / 2 + constants.internal_rounds; rn++) { + internal_round(state, rc_offset, constants); + rc_offset++; + } + + // External rounds + for (; rn < constants.external_rounds + constants.internal_rounds; rn++) { + add_rc(state, rc_offset, constants.round_constants); + sbox(state, constants.alpha); + mds_light(state, constants.mds_type); + rc_offset += T; + } + + UNROLL + for (int i = 0; i < T; i++) { + states_out[idx * T + i] = state[i]; + } + } + + // These function is just doing copy from the states to the output + template + __global__ void get_hash_results(S* states, size_t number_of_states, int index, S* out) + { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= number_of_states) { return; } + + out[idx] = states[idx * T + index]; + } +} // namespace poseidon2 \ No newline at end of file diff --git a/icicle/src/poseidon2/poseidon.cu b/icicle/src/poseidon2/poseidon.cu new file mode 100644 index 00000000..cc8a1930 --- /dev/null +++ b/icicle/src/poseidon2/poseidon.cu @@ -0,0 +1,76 @@ +#include "poseidon2/poseidon2.cuh" +#include "constants.cu" +#include "kernels.cu" + +namespace poseidon2 { + static int poseidon_block_size = 128; + + template + int poseidon_number_of_blocks(size_t number_of_states) + { + return number_of_states / poseidon_block_size + static_cast(number_of_states % poseidon_block_size); + } + + template + cudaError_t permute_many( + S* states, S* states_out, size_t number_of_states, const Poseidon2Constants& constants, cudaStream_t& stream) + { + poseidon2_permutation_kernel + <<(number_of_states), poseidon_block_size, 0, stream>>>( + states, states_out, number_of_states, constants); + CHK_IF_RETURN(cudaPeekAtLastError()); + return CHK_LAST(); + } + + template + cudaError_t poseidon2_hash( + S* states, + S* output, + size_t number_of_states, + const Poseidon2Constants& constants, + const Poseidon2Config& config) + { + CHK_INIT_IF_RETURN(); + cudaStream_t& stream = config.ctx.stream; + S* d_states; + if (config.are_states_on_device) { + d_states = states; + } else { + // allocate memory for {number_of_states} states of {t} scalars each + CHK_IF_RETURN(cudaMallocAsync(&d_states, number_of_states * T * sizeof(S), stream)) + CHK_IF_RETURN(cudaMemcpyAsync(d_states, states, number_of_states * T * sizeof(S), cudaMemcpyHostToDevice, stream)) + } + + cudaError_t hash_error = permute_many(d_states, d_states, number_of_states, constants, stream); + CHK_IF_RETURN(hash_error); + + if (config.mode == PoseidonMode::COMPRESSION) { + S* output_device; + if (config.are_outputs_on_device) { + output_device = output; + } else { + CHK_IF_RETURN(cudaMallocAsync(&output_device, number_of_states * sizeof(S), stream)) + } + + get_hash_results<<(number_of_states), poseidon_block_size, 0, stream>>>( + d_states, number_of_states, config.output_index, output_device); + CHK_IF_RETURN(cudaPeekAtLastError()); + + if (!config.are_outputs_on_device) { + CHK_IF_RETURN( + cudaMemcpyAsync(output, output_device, number_of_states * sizeof(S), cudaMemcpyDeviceToHost, stream)); + CHK_IF_RETURN(cudaFreeAsync(output_device, stream)); + } + } else { + if (!config.are_states_on_device || !config.are_outputs_on_device) { + CHK_IF_RETURN( + cudaMemcpyAsync(output, d_states, number_of_states * T * sizeof(S), cudaMemcpyDeviceToHost, stream)); + } + } + + if (!config.are_states_on_device) CHK_IF_RETURN(cudaFreeAsync(d_states, stream)); + + if (!config.is_async) return CHK_STICKY(cudaStreamSynchronize(stream)); + return CHK_LAST(); + } +} // namespace poseidon2 \ No newline at end of file diff --git a/icicle/src/poseidon2/test.cu b/icicle/src/poseidon2/test.cu new file mode 100644 index 00000000..9a135b52 --- /dev/null +++ b/icicle/src/poseidon2/test.cu @@ -0,0 +1,1101 @@ +#include "curves/curve_config.cuh" +using namespace curve_config; + +#include "gpu-utils/device_context.cuh" + +#ifndef __CUDA_ARCH__ +#include +#include +#include +#include + +#include "poseidon2/poseidon2.cuh" +using namespace poseidon2; + +#define T 3 + +#define START_TIMER(timer) auto timer##_start = std::chrono::high_resolution_clock::now(); +#define END_TIMER(timer, msg) \ + printf("%s: %.0f ms\n", msg, FpMilliseconds(std::chrono::high_resolution_clock::now() - timer##_start).count()); + +int main(int argc, char* argv[]) +{ + using FpMilliseconds = std::chrono::duration; + using FpMicroseconds = std::chrono::duration; + + // Load poseidon constants + START_TIMER(timer_const); + device_context::DeviceContext ctx = device_context::get_default_device_context(); + Poseidon2Constants constants; + init_optimized_poseidon2_constants( + T, MdsType::DEFAULT_MDS, DiffusionStrategy::DEFAULT_DIFFUSION, ctx, &constants); + END_TIMER(timer_const, "Load poseidon constants"); + + START_TIMER(allocation_timer); + // Prepare input data of [0, 1, 2 ... (number_of_blocks * arity) - 1] + int number_of_blocks = argc > 1 ? 1 << atoi(argv[1]) : 1024; + scalar_t input = scalar_t::zero(); + scalar_t* in_ptr = static_cast(malloc(number_of_blocks * T * sizeof(scalar_t))); + for (uint32_t i = 0; i < number_of_blocks * T; i++) { + in_ptr[i] = input; + input = input + scalar_t::one(); + } + END_TIMER(allocation_timer, "Allocate mem and fill input"); + + scalar_t* out_ptr = static_cast(malloc(number_of_blocks * sizeof(scalar_t))); + + START_TIMER(poseidon_timer); + Poseidon2Config config = default_poseidon2_config(T); + poseidon2_hash(in_ptr, out_ptr, number_of_blocks, constants, config); + END_TIMER(poseidon_timer, "Poseidon") + + // for (int i = 0; i < number_of_blocks; i++) { + // std::cout << "{"; + // for (int j = 0; j < 8; j++) { + // std::cout << ((uint32_t*)&out_ptr[i].limbs_storage)[j]; + // if (j != 7) { std::cout << ", "; } + // } + // std::cout << "}," << std::endl; + // } + + scalar_t expected[1024] = { + {2337248161, 922903866, 3071222352, 4081058267, 202960435, 3624769622, 2795065713, 587773401}, + {2877573013, 1770378927, 3640761212, 3701454630, 1398036492, 3791634046, 1398650802, 573220813}, + {2323651800, 1670011638, 4011449678, 2015366333, 2439637416, 1996298558, 2682390530, 775056766}, + {4231740498, 1547037434, 1091263111, 3069783085, 903800825, 3053320007, 759698752, 270534075}, + {929530500, 2908315047, 2379289075, 1180108740, 2567510294, 2137292693, 3238765095, 214830700}, + {1519055477, 2668743693, 856401502, 3805283196, 3483702320, 1862951136, 2910012574, 653382231}, + {3033225700, 2215712291, 3353723823, 761477891, 20561034, 3461601764, 2732180603, 498135517}, + {2970792382, 2824369266, 2283566237, 1642127343, 3714899790, 377977812, 3339933868, 21500926}, + {1465969779, 892925676, 14133348, 3282637834, 504612845, 1834263838, 1972077882, 73379048}, + {392142775, 2719578242, 3153739944, 3329248015, 2670782102, 419502418, 835741300, 663054425}, + {1635526549, 2749619586, 2649038437, 2132466526, 2715069976, 648084377, 2862160083, 106626013}, + {1106245030, 1225520809, 29309126, 3374355381, 3562744306, 3123213928, 2087330420, 59621160}, + {1593802085, 2793759314, 652946587, 3203437766, 3247487137, 1396924142, 1580303725, 174801908}, + {4025587200, 4082015564, 1173681216, 3127480166, 1034016147, 991403334, 4014149380, 420181217}, + {3592592465, 1056606453, 2680520399, 2988309624, 2669029486, 1907874230, 1196552328, 105525214}, + {2572072743, 1395302269, 544207797, 646679795, 3162693242, 2262511348, 1062107072, 188033893}, + {1064949600, 3269989712, 3654517826, 2763325899, 3393966953, 2768875167, 4010413525, 148162566}, + {3763002391, 3234888905, 1177601991, 2167351813, 686626897, 3406602152, 3582610309, 43783215}, + {4163262779, 446727167, 2960256289, 1847210772, 1055583550, 1776802596, 2385384364, 700431403}, + {2414577902, 3663803456, 2298192142, 2722412277, 1298869039, 3935592600, 386243021, 387997461}, + {3292923249, 6199936, 1675635087, 1851936447, 880093023, 2469813719, 2201651493, 451618348}, + {1980156396, 1560700264, 1928805412, 3990903692, 3008315225, 1754644267, 2616623521, 439117542}, + {602960800, 654171190, 1489674898, 700677973, 3081155653, 1750294232, 1853105141, 230811756}, + {2397946673, 287730133, 2350922701, 1485409365, 545118895, 727639541, 3536534489, 536834981}, + {3314734530, 2068838415, 1229815801, 3531994100, 3388434334, 2210601578, 2953771348, 222891795}, + {1715594389, 1797429717, 3493073480, 602222025, 3938839362, 3625143475, 1640971423, 529566839}, + {534040292, 3459841971, 355924662, 2118998096, 98842679, 3007195048, 3058773244, 758720916}, + {1412715074, 4073890062, 2685340189, 2941563092, 3879168524, 3731087948, 2592950099, 376504183}, + {3616063581, 4019848072, 3127005016, 1101094426, 3119232326, 3063443937, 3580083715, 167287947}, + {3773265618, 1058528699, 2552064976, 3988743847, 3838835032, 1602322011, 868102294, 726205922}, + {3490364313, 1682734101, 1328698766, 3056465906, 2844029492, 1755394671, 2896206636, 743353777}, + {2017541599, 4194661938, 1044380563, 628198274, 1965676232, 4205238257, 3319329476, 447655400}, + {686254453, 1107365132, 1957201750, 2471025119, 4195549802, 4211474962, 1267912361, 797556761}, + {3493885589, 3072107104, 1877405802, 2746345178, 4117435152, 474382917, 1599874355, 405332007}, + {4211697613, 1015744671, 793250876, 2404808756, 552076098, 1374578302, 1312715992, 209799213}, + {26772588, 2569569615, 871622801, 2535039090, 2459203671, 3987528618, 2100717927, 63239838}, + {675511, 3893982734, 3359119182, 3659195290, 981419420, 2380406517, 1354552512, 558799732}, + {1802645212, 4276123891, 3716652701, 3087596775, 2940891120, 4060568546, 2460386504, 218195610}, + {1402377956, 2926687580, 1141488894, 1833661823, 4068058122, 2422026810, 1861053137, 55564050}, + {2561439004, 3589302498, 4278354771, 2760506911, 2485485381, 1212999425, 780814677, 738186132}, + {976044468, 2320501313, 3059711748, 4153768708, 269258707, 1399039295, 665202609, 322804660}, + {3265409871, 4094622547, 344367927, 491389972, 1158439644, 1296279667, 3924848117, 385619225}, + {693790876, 2934193533, 1561285527, 3105502301, 4180977287, 3033478445, 4279292752, 787722893}, + {4224401439, 3175227993, 617513239, 457027841, 4030698653, 1816450574, 746124986, 657539150}, + {3121650910, 2846396407, 3822443248, 1434213221, 2078598085, 1249940458, 951819284, 239252510}, + {221914756, 813519342, 1645104741, 2415654059, 2377050516, 2650764508, 2290454486, 252003767}, + {715502223, 634531822, 3978989673, 2962630305, 1295833879, 737519409, 2250658309, 485425423}, + {3345543558, 147667313, 1444930241, 3786340393, 3112576191, 2552686221, 371511617, 33741038}, + {3819498177, 3700690306, 1057368050, 2881311417, 3538098244, 2033064374, 3002754755, 729720316}, + {2359190671, 2843646197, 511926196, 645077792, 4279973399, 2782058836, 2884283441, 672131918}, + {623583635, 931567025, 3778883078, 682313268, 28485661, 4187010247, 1553458367, 782335725}, + {236910976, 928710544, 2525950542, 1098657414, 2941819388, 1127873833, 894020196, 430322922}, + {2463827968, 616390667, 2991004569, 1592601209, 996946700, 654018048, 2348195968, 502148005}, + {31109809, 64608389, 2893203549, 1107331534, 1551391460, 3948579942, 3291211019, 44882792}, + {952164157, 3292091952, 3978650001, 2945840712, 65538748, 3106842066, 905817620, 297110806}, + {2452617628, 4034014421, 4050189010, 2750632063, 4214561776, 4033346207, 965362618, 516194619}, + {1064095749, 14886879, 2034241024, 1371896806, 2780050824, 255263072, 299675143, 665206809}, + {810623257, 1864314046, 1157534395, 1405695129, 432469242, 2733725966, 789887055, 639020524}, + {1311081811, 4025150778, 1617621518, 1406411645, 2004599739, 1948936917, 3561005711, 759938151}, + {1452171496, 2421345973, 1422103289, 66316978, 1372589087, 1014498432, 4071784861, 150213468}, + {438021311, 1456432206, 2489358783, 2545708400, 2614083501, 2102103258, 2493133380, 363251049}, + {2711022086, 2879364378, 2868735020, 1514200304, 2944304220, 1268251087, 2631614712, 10014848}, + {2231531226, 916866170, 231772764, 744940185, 3443137589, 2931639304, 2879299299, 134928447}, + {266316211, 3604155406, 3352126798, 2517227827, 3927711173, 2802786075, 981882905, 428761012}, + {786179076, 1769923701, 516353315, 3180962694, 3271820608, 30406303, 3594500813, 747929716}, + {777105115, 1899183900, 667914372, 1457129238, 3328815325, 2590359622, 2488009536, 517430037}, + {3832435548, 198596644, 3332590007, 2502610763, 723334805, 1672151984, 600362221, 553727923}, + {2286087921, 438921094, 3421468657, 3914864890, 1716870811, 1387006600, 3248947837, 680567759}, + {4142330258, 3499945506, 2281970739, 11194171, 3270321406, 3609870892, 4257049292, 411894761}, + {1345126191, 1556123727, 331697864, 4199702143, 688959955, 3176161250, 727774207, 82464625}, + {2982752070, 256117297, 1487434654, 2105033632, 3800193431, 223351374, 2780925329, 629929150}, + {1960693257, 3020833779, 1046945157, 278878346, 4188766876, 2190603088, 3947972175, 364021479}, + {4057471109, 1811863522, 1843814640, 26888260, 355417404, 3774309695, 2982373013, 757330582}, + {1012177191, 2117122888, 2417433228, 2457676308, 977927847, 1745646806, 1350043325, 472903411}, + {1509979540, 4058925795, 2229705044, 722297618, 3440702353, 989124324, 3645232002, 506244150}, + {1115651459, 732293533, 3908377613, 3825269308, 102874015, 3645719126, 1880878610, 631567228}, + {332458125, 1142700757, 3902658227, 3050335305, 2584701896, 1869835579, 1082891037, 421567409}, + {2177796381, 2957315610, 3015065024, 1873025975, 3320446940, 3303779089, 1777104286, 514593425}, + {1673926707, 838161885, 1433413100, 2393245630, 2506397732, 1319605316, 1860264855, 772459050}, + {4198116871, 732940994, 3224405840, 3565921851, 1976632750, 318845768, 2554362637, 658386493}, + {1907983310, 563710702, 1847409728, 3184351047, 2326648195, 2732066511, 2863999758, 584680395}, + {2328423411, 2730138029, 2256758981, 513858278, 2162374031, 1442026724, 2720844975, 163757041}, + {933431433, 467463603, 3756884596, 2036347316, 676045447, 100774793, 3892497389, 212647263}, + {1802402268, 1070122965, 3788376259, 3741405268, 2398347042, 1855474537, 4213042962, 383149432}, + {985070476, 3101590694, 4070232829, 3576361824, 4228424024, 1264264778, 1030485830, 675691507}, + {3185822983, 3852620957, 422052649, 1307616387, 2245157452, 3038538032, 1126109056, 212511993}, + {2679166157, 802770668, 3785219068, 3431528473, 3754136453, 1240746286, 1818522550, 592233792}, + {4277150444, 1897075938, 1331452663, 2734179863, 723890483, 55573385, 2430242200, 697338757}, + {3805263434, 1450622041, 2877552533, 1128170458, 1467243891, 3396501095, 2322397252, 84623518}, + {2196278955, 192795010, 3122787073, 2921536084, 1606757112, 3839882519, 1330546264, 518799652}, + {3248226120, 1063074110, 1325273013, 1142138594, 559043690, 744419205, 937016519, 653945724}, + {1061365120, 2511128479, 2997581980, 3133486588, 3289180994, 1920318911, 1217265032, 777851333}, + {3062331782, 1779682915, 410820795, 283812685, 4294334387, 1860452101, 2780847797, 669737746}, + {1613664239, 2271108972, 1384796276, 2289183071, 3947924579, 1149329073, 1729334587, 255329109}, + {319157060, 660735995, 3871551908, 79824831, 3862646454, 2963999647, 3560360119, 358954029}, + {2625628386, 784437329, 2905973074, 1253723858, 3360459480, 3150660330, 258506118, 664183821}, + {967441947, 1913932697, 1307512939, 1429802179, 1379615950, 794970123, 1047411669, 62803338}, + {3872350731, 415459577, 782522402, 2840257467, 3377651876, 661816146, 1632629114, 57757215}, + {3764597657, 1544843700, 525464775, 3426510382, 4126476969, 3100877925, 1211194497, 112467126}, + {4253300537, 3819059389, 1368750633, 468328748, 830081911, 1468706969, 2647404109, 487990329}, + {1813016791, 1483408797, 1534415114, 3860752788, 1524004946, 3931109338, 2582351132, 460034375}, + {1837409148, 2432513268, 3784665013, 1306098658, 3352097701, 3021886102, 677017832, 439460224}, + {236005754, 1749712099, 4178129330, 1775753003, 1178392109, 1053709817, 2647801508, 796970027}, + {3538288938, 459378793, 3002574359, 1544528395, 1609506868, 2587694889, 418937391, 666739726}, + {4178569812, 2440979473, 681076903, 3477783834, 1477521743, 3796988972, 3153413867, 17115417}, + {1439149648, 1644937769, 2884567031, 3500916308, 649643566, 2225785515, 1190131584, 181005474}, + {2536499159, 1815315390, 2691129401, 3950742, 1639747307, 114758579, 1979205400, 115929335}, + {282436162, 2997875702, 961785682, 253049464, 1436328644, 3463903079, 3148272643, 487809948}, + {1966215171, 3214604963, 3605283051, 1287206709, 3005384933, 2516623340, 2373653924, 93694081}, + {2958686706, 2732216336, 2974007729, 1653190516, 3689504705, 4108778136, 1902219089, 539809719}, + {245432450, 436579080, 861657613, 3421585074, 3562790929, 914658663, 2208032631, 693064174}, + {3295683669, 1153855205, 1000385430, 2463831470, 599983072, 3613919261, 2233267749, 88051012}, + {3323430448, 236707973, 539492632, 953033477, 3912802462, 65317092, 1591823728, 475375896}, + {2713501890, 2913267705, 705254141, 3480134322, 1754798627, 1944264126, 966994381, 445008580}, + {3934831783, 3117747375, 1294561247, 1924283368, 2761082764, 1775822982, 941642826, 733587779}, + {3674748798, 2609686518, 3310278728, 2206265719, 3054544578, 2507865364, 751011232, 778875116}, + {645417052, 3082516417, 3805895654, 2347335949, 3517118805, 3093519202, 2197930036, 57384361}, + {3604296372, 3884125706, 3098021264, 2157200333, 2730384954, 2498242803, 3643251890, 580530190}, + {4220515012, 2002525823, 487781201, 1534948768, 1787295898, 3422876605, 2091267246, 752979218}, + {3158406316, 1519824532, 3918750951, 3857420157, 1878759478, 4197781309, 1592992533, 449322726}, + {1339236063, 2982560389, 2935538018, 3878334679, 1226035659, 3396478571, 2874764482, 478125457}, + {1301985241, 3664972929, 3101843292, 3325000508, 48448890, 762417043, 1554042805, 247877307}, + {2727151629, 2579523385, 1581627359, 4124763388, 3919823608, 2615461716, 1378903827, 719056375}, + {2339124086, 2596678071, 3808098454, 4105231856, 1165206154, 3657717411, 2703578127, 672777294}, + {851401176, 891692485, 4114550078, 1064792097, 2964649173, 1624501005, 1242871086, 805159488}, + {1683650386, 292434381, 3990255596, 2743741958, 636452115, 1844938714, 3813910697, 371497676}, + {1661732372, 3537901241, 3793196095, 3492323549, 574051093, 3767852841, 2364415107, 799081786}, + {175299307, 1004192173, 4245010557, 1257380800, 1674789804, 1791990747, 158538392, 218131642}, + {2285156910, 2691954264, 2990530673, 57306082, 2511677134, 802726130, 3377419180, 400888987}, + {4233287629, 996832508, 3745182262, 530952862, 2461120472, 1274708697, 1374121784, 90685524}, + {1574136180, 2623502883, 2778113375, 1627422825, 391202864, 1759267347, 2091307810, 413636480}, + {114074142, 1779294925, 237814541, 2080865111, 4204502515, 3214858637, 19999136, 645031156}, + {3391760373, 71627995, 1697979332, 3777343521, 2802671700, 4254162849, 2042693547, 392319779}, + {3810150833, 651280532, 2475296915, 109172022, 2712324376, 1715732874, 458776052, 686453587}, + {3326164420, 1969828054, 3709531971, 3126721689, 3263142834, 3666565705, 1073293476, 23172453}, + {3986076018, 2167818884, 3220611007, 16522232, 830708824, 1850887640, 2249141627, 281625009}, + {2827056398, 2375585111, 1267214257, 4256169155, 962201898, 1977197812, 1235362612, 181464461}, + {233222763, 3134826472, 1220295653, 3463579454, 123685174, 3384874761, 1842931939, 367147323}, + {4027675605, 1897745071, 3574244036, 4132901103, 2992924023, 1017151477, 3553680041, 456651345}, + {976045846, 360246489, 2345505770, 1197193506, 3691385704, 481103099, 1408647058, 601514059}, + {1352536780, 1165947173, 2338111708, 2140113822, 3388966976, 4242622409, 2566726989, 800175220}, + {622406413, 2191399343, 20909085, 2104722296, 3921418727, 3006211145, 1098118919, 772819332}, + {3752282992, 4153396093, 1093940071, 3231647803, 2061204976, 4237986825, 3125456229, 360666073}, + {1902203594, 2166431520, 3048448267, 4211633469, 422655533, 362541296, 2833196022, 30540078}, + {3459070135, 1154925361, 2146451569, 439634125, 112215718, 1555750314, 2075602375, 268382398}, + {4170827129, 598651121, 4112051400, 354042198, 117519605, 2044834039, 3795286321, 672532677}, + {4293660292, 2559363878, 4004914935, 1954243110, 33908540, 527427480, 395512379, 666638774}, + {818922970, 3367963153, 2607019618, 996712250, 577400586, 1995154870, 275719667, 486179025}, + {303584541, 465768517, 2502083621, 1721434987, 2784685421, 2550119625, 1539026912, 768510999}, + {104843407, 456529531, 112272682, 4187763063, 2481116118, 389558599, 1211000147, 333081795}, + {3237053209, 639935465, 3269068147, 4274778399, 2996399176, 4203397644, 3808926858, 310319738}, + {543623432, 1078382120, 3788202836, 3096883067, 2006014732, 4001349400, 1785575421, 38712823}, + {3741321815, 59773016, 1650480602, 2790931744, 3436991714, 406874256, 835224126, 441554910}, + {1010116927, 3471287112, 1812466377, 1496568199, 3859844609, 3734770730, 1369915818, 1265657}, + {1080084107, 318001873, 2468738387, 4030010816, 73637460, 2688831557, 2318454267, 19914279}, + {2601959709, 3291684887, 1066143751, 215908331, 3524433531, 3669491488, 2602907859, 347340664}, + {3244669970, 870805674, 560008717, 550804583, 3448806922, 1331183860, 132817773, 374002581}, + {2893433304, 2589969971, 4199235823, 3607803569, 1972424004, 323972558, 152703836, 382520726}, + {888344433, 986947428, 1060685036, 3674232248, 2339077780, 1639123173, 4091389545, 67106784}, + {1333287312, 853197348, 249162074, 3161806107, 304522208, 1217603918, 1261890695, 773554804}, + {2388409933, 2501771242, 4284412482, 2014078276, 3755441530, 2016971399, 1936770745, 774848229}, + {509351475, 3457999243, 529792978, 2898392932, 1562217615, 3053563299, 574758, 517854749}, + {3998584973, 1878529287, 2715177727, 1224861009, 3089556237, 1474966339, 2869292964, 138958148}, + {3898301781, 3121745376, 2037278272, 1781436223, 306997564, 195781830, 2604338968, 287203504}, + {2829280039, 2058343536, 1977136684, 2904169253, 402644809, 1269671536, 1516044912, 49302678}, + {2352051521, 2680721609, 2727172665, 457099007, 1714528736, 4175463365, 2814167478, 656271669}, + {2834143746, 4001397284, 2293706075, 4007020827, 516962725, 2366209892, 2893036507, 696268803}, + {2116307717, 2041508147, 3306032831, 3380323936, 1092765598, 3151903391, 2003009443, 670127158}, + {2833968050, 945399766, 407055707, 851683248, 3408848763, 149279622, 1250062652, 294921286}, + {4026617399, 695954513, 3005400715, 260079381, 3135449838, 529626207, 21167673, 754190034}, + {19474035, 2899143989, 910198842, 2460343492, 1293439826, 3252727240, 3066595482, 806138106}, + {1466433759, 3510730148, 1387699631, 3604433846, 154722009, 323640705, 1547420357, 567790081}, + {2642538324, 879830785, 2584661233, 992548227, 3246121605, 1296199364, 264170527, 675930166}, + {2052868032, 1635031521, 3429119673, 2889866729, 2145250315, 3922438947, 2188623204, 521140894}, + {1738418046, 2409370135, 1294310241, 716789092, 2926307783, 1153688666, 1566764867, 486250524}, + {883592693, 1072520719, 870212207, 4157736859, 1200625497, 672712276, 1547325327, 219171536}, + {1941707668, 3211688457, 3230982467, 2536976061, 1459132304, 3724450953, 2535995053, 573388396}, + {2130886017, 1656793801, 988581291, 2058822212, 3397227003, 1890819646, 3580844968, 431061421}, + {2282216265, 36210372, 4057221378, 2824471251, 4100601922, 2613564575, 2911778022, 685195463}, + {889613783, 2209885933, 1131300794, 4125497290, 1433496892, 3196926123, 4027358647, 115683322}, + {1370581586, 2448227851, 567913656, 703270061, 3567129725, 3110423012, 1948162531, 319872974}, + {1384964423, 3334379336, 2375366035, 3683663757, 2510927998, 3971904043, 2829263912, 35061189}, + {461203792, 2299166222, 3109432937, 2004704915, 1523931881, 679452364, 3078778768, 560798853}, + {2636733587, 2141120890, 4009861382, 1212306808, 3611601613, 1866495696, 2663117565, 12755265}, + {1094754769, 400861220, 3204264895, 1523157390, 1385367345, 3640772357, 1805894043, 691803154}, + {3006790355, 1227864345, 473501853, 1050840399, 1148728769, 3858381821, 2719804355, 790572343}, + {2334077262, 3868453146, 4065996821, 1243336349, 1769912796, 1370255972, 1723978255, 797728569}, + {3832083753, 2783287439, 1555099498, 1382315713, 2435136441, 420044856, 1165601970, 736795505}, + {3977777209, 2104378342, 1171628315, 2881610120, 3767263625, 3623842061, 1160101635, 563129469}, + {115144535, 4243993188, 288742061, 3859409724, 899401117, 1161121382, 1582540025, 270277378}, + {3514122052, 51520497, 319622437, 2821340513, 3888417404, 2679250485, 1867915990, 284764406}, + {1837893561, 2102372510, 4276665919, 1136629789, 3967345275, 1997964639, 1099524168, 699747376}, + {980323285, 1354929829, 2058495579, 3514979641, 870109111, 906425432, 243658862, 682679331}, + {3360454496, 832134167, 2880283143, 2696134789, 2263416279, 3693002382, 1490275583, 233396907}, + {3833251520, 3097188018, 816068685, 2851931731, 2556425150, 1596903221, 2940496387, 606133325}, + {1731364937, 2999584069, 4179085212, 4102383977, 1753518417, 3146995693, 3912418491, 32102811}, + {3912599309, 733494215, 1170503393, 772727521, 3629980979, 1299362222, 2009186869, 607796444}, + {749269678, 2378271393, 306599333, 1999023827, 2383366716, 3368714950, 3318093133, 632048291}, + {2434117695, 151271185, 4193064776, 372099043, 2132436806, 4102837785, 1008730273, 200864214}, + {2206402204, 1699779656, 2670943607, 2401396857, 2524389958, 2128490726, 3887754715, 182259659}, + {2841849681, 2926017867, 2296019195, 3133153959, 2410088948, 189547912, 4141956055, 765293207}, + {3536304972, 240839497, 1206495475, 3876705763, 1238911663, 900468522, 995333840, 119330672}, + {2621459861, 3797954893, 585219282, 199743896, 698864978, 1282375985, 596194810, 355958196}, + {3021175397, 211592522, 1673782478, 58726989, 2973989794, 2544771074, 2318381320, 574486674}, + {3054492940, 1485289700, 2433164809, 1813389576, 883508782, 2661416453, 3079814721, 23213100}, + {1559703678, 742668686, 3466459550, 737840845, 2979768746, 1914567423, 3814618388, 145684224}, + {707970329, 3120067913, 4264117350, 67458286, 1060088854, 380395119, 1239761565, 737262170}, + {1550893834, 2356920896, 1315248231, 252031369, 1690232905, 2827759945, 2972790684, 369674619}, + {2626172210, 756071568, 3341309729, 2270773371, 2045609388, 3095247123, 603926665, 725656732}, + {2166628560, 2918375503, 1737039560, 420198087, 934432294, 244050916, 3209372147, 200036909}, + {420274586, 3464988436, 321318123, 2677663986, 523362419, 2399430305, 3049346663, 166461846}, + {4103841840, 2163392666, 3210173394, 3749861468, 3657755402, 1609967297, 1301177400, 143523407}, + {3304090438, 534986140, 1267368642, 3439098827, 1154894860, 1294657457, 1954429717, 118409727}, + {476665396, 1177868885, 3373809122, 2520901478, 2649330363, 2379435637, 1466619822, 661059867}, + {1924466466, 2994731347, 3692893525, 1689946896, 3546445097, 4226542711, 3015114478, 16782163}, + {1120145626, 1130121865, 1969822828, 3978589285, 612726215, 3803487244, 1926023546, 631984993}, + {1979975518, 4136512185, 2969261772, 2434196265, 365522018, 1802675085, 404441904, 32174025}, + {3080660647, 3973780412, 214381860, 90351777, 2679178747, 1780061434, 2714185994, 566493335}, + {1641729785, 3702126599, 351556288, 4166940606, 2119460071, 2162842889, 4251073808, 448396048}, + {3386871666, 3056414401, 3679209819, 674424324, 1658307487, 2983070011, 595610203, 535126756}, + {4194950213, 4109758267, 196359121, 832209294, 1229256721, 3625724099, 1758491134, 267824475}, + {1773187562, 2559664520, 2827005447, 3594999416, 857993535, 1427766684, 3595558773, 647123390}, + {769207763, 1294251016, 3858659266, 1905754251, 1804771774, 1429481580, 1848420240, 690860124}, + {236654488, 3780245311, 3300008852, 770451787, 1339549026, 396102962, 960096798, 505951319}, + {1437297671, 484459077, 895064827, 1043115759, 963418274, 4124029137, 1827681315, 810703393}, + {3993803408, 3639688973, 2712042357, 1641359170, 3526658629, 1894081400, 3566855191, 572422285}, + {1351900586, 1647101707, 2714163579, 70058369, 1491147834, 2218384726, 392877203, 91527786}, + {3908739591, 3547073020, 3506103676, 9255169, 367687146, 3277730283, 332851626, 658112961}, + {3992173089, 3336442561, 1308396561, 649897492, 498165515, 3791375902, 2476925986, 166550078}, + {459056695, 623862782, 2614682674, 252535114, 3957019296, 1669629417, 984578888, 559340348}, + {2109892813, 451411526, 629769236, 2073144596, 2706225876, 2442347888, 1930125614, 380876630}, + {449505088, 3925975612, 1781015135, 4019613773, 1244709664, 127258707, 2288182483, 261056249}, + {3198234408, 1445083148, 3203128507, 1896655444, 1800546621, 2549859473, 2674270289, 649156473}, + {3295645402, 2355403471, 1325138283, 3282236760, 186596910, 2986676413, 3091222690, 94039058}, + {392637966, 3835592021, 3395063270, 2338880248, 1307091009, 1413969228, 338356697, 110506024}, + {3927456635, 958780881, 1467123914, 800350251, 227030894, 3222995683, 637808892, 417233380}, + {222651616, 918333206, 3341359148, 3888995981, 2112943295, 3132575683, 3136568383, 747036429}, + {164100597, 2717470589, 3005641886, 2298299462, 755839109, 2812607434, 587384279, 171494897}, + {1517929317, 1746459810, 2292290049, 2118474457, 1444780887, 3288565786, 1138377533, 658116309}, + {2262800921, 2989467931, 2550042218, 2759452136, 3245301798, 1334600974, 2692828723, 515277997}, + {78686128, 85661778, 794295383, 2445409530, 1241207645, 1006634767, 2353102965, 424947616}, + {656251673, 1874858842, 3408697434, 4156867126, 4201355402, 307527125, 2984164150, 448562967}, + {3363516191, 836987291, 4041445533, 1038612888, 2378587132, 2004574365, 3034242698, 286317830}, + {2805641958, 750951597, 3379512708, 3048328768, 1158225610, 3137201145, 1413602757, 134922947}, + {1988814965, 2229475393, 2846407915, 334194828, 3607660995, 1081466899, 330489579, 99696095}, + {887137534, 610389082, 2015240627, 217466600, 3032578167, 4036110357, 2733875635, 8559943}, + {1953585854, 2737811591, 1248580326, 2914961395, 1140662723, 1554042825, 2875695471, 39247110}, + {794694455, 3919208665, 1559681874, 3272467149, 3245086200, 823169114, 818446518, 204009539}, + {2413464253, 820347123, 3595161951, 1222162452, 3008804785, 475163524, 2801010307, 55259462}, + {3783141420, 2480101165, 1582568892, 4210315390, 4104626394, 4170508678, 3521839065, 466290234}, + {4155507898, 1768692973, 2294318387, 4251134624, 3860023484, 2962944097, 825358892, 409963745}, + {2353340423, 2928779692, 2350920335, 1125003106, 2546264946, 2037086586, 3608413239, 349680431}, + {407691513, 3087008438, 3650107171, 4228010293, 228766680, 1006018908, 3899374162, 279155770}, + {219192789, 3767885343, 2001122128, 2993521540, 2040536466, 1510197515, 1949552358, 767891567}, + {4230985990, 445223622, 804925595, 32198490, 1699132452, 142946580, 3433820756, 151985030}, + {703663283, 4189294278, 391930560, 3073123820, 3810720461, 3728991122, 703072198, 705452638}, + {423838023, 3175580039, 3391238926, 2182607534, 1029096987, 2098442190, 2029684938, 506228035}, + {3486373622, 844799641, 2737997276, 101229479, 1633921456, 981779705, 3382045385, 471489862}, + {111345089, 141258419, 3035810727, 781599895, 3818721457, 2727854618, 836710756, 724712374}, + {753103137, 1612061402, 3135427825, 2024323365, 2683080252, 2322551836, 1358841983, 574105519}, + {3726776850, 264764526, 1269886327, 1646952963, 20275953, 1382351286, 3784024275, 417874095}, + {2179226830, 3961776262, 2865979297, 92406850, 1687861619, 1374033033, 1340829681, 330485254}, + {2198938516, 1594227217, 2374846273, 716624411, 315917975, 338168015, 260297398, 803884775}, + {3841490074, 1338963403, 2129573580, 296104270, 4005429983, 4152105754, 528035615, 534412746}, + {1109555456, 3630041677, 3747570039, 3733596972, 3092097551, 4101759470, 2766565742, 241058909}, + {3048972783, 1694224088, 295738413, 1621033207, 2752354468, 1577257363, 659188436, 262502991}, + {3598137172, 4026580695, 963308414, 3715504869, 162412690, 554465723, 4084782609, 326385603}, + {3149839252, 3897546728, 1721301002, 907560668, 3628415729, 4213042357, 3551649340, 750530208}, + {967736301, 1541097463, 3323544789, 589126928, 1066106088, 3926824621, 1489210414, 656688557}, + {2859895609, 4108112351, 318398405, 1050973942, 1960040445, 3272778186, 4242917146, 53520559}, + {2463115043, 3682974011, 1675118986, 2407604338, 1604446710, 3678649599, 4139129827, 432224355}, + {2892117449, 763150191, 1646592920, 674361446, 1626273500, 1714244725, 628655514, 119634681}, + {1753810191, 3668520057, 268978019, 3915204722, 1748217241, 4220898233, 2960053943, 290063457}, + {1581814618, 1288345474, 2487733488, 3752277535, 3629701936, 3651800341, 191495295, 65841960}, + {1021785467, 3001485381, 2914813443, 2687082178, 316220049, 3350235890, 1792759262, 639331636}, + {1999155496, 2861574098, 3565835920, 3383637044, 2640679988, 1701009788, 3978738595, 629881500}, + {3576887499, 2858985401, 3057276430, 3943970005, 1442941420, 3113039531, 4138906732, 195995980}, + {3553265057, 3765310733, 3625003704, 2029635544, 3957195639, 4273692513, 2555373447, 796104110}, + {1218374465, 1004886271, 3612460042, 1254301878, 1436363718, 3857000326, 3288797569, 544729442}, + {3147490267, 1127153850, 2811855210, 4184757225, 307947421, 640573867, 1031370664, 422267483}, + {3123014141, 3637820530, 868506880, 398291333, 2206404996, 1717792389, 1186050625, 714964984}, + {475021199, 3980389072, 2273101817, 3483182088, 407824675, 3203202198, 2995341796, 603013862}, + {3255501208, 4180335838, 4130718870, 1868225028, 996835541, 4293145478, 1711409294, 513725770}, + {494651647, 3242190711, 1566878708, 3966128491, 3854568623, 1290688946, 3252305120, 766060991}, + {2536171991, 2410993866, 1048336183, 1251794303, 1536371174, 3008064187, 2762500481, 465960191}, + {2023422795, 195932611, 2923732356, 4226053825, 843557238, 1906300230, 3773618072, 438839912}, + {1879468987, 2389910308, 3036200284, 2542474822, 838533435, 3151626838, 4063954647, 686742006}, + {3126296014, 760885103, 321088415, 4160052874, 2210614465, 424252582, 1846101238, 277787666}, + {2723352910, 1206886279, 2856949077, 1055442701, 1705415512, 2663334378, 2695861183, 270252188}, + {79462021, 1260747989, 1821575231, 557163641, 3711242421, 2285626455, 2027826796, 199232937}, + {2378785532, 719805778, 1449270953, 1267259818, 3577856225, 449427969, 3434205615, 361615766}, + {4270694082, 1396705645, 3242670818, 3967403042, 2393807008, 3544337696, 211661933, 661481207}, + {2751940218, 3746316717, 2750860763, 1749573481, 2758461806, 218506675, 2762407050, 362041363}, + {3114948274, 4169048040, 1267564544, 1804914662, 449251388, 1100660447, 947407107, 107737151}, + {4287071083, 4172871887, 1949821221, 2794860551, 2481492500, 4152523160, 3416060035, 292894334}, + {3792891403, 3128831891, 4226581646, 1173894036, 4193131188, 246395420, 1468347249, 725784617}, + {2103815370, 3734213562, 4210740217, 2794613289, 52312269, 1274016216, 791570238, 348997715}, + {45656427, 1785646781, 1395583357, 1871653982, 2367617401, 2452974550, 2561791707, 498225694}, + {890459953, 1559001044, 2884613559, 3187617117, 1830058456, 328948286, 123255004, 777260221}, + {2293299492, 2384872896, 3805581997, 1613762895, 1528007693, 1510116072, 2584686863, 212597834}, + {10610884, 2532378322, 466693455, 3124320697, 2287161132, 1908747670, 3586807404, 587369743}, + {4090571063, 1527205810, 3666893615, 2008281617, 2640856647, 2010916748, 2303375037, 625765724}, + {2753045775, 3864253808, 3128753931, 1614406511, 3969887838, 2496700599, 2069064881, 793687198}, + {2533187349, 765580433, 2649767742, 595306028, 424170037, 1051747750, 3051117874, 323599420}, + {263590036, 3450290652, 132744796, 2652509660, 2169093466, 2640595640, 3634039328, 572331598}, + {2881996366, 1959192279, 3620818013, 3192088936, 2578127064, 1071702746, 4145183464, 657861858}, + {2383040855, 2392156988, 482563713, 104461745, 1774946801, 2019055646, 424368308, 590508495}, + {3607742222, 2661424510, 3524715224, 2394303856, 434824238, 122064149, 1032876259, 402791940}, + {3634688335, 2901570247, 3095127443, 1083227470, 3257931247, 312689965, 2206127489, 219145063}, + {1584905775, 3107849202, 394680275, 3209823947, 1044671308, 3927839469, 2591006949, 169905389}, + {1607449497, 3496661495, 2817252186, 1495090892, 1329713306, 1526076562, 1689590997, 495710039}, + {3760997799, 1058506459, 2022981311, 1093838852, 1586441854, 3959171519, 4281405964, 532192867}, + {779208410, 2928661102, 3699846110, 2846407318, 1158998832, 3404731551, 3670637705, 457816567}, + {2961740982, 3536420115, 37732267, 3902579597, 3509195979, 198374051, 2748549079, 520181950}, + {1953048490, 1209808987, 3280351672, 2033623184, 2993866757, 1964073286, 1122682577, 500997153}, + {2688605206, 1835350361, 3723411303, 3278251141, 3056835100, 1686393268, 1160230683, 781759021}, + {1737869720, 2312844529, 3244919968, 2147043098, 293840071, 2858800424, 2064917810, 520821093}, + {4177032805, 1971150452, 1637674286, 2688247018, 2389603250, 1139831252, 1024731682, 377205546}, + {4170621378, 243912988, 901863927, 1236460471, 2248986006, 4099401238, 134149372, 676976966}, + {1641131275, 2170678768, 1955360090, 1838444204, 1029371479, 3646171117, 2275769588, 328337224}, + {726431465, 1267442720, 3977190876, 3207520462, 2410698818, 1433254284, 2543978553, 473372354}, + {1515027088, 2896930843, 2777722780, 4066994467, 590158871, 4027595267, 2499658573, 74885790}, + {4285553417, 3803221737, 912847556, 378453142, 3444240000, 1495289727, 3089766347, 229494726}, + {1488313164, 3699472100, 3829462965, 3323033477, 2859096767, 2384302314, 3801165529, 709542059}, + {1333507551, 2810133351, 2961825840, 1945584490, 2841118144, 3987938199, 1723814010, 614470248}, + {1483867499, 1953347284, 4231203002, 1767459807, 1785844729, 3126894815, 2521271277, 211406145}, + {1750640192, 3781311437, 2011709804, 3652525210, 215547163, 1184592567, 1410906485, 317588124}, + {3937880254, 340593151, 292753764, 1635734566, 2558768140, 49836033, 3539551588, 258755506}, + {2922310811, 2947117884, 2353044107, 3433276212, 1100984239, 3129723382, 3015812788, 466684063}, + {1010187419, 3625972836, 706819070, 3354902000, 101712681, 458190047, 3162242991, 578573356}, + {4187914026, 1992063546, 320280935, 4143572431, 452688662, 2570405289, 3121885633, 754593945}, + {4155080905, 190234870, 2176195649, 1064166934, 1607874844, 3059603520, 2492697053, 646393760}, + {3276410682, 2649765828, 4153961468, 1785336012, 262615884, 3105410592, 2023472520, 454606370}, + {838949062, 269010620, 866021794, 3733688614, 895197311, 2904159008, 1016730395, 753016278}, + {3374324695, 2723374257, 1847468830, 3969029342, 3566588774, 4171913911, 3107658241, 204579258}, + {654737474, 1502636344, 3529693390, 361301430, 2038830967, 3713816515, 1088048145, 266675138}, + {596902847, 2873743237, 1840854534, 1929783728, 1719866073, 3758894980, 558055233, 639051647}, + {2687616012, 2133798799, 1129311550, 1422858850, 100429944, 1216469588, 3006114955, 259849252}, + {1944227698, 304271038, 2443562904, 559480102, 4226708480, 331698087, 3526679844, 443950694}, + {3881062627, 2461274610, 440532830, 2353972927, 2114056858, 488443974, 87294917, 563538301}, + {2933562738, 2045853088, 4239934930, 3377060492, 4229089218, 575917746, 2992431740, 529027484}, + {3712706901, 159515225, 3945317584, 3766345869, 2865365948, 1543385385, 1496229209, 541913543}, + {2833556792, 2239174190, 3112295800, 3613740607, 2224869719, 3151053274, 3038879903, 765936810}, + {3188050821, 3223157776, 1652131325, 1398980979, 4012267902, 678088332, 1040247410, 284297465}, + {2813297565, 2753962057, 4255847231, 885145294, 1068483949, 2535613267, 1036733152, 769989808}, + {1472053183, 1059507492, 2121563900, 645113184, 425229974, 3813934159, 3698631681, 393393416}, + {2231823614, 4288619823, 4183888766, 2143048475, 2033398203, 4137216846, 474980981, 158973077}, + {388874235, 1603655297, 960722053, 733053333, 983646706, 3129077198, 3063061810, 532436421}, + {1052022473, 1432865711, 3606925682, 347187403, 2262685796, 1747850860, 1704181840, 292585337}, + {3019146848, 2898917751, 2308083045, 2274766448, 3853700662, 3333095553, 42468480, 793128383}, + {2344953220, 1970726924, 3364353190, 1566113672, 1198734447, 3921342124, 584763991, 764644815}, + {1156650814, 2514049934, 2194307957, 3194338911, 614363927, 2469800193, 3045830033, 307765066}, + {3583204479, 3765518215, 1193918342, 1846304647, 455458735, 518402975, 3783955837, 517534122}, + {2515124134, 573098382, 302165857, 2065117337, 2830449813, 2961866049, 3257157670, 287381190}, + {4062962045, 1593332989, 612011135, 1651818477, 393601840, 1679844539, 1258865608, 747051370}, + {2633578676, 458064705, 3232298455, 2762373638, 3378590501, 4223033509, 2002706206, 18854498}, + {704432927, 162855354, 2474601351, 2118097717, 2887845451, 1768648528, 2454817652, 745337502}, + {2131802434, 3236476564, 3948679620, 1264997775, 324824050, 2329235106, 2229282883, 395563985}, + {3576318966, 2702347439, 1548569274, 3911503746, 1594754997, 428037284, 1885280498, 221206771}, + {4175279474, 884560925, 1788293510, 4071390431, 1329278600, 75537910, 3986062653, 611587817}, + {4064165595, 3898951831, 463754301, 3876512408, 4273866525, 3656102064, 2864263282, 426873454}, + {2879487725, 4148772898, 3525294332, 902076201, 3821691807, 1187586141, 3380537603, 188586101}, + {2821300855, 3309535260, 77666608, 1553427423, 1430614226, 3789461706, 3238318651, 567891539}, + {505131892, 1765279724, 1023233775, 2717054149, 988157757, 3930370357, 3951410328, 641401394}, + {615300106, 2469938500, 2962393877, 870763254, 3939063940, 3551397902, 3066339408, 166771864}, + {1998102849, 3578856002, 3062802516, 2352178580, 2586633144, 4216494320, 1057061446, 583850163}, + {3157186817, 3462841447, 1453316416, 2878583454, 1850321470, 823183120, 831594853, 443179355}, + {3889695290, 3514048590, 3678345405, 3142461864, 3918330486, 1555565297, 1554186501, 460835257}, + {1976857203, 2270745386, 1040432684, 1719737178, 382840304, 975485366, 1339329266, 665715259}, + {1775719548, 3865921570, 1767511131, 284475597, 759000998, 2144381137, 405980571, 316308704}, + {333279683, 4154982400, 2725563020, 1624645192, 944537969, 4101796849, 1029516221, 188337419}, + {2333139764, 3370196244, 563990470, 1820343606, 1090570134, 3740057214, 2975044526, 48364264}, + {3893895884, 3415761288, 3602051122, 4222236815, 1818231542, 941030641, 1278954250, 479811509}, + {2231534561, 3001246003, 1735061971, 2367944438, 3339590515, 1525437574, 1772871571, 55664520}, + {3240991257, 1720977498, 2854283005, 618745748, 2769124500, 3453837600, 544147878, 185774213}, + {785912344, 4084408394, 4019935678, 2296140680, 1079312541, 2995946870, 337417386, 569117688}, + {1328461810, 4191446592, 664848689, 1835179220, 3844355132, 3927458525, 4291487626, 752901006}, + {1277986734, 3322459265, 2495791135, 13850161, 3322535780, 4255664143, 793736052, 590577308}, + {3943148876, 2051656845, 2378297305, 4210853378, 3025210259, 3347745040, 1829002822, 783552257}, + {390419450, 3182827290, 2074360823, 2212996980, 23849683, 4056760166, 1169573170, 808114955}, + {3116733479, 1954047770, 1307518808, 3579783916, 3833903932, 2558661739, 1641988891, 337001632}, + {1749964295, 3295770248, 1427336572, 1858592335, 1547305083, 3381883637, 3866929566, 400178036}, + {2916624080, 1249061717, 3993119010, 1762822762, 113203435, 4094737116, 3823783515, 466509000}, + {2326969558, 1953546445, 3634818439, 3363541076, 1716388780, 1654036887, 1310528587, 252006596}, + {2289710152, 3021754479, 1730561176, 2846608204, 2798838665, 4160992944, 1922020958, 334918675}, + {724068395, 2465547105, 2372702828, 2089797142, 1859306007, 2258006400, 3820751022, 8701719}, + {3680022841, 2936101336, 2805403885, 1230409280, 1298919872, 3980936177, 3165818717, 632281219}, + {1108813842, 1529004848, 1435981486, 2383497343, 1683386444, 3404737480, 27217618, 389214686}, + {1246270380, 1081021534, 3993167693, 2321702841, 3206139467, 1077029745, 3689164032, 306354043}, + {2972739279, 1430941099, 1949027652, 3632963640, 3096599524, 3940218869, 2005778595, 152490874}, + {642313713, 1588205479, 2202447625, 3555420126, 1332047067, 397194468, 3101444271, 63198304}, + {2712591838, 463230492, 1736923331, 2262259706, 4079194129, 519762708, 2389448711, 191869879}, + {1010112216, 4074559936, 437507855, 2817966447, 309413913, 1056451302, 1544301510, 423694381}, + {2447684647, 353285705, 1630251037, 2247712057, 188089176, 3081771499, 3093769200, 111203951}, + {1845044945, 2751831662, 2127410111, 1676568744, 2444385139, 2533268077, 3071493561, 364304881}, + {768848928, 4047482701, 2313239223, 4088071841, 1554969192, 1338493465, 3813724622, 346200299}, + {762098228, 1802140065, 1935378433, 1046154865, 1015776313, 1540601332, 3200690817, 82575765}, + {2223434198, 810391443, 106467804, 199497911, 4023827662, 2434945129, 874060001, 43411220}, + {3326223251, 2453943490, 1072352610, 134899467, 3228520702, 2886014882, 3533451751, 635142122}, + {148067278, 3849793796, 1600918789, 2781381503, 2067614842, 2161297898, 3642845673, 19748983}, + {352137065, 2535681309, 2338842367, 2397038445, 3179990199, 910260913, 365118543, 461936801}, + {3497302643, 2522412225, 2607217554, 1687795322, 799990799, 3041497219, 2743180658, 526588174}, + {2813321992, 4143580317, 3893942349, 2911544102, 58629387, 3093601204, 2055075336, 767828076}, + {4105354486, 2702336913, 1788403540, 69655812, 62188473, 2429577760, 1233762464, 441346868}, + {844784562, 195609859, 1449041835, 1486003536, 167369675, 1315214301, 1441535468, 695614857}, + {2932736788, 3222416485, 2368387989, 4195082025, 362530313, 1573932379, 3672582354, 173832319}, + {3972966602, 595744667, 117760213, 2429534433, 3155285528, 4051804671, 2647605051, 623156566}, + {3980114729, 1805359466, 2830352545, 909015755, 3880539667, 3047597358, 1833768029, 339607866}, + {765854896, 2846519464, 1416701728, 2205369739, 3088593881, 3906615622, 740942203, 358698089}, + {3330723199, 1083917670, 3884187274, 1533435129, 4076093059, 2400081539, 2913221579, 142782587}, + {3825153612, 195340656, 3582781097, 3622898193, 4164350212, 3700559870, 2046768656, 176872487}, + {2519218607, 662520611, 2152613548, 3458649612, 2331323669, 1044841133, 2182768561, 645399889}, + {1588635225, 3146516964, 1998150457, 3622609531, 734079935, 1145307997, 528855551, 311164367}, + {1219649753, 1306224645, 3600785293, 1467385037, 2546088316, 927995014, 1340442086, 606143243}, + {982948500, 2659135970, 3999371596, 4062615605, 1808692872, 1763199750, 822930879, 692394653}, + {3020663099, 892531167, 1917753725, 2473653846, 3141217202, 1355444419, 183309836, 167173443}, + {876955032, 1899560163, 916169092, 2564924460, 2456650772, 2906616833, 34191021, 751061730}, + {3215882789, 2209949203, 2568828409, 2122601557, 404690685, 3324595595, 4277444064, 620873853}, + {1823661598, 1948505978, 4167209663, 3198966470, 2052432795, 25764451, 3324616385, 601538950}, + {91879216, 693331263, 283833914, 4087429345, 857511747, 146178823, 1229666258, 148314651}, + {1231906121, 2534780445, 281267165, 2829574385, 2932887470, 1665154883, 1943828643, 93832301}, + {1795207740, 2484474985, 2555113195, 2410987365, 3152437313, 3463795128, 1643135544, 430084260}, + {1000638969, 275446079, 816547152, 3545120568, 745240703, 3328071895, 3278487094, 598245579}, + {3795381280, 3659445935, 2352658713, 3282320010, 891376391, 3823419244, 2438249575, 180619469}, + {3350423418, 3915825200, 3127532303, 2038598857, 3052982888, 254895303, 2101185106, 390417763}, + {2593711612, 3760863893, 2262449873, 34562974, 4181851627, 408742875, 1596013043, 338595203}, + {2214400173, 4173431011, 2697170411, 1442670119, 851454954, 3163156328, 1751010233, 666380006}, + {27426638, 158821495, 4040909608, 493366781, 1117650062, 110237812, 2187833462, 260596623}, + {2122183801, 3470598792, 3121137638, 2281503425, 3004134074, 1980442314, 2746696308, 390804011}, + {1815677887, 1805667831, 2854727323, 668053916, 1143546838, 3013547170, 1428439137, 358518894}, + {2762776387, 2642103464, 2388119724, 1021872172, 2676323334, 2786757971, 1610084234, 805085323}, + {1939394218, 2739516890, 3726162430, 4286380341, 691907891, 3258066542, 1869349768, 651460778}, + {2129339517, 3421404801, 2170569256, 496479682, 3295360930, 2096621499, 3196359792, 595224982}, + {408603686, 1914123975, 2315309220, 560986977, 622118575, 1609432092, 2420457834, 256655258}, + {1525377031, 1209591458, 1650373335, 2080307290, 1466154468, 1125339681, 3296056682, 409430405}, + {3654969858, 1012412278, 1445124567, 4125627636, 926955742, 2096457081, 2273625443, 763436073}, + {4107055918, 2998888823, 460616544, 1523822014, 287346716, 1434916581, 1018382561, 414045192}, + {762313289, 2169874898, 1630894373, 622513950, 2513112409, 1200502605, 2120695031, 687355755}, + {3687346739, 2483669419, 1910041964, 1530527235, 1698445064, 1672006103, 1567479759, 457898868}, + {3674990876, 1387891729, 2094110737, 1653293314, 1722359595, 1825385363, 2771435134, 99508405}, + {2375753360, 1615546475, 1450207413, 4028990178, 2334152157, 1848763345, 3988086625, 276159532}, + {3615711813, 3582897771, 2751168740, 2176690038, 393735109, 1835175588, 335722320, 508340591}, + {2933667941, 685875276, 4128342640, 4147721127, 183524776, 2897972606, 3933011419, 361388627}, + {2223646821, 2632618848, 952054450, 2289264974, 1873496575, 340023068, 2139652596, 100318811}, + {3841871258, 2712627286, 888008982, 3923715442, 1823901620, 2426353568, 59854549, 134804365}, + {2351747471, 1080955633, 3630462633, 2158383788, 3958858976, 2524745094, 1174992730, 226039580}, + {3147816339, 1376397807, 1975521910, 617295921, 628438421, 392474432, 554265804, 480216718}, + {1602933360, 798435382, 126245387, 3235439600, 1593136150, 1070789923, 2469792541, 520432409}, + {2096352911, 963047994, 598381083, 2645156623, 887631634, 1065597728, 3980103626, 76516514}, + {1245623231, 4114587043, 4146509475, 2910011911, 2106716323, 3969633114, 3995749352, 450298069}, + {2463387154, 547535455, 972158403, 2783830066, 3055535168, 71074883, 2227829042, 770134309}, + {1986365786, 711103606, 3841582810, 4160976452, 2520963531, 1095307938, 2574945891, 205914308}, + {3001395093, 1516157696, 3987467551, 2620365632, 3838779844, 4109106862, 4086696397, 374901940}, + {4253406492, 1733688219, 1515665408, 2121371189, 3365533133, 1781446599, 360467223, 245956572}, + {2291431391, 550667025, 3403176245, 534033278, 3725526045, 3415667475, 1291403546, 658826260}, + {482794582, 736992764, 534747520, 1907532214, 1102314720, 1146667182, 453673914, 756838263}, + {2628108090, 4178253792, 769543836, 3135530791, 3315302203, 1565299543, 1631728268, 357558234}, + {1319791894, 1088656022, 1696728404, 724771399, 2511827104, 1983046649, 1187119228, 754097971}, + {4244506077, 1936247188, 1728812353, 3747187341, 456116042, 823487992, 3489000951, 553197684}, + {1259901662, 2392750366, 2376329231, 2803867873, 3300102819, 3788675617, 2571951242, 473884580}, + {3595594100, 1693613144, 3809898002, 4041894447, 1003892451, 4087139826, 291692751, 430775641}, + {3039485509, 48649699, 3192632656, 1810075758, 3913815233, 2536746700, 2772499620, 748622812}, + {2097176515, 1600047731, 317231818, 1078694535, 186476825, 2582629845, 464849037, 753217692}, + {927265984, 542403298, 1813466127, 3624110577, 3581551878, 4243136194, 3689667615, 497417150}, + {4159444850, 3692720200, 3930065323, 3019236101, 3272741885, 4225050653, 107160360, 412265852}, + {3027812264, 3301020196, 2267856552, 120051571, 3502699381, 442037919, 200005028, 558677478}, + {3796402332, 1848284535, 1088023792, 483893883, 3380663750, 3808112315, 3839839251, 568662618}, + {1619085595, 797146432, 4270154023, 3684489458, 1480295685, 8181270, 260315033, 754977540}, + {3853431051, 3281545926, 2567402419, 3829117175, 2468212054, 3299532044, 3179771465, 473543909}, + {3123145449, 741384629, 3413383571, 1375858110, 1517778203, 2877795872, 980705543, 360229357}, + {4140966826, 117117945, 229693735, 3562162687, 1454428809, 1648245131, 1639526492, 411128134}, + {1702758715, 2956143160, 1943123539, 10078756, 1632185358, 524776506, 148224933, 487781418}, + {2135475610, 1370189320, 2373353807, 1673073312, 51392528, 491246778, 3561743330, 480978264}, + {3902950314, 109072763, 1184405627, 3585155709, 3211749467, 3368709661, 3173062106, 707833340}, + {2081821684, 107591607, 2044541119, 921298206, 500632873, 662298076, 427554499, 590098993}, + {2003658226, 2854721423, 3748246697, 2566821946, 1367413216, 330287826, 3589677766, 664655364}, + {1667498915, 3919129274, 2930993245, 1116139698, 2766896734, 3535258851, 207680994, 25230788}, + {2882770293, 1551332256, 3373355515, 507385680, 2084405163, 2653438534, 264557580, 347124519}, + {159275733, 1092034353, 2051758290, 3953839101, 4121375166, 1876026027, 2275637935, 761645256}, + {2142022646, 3661432812, 2844483949, 2692970251, 1920336615, 1814024819, 659434498, 460396417}, + {743483741, 3760303493, 4060942469, 1116057819, 1158329921, 3907404871, 816498186, 769520586}, + {1806884381, 594845828, 3801316959, 757170004, 1206862680, 2303562781, 1667079485, 743258220}, + {592861249, 912604456, 3164585141, 4138902645, 3920272879, 433653019, 2178222303, 504231169}, + {458529080, 1391142778, 1596404404, 2008325501, 2570018920, 2763907296, 2512664545, 288382504}, + {1501549678, 3114479021, 763976681, 1778271404, 2543716861, 2825460992, 144941930, 793168014}, + {3698674969, 1589621261, 2150078671, 2607524735, 3721661636, 539126131, 2503029268, 404608172}, + {3151204849, 238154583, 2587297725, 2172093458, 362946568, 722646997, 1457402779, 642599065}, + {4189244689, 3043236006, 3978893677, 846387998, 1549261405, 3615379155, 3381003940, 735830451}, + {4173593601, 1306430061, 509481556, 1365656574, 291183291, 3975165988, 1830296414, 261389791}, + {2039257548, 471240504, 335505839, 4195521316, 2918764681, 3359206013, 1277829366, 128930960}, + {2033601052, 3886456559, 1574092007, 1589610167, 3968102682, 839718695, 189984951, 197166493}, + {2004295889, 755590217, 3661839271, 2963775605, 2570267717, 4166415929, 618640813, 752253652}, + {1622700201, 3878947695, 194107185, 1308345541, 4277548422, 3237875298, 3643652409, 633844266}, + {118906827, 1487477794, 2885059769, 2201633589, 2661189547, 1640145103, 3368309926, 17705265}, + {1479339821, 3098375413, 3171083955, 2484317884, 4224256364, 3114688811, 3536563250, 210600111}, + {3958729924, 953329843, 1814792220, 889046166, 2827911351, 3089000796, 1271730277, 496281796}, + {4253742693, 1689830009, 2448767264, 637869068, 1523850713, 1828725237, 39740071, 570656665}, + {3995642699, 1762094093, 517752102, 1377520282, 687747665, 460913006, 3770252761, 505022474}, + {2110661337, 1524048191, 4270040417, 1626517836, 315132775, 659413083, 2883337788, 22340411}, + {2864289370, 164727338, 2129159655, 1562124971, 2595212214, 681690116, 3594630427, 498319930}, + {1555120363, 975603897, 2233619438, 1648310185, 377260481, 477793986, 2121183180, 433493853}, + {2798298466, 3951850593, 2564189210, 836750816, 1185308179, 2445526414, 1931511728, 117468321}, + {886360513, 4255383698, 2915952779, 4123344352, 694306712, 3365011565, 513452990, 606687510}, + {940062984, 3537763153, 960283135, 1261726476, 151433705, 3493277781, 3514543094, 163006137}, + {2920648348, 757726186, 2284970078, 2728926166, 4140531830, 260414717, 2871544046, 74206872}, + {1277905781, 751985249, 1311517516, 3239964396, 557501821, 1870521032, 4144589522, 269256496}, + {1335710171, 1615529209, 3322868836, 2110158597, 3140985499, 588928964, 2455133581, 396574610}, + {3169210269, 2765833386, 3725030179, 823924933, 71833560, 4037691083, 2908197759, 544215678}, + {3420958804, 2273179325, 2928220005, 3196647933, 128545802, 1895871453, 2685038216, 264007242}, + {1475846808, 1972706476, 3580201654, 1557025784, 769896006, 1559675218, 794925772, 41398640}, + {1010163619, 2332382593, 1059570947, 4141687112, 470748687, 2618360758, 2674310840, 56233629}, + {37523269, 853112597, 2457441771, 215668381, 2962771072, 223111345, 3852543240, 44776185}, + {457390239, 3877793556, 4216342586, 3288881383, 1335812400, 1256078055, 1363274875, 638186462}, + {4139333449, 1395301774, 665526337, 756010440, 880137858, 2062949882, 3542284409, 292515214}, + {1020746158, 1651468362, 1432913881, 319415897, 3286210217, 663862003, 4025954899, 177147873}, + {1138584193, 1574082522, 1215714038, 516749003, 3612217524, 4294087141, 1747817330, 790356041}, + {1639704238, 1341140638, 1896871953, 1623346378, 216932928, 2270191050, 2711104464, 325802540}, + {1555786819, 3440406788, 269789564, 1020605533, 393842357, 3153886038, 3611543905, 52523827}, + {2352355869, 1690853892, 1302485678, 2573403223, 3071601692, 3813694842, 1497428278, 232649963}, + {837496298, 1300273886, 3356088308, 254666478, 2801356650, 1919154841, 3094443949, 657495810}, + {1327560541, 4279649711, 1384909698, 2859670821, 1834623523, 4103117427, 131762376, 695706587}, + {477869586, 935519228, 3444402252, 3759415348, 418912688, 3308278533, 1366606885, 135090460}, + {1086202311, 764891443, 2044307831, 1728682312, 3212305602, 369614650, 1737731266, 414718711}, + {1670739801, 3416544102, 1894270404, 2535000772, 2490231217, 1827732401, 3379495505, 216298113}, + {1048096874, 1406433208, 29044865, 4142450089, 1815470090, 3016084950, 721960765, 686213022}, + {3408268869, 1418957668, 2895969374, 688906609, 4157431796, 1978546772, 1235030174, 581179304}, + {11962282, 308268003, 1466833373, 3658859344, 2287401432, 1961797335, 2559932301, 257174234}, + {1707147357, 1179838639, 3422662043, 3124705702, 3135444250, 2257788937, 4201633950, 144284097}, + {2059002417, 193261179, 469037246, 3385483097, 1053139927, 461228658, 2837771742, 580584969}, + {2746514720, 440600260, 2280710498, 438751424, 188549939, 1600947829, 1442716983, 697502987}, + {1095501080, 4005797142, 2760368110, 1548257026, 1141439411, 2712911688, 1312590098, 336551066}, + {1075489128, 2921779430, 2534147741, 3879561770, 1988905048, 1078201940, 1028480383, 73409544}, + {1329020949, 3706394743, 2165062480, 1531380912, 1933060539, 3244401757, 1753508732, 431983151}, + {969217548, 1600536317, 3790467519, 215935474, 4030239732, 1545598857, 3658632060, 580303320}, + {831932327, 2294490829, 1470018534, 3774700798, 2832312326, 2044380806, 2507109428, 402894655}, + {3333550990, 1760034668, 3991899965, 982300861, 2152930067, 2203315056, 3216576928, 932288}, + {3713367992, 694879479, 2712821630, 682899053, 73797012, 1740076558, 3947265852, 354962475}, + {1949466552, 3829197751, 2259714496, 4283278908, 4243716872, 2357682461, 1763717138, 357645310}, + {2826517417, 1352133939, 1120674599, 206592582, 161722305, 1601665653, 344151673, 167553893}, + {231630064, 3598150320, 430609839, 2832362699, 358420436, 1809822578, 2933948453, 657535763}, + {380967920, 3649711677, 788811940, 1759463194, 2612833823, 2682070304, 2011898279, 47431963}, + {3742961912, 1419886222, 2929867022, 1788639034, 2935121767, 1472361113, 4220571855, 526107287}, + {3989185536, 3359624070, 4159328644, 1069141973, 2665801493, 3926213538, 2558723650, 681516185}, + {2097862398, 491762523, 2131546987, 3408692986, 1980771082, 4198357985, 1604823949, 39246375}, + {1225456695, 3124945683, 3086603614, 1562965888, 1778940012, 75017098, 249399603, 398087011}, + {3756070237, 4013482346, 1612730152, 1419955052, 3616627088, 1854417985, 1793763173, 222492429}, + {455503183, 1335894639, 1333097431, 1116619951, 452202448, 3788061619, 1477333081, 216136877}, + {2204737014, 1040385056, 3781368674, 172963822, 1385527586, 2865056529, 4110799932, 679011937}, + {1889167259, 1400782940, 1245500673, 1191773551, 2198412706, 2143395478, 239419940, 230945512}, + {2249414749, 4154894696, 115216939, 3817998671, 4294476324, 3366511146, 3752610129, 737640645}, + {597413068, 3802725621, 3043977083, 524783786, 3192083907, 3442786264, 2391108590, 682732584}, + {3964481442, 3825114496, 751029473, 3176864200, 3710716210, 2236304516, 101531052, 75034873}, + {2987470683, 3362717087, 2940503455, 4021656684, 4189152210, 209914602, 1155086016, 285235272}, + {3994302569, 156577474, 2521939025, 2889549125, 1248122066, 2637185938, 848637158, 632657169}, + {4223276098, 1281694833, 2340313126, 3924756493, 3318112059, 347892924, 680156807, 21217740}, + {623800807, 3091698762, 2441833896, 2862898152, 1790759442, 194378638, 3358513113, 240504063}, + {2230574841, 2637722577, 193176944, 2335513946, 2609853572, 1825789588, 1261762137, 794150258}, + {1118486296, 802648799, 4236434180, 4217230218, 4087611636, 3576549535, 2798929478, 106349145}, + {1255582920, 4109239122, 2947195831, 2600925626, 2064695150, 4180574583, 3628871974, 583411016}, + {2354130490, 2323089117, 2416872201, 2552440860, 424731102, 3917508371, 2088137098, 497989354}, + {2734214130, 4057463627, 3962432450, 1773452797, 2384365848, 1725524093, 345863017, 309727929}, + {2074153466, 1934953871, 1588598849, 2709361697, 1468315688, 3786521799, 1478020244, 365804755}, + {1830600880, 57950069, 1008426221, 420152148, 4193163805, 1841447477, 619653388, 508516067}, + {3052249797, 2637105250, 129151645, 519986487, 402149478, 1656168402, 2789899894, 388835169}, + {5870670, 2233241256, 3871296155, 1185724976, 2260830859, 1444397458, 1315205248, 231708829}, + {2665163159, 1120860914, 4227563978, 610697661, 367363669, 2806124318, 494937908, 145609662}, + {2704672287, 1943609404, 1734640809, 814007514, 2733316220, 923225571, 2494687516, 124525037}, + {1667807130, 3247864501, 1769292846, 812756797, 669093949, 4106479031, 2702387969, 584116900}, + {863923100, 1048931029, 2934331603, 3941757586, 3710760979, 4041053090, 1004809219, 65720318}, + {2981281919, 2818160800, 66825153, 4184425320, 1260692449, 234563605, 127024627, 327021324}, + {850711580, 2423332806, 520992478, 2200331391, 3908615274, 2970509124, 1887302234, 369373806}, + {2504822468, 380067992, 3276057552, 2006858059, 4134377169, 3200158853, 306954331, 429469975}, + {974432242, 2299885110, 1559870647, 173865357, 3476472835, 425561145, 2723010032, 309737242}, + {91550700, 1867751434, 2192216480, 4098409813, 1434033708, 175054738, 3477875147, 666491057}, + {1690878334, 126999756, 3535552681, 1380018847, 899282797, 2835718186, 1867784176, 259741632}, + {3551521539, 2771041063, 850571440, 974418310, 1439183076, 285751486, 278451904, 396634168}, + {3343011545, 3513757902, 4052418923, 942286822, 3237733663, 756025499, 1670875885, 67072888}, + {61898155, 946895506, 97039203, 169338582, 1608856169, 2093410328, 3480011227, 572205727}, + {3612206137, 2535242174, 2541767943, 1261071458, 4104781143, 2332385587, 3493206447, 583826972}, + {3647547566, 402594886, 2714367208, 1839189694, 3057956370, 3236572339, 2676767, 762077883}, + {916053109, 320773765, 2782121270, 2500719926, 1713806984, 3860095271, 40452574, 184107579}, + {226902877, 628543012, 191739273, 2152021215, 1708034533, 1442320069, 3664113374, 770184456}, + {685624290, 2831749267, 3559018802, 1267229583, 1323729209, 3704187871, 4237325773, 368907507}, + {499938886, 302930751, 2811855265, 2515481343, 3121549889, 2754275214, 2571031363, 433478363}, + {2956898865, 188856865, 3938491636, 556963925, 548581071, 1053234116, 1230720629, 581137282}, + {3069693339, 1635912027, 2687616313, 1120802116, 3031181541, 4125308397, 998826563, 179496966}, + {1370812706, 186629271, 1287028456, 2738539764, 200403920, 1118279937, 184937642, 521720034}, + {339989448, 1409342827, 1490435786, 797629222, 1601798954, 907515724, 519324700, 188969184}, + {938796607, 4189158765, 3531840434, 4275507615, 2808195457, 693588064, 3497063679, 531152483}, + {2185063475, 2194091799, 567413826, 2355269608, 2876497886, 1716035624, 1703546891, 305247043}, + {1732299833, 2873808350, 3382090356, 118788623, 3893448862, 1039821681, 1364219473, 644222038}, + {3708182423, 1718535118, 3918128168, 605042175, 3355178597, 2427581647, 4012360821, 414740898}, + {3576210642, 2706059038, 1667684704, 924723342, 2559058223, 3172470381, 3818579100, 367253453}, + {3912841626, 206794611, 3844646971, 2820335254, 1598374533, 2110333696, 258180212, 133378665}, + {1414331781, 4199799689, 25382432, 1020573760, 1113733457, 3040133099, 3583353451, 72710959}, + {896333992, 3654622384, 3200493242, 3395651377, 708786681, 2352689312, 3996027849, 798888944}, + {1243544733, 3157709606, 451138863, 4098629930, 3600282106, 3840738094, 2469572690, 164296962}, + {4040472189, 3390663695, 241834885, 3219814886, 3115160062, 3985652515, 1570118729, 256442707}, + {2883524463, 1826017465, 1174234975, 3158863222, 1167440490, 2096974564, 3137164044, 370133368}, + {2294660742, 610444994, 3748112434, 1251638656, 3492744117, 4111109371, 3759169689, 345611315}, + {4287494374, 626397318, 1133692615, 2527847835, 429973732, 616253571, 3920240579, 125944113}, + {2637582790, 3949671770, 1980800702, 1685270455, 1642151413, 1914975991, 354374000, 555959841}, + {2025258528, 186031714, 2814463985, 3894262944, 1988497922, 759085353, 3942205402, 205709993}, + {1770138732, 4128122935, 3045324160, 2879053056, 993367167, 97973206, 1826419939, 525952233}, + {205327500, 4174603399, 1197390231, 2454884584, 3331663359, 630713632, 2637973505, 682433370}, + {3186021172, 867123661, 219948772, 1383455199, 489072600, 3952739564, 3169476193, 5957968}, + {3539563679, 2245063764, 3499857631, 122531485, 1239629091, 827751079, 547734502, 321381258}, + {2157910809, 499989486, 2961110134, 314593585, 1808702719, 2634028235, 410055372, 256605784}, + {573833592, 1465801997, 1025058176, 1085637019, 4215713018, 1402229883, 2528136886, 26293199}, + {1763588454, 3094073752, 3837735194, 3761971857, 3489905439, 242573751, 369717785, 413760023}, + {2600786792, 1714465740, 2786427637, 3872140438, 3441207075, 2563606858, 1607137066, 171089764}, + {4294049802, 828494579, 2208166442, 649493076, 1509152788, 1431789339, 2746196852, 2587522}, + {2429092364, 1913850259, 1074651797, 1854610820, 530715232, 1348839299, 57067192, 16733736}, + {2007160975, 2888625461, 667929665, 4153798929, 2889126284, 4249727396, 1317020355, 232437361}, + {3567080566, 1586472906, 3906666320, 2241661012, 2881661989, 3384353102, 1036289113, 741393770}, + {2701219046, 1867536914, 4286020861, 3709640791, 3521953587, 1352056662, 3145769045, 62436649}, + {178734766, 1598172982, 478038845, 3803684212, 668807637, 3439937191, 3768071832, 777119035}, + {2879305142, 2574930395, 3964047600, 2129281896, 3433331933, 2187559119, 2178455359, 637001349}, + {408540159, 2013794289, 3785486269, 2888473789, 418327381, 4005110456, 160294449, 734504787}, + {439668954, 3178031816, 3957591695, 1097322608, 3071550386, 2572813256, 1804491477, 342720362}, + {1038226291, 2695284337, 4142766023, 1851784457, 2246547560, 979577513, 3304838349, 390471784}, + {2484839434, 3720418484, 1382135483, 4084703581, 1927308432, 3155884285, 2200602810, 429544132}, + {875259887, 3036060744, 1497694425, 2561824592, 4010329825, 2336409099, 3723521021, 635647821}, + {268053901, 383282395, 168181065, 1323482739, 4115032899, 2486526422, 3369124190, 295676865}, + {1665352711, 2593236026, 2186171309, 3707841504, 4197606660, 1225856495, 778918195, 727808578}, + {1159269538, 501178644, 3057612673, 191172150, 1484080681, 2408293559, 778495817, 648123297}, + {2783103085, 1588050261, 263273091, 626149906, 2883068020, 2972472, 1647669446, 202616461}, + {3646040594, 918005994, 217626764, 2277275651, 3736869261, 3310263980, 2745913623, 775640061}, + {3220402089, 2690226051, 3965589287, 3379764708, 2985309188, 1932358238, 1447068751, 602216913}, + {3950849632, 2287143618, 4148376020, 3251178699, 620128138, 3728056620, 2714066056, 367259602}, + {4074895135, 2710165430, 3381762521, 4012332035, 1135558730, 3386370568, 1186397511, 777427644}, + {2035294496, 171082812, 4283266382, 797223392, 3844732122, 1695769067, 3044051310, 2440326}, + {2576149877, 2913880443, 3286806565, 1001093210, 3777032211, 3200849627, 3019554169, 220083824}, + {1782697548, 2167501671, 3083196414, 604409522, 4032404916, 3599243042, 1437655795, 643698712}, + {116821309, 1585404607, 3511509295, 2905401004, 2594908286, 1529380052, 1924068586, 656799723}, + {2365275331, 798598759, 70894990, 3883640510, 1721691890, 4110199530, 801171715, 642172582}, + {3298433150, 919172932, 2668920130, 3332205791, 3493556286, 3977202573, 3443938408, 58966574}, + {3570659222, 2422571649, 2884329285, 3661921132, 4129205484, 3732985535, 3303807478, 743634276}, + {2167819015, 3945814081, 1625979381, 842521238, 167438343, 1219013531, 3637651642, 260360158}, + {1905604226, 4190444554, 3226197787, 2687022799, 2605538091, 1258950329, 3013104045, 568577859}, + {362508123, 4177383312, 183202785, 3096130563, 2920933815, 2897307450, 3672016334, 719149408}, + {3406224442, 1307936504, 3442911218, 2325511879, 8761413, 410608403, 2526553412, 442514072}, + {2963927089, 83539992, 617534318, 3044403283, 527760169, 620897130, 598860435, 18945850}, + {1367311631, 755488260, 337267618, 2322363769, 1455433943, 3172615231, 122834954, 716589905}, + {3914091614, 3840690276, 2334511482, 2289764718, 1217731743, 4139206951, 1154438916, 31004609}, + {2676788855, 2036106896, 428886592, 2588556713, 1962529691, 1660602720, 2530745248, 76659793}, + {3505713118, 3234530812, 1948028752, 3675133359, 2780201885, 16882088, 3596521033, 443371435}, + {3364677174, 1551238127, 1884421849, 241170534, 3421092501, 1509797916, 3638938310, 357764516}, + {3850210208, 1560891982, 258999148, 2251313571, 1239287293, 232571288, 2074084038, 262686647}, + {203804955, 4210568811, 2449086045, 584938219, 1806088762, 2734893269, 199368946, 662838671}, + {1344807382, 2840406593, 2552892894, 3185782701, 2442695444, 3971395472, 3719422055, 148172480}, + {2606638707, 3841564467, 2193890992, 593256357, 1520551591, 3609713059, 3968306691, 789094452}, + {3110852112, 3960408917, 369075147, 1132474150, 1331307983, 2088305908, 2663176168, 693390552}, + {1753383331, 2987898123, 1710150827, 414237279, 3145109729, 2825789347, 2720244530, 391259207}, + {1104255462, 3215836962, 671249455, 1082452424, 1552470654, 2751246750, 1055169963, 563886433}, + {2142760191, 918605274, 1864177784, 832698115, 1336395007, 2865686285, 921081023, 202821048}, + {2684252428, 3643122526, 4057058961, 998952640, 3505232479, 4089642023, 2580106162, 745589183}, + {671607874, 1226308110, 1673653318, 1258254230, 3762331891, 1664137111, 3387759119, 31099888}, + {3924889894, 1833020092, 126811051, 251868386, 2850253760, 1539133471, 198801281, 245893636}, + {3104603738, 440625585, 2922346235, 2814865952, 3916010841, 3553013724, 2493734064, 98882497}, + {1244970574, 2027017921, 1992105263, 629137947, 78649161, 243371636, 2966330086, 547978714}, + {3413041381, 1499176521, 3529825144, 3012360062, 2946515458, 3925906441, 2999188144, 475078969}, + {1777548503, 2062137373, 3924046298, 4151690942, 2312659916, 1441023236, 3272039823, 445069543}, + {3473095268, 2254888485, 1556374038, 2906385979, 9156496, 88876348, 1116820461, 329469891}, + {2362209454, 1073014282, 3609627441, 750736910, 1772936850, 30545527, 3666832656, 237537540}, + {2348418523, 3923588791, 3269390941, 536298111, 1988877139, 2522756275, 980545248, 354756639}, + {847594321, 1991593231, 1703962863, 2655377944, 1440727144, 1081797533, 2614160840, 55193055}, + {3242110721, 1707213041, 952700414, 4189521871, 381246073, 2537207778, 3265944582, 518280393}, + {4082466210, 2511104980, 1849503376, 2666046618, 1235332334, 115025922, 3168237690, 98606010}, + {1882709758, 3428349685, 759776817, 1342583215, 3294816391, 588399977, 1809396749, 329635718}, + {1569717963, 3578500219, 4244264935, 2093092057, 4039765771, 1370455628, 2833524063, 579246317}, + {2341263495, 2903953794, 378838300, 3600148648, 3593610985, 1120565820, 2040949341, 165828620}, + {3078804837, 2124043929, 3228674754, 602413148, 537445008, 1290245481, 2004114679, 213564061}, + {3873994681, 1586014770, 2382599460, 2434060579, 3820107537, 2510436662, 1420922203, 241864590}, + {2951165399, 1774722701, 4126787531, 3719248761, 2387085946, 4168602496, 596486488, 50363649}, + {1902710788, 1690215231, 1181623476, 2324650021, 2696062558, 2657791067, 2600347935, 306852801}, + {3121562399, 1595075054, 3732002542, 410116598, 433002235, 2526175026, 3364184427, 575123535}, + {3341611328, 3590974172, 64422899, 1159622976, 2370617293, 2221793015, 1097133189, 674706082}, + {11467013, 3814736210, 749374953, 379813525, 3854808749, 2395585305, 1091681207, 463429483}, + {143130515, 2571221431, 2558035757, 1278578935, 1664187064, 982479863, 2524539920, 532903505}, + {1701848235, 1302954257, 682052141, 532990597, 1138801349, 3811156417, 1205393144, 810549984}, + {663299149, 149306511, 4289285029, 1305202218, 4138727503, 236266269, 3146683103, 226067059}, + {814539573, 1405486432, 2638979413, 1264317689, 2259188859, 2056626927, 547786521, 783729773}, + {2600548593, 3432259863, 2640775467, 561238614, 2820622034, 3545257992, 1671950244, 35803768}, + {1997206657, 1641431343, 1340334979, 1907803899, 325507737, 2311839763, 3535036916, 330482868}, + {2232015762, 2416565676, 3708409210, 2016012396, 1051447478, 3356420001, 1747008241, 514145327}, + {2721046225, 2283964573, 2543533828, 3569157170, 3505986448, 79767233, 501239358, 104653966}, + {1122413713, 1027535081, 2570661284, 602552004, 228714042, 2866639423, 3420797358, 197402093}, + {2126779417, 2697803604, 1188974778, 3783136096, 960543587, 424956067, 2317198612, 303572630}, + {1915244206, 1357945612, 166296080, 321021420, 935929016, 3501067569, 851067173, 262532228}, + {907549971, 1507569610, 3376808644, 327316072, 2428683340, 4148579514, 317045792, 409856538}, + {2131857056, 420779501, 2405174017, 1455807119, 3998648966, 3995325918, 2858428372, 311047961}, + {3882066747, 1035971306, 2102346956, 1952698807, 2017698746, 2548973924, 1189075176, 639121364}, + {4204883648, 3441769589, 1331461019, 291846887, 287798124, 354999789, 3239213632, 135762831}, + {3530123870, 1006103855, 4113103043, 4267800764, 2643527790, 3180236244, 3318564492, 333651535}, + {3508218426, 2901775611, 2199468425, 588707874, 73215051, 182685955, 2028805922, 549399184}, + {3319134494, 356400184, 838502295, 2441316632, 3016573838, 1394552432, 3398656862, 729797408}, + {2450496909, 2382262171, 2182546035, 3084526738, 4003394236, 1283945009, 4029018312, 791893508}, + {1161394017, 3493667747, 1408807542, 2278171454, 3991597147, 3644070443, 2813006060, 226447605}, + {2192034884, 1557777353, 1703880380, 2061970108, 648437808, 1516370265, 2948224759, 723908358}, + {50476625, 551680024, 2140743452, 4069842368, 2888434865, 3473078684, 3533676736, 568380188}, + {1256879467, 3753087035, 675501172, 2988114592, 3362434477, 970044609, 1651230922, 129797294}, + {2053100198, 2822218975, 1123837363, 364754976, 3757129289, 4031219746, 4252140211, 619822422}, + {1116146065, 851959614, 1260659002, 4160867865, 500055508, 472259408, 2578796235, 226020589}, + {489046325, 427922281, 657524539, 409235899, 436882198, 1529965744, 742172302, 518181919}, + {1135502487, 693536584, 4185990238, 3004860410, 2961899447, 1246502742, 3235155521, 176653879}, + {1875147331, 829499157, 610771497, 3331385920, 3115137341, 839936985, 1927102858, 684852538}, + {316510214, 1907387060, 4144269136, 1258806564, 59390707, 2964582474, 2577722811, 149526947}, + {3744483390, 2412548446, 157515279, 2859469689, 1520272630, 1822203012, 4179599519, 84528112}, + {1696492708, 1740087966, 3681679540, 557598999, 169262602, 1419876450, 1313210371, 276025251}, + {1794834281, 910895367, 2335464457, 73306478, 771912615, 2469710332, 1003616208, 780989862}, + {217225955, 1817050618, 2879323494, 149136244, 356930292, 901983577, 234161403, 541221662}, + {810193315, 841044840, 2002636299, 2107756897, 1224670597, 231575387, 2982178518, 8355881}, + {3741181145, 21400574, 1047420418, 1542923794, 3523273848, 186591362, 3438528504, 350101566}, + {3343238802, 3872571290, 2745807340, 854373139, 257161344, 2006097483, 2320249327, 341166473}, + {1662272484, 2096724268, 1746946342, 3146817319, 1690968571, 1126374124, 3153579357, 481463099}, + {3771602466, 3189481733, 1605144068, 2687605603, 128926460, 2470984938, 115718307, 373215456}, + {3304459657, 1580057057, 3720155548, 176817404, 4080043607, 2635952735, 3549789994, 302918929}, + {4242291020, 2384923175, 1847207835, 1245940914, 1668817402, 4033041422, 4096143658, 801084454}, + {3473281868, 1764786434, 2006023926, 2650677786, 3326482787, 2576875998, 4122429518, 37010334}, + {3661631265, 1782666263, 1607266809, 1334714216, 3274287922, 115666027, 1216452557, 77906794}, + {3258704295, 2856807374, 2131450535, 2608557829, 554555820, 3238366575, 1636425620, 514337985}, + {2516365495, 468770476, 2071126195, 3310878882, 2891483331, 4152617050, 4040956625, 264505422}, + {3331023109, 4139619777, 340037464, 291958598, 2841737355, 1463214967, 2840853952, 249138296}, + {374594180, 2382956525, 2896044887, 2129660450, 4136306013, 1399410547, 2501163896, 489918844}, + {2898464135, 4262653866, 1187346687, 3498436491, 3322760265, 1523632797, 1358022123, 334284675}, + {1882435620, 3660206846, 3192947579, 3950986228, 560888828, 1918731057, 4118336299, 167739984}, + {3923955762, 672139230, 857587919, 2983106292, 828435617, 1156550404, 1003071044, 226334439}, + {3329323200, 2954772638, 1048653344, 837823629, 418651653, 3665924761, 3274125160, 15392861}, + {4155831616, 4153388414, 1623183389, 2343235113, 1154523631, 2570694562, 1265208898, 730681823}, + {1706394367, 1521317380, 3997428928, 2520960272, 1162727801, 4135587198, 948103777, 124476755}, + {723186144, 3730600597, 1535912235, 3569137551, 1358400507, 732441475, 236189248, 630495580}, + {1091564579, 1879159631, 1939045371, 3400779793, 2564820469, 3478171198, 3026659117, 257012726}, + {3991440324, 1479955493, 2383632522, 3723674018, 2484248681, 2865110605, 3491285573, 593454173}, + {3063778604, 46442482, 822333087, 2540072244, 274142269, 3616795839, 3106271994, 245534750}, + {819412485, 1871164296, 3126212097, 3067134867, 3471634976, 4247303822, 4198675164, 616231674}, + {4137164129, 3074389938, 299265466, 2225269997, 1939807863, 3429318625, 122608245, 544846722}, + {2143656077, 3237031048, 2637578649, 2916329195, 109710344, 3842394137, 3620548991, 629779390}, + {238873347, 427862993, 249055815, 2810306019, 457086797, 2950565536, 2753806688, 802797169}, + {2893017500, 192458400, 412323229, 4107164755, 588508688, 3310196298, 3237898800, 197281290}, + {2657431029, 3108130688, 1113852619, 671968489, 922603604, 4258638865, 4154328264, 740244610}, + {221664061, 1557009127, 3966568348, 1972886612, 1991377028, 227958268, 636345176, 22735883}, + {1263400502, 2054967108, 3943856251, 2924524141, 2171339089, 1591232240, 2710541619, 763421498}, + {790761754, 4249253958, 3131995521, 1721120693, 3668845786, 3068014228, 704352366, 484672985}, + {198365840, 727445714, 445925625, 1416080885, 3689301030, 1528766010, 3725236276, 531675839}, + {930958873, 723329652, 3375891648, 1811607360, 107286670, 2269083562, 593486598, 547381172}, + {803229375, 2217591796, 4165646532, 3852179382, 424600146, 2459684997, 2916609492, 605815747}, + {3999041708, 2219369636, 3293160918, 3561263576, 807218253, 4117571833, 1180998444, 95709429}, + {3109057875, 1032835401, 3369398772, 1006248291, 3249087171, 3737349460, 3586808185, 406742305}, + {52543930, 2165949023, 1672486052, 1260897492, 3296737513, 3609655258, 1481021780, 60477637}, + {3062348960, 1137080966, 2512914600, 930178799, 3904977491, 2622769866, 1684723807, 643434804}, + {1144988152, 523535608, 137321465, 2464709351, 1708198424, 3475618975, 2522100058, 683304809}, + {367413557, 4168036928, 3790394027, 800834917, 3700134012, 3851950275, 330944924, 703215367}, + {1232500860, 1497767371, 1155545083, 2539659388, 3074909780, 3748047173, 677660066, 576366073}, + {3708754784, 3266952090, 4064490668, 3087221222, 1435414915, 2898844001, 3321414082, 243717798}, + {3386728783, 1449617944, 800073058, 2250091991, 673669272, 2314149220, 3595320767, 460084605}, + {3514918247, 2094668613, 3996155786, 1479217872, 3102843657, 3144394484, 4155697818, 499255864}, + {707014534, 1035567206, 2692687081, 2294902771, 618284441, 97989529, 260087336, 711349468}, + {1434985479, 652119017, 4214811585, 2298786036, 4036955355, 2324853641, 3674895622, 142803998}, + {1625926258, 1118668646, 2098009616, 1010009518, 2700282348, 1154006727, 3438767664, 550147640}, + {98686250, 4084982616, 1477648833, 3145856456, 384755982, 2483351805, 1394648928, 318295949}, + {4062754491, 4009324913, 1586667277, 2438284613, 301145277, 777648926, 260028140, 277822207}, + {4200063191, 2960271741, 2586899339, 4228576549, 3350126306, 1460579407, 1605725583, 774178058}, + {3559193021, 3278180418, 973510710, 2511219207, 2897058934, 2620105646, 165908134, 221551840}, + {1866811455, 3716732897, 2126110310, 3758955961, 3106323120, 1737944444, 3700270909, 432460719}, + {2090557257, 832173753, 2020372382, 4259108141, 489865895, 3837998217, 1529686905, 701244983}, + {1698869841, 1589814974, 849562634, 2389732391, 1867348794, 203208310, 3315452230, 3479565}, + {2568771528, 966164313, 1092550045, 1780408710, 1486725272, 615323188, 3852071633, 370517143}, + {1603758091, 4284319746, 3382131789, 772141828, 3994573395, 3094497933, 732909581, 349383300}, + {979566390, 2247324230, 3586615435, 2046688077, 2553504282, 1327773199, 3810292197, 80739763}, + {3990705240, 2308647198, 767280223, 1902313485, 3600170594, 2039734041, 4213121129, 476097370}, + {1996184363, 3098627390, 354161715, 2106214999, 4088121200, 3557993622, 1644375339, 569755620}, + {4002017679, 532395703, 777366780, 1810235269, 4121679529, 4157778940, 1935721291, 709508769}, + {4128830648, 1936459963, 1230686092, 2252935894, 1346758810, 4291313085, 2229288489, 672513682}, + {518306880, 3986274106, 1599822350, 3717413674, 2060348403, 294468191, 2953016987, 251846279}, + {2880062500, 2016035579, 3173642623, 343994625, 3691036796, 3323517077, 2387603384, 693176909}, + {1092253742, 1048802669, 265911120, 2316120235, 496222114, 2053343860, 3238467749, 476823968}, + {491143520, 4121074871, 2350468019, 2223098660, 3037704865, 1361957405, 2052829220, 597695235}, + {216226685, 1904382487, 2320394717, 627224055, 3989150905, 2149587859, 2953636942, 716559486}, + {2964211244, 3550501255, 1876972681, 1559924849, 3254127465, 600627167, 147042128, 63702487}, + {542549660, 2956023461, 546781230, 2418455258, 666242426, 3249705379, 1941948536, 770157946}, + {336157905, 2258786192, 3917868435, 1162625513, 2854776328, 1043631879, 262474032, 89625908}, + {2808034867, 927475470, 735160116, 3359081521, 1590596137, 1326967205, 2489654986, 111171194}, + {3212393027, 4052903003, 3566635582, 3427080012, 4180895840, 666198105, 2498593337, 151228223}, + {1781726916, 854357081, 2384198397, 2043213275, 1987032415, 2374095174, 1275188509, 705583535}, + {150374488, 517210786, 2988974653, 3465276826, 604242721, 1731705157, 3736432497, 407585459}, + {3209294775, 1332923375, 242879374, 3788617545, 3422855132, 3990684703, 559285607, 626230060}, + {2997074056, 641825407, 536550514, 533743881, 1987274117, 349045707, 1810814164, 282505771}, + {36390569, 912405219, 96626688, 3210108964, 2770627757, 1427480310, 4268560029, 503267648}, + {403564056, 1284728308, 2588602249, 2733996137, 59104759, 979992320, 2410813586, 525817156}, + {2770923150, 2201608967, 2498885128, 29817743, 3115329688, 3034631302, 258818847, 340214489}, + {3555787705, 2843539444, 484577041, 2547427165, 4199817259, 664342527, 2134913940, 409924101}, + {3721789925, 700616225, 1139106369, 3683758036, 3970610403, 2664780418, 2206609047, 243603418}, + {40457903, 1525438908, 3940301144, 4294595784, 866365263, 1756768688, 1181338245, 219776365}, + {1589117972, 289692211, 547881592, 2883699515, 3796257536, 4200563911, 1914913794, 479716175}, + {3209993834, 1950084935, 587708318, 3116731362, 870515718, 953615233, 752271198, 723227706}, + {3608586423, 370005668, 1550926847, 4287719786, 2780823201, 631200800, 629654402, 691164210}, + {4012908231, 3160845730, 919456325, 1146932170, 2105592149, 3235570906, 1660435383, 510266142}, + {3989973019, 1783832386, 3470800819, 4120638573, 443421054, 1686061175, 3486675570, 468718055}, + {4147485594, 3969982390, 3701019676, 170430108, 4109419329, 1960348736, 3279141214, 705156011}, + {373494381, 2252943999, 2126706376, 3701550125, 1487774356, 1631940488, 2012551323, 36646593}, + {4256882822, 458752030, 1142003419, 2684100202, 3401952993, 1456593259, 991577247, 40852113}, + {3784906861, 2587660734, 1167155817, 2030748427, 3405254521, 3130355218, 459230718, 557491007}, + {2039001162, 2277401393, 1616779875, 304537017, 1598458406, 1421478182, 616714576, 682418243}, + {4284653748, 1826399528, 3252133074, 2625823645, 2323810913, 1384409861, 3286216667, 605452785}, + {1852478968, 4164794286, 2156535131, 2774013500, 988695951, 139163172, 2887275670, 678600740}, + {61831769, 1159417149, 3385649611, 2879517528, 1913295802, 3484861509, 1755924370, 763220538}, + {3703778430, 2899660152, 3715625927, 2826422176, 3040835269, 361614726, 1949303662, 476477367}, + {355371851, 3104585212, 3736091820, 3938429433, 2150130164, 2660225889, 4029254505, 51667044}, + {3924293415, 988309056, 1566402267, 2917746463, 4229248229, 1320667965, 634539372, 249338663}, + {2755985605, 565520397, 2854362369, 618988993, 835917106, 4092209537, 3100188167, 428030139}, + {4155724613, 1351780774, 938853985, 4158254676, 2159913615, 3512202184, 573558345, 395052127}, + {2291712861, 1214888738, 1771383601, 867649606, 3281519000, 1963274236, 3367593580, 527325812}, + {828385037, 467005696, 2678029473, 1228892845, 3099103463, 2969095367, 3385383426, 605676626}, + {1954730785, 2539402302, 335542769, 3909767431, 4110606072, 3480071651, 1553077508, 384973001}, + {3468890133, 2183427650, 738140602, 2016908871, 180250525, 1418670112, 3688571482, 335249932}, + {2461986035, 3517939313, 2383461246, 3697612020, 3321356699, 2471358312, 1961010746, 704466568}, + {420787520, 2888103946, 2657795836, 418050475, 728483987, 1061294157, 729710317, 11860817}, + {3353267919, 1646858797, 306509290, 2319530550, 1079913834, 2498599641, 2566392851, 399932034}, + {4113069886, 1463625943, 2992404804, 651058958, 2189818903, 1950745534, 2933992270, 117140756}, + {1710340288, 378624391, 3877861898, 3358951788, 2879315730, 4188209817, 1852543782, 792130251}, + {1067036319, 953490631, 2238027459, 3810061217, 3471370906, 1918881001, 3994155171, 663266529}, + {1964305139, 3993296702, 1442651480, 2468200907, 1246982223, 3156989725, 1150047633, 99060746}, + {2205516974, 1494795341, 700035521, 3044504929, 2811619826, 1822685669, 684159761, 46829120}, + {509495611, 1410224929, 2215073561, 4031893811, 2672144200, 508942503, 1929538738, 264452611}, + {1408212584, 915538834, 635908151, 3884472249, 3123808397, 1479572172, 3755707413, 442480753}, + {1248816856, 3153284924, 3884893510, 3187077201, 1564930355, 89654852, 539574263, 657854691}, + {1889360117, 3220937473, 2952953524, 1792655700, 4260404741, 1990078488, 3399112832, 764246060}, + {2124127824, 3059226654, 3628194885, 3700932865, 644139102, 2202789407, 4085840725, 442199620}, + {2539599255, 10191795, 352865209, 4097461661, 359368503, 2290268893, 2718331647, 515532484}, + {3766315182, 1442322477, 990779650, 3084469334, 959497287, 1277847483, 1483795101, 487515569}, + {1706652271, 3173942204, 2194375971, 4282818903, 2953198, 3996873692, 1793245417, 662931093}, + {1437447817, 1777308524, 3573113749, 1782154480, 4203876438, 2164773950, 1329080999, 633073037}, + {965241858, 4029375758, 2171776340, 690942207, 2180549425, 712463730, 1848190139, 502527284}, + {2179202572, 1472441329, 1187451958, 475387088, 1208311234, 3139515059, 1880469612, 354374917}, + {1601343222, 3873238544, 2474626340, 3376281757, 1677310972, 219923857, 223373027, 504769030}, + {846480696, 3995120012, 209324490, 2347849411, 3120936482, 1251627788, 402248528, 631271249}, + {2533996298, 1992592611, 852073547, 1292227437, 2239484929, 2817998983, 1267025356, 676542083}, + {2516584678, 2555233430, 2158271744, 89577699, 3184733807, 1129844631, 549019606, 223682023}, + {1136687085, 1580563924, 2916324895, 602470653, 1193076748, 1809660961, 2864819260, 421605619}, + {4075830210, 3041467274, 3019230149, 3995832409, 1772082614, 115290157, 900325848, 577829541}, + {224380908, 369534528, 617906435, 3491631729, 4027138368, 583432863, 113312956, 184048741}, + {175358861, 823063274, 457994156, 2399277845, 4019154996, 2301142385, 3845627579, 117971563}, + {76370008, 1579315175, 2488079899, 2562820368, 1604801782, 2407085699, 2532307139, 70745198}, + {644314565, 1305485017, 1798518838, 3537219235, 1453053729, 1586580153, 1272290526, 204208570}, + {3258085405, 2197055553, 4231387493, 1796452054, 3330689090, 2380254209, 3690621389, 465877457}, + {552700463, 2904644716, 3382808133, 2658221391, 2747916975, 64560718, 2973732151, 31189514}, + {685496094, 2889466144, 2043782277, 2230512106, 1163392839, 2349841404, 4220629133, 38961293}, + {1311784161, 1456361316, 3616882681, 1198724727, 409732010, 1549115395, 3560188090, 722526447}, + {429566568, 4162426466, 1842316881, 3391443078, 810340022, 2990668967, 1749446760, 317341044}, + {652256748, 656821699, 2766266173, 3435505110, 1593997594, 2009065219, 4061719246, 767053263}, + {475239708, 3552530477, 2947857214, 2208636109, 1337923410, 2519580529, 1709021662, 529891184}, + {3194560856, 1498762431, 1616429368, 1036819157, 1262555488, 194221814, 1453654521, 221576601}, + {1490020210, 3346004257, 3549505628, 4184018624, 1130241908, 219028722, 2418487614, 562875911}, + {3752258902, 1238787736, 1927135666, 4029277110, 3087250245, 2783801834, 3284738174, 634789597}, + {3853464506, 212040743, 3094337825, 1510835080, 117392722, 1533678505, 3705443692, 776370202}, + {2903145482, 1709222665, 18354261, 927512221, 1495230853, 4005193974, 40724139, 317783047}, + {3856504882, 3698045971, 3358625460, 3981721980, 975700325, 428706748, 2980252944, 603247038}, + {3400022101, 1759041649, 490676943, 1469538795, 3830328360, 3765491799, 626387785, 803522356}, + {2732577350, 2573640830, 1012357954, 3806261879, 3020068749, 1276649184, 2629098625, 668557564}, + {4200038696, 1217782598, 3128163049, 2096661285, 3949976154, 3026090421, 3377264790, 793533907}, + {630972047, 4280311285, 3434635222, 3772346410, 3549849219, 3159981951, 2453973328, 50176526}, + {2445515745, 1214398782, 561237392, 3999087796, 192488841, 1845383626, 2542180138, 668984087}, + {1471261939, 3267356932, 1306250726, 4198336852, 58646793, 3779768781, 1447509702, 556284634}, + {127165838, 637848500, 547193145, 401825856, 141189184, 3175425628, 1753104934, 131511002}, + {564657575, 599712608, 479272614, 1239129151, 2461636009, 2471123613, 3640331281, 645484420}, + {1509998528, 2529298245, 227825877, 2417693463, 851815992, 236388863, 120904994, 603430254}, + {2279988621, 1471110044, 2091122439, 195884591, 3302166925, 204001814, 1881314241, 100921937}, + {655236490, 2234916031, 3371055863, 3141397166, 2024331170, 675289766, 3736560403, 773425906}, + {1881452936, 976769952, 1209168843, 3766223572, 818207738, 2402636297, 1858019172, 131105969}, + {339528405, 2923731488, 1065927063, 959457019, 3364111365, 603328845, 1471101441, 605594091}, + {3928761054, 3585962096, 581446865, 2762888938, 489572626, 265963609, 1553838821, 396580008}, + {4215050105, 1601446162, 2286799234, 1851545795, 3936452700, 4289102077, 3571499578, 432671095}, + {898026239, 378494969, 980998706, 256464757, 4194287688, 593612164, 1567500100, 327141550}, + {330582178, 2544006448, 4147538802, 156057783, 473612603, 2407192710, 929703927, 347005622}, + {299685710, 4184678332, 584163401, 2182754437, 3514265810, 2369541742, 2739775088, 290624746}, + {1467216812, 3876339904, 249267202, 3463320822, 66636192, 955133338, 1459761846, 325081500}, + {1934692786, 3761657895, 275753112, 2349914269, 2291894046, 1324826803, 2346489062, 288061082}, + {2072686050, 633481855, 753414580, 3845402292, 3474579369, 1328164019, 4268207391, 591086888}, + {156206339, 887343971, 47415238, 812969189, 819228412, 3052502825, 4038445006, 279407712}, + {3619975036, 322896317, 3382558397, 4266124956, 3896670116, 1599103643, 1384097395, 221157112}, + {969274818, 3227962518, 2522634178, 1615981241, 3210789221, 2122724434, 1082009090, 4154026}, + {357920728, 1563790903, 4267281373, 185540925, 2368115006, 3512357949, 3974044146, 9324877}, + {841720008, 443324756, 1199732519, 1177633868, 2337635901, 4202903311, 1775474521, 236087517}, + {3427868401, 3605360368, 1156775012, 874275174, 667720787, 2821001992, 3027569291, 731006984}, + {314055569, 156164249, 1507241466, 3009621203, 1956772362, 104461584, 341535724, 70676258}, + {2389852741, 2906313538, 583353154, 637461572, 2112052561, 1913441439, 3745584353, 772219737}, + {1803888082, 191800732, 1902575332, 3038758491, 1989735038, 2508765541, 4164370620, 757119884}, + {4106487790, 2824283355, 3756709729, 2105860656, 3504208062, 469467573, 2519155544, 387923015}, + {3766758202, 3558442699, 954664930, 1823340292, 1768258692, 260193904, 3838230933, 339482114}, + {1221640476, 2538966236, 3198812577, 1086423216, 1949542781, 3143874614, 4114327894, 562021069}, + {2483530296, 2142712418, 3120212372, 737075689, 2322209689, 31314919, 3980230116, 668134702}, + {3046225125, 1014109265, 848864156, 1261722385, 3580701127, 855328150, 497006894, 88035620}, + {2768154050, 916964007, 3257798718, 4081009259, 69701083, 2284125212, 466432066, 730811148}, + {1809826387, 2673607963, 2617474521, 1812880067, 115897584, 1742652388, 68790449, 550995207}, + {2895519998, 1476306435, 3248798745, 1771996108, 770876689, 3753154760, 3333694469, 811139117}, + {1121581122, 2266074962, 4209154978, 338448801, 3117187075, 2293896022, 27884241, 503884838}, + {3624689558, 47223951, 1814129011, 1003058375, 1449119675, 3730568696, 3536494429, 551989931}, + {398456932, 357590477, 2188813151, 3186889853, 149144222, 1451890631, 228056017, 360435734}, + {2148849180, 3784228538, 4085078296, 3171515257, 456622716, 4030761564, 4064542437, 405176932}, + {1547999950, 522351269, 47968381, 1293617220, 3894413802, 2631021100, 2385996741, 115075135}, + {1493553565, 2957118628, 1908959545, 1110413222, 2025843514, 314094594, 233158751, 723928830}, + {1754376520, 2872974039, 75490779, 2243905601, 2805704642, 1538798320, 368558274, 626452303}, + {3886577573, 2699804568, 2168710790, 752456812, 1002854416, 3618496664, 2944051582, 591750251}, + {953978090, 2126725740, 3286894472, 3644587634, 3048895556, 2441653671, 595623370, 458724369}, + {4108165432, 1042721255, 384831783, 2743362485, 2286450578, 928412328, 1628963225, 2376079}, + {3422357401, 3110272672, 2299385570, 1751987437, 503939183, 3190293239, 884908900, 619279216}, + {3017334797, 2470573979, 1038260492, 2763092663, 2637696720, 4049596182, 3133144874, 37337579}, + {3655637138, 3055073633, 1653390975, 1621082732, 1511169867, 1833694650, 1681902885, 544632744}, + {1045461831, 1603552931, 1226766777, 2368123702, 4289186346, 2239214339, 1008724961, 486288308}, + {2435986619, 389143552, 835680875, 911651736, 1093289566, 4194601912, 1653473918, 233566206}, + {2241113346, 4155113300, 46023730, 626921182, 2079932403, 2196959168, 2021902665, 791654192}, + {120194877, 1667064278, 3128459138, 3871495076, 2515877259, 1192181109, 2768309460, 145169074}, + {3688865205, 4198219604, 3647330128, 886177725, 2804168075, 997009595, 3793855061, 766742548}, + {1299864862, 2583664502, 45335596, 4190644134, 3876717168, 590818232, 3173406638, 589076537}, + {3698225400, 3731001659, 55385232, 1636435428, 2706965510, 2798922640, 943430884, 746785700}, + {3839030995, 3640538130, 2706339838, 500182078, 4273503265, 3943563494, 2284638216, 405523523}, + {3819494445, 1366741021, 591486648, 3284221547, 1589535710, 3279848996, 2883637377, 294654102}, + {3729644479, 62173967, 1436298415, 296986345, 1204640776, 2182879715, 686623957, 110488376}, + {2003382538, 2372485237, 2673000997, 3644578925, 2134270505, 2678203411, 2604966736, 399901840}, + {3016360620, 771238042, 3179635286, 3470724789, 1883658385, 3848559149, 3141105689, 582068634}, + {4059107788, 3734855281, 636847329, 1523016729, 1954293767, 173080446, 1573186274, 314891456}, + {2155810088, 3682738653, 3999557056, 3295651473, 3471646751, 3475110033, 2637720676, 646390475}, + {2643861001, 2481864519, 2783799210, 1462351238, 3744852584, 108997253, 2486227997, 528066334}, + {1896212197, 654879670, 4118649165, 4107378342, 3589166786, 2055186111, 2183293465, 477185171}, + {3159043030, 2031895345, 210726707, 904546222, 921886691, 2808336963, 92296964, 204092039}, + {3984274190, 338162196, 1965612074, 4200839294, 1702013313, 3547371997, 2326501314, 359175236}, + {3873939981, 918160748, 719999352, 325235812, 3736727568, 1540746949, 3061905218, 260940289}, + {1949865256, 3849121552, 2774283187, 2286285074, 1534883782, 2858705086, 941195353, 161698721}, + {566442188, 2230198406, 4043201412, 2157870427, 537899638, 2938947582, 3864710310, 664540977}, + {779042658, 4024848178, 2189819141, 1830482362, 903032102, 1205420775, 3664839102, 247558449}, + {2055604392, 584480369, 936048530, 2841061087, 3986476140, 3422457654, 319176904, 544566411}, + {3328241826, 3521004246, 3856166581, 1128827716, 1908073908, 681234780, 3804003456, 246742141}, + {3562033598, 408562682, 932114476, 1779512386, 1557246061, 3232070548, 143850872, 508031205}, + {3068893894, 1699945375, 95072326, 380162655, 4163619045, 2878555869, 2758126912, 48661630}, + {3288954973, 460923481, 4211759489, 3789812366, 754503646, 2861110257, 2746959273, 399135241}, + {1312695895, 2134864527, 4011622401, 593513488, 3115641816, 4250640419, 1154272147, 506516945}, + {2725408285, 2378362001, 2515566640, 2343214864, 2840644294, 1838430765, 2667561529, 719201936}, + {2338819695, 2652707461, 1866210749, 4041796404, 2097783059, 3540808294, 4207202316, 142196627}, + {2425934380, 3132549394, 2938346576, 1653611510, 3058773220, 2215264988, 1454808225, 713876665}, + {2154659724, 574465326, 3724811677, 3971629061, 3537917855, 504672427, 3000701836, 718520371}, + {2878971177, 1694249194, 2958641398, 4272085746, 3255016160, 2251019493, 4125079418, 426606271}, + {2174308947, 361550695, 1648557687, 3938069798, 2640598076, 4153395941, 4007562753, 547943387}, + {3765986238, 742361021, 3291104456, 3862255196, 2744864310, 3162901149, 4057811428, 62919153}, + {2648627008, 871771880, 2513512325, 476737119, 2139393580, 1274573502, 720105572, 499386544}, + {2102633499, 2724505735, 8315785, 3887975051, 903840253, 1880757888, 1375970494, 617020086}, + {2825877243, 114411527, 2587199526, 429504238, 2895455343, 1651209214, 3767398660, 427621101}, + {4053898422, 2517408032, 227584195, 3115835701, 1092678644, 3035506316, 271706561, 764483171}, + {123298172, 974371973, 115391342, 371605524, 3249509274, 959400518, 1183797521, 61027048}, + {2334313695, 2440863540, 1623345496, 2145938907, 2124167763, 2656785243, 2741062215, 787902873}, + {299210667, 2999704195, 3597933086, 1478342148, 139835572, 3477868771, 1534822061, 181508822}, + {1968236708, 1343966666, 3812968813, 43543201, 1772422278, 2787623394, 1654602274, 776752108}, + {1340419520, 337893080, 3669365346, 2983128228, 2793542927, 1828433537, 1448539106, 2063974}, + {2901860526, 3045541455, 3832449033, 3787425530, 2512667701, 3436438067, 2344391803, 373349620}, + {2467664356, 3140250175, 3846651450, 2802957584, 2079968058, 3230710970, 944995356, 629690269}, + {2168837184, 1685859611, 674855659, 2758026530, 376784106, 3984629646, 3509458712, 749039474}, + {137066443, 703657165, 2965395209, 2898312763, 2719300053, 3802883986, 3798825571, 542056121}, + {1212150667, 632887654, 892076253, 1858136194, 2640420270, 3638681911, 3781702696, 290645292}, + {1164725967, 2000822852, 3064707803, 1922407331, 4200262130, 4027489754, 1146274704, 710082705}, + {575601260, 3924609676, 1738545252, 3393796198, 2925205037, 977361721, 2443437419, 281320515}, + {2637129137, 1598284963, 822958391, 2516932546, 2661240029, 4122880721, 115573470, 473149543}, + {3937296396, 327154214, 570581226, 4277837132, 570623704, 2237583022, 3580530368, 776858125}, + {272163749, 3159190602, 3989632589, 3679304778, 1712452504, 2291307718, 3858773464, 6080126}, + {3728960685, 2528545790, 1450735158, 3994162057, 3192627643, 1189497620, 4088700445, 764871895}, + {488661351, 3349186973, 3568927615, 878899955, 1675473565, 2574603860, 3310397114, 652003274}, + {3282064541, 1110207726, 2323623339, 2412346205, 2004453776, 780068018, 1092378330, 698268181}, + {2081702688, 2378009917, 1207599696, 1187620815, 2782253692, 3694845144, 3296027736, 8248056}, + {3448644472, 3541610635, 4161883412, 902128778, 1070704453, 1329825368, 2744806391, 493092959}, + {2338786821, 950433588, 352509907, 2362228480, 742980155, 2754293856, 1462912185, 509358725}, + {2124257514, 2072351377, 3636933989, 107955755, 3245302764, 1106793144, 1141174865, 108842064}, + {3924959551, 2548878828, 1273937440, 1092120862, 4077110635, 2704265836, 4121645682, 293099906}, + {4083357445, 2483798295, 339869049, 3930963976, 4077461703, 4206357577, 2235436495, 475371872}, + {1409997637, 1019605867, 910600654, 818163324, 2331964467, 2975276179, 1408951801, 529250859}, + {2649389877, 171095272, 1846213223, 4218584093, 1730796868, 3393573382, 387438671, 132708538}, + {4167791645, 4093687969, 679331171, 2007151957, 4255500724, 551111197, 3778154110, 199490944}, + {1478439363, 3074852108, 1031218341, 3759351524, 3109576215, 2128901070, 4191100607, 21015303}, + {2012838243, 3442832362, 2338178451, 1584280351, 2877542223, 3084694501, 4226797601, 635093626}, + {2994829204, 2103649692, 3742283604, 1370660152, 827727920, 3187977030, 3200533592, 560909511}, + {195082300, 4279600851, 742417698, 2704641315, 635348433, 1140395235, 595299507, 734255112}, + {1500143258, 122407698, 540089290, 2873694132, 1074584392, 3759440530, 1728988876, 437454860}, + {2591073364, 2395517442, 2307098416, 391220324, 3205891353, 3972711241, 1671220732, 52209818}, + {3507002746, 2267622199, 2726635114, 608404605, 2757046855, 3433233405, 2381785554, 671283540}, + {397952786, 1640941657, 1490858523, 4232129674, 2559588433, 3911950936, 23268775, 737915368}, + {3305972515, 4021298069, 1866733159, 2431363183, 2012880693, 113794215, 3399236312, 456599976}, + {1531311680, 2883060700, 4159283203, 2024176822, 1478044871, 349309568, 32933276, 595785539}, + {3525632835, 4149782763, 1437863145, 2022063596, 1090440364, 3376387974, 4270214611, 378063113}, + {1382718473, 2444845994, 2509738699, 1772705019, 3198024579, 3961444780, 326778322, 504226175}, + {949643722, 1740903997, 3054951525, 2064442597, 498018081, 799819209, 731526912, 130900632}, + {3852092554, 1797952292, 4214615662, 4116490146, 3841711657, 3194526082, 856575726, 417375987}, + {1983810039, 1339673319, 3881108023, 2527862150, 3066527514, 1307432750, 3113304185, 762722646}, + {802916785, 905490236, 1403326435, 4282875544, 2011151857, 1545961089, 1969342895, 241617266}, + {2878406046, 845163802, 4193158306, 2425421676, 2690409718, 3823938474, 1928553469, 735101495}, + {2067366171, 3926970854, 2399223722, 822549143, 3170845593, 1587230119, 1023017065, 320107511}, + {740637098, 1926564339, 725185090, 2698693274, 3813802008, 405763459, 1945965061, 269622414}, + {1285295219, 2909658108, 1244685838, 3787083814, 3942635565, 3751918901, 446211910, 242117621}, + {2301362579, 3475411391, 2790374393, 1929731246, 1893330106, 2181110046, 2830785545, 312515590}, + {914782000, 4127953204, 102315094, 1013395951, 1303690415, 646606119, 2078941260, 364224220}, + {3338735837, 2781778263, 3211131981, 846193003, 712968076, 1844318704, 1066926082, 516306317}, + {2733183244, 562543819, 2001076972, 3825465585, 2175211557, 4184744051, 2968140681, 610818895}, + {167105798, 2655547678, 636122995, 3232066241, 3791797598, 797796963, 2521200954, 46324327}, + {3207319311, 2037242548, 3655207130, 1390017981, 4178311115, 1445899239, 3668672210, 456152376}, + {2597741236, 3388296694, 3578242003, 3327242923, 1519877084, 2717830190, 4170815274, 662864829}, + {2548507947, 3599600074, 1763811751, 2194267512, 2783830901, 2977894111, 4189763554, 611228145}, + {1638796406, 2163342869, 701054890, 101818028, 1729197517, 2335614605, 1409612971, 625196520}, + {163691126, 148535504, 2470178440, 518829363, 459671689, 2241251144, 1295564083, 198257532}, + {3060089510, 3767525153, 1524537602, 493464086, 1472043510, 3020385367, 2373960485, 641738582}, + {2326580689, 675933614, 884790534, 1441212202, 62854709, 1586622145, 337933918, 106534431}, + {3507869150, 3602860791, 1458797176, 88195554, 717702406, 2258039207, 3110978212, 133681376}, + {712473541, 756874562, 3416163791, 3208511936, 3644626579, 2547902695, 3325507275, 502757995}, + {1399531059, 567606245, 2667525622, 2479231013, 2706338488, 1850625964, 1730422473, 756781990}, + {1690972462, 3319884643, 2662147254, 1338138163, 3001219639, 2880788337, 54659940, 451149226}, + {3703205063, 1746349340, 621341009, 670007788, 1446599915, 430938520, 1642990285, 578286421}, + {1714814633, 3940910729, 1826052679, 3479857199, 1470726107, 3882030171, 1050453602, 290318682}, + {1305680512, 2741545869, 3360323819, 3241661327, 3880682192, 3614120258, 698369802, 482896054}, + {3784416176, 3055328299, 599310350, 865953882, 531714558, 3245189532, 3694970420, 571581830}, + {674779390, 3051875043, 2243721812, 1970583415, 1332759222, 814816987, 3283900599, 99861440}, + {702694070, 1327443076, 1691951475, 1148430054, 1070842505, 2867159869, 1555778465, 3218353}, + {2390139095, 1705718610, 3639557823, 189154351, 1464350507, 2214503432, 3358953892, 698766753}, + {2219136925, 3940498260, 3249438609, 769465176, 983865597, 4258208269, 3033494813, 638685103}, + {1920347909, 3357418334, 4043129735, 4026029976, 2839949, 24881067, 394486129, 478866805}, + {4072794518, 4100371636, 1665066205, 4122816256, 1741252354, 2457476932, 2045411878, 219611787}, + {1908156039, 3623833604, 2533384152, 1682900079, 3851122178, 1141275795, 465452611, 419398832}, + {3305018847, 2351897039, 2081765783, 2280495775, 1414969592, 3263551610, 54853103, 101173981}, + {1029902547, 361327663, 373918337, 640324612, 4198729026, 3516470706, 875102320, 451679868}}; + + if (number_of_blocks == 1024) { + for (int i = 0; i < number_of_blocks; i++) { +#ifdef DEBUG + // std::cout << out_ptr[i] << std::endl; +#endif + assert((out_ptr[i] == expected[i])); + } + printf("Expected output matches\n"); + } + + free(in_ptr); + free(out_ptr); +} + +#endif \ No newline at end of file diff --git a/wrappers/rust/icicle-core/Cargo.toml b/wrappers/rust/icicle-core/Cargo.toml index 0d962ae9..77defe74 100644 --- a/wrappers/rust/icicle-core/Cargo.toml +++ b/wrappers/rust/icicle-core/Cargo.toml @@ -11,14 +11,13 @@ repository.workspace = true [dependencies] icicle-cuda-runtime = { workspace = true } - ark-ff = { version = "0.4.0", optional = true } ark-ec = { version = "0.4.0", optional = true, features = ["parallel"] } ark-poly = { version = "0.4.0", optional = true } ark-std = { version = "0.4.0", optional = true } rayon = "1.8.1" - +hex = "0.4" criterion = "0.3" [dev-dependencies] diff --git a/wrappers/rust/icicle-core/src/field.rs b/wrappers/rust/icicle-core/src/field.rs index 6eafeb65..69e57b59 100644 --- a/wrappers/rust/icicle-core/src/field.rs +++ b/wrappers/rust/icicle-core/src/field.rs @@ -3,6 +3,7 @@ use crate::traits::ArkConvertible; use crate::traits::{FieldConfig, FieldImpl, MontgomeryConvertible}; #[cfg(feature = "arkworks")] use ark_ff::{BigInteger, Field as ArkField, PrimeField}; +use hex::FromHex; use icicle_cuda_runtime::device_context::DeviceContext; use icicle_cuda_runtime::error::CudaError; use icicle_cuda_runtime::memory::DeviceSlice; @@ -82,6 +83,12 @@ impl FieldImpl for Field { Self::from(limbs) } + fn from_hex(s: &str) -> Self { + let mut bytes = Vec::from_hex(if s.starts_with("0x") { &s[2..] } else { s }).expect("Invalid hex string"); + bytes.reverse(); + Self::from_bytes_le(&bytes) + } + fn zero() -> Self { FieldImpl::from_u32(0) } diff --git a/wrappers/rust/icicle-core/src/lib.rs b/wrappers/rust/icicle-core/src/lib.rs index 9719bcca..1923968a 100644 --- a/wrappers/rust/icicle-core/src/lib.rs +++ b/wrappers/rust/icicle-core/src/lib.rs @@ -6,6 +6,7 @@ pub mod msm; pub mod ntt; pub mod polynomials; pub mod poseidon; +pub mod poseidon2; #[doc(hidden)] pub mod tests; pub mod traits; diff --git a/wrappers/rust/icicle-core/src/poseidon/tests.rs b/wrappers/rust/icicle-core/src/poseidon/tests.rs index 4508a8b5..93f37576 100644 --- a/wrappers/rust/icicle-core/src/poseidon/tests.rs +++ b/wrappers/rust/icicle-core/src/poseidon/tests.rs @@ -56,10 +56,11 @@ pub fn check_poseidon_hash_many() where ::Config: Poseidon, { - let arity = 2u32; - let constants = init_poseidon::(arity as u32); + for arity in [2, 4] { + let constants = init_poseidon::(arity as u32); - _check_poseidon_hash_many(constants); + _check_poseidon_hash_many(constants); + } } pub fn check_poseidon_custom_config(field_bytes: usize, field_prefix: &str, partial_rounds: u32) diff --git a/wrappers/rust/icicle-core/src/poseidon2/mod.rs b/wrappers/rust/icicle-core/src/poseidon2/mod.rs new file mode 100644 index 00000000..5754c97b --- /dev/null +++ b/wrappers/rust/icicle-core/src/poseidon2/mod.rs @@ -0,0 +1,384 @@ +#[doc(hidden)] +pub mod tests; + +use icicle_cuda_runtime::{ + device::check_device, + device_context::{DeviceContext, DEFAULT_DEVICE_ID}, + memory::{DeviceSlice, HostOrDeviceSlice}, +}; + +use crate::{error::IcicleResult, traits::FieldImpl}; + +#[repr(C)] +#[derive(Debug, Clone)] +pub enum DiffusionStrategy { + Default, + Montgomery, +} + +#[repr(C)] +#[derive(Debug, Clone)] +pub enum MdsType { + Default, + Plonky, +} + +#[repr(C)] +#[derive(Debug, Clone)] +pub enum PoseidonMode { + Compression, + Permutation, +} + +#[repr(C)] +pub struct Poseidon2Constants<'a, F: FieldImpl> { + width: u32, + + alpha: u32, + + internal_rounds: u32, + + external_rounds: u32, + + round_constants: &'a DeviceSlice, + + inernal_matrix_diag: &'a DeviceSlice, + + pub mds_type: MdsType, + + pub diffusion: DiffusionStrategy, +} + +impl std::fmt::Debug for Poseidon2Constants<'_, F> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}, {}, {}, {}", + self.width, self.alpha, self.internal_rounds, self.external_rounds + ) + } +} + +/// Struct that encodes Poseidon parameters to be passed into the [poseidon_hash_many](poseidon_hash_many) function. +#[repr(C)] +#[derive(Debug, Clone)] +pub struct Poseidon2Config<'a> { + /// Details related to the device such as its id and stream id. See [DeviceContext](@ref device_context::DeviceContext). + pub ctx: DeviceContext<'a>, + + are_states_on_device: bool, + + are_outputs_on_device: bool, + + pub mode: PoseidonMode, + + pub output_index: u32, + + /// If true, hash results will also be copied in the input pointer in aligned format + pub loop_state: bool, + + /// Whether to run Poseidon asynchronously. If set to `true`, Poseidon will be non-blocking + /// and you'd need to synchronize it explicitly by running `cudaStreamSynchronize` or `cudaDeviceSynchronize`. + /// If set to `false`, Poseidon will block the current CPU thread. + pub is_async: bool, +} + +impl<'a> Default for Poseidon2Config<'a> { + fn default() -> Self { + Self::default_for_device(DEFAULT_DEVICE_ID) + } +} + +impl<'a> Poseidon2Config<'a> { + pub fn default_for_device(device_id: usize) -> Self { + Self { + ctx: DeviceContext::default_for_device(device_id), + are_states_on_device: false, + are_outputs_on_device: false, + mode: PoseidonMode::Compression, + output_index: 1, + loop_state: false, + is_async: false, + } + } +} + +pub trait Poseidon2 { + fn create_optimized_constants<'a>( + width: u32, + alpha: u32, + internal_rounds: u32, + external_rounds: u32, + round_constants: &mut [F], + internal_matrix_diag: &mut [F], + mds_type: MdsType, + diffusion: DiffusionStrategy, + ctx: &DeviceContext, + ) -> IcicleResult>; + fn load_optimized_constants<'a>( + width: u32, + mds_type: MdsType, + diffusion: DiffusionStrategy, + ctx: &DeviceContext, + ) -> IcicleResult>; + fn poseidon_unchecked( + states: &mut (impl HostOrDeviceSlice + ?Sized), + output: &mut (impl HostOrDeviceSlice + ?Sized), + number_of_states: u32, + width: u32, + constants: &Poseidon2Constants, + config: &Poseidon2Config, + ) -> IcicleResult<()>; +} + +/// Loads pre-calculated poseidon constants on the GPU. +pub fn load_optimized_poseidon2_constants<'a, F>( + width: u32, + mds_type: MdsType, + diffusion: DiffusionStrategy, + ctx: &DeviceContext, +) -> IcicleResult> +where + F: FieldImpl, + ::Config: Poseidon2, +{ + <::Config as Poseidon2>::load_optimized_constants(width, mds_type, diffusion, ctx) +} + +/// Creates new instance of poseidon constants on the GPU. +pub fn create_optimized_poseidon2_constants<'a, F>( + width: u32, + alpha: u32, + ctx: &DeviceContext, + internal_rounds: u32, + external_rounds: u32, + round_constants: &mut [F], + internal_matrix_diag: &mut [F], + mds_type: MdsType, + diffusion: DiffusionStrategy, +) -> IcicleResult> +where + F: FieldImpl, + ::Config: Poseidon2, +{ + <::Config as Poseidon2>::create_optimized_constants( + width, + alpha, + internal_rounds, + external_rounds, + round_constants, + internal_matrix_diag, + mds_type, + diffusion, + ctx, + ) +} + +/// Computes the poseidon hashes for multiple preimages. +/// +/// # Arguments +/// +/// * `input` - a pointer to the input data. May point to a vector of preimages or a vector of states filled with preimages. +/// +/// * `output` - a pointer to the output data. Must be at least of size [number_of_states](number_of_states) +/// +/// * `number_of_states` - number of input blocks of size `arity` +/// +/// * `arity` - the arity of the hash function (the size of 1 preimage) +/// +/// * `constants` - Poseidon constants. +/// +/// * `config` - config used to specify extra arguments of the Poseidon. +pub fn poseidon_hash_many( + states: &mut (impl HostOrDeviceSlice + ?Sized), + output: &mut (impl HostOrDeviceSlice + ?Sized), + number_of_states: u32, + width: u32, + constants: &Poseidon2Constants, + config: &Poseidon2Config, +) -> IcicleResult<()> +where + F: FieldImpl, + ::Config: Poseidon2, +{ + if states.len() < (number_of_states * width) as usize { + panic!( + "input len is {}; but needs to be at least {}", + states.len(), + number_of_states * width + ); + } + + if output.len() < number_of_states as usize { + panic!( + "output len is {}; but needs to be at least {}", + output.len(), + number_of_states + ); + } + + let ctx_device_id = config + .ctx + .device_id; + if let Some(device_id) = states.device_id() { + assert_eq!( + device_id, ctx_device_id, + "Device ids in input and context are different" + ); + } + if let Some(device_id) = output.device_id() { + assert_eq!( + device_id, ctx_device_id, + "Device ids in output and context are different" + ); + } + check_device(ctx_device_id); + let mut local_cfg = config.clone(); + local_cfg.are_states_on_device = states.is_on_device(); + local_cfg.are_outputs_on_device = output.is_on_device(); + + <::Config as Poseidon2>::poseidon_unchecked( + states, + output, + number_of_states, + width, + constants, + &local_cfg, + ) +} + +#[macro_export] +macro_rules! impl_poseidon2 { + ( + $field_prefix:literal, + $field_prefix_ident:ident, + $field:ident, + $field_config:ident + ) => { + mod $field_prefix_ident { + use crate::poseidon2::{ + $field, $field_config, CudaError, DeviceContext, DiffusionStrategy, MdsType, Poseidon2Config, + Poseidon2Constants, + }; + extern "C" { + #[link_name = concat!($field_prefix, "_create_optimized_poseidon2_constants_cuda")] + pub(crate) fn _create_optimized_constants( + width: u32, + alpha: u32, + internal_rounds: u32, + external_rounds: u32, + constants: *mut $field, + internal_matrix_diag: *mut $field, + mds_type: MdsType, + diffusion: DiffusionStrategy, + ctx: &DeviceContext, + poseidon_constants: *mut Poseidon2Constants<$field>, + ) -> CudaError; + + #[link_name = concat!($field_prefix, "_init_optimized_poseidon2_constants_cuda")] + pub(crate) fn _load_optimized_constants( + width: u32, + mds_type: MdsType, + diffusion: DiffusionStrategy, + ctx: &DeviceContext, + constants: *mut Poseidon2Constants<$field>, + ) -> CudaError; + + #[link_name = concat!($field_prefix, "_poseidon2_hash_cuda")] + pub(crate) fn hash_many( + states: *mut $field, + output: *mut $field, + number_of_states: u32, + width: u32, + constants: &Poseidon2Constants<$field>, + config: &Poseidon2Config, + ) -> CudaError; + } + } + + impl Poseidon2<$field> for $field_config { + fn create_optimized_constants<'a>( + width: u32, + alpha: u32, + internal_rounds: u32, + external_rounds: u32, + round_constants: &mut [$field], + internal_matrix_diag: &mut [$field], + mds_type: MdsType, + diffusion: DiffusionStrategy, + ctx: &DeviceContext, + ) -> IcicleResult> { + unsafe { + let mut poseidon_constants = MaybeUninit::>::uninit(); + let err = $field_prefix_ident::_create_optimized_constants( + width, + alpha, + internal_rounds, + external_rounds, + round_constants as *mut _ as *mut $field, + internal_matrix_diag as *mut _ as *mut $field, + mds_type, + diffusion, + ctx, + poseidon_constants.as_mut_ptr(), + ) + .wrap(); + err.and(Ok(poseidon_constants.assume_init())) + } + } + + fn load_optimized_constants<'a>( + width: u32, + mds_type: MdsType, + diffusion: DiffusionStrategy, + ctx: &DeviceContext, + ) -> IcicleResult> { + unsafe { + let mut constants = MaybeUninit::>::uninit(); + let err = $field_prefix_ident::_load_optimized_constants( + width, + mds_type, + diffusion, + ctx, + constants.as_mut_ptr(), + ) + .wrap(); + err.and(Ok(constants.assume_init())) + } + } + + fn poseidon_unchecked( + states: &mut (impl HostOrDeviceSlice<$field> + ?Sized), + output: &mut (impl HostOrDeviceSlice<$field> + ?Sized), + number_of_states: u32, + width: u32, + constants: &Poseidon2Constants<$field>, + config: &Poseidon2Config, + ) -> IcicleResult<()> { + unsafe { + $field_prefix_ident::hash_many( + states.as_mut_ptr(), + output.as_mut_ptr(), + number_of_states, + width, + constants, + config, + ) + .wrap() + } + } + } + }; +} + +#[macro_export] +macro_rules! impl_poseidon2_tests { + ( + $field:ident + ) => { + #[test] + fn test_poseidon2_hash_many() { + check_poseidon_hash_many::<$field>() + } + }; +} diff --git a/wrappers/rust/icicle-core/src/poseidon2/tests.rs b/wrappers/rust/icicle-core/src/poseidon2/tests.rs new file mode 100644 index 00000000..c07ea417 --- /dev/null +++ b/wrappers/rust/icicle-core/src/poseidon2/tests.rs @@ -0,0 +1,105 @@ +use crate::poseidon2::{MdsType, PoseidonMode}; +use crate::traits::FieldImpl; +use icicle_cuda_runtime::device_context::DeviceContext; +use icicle_cuda_runtime::memory::{HostOrDeviceSlice, HostSlice}; + +use super::{ + load_optimized_poseidon2_constants, poseidon_hash_many, DiffusionStrategy, Poseidon2, Poseidon2Config, + Poseidon2Constants, +}; + +pub fn init_poseidon<'a, F: FieldImpl>( + width: u32, + mds_type: MdsType, + diffusion: DiffusionStrategy, +) -> Poseidon2Constants<'a, F> +where + ::Config: Poseidon2, +{ + let ctx = DeviceContext::default(); + load_optimized_poseidon2_constants::(width, mds_type, diffusion, &ctx).unwrap() +} + +fn _check_poseidon_hash_many(width: u32, constants: Poseidon2Constants) -> (F, F) +where + ::Config: Poseidon2, +{ + let test_size = 1 << 10; + let mut inputs = vec![F::one(); test_size * width as usize]; + let mut outputs = vec![F::zero(); test_size]; + + let input_slice = HostSlice::from_mut_slice(&mut inputs); + let output_slice = HostSlice::from_mut_slice(&mut outputs); + + let config = Poseidon2Config::default(); + poseidon_hash_many::( + input_slice, + output_slice, + test_size as u32, + width as u32, + &constants, + &config, + ) + .unwrap(); + + let a1 = output_slice[0]; + let a2 = output_slice[output_slice.len() - 2]; + + assert_eq!(a1, a2); + + (a1, a2) +} + +pub fn check_poseidon_hash_many<'a, F: FieldImpl + 'a>() +where + ::Config: Poseidon2, +{ + let widths = [2, 3, 4, 8, 12, 16, 20, 24]; + for width in widths { + let constants = init_poseidon::<'a, F>(width as u32, MdsType::Default, DiffusionStrategy::Default); + + _check_poseidon_hash_many(width, constants); + } +} + +pub fn check_poseidon_kats<'a, F: FieldImpl>(width: usize, kats: &[F], constants: &Poseidon2Constants<'a, F>) +where + ::Config: Poseidon2, +{ + assert_eq!(width, kats.len()); + + let batch_size = 1024; + let mut input = vec![F::one(); width]; + let mut outputs = vec![F::zero(); width * batch_size]; + + for i in 0..width { + input[i] = F::from_u32(i as u32); + } + + let mut inputs: Vec = std::iter::repeat(input.clone()) + .take(batch_size) + .flatten() + .collect(); + + let input_slice = HostSlice::from_mut_slice(&mut inputs); + let output_slice = HostSlice::from_mut_slice(&mut outputs); + + let mut config = Poseidon2Config::default(); + config.mode = PoseidonMode::Permutation; + poseidon_hash_many::( + input_slice, + output_slice, + batch_size as u32, + width as u32, + &constants, + &config, + ) + .unwrap(); + + for (i, val) in output_slice + .iter() + .enumerate() + { + assert_eq!(*val, kats[i % width]); + } +} diff --git a/wrappers/rust/icicle-core/src/traits.rs b/wrappers/rust/icicle-core/src/traits.rs index f63c6690..1a33863e 100644 --- a/wrappers/rust/icicle-core/src/traits.rs +++ b/wrappers/rust/icicle-core/src/traits.rs @@ -27,6 +27,7 @@ pub trait FieldImpl: fn to_bytes_le(&self) -> Vec; fn from_bytes_le(bytes: &[u8]) -> Self; + fn from_hex(s: &str) -> Self; fn zero() -> Self; fn one() -> Self; fn from_u32(val: u32) -> Self; diff --git a/wrappers/rust/icicle-curves/icicle-bn254/src/lib.rs b/wrappers/rust/icicle-curves/icicle-bn254/src/lib.rs index 71a597c7..ec80fcae 100644 --- a/wrappers/rust/icicle-curves/icicle-bn254/src/lib.rs +++ b/wrappers/rust/icicle-curves/icicle-bn254/src/lib.rs @@ -1,9 +1,11 @@ pub mod curve; pub mod ecntt; + pub mod msm; pub mod ntt; pub mod polynomials; pub mod poseidon; +pub mod poseidon2; pub mod tree; pub mod vec_ops; diff --git a/wrappers/rust/icicle-curves/icicle-bn254/src/poseidon2/mod.rs b/wrappers/rust/icicle-curves/icicle-bn254/src/poseidon2/mod.rs new file mode 100644 index 00000000..827a7524 --- /dev/null +++ b/wrappers/rust/icicle-curves/icicle-bn254/src/poseidon2/mod.rs @@ -0,0 +1,35 @@ +use crate::curve::{ScalarCfg, ScalarField}; + +use icicle_core::error::IcicleResult; +use icicle_core::impl_poseidon2; +use icicle_core::poseidon2::{DiffusionStrategy, MdsType, Poseidon2, Poseidon2Config, Poseidon2Constants}; +use icicle_core::traits::IcicleResultWrap; +use icicle_cuda_runtime::device_context::DeviceContext; +use icicle_cuda_runtime::error::CudaError; +use icicle_cuda_runtime::memory::HostOrDeviceSlice; + +use core::mem::MaybeUninit; + +impl_poseidon2!("bn254", bn254, ScalarField, ScalarCfg); + +#[cfg(test)] +pub(crate) mod tests { + use crate::curve::ScalarField; + use icicle_core::impl_poseidon2_tests; + use icicle_core::ntt::FieldImpl; + use icicle_core::poseidon2::{tests::*, DiffusionStrategy, MdsType}; + + impl_poseidon2_tests!(ScalarField); + + #[test] + fn test_poseidon2_kats() { + let kats = [ + ScalarField::from_hex("0x0bb61d24daca55eebcb1929a82650f328134334da98ea4f847f760054f4a3033"), + ScalarField::from_hex("0x303b6f7c86d043bfcbcc80214f26a30277a15d3f74ca654992defe7ff8d03570"), + ScalarField::from_hex("0x1ed25194542b12eef8617361c3ba7c52e660b145994427cc86296242cf766ec8"), + ]; + + let constants = init_poseidon::(3, MdsType::Default, DiffusionStrategy::Default); + check_poseidon_kats(3, &kats, &constants); + } +} diff --git a/wrappers/rust/icicle-fields/icicle-babybear/Cargo.toml b/wrappers/rust/icicle-fields/icicle-babybear/Cargo.toml index 3d8fd6f9..8d990616 100644 --- a/wrappers/rust/icicle-fields/icicle-babybear/Cargo.toml +++ b/wrappers/rust/icicle-fields/icicle-babybear/Cargo.toml @@ -17,10 +17,13 @@ cmake = "0.1.50" [dev-dependencies] risc0-core = "0.21.0" risc0-zkp = "0.21.0" -p3-baby-bear = { git = "https://github.com/Plonky3/Plonky3", rev = "83590121c8c28011cffa7e73cb71cf9bf94b8477" } -p3-field = { git = "https://github.com/Plonky3/Plonky3", rev = "83590121c8c28011cffa7e73cb71cf9bf94b8477" } -p3-dft = { git = "https://github.com/Plonky3/Plonky3", rev = "83590121c8c28011cffa7e73cb71cf9bf94b8477" } -p3-matrix = { git = "https://github.com/Plonky3/Plonky3", rev = "83590121c8c28011cffa7e73cb71cf9bf94b8477" } +p3-baby-bear = { git = "https://github.com/Plonky3/Plonky3", rev = "1e87146ebfaedc2150b635b10a096b733795fdce" } +p3-symmetric = { git = "https://github.com/Plonky3/Plonky3", rev = "1e87146ebfaedc2150b635b10a096b733795fdce" } +p3-mds = { git = "https://github.com/Plonky3/Plonky3", rev = "1e87146ebfaedc2150b635b10a096b733795fdce" } +p3-poseidon2 = { git = "https://github.com/Plonky3/Plonky3", rev = "1e87146ebfaedc2150b635b10a096b733795fdce" } +p3-field = { git = "https://github.com/Plonky3/Plonky3", rev = "1e87146ebfaedc2150b635b10a096b733795fdce" } +p3-dft = { git = "https://github.com/Plonky3/Plonky3", rev = "1e87146ebfaedc2150b635b10a096b733795fdce" } +p3-matrix = { git = "https://github.com/Plonky3/Plonky3", rev = "1e87146ebfaedc2150b635b10a096b733795fdce" } serial_test = "3.0.0" [features] diff --git a/wrappers/rust/icicle-fields/icicle-babybear/src/lib.rs b/wrappers/rust/icicle-fields/icicle-babybear/src/lib.rs index a95ac089..64672611 100644 --- a/wrappers/rust/icicle-fields/icicle-babybear/src/lib.rs +++ b/wrappers/rust/icicle-fields/icicle-babybear/src/lib.rs @@ -1,4 +1,5 @@ pub mod field; pub mod ntt; pub mod polynomials; +pub mod poseidon2; pub mod vec_ops; diff --git a/wrappers/rust/icicle-fields/icicle-babybear/src/ntt/mod.rs b/wrappers/rust/icicle-fields/icicle-babybear/src/ntt/mod.rs index a1747815..49802276 100644 --- a/wrappers/rust/icicle-fields/icicle-babybear/src/ntt/mod.rs +++ b/wrappers/rust/icicle-fields/icicle-babybear/src/ntt/mod.rs @@ -120,7 +120,7 @@ pub(crate) mod tests { ntt_cfg.columns_batch = true; ntt_inplace(HostSlice::from_mut_slice(&mut scalars[..]), NTTDir::kForward, &ntt_cfg).unwrap(); - let result_p3 = Radix2Dit.dft_batch(matrix_p3); + let result_p3 = Radix2Dit::default().dft_batch(matrix_p3); for i in 0..nrows { for j in 0..ntt_size { @@ -156,7 +156,7 @@ pub(crate) mod tests { ) .unwrap(); - let ext_result_p3 = Radix2Dit.dft_batch(ext_matrix_p3); + let ext_result_p3 = Radix2Dit::default().dft_batch(ext_matrix_p3); for i in 0..nrows { for j in 0..ntt_size { diff --git a/wrappers/rust/icicle-fields/icicle-babybear/src/poseidon2/mod.rs b/wrappers/rust/icicle-fields/icicle-babybear/src/poseidon2/mod.rs new file mode 100644 index 00000000..0b3f9d2e --- /dev/null +++ b/wrappers/rust/icicle-fields/icicle-babybear/src/poseidon2/mod.rs @@ -0,0 +1,633 @@ +use crate::field::{ScalarCfg, ScalarField}; + +use icicle_core::error::IcicleResult; +use icicle_core::impl_poseidon2; +use icicle_core::poseidon2::{DiffusionStrategy, MdsType, Poseidon2, Poseidon2Config, Poseidon2Constants}; +use icicle_core::traits::IcicleResultWrap; +use icicle_cuda_runtime::device_context::DeviceContext; +use icicle_cuda_runtime::error::CudaError; +use icicle_cuda_runtime::memory::HostOrDeviceSlice; + +use core::mem::MaybeUninit; + +impl_poseidon2!("babybear", babybear, ScalarField, ScalarCfg); + +#[cfg(test)] +pub(crate) mod tests { + use crate::field::ScalarField; + use icicle_core::impl_poseidon2_tests; + use icicle_core::poseidon2::{create_optimized_poseidon2_constants, tests::*, DiffusionStrategy, MdsType}; + use icicle_core::traits::FieldImpl; + use icicle_cuda_runtime::device_context::DeviceContext; + + use p3_baby_bear::BabyBear; + use p3_baby_bear::DiffusionMatrixBabyBear; + use p3_field::{AbstractField, PrimeField32}; + use p3_poseidon2::{Poseidon2, Poseidon2ExternalMatrixGeneral}; + use p3_symmetric::Permutation; + + impl_poseidon2_tests!(ScalarField); + + #[test] + fn test_poseidon2_kats() { + let kats = [ + ScalarField::from_hex("0x2ed3e23d"), + ScalarField::from_hex("0x12921fb0"), + ScalarField::from_hex("0x0e659e79"), + ScalarField::from_hex("0x61d81dc9"), + ScalarField::from_hex("0x32bae33b"), + ScalarField::from_hex("0x62486ae3"), + ScalarField::from_hex("0x1e681b60"), + ScalarField::from_hex("0x24b91325"), + ScalarField::from_hex("0x2a2ef5b9"), + ScalarField::from_hex("0x50e8593e"), + ScalarField::from_hex("0x5bc818ec"), + ScalarField::from_hex("0x10691997"), + ScalarField::from_hex("0x35a14520"), + ScalarField::from_hex("0x2ba6a3c5"), + ScalarField::from_hex("0x279d47ec"), + ScalarField::from_hex("0x55014e81"), + ScalarField::from_hex("0x5953a67f"), + ScalarField::from_hex("0x2f403111"), + ScalarField::from_hex("0x6b8828ff"), + ScalarField::from_hex("0x1801301f"), + ScalarField::from_hex("0x2749207a"), + ScalarField::from_hex("0x3dc9cf21"), + ScalarField::from_hex("0x3c985ba2"), + ScalarField::from_hex("0x57a99864"), + ]; + + let constants = init_poseidon::(24, MdsType::Default, DiffusionStrategy::Default); + check_poseidon_kats(24, &kats, &constants); + } + + #[test] + fn test_poseidon2_plonky3_t16() { + let rounds_p = 13; + let rounds_f = 8; + const ALPHA: u64 = 7; + const WIDTH: usize = 16; + + let cnv = BabyBear::from_canonical_u32; + let external_constants: Vec<[BabyBear; 16]> = vec![ + [ + cnv(1774958255), + cnv(1185780729), + cnv(1621102414), + cnv(1796380621), + cnv(588815102), + cnv(1932426223), + cnv(1925334750), + cnv(747903232), + cnv(89648862), + cnv(360728943), + cnv(977184635), + cnv(1425273457), + cnv(256487465), + cnv(1200041953), + cnv(572403254), + cnv(448208942), + ], + [ + cnv(1215789478), + cnv(944884184), + cnv(953948096), + cnv(547326025), + cnv(646827752), + cnv(889997530), + cnv(1536873262), + cnv(86189867), + cnv(1065944411), + cnv(32019634), + cnv(333311454), + cnv(456061748), + cnv(1963448500), + cnv(1827584334), + cnv(1391160226), + cnv(1348741381), + ], + [ + cnv(88424255), + cnv(104111868), + cnv(1763866748), + cnv(79691676), + cnv(1988915530), + cnv(1050669594), + cnv(359890076), + cnv(573163527), + cnv(222820492), + cnv(159256268), + cnv(669703072), + cnv(763177444), + cnv(889367200), + cnv(256335831), + cnv(704371273), + cnv(25886717), + ], + [ + cnv(51754520), + cnv(1833211857), + cnv(454499742), + cnv(1384520381), + cnv(777848065), + cnv(1053320300), + cnv(1851729162), + cnv(344647910), + cnv(401996362), + cnv(1046925956), + cnv(5351995), + cnv(1212119315), + cnv(754867989), + cnv(36972490), + cnv(751272725), + cnv(506915399), + ], + [ + cnv(1922082829), + cnv(1870549801), + cnv(1502529704), + cnv(1990744480), + cnv(1700391016), + cnv(1702593455), + cnv(321330495), + cnv(528965731), + cnv(183414327), + cnv(1886297254), + cnv(1178602734), + cnv(1923111974), + cnv(744004766), + cnv(549271463), + cnv(1781349648), + cnv(542259047), + ], + [ + cnv(1536158148), + cnv(715456982), + cnv(503426110), + cnv(340311124), + cnv(1558555932), + cnv(1226350925), + cnv(742828095), + cnv(1338992758), + cnv(1641600456), + cnv(1843351545), + cnv(301835475), + cnv(43203215), + cnv(386838401), + cnv(1520185679), + cnv(1235297680), + cnv(904680097), + ], + [ + cnv(1491801617), + cnv(1581784677), + cnv(913384905), + cnv(247083962), + cnv(532844013), + cnv(107190701), + cnv(213827818), + cnv(1979521776), + cnv(1358282574), + cnv(1681743681), + cnv(1867507480), + cnv(1530706910), + cnv(507181886), + cnv(695185447), + cnv(1172395131), + cnv(1250800299), + ], + [ + cnv(1503161625), + cnv(817684387), + cnv(498481458), + cnv(494676004), + cnv(1404253825), + cnv(108246855), + cnv(59414691), + cnv(744214112), + cnv(890862029), + cnv(1342765939), + cnv(1417398904), + cnv(1897591937), + cnv(1066647396), + cnv(1682806907), + cnv(1015795079), + cnv(1619482808), + ], + ]; + + let internal_constants: Vec = vec![ + cnv(1518359488), + cnv(1765533241), + cnv(945325693), + cnv(422793067), + cnv(311365592), + cnv(1311448267), + cnv(1629555936), + cnv(1009879353), + cnv(190525218), + cnv(786108885), + cnv(557776863), + cnv(212616710), + cnv(605745517), + ]; + + let poseidon2: Poseidon2 = + Poseidon2::new( + rounds_f, + external_constants.clone(), + Poseidon2ExternalMatrixGeneral::default(), + rounds_p, + internal_constants.clone(), + DiffusionMatrixBabyBear::default(), + ); + + let mut input: [BabyBear; WIDTH] = [BabyBear::zero(); WIDTH]; + for i in 0..WIDTH { + input[i] = BabyBear::from_canonical_u32(i as u32); + } + + let output = poseidon2.permute(input); + + let mut kats: [ScalarField; WIDTH] = [ScalarField::zero(); WIDTH]; + for i in 0..WIDTH { + kats[i] = ScalarField::from_u32(output[i].as_canonical_u32()); + } + + let ctx = DeviceContext::default(); + let mut round_constants = vec![ScalarField::zero(); rounds_f * WIDTH + rounds_p]; + let external_constants_flattened: Vec = external_constants + .into_iter() + .flatten() + .map(|c| ScalarField::from_u32(c.as_canonical_u32())) + .collect(); + let internal_constants_icicle: Vec = internal_constants + .iter() + .map(|&c| ScalarField::from_u32(c.as_canonical_u32())) + .collect(); + + (&mut round_constants[..rounds_f / 2 * WIDTH]) + .copy_from_slice(&external_constants_flattened[..rounds_f / 2 * WIDTH]); + (&mut round_constants[rounds_f / 2 * WIDTH..rounds_f / 2 * WIDTH + rounds_p]) + .copy_from_slice(&internal_constants_icicle[..]); + (&mut round_constants[rounds_p + rounds_f / 2 * WIDTH..]) + .copy_from_slice(&external_constants_flattened[rounds_f / 2 * WIDTH..]); + + let mut internal_matrix_diag = vec![ + ScalarField::from_u32(0x78000001 - 2), + ScalarField::from_u32(1), + ScalarField::from_u32(1 << 1), + ScalarField::from_u32(1 << 2), + ScalarField::from_u32(1 << 3), + ScalarField::from_u32(1 << 4), + ScalarField::from_u32(1 << 5), + ScalarField::from_u32(1 << 6), + ScalarField::from_u32(1 << 7), + ScalarField::from_u32(1 << 8), + ScalarField::from_u32(1 << 9), + ScalarField::from_u32(1 << 10), + ScalarField::from_u32(1 << 11), + ScalarField::from_u32(1 << 12), + ScalarField::from_u32(1 << 13), + ScalarField::from_u32(1 << 15), + ]; + let mut constants = create_optimized_poseidon2_constants( + WIDTH as u32, + ALPHA as u32, + &ctx, + rounds_p as u32, + rounds_f as u32, + &mut round_constants, + &mut internal_matrix_diag, + MdsType::Plonky, + DiffusionStrategy::Montgomery, + ) + .unwrap(); + check_poseidon_kats(WIDTH, &kats, &constants); + } + + #[test] + fn test_poseidon2_plonky3_t24() { + let rounds_p = 21; + let rounds_f = 8; + const ALPHA: u64 = 7; + const WIDTH: usize = 24; + + let cnv = BabyBear::from_canonical_u32; + let external_constants: Vec<[BabyBear; 24]> = vec![ + [ + cnv(262278199), + cnv(127253399), + cnv(314968988), + cnv(246143118), + cnv(157582794), + cnv(118043943), + cnv(454905424), + cnv(815798990), + cnv(1004040026), + cnv(1773108264), + cnv(1066694495), + cnv(1930780904), + cnv(1180307149), + cnv(1464793095), + cnv(1660766320), + cnv(1389166148), + cnv(343354132), + cnv(1307439985), + cnv(638242172), + cnv(525458520), + cnv(1964135730), + cnv(1751797115), + cnv(1421525369), + cnv(831813382), + ], + [ + cnv(695835963), + cnv(1845603984), + cnv(540703332), + cnv(1333667262), + cnv(1917861751), + cnv(1170029417), + cnv(1989924532), + cnv(1518763784), + cnv(1339793538), + cnv(622609176), + cnv(686842369), + cnv(1737016378), + cnv(1282239129), + cnv(897025192), + cnv(716894289), + cnv(1997503974), + cnv(395622276), + cnv(1201063290), + cnv(1917549072), + cnv(1150912935), + cnv(1687379185), + cnv(1507936940), + cnv(241306552), + cnv(989176635), + ], + [ + cnv(1147522062), + cnv(27129487), + cnv(1257820264), + cnv(142102402), + cnv(217046702), + cnv(1664590951), + cnv(855276054), + cnv(1215259350), + cnv(946500736), + cnv(552696906), + cnv(1424297384), + cnv(538103555), + cnv(1608853840), + cnv(162510541), + cnv(623051854), + cnv(1549062383), + cnv(1908416316), + cnv(1622328571), + cnv(1079030649), + cnv(1584033957), + cnv(1099252725), + cnv(1910423126), + cnv(447555988), + cnv(862495875), + ], + [ + cnv(128479034), + cnv(1587822577), + cnv(608401422), + cnv(1290028279), + cnv(342857858), + cnv(825405577), + cnv(427731030), + cnv(1718628547), + cnv(588764636), + cnv(204228775), + cnv(1454563174), + cnv(1740472809), + cnv(1338899225), + cnv(1269493554), + cnv(53007114), + cnv(1647670797), + cnv(306391314), + cnv(172614232), + cnv(51256176), + cnv(1221257987), + cnv(1239734761), + cnv(273790406), + cnv(1781980094), + cnv(1291790245), + ], + [ + cnv(53041581), + cnv(723038058), + cnv(1439947916), + cnv(1136469704), + cnv(205609311), + cnv(1883820770), + cnv(14387587), + cnv(720724951), + cnv(1854174607), + cnv(1629316321), + cnv(530151394), + cnv(1679178250), + cnv(1549779579), + cnv(48375137), + cnv(976057819), + cnv(463976218), + cnv(875839332), + cnv(1946596189), + cnv(434078361), + cnv(1878280202), + cnv(1363837384), + cnv(1470845646), + cnv(1792450386), + cnv(1040977421), + ], + [ + cnv(1209164052), + cnv(714957516), + cnv(390340387), + cnv(1213686459), + cnv(790726260), + cnv(117294666), + cnv(140621810), + cnv(993455846), + cnv(1889603648), + cnv(78845751), + cnv(925018226), + cnv(708123747), + cnv(1647665372), + cnv(1649953458), + cnv(942439428), + cnv(1006235079), + cnv(238616145), + cnv(930036496), + cnv(1401020792), + cnv(989618631), + cnv(1545325389), + cnv(1715719711), + cnv(755691969), + cnv(150307788), + ], + [ + cnv(1567618575), + cnv(1663353317), + cnv(1950429111), + cnv(1891637550), + cnv(192082241), + cnv(1080533265), + cnv(1463323727), + cnv(890243564), + cnv(158646617), + cnv(1402624179), + cnv(59510015), + cnv(1198261138), + cnv(1065075039), + cnv(1150410028), + cnv(1293938517), + cnv(76770019), + cnv(1478577620), + cnv(1748789933), + cnv(457372011), + cnv(1841795381), + cnv(760115692), + cnv(1042892522), + cnv(1507649755), + cnv(1827572010), + ], + [ + cnv(1206940496), + cnv(1896271507), + cnv(1003792297), + cnv(738091882), + cnv(1124078057), + cnv(1889898), + cnv(813674331), + cnv(228520958), + cnv(1832911930), + cnv(781141772), + cnv(459826664), + cnv(202271745), + cnv(1296144415), + cnv(1111203133), + cnv(1090783436), + cnv(641665156), + cnv(1393671120), + cnv(1303271640), + cnv(809508074), + cnv(162506101), + cnv(1262312258), + cnv(1672219447), + cnv(1608891156), + cnv(1380248020), + ], + ]; + + let internal_constants: Vec = vec![ + cnv(497520322), + cnv(1930103076), + cnv(1052077299), + cnv(1540960371), + cnv(924863639), + cnv(1365519753), + cnv(1726563304), + cnv(440300254), + cnv(1891545577), + cnv(822033215), + cnv(1111544260), + cnv(308575117), + cnv(1708681573), + cnv(1240419708), + cnv(1199068823), + cnv(1186174623), + cnv(1551596046), + cnv(1886977120), + cnv(1327682690), + cnv(1210751726), + cnv(1810596765), + ]; + + let poseidon2: Poseidon2 = + Poseidon2::new( + rounds_f, + external_constants.clone(), + Poseidon2ExternalMatrixGeneral::default(), + rounds_p, + internal_constants.clone(), + DiffusionMatrixBabyBear::default(), + ); + + let mut input: [BabyBear; WIDTH] = [BabyBear::zero(); WIDTH]; + for i in 0..WIDTH { + input[i] = BabyBear::from_canonical_u32(i as u32); + } + + let output = poseidon2.permute(input); + + let mut kats: [ScalarField; WIDTH] = [ScalarField::zero(); WIDTH]; + for i in 0..WIDTH { + kats[i] = ScalarField::from_u32(output[i].as_canonical_u32()); + } + + let ctx = DeviceContext::default(); + let mut round_constants = vec![ScalarField::zero(); rounds_f * WIDTH + rounds_p]; + let external_constants_flattened: Vec = external_constants + .into_iter() + .flatten() + .map(|c| ScalarField::from_u32(c.as_canonical_u32())) + .collect(); + let internal_constants_icicle: Vec = internal_constants + .iter() + .map(|&c| ScalarField::from_u32(c.as_canonical_u32())) + .collect(); + + (&mut round_constants[..rounds_f / 2 * WIDTH]) + .copy_from_slice(&external_constants_flattened[..rounds_f / 2 * WIDTH]); + (&mut round_constants[rounds_f / 2 * WIDTH..rounds_f / 2 * WIDTH + rounds_p]) + .copy_from_slice(&internal_constants_icicle[..]); + (&mut round_constants[rounds_p + rounds_f / 2 * WIDTH..]) + .copy_from_slice(&external_constants_flattened[rounds_f / 2 * WIDTH..]); + + let mut internal_matrix_diag = vec![ + ScalarField::from_u32(0x78000001 - 2), + ScalarField::from_u32(1), + ScalarField::from_u32(1 << 1), + ScalarField::from_u32(1 << 2), + ScalarField::from_u32(1 << 3), + ScalarField::from_u32(1 << 4), + ScalarField::from_u32(1 << 5), + ScalarField::from_u32(1 << 6), + ScalarField::from_u32(1 << 7), + ScalarField::from_u32(1 << 8), + ScalarField::from_u32(1 << 9), + ScalarField::from_u32(1 << 10), + ScalarField::from_u32(1 << 11), + ScalarField::from_u32(1 << 12), + ScalarField::from_u32(1 << 13), + ScalarField::from_u32(1 << 14), + ScalarField::from_u32(1 << 15), + ScalarField::from_u32(1 << 16), + ScalarField::from_u32(1 << 18), + ScalarField::from_u32(1 << 19), + ScalarField::from_u32(1 << 20), + ScalarField::from_u32(1 << 21), + ScalarField::from_u32(1 << 22), + ScalarField::from_u32(1 << 23), + ]; + let mut constants = create_optimized_poseidon2_constants( + WIDTH as u32, + ALPHA as u32, + &ctx, + rounds_p as u32, + rounds_f as u32, + &mut round_constants, + &mut internal_matrix_diag, + MdsType::Plonky, + DiffusionStrategy::Montgomery, + ) + .unwrap(); + check_poseidon_kats(WIDTH, &kats, &constants); + } +}