From cded63e343c7531383f28a14add2ce86a1e9a470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Meusel?= Date: Thu, 19 Sep 2024 16:13:55 +0200 Subject: [PATCH 1/9] Add a Bounded_XOF --- .../pubkey/pqcrystals/pqcrystals_helpers.h | 87 +++++++++++++++++++ src/tests/test_crystals.cpp | 81 ++++++++++++++++- 2 files changed, 167 insertions(+), 1 deletion(-) diff --git a/src/lib/pubkey/pqcrystals/pqcrystals_helpers.h b/src/lib/pubkey/pqcrystals/pqcrystals_helpers.h index c86a9bcd2a1..3a8b70404fd 100644 --- a/src/lib/pubkey/pqcrystals/pqcrystals_helpers.h +++ b/src/lib/pubkey/pqcrystals/pqcrystals_helpers.h @@ -13,8 +13,10 @@ #include #include +#include #include +#include #include namespace Botan { @@ -133,6 +135,91 @@ consteval static auto precompute_zetas(T q, T monty, T root_of_unity) { return result; } +namespace detail { + +/** + * Wraps any XOF to limit the number of bytes that can be produced to @p bound. + * When the bound is reached, the XOF will throw an Internal_Error. + */ +template + requires requires(XofT xof) { + { xof.template output<1>() } -> std::convertible_to>; + { xof.template output<42>() } -> std::convertible_to>; + } +class Bounded_XOF final { + private: + template + using MappedValueT = std::invoke_result_t>; + + public: + template + constexpr static auto default_transformer(std::array x) { + return x; + } + + template + constexpr static bool default_predicate(T) { + return true; + } + + public: + Bounded_XOF() + requires std::default_initializable + : m_bytes_consumed(0) {} + + explicit Bounded_XOF(XofT xof) : m_xof(xof), m_bytes_consumed(0) {} + + /** + * @returns the next byte from the XOF that fulfills @p predicate. + */ + template )> + requires std::invocable + constexpr auto next_byte(PredicateFnT&& predicate = default_predicate<1, uint8_t>) { + return next<1>([](const auto bytes) { return bytes[0]; }, std::forward(predicate)); + } + + /** + * Pulls the next @p bytes from the XOF and applies @p transformer to the + * output. The result is returned if @p predicate is fulfilled. + * @returns the transformed output of the XOF that fulfills @p predicate. + */ + template ), + typename PredicateFnT = decltype(default_predicate>)> + requires std::invocable> && + std::invocable> + constexpr auto next(MapFnT&& transformer = default_transformer, + PredicateFnT&& predicate = default_predicate>) { + while(true) { + auto output = transformer(take()); + if(predicate(output)) { + return output; + } + } + } + + private: + template + constexpr std::array take() { + m_bytes_consumed += bytes; + if(m_bytes_consumed > bound) { + throw Internal_Error("XOF consumed more bytes than allowed"); + } + return m_xof.template output(); + } + + private: + XofT m_xof; + size_t m_bytes_consumed; +}; + +} // namespace detail + +class XOF; + +template +using Bounded_XOF = detail::Bounded_XOF; + } // namespace Botan #endif diff --git a/src/tests/test_crystals.cpp b/src/tests/test_crystals.cpp index 10e81fc5a79..7d38781a750 100644 --- a/src/tests/test_crystals.cpp +++ b/src/tests/test_crystals.cpp @@ -499,9 +499,88 @@ std::vector test_encoding() { }; } +class MockedXOF { + public: + MockedXOF() : m_counter(0) {} + + template + auto output() { + std::array result; + for(uint8_t& byte : result) { + byte = static_cast(m_counter++); + } + return result; + } + + private: + size_t m_counter; +}; + +template +using Mocked_Bounded_XOF = Botan::detail::Bounded_XOF; + +std::vector test_bounded_xof() { + return { + CHECK("zero bound is reached immediately", + [](Test::Result& result) { + Mocked_Bounded_XOF<0> xof; + result.test_throws("output<1> throws", [&xof]() { xof.next_byte(); }); + }), + + CHECK("bounded XOF with small bound", + [](Test::Result& result) { + Mocked_Bounded_XOF<3> xof; + result.test_is_eq("next_byte() returns 0", xof.next_byte(), uint8_t(0)); + result.test_is_eq("next_byte() returns 1", xof.next_byte(), uint8_t(1)); + result.test_is_eq("next_byte() returns 2", xof.next_byte(), uint8_t(2)); + result.test_throws("next_byte() throws", [&xof]() { xof.next_byte(); }); + }), + + CHECK("filter bytes", + [](Test::Result& result) { + auto filter = [](uint8_t byte) { + //test + return byte % 2 == 1; + }; + + Mocked_Bounded_XOF<5> xof; + result.test_is_eq("next_byte() returns 1", xof.next_byte(filter), uint8_t(1)); + result.test_is_eq("next_byte() returns 3", xof.next_byte(filter), uint8_t(3)); + result.test_throws("next_byte() throws", [&]() { xof.next_byte(filter); }); + }), + + CHECK("map bytes", + [](Test::Result& result) { + auto map = [](auto bytes) { return Botan::load_be(bytes); }; + + Mocked_Bounded_XOF<17> xof; + result.test_is_eq("next returns 0x00010203", xof.next<4>(map), uint32_t(0x00010203)); + result.test_is_eq("next returns 0x04050607", xof.next<4>(map), uint32_t(0x04050607)); + result.test_is_eq("next returns 0x08090A0B", xof.next<4>(map), uint32_t(0x08090A0B)); + result.test_is_eq("next returns 0x0C0D0E0F", xof.next<4>(map), uint32_t(0x0C0D0E0F)); + result.test_throws("next() throws", [&]() { xof.next<4>(map); }); + }), + + CHECK("map and filter bytes", + [](Test::Result& result) { + auto map = [](std::array bytes) -> uint32_t { return bytes[0] + bytes[1] + bytes[2]; }; + auto filter = [](uint32_t number) { return number < 50; }; + + Mocked_Bounded_XOF<17> xof; + result.test_is_eq("next returns 3", xof.next<3>(map, filter), uint32_t(3)); + result.test_is_eq("next returns 12", xof.next<3>(map, filter), uint32_t(12)); + result.test_is_eq("next returns 21", xof.next<3>(map, filter), uint32_t(21)); + result.test_is_eq("next returns 30", xof.next<3>(map, filter), uint32_t(30)); + result.test_is_eq("next returns 39", xof.next<3>(map, filter), uint32_t(39)); + result.test_throws("next() throws", [&]() { xof.next<3>(map, filter); }); + }), + }; +} + } // namespace -BOTAN_REGISTER_TEST_FN("pubkey", "crystals", test_extended_euclidean_algorithm, test_polynomial_basics, test_encoding); +BOTAN_REGISTER_TEST_FN( + "pubkey", "crystals", test_extended_euclidean_algorithm, test_polynomial_basics, test_encoding, test_bounded_xof); } // namespace Botan_Tests From 46a2b233750491de15b8645b66cb799379e2d762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Meusel?= Date: Wed, 18 Sep 2024 16:00:21 +0200 Subject: [PATCH 2/9] PK_Key_Generation_Test::algo_name(std::string_view param) --- src/tests/test_kyber.cpp | 17 ++++++++++++++--- src/tests/test_pubkey.cpp | 9 +++++---- src/tests/test_pubkey.h | 5 +++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/tests/test_kyber.cpp b/src/tests/test_kyber.cpp index e0e28ae7e43..652edf7758b 100644 --- a/src/tests/test_kyber.cpp +++ b/src/tests/test_kyber.cpp @@ -4,10 +4,10 @@ * - KAT tests using the KAT vectors from * https://csrc.nist.gov/CSRC/media/Projects/post-quantum-cryptography/documents/round-3/submissions/Kyber-Round3.zip * - * (C) 2021-2022 Jack Lloyd + * (C) 2021-2024 Jack Lloyd * (C) 2021-2022 Manuel Glaser and Michael Boric, Rohde & Schwarz Cybersecurity * (C) 2021-2022 René Meusel and Hannes Rantzsch, neXenio GmbH - * (C) 2023 René Meusel, Rohde & Schwarz Cybersecurity + * (C) 2023-2024 René Meusel, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -248,11 +248,22 @@ class Kyber_Keygen_Tests final : public PK_Key_Generation_Test { #endif #if defined(BOTAN_HAS_KYBER) "Kyber-512-r3", "Kyber-768-r3", "Kyber-1024-r3", + #endif + #if defined(BOTAN_HAS_ML_KEM) + "ML-KEM-512", "ML-KEM-768", "ML-KEM-1024", #endif }; } - std::string algo_name() const override { return "Kyber"; } + std::string algo_name(std::string_view param) const override { + if(param.starts_with("Kyber-")) { + return "Kyber"; + } else { + return "ML-KEM"; + } + } + + std::string algo_name() const override { throw Test_Error("No default algo name set for Kyber"); } std::unique_ptr public_key_from_raw(std::string_view keygen_params, std::string_view /* provider */, diff --git a/src/tests/test_pubkey.cpp b/src/tests/test_pubkey.cpp index cbe93447793..ae3724ed5f1 100644 --- a/src/tests/test_pubkey.cpp +++ b/src/tests/test_pubkey.cpp @@ -576,19 +576,20 @@ std::vector PK_Key_Generation_Test::run() { std::vector results; for(const auto& param : keygen_params()) { - const std::string report_name = algo_name() + (param.empty() ? param : " " + param); + const auto algo = algo_name(param); + const std::string report_name = Botan::fmt("{}{}", algo, (param.empty() ? param : " " + param)); Test::Result result(report_name + " keygen"); - const std::vector providers = possible_providers(algo_name()); + const std::vector providers = possible_providers(algo); if(providers.empty()) { - result.note_missing("provider key generation " + algo_name()); + result.note_missing("provider key generation " + algo); } result.start_timer(); for(auto&& prov : providers) { - auto key_p = Botan::create_private_key(algo_name(), this->rng(), param, prov); + auto key_p = Botan::create_private_key(algo, this->rng(), param, prov); if(key_p == nullptr) { result.test_failure("create_private_key returned null, should throw instead"); diff --git a/src/tests/test_pubkey.h b/src/tests/test_pubkey.h index 020250c7059..95b2fe49e8f 100644 --- a/src/tests/test_pubkey.h +++ b/src/tests/test_pubkey.h @@ -186,6 +186,11 @@ class PK_Key_Generation_Test : public Test { virtual std::vector keygen_params() const = 0; + virtual std::string algo_name(std::string_view param) const { + BOTAN_UNUSED(param); + return algo_name(); + } + virtual std::string algo_name() const = 0; /** From c15ba83e4af58282253ca75a9e62fc36297b8281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Meusel?= Date: Tue, 15 Oct 2024 09:10:40 +0200 Subject: [PATCH 3/9] Add monadic poison helper for std::optional<> --- src/lib/utils/ct_utils.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/lib/utils/ct_utils.h b/src/lib/utils/ct_utils.h index 4eb7084a038..7c2fdeb6750 100644 --- a/src/lib/utils/ct_utils.h +++ b/src/lib/utils/ct_utils.h @@ -138,6 +138,25 @@ constexpr void unpoison(const T& x) { x._const_time_unpoison(); } +/** + * Poison an optional object if it has a value. + */ +template + requires requires(const T& v) { ::Botan::CT::poison(v); } +constexpr void poison(const std::optional& x) { + if(x.has_value()) { + poison(x.value()); + } +} + +template + requires requires(const T& v) { ::Botan::CT::unpoison(v); } +constexpr void unpoison(const std::optional& x) { + if(x.has_value()) { + unpoison(x.value()); + } +} + /// @} /// @name Higher-level Constant Time Check Annotation Helpers From 7cd161ad9290ec63dd43afbcbcdddaac564371a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Meusel?= Date: Fri, 20 Sep 2024 15:02:27 +0200 Subject: [PATCH 4/9] Add ML-KEM as specified in FIPS 203 This adapts the existing implementation of Kyber to accomodate the differences between Kyber 3.01 and the final FIPS 203 standard. Kyber (and Kyber 90s) remain supported. All references to the specification were updated to refer into the final FIPS 203. Also, this includes a number of refactorings and improvements in the shared code between Kyber and ML-KEM. Co-Authored-By: Fabian Albert Co-Authored-By: Amos Treiber --- src/build-data/oids.txt | 6 + src/cli/perf_pk_kem.cpp | 23 +++ src/cli/speed.cpp | 1 + src/lib/asn1/oid_maps.cpp | 8 +- src/lib/pubkey/kyber/kyber_common/kyber.cpp | 178 ++++++++++-------- src/lib/pubkey/kyber/kyber_common/kyber.h | 16 +- .../pubkey/kyber/kyber_common/kyber_algos.cpp | 143 +++++++++++--- .../pubkey/kyber/kyber_common/kyber_algos.h | 4 +- .../kyber/kyber_common/kyber_constants.cpp | 28 +++ .../kyber/kyber_common/kyber_constants.h | 14 +- .../pubkey/kyber/kyber_common/kyber_helpers.h | 4 +- .../pubkey/kyber/kyber_common/kyber_keys.cpp | 47 ++++- .../pubkey/kyber/kyber_common/kyber_keys.h | 36 ++-- .../kyber/kyber_common/kyber_polynomial.h | 28 +-- .../kyber_common/kyber_symmetric_primitives.h | 25 ++- .../pubkey/kyber/kyber_common/kyber_types.h | 21 ++- src/lib/pubkey/kyber/kyber_round3/info.txt | 2 +- .../kyber/kyber_round3/kyber/kyber_modern.h | 10 +- .../kyber/kyber_round3/kyber_90s/kyber_90s.h | 10 +- .../kyber/kyber_round3/kyber_encaps.cpp | 65 ------- .../kyber/kyber_round3/kyber_round3_impl.cpp | 122 ++++++++++++ .../{kyber_encaps.h => kyber_round3_impl.h} | 8 +- src/lib/pubkey/kyber/ml_kem/info.txt | 19 ++ src/lib/pubkey/kyber/ml_kem/ml_kem_impl.cpp | 89 +++++++++ src/lib/pubkey/kyber/ml_kem/ml_kem_impl.h | 116 ++++++++++++ src/lib/pubkey/pk_algs.cpp | 23 ++- .../pubkey/pqcrystals/pqcrystals_encoding.h | 4 +- src/tests/data/pubkey/kyber_encodings.vec | 4 +- src/tests/test_kyber.cpp | 34 ++-- src/tests/test_pubkey.cpp | 2 +- src/tests/unit_x509.cpp | 4 +- 31 files changed, 823 insertions(+), 271 deletions(-) delete mode 100644 src/lib/pubkey/kyber/kyber_round3/kyber_encaps.cpp create mode 100644 src/lib/pubkey/kyber/kyber_round3/kyber_round3_impl.cpp rename src/lib/pubkey/kyber/kyber_round3/{kyber_encaps.h => kyber_round3_impl.h} (84%) create mode 100644 src/lib/pubkey/kyber/ml_kem/info.txt create mode 100644 src/lib/pubkey/kyber/ml_kem/ml_kem_impl.cpp create mode 100644 src/lib/pubkey/kyber/ml_kem/ml_kem_impl.h diff --git a/src/build-data/oids.txt b/src/build-data/oids.txt index 37513b91410..f2e262a7e07 100644 --- a/src/build-data/oids.txt +++ b/src/build-data/oids.txt @@ -17,6 +17,11 @@ 1.3.101.112 = Ed25519 1.3.101.113 = Ed448 +# From NIST: +2.16.840.1.101.3.4.4.1 = ML-KEM-512 +2.16.840.1.101.3.4.4.2 = ML-KEM-768 +2.16.840.1.101.3.4.4.3 = ML-KEM-1024 + # FrodoKEM OIDs are currently in Botan's private arc 1.3.6.1.4.1.25258.1.14.1 = FrodoKEM-640-SHAKE 1.3.6.1.4.1.25258.1.14.2 = FrodoKEM-976-SHAKE @@ -32,6 +37,7 @@ 1.3.6.1.4.1.25258.1.17.3 = eFrodoKEM-1344-AES # Kyber OIDs are currently in Botan's private arc +# as specified in CRYSTALS-Kyber 3.01 (NIST's PQC competition round 3) 1.3.6.1.4.1.25258.1.7.1 = Kyber-512-r3 1.3.6.1.4.1.25258.1.7.2 = Kyber-768-r3 1.3.6.1.4.1.25258.1.7.3 = Kyber-1024-r3 diff --git a/src/cli/perf_pk_kem.cpp b/src/cli/perf_pk_kem.cpp index b16ebb358d6..1b81d20240b 100644 --- a/src/cli/perf_pk_kem.cpp +++ b/src/cli/perf_pk_kem.cpp @@ -97,6 +97,9 @@ class PerfTest_Kyber final : public PerfTest_PK_KEM { "Kyber-768-90s-r3", "Kyber-1024-r3", "Kyber-1024-90s-r3", + "ML-KEM-512", + "ML-KEM-768", + "ML-KEM-1024", }; } }; @@ -105,6 +108,26 @@ BOTAN_REGISTER_PERF_TEST("Kyber", PerfTest_Kyber); #endif +#if defined(BOTAN_HAS_ML_KEM) + +class PerfTest_ML_KEM final : public PerfTest_PK_KEM { + public: + std::string algo() const override { return "ML-KEM"; } + + std::vector keygen_params(const PerfConfig& config) const override { + BOTAN_UNUSED(config); + return { + "ML-KEM-512", + "ML-KEM-768", + "ML-KEM-1024", + }; + } +}; + +BOTAN_REGISTER_PERF_TEST("ML-KEM", PerfTest_ML_KEM); + +#endif + #if defined(BOTAN_HAS_FRODOKEM) class PerfTest_FrodoKEM final : public PerfTest_PK_KEM { diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index 1797be1a3ae..d3b19d6c78a 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -284,6 +284,7 @@ class Speed final : public Command { "X25519", "X448", "Kyber", + "ML-KEM", "SPHINCS+", "FrodoKEM", "HSS-LMS", diff --git a/src/lib/asn1/oid_maps.cpp b/src/lib/asn1/oid_maps.cpp index 95fa332ce9c..681b6c87763 100644 --- a/src/lib/asn1/oid_maps.cpp +++ b/src/lib/asn1/oid_maps.cpp @@ -1,7 +1,7 @@ /* * OID maps * -* This file was automatically generated by ./src/scripts/dev_tools/gen_oids.py on 2024-07-23 +* This file was automatically generated by src/scripts/dev_tools/gen_oids.py on 2024-08-21 * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. @@ -274,6 +274,9 @@ std::unordered_map OID_Map::load_oid2str_map() { {"2.16.840.1.101.3.4.3.7", "DSA/SHA-3(384)"}, {"2.16.840.1.101.3.4.3.8", "DSA/SHA-3(512)"}, {"2.16.840.1.101.3.4.3.9", "ECDSA/SHA-3(224)"}, + {"2.16.840.1.101.3.4.4.1", "ML-KEM-512"}, + {"2.16.840.1.101.3.4.4.2", "ML-KEM-768"}, + {"2.16.840.1.101.3.4.4.3", "ML-KEM-1024"}, {"2.16.840.1.113730.1.13", "Certificate Comment"}, {"2.5.29.14", "X509v3.SubjectKeyIdentifier"}, {"2.5.29.15", "X509v3.KeyUsage"}, @@ -427,6 +430,9 @@ std::unordered_map OID_Map::load_str2oid_map() { {"Kyber-768-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 7, 2})}, {"MD5", OID({1, 2, 840, 113549, 2, 5})}, {"MGF1", OID({1, 2, 840, 113549, 1, 1, 8})}, + {"ML-KEM-1024", OID({2, 16, 840, 1, 101, 3, 4, 4, 3})}, + {"ML-KEM-512", OID({2, 16, 840, 1, 101, 3, 4, 4, 1})}, + {"ML-KEM-768", OID({2, 16, 840, 1, 101, 3, 4, 4, 2})}, {"McEliece", OID({1, 3, 6, 1, 4, 1, 25258, 1, 3})}, {"Microsoft SmartcardLogon", OID({1, 3, 6, 1, 4, 1, 311, 20, 2, 2})}, {"Microsoft UPN", OID({1, 3, 6, 1, 4, 1, 311, 20, 2, 3})}, diff --git a/src/lib/pubkey/kyber/kyber_common/kyber.cpp b/src/lib/pubkey/kyber/kyber_common/kyber.cpp index 9adf082edea..cd51b9be153 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber.cpp +++ b/src/lib/pubkey/kyber/kyber_common/kyber.cpp @@ -4,7 +4,7 @@ * designers (https://github.com/pq-crystals/kyber) * * Further changes - * (C) 2021-2022 Jack Lloyd + * (C) 2021-2024 Jack Lloyd * (C) 2021-2022 Manuel Glaser and Michael Boric, Rohde & Schwarz Cybersecurity * (C) 2021-2022 René Meusel and Hannes Rantzsch, neXenio GmbH * (C) 2024 René Meusel, Fabian Albert, Rohde & Schwarz Cybersecurity @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -37,7 +38,11 @@ #endif #if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) - #include + #include +#endif + +#if defined(BOTAN_HAS_ML_KEM) + #include #endif #include @@ -66,6 +71,15 @@ KyberMode::Mode kyber_mode_from_string(std::string_view str) { if(str == "Kyber-1024-r3") { return KyberMode::Kyber1024_R3; } + if(str == "ML-KEM-512") { + return KyberMode::ML_KEM_512; + } + if(str == "ML-KEM-768") { + return KyberMode::ML_KEM_768; + } + if(str == "ML-KEM-1024") { + return KyberMode::ML_KEM_1024; + } throw Invalid_Argument(fmt("'{}' is not a valid Kyber mode name", str)); } @@ -96,6 +110,12 @@ std::string KyberMode::to_string() const { return "Kyber-768-r3"; case Kyber1024_R3: return "Kyber-1024-r3"; + case ML_KEM_512: + return "ML-KEM-512"; + case ML_KEM_768: + return "ML-KEM-768"; + case ML_KEM_1024: + return "ML-KEM-1024"; } BOTAN_ASSERT_UNREACHABLE(); @@ -109,6 +129,10 @@ bool KyberMode::is_modern() const { return !is_90s(); } +bool KyberMode::is_ml_kem() const { + return m_mode == KyberMode::ML_KEM_512 || m_mode == KyberMode::ML_KEM_768 || m_mode == KyberMode::ML_KEM_1024; +} + bool KyberMode::is_kyber_round3() const { return m_mode == KyberMode::Kyber512_R3 || m_mode == KyberMode::Kyber768_R3 || m_mode == KyberMode::Kyber1024_R3 || m_mode == KyberMode::Kyber512_90s || m_mode == KyberMode::Kyber768_90s || m_mode == KyberMode::Kyber1024_90s; @@ -127,6 +151,12 @@ bool KyberMode::is_available() const { } #endif +#if defined(BOTAN_HAS_ML_KEM) + if(is_ml_kem()) { + return true; + } +#endif + return false; } @@ -135,10 +165,14 @@ KyberMode Kyber_PublicKey::mode() const { } std::string Kyber_PublicKey::algo_name() const { - return "Kyber"; + return mode().is_ml_kem() ? "ML-KEM" : "Kyber"; } AlgorithmIdentifier Kyber_PublicKey::algorithm_identifier() const { + // draft-ietf-lamps-kyber-certificates-latest (22 July 2024) The + // AlgorithmIdentifier for a ML-KEM public key MUST use one of the + // id-alg-ml-kem object identifiers [...]. The parameters field of the + // AlgorithmIdentifier for the ML-KEM public key MUST be absent. return AlgorithmIdentifier(mode().object_identifier(), AlgorithmIdentifier::USE_EMPTY_PARAM); } @@ -150,31 +184,16 @@ size_t Kyber_PublicKey::estimated_strength() const { return m_public->mode().estimated_strength(); } -std::shared_ptr Kyber_PublicKey::initialize_from_encoding(std::span pub_key, - KyberMode m) { - KyberConstants mode(m); - - if(pub_key.size() != mode.public_key_bytes()) { - throw Invalid_Argument("kyber public key does not have the correct byte count"); - } - - BufferSlicer s(pub_key); - - auto poly_vec = s.take(mode.polynomial_vector_bytes()); - auto seed = s.copy(KyberConstants::SEED_BYTES); - BOTAN_ASSERT_NOMSG(s.empty()); - - return std::make_shared(std::move(mode), poly_vec, std::move(seed)); -} - Kyber_PublicKey::Kyber_PublicKey(const AlgorithmIdentifier& alg_id, std::span key_bits) : Kyber_PublicKey(key_bits, KyberMode(alg_id.oid())) {} -Kyber_PublicKey::Kyber_PublicKey(std::span pub_key, KyberMode m) : - m_public(initialize_from_encoding(pub_key, m)) {} +Kyber_PublicKey::Kyber_PublicKey(std::span pub_key, KyberMode mode) { + m_public = std::make_shared(mode, KyberSerializedPublicKey(pub_key)); +} Kyber_PublicKey::Kyber_PublicKey(const Kyber_PublicKey& other) : - m_public(std::make_shared(*other.m_public)) {} + m_public(std::make_shared( + other.m_public->mode(), other.m_public->t().clone(), other.m_public->rho())) {} std::vector Kyber_PublicKey::raw_public_key_bits() const { return m_public->public_key_bits_raw().get(); @@ -191,7 +210,16 @@ size_t Kyber_PublicKey::key_length() const { } bool Kyber_PublicKey::check_key(RandomNumberGenerator&, bool) const { - return true; // ?? + // The length checks described in FIPS 203, Section 7.2 are already performed + // while decoding the public key. See constructor of Kyber_PublicKeyInternal. + // The decoding function KyberAlgos::byte_decode() also checks the range of + // the decoded values. The check below is added for completeness. + + std::vector test(m_public->mode().polynomial_vector_bytes()); + Kyber_Algos::encode_polynomial_vector(test, m_public->t()); + + const auto& serialized_pubkey = m_public->public_key_bits_raw(); + return test.size() < serialized_pubkey.size() && std::equal(test.begin(), test.end(), serialized_pubkey.begin()); } std::unique_ptr Kyber_PublicKey::generate_another(RandomNumberGenerator& rng) const { @@ -199,36 +227,13 @@ std::unique_ptr Kyber_PublicKey::generate_another(RandomNumberGener } /** - * NIST FIPS 203 IPD, Algorithms 12 (K-PKE.KeyGen) and 15 (ML-KEM.KeyGen) + * NIST FIPS 203, Algorithms 19 (ML-KEM.KeyGen) */ -Kyber_PrivateKey::Kyber_PrivateKey(RandomNumberGenerator& rng, KyberMode m) { - KyberConstants mode(m); - - // Algorithm 12 (K-PKE.KeyGen) ---------------- - - const auto d = rng.random_vec(KyberConstants::SEED_BYTES); - CT::poison(d); - - auto [rho, sigma] = mode.symmetric_primitives().G(d); - Kyber_Algos::PolynomialSampler ps(sigma, mode); - - CT::unpoison(rho); // rho is public (seed for the public matrix A) - - auto A = Kyber_Algos::sample_matrix(rho, false /* not transposed */, mode); - auto s = ntt(ps.sample_polynomial_vector_cbd_eta1()); - const auto e = ntt(ps.sample_polynomial_vector_cbd_eta1()); - - auto t = montgomery(A * s); - t += e; - t.reduce(); - - // End Algorithm 12 --------------------------- - - CT::unpoison_all(t, s); - - m_public = std::make_shared(mode, std::move(t), std::move(rho)); - m_private = std::make_shared( - std::move(mode), std::move(s), rng.random_vec(KyberConstants::SEED_BYTES)); +Kyber_PrivateKey::Kyber_PrivateKey(RandomNumberGenerator& rng, KyberMode mode) { + std::tie(m_public, m_private) = + Kyber_Algos::expand_keypair({rng.random_vec(KyberConstants::SEED_BYTES), + rng.random_vec(KyberConstants::SEED_BYTES)}, + mode); } Kyber_PrivateKey::Kyber_PrivateKey(const AlgorithmIdentifier& alg_id, std::span key_bits) : @@ -237,31 +242,12 @@ Kyber_PrivateKey::Kyber_PrivateKey(const AlgorithmIdentifier& alg_id, std::span< Kyber_PrivateKey::Kyber_PrivateKey(std::span sk, KyberMode m) { KyberConstants mode(m); - auto scope = CT::scoped_poison(sk); - if(mode.private_key_bytes() != sk.size()) { - throw Invalid_Argument("kyber private key does not have the correct byte count"); + throw Invalid_Argument("Private key does not have the correct byte count"); } - BufferSlicer s(sk); - - auto skpv = Kyber_Algos::decode_polynomial_vector(s.take(mode.polynomial_vector_bytes()), mode); - auto pub_key = s.take(mode.public_key_bytes()); - auto puk_key_hash = s.take(KyberConstants::PUBLIC_KEY_HASH_BYTES); - auto z = s.copy(KyberConstants::SEED_BYTES); - - BOTAN_ASSERT_NOMSG(s.empty()); - - CT::unpoison_all(pub_key, puk_key_hash, skpv, z); - - m_public = initialize_from_encoding(pub_key, m); - m_private = std::make_shared(std::move(mode), std::move(skpv), std::move(z)); - - BOTAN_ASSERT(m_private && m_public, "reading private key encoding"); - BOTAN_STATE_CHECK(m_public->H_public_key_bits_raw().size() == puk_key_hash.size() && - std::equal(m_public->H_public_key_bits_raw().begin(), - m_public->H_public_key_bits_raw().end(), - puk_key_hash.begin())); + const auto& codec = mode.keypair_codec(); + std::tie(m_public, m_private) = codec.decode_keypair(sk, std::move(mode)); } std::unique_ptr Kyber_PrivateKey::public_key() const { @@ -273,14 +259,28 @@ secure_vector Kyber_PrivateKey::raw_private_key_bits() const { } secure_vector Kyber_PrivateKey::private_key_bits() const { - auto scope = CT::scoped_poison(*m_private); - auto result = - concat(Kyber_Algos::encode_polynomial_vector>(m_private->s().reduce(), m_private->mode()), - m_public->public_key_bits_raw(), - m_public->H_public_key_bits_raw(), - m_private->z()); - CT::unpoison(result); - return result; + return m_private->mode().keypair_codec().encode_keypair({m_public, m_private}); +} + +bool Kyber_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { + // As we do not support loading a private key in extended format but rather + // always extract it from a 64-byte seed, these checks (as described in + // FIPS 203, Section 7.1) should never fail. Particularly, the length checks + // and the hash consistency check described in Section 7.2 and 7.3 are + // trivial when the private key is always extracted from a seed. The encaps/ + // decaps roundtrip test is added for completeness. + + if(!Kyber_PublicKey::check_key(rng, strong)) { + return false; + } + + PK_KEM_Encryptor enc(*this, "Raw"); + PK_KEM_Decryptor dec(*this, rng, "Raw"); + + const auto [c, K] = KEM_Encapsulation::destructure(enc.encrypt(rng)); + const auto K_prime = dec.decrypt(c); + + return K == K_prime; } std::unique_ptr Kyber_PublicKey::create_kem_encryption_op(std::string_view params, @@ -292,6 +292,12 @@ std::unique_ptr Kyber_PublicKey::create_kem_encryption_o } #endif +#if defined(BOTAN_HAS_ML_KEM) + if(mode().is_ml_kem()) { + return std::make_unique(m_public, params); + } +#endif + BOTAN_ASSERT_UNREACHABLE(); } throw Provider_Not_Found(algo_name(), provider); @@ -308,6 +314,12 @@ std::unique_ptr Kyber_PrivateKey::create_kem_decryption_ } #endif +#if defined(BOTAN_HAS_ML_KEM) + if(mode().is_ml_kem()) { + return std::make_unique(m_private, m_public, params); + } +#endif + BOTAN_ASSERT_UNREACHABLE(); } throw Provider_Not_Found(algo_name(), provider); diff --git a/src/lib/pubkey/kyber/kyber_common/kyber.h b/src/lib/pubkey/kyber/kyber_common/kyber.h index 876a2809db8..e14fb4da223 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber.h +++ b/src/lib/pubkey/kyber/kyber_common/kyber.h @@ -21,8 +21,10 @@ #include -#if !defined(BOTAN_HAS_KYBER_90S) && !defined(BOTAN_HAS_KYBER) -static_assert(false, "botan module 'kyber_common' is useful only when enabling modules 'kyber', 'kyber_90s' or both"); +#if !defined(BOTAN_HAS_KYBER_90S) && !defined(BOTAN_HAS_KYBER) && !defined(BOTAN_HAS_ML_KEM) +static_assert( + false, + "botan module 'kyber_common' is useful only when enabling at least one of those modules: 'kyber', 'kyber_90s', 'ml_kem'"); #endif namespace Botan { @@ -41,6 +43,10 @@ class BOTAN_PUBLIC_API(3, 0) KyberMode { Kyber768 BOTAN_DEPRECATED("Use Kyber768_R3") = Kyber768_R3, Kyber1024 BOTAN_DEPRECATED("Use Kyber1024_R3") = Kyber1024_R3, + ML_KEM_512, + ML_KEM_768, + ML_KEM_1024, + Kyber512_90s BOTAN_DEPRECATED("Kyber 90s mode is deprecated"), Kyber768_90s BOTAN_DEPRECATED("Kyber 90s mode is deprecated"), Kyber1024_90s BOTAN_DEPRECATED("Kyber 90s mode is deprecated"), @@ -59,6 +65,8 @@ class BOTAN_PUBLIC_API(3, 0) KyberMode { BOTAN_DEPRECATED("Kyber 90s mode is deprecated") bool is_modern() const; + bool is_ml_kem() const; + bool is_kyber_round3() const; bool is_available() const; @@ -100,7 +108,7 @@ class BOTAN_PUBLIC_API(3, 0) Kyber_PublicKey : public virtual Public_Key { std::vector public_key_bits() const override; - bool check_key(RandomNumberGenerator&, bool) const override; + bool check_key(RandomNumberGenerator& rng, bool strong) const override; std::unique_ptr generate_another(RandomNumberGenerator& rng) const final; @@ -144,6 +152,8 @@ class BOTAN_PUBLIC_API(3, 0) Kyber_PrivateKey final : public virtual Kyber_Publi secure_vector raw_private_key_bits() const override; + bool check_key(RandomNumberGenerator& rng, bool strong) const override; + std::unique_ptr create_kem_decryption_op(RandomNumberGenerator& rng, std::string_view params, std::string_view provider) const override; diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_algos.cpp b/src/lib/pubkey/kyber/kyber_common/kyber_algos.cpp index 64baf61e91e..4621d5788ec 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_algos.cpp +++ b/src/lib/pubkey/kyber/kyber_common/kyber_algos.cpp @@ -15,16 +15,20 @@ #include #include +#include #include #include +#include + +#include namespace Botan::Kyber_Algos { namespace { /** - * NIST FIPS 203 IPD, Algorithm 4 (ByteEncode) for d < 12 in combination with - * Formula 4.5 (Compress) + * NIST FIPS 203, Algorithm 5 (ByteEncode) for d < 12 in combination with + * Formula 4.7 (Compress) */ template requires(d < 12) @@ -33,15 +37,15 @@ void poly_compress_and_encode(BufferStuffer& bs, const KyberPoly& p) { } /** - * NIST FIPS 203 IPD, Algorithm 4 (ByteEncode) for d == 12 + * NIST FIPS 203, Algorithm 5 (ByteEncode) for d == 12 */ void byte_encode(BufferStuffer& bs, const KyberPolyNTT& p) { CRYSTALS::pack(p, bs); } /** - * NIST FIPS 203 IPD, Algorithm 5 (ByteDecode) for d < 12 in combination with - * Formula 4.6 (Decompress) + * NIST FIPS 203, Algorithm 6 (ByteDecode) for d < 12 in combination with + * Formula 4.8 (Decompress) */ template requires(d < 12) @@ -50,7 +54,7 @@ void poly_decode_and_decompress(KyberPoly& p, BufferSlicer& bs) { } /** - * NIST FIPS 203 IPD, Algorithm 5 (ByteDecode) for d == 12 + * NIST FIPS 203, Algorithm 6 (ByteDecode) for d == 12 */ void byte_decode(KyberPolyNTT& p, BufferSlicer& bs) { CRYSTALS::unpack(p, bs); @@ -61,36 +65,73 @@ void byte_decode(KyberPolyNTT& p, BufferSlicer& bs) { } /** - * NIST FIPS 203 IPD, Algorithm 6 (SampleNTT) + * NIST FIPS 203, Algorithm 7 (SampleNTT) + * + * Note that this assumes that the XOF has been initialized with the correct + * seed + two bytes of indices prior to invoking this function. + * See sample_matrix() below. */ void sample_ntt_uniform(KyberPolyNTT& p, XOF& xof) { - auto sample = [&xof]() -> std::pair { - const auto x = load_le3(xof.output<3>()); - return {static_cast(x & 0x0FFF), static_cast(x >> 12)}; - }; - - for(size_t count = 0; count < p.size();) { - const auto [d1, d2] = sample(); - - if(d1 < KyberConstants::Q) { - p[count++] = d1; + // A generator that returns the next coefficient sampled from the XOF. As the + // sampling uses half-bytes, this keeps track of the additionally sampled + // coefficient as needed. + auto sample = [stashed_coeff = std::optional{}, + bounded_xof = + Bounded_XOF(xof)]() mutable -> uint16_t { + auto lowerthan_q = [](uint32_t d) -> std::optional { + if(d < KyberConstants::Q) { + return static_cast(d); + } else { + return std::nullopt; + } + }; + + if(auto stashed = std::exchange(stashed_coeff, std::nullopt)) { + return *stashed; // value retained from a previous invocation } - if(count < p.size() && d2 < KyberConstants::Q) { - p[count++] = d2; + + while(true) { + const auto [d1, d2] = bounded_xof.next<3>([&](const auto bytes) { + const auto x = load_le3(bytes); + return std::pair{lowerthan_q(x & 0x0FFF), lowerthan_q(x >> 12)}; + }); + + if(d1.has_value()) { + stashed_coeff = d2; // keep candidate d2 for the next invocation + return *d1; + } else if(d2.has_value()) { + // d1 was invalid, d2 is valid, nothing to stash + return *d2; + } } + }; + + for(auto& coeff : p) { + coeff = sample(); } } /** - * NIST FIPS 203 IPD, Algorithm 7 (SamplePolyCBD) for eta = 2 + * NIST FIPS 203, Algorithm 8 (SamplePolyCBD) + * + * Implementations for eta = 2 and eta = 3 are provided separately as template + * specializations below. */ -void sample_poly_cbd2(KyberPoly& poly, StrongSpan randomness) { +template +void sample_poly_cbd(KyberPoly& poly, StrongSpan randomness); + +/** + * NIST FIPS 203, Algorithm 8 (SamplePolyCBD) for eta = 2 + */ +template <> +void sample_poly_cbd(KyberPoly& poly, + StrongSpan randomness) { BufferSlicer bs(randomness); for(size_t i = 0; i < poly.size() / 8; ++i) { const uint32_t t = Botan::load_le(bs.take<4>()); - // SIMD trick: calculate 16 2-bit-sums in parallel + // SWAR (SIMD within a Register) trick: calculate 16 2-bit-sums in parallel constexpr uint32_t operand_bitmask = 0b01010101010101010101010101010101; // clang-format off @@ -109,15 +150,17 @@ void sample_poly_cbd2(KyberPoly& poly, StrongSpan } /** - * NIST FIPS 203 IPD, Algorithm 7 (SamplePolyCBD) for eta = 2 + * NIST FIPS 203, Algorithm 8 (SamplePolyCBD) for eta = 3 */ -void sample_poly_cbd3(KyberPoly& poly, StrongSpan randomness) { +template <> +void sample_poly_cbd(KyberPoly& poly, + StrongSpan randomness) { BufferSlicer bs(randomness); for(size_t i = 0; i < poly.size() / 4; ++i) { const uint32_t t = load_le3(bs.take<3>()); - // SIMD trick: calculate 8 3-bit-sums in parallel + // SWAR (SIMD within a Register) trick: calculate 8 3-bit-sums in parallel constexpr uint32_t operand_bitmask = 0b00000000001001001001001001001001; // clang-format off @@ -266,6 +309,46 @@ KyberPoly decompress_polynomial(std::span buffer, const KyberCons } // namespace +/** + * NIST FIPS 203, Algorithms 16 (ML-KEM.KeyGen_internal), and + * 13 (K-PKE.KeyGen) + * + * In contrast to the specification, the expansion of rho and sigma is inlined + * with the actual PKE key generation. The sampling loops spelled out in + * FIPS 203 are hidden in the sample_* functions. The keys are kept in memory + * without serialization, which is deferred until requested. + */ +KyberInternalKeypair expand_keypair(KyberPrivateKeySeed seed, KyberConstants mode) { + BOTAN_ARG_CHECK(seed.d.has_value(), "Cannot expand keypair without the full private seed"); + const auto& d = seed.d.value(); + + CT::poison(d); + auto [rho, sigma] = mode.symmetric_primitives().G(d, mode); + CT::unpoison(rho); // rho is public (seed for the public matrix A) + + // Algorithm 13 (K-PKE.KeyGen) ---------------- + + auto A = Kyber_Algos::sample_matrix(rho, false /* not transposed */, mode); + + // The nonce N is handled internally by the PolynomialSampler + Kyber_Algos::PolynomialSampler ps(sigma, mode); + auto s = ntt(ps.sample_polynomial_vector_cbd_eta1()); + const auto e = ntt(ps.sample_polynomial_vector_cbd_eta1()); + + auto t = montgomery(A * s); + t += e; + t.reduce(); + + // End Algorithm 13 --------------------------- + + CT::unpoison_all(d, t, s); + + return { + std::make_shared(mode, std::move(t), std::move(rho)), + std::make_shared(std::move(mode), std::move(s), std::move(seed)), + }; +} + void compress_ciphertext(StrongSpan out, const KyberPolyVec& u, const KyberPoly& v, @@ -281,6 +364,7 @@ std::pair decompress_ciphertext(StrongSpan seed, bool transposed, } /** - * NIST FIPS 203 IPD, Algorithm 7 (SamplePolyCBD) + * NIST FIPS 203, Algorithm 8 (SamplePolyCBD) + * + * The actual implementation is above. This just dispatches to the correct + * specialization based on the eta of the chosen mode. */ void sample_polynomial_from_cbd(KyberPoly& poly, KyberConstants::KyberEta eta, const KyberSamplingRandomness& randomness) { switch(eta) { case KyberConstants::KyberEta::_2: - return sample_poly_cbd2(poly, randomness); + return sample_poly_cbd(poly, randomness); case KyberConstants::KyberEta::_3: - return sample_poly_cbd3(poly, randomness); + return sample_poly_cbd(poly, randomness); } BOTAN_ASSERT_UNREACHABLE(); diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_algos.h b/src/lib/pubkey/kyber/kyber_common/kyber_algos.h index f2a885b3f57..ace435b2b60 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_algos.h +++ b/src/lib/pubkey/kyber/kyber_common/kyber_algos.h @@ -31,6 +31,8 @@ KyberPoly polynomial_from_message(StrongSpan msg); KyberMessage polynomial_to_message(const KyberPoly& p); +KyberInternalKeypair expand_keypair(KyberPrivateKeySeed seed, KyberConstants mode); + void compress_ciphertext(StrongSpan out, const KyberPolyVec& u, const KyberPoly& v, @@ -55,7 +57,7 @@ T encode_polynomial_vector(const KyberPolyVecNTT& vec, const KyberConstants& mod /** * Allows sampling multiple polynomials from a single seed via a XOF. * - * Used in Algorithms 12 (K-PKE.KeyGen) and 13 (K-PKE.Encrypt), and takes care + * Used in Algorithms 13 (K-PKE.KeyGen) and 14 (K-PKE.Encrypt), and takes care * of the continuous nonce value internally. */ template diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_constants.cpp b/src/lib/pubkey/kyber/kyber_common/kyber_constants.cpp index b89bd42d488..3075d7731d0 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_constants.cpp +++ b/src/lib/pubkey/kyber/kyber_common/kyber_constants.cpp @@ -21,12 +21,21 @@ #include #endif +#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) + #include +#endif + +#if defined(BOTAN_HAS_ML_KEM) + #include +#endif + namespace Botan { KyberConstants::KyberConstants(KyberMode mode) : m_mode(mode) { switch(mode.mode()) { case KyberMode::Kyber512_R3: case KyberMode::Kyber512_90s: + case KyberMode::ML_KEM_512: m_nist_strength = KyberStrength::_128; m_k = 2; m_eta1 = KyberEta::_3; @@ -36,6 +45,7 @@ KyberConstants::KyberConstants(KyberMode mode) : m_mode(mode) { case KyberMode::Kyber768_R3: case KyberMode::Kyber768_90s: + case KyberMode::ML_KEM_768: m_nist_strength = KyberStrength::_192; m_k = 3; m_eta1 = KyberEta::_2; @@ -45,6 +55,7 @@ KyberConstants::KyberConstants(KyberMode mode) : m_mode(mode) { case KyberMode::Kyber1024_R3: case KyberMode::Kyber1024_90s: + case KyberMode::ML_KEM_1024: m_nist_strength = KyberStrength::_256; m_k = 4; m_eta1 = KyberEta::_2; @@ -59,12 +70,21 @@ KyberConstants::KyberConstants(KyberMode mode) : m_mode(mode) { #ifdef BOTAN_HAS_KYBER_90S if(mode.is_kyber_round3() && mode.is_90s()) { m_symmetric_primitives = std::make_unique(); + m_keypair_codec = std::make_unique(); } #endif #ifdef BOTAN_HAS_KYBER if(mode.is_kyber_round3() && mode.is_modern()) { m_symmetric_primitives = std::make_unique(); + m_keypair_codec = std::make_unique(); + } +#endif + +#ifdef BOTAN_HAS_ML_KEM + if(mode.is_ml_kem()) { + m_symmetric_primitives = std::make_unique(); + m_keypair_codec = std::make_unique(); } #endif @@ -72,6 +92,14 @@ KyberConstants::KyberConstants(KyberMode mode) : m_mode(mode) { m_polynomial_vector_bytes = (bitlen(Q) * (N / 8)) * k(); m_polynomial_vector_compressed_bytes = d_u() * k() * (N / 8); m_polynomial_compressed_bytes = d_v() * (N / 8); + m_private_key_bytes = static_cast([this] { + if(m_mode.is_ml_kem()) { + // ML-KEM's private keys are simply expanded from their seeds. + return 2 * SEED_BYTES; + } else { + return m_polynomial_vector_bytes + public_key_bytes() + PUBLIC_KEY_HASH_BYTES + SEED_BYTES; + } + }()); if(!m_symmetric_primitives) { throw Not_Implemented("requested Kyber mode is not enabled in this build"); diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_constants.h b/src/lib/pubkey/kyber/kyber_common/kyber_constants.h index 153dd21c05c..ae2987cd576 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_constants.h +++ b/src/lib/pubkey/kyber/kyber_common/kyber_constants.h @@ -17,6 +17,7 @@ namespace Botan { class Kyber_Symmetric_Primitives; +class Kyber_Keypair_Codec; class KyberConstants final { public: @@ -29,7 +30,7 @@ class KyberConstants final { /// modulus static constexpr T Q = 3329; - /// as specified in FIPS 203 (see Algorithm 9 (NTT^-1), f = 128^-1 mod Q) + /// as specified in FIPS 203 (see Algorithm 10 (NTT^-1), f = 128^-1 mod Q) static constexpr T F = 3303; /// the primitive 256-th root of unity modulo Q (see FIPS 203 Section 4.3) @@ -43,6 +44,9 @@ class KyberConstants final { static constexpr size_t PUBLIC_KEY_HASH_BYTES = 32; static constexpr size_t SHARED_KEY_BYTES = 32; + /// sampling limit for SampleNTT (in bytes), see FIPS 204, Apx B + static constexpr uint16_t SAMPLE_NTT_POLY_FROM_XOF_BOUND = 280 * 3 /* XOF bytes per while iteration */; + public: enum KyberEta : uint8_t { _2 = 2, _3 = 3 }; @@ -107,14 +111,14 @@ class KyberConstants final { size_t public_key_bytes() const { return polynomial_vector_bytes() + SEED_BYTES; } /// byte length of an encoded private key - size_t private_key_bytes() const { - return polynomial_vector_bytes() + public_key_bytes() + PUBLIC_KEY_HASH_BYTES + SEED_BYTES; - } + size_t private_key_bytes() const { return m_private_key_bytes; } /// @} Kyber_Symmetric_Primitives& symmetric_primitives() const { return *m_symmetric_primitives; } + Kyber_Keypair_Codec& keypair_codec() const { return *m_keypair_codec; } + private: KyberMode m_mode; @@ -127,7 +131,9 @@ class KyberConstants final { uint32_t m_polynomial_vector_bytes; uint32_t m_polynomial_vector_compressed_bytes; uint32_t m_polynomial_compressed_bytes; + uint32_t m_private_key_bytes; + std::unique_ptr m_keypair_codec; std::unique_ptr m_symmetric_primitives; }; diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_helpers.h b/src/lib/pubkey/kyber/kyber_common/kyber_helpers.h index d9d32e0e8cb..ffc49c883e3 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_helpers.h +++ b/src/lib/pubkey/kyber/kyber_common/kyber_helpers.h @@ -26,7 +26,7 @@ inline uint32_t load_le3(std::span in) { } /** - * NIST FIPS 203 IPD, Formula 4.5 (Compress) + * NIST FIPS 203, Formula 4.7 (Compress) */ template requires(d > 0 && d < 12) @@ -57,7 +57,7 @@ constexpr std::make_unsigned_t compress(KyberConstants::T x) }; /** - * NIST FIPS 203 IPD, Formula 4.6 (Decompress) + * NIST FIPS 203, Formula 4.8 (Decompress) */ template requires(d > 0 && d < 12) diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_keys.cpp b/src/lib/pubkey/kyber/kyber_common/kyber_keys.cpp index 71ea549e7a7..d6a9cfe91b8 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_keys.cpp +++ b/src/lib/pubkey/kyber/kyber_common/kyber_keys.cpp @@ -16,32 +16,58 @@ namespace Botan { +namespace { + +KyberSerializedPublicKey validate_public_key_length(KyberSerializedPublicKey public_key, size_t expected_length) { + if(public_key.size() != expected_length) { + throw Invalid_Argument("Public key does not have the correct byte count"); + } + return public_key; +} + +} // namespace + +Kyber_PublicKeyInternal::Kyber_PublicKeyInternal(KyberConstants mode, KyberSerializedPublicKey public_key) : + m_mode(std::move(mode)), + m_public_key_bits_raw(validate_public_key_length(std::move(public_key), m_mode.public_key_bytes())), + m_H_public_key_bits_raw(m_mode.symmetric_primitives().H(m_public_key_bits_raw)), + m_t(Kyber_Algos::decode_polynomial_vector( + std::span{m_public_key_bits_raw}.first(m_mode.polynomial_vector_bytes()), m_mode)), + m_rho(std::span{m_public_key_bits_raw}.last(Botan::KyberConstants::SEED_BYTES)) {} + Kyber_PublicKeyInternal::Kyber_PublicKeyInternal(KyberConstants mode, KyberPolyVecNTT t, KyberSeedRho rho) : m_mode(std::move(mode)), + m_public_key_bits_raw(concat(Kyber_Algos::encode_polynomial_vector>(t, m_mode), rho)), + m_H_public_key_bits_raw(m_mode.symmetric_primitives().H(m_public_key_bits_raw)), m_t(std::move(t)), - m_rho(std::move(rho)), - m_public_key_bits_raw(concat(Kyber_Algos::encode_polynomial_vector>(m_t, m_mode), m_rho)), - m_H_public_key_bits_raw(m_mode.symmetric_primitives().H(m_public_key_bits_raw)) {} + m_rho(std::move(rho)) {} /** - * NIST FIPS 203 IPD, Algorithm 13 (K-PKE.Encrypt) + * NIST FIPS 203, Algorithm 14 (K-PKE.Encrypt) + * + * In contrast to FIPS 203, the matrix @p At is not sampled for every invocation, + * instead it is precomputed and passed in as a parameter. Similarly, the t^T is + * already decoded and available as a member variable. This allows to reuse these + * structures for multiple encryptions. + * + * The sampling loops spelled out in FIPS 203 are hidden in the sample_* functions. */ void Kyber_PublicKeyInternal::indcpa_encrypt(StrongSpan out_ct, StrongSpan m, StrongSpan r, const KyberPolyMat& At) const { + // The nonce N is handled internally by the PolynomialSampler Kyber_Algos::PolynomialSampler ps(r, m_mode); - - const auto rv = ntt(ps.sample_polynomial_vector_cbd_eta1()); + const auto y = ntt(ps.sample_polynomial_vector_cbd_eta1()); const auto e1 = ps.sample_polynomial_vector_cbd_eta2(); const auto e2 = ps.sample_polynomial_cbd_eta2(); - auto u = inverse_ntt(At * rv); + auto u = inverse_ntt(At * y); u += e1; u.reduce(); const auto mu = Kyber_Algos::polynomial_from_message(m); - auto v = inverse_ntt(m_t * rv); + auto v = inverse_ntt(m_t * y); v += e2; v += mu; v.reduce(); @@ -50,7 +76,10 @@ void Kyber_PublicKeyInternal::indcpa_encrypt(StrongSpan ct) const { auto [u, v] = Kyber_Algos::decompress_ciphertext(ct, m_mode); diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_keys.h b/src/lib/pubkey/kyber/kyber_common/kyber_keys.h index cdc56966276..925a651b93d 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_keys.h +++ b/src/lib/pubkey/kyber/kyber_common/kyber_keys.h @@ -19,20 +19,18 @@ namespace Botan { +class Kyber_Keypair_Codec { + public: + virtual ~Kyber_Keypair_Codec() = default; + virtual secure_vector encode_keypair(KyberInternalKeypair keypair) const = 0; + virtual KyberInternalKeypair decode_keypair(std::span private_key, KyberConstants mode) const = 0; +}; + class Kyber_PublicKeyInternal { public: + Kyber_PublicKeyInternal(KyberConstants mode, KyberSerializedPublicKey public_key); Kyber_PublicKeyInternal(KyberConstants mode, KyberPolyVecNTT polynomials, KyberSeedRho seed); - Kyber_PublicKeyInternal(const KyberConstants& mode, std::span polynomials, KyberSeedRho seed) : - Kyber_PublicKeyInternal(mode, Kyber_Algos::decode_polynomial_vector(polynomials, mode), std::move(seed)) {} - - Kyber_PublicKeyInternal(const Kyber_PublicKeyInternal& other) : - m_mode(other.m_mode), - m_t(other.m_t.clone()), - m_rho(other.m_rho), - m_public_key_bits_raw(other.m_public_key_bits_raw), - m_H_public_key_bits_raw(other.m_H_public_key_bits_raw) {} - void indcpa_encrypt(StrongSpan out_ct, StrongSpan m, StrongSpan r, @@ -60,16 +58,16 @@ class Kyber_PublicKeyInternal { private: const KyberConstants m_mode; - KyberPolyVecNTT m_t; - const KyberSeedRho m_rho; const KyberSerializedPublicKey m_public_key_bits_raw; const KyberHashedPublicKey m_H_public_key_bits_raw; + KyberPolyVecNTT m_t; + const KyberSeedRho m_rho; }; class Kyber_PrivateKeyInternal { public: - Kyber_PrivateKeyInternal(KyberConstants mode, KyberPolyVecNTT s, KyberImplicitRejectionValue z) : - m_mode(std::move(mode)), m_s(std::move(s)), m_z(std::move(z)) {} + Kyber_PrivateKeyInternal(KyberConstants mode, KyberPolyVecNTT s, KyberPrivateKeySeed seed) : + m_mode(std::move(mode)), m_s(std::move(s)), m_seed(std::move(seed)) {} KyberMessage indcpa_decrypt(StrongSpan ct) const; @@ -77,20 +75,22 @@ class Kyber_PrivateKeyInternal { const KyberPolyVecNTT& s() const { return m_s; } - const KyberImplicitRejectionValue& z() const { return m_z; } + const KyberPrivateKeySeed& seed() const { return m_seed; } + + const KyberImplicitRejectionValue& z() const { return m_seed.z; } const KyberConstants& mode() const { return m_mode; } Kyber_PrivateKeyInternal() = delete; - void _const_time_poison() const { CT::poison_all(m_s, m_z); } + void _const_time_poison() const { CT::poison_all(m_s, m_seed.d, m_seed.z); } - void _const_time_unpoison() const { CT::unpoison_all(m_s, m_z); } + void _const_time_unpoison() const { CT::unpoison_all(m_s, m_seed.d, m_seed.z); } private: KyberConstants m_mode; KyberPolyVecNTT m_s; - KyberImplicitRejectionValue m_z; + KyberPrivateKeySeed m_seed; }; } // namespace Botan diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_polynomial.h b/src/lib/pubkey/kyber/kyber_common/kyber_polynomial.h index 269823e2694..0ce3291c9f0 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_polynomial.h +++ b/src/lib/pubkey/kyber/kyber_common/kyber_polynomial.h @@ -42,15 +42,16 @@ class KyberPolyTraits final : public CRYSTALS::Trait_Base p) { - for(size_t len = N / 2, k = 0; len >= 2; len /= 2) { + for(size_t len = N / 2, i = 0; len >= 2; len /= 2) { for(size_t start = 0, j = 0; start < N; start = j + len) { - const auto zeta = zetas[++k]; + const auto zeta = zetas[++i]; for(j = start; j < start + len; ++j) { const auto t = fqmul(zeta, p[j + len]); p[j + len] = p[j] - t; @@ -63,7 +64,7 @@ class KyberPolyTraits final : public CRYSTALS::Trait_Base p) { - for(size_t len = 2, k = 127; len <= N / 2; len *= 2) { + for(size_t len = 2, i = 127; len <= N / 2; len *= 2) { for(size_t start = 0, j = 0; start < N; start = j + len) { - const auto zeta = zetas[k--]; + const auto zeta = zetas[i--]; for(j = start; j < start + len; ++j) { const auto t = p[j]; p[j] = barrett_reduce_coefficient(t + p[j + len]); @@ -91,17 +92,20 @@ class KyberPolyTraits final : public CRYSTALS::Trait_Base result, std::span lhs, std::span rhs) { /** - * NIST FIPS 203 IPD, Algorithm 11 (BaseCaseMultiply) + * NIST FIPS 203, Algorithm 12 (BaseCaseMultiply) */ - auto basemul = [](const auto s, const auto t, const T zeta) -> std::tuple { - return {static_cast(fqmul(fqmul(s[1], t[1]), zeta) + fqmul(s[0], t[0])), - static_cast(fqmul(s[0], t[1]) + fqmul(s[1], t[0]))}; + auto basemul = [](const auto a, const auto b, const T zeta) -> std::tuple { + return {static_cast(fqmul(a[0], b[0]) + fqmul(fqmul(a[1], b[1]), zeta)), + static_cast(fqmul(a[0], b[1]) + fqmul(a[1], b[0]))}; }; auto Tq_elem_count = [](auto p) { return p.size() / 2; }; diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_symmetric_primitives.h b/src/lib/pubkey/kyber/kyber_common/kyber_symmetric_primitives.h index 55f13c95418..969b6e31327 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_symmetric_primitives.h +++ b/src/lib/pubkey/kyber/kyber_common/kyber_symmetric_primitives.h @@ -43,8 +43,13 @@ class Kyber_Symmetric_Primitives { return get_H().process(pk); } - std::pair G(StrongSpan seed) const { - return G_split(seed); + std::pair G(StrongSpan seed, + const KyberConstants& mode) const { + if(auto domsep = seed_expansion_domain_separator(mode)) { + return G_split(seed, *domsep); + } else { + return G_split(seed); + } } std::pair G( @@ -52,6 +57,14 @@ class Kyber_Symmetric_Primitives { return G_split(msg, pubkey_hash); } + KyberSharedSecret J(StrongSpan rejection_value, + StrongSpan ciphertext) const { + auto& j = get_J(); + j.update(rejection_value); + j.update(ciphertext); + return j.final(); + } + // TODO: remove this once Kyber-R3 is removed void KDF(StrongSpan out, StrongSpan shared_secret, @@ -70,10 +83,6 @@ class Kyber_Symmetric_Primitives { } Botan::XOF& XOF(StrongSpan seed, std::tuple matrix_position) const { - // TODO: once we remove Kyber 90s, we should make `get_XOF()` return a - // reference instead of a unique pointer (for consistency), and - // call `get_XOF().copy_state()` here. The AES-CTR XOF doesn't - // support this. return get_XOF(seed, matrix_position); } @@ -95,8 +104,12 @@ class Kyber_Symmetric_Primitives { } protected: + virtual std::optional> seed_expansion_domain_separator( + const KyberConstants& mode) const = 0; + virtual HashFunction& get_G() const = 0; virtual HashFunction& get_H() const = 0; + virtual HashFunction& get_J() const = 0; virtual HashFunction& get_KDF() const = 0; virtual Botan::XOF& get_PRF(std::span seed, uint8_t nonce) const = 0; virtual Botan::XOF& get_XOF(std::span seed, diff --git a/src/lib/pubkey/kyber/kyber_common/kyber_types.h b/src/lib/pubkey/kyber/kyber_common/kyber_types.h index f4e641a73b9..3b600f61264 100644 --- a/src/lib/pubkey/kyber/kyber_common/kyber_types.h +++ b/src/lib/pubkey/kyber/kyber_common/kyber_types.h @@ -56,20 +56,31 @@ using KyberSharedSecret = Strong, struct KyberSharedSecre /// Public key in serialized form (t || rho) using KyberSerializedPublicKey = Strong, struct KyberSerializedPublicKey_>; -// Hash value of the serialized public key +/// Hash value of the serialized public key using KyberHashedPublicKey = Strong, struct KyberHashedPublicKey_>; -// Compressed and serialized ciphertext value +/// Compressed and serialized ciphertext value using KyberCompressedCiphertext = Strong, struct KyberCompressedCiphertext_>; -// Hash of the compressed and serialized ciphertext value -// TODO: Remove this once Kyber-R3 is removed +/// Hash of the compressed and serialized ciphertext value +/// TODO: Remove this once Kyber-R3 is removed using KyberHashedCiphertext = Strong, struct KyberHashedCiphertext_>; -// Variant value of either a KyberSeedSigma or a KyberEncryptionRandomness +/// Variant value of either a KyberSeedSigma or a KyberEncryptionRandomness using KyberSigmaOrEncryptionRandomness = std::variant, StrongSpan>; +using KyberInternalKeypair = + std::pair, std::shared_ptr>; + +/// NIST FIPS 203, Section 3 +/// The seed (𝑑,𝑧) generated in steps 1 and 2 of ML-KEM.KeyGen can be stored +/// for later expansion using ML-KEM.KeyGen_internal. +struct KyberPrivateKeySeed { + std::optional d; + KyberImplicitRejectionValue z; +}; + } // namespace Botan #endif diff --git a/src/lib/pubkey/kyber/kyber_round3/info.txt b/src/lib/pubkey/kyber/kyber_round3/info.txt index bf726128e6a..4e85457155c 100644 --- a/src/lib/pubkey/kyber/kyber_round3/info.txt +++ b/src/lib/pubkey/kyber/kyber_round3/info.txt @@ -13,5 +13,5 @@ kyber_common -kyber_encaps.h +kyber_round3_impl.h diff --git a/src/lib/pubkey/kyber/kyber_round3/kyber/kyber_modern.h b/src/lib/pubkey/kyber/kyber_round3/kyber/kyber_modern.h index 56f0cd7dbb4..949af336ad0 100644 --- a/src/lib/pubkey/kyber/kyber_round3/kyber/kyber_modern.h +++ b/src/lib/pubkey/kyber/kyber_round3/kyber/kyber_modern.h @@ -1,6 +1,6 @@ /* * Symmetric primitives for Kyber (modern (non-90s) mode) - * (C) 2022 Jack Lloyd + * (C) 2022-2024 Jack Lloyd * (C) 2022 Hannes Rantzsch, René Meusel, neXenio GmbH * (C) 2024 René Meusel, Rohde & Schwarz Cybersecurity * @@ -20,7 +20,7 @@ namespace Botan { -class Kyber_Modern_Symmetric_Primitives : public Kyber_Symmetric_Primitives { +class Kyber_Modern_Symmetric_Primitives final : public Kyber_Symmetric_Primitives { public: Kyber_Modern_Symmetric_Primitives() : m_sha3_512(HashFunction::create_or_throw("SHA-3(512)")), @@ -30,10 +30,16 @@ class Kyber_Modern_Symmetric_Primitives : public Kyber_Symmetric_Primitives { m_shake256(Botan::XOF::create_or_throw("SHAKE-256")) {} protected: + std::optional> seed_expansion_domain_separator(const KyberConstants&) const override { + return {}; + } + HashFunction& get_G() const override { return *m_sha3_512; } HashFunction& get_H() const override { return *m_sha3_256; } + HashFunction& get_J() const override { throw Invalid_State("Kyber-R3 does not support J()"); } + HashFunction& get_KDF() const override { return *m_shake256_256; } Botan::XOF& get_PRF(std::span seed, const uint8_t nonce) const override { diff --git a/src/lib/pubkey/kyber/kyber_round3/kyber_90s/kyber_90s.h b/src/lib/pubkey/kyber/kyber_round3/kyber_90s/kyber_90s.h index 75bc1013ded..7868eb57603 100644 --- a/src/lib/pubkey/kyber/kyber_round3/kyber_90s/kyber_90s.h +++ b/src/lib/pubkey/kyber/kyber_round3/kyber_90s/kyber_90s.h @@ -1,6 +1,6 @@ /* * Symmetric primitives for Kyber (90s mode) - * (C) 2022 Jack Lloyd + * (C) 2022-2024 Jack Lloyd * (C) 2022 Hannes Rantzsch, René Meusel, neXenio GmbH * (C) 2024 René Meusel, Rohde & Schwarz Cybersecurity * @@ -20,7 +20,7 @@ namespace Botan { -class Kyber_90s_Symmetric_Primitives : public Kyber_Symmetric_Primitives { +class Kyber_90s_Symmetric_Primitives final : public Kyber_Symmetric_Primitives { public: Kyber_90s_Symmetric_Primitives() : m_sha512(HashFunction::create_or_throw("SHA-512")), @@ -28,10 +28,16 @@ class Kyber_90s_Symmetric_Primitives : public Kyber_Symmetric_Primitives { m_aes256_xof(std::make_unique()) {} protected: + std::optional> seed_expansion_domain_separator(const KyberConstants&) const override { + return {}; + } + HashFunction& get_G() const override { return *m_sha512; } HashFunction& get_H() const override { return *m_sha256; } + HashFunction& get_J() const override { throw Invalid_State("Kyber-R3 in 90s mode does not support J()"); } + HashFunction& get_KDF() const override { return *m_sha256; } Botan::XOF& get_PRF(std::span seed, const uint8_t nonce) const override { diff --git a/src/lib/pubkey/kyber/kyber_round3/kyber_encaps.cpp b/src/lib/pubkey/kyber/kyber_round3/kyber_encaps.cpp deleted file mode 100644 index f0e37a29339..00000000000 --- a/src/lib/pubkey/kyber/kyber_round3/kyber_encaps.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Crystals Kyber key encapsulation mechanism - * - * (C) 2024 Jack Lloyd - * (C) 2024 René Meusel, Rohde & Schwarz Cybersecurity - * - * Botan is released under the Simplified BSD License (see license.txt) - */ - -#include - -#include -#include -#include -#include - -namespace Botan { - -/** - * Crystals Kyber (Version 3.01), Algorithm 8 (Kyber.CCAKEM.Enc()) - */ -void Kyber_KEM_Encryptor::encapsulate(StrongSpan out_encapsulated_key, - StrongSpan out_shared_key, - RandomNumberGenerator& rng) { - const auto& sym = m_public_key->mode().symmetric_primitives(); - - const auto seed_m = rng.random_vec(KyberConstants::SEED_BYTES); - CT::poison(seed_m); - - const auto m = sym.H(seed_m); - const auto [K_bar, r] = sym.G(m, m_public_key->H_public_key_bits_raw()); - m_public_key->indcpa_encrypt(out_encapsulated_key, m, r, precomputed_matrix_At()); - - sym.KDF(out_shared_key, K_bar, sym.H(out_encapsulated_key)); - CT::unpoison_all(out_shared_key, out_encapsulated_key); -} - -/** - * Crystals Kyber (Version 3.01), Algorithm 9 (Kyber.CCAKEM.Dec()) - */ -void Kyber_KEM_Decryptor::decapsulate(StrongSpan out_shared_key, - StrongSpan encapsulated_key) { - auto scope = CT::scoped_poison(*m_private_key); - - const auto& sym = m_public_key->mode().symmetric_primitives(); - - const auto& h = m_public_key->H_public_key_bits_raw(); - const auto& z = m_private_key->z(); - - const auto m_prime = m_private_key->indcpa_decrypt(encapsulated_key); - const auto [K_bar_prime, r_prime] = sym.G(m_prime, h); - - const auto c_prime = m_public_key->indcpa_encrypt(m_prime, r_prime, precomputed_matrix_At()); - - KyberSharedSecret K(KyberConstants::SEED_BYTES); - BOTAN_ASSERT_NOMSG(encapsulated_key.size() == c_prime.size()); - BOTAN_ASSERT_NOMSG(K_bar_prime.size() == K.size()); - const auto reencrypt_success = CT::is_equal(encapsulated_key.data(), c_prime.data(), encapsulated_key.size()); - CT::conditional_copy_mem(reencrypt_success, K.data(), K_bar_prime.data(), z.data(), K_bar_prime.size()); - - sym.KDF(out_shared_key, K, sym.H(encapsulated_key)); - CT::unpoison(out_shared_key); -} - -} // namespace Botan diff --git a/src/lib/pubkey/kyber/kyber_round3/kyber_round3_impl.cpp b/src/lib/pubkey/kyber/kyber_round3/kyber_round3_impl.cpp new file mode 100644 index 00000000000..eec4e669f2c --- /dev/null +++ b/src/lib/pubkey/kyber/kyber_round3/kyber_round3_impl.cpp @@ -0,0 +1,122 @@ +/* + * Crystals Kyber key encapsulation mechanism and key codec + * + * (C) 2024 Jack Lloyd + * (C) 2024 René Meusel, Rohde & Schwarz Cybersecurity + * + * Botan is released under the Simplified BSD License (see license.txt) + */ + +#include + +#include +#include +#include +#include + +namespace Botan { + +/** + * Crystals Kyber (Version 3.01), Algorithm 8 (Kyber.CCAKEM.Enc()) + */ +void Kyber_KEM_Encryptor::encapsulate(StrongSpan out_encapsulated_key, + StrongSpan out_shared_key, + RandomNumberGenerator& rng) { + const auto& sym = m_public_key->mode().symmetric_primitives(); + + const auto seed_m = rng.random_vec(KyberConstants::SEED_BYTES); + CT::poison(seed_m); + + const auto m = sym.H(seed_m); + const auto [K_bar, r] = sym.G(m, m_public_key->H_public_key_bits_raw()); + m_public_key->indcpa_encrypt(out_encapsulated_key, m, r, precomputed_matrix_At()); + + sym.KDF(out_shared_key, K_bar, sym.H(out_encapsulated_key)); + CT::unpoison_all(out_shared_key, out_encapsulated_key); +} + +/** + * Crystals Kyber (Version 3.01), Algorithm 9 (Kyber.CCAKEM.Dec()) + */ +void Kyber_KEM_Decryptor::decapsulate(StrongSpan out_shared_key, + StrongSpan encapsulated_key) { + auto scope = CT::scoped_poison(*m_private_key); + + const auto& sym = m_public_key->mode().symmetric_primitives(); + + const auto& h = m_public_key->H_public_key_bits_raw(); + const auto& z = m_private_key->z(); + + const auto m_prime = m_private_key->indcpa_decrypt(encapsulated_key); + const auto [K_bar_prime, r_prime] = sym.G(m_prime, h); + + const auto c_prime = m_public_key->indcpa_encrypt(m_prime, r_prime, precomputed_matrix_At()); + + KyberSharedSecret K(KyberConstants::SEED_BYTES); + BOTAN_ASSERT_NOMSG(encapsulated_key.size() == c_prime.size()); + BOTAN_ASSERT_NOMSG(K_bar_prime.size() == K.size()); + const auto reencrypt_success = CT::is_equal(encapsulated_key.data(), c_prime.data(), encapsulated_key.size()); + CT::conditional_copy_mem(reencrypt_success, K.data(), K_bar_prime.data(), z.data(), K_bar_prime.size()); + + sym.KDF(out_shared_key, K, sym.H(encapsulated_key)); + CT::unpoison(out_shared_key); +} + +/** + * Key decoding as specified in Crystals Kyber (Version 3.01), + * Algorithms 4 (CPAPKE.KeyGen()), and 7 (CCAKEM.KeyGen()) + * + * Public Key: pk := (encode(t) || rho) + * Secret Key: sk' := encode(s) + * + * Expanded Secret Key: sk := (sk' || pk || H(pk) || z) + */ +KyberInternalKeypair Kyber_Expanded_Keypair_Codec::decode_keypair(std::span sk, + KyberConstants mode) const { + auto scope = CT::scoped_poison(sk); + BufferSlicer s(sk); + + auto skpv = Kyber_Algos::decode_polynomial_vector(s.take(mode.polynomial_vector_bytes()), mode); + auto pub_key = s.copy(mode.public_key_bytes()); + auto puk_key_hash = s.take(KyberConstants::PUBLIC_KEY_HASH_BYTES); + auto z = s.copy(KyberConstants::SEED_BYTES); + + BOTAN_ASSERT_NOMSG(s.empty()); + + CT::unpoison_all(pub_key, puk_key_hash, skpv, z); + + KyberInternalKeypair keypair{ + std::make_shared(mode, std::move(pub_key)), + std::make_shared( + std::move(mode), + std::move(skpv), + KyberPrivateKeySeed{std::nullopt, // Reading from an expanded and encoded + // private key cannot reconstruct the + // original seed from key generation. + std::move(z)}), + }; + + BOTAN_ASSERT(keypair.first && keypair.second, "reading private key encoding"); + BOTAN_ARG_CHECK(keypair.first->H_public_key_bits_raw().size() == puk_key_hash.size() && + std::equal(keypair.first->H_public_key_bits_raw().begin(), + keypair.first->H_public_key_bits_raw().end(), + puk_key_hash.begin()), + "public key's hash does not match the stored hash"); + + return keypair; +} + +secure_vector Kyber_Expanded_Keypair_Codec::encode_keypair(KyberInternalKeypair keypair) const { + BOTAN_ASSERT_NONNULL(keypair.first); + BOTAN_ASSERT_NONNULL(keypair.second); + const auto& mode = keypair.first->mode(); + auto scope = CT::scoped_poison(*keypair.second); + auto result = concat(Kyber_Algos::encode_polynomial_vector(keypair.second->s().reduce(), mode), + keypair.first->public_key_bits_raw(), + keypair.first->H_public_key_bits_raw(), + keypair.second->z()); + CT::unpoison(result); + return result; +} + +} // namespace Botan diff --git a/src/lib/pubkey/kyber/kyber_round3/kyber_encaps.h b/src/lib/pubkey/kyber/kyber_round3/kyber_round3_impl.h similarity index 84% rename from src/lib/pubkey/kyber/kyber_round3/kyber_encaps.h rename to src/lib/pubkey/kyber/kyber_round3/kyber_round3_impl.h index 4088fd02e0d..5c04406acfc 100644 --- a/src/lib/pubkey/kyber/kyber_round3/kyber_encaps.h +++ b/src/lib/pubkey/kyber/kyber_round3/kyber_round3_impl.h @@ -1,5 +1,5 @@ /* - * Crystals Kyber key encapsulation mechanism + * Crystals Kyber key encapsulation mechanism and key codec * * (C) 2024 Jack Lloyd * (C) 2024 René Meusel, Rohde & Schwarz Cybersecurity @@ -53,6 +53,12 @@ class Kyber_KEM_Decryptor final : public Kyber_KEM_Decryptor_Base { std::shared_ptr m_private_key; }; +class Kyber_Expanded_Keypair_Codec final : public Kyber_Keypair_Codec { + public: + KyberInternalKeypair decode_keypair(std::span buffer, KyberConstants mode) const override; + secure_vector encode_keypair(KyberInternalKeypair private_key) const override; +}; + } // namespace Botan #endif diff --git a/src/lib/pubkey/kyber/ml_kem/info.txt b/src/lib/pubkey/kyber/ml_kem/info.txt new file mode 100644 index 00000000000..4257b25377c --- /dev/null +++ b/src/lib/pubkey/kyber/ml_kem/info.txt @@ -0,0 +1,19 @@ + +ML_KEM -> 20240821 + + + +name -> "ML-KEM" +brief -> "Module Lattice KEM" + + + +kyber_common +sha3 +shake +shake_xof + + + +ml_kem_impl.h + diff --git a/src/lib/pubkey/kyber/ml_kem/ml_kem_impl.cpp b/src/lib/pubkey/kyber/ml_kem/ml_kem_impl.cpp new file mode 100644 index 00000000000..469d8110175 --- /dev/null +++ b/src/lib/pubkey/kyber/ml_kem/ml_kem_impl.cpp @@ -0,0 +1,89 @@ +/* + * Module-Lattice Key Encapsulation Mechanism (ML-KEM), Initial Public Draft + * + * (C) 2024 Jack Lloyd + * (C) 2024 René Meusel, Rohde & Schwarz Cybersecurity + * + * Botan is released under the Simplified BSD License (see license.txt) + */ + +#include + +#include +#include +#include +#include + +namespace Botan { + +/** + * NIST FIPS 203, Algorithm 17 (ML-KEM.Encaps_internal), and 20 (ML-KEM.Encaps) + * + * Generation of the random value is inlined with its usage. The public matrix + * A^T as well as H(pk) are precomputed and readily available. + */ +void ML_KEM_Encryptor::encapsulate(StrongSpan out_encapsulated_key, + StrongSpan out_shared_key, + RandomNumberGenerator& rng) { + const auto& sym = m_public_key->mode().symmetric_primitives(); + + const auto m = rng.random_vec(KyberConstants::SEED_BYTES); + auto scope = CT::scoped_poison(m); + + const auto [K, r] = sym.G(m, m_public_key->H_public_key_bits_raw()); + m_public_key->indcpa_encrypt(out_encapsulated_key, m, r, precomputed_matrix_At()); + + // TODO: avoid this copy by letting sym.G() directly write to the span. + copy_mem(out_shared_key, K); + CT::unpoison_all(out_shared_key, out_encapsulated_key); +} + +/** + * NIST FIPS 203, Algorithm 18 (ML-KEM.Decaps_internal) and 21 (ML-KEM.Decaps) + * + * The public and private keys are readily available as member variables and + * don't need to be decoded. The checks stated in FIPS 203, Section 7.3 are + * performed before decoding the keys and the ciphertext. + */ +void ML_KEM_Decryptor::decapsulate(StrongSpan out_shared_key, + StrongSpan c) { + auto scope = CT::scoped_poison(*m_private_key); + + const auto& sym = m_public_key->mode().symmetric_primitives(); + + const auto& h = m_public_key->H_public_key_bits_raw(); + const auto& z = m_private_key->z(); + + const auto m_prime = m_private_key->indcpa_decrypt(c); + const auto [K_prime, r_prime] = sym.G(m_prime, h); + + const auto K_bar = sym.J(z, c); + const auto c_prime = m_public_key->indcpa_encrypt(m_prime, r_prime, precomputed_matrix_At()); + + BOTAN_ASSERT_NOMSG(c.size() == c_prime.size()); + BOTAN_ASSERT_NOMSG(K_prime.size() == K_bar.size() && out_shared_key.size() == K_bar.size()); + const auto reencrypt_success = CT::is_equal(c.data(), c_prime.data(), c.size()); + CT::conditional_copy_mem(reencrypt_success, out_shared_key.data(), K_prime.data(), K_bar.data(), K_prime.size()); + + CT::unpoison(out_shared_key); +} + +KyberInternalKeypair ML_KEM_Expanding_Keypair_Codec::decode_keypair(std::span private_key, + KyberConstants mode) const { + BufferSlicer s(private_key); + auto seed = KyberPrivateKeySeed{ + s.copy(KyberConstants::SEED_BYTES), + s.copy(KyberConstants::SEED_BYTES), + }; + BOTAN_ASSERT_NOMSG(s.empty()); + return Kyber_Algos::expand_keypair(std::move(seed), std::move(mode)); +} + +secure_vector ML_KEM_Expanding_Keypair_Codec::encode_keypair(KyberInternalKeypair keypair) const { + BOTAN_ASSERT_NONNULL(keypair.second); + const auto& seed = keypair.second->seed(); + BOTAN_ARG_CHECK(seed.d.has_value(), "Cannot encode keypair without the full private seed"); + return concat>(seed.d.value(), seed.z); +}; + +} // namespace Botan diff --git a/src/lib/pubkey/kyber/ml_kem/ml_kem_impl.h b/src/lib/pubkey/kyber/ml_kem/ml_kem_impl.h new file mode 100644 index 00000000000..64cc52b9ab1 --- /dev/null +++ b/src/lib/pubkey/kyber/ml_kem/ml_kem_impl.h @@ -0,0 +1,116 @@ +/* + * Module-Lattice Key Encapsulation Mechanism (ML-KEM) + * + * (C) 2024 Jack Lloyd + * (C) 2024 René Meusel, Rohde & Schwarz Cybersecurity + * + * Botan is released under the Simplified BSD License (see license.txt) + */ + +#ifndef BOTAN_ML_KEM_IMPL_H_ +#define BOTAN_ML_KEM_IMPL_H_ + +#include +#include +#include + +#include +#include +#include +#include + +namespace Botan { + +class ML_KEM_Encryptor final : public Kyber_KEM_Encryptor_Base { + public: + ML_KEM_Encryptor(std::shared_ptr key, std::string_view kdf) : + Kyber_KEM_Encryptor_Base(kdf, *key), m_public_key(std::move(key)) {} + + protected: + void encapsulate(StrongSpan out_encapsulated_key, + StrongSpan out_shared_key, + RandomNumberGenerator& rng) override; + + const KyberConstants& mode() const override { return m_public_key->mode(); } + + private: + std::shared_ptr m_public_key; +}; + +class ML_KEM_Decryptor final : public Kyber_KEM_Decryptor_Base { + public: + ML_KEM_Decryptor(std::shared_ptr private_key, + std::shared_ptr public_key, + std::string_view kdf) : + Kyber_KEM_Decryptor_Base(kdf, *public_key), + m_public_key(std::move(public_key)), + m_private_key(std::move(private_key)) {} + + protected: + void decapsulate(StrongSpan out_shared_key, + StrongSpan encapsulated_key) override; + + const KyberConstants& mode() const override { return m_private_key->mode(); } + + private: + std::shared_ptr m_public_key; + std::shared_ptr m_private_key; +}; + +class ML_KEM_Symmetric_Primitives final : public Kyber_Symmetric_Primitives { + public: + ML_KEM_Symmetric_Primitives() : + m_sha3_512(HashFunction::create_or_throw("SHA-3(512)")), + m_sha3_256(HashFunction::create_or_throw("SHA-3(256)")), + m_shake256_256(HashFunction::create_or_throw("SHAKE-256(256)")), + m_shake128(Botan::XOF::create_or_throw("SHAKE-128")), + m_shake256(Botan::XOF::create_or_throw("SHAKE-256")) {} + + protected: + std::optional> seed_expansion_domain_separator(const KyberConstants& mode) const override { + // NIST FIPS 203, Algorithm 13 (K-PKE.KeyGen) + // Byte 33 of the input to G is the module dimension k from {2,3,4}. + // This is included to establish domain separation between the three + // parameter sets + return std::array{mode.k()}; + } + + HashFunction& get_G() const override { return *m_sha3_512; } + + HashFunction& get_H() const override { return *m_sha3_256; } + + HashFunction& get_J() const override { return *m_shake256_256; } + + HashFunction& get_KDF() const override { throw Invalid_State("ML-KEM does not support KDF()"); } + + Botan::XOF& get_PRF(std::span seed, const uint8_t nonce) const override { + m_shake256->clear(); + m_shake256->update(seed); + m_shake256->update(store_be(nonce)); + return *m_shake256; + } + + Botan::XOF& get_XOF(std::span seed, std::tuple matrix_position) const override { + m_shake128->clear(); + m_shake128->update(seed); + m_shake128->update(store_be(make_uint16(std::get<0>(matrix_position), std::get<1>(matrix_position)))); + return *m_shake128; + } + + private: + std::unique_ptr m_sha3_512; + std::unique_ptr m_sha3_256; + std::unique_ptr m_shake256_256; + std::unique_ptr m_shake128; + std::unique_ptr m_shake256; +}; + +class ML_KEM_Expanding_Keypair_Codec final : public Kyber_Keypair_Codec { + public: + KyberInternalKeypair decode_keypair(std::span buffer, KyberConstants mode) const override; + secure_vector encode_keypair(KyberInternalKeypair keypair) const override; +}; + +} // namespace Botan + +#endif diff --git a/src/lib/pubkey/pk_algs.cpp b/src/lib/pubkey/pk_algs.cpp index 40f43f56bd0..eb7e212f689 100644 --- a/src/lib/pubkey/pk_algs.cpp +++ b/src/lib/pubkey/pk_algs.cpp @@ -78,7 +78,7 @@ #include #endif -#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) +#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) || defined(BOTAN_HAS_ML_KEM) #include #endif @@ -140,8 +140,8 @@ std::unique_ptr load_public_key(const AlgorithmIdentifier& alg_id, } #endif -#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) - if(alg_name == "Kyber" || alg_name.starts_with("Kyber-")) { +#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) || defined(BOTAN_HAS_ML_KEM) + if(alg_name.starts_with("ML-KEM-") || alg_name == "Kyber" || alg_name.starts_with("Kyber-")) { return std::make_unique(alg_id, key_bits); } #endif @@ -293,8 +293,8 @@ std::unique_ptr load_private_key(const AlgorithmIdentifier& alg_id, } #endif -#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) - if(alg_name == "Kyber" || alg_name.starts_with("Kyber-")) { +#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) || defined(BOTAN_HAS_ML_KEM) + if(alg_name.starts_with("ML-KEM-") || alg_name == "Kyber" || alg_name.starts_with("Kyber-")) { return std::make_unique(alg_id, key_bits); } #endif @@ -488,6 +488,19 @@ std::unique_ptr create_private_key(std::string_view alg_name, } #endif +#if defined(BOTAN_HAS_ML_KEM) + if(alg_name == "ML-KEM") { + const auto mode = [&]() -> KyberMode { + if(params.empty()) { + return KyberMode::ML_KEM_768; + } + return KyberMode(params); + }(); + + return std::make_unique(rng, mode); + } +#endif + #if defined(BOTAN_HAS_DILITHIUM) || defined(BOTAN_HAS_DILITHIUM_AES) if(alg_name == "Dilithium" || alg_name == "Dilithium-") { const auto mode = [&]() -> DilithiumMode { diff --git a/src/lib/pubkey/pqcrystals/pqcrystals_encoding.h b/src/lib/pubkey/pqcrystals/pqcrystals_encoding.h index 8c99187b82b..6acc3dcf0bb 100644 --- a/src/lib/pubkey/pqcrystals/pqcrystals_encoding.h +++ b/src/lib/pubkey/pqcrystals/pqcrystals_encoding.h @@ -93,7 +93,7 @@ struct BitPackingTrait final { }; /** - * Base implementation of NIST FIPS 203 IPD Algorithm 4 (ByteEncode) and NIST + * Base implementation of NIST FIPS 203 Algorithm 5 (ByteEncode) and NIST * FIPS 204 Algorithms 10 (SimpleBitPack) and 11 (BitPack). * * This takes a polynomial @p p and packs its coefficients into the buffer @@ -165,7 +165,7 @@ constexpr void pack(const Polynomial& p, BufferStuffer& stuffer, M } /** - * Base implementation of NIST FIPS 203 IPD Algorithm 5 (ByteDecode) and NIST + * Base implementation of NIST FIPS 203 Algorithm 6 (ByteDecode) and NIST * FIPS 204 Algorithms 12 (SimpleBitUnpack) and 13 (BitUnpack). * * This takes a byte sequence represented by @p byte_source and unpacks its diff --git a/src/tests/data/pubkey/kyber_encodings.vec b/src/tests/data/pubkey/kyber_encodings.vec index ba4098f71d9..161ac5cddde 100644 --- a/src/tests/data/pubkey/kyber_encodings.vec +++ b/src/tests/data/pubkey/kyber_encodings.vec @@ -1,10 +1,10 @@ [Kyber-512-r3] -Error = kyber private key does not have the correct byte count +Error = Private key does not have the correct byte count PrivateRaw = BAADF00D PublicRaw = -Error = kyber public key does not have the correct byte count +Error = Public key does not have the correct byte count PrivateRaw = PublicRaw = BAADF00DE52CC940EC939B216BB5C77F5BAA8B2672950C72B722D19DF9671C264061A4D424E21A450B8CAC882508AFD23565E86664C4CD56094C1F72542E1C25424B0DCD4842DF48C8F79893D73148DCB99FB6490FF1218822D6017FD17FC8D6CC5514A5B3B3A1A169CCE766A7C74B24B4E8468A5527BC205919569E8619B87197BE1C5C34DBDC3756112875858FE986BA6E3A7A7F64CF37215E15AC522BDBAAB1D73A8738B90AF35A6F83C8839765AEA1322FF923237271E7E1BD9A56092A9591E8B54245A046E6E8268EA8306C0488F616BC65985ABE804F695A9EBB385DA97789F8D381DBE2156E70B09B1201F80143E55265B4868A7B67A924D0C6D932B3DFD18B58D3A6A5002D41080B03A9796CB3734B3627F4044929151ADC0C8348137B2F549FDD70B622C72F3AE772B77B638B6379162A64B0110FB0532162068919C351276618623A7B96867C3479CE6B3101658BAC7F05938F462C2F88918823A8444019DFE0381FA70A7C11BD85A394A1D11FCB6B8D7DD94E012881E6AC768A7486BC668665A83BFBF261B0C280D7878747EC340D0C57A35810D1FC768D128796EAB1F4C72BD7341ECCF030508392E8095985E3A63BA4CDACB96A15E506F22C5031D8CB6C4C2B227C6EA8EC76244BCC7F425FB5F28E1F9702C0F3AFE7A946A94BAD108375D512C43B52607ECC91889408A1156EC61593FF8156780C5EA2B462B733A72256424442CABA87CC1D101983095E0142420D295F2C064AC96738B021BBC75291194C10A978CB20FC15A1C4A91E1B2462149B473540FE677645D5C8F473C2862633461B4BDFB561C0D5256A239F49483A926C2B6CBAA08A4381FA1AC4E26688ECE103E23C3D85B19D8600CEE57C301D3C2C13731673F599F3338CB7B644DE19A32297C0CE553FDDD737266630BB3416CF6C1477163B520276D6B63DB789A0284A65838696869CAEE20A6B828A476384C6C1AA6C48D9B4ABF816912C425AEB5B90093B253C936D3359E86041C9637B92E76261181F4DB98E4DC9415E5075815773FD07B2CA36C5821123D40A55CC57C8FB648C18642CF2A19F25D9678AE0001A1981BF9979FE2826ECF1A53B8C07A9346FED6BCF664CFD63FA8DB1327FCAF87FA71A diff --git a/src/tests/test_kyber.cpp b/src/tests/test_kyber.cpp index 652edf7758b..f34000130a3 100644 --- a/src/tests/test_kyber.cpp +++ b/src/tests/test_kyber.cpp @@ -20,7 +20,7 @@ #include #include -#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) +#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) || defined(BOTAN_HAS_ML_KEM) #include "test_pubkey.h" #include #include @@ -34,13 +34,18 @@ namespace Botan_Tests { -#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) +#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) || defined(BOTAN_HAS_ML_KEM) class KYBER_Tests final : public Test { public: static Test::Result run_kyber_test(const char* test_name, Botan::KyberMode mode, size_t strength, size_t psid) { Test::Result result(test_name); + if(!mode.is_available()) { + result.note_missing(mode.to_string()); + return result; + } + auto rng = Test::new_rng(test_name); const std::vector empty_salt; @@ -96,20 +101,17 @@ class KYBER_Tests final : public Test { } std::vector run() override { - std::vector results; - - #if defined(BOTAN_HAS_KYBER_90S) - results.push_back(run_kyber_test("Kyber512_90s API", Botan::KyberMode::Kyber512_90s, 128, 512)); - results.push_back(run_kyber_test("Kyber768_90s API", Botan::KyberMode::Kyber768_90s, 192, 768)); - results.push_back(run_kyber_test("Kyber1024_90s API", Botan::KyberMode::Kyber1024_90s, 256, 1024)); - #endif - #if defined(BOTAN_HAS_KYBER) - results.push_back(run_kyber_test("Kyber512 API", Botan::KyberMode::Kyber512_R3, 128, 512)); - results.push_back(run_kyber_test("Kyber768 API", Botan::KyberMode::Kyber768_R3, 192, 768)); - results.push_back(run_kyber_test("Kyber1024 API", Botan::KyberMode::Kyber1024_R3, 256, 1024)); - #endif - - return results; + return { + run_kyber_test("Kyber512_90s API", Botan::KyberMode::Kyber512_90s, 128, 512), + run_kyber_test("Kyber768_90s API", Botan::KyberMode::Kyber768_90s, 192, 768), + run_kyber_test("Kyber1024_90s API", Botan::KyberMode::Kyber1024_90s, 256, 1024), + run_kyber_test("Kyber512 API", Botan::KyberMode::Kyber512_R3, 128, 512), + run_kyber_test("Kyber768 API", Botan::KyberMode::Kyber768_R3, 192, 768), + run_kyber_test("Kyber1024 API", Botan::KyberMode::Kyber1024_R3, 256, 1024), + run_kyber_test("ML-KEM-512 API", Botan::KyberMode::ML_KEM_512, 128, 512), + run_kyber_test("ML-KEM-768 API", Botan::KyberMode::ML_KEM_768, 192, 768), + run_kyber_test("ML-KEM-1024 API", Botan::KyberMode::ML_KEM_1024, 256, 1024), + }; } }; diff --git a/src/tests/test_pubkey.cpp b/src/tests/test_pubkey.cpp index ae3724ed5f1..26b9c58c4c6 100644 --- a/src/tests/test_pubkey.cpp +++ b/src/tests/test_pubkey.cpp @@ -612,7 +612,7 @@ std::vector PK_Key_Generation_Test::run() { oid.value().to_string(), key.object_identifier().to_string()); } else { - const bool exception = name == "Kyber" || name == "FrodoKEM" || name == "SPHINCS+"; + const bool exception = name == "Kyber" || name == "ML-KEM" || name == "FrodoKEM" || name == "SPHINCS+"; if(!exception) { result.test_failure("Keys name " + name + " does not map to an OID"); diff --git a/src/tests/unit_x509.cpp b/src/tests/unit_x509.cpp index 0d0df082b92..dba4f007524 100644 --- a/src/tests/unit_x509.cpp +++ b/src/tests/unit_x509.cpp @@ -1197,7 +1197,7 @@ Test::Result test_valid_constraints(const Botan::Private_Key& key, const std::st result.test_eq("usage acceptable", key_agreement_decipher_only.compatible_with(key), true); result.test_eq("crl sign not permitted", crl_sign.compatible_with(key), false); result.test_eq("sign", sign_everything.compatible_with(key), false); - } else if(pk_algo == "Kyber" || pk_algo == "FrodoKEM") { + } else if(pk_algo == "Kyber" || pk_algo == "FrodoKEM" || pk_algo == "ML-KEM") { // KEMs can encrypt and agree result.test_eq("all constraints not permitted", all.compatible_with(key), false); result.test_eq("cert sign not permitted", ca.compatible_with(key), false); @@ -1681,7 +1681,7 @@ class X509_Cert_Unit_Tests final : public Test { /* These are algos which cannot sign but can be included in certs */ - const std::vector enc_algos = {"DH", "ECDH", "ElGamal", "Kyber", "FrodoKEM"}; + const std::vector enc_algos = {"DH", "ECDH", "ElGamal", "Kyber", "ML-KEM", "FrodoKEM"}; for(const std::string& algo : enc_algos) { auto key = make_a_private_key(algo, rng); From 1dc78808a40d8b43881f7428483b69d1710d36f6 Mon Sep 17 00:00:00 2001 From: Amos Treiber Date: Fri, 20 Sep 2024 15:56:52 +0200 Subject: [PATCH 5/9] Add KATs for ML-KEM This adds 'official' KATs from the ACVP-Server provided by NIST. Also included are some python scripts to illustrate the pre-processing necessary to update those KAT files. --- src/scripts/dev_tools/gen_kyber_kat.py | 151 +++-- src/scripts/dev_tools/gen_mlkem_acvp_kat.py | 182 ++++++ src/tests/data/pubkey/kyber_encodings.vec | 19 + src/tests/data/pubkey/ml_kem.vec | 606 +++++++++++++++++++ src/tests/data/pubkey/ml_kem_acvp_encap.vec | 381 ++++++++++++ src/tests/data/pubkey/ml_kem_acvp_keygen.vec | 381 ++++++++++++ src/tests/test_kyber.cpp | 130 ++-- src/tests/test_pubkey_pqc.h | 147 ++++- 8 files changed, 1903 insertions(+), 94 deletions(-) create mode 100644 src/scripts/dev_tools/gen_mlkem_acvp_kat.py create mode 100644 src/tests/data/pubkey/ml_kem.vec create mode 100644 src/tests/data/pubkey/ml_kem_acvp_encap.vec create mode 100644 src/tests/data/pubkey/ml_kem_acvp_keygen.vec diff --git a/src/scripts/dev_tools/gen_kyber_kat.py b/src/scripts/dev_tools/gen_kyber_kat.py index f865149cdd5..5003cbf814e 100755 --- a/src/scripts/dev_tools/gen_kyber_kat.py +++ b/src/scripts/dev_tools/gen_kyber_kat.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 # -# Strips the KAT harness in the Kyber reference implementation down -# to a less space consuming version. This script was used to generate -# `src/tests/data/pubkey/kyber_kat.vec` test data from the *.rsp files in -# the reference implementation repository. +# Strips the KAT harness in the Kyber reference implementation down to a less +# space consuming version. This script was used to generate: +# * `src/tests/data/pubkey/kyber_kat.vec` and +# * `src/tests/data/pubkey/ml_kem_ipd.vec` +# test data from the *.rsp files in the reference implementation repository. # # See here: https://github.com/pq-crystals/kyber # @@ -21,6 +22,7 @@ # # (C) 2023 Jack Lloyd # (C) 2023 René Meusel - Rohde & Schwarz Cybersecurity +# (C) 2024 Amos Treiber, René Meusel - Rohde & Schwarz Cybersecurity # # Botan is released under the Simplified BSD License (see license.txt) # @@ -29,11 +31,11 @@ import hashlib import binascii import os +import argparse class KatReader: def __init__(self, file): self.file = file - self.last_mlen = None def next_value(self): while True: @@ -58,7 +60,10 @@ def read_kats(self): if key == None: return # eof - if key not in ['count', 'seed', 'pk', 'sk', 'ct', 'ss']: + if key in ['msg']: + continue + + if key not in ['count', 'z', 'd', 'seed', 'pk', 'sk', 'ct', 'ss', 'ct_n', 'ss_n']: raise Exception("Unknown key %s" % (key)) if key == 'count': @@ -82,11 +87,17 @@ def sha256_16(v): h.update(binascii.unhexlify(v)) return h.hexdigest()[:32] -def compress_kat(kat, mode_90s): +def compress_kat(kat, mode): first = kat['count'] == 0 del kat['count'] - hash_fn = sha256_16 if mode_90s else shake_256_16 + hash_fn = sha256_16 if '90s' in mode else shake_256_16 + + # For ML-KEM we use the private seed as the private key's storage format + if mode == "ML-KEM": + kat['sk'] = kat['d'] + kat['z'] + del kat['d'] + del kat['z'] # rename keys and hash large values to reduce size of KAT vectors kat['Seed'] = kat.pop('seed') @@ -95,49 +106,117 @@ def compress_kat(kat, mode_90s): kat['SK'] = hash_fn(kat.pop('sk')) kat['CT'] = hash_fn(kat.pop('ct')) + if mode == "ML-KEM": + kat['CT_N'] = kat.pop('ct_n') + kat['SS_N'] = kat.pop('ss_n') + return kat -def map_mode(mode): - out = None - - # Note! See the helper shellscipt in the comment on the top of this file - # to generate KAT *.rsp files that match this naming scheme. - if mode == "PQCgenKAT_kem1024-90s": - return "Kyber-1024-90s-r3" - if mode == "PQCgenKAT_kem512-90s": - return "Kyber-512-90s-r3" - if mode == "PQCgenKAT_kem768-90s": - return "Kyber-768-90s-r3" - if mode == "PQCgenKAT_kem1024": - return "Kyber-1024-r3" - if mode == "PQCgenKAT_kem512": - return "Kyber-512-r3" - if mode == "PQCgenKAT_kem768": - return "Kyber-768-r3" - - raise Exception('Unknown Kyber mode', mode) + +def parse_arguments(): + parser = argparse.ArgumentParser() + parser.add_argument("files", nargs="+", help="Input files") + parser.add_argument("--kyber-r3", action="store_true", help="Enable Kyber R3 mode", default=False) + parser.add_argument("--ml-kem-ipd", action="store_true", help="Enable ML-KEM initial public draft mode", default=False) + parser.add_argument("--ml-kem", action="store_true", help="Enable ML-KEM final mode", default=False) + parser.add_argument("--kats-per-mode", type=int, help="Number of KATs to generate per mode", default=25) + + return parser.parse_args() + + +def map_mode(file_name, mode): + if mode == "Kyber-r3": + # Note! See the helper shellscipt in the comment on the top of this file + # to generate KAT *.rsp files that match this naming scheme. + if file_name == "PQCgenKAT_kem1024-90s": + return "Kyber-1024-90s-r3" + if file_name == "PQCgenKAT_kem512-90s": + return "Kyber-512-90s-r3" + if file_name == "PQCgenKAT_kem768-90s": + return "Kyber-768-90s-r3" + if file_name == "PQCgenKAT_kem1024": + return "Kyber-1024-r3" + if file_name == "PQCgenKAT_kem512": + return "Kyber-512-r3" + if file_name == "PQCgenKAT_kem768": + return "Kyber-768-r3" + elif mode == "ML-KEM-ipd": + if file_name == "PQCkemKAT_3168": + return "ML-KEM-1024-ipd" + if file_name == "PQCkemKAT_1632": + return "ML-KEM-512-ipd" + if file_name == "PQCkemKAT_2400": + return "ML-KEM-768-ipd" + elif mode == "ML-KEM": + if file_name == "kat_MLKEM_1024": + return "ML-KEM-1024" + if file_name == "kat_MLKEM_512": + return "ML-KEM-512" + if file_name == "kat_MLKEM_768": + return "ML-KEM-768" + else: + raise Exception('Unknown mode', mode) + + raise Exception('Unknown Kyber KAT file name', file_name) + + +def selected_mode(args): + modes = [] + + if args.kyber_r3: + modes.append("Kyber-r3") + if args.ml_kem_ipd: + modes.append("ML-KEM-ipd") + if args.ml_kem: + modes.append("ML-KEM") + + if len(modes) > 1: + raise Exception("Error: More than one mode selected") + + if len(modes) == 0: + raise Exception("Error: No mode selected") + + return modes[0] + + +def output_file(mode): + if mode == "Kyber-r3": + return "src/tests/data/pubkey/kyber_kat.vec" + if mode == "ML-KEM-ipd": + return "src/tests/data/pubkey/ml_kem_ipd.vec" + if mode == "ML-KEM": + return "src/tests/data/pubkey/ml_kem.vec" + + raise Exception("Unknown mode", mode) + def main(args = None): if args is None: - args = sys.argv + return 1 + + mode = selected_mode(args) - with open('src/tests/data/pubkey/kyber_kat.vec', 'w') as output: - print("# This file was auto-generated from the reference implemention's KATs", file=output) + with open(output_file(mode), 'w') as output: + if mode == "ML-KEM": + print("# This file was auto-generated from github.com/post-quantum-cryptography/KAT", file=output) + else: + print("# This file was auto-generated from the reference implemention's KATs", file=output) print("# See src/scripts/dev_tools/gen_kyber_kat.py\n", file=output) - for file in args[1:]: - mode = map_mode(os.path.basename(os.path.splitext(file)[0])) + for file in args.files: + algo_mode = map_mode(os.path.basename(os.path.splitext(file)[0]), mode) reader = KatReader(open(file)) - print(f"[{mode}]", file=output) + print(f"[{algo_mode}]", file=output) - for kat in list(reader.read_kats())[:25]: - kat = compress_kat(kat, '90s' in mode) + for kat in list(reader.read_kats())[:args.kats_per_mode]: + kat = compress_kat(kat, mode) for key in kat.keys(): print(key, '=', kat[key], file=output) print("", file=output) if __name__ == '__main__': - sys.exit(main()) + args = parse_arguments() + sys.exit(main(args)) diff --git a/src/scripts/dev_tools/gen_mlkem_acvp_kat.py b/src/scripts/dev_tools/gen_mlkem_acvp_kat.py new file mode 100644 index 00000000000..fcb53975dd8 --- /dev/null +++ b/src/scripts/dev_tools/gen_mlkem_acvp_kat.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 + +# Converts the json files of ACVP KATs to a format that can be used by Botan tests. +# This script relies on unlicensed code from Markku-Juhani O. Saarinen +# taken from https://github.com/mjosaarinen/py-acvp-pqc/blob/main/test_mlkem.py +# +# (C) 2024 Jack Lloyd +# (C) 2024 Amos Treiber - Rohde & Schwarz Cybersecurity +# +# Botan is released under the Simplified BSD License (see license.txt) +# + +import binascii +import hashlib +import json +import argparse +import sys + +def shake_256_16(v): + # v is assumed to be hex + h = hashlib.shake_256() + h.update(binascii.unhexlify(v)) + return h.hexdigest(16) + +def mlkem_load_keygen(req_fn, res_fn): + with open(req_fn) as f: + keygen_req = json.load(f) + with open(res_fn) as f: + keygen_res = json.load(f) + + keygen_kat = [] + for qtg in keygen_req['testGroups']: + alg = qtg['parameterSet'] + tgid = qtg['tgId'] + + rtg = None + for tg in keygen_res['testGroups']: + if tg['tgId'] == tgid: + rtg = tg['tests'] + break + + for qt in qtg['tests']: + tcid = qt['tcId'] + for t in rtg: + if t['tcId'] == tcid: + qt.update(t) + qt['parameterSet'] = alg + keygen_kat += [qt] + + return keygen_kat + +def mlkem_load_encdec(req_fn, res_fn): + with open(req_fn) as f: + encdec_req = json.load(f) + with open(res_fn) as f: + encdec_res = json.load(f) + + encaps_kat = [] + decaps_kat = [] + for qtg in encdec_req['testGroups']: + alg = qtg['parameterSet'] + func = qtg['function'] + tgid = qtg['tgId'] + + rtg = None + for tg in encdec_res['testGroups']: + if tg['tgId'] == tgid: + rtg = tg['tests'] + break + + for qt in qtg['tests']: + tcid = qt['tcId'] + for t in rtg: + if t['tcId'] == tcid: + qt.update(t) + qt['parameterSet'] = alg + if func == 'encapsulation': + encaps_kat += [qt] + elif func == 'decapsulation': + qt['dk'] = qtg['dk'] + decaps_kat += [qt] + else: + print('ERROR: Unkonwn function:', func) + + return (encaps_kat, decaps_kat) + +def group_by_parameter_set(keygen_kat): + grouped_kat = {} + for kat in keygen_kat: + parameter_set = kat['parameterSet'] + if parameter_set not in grouped_kat: + grouped_kat[parameter_set] = [] + grouped_kat[parameter_set].append(kat) + return grouped_kat + +def parse_arguments(): + parser = argparse.ArgumentParser() + parser.add_argument("--keygen-directory", type=str, help="Directory 'ML-KEM-keyGen-FIPS203' containing the JSON files") + parser.add_argument("--encapdecap-directory", type=str, help="Directory 'ML-KEM-encapDecap-FIPS203' containing the JSON files") + + return parser.parse_args() + +def compress_kat_keygen(kat): + kat['Z'] = kat.pop('z') + kat['D'] = kat.pop('d') + kat['EK'] = shake_256_16(kat.pop('ek')) + kat['DK'] = shake_256_16(kat['D'] + kat['Z']) + del kat['dk'] # remove the original decaps key (Botan uses the private seed as storage format) + + return kat + +def compress_kat_encaps(kat): + kat['EK'] = kat.pop('ek') + kat['M'] = kat.pop('m') + kat['K'] = kat.pop('k') + kat['C'] = shake_256_16(kat.pop('c')) + + return kat + +def main(args = None): + if args is None: + return 1 + + if args.keygen_directory is not None: + + keygen_kat = mlkem_load_keygen( + args.keygen_directory + '/prompt.json', + args.keygen_directory + '/expectedResults.json') + with open("src/tests/data/pubkey/ml_kem_acvp_keygen.vec", 'w') as output: + print("# This file was auto-generated from the ACVP KATs", file=output) + print("# See src/scripts/dev_tools/gen_mlkem_acvp_kat.py\n", file=output) + + for paramset, kat_by_paramset in group_by_parameter_set(keygen_kat).items(): + print(f"[{paramset}]", file=output) + + for kat in kat_by_paramset: + kat = compress_kat_keygen(kat) + for key in kat.keys(): + if key in ["Z", "D", "EK", "DK"]: + print(key, '=', kat[key], file=output) + print("", file=output) + if args.encapdecap_directory is not None: + encaps_kat, decaps_kat = mlkem_load_encdec( + args.encapdecap_directory + '/prompt.json', + args.encapdecap_directory + '/expectedResults.json') + + with open("src/tests/data/pubkey/ml_kem_acvp_encap.vec", 'w') as output: + print("# This file was auto-generated from the ACVP KATs", file=output) + print("# See src/scripts/dev_tools/gen_mlkem_acvp_kat.py\n", file=output) + + for paramset, kat_by_paramset in group_by_parameter_set(encaps_kat).items(): + print(f"[{paramset}]", file=output) + + for kat in kat_by_paramset: + kat = compress_kat_encaps(kat) + for key in kat.keys(): + if key in ["M", "EK", "K", "C"]: + print(key, '=', kat[key], file=output) + print("", file=output) + + with open("src/tests/data/pubkey/ml_kem_acvp_decap.vec", 'w') as output: + print("# This file was auto-generated from the ACVP KATs", file=output) + print("# See src/scripts/dev_tools/gen_mlkem_acvp_kat.py\n", file=output) + + # We cannot use this KAT at the moment as it does not provide the + # private seeds for the decapsulation operation. + + # for paramset, kat_by_paramset in group_by_parameter_set(decaps_kat).items(): + # print(f"[{paramset}]", file=output) + + # for kat in kat_by_paramset: + # # No compressions possible in decaps + # for key in ["C", "DK", "K"]: + # if key.lower() in kat.keys(): + # print(key, '=', kat[key.lower()], file=output) + # print("", file=output) + + + +if __name__ == '__main__': + args = parse_arguments() + sys.exit(main(args)) diff --git a/src/tests/data/pubkey/kyber_encodings.vec b/src/tests/data/pubkey/kyber_encodings.vec index 161ac5cddde..8be73136d46 100644 --- a/src/tests/data/pubkey/kyber_encodings.vec +++ b/src/tests/data/pubkey/kyber_encodings.vec @@ -32,3 +32,22 @@ PublicRaw = EDD2A10C9CBC17244B6489890F2754398AB447B78E658CB568A46BE4B18A1272A5AA PrivateRaw = 6FE2A3D8A077B749509C39764AD1ACA6116CCE49B81B533DE0C55EA720293CA481876072180A1B88DA7CD0134C6C6C09703941F6199C1D624FC7B29491D885CC688941F88E6425C40C0C9F86054AA2700EE496861DD8B988296F05B93CFF612252307603EB676F94178D08907C3A8D9A0A7F1A17C6C50A08B9A2216168C692C70B39E35750C100987271DE78BE806ACD057278C5D96AF9437E72EA1503C94A6D623F912B1078602B53F405AE4741B2BB12F7F5BA6AC25B706496BD5053772272105636AAB1A12C796CBC22949EAAC832E6946EC7AAB85884CC75406D26330230564CC8B05E177D78AC8E3D9A8BC6F52D7719063B4B2B1613B8C45417AFD29CBD30130003C5BE5393110A5E47C1424C93C67AF6405E966B6D00138DF30F62F0C4AF7C58898B2DEBF5BC3AC452FE800141919CCAAC315ADCB083AB4FE3046344D4891A833C0A30A0F678A4E18CCE13275C409A2B951254528084C5637BA247C7D421C8E2DC93290C40420A6DFE84549C99B09266582EAB3819E3C7448833DC301D54E36F43ECA75AE4563979B4DA638E6D2402E6C1134F4C9920328299FAAA2E81C42C9515A1BC838DB5784FCB0822218F476724F9872F0CAA277992028B206EE6F799A1C7318CC780F1209B5FD442A8790011620C74E3C1E972338A804EDCB74D76A65961DC242F342BADB3A2C096005A4383FAD66472D9690730A091D614CFD72C0B442D2FD977B04041B583CF1B05C8D169523BA5C82C1CC4CEB11AD3A138F284A73B120DD8999AE3CB3980B7708011C0F6468FA4F1C36540B625BA38169154351440D4997974C3B54AE4CA023B9D96A71AD98738F6997B103BA14DEA410B7A51C815573439999187BC6E769500508ED294249BC75C3239565465CD54E563C39A8CE536991F5B875C8596DBDB28D1C8779EC98383DA662A955D3B3714C5500636E154EC42BDDA6986D8509C5BB389329017C7D16EC859B2D12242F15483F76CA36B23631F68C2BA481FD594AC1EA1C16819667280A2FCC74B9B5174FE6946B04A19B9DA6382307D9F7A1B92F42C52E341733ABBE549831F221EBA163600716E545BA74FA5B9EA4167649733C3BB33EFC2BBFB49BB47C630BFC1C7A78A394A03594A31B1F9826BCD205B0988A1CE77237D62C9079160585766AFD15FDA4B48177C3A55613E94F34B3CA4C4D12047D73543F9CA27B26C3B79F8B89BDA9ABC032F8176791B629FED254CA9644F304C0DC9619ECF6240A2EC3583867BEB3053749143DEEA00CB850E51EB314D310EFB6B625D65AE458A65AC84A622268416AC475347CD03A6CA9E7978BFCACAEC627700B7C3A01B4A8FA5B4A3D60960A521C8709F95F5B48D6C76CCC1729BA63D9346BAB120A93E617A97B21983D4B7D67C1C7FA8065C32048B2B84560684BF88109A8C511A67CE71E975DB1C6C6A24CCFA10722A330A7F6A4327E3642D5756FDC84901B184AFA9635684CAF6F30BE2D68FF6A82FE389CD718851F8554273902298540C944ACF9A505E0FE594A5312B6BD674433A1094707A2B82495209353158A58AC14EC09C879D468DA0447D085C2A69909758F966D6E139F9CC7F501B5D4FC9BB8BC51071E2215B4CBD1DA40B0BAA1F1217202AEC1C1C2997EEE2963739CEE81825B898A37D95457500471E66C7ABF60232B5BC8CDCC3FDE08CA83C2899C810FEB53242F00E9CD9C5824CBC6CEA11817B1225EC63077177298CB41A81087626BCBCB51759E9637CDB63254ACB5A5352A74B9F885056F1632C6A288E07E090F4F5088AB59D76029FC90B3F4207C26A83137D95BADE21B59E95539F9C716EF15BF58A0719783F8FD210C574B06088348C22BF5E420DA7FC58CE8C60B50BBA137ACFE5D36C613ACD78D1A035A995722720318511421C8E4FAC8E6B045F58DC25B5400C44B088DE44447332522425CB5B5AC15B7A52CC43916A7C846997A2AFE1B2CE365516852699AA9D2C30966DE1908405336FC89CB89B74A10496650322F59B1AEDB38A37DB6A1EE63759D2ADAF3613EE19CB8BE871DEC32838654B1E889EB32815597580BB1073AAD86D830C1A4C9530BBE6579DEC1F1F99AC16E131A406D051F13170CA7A115A625889937EE380FC8322CD087B1A501F22E2047A9355449C29693A13918797F61CB868310CA3D983F2C447BF7A1D2069577EE906B2E26297E51D961BA654F00849969D5AE46B132A74A62AC9B2781ED5C98CECB5C79C579E2BE30058740D00D99D676A5F0DD0959D340DB48A1AE477C154916AE6C6CDC00787D547C87E9A998F86BBCD3970379A68FE837DB0788240C5338577B5ED6BAF8F390C82362CD6EA592C23BD08A1603B2A0C7B5380DAC98DA2E4AC714B45E9E0516A953785A678D8C285985B69DDE8CDB954247C83005ACA15B4889AF8FBCD0F9A9B2FD9416BB57D758A9644F763588A200FEC509C89695DC707669B677531703465643C7BBBE02C44C5404799349DD1C28C0B92078C26235DC97A82842EEC96164836A1EF988B08B770360B0976715983AA0AF5973DED597412E96A174C1935993008582660B49732548C52A1A1F835CF0AD028354BA507A1A5D9FCBDE3712390FB2AD0A5A058630602B776B98654DE1C49B35CBAD905610A27B097FBC10397BF353C44D3504B89796F035B85947AA1C825373714CAF685AB87036F16D4ABDA7154DE49C89339CE3CBA2D03F1281C9624D5461DE13C1D924CAA00D9C0ABAB7D3506447D786EE87208F6B66A83E0C03C819EC776CB3DD0A71E7B0ECE9B139D53C6F2845217A8C5B9B829DA903A1725BE53641DDD1346BF37B8BA6B77417C2D7ABB87C91A9548858144F5AE796B438F583EC9B21AB20CA0BF139C3C687947835D0DC67E43102E31329A98ACC86FF8B803A2979CF6C78EC07FBCAC7219C75C32B175F7DB39918523C9905BCA546DD98246ADD820041409E0F41B4AD89EFA453760519ED80B32DA514C9A670BBA478BEF3C1233F6994E234AE11B895B511BBDAB149C5BA883D19118CA00F6ABB415F6771D58C95F387FB1ECB57DF751E8D7B7A87B9EB4241E5E09C625065C793BAD6CA78782E9A1A5043F5111150809379AC9477D59949CB9728D33B4E2673E2B9C3016D882BA4829ECC376596229DC87848CE390CC5634473A38D9C5B4B1294B012640F5E705AAB3018651575479A67B1840359B1676B18404C76CA34C2922359DFAC44BE5F2CB16A9B21F455EC527A68AF89F682C741BFBCCA3C98770B8249EBCB3A0A951E3019B693BC6E3158359C91F2210140A4C88EECC1420C885FDA0541ECA18A68CB1AC07C107986796052C06B96F1A6230DDDB2B6284C196E1A882A19D7DA082B7B2869ED48777027164F47F70F9902D83720265BAFDC38F6E55179A5C0147E51666375922F67B85492B05C1301E372C95CB369FC8266BDA3EDDC9BD74D14898B0205A2B62595484044A9CDDC14DC243B90AEA34865ACE0492A79D4418ADEA51C4F88681E4ACE051958C5362983B3C5C15C14A1C2503E4A82BE904AE959801218204D548013894EBA14E9F5B17AB038C76EA5EAAE21DAE8A8B83CCC486437F13F732A6824C4999C67688B58745685B621A42F110D424CE180AA47CAB2A47D8095206044BE15059883DC20445EA715D4A841ADCD96A4D170DDEE179669C1C1BF6296F8C5A8BD31F07D8C0D07C12E6A37101E74199D1A63124A66481437A864FB2C4AB4DFC2443BA17040290AA57CE5A145081B79AD47B98B3950855AA05D9A4939DE05F7BB62EFDBBBD64863AB8C5C8E5809235C72921AB78EC7A424CDA45502CC816C13105C5CEEEE8B99639C1224AC2D00A17EC56CC9D20580D47B3E1B74DFD0CB149F64092132725993815D6110A6541EF440DDB382815B2B65EFC31CC587EEE31630A461971755E005D3DB4A4CBA50B0A7FB13B051A5F5D06258B22C8807423AF4C026C359B15B0C9AB7B6001F98D71EC916FE3B40D2B3C6E39C813730329A19AB6A18F18831B5E008E17BB12F1DA8A506BA2141793DCCB67FD198301742B6EC9A69C0C98749A3DFE09405A2947C9C2162B17208BC68CD364BDC4588C14E014D3813104528F43F1441CA1874FC30DB500A9B87C2FBC8C691F884F5C61BE15F7C7E1C75A54337A2A378F00D722F1079F804175720C10184242993A91063331B30106CA328B427878C50B56F2B28A76BB2E9B154907781252F4C5DB492331D18D766769577027486B8436BC58E52B637BA4927ED2423E30741E9131452C0BF7CA1C15F25B2C816959F4077BE778893C5B1580BAD1B83424C52E2CB60252114721D68AAEAC5F43A1BCCC96B03A96C412725D792C008E31A4CD829FCB740E3897BAD5418C89878F9A86D3190BBDF90D8C4FDE02DE4D03E8BCD798D330515F929B1FDAE89C8E0C5610AD0FCCA308CB76EC125BAF5FCC2CAC285695CBFE17BF0AD04ED64FCD9330AC11E9DB061854602A5B3AC541B154535C6A1969695E4A9978EE2575F384 PublicRaw = BF7A1D2069577EE906B2E26297E51D961BA654F00849969D5AE46B132A74A62AC9B2781ED5C98CECB5C79C579E2BE30058740D00D99D676A5F0DD0959D340DB48A1AE477C154916AE6C6CDC00787D547C87E9A998F86BBCD3970379A68FE837DB0788240C5338577B5ED6BAF8F390C82362CD6EA592C23BD08A1603B2A0C7B5380DAC98DA2E4AC714B45E9E0516A953785A678D8C285985B69DDE8CDB954247C83005ACA15B4889AF8FBCD0F9A9B2FD9416BB57D758A9644F763588A200FEC509C89695DC707669B677531703465643C7BBBE02C44C5404799349DD1C28C0B92078C26235DC97A82842EEC96164836A1EF988B08B770360B0976715983AA0AF5973DED597412E96A174C1935993008582660B49732548C52A1A1F835CF0AD028354BA507A1A5D9FCBDE3712390FB2AD0A5A058630602B776B98654DE1C49B35CBAD905610A27B097FBC10397BF353C44D3504B89796F035B85947AA1C825373714CAF685AB87036F16D4ABDA7154DE49C89339CE3CBA2D03F1281C9624D5461DE13C1D924CAA00D9C0ABAB7D3506447D786EE87208F6B66A83E0C03C819EC776CB3DD0A71E7B0ECE9B139D53C6F2845217A8C5B9B829DA903A1725BE53641DDD1346BF37B8BA6B77417C2D7ABB87C91A9548858144F5AE796B438F583EC9B21AB20CA0BF139C3C687947835D0DC67E43102E31329A98ACC86FF8B803A2979CF6C78EC07FBCAC7219C75C32B175F7DB39918523C9905BCA546DD98246ADD820041409E0F41B4AD89EFA453760519ED80B32DA514C9A670BBA478BEF3C1233F6994E234AE11B895B511BBDAB149C5BA883D19118CA00F6ABB415F6771D58C95F387FB1ECB57DF751E8D7B7A87B9EB4241E5E09C625065C793BAD6CA78782E9A1A5043F5111150809379AC9477D59949CB9728D33B4E2673E2B9C3016D882BA4829ECC376596229DC87848CE390CC5634473A38D9C5B4B1294B012640F5E705AAB3018651575479A67B1840359B1676B18404C76CA34C2922359DFAC44BE5F2CB16A9B21F455EC527A68AF89F682C741BFBCCA3C98770B8249EBCB3A0A951E3019B693BC6E3158359C91F2210140A4C88EECC1420C885FDA0541ECA18A68CB1AC07C107986796052C06B96F1A6230DDDB2B6284C196E1A882A19D7DA082B7B2869ED48777027164F47F70F9902D83720265BAFDC38F6E55179A5C0147E51666375922F67B85492B05C1301E372C95CB369FC8266BDA3EDDC9BD74D14898B0205A2B62595484044A9CDDC14DC243B90AEA34865ACE0492A79D4418ADEA51C4F88681E4ACE051958C5362983B3C5C15C14A1C2503E4A82BE904AE959801218204D548013894EBA14E9F5B17AB038C76EA5EAAE21DAE8A8B83CCC486437F13F732A6824C4999C67688B58745685B621A42F110D424CE180AA47CAB2A47D8095206044BE15059883DC20445EA715D4A841ADCD96A4D170DDEE179669C1C1BF6296F8C5A8BD31F07D8C0D07C12E6A37101E74199D1A63124A66481437A864FB2C4AB4DFC2443BA17040290AA57CE5A145081B79AD47B98B3950855AA05D9A4939DE05F7BB62EFDBBBD64863AB8C5C8E5809235C72921AB78EC7A424CDA45502CC816C13105C5CEEEE8B99639C1224AC2D00A17EC56CC9D20580D47B3E1B74DFD0CB149F64092132725993815D6110A6541EF440DDB382815B2B65EFC31CC587EEE31630A461971755E005D3DB4A4CBA50B0A7FB13B051A5F5D06258B22C8807423AF4C026C359B15B0C9AB7B6001F98D71EC916FE3B40D2B3C6E39C813730329A19AB6A18F18831B5E008E17BB12F1DA8A506BA2141793DCCB67FD198301742B6EC9A69C0C98749A3DFE09405A2947C9C2162B17208BC68CD364BDC4588C14E014D3813104528F43F1441CA1874FC30DB500A9B87C2FBC8C691F884F5C61BE15F7C7E1C75A54337A2A378F00D722F1079F804175720C10184242993A91063331B30106CA328B427878C50B56F2B28A76BB2E9B154907781252F4C5DB492331D18D766769577027486B8436BC58E52B637BA4927ED2423E30741E9131452C0BF7CA1C15F25B2C816959F4077BE778893C5B1580BAD1B83424C52E2CB60252114721D68AAEAC5F43A1BCCC96B03A96C412725D792C008E31A4CD829FCB740E3897BAD5418C89878F9A86D3190BBDF90D8C4FDE02DE4D03E8BCD798D330515F929B1FDAE89C + +[ML-KEM-512] + +Error = Private key does not have the correct byte count +PrivateRaw = C6C9B2CA96CE5B715A6262CAA2989B72EB6730B54BC89B65BC021FAAC7AB88E5833B9A7454C94E49CC55EBE30C6B7702EBAB0A40728E1F108E8FF14AF217556E85551810C2716B4248B9B10EA7BD5D05CF12425CA648A653B26B1D645595D95323F153CB1ACAB9D29ED955817592C017C4465DB30066FB68AE3429E5453FB0199C6E9967608939057632674B3DA8BB587174BAF362433C4B9B75BA304F995AA6238BDE7398BD460619E00F61CB4A2040BF09C5120F51BA7808AE171B1C9C733F4025B872904F45AA8AFDA6B1B8B86407A1C619065634F78296D6915156C44735634CB2AB498574282754E020473F02201219327A4B748CAC50617A01D101C34FB20EE04BA70BE541794440F0E815778444A310295B39164C7633A8448408D16B47E68E80096DED5373840B830E84CBE1F25100788E53E3CD35AA365674A334DA913EA7A6EDE3C002987ED94A6D5AEB8B3272B3EB8097B6F723C7541782F90F3126BF8ABAC201F51D009B258C877CDA9304FD73242050693E380380D3898749CC7FAABAE09477319228B6D9606D876469D622B15A6A4845CDAF1A6603F25AADF5A271C225C4213FD9422743705B33FBC2FA9BB55B585A8F858DE578BC44C4B3AA919660045733E222D5409E5C4B789A109F458961AEF8AC798342C2E854E2701013729921574E340B9AEE44BF9A2971FCD80B6AF994F7385FB505359346417963AF61986076ABC54ED6B4130C5042EB04EB6C885E2C4888A63A52BA49B9C6BFA41A91CE650EF234A4ABB8B1122A15E167ADF4A78115881B6C2B26C9CC32E2A5552DB35AF280A0919A09047562CD33AC8332B74E6B962E3643B14019C7479CA1A29BC420038DF52FB6A2A7DF10C7798ACD4AC315423361C8334D38B0099D4A5136AB32D599A0CD5983C4864567509E9672C3BF6BAC914B0ED5D04AFCB1A8DA16776E0391E4F5655E7147F955C5078C798FD362C93A6C7E9914454A591CD93972107C61057A9AE417B776A1BF6683505A2D85D53A6AE0BC4740278B69BD0A608CB0484B04122FB3D46F6C06A3CC5523EC054030C9A8A585A5DE82CA41B39082052D970BCFE55389AA956BB9E2C62AC5CE80FA64A15B4DE4FB71DA7100E04B85596849F3E0326570227B48589E45B387E612C36C8BABF09EFA22A021184BB6197B011842DCE1C9682492836B2E96C059C92C15BD8825A8C0265B795234F8756E505C1EAA29E482BFE4FC0CE945B75E84817E5310245CB57A3A51E2F91CCCDC850CF59027497D124BB36449B28C62BB90181F01372B0379C03B994343C7476B3146C87C6E25B677F30CA7BDE3369F1177B8A90BB2561B1C637D7E9CAB2C8BC4E0717669871B4451313DA55879F07FD01637ED052A82A5C7B3D1427611CC5D9B17827B4F3A28610ECA998903B4CBB2187C849E7D862867391812A94139DB76328C4EECB6AD0590C31FB627E1A3C319DA5D3DE44FEF088027108A6F9762D1B6075C0C3835A83A44F230E7B0ACD77241AD0CBFE4822BF189C868161A6B330DCE8C1A39A3042D81BA5AB86603205747995E6C6AAAF33149ABF8B2061137A773074F6846277C6A67C6789814AD32B088CD688924948528648238050EC9C8955EC7897125CA5F708112735687017F51788FDB9C68526AB14E76C25C490E7794315BF686596CAB483624754C834A7AAA4268BB98131A739A617907456D139805830945C8BDD0104ECB41A96AF92B86C04B72D963E47AA9168A0BD72210672AA7D15642B1220541643C2CFC0636A6AD344022C01CA6B3B787B659A06DC50F85B59C5806AF9833876EDB66C558A3EA71585DB88F62E520CFF0C3FC8208B390CBA833BCCEB5B72576CAD3F564DEFB9B5C7589CC7A4B5F5B0E857A3E90E7B87797379E47A27774172A0AAE0417CDECA89E3114837F1C3B4B614AD9E774802B4E4226C6C7A56F603C931878422600CE5EE3A44C2015287AB3665544C470AEE0AC2A31F8345B459BFA2B7900257B0A1B0DF9086352660956A54598251A347860518B8E507CCA39ABB73215A9C347499CA94C2DC24B0FD66EB9AC5DAC214B46B65694D114B3893EBA6663EE3A6AE1846B7A2398569BB4B06A1EF34584AF9CC3F4E415FAA9096B4B96B0915BF2D5808AB71CD65C890226C4BEE74DD97A91B1B6363849870DA23EF08A1CFD487C194D66FF16C96F3B02FB97D3D087B1FD1D6E91878E8380318F7B4843FBFC07C4BC1D13EDCC88E413D23BD8E73176A0B05B6D2381822474393D22585AF90351770587A6FCDEA8254D8EEC0CEF8668E30B3D24525B36AB3C75063B8A03D4 +PublicRaw = F9951AFAD2C96730335CF42103F9267A11C16E209D366603B04789378684987B655CD57B2DCBCC195B137227B9ECD3BAB0C0183B5A0667E407D7C86402D7719869CD6570B30B8C227ACB8B478320D64353CCB94809052558B1AC94C0CF498219442B988FD64F7CF6423C372F46F26791D3680817B3EBB24BFA98CA2EB22FDF48919D1595F06115C70CA050C04B17D6A91E2926677120EF24AEAF499B43542EC0C91DB4A3B7AD6A5DB646C164D70F496225A7800DD81C634C004796A79148E47A4E312F3BF56BE80C2E9D01C431767FF50496ADA127C1D286A2FC9FB98677BBF95203F63296881D5C536B39F22222C570AD921C82565E1C7C069D69BB3CD431A4CCB5F0C790C6578C1EB0185F84C706137A7052680BD8AAAC941D34A3756EA8B006F732B995612E330616BC22F9EACF4423A1DFE18B0E63BF18B24DB8E1B2D1097CB2E305A80372E08492161871D8480D55DA41ED80AEF73682873A3065472A98816846550C80608A8FA8A9342BA87FAA6105B5C8C194C7268C694D38A08AA83102239073E02581A6A604B06B0673B43CECC07A0586B65CA8EA79BE8A140CF329223434745B576BF9CB2A70709D2621359621A057A3BFFEE465E421CA1D48096E06ACD6309F40A64126B0491D03BF7272ABB1475B72A54E9A2675262AC831B00BE163235280B76D5B88101524077A76A97C7A4F2A5AA8A547F14203F8BA26D1368B23E832987696E965177BB648CC3325766A4E8935074D9C7344E031917AB0DE452092E2720D121A0E32CC9E5B2325500BD1B76E38360A36E972CEFC56E93482E47605AF9A69A6F42D89C6C21E2B0CD5E14534A75012CC905E3042BB0043CF0280185A90D245B86C7097F2C1694F2BAE0CC5C995E580343A96A2656A108769F1DC0B7717B0C4A1A635DA3DF4D248B3D29116A8B939FCC063250198982EEF436E3564881A2A2C0F94AEAD47690A9C194C56CF47868026BA8CDEBB7631E643E6B20A9F24061B1C496518B89F1A45A6C5518B742990413D9B0012F895872E4B258371123839BD209C1A004B4575567C391A6158A464B9428761D0191F4B6CE2630A6F77590B25FA894D654EB1905481FF4CC75C2A435630DB1CEE9254090FA8D11E + +PrivateRaw = 3305F0CF680FEAD1BCC50ABB0B04F288BD3266AE12188FFF50D316FC00681A81D72D4E46CB5A96ABBBD507E8D7BB4C523080550B142D1594B9A75113D6D2D70C +PublicRaw = F9951AFAD2C96730335CF42103F9267A11C16E209D366603B04789378684987B655CD57B2DCBCC195B137227B9ECD3BAB0C0183B5A0667E407D7C86402D7719869CD6570B30B8C227ACB8B478320D64353CCB94809052558B1AC94C0CF498219442B988FD64F7CF6423C372F46F26791D3680817B3EBB24BFA98CA2EB22FDF48919D1595F06115C70CA050C04B17D6A91E2926677120EF24AEAF499B43542EC0C91DB4A3B7AD6A5DB646C164D70F496225A7800DD81C634C004796A79148E47A4E312F3BF56BE80C2E9D01C431767FF50496ADA127C1D286A2FC9FB98677BBF95203F63296881D5C536B39F22222C570AD921C82565E1C7C069D69BB3CD431A4CCB5F0C790C6578C1EB0185F84C706137A7052680BD8AAAC941D34A3756EA8B006F732B995612E330616BC22F9EACF4423A1DFE18B0E63BF18B24DB8E1B2D1097CB2E305A80372E08492161871D8480D55DA41ED80AEF73682873A3065472A98816846550C80608A8FA8A9342BA87FAA6105B5C8C194C7268C694D38A08AA83102239073E02581A6A604B06B0673B43CECC07A0586B65CA8EA79BE8A140CF329223434745B576BF9CB2A70709D2621359621A057A3BFFEE465E421CA1D48096E06ACD6309F40A64126B0491D03BF7272ABB1475B72A54E9A2675262AC831B00BE163235280B76D5B88101524077A76A97C7A4F2A5AA8A547F14203F8BA26D1368B23E832987696E965177BB648CC3325766A4E8935074D9C7344E031917AB0DE452092E2720D121A0E32CC9E5B2325500BD1B76E38360A36E972CEFC56E93482E47605AF9A69A6F42D89C6C21E2B0CD5E14534A75012CC905E3042BB0043CF0280185A90D245B86C7097F2C1694F2BAE0CC5C995E580343A96A2656A108769F1DC0B7717B0C4A1A635DA3DF4D248B3D29116A8B939FCC063250198982EEF436E3564881A2A2C0F94AEAD47690A9C194C56CF47868026BA8CDEBB7631E643E6B20A9F24061B1C496518B89F1A45A6C5518B742990413D9B0012F895872E4B258371123839BD209C1A004B4575567C391A6158A464B9428761D0191F4B6CE2630A6F77590B25FA894D654EB1905481FF4CC75C2A435630DB1CEE9254090FA8D11E + +[ML-KEM-768] + +PrivateRaw = 2B44523FC0A955F93A28A8A08DA078E6AD11122E26852647D8E0C6795E0577E65D8BD5D2F82C871554442FEBF6E132EC08A596619CF00A63C1F1B35B758CC37A +PublicRaw = E7FA6FB9292D8BDB91C66181D0784DAE04A114C65DD4AC86605516B99849512C179898C85FBA5F9D9B39F0709CF8D4342F8202EFA02563FC3C2F492C90677D53D73855909A3ECCA2207144BEBABD20634C36BB228618C0EFCB68AFC22650DA363B66B9175565E43761EEA75771706949593870C95C4CFBAE1DB364A46742258A6708A76771565D07FA5750D15883473211D8C394488C99B2461C4AA0FD3C3735F587BE7CCD3E3321A1CC492CE1AC08B9143E04D017756E37094311A00CBE6C4C2A844973F9087F73C77E107421A75CC7D27231E1358847AB4614634166518FC94B787B7A40646F3BA04D62ECCDC7B4991588126689B94A10CE10EB3E054B4FECC084CAD4814DF98D5D6B28E034269474A493835CC3174293378E3C956BE9E3643AC936E626B2EE88BD7563354D743D5B856396471C403902156194BD99CF9364458BAA811D0C8EA7A36BFB23141DC73C48FA86ED1C4A5E7A1E7E80CE3BC4B3B9603D9D393015BAC94FDBA23CC9C657F83F28FC9CC7FB2ADFA28A92081089FA5BA39424A6B0BBFEDA383836A35425BEED4295BE4626149B90DBB744A4A718F8A38C778B379D4B970361CE507A9B3BC3030464AC20854F3A3C2D5CD5075AF54E5F2A6B6C17152B9AA941D08A3836553229A7341A3C73DA23F9F153D4244A97B828CE4794FA4C3E8EEB94A2270923324B6D563604650EAD65B7C1D97D2EA4057915C4A379AD84D224BB6862ACDC7315BC6C5DD8373053673814CEB50271558844E36498AEF96D480401BE44BD61E6AE611A595BD9989448997877A670A6AD77D9393AD8A60234B092A710383598867AA2AD9A5C96618D6AF83EE9416B8B3B8359E205436ACF98334C4B4BAB03E97165A2A9E5693498B82788939829E0AB60836B889675D5E65A92164AFAF3B98517C01753C711838D63E61FC793AFD6CA2DA2DB2763A280233672641198BA359DBF6081F39BCB3B5BC8FC87A22A8433BE67896F424BBD697FD1F72DD321A6BFCC77092A06BD577510BCCEE0F162DF4A49E6C976408B3F4A489705E966BFC95284C7472BC17733EA4B47C046115578EEE32CBF858CC14A14730136FD06995ED431628BBE8E75CE15DC874ECC93E0C38A3C14484F96C616F6CBF2042DEF27B13FF2CEDD3ABB7A74580AB9B8AD4058F0020493F6467048B31090C10EF83833988B1FD1580E62161121B7F380612E304E207BBAF24604892A60B83338165AA8F8992B2A8664A8BA71461C9D8EA100F5D5A3DACB2BB496A726938683904589C454849B26ADBA5448EB2928C5449DF93B8F620795BA3562681E1C0A6877F795876A603738464DFA2A91D8A50DF3B48388B1EB163751CBC4FECBAFA9A361A728BF7B75B308DA4CCDC578100038F2F2CD75A90491E9CE47B6B4011AB43823A660E76659B97984E626D61C8207F73CB3918DEDE5A21F99C15D8597C4905EA8C41271FC6D3234A5BB17CB9E64434A96A96F1BA183298AFBC505DEA078B178236A5A9009A3835A35786AC3406B650A65298BF9735B3DD3C483962377FC47F958A04A7CC6ECA0628C794599D09546E5C65C5CA487482CB84762E0F38B64418AF0B7268318A84F0875479870901668ECE34252D5C64F3028684255D6976E03065332399F17F462F787F236094607CC7BAA4C14B0AE9D21D2B3F63B + +[ML-KEM-1024] + +PrivateRaw = 0A2D58EA457CF62BB3E49A2D4BED33B1F7EA92E555A987E3478C3B09A006AA240AEC427FD829DF9C628DA3750E257B15B233088B491A69F805BA8BAE5D70690C +PublicRaw = 29C4868E6397D076A75E9B4D4A3645E400C41081AA6E3521DB28C3BE7B8B0E2A4EEF017944F1A82E8347E1553D78C5656C4C1DE0D6A4F18848D2EB8E1181C4289B1F24A165BEF0597295988A182CB605C1E1C2344088CD4FAB38F456524FDB931B29175671514A641C01B641D6E1940488C0893A9617EC9C3F1B6F44F051C0EB3129607230A84DBB235BB253204D3C977179AAD4196EE2B0A9C6D49B78F10563D0717DCB230942B5B2F40D34C09ECDE7325FA257E65150C0C240CB04A13EE4710D6514D81A059D2556F0295250348D937C7862342CDF265F3ABA2836F364407673EF534E97C59491F7A611D669E6458CE5E639DB35C61A81A409A352A7E411B5A73800C28B2EE55431F594D3210369B4698E570B4EAC81B0776C80C2689395429B274730E1AB91794BCEE34DF506B9EC58191B2B03853C8C2D3B61A195322909CE1B297A318445DFCCB27761021B075E20E66E3376046C516E2517764DE4B807AC2E4503471421C004C8029711A70D962B73EA69F955743FF79D0FFABBDCA4C9A24C00B84C448949981068340A984FBDDA93863519C1D6A941DC82B9E931CB3BAD96C2B5F7E5B6BC5CCD1E7159D2BB73D87668F4305AAF1775A856BDFDFAB140799995050452219B7773B1D01157E8A02CEB4BAAB24223A611542997530BD70E9193354324BA9DC91B54FBCB6C7AA68EA3C8799324F7567E23C43A35D05299E5568A8C92F43876A6B6582CB1A023A628763B85E1A714BE43B8988615EB712EA5583E1AF15144E92C71D97BAC68735575C8BC9A6131552D7CB08B8B887F163B5CA5BCB210240252BC469160183BDA0D9D8796504AC4BF31BE4F7665D0EA880F1C6F0A301036157BB6491CAC6332F5103B49293B2F5C053398721059276927BDF218A60829969844602124C6B522524B374968F0476394715EA704E6CA24D99434F245237DF5841CE571E6D5C029750572C3529E6936D167631AB71FB1225A7143AFC3C8193B8060E4F1792A533866167A51649487F79EA69A382055303B3B64E02A6C200A6AFDFC88A178BA8EF0BD8B23AE14E96B794A52BD273137828E62D94A417C26202425A3FB91D7BA4CCC20AEFD179BF3069C90109D5D8A836E8B545A612CA6E8448567A93840BAA6F80F2C4CA51CBAB81E005F3B62C57533717F58BA671999571558C3F4906808A11D18468FCA256D0C050CD9C9B7144C4F3389785B8855DB1B5C965DA83C59C30294A57933B6F08ADEFB3506958D467A4356A41A744180CED0A15DFB4A6A131D79D91D6A934CB8618191A5250D951F12A8CC60197C1D10B3E0D18C7D405F55FC126C80C391B1197FEA54C015C33DB708A3B530F79749FFE32D1543654045C44BD52FF12BBED1B2BA19326C8F9B0A1E100967263244A717768283C02CA8E6A66680E01D8149B6DD89821531B9D43A515AA324E66804EF8C1522722426E34B5169AE06C32C930A49778573FC7C62D06620F83111735028FD7A133DAC75D8708D55F7BD35194A71B1B076D73CBA438A45A5C7E7F276CA9449C588A000EC6B08813C611084A59359DC52A2A3EA360D3965AD82832C645D3A2C488C91723314AF7F3410DA9735DFA1791026481B3A4A5E921A3A0CC4701BC2BFE54B72481372722E6BAB092BF255CBC02B1C19658DF01610BBA8AAB76658727286C75090CB8EF5120196546BEE1CA9E8D80C539B86AA32C18585B461DA56FA419D7C6AC251146A16A7367D239CDDF38A7D790E51976789B029221418670739FE221FBAB5148B445BB150293E0BB9EC6835AB94757D41C5E367CA8DFBBDEF6554DC8455E2E340E48BA63578C1789C6E9AF17FCD477CD7637F99D475E8728CAF3A105374BDB3C2811D6318DFFC0FC9F760B8DA7F8474B476C25A22CA4C3A0C0D5FC0A2EAD8510820C800D668718AA65727B706B5BF30F31C8762BB269A66C1274EB988B7F4656DC9CA6321F5CF3938036C901DC9204FDE337F7D518078D457CCD866BA16B5678987C9B194CE740DE8976133CC36AF418E16C1239266383CA8219CBB39580C5165CA7C9E449A044C87E05B931FB51F9D3858EF98A64A6A2215D6616E465452993E81972F7824C0AEE61E66B358A0B7815F6B5E32671B1891879D1C00A302C719CA88EE59C6D77AB4481636E75C4361E98EE74B194D7482F7B4AF6050DCAF6412DD7107ECEEB3E17A8985EE90BC9CE7C81ADD003DC123C06CF14D diff --git a/src/tests/data/pubkey/ml_kem.vec b/src/tests/data/pubkey/ml_kem.vec new file mode 100644 index 00000000000..1409adb1835 --- /dev/null +++ b/src/tests/data/pubkey/ml_kem.vec @@ -0,0 +1,606 @@ +# This file was auto-generated from github.com/post-quantum-cryptography/KAT +# See src/scripts/dev_tools/gen_kyber_kat.py + +[ML-KEM-512] +Seed = 23f1c88bd0e65f2c891ce865bd3275a7ffdbe4f9036e75b96aad0412650e9cd2ea4591d4ab7131ea971b34c23a4ed245 +SS = 2b5c52ee72946331983ba050be0f435055c0547901e03559b356517889ea27c5 +PK = d018f0b172097bf3ded8a2aa9ad961a1 +SK = 6c77a766312cfa7e9d57615d9da3f2cc +CT = 24b7049f484d34be397ccc8dea059ee8 +CT_N = 96ac6243c9b1272be77b975a4048bf00ff2c48f94a3483362449273880d45e54bda15729682bf591a74382a708beb78118cab29ad74ac2f405ba720076dfb57188dc168487cd20081f6bf412f257dea03406b23a6a752e478ba4ef9c7c0f4810921fa32545be64dc5d9f18d4e1320efc6508154cda35ab912d059e0291a1150ae0a10da5e3d7bd221a851c598df4d0b18daa920976556099d1c0de4e222d5304d44fa9cb9bd4ffe15769dd6c4793fa809f5264cf0febca4b5975ba287639783aa1f4b645ff7a00d46ee7b19fec17b3e83bcaf4361d5349e30ceab60c386b6b0d1b90d8b336ee6a627ad2a38670cb5113b0fb4ac2ddc4250097483fefd182670ea40f0f45cce90b9ed58dafaef657d64e25fd6692a69721994e7d00b4949205ebe4c4f9c46ee5a1018b220a26d80ae2d2b486372e974d75b20a005b1616ad1e13d162915cc24f274670d1e5e8bd345874a7e7c9759c8e43ff33689200739a613395f7ae78d73c6a7b90f65ab511f0df3c5dca85d0b9430b4e97098715ff823b617321799aea0ab9c72234780339ec7b541d5e6f8c1551146c24a65411811b23674c26123356cf233351382c3994cba5dc6c25a07e1ba9af33eca18bba3e97935e3abdf07e9fa32cecf241e7cafc6592db4ee487ff2b98a4a47805dee17fd93448dc98457b753ed4995ee6b1bfa9ff1d386c91f396ca8f48cab5b09a782ec3b616a87a6448a96236c4655413af755323d36a8db2e16509454489e6ec83629130cd2a54817918af362c83183494b4b590dbaf69cf399d3e2dc3e9c0c1224f148e65ef68287341ab72ad58adfc69b28e27e91ebbf830fac53b94f762f01cc9b1561ae35f16edabf51ff164c1309d1fdb52cd2bfedb5a492eb65cb9fc86b8f05ed26d13233fb0a3eb33a9dce2cf98e6516cee42fbe1e97e20ab6c9965f58a377dc73e530667ab8f45e6a70b23db50f0df411732d8acdabe50c51adb886c0e5a5296d4aa1b13a336f0c17812f79fc69418a7d8901c568f410eff2af74baaeb8336f46ca17e14e060ce2d45cdb376286eec8b8befa5ab8025802720a1e7393af579db13 +SS_N = 6e5c522a6d19b86c61bd983b56a0bef351c5ce716f021b49bdecd7bdfd5ed55a + +Seed = 6fb79c668eb6e0f65a09135cdd243ce205d7065a0924f86024adcd111f654a6dfe2e398a12369064c2a217229113e570 +SS = 63dfb842bf767f89717839642a9b92fccf82bf46a9f39ba1a3292995f3f934dc +PK = 5ff1f9fa5232395eb985e75dda57d476 +SK = e60c57628869c3631d6bbe573d1e3afa +CT = dd829e49a44c56293a3763ef4a6cf8f3 +CT_N = d0bf2e1d6851378cb5de83ae9b443234caa01ba58535242d0089a744c4b12753ff8442966bf563f8972cd0426e815a34883f740c6016928ee070291d8efbbd326088f30d50550b061ccffd9922e5a30468b62a0ebcbf0aeb74f8dfe3e130c2b1ba83e47075ad519b94c21f3c06078f4645d5444b41127dbf8ddc67a8cf440abe95ad1d586a29ff3d8a4d671b05198d2e2eaf06d7f0be6c550f1c544681829632e98cde071b1e8681c78a98081930d1c9809a497cf409bbc67d1d8de8b9a3e8f5ebea8fa79538d65c0176ed2034d74fcda38288c36c6b5af134eb9e60ffbf138fe5d6c0378ee891e69bf5bfed3b1614d25b58d3798a7eb3dc7fe42f1fa3e30953d92e79d418c741e659455a618e7a5aba4f59d12e17d057eb698f3c2f9a6b1d4e581d09a9d6c1da5f5f0ec69f8463d922b185256bfa5c751e0321d02c58e4284a021b1cafa50f7339d5a5b602ee59bad99f09dc0e282dab539cbbf970418dcf302f2b47cfc1e97ae2a83885b7ef6b5b65e662325644504338ee139ecc4b4308cd8aeceb0e9b40affdeac0e02795b54074eb446b85cb4a57122079bd7c34f310d1260efbab0f4a7e04ce438d624e25bec7e0061e253c89d57e84bdd44839343f6c4d858edefdca4fa794db91d17445c5f58ec08b5bc58cfeaacb953fb004fbb8f7b1dc1e1b5622be612fdfb1889442cd8aff5e18a75b02ce6f4ee1efbd96ddf8d02fcd2a42bfc8997cb459e2672af4231a75d59dc678a2185374bec3d98504e6e125a16e58f42805b12651478a1ce8df3cae5b0e0dec53ca78b2c38b64d7dd7c9985f518e02efe08ce6ff9b4cc3c521b3c1c0ac40504687af68708bc27946704eb4900ecaaf41777a223f1668a69c7047e9b863afb4ccac039334f58dd132bfd5534da9d45e640edd9e88104ad0455bd2faa383d35c0c9ec5fc6a6324bc1429c539b0bacdcccb55121f247f75ca6068ca915e16d13137fb95eae128b04ddedf9a0f4a17ffd5f2325008ae121e21f9f4a64b4d806ce2d93135968b3129b4deafbe07bd6be34de1a5adebb3e0002556a1392c77a23e4612061ec7148652d702a6493 +SS_N = 7608dd95ec12b13dbf1785d10622614a907b3c8b931697212d9bd0845eff660d + +Seed = ad4d2d306639620afcb3753a137f89331836a5adce1c40bebe77b82d43a40d3249000c7aa3786406d5d5fa65462d1a57 +SS = 135b9748c6aa6d1ae9b5420c72679ff65cae622b8a7df54cd7650131b5fd77f8 +PK = b2fc3561c4e38b2979f05f6d53375c24 +SK = f099de1ce5c6c0fa7df1b5b18ab4a33f +CT = 6809ab97adbd71faf2d86da9b09e61ee +CT_N = cf3125a6f30cf0d78f4b76f6c6877dccd180b2b8f7afa1ed7326a18123c0b20156902bb1fc6ba1f4f41a006b15e41d18a76440e5e20b2375665806c3ef5663704dc098d1e6f434a56f5f7579b860284fd8dfe84970cc47ef1afd9e4e3b80a3ec8fd739cefceff6567dca0944ef62af068298afc6723f196b4b71161c6177e2e8ea4a0f9dd37815b70d2d71a2cddeae73b28c9ec9c8fb5727eed252fa167543a77004f94598a32152a22bf611d275d1b249efed12b22269edb10718a49c3161b4a387a8654a509f9de7c8e1dab5a5d13c6b5b480c87a7283aa8df023f0bfdca6c32b18b7ae3f1f89bc22261e1af19202cce59981284d8094bc146aa0a0bcd5fc31f5c3d22f8e39aba1c4f5384e9018c0afdaf395b761b64afbefd50a89ed99b820b09ba286216463213cdd3e5239f263328419d6c8f377896ccc6d49cac9cb3b19a643991d1c1e9a3b3f8482a031f99e1ca839c0339e8141eb48c4a93115514cfadb9c47a6eab8497359fd92ddb442a8ae5b2776bc0ffad5d399f05cf72b872b492abb55f8a6c0c643d8fff627875100662396a849bda878b90895b93614623563afd24d76c9e02a85065e9dba056a342f0c7f516a37235023ebc18e8fb8fb6a675fcbdd5631ffc6930d7735d74bf7d7ceeb79c1d6d827ff1af5fb25b9cc20b9387fb11bce9c8844d1836e65cad1bc3f5087bdeb4cac03de28fc6e31070631f36ab5526d3d2f886dca8436122c605385985cb5dee7b09ba88d6948a7edad4a882a0bf6a38f9ba0e9f0dcea1fa1d19fb68ddf43eec7334c20ea8c7b1d633b55bb3fd43074b5d725a0b92cbcbc35221dba0142c5a942fe841515d191de04ca0a8540f15daa5c5b43726c1e0bac85fef0068ecdedc16b2e7135e1c24677439d9675cac9cf64fcbb76a18c1d098336c76cb5a04fd2ac395ee7a9635375c6ffba51f9c44042ee1df0cf368f35bc71aeabdec02cd35c3bd0b5943eb1d99a8173f43a789cfacea1ce6f1966e869498d097df7dc262c8b5efa22e5ab472461333a13bae03bfc8fec7699097ee8574ecc0e91224c8a2c10eb857325c627c197abb8ac3fc3f +SS_N = f1330554e26700b896758db1cc8eecb73b8c809a4083466e4e0c654f346afae1 + +Seed = 950684cb360ff0c011fd02a09a273c9f023d0a34ae0aa338c6f5283634ae9bef5d100bcd48f6577e5910beaafe6c52c3 +SS = a1ab1ba60b6fc2f0cf255c0e80ac59ea5efe05b4b3359f3aeb86682d7d37bac0 +PK = 198d494e515737c59e0eb929ac060839 +SK = e52c9043bff543eea1379349cef36ac6 +CT = 495c9d278157a301a392b3f232bf350d +CT_N = 2955adb5e21a1f72a2e3cb633a3e0f42fcac9096b0d62e4a45878ffa0fd6bdede4118fe325468a6f2b7e91cb6231413354c4c655d9aabb9d336064673f55857d2e9b0835d165a3bbdf8fe9de7e14be2ff03b0ec7e517afcc8bc682f6d6626491a9bfeea98f961a2a0740ff32da198559fcf5ff2c38695d17dfa8925569c13e5e0e7978f6990f9feb3052ad995b2405a010de041b36ac3c28e4df6b64e6bcc43808e63e1e4b76de4a7dca791c263f107491626a3054c229c648a89f27ced4670dc9aaac3fb95eea408833c318e92ae9f9719192b6b641685c6bf900ed4108245828aa1b7a2dfcc6f882701df533263c561bd28bc3cddf84ed00eb20da09f0089dac580d81974a75e48d52e1449ed97c5973b99a5a5a0980f4b140412a42312ad1a07f23a6d0b004437248e0de79b6e58f339284aae8c365e33c4a757d59805538ff8f1a6b6352a319291bd62e4133a8c3537bc378327d7585d61432c8afdb358eb785d8167bc494dc02dba635d562800a6fe345c7d52f6f78cfe00170324349bc8668ced5596b480658ac7db29ae8193d07056d2077a7c39414bced8f4e7312661caff6bd4cbc9a4722b823e90872bac85d808e805d6b8e7a45d90f904602f4a38e2163ba848dd5de4af6640400c8db59ece3537ca6e8de78df4d59c96f7cec9b525a0c0a784bef4b800f5a22d0d5b3441f88ef10dce8bc20ea03202e4393382f1c688f730b4991e97e94d404b787fd15ab213af68859f6dfa3946ee932fe944379d4dc263a4ebc175a99ddd83b32d9b7f848fe661c60473e8090e005730a770544e8951c566bd81c41d36139849a490319b5bd218d292dc8d49fe7ac7fc90bd999fa4efd83f1b18dedf39cb861e9a861d0c07020d6dac8cc8b8ea57ce890f295323141ee64472a85425fb6b860c25c976d70aaea1100c664d90054defc8caa043ea41f229179dfca9c525e0cbd3e43f797eda02f2072582a8c3fe23883d6cd28269b056e404b99379fe0ca83a0dac9ed33980dbe3b178275c8e0500ee36793e6199df4684584cfffe398bfacd28eac58bf4d83bfe4473cf45a965ae32aa770e0 +SS_N = 1931f243bd6f1325e4be71fc4223bf2d1d4b93cdc3536b6d777c7d4523f32513 + +Seed = 0633ccd19471803e0ceffc7a11b2e7b70c3329dfdde5be18160df0d4c609900d67154893921376cc4b4b8c586e3efe79 +SS = b2ff60f53bd459e9b2917acb29b98c541264159c9b44973f73989ecf50d7cfe9 +PK = f5be2f11ee2206846b5387405917062b +SK = dedf3958148d95251355d6a37d119940 +CT = c55538dd62e15f9a81a7c9e4e3e53f02 +CT_N = 954f5ccb184415b8f504f5107ac7cea3b97f2c09a2fff1ab075413c508057c44adf9a29acf7df85ac138d2bd129a00a839336528b778eb1865cbff3a4988ea04ee311fe3f4d17c6f5aa2718fc760c01d3be4596fc9a2bb456e322db7cf68bac12011ec1146b287ee7595bed6dc689f91d22747973e718c02727a8947cda37842dd62b573477230254d1539e7f6fed73adeaebec0af86ebc19febcc10f16de0e6e0aeef839fd4bff66bfd37e52c486d1e1a5e3e74ee75ebdcfbee3ddcd58b19330d15fe629b62663d482e752484e75cd62e16fbbaf52c9039a86f4013c1da7898a6d685f593fcf4ec738c6daa2cb2ba3d08405fb500f93681113430008cef55be62b4464a2e8c4ed6ad49aeb1fe7321964fd6085f28a4beb177b68669def0bfb2f6c666fe3aac2ffcf48068f3264f87ea8e0feb29e5baaac91e3c8cb7ed6447dfa5611b55040d33ad144f502b2d93ab857ac3a76ac609634677115252828c5feeffe26a889a3bc116082f1d511c95364743a10664304be0f4abd464dd64ef9115d814928eb5bce0892f627429a9c733c1d999fa46fa95b6fc4bf110d21dad1b3dd80a5d0f44c337515f661743b0852e343bed5b59d8c9c9a82e1565a5e2ecaf2fb3069bc03656e108dbabf49914a34241dc2076a1e1fd0d9a93408c4c90e48ddef8835fa5121d084610e4cabe0cacce748982cacacd4896dcec53fef4419109fdccd98c25438282be3a2a008577e5d871faa26b4452e353318577a7c749d2a96a1a45878d8eb98ed004cbeeefcc9c9c1044651f616ead2655f21d344a639afd6f925117c28458dd0c7a0c53050e4ee00ec48d3f63e62294ef3ac43c5873e82d4f557e15cc6bdfdb2c12f110ed235533203f5bdb2ade0d5bc19cac1a4c684f6fdc6b54f30186adccb9b8eb2ae1ad4e0632955ff386fcb23ebea29289e8cf328e12138cce93cb9a4b46d069d51c8cfc69428156f67832ec0df7781e8ac6bd15e5b6783b7b21fbd7eeafb791eb4203dcb432a40d0c229623fc7aa00f024e0fc61f1394bb49226e831473e216a3713e04a35ffa3fbafec5e8d8de3cfbdb175efe74bf +SS_N = c66a25a19bc890537d9d7b3dcf4a63cc1b4667e968b8626b4ff58481a10912b4 + +Seed = 2605426643cab04b2801416b3239cd046dfe7ba59874a3a05c5b32a4505f21d8b7217b5ecc8646fc6a845211ae4bc708 +SS = 67a0ff89fcc6f2b55f2188b7b6c030761a75adb14024054bca1556dad31fcb5b +PK = 07bcc847db2329464a1ac7f0ffd8d494 +SK = 4bec5250632b82d4c739a8b4910705fb +CT = 400d74e04d57a5dbb7ff4dc3f20cb987 +CT_N = a5bc0cc690767b203da8b72ff28459b5970fde7d2b85ef05852c086e8cf1c52fb4e5c8a75b8766446900419ba87bbeb06515ac7234eac06b1ac6070aee288c6a549c634397b821233bc340d133e79f22be2e1a0220bc2c29f8d2d830cc591362dc48eed220cde66b53db04cf7ecbec6ba68a1099c01ff0a20e1a0e380782afc83ff626f907758d06ea5695272c1bfc357b0c9ed4f899066eb2e6992e780fb9b50b6810285a197a0441805618870317c55323c9e72fb01977348ba70c9096072e9b7f26dfd099bcb0dc6e5feb6925fae31673d1f517da79db0ff4066fccacd0f9411e3e83af3ecda4313147e1ba774c9d3f9b5c702c20596861f85183e5a0689c2c63c61a45116a2bbb4ea0c08598eb30526a83f4875084b9dedd864f6ef179768be340478c0d1374e2ac46b5626e971a2e299f3f2a6252eaab43741e259ef18217bb0319161b9d90700c3549ca4f803d4c46cb25463c6e9907a3c918dcb74c2b94f4cd681b9ca7e74a474f7f88d3cd0964920d470532c0c151d91128581a8af55bf7d8289be3a2b8e08f319e7dcd658a64296f7ba919acebfe275aa2455648d70baf7ce15bb01977b70efe0a1a82f7922b06c64ca15d45c11d3223d289da13bdde901396feb31e059f94be05786ca9b4c40454cdfca4cb85c56ecf529c67c6414436632c6776d8d87e28866584422b19270a9d2a0c548482cfacd05351af60ac95888dc5de848989505f3f781aa388607742a29858aa85b089431c1e9f88a9c03320cfab1a895c75caaddbe110e372fd2788eae4b9d7c78309b438105f809a9f1a8a0cd0d1b944ad037a5266f157eb4f56222131bcd7c0d4d93714d36b017d946075f44c19168897a25396679c73af50f5ad697f1481e9e456f9e98edb0929919e8b1c5765c5309b55859a48bb2aa78ec96e0e7e22f549694560ebb359309a8032e84af4c1d6f918fc7d575630d7125f73979b3a2113af86b125d3ca574d4be0b6193ab98bc2628063de2d14ddf2edfe412452b4d365ff831569aba8e3ea43e858b75e150347299c2dbdae6930110bf1f217588391b7bfc8031cfee0db083a45 +SS_N = d86de3fde00e87ef655df2786da3bf8f02d35b4a71be9cdd116e5f2c983a2774 + +Seed = d3880d1b7802b4a3277687863c5a248befc95d3e4748403f3bb61f83abcddeae42ae6c8624812fd38f463122d99d59a9 +SS = 223bf148d64d4f49058394868086b514588dba33cbf105fb31c10f973750ba94 +PK = 88e900e1205dc000eb0611d4b9e2dce4 +SK = 5faf51bc7091f37b0c0ef9989c4a38cc +CT = 56819d990f48d72e0bf73d863cb2aaac +CT_N = 9767d90bfc648f8e99ab16d4b307eeff2bc9b577a235ecd5efd5e87dc8e297cf222363879e2dd47b01a6df3e5a004321c4f1b571376c2e40ee8232e5d6b9f8c59d647387549b908715887344bc43276346ae681b0123b9bbf1a6ea08b776866e22d5d81b43090f2a38dee3615db654edb0bc2478c2d13b566869f17ea78e57b803effd14d78a16decb42118d14e51b63060b8c14d3761c821b71b5fa724e89a8e4629a454521c00ec3af1fa0b709062475f0ee942113d654a3248a82904047e02a16264cd7dfccd1d10f1c3d32634f38f58506975b54cb57253d94dac612dce59a1f5ab508e6545e0a1d7b75e14e0dc92d52e3b4c2be5759d73097f5226888ca3b05264eb4bf942d6a93f5aa8a8ed3f1a22cfaa701c19779a9975e29158957b8395f126e74306770f48dfc7104f5f410751105a89450dd638bc85ccf30e05bdfe276f5a4737fc5de75e7cfe09575f47a00e57c596036f93c5907e3f262311382eb8a7490f0502172b740c8df226d637e0addc3671fd4804b150127c0fe27eafa23d609442c73bcd28eb7428eb98901f63505a58cfbe4c4c42190e83801acc741024b189a9811f244d4ba2eef3ad661066e00448d97ba88bb9d0113abbc327d1fe3353045ec54ef285e9748c67375ad6a6fd3eb85f33d5cfa05c1edc1f9bedf6c590940a0d7c602c78e31124928bf02478de67f9dcfd350eec85974abbcf420fbada73cb1026310a4309b774b33e4765166d6046ed27da971e8c7d98c02e2c7a015a25c8d695d01730980be2c7b34eecc988211f7e51cde8230f0f713ff99106c510bf9f9cb8977ceb046834046218919b4861c9c31cd667c98fc9442f4b798e935c7c59f40a5b0e47d555e67910eac45d639e77b95c545f9825e54db18401f84dad11a7c29390a15b34a18e2fe78b914c44cbd8822a57e344734fc127f4e6a205df872631bd2c2fe40f4a91413a18100aed952eb282fccaeb33b704a082c80c4310c86f1b45bd9500f91b7229a2718d81e420cddb5401816a60fd185531d453ae0db1c175b063cde3a8c7f89d9378c932417fa280d3a48c9cbd61fdfc330a905 +SS_N = ba18910321d91038a2506303d2cd4d597a33a78f42a580c47e950a0502ec507a + +Seed = 343b81870e2721dd75ee0ad7fdb269eb5aae0ae83a6316ad8ece3c76d3dd3cc391f1b12b22e988c1257b5f56d905a06c +SS = 5e4c8532e6b9e6b367fca55d2301047a92c25a367ea0278ae1f15a3d05b3e5af +PK = 465f849dd47c0ad2a5ab3a5dc6c0a89b +SK = 009d0bfabb06608d5b2864fc1a03c2bf +CT = 9b2db4d1c6cb027094ec7aa59a7d7476 +CT_N = 19b46e942815df5b1cc8d669d0644cfaabf9da05e35243c9c489a48e8d2c470ac68ab3c1f70b3930ade530ffa91af30f4c1757fc50ff706d75cabf4a3c072143f5ceace47aa094be5031859f5b252097c895998ca7a4514a0a4bd76b6707bb7d7968e7529c26e12fdc29e16afc3345b71953fdcee48190e9bee8d6df9f4353a7e12bb5402c14bef998d6edbc74702e0e0157eaa6b048dfac2f7a354408383269cf8ffd6c88969768e5ace986c2c0f848a63a2611230df97816b354073a2d1fbebc98d9c59dfd2eb1e4789ddf855403937d30f8df54b24062fb77bc56803dba2337e8dce2db435e701ec2f8464bf3168ebfe4c71dacb171b43c8f796eca800a638d7b2dc052f913ed9ce08212cb0124f0aa36e46d898a6930df71d04d785e18df4d2a61b426ee19e7abb85cd6263fb43cc9b0bf3a7b9f34b51fe4b0bb3828baf98fe0b1baa323b64231b0ad863f522ebe3b7916f298381cacdd75b7bfaa75fccfa2f1b3684e1fe16a9df25e36982ebac878f6eb45918839f1f0c5d13fcb6dbef1c9cbdb72cf5c38cc4e79ee08f5c7097fa6ea46a19dd6435bc5170ec8424d34cb0f7b96c73071618370101576bfeac0d288c2888083a9b697eebd9f77d499f3d4ab3d612f3d529e3a04d93675b5cc37b07dd1df060e630b93c05815bbddd6e798a1b52a2a6be4b9376e7e0011e9bdf3ad5477c2b35e7b6dfb5f6da8605151cd3546a57d89a70375bc4af0108823ca0350687a159d17a7e87766681f71c9252430b29f72deac7e6f478e3b0d64d7d74356f0823bfe72a8445c3c2b5ad6ba1d1d3fec90ab79243c0c0a4f14a48ade462c47c89ef635437b937f30686d47489467c847db47faf73bf2f95dddc3fee9deb5fa5107a20e683396c21aad0d83133e34a026b5457f17e21f05457e4b489c72df3dd950f7e820f5f2aa0a6409a237108a35efeed99ee11424a79a1aa8ba9ad98f4f5eb221c9b352885653dd062cb155906e07943bef64515b9a61c2aa09385f8fcc20df8d090febe6a63380aa2319913dd9a9165b85b45aaff8e2f6f1df15f6734aeb5ed2e4dbbe6724b2d1323825c2cee8 +SS_N = e2135160d7b43285fe8705044d582280f77f079d9166ea293d99945b87752f8b + +Seed = 406d9c95f9813ca6a9e6071d3a7a63093f9e00cd15ee968c3ab28cb7368699491e5662f6b63721fe059d50295c3a7516 +SS = 7f4b09952cd63b05f5269f7d64092b9fd7a993e052eda6af0d6951560b1c80a2 +PK = 78fc6eeadf848270c9e1864e2aa11b9c +SK = 066e215a4014b4c322283f3bbf5da7b7 +CT = aa29e822491fa81cf91395bce1715473 +CT_N = 48a940fd8ce0a7105163738acc8abebff47418a4fbad5d680e4d3c6c597dc47f268597b2c4c67ba3043bacd853e5ad8a07158f518d5b4d5c59e76ce44978da79866a7aa968290f550b97e2588bcb6e15a1b7c7dbc4b2f06c2b51723ab3522c05ed6139b5ebf4969ab80ea9e48b6159b79056ebdfb152a1d104b9652294bbc74aa482c7f5778c460d17bd912dbead475d1737afcf6013bf9e20c7fb697d4e929a9d1df5a3a9b4b89f1c0a8bd6b72ef59a6054cce9e6dc23d37e25b63f95a709276a3329843ce95131bf9e515e0f86daf834a11fc2d005b3fab7a99b8b52efd75733a2825c77b7eb1d6f199843902f6088434d92c104e9a606abd6c91b4deb3aa5114bbb8cf94c5008b3c66baab6ca51569481207f27306f10d2a4e308403f75d5a62eff44d9d69485683480bd32b17c0c3614f7d3230686cf95e3313504afe319358f670ae48ce542288c139e0bffcd4b289e94c61b1cc90b3f73b39a8df71996cc8dd3581c49b66c8f3b981d14b8bd9f94ec7f3368649f8610819008a9127374246d98edfa7bf46dbbfa6c9781c6fd09046c775e3c682af91226b6ef39fd85e9571b39f4874b9133c63d27ebdc426a848cc5642098cacb641655244dd7262835efaa96ef236821915e87e1372656c6f882c11f6b9570d29e47d29fb40b452d8c98e2eb795e5df84231475c83ffd9fff771e12ea83fc789f9941027f0c9eff1d379ffe1abb35cf05d5293506f99278df98af82586ef33541527b47362d0f91a48e1e0d5e0000d4591ff21095ea93dcc1b8e4a77b23d19b5999ce4fa64325e1be4295a54819b1965a7b4691bd290f3a08ed3f053016e0a745e4872a9bd7db905d0d2702b4a264db32846f547d9ae6627c27ac4865cf498520c71cfd8f983f6ecae28d4aa8b6302727e65e21c94dd828a84474209737df2a96438e8ad4b7a528ef1ff4fe25e47ebcf723dc0bf8bd35dafb2d99dd4e104e26f8a0ce7b8cc8ced69db54261c3f86fbacb3cc443ae6baa50b627678ec9bbbf38711cad228188887ddbc68936b926c353db32d934f2b40c76750e59dd73c3c1f5d44ee82976e375cfe4a +SS_N = 97617888b3681dd47bc833ac6ee1529a87b77f7dfe3e5dd56fe1d85172cf1781 + +Seed = b3c83c13dd15dffe58fdb6026d32e33e5ef24b094be16741dd5b587ea841ad19b6f026a127678849ec1b459a365fd645 +SS = e69928605fec37c1ad0f9a0cb01b3f8335e58d521238edd3cdeeb01aac18b492 +PK = ed7f4acd1668c2dd2473e96d20698175 +SK = 49511ca898286bb662415c41e9db8e37 +CT = e9924375209fe3fae8abacfdcf72d405 +CT_N = e66b5d39721e9168ae6958942e6baff79da05cc1ba00ac76f49191806b4c1081f40d2ea5acef8813e8ac3fd763e2a1c4b0155fbf5117c35137320a20c05c9e9fd3c09e76919a2b3eae942a25410cb59eee75ae1d60cbbe55fe11d05ef3b5de8c7c81b7df004674c67b8039a580d70582576355914804dedbc4d0ffb21f40acd34058bdf08ab48d51850a26ab79dc8222f3a1be18ac0bc6780da8c1bd099f7384d254adb683e5bba9897260828fec7b8ffe3086456bce9f26b20cc22faf8618ef7b493ae8c940c06cf6dc5b534c2effa51e51e6153bf77aa8911532b70ac2b66c5d916924dd36f3268b09975ed08cab97097d2d268e3712c249f41531e64270d9ef29a44e7db14bf4d51dc937b17922e6dacf3c18fc8aa583e5ee6c1c6752e242306566fb67e06e7e4564e7e3606e7937740006b71e69fd9c449bdf915c80042af57dfbeb7fffd0b5bf5064b0cb63562bee0d4f9a3a6e0c53dbb7831399a0b7207362cdd695beaca092ba797f7b7c2a32a7c012ce63525d534cb7ecad2037e4e326d7bd5ef33a5f643efdad38cee892c76306288b630c622b3c192595e4c1dc3cc581d1a25374e177afb13a94fd0a937c6b63730b986677bf10053dfb07c6c3816c7f0a491b9de173a200a330f2fff37f9589dab5e2dc7563e9120f402da8724ea02016f48d59ff754174ce6cee2af27e581e82abe56729920cfb778f11df83b7048d9eff1d2f7ece76dd839172ac5b7ed17433f4e9d7119d1b3e1b29233b3696eb2f4c57fbcc8e39847403e56c82fa47c303aeec6a9947f6670627d04d32a4a22c667432853c473362f9f65100c9ef01fb33fc2605009d8bad5c7d9581e6f6ebe38e250060f9ef990174073c7b34a7f144bf4263f6b3c240d264c3b203abcd99ceceeed4610060c8d109085d9643646ffdc9e89c86f7e545d5dee4ca3220d4cd04cfc430ed3ced5f6cffbe1962fd76839a76cc971319dc618055cc8e3d41c1845bddfa4677a431d7a1d53e67b99c9ed3775d689dc48b29ab6a2f77c6d8f10d78686d818818a5676806d79846b729b34ede2bf06d78d9b11fad507a2e563d3f0f +SS_N = 65fb5d44b3e130b7f84ed0f34ee686acddfbb5d14a217f953baf0159fb0bba87 + +Seed = 937bd532ff7c92404aca9c2389e314f72d780234e1fd930f967a724937204c59877af25d38245638fda72b0ee74f8492 +SS = 3d637109c6512257ac2e253ba7617bc41f9d929d652e24c1c066ed0456da7178 +PK = 4c8fafdf097d153fa114f9bba19b9d70 +SK = 6d81cecf0cff815aa584979a81a8dc03 +CT = bae094286e9fa951bb433b2546cb6f0a +CT_N = 318a79fa0fa37fc36fdcf69bd4b7b245ec6662d4f709350d537c75982264347f54ca42a5e1f644bc63a4c75d59d2dbc08d585a4bda29e91cbc6cd6e245209df1e8c5e4e94ab38e752ee403039dec5cfe7f06f3998ed6d0af50f2c6bc5891c68d801e0325ee572bf8ff7065507d11e51cc482e9e787afa855f8cd4805d58eadf79d08a132d2be9348404341aa41008276c42575a12af3859dd602208a289a4982b43f29dd1a1a25dd9c55dde14ccba5ff4d6312c3ef1a0bd632fd8fd3306c15d723dd6da1f8712a11369da7c221519f75f94ad5cbc3f7089cfbd041eae517943cd633378cf456e7bda554bf5e9338ecd753e3e09e644dd170e6a32d720e577c9b37651f81f3c90804559cfd3872510344e05b9af32ba6f3ad81453ef3a80540e219acfe260ec27cfaabc332ac7626f05187ec616557432f8ec73c44697eab699fdaff19fb4f035dff9eb0d94b7c793309ac955501d19c3342d020842372bb92a52c32f37ded2290499664fb894da957e4377ce5b2f767e0d968b801b3f1d1fe759d294d78a563c17d58ed70c9720c254d305beccd571c11b80f6c1fc0c68ced79b137328d0a9f759c08f9e7393fb9f29994c9e2376d9bed278f3013a20aaf1f47d4ee60edf53889755557b31c066553940f8a399f6ce9f285a387cb86f3acf97044a32761fef00f7c6bdd7d6af378fffd254b86022dbdddf278bd6e0998a8ce900288e70e0c566ac1ec22c5e42195299e90de0faa6b48cab0ffc10e2c3ee1765d162f7768835c704ebe25133566e401b39dfca8267779c649cd4d20eea519367f46493462d9df58e8bab1ca6c7cf13e1ad08549d4865e3a99bf342b9ad9cb7816f28ed7c522d671b7081994a52a9db6ede9476b3dd6fac43565ec9d1a086e761ee593c70445016da49570c37000070eaa57df1c5b024cbf0aaf4764b438ee9bfdd8466cb75d884cd7be31c3c6589d291dfea06a49437c7bffcd3cf626cb143cd1d5704b1ec63add7f3daf1b847618814ae6a3ae0bb04a2b73d89ddb11887be2f2576e9fb72a28d4ce206242223e5aaa0639b7feeb35bd72e0b9895d2862febc8a +SS_N = 54db7919c2e5dc1df181f729ba0cc4aff0cb6a814c27d1c5993e0dbfe55f5bee + +Seed = 075d939507ddeab7c64fb847edb74cf693866bea32c93bc5c129cbd7141c0b79901b26992481236a56cb404d464da0e1 +SS = 60486efeae335f68660877f76f2df1e713c267d1786af51569ced1b41d9644f7 +PK = 1175cb192a5ded9d1c493fc2602e6944 +SK = db7837a103afefb2bb46a03de0d26c1f +CT = 6a5e7cf92fbcc3fcb7f0678a0887f5ee +CT_N = fea6d5270c4bbb27b421c16e16a67a4c7123ff3d63398358fe0bf031835c0f1faf41ff5ac346052ef8e60238eeb02511db8f1027885f0e8aeb583f2a3feb859aa2a731b17f5c221f2b5c6e8ef42ce77375f99e0c495f1d6b714de74a0c526320083836bdf76775d0974fb1bace841ad68b336d7b56ea9b0d2192eb1e11b0b4b135c9f769daef385d53abb9e6ee7db3d38761f2feb92628bcb37f94b2b9d64ac40430db4a5711c1b8407989fd3c05b50b5f44d735d1faa394146ab51ee74b9ed4a322ee5de9f44eeaa06f7811e59579e8d008ddfcd770ce290838ebb0640ef47c219a007b1a139591721deed4ed409042ad4a5e537c579749611e3d2eeb7f390061795c4b077700f4e0c16afaf8acb99177a792fc61189ebf2812dd6b03f40f0c3445b807741b161c543b06f8e2dcb778537a987b0b1b54f0c649b81e2c1a0785bef41cf0607ec6aa4d54fdb8933b655dd4f83aeb8c438a85f0ae7a1bb479442966cc6b728fd83845734e7bc616993c743c0b5db4837b3f6fd27c9e9d9b20804b47b93d996cba53388cc747a724fe95e0cefdf4e525988071cf8399adb0fa4a51e87c2b7f7b8c74131d559cd7fcffd5aa5a0b83ca539ca88b19ca8a36a70ab137c8f5f45cef148aa894b9bb2189c0f0f296de7c06770ba2be3a550b04964f6898d96af286f73231d9929151b702ebfac3477d7be1da314732033939dab0563b21520433eff7e834580651a3fc91e3b3945435f0f3f14b54ca47688174f7ef3f5cb750348a39ce74665ad5828f5876a7a0e3768ab5ad52495ce0ffa696131336afccc34e1bf3d4ee7fb536304967bc03fef81abbc664a2ad16dd6b5433796a49fc08875d17fcbfe62d5c5ef38434bc30fd70adb2e8084b57db669cab2cea18e6f186d02713e6ec927e5368ad2e8b92cfd9f7b1cd087f0930f54fd0df8c34d09e1c08cc97be14d73f3d13bd32a68302ca91fd9317c36f5639e168e9a6ac2830177e84c6f81fdc828cda126cf8b7c6d02b59b922ab570f9307c8ec5587f46e2f27521b39a30cd01bac1b4bf434c75db28398120ce14dd30504ebe8887ff38969f670 +SS_N = f2511b3a80a6279673024185f618641de1e8d31938d8aa6805b87eb617909400 + +Seed = 40cc0df72eecc2e75de19c2d9765958c72f3c609d730911977cc93d3c68ca97a28ee7ab4102acf3eaef5982c302f7427 +SS = 3f2015f06c16fb19f1897be6d19a8da616e6186037fcea1b44741e39ccd73865 +PK = 7adb8a5e5aa796200ef17e9097d0d66f +SK = 881729e1db270f56daeedcfa64eba184 +CT = 968f2d970e16caf5ea8d667911f80e88 +CT_N = 4df25c14e87ed226e6fa40fddc6828687144f92de0feaba7bfda86b0718921ab2230a233892e2a3464cb6ead40a8f9f0d631f9d59de9cfaa71df89c80e318cf8b2e5bc82a1b0284b7f4a6fb56d3490b9d37284d934ae5d6966a8fb31c259d64eccac83d4260ac69d4d751df10059235030ac799b569b0b88b54036b280d3a984c64469987c93cabe45c5db93fdb9b852b9b1a2ac9d72395a8a12e9e3186ca3524fdab2bd7a85373755d384163e3816655a486e13eec146e78be16e21ce76736f4ce8e86176b62a2572a93877a3687518c960fa6a4607b2b892d7b325d847a25e4813bc014cca48ff31151940215aa7908aaa5d004ba5e1e387e7b4b209e8413a86c96cbe0e48bcd04240d629f157662522c1b0ceac62a46d95838815119153f02caf7d7b2c66eb2768235411ab94dac05c67bf48922674fda3052ba93cf5cf8979ccb026197fdee948bf2fcdf04ece13316f76d8081cd64463224ce06cca98fdbc45e46c8382b9432247611347209838bce85911824c1b0746c22bcd88fe69fb8b9de4afdeb9c307e5f2424f6b14987469728c6122fe031edc8b1375c7dd7d89940a5e01b1d0a64c0bc063c61e6c70ccbb79c1e9da886d2e61cef7f8e3e3431ee8a47822bc62ee5bd74d6a3af7fc210344e19a2165e7f8caef04c01021c69c43550e9b791c05adce4e5942f4e2d510db2d830ed6823a5569bc5a94404860da60c59e26c41157d06dc4fdec006ad654166b56e1fd45b14f7a81b13898ffa14b46d8a41193d41ace4bbacfbf7a5c98e353342fb2447d86fd48a70cecedd2e20bde22dd9a9af707588c848b17a0676a00ca8754357f0a00362dbe5872926c4019445be63815512816ab2c32a6832b8a8c53e0dcb1c93bc2906723346b0cafe1fb17b4797f156c9f660dc1324caaab75f16c1b6970e063ddeeb659d24897a91a0a173c3eb8912c4b0c0734237dffffc11845a0301245e39c85f692ca1d73ddb2c440de051966536bd213cd0ab5b1d9a6ca38b5263c246ea1161ffa16c7b45b891bdfdaaced574da407066b1792cbaf17afa3caf2f6b16396135cfb6d729af3fbefd4 +SS_N = e1ced4fef54a61765d7bd6d21a86294aed0f6eea02929e2318edd1d77bbfc76a + +Seed = b6ea97260b9732a7ca5f0afc4d9adf4b34b7a28b28aa7b60b6e92e87e65410d5d9c0e1bc46e36b34a29eaf32bde1623e +SS = 1a5f7e6d54bd0981d490273fc0c14c3ce9780b6052e11271379f5396a7f90677 +PK = bc91ad12122fffa0c7173c6a22c19a25 +SK = c865955979013453007d8431325fe4d0 +CT = cb827c473511bb0daf012d9745898593 +CT_N = 4548a5b82c16c54181d90b89b50f8f6e57f54dcefd8720aa7478d5d0223d80562df6ee2abd34a05cb69e2e69e1ced40f11c408c2ef64547b47c43a428efc072936b5b15c8f47e7de9bdb19ced1fa4a9127350e5f00699bc79b5caec9bae27715828cb5d1eeae26eb7d76aaa8dc585fb482d362a6a56f7c0dd3bb3c58c21687358cb5d4b5322a3c417910b82d573cb4a16fab30a1a3a663e3b2e0074bf839245ac78637abb2d973cb73d82128971212627f6118008b401a4cabf20337e22bc808d00609d8e8be329ac2d5bb444808f4f74cde57d4ad3f5a34a4f0a80aa029e71d9e7b97b6fad52ec16b782ad6fa3b66347559f9d84cf306d33dc248e0aeb0855f99e7903c3627ebd2fcfa87148260f46d55c7e729abd1e8153406bd08e491c689567c1bbba6ff2fc0d4f13ba55b4a6ac9f71caf72a63fb337d351649e5e43c9b96919316c538522a457aedc229661bdb89dbe367e7b3cc8b6c0843b272abe01615bb34ede497003a6d126b77e8e0933e9e9bb6194cc7d2b2cda42a7967565651b923c8ccd1a9c1dc0b8cffee27f7914000f3fe2ed03e8305ea78f17a041f06071b792a6003a88104a550c39d6a805f320537f100b5050fba95ee94e398662e41012da983cccc7caab0f62c4aa8d4879b364ab227d2fedd34a444b18dda56da0a254d9d1499b81668cb96e7789d5a5833c9b5aca10a5e22fa2531a3436b2d0d47b62cc8884ebdf7801e7521bf7e631412aaa5cf57c7a8f7053d65fb34ac267fc37dc78e21c6db830f2c87ad66d672135b8b6c6f2d36a84c2f2206c6046ea778cbdfeab4ba8c5f61456c9c1b9ae4ddb7d56d02999b3bfcbd69c5deeaa4323fe4c06c6262c48410367899e3c42ed67d702f1e179536465caf2aac5c4dcf7f33dee576100ee74560cc0742580c8f1625408e8017006588987c75683c21acee1e167dda3396b5b0a093330e8b7304bc7fd948bcd9b2640a22c013d6c19887fffe6ceaa875d7d899d8578c84e4523c3f5a7fb53e0bcd6c8e664ccf0fb5d2564546c657259f72fa19f817064f332878772c95434891cceec1c0d3ae977eaa858bac1ef77 +SS_N = de10780c310faa474439b9b4180c61416e2b9755282bb0ef1ce7e5688cbf4b1d + +Seed = 626afd438fd9c449de3fbe8e826a1abfdb14d9d0df7167e39a849db730118f20b3042cdc5d0714c3d10e1cd447329386 +SS = 051d80d4c2516ae2a303cbd23dd2c8497273850083824c0e9466c9889b74e7bf +PK = 968ba39cd2778101cf942aa72ea7dd61 +SK = 6e3158ed317e5c6b08df41fd48b12718 +CT = 1d6098c04d07cdd4bf740fff714afa09 +CT_N = 9198af43ab80566e6ca0aac867beac54cf16e1b78ad84bd7833095fe1da638497bf0094c5146e358919257bd04940c54258b5723f949b92ff2e1934d5064317f3fc2ae4fb84e1825136572b7e3a95c572c0a46512b243a510a97b6e41381b8b82697f1418df0bad565b1dc987f28a50fb8d1638a0dcd285d68e68da2982326f82a24233971f7fb232c45f5f1f072a82bc20ff6ac0970667046e8e0eae7bdd766f00d32380aaadd061320aac65f3212644abe0f21a54f87ad85c5545837e89a226e24964502cbb5d2bc6ce8e7481ac19742c8ef6036db2631dabba30b75cfdef71ec19bcf1ec7476ef591c8837c3fc7d497b91cc5fb7fde174260e6a5bbfa6ba7852c9c2e6c5c3edb0504e55c8eed42ffba96bc0fb107b5c9ef0daac57303dc8551d7b76f7944704a1d75e014a363c0faa6c0e71ecc8deffaa418fac1bd9046c8ba86d396dae33f3722544755117e052ad8402d165d7f1907188168eb8f87e69bb5f3afbe819dfb9b38e79f682d03be741b5542c601fe75d421d29d983553c80f1e43daf4d8bddca3e0b03167aed9ff3d85a19b000512eae3335c8de41e9b959cc51ef0ad6386f7f1721e053c280f286e02408140f01d158af4d0f1d8454dddabb46ac79e4df3363ca2494062df1315bdfd3c851938aa59bb09721c093f109bb6470ec6dbc221685434dff578039835f1d49de7856ab3a319d884d8c1591c1b6482efb3c35bd54d351f5de4ec7970e647c5388b07b3b4e0478e2c216eb33d2533024b561e570dd92c821ac6b6e634c3852a9ff71aba6902ca5da602f3d2cc1af4f2c34f0a93020b9329624429f5ed7b3adc9f61cbf6283f7fdce7b9db973c5d6a11a59a4cb79404e3d08ef161777e484ce61aa9372896a8a44adb66b31aacf40ad45029901efa87acacfeeb6435b85033bf370344186268ce3493bdb85488e7477785b5a6d73316e8829d1f28fa754084388f068cc028fd9b3cc591408edd196d7b228ca18021d454f890f695a1c2004047cf53752301e5e6806f336c223b7d0bf636f86bc393e223a73af0b08df04e9cc4ec49625f2c43823fa2bf4ac3c47306 +SS_N = c64368e3003e648aa9e29549ea9df79f5115c7343ed03f3d1468f394b444bcf9 + +Seed = 8484d545a1cfc58069db9ad0e9db3244df1d020b8957549064a5e7cafae6ae06a671f5e79797b42520464bbb95f5aa2b +SS = 0dfb39eed70084bb25560115bd9a5c23fc4839d42387998870e14fcdc1c26a89 +PK = 0a8bbae3159afd802d65f53d238a9ed7 +SK = 78fb5770dbceda18704bb81f87246c68 +CT = c937233377d19e090a2f29acf178c43c +CT_N = ced11070bd03c543b5ca47b00db736b0b99e63c6a489af09ae71959c20ec0e8955961390ac9d229d48db644a01ff188947e00847d5409697f4a9849d04e9741c01ae2694178b2a710000fc0deedbece7da9f9eac0be1c5e9c62c7ea711e3acb9b7efb88c101591700cdfda9dfe77d974bf68efd850114213e4775308909698bbb27a4fdbf52a157a2c859f0ffdb0a531b7a8e41ae95749710e776038be8ed947822fafbd88a5e7bf202de5be4351f961d99418d6c945b2910a440ed26c7006bfc22628eccff0c00b0a14005b0c441f5e3b7cdb635c470e8b5837afb77204b4c645bbc72f1b9701b307c0b45266d26a54138a589234d63136b9332ae5f89abfa84586853868ad9de057abaa1f94b8979d8e0b52c9d114daca59fb07c54f10fc38ae99eb6556db6cb13d478da28a831b4b69cbd0cf2acebccbe12ffb95d678a9436001d8cc3aedf00b1a2c90145c8f14cb19f9d7cba87c395afd46542d3ad5d36e2866d910e0dc66c0096ceed28d726b346a8842f4e7e0c15ac59279b54015b5d22b3a6e3f77a24851e1d916c4008145e5f05913e494311ee74181fb021f257a1906a5b1fe8e0e06272b98eb596a3b7ae94d63ce97c7f86ed4dbb0e508115c3914ac2c1ba334a78e219db6d0034bf8910f810133547fe8fa898acf026bf6338c7af7c03ee56d9679c68318f3e64e6bb3916062a2e5ddb93cede5e450c5d1e4d18ac0384c30a960a4103dc520029db58d079cff4ac30a3239a596b72eab9968b89082877d45183798f0362f314df164914a825e76342efa816321f8a724982609ef59202bb27ad4cce822247681de7fe232767809381e8665c81de6371ed8ce2734a6ffa8be5972193aa8edf9797aeb06b0ecc8460552bd6e9887640b068ad85664e9ade4b2930645e3ab191acfc48e245a56a02863ca5ce687ac251cd2c8b02667b71952d0a0784a7ebf35462f6a11700650f6d317e3024798503674cef986af1401b4cba0617acbf99470756dd435f8e68094fce4a23f1da5671a91a937f55d01f7db3813094b0d2c43afe4bb21379c7a13fe5165727f37238856aa96e9647c96 +SS_N = 7f653064b85740439b34b9ed8645f47f4e2a0cfbd1583be38c53d84c89d217ac + +Seed = cf525ff8d68f7717a6dd534843ae9688f2037019a7aaa012951282da883f499f080192bb5d7b74b5cb1ce6e160519baf +SS = 120eba1cb9fa8f871f1c5c49137754a14cf037bd68c49349ee0458601f05eb96 +PK = 824ac3e429fd4b61bc69031563fcd41e +SK = 4a16fe2d0bf4de4f414242a888dbab91 +CT = 1fded32ddd8277fcf6a166023900533c +CT_N = bfc25b947242e2d07bf638557c26ae983b2aa8693ec21a105dd53e6124043c64aae58a57594ab7b5b7540800638d5e32bdcff7ef2ad00ccfd818d6c27269c6f7a0484c41263e62d9a44b6edb3bb5265ee4f1fee19456a4f1c19da54f8cf463b87e22f9d56943320dfd0dd67c2cfff2f09b0b52508872e8899e4f5ff75e86c7f3fc7ddfe62c4bf3beadca7a3962b138d2b1a08218087366be252cfdf31511770862622bd7ed5505b14311c00e97429c0060363ef5553d43803a2533a684edc1e4b98a789cc7d984e253c8610016e2c9b298c7e9ce4c187429a85325c512b196038ddca4898bd173335c3849aeaaeb928546e4f7f74715d6d6090159c2c28c9e0fc801677029be3a342253a25b45dac396535218c0d08564eda4f97df309724a10bd56fcca4d271f8cddd5293d21b22865ff9092b0f96acf7e7b85435ca07ae2a9b5391891008612a6987fb43b87654d9e066ba3665cf47e9c3a9a0409ddf412fb21ba92e1dded393b7d60129ca3e0348eef539be984a002b55c5f653a77d41446f923eaa98df4a82c61b820f51f3d404a41d809f16c61aacc71e4fc148a1acdb43d45dc5e838a1aeb969076bc0dd6c57ebcc9439fbb97e29f290c86986cc1c5690821d6d02dcc29ff97ee423cb77763ca720629e736b242a1210b42bab9fafc3537f34da03eaf98865d5cc9577c801ae0b41a47dc569fec52f398750eeff499a916d7a0c98ff78923ef4264cbdc2a6c995863cc32a236d71f42bd3b688e9937e940c392f8462812b83f4f6bcaab0341ddb483e42dccbee6a8039fbbd1c7c2830a7567afae89b6dfbed6c1ecc1c00aa57d47fdcd56fad54055fa2ac975574a62a1024f5084ac876e6c81702ec57392a7c779b669532500d75501aa572fd9291f235262ff68ab22a05ba49267e362e1e9e01714fc8870dbbf6b127b88ec20a3919ea4744a99fbc9c94dee0443b5d70df24ffc608c0e98bfec997c490c484b751dc0dc63725441ff7c8986ca41a543d7e4afec17173d825ac0877d9655f0d36a59cfd73b94dff0625e30f1d354f4197b475b971614496834db08e44eeee04a4ba4e0 +SS_N = e15d89db450a6bcb8a8da3e3a6042bcc5a1b05512e36f7bda361b58f2d99761a + +Seed = 6d1579c271a32d9c51709409e2cf2b795638ecbda9621af6c409f76856eaa364c741beded3ca09c9cb64de764690cb82 +SS = 25eac5ebe5ddf61efc0d90fce3a6c6e4df67cf82d645ac9d123d11094e6bd489 +PK = 9f3240ad5a61f776ec69b1938ab85ab1 +SK = 13108aa3ebcc4ade6cf85055e4af16f2 +CT = 70412a59fa2f464404ad943a92ecda38 +CT_N = 4064e6ba7de7e3c9f7fb4e20266289e0367ebd3df17fac81c73187fe18cffbea5f9ad36b5558adcbc00636ef5cefff5f3e785d93d405ee78f3c8c8c18de5bba75a431ee6ad4d8f7b1abd7374d765305f3fb0c028483dbc97a97144d7b14fda1ca383d1920f74619c1a5dc834d58b9a456567d14e4b22234f9a0e0a47159be4811a947038af45de4cf7b2cfdaf4fe16151472ec30b5bbb8927de23c6310dd73ef19788c18ba08cc43162a8aebfc1baa549a9a7a907ccee0581bca9d1ba6b5dc665bfbde4e7b95ca0bcc702309853c8282e8caffe9eba59168e809c94512c9cb5021d5e3688b9758f2f6e550a633a6f91b98b305e094ed1b1d9d0d7138b5f8b77352217162d65d2910e570890af8f9a5e66b19e8b4261dad910f00753533708bd04a6200ca14d08c53188524b58179e5415bc1c44308dce11c75f9ed4f07cd67ea7ff4730f86f64f31f4e3130788ab1d52db6e89a1c1361b1ab678e143fdf0e2f6f041e5c3069cd2b22e4c8098b02c91e4b9837e4ff93af29093dcfc0189d6e8a8c7370509dd9e1f4e4496d9f01d45436b3baede52e3f596f5508c5976e93631ed01fcaf4c5c6bf64c7a4c97a8e33dd06af2b34d0e721b9558cccf82f9751df81aaae25c245e14d600c5664ed69824dac8c80dde1c7f26f109d3b29fec0ec7a6aca961f46986fbbed12212739d948da727dfc3adbed81259667f71af6812c9a44dd42e9b101a43a445b99819bb61ba74b70dee2e8a767483dbceee4d5346a7f08bf09fc8855ac6917b63a7a6c1c3ba1de2e7a0731f2ad9e2f749102a551012c95fd743c15c7a532bcd186fdb2c768fbb55b126665e64c3c327dc645a611b0f31fc037c537362b789f88c8d634dc8d87fbd4c14aceccd9306affe2d63709e5dac7d02429f5cf9c6fae07517c04cf8277128722db850219ec6f587963599f635ae51887772706b80f4c3455e8b9f1e7a7c524aa37654d9fd71115835c8358f5c7fc5dae3a8778871d09e3427516eb1e61af83838943d159a3c048df8624edf2a23b940507084eb233ff1263641b6ced7062f3d36775de3237b108e2c947a2d00dbcb +SS_N = 3eb417756df93829d75ab7b4d69a583cf5797a311f7ff607c1f5c5281c34dfd0 + +Seed = cb872dcdffa86f3f117a4dc5adf5ea6a3b1c312d618fc1a070f67586185711d650ebb5b6299bbcd41081b063403f59b7 +SS = 69210ed1b053b07174c8d357b107e27d1d4f53f27451117b1a7e8fe2f5e7e973 +PK = e0481aa26f037b7e87ce1c56c4d3b340 +SK = 2018c6763fa0841d8d886dbf2879447f +CT = 19f6d60047eb8e26b50e9a34efb89d7a +CT_N = 77d1309adaad056d705358e58e049eef88cf8588a8e51d2bd844062dcadf90427480b16ea89ddd6147c6bcd19baa9cd01e5d00019c360631299d2854dd08799f3b2996d6b91ba942d7f1a20ea9981a6abda128fc4ad0610192d298a8b9e4a0e81bed649812dc39c5273350314137dff4a23e6b9725707fa1b4bc6daae483d67b57f0fbcc473055b62e2d073c46f1ee698560bfe95c5fe0686a0013215938002c5ee57eda72b02c5f4edbbaad7f42a9adac4e0408525d9cb2a007925871e31e8ce73d26a3c10e0c1948ff0080493d15dd5905113c552726e1738798380ca251841ea7d5ea0fc47a18f0fe8b4b7cf5402250921c903276a9c2653fccb5122a88d40b0138717e277744c671c210fbc1488d71fd447afdca42b98bdc0c9529dec21ca51fdde9a973d6e01536d513e971822077267c8b2f641b7a13e1038850509e8a4e900fac82aca62f5cb1bceeaccc8a93873c93034bc4a1df92f6c52474c2c26088062341c30c768f62877bb876632c7907030778170d74b49b844fac4a6690ddf10baccfb4f244e4a913a2277803dad794d72731302f4e4ec98d7289f249807fd6691cf9c63b7bed1b863566a01ed35f39260d857213369bd8597dfc8a49e20ce5c2cbaff0cae9456527d1eb81f2cb9190267a26ea27557c1f10bed4d45b27233fb2e8375a15e2a3e27d818e363bd688a4d4b12d9f7380d85b57fcc5dac49d311aff539d5988c5a126740135b495794e105c6735c8b1a471b89f9b1b4258cb4e46808c9b4fd8f33b3c53c5d8a140409375f9dc34cd7e35f0b55e9fb07deab3224f8a3b9e8256c39ab053737ab4e050aa9017352a99983f2dabd739c20813b26c9c2ae7551981bbf90ba19c235abd6741f5f3680aa1633052e4a415e7b13184ac11009d0abcb0dc44e62f95424c30a863118a11b49a0a3d5ac73dc5f423024114d427ae4520f4dc258897ab4569ca1d4b1f4be5d975a5a24f6c9054941812fb78e818c93f44d1c9cf3ecf55b68cae2bb0b72eedb81a442572a58b537972c8f29be6b16d6aaeb04ee3c2a25a1fa8d9e3cd9e2f6c6f254b1d34736edd96d299a7ca +SS_N = 595a688388193ca7451dd88a4a6c8740ec966a2a8c12c94d1a3091dbf9c4a12b + +Seed = 4be36ba806cdb11ec9a65f900af0cb580d2e5fac37ee8745aa2970a7db4c8244491d875c0b4a7fe64ff09bc6ac2a2f83 +SS = 919506c0f9fce88501e5a34be53f0862cf5b75bd838281e488629fd3960b9cf1 +PK = 113e23625359c09582af68b87d36c25d +SK = b8c2d3dc16e001b8a898cbc9a683d768 +CT = cf8c52751ca09910ad26ca5f05941177 +CT_N = a251dd8f8eb2f8d6c0c956462903743e8d56ecf8248d436f977b1cbacf1203ef172c85c449beef6b648cabab82620146b3b74fb9ed09e24dfa8e29c29cc8352a7c5e3c061a664441fdd277cf80a4415bfbe67a27c11c19e331f7ac476b521d44b59663a145cb266a656c2d96e1431943e362907af49c2c6f788ca45e6f1c3dc12858fcc30c386b3c07cc216e450386cad8895625b0611423ddab6609eca11afcf997f7c39dd27305dbf0dfc08fbc5fc7965013b67b6581bb213eb93afddde31eba96fc5c0fae1fd2fed39d7bc864142588befce915137373d1703041310a0322f0ed2530d50272151c13b83edf09fff662714ba613f37c90b6cf1b7037675ace77c3150b2629453f45bfc7a9299b34b829b1d76f3699613009769de65ab3e6ae1d1b42b6ef76e5e6aa0496dbe17644e96187b965670727e8a77660563f9029a63b41af3f4604d28e4461ee58c7e1f3974d54bc021518009fbaaa57ed39f72a0ffd3c9e10f7761f587979cfd63ea68dc781d69ea6da66d8c5f5774d07b6bfb49133f30f1396cd32636c734f259c73509ec74c5cd64b580b10dad19167b3a936237d401f7f0ff29991c1d99a23f3a38a5f4cfebdeaf3a1bdc8e757eb770cb9985055e5e4c167d056d95160976ea4b30418187ead8a5ee73946db99fb42b48c19a8527277fe7ed07efa9f660e3c90ae6bb3fd9c259866de7519376d7361d9dfd28189bcd64069b10f69980b2b1451f5c4cfff29153eb309ee6c581cd458aaf7e058d02e9c79957febd07de8235907944ec5e2130f60fbfb8270cb7d695a1cbe5850425f60c6497dd1e460ccdbeca503bd8d010e71a429dc3d75147b1d4d7fcde831ed56b833ace7bb0ce2ef2adb791618e5cc835f5e7ed3f5ac2032f579e863cb4548c80955d65736861490aee6327f66ec26bc8a74a66b7241f02476e80cd7e5dcd6827a97397c148e008d0c5c14dac1573cef5dd84eae55bd2db466bcaf4ec6f90ecc7590cb753731de37c2e0899ef29a9b26548b6ecdaa4bc1766fba3c2cb3fc41821b13c381efc0831489857534215b2ab1986ac8aae765671a0425093729a7 +SS_N = 0f19cff9992874b353307d3b9a62fa7e9640f5f7a19bc2bd2cd14fd3a2f7043e + +Seed = 81c2294b8c26071d6ef0288f547789a3b563f5d511cf1d7b812c17e2e507da925d4be870d837cdf42a1e980c532fc0b6 +SS = 18e6edba131f30651ab3b1f0334475f10ea744ed4f1db74fe243c1a7caee41d2 +PK = 36369fcae93e3bbd8bd6d4b5b7fb231b +SK = 02b24eaa1295c217ffea5d15d7e2904a +CT = ab7dd150ddec1f5ef0971dabcfb37fb7 +CT_N = a9045863b649881dd010d7be0e5fc8a079c468d9972c1dbdf01e93fdb5b60ae8619661b71b6d82dcf452084916d5d0ae63dda9357e83b6f69ea5accb762fe0a1064e42a01d145c8301550738ded92b71cec0e7d40b7a704fbfd1e85c3bc79c9b552573afe4ac4107f01ae7e0c13c2aa17c119e4a375e13bdb2ba6db735a6357b45528d5d4a15688580517cb63f850073026fd23019fefcedcdda8de5491f0411757e4f255164ce5588348cb451217fad236866220f61b38753b7d155ea887e9f5774c9656830dde853758ee185c8e2b2169d6f44f32a5c129119595cd724f563f8c24a97a11002d20f75c81caa90134fff8024e87c209dd39f18a0a900e9a96cca50bba3fa09ebb10af24199a9a6682c671b99a1f3882e3854693dc789544900961cd4beb9e31bcd5534b214718bf6c145328f16cbc8d2b9663cd71b7b76e7bace60eaf6aaf0acc42c51c4209d6ac24b7e1998d14d9156259d7493699977a4ee7ecf23f1c3f0bc4c8d5f538174dd288a44b65a7db23141670861a385fa6c1d9f4058d7910d24c82af0ac02c877da183a463fb24da7a674cf81b32965cfda924f90e962b1fd65c9d290d966d7fa8480486732aac3ee94db970d0d037cf3e7326810995f0f1ea59f76bfd303ebb35e4db01d9fb7bdd901fe5e2a4c39bcc5533bf7999979ea5cf6fd292ff23fece9528d70862eaa4ff6489cdffdb4d6427867fb15ad4ce6893416efda6ede9ae57db6ff5342844a6615c830970ff85d83364c59a7de2d2e4d62548317b2dd2590faf70ab0c1495a5bde70ecb127568d1aba3253674f90921379c39fe67a45b37752477e6b74d2dc498581216af9985e68171a5d85b04f460ba8e7ddfda2e2aad1570856a578694fe091bab090516aaf93c2f2b3e9803ae730e4c59953674d6a2d722c3e00495b9dbbc38deae65422d6e3fca0cf52eaec17508c417a998c3f7d274605f6504917562db7f2bdcd7d69651eda4f660290bcba2664dd8218376e43993b83e190dfbc4a7310813a3e57376be081fff1de414e8fe7dc772e7b460c1e38f044c10b6292c7e5ea7ec32bcb426377fa08133d +SS_N = fa382a5a11283bf7228e26a64ba94b1680f4980778893247f6eedf78e93c9618 + +Seed = c46854665b9852229d9c64000820cb49b8d023fa951977cedf2bd6650c48fd13b6a0ffd8f002558f0c03f0aece457a6c +SS = 1c9f63631dee5995face93e2867f8a4cc0e120ad78b13698ad9cd91a16132e2c +PK = d321bd44cfe43e47359e29812691a4b6 +SK = a649e79671a3e947a00159496210db88 +CT = dd22597b2a2250fd34ed2c7aee96731e +CT_N = df76f31a2b4b61b00882f445c30a3614b625df849aa722d87eb120fc3948af61a0554f5cda8f015dbd11a43b53d20daaba24fa088378a96b44a4565dc45bc9e96b06d94acde1b91913f082287a7a298f1217a17908d5e8c560861c5d1007f46f2dbb7db035e96c11f721d1eabb21162146b10535247f4f39454737d8f6dd75d42cbe61012fd4e8147154285fcfc0179aee97dc65d5d2aa3e8764442476af93a6c4763fe7c6d385be6a11589054514def29e86d3c61099f8886ccc710202c71856138684e7ec7c5576b3e9bbb66bb7ea7dc700cda494ee029be8a283fd48aa6784727a84189038a82f0d13b5c80baf11ee22345228f42a81711b66b1a11f248030f5e143bbb2aaafb643b7093ccade39e64b36aefb579abff1f76755769bf2efecfe218144075aff62b56d38d1ee30702bc767155cac1a2a7299b3939eff90ecb9705b59b324da72772bd1d58e4b4dafae7cd614188acb85f9a6793bdd9038f95892997238291e54ef569ed834908b4f2ee9ef2822309b052c9228e04b2fbe19839180106148237b96a444c9153d3af5b87485ec8a4a197501440d4ce1bfc74d6b9a1c22522a34b9292382cc202c5f78ba515a11873b3e479ce234901cf26ca51c2b96470176aeaa184562ef10da32301d46a8ec9c29aff6dfe12eafdf718fe788288cb0c127a7ea552c3b4985d118a0cd96dfa5754a387483112d9d5e89b374d169b90566924c22660d957ef16c1d1443ec200445693bc9a29a673cbd3ee60513b8f64c3f1923caa6ad43b7fb01d06c40302220afa43a2b5834b1e133f02119962d22472fc21573e1a79fd6aee8be12fffcb8925bc781a81de0d43acb94d8c6b959d23e85d6329ab12774f6d67948700c41ddfae8e72d6847a109d2787a21a58092c1e91c29cd3f976250bb2189fab92c2fc699cd012adb1363924ed31b7b25ae48ef640cf8fbcc0159d56000730a33e94ddb50a2c0d98683a3cf13fa4551d7a347f178acb89890a3b007aa53cd4fedd333e85b519dfef237cabeee427214912fd45997498537fa5280effd0f3b0327d2c5c14af11db3a576dd7163e1c0a2386 +SS_N = 8bd7bd022b09c6b477532b6eb8cb165f4bbd45f3f2e1af602d81e7426d6816ee + +Seed = 430399bb2441c965586739ba1e5f7cd7bfd1d1d0c903a2c575b764ad7f2e3ee012451a5e136423dab0be7a86b99db19a +SS = f105f712b2d162986da3af7fe4fa45e0b3332482cff94fc7016dce0768968854 +PK = e7cd61a298bdbe4c3737b673c623762d +SK = 47c121eb3bb6f6cd9c54650592269ed5 +CT = 0e4f0349b5fcfde5789e8e3253e351f9 +CT_N = 29896f28ed5132391bda30b56d75e66c89acba20a4f4362588e76c76a0ff3d1988cbe22c2e979dbf80011c4b5944ae582bf5f0449bb69452739ea4c3da34bc8a88d18f481149881857a8e2a4725d21e1676e8111419e39845ce0d72de6d6a67fbca5b3316097d2dc563adbb2d994d1bd25cf5d115c39d0ae00886216af3df2fc68206dca490d77fcb79981c2a30a8080038f2fc817608c401188416482d31485260bda29dabbae0baefaba35eacafe10dd0d7b37f3d31cb2a21ec5c4b1bc8665a2c228b7a2ed02fa743798e4c70f2487e421572a5c3c61909a2c6a4ac5a8bba4b905546618765e9c14a421bbb054dd42188d6c5837ecda596b8ec78e49004429d5c40a5e3501db4da13974106434e18f981bfe73f0c521b6639aafbf3956fce23822f851f5030c4c79726aa3fcd96ff0302e500b0f147a46707fcd59a1cafee760132b5bceac596d10a4e6c2d80bac0fd79b46b4c956eb65139d7507f7db34c86c66b3de0dc2b82cbb7339a278c6c4a714d83b46b6909f2f022cbaf6e8f7b520eb22078ca7fc5e49e5487c0d0f7e2e3bb2a4baed321eb5522881e3b954a463bd4fa7e8a994bcc78222fd1be5a8c7e6c8dda0b91bd769123204ff05856735b070567a0a146cb139f03ed97fd4ed7e4575f823323150d35ed762ff6c6a995a5f29ceb7fc393465ac72c47d2302b396f89f4ca7c43c83f4986dd761a2e0a1188a825540ec0f4055a015d5f38b369b5e27c115de6deb9a2bf03a8519cadc3a349d02350255d208d13a131933d4baea8894105eccd012180019ea181a59c7070a7f34c16092fb890b4590c8db36eefd1ab1edce6f632a90ff127a9dfc30bb78a6673a8b7697dc394ad0f32e8c941ddda046d51a2978e9a659c75ae824a96a9a5f8aed666144e92915fcd950c7691ab4e744480dbf1232fd8398efb7de7c8537e482b8983f4489f7510110f6e1090900a79e7bb997eb8e14f5f81ab2ac1994930d80ecf30e06e36898c9cefb01eb5aab12f4d5af64abe20b3a5960b65cc7b62ae8fc59e2be2ed7fd60631681e550f6bc4bbbed7bef68105a41803cb032d1b62b0c60ce +SS_N = d60c0855b4cf133e818a91cb1af51a323dbd9e6fa536a3be1651b8cafbed0f2b + +Seed = d5040ee87eeaf9f4001ce18f5ac6106cbc7ac498c2f290ee47f07702c66ae73e930b6911c7d0e7f0751a4d03ab56f5b2 +SS = ccfee5d6027ca342a0396adf7d7616a3a323c0519ac7024765fb1e21340c259e +PK = 8359c023acc3d1da97c793d349096d5a +SK = b2859f588d4bb916b097131be8f54d56 +CT = b53e1dbca61cb2bdb5e1741736266547 +CT_N = 58d9d864b9c54bcebde86af7cbd85366d29ce7b9ff4176b3137cd4462358a8b637b9447f50866c058c8b8dffea37b26003f84f0b039a67dbbcc3dd2f7f1613e8945ca410f9b00b985bbcf564e23cee48161767a28a707ff7d72bc5ec7856da0bb6a5331a74462ecb6845ec47222d07fb2cdb48a7c692520a803c75a16dadeb5a646cc6ddc71f7983ebffa0badddf4f82b3ecc997b5f97468c60be1b000e9d4188e5b66a6d8b3f23ff0c84152d39a97dffd4bbe971094d0f3944c15e3bde5426c7d80b8fbbf74460d0fc459733a3c07d784c108e4f3e32bb36f998488789e9e010123f7a904ee8c1223540bb85223e8105764c442350e8474f03c18acba47f0f890a27dae4f716500748e9e4c59e68131bd0a97a6e19351764d26c6f435a8105a61a900a01c731f21f0115fadb57b3be4f4ea0cf24c9e039a926ca7b4c708df0f50774fa48fb238dd4885abd07087dac89c01c33fe978dbd8bb307a2dc7ed4854a3382f30612aa4a5aa611152b993aa14db80761c8a7c521309b1f2965159fa9946d13c3882c63a72cb4613d145d7e34e51b926f3e4d52e90eb4dae6cc5a9e157e1b5db926be5ab60cb9b5b614217591b36a374c7a77064073a8aaa6a64cd8cbbd1a2125bf87855290fc96a2b1e198074e80b7f3904e5a669ddd1de7bbeb2c82447ab12d184d87de11f9cca7e2f983d419d591d9243650d100973ffc2bfd64dfe099be863e04167c877cdeea18638a9e3ddbc6b746610f250f18795c8f9e4a95c937c43e579ff42243708b053dc7b7d3a918e4d841fe35ca835b56864d193064138a042f66d333365641f357f3efed94ee7f30e99852c0cead06a1e8222846db955e7e816954bd6c42e740f654a30778875bb57271988a266445695204aa65ec93f763f98a9aa8eb5e3ab7018f99fc603cadcd3318eb5f0f75c4d7069a8d6fd078f949f5a8d3f2f92036875c468c01d939cf784f7b7835c987236cfeddf2e0dd068fc6178500503f8b7e4f471d1b04a2c4923eff0d8c24c0c5bb3be14f585feaeb213b1d6c6c7fca99932934d2ff2c0a0dac7cac75a4bd848cb422bb425a9347f +SS_N = db107dd9a3201618649e9fe77159e35e6b02bd6eee035e3a8d7d0c674a1af9d8 + +Seed = 2a74f833b43587b6a6c67b1dc708f553e00ffe59841c3aa6c61f8e15e815b1ca1071b5f6fb8bddbc1cbff6b053d8854d +SS = b046c363e58cfc3563af526d9096ac2041a5ea50074280886f0fd5f1a37396bf +PK = 52f0869252cbb1ca6fa4c1d059f06d50 +SK = 2b075e394edc9586f7eac97f0fb1e202 +CT = 1e34b32cbe7ff0979ee9ce874b5d40a6 +CT_N = ec19cbecbdab7846404e066e5d1bb12430eae04b9cb3ab093f0c77f2f62d66f977d115bce554dd7e9c1962df0f126985dfa5addadb9ee430db795823a942e45e8d2cbc620d1fe42fedf243a01e472bbe8a37faf5ddba41eada0d97cc662a109e8efc0937c0ebb413e7f6d61976ff9bb17c0f05fc39638b85c94a3c7e3d53750a3a76e043faead5ec24b8223967056690b69c3073d10f8e6e4d311fa789d0a5593d6838df82c546f6b29f8a04edd3bd59a903b0c053ae33402072c0dfd3a13bc8a78e3f0e96e037bd188be1858960ee7b6d676179dd77fb72dba540f0485e8f5898c844f6c6df5e187eb10cca647b2870b127dc9eb323fb86a12bac168bc7a21af75a8b06adfcaec8d6f4b56664ffded9a22e6db378eb18b95c5017495f7e03fab52047ec81a760d5561806ca66b108b60ec0bdd186e095573b10aeb6e91b11d434dff4f617e5694d3773b712fffa5171fdb4acc524d0afada12d0fdd1350f40579d6a1d53b987a5ca122508b06b42c8ea982be0e2f8b0cafbb26236a85d80f9c91c96a90c30f62c8caf1697184bf3baaf965a7e62b8583b93419e779e8b54dd70587a1595bfd75c14f7faf0891507d23f7c76a0c7c5b18e9edb37e00b6fba59d53ea8e1743f55c72a30bad67b31650d3044958ad9d2ff4b1750ec0231210d931868f1bcebac2dba5346e00f918c226a76224725923619ca3ad74b92482ef67223a16439346692ce06f701f531cdf17db15138b99c61298b5b2ecf97568010ea783cef33ddfa2cd2a300d09743d436a1e2e75f2ea234b30a46e50ab87a6d9495234438d4ee47457605e2da33807a495cc3dd0dcf8d2436618f68dc28a10d740daa520606132306203dd6789c99791c9e6b8dadd671c418740665c9f7e2d7e061f09d1d6012dd3dd0f90321f6959417f12ae421b0fc52bed4a8f12c069caa146e34c0ebf0fa0a37c4c515d80afaf7546fa784aefd624ce3df6cd01c419b1aa860df851131d89b8261d52bcf6baa56871917eea5ec65b29b05839206ebf92e56d7147f98170fbcaa16ee4741f73b6888d13c7f8584b277c5c4f40c35faa279724b4 +SS_N = d57051f55ccbbbf995a5884c89be4253459987e240fcb9c5ced084931eeeea47 + +[ML-KEM-768] +Seed = 23f1c88bd0e65f2c891ce865bd3275a7ffdbe4f9036e75b96aad0412650e9cd2ea4591d4ab7131ea971b34c23a4ed245 +SS = b408d5d115713f0a93047dbbea832e4340787686d59a9a2d106bd662ba0aa035 +PK = 4a52e5443bb91d321cd1717cb23fbaeb +SK = 6c77a766312cfa7e9d57615d9da3f2cc +CT = 8fbdf59524288e02a56be77f844aab48 +CT_N = 96ac6243c9b1272be77b975a4048bf00ff2c48f94a3483362449273880d45e54bda15729682bf591a74382a708beb78118cab29ad74ac2f405ba720076dfb57188dc168487cd20081f6bf412f257dea03406b23a6a752e478ba4ef9c7c0f4810921fa32545be64dc5d9f18d4e1320efc6508154cda35ab912d059e0291a1150ae0a10da5e3d7bd221a851c598df4d0b18daa920976556099d1c0de4e222d5304d44fa9cb9bd4ffe15769dd6c4793fa809f5264cf0febca4b5975ba287639783aa1f4b645ff7a00d46ee7b19fec17b3e83bcaf4361d5349e30ceab60c386b6b0d1b90d8b336ee6a627ad2a38670cb5113b0fb4ac2ddc4250097483fefd182670ea40f0f45cce90b9ed58dafaef657d64e25fd6692a69721994e7d00b4949205ebe4c4f9c46ee5a1018b220a26d80ae2d2b486372e974d75b20a005b1616ad1e13d162915cc24f274670d1e5e8bd345874a7e7c9759c8e43ff33689200739a613395f7ae78d73c6a7b90f65ab511f0df3c5dca85d0b9430b4e97098715ff823b617321799aea0ab9c72234780339ec7b541d5e6f8c1551146c24a65411811b23674c26123356cf233351382c3994cba5dc6c25a07e1ba9af33eca18bba3e97935e3abdf07e9fa32cecf241e7cafc6592db4ee487ff2b98a4a47805dee17fd93448dc98457b753ed4995ee6b1bfa9ff1d386c91f396ca8f48cab5b09a782ec3b616a87a6448a96236c4655413af755323d36a8db2e16509454489e6ec83629130cd2a54817918af362c83183494b4b590dbaf69cf399d3e2dc3e9c0c1224f148e65ef68287341ab72ad58adfc69b28e27e91ebbf830fac53b94f762f01cc9b1561ae35f16edabf51ff164c1309d1fdb52cd2bfedb5a492eb65cb9fc86b8f05ed26d13233fb0a3eb33a9dce2cf98e6516cee42fbe1e97e20ab6c9965f58a377dc73e530667ab8f45e6a70b23db50f0df411732d8acdabe50c51adb886c0e5a5296d4aa1b13a336f0c17812f79fc69418a7d8901c568f410eff2af74baaeb8336f46ca17e14e060ce2d45cdb376286eec8b8befa5ab8025802720a1e7393af579db13e8867d43d711e61b2ee395077984a450a8e2513040068a931796bc3d0069b56d1f062fc3dd61b1b194b6e1f1d1c0596d453db7b7592a6f9f8ac5576a855906512200234c40fc9bd9de9c3d6291c31b5e6b7ade473a3787aab0c958b3df76188a86ecf9e3ab06f96d1ec518c1bf3366bef94465d9e1a69eb26db9e0f0856d27be50a52bb0a3a17075d66080fe1d3bd42122d656ccc3a556e04f913faf9641143931a640e72fab9d003038c982cac8142e5613dbaab9d41390577afe73ac623f7c1920cbf1feb5c85cc433300c1c5579d020d5491edd6c503117b9c4d598438938831e5c341e9c86cd00dd8d4320b656f9aba9f0e552724e3828fc2e00946121663ad3ad98a25e7d308da1a0347c4dcfc798e395270ad07cfdf0ff8e3278dae20ab2664cdf30a5d0ebfe7a1e799ec44b514e02f2be9738d4e28036b4776bd40408 +SS_N = e7bcf899feb5db69d11741a8838ecfee253e80b76d6a35af46e220e81dc41daf + +Seed = 6fb79c668eb6e0f65a09135cdd243ce205d7065a0924f86024adcd111f654a6dfe2e398a12369064c2a217229113e570 +SS = 8c970242406111e26368ad8760c4d02a8b28d17d138210adc127197b50968140 +PK = 16a0399e8cd8c32ba837913546f8deeb +SK = e60c57628869c3631d6bbe573d1e3afa +CT = 7b976493854fd4932107de54ab0d564b +CT_N = d0bf2e1d6851378cb5de83ae9b443234caa01ba58535242d0089a744c4b12753ff8442966bf563f8972cd0426e815a34883f740c6016928ee070291d8efbbd326088f30d50550b061ccffd9922e5a30468b62a0ebcbf0aeb74f8dfe3e130c2b1ba83e47075ad519b94c21f3c06078f4645d5444b41127dbf8ddc67a8cf440abe95ad1d586a29ff3d8a4d671b05198d2e2eaf06d7f0be6c550f1c544681829632e98cde071b1e8681c78a98081930d1c9809a497cf409bbc67d1d8de8b9a3e8f5ebea8fa79538d65c0176ed2034d74fcda38288c36c6b5af134eb9e60ffbf138fe5d6c0378ee891e69bf5bfed3b1614d25b58d3798a7eb3dc7fe42f1fa3e30953d92e79d418c741e659455a618e7a5aba4f59d12e17d057eb698f3c2f9a6b1d4e581d09a9d6c1da5f5f0ec69f8463d922b185256bfa5c751e0321d02c58e4284a021b1cafa50f7339d5a5b602ee59bad99f09dc0e282dab539cbbf970418dcf302f2b47cfc1e97ae2a83885b7ef6b5b65e662325644504338ee139ecc4b4308cd8aeceb0e9b40affdeac0e02795b54074eb446b85cb4a57122079bd7c34f310d1260efbab0f4a7e04ce438d624e25bec7e0061e253c89d57e84bdd44839343f6c4d858edefdca4fa794db91d17445c5f58ec08b5bc58cfeaacb953fb004fbb8f7b1dc1e1b5622be612fdfb1889442cd8aff5e18a75b02ce6f4ee1efbd96ddf8d02fcd2a42bfc8997cb459e2672af4231a75d59dc678a2185374bec3d98504e6e125a16e58f42805b12651478a1ce8df3cae5b0e0dec53ca78b2c38b64d7dd7c9985f518e02efe08ce6ff9b4cc3c521b3c1c0ac40504687af68708bc27946704eb4900ecaaf41777a223f1668a69c7047e9b863afb4ccac039334f58dd132bfd5534da9d45e640edd9e88104ad0455bd2faa383d35c0c9ec5fc6a6324bc1429c539b0bacdcccb55121f247f75ca6068ca915e16d13137fb95eae128b04ddedf9a0f4a17ffd5f2325008ae121e21f9f4a64b4d806ce2d93135968b3129b4deafbe07bd6be34de1a5adebb3e0002556a1392c77a23e4612061ec7148652d702a6493b8c517d1fef8a77d054b19f5af4e904096a1f44f2a71cc51c8f9a20149cd45e6d711693a81bdf62d0cab6a13fd7e690956d61ad6508ccafaa8ac9abc4da33ba55dc5ef9c63427f6ced83c30c7b763c9c66fec26247df9e61bd50ed977fb756301be16ff0c5b2493c5f2af5502655ac884219f9aa8b9ff7117eb7d528a4aa7d1c2b4f7e12bf37ed958c86141fcf3fe7db5325e27c1849ffb64147c278e45839ad38ab56711a96f188f9ce92f4537ca3487a3d840e9cc08407010c55b6db9d0ee9321ef5ccf49f2147c1aa063172f6e33a267308ca42319eb85dad94c59816dedb2142446bfd610844ae6e69c6df23a55341c1d75319e649f8d953569d54521c885f8d9f3b41d9a72da259ef17684ac9aabd56b4eebd14bda652e608c9a192537198dd6e35c0ecfe417865786b6e5cf79f7057cf5e3cb2eda21a9fb6fc8b9ecd04 +SS_N = 4069db9997536757c9b12f026ffb3d02f435559df63214711750cd04b1f05d5f + +Seed = ad4d2d306639620afcb3753a137f89331836a5adce1c40bebe77b82d43a40d3249000c7aa3786406d5d5fa65462d1a57 +SS = c0d45764e3dbf0948b914d6f65c92bd0ebd21556e5076753af48df8fffd6badc +PK = a808d564b604492f923ee5b0f9872220 +SK = f099de1ce5c6c0fa7df1b5b18ab4a33f +CT = 233012540da1ad2486b660225a4a4296 +CT_N = cf3125a6f30cf0d78f4b76f6c6877dccd180b2b8f7afa1ed7326a18123c0b20156902bb1fc6ba1f4f41a006b15e41d18a76440e5e20b2375665806c3ef5663704dc098d1e6f434a56f5f7579b860284fd8dfe84970cc47ef1afd9e4e3b80a3ec8fd739cefceff6567dca0944ef62af068298afc6723f196b4b71161c6177e2e8ea4a0f9dd37815b70d2d71a2cddeae73b28c9ec9c8fb5727eed252fa167543a77004f94598a32152a22bf611d275d1b249efed12b22269edb10718a49c3161b4a387a8654a509f9de7c8e1dab5a5d13c6b5b480c87a7283aa8df023f0bfdca6c32b18b7ae3f1f89bc22261e1af19202cce59981284d8094bc146aa0a0bcd5fc31f5c3d22f8e39aba1c4f5384e9018c0afdaf395b761b64afbefd50a89ed99b820b09ba286216463213cdd3e5239f263328419d6c8f377896ccc6d49cac9cb3b19a643991d1c1e9a3b3f8482a031f99e1ca839c0339e8141eb48c4a93115514cfadb9c47a6eab8497359fd92ddb442a8ae5b2776bc0ffad5d399f05cf72b872b492abb55f8a6c0c643d8fff627875100662396a849bda878b90895b93614623563afd24d76c9e02a85065e9dba056a342f0c7f516a37235023ebc18e8fb8fb6a675fcbdd5631ffc6930d7735d74bf7d7ceeb79c1d6d827ff1af5fb25b9cc20b9387fb11bce9c8844d1836e65cad1bc3f5087bdeb4cac03de28fc6e31070631f36ab5526d3d2f886dca8436122c605385985cb5dee7b09ba88d6948a7edad4a882a0bf6a38f9ba0e9f0dcea1fa1d19fb68ddf43eec7334c20ea8c7b1d633b55bb3fd43074b5d725a0b92cbcbc35221dba0142c5a942fe841515d191de04ca0a8540f15daa5c5b43726c1e0bac85fef0068ecdedc16b2e7135e1c24677439d9675cac9cf64fcbb76a18c1d098336c76cb5a04fd2ac395ee7a9635375c6ffba51f9c44042ee1df0cf368f35bc71aeabdec02cd35c3bd0b5943eb1d99a8173f43a789cfacea1ce6f1966e869498d097df7dc262c8b5efa22e5ab472461333a13bae03bfc8fec7699097ee8574ecc0e91224c8a2c10eb857325c627c197abb8ac3fc3f579f0eddd32a6c98c3ea07a2a441b3d996dcdd304ee23f04c26d68b1707e3dcaf4da34814caf447a3009a563b67db3e1b2903e0e56916e23895ca0477927558f7330d4a872f08ced8e63f2332d07a7913773dcd7592e234cb715e6a27073fea32461d04f92abf91fccf745fbbfee40876ad5e5bb403f5bdb0f4a0fef88b1e840e6c8496ae0a70a8c968116e70e4e10957264779c27b5cb93a15de977622d62cd92c723fedec110b2886bceb7f9888f426646dcf012a64c3ed2526fc81f2f65b0fccaba418650fbb550419247defa6f72d01e6821197d4d4247f08a283a6032386c48511fde52f647b79cffb6c71a1cb0d225697b25c95ac5538d9ca850f1762de8e5c88c404dc016f849612427e173eb691e76e4ecd1398e351fade49163620c9675ee6e8b100650fe9e096032735e49376e95ab2d82e0f3ce67ae55e315dca3 +SS_N = 488552101a21c9cd873146b83fed69d26376f700312566ca6b6df07bd5585d59 + +Seed = 950684cb360ff0c011fd02a09a273c9f023d0a34ae0aa338c6f5283634ae9bef5d100bcd48f6577e5910beaafe6c52c3 +SS = d71bd5a07c158c130283ef854516d290a46ade09a63831c7b83b8fd0724c8fb0 +PK = a3f5bf828d580c8f972f16fac0d4aa3e +SK = e52c9043bff543eea1379349cef36ac6 +CT = 42cd190aac7bccda5c2ce63a565f45d6 +CT_N = 2955adb5e21a1f72a2e3cb633a3e0f42fcac9096b0d62e4a45878ffa0fd6bdede4118fe325468a6f2b7e91cb6231413354c4c655d9aabb9d336064673f55857d2e9b0835d165a3bbdf8fe9de7e14be2ff03b0ec7e517afcc8bc682f6d6626491a9bfeea98f961a2a0740ff32da198559fcf5ff2c38695d17dfa8925569c13e5e0e7978f6990f9feb3052ad995b2405a010de041b36ac3c28e4df6b64e6bcc43808e63e1e4b76de4a7dca791c263f107491626a3054c229c648a89f27ced4670dc9aaac3fb95eea408833c318e92ae9f9719192b6b641685c6bf900ed4108245828aa1b7a2dfcc6f882701df533263c561bd28bc3cddf84ed00eb20da09f0089dac580d81974a75e48d52e1449ed97c5973b99a5a5a0980f4b140412a42312ad1a07f23a6d0b004437248e0de79b6e58f339284aae8c365e33c4a757d59805538ff8f1a6b6352a319291bd62e4133a8c3537bc378327d7585d61432c8afdb358eb785d8167bc494dc02dba635d562800a6fe345c7d52f6f78cfe00170324349bc8668ced5596b480658ac7db29ae8193d07056d2077a7c39414bced8f4e7312661caff6bd4cbc9a4722b823e90872bac85d808e805d6b8e7a45d90f904602f4a38e2163ba848dd5de4af6640400c8db59ece3537ca6e8de78df4d59c96f7cec9b525a0c0a784bef4b800f5a22d0d5b3441f88ef10dce8bc20ea03202e4393382f1c688f730b4991e97e94d404b787fd15ab213af68859f6dfa3946ee932fe944379d4dc263a4ebc175a99ddd83b32d9b7f848fe661c60473e8090e005730a770544e8951c566bd81c41d36139849a490319b5bd218d292dc8d49fe7ac7fc90bd999fa4efd83f1b18dedf39cb861e9a861d0c07020d6dac8cc8b8ea57ce890f295323141ee64472a85425fb6b860c25c976d70aaea1100c664d90054defc8caa043ea41f229179dfca9c525e0cbd3e43f797eda02f2072582a8c3fe23883d6cd28269b056e404b99379fe0ca83a0dac9ed33980dbe3b178275c8e0500ee36793e6199df4684584cfffe398bfacd28eac58bf4d83bfe4473cf45a965ae32aa770e059c24c8b3e7c02bd333fac5137c0b5bbd34b356ef368722959acaf3c6d042a2f21cd2abb059519cd18b2016997ef854cae1def19f2da5bf6df3a80c08caa17fd68e62bb6e928821c6ec0b9de6fc132b650aa1b919207a7759f87c6381d454d669819758533883e417fd21cbf44706a144b0bb183c8d6d5607a9ea29d72fbd8f9a290b4990e5dfe27c0989a4a10685903404a9081fb9af610983c6101f306f8bf96134f6e33168f583043b42d5df7f6a907d1d0cf3c8598e8f3e4ebe791bc74965aa917527980dc37cac0a1429e9bf310fbb90e6def45086c3fd4cbb6d287a00d7ccc2aa58ab9ac8926f05f11cf8f6d25097b459821fd55dd7a857fb84499c40609f598c8672f3397c3437e4f423099364b0d10c519eb68b554e811a241eaccc73d6a4b628b528022983249c8f093c54c80a2ebf512010e6ed625ab32c0a10e17 +SS_N = d74b5e8aac49d42ce5a6ab8b0203a96b2ede27a8a4b5f50314fff966e26efe38 + +Seed = 0633ccd19471803e0ceffc7a11b2e7b70c3329dfdde5be18160df0d4c609900d67154893921376cc4b4b8c586e3efe79 +SS = e3e4f4e9d4f5c9ae03836bb9266c50b033285ace9bc56f73817ce19679d1429a +PK = f421810fbec3e94ba46c879d00c52e18 +SK = dedf3958148d95251355d6a37d119940 +CT = b8759f939ca9bb7953c3a8aa70df3f1a +CT_N = 954f5ccb184415b8f504f5107ac7cea3b97f2c09a2fff1ab075413c508057c44adf9a29acf7df85ac138d2bd129a00a839336528b778eb1865cbff3a4988ea04ee311fe3f4d17c6f5aa2718fc760c01d3be4596fc9a2bb456e322db7cf68bac12011ec1146b287ee7595bed6dc689f91d22747973e718c02727a8947cda37842dd62b573477230254d1539e7f6fed73adeaebec0af86ebc19febcc10f16de0e6e0aeef839fd4bff66bfd37e52c486d1e1a5e3e74ee75ebdcfbee3ddcd58b19330d15fe629b62663d482e752484e75cd62e16fbbaf52c9039a86f4013c1da7898a6d685f593fcf4ec738c6daa2cb2ba3d08405fb500f93681113430008cef55be62b4464a2e8c4ed6ad49aeb1fe7321964fd6085f28a4beb177b68669def0bfb2f6c666fe3aac2ffcf48068f3264f87ea8e0feb29e5baaac91e3c8cb7ed6447dfa5611b55040d33ad144f502b2d93ab857ac3a76ac609634677115252828c5feeffe26a889a3bc116082f1d511c95364743a10664304be0f4abd464dd64ef9115d814928eb5bce0892f627429a9c733c1d999fa46fa95b6fc4bf110d21dad1b3dd80a5d0f44c337515f661743b0852e343bed5b59d8c9c9a82e1565a5e2ecaf2fb3069bc03656e108dbabf49914a34241dc2076a1e1fd0d9a93408c4c90e48ddef8835fa5121d084610e4cabe0cacce748982cacacd4896dcec53fef4419109fdccd98c25438282be3a2a008577e5d871faa26b4452e353318577a7c749d2a96a1a45878d8eb98ed004cbeeefcc9c9c1044651f616ead2655f21d344a639afd6f925117c28458dd0c7a0c53050e4ee00ec48d3f63e62294ef3ac43c5873e82d4f557e15cc6bdfdb2c12f110ed235533203f5bdb2ade0d5bc19cac1a4c684f6fdc6b54f30186adccb9b8eb2ae1ad4e0632955ff386fcb23ebea29289e8cf328e12138cce93cb9a4b46d069d51c8cfc69428156f67832ec0df7781e8ac6bd15e5b6783b7b21fbd7eeafb791eb4203dcb432a40d0c229623fc7aa00f024e0fc61f1394bb49226e831473e216a3713e04a35ffa3fbafec5e8d8de3cfbdb175efe74bfaefe5154e6b9320d6a88bd45f83093b8654e2c9896f3754d2643cb3a6771d3a41d72186377c632f82c9477d7a75f38a93b030ec7f9203a4bdd971b91bd2f7866edff24b33b306449c86079685dfa9dfcf3ba397f71cc35593c9e529cd646d03c2f48a3dafa4f83ee51af9f9515287b238837b9ac3f1decf588f250cfd180afad34891b56c99fa8c45b38cd1f3d17a260bb8c148a3754fb22d99133da518f156f99d681264f2d5f7a84aba3f628d8bf001b78137d81b61eb95d14d34ccaa289f139718802849fe3ace3cfd2941606095aaa02dac951f4b35557f74734d792269e74896e19ca1115862529c60ad71fac312c038f72bfe6e42b9d9bc8dfaa4ed65deec76e7d6f402992a9a6cf5033bcf8493106cfdbefab830628ac576f53a92cbf40bbd49aa502d2712a28f698965d8519fab8e8621546b21b9f22d90a872ba757 +SS_N = ed85aeac87aaa6aa95b9e9da447dcb6fface710af3a20bbcc094bc40509f8109 + +Seed = 2605426643cab04b2801416b3239cd046dfe7ba59874a3a05c5b32a4505f21d8b7217b5ecc8646fc6a845211ae4bc708 +SS = 73dce41a9bfcc57ebeba4a9f161800f3abf1c38600f3efa9a32eb8108819676f +PK = 085f77c88b357d6ecb466fc38db1065e +SK = 4bec5250632b82d4c739a8b4910705fb +CT = 9d2a502bc0294e3770b930200e24256f +CT_N = a5bc0cc690767b203da8b72ff28459b5970fde7d2b85ef05852c086e8cf1c52fb4e5c8a75b8766446900419ba87bbeb06515ac7234eac06b1ac6070aee288c6a549c634397b821233bc340d133e79f22be2e1a0220bc2c29f8d2d830cc591362dc48eed220cde66b53db04cf7ecbec6ba68a1099c01ff0a20e1a0e380782afc83ff626f907758d06ea5695272c1bfc357b0c9ed4f899066eb2e6992e780fb9b50b6810285a197a0441805618870317c55323c9e72fb01977348ba70c9096072e9b7f26dfd099bcb0dc6e5feb6925fae31673d1f517da79db0ff4066fccacd0f9411e3e83af3ecda4313147e1ba774c9d3f9b5c702c20596861f85183e5a0689c2c63c61a45116a2bbb4ea0c08598eb30526a83f4875084b9dedd864f6ef179768be340478c0d1374e2ac46b5626e971a2e299f3f2a6252eaab43741e259ef18217bb0319161b9d90700c3549ca4f803d4c46cb25463c6e9907a3c918dcb74c2b94f4cd681b9ca7e74a474f7f88d3cd0964920d470532c0c151d91128581a8af55bf7d8289be3a2b8e08f319e7dcd658a64296f7ba919acebfe275aa2455648d70baf7ce15bb01977b70efe0a1a82f7922b06c64ca15d45c11d3223d289da13bdde901396feb31e059f94be05786ca9b4c40454cdfca4cb85c56ecf529c67c6414436632c6776d8d87e28866584422b19270a9d2a0c548482cfacd05351af60ac95888dc5de848989505f3f781aa388607742a29858aa85b089431c1e9f88a9c03320cfab1a895c75caaddbe110e372fd2788eae4b9d7c78309b438105f809a9f1a8a0cd0d1b944ad037a5266f157eb4f56222131bcd7c0d4d93714d36b017d946075f44c19168897a25396679c73af50f5ad697f1481e9e456f9e98edb0929919e8b1c5765c5309b55859a48bb2aa78ec96e0e7e22f549694560ebb359309a8032e84af4c1d6f918fc7d575630d7125f73979b3a2113af86b125d3ca574d4be0b6193ab98bc2628063de2d14ddf2edfe412452b4d365ff831569aba8e3ea43e858b75e150347299c2dbdae6930110bf1f217588391b7bfc8031cfee0db083a45633ca609a3e3a31f6e7a113544f790869701efe71c793210c9eb4e351f79df841c55500b54a8a86ffe183c1be8ded8f878180ac311adffcccfd21da927814596ff71c256cbbb5e85c78f439a790650c9879b0248007f79ab42f9212a37a350bfb9cd207c971752927d00fafe88eb7a632d6a73d5a499a6b8404d59bb617410c326a8c9014f0eff96555a3cb190193e4712ff125993220164ad8b21fd619ba0da210653a502174818150b02b66ac0ad5ea8568fb907898775a256c8bc9b2c9e7d8b35d67e26692fd8fb40fa84740848c9ff4a7ce248da0994888e3a5ef404997f4935ef94db37a33064c28a6eece82e9558f35f883cd2143002f52f25d004541b7db59039afc971462affb66a1cf4bb9f5727060742320f2cee871f5a1578e411a9825b010ef5b1a648f2ca5c9d19aa480afe661acc8c39073b5894882a0fc857 +SS_N = 0ebddaca67e41b3426f65a297d41134c499f6fd9f6c2e1df45447c1c717212fd + +Seed = d3880d1b7802b4a3277687863c5a248befc95d3e4748403f3bb61f83abcddeae42ae6c8624812fd38f463122d99d59a9 +SS = b4e0207e34cdf1cc5cb4f563b22c3eb212bd6b95f546ce7797e268fa1ebba95e +PK = 0404336c3a5c8f9e6921a5fba76d3799 +SK = 5faf51bc7091f37b0c0ef9989c4a38cc +CT = 67ac6b0ba01198d7433e9115f6f91403 +CT_N = 9767d90bfc648f8e99ab16d4b307eeff2bc9b577a235ecd5efd5e87dc8e297cf222363879e2dd47b01a6df3e5a004321c4f1b571376c2e40ee8232e5d6b9f8c59d647387549b908715887344bc43276346ae681b0123b9bbf1a6ea08b776866e22d5d81b43090f2a38dee3615db654edb0bc2478c2d13b566869f17ea78e57b803effd14d78a16decb42118d14e51b63060b8c14d3761c821b71b5fa724e89a8e4629a454521c00ec3af1fa0b709062475f0ee942113d654a3248a82904047e02a16264cd7dfccd1d10f1c3d32634f38f58506975b54cb57253d94dac612dce59a1f5ab508e6545e0a1d7b75e14e0dc92d52e3b4c2be5759d73097f5226888ca3b05264eb4bf942d6a93f5aa8a8ed3f1a22cfaa701c19779a9975e29158957b8395f126e74306770f48dfc7104f5f410751105a89450dd638bc85ccf30e05bdfe276f5a4737fc5de75e7cfe09575f47a00e57c596036f93c5907e3f262311382eb8a7490f0502172b740c8df226d637e0addc3671fd4804b150127c0fe27eafa23d609442c73bcd28eb7428eb98901f63505a58cfbe4c4c42190e83801acc741024b189a9811f244d4ba2eef3ad661066e00448d97ba88bb9d0113abbc327d1fe3353045ec54ef285e9748c67375ad6a6fd3eb85f33d5cfa05c1edc1f9bedf6c590940a0d7c602c78e31124928bf02478de67f9dcfd350eec85974abbcf420fbada73cb1026310a4309b774b33e4765166d6046ed27da971e8c7d98c02e2c7a015a25c8d695d01730980be2c7b34eecc988211f7e51cde8230f0f713ff99106c510bf9f9cb8977ceb046834046218919b4861c9c31cd667c98fc9442f4b798e935c7c59f40a5b0e47d555e67910eac45d639e77b95c545f9825e54db18401f84dad11a7c29390a15b34a18e2fe78b914c44cbd8822a57e344734fc127f4e6a205df872631bd2c2fe40f4a91413a18100aed952eb282fccaeb33b704a082c80c4310c86f1b45bd9500f91b7229a2718d81e420cddb5401816a60fd185531d453ae0db1c175b063cde3a8c7f89d9378c932417fa280d3a48c9cbd61fdfc330a905ed3380926a1304a2a5753345c0387af9524dbd56c0d4ff1ee4af85e9c28c75b1d2da181ccbdf761d5426d8bd9faa3d6af0ffa502569971557cbbc833aa7c066e80ce83b55a3ea7a425f4e0fe71060e1bc19433a588ec6b2e0444272c899a5ba9903fe01f7de7b62476a50599fb62350b8169f7eb55d041be6cc979b273f25912157e4e39230d9e59e40fb81e4a5eaeb50cec3b29cc09d7c7fb663ac03d9545e1584adc04ada61bd86cdd03bdce5879cf6f96d80a4f5bdcc32a85593a44a87f2b6737f07361abcf205e28c2e7da31e2ace99d9332c0291dfb8c6125ad1062248b8d1fe31e33db661140dd39281e18041ae1a09aee24a6deb16c8829ebc5cc92aee1c69566f0078e51d0b2f0f70cc7474aac1b954cb3e86450eb783c8190d2bfb3608525650b489f4ea487ac2d6c9dd46c8080052cccb87cf55bb075d89eb1d907 +SS_N = 4a8093c2d63475387bb3edfa70363992dd477734cefea291dd79a5c7819d12d0 + +Seed = 343b81870e2721dd75ee0ad7fdb269eb5aae0ae83a6316ad8ece3c76d3dd3cc391f1b12b22e988c1257b5f56d905a06c +SS = 14b5d79985ae985f3b03eff5dc1f15bd4fdf9cf74563ca65a5ef602bd14dc21e +PK = 74e742af27ea06511d3dd8e0b4eeca58 +SK = 009d0bfabb06608d5b2864fc1a03c2bf +CT = e842b75c8cc87732e94adb9ffb0b44cc +CT_N = 19b46e942815df5b1cc8d669d0644cfaabf9da05e35243c9c489a48e8d2c470ac68ab3c1f70b3930ade530ffa91af30f4c1757fc50ff706d75cabf4a3c072143f5ceace47aa094be5031859f5b252097c895998ca7a4514a0a4bd76b6707bb7d7968e7529c26e12fdc29e16afc3345b71953fdcee48190e9bee8d6df9f4353a7e12bb5402c14bef998d6edbc74702e0e0157eaa6b048dfac2f7a354408383269cf8ffd6c88969768e5ace986c2c0f848a63a2611230df97816b354073a2d1fbebc98d9c59dfd2eb1e4789ddf855403937d30f8df54b24062fb77bc56803dba2337e8dce2db435e701ec2f8464bf3168ebfe4c71dacb171b43c8f796eca800a638d7b2dc052f913ed9ce08212cb0124f0aa36e46d898a6930df71d04d785e18df4d2a61b426ee19e7abb85cd6263fb43cc9b0bf3a7b9f34b51fe4b0bb3828baf98fe0b1baa323b64231b0ad863f522ebe3b7916f298381cacdd75b7bfaa75fccfa2f1b3684e1fe16a9df25e36982ebac878f6eb45918839f1f0c5d13fcb6dbef1c9cbdb72cf5c38cc4e79ee08f5c7097fa6ea46a19dd6435bc5170ec8424d34cb0f7b96c73071618370101576bfeac0d288c2888083a9b697eebd9f77d499f3d4ab3d612f3d529e3a04d93675b5cc37b07dd1df060e630b93c05815bbddd6e798a1b52a2a6be4b9376e7e0011e9bdf3ad5477c2b35e7b6dfb5f6da8605151cd3546a57d89a70375bc4af0108823ca0350687a159d17a7e87766681f71c9252430b29f72deac7e6f478e3b0d64d7d74356f0823bfe72a8445c3c2b5ad6ba1d1d3fec90ab79243c0c0a4f14a48ade462c47c89ef635437b937f30686d47489467c847db47faf73bf2f95dddc3fee9deb5fa5107a20e683396c21aad0d83133e34a026b5457f17e21f05457e4b489c72df3dd950f7e820f5f2aa0a6409a237108a35efeed99ee11424a79a1aa8ba9ad98f4f5eb221c9b352885653dd062cb155906e07943bef64515b9a61c2aa09385f8fcc20df8d090febe6a63380aa2319913dd9a9165b85b45aaff8e2f6f1df15f6734aeb5ed2e4dbbe6724b2d1323825c2cee8bc34a06cf6aad70201b26e13f89412568acd047a706b45b401fc935a4cf74f520fad7aa3ca75ca449657274cd4bcae3cc7e6246c32a248d741e768224d0964162f821547fa6bc10d6cd511d9cc458d23c5edf78ac3839ec7465f61f62b3bbc9cc6113bd866ea4329eab97bd9bc83656c0ba1b5a96207dc3bb7f9a922d578edb6637ad74c3833aca08a3abf10a318ccfb227662c0990b1bc2a19ab519a9522b727d00681f821c175d5415e2db15b89c108fbed0bf29224ee1b0088ab74622bb78d8abcbcead7fa28dff83dbfe255403d40715a52d0cc64904933214bb6b5feea8e56254feb7765b978099d33469526f0113e6dbd52157efe97622e4b15c4034cadeb28d3fe77408402088148954a321dad626b988399975e6d647d72995985b4fd8973cd1e8435c489d3c891b0faf2174957bf620717fe273da7f5df3cb26931f +SS_N = 1daa5f6b37afde33014c852bca10f898375afb55a8699f2e9e6b54cd44e76c91 + +Seed = 406d9c95f9813ca6a9e6071d3a7a63093f9e00cd15ee968c3ab28cb7368699491e5662f6b63721fe059d50295c3a7516 +SS = 8d3e3764fa7040c34b676afb42b92108d0cf6c9944bc05f3ab1b4a1a6053d1ad +PK = bde9d564680a83429bf400a3b0ded656 +SK = 066e215a4014b4c322283f3bbf5da7b7 +CT = 076da91d99fd28324d6a257259b218f0 +CT_N = 48a940fd8ce0a7105163738acc8abebff47418a4fbad5d680e4d3c6c597dc47f268597b2c4c67ba3043bacd853e5ad8a07158f518d5b4d5c59e76ce44978da79866a7aa968290f550b97e2588bcb6e15a1b7c7dbc4b2f06c2b51723ab3522c05ed6139b5ebf4969ab80ea9e48b6159b79056ebdfb152a1d104b9652294bbc74aa482c7f5778c460d17bd912dbead475d1737afcf6013bf9e20c7fb697d4e929a9d1df5a3a9b4b89f1c0a8bd6b72ef59a6054cce9e6dc23d37e25b63f95a709276a3329843ce95131bf9e515e0f86daf834a11fc2d005b3fab7a99b8b52efd75733a2825c77b7eb1d6f199843902f6088434d92c104e9a606abd6c91b4deb3aa5114bbb8cf94c5008b3c66baab6ca51569481207f27306f10d2a4e308403f75d5a62eff44d9d69485683480bd32b17c0c3614f7d3230686cf95e3313504afe319358f670ae48ce542288c139e0bffcd4b289e94c61b1cc90b3f73b39a8df71996cc8dd3581c49b66c8f3b981d14b8bd9f94ec7f3368649f8610819008a9127374246d98edfa7bf46dbbfa6c9781c6fd09046c775e3c682af91226b6ef39fd85e9571b39f4874b9133c63d27ebdc426a848cc5642098cacb641655244dd7262835efaa96ef236821915e87e1372656c6f882c11f6b9570d29e47d29fb40b452d8c98e2eb795e5df84231475c83ffd9fff771e12ea83fc789f9941027f0c9eff1d379ffe1abb35cf05d5293506f99278df98af82586ef33541527b47362d0f91a48e1e0d5e0000d4591ff21095ea93dcc1b8e4a77b23d19b5999ce4fa64325e1be4295a54819b1965a7b4691bd290f3a08ed3f053016e0a745e4872a9bd7db905d0d2702b4a264db32846f547d9ae6627c27ac4865cf498520c71cfd8f983f6ecae28d4aa8b6302727e65e21c94dd828a84474209737df2a96438e8ad4b7a528ef1ff4fe25e47ebcf723dc0bf8bd35dafb2d99dd4e104e26f8a0ce7b8cc8ced69db54261c3f86fbacb3cc443ae6baa50b627678ec9bbbf38711cad228188887ddbc68936b926c353db32d934f2b40c76750e59dd73c3c1f5d44ee82976e375cfe4a4989db5ab779126304b25c4c3afc460235fd123706a3f9f80b27751342d339aa15a0179dee4086a39cb0b4c4880340353acd36b31ccc90abcef46e986d221d10c64e7d2a6df1306e35b101864da0c9d2adcbdf869fac6c25af28268e8adfd24970e0be8ffbca889def0ab7942a528da228012db8d4ff77460c4bd0692cf398b848b32f0b93168e4a0854bcfb4178aff690a7f2e985ca4ab50b9dbcee17a754655d4e9b93bae575d9e07fc0294e26d66a70acacb83cad0cce4ef6501c8f3dce246d62a3744643ea4f220296f3fdbc1bc489935fcda5828bfba25126a983eb5ce7d15a9c33d5a7403649ec5336425f88c3547b6622ae29a23b0e4f6d3cb56006b3097c9c5190968404e35d4c9045ae25c43417dde753e8abfacacd98e93e3dba983512366d3750cf5837b978e5c66146e70ab19e42ace110c2110d0c24785f148a +SS_N = bd19f7969014eccf2e67c2a86ca1b3f48fa8a0a892118b18e7e93a40455da72e + +Seed = b3c83c13dd15dffe58fdb6026d32e33e5ef24b094be16741dd5b587ea841ad19b6f026a127678849ec1b459a365fd645 +SS = 8bd59170593544d9eea93f4c975d52c6787003eab0e370f9ed97c9b1aee89570 +PK = ab1d949ed7cca93820e64d608a0a8a24 +SK = 49511ca898286bb662415c41e9db8e37 +CT = e0e24a4721383e91dcc0a3ffa1a86eca +CT_N = e66b5d39721e9168ae6958942e6baff79da05cc1ba00ac76f49191806b4c1081f40d2ea5acef8813e8ac3fd763e2a1c4b0155fbf5117c35137320a20c05c9e9fd3c09e76919a2b3eae942a25410cb59eee75ae1d60cbbe55fe11d05ef3b5de8c7c81b7df004674c67b8039a580d70582576355914804dedbc4d0ffb21f40acd34058bdf08ab48d51850a26ab79dc8222f3a1be18ac0bc6780da8c1bd099f7384d254adb683e5bba9897260828fec7b8ffe3086456bce9f26b20cc22faf8618ef7b493ae8c940c06cf6dc5b534c2effa51e51e6153bf77aa8911532b70ac2b66c5d916924dd36f3268b09975ed08cab97097d2d268e3712c249f41531e64270d9ef29a44e7db14bf4d51dc937b17922e6dacf3c18fc8aa583e5ee6c1c6752e242306566fb67e06e7e4564e7e3606e7937740006b71e69fd9c449bdf915c80042af57dfbeb7fffd0b5bf5064b0cb63562bee0d4f9a3a6e0c53dbb7831399a0b7207362cdd695beaca092ba797f7b7c2a32a7c012ce63525d534cb7ecad2037e4e326d7bd5ef33a5f643efdad38cee892c76306288b630c622b3c192595e4c1dc3cc581d1a25374e177afb13a94fd0a937c6b63730b986677bf10053dfb07c6c3816c7f0a491b9de173a200a330f2fff37f9589dab5e2dc7563e9120f402da8724ea02016f48d59ff754174ce6cee2af27e581e82abe56729920cfb778f11df83b7048d9eff1d2f7ece76dd839172ac5b7ed17433f4e9d7119d1b3e1b29233b3696eb2f4c57fbcc8e39847403e56c82fa47c303aeec6a9947f6670627d04d32a4a22c667432853c473362f9f65100c9ef01fb33fc2605009d8bad5c7d9581e6f6ebe38e250060f9ef990174073c7b34a7f144bf4263f6b3c240d264c3b203abcd99ceceeed4610060c8d109085d9643646ffdc9e89c86f7e545d5dee4ca3220d4cd04cfc430ed3ced5f6cffbe1962fd76839a76cc971319dc618055cc8e3d41c1845bddfa4677a431d7a1d53e67b99c9ed3775d689dc48b29ab6a2f77c6d8f10d78686d818818a5676806d79846b729b34ede2bf06d78d9b11fad507a2e563d3f0f1b3fbeb09b0a30bcb4c7ca7ea597393bc6373faac724e97db8e9933ea42a2db8f57156557bb0c03adb5e362bfc1a56161602ccf6cbaf93bf2e6d5aa65f89eec5ac7c4351be897694483d4505ec98f31e5fcb020cf2e00036bccafb5980017a2cd0f85dbf05b7ab9193f4a6e01185f85b500a0dfb3593bf692748e1a2aa28af90fbe0a366391ee3c9b05ffa39f6718ba101047963e12f5fe6bd29cb2815d64a34bb6189240d28109da2dc80e26de2f76d8f023bbc04bb6fa3dcd0ebfefb2e7e67ac2d3d074bf63136346870512b8f08b02ff823c1d70b7daa01c0bf72139d6c85c034ab927a3e842b0eaf3ae35ff975d6b062dab4141b0d789a0b659a90cdf78fd2788d973aa3ee6134f68eec21801fb89e9a50ba8197fe8219deb5e04a4d62fc771f59e199157d108759872b30c08dd60d1ac45df96c4ccb7a24ad51fb5dc60b +SS_N = 3a4d94e21403aebc2ef05eb000eef6ffbd8227be82d4a75e7bea9e7e43b50cf8 + +Seed = 937bd532ff7c92404aca9c2389e314f72d780234e1fd930f967a724937204c59877af25d38245638fda72b0ee74f8492 +SS = bde149f6d8a91bb8b1386cd9430fa9ad5701e6f83eb532ff6491bb2ea4de2104 +PK = 0c7fb2051bcac2a1674d739a4f6e9006 +SK = 6d81cecf0cff815aa584979a81a8dc03 +CT = 5dd2db711ad5b225deb2b4117d6a9309 +CT_N = 318a79fa0fa37fc36fdcf69bd4b7b245ec6662d4f709350d537c75982264347f54ca42a5e1f644bc63a4c75d59d2dbc08d585a4bda29e91cbc6cd6e245209df1e8c5e4e94ab38e752ee403039dec5cfe7f06f3998ed6d0af50f2c6bc5891c68d801e0325ee572bf8ff7065507d11e51cc482e9e787afa855f8cd4805d58eadf79d08a132d2be9348404341aa41008276c42575a12af3859dd602208a289a4982b43f29dd1a1a25dd9c55dde14ccba5ff4d6312c3ef1a0bd632fd8fd3306c15d723dd6da1f8712a11369da7c221519f75f94ad5cbc3f7089cfbd041eae517943cd633378cf456e7bda554bf5e9338ecd753e3e09e644dd170e6a32d720e577c9b37651f81f3c90804559cfd3872510344e05b9af32ba6f3ad81453ef3a80540e219acfe260ec27cfaabc332ac7626f05187ec616557432f8ec73c44697eab699fdaff19fb4f035dff9eb0d94b7c793309ac955501d19c3342d020842372bb92a52c32f37ded2290499664fb894da957e4377ce5b2f767e0d968b801b3f1d1fe759d294d78a563c17d58ed70c9720c254d305beccd571c11b80f6c1fc0c68ced79b137328d0a9f759c08f9e7393fb9f29994c9e2376d9bed278f3013a20aaf1f47d4ee60edf53889755557b31c066553940f8a399f6ce9f285a387cb86f3acf97044a32761fef00f7c6bdd7d6af378fffd254b86022dbdddf278bd6e0998a8ce900288e70e0c566ac1ec22c5e42195299e90de0faa6b48cab0ffc10e2c3ee1765d162f7768835c704ebe25133566e401b39dfca8267779c649cd4d20eea519367f46493462d9df58e8bab1ca6c7cf13e1ad08549d4865e3a99bf342b9ad9cb7816f28ed7c522d671b7081994a52a9db6ede9476b3dd6fac43565ec9d1a086e761ee593c70445016da49570c37000070eaa57df1c5b024cbf0aaf4764b438ee9bfdd8466cb75d884cd7be31c3c6589d291dfea06a49437c7bffcd3cf626cb143cd1d5704b1ec63add7f3daf1b847618814ae6a3ae0bb04a2b73d89ddb11887be2f2576e9fb72a28d4ce206242223e5aaa0639b7feeb35bd72e0b9895d2862febc8a6d5f24cf2748d207bed579448d2c3cc43464a073b6fa691a5446df1f347a0c73c70a798a3583f0376cbf94394f748622833a2b4983a12a4523d7989f1b772ed2369442b44907d2cc70b80dbd8b2a1d7390ec826c178ec7bde7537f99a2cff88efeb02af5a9840be9c1f2bcd6d3947cd78eafcb083a514586077fbfaaa56c3f6d6ddb784a50407df1839b5fc93cb64286ebb7e08a37c3358efd523cc85b941b2fce585c9cc7c9125cf1b8b55c22e94065f8806e298801a3afe7aadd7fdec619892ccac5e6a2bbc25c1710deb68744a5f1cbfe6e77f0e727d267ccf0f378ed05bfaac31854c06c5daa808353ff432272097d881d459bdf62f015609292ff497e07ac3c72aebea6e25c339770266fbdcae805f2b89c36b402fc8cba3a8a9a66e6f449ff896403a8b279d104ca2fc7e15b3b8c1ef7346850860694f65a8220764b48 +SS_N = 51f3cc6c4164454dc47a36c21a4aa9d812cf4d76b25dc03b784533ebf4ba8f96 + +Seed = 075d939507ddeab7c64fb847edb74cf693866bea32c93bc5c129cbd7141c0b79901b26992481236a56cb404d464da0e1 +SS = 24ca09595572cbb8386f398686a14a48d25840909fe47153313d09edfed704dd +PK = e47fa9d80752bfe6a8863214c10ac7b4 +SK = db7837a103afefb2bb46a03de0d26c1f +CT = c4a50b959a221999f1af7ce914e93d6b +CT_N = fea6d5270c4bbb27b421c16e16a67a4c7123ff3d63398358fe0bf031835c0f1faf41ff5ac346052ef8e60238eeb02511db8f1027885f0e8aeb583f2a3feb859aa2a731b17f5c221f2b5c6e8ef42ce77375f99e0c495f1d6b714de74a0c526320083836bdf76775d0974fb1bace841ad68b336d7b56ea9b0d2192eb1e11b0b4b135c9f769daef385d53abb9e6ee7db3d38761f2feb92628bcb37f94b2b9d64ac40430db4a5711c1b8407989fd3c05b50b5f44d735d1faa394146ab51ee74b9ed4a322ee5de9f44eeaa06f7811e59579e8d008ddfcd770ce290838ebb0640ef47c219a007b1a139591721deed4ed409042ad4a5e537c579749611e3d2eeb7f390061795c4b077700f4e0c16afaf8acb99177a792fc61189ebf2812dd6b03f40f0c3445b807741b161c543b06f8e2dcb778537a987b0b1b54f0c649b81e2c1a0785bef41cf0607ec6aa4d54fdb8933b655dd4f83aeb8c438a85f0ae7a1bb479442966cc6b728fd83845734e7bc616993c743c0b5db4837b3f6fd27c9e9d9b20804b47b93d996cba53388cc747a724fe95e0cefdf4e525988071cf8399adb0fa4a51e87c2b7f7b8c74131d559cd7fcffd5aa5a0b83ca539ca88b19ca8a36a70ab137c8f5f45cef148aa894b9bb2189c0f0f296de7c06770ba2be3a550b04964f6898d96af286f73231d9929151b702ebfac3477d7be1da314732033939dab0563b21520433eff7e834580651a3fc91e3b3945435f0f3f14b54ca47688174f7ef3f5cb750348a39ce74665ad5828f5876a7a0e3768ab5ad52495ce0ffa696131336afccc34e1bf3d4ee7fb536304967bc03fef81abbc664a2ad16dd6b5433796a49fc08875d17fcbfe62d5c5ef38434bc30fd70adb2e8084b57db669cab2cea18e6f186d02713e6ec927e5368ad2e8b92cfd9f7b1cd087f0930f54fd0df8c34d09e1c08cc97be14d73f3d13bd32a68302ca91fd9317c36f5639e168e9a6ac2830177e84c6f81fdc828cda126cf8b7c6d02b59b922ab570f9307c8ec5587f46e2f27521b39a30cd01bac1b4bf434c75db28398120ce14dd30504ebe8887ff38969f670ab654d004142e833e358f1c394113813c001474722ba3f8b6a6d44d0b27c9050f079a050bac05bc9993a6825d610488c312008ed9b92557f512de4312c1c19e25042c7313a0feaebcb2b323df2add9194c811b33986a870c940c7d31f86282aaa318138e94fec24eeee745661f92708b075fc19e9efb805a3e9c14517e25d8a007141e673237611486ffd8e48902e5c9f54b27995786ca12f32a57d7b62e6d034954abe450541551d3a918730b9302dea7d51b19e4eef5959bfd2d0bc0925ed62873e11bb1872b081faf2a1b31ee7c3b246f70dba15d2d133b361791b33ef1eff96b1cf796dbd5deb5de31ed8baee06690b2a91cad664b575c43c68c742f053c90d98fa826d1f91519a1e328e42b3e0f9224031d63f2584d135768cbec5e548d3a3fe386340540cace1733d06cb72dcc91ccecfe61c359bc620456e1ed75846e +SS_N = 2bf50ed40f3053d72445b27139f20de6a0a990db8848822a844fef2afb909c34 + +Seed = 40cc0df72eecc2e75de19c2d9765958c72f3c609d730911977cc93d3c68ca97a28ee7ab4102acf3eaef5982c302f7427 +SS = 5c815348da7cde1a132bfbf51f76f9e5b9d63c38d217b880906fdaeca0aa63fe +PK = a222495dfc27c90e5fda9be64e011543 +SK = 881729e1db270f56daeedcfa64eba184 +CT = d10091e91ac707f9f700ab9f864190d6 +CT_N = 4df25c14e87ed226e6fa40fddc6828687144f92de0feaba7bfda86b0718921ab2230a233892e2a3464cb6ead40a8f9f0d631f9d59de9cfaa71df89c80e318cf8b2e5bc82a1b0284b7f4a6fb56d3490b9d37284d934ae5d6966a8fb31c259d64eccac83d4260ac69d4d751df10059235030ac799b569b0b88b54036b280d3a984c64469987c93cabe45c5db93fdb9b852b9b1a2ac9d72395a8a12e9e3186ca3524fdab2bd7a85373755d384163e3816655a486e13eec146e78be16e21ce76736f4ce8e86176b62a2572a93877a3687518c960fa6a4607b2b892d7b325d847a25e4813bc014cca48ff31151940215aa7908aaa5d004ba5e1e387e7b4b209e8413a86c96cbe0e48bcd04240d629f157662522c1b0ceac62a46d95838815119153f02caf7d7b2c66eb2768235411ab94dac05c67bf48922674fda3052ba93cf5cf8979ccb026197fdee948bf2fcdf04ece13316f76d8081cd64463224ce06cca98fdbc45e46c8382b9432247611347209838bce85911824c1b0746c22bcd88fe69fb8b9de4afdeb9c307e5f2424f6b14987469728c6122fe031edc8b1375c7dd7d89940a5e01b1d0a64c0bc063c61e6c70ccbb79c1e9da886d2e61cef7f8e3e3431ee8a47822bc62ee5bd74d6a3af7fc210344e19a2165e7f8caef04c01021c69c43550e9b791c05adce4e5942f4e2d510db2d830ed6823a5569bc5a94404860da60c59e26c41157d06dc4fdec006ad654166b56e1fd45b14f7a81b13898ffa14b46d8a41193d41ace4bbacfbf7a5c98e353342fb2447d86fd48a70cecedd2e20bde22dd9a9af707588c848b17a0676a00ca8754357f0a00362dbe5872926c4019445be63815512816ab2c32a6832b8a8c53e0dcb1c93bc2906723346b0cafe1fb17b4797f156c9f660dc1324caaab75f16c1b6970e063ddeeb659d24897a91a0a173c3eb8912c4b0c0734237dffffc11845a0301245e39c85f692ca1d73ddb2c440de051966536bd213cd0ab5b1d9a6ca38b5263c246ea1161ffa16c7b45b891bdfdaaced574da407066b1792cbaf17afa3caf2f6b16396135cfb6d729af3fbefd458464d9c4d832f436a6b68b0a23e497b324e1602d8abaef556c39e6c4ad985bccb2843cb305cb21b74d1c75f610006124e18d52ede9c936d72bdddd014224626f979b0201fcc3ae556e20986a2d930672f03b71aa3a52d1a03cee08766c40a77044dda21dd229fcd6ca49cd2a831e57c20841d0081e6dad5e8104c58ba28f01e40b064fc90272f139dd95f7b1e2482a3a30456ef058d7b8b85b0ae1a0aa34a9f464825858dbb45548a19a2651996dcd217c2f4a524e72855e40ee0353e155c060a735863e2908bd745279aadca06080193df80ba8797a6fd55fdc1c3c3b4742cf0d4ac2e574fa48700ca2bad77748bc594aa4263ea52c2a7d3bf46b2a22d9e80d369b4e48c644eeae25db4e7a82246119096338a4bbb74d76481db0f7e479d5318018f2b3eda73201fbb70188fbbd6cfec4d2493b40bada3d05022a55b55c0f2 +SS_N = 24647e625e0bceb63c5a09fcdafd8be37b3c01c63085df356d15c2c5efc3dea5 + +Seed = b6ea97260b9732a7ca5f0afc4d9adf4b34b7a28b28aa7b60b6e92e87e65410d5d9c0e1bc46e36b34a29eaf32bde1623e +SS = d73409010d762f4258a7ca8ad3f8f9f9515137bc8a93fff0527a3b8f69053ef0 +PK = efb4dcd1fdded5db2707d1d539780346 +SK = c865955979013453007d8431325fe4d0 +CT = de1970244ade867e6aa5b4172bcc31ae +CT_N = 4548a5b82c16c54181d90b89b50f8f6e57f54dcefd8720aa7478d5d0223d80562df6ee2abd34a05cb69e2e69e1ced40f11c408c2ef64547b47c43a428efc072936b5b15c8f47e7de9bdb19ced1fa4a9127350e5f00699bc79b5caec9bae27715828cb5d1eeae26eb7d76aaa8dc585fb482d362a6a56f7c0dd3bb3c58c21687358cb5d4b5322a3c417910b82d573cb4a16fab30a1a3a663e3b2e0074bf839245ac78637abb2d973cb73d82128971212627f6118008b401a4cabf20337e22bc808d00609d8e8be329ac2d5bb444808f4f74cde57d4ad3f5a34a4f0a80aa029e71d9e7b97b6fad52ec16b782ad6fa3b66347559f9d84cf306d33dc248e0aeb0855f99e7903c3627ebd2fcfa87148260f46d55c7e729abd1e8153406bd08e491c689567c1bbba6ff2fc0d4f13ba55b4a6ac9f71caf72a63fb337d351649e5e43c9b96919316c538522a457aedc229661bdb89dbe367e7b3cc8b6c0843b272abe01615bb34ede497003a6d126b77e8e0933e9e9bb6194cc7d2b2cda42a7967565651b923c8ccd1a9c1dc0b8cffee27f7914000f3fe2ed03e8305ea78f17a041f06071b792a6003a88104a550c39d6a805f320537f100b5050fba95ee94e398662e41012da983cccc7caab0f62c4aa8d4879b364ab227d2fedd34a444b18dda56da0a254d9d1499b81668cb96e7789d5a5833c9b5aca10a5e22fa2531a3436b2d0d47b62cc8884ebdf7801e7521bf7e631412aaa5cf57c7a8f7053d65fb34ac267fc37dc78e21c6db830f2c87ad66d672135b8b6c6f2d36a84c2f2206c6046ea778cbdfeab4ba8c5f61456c9c1b9ae4ddb7d56d02999b3bfcbd69c5deeaa4323fe4c06c6262c48410367899e3c42ed67d702f1e179536465caf2aac5c4dcf7f33dee576100ee74560cc0742580c8f1625408e8017006588987c75683c21acee1e167dda3396b5b0a093330e8b7304bc7fd948bcd9b2640a22c013d6c19887fffe6ceaa875d7d899d8578c84e4523c3f5a7fb53e0bcd6c8e664ccf0fb5d2564546c657259f72fa19f817064f332878772c95434891cceec1c0d3ae977eaa858bac1ef7739d16ac6fdd9c010b36823672784cd6125d071733bdf024732d23936cdfe3545e01e72193f0cbdb9b39c514bdc788723096609dbb894ad33fc40d3a5fd19b2590c8f9b8ee6184c2a2889d1b96e60d0a964fb1c1f3c348c69a34a2eea49fe12f2c0d8080201cb0778937cbcb1b156058749c10aed56bc4a04f07bb9f154e8aae93f35874de1d2f0d89471a97237b83281a668802107834940feaa8822a1b63627cd320d2ac19821d766144e140d1565595f062c9b6a25cb357b1348fe7f7f10b166c5924b843790c142e47b2919d6c2eb91e515ac84e8028cf690987c0b44bded0bde994ac91875e455cee3dfad81dcb52acb606ebf60e32d86f8e916eeb59ae76746a5a1b7db0f857753b98fed6b75d88aff179b8508527cc123136a529fd6bbde8586bf7acc8501309de161474461fdb870332c93694febf834bbb127f7d15d +SS_N = 28741806366cc412a3ca7d53590d82b3b619427460a6c25e62ee3161a63243de + +Seed = 626afd438fd9c449de3fbe8e826a1abfdb14d9d0df7167e39a849db730118f20b3042cdc5d0714c3d10e1cd447329386 +SS = 326d2f80ac0e05eaedbe8e87b84ea7bb16561010e6ef6bcbab9a5988b5f12c9e +PK = 44b83d61a8a9516914a33ed42afa1fa7 +SK = 6e3158ed317e5c6b08df41fd48b12718 +CT = 1a5abfccc026c11446423e8848b7245e +CT_N = 9198af43ab80566e6ca0aac867beac54cf16e1b78ad84bd7833095fe1da638497bf0094c5146e358919257bd04940c54258b5723f949b92ff2e1934d5064317f3fc2ae4fb84e1825136572b7e3a95c572c0a46512b243a510a97b6e41381b8b82697f1418df0bad565b1dc987f28a50fb8d1638a0dcd285d68e68da2982326f82a24233971f7fb232c45f5f1f072a82bc20ff6ac0970667046e8e0eae7bdd766f00d32380aaadd061320aac65f3212644abe0f21a54f87ad85c5545837e89a226e24964502cbb5d2bc6ce8e7481ac19742c8ef6036db2631dabba30b75cfdef71ec19bcf1ec7476ef591c8837c3fc7d497b91cc5fb7fde174260e6a5bbfa6ba7852c9c2e6c5c3edb0504e55c8eed42ffba96bc0fb107b5c9ef0daac57303dc8551d7b76f7944704a1d75e014a363c0faa6c0e71ecc8deffaa418fac1bd9046c8ba86d396dae33f3722544755117e052ad8402d165d7f1907188168eb8f87e69bb5f3afbe819dfb9b38e79f682d03be741b5542c601fe75d421d29d983553c80f1e43daf4d8bddca3e0b03167aed9ff3d85a19b000512eae3335c8de41e9b959cc51ef0ad6386f7f1721e053c280f286e02408140f01d158af4d0f1d8454dddabb46ac79e4df3363ca2494062df1315bdfd3c851938aa59bb09721c093f109bb6470ec6dbc221685434dff578039835f1d49de7856ab3a319d884d8c1591c1b6482efb3c35bd54d351f5de4ec7970e647c5388b07b3b4e0478e2c216eb33d2533024b561e570dd92c821ac6b6e634c3852a9ff71aba6902ca5da602f3d2cc1af4f2c34f0a93020b9329624429f5ed7b3adc9f61cbf6283f7fdce7b9db973c5d6a11a59a4cb79404e3d08ef161777e484ce61aa9372896a8a44adb66b31aacf40ad45029901efa87acacfeeb6435b85033bf370344186268ce3493bdb85488e7477785b5a6d73316e8829d1f28fa754084388f068cc028fd9b3cc591408edd196d7b228ca18021d454f890f695a1c2004047cf53752301e5e6806f336c223b7d0bf636f86bc393e223a73af0b08df04e9cc4ec49625f2c43823fa2bf4ac3c47306b54c3a9f0b516af763f70a8298e5ff6043fa441f42dcf611b9e649a87d2d5f2ae8f27089ce574d3e49c56e502e35a674c37d77fd21cbe71a386bbe619d2ea91ccc3a87b0c0eb66a8aaa6e85d0137116d58bda143e6032c3caa63bcb5a7aed883cf4c31abd23d5f4b778f94e547a213f43e0952d4509b97bd90bda1ab512f221f2400ae165699321d92c65b20fdd5512c70034c1588ffe084515e9ca07d318d526221f0664fbb7d36cb42ab86bcbc1ff2c503d8f6125f38b227ea5b140c668e76191534cf04a0cf74efa6f29abd68290bae966585784dd58f60c8c6bd7118f6570754afaba7ec282ea9c18773885a4ee0a6913566b54d91446ad9033c59440eeffe0be39f33adada373306c4fa453f793399e2c0498dad7370eda28c730a7128b6c5673307436dc339ef58510686ea18a61f860325a7befe0fd2f097183a64203 +SS_N = 0db8e8c486b0ee7e4376ca00083bbf7377bb035abfc6df4079541bad04a744d8 + +Seed = 8484d545a1cfc58069db9ad0e9db3244df1d020b8957549064a5e7cafae6ae06a671f5e79797b42520464bbb95f5aa2b +SS = 7cdc562a2264fcf4f44bdec83bc76965c220e0e1678703375a4d471d2f73fa22 +PK = 0b68efe1ac337754c417be0f5360f163 +SK = 78fb5770dbceda18704bb81f87246c68 +CT = 6624b207de427898dfe78e6c3da83627 +CT_N = ced11070bd03c543b5ca47b00db736b0b99e63c6a489af09ae71959c20ec0e8955961390ac9d229d48db644a01ff188947e00847d5409697f4a9849d04e9741c01ae2694178b2a710000fc0deedbece7da9f9eac0be1c5e9c62c7ea711e3acb9b7efb88c101591700cdfda9dfe77d974bf68efd850114213e4775308909698bbb27a4fdbf52a157a2c859f0ffdb0a531b7a8e41ae95749710e776038be8ed947822fafbd88a5e7bf202de5be4351f961d99418d6c945b2910a440ed26c7006bfc22628eccff0c00b0a14005b0c441f5e3b7cdb635c470e8b5837afb77204b4c645bbc72f1b9701b307c0b45266d26a54138a589234d63136b9332ae5f89abfa84586853868ad9de057abaa1f94b8979d8e0b52c9d114daca59fb07c54f10fc38ae99eb6556db6cb13d478da28a831b4b69cbd0cf2acebccbe12ffb95d678a9436001d8cc3aedf00b1a2c90145c8f14cb19f9d7cba87c395afd46542d3ad5d36e2866d910e0dc66c0096ceed28d726b346a8842f4e7e0c15ac59279b54015b5d22b3a6e3f77a24851e1d916c4008145e5f05913e494311ee74181fb021f257a1906a5b1fe8e0e06272b98eb596a3b7ae94d63ce97c7f86ed4dbb0e508115c3914ac2c1ba334a78e219db6d0034bf8910f810133547fe8fa898acf026bf6338c7af7c03ee56d9679c68318f3e64e6bb3916062a2e5ddb93cede5e450c5d1e4d18ac0384c30a960a4103dc520029db58d079cff4ac30a3239a596b72eab9968b89082877d45183798f0362f314df164914a825e76342efa816321f8a724982609ef59202bb27ad4cce822247681de7fe232767809381e8665c81de6371ed8ce2734a6ffa8be5972193aa8edf9797aeb06b0ecc8460552bd6e9887640b068ad85664e9ade4b2930645e3ab191acfc48e245a56a02863ca5ce687ac251cd2c8b02667b71952d0a0784a7ebf35462f6a11700650f6d317e3024798503674cef986af1401b4cba0617acbf99470756dd435f8e68094fce4a23f1da5671a91a937f55d01f7db3813094b0d2c43afe4bb21379c7a13fe5165727f37238856aa96e9647c96cbcd17a071e17b66f5c4b878fcdc7fc1c74ceee714ac2e3dacd1fd834d9bcc21a32509a931120f8d1809010927b282e8ddf58c3a56b61c6c871a5dc1eb3a4d59b0a26350fdf71f0a6ced474a56e6e63c4ee62b73e43c553d6b9a341a0d041660836e5f2a1a80bb32855e29a12aa4a8f50b23652538a2fa4eccc52207869a6559578f864ce0da0dab0144747ead614bfb7cd1f320920798ab99f84e23abdec7ccc2ba86af2c2a36e63c559e184c2fdfc53223cf24068ec7b30eb28bd420dfb5a270465de2430c250beb79312a1582ba93ab80ff29dedfe5bce3563d87e727ae6ebc924bdda94efee8a0e333c63f2e359863e1fd33b0543e642d2bddcefa0819cbcac992ce722dc52f2deae9d020b941bd71f4de87f573b6a23b5d73286a589e94c26d38bad6e1cd65d653e84da6e6a91af5de951090060751024b6561a1f00b2c +SS_N = a9ad6bdac679416c11045d2a460acdf250f807a6db7cfca26d07195f3c8aad22 + +Seed = cf525ff8d68f7717a6dd534843ae9688f2037019a7aaa012951282da883f499f080192bb5d7b74b5cb1ce6e160519baf +SS = 81d859a0bdc43755f5eeb6ab56499dcec9191f930377cc9de05590864a3d4c68 +PK = aeaf16c6c2816a1110d6e304cfece17a +SK = 4a16fe2d0bf4de4f414242a888dbab91 +CT = b3ef69d161efce8c5f389bfe547fb61b +CT_N = bfc25b947242e2d07bf638557c26ae983b2aa8693ec21a105dd53e6124043c64aae58a57594ab7b5b7540800638d5e32bdcff7ef2ad00ccfd818d6c27269c6f7a0484c41263e62d9a44b6edb3bb5265ee4f1fee19456a4f1c19da54f8cf463b87e22f9d56943320dfd0dd67c2cfff2f09b0b52508872e8899e4f5ff75e86c7f3fc7ddfe62c4bf3beadca7a3962b138d2b1a08218087366be252cfdf31511770862622bd7ed5505b14311c00e97429c0060363ef5553d43803a2533a684edc1e4b98a789cc7d984e253c8610016e2c9b298c7e9ce4c187429a85325c512b196038ddca4898bd173335c3849aeaaeb928546e4f7f74715d6d6090159c2c28c9e0fc801677029be3a342253a25b45dac396535218c0d08564eda4f97df309724a10bd56fcca4d271f8cddd5293d21b22865ff9092b0f96acf7e7b85435ca07ae2a9b5391891008612a6987fb43b87654d9e066ba3665cf47e9c3a9a0409ddf412fb21ba92e1dded393b7d60129ca3e0348eef539be984a002b55c5f653a77d41446f923eaa98df4a82c61b820f51f3d404a41d809f16c61aacc71e4fc148a1acdb43d45dc5e838a1aeb969076bc0dd6c57ebcc9439fbb97e29f290c86986cc1c5690821d6d02dcc29ff97ee423cb77763ca720629e736b242a1210b42bab9fafc3537f34da03eaf98865d5cc9577c801ae0b41a47dc569fec52f398750eeff499a916d7a0c98ff78923ef4264cbdc2a6c995863cc32a236d71f42bd3b688e9937e940c392f8462812b83f4f6bcaab0341ddb483e42dccbee6a8039fbbd1c7c2830a7567afae89b6dfbed6c1ecc1c00aa57d47fdcd56fad54055fa2ac975574a62a1024f5084ac876e6c81702ec57392a7c779b669532500d75501aa572fd9291f235262ff68ab22a05ba49267e362e1e9e01714fc8870dbbf6b127b88ec20a3919ea4744a99fbc9c94dee0443b5d70df24ffc608c0e98bfec997c490c484b751dc0dc63725441ff7c8986ca41a543d7e4afec17173d825ac0877d9655f0d36a59cfd73b94dff0625e30f1d354f4197b475b971614496834db08e44eeee04a4ba4e019316a2b9216e7cd6c902e629d1a75f9da51b93fdbc1d8d3127d7815fd325eebb9639573ae30d1b769c0e2c7dc1d1da4074c301739c1f67a9f9b3e21b720a8a336c7ca9f3327c29abd9de27eb727388d015d313b957b0498d0251c15f4b6ac171ff5a5d5ecc111a6269de096b3716034b89df91a5c453ae86740689bd351c9e3c727464afadf28507c8d4589f3ec6e43ec19080e85e912e9c84847fedf517517af5e9857f5ec3ecbf2c58d9667d4f4a522fd03ac74d57609da2ecb31c1156c7fe15344fa020017bd933c8b46846df7a99bf4b04273fc93a7b03db67e24f6fcb0a9675e10cad02672327c7ca791c39a175dd1d1214b1b7d0cce597bf6b7ff096871b368ac350e3b571aa80b6504b8c64cf04792a967b818918e79a79f18a1b9ea13b067f841411634bb131a4f50073a0581443ff72cd21e5455a3f3e9575b8494 +SS_N = 9c7844111e2167c5cb20c23d01059e369bafb35c17fe5bf39964dfa6c98e9ba3 + +Seed = 6d1579c271a32d9c51709409e2cf2b795638ecbda9621af6c409f76856eaa364c741beded3ca09c9cb64de764690cb82 +SS = 286aa476e3f382919316338c9f2d388f4d705fb781e1ffe22e5c3bb65ccf215d +PK = 5a04fc161746f6208d38745d01b06cc4 +SK = 13108aa3ebcc4ade6cf85055e4af16f2 +CT = 22bb0c93e0f9c300bce4a208cc9e6110 +CT_N = 4064e6ba7de7e3c9f7fb4e20266289e0367ebd3df17fac81c73187fe18cffbea5f9ad36b5558adcbc00636ef5cefff5f3e785d93d405ee78f3c8c8c18de5bba75a431ee6ad4d8f7b1abd7374d765305f3fb0c028483dbc97a97144d7b14fda1ca383d1920f74619c1a5dc834d58b9a456567d14e4b22234f9a0e0a47159be4811a947038af45de4cf7b2cfdaf4fe16151472ec30b5bbb8927de23c6310dd73ef19788c18ba08cc43162a8aebfc1baa549a9a7a907ccee0581bca9d1ba6b5dc665bfbde4e7b95ca0bcc702309853c8282e8caffe9eba59168e809c94512c9cb5021d5e3688b9758f2f6e550a633a6f91b98b305e094ed1b1d9d0d7138b5f8b77352217162d65d2910e570890af8f9a5e66b19e8b4261dad910f00753533708bd04a6200ca14d08c53188524b58179e5415bc1c44308dce11c75f9ed4f07cd67ea7ff4730f86f64f31f4e3130788ab1d52db6e89a1c1361b1ab678e143fdf0e2f6f041e5c3069cd2b22e4c8098b02c91e4b9837e4ff93af29093dcfc0189d6e8a8c7370509dd9e1f4e4496d9f01d45436b3baede52e3f596f5508c5976e93631ed01fcaf4c5c6bf64c7a4c97a8e33dd06af2b34d0e721b9558cccf82f9751df81aaae25c245e14d600c5664ed69824dac8c80dde1c7f26f109d3b29fec0ec7a6aca961f46986fbbed12212739d948da727dfc3adbed81259667f71af6812c9a44dd42e9b101a43a445b99819bb61ba74b70dee2e8a767483dbceee4d5346a7f08bf09fc8855ac6917b63a7a6c1c3ba1de2e7a0731f2ad9e2f749102a551012c95fd743c15c7a532bcd186fdb2c768fbb55b126665e64c3c327dc645a611b0f31fc037c537362b789f88c8d634dc8d87fbd4c14aceccd9306affe2d63709e5dac7d02429f5cf9c6fae07517c04cf8277128722db850219ec6f587963599f635ae51887772706b80f4c3455e8b9f1e7a7c524aa37654d9fd71115835c8358f5c7fc5dae3a8778871d09e3427516eb1e61af83838943d159a3c048df8624edf2a23b940507084eb233ff1263641b6ced7062f3d36775de3237b108e2c947a2d00dbcb17cfbffadca00a65d7b5a800d213028f6473b90a7167ee838892c56c07fa864ca85f3573042e92f4a81cbd793c9f209627f10603f41d209ce1a47976ed5dacc06f4e95f0c9d9c34da3396c402f146cd98dbb97169b44599fb61f3f962b5b5d7262f822360d7ace8d0ccd9ee5fd991f3edfa652ab42b425f3d96b49854f91a34b5f384c2f459079c2c870487b9718ed6609a4500b9a001bcb7e91ac69abf604351024ca199615170b27064e5a7369893637489362dd44dec35d63df4674b881984023525af4f55beab014b892ad2e6930b036f66953710556117e783f639a6338a1f62959cfe3dde50d98b57eb8e72a6851e5b0bf2fbbba09a561f5245fbbf4b6b26e633e76ff2db0d449fc22042cf400e7482a1e58ff89f8997dd9b8d2d3413c629ef723f2ae3fa5cef52172bf5304a5c1cb1f7e459a23b9ab1dbdc5ea456791 +SS_N = 716dc75b75754476904f2a24b866905cda64b15081699bb1e9b5555ae85b08b7 + +Seed = cb872dcdffa86f3f117a4dc5adf5ea6a3b1c312d618fc1a070f67586185711d650ebb5b6299bbcd41081b063403f59b7 +SS = a2a3375db024ccd009b848fe3c48cf63fa1cab6a64c9802e3995f84fc1c16e6b +PK = e56afefec757da276f1f0db820d61b69 +SK = 2018c6763fa0841d8d886dbf2879447f +CT = 6ceb5e9760797ec52224534797a3b37a +CT_N = 77d1309adaad056d705358e58e049eef88cf8588a8e51d2bd844062dcadf90427480b16ea89ddd6147c6bcd19baa9cd01e5d00019c360631299d2854dd08799f3b2996d6b91ba942d7f1a20ea9981a6abda128fc4ad0610192d298a8b9e4a0e81bed649812dc39c5273350314137dff4a23e6b9725707fa1b4bc6daae483d67b57f0fbcc473055b62e2d073c46f1ee698560bfe95c5fe0686a0013215938002c5ee57eda72b02c5f4edbbaad7f42a9adac4e0408525d9cb2a007925871e31e8ce73d26a3c10e0c1948ff0080493d15dd5905113c552726e1738798380ca251841ea7d5ea0fc47a18f0fe8b4b7cf5402250921c903276a9c2653fccb5122a88d40b0138717e277744c671c210fbc1488d71fd447afdca42b98bdc0c9529dec21ca51fdde9a973d6e01536d513e971822077267c8b2f641b7a13e1038850509e8a4e900fac82aca62f5cb1bceeaccc8a93873c93034bc4a1df92f6c52474c2c26088062341c30c768f62877bb876632c7907030778170d74b49b844fac4a6690ddf10baccfb4f244e4a913a2277803dad794d72731302f4e4ec98d7289f249807fd6691cf9c63b7bed1b863566a01ed35f39260d857213369bd8597dfc8a49e20ce5c2cbaff0cae9456527d1eb81f2cb9190267a26ea27557c1f10bed4d45b27233fb2e8375a15e2a3e27d818e363bd688a4d4b12d9f7380d85b57fcc5dac49d311aff539d5988c5a126740135b495794e105c6735c8b1a471b89f9b1b4258cb4e46808c9b4fd8f33b3c53c5d8a140409375f9dc34cd7e35f0b55e9fb07deab3224f8a3b9e8256c39ab053737ab4e050aa9017352a99983f2dabd739c20813b26c9c2ae7551981bbf90ba19c235abd6741f5f3680aa1633052e4a415e7b13184ac11009d0abcb0dc44e62f95424c30a863118a11b49a0a3d5ac73dc5f423024114d427ae4520f4dc258897ab4569ca1d4b1f4be5d975a5a24f6c9054941812fb78e818c93f44d1c9cf3ecf55b68cae2bb0b72eedb81a442572a58b537972c8f29be6b16d6aaeb04ee3c2a25a1fa8d9e3cd9e2f6c6f254b1d34736edd96d299a7ca8e63b8892536fca8bdba52c17599227c77baa7c85a8b1905f86fb2c47fa9f3f853e6907e9e546fd9392b1ce8875ea6fcb1210d06c6bcb74fc46dc0b7e0afd5a30de803b1d42ad28909d8d95db07383bf1de45967e6a1fa150f5ec857a1597645c35704ea8ea7e4571906313792bc329816e862949db297867d94c66876fc31ad0e547639c3138bded7c0e40fd5f27b3d08c16d21af4e74303e1ccd9086aca1026d3bdba19062801021e87c5ed4112f2a62ff7add19caffde156a8b2711791544f5657b2f27612ea43f42cd0725793f5bf6b3fb04d1048ae2f6f78bed8f62d0ac5e70f7521fa5670c0b363bfbf4a9bfdf91e4c83ea6a0469e11dd3299ea75e9ada34527eeead51d026a8804317d918b99a72db42262096824fb1d7307500301a3e8a6e0d6e2f234016f6d3d7851554942cd4bcb505dd10e561a6ca380811a23c1 +SS_N = ee6d3118c87c0fa2c0d0bf6e2c096138616f7ad4dde1e052cf8b321a0d51b5a4 + +Seed = 4be36ba806cdb11ec9a65f900af0cb580d2e5fac37ee8745aa2970a7db4c8244491d875c0b4a7fe64ff09bc6ac2a2f83 +SS = b7edca0dc7a2945cd4200f9a6df1b5303d3b20292054c340e38f8930a97f8ac7 +PK = 3d217a4c3a0b58235ff71c9441667b9a +SK = b8c2d3dc16e001b8a898cbc9a683d768 +CT = 5ee1390dd5ff012a0390712a6b588776 +CT_N = a251dd8f8eb2f8d6c0c956462903743e8d56ecf8248d436f977b1cbacf1203ef172c85c449beef6b648cabab82620146b3b74fb9ed09e24dfa8e29c29cc8352a7c5e3c061a664441fdd277cf80a4415bfbe67a27c11c19e331f7ac476b521d44b59663a145cb266a656c2d96e1431943e362907af49c2c6f788ca45e6f1c3dc12858fcc30c386b3c07cc216e450386cad8895625b0611423ddab6609eca11afcf997f7c39dd27305dbf0dfc08fbc5fc7965013b67b6581bb213eb93afddde31eba96fc5c0fae1fd2fed39d7bc864142588befce915137373d1703041310a0322f0ed2530d50272151c13b83edf09fff662714ba613f37c90b6cf1b7037675ace77c3150b2629453f45bfc7a9299b34b829b1d76f3699613009769de65ab3e6ae1d1b42b6ef76e5e6aa0496dbe17644e96187b965670727e8a77660563f9029a63b41af3f4604d28e4461ee58c7e1f3974d54bc021518009fbaaa57ed39f72a0ffd3c9e10f7761f587979cfd63ea68dc781d69ea6da66d8c5f5774d07b6bfb49133f30f1396cd32636c734f259c73509ec74c5cd64b580b10dad19167b3a936237d401f7f0ff29991c1d99a23f3a38a5f4cfebdeaf3a1bdc8e757eb770cb9985055e5e4c167d056d95160976ea4b30418187ead8a5ee73946db99fb42b48c19a8527277fe7ed07efa9f660e3c90ae6bb3fd9c259866de7519376d7361d9dfd28189bcd64069b10f69980b2b1451f5c4cfff29153eb309ee6c581cd458aaf7e058d02e9c79957febd07de8235907944ec5e2130f60fbfb8270cb7d695a1cbe5850425f60c6497dd1e460ccdbeca503bd8d010e71a429dc3d75147b1d4d7fcde831ed56b833ace7bb0ce2ef2adb791618e5cc835f5e7ed3f5ac2032f579e863cb4548c80955d65736861490aee6327f66ec26bc8a74a66b7241f02476e80cd7e5dcd6827a97397c148e008d0c5c14dac1573cef5dd84eae55bd2db466bcaf4ec6f90ecc7590cb753731de37c2e0899ef29a9b26548b6ecdaa4bc1766fba3c2cb3fc41821b13c381efc0831489857534215b2ab1986ac8aae765671a0425093729a7c950968decf9eda465df24222a0a9fb58c56963a92490d8316b872b33db4e5734c78d5ea8062ee790f60225f636e4821f554cd920acfbadf37f3a64adbae6cc05798210f99d411b9d3e421c7e4586a9e095596dc6d0e5ad09cbc91daaadd0285a9b00df7f817fd6dd58448ce535ce0bfb2dfc1d58f955bc636d54f3480d6870b519e4175902a53c39c07f61620a2f55d3961f5f38c24282c196815cc70177570445bb79196384ef5d7bd6953e00eb16a73b73e487b1727176e14636e571fad5ac19739ef8788399f77d177e8b758cd55d171f66b85c8c1c3a7f0a2cb8f209f3891a2e339d66df61b50088fa431912cbe236e048fdb1550b381ddfa33efff5eea7f3161f0451f0a0394b5db32aef6c47ca5c242341c7156c14308b50b18f2f19464e871dfc3186a6ec7f0a7e6f7df4ed45c3344d1398380c2dd1f4886216f248d +SS_N = 64539de906323dba96bab21f94aba09f5ccb3fbef6e3356db136bc4f7117615a + +Seed = 81c2294b8c26071d6ef0288f547789a3b563f5d511cf1d7b812c17e2e507da925d4be870d837cdf42a1e980c532fc0b6 +SS = e92794fc1d9cae8aa7306d0fa2ef6c315ca23f8a6aa8d243b5ff031bada32f97 +PK = 34e77d49a375b0023b0929d09f3991a2 +SK = 02b24eaa1295c217ffea5d15d7e2904a +CT = 7d71a1d055d1726b0ed9e811a0b0aa5c +CT_N = a9045863b649881dd010d7be0e5fc8a079c468d9972c1dbdf01e93fdb5b60ae8619661b71b6d82dcf452084916d5d0ae63dda9357e83b6f69ea5accb762fe0a1064e42a01d145c8301550738ded92b71cec0e7d40b7a704fbfd1e85c3bc79c9b552573afe4ac4107f01ae7e0c13c2aa17c119e4a375e13bdb2ba6db735a6357b45528d5d4a15688580517cb63f850073026fd23019fefcedcdda8de5491f0411757e4f255164ce5588348cb451217fad236866220f61b38753b7d155ea887e9f5774c9656830dde853758ee185c8e2b2169d6f44f32a5c129119595cd724f563f8c24a97a11002d20f75c81caa90134fff8024e87c209dd39f18a0a900e9a96cca50bba3fa09ebb10af24199a9a6682c671b99a1f3882e3854693dc789544900961cd4beb9e31bcd5534b214718bf6c145328f16cbc8d2b9663cd71b7b76e7bace60eaf6aaf0acc42c51c4209d6ac24b7e1998d14d9156259d7493699977a4ee7ecf23f1c3f0bc4c8d5f538174dd288a44b65a7db23141670861a385fa6c1d9f4058d7910d24c82af0ac02c877da183a463fb24da7a674cf81b32965cfda924f90e962b1fd65c9d290d966d7fa8480486732aac3ee94db970d0d037cf3e7326810995f0f1ea59f76bfd303ebb35e4db01d9fb7bdd901fe5e2a4c39bcc5533bf7999979ea5cf6fd292ff23fece9528d70862eaa4ff6489cdffdb4d6427867fb15ad4ce6893416efda6ede9ae57db6ff5342844a6615c830970ff85d83364c59a7de2d2e4d62548317b2dd2590faf70ab0c1495a5bde70ecb127568d1aba3253674f90921379c39fe67a45b37752477e6b74d2dc498581216af9985e68171a5d85b04f460ba8e7ddfda2e2aad1570856a578694fe091bab090516aaf93c2f2b3e9803ae730e4c59953674d6a2d722c3e00495b9dbbc38deae65422d6e3fca0cf52eaec17508c417a998c3f7d274605f6504917562db7f2bdcd7d69651eda4f660290bcba2664dd8218376e43993b83e190dfbc4a7310813a3e57376be081fff1de414e8fe7dc772e7b460c1e38f044c10b6292c7e5ea7ec32bcb426377fa08133de5df6bfc814b206d49154c61e0be2210e838d7e1ab7a9e4ec47d3044510ec0b46331cf1936c44e4748ac5b7104f18f75d9aae891adf93bd229476fe710fa3bc9de49450ae87f929e775af86ca5aa2dd5a54e9c8149124d0b4289e6a7b9f0f10120be8b4dbf01999bf308c3b3ca2ff3a972f6dbd4c3cfa6e0bd0d83f1220e96dae7478e40ea5fc5216ee98e476553d7d6791d040a257e51ef91133ad25760eabd27dc2c0a6177f0df2d976fdff08394ee5a197fbf1af1ce07a6f47bca732d38a36b83d9ff7f96a6d1ec55b77d144cca1ecb7afd7e728d964daa2948ffbee4d105f0c0ff78bcb7a0d269fa0c8ff84e2b65eae11457061020c94c90e20f5f59cb571fee2d5e6fa84623f3ecc9cde53479a8467e54d1286411ecbf65560d265dc48b2bbb7b1bc54bb15bea2bf2111eda823855e1afc0940015851fb00d571c317269 +SS_N = 635d2e10ddc3979fb2ff41af068c7697faab8aaf8586df0da2e81c638ba7205a + +Seed = c46854665b9852229d9c64000820cb49b8d023fa951977cedf2bd6650c48fd13b6a0ffd8f002558f0c03f0aece457a6c +SS = 4ebc52f480e3a1f8564b66e85fae8d9dfbda400db411b7e785bd16930052d99b +PK = eab932bbdecfa35f99f5e9446cc62203 +SK = a649e79671a3e947a00159496210db88 +CT = 7700df86c16aba1d1c449308e85bb830 +CT_N = df76f31a2b4b61b00882f445c30a3614b625df849aa722d87eb120fc3948af61a0554f5cda8f015dbd11a43b53d20daaba24fa088378a96b44a4565dc45bc9e96b06d94acde1b91913f082287a7a298f1217a17908d5e8c560861c5d1007f46f2dbb7db035e96c11f721d1eabb21162146b10535247f4f39454737d8f6dd75d42cbe61012fd4e8147154285fcfc0179aee97dc65d5d2aa3e8764442476af93a6c4763fe7c6d385be6a11589054514def29e86d3c61099f8886ccc710202c71856138684e7ec7c5576b3e9bbb66bb7ea7dc700cda494ee029be8a283fd48aa6784727a84189038a82f0d13b5c80baf11ee22345228f42a81711b66b1a11f248030f5e143bbb2aaafb643b7093ccade39e64b36aefb579abff1f76755769bf2efecfe218144075aff62b56d38d1ee30702bc767155cac1a2a7299b3939eff90ecb9705b59b324da72772bd1d58e4b4dafae7cd614188acb85f9a6793bdd9038f95892997238291e54ef569ed834908b4f2ee9ef2822309b052c9228e04b2fbe19839180106148237b96a444c9153d3af5b87485ec8a4a197501440d4ce1bfc74d6b9a1c22522a34b9292382cc202c5f78ba515a11873b3e479ce234901cf26ca51c2b96470176aeaa184562ef10da32301d46a8ec9c29aff6dfe12eafdf718fe788288cb0c127a7ea552c3b4985d118a0cd96dfa5754a387483112d9d5e89b374d169b90566924c22660d957ef16c1d1443ec200445693bc9a29a673cbd3ee60513b8f64c3f1923caa6ad43b7fb01d06c40302220afa43a2b5834b1e133f02119962d22472fc21573e1a79fd6aee8be12fffcb8925bc781a81de0d43acb94d8c6b959d23e85d6329ab12774f6d67948700c41ddfae8e72d6847a109d2787a21a58092c1e91c29cd3f976250bb2189fab92c2fc699cd012adb1363924ed31b7b25ae48ef640cf8fbcc0159d56000730a33e94ddb50a2c0d98683a3cf13fa4551d7a347f178acb89890a3b007aa53cd4fedd333e85b519dfef237cabeee427214912fd45997498537fa5280effd0f3b0327d2c5c14af11db3a576dd7163e1c0a23865a4e4d253d0c102f419f571ad025458621e5fe3ac6d233ad377a5386ffa6ead1fcbcf71e0825eda7458228cf79f9e3b273b7fa3c3e2cd62e315fc8cd2798fc345559c196a0c4491afd81694abff844de21242f16f98695ddd0b01e51459acc7c53a279a00aa2b4697442c1944dd1329a6dce35eff37c8304fb81656ffb3b5c319ee48c09fa1736ffb3d94e62012dff0f6a812beeb7d0ef22922d8ca1fca6cc215969184247932448a856306aafca06d35657ccdc78bab9c4af73f612bdc48bee0318db3182c90f99355d330730c58739cf63263d6728334448fa888157b337661491ac8e71dd3e39a6659c9857ed1f5970bafd7cb6002474fd5ab6a6160e8017f79cbc572fd43d977191d0c748d10cde6ed13aae0b567c6b4e0bab9dac80333454178a9f730ec6e43eddf88d7e2b09dfa037a3b1e33887675dfc55adebb1f3a1 +SS_N = 83cde5a0476d73c256e1fb99ef60d8873e0990495068dd007eca041d7deaa851 + +Seed = 430399bb2441c965586739ba1e5f7cd7bfd1d1d0c903a2c575b764ad7f2e3ee012451a5e136423dab0be7a86b99db19a +SS = 0911634a6f09e72c2854032a9f7d4dba5b40e1049c5ad7b5623d6e4ed46b8ed3 +PK = 4bbb825bfc223469335d75a48ae63164 +SK = 47c121eb3bb6f6cd9c54650592269ed5 +CT = 6faa080d2a91828f0ac7c95f42abfd61 +CT_N = 29896f28ed5132391bda30b56d75e66c89acba20a4f4362588e76c76a0ff3d1988cbe22c2e979dbf80011c4b5944ae582bf5f0449bb69452739ea4c3da34bc8a88d18f481149881857a8e2a4725d21e1676e8111419e39845ce0d72de6d6a67fbca5b3316097d2dc563adbb2d994d1bd25cf5d115c39d0ae00886216af3df2fc68206dca490d77fcb79981c2a30a8080038f2fc817608c401188416482d31485260bda29dabbae0baefaba35eacafe10dd0d7b37f3d31cb2a21ec5c4b1bc8665a2c228b7a2ed02fa743798e4c70f2487e421572a5c3c61909a2c6a4ac5a8bba4b905546618765e9c14a421bbb054dd42188d6c5837ecda596b8ec78e49004429d5c40a5e3501db4da13974106434e18f981bfe73f0c521b6639aafbf3956fce23822f851f5030c4c79726aa3fcd96ff0302e500b0f147a46707fcd59a1cafee760132b5bceac596d10a4e6c2d80bac0fd79b46b4c956eb65139d7507f7db34c86c66b3de0dc2b82cbb7339a278c6c4a714d83b46b6909f2f022cbaf6e8f7b520eb22078ca7fc5e49e5487c0d0f7e2e3bb2a4baed321eb5522881e3b954a463bd4fa7e8a994bcc78222fd1be5a8c7e6c8dda0b91bd769123204ff05856735b070567a0a146cb139f03ed97fd4ed7e4575f823323150d35ed762ff6c6a995a5f29ceb7fc393465ac72c47d2302b396f89f4ca7c43c83f4986dd761a2e0a1188a825540ec0f4055a015d5f38b369b5e27c115de6deb9a2bf03a8519cadc3a349d02350255d208d13a131933d4baea8894105eccd012180019ea181a59c7070a7f34c16092fb890b4590c8db36eefd1ab1edce6f632a90ff127a9dfc30bb78a6673a8b7697dc394ad0f32e8c941ddda046d51a2978e9a659c75ae824a96a9a5f8aed666144e92915fcd950c7691ab4e744480dbf1232fd8398efb7de7c8537e482b8983f4489f7510110f6e1090900a79e7bb997eb8e14f5f81ab2ac1994930d80ecf30e06e36898c9cefb01eb5aab12f4d5af64abe20b3a5960b65cc7b62ae8fc59e2be2ed7fd60631681e550f6bc4bbbed7bef68105a41803cb032d1b62b0c60ce41c76761a6e0c4493d40d22834075e928fbecf4485af84739d91a36b79e15a00a5983bacdad7e8762c13e0453190475d3c26d42238a0ab43c7b123ead6679e311db85e7b51a4b3673cc6ba700945b0400c449b5d9cef33ad0d77aee7f67dc238582f92e4e7ac2677ddbd8a0a387f95d332de843d5495e020f01cc6f014c7bdd6d5a1fa8bee842c24ca507d2908276550733e59b96737e31014f6a8588d66d5759e39e1d0d25d06d3bd5cf70875b20e4748e4039d7cc45f32a33a6535842fc5ceef52c03627a42a04e7b43adc252275e17a8101fedaffcedfe4f6039663f7e4816d94048eb222ff6404800a2924bebe0e9fd74c9a68a07392e8a899112211f7e698674062d685a31cf8e965515d2f2760661420de6bd0675e8694f9f51d54c61b85d6678367540228e1120bf9924bc17d4bdd69c1d64e51a3d829cf6558a2a4c5 +SS_N = 9648faed4b6796bb9675d72e9cd5e8ffd7df292e7da1e1ff41aa6d79f1d3f2ef + +Seed = d5040ee87eeaf9f4001ce18f5ac6106cbc7ac498c2f290ee47f07702c66ae73e930b6911c7d0e7f0751a4d03ab56f5b2 +SS = 837abf08d4425630d890ff87ad0f00b186816a6116cdf39f938c025e65dbde06 +PK = 8880993dce6de61a8727a4fd71913013 +SK = b2859f588d4bb916b097131be8f54d56 +CT = 2d44c63989733f9b981433a243979f71 +CT_N = 58d9d864b9c54bcebde86af7cbd85366d29ce7b9ff4176b3137cd4462358a8b637b9447f50866c058c8b8dffea37b26003f84f0b039a67dbbcc3dd2f7f1613e8945ca410f9b00b985bbcf564e23cee48161767a28a707ff7d72bc5ec7856da0bb6a5331a74462ecb6845ec47222d07fb2cdb48a7c692520a803c75a16dadeb5a646cc6ddc71f7983ebffa0badddf4f82b3ecc997b5f97468c60be1b000e9d4188e5b66a6d8b3f23ff0c84152d39a97dffd4bbe971094d0f3944c15e3bde5426c7d80b8fbbf74460d0fc459733a3c07d784c108e4f3e32bb36f998488789e9e010123f7a904ee8c1223540bb85223e8105764c442350e8474f03c18acba47f0f890a27dae4f716500748e9e4c59e68131bd0a97a6e19351764d26c6f435a8105a61a900a01c731f21f0115fadb57b3be4f4ea0cf24c9e039a926ca7b4c708df0f50774fa48fb238dd4885abd07087dac89c01c33fe978dbd8bb307a2dc7ed4854a3382f30612aa4a5aa611152b993aa14db80761c8a7c521309b1f2965159fa9946d13c3882c63a72cb4613d145d7e34e51b926f3e4d52e90eb4dae6cc5a9e157e1b5db926be5ab60cb9b5b614217591b36a374c7a77064073a8aaa6a64cd8cbbd1a2125bf87855290fc96a2b1e198074e80b7f3904e5a669ddd1de7bbeb2c82447ab12d184d87de11f9cca7e2f983d419d591d9243650d100973ffc2bfd64dfe099be863e04167c877cdeea18638a9e3ddbc6b746610f250f18795c8f9e4a95c937c43e579ff42243708b053dc7b7d3a918e4d841fe35ca835b56864d193064138a042f66d333365641f357f3efed94ee7f30e99852c0cead06a1e8222846db955e7e816954bd6c42e740f654a30778875bb57271988a266445695204aa65ec93f763f98a9aa8eb5e3ab7018f99fc603cadcd3318eb5f0f75c4d7069a8d6fd078f949f5a8d3f2f92036875c468c01d939cf784f7b7835c987236cfeddf2e0dd068fc6178500503f8b7e4f471d1b04a2c4923eff0d8c24c0c5bb3be14f585feaeb213b1d6c6c7fca99932934d2ff2c0a0dac7cac75a4bd848cb422bb425a9347f0cd9e2bde766bb9937e5a0003618fdec3221747066ac509bb84446ee55f917ac631def7e4f9c54b0b96e930357fd191a10b98e6c04c32b6dd193f0f386b7070b6e27a41890f5d65184b33053ba19d47db93996b3a8383a7ac6f70c2390dea75235073c3e3f6c01f2c7827eeedbc498d7eb039093eb2f0714f404388b9f8e527b24b02b8511cae2df0926d3c2ced47acfe7af592c4b85c73df1c0b9fa5b7081a241446c49bab51a80010b9040ba6f363d75d91a0aebb408998be6475e9cc4baa9c8255d9389c1f60501a96b1bc5db8137a484587b51fd4c17e352305caad20f8038815a88eeb37e4b7f9e335b8bc411dbc2790c3948a20f3d6473b2585a960efb1ce520b2dae8f67f11bcb15dacc4ad15006b03e1639dd8e7e3f80a13f861aabd28213299b002b61684683870f159022d4c22858f6288febb68af19d215e2f2bb +SS_N = a6d5e3eba5df191704d7b255295be8b0bb5668dc1da25ce2c6b5153469714319 + +Seed = 2a74f833b43587b6a6c67b1dc708f553e00ffe59841c3aa6c61f8e15e815b1ca1071b5f6fb8bddbc1cbff6b053d8854d +SS = 82ba58c6ed1db1678314b307daa63254fb3a17a65afee2e6666a3510a4dc062a +PK = 884891b18b8552cd2bc7c6d4c7c7f681 +SK = 2b075e394edc9586f7eac97f0fb1e202 +CT = 12e9dfc80b48da3df02401cfa67edf1a +CT_N = ec19cbecbdab7846404e066e5d1bb12430eae04b9cb3ab093f0c77f2f62d66f977d115bce554dd7e9c1962df0f126985dfa5addadb9ee430db795823a942e45e8d2cbc620d1fe42fedf243a01e472bbe8a37faf5ddba41eada0d97cc662a109e8efc0937c0ebb413e7f6d61976ff9bb17c0f05fc39638b85c94a3c7e3d53750a3a76e043faead5ec24b8223967056690b69c3073d10f8e6e4d311fa789d0a5593d6838df82c546f6b29f8a04edd3bd59a903b0c053ae33402072c0dfd3a13bc8a78e3f0e96e037bd188be1858960ee7b6d676179dd77fb72dba540f0485e8f5898c844f6c6df5e187eb10cca647b2870b127dc9eb323fb86a12bac168bc7a21af75a8b06adfcaec8d6f4b56664ffded9a22e6db378eb18b95c5017495f7e03fab52047ec81a760d5561806ca66b108b60ec0bdd186e095573b10aeb6e91b11d434dff4f617e5694d3773b712fffa5171fdb4acc524d0afada12d0fdd1350f40579d6a1d53b987a5ca122508b06b42c8ea982be0e2f8b0cafbb26236a85d80f9c91c96a90c30f62c8caf1697184bf3baaf965a7e62b8583b93419e779e8b54dd70587a1595bfd75c14f7faf0891507d23f7c76a0c7c5b18e9edb37e00b6fba59d53ea8e1743f55c72a30bad67b31650d3044958ad9d2ff4b1750ec0231210d931868f1bcebac2dba5346e00f918c226a76224725923619ca3ad74b92482ef67223a16439346692ce06f701f531cdf17db15138b99c61298b5b2ecf97568010ea783cef33ddfa2cd2a300d09743d436a1e2e75f2ea234b30a46e50ab87a6d9495234438d4ee47457605e2da33807a495cc3dd0dcf8d2436618f68dc28a10d740daa520606132306203dd6789c99791c9e6b8dadd671c418740665c9f7e2d7e061f09d1d6012dd3dd0f90321f6959417f12ae421b0fc52bed4a8f12c069caa146e34c0ebf0fa0a37c4c515d80afaf7546fa784aefd624ce3df6cd01c419b1aa860df851131d89b8261d52bcf6baa56871917eea5ec65b29b05839206ebf92e56d7147f98170fbcaa16ee4741f73b6888d13c7f8584b277c5c4f40c35faa279724b4a3bc59edbd40a7eba09487aa0d974e87a1d71ee60fcb354d401f319c77771286c1350e0a4f565a756c272747937d49a766a86242ad712bf2ad6e6b8f803cab105664a79257e472ccb2b47872acbe8619d49073ff1d9f6c901c6f00f4c9547265d7b488532c052124960f9d0e67b7abaef3c5ad2de6b2abb66379902cdacae1493f694ca783239e29f4a56eb85057082ee9818d8cf87d933496dd7da63ca3b737e4164e397ced64495cb04b1ecd2e4e67b7561b7ccc98b84b7b8817c221e4c8301959a7bb428872ff764b2636ab4d7ba9a5547c436eb33792530e0fbd368a47510605c4a639122c75e73b1c988f899e9d0f54996df8a93fc14708c6a7ca4a641d194648552577c3bb1355bbd4cb329c3fa13a092973036694e7b900520e01e2f91ba48a17e514a7d21a30872e6a83a3596da67e8dc3011fae00d65e46b9dd3766 +SS_N = 2d2929f62191d4568597b31442d00967a8fb39f5d2d2843f6bb6e9a8215175fb + +[ML-KEM-1024] +Seed = 23f1c88bd0e65f2c891ce865bd3275a7ffdbe4f9036e75b96aad0412650e9cd2ea4591d4ab7131ea971b34c23a4ed245 +SS = 23f211b84a6ee20c8c29f6e5314c91b414e940513d380add17bd724ab3a13a52 +PK = 4e8b4712fe8da25cec8c546443b0737a +SK = 6c77a766312cfa7e9d57615d9da3f2cc +CT = 1ecb3d5637212b52b2cb83ceb39fca6e +CT_N = 96ac6243c9b1272be77b975a4048bf00ff2c48f94a3483362449273880d45e54bda15729682bf591a74382a708beb78118cab29ad74ac2f405ba720076dfb57188dc168487cd20081f6bf412f257dea03406b23a6a752e478ba4ef9c7c0f4810921fa32545be64dc5d9f18d4e1320efc6508154cda35ab912d059e0291a1150ae0a10da5e3d7bd221a851c598df4d0b18daa920976556099d1c0de4e222d5304d44fa9cb9bd4ffe15769dd6c4793fa809f5264cf0febca4b5975ba287639783aa1f4b645ff7a00d46ee7b19fec17b3e83bcaf4361d5349e30ceab60c386b6b0d1b90d8b336ee6a627ad2a38670cb5113b0fb4ac2ddc4250097483fefd182670ea40f0f45cce90b9ed58dafaef657d64e25fd6692a69721994e7d00b4949205ebe4c4f9c46ee5a1018b220a26d80ae2d2b486372e974d75b20a005b1616ad1e13d162915cc24f274670d1e5e8bd345874a7e7c9759c8e43ff33689200739a613395f7ae78d73c6a7b90f65ab511f0df3c5dca85d0b9430b4e97098715ff823b617321799aea0ab9c72234780339ec7b541d5e6f8c1551146c24a65411811b23674c26123356cf233351382c3994cba5dc6c25a07e1ba9af33eca18bba3e97935e3abdf07e9fa32cecf241e7cafc6592db4ee487ff2b98a4a47805dee17fd93448dc98457b753ed4995ee6b1bfa9ff1d386c91f396ca8f48cab5b09a782ec3b616a87a6448a96236c4655413af755323d36a8db2e16509454489e6ec83629130cd2a54817918af362c83183494b4b590dbaf69cf399d3e2dc3e9c0c1224f148e65ef68287341ab72ad58adfc69b28e27e91ebbf830fac53b94f762f01cc9b1561ae35f16edabf51ff164c1309d1fdb52cd2bfedb5a492eb65cb9fc86b8f05ed26d13233fb0a3eb33a9dce2cf98e6516cee42fbe1e97e20ab6c9965f58a377dc73e530667ab8f45e6a70b23db50f0df411732d8acdabe50c51adb886c0e5a5296d4aa1b13a336f0c17812f79fc69418a7d8901c568f410eff2af74baaeb8336f46ca17e14e060ce2d45cdb376286eec8b8befa5ab8025802720a1e7393af579db13e8867d43d711e61b2ee395077984a450a8e2513040068a931796bc3d0069b56d1f062fc3dd61b1b194b6e1f1d1c0596d453db7b7592a6f9f8ac5576a855906512200234c40fc9bd9de9c3d6291c31b5e6b7ade473a3787aab0c958b3df76188a86ecf9e3ab06f96d1ec518c1bf3366bef94465d9e1a69eb26db9e0f0856d27be50a52bb0a3a17075d66080fe1d3bd42122d656ccc3a556e04f913faf9641143931a640e72fab9d003038c982cac8142e5613dbaab9d41390577afe73ac623f7c1920cbf1feb5c85cc433300c1c5579d020d5491edd6c503117b9c4d598438938831e5c341e9c86cd00dd8d4320b656f9aba9f0e552724e3828fc2e00946121663ad3ad98a25e7d308da1a0347c4dcfc798e395270ad07cfdf0ff8e3278dae20ab2664cdf30a5d0ebfe7a1e799ec44b514e02f2be9738d4e28036b4776bd404086cfc785d32f87a4155622644b131185d170fa06eff42d6b5b5a1030c9409932ce892b6225bc7b3901a5a31785a47a9fda2208d4d8ef19f16da0a6e9e7129ad08efc861c63e2ce2123848f33f35e598b4bab73051d24568ebf435a14f795fdfc036e1a607e576fb215b4faf3370c19bd18c5884f7501161e125b4138e0bd23a68e3bf0f88b01a6a6872c4866169fed0e6d16c754254710c036c6545b2536ae617c3fb86fca6de90e397dd7c0844522b02245365d625ff0ec26b84bf5834269a90e2d22be2b80ee9a8af7bf4bca4be6f18f99f6dc69edcc85f570198705e4d0ff4d232e1cfb0e725fcacd179aaace16ff6481ed206d56e6f8c5832de0a8114014bbf05b69ae56a31a49eab09732072d46ac21f7103c8008d697c8ad6cdf4719785cf99d69895a77675635d7a472d4a5bbcaa24dc49b215351bed3718b2d4dbafc54c077ec5b56bd36bbb7d1dfd968d187f7ea18a413d7bba1db60122565c342ee2b4c3ba649af42ed05d0b1070359a20a56e2011285485da039e07b69de47a392ca3abe779282fb0e0321df0aa70dc8da57bbf75737ea5492c7df17433a9a60e30549f40ec3e14662030fbc9683f2f912b992ff3456662b044ac4d483fd0a2af018f64f1abafc2008eb800554ada70fc55a79ead88a82fc2ff01aa2dc77ed715df +SS_N = 247d3fed8cacdb06bde637c749fee689a2cc0a1425e9c5b8ec90192ef4bda180 + +Seed = 6fb79c668eb6e0f65a09135cdd243ce205d7065a0924f86024adcd111f654a6dfe2e398a12369064c2a217229113e570 +SS = 2622503a2a544f358392903e6f2adc5a2d94fe010583b574a54d9a7e6d223a24 +PK = 4faddd4610f22e1f28865b3c358c13d3 +SK = e60c57628869c3631d6bbe573d1e3afa +CT = 5c3c94365a3d271fe269bb4999161a51 +CT_N = d0bf2e1d6851378cb5de83ae9b443234caa01ba58535242d0089a744c4b12753ff8442966bf563f8972cd0426e815a34883f740c6016928ee070291d8efbbd326088f30d50550b061ccffd9922e5a30468b62a0ebcbf0aeb74f8dfe3e130c2b1ba83e47075ad519b94c21f3c06078f4645d5444b41127dbf8ddc67a8cf440abe95ad1d586a29ff3d8a4d671b05198d2e2eaf06d7f0be6c550f1c544681829632e98cde071b1e8681c78a98081930d1c9809a497cf409bbc67d1d8de8b9a3e8f5ebea8fa79538d65c0176ed2034d74fcda38288c36c6b5af134eb9e60ffbf138fe5d6c0378ee891e69bf5bfed3b1614d25b58d3798a7eb3dc7fe42f1fa3e30953d92e79d418c741e659455a618e7a5aba4f59d12e17d057eb698f3c2f9a6b1d4e581d09a9d6c1da5f5f0ec69f8463d922b185256bfa5c751e0321d02c58e4284a021b1cafa50f7339d5a5b602ee59bad99f09dc0e282dab539cbbf970418dcf302f2b47cfc1e97ae2a83885b7ef6b5b65e662325644504338ee139ecc4b4308cd8aeceb0e9b40affdeac0e02795b54074eb446b85cb4a57122079bd7c34f310d1260efbab0f4a7e04ce438d624e25bec7e0061e253c89d57e84bdd44839343f6c4d858edefdca4fa794db91d17445c5f58ec08b5bc58cfeaacb953fb004fbb8f7b1dc1e1b5622be612fdfb1889442cd8aff5e18a75b02ce6f4ee1efbd96ddf8d02fcd2a42bfc8997cb459e2672af4231a75d59dc678a2185374bec3d98504e6e125a16e58f42805b12651478a1ce8df3cae5b0e0dec53ca78b2c38b64d7dd7c9985f518e02efe08ce6ff9b4cc3c521b3c1c0ac40504687af68708bc27946704eb4900ecaaf41777a223f1668a69c7047e9b863afb4ccac039334f58dd132bfd5534da9d45e640edd9e88104ad0455bd2faa383d35c0c9ec5fc6a6324bc1429c539b0bacdcccb55121f247f75ca6068ca915e16d13137fb95eae128b04ddedf9a0f4a17ffd5f2325008ae121e21f9f4a64b4d806ce2d93135968b3129b4deafbe07bd6be34de1a5adebb3e0002556a1392c77a23e4612061ec7148652d702a6493b8c517d1fef8a77d054b19f5af4e904096a1f44f2a71cc51c8f9a20149cd45e6d711693a81bdf62d0cab6a13fd7e690956d61ad6508ccafaa8ac9abc4da33ba55dc5ef9c63427f6ced83c30c7b763c9c66fec26247df9e61bd50ed977fb756301be16ff0c5b2493c5f2af5502655ac884219f9aa8b9ff7117eb7d528a4aa7d1c2b4f7e12bf37ed958c86141fcf3fe7db5325e27c1849ffb64147c278e45839ad38ab56711a96f188f9ce92f4537ca3487a3d840e9cc08407010c55b6db9d0ee9321ef5ccf49f2147c1aa063172f6e33a267308ca42319eb85dad94c59816dedb2142446bfd610844ae6e69c6df23a55341c1d75319e649f8d953569d54521c885f8d9f3b41d9a72da259ef17684ac9aabd56b4eebd14bda652e608c9a192537198dd6e35c0ecfe417865786b6e5cf79f7057cf5e3cb2eda21a9fb6fc8b9ecd04a423b97b0d860f478967f24f0341465fca563953ac11e6861b55d5ad5c866c83dc51866d0aff36249c6629e781f4d763a157bd54ca16f982c84441bcf469acd4697a2c63987d50ee9618f552fdf1ee0399cbb2a656cbb3c3aeeee4beb23b69350e04c2f15f4028881db950d646761892ef62dc990123f59ed61b9050be03e14c19804da596799a51534b1440bb89a150eadb32a00ce6aef79b389b11be0b25c45a14af14cc79397007edccee71e9923771d9d7f9c00bfc7af4acf0109b334b5c282705affd176c5b61fb38b4af1156486de14b315d6bf84d119cbe8b09db442dadafe3c7f2ca821933b34e3f1820a2a7e9042ec9aeaaa33ee73a52d919cc6be78c53b4e368fd2dc3834eb1d36b8a601572ba2c5076842d6873f2309a001e6af25f9b5b86508ac23eb2868b79ac79e89a2d5c7527595964de004c2289eaa1372ece0dfa45f2a5624b9f0ba1f13ecee3d5005e4258d5507e7e4fd40962c560b99a03d75b5d068f7c9d587bb30757aa6ab0d3aa33eb723f4135c7b4134e15938f1bcde627857f2e78dd4c739d6c40fc92ca70ef186bb94318499faa76756e75fbedd9764f35a76a2b7b8d6334a95cb5a945fcf990d38eafa0267aa4af7e209a029bc9c2a89e2a4db6276dc1de0f3b036aa54b9ea2b478fd94012ece8a44d8ba18d1 +SS_N = c9657c414998e2f964d2a6b874739e2c65cc91f4cdfa3351aa54d03422339832 + +Seed = ad4d2d306639620afcb3753a137f89331836a5adce1c40bebe77b82d43a40d3249000c7aa3786406d5d5fa65462d1a57 +SS = 723ab62b92580b3def8ce887001eefe4d90565aacaf5430ee2aab7decf99db76 +PK = 8088cbf5af263ca1e86bee14759915d7 +SK = f099de1ce5c6c0fa7df1b5b18ab4a33f +CT = 4eb5b994887cf2cbaaa149cd2f9a9069 +CT_N = cf3125a6f30cf0d78f4b76f6c6877dccd180b2b8f7afa1ed7326a18123c0b20156902bb1fc6ba1f4f41a006b15e41d18a76440e5e20b2375665806c3ef5663704dc098d1e6f434a56f5f7579b860284fd8dfe84970cc47ef1afd9e4e3b80a3ec8fd739cefceff6567dca0944ef62af068298afc6723f196b4b71161c6177e2e8ea4a0f9dd37815b70d2d71a2cddeae73b28c9ec9c8fb5727eed252fa167543a77004f94598a32152a22bf611d275d1b249efed12b22269edb10718a49c3161b4a387a8654a509f9de7c8e1dab5a5d13c6b5b480c87a7283aa8df023f0bfdca6c32b18b7ae3f1f89bc22261e1af19202cce59981284d8094bc146aa0a0bcd5fc31f5c3d22f8e39aba1c4f5384e9018c0afdaf395b761b64afbefd50a89ed99b820b09ba286216463213cdd3e5239f263328419d6c8f377896ccc6d49cac9cb3b19a643991d1c1e9a3b3f8482a031f99e1ca839c0339e8141eb48c4a93115514cfadb9c47a6eab8497359fd92ddb442a8ae5b2776bc0ffad5d399f05cf72b872b492abb55f8a6c0c643d8fff627875100662396a849bda878b90895b93614623563afd24d76c9e02a85065e9dba056a342f0c7f516a37235023ebc18e8fb8fb6a675fcbdd5631ffc6930d7735d74bf7d7ceeb79c1d6d827ff1af5fb25b9cc20b9387fb11bce9c8844d1836e65cad1bc3f5087bdeb4cac03de28fc6e31070631f36ab5526d3d2f886dca8436122c605385985cb5dee7b09ba88d6948a7edad4a882a0bf6a38f9ba0e9f0dcea1fa1d19fb68ddf43eec7334c20ea8c7b1d633b55bb3fd43074b5d725a0b92cbcbc35221dba0142c5a942fe841515d191de04ca0a8540f15daa5c5b43726c1e0bac85fef0068ecdedc16b2e7135e1c24677439d9675cac9cf64fcbb76a18c1d098336c76cb5a04fd2ac395ee7a9635375c6ffba51f9c44042ee1df0cf368f35bc71aeabdec02cd35c3bd0b5943eb1d99a8173f43a789cfacea1ce6f1966e869498d097df7dc262c8b5efa22e5ab472461333a13bae03bfc8fec7699097ee8574ecc0e91224c8a2c10eb857325c627c197abb8ac3fc3f579f0eddd32a6c98c3ea07a2a441b3d996dcdd304ee23f04c26d68b1707e3dcaf4da34814caf447a3009a563b67db3e1b2903e0e56916e23895ca0477927558f7330d4a872f08ced8e63f2332d07a7913773dcd7592e234cb715e6a27073fea32461d04f92abf91fccf745fbbfee40876ad5e5bb403f5bdb0f4a0fef88b1e840e6c8496ae0a70a8c968116e70e4e10957264779c27b5cb93a15de977622d62cd92c723fedec110b2886bceb7f9888f426646dcf012a64c3ed2526fc81f2f65b0fccaba418650fbb550419247defa6f72d01e6821197d4d4247f08a283a6032386c48511fde52f647b79cffb6c71a1cb0d225697b25c95ac5538d9ca850f1762de8e5c88c404dc016f849612427e173eb691e76e4ecd1398e351fade49163620c9675ee6e8b100650fe9e096032735e49376e95ab2d82e0f3ce67ae55e315dca3249fd7b68aaae3c87f78d812fdf9e07c9a3c003429e7fd0880f21c8f8cbad3e9071d29db308b142545c4f3655522aad8fac8ec20e47069b3362627d64c52ff223ce8882ef76180ffd16cf20d3f990f1832b2c8df2d1a07e3dc3c6810154d3673ec63b4ae69cac5e2679d8bed7b0a5cedc66f706890f9d46107adb83201577c4d8c105fcf807c6c0ff637805043750752378320cf30135e24ab3ff147743acfeb795f9bba9dde30bb70d4135c4a4179c64a209d2445a9db289d2896ba64cc524e898085a77d9f4b8ab59b00e947e5703fd4f700b99952bfda9de2eb29e82d6b004e937ebd3e0ee3e427d6fa970e5b1ca1bba1139db52f3acd440ea7c21a02eeebf1f484620a52f59bcd78c89b87f23e98a1b2d44f35089087719679ed35cb72dc6af8333a8c772ccf0c4b29b506cbaca82a586cc837936f7b501a04f35f755517fba53812f6e618774e3f82e076e68f51335d6eba14ae78e64c6085335bf1ab963ad776ed6295efbf0ac102722ff0708b361158ed234135cf5465c3f8d0794c4619fdab5463a4a954b9c33e15244f78bee8be0d1cef8871f32fb8b26b50d2c01f2df03e9c47eeee162132a571890a082e7d30cdca42e3a4aa28bf716d7be610c9144d3d9ddf3e15440498caadce67a7627c08b54cfda6c79ac32b908b6de91e62 +SS_N = f595774420dd2cb8d039f9ce8eb74bb9c2952d94af91e8e86e292fff272a7173 + +Seed = 950684cb360ff0c011fd02a09a273c9f023d0a34ae0aa338c6f5283634ae9bef5d100bcd48f6577e5910beaafe6c52c3 +SS = 0fc062f77b22c6d1e9124b60752c5cb2c22cc7e04f7c42a61f15589ef9bf6f06 +PK = 211c85c8fb77d3732eb499dd04228041 +SK = e52c9043bff543eea1379349cef36ac6 +CT = f5f731951cd035309ad67d13e188ca88 +CT_N = 2955adb5e21a1f72a2e3cb633a3e0f42fcac9096b0d62e4a45878ffa0fd6bdede4118fe325468a6f2b7e91cb6231413354c4c655d9aabb9d336064673f55857d2e9b0835d165a3bbdf8fe9de7e14be2ff03b0ec7e517afcc8bc682f6d6626491a9bfeea98f961a2a0740ff32da198559fcf5ff2c38695d17dfa8925569c13e5e0e7978f6990f9feb3052ad995b2405a010de041b36ac3c28e4df6b64e6bcc43808e63e1e4b76de4a7dca791c263f107491626a3054c229c648a89f27ced4670dc9aaac3fb95eea408833c318e92ae9f9719192b6b641685c6bf900ed4108245828aa1b7a2dfcc6f882701df533263c561bd28bc3cddf84ed00eb20da09f0089dac580d81974a75e48d52e1449ed97c5973b99a5a5a0980f4b140412a42312ad1a07f23a6d0b004437248e0de79b6e58f339284aae8c365e33c4a757d59805538ff8f1a6b6352a319291bd62e4133a8c3537bc378327d7585d61432c8afdb358eb785d8167bc494dc02dba635d562800a6fe345c7d52f6f78cfe00170324349bc8668ced5596b480658ac7db29ae8193d07056d2077a7c39414bced8f4e7312661caff6bd4cbc9a4722b823e90872bac85d808e805d6b8e7a45d90f904602f4a38e2163ba848dd5de4af6640400c8db59ece3537ca6e8de78df4d59c96f7cec9b525a0c0a784bef4b800f5a22d0d5b3441f88ef10dce8bc20ea03202e4393382f1c688f730b4991e97e94d404b787fd15ab213af68859f6dfa3946ee932fe944379d4dc263a4ebc175a99ddd83b32d9b7f848fe661c60473e8090e005730a770544e8951c566bd81c41d36139849a490319b5bd218d292dc8d49fe7ac7fc90bd999fa4efd83f1b18dedf39cb861e9a861d0c07020d6dac8cc8b8ea57ce890f295323141ee64472a85425fb6b860c25c976d70aaea1100c664d90054defc8caa043ea41f229179dfca9c525e0cbd3e43f797eda02f2072582a8c3fe23883d6cd28269b056e404b99379fe0ca83a0dac9ed33980dbe3b178275c8e0500ee36793e6199df4684584cfffe398bfacd28eac58bf4d83bfe4473cf45a965ae32aa770e059c24c8b3e7c02bd333fac5137c0b5bbd34b356ef368722959acaf3c6d042a2f21cd2abb059519cd18b2016997ef854cae1def19f2da5bf6df3a80c08caa17fd68e62bb6e928821c6ec0b9de6fc132b650aa1b919207a7759f87c6381d454d669819758533883e417fd21cbf44706a144b0bb183c8d6d5607a9ea29d72fbd8f9a290b4990e5dfe27c0989a4a10685903404a9081fb9af610983c6101f306f8bf96134f6e33168f583043b42d5df7f6a907d1d0cf3c8598e8f3e4ebe791bc74965aa917527980dc37cac0a1429e9bf310fbb90e6def45086c3fd4cbb6d287a00d7ccc2aa58ab9ac8926f05f11cf8f6d25097b459821fd55dd7a857fb84499c40609f598c8672f3397c3437e4f423099364b0d10c519eb68b554e811a241eaccc73d6a4b628b528022983249c8f093c54c80a2ebf512010e6ed625ab32c0a10e17a98ed42caf2a37f2920fbc3b5ce7a836f61d790f40c979416e87801a6efeefcc67720385393c602ceac62be6731b789d5d2228f5900d42242f530a36bc7cffbb5cb5de8b1c949d2fe04efa052faadec438f2443698b83884805050a927b8d51ba2bd8ad9e88dcea172c02467b148f4d93fc021ac92dd90afe63958dfbc4ad836601492878d2c484619b2c4fc277b7e594a09552c98efc5a41762f15694c48538bfd5e234a1f1b28c849dbe8811edb6e9480707edfd672ecd8c0cba96fcded6e9c87e3d49c72d52803abe460bee6fbc6a3794b55be388143c04d960658806d50b17791c15dafe71cb56567bd8735f67a8006f3f5a5894afe45bb057b2cb2e4c6291b9e0a8eadd4bbeed498bc6d4b653a1e89ce7cc78e4c08ca1bf8b0f15d9d7f25fa0a6dd606a67748260d9191d5967aff0da82a4df1733e8939ce057d0544e4b9ab167da0c0cb15a8309632ad739ae282b6d328df0a4f6c03c7cf181dc7da1e9a10db7ba31d0f8ed01bbe4dcb7134a5bae07583e903e1f5956d06cabfe7c3b07399c6cbf1ddc1dbfb1b3932761e61de05de525fc1f76f1facf8b395cd1709791e6c09c33248684c88b0d8bf2660930ebe4d5ae63067db00404e24e4464d651e4d9d59f381cfbfc761ab2792aa4eb8390a0d0b8a91a75a0109a69bc155ea7b351 +SS_N = 9d9ac0a4f83d15f6535d56b7bb80c5f8cff8d979f2acad144b0a18ccda9978e5 + +Seed = 0633ccd19471803e0ceffc7a11b2e7b70c3329dfdde5be18160df0d4c609900d67154893921376cc4b4b8c586e3efe79 +SS = 092464b72d6a6363ab423bc5ab0b4020a6a360df2cf6f6a5e1696b62ec6ce43d +PK = 53c080cc877178632aec4efc46e575f3 +SK = dedf3958148d95251355d6a37d119940 +CT = 5a3461d8f650525df609387af639adb5 +CT_N = 954f5ccb184415b8f504f5107ac7cea3b97f2c09a2fff1ab075413c508057c44adf9a29acf7df85ac138d2bd129a00a839336528b778eb1865cbff3a4988ea04ee311fe3f4d17c6f5aa2718fc760c01d3be4596fc9a2bb456e322db7cf68bac12011ec1146b287ee7595bed6dc689f91d22747973e718c02727a8947cda37842dd62b573477230254d1539e7f6fed73adeaebec0af86ebc19febcc10f16de0e6e0aeef839fd4bff66bfd37e52c486d1e1a5e3e74ee75ebdcfbee3ddcd58b19330d15fe629b62663d482e752484e75cd62e16fbbaf52c9039a86f4013c1da7898a6d685f593fcf4ec738c6daa2cb2ba3d08405fb500f93681113430008cef55be62b4464a2e8c4ed6ad49aeb1fe7321964fd6085f28a4beb177b68669def0bfb2f6c666fe3aac2ffcf48068f3264f87ea8e0feb29e5baaac91e3c8cb7ed6447dfa5611b55040d33ad144f502b2d93ab857ac3a76ac609634677115252828c5feeffe26a889a3bc116082f1d511c95364743a10664304be0f4abd464dd64ef9115d814928eb5bce0892f627429a9c733c1d999fa46fa95b6fc4bf110d21dad1b3dd80a5d0f44c337515f661743b0852e343bed5b59d8c9c9a82e1565a5e2ecaf2fb3069bc03656e108dbabf49914a34241dc2076a1e1fd0d9a93408c4c90e48ddef8835fa5121d084610e4cabe0cacce748982cacacd4896dcec53fef4419109fdccd98c25438282be3a2a008577e5d871faa26b4452e353318577a7c749d2a96a1a45878d8eb98ed004cbeeefcc9c9c1044651f616ead2655f21d344a639afd6f925117c28458dd0c7a0c53050e4ee00ec48d3f63e62294ef3ac43c5873e82d4f557e15cc6bdfdb2c12f110ed235533203f5bdb2ade0d5bc19cac1a4c684f6fdc6b54f30186adccb9b8eb2ae1ad4e0632955ff386fcb23ebea29289e8cf328e12138cce93cb9a4b46d069d51c8cfc69428156f67832ec0df7781e8ac6bd15e5b6783b7b21fbd7eeafb791eb4203dcb432a40d0c229623fc7aa00f024e0fc61f1394bb49226e831473e216a3713e04a35ffa3fbafec5e8d8de3cfbdb175efe74bfaefe5154e6b9320d6a88bd45f83093b8654e2c9896f3754d2643cb3a6771d3a41d72186377c632f82c9477d7a75f38a93b030ec7f9203a4bdd971b91bd2f7866edff24b33b306449c86079685dfa9dfcf3ba397f71cc35593c9e529cd646d03c2f48a3dafa4f83ee51af9f9515287b238837b9ac3f1decf588f250cfd180afad34891b56c99fa8c45b38cd1f3d17a260bb8c148a3754fb22d99133da518f156f99d681264f2d5f7a84aba3f628d8bf001b78137d81b61eb95d14d34ccaa289f139718802849fe3ace3cfd2941606095aaa02dac951f4b35557f74734d792269e74896e19ca1115862529c60ad71fac312c038f72bfe6e42b9d9bc8dfaa4ed65deec76e7d6f402992a9a6cf5033bcf8493106cfdbefab830628ac576f53a92cbf40bbd49aa502d2712a28f698965d8519fab8e8621546b21b9f22d90a872ba757d9ed62d293bd73081308d4e512601b149e09eff6f1fe9dae8a027dfca4285387e8e1a512ba5c85f6791370daf2c039fa6cea501dcb486358228a8c55e180930344aa70c5e0e41540c66bc66bc80a915fd7f08b469d59d6d23ea0867ceb4571cdd462b5af2a18da9d6379a655db96271fb09415d328cce7e9e900ce8092100936b42c423903df226b2bc471a7dbcfa32cd42fefeaf44e1d609f53f5f4a206fbb03dd6d970b19f77c2d810ed0ceabc69ba8637df5de5ae99846ab8b77afc6965c68a900066863b107ec6d87951bbd8c2f7bc574a45ab8cccd21d9751e939a473f3ba2ce535d23ab9913655f5b2c9cebe9d0ce34de7e525f5f5760f109dc91da424bdfd3fa9c71b85daa9eb79e3adac3308858efc979a2c1b65397018293175045f3211c98d6e4736ba462e62b07bfc80df8b0c3225448066f90febffad342fcece58bc076ac2adffb40585e78f2cc69390eb4d90d253362a82b4f2a86bca8d0861292dc67cabb622e3c8609632bbb3836597aaab69407f96a0c1a11923dce4ac4c23dfcdb02a257590fd0d4eaca74ccad378d0519490acc399472f67443742a976e915394d650efb3ac4d792c46751315bc10292940271ddfd761f8b6e4ae6a251a0f968967dd4cca5ddd57badc428edde548aa201c62d9bd67ae2a7cacf94bd2e +SS_N = aa52651f8e61bed7d9925e5b5101e7134c2a9309dc5051fe9ffe3988f99f42f9 + +Seed = 2605426643cab04b2801416b3239cd046dfe7ba59874a3a05c5b32a4505f21d8b7217b5ecc8646fc6a845211ae4bc708 +SS = 8c38173cfdc8f0fe7446e9856fb0e33dbe79b23355bc20edc0ada3b8087e5816 +PK = 48242cacba4e679067f1d60ec63831c9 +SK = 4bec5250632b82d4c739a8b4910705fb +CT = e6f4e964b8060e3958ac25d6d3486102 +CT_N = a5bc0cc690767b203da8b72ff28459b5970fde7d2b85ef05852c086e8cf1c52fb4e5c8a75b8766446900419ba87bbeb06515ac7234eac06b1ac6070aee288c6a549c634397b821233bc340d133e79f22be2e1a0220bc2c29f8d2d830cc591362dc48eed220cde66b53db04cf7ecbec6ba68a1099c01ff0a20e1a0e380782afc83ff626f907758d06ea5695272c1bfc357b0c9ed4f899066eb2e6992e780fb9b50b6810285a197a0441805618870317c55323c9e72fb01977348ba70c9096072e9b7f26dfd099bcb0dc6e5feb6925fae31673d1f517da79db0ff4066fccacd0f9411e3e83af3ecda4313147e1ba774c9d3f9b5c702c20596861f85183e5a0689c2c63c61a45116a2bbb4ea0c08598eb30526a83f4875084b9dedd864f6ef179768be340478c0d1374e2ac46b5626e971a2e299f3f2a6252eaab43741e259ef18217bb0319161b9d90700c3549ca4f803d4c46cb25463c6e9907a3c918dcb74c2b94f4cd681b9ca7e74a474f7f88d3cd0964920d470532c0c151d91128581a8af55bf7d8289be3a2b8e08f319e7dcd658a64296f7ba919acebfe275aa2455648d70baf7ce15bb01977b70efe0a1a82f7922b06c64ca15d45c11d3223d289da13bdde901396feb31e059f94be05786ca9b4c40454cdfca4cb85c56ecf529c67c6414436632c6776d8d87e28866584422b19270a9d2a0c548482cfacd05351af60ac95888dc5de848989505f3f781aa388607742a29858aa85b089431c1e9f88a9c03320cfab1a895c75caaddbe110e372fd2788eae4b9d7c78309b438105f809a9f1a8a0cd0d1b944ad037a5266f157eb4f56222131bcd7c0d4d93714d36b017d946075f44c19168897a25396679c73af50f5ad697f1481e9e456f9e98edb0929919e8b1c5765c5309b55859a48bb2aa78ec96e0e7e22f549694560ebb359309a8032e84af4c1d6f918fc7d575630d7125f73979b3a2113af86b125d3ca574d4be0b6193ab98bc2628063de2d14ddf2edfe412452b4d365ff831569aba8e3ea43e858b75e150347299c2dbdae6930110bf1f217588391b7bfc8031cfee0db083a45633ca609a3e3a31f6e7a113544f790869701efe71c793210c9eb4e351f79df841c55500b54a8a86ffe183c1be8ded8f878180ac311adffcccfd21da927814596ff71c256cbbb5e85c78f439a790650c9879b0248007f79ab42f9212a37a350bfb9cd207c971752927d00fafe88eb7a632d6a73d5a499a6b8404d59bb617410c326a8c9014f0eff96555a3cb190193e4712ff125993220164ad8b21fd619ba0da210653a502174818150b02b66ac0ad5ea8568fb907898775a256c8bc9b2c9e7d8b35d67e26692fd8fb40fa84740848c9ff4a7ce248da0994888e3a5ef404997f4935ef94db37a33064c28a6eece82e9558f35f883cd2143002f52f25d004541b7db59039afc971462affb66a1cf4bb9f5727060742320f2cee871f5a1578e411a9825b010ef5b1a648f2ca5c9d19aa480afe661acc8c39073b5894882a0fc8572b33cebb5bf9bb4a93114bd6f988d4a629128c9854b2b0c58bd6581ad4c54e55a66115962193b3e7c9dc8cfb9f140bf1b139c47dcc5ef2376216aeb3ca3a94946c6fdfe729a0e49ee2f6a0fd7da68f340bceabd4c57c14ef98a69e9fe068e4a9dfc618e3ebaf3824862920c0eb06bbed8b9914910fc453177dd1dca548aa1b11757a5f35ddc3a2c287a129d061f00b5c5bb605ee02253782cf4e291fac15c6c7063b875faf0e29d8e69f67250de85a6ad0692c88d27eeefaf6393d4eaccf43eefc5272d221b66c237250a7d00b3e498b9e3831a9ddbf058b4d4fd6ed8608dbb1a83b5a1d8a77580403f261185ce51d3e87e497553ba475e8cf2e98b24d054a797e764041564a8439cb98276033034a36683184596507529d23ac44fd2ebc9a4e6dbfe23490edb22dc37db264d0a22b2a88c2fb8f0138fec8d247a1e56429d13eeaa7c2cdca6a615aee21645e6cc3948aaff2d58e869372e0702b1c3227786f0d52e7e37300b5e6d0382682b0a09a31aefa9daa567b1662624991cd5f2fe10b9ed51093d273a4ab975667b5e903371f2f77df5d16999cf579c9934fa504fa868bff8fe06fdc25e7c0fc588fb10726220a8b53a83d8ce2594747f19333a6e67865513f0c7052d887319f5f13824c10d28e9ddaf71f7b4b79323fa2ff97eae2afbe +SS_N = ee7c27d1da080da3ac3e97a5f3db19e901a5107030935e96b6666869af1afd1c + +Seed = d3880d1b7802b4a3277687863c5a248befc95d3e4748403f3bb61f83abcddeae42ae6c8624812fd38f463122d99d59a9 +SS = 8e012f050fcde79d0913e1654a7d939a835a4a57943e13ac0fa2541eb3245ba9 +PK = 254cd8fd7c64f817dc116719030512f4 +SK = 5faf51bc7091f37b0c0ef9989c4a38cc +CT = 86819656d14d58a09023ad40906eb870 +CT_N = 9767d90bfc648f8e99ab16d4b307eeff2bc9b577a235ecd5efd5e87dc8e297cf222363879e2dd47b01a6df3e5a004321c4f1b571376c2e40ee8232e5d6b9f8c59d647387549b908715887344bc43276346ae681b0123b9bbf1a6ea08b776866e22d5d81b43090f2a38dee3615db654edb0bc2478c2d13b566869f17ea78e57b803effd14d78a16decb42118d14e51b63060b8c14d3761c821b71b5fa724e89a8e4629a454521c00ec3af1fa0b709062475f0ee942113d654a3248a82904047e02a16264cd7dfccd1d10f1c3d32634f38f58506975b54cb57253d94dac612dce59a1f5ab508e6545e0a1d7b75e14e0dc92d52e3b4c2be5759d73097f5226888ca3b05264eb4bf942d6a93f5aa8a8ed3f1a22cfaa701c19779a9975e29158957b8395f126e74306770f48dfc7104f5f410751105a89450dd638bc85ccf30e05bdfe276f5a4737fc5de75e7cfe09575f47a00e57c596036f93c5907e3f262311382eb8a7490f0502172b740c8df226d637e0addc3671fd4804b150127c0fe27eafa23d609442c73bcd28eb7428eb98901f63505a58cfbe4c4c42190e83801acc741024b189a9811f244d4ba2eef3ad661066e00448d97ba88bb9d0113abbc327d1fe3353045ec54ef285e9748c67375ad6a6fd3eb85f33d5cfa05c1edc1f9bedf6c590940a0d7c602c78e31124928bf02478de67f9dcfd350eec85974abbcf420fbada73cb1026310a4309b774b33e4765166d6046ed27da971e8c7d98c02e2c7a015a25c8d695d01730980be2c7b34eecc988211f7e51cde8230f0f713ff99106c510bf9f9cb8977ceb046834046218919b4861c9c31cd667c98fc9442f4b798e935c7c59f40a5b0e47d555e67910eac45d639e77b95c545f9825e54db18401f84dad11a7c29390a15b34a18e2fe78b914c44cbd8822a57e344734fc127f4e6a205df872631bd2c2fe40f4a91413a18100aed952eb282fccaeb33b704a082c80c4310c86f1b45bd9500f91b7229a2718d81e420cddb5401816a60fd185531d453ae0db1c175b063cde3a8c7f89d9378c932417fa280d3a48c9cbd61fdfc330a905ed3380926a1304a2a5753345c0387af9524dbd56c0d4ff1ee4af85e9c28c75b1d2da181ccbdf761d5426d8bd9faa3d6af0ffa502569971557cbbc833aa7c066e80ce83b55a3ea7a425f4e0fe71060e1bc19433a588ec6b2e0444272c899a5ba9903fe01f7de7b62476a50599fb62350b8169f7eb55d041be6cc979b273f25912157e4e39230d9e59e40fb81e4a5eaeb50cec3b29cc09d7c7fb663ac03d9545e1584adc04ada61bd86cdd03bdce5879cf6f96d80a4f5bdcc32a85593a44a87f2b6737f07361abcf205e28c2e7da31e2ace99d9332c0291dfb8c6125ad1062248b8d1fe31e33db661140dd39281e18041ae1a09aee24a6deb16c8829ebc5cc92aee1c69566f0078e51d0b2f0f70cc7474aac1b954cb3e86450eb783c8190d2bfb3608525650b489f4ea487ac2d6c9dd46c8080052cccb87cf55bb075d89eb1d90711004ee8ca920ac9fe8115d30d5040b6d3119d11d1e0094772563b33bc50074e24dcf14929c17a9143d17dd443251f7baf9929526b14c1b047a9d5e015e237e9040b80445f6098c23dabe79f2de5f1f7f46c4fa4f01a753d1b002fd3d5be6526e1c95da4b87fa022f75b14170a97c55b83e36c5dab304deb42b2254f00f98d94d8e20f4d3fc629d03d873243eeef46d0a8afc8b8efc18a4a73fd5e2c3e52bf9e5e00d09e423b151b0dcb07abfc12b52a35b3c284e498af120e2ed24823a473741d63525134a0582e96c58c2396822aea785b506d217484e968ef2810f7dffc68b2f5b7bbe212092fa1ca792a352ae93d1e420f69af22d4a876b1395aaf3d079d8e8c7f746b35864ae4d15078248af6c32d6103ab0dce1320e87bd8953804af10115d7a7f1b4d6fa2d455a759cccb05fc83e32961f8d0c74400bf701583562a661b6a0bc3adec9802b54133f0a6fe8fc353fdc159267f6fb4a5f7313a6277978bf44680190f9b9b5ebfca8da6a6861eae99b601d35d90dd02440a8505848966f1d69b6677aa2b18e93de15bde4a8a88e2c405e274db045a7a594961f020e0de7d2c982e5f34b7587f35e9a6ab95aef8ca393c57d53a221d97c45ab84b7fc8f85896ef757c2550c747a76d94b6d2a6aa9eda82b701f200bd81ff62a6fafcd112aa +SS_N = 1d247e5a55014531c587639b8af984caebc075168ecd9759002a25232e3845ef + +Seed = 343b81870e2721dd75ee0ad7fdb269eb5aae0ae83a6316ad8ece3c76d3dd3cc391f1b12b22e988c1257b5f56d905a06c +SS = f36ace28d4f9f75afe8fd34ff02ad6c402af33567c5b33f91e5777ca74f8c840 +PK = cee59cae7e1ca5db65940f1a1b2c6eff +SK = 009d0bfabb06608d5b2864fc1a03c2bf +CT = 602c444c8e3d7c3207b21e936aeccb0f +CT_N = 19b46e942815df5b1cc8d669d0644cfaabf9da05e35243c9c489a48e8d2c470ac68ab3c1f70b3930ade530ffa91af30f4c1757fc50ff706d75cabf4a3c072143f5ceace47aa094be5031859f5b252097c895998ca7a4514a0a4bd76b6707bb7d7968e7529c26e12fdc29e16afc3345b71953fdcee48190e9bee8d6df9f4353a7e12bb5402c14bef998d6edbc74702e0e0157eaa6b048dfac2f7a354408383269cf8ffd6c88969768e5ace986c2c0f848a63a2611230df97816b354073a2d1fbebc98d9c59dfd2eb1e4789ddf855403937d30f8df54b24062fb77bc56803dba2337e8dce2db435e701ec2f8464bf3168ebfe4c71dacb171b43c8f796eca800a638d7b2dc052f913ed9ce08212cb0124f0aa36e46d898a6930df71d04d785e18df4d2a61b426ee19e7abb85cd6263fb43cc9b0bf3a7b9f34b51fe4b0bb3828baf98fe0b1baa323b64231b0ad863f522ebe3b7916f298381cacdd75b7bfaa75fccfa2f1b3684e1fe16a9df25e36982ebac878f6eb45918839f1f0c5d13fcb6dbef1c9cbdb72cf5c38cc4e79ee08f5c7097fa6ea46a19dd6435bc5170ec8424d34cb0f7b96c73071618370101576bfeac0d288c2888083a9b697eebd9f77d499f3d4ab3d612f3d529e3a04d93675b5cc37b07dd1df060e630b93c05815bbddd6e798a1b52a2a6be4b9376e7e0011e9bdf3ad5477c2b35e7b6dfb5f6da8605151cd3546a57d89a70375bc4af0108823ca0350687a159d17a7e87766681f71c9252430b29f72deac7e6f478e3b0d64d7d74356f0823bfe72a8445c3c2b5ad6ba1d1d3fec90ab79243c0c0a4f14a48ade462c47c89ef635437b937f30686d47489467c847db47faf73bf2f95dddc3fee9deb5fa5107a20e683396c21aad0d83133e34a026b5457f17e21f05457e4b489c72df3dd950f7e820f5f2aa0a6409a237108a35efeed99ee11424a79a1aa8ba9ad98f4f5eb221c9b352885653dd062cb155906e07943bef64515b9a61c2aa09385f8fcc20df8d090febe6a63380aa2319913dd9a9165b85b45aaff8e2f6f1df15f6734aeb5ed2e4dbbe6724b2d1323825c2cee8bc34a06cf6aad70201b26e13f89412568acd047a706b45b401fc935a4cf74f520fad7aa3ca75ca449657274cd4bcae3cc7e6246c32a248d741e768224d0964162f821547fa6bc10d6cd511d9cc458d23c5edf78ac3839ec7465f61f62b3bbc9cc6113bd866ea4329eab97bd9bc83656c0ba1b5a96207dc3bb7f9a922d578edb6637ad74c3833aca08a3abf10a318ccfb227662c0990b1bc2a19ab519a9522b727d00681f821c175d5415e2db15b89c108fbed0bf29224ee1b0088ab74622bb78d8abcbcead7fa28dff83dbfe255403d40715a52d0cc64904933214bb6b5feea8e56254feb7765b978099d33469526f0113e6dbd52157efe97622e4b15c4034cadeb28d3fe77408402088148954a321dad626b988399975e6d647d72995985b4fd8973cd1e8435c489d3c891b0faf2174957bf620717fe273da7f5df3cb26931fab3390474dafcd46163435e1bb14fe645e77235e25a1479eab52f5e49f35decce3a99fa38471439fea7fe6501c260e73a2d044e266e0da8b83d75c53d64450409b1d18dae799b6387e21055187088fe3d3164dbb6be91a20cc947ad112c418b9d58529c602b7041c817dd292d7d57127c85a8879cfcbdf683ce59ef35fa8f18921972392610b73e7b965055bd8e6abd6a11b5b701ef54c21ed9da25c858649ce05ccb5a86dd870da256d8bb769731b0bffe16747fd3251cc9b3a77503bd8b68f4622a4de217085ce4fea4b197caeceee70b3adf4b486def7f4ec50e53df1fa6111c06360adf6c422a05b06f62ad56d550f25875f8212eb978ca50eff047bdd639d1599bf317b80a41a6a56ef700f6126bd36bb53548c83a0167c6b78c790a8cad2a78bbf24a38ce3c514e37745f3f74d76de8522e47ca7c72fcc809bf2f813ecc959f1ec337b763b9de49c610ca072772bdae1c3112f9430c82791f0b96c0e4e3af2fd9d81a16d3dc9ccc97257b14fa902788cd2ff00aec2e31319552e109b7efbc7ad6ed445de8f1006b4e15fc4fb33308b14f610aaa41296b2c557ec1ba984fdd87d30a6c2e870b5d39779d95b1b5014ff0f4bda1da995f7a57ac978108d4c66a335a301dd9922911084fbc6ea6e498e8bbb2cab2d6dc6f7848fc308ef5dcb +SS_N = ead1efc9e0926912b00c5328af5e904b09a790daae2db8b03e1fac1b52404969 + +Seed = 406d9c95f9813ca6a9e6071d3a7a63093f9e00cd15ee968c3ab28cb7368699491e5662f6b63721fe059d50295c3a7516 +SS = 9cc4abfc04234c2fd68362d14c2ea03342b0d777a7be4222594f768aa8ddcbb6 +PK = 406d0fe416dc19bc1c47808c58a85ed6 +SK = 066e215a4014b4c322283f3bbf5da7b7 +CT = cfbbfca5d53a5e4acda88cf9ac8a1251 +CT_N = 48a940fd8ce0a7105163738acc8abebff47418a4fbad5d680e4d3c6c597dc47f268597b2c4c67ba3043bacd853e5ad8a07158f518d5b4d5c59e76ce44978da79866a7aa968290f550b97e2588bcb6e15a1b7c7dbc4b2f06c2b51723ab3522c05ed6139b5ebf4969ab80ea9e48b6159b79056ebdfb152a1d104b9652294bbc74aa482c7f5778c460d17bd912dbead475d1737afcf6013bf9e20c7fb697d4e929a9d1df5a3a9b4b89f1c0a8bd6b72ef59a6054cce9e6dc23d37e25b63f95a709276a3329843ce95131bf9e515e0f86daf834a11fc2d005b3fab7a99b8b52efd75733a2825c77b7eb1d6f199843902f6088434d92c104e9a606abd6c91b4deb3aa5114bbb8cf94c5008b3c66baab6ca51569481207f27306f10d2a4e308403f75d5a62eff44d9d69485683480bd32b17c0c3614f7d3230686cf95e3313504afe319358f670ae48ce542288c139e0bffcd4b289e94c61b1cc90b3f73b39a8df71996cc8dd3581c49b66c8f3b981d14b8bd9f94ec7f3368649f8610819008a9127374246d98edfa7bf46dbbfa6c9781c6fd09046c775e3c682af91226b6ef39fd85e9571b39f4874b9133c63d27ebdc426a848cc5642098cacb641655244dd7262835efaa96ef236821915e87e1372656c6f882c11f6b9570d29e47d29fb40b452d8c98e2eb795e5df84231475c83ffd9fff771e12ea83fc789f9941027f0c9eff1d379ffe1abb35cf05d5293506f99278df98af82586ef33541527b47362d0f91a48e1e0d5e0000d4591ff21095ea93dcc1b8e4a77b23d19b5999ce4fa64325e1be4295a54819b1965a7b4691bd290f3a08ed3f053016e0a745e4872a9bd7db905d0d2702b4a264db32846f547d9ae6627c27ac4865cf498520c71cfd8f983f6ecae28d4aa8b6302727e65e21c94dd828a84474209737df2a96438e8ad4b7a528ef1ff4fe25e47ebcf723dc0bf8bd35dafb2d99dd4e104e26f8a0ce7b8cc8ced69db54261c3f86fbacb3cc443ae6baa50b627678ec9bbbf38711cad228188887ddbc68936b926c353db32d934f2b40c76750e59dd73c3c1f5d44ee82976e375cfe4a4989db5ab779126304b25c4c3afc460235fd123706a3f9f80b27751342d339aa15a0179dee4086a39cb0b4c4880340353acd36b31ccc90abcef46e986d221d10c64e7d2a6df1306e35b101864da0c9d2adcbdf869fac6c25af28268e8adfd24970e0be8ffbca889def0ab7942a528da228012db8d4ff77460c4bd0692cf398b848b32f0b93168e4a0854bcfb4178aff690a7f2e985ca4ab50b9dbcee17a754655d4e9b93bae575d9e07fc0294e26d66a70acacb83cad0cce4ef6501c8f3dce246d62a3744643ea4f220296f3fdbc1bc489935fcda5828bfba25126a983eb5ce7d15a9c33d5a7403649ec5336425f88c3547b6622ae29a23b0e4f6d3cb56006b3097c9c5190968404e35d4c9045ae25c43417dde753e8abfacacd98e93e3dba983512366d3750cf5837b978e5c66146e70ab19e42ace110c2110d0c24785f148a85e5cd9e4a33c27b14580028fc3bded6c5f8ef93c79aeb280b367abc2221d230790ee5e18a0ce41396bc61bbe01b1e7b24ac67682365737b70dbfa55cdb89c3521b751fe605906cb20a88f18dddc6ef143553321097e366635ec23138e1db5dffa13faf88949aeb294e0bf0c7395feafed72d81fc89a5a16c126788947f1bf73350797bae252483059fe0db30fc3d26c36ad0969640adec33ef92999bbea5cad976e1fa22e6a91bbda8f8ba1ecbb8aa867bc23a6f488e603e3049e72bdbd009f58b6f23058097d4b59779c16e833221c2a0cbe8afe8200f4a0a03b3f874fef9372e8b437f5410bb5c7946c287793063099a040fb60d3c96eb4b343e6e1ca4e32b3f96830c52ab1381083ba4039ba7dff5fbb415f488a2afb5b3ab016d3c5765b086daaefd6b772e1f022703d40027f076f06e3fcf40a4d4f2369fd652ca6307b135b281ffc0c02a594d77c58aa8bb6a76439666097a3a679a552f5ee6bec8f2fb558e5594def7c30a58adc93b4211b8c83a9e71e028978727cc7513c471f39c9461ead9b8b434e6c2debc9ddb45fbd4631d3f28ac97d87530768d9f06e4a080ef0d93ab96057a69afd881b2e22ed8da948142efcf8511dea217363670f958f86add4265944c044b3ae2df46ea6258926ad5a580c25e728be842679a68923ee21 +SS_N = d177d9fc8ed732284f117b75ce21e24dd4e9e480c2bc82a4b3247439fb67854f + +Seed = b3c83c13dd15dffe58fdb6026d32e33e5ef24b094be16741dd5b587ea841ad19b6f026a127678849ec1b459a365fd645 +SS = c7b9a61c3dc45286c83857f3cf188d198889b940416e92dc4cb7c6e3358b73b4 +PK = ff1188e00998866b8d59f0e453fff599 +SK = 49511ca898286bb662415c41e9db8e37 +CT = fef66c260f15b61bce3c66f253dcdf2f +CT_N = e66b5d39721e9168ae6958942e6baff79da05cc1ba00ac76f49191806b4c1081f40d2ea5acef8813e8ac3fd763e2a1c4b0155fbf5117c35137320a20c05c9e9fd3c09e76919a2b3eae942a25410cb59eee75ae1d60cbbe55fe11d05ef3b5de8c7c81b7df004674c67b8039a580d70582576355914804dedbc4d0ffb21f40acd34058bdf08ab48d51850a26ab79dc8222f3a1be18ac0bc6780da8c1bd099f7384d254adb683e5bba9897260828fec7b8ffe3086456bce9f26b20cc22faf8618ef7b493ae8c940c06cf6dc5b534c2effa51e51e6153bf77aa8911532b70ac2b66c5d916924dd36f3268b09975ed08cab97097d2d268e3712c249f41531e64270d9ef29a44e7db14bf4d51dc937b17922e6dacf3c18fc8aa583e5ee6c1c6752e242306566fb67e06e7e4564e7e3606e7937740006b71e69fd9c449bdf915c80042af57dfbeb7fffd0b5bf5064b0cb63562bee0d4f9a3a6e0c53dbb7831399a0b7207362cdd695beaca092ba797f7b7c2a32a7c012ce63525d534cb7ecad2037e4e326d7bd5ef33a5f643efdad38cee892c76306288b630c622b3c192595e4c1dc3cc581d1a25374e177afb13a94fd0a937c6b63730b986677bf10053dfb07c6c3816c7f0a491b9de173a200a330f2fff37f9589dab5e2dc7563e9120f402da8724ea02016f48d59ff754174ce6cee2af27e581e82abe56729920cfb778f11df83b7048d9eff1d2f7ece76dd839172ac5b7ed17433f4e9d7119d1b3e1b29233b3696eb2f4c57fbcc8e39847403e56c82fa47c303aeec6a9947f6670627d04d32a4a22c667432853c473362f9f65100c9ef01fb33fc2605009d8bad5c7d9581e6f6ebe38e250060f9ef990174073c7b34a7f144bf4263f6b3c240d264c3b203abcd99ceceeed4610060c8d109085d9643646ffdc9e89c86f7e545d5dee4ca3220d4cd04cfc430ed3ced5f6cffbe1962fd76839a76cc971319dc618055cc8e3d41c1845bddfa4677a431d7a1d53e67b99c9ed3775d689dc48b29ab6a2f77c6d8f10d78686d818818a5676806d79846b729b34ede2bf06d78d9b11fad507a2e563d3f0f1b3fbeb09b0a30bcb4c7ca7ea597393bc6373faac724e97db8e9933ea42a2db8f57156557bb0c03adb5e362bfc1a56161602ccf6cbaf93bf2e6d5aa65f89eec5ac7c4351be897694483d4505ec98f31e5fcb020cf2e00036bccafb5980017a2cd0f85dbf05b7ab9193f4a6e01185f85b500a0dfb3593bf692748e1a2aa28af90fbe0a366391ee3c9b05ffa39f6718ba101047963e12f5fe6bd29cb2815d64a34bb6189240d28109da2dc80e26de2f76d8f023bbc04bb6fa3dcd0ebfefb2e7e67ac2d3d074bf63136346870512b8f08b02ff823c1d70b7daa01c0bf72139d6c85c034ab927a3e842b0eaf3ae35ff975d6b062dab4141b0d789a0b659a90cdf78fd2788d973aa3ee6134f68eec21801fb89e9a50ba8197fe8219deb5e04a4d62fc771f59e199157d108759872b30c08dd60d1ac45df96c4ccb7a24ad51fb5dc60b8254bfd8f709ea325f9c63942754a3f2792db3fa905a5f814e91c1b572ee826f834291529057b437f78f99b88016403e4fc83aceab18b0aba53faf5e3403d5c1e338e072fe5ea513d0c9fbb0d3071626d40b13e718dfd00b980955f6d7a5da62fbc1288965cb2db576fcb9f5a0a9ca1bf875fa1219782954bdf1e3603109e59c622720ea3ea10adec5d5f1ec841ccca50279d2dc6f275bd089009e6d0e2bfed247380da0805a1d28f356552c0d3551f8a4dd7a5e4c6d842ebfe60d1aff0ecaac7b19e39ce16ed705fad4a4c2237535986819d1b9654dc838a5e145d936931fdc1227b5fd6add694f9662e49ec63863db987c9320b52bd14cb6bd4d64a92be53ae17c3bc3a44f0b11c90171ac3f9a992470f3ba9ade84a85deef17598b95974149b3dd4303e7c36b0f008547bc95388a6cdb7ccadd085c7424f9ca1b3451983c207c8300346f987bbc196f58c41902175b2ecb89b8216e499a2b884c579f9db1301bbf4c844194ad9871fd7f210af3d34c1ed725e4a2a613ef5c06ceec21b9248b95a476e0a68454bf1a306c799e2ef5910c6cee7a44cd7eef74bc3712426e18e9df669fcd87a914bee92ea0df16deaf528d63c97c2cba435750bbda33738a70c5248bc66a4e859648225755e1a398ae159d3318e53d704b45a9e5b4aaae31b85 +SS_N = 1cdd46e0bc9f31350fd5d707221cf6b41d940a8fb204a63cf92b30939c336a4c + +Seed = 937bd532ff7c92404aca9c2389e314f72d780234e1fd930f967a724937204c59877af25d38245638fda72b0ee74f8492 +SS = b7b03205371260b2c54dde2a1f981eda1f6810e11ac9a661b07e3deec169d1ab +PK = 0cb59606b80c19b62f6a11b52e77c882 +SK = 6d81cecf0cff815aa584979a81a8dc03 +CT = 4fdd0eddea7446f1d07d9380eed67acc +CT_N = 318a79fa0fa37fc36fdcf69bd4b7b245ec6662d4f709350d537c75982264347f54ca42a5e1f644bc63a4c75d59d2dbc08d585a4bda29e91cbc6cd6e245209df1e8c5e4e94ab38e752ee403039dec5cfe7f06f3998ed6d0af50f2c6bc5891c68d801e0325ee572bf8ff7065507d11e51cc482e9e787afa855f8cd4805d58eadf79d08a132d2be9348404341aa41008276c42575a12af3859dd602208a289a4982b43f29dd1a1a25dd9c55dde14ccba5ff4d6312c3ef1a0bd632fd8fd3306c15d723dd6da1f8712a11369da7c221519f75f94ad5cbc3f7089cfbd041eae517943cd633378cf456e7bda554bf5e9338ecd753e3e09e644dd170e6a32d720e577c9b37651f81f3c90804559cfd3872510344e05b9af32ba6f3ad81453ef3a80540e219acfe260ec27cfaabc332ac7626f05187ec616557432f8ec73c44697eab699fdaff19fb4f035dff9eb0d94b7c793309ac955501d19c3342d020842372bb92a52c32f37ded2290499664fb894da957e4377ce5b2f767e0d968b801b3f1d1fe759d294d78a563c17d58ed70c9720c254d305beccd571c11b80f6c1fc0c68ced79b137328d0a9f759c08f9e7393fb9f29994c9e2376d9bed278f3013a20aaf1f47d4ee60edf53889755557b31c066553940f8a399f6ce9f285a387cb86f3acf97044a32761fef00f7c6bdd7d6af378fffd254b86022dbdddf278bd6e0998a8ce900288e70e0c566ac1ec22c5e42195299e90de0faa6b48cab0ffc10e2c3ee1765d162f7768835c704ebe25133566e401b39dfca8267779c649cd4d20eea519367f46493462d9df58e8bab1ca6c7cf13e1ad08549d4865e3a99bf342b9ad9cb7816f28ed7c522d671b7081994a52a9db6ede9476b3dd6fac43565ec9d1a086e761ee593c70445016da49570c37000070eaa57df1c5b024cbf0aaf4764b438ee9bfdd8466cb75d884cd7be31c3c6589d291dfea06a49437c7bffcd3cf626cb143cd1d5704b1ec63add7f3daf1b847618814ae6a3ae0bb04a2b73d89ddb11887be2f2576e9fb72a28d4ce206242223e5aaa0639b7feeb35bd72e0b9895d2862febc8a6d5f24cf2748d207bed579448d2c3cc43464a073b6fa691a5446df1f347a0c73c70a798a3583f0376cbf94394f748622833a2b4983a12a4523d7989f1b772ed2369442b44907d2cc70b80dbd8b2a1d7390ec826c178ec7bde7537f99a2cff88efeb02af5a9840be9c1f2bcd6d3947cd78eafcb083a514586077fbfaaa56c3f6d6ddb784a50407df1839b5fc93cb64286ebb7e08a37c3358efd523cc85b941b2fce585c9cc7c9125cf1b8b55c22e94065f8806e298801a3afe7aadd7fdec619892ccac5e6a2bbc25c1710deb68744a5f1cbfe6e77f0e727d267ccf0f378ed05bfaac31854c06c5daa808353ff432272097d881d459bdf62f015609292ff497e07ac3c72aebea6e25c339770266fbdcae805f2b89c36b402fc8cba3a8a9a66e6f449ff896403a8b279d104ca2fc7e15b3b8c1ef7346850860694f65a8220764b48054e7c570d2ed5793091dd88432e281270b43da5dd7ca65e6ae2c4a03b44bc8eb8a52b8c692284b897fae142ae5eded88bf955b93365e725fdc4327ea7d36d62cb66be6f1028e4e1771c753ed35668d339f85c9533f1c48fd7e420483b27275d7f97e47e53f5fd7c3ef41244581dd51087524a05ef389531290703e990ea23fa573d28a91856de65cbd72164657fe3170427c645ee05b23e438a4ea81a47197464a18e3c2c3b4f0bb8396f6073856d3fb517cb1e8857457b5854278414cc5c228a655f07d1b1179fe081db2e3fd4e2e8f7ed39c566db89fe2047ad9a8625308d45b0852fe3b799193c19894dad4fdb7e441fc7856a0c7d512d255835aa4ee47d82afe5261f703e2cb4a7924cd5a8058facc04cd2347cc42362920c3e609bd917dfc0b84a9ab91a2c1daa4024469f083782ad3fea84c5166c3d75d3660f288fb3a7e7be7126d542001c56e11c3891241ac17fb0633bba0880e22eb1c6160ea827795692a6f92c2aaab54ebb50be9dcadacbd337020d0f76de37d26f086156fad635511c10153b1737c3eb660bba2f176d93ebc3a822ff9351ca706745834c96ec4a012183939fa4c91a3160b357fe384dc7a38ff6b417f57a3cec22f606e85959b401a5342c8d04b1c2d651a837eef4a37c914528c2c6b1cfc3c0a922f4583398 +SS_N = cebe6261129636f30c06f33276e2fe432c89cc23bf01acc0ad9a42785a0083f3 + +Seed = 075d939507ddeab7c64fb847edb74cf693866bea32c93bc5c129cbd7141c0b79901b26992481236a56cb404d464da0e1 +SS = 816f003078eeb9f1c57d9ab6c130e86b1a535e6d37695128d6d2c907ea70d74b +PK = ecfcef0bd0aa851de7c31ffba98a7595 +SK = db7837a103afefb2bb46a03de0d26c1f +CT = f6b9921eb911c1c02b344448f50d4954 +CT_N = fea6d5270c4bbb27b421c16e16a67a4c7123ff3d63398358fe0bf031835c0f1faf41ff5ac346052ef8e60238eeb02511db8f1027885f0e8aeb583f2a3feb859aa2a731b17f5c221f2b5c6e8ef42ce77375f99e0c495f1d6b714de74a0c526320083836bdf76775d0974fb1bace841ad68b336d7b56ea9b0d2192eb1e11b0b4b135c9f769daef385d53abb9e6ee7db3d38761f2feb92628bcb37f94b2b9d64ac40430db4a5711c1b8407989fd3c05b50b5f44d735d1faa394146ab51ee74b9ed4a322ee5de9f44eeaa06f7811e59579e8d008ddfcd770ce290838ebb0640ef47c219a007b1a139591721deed4ed409042ad4a5e537c579749611e3d2eeb7f390061795c4b077700f4e0c16afaf8acb99177a792fc61189ebf2812dd6b03f40f0c3445b807741b161c543b06f8e2dcb778537a987b0b1b54f0c649b81e2c1a0785bef41cf0607ec6aa4d54fdb8933b655dd4f83aeb8c438a85f0ae7a1bb479442966cc6b728fd83845734e7bc616993c743c0b5db4837b3f6fd27c9e9d9b20804b47b93d996cba53388cc747a724fe95e0cefdf4e525988071cf8399adb0fa4a51e87c2b7f7b8c74131d559cd7fcffd5aa5a0b83ca539ca88b19ca8a36a70ab137c8f5f45cef148aa894b9bb2189c0f0f296de7c06770ba2be3a550b04964f6898d96af286f73231d9929151b702ebfac3477d7be1da314732033939dab0563b21520433eff7e834580651a3fc91e3b3945435f0f3f14b54ca47688174f7ef3f5cb750348a39ce74665ad5828f5876a7a0e3768ab5ad52495ce0ffa696131336afccc34e1bf3d4ee7fb536304967bc03fef81abbc664a2ad16dd6b5433796a49fc08875d17fcbfe62d5c5ef38434bc30fd70adb2e8084b57db669cab2cea18e6f186d02713e6ec927e5368ad2e8b92cfd9f7b1cd087f0930f54fd0df8c34d09e1c08cc97be14d73f3d13bd32a68302ca91fd9317c36f5639e168e9a6ac2830177e84c6f81fdc828cda126cf8b7c6d02b59b922ab570f9307c8ec5587f46e2f27521b39a30cd01bac1b4bf434c75db28398120ce14dd30504ebe8887ff38969f670ab654d004142e833e358f1c394113813c001474722ba3f8b6a6d44d0b27c9050f079a050bac05bc9993a6825d610488c312008ed9b92557f512de4312c1c19e25042c7313a0feaebcb2b323df2add9194c811b33986a870c940c7d31f86282aaa318138e94fec24eeee745661f92708b075fc19e9efb805a3e9c14517e25d8a007141e673237611486ffd8e48902e5c9f54b27995786ca12f32a57d7b62e6d034954abe450541551d3a918730b9302dea7d51b19e4eef5959bfd2d0bc0925ed62873e11bb1872b081faf2a1b31ee7c3b246f70dba15d2d133b361791b33ef1eff96b1cf796dbd5deb5de31ed8baee06690b2a91cad664b575c43c68c742f053c90d98fa826d1f91519a1e328e42b3e0f9224031d63f2584d135768cbec5e548d3a3fe386340540cace1733d06cb72dcc91ccecfe61c359bc620456e1ed75846e41688e600f963a4d0bfdad8626bbca1916a3148d5427cd6340eee195cd3905d388148c8eaabead90af610e0d8f60afbf17069c442f576be2753af6e1c1bdcfd1b4dd9fa5e03912eee91c45ba8c52b732415ac15d44a62c13405443307aaa941f7e99b55d758f8109f36712ab629437bbb1bb02db42250cfee40cfe687519e22519357d1f261637be2ac8496287c0714858bd3a7a3455d508ec03d5499a1e49a426aae4e6cc4295eddca287ac756d9b0d9a86ad3976fc38f4077459d37f90ab113a313f643fc9afbf7cf2457ac44202c11b8cedf57b5c34bf1cd0e0e6e14906ba103ceae2d880d61a648c47f29f242ba34819b08a6f0ec1ae97e217bc6f55614330dc4d83e1d24ada5c8512750eb0d1f7238257d3d5587a33ddb6f52960d08949200eb8fb790e281abd21d009908d62909969faf5097c24e0d2e7e70cab475bb2e0c63635d0e0fb6ed71d7f220079be749c80c2e877352150ae0e16cf5c8b584603bcf9f3accac9054e865ad51b615cb509b0ae5f3f0abe01a8f94584cce6e7bb2eb8d4727937b66c9ad51d73e64d28493ff1b871895ea38e34ad389bea2cf129bbd496c1af6320b414ebe1158737494bf1a280d3be06c3006ed53173bb177c47bc187d47170172bfa5ecc64070a3110c98e252d54b832ea7396e5267d96c6b79 +SS_N = f3eaa95e67c41eda2cf3ae78199d0ea2701c840aa310472804052f631e9442fd + +Seed = 40cc0df72eecc2e75de19c2d9765958c72f3c609d730911977cc93d3c68ca97a28ee7ab4102acf3eaef5982c302f7427 +SS = e2bafcbd0fd9e7af91cab01212af12f98589646209a50b7d80002655b5bf1b53 +PK = 9a87565fc8d97715fae692cb46c614f1 +SK = 881729e1db270f56daeedcfa64eba184 +CT = eecba6b3eac47b45540217d037127252 +CT_N = 4df25c14e87ed226e6fa40fddc6828687144f92de0feaba7bfda86b0718921ab2230a233892e2a3464cb6ead40a8f9f0d631f9d59de9cfaa71df89c80e318cf8b2e5bc82a1b0284b7f4a6fb56d3490b9d37284d934ae5d6966a8fb31c259d64eccac83d4260ac69d4d751df10059235030ac799b569b0b88b54036b280d3a984c64469987c93cabe45c5db93fdb9b852b9b1a2ac9d72395a8a12e9e3186ca3524fdab2bd7a85373755d384163e3816655a486e13eec146e78be16e21ce76736f4ce8e86176b62a2572a93877a3687518c960fa6a4607b2b892d7b325d847a25e4813bc014cca48ff31151940215aa7908aaa5d004ba5e1e387e7b4b209e8413a86c96cbe0e48bcd04240d629f157662522c1b0ceac62a46d95838815119153f02caf7d7b2c66eb2768235411ab94dac05c67bf48922674fda3052ba93cf5cf8979ccb026197fdee948bf2fcdf04ece13316f76d8081cd64463224ce06cca98fdbc45e46c8382b9432247611347209838bce85911824c1b0746c22bcd88fe69fb8b9de4afdeb9c307e5f2424f6b14987469728c6122fe031edc8b1375c7dd7d89940a5e01b1d0a64c0bc063c61e6c70ccbb79c1e9da886d2e61cef7f8e3e3431ee8a47822bc62ee5bd74d6a3af7fc210344e19a2165e7f8caef04c01021c69c43550e9b791c05adce4e5942f4e2d510db2d830ed6823a5569bc5a94404860da60c59e26c41157d06dc4fdec006ad654166b56e1fd45b14f7a81b13898ffa14b46d8a41193d41ace4bbacfbf7a5c98e353342fb2447d86fd48a70cecedd2e20bde22dd9a9af707588c848b17a0676a00ca8754357f0a00362dbe5872926c4019445be63815512816ab2c32a6832b8a8c53e0dcb1c93bc2906723346b0cafe1fb17b4797f156c9f660dc1324caaab75f16c1b6970e063ddeeb659d24897a91a0a173c3eb8912c4b0c0734237dffffc11845a0301245e39c85f692ca1d73ddb2c440de051966536bd213cd0ab5b1d9a6ca38b5263c246ea1161ffa16c7b45b891bdfdaaced574da407066b1792cbaf17afa3caf2f6b16396135cfb6d729af3fbefd458464d9c4d832f436a6b68b0a23e497b324e1602d8abaef556c39e6c4ad985bccb2843cb305cb21b74d1c75f610006124e18d52ede9c936d72bdddd014224626f979b0201fcc3ae556e20986a2d930672f03b71aa3a52d1a03cee08766c40a77044dda21dd229fcd6ca49cd2a831e57c20841d0081e6dad5e8104c58ba28f01e40b064fc90272f139dd95f7b1e2482a3a30456ef058d7b8b85b0ae1a0aa34a9f464825858dbb45548a19a2651996dcd217c2f4a524e72855e40ee0353e155c060a735863e2908bd745279aadca06080193df80ba8797a6fd55fdc1c3c3b4742cf0d4ac2e574fa48700ca2bad77748bc594aa4263ea52c2a7d3bf46b2a22d9e80d369b4e48c644eeae25db4e7a82246119096338a4bbb74d76481db0f7e479d5318018f2b3eda73201fbb70188fbbd6cfec4d2493b40bada3d05022a55b55c0f2964bfffbb193b68b275f14f6f3267626b62eaa6aadb5f8e3269b12ab4805b159fc928bfeb28fe239ca7984c64696cafa6f008f3ce426baea2d4176303580fb070c7acf3870baa91958bafab0d90dac5d075d6d8db9378f5eaafe36b8992d607b175ef3fa51e16f5cce80d8741c07226f86f47150ab6a884219ae59c3204c63f087e883876fd2cd207b4b50b7f19e40e71af586536af4b370112e016094c511dade7028ad7767209ffd7c4401578493b6d0f3c0d3a2ff34f287e285ad3bad8f9b565b9db49ecd3a1f87d55d462c5cf3b075cec8909622b9ec9d5c8960a1697ac7e0fe362f66134e3f2f091c3caeca482b8b8633d7f040a69c12f3c3045720cfb46f817854cf996635d3fe22c6da92ada3d379e8cf1002d9b1fea452881c4e011cee1258e307bb5733ed7817182ed22f87c7b07fbe77de756e3405c827823299c10d68c2a6139bd9bd2968d0302a54b716da881df98860bb94256272460eff92ae2e22daf679c45a71cafea75a62ee49460324592af2d24b3c4f3d55d36ea6cf86f489d2bc75a1ffec85d5bb08c3c739fb7505ebdebfbb4878ddd6f20fd3292b18830e4f7b86ae677437773239017d1894572393235fe25921d0eee3d7212ac72ad09691d9a9a48e99e27311721fcb986c7651d22d420bf8c91bbfa2a5283c8cb7 +SS_N = 9093097ce8008daadc59999f7dfbefb8b38b45de27d27912bb4bcf18a24acf60 + +Seed = b6ea97260b9732a7ca5f0afc4d9adf4b34b7a28b28aa7b60b6e92e87e65410d5d9c0e1bc46e36b34a29eaf32bde1623e +SS = ead667fb1b0868f399e25b9160f5aed7cb9d982a9e675b05426083faf44f4b83 +PK = 02d10f8af1cfac970833d97ec958d8f7 +SK = c865955979013453007d8431325fe4d0 +CT = 3a85721effc26718a090b120f23b2efb +CT_N = 4548a5b82c16c54181d90b89b50f8f6e57f54dcefd8720aa7478d5d0223d80562df6ee2abd34a05cb69e2e69e1ced40f11c408c2ef64547b47c43a428efc072936b5b15c8f47e7de9bdb19ced1fa4a9127350e5f00699bc79b5caec9bae27715828cb5d1eeae26eb7d76aaa8dc585fb482d362a6a56f7c0dd3bb3c58c21687358cb5d4b5322a3c417910b82d573cb4a16fab30a1a3a663e3b2e0074bf839245ac78637abb2d973cb73d82128971212627f6118008b401a4cabf20337e22bc808d00609d8e8be329ac2d5bb444808f4f74cde57d4ad3f5a34a4f0a80aa029e71d9e7b97b6fad52ec16b782ad6fa3b66347559f9d84cf306d33dc248e0aeb0855f99e7903c3627ebd2fcfa87148260f46d55c7e729abd1e8153406bd08e491c689567c1bbba6ff2fc0d4f13ba55b4a6ac9f71caf72a63fb337d351649e5e43c9b96919316c538522a457aedc229661bdb89dbe367e7b3cc8b6c0843b272abe01615bb34ede497003a6d126b77e8e0933e9e9bb6194cc7d2b2cda42a7967565651b923c8ccd1a9c1dc0b8cffee27f7914000f3fe2ed03e8305ea78f17a041f06071b792a6003a88104a550c39d6a805f320537f100b5050fba95ee94e398662e41012da983cccc7caab0f62c4aa8d4879b364ab227d2fedd34a444b18dda56da0a254d9d1499b81668cb96e7789d5a5833c9b5aca10a5e22fa2531a3436b2d0d47b62cc8884ebdf7801e7521bf7e631412aaa5cf57c7a8f7053d65fb34ac267fc37dc78e21c6db830f2c87ad66d672135b8b6c6f2d36a84c2f2206c6046ea778cbdfeab4ba8c5f61456c9c1b9ae4ddb7d56d02999b3bfcbd69c5deeaa4323fe4c06c6262c48410367899e3c42ed67d702f1e179536465caf2aac5c4dcf7f33dee576100ee74560cc0742580c8f1625408e8017006588987c75683c21acee1e167dda3396b5b0a093330e8b7304bc7fd948bcd9b2640a22c013d6c19887fffe6ceaa875d7d899d8578c84e4523c3f5a7fb53e0bcd6c8e664ccf0fb5d2564546c657259f72fa19f817064f332878772c95434891cceec1c0d3ae977eaa858bac1ef7739d16ac6fdd9c010b36823672784cd6125d071733bdf024732d23936cdfe3545e01e72193f0cbdb9b39c514bdc788723096609dbb894ad33fc40d3a5fd19b2590c8f9b8ee6184c2a2889d1b96e60d0a964fb1c1f3c348c69a34a2eea49fe12f2c0d8080201cb0778937cbcb1b156058749c10aed56bc4a04f07bb9f154e8aae93f35874de1d2f0d89471a97237b83281a668802107834940feaa8822a1b63627cd320d2ac19821d766144e140d1565595f062c9b6a25cb357b1348fe7f7f10b166c5924b843790c142e47b2919d6c2eb91e515ac84e8028cf690987c0b44bded0bde994ac91875e455cee3dfad81dcb52acb606ebf60e32d86f8e916eeb59ae76746a5a1b7db0f857753b98fed6b75d88aff179b8508527cc123136a529fd6bbde8586bf7acc8501309de161474461fdb870332c93694febf834bbb127f7d15df93719f3654795cd0a4c8247336edd848271e9233b671118df893423f6985521f3a1e8a00804c2feafab7f9aabc28b478183f988de03fd8d02c6e7388df8bbb7669b434b40d11013cc196ea5e9d79715180219395eb680076dbc17a64db3e33724287ba0e069679cae1c5723b60e59bfba3b34119482ba48dfef39425d559fb391bf1e5c443db98c6d08134be19d3e518c1bd7bce3733e704c55451caabcec8b69f3df110646ab98dc5ac58672fc21ae3986cb61d20ba2d3b573df382b5de869770a83991e7cfbc10fc185b32142d05d5308aa9be4b267ea6bd3252ec3def5c27e0e76962d783097ae4fdb5bb41af676295dcf326120e9030f6676f95a0bf099b1ceecca36dc11ae87219cf5aa3ad2596e1756f2c79dde5e303e5047d1581e38e0ec879ca3931f7bf39bc4f91660aa838792342fd128ba399205d1195fe042224a3ee83cbb63027316b3ee5f25a3da67a2803dba11d046fb3c3202eae58863ec950b74060ec1ba77041cde884ebd8e4c25ddf3376fb82ab19e71d7ff63c91624deade7e6e1d541794e20a8db4e61d8c31675b6d3f6e5e3a11453a7ba7d492f06803fcb507ef9a84cc6e8b10ccab77cac3607a6b193f9a9631339846959987e3b240f18d52e07f50ebb8fd26e9bf55c5d0bff97f774db4a421f58c2a5ba5dc7ae +SS_N = 01aeaf0b3e2bde42ead2ec7297256af1d00e1a868bc2f10730493b55f9a08ef7 + +Seed = 626afd438fd9c449de3fbe8e826a1abfdb14d9d0df7167e39a849db730118f20b3042cdc5d0714c3d10e1cd447329386 +SS = 47a20e1cd31dda07b3026998f892d0600691e4130336f263ff95da36fca24ff8 +PK = c0059cc37a76fc84275ef1e24a1b2e02 +SK = 6e3158ed317e5c6b08df41fd48b12718 +CT = 1d519dbc4053b4a21bb86e58d7c0ce83 +CT_N = 9198af43ab80566e6ca0aac867beac54cf16e1b78ad84bd7833095fe1da638497bf0094c5146e358919257bd04940c54258b5723f949b92ff2e1934d5064317f3fc2ae4fb84e1825136572b7e3a95c572c0a46512b243a510a97b6e41381b8b82697f1418df0bad565b1dc987f28a50fb8d1638a0dcd285d68e68da2982326f82a24233971f7fb232c45f5f1f072a82bc20ff6ac0970667046e8e0eae7bdd766f00d32380aaadd061320aac65f3212644abe0f21a54f87ad85c5545837e89a226e24964502cbb5d2bc6ce8e7481ac19742c8ef6036db2631dabba30b75cfdef71ec19bcf1ec7476ef591c8837c3fc7d497b91cc5fb7fde174260e6a5bbfa6ba7852c9c2e6c5c3edb0504e55c8eed42ffba96bc0fb107b5c9ef0daac57303dc8551d7b76f7944704a1d75e014a363c0faa6c0e71ecc8deffaa418fac1bd9046c8ba86d396dae33f3722544755117e052ad8402d165d7f1907188168eb8f87e69bb5f3afbe819dfb9b38e79f682d03be741b5542c601fe75d421d29d983553c80f1e43daf4d8bddca3e0b03167aed9ff3d85a19b000512eae3335c8de41e9b959cc51ef0ad6386f7f1721e053c280f286e02408140f01d158af4d0f1d8454dddabb46ac79e4df3363ca2494062df1315bdfd3c851938aa59bb09721c093f109bb6470ec6dbc221685434dff578039835f1d49de7856ab3a319d884d8c1591c1b6482efb3c35bd54d351f5de4ec7970e647c5388b07b3b4e0478e2c216eb33d2533024b561e570dd92c821ac6b6e634c3852a9ff71aba6902ca5da602f3d2cc1af4f2c34f0a93020b9329624429f5ed7b3adc9f61cbf6283f7fdce7b9db973c5d6a11a59a4cb79404e3d08ef161777e484ce61aa9372896a8a44adb66b31aacf40ad45029901efa87acacfeeb6435b85033bf370344186268ce3493bdb85488e7477785b5a6d73316e8829d1f28fa754084388f068cc028fd9b3cc591408edd196d7b228ca18021d454f890f695a1c2004047cf53752301e5e6806f336c223b7d0bf636f86bc393e223a73af0b08df04e9cc4ec49625f2c43823fa2bf4ac3c47306b54c3a9f0b516af763f70a8298e5ff6043fa441f42dcf611b9e649a87d2d5f2ae8f27089ce574d3e49c56e502e35a674c37d77fd21cbe71a386bbe619d2ea91ccc3a87b0c0eb66a8aaa6e85d0137116d58bda143e6032c3caa63bcb5a7aed883cf4c31abd23d5f4b778f94e547a213f43e0952d4509b97bd90bda1ab512f221f2400ae165699321d92c65b20fdd5512c70034c1588ffe084515e9ca07d318d526221f0664fbb7d36cb42ab86bcbc1ff2c503d8f6125f38b227ea5b140c668e76191534cf04a0cf74efa6f29abd68290bae966585784dd58f60c8c6bd7118f6570754afaba7ec282ea9c18773885a4ee0a6913566b54d91446ad9033c59440eeffe0be39f33adada373306c4fa453f793399e2c0498dad7370eda28c730a7128b6c5673307436dc339ef58510686ea18a61f860325a7befe0fd2f097183a64203647abf4ea5880a8af2e3fdcb8a9eea1c6b4a25c5b8e2052412e6e353d5749405581d952e1a43f67cc637a9fb28af764a56286afcdca13d525819bb87b8ebf7afd117f1f5b8cb3d1414aab3c5450ba7895c4e6b88aa23653154b94c74e49e5ef821787cd04ddd8345ca7831ee3223612e225247fba0dfb70d0c7551f0550291dbca3677415acf698e1de457530a8507c6a73291e1213f6e5919b312d845032cac39afbdc36e60ddb715b92993a49f06b69165c81b56f672664eb8d52d1896db61d9327cae73ef6d90067dc975430bbe9de10e2484d205bc1ef3cd7e5e323109d845c6a23bb98cb740cd3a5238b35d4c5a6e758a6b3feb7e84c437fc8f00a8b7f745bfd0bb4b99bb18edf68e63c3d8f653ee87da2fc4784840444d7703eda5181f228356cb07c73c4e282568e942ed6f8f893fa971fb60871aa62b0a98695436237ef307c2cd78f3e54f30776051f45a12bd1026964d44b5e14ff7e2244e3c8e6c0055301d5a53178bc824d0e1de8decc252ad79a21fa3785a57ab553ce946565e8d6cb7ffe0d31a813b61154a6ca28429cb2181d138e850f0d124bab5b7ee103da9c084ecb6a71ce66ce6fadfb4c8a3ae5ef24282b56489945b2745e40d0fe7a04268aacadd5661e3ede56b4327d409820f64fd513e4476eefab153f4edfc66a2 +SS_N = 89472e890e6b6e3d6f70e7aa647c0a70c8c4cee66f21f02fa86f7fd10e7ea4dd + +Seed = 8484d545a1cfc58069db9ad0e9db3244df1d020b8957549064a5e7cafae6ae06a671f5e79797b42520464bbb95f5aa2b +SS = 24cd98abf92f97ad3d7fb07dd7f4dee7f1d6cf1c017bddbd1b37cff644ec6786 +PK = 52c14c064ee7510e7f7eeefff2032ddf +SK = 78fb5770dbceda18704bb81f87246c68 +CT = ee17fa10644cce36a7d8535876066518 +CT_N = ced11070bd03c543b5ca47b00db736b0b99e63c6a489af09ae71959c20ec0e8955961390ac9d229d48db644a01ff188947e00847d5409697f4a9849d04e9741c01ae2694178b2a710000fc0deedbece7da9f9eac0be1c5e9c62c7ea711e3acb9b7efb88c101591700cdfda9dfe77d974bf68efd850114213e4775308909698bbb27a4fdbf52a157a2c859f0ffdb0a531b7a8e41ae95749710e776038be8ed947822fafbd88a5e7bf202de5be4351f961d99418d6c945b2910a440ed26c7006bfc22628eccff0c00b0a14005b0c441f5e3b7cdb635c470e8b5837afb77204b4c645bbc72f1b9701b307c0b45266d26a54138a589234d63136b9332ae5f89abfa84586853868ad9de057abaa1f94b8979d8e0b52c9d114daca59fb07c54f10fc38ae99eb6556db6cb13d478da28a831b4b69cbd0cf2acebccbe12ffb95d678a9436001d8cc3aedf00b1a2c90145c8f14cb19f9d7cba87c395afd46542d3ad5d36e2866d910e0dc66c0096ceed28d726b346a8842f4e7e0c15ac59279b54015b5d22b3a6e3f77a24851e1d916c4008145e5f05913e494311ee74181fb021f257a1906a5b1fe8e0e06272b98eb596a3b7ae94d63ce97c7f86ed4dbb0e508115c3914ac2c1ba334a78e219db6d0034bf8910f810133547fe8fa898acf026bf6338c7af7c03ee56d9679c68318f3e64e6bb3916062a2e5ddb93cede5e450c5d1e4d18ac0384c30a960a4103dc520029db58d079cff4ac30a3239a596b72eab9968b89082877d45183798f0362f314df164914a825e76342efa816321f8a724982609ef59202bb27ad4cce822247681de7fe232767809381e8665c81de6371ed8ce2734a6ffa8be5972193aa8edf9797aeb06b0ecc8460552bd6e9887640b068ad85664e9ade4b2930645e3ab191acfc48e245a56a02863ca5ce687ac251cd2c8b02667b71952d0a0784a7ebf35462f6a11700650f6d317e3024798503674cef986af1401b4cba0617acbf99470756dd435f8e68094fce4a23f1da5671a91a937f55d01f7db3813094b0d2c43afe4bb21379c7a13fe5165727f37238856aa96e9647c96cbcd17a071e17b66f5c4b878fcdc7fc1c74ceee714ac2e3dacd1fd834d9bcc21a32509a931120f8d1809010927b282e8ddf58c3a56b61c6c871a5dc1eb3a4d59b0a26350fdf71f0a6ced474a56e6e63c4ee62b73e43c553d6b9a341a0d041660836e5f2a1a80bb32855e29a12aa4a8f50b23652538a2fa4eccc52207869a6559578f864ce0da0dab0144747ead614bfb7cd1f320920798ab99f84e23abdec7ccc2ba86af2c2a36e63c559e184c2fdfc53223cf24068ec7b30eb28bd420dfb5a270465de2430c250beb79312a1582ba93ab80ff29dedfe5bce3563d87e727ae6ebc924bdda94efee8a0e333c63f2e359863e1fd33b0543e642d2bddcefa0819cbcac992ce722dc52f2deae9d020b941bd71f4de87f573b6a23b5d73286a589e94c26d38bad6e1cd65d653e84da6e6a91af5de951090060751024b6561a1f00b2c4dcaed017b6b80b68ee8577794749265c5769d913be156841c1d4ca5001e180dc7b2e5deae59c0a63d9ba4a4204def6f63d14a25667e32c2fabec157e614a390c55b6c84e09ba673717f6507f6835c024f9e812179b32116ab5bb8d1f7d3713f3361d111e590db2876bae92a5cf58dae976bbf289ee5e953f7fc22e34e09255da441ae84b6de99c063b028fd9e60936737b3c8e8d20333d73069f1cb3d52e464314afd51c62bdbb37560735972c9a341b8ec15a2e20efc9afb99a9af1e93323d3ee67970adbcfac64fb0e6ab7f1bb4fe2df2efa74340b0dcd0efb07333c2b2126af6d99458de1214510b90011baeb36bd86edf6611b4e1af94db541139450a896be20290be7ca63cbb269c0ec5c9eee80b49169689d33836f0393386d8d8bb838753ef200821fb9a0425391a79bea6201829f56f2da7cb5dc4d055d899e32cb384170b24b3bce9de55e906c5135e1b3e5cf45d6ac1a822407bbb419de3d7da507456781f9f1b9cbadb2b1e44642a5870885329b43f9e4cbf3cfa0fabb83bc940c62dbc8f0f793e65a63b5218947c8598bfb87955e45b1dffdabc0a5d75a6a7709dfeb6407e994ba08e87d9f37ddb95cdaa1486dccc6bf3ed06d76627e58738990ef564b056e846959b170e24b1e20ce0d5e463f1c9871c2fc7d86c9fe2879ea3 +SS_N = 0f5ec104cca046809a6aaef1f10a03d23b2bfb28dab39a6941599333cb44fb1d + +Seed = cf525ff8d68f7717a6dd534843ae9688f2037019a7aaa012951282da883f499f080192bb5d7b74b5cb1ce6e160519baf +SS = 5e42d07fb100d5993cd471f7f622cd84f21c504f3910ad8c41dea25abadc95ae +PK = 54615099206419c90feacf482fd40e93 +SK = 4a16fe2d0bf4de4f414242a888dbab91 +CT = 3acdb9424d64030001c51f851bfc3def +CT_N = bfc25b947242e2d07bf638557c26ae983b2aa8693ec21a105dd53e6124043c64aae58a57594ab7b5b7540800638d5e32bdcff7ef2ad00ccfd818d6c27269c6f7a0484c41263e62d9a44b6edb3bb5265ee4f1fee19456a4f1c19da54f8cf463b87e22f9d56943320dfd0dd67c2cfff2f09b0b52508872e8899e4f5ff75e86c7f3fc7ddfe62c4bf3beadca7a3962b138d2b1a08218087366be252cfdf31511770862622bd7ed5505b14311c00e97429c0060363ef5553d43803a2533a684edc1e4b98a789cc7d984e253c8610016e2c9b298c7e9ce4c187429a85325c512b196038ddca4898bd173335c3849aeaaeb928546e4f7f74715d6d6090159c2c28c9e0fc801677029be3a342253a25b45dac396535218c0d08564eda4f97df309724a10bd56fcca4d271f8cddd5293d21b22865ff9092b0f96acf7e7b85435ca07ae2a9b5391891008612a6987fb43b87654d9e066ba3665cf47e9c3a9a0409ddf412fb21ba92e1dded393b7d60129ca3e0348eef539be984a002b55c5f653a77d41446f923eaa98df4a82c61b820f51f3d404a41d809f16c61aacc71e4fc148a1acdb43d45dc5e838a1aeb969076bc0dd6c57ebcc9439fbb97e29f290c86986cc1c5690821d6d02dcc29ff97ee423cb77763ca720629e736b242a1210b42bab9fafc3537f34da03eaf98865d5cc9577c801ae0b41a47dc569fec52f398750eeff499a916d7a0c98ff78923ef4264cbdc2a6c995863cc32a236d71f42bd3b688e9937e940c392f8462812b83f4f6bcaab0341ddb483e42dccbee6a8039fbbd1c7c2830a7567afae89b6dfbed6c1ecc1c00aa57d47fdcd56fad54055fa2ac975574a62a1024f5084ac876e6c81702ec57392a7c779b669532500d75501aa572fd9291f235262ff68ab22a05ba49267e362e1e9e01714fc8870dbbf6b127b88ec20a3919ea4744a99fbc9c94dee0443b5d70df24ffc608c0e98bfec997c490c484b751dc0dc63725441ff7c8986ca41a543d7e4afec17173d825ac0877d9655f0d36a59cfd73b94dff0625e30f1d354f4197b475b971614496834db08e44eeee04a4ba4e019316a2b9216e7cd6c902e629d1a75f9da51b93fdbc1d8d3127d7815fd325eebb9639573ae30d1b769c0e2c7dc1d1da4074c301739c1f67a9f9b3e21b720a8a336c7ca9f3327c29abd9de27eb727388d015d313b957b0498d0251c15f4b6ac171ff5a5d5ecc111a6269de096b3716034b89df91a5c453ae86740689bd351c9e3c727464afadf28507c8d4589f3ec6e43ec19080e85e912e9c84847fedf517517af5e9857f5ec3ecbf2c58d9667d4f4a522fd03ac74d57609da2ecb31c1156c7fe15344fa020017bd933c8b46846df7a99bf4b04273fc93a7b03db67e24f6fcb0a9675e10cad02672327c7ca791c39a175dd1d1214b1b7d0cce597bf6b7ff096871b368ac350e3b571aa80b6504b8c64cf04792a967b818918e79a79f18a1b9ea13b067f841411634bb131a4f50073a0581443ff72cd21e5455a3f3e9575b8494da987e106d1e7cbb94f31c218660e0930c9c6a6487e81a5484cf413121b6918b3d1e70454e17c3c6486aeaca22a946ec2f98fba65fa5a29509db729a8998edb97065663e4cf2ea1a81cf435e8566c16f12917081e2f67adf1d9018328818a97c2f1fb5fafc8005d2d6602404f416a2c2becd3d740e9d78e838f7f007d9332e2fb58e157bc0df403342f162ac7a2e141782b3c2b5263fef082c01fae8098c60687c091d17f9958d0c07e7a03b312e261d597dfe91e56087e7f64389a9ce798c7afd4dfa2befca10bdadb47a897a6bf60c3017e36cf66466e22a76ad3d010e2459729a06456e75d390f8299260762f55e839f3d2279be4b501759bd39ef5039142e224bdb70c87333ea7239fff3d53eb1f6f9913fb3923dcb9fd6ccc6a3b99cbaecb0e00a636e9670860c5cf84b338c9de49a34eee76d318f8545b6423c4e3021dd0759653f7818d32de7ddd5f20bb90c398066551791c05341acf599741ca643c4bee004845d7e3783205f9d7fb197827ea217cce5f022663586cbcbabe10eaaaf335fdba5eb1c54fd0d1c1e30fb7785f59ccb9a6993cc3fd41d467d20d3565de9ccb976f1eaa9c04450a643d9ed19771a1bb02876e8eb95136f610593aeb1beed2455a96a1e66bf0b3174aba3e0a5400c1d0059b331ba995517b8c65b8cd3a17 +SS_N = 3829917319733c5b3da4197de4268cb5b7e7b733569e5e50cc1320e51d766afd + +Seed = 6d1579c271a32d9c51709409e2cf2b795638ecbda9621af6c409f76856eaa364c741beded3ca09c9cb64de764690cb82 +SS = f0fc889c9c285e4e8e244b759123873375827fd0b5890cdf2c0fc08bc938a2c8 +PK = 674a5a2161c0eb4cb6505307803d4daa +SK = 13108aa3ebcc4ade6cf85055e4af16f2 +CT = 9f5867e7e825ebc167ceb9f16cc18b6f +CT_N = 4064e6ba7de7e3c9f7fb4e20266289e0367ebd3df17fac81c73187fe18cffbea5f9ad36b5558adcbc00636ef5cefff5f3e785d93d405ee78f3c8c8c18de5bba75a431ee6ad4d8f7b1abd7374d765305f3fb0c028483dbc97a97144d7b14fda1ca383d1920f74619c1a5dc834d58b9a456567d14e4b22234f9a0e0a47159be4811a947038af45de4cf7b2cfdaf4fe16151472ec30b5bbb8927de23c6310dd73ef19788c18ba08cc43162a8aebfc1baa549a9a7a907ccee0581bca9d1ba6b5dc665bfbde4e7b95ca0bcc702309853c8282e8caffe9eba59168e809c94512c9cb5021d5e3688b9758f2f6e550a633a6f91b98b305e094ed1b1d9d0d7138b5f8b77352217162d65d2910e570890af8f9a5e66b19e8b4261dad910f00753533708bd04a6200ca14d08c53188524b58179e5415bc1c44308dce11c75f9ed4f07cd67ea7ff4730f86f64f31f4e3130788ab1d52db6e89a1c1361b1ab678e143fdf0e2f6f041e5c3069cd2b22e4c8098b02c91e4b9837e4ff93af29093dcfc0189d6e8a8c7370509dd9e1f4e4496d9f01d45436b3baede52e3f596f5508c5976e93631ed01fcaf4c5c6bf64c7a4c97a8e33dd06af2b34d0e721b9558cccf82f9751df81aaae25c245e14d600c5664ed69824dac8c80dde1c7f26f109d3b29fec0ec7a6aca961f46986fbbed12212739d948da727dfc3adbed81259667f71af6812c9a44dd42e9b101a43a445b99819bb61ba74b70dee2e8a767483dbceee4d5346a7f08bf09fc8855ac6917b63a7a6c1c3ba1de2e7a0731f2ad9e2f749102a551012c95fd743c15c7a532bcd186fdb2c768fbb55b126665e64c3c327dc645a611b0f31fc037c537362b789f88c8d634dc8d87fbd4c14aceccd9306affe2d63709e5dac7d02429f5cf9c6fae07517c04cf8277128722db850219ec6f587963599f635ae51887772706b80f4c3455e8b9f1e7a7c524aa37654d9fd71115835c8358f5c7fc5dae3a8778871d09e3427516eb1e61af83838943d159a3c048df8624edf2a23b940507084eb233ff1263641b6ced7062f3d36775de3237b108e2c947a2d00dbcb17cfbffadca00a65d7b5a800d213028f6473b90a7167ee838892c56c07fa864ca85f3573042e92f4a81cbd793c9f209627f10603f41d209ce1a47976ed5dacc06f4e95f0c9d9c34da3396c402f146cd98dbb97169b44599fb61f3f962b5b5d7262f822360d7ace8d0ccd9ee5fd991f3edfa652ab42b425f3d96b49854f91a34b5f384c2f459079c2c870487b9718ed6609a4500b9a001bcb7e91ac69abf604351024ca199615170b27064e5a7369893637489362dd44dec35d63df4674b881984023525af4f55beab014b892ad2e6930b036f66953710556117e783f639a6338a1f62959cfe3dde50d98b57eb8e72a6851e5b0bf2fbbba09a561f5245fbbf4b6b26e633e76ff2db0d449fc22042cf400e7482a1e58ff89f8997dd9b8d2d3413c629ef723f2ae3fa5cef52172bf5304a5c1cb1f7e459a23b9ab1dbdc5ea4567915f0a70b531a1d6c6cdbb7138b4445661de4a198f70a67c654445fcb80f836fdb75df23b38382f18c0284d24974cd954278e12da4aa9232a1589ff3e53518730b13d69e5ef849326d300809d41f6faf7b2342eefc63f8a009d8c5da1948a9d17edf08d51ae602dc3270f3833e1054103e9cc612c130af1a43d9e320fb17cfefecf73051339e8d1ff541ba4048d99cfae0be702b3f2474a963a8040eb572977bb918bc463d1206964d0558649f749e0c14353807ea9ab78a9c02a83f26a9a5d4e667d43158340d03deccff8301de52a0f23796d0cdd4e15b23a2276c8714e56fa999270805f24f016820f5610d96bd6277918c38761d202e1e07e3862937ae1cbbddc5450ce5588d84840640a41591eb1f27003dd1081671e723f9ea75233f82524ccfd698aeb18cc1f9dfe1594da9f31261bdbcaafd572fa16a35eaf5cdb479d832f1f16b48a4ad7564388af4e7ac513cf6d6991eacb868bd6bf26eb888e87abc154e8f4dd41b1a3c71f5d60fce25e6b343be47abb4a849f075dd69d08a77e46ffd419ade6290b11be02fbc03adc40c9a3545a4d6cf52f2228157e9bfa7a6eb3586f702be4d46cddc065c31328e5cc92eedd483bfa92c87471c3a449f9e46ca6af647cc46b24d25b2b990ece7825e0d190d48c7813d7435c259c34b8985f0c399 +SS_N = 76cf36efd1fdac73b9fc335d14d316f84b665a94100c76c64d136148ca273126 + +Seed = cb872dcdffa86f3f117a4dc5adf5ea6a3b1c312d618fc1a070f67586185711d650ebb5b6299bbcd41081b063403f59b7 +SS = de115605f4bebfce027c59ab2d3be49926b32c1904e0d7cbaf616d2e59e60ae5 +PK = f2a03aa04d97e9f9ac45909a115050fb +SK = 2018c6763fa0841d8d886dbf2879447f +CT = 0f73cebdae7920d6b51b6fa20c8305d1 +CT_N = 77d1309adaad056d705358e58e049eef88cf8588a8e51d2bd844062dcadf90427480b16ea89ddd6147c6bcd19baa9cd01e5d00019c360631299d2854dd08799f3b2996d6b91ba942d7f1a20ea9981a6abda128fc4ad0610192d298a8b9e4a0e81bed649812dc39c5273350314137dff4a23e6b9725707fa1b4bc6daae483d67b57f0fbcc473055b62e2d073c46f1ee698560bfe95c5fe0686a0013215938002c5ee57eda72b02c5f4edbbaad7f42a9adac4e0408525d9cb2a007925871e31e8ce73d26a3c10e0c1948ff0080493d15dd5905113c552726e1738798380ca251841ea7d5ea0fc47a18f0fe8b4b7cf5402250921c903276a9c2653fccb5122a88d40b0138717e277744c671c210fbc1488d71fd447afdca42b98bdc0c9529dec21ca51fdde9a973d6e01536d513e971822077267c8b2f641b7a13e1038850509e8a4e900fac82aca62f5cb1bceeaccc8a93873c93034bc4a1df92f6c52474c2c26088062341c30c768f62877bb876632c7907030778170d74b49b844fac4a6690ddf10baccfb4f244e4a913a2277803dad794d72731302f4e4ec98d7289f249807fd6691cf9c63b7bed1b863566a01ed35f39260d857213369bd8597dfc8a49e20ce5c2cbaff0cae9456527d1eb81f2cb9190267a26ea27557c1f10bed4d45b27233fb2e8375a15e2a3e27d818e363bd688a4d4b12d9f7380d85b57fcc5dac49d311aff539d5988c5a126740135b495794e105c6735c8b1a471b89f9b1b4258cb4e46808c9b4fd8f33b3c53c5d8a140409375f9dc34cd7e35f0b55e9fb07deab3224f8a3b9e8256c39ab053737ab4e050aa9017352a99983f2dabd739c20813b26c9c2ae7551981bbf90ba19c235abd6741f5f3680aa1633052e4a415e7b13184ac11009d0abcb0dc44e62f95424c30a863118a11b49a0a3d5ac73dc5f423024114d427ae4520f4dc258897ab4569ca1d4b1f4be5d975a5a24f6c9054941812fb78e818c93f44d1c9cf3ecf55b68cae2bb0b72eedb81a442572a58b537972c8f29be6b16d6aaeb04ee3c2a25a1fa8d9e3cd9e2f6c6f254b1d34736edd96d299a7ca8e63b8892536fca8bdba52c17599227c77baa7c85a8b1905f86fb2c47fa9f3f853e6907e9e546fd9392b1ce8875ea6fcb1210d06c6bcb74fc46dc0b7e0afd5a30de803b1d42ad28909d8d95db07383bf1de45967e6a1fa150f5ec857a1597645c35704ea8ea7e4571906313792bc329816e862949db297867d94c66876fc31ad0e547639c3138bded7c0e40fd5f27b3d08c16d21af4e74303e1ccd9086aca1026d3bdba19062801021e87c5ed4112f2a62ff7add19caffde156a8b2711791544f5657b2f27612ea43f42cd0725793f5bf6b3fb04d1048ae2f6f78bed8f62d0ac5e70f7521fa5670c0b363bfbf4a9bfdf91e4c83ea6a0469e11dd3299ea75e9ada34527eeead51d026a8804317d918b99a72db42262096824fb1d7307500301a3e8a6e0d6e2f234016f6d3d7851554942cd4bcb505dd10e561a6ca380811a23c1ae974378ccb894cd08e9210edfb2230e257e8338e2f05d87c684c9e3255d375d38899b4bbf573bdd765cbed3af86ab4e76708ce62b186c6046291934b4a0aa000660211941e31d800cff81e2644832fa789a3f57eb2d978ed63358eb1baeb307d2459343c3daca1e1eed2841c6ebffcf165e1c3023cdcffc9d4db437f6315654fe470d7b0da8e0e0f2bb44f30f82a14dc56f422374bd00cadbe82a20bf211b9df22b18b09b56ae4af534a276f04b956645d5b0a533ae48a70745a65e77b39b82b128c986542f126a8b6d1873e7fc9da1dc40cbd2f04b0da2454430b4750836aa49696aee0b6a70ba0e46423af31d086ea9100c587710af070337a2fb3d3c66ddf422c0dfa6b4c738beacf0037ab051bb47944a46a4c420ad5a79085430502d1cfcd67591687d2cc78fc1dad4a4ded6a81775aa4bed433a48f28ebc2de4121a588eff5a4b304b5b7acfcb35fd58813632d19934626447277b646824490b63c8350ea67042ab3d235ce9663d749a1fca93b6dcf9093ab013b0a7f0a4a24457923d4aa09084c538b569808d99bfcdab303c07f33530c810a7ed6cb517a2d518c0deb4edd870954dedda38af7d592103680008481f9bdd63cfb97a00d2387722bc3ae41ad5c675d645df394cb5852a30b78427d558dec1339c1a7e25a653bd09c2c2 +SS_N = d433a10d66ad8d4d069fa1a3a736b2094f1c3baefa080015912d0d1a26e6891d + +Seed = 4be36ba806cdb11ec9a65f900af0cb580d2e5fac37ee8745aa2970a7db4c8244491d875c0b4a7fe64ff09bc6ac2a2f83 +SS = d73f40c404d4a6f27aa1d3e3c47dbd2194431620bdbba2dfab452f2bdbe53fc9 +PK = 01f310d4ef1527d31afae17b2a49a12e +SK = b8c2d3dc16e001b8a898cbc9a683d768 +CT = c69762ff34d5d687c57bdcf23f34e83e +CT_N = a251dd8f8eb2f8d6c0c956462903743e8d56ecf8248d436f977b1cbacf1203ef172c85c449beef6b648cabab82620146b3b74fb9ed09e24dfa8e29c29cc8352a7c5e3c061a664441fdd277cf80a4415bfbe67a27c11c19e331f7ac476b521d44b59663a145cb266a656c2d96e1431943e362907af49c2c6f788ca45e6f1c3dc12858fcc30c386b3c07cc216e450386cad8895625b0611423ddab6609eca11afcf997f7c39dd27305dbf0dfc08fbc5fc7965013b67b6581bb213eb93afddde31eba96fc5c0fae1fd2fed39d7bc864142588befce915137373d1703041310a0322f0ed2530d50272151c13b83edf09fff662714ba613f37c90b6cf1b7037675ace77c3150b2629453f45bfc7a9299b34b829b1d76f3699613009769de65ab3e6ae1d1b42b6ef76e5e6aa0496dbe17644e96187b965670727e8a77660563f9029a63b41af3f4604d28e4461ee58c7e1f3974d54bc021518009fbaaa57ed39f72a0ffd3c9e10f7761f587979cfd63ea68dc781d69ea6da66d8c5f5774d07b6bfb49133f30f1396cd32636c734f259c73509ec74c5cd64b580b10dad19167b3a936237d401f7f0ff29991c1d99a23f3a38a5f4cfebdeaf3a1bdc8e757eb770cb9985055e5e4c167d056d95160976ea4b30418187ead8a5ee73946db99fb42b48c19a8527277fe7ed07efa9f660e3c90ae6bb3fd9c259866de7519376d7361d9dfd28189bcd64069b10f69980b2b1451f5c4cfff29153eb309ee6c581cd458aaf7e058d02e9c79957febd07de8235907944ec5e2130f60fbfb8270cb7d695a1cbe5850425f60c6497dd1e460ccdbeca503bd8d010e71a429dc3d75147b1d4d7fcde831ed56b833ace7bb0ce2ef2adb791618e5cc835f5e7ed3f5ac2032f579e863cb4548c80955d65736861490aee6327f66ec26bc8a74a66b7241f02476e80cd7e5dcd6827a97397c148e008d0c5c14dac1573cef5dd84eae55bd2db466bcaf4ec6f90ecc7590cb753731de37c2e0899ef29a9b26548b6ecdaa4bc1766fba3c2cb3fc41821b13c381efc0831489857534215b2ab1986ac8aae765671a0425093729a7c950968decf9eda465df24222a0a9fb58c56963a92490d8316b872b33db4e5734c78d5ea8062ee790f60225f636e4821f554cd920acfbadf37f3a64adbae6cc05798210f99d411b9d3e421c7e4586a9e095596dc6d0e5ad09cbc91daaadd0285a9b00df7f817fd6dd58448ce535ce0bfb2dfc1d58f955bc636d54f3480d6870b519e4175902a53c39c07f61620a2f55d3961f5f38c24282c196815cc70177570445bb79196384ef5d7bd6953e00eb16a73b73e487b1727176e14636e571fad5ac19739ef8788399f77d177e8b758cd55d171f66b85c8c1c3a7f0a2cb8f209f3891a2e339d66df61b50088fa431912cbe236e048fdb1550b381ddfa33efff5eea7f3161f0451f0a0394b5db32aef6c47ca5c242341c7156c14308b50b18f2f19464e871dfc3186a6ec7f0a7e6f7df4ed45c3344d1398380c2dd1f4886216f248d924851e4acd0bd1af3c0bf11f3ca855e1dd1f1cae422ceb190e8dbca21c7bb8f4136edf0ef19c36df08c19cbc33e1a65579f4d5b5bbbd240e6bff37ebca37e411eae42f8f7410fd23634ece81cee11e353ebb3689d7ba23464d258bcf05921a78c89e52cddafaf4529b744fa35cbd789bf49f06b858564035abbc9f32a66e427deaeb11ecca54d30dcc021531ab653fcc5bd16055aae4746b4aec7cdca3e42c554671d85dc5b615793838789c0f0d80c2e7f8f49e36dfc36ec9beeaa82feb0ef27bb9e9693d2f846409c2e1bd85a83cadac262772045a2635e5cc6e1af975c6d4f5418e71864792981fe107c5bb1f963a0a78f57db923f0070b05effc2e8814577ff5933b8e63d8dc8e7e19bbd8eb5f72cf3765aa27cec74d92f5cd950079e99143517d8b1c9768015248e136f35be4e6ec6ee5a6b32d2b67148c6d1017badc71f6fccc1410fbcad7e0878ae91e949a9e90c248b24ce04158fc6caa5dbd3fd857ec79a29c5c476ade077de77a54eee45bd0c8b870594b64e2c9d7bca051cdbfa806c14cf729cd465176fe3dcc82b510587bf1f7da41753d047171e882bdaa4db591f9ded343db164ae8949ef863bd59eddbd418fb3e3b3e7d383b2e5e3873dffab7cd5258a021f3de4f79718c9418362ae428ec9f3828f2ae6ed569cf9d9b63e +SS_N = f0d3b71be49d6f09caf7a7b32aefadc4495404647614f7a464eb18e2a0b0829b + +Seed = 81c2294b8c26071d6ef0288f547789a3b563f5d511cf1d7b812c17e2e507da925d4be870d837cdf42a1e980c532fc0b6 +SS = 2abdbe1a143cc16b2da2b3dda8972c992982201e310b176e8ce593a576814cd5 +PK = a6632ab9fc96d9f7a414616c41066fc3 +SK = 02b24eaa1295c217ffea5d15d7e2904a +CT = c95f1b814b6a1cfde0e85859a149de46 +CT_N = a9045863b649881dd010d7be0e5fc8a079c468d9972c1dbdf01e93fdb5b60ae8619661b71b6d82dcf452084916d5d0ae63dda9357e83b6f69ea5accb762fe0a1064e42a01d145c8301550738ded92b71cec0e7d40b7a704fbfd1e85c3bc79c9b552573afe4ac4107f01ae7e0c13c2aa17c119e4a375e13bdb2ba6db735a6357b45528d5d4a15688580517cb63f850073026fd23019fefcedcdda8de5491f0411757e4f255164ce5588348cb451217fad236866220f61b38753b7d155ea887e9f5774c9656830dde853758ee185c8e2b2169d6f44f32a5c129119595cd724f563f8c24a97a11002d20f75c81caa90134fff8024e87c209dd39f18a0a900e9a96cca50bba3fa09ebb10af24199a9a6682c671b99a1f3882e3854693dc789544900961cd4beb9e31bcd5534b214718bf6c145328f16cbc8d2b9663cd71b7b76e7bace60eaf6aaf0acc42c51c4209d6ac24b7e1998d14d9156259d7493699977a4ee7ecf23f1c3f0bc4c8d5f538174dd288a44b65a7db23141670861a385fa6c1d9f4058d7910d24c82af0ac02c877da183a463fb24da7a674cf81b32965cfda924f90e962b1fd65c9d290d966d7fa8480486732aac3ee94db970d0d037cf3e7326810995f0f1ea59f76bfd303ebb35e4db01d9fb7bdd901fe5e2a4c39bcc5533bf7999979ea5cf6fd292ff23fece9528d70862eaa4ff6489cdffdb4d6427867fb15ad4ce6893416efda6ede9ae57db6ff5342844a6615c830970ff85d83364c59a7de2d2e4d62548317b2dd2590faf70ab0c1495a5bde70ecb127568d1aba3253674f90921379c39fe67a45b37752477e6b74d2dc498581216af9985e68171a5d85b04f460ba8e7ddfda2e2aad1570856a578694fe091bab090516aaf93c2f2b3e9803ae730e4c59953674d6a2d722c3e00495b9dbbc38deae65422d6e3fca0cf52eaec17508c417a998c3f7d274605f6504917562db7f2bdcd7d69651eda4f660290bcba2664dd8218376e43993b83e190dfbc4a7310813a3e57376be081fff1de414e8fe7dc772e7b460c1e38f044c10b6292c7e5ea7ec32bcb426377fa08133de5df6bfc814b206d49154c61e0be2210e838d7e1ab7a9e4ec47d3044510ec0b46331cf1936c44e4748ac5b7104f18f75d9aae891adf93bd229476fe710fa3bc9de49450ae87f929e775af86ca5aa2dd5a54e9c8149124d0b4289e6a7b9f0f10120be8b4dbf01999bf308c3b3ca2ff3a972f6dbd4c3cfa6e0bd0d83f1220e96dae7478e40ea5fc5216ee98e476553d7d6791d040a257e51ef91133ad25760eabd27dc2c0a6177f0df2d976fdff08394ee5a197fbf1af1ce07a6f47bca732d38a36b83d9ff7f96a6d1ec55b77d144cca1ecb7afd7e728d964daa2948ffbee4d105f0c0ff78bcb7a0d269fa0c8ff84e2b65eae11457061020c94c90e20f5f59cb571fee2d5e6fa84623f3ecc9cde53479a8467e54d1286411ecbf65560d265dc48b2bbb7b1bc54bb15bea2bf2111eda823855e1afc0940015851fb00d571c317269dd9f0ba160e5d8c2efc816c8f1f2c7c737cc89213d3e996c581cd88eef7f4ebb13b39b6fc0d91b606b57bd516d096842043f0a93c9b5e67285a1b62c09fc9f022c5531cdfd3e8622f51dd82357e975a49847433a40cb4e0ea9871c11920df297e82d970760f1e9fd2545c502311491842e37ca4485b22fa52907140f16ade2411a8e5ae8dcd01acfdcb6556491704481a5cdb8d726df535e3c25d33727d807e524c85e4fa053926f97452a186ea86bded06cd1cc4d832105f97fcd359483b84da1bf5848af0ebc00a04d5ab04050a2db8047717e84391d58b92cc9309512e3fc4a0809a1fa3310bde6425eaa3b2aefc60a84e30985a73bb798a4ef115d31a63180e776ae6faadf21a066f1ca34137bc8df71989a0ac55036abaf8fe4f5530fab8a3ed9e2023583b6bf857827631789363e802ee53c599c93fc861c1d6a26bb57323b4dc1bcd14f86e6fd77b3ff4f142248bfafa893b57d9ed374ebfb49b2a903778fcfadb843b882bc131754012cc4ed69120b2d710da0b7ac0172818bd7eb78a79ce68caecd90213344197337589ad244dba28cad92977c1682935f4c506b5ffe5f5badeb4db2d24184b39532385c13e34453cfe9f937769279d2b182e3f2075a3583a0d95c1bb049f01395a684223ad8317d535c5a214b31388f91e96364da +SS_N = c1c26cf2757dcb8d2acda489cb86d775a33359124a72e180794fe98933321115 + +Seed = c46854665b9852229d9c64000820cb49b8d023fa951977cedf2bd6650c48fd13b6a0ffd8f002558f0c03f0aece457a6c +SS = c1efd435fb08b1e227eb459f1672ea222f77d48848f7fbeda2077e4d71a3891d +PK = 9a09700ed78485efc69662a2be853164 +SK = a649e79671a3e947a00159496210db88 +CT = 0f7de5d229ab26f394f2e7cbc13a91fc +CT_N = df76f31a2b4b61b00882f445c30a3614b625df849aa722d87eb120fc3948af61a0554f5cda8f015dbd11a43b53d20daaba24fa088378a96b44a4565dc45bc9e96b06d94acde1b91913f082287a7a298f1217a17908d5e8c560861c5d1007f46f2dbb7db035e96c11f721d1eabb21162146b10535247f4f39454737d8f6dd75d42cbe61012fd4e8147154285fcfc0179aee97dc65d5d2aa3e8764442476af93a6c4763fe7c6d385be6a11589054514def29e86d3c61099f8886ccc710202c71856138684e7ec7c5576b3e9bbb66bb7ea7dc700cda494ee029be8a283fd48aa6784727a84189038a82f0d13b5c80baf11ee22345228f42a81711b66b1a11f248030f5e143bbb2aaafb643b7093ccade39e64b36aefb579abff1f76755769bf2efecfe218144075aff62b56d38d1ee30702bc767155cac1a2a7299b3939eff90ecb9705b59b324da72772bd1d58e4b4dafae7cd614188acb85f9a6793bdd9038f95892997238291e54ef569ed834908b4f2ee9ef2822309b052c9228e04b2fbe19839180106148237b96a444c9153d3af5b87485ec8a4a197501440d4ce1bfc74d6b9a1c22522a34b9292382cc202c5f78ba515a11873b3e479ce234901cf26ca51c2b96470176aeaa184562ef10da32301d46a8ec9c29aff6dfe12eafdf718fe788288cb0c127a7ea552c3b4985d118a0cd96dfa5754a387483112d9d5e89b374d169b90566924c22660d957ef16c1d1443ec200445693bc9a29a673cbd3ee60513b8f64c3f1923caa6ad43b7fb01d06c40302220afa43a2b5834b1e133f02119962d22472fc21573e1a79fd6aee8be12fffcb8925bc781a81de0d43acb94d8c6b959d23e85d6329ab12774f6d67948700c41ddfae8e72d6847a109d2787a21a58092c1e91c29cd3f976250bb2189fab92c2fc699cd012adb1363924ed31b7b25ae48ef640cf8fbcc0159d56000730a33e94ddb50a2c0d98683a3cf13fa4551d7a347f178acb89890a3b007aa53cd4fedd333e85b519dfef237cabeee427214912fd45997498537fa5280effd0f3b0327d2c5c14af11db3a576dd7163e1c0a23865a4e4d253d0c102f419f571ad025458621e5fe3ac6d233ad377a5386ffa6ead1fcbcf71e0825eda7458228cf79f9e3b273b7fa3c3e2cd62e315fc8cd2798fc345559c196a0c4491afd81694abff844de21242f16f98695ddd0b01e51459acc7c53a279a00aa2b4697442c1944dd1329a6dce35eff37c8304fb81656ffb3b5c319ee48c09fa1736ffb3d94e62012dff0f6a812beeb7d0ef22922d8ca1fca6cc215969184247932448a856306aafca06d35657ccdc78bab9c4af73f612bdc48bee0318db3182c90f99355d330730c58739cf63263d6728334448fa888157b337661491ac8e71dd3e39a6659c9857ed1f5970bafd7cb6002474fd5ab6a6160e8017f79cbc572fd43d977191d0c748d10cde6ed13aae0b567c6b4e0bab9dac80333454178a9f730ec6e43eddf88d7e2b09dfa037a3b1e33887675dfc55adebb1f3a158067fccb77fa8844e1504cd410ad734d9bad0105416a874b29819a174e61747b8235ab5432e03bcd3c0d54bf3ea5295ce1ce0bc8180646111ab97976c33ab58bdb4c3257a6afc8f8dc8909f8a2388e46fa0f772d27c58c526c9859346e856717c5c7bb0c48d4e88940dc24d4953ad34328424704300f8fea7f6388a520e8e69f23dc2af94a824a58f0d89f526fce87a000ce77881fff5935106aedb22e6f7ea94656f7eb40b2c58de0bc1e1b385ada94adeee224ab5674fca330c305cb2adbd88123b8fb91619230dc59dd5aa7cc73a474de33d42b7031b3ad7f2ec6c42cfda0b1ab185d7fec95a19f22987fb4f1bc272085d0966952b02d9b7e86375f5379cb4fa71bd4d1e4ee7e4b376f82ae211d75375dd8eb78d5f1de8d8e75efa10a42131abc9f44c5fc6b26b60737786a617684419effe426c9423aef92a52dc7cc42c5001694d86185007915934ff55c885e0031f6ca72153e69091ad568c7150f50c71c5a7d6f20f836f0a6ff19b62caa942bbdec68f07057eb77aba3512eb9e06ef4d7b383567c3ae7c023b9b1aa4b0dd52870d9a1d890e4e3d0ade2b5e49fc19a2247da3661e637e51b7dff669d043d66caafc039d0aa509ebe04fa0c6301abee99ab8676b6ebf32dfc01a1204a03b2abb8dd466edba6a8c524afe486a473d47e2 +SS_N = 315d98354f1ab0c21c3c05df85681f41d58c87a0da128d27966356b4b0ebdc8e + +Seed = 430399bb2441c965586739ba1e5f7cd7bfd1d1d0c903a2c575b764ad7f2e3ee012451a5e136423dab0be7a86b99db19a +SS = e496d51fa4771f77c2c6f2bbd779b4895df933008ca5988919935437026aeda5 +PK = b9c12d1e9410af0e8165ad6cd639a321 +SK = 47c121eb3bb6f6cd9c54650592269ed5 +CT = df04ce15eae00a6b335b1ea7c8bb97a0 +CT_N = 29896f28ed5132391bda30b56d75e66c89acba20a4f4362588e76c76a0ff3d1988cbe22c2e979dbf80011c4b5944ae582bf5f0449bb69452739ea4c3da34bc8a88d18f481149881857a8e2a4725d21e1676e8111419e39845ce0d72de6d6a67fbca5b3316097d2dc563adbb2d994d1bd25cf5d115c39d0ae00886216af3df2fc68206dca490d77fcb79981c2a30a8080038f2fc817608c401188416482d31485260bda29dabbae0baefaba35eacafe10dd0d7b37f3d31cb2a21ec5c4b1bc8665a2c228b7a2ed02fa743798e4c70f2487e421572a5c3c61909a2c6a4ac5a8bba4b905546618765e9c14a421bbb054dd42188d6c5837ecda596b8ec78e49004429d5c40a5e3501db4da13974106434e18f981bfe73f0c521b6639aafbf3956fce23822f851f5030c4c79726aa3fcd96ff0302e500b0f147a46707fcd59a1cafee760132b5bceac596d10a4e6c2d80bac0fd79b46b4c956eb65139d7507f7db34c86c66b3de0dc2b82cbb7339a278c6c4a714d83b46b6909f2f022cbaf6e8f7b520eb22078ca7fc5e49e5487c0d0f7e2e3bb2a4baed321eb5522881e3b954a463bd4fa7e8a994bcc78222fd1be5a8c7e6c8dda0b91bd769123204ff05856735b070567a0a146cb139f03ed97fd4ed7e4575f823323150d35ed762ff6c6a995a5f29ceb7fc393465ac72c47d2302b396f89f4ca7c43c83f4986dd761a2e0a1188a825540ec0f4055a015d5f38b369b5e27c115de6deb9a2bf03a8519cadc3a349d02350255d208d13a131933d4baea8894105eccd012180019ea181a59c7070a7f34c16092fb890b4590c8db36eefd1ab1edce6f632a90ff127a9dfc30bb78a6673a8b7697dc394ad0f32e8c941ddda046d51a2978e9a659c75ae824a96a9a5f8aed666144e92915fcd950c7691ab4e744480dbf1232fd8398efb7de7c8537e482b8983f4489f7510110f6e1090900a79e7bb997eb8e14f5f81ab2ac1994930d80ecf30e06e36898c9cefb01eb5aab12f4d5af64abe20b3a5960b65cc7b62ae8fc59e2be2ed7fd60631681e550f6bc4bbbed7bef68105a41803cb032d1b62b0c60ce41c76761a6e0c4493d40d22834075e928fbecf4485af84739d91a36b79e15a00a5983bacdad7e8762c13e0453190475d3c26d42238a0ab43c7b123ead6679e311db85e7b51a4b3673cc6ba700945b0400c449b5d9cef33ad0d77aee7f67dc238582f92e4e7ac2677ddbd8a0a387f95d332de843d5495e020f01cc6f014c7bdd6d5a1fa8bee842c24ca507d2908276550733e59b96737e31014f6a8588d66d5759e39e1d0d25d06d3bd5cf70875b20e4748e4039d7cc45f32a33a6535842fc5ceef52c03627a42a04e7b43adc252275e17a8101fedaffcedfe4f6039663f7e4816d94048eb222ff6404800a2924bebe0e9fd74c9a68a07392e8a899112211f7e698674062d685a31cf8e965515d2f2760661420de6bd0675e8694f9f51d54c61b85d6678367540228e1120bf9924bc17d4bdd69c1d64e51a3d829cf6558a2a4c54c6aaa72cadfa5b3139be0e1ba433412ed0ebc715173c037469c3b84e9ebdfed2420756f554b85c6756a81b647230d67907fec757f4a2ac9abd260b31ba698a05089dc1627484c8119ffef9caa74672cab3430cffc70e7a5c9624469796aa7064b9ab99a8991f3dac53042a1e638db7742c775e95c5c5d05f338ee3dfdaeecbfe626bd74f9dcb3385efc626c71c92010ef6d199289bcbb8fde830d66436de703224373f39d70f51eb2ce934bfcc284a1ca33aa09521806ea0d06a4f9ccabd363930be6bed99c2dfbbf99f8ff1774d9bc04d2d9751bde8f95856192c60c09bb47546f3e0dfab148b9335d9ea9a8f0ac8e98f9adc73b36ca30f47950ea50bd40cdf42d8aff48582ecee8350e65ebdb679438e26bd10f2012e844a9aa4d070e580661f56ce5e3a4b8a4b3051cde91d1d37faab0e1ae455f85a4de9452d14ca7fe84d4b4e49fbdd509d130d77cc186f44242d14ac07a86fbd809d0b88080058abfdcab00a95dbee2ca1eecfb5e204569f90b8be375994b3fbe8b56c5d28dcca25f0624c79cba65a754354224ababbfc376df5fed2d79d5054f5114de55b810a33802cb8648145d0e2a2e9f492e752a7360bbd5501ab5c8639f4fcb46f3d3e5ae1d40b24acce15b7cb4c3472f111258d830b600063a9d07d286f9344714f0f9ce24f7 +SS_N = ea70eb1dbb85230867c4d1d880bf82fb5d1762a0cac3e9e381219c82fe9530df + +Seed = d5040ee87eeaf9f4001ce18f5ac6106cbc7ac498c2f290ee47f07702c66ae73e930b6911c7d0e7f0751a4d03ab56f5b2 +SS = e22087992a3016f649043ad09155b63d1f7db0baa9d30cb7642dcb39c54ecdd5 +PK = 5b4d22286e7417b0d9aafdab11cb27e2 +SK = b2859f588d4bb916b097131be8f54d56 +CT = 6a196955a02c5f47eb0ca65be328a79f +CT_N = 58d9d864b9c54bcebde86af7cbd85366d29ce7b9ff4176b3137cd4462358a8b637b9447f50866c058c8b8dffea37b26003f84f0b039a67dbbcc3dd2f7f1613e8945ca410f9b00b985bbcf564e23cee48161767a28a707ff7d72bc5ec7856da0bb6a5331a74462ecb6845ec47222d07fb2cdb48a7c692520a803c75a16dadeb5a646cc6ddc71f7983ebffa0badddf4f82b3ecc997b5f97468c60be1b000e9d4188e5b66a6d8b3f23ff0c84152d39a97dffd4bbe971094d0f3944c15e3bde5426c7d80b8fbbf74460d0fc459733a3c07d784c108e4f3e32bb36f998488789e9e010123f7a904ee8c1223540bb85223e8105764c442350e8474f03c18acba47f0f890a27dae4f716500748e9e4c59e68131bd0a97a6e19351764d26c6f435a8105a61a900a01c731f21f0115fadb57b3be4f4ea0cf24c9e039a926ca7b4c708df0f50774fa48fb238dd4885abd07087dac89c01c33fe978dbd8bb307a2dc7ed4854a3382f30612aa4a5aa611152b993aa14db80761c8a7c521309b1f2965159fa9946d13c3882c63a72cb4613d145d7e34e51b926f3e4d52e90eb4dae6cc5a9e157e1b5db926be5ab60cb9b5b614217591b36a374c7a77064073a8aaa6a64cd8cbbd1a2125bf87855290fc96a2b1e198074e80b7f3904e5a669ddd1de7bbeb2c82447ab12d184d87de11f9cca7e2f983d419d591d9243650d100973ffc2bfd64dfe099be863e04167c877cdeea18638a9e3ddbc6b746610f250f18795c8f9e4a95c937c43e579ff42243708b053dc7b7d3a918e4d841fe35ca835b56864d193064138a042f66d333365641f357f3efed94ee7f30e99852c0cead06a1e8222846db955e7e816954bd6c42e740f654a30778875bb57271988a266445695204aa65ec93f763f98a9aa8eb5e3ab7018f99fc603cadcd3318eb5f0f75c4d7069a8d6fd078f949f5a8d3f2f92036875c468c01d939cf784f7b7835c987236cfeddf2e0dd068fc6178500503f8b7e4f471d1b04a2c4923eff0d8c24c0c5bb3be14f585feaeb213b1d6c6c7fca99932934d2ff2c0a0dac7cac75a4bd848cb422bb425a9347f0cd9e2bde766bb9937e5a0003618fdec3221747066ac509bb84446ee55f917ac631def7e4f9c54b0b96e930357fd191a10b98e6c04c32b6dd193f0f386b7070b6e27a41890f5d65184b33053ba19d47db93996b3a8383a7ac6f70c2390dea75235073c3e3f6c01f2c7827eeedbc498d7eb039093eb2f0714f404388b9f8e527b24b02b8511cae2df0926d3c2ced47acfe7af592c4b85c73df1c0b9fa5b7081a241446c49bab51a80010b9040ba6f363d75d91a0aebb408998be6475e9cc4baa9c8255d9389c1f60501a96b1bc5db8137a484587b51fd4c17e352305caad20f8038815a88eeb37e4b7f9e335b8bc411dbc2790c3948a20f3d6473b2585a960efb1ce520b2dae8f67f11bcb15dacc4ad15006b03e1639dd8e7e3f80a13f861aabd28213299b002b61684683870f159022d4c22858f6288febb68af19d215e2f2bb8b9b2fe833fa84e4cd780b68ae3425b069a0925adae0efe40dae5bf9967727f559ad385e7fa7236e10e369e8393b1fb0c904fdbf8b276bfec2f9fb6bcf953274965dada73e2fbe86476dec7d413476030918c3bbd07550b5c16f3f059a90ca7fd8a1a093065fcfa4bd11556a3914296bd70b335bd33d16fe27c89701fc37b9a0120747b54f076f83170c301924e3fb4d40aeac736a43e34aefaa3a9cd22dbaf417b88f828d7c7b2dea0cc0a7de219502b7da0083564fcec41b1a01e3f0fec587f3df82d11014965f53b3cc1c52670833f5cb986fab2ec5693762897de7f3b1426b3e08f3bd42acfbbb8814f2b6ea375517fa2e6e3d54331332ca5e7820b8defdf626df7537f4794ea4470b3261517e0deeb6a4be0f67424ec3aeaa0f90999765ecf2f814842dc2a057f9e85c4c88e37fd7d076786b5054dc85b226a91b1c298d5efe3083285c8c0401ee36eb2a314cb3101faf14a2020f30a406e609bef4efb3d3fd4dbf16c50447c247d42c8392d2b905ecb3cf310a42b071510165eeadd5c070f7be60bb863b4ca97379004d99ebacdb368ad972bdcdb7e902fd08187e069971a1246ae08e10bf3fe67755e28079ba291b8c88f0bf5fe378161b364471b1abd62ded469a24574b68122d957fdac985d581e283a673b52018b9d36262d27bec +SS_N = 2eee01df01fb88d5fb35bc33551012f71037d12fee00e5fcf0db1921c618489f + +Seed = 2a74f833b43587b6a6c67b1dc708f553e00ffe59841c3aa6c61f8e15e815b1ca1071b5f6fb8bddbc1cbff6b053d8854d +SS = 7fb076befb64acd40840fdc5192391f0c78a64bd6ef204e072a55fe7080dc6b5 +PK = be0c0fd6a2f91dd0bdf0d7942edc9c75 +SK = 2b075e394edc9586f7eac97f0fb1e202 +CT = 1dcaa06973cbc0740c7bab601c688060 +CT_N = ec19cbecbdab7846404e066e5d1bb12430eae04b9cb3ab093f0c77f2f62d66f977d115bce554dd7e9c1962df0f126985dfa5addadb9ee430db795823a942e45e8d2cbc620d1fe42fedf243a01e472bbe8a37faf5ddba41eada0d97cc662a109e8efc0937c0ebb413e7f6d61976ff9bb17c0f05fc39638b85c94a3c7e3d53750a3a76e043faead5ec24b8223967056690b69c3073d10f8e6e4d311fa789d0a5593d6838df82c546f6b29f8a04edd3bd59a903b0c053ae33402072c0dfd3a13bc8a78e3f0e96e037bd188be1858960ee7b6d676179dd77fb72dba540f0485e8f5898c844f6c6df5e187eb10cca647b2870b127dc9eb323fb86a12bac168bc7a21af75a8b06adfcaec8d6f4b56664ffded9a22e6db378eb18b95c5017495f7e03fab52047ec81a760d5561806ca66b108b60ec0bdd186e095573b10aeb6e91b11d434dff4f617e5694d3773b712fffa5171fdb4acc524d0afada12d0fdd1350f40579d6a1d53b987a5ca122508b06b42c8ea982be0e2f8b0cafbb26236a85d80f9c91c96a90c30f62c8caf1697184bf3baaf965a7e62b8583b93419e779e8b54dd70587a1595bfd75c14f7faf0891507d23f7c76a0c7c5b18e9edb37e00b6fba59d53ea8e1743f55c72a30bad67b31650d3044958ad9d2ff4b1750ec0231210d931868f1bcebac2dba5346e00f918c226a76224725923619ca3ad74b92482ef67223a16439346692ce06f701f531cdf17db15138b99c61298b5b2ecf97568010ea783cef33ddfa2cd2a300d09743d436a1e2e75f2ea234b30a46e50ab87a6d9495234438d4ee47457605e2da33807a495cc3dd0dcf8d2436618f68dc28a10d740daa520606132306203dd6789c99791c9e6b8dadd671c418740665c9f7e2d7e061f09d1d6012dd3dd0f90321f6959417f12ae421b0fc52bed4a8f12c069caa146e34c0ebf0fa0a37c4c515d80afaf7546fa784aefd624ce3df6cd01c419b1aa860df851131d89b8261d52bcf6baa56871917eea5ec65b29b05839206ebf92e56d7147f98170fbcaa16ee4741f73b6888d13c7f8584b277c5c4f40c35faa279724b4a3bc59edbd40a7eba09487aa0d974e87a1d71ee60fcb354d401f319c77771286c1350e0a4f565a756c272747937d49a766a86242ad712bf2ad6e6b8f803cab105664a79257e472ccb2b47872acbe8619d49073ff1d9f6c901c6f00f4c9547265d7b488532c052124960f9d0e67b7abaef3c5ad2de6b2abb66379902cdacae1493f694ca783239e29f4a56eb85057082ee9818d8cf87d933496dd7da63ca3b737e4164e397ced64495cb04b1ecd2e4e67b7561b7ccc98b84b7b8817c221e4c8301959a7bb428872ff764b2636ab4d7ba9a5547c436eb33792530e0fbd368a47510605c4a639122c75e73b1c988f899e9d0f54996df8a93fc14708c6a7ca4a641d194648552577c3bb1355bbd4cb329c3fa13a092973036694e7b900520e01e2f91ba48a17e514a7d21a30872e6a83a3596da67e8dc3011fae00d65e46b9dd3766d6fff30e4172a0c918d4e77cf1e31815d2bf487ec6328a11b8b9bb83521d99e4aac8e132c74280d988c13621e49b2e631d87376c77d3dcf9aa8d0dff2cbe2c40103fbc238ddcd3fc1cbaa114529315c43355e4beb30809eaddea196f5fa0fda260e58fca51ec00b6bf78add1ff8eed1a140cd159646efc158f2be92501d24069b1b39caa84e317bf0dbdbbce02d558b1278998709910d07bec01702d5d9d69257639ee7a0ef781ce720cb9627df432a05b5d32c10f65d21780d4a4712a69b7fdf16738f744df915e29d5fb2cbfbb83dbd344386e456be9e8052e2f763e7814b75e98892418149536bb80888f2ba72e1ba6f78936353e460475ba154bf82ca87ed93fef9fe2b42fa0ee2bcf56c6edfda0a79d9c1ff1b9d5158caedb82cdf18fffd16e3ded274712ed65a6561063c285c1571801de444b625d1ae185624dd027f108c8c52815b4667825e64f25a2f30ee85360b4844ec6496375502d9d9a4491d74adb9a267d5ff91f19e0d7d8541a9c1dc18f265a0ae42d8f184c70c502a86d12521b32b206cd82b26eadbcb25dc16c16cc1b8391e9a1ac81516ded11087b9cdcaf651f642624ad30253951bf2730c8735eec52960944dda57e7a2c163c1defe7a4e78f347e1c2a6f1a79ec512391384979da3568b978fb67a74cd6f73d372e6e +SS_N = 93fb62dbd53316ef934056a3c2679e4c1e594a7d3a46bd92445049a31fd74f87 + diff --git a/src/tests/data/pubkey/ml_kem_acvp_encap.vec b/src/tests/data/pubkey/ml_kem_acvp_encap.vec new file mode 100644 index 00000000000..5385fc2ee39 --- /dev/null +++ b/src/tests/data/pubkey/ml_kem_acvp_encap.vec @@ -0,0 +1,381 @@ +# This file was auto-generated from the ACVP KATs +# See src/scripts/dev_tools/gen_mlkem_acvp_kat.py + +[ML-KEM-512] +EK = DD1924935AA8E617AF18B5A065AC45727767EE897CF4F9442B2ACE30C0237B307D3E76BF8EEB78ADDC4AACD16463D8602FD5487B63C88BB66027F37D0D614D6F9C24603C42947664AC4398C6C52383469B4F9777E5EC7206210F3E5A796BF45C53268E25F39AC261AF3BFA2EE755BEB8B67AB3AC8DF6C629C1176E9E3B965E9369F9B3B92AD7C20955641D99526FE7B9FE8C850820275CD964849250090733CE124ECF316624374BD18B7C358C06E9C136EE1259A9245ABC55B964D689F5A08292D28265658EBB40CBFE488A2228275590AB9F32A34109709C1C291D4A23337274C7A5A5991C7A87B81C974AB18CE77859E4995E7C14F0371748B7712FB52C5966CD63063C4F3B81B47C45DDE83FB3A2724029B10B3230214C04FA0577FC29AC9086AE18C53B3ED44E507412FCA04B4F538A51588EC1F1029D152D9AE7735F76A077AA9484380AED9189E5912487FCC5B7C7012D9223DD967EECDAC3008A8931B648243537F548C171698C5B381D846A72E5C92D4226C5A8909884F1C4A3404C1720A5279414D7F27B2B982652B6740219C56D217780D7A5E5BA59836349F726881DEA18EF75C0772A8B922766953718CACC14CCBACB5FC412A2D0BE521817645AB2BF6A4785E92BC94CAF477A967876796C0A5190315AC0885671A4C749564C3B2C7AED9064EBA299EF214BA2F40493667C8BD032AEC5621711B41A3852C5C2BAB4A349CE4B7F085A812BBBC820B81BEFE63A05B8BCDFE9C2A70A8B1ACA9BF9816481907FF4432461111287303F0BD817C05726BFA18A2E24C7724921028032F622BD960A317D83B356B57F4A8004499CBC73C97D1EB7745972631C0561C1A3AB6EF91BD363280A10545DA693E6D58AED6845E7CC5F0D08CA7905052C77366D1972CCFCC1A27610CB543665AA798E20940128B9567A7EDB7A900407C70D359438435E13961608D552A94C5CDA7859220509B483C5C52A210E9C812BC0C2328CA00E789A56B2606B90292E3543DACAA2431841D61A22CA90C1CCF0B5B4E0A6F640536D1A26AB5B8D2151327928CE02904CF1D15E32788A95F62D3C270B6FA1508F97B9155A2726D80A1AFA3C5387A276A4D031A08ABF4F2E74F1A0BB8A0FD3CB +M = 6FF02E1DC7FD911BEEE0C692C8BD100C3E5C48964D31DF92994218E80664A6CA +K = 0BF323338D6F0A21D5514B673CD10B714CE6E36F35BCD1BF544196368EE51A13 +C = dd1b09e3abee968c6a9cadf292fad306 + +EK = 49469911485CB1C06A48A449F1A43B0456406243AF447A7CECD5467DF322A159AF32B6C59CB05D200CAC34DA66D8DBCFF8326FCCC08A77C9286F590F33C06AC36049B91442F18AC6C00C240E713D387C8BB2BA3780E6BBFE90A4B1D7B155360ED9ACBD63205BC3482B8953B3490427F28392B083A47BE5B18EF6AB51B9859FDB659B8424BA93A8F470014FCB6AB9E61FACC61311BC1BCB098469D9702FE54F8F931DE7B2B57543750A346367371F3724384261B569AB5D8C870A01822BB4E6C617F17DB6EB0D0989C5644459281828EF4AC11A119EF794530436CAA0E28B8CB5365E4854E1AB4BF87CA018AC6A8E62C36C97117014A569AB472DEAC7E7B1108BB8BDBD710AE8D033A1961917E171AAC6841B5A9C5D869E68974D79B8C70775955520CEC21B5EDB05B60FE230EC143BFCC15B550370E1D58E76D1B5BDB0747412B952131DB306A4DB2395CA69CB9912C0A1660517553C92A7210056C4B6F347CDF33C326A27155CA1A7BB809F8A4A46703537B6530E5987E02A9EDD83297A1218C68699E5A898F9487279D35BD01B57B57A30E85483194C68069BAB0FC4BA0F48880DD1089DD21ABCD07228D9B213C32EA184291A2B12E3E19B4E4B7CA51879C46AB93057AE748236265935F0B16CB456256419AFD82147C9247CE6A7CEE4F349AAA59DA7A4AEBB2B0ED225775CE085A9AABBF49B756CF833CAF22B39AB4D9AC4A26758430866C9D76C5EA68300AF90697FD304AD715C591798C7948FC1A954FFB40301A432B29726884266A3D8B8EED13F3A33A106349FF58075C9D67923A59E06322FC7258017179E7859ABB2A83234D81330B1297AE842AA1C0C8543972E5B3AEA4490D4B0CCC1F9681266A6A0F96DD955924EF25E39642556F18443497D2EAB77AFC01B1D2003F1981C92060743141458FC606BA85DE9DBB1BAC78D6ABBBC73BC7F4E0C6BCE13C8B49BA367E60929C61C34FC7BFF013D4743BF92A70B4683C724B06717237A76D58F81EA39A9F96F6D627162299BC82A355D06C766318BBFEA3386860D683AB75FA03A87B1B2C1D99A30EAAD78A79CEEB43C1621C54F79AEDF82C7F8CD5FB11F119FA35CCA71B4CCF3E1D83F07C3A66C3E82F2D84F640DE5 +M = 4660985A5838041F2E50381CB4E7AC908BAC83CC1E074220C6705E3F5FBFC2EF +K = 9183CD7EF4AAF2F21E2E852771F524B10CB2BDB8C0BA1DD36EF48AB391DC7307 +C = 166b3858c52471d4359b1e43bee7e7b9 + +EK = C70876917C9AC2A2CF2110000910898E21804D940D6F761A525578E2B0399F1C0800B62C8720060F88746122C948446472E73AFE78A205857C6D32B6C01CA0EC742311840A36A8BD157B1C50A944B4C213FCF9558E3068D9714ACDBBC88A1538B59764C1F59C079C5BDA31BF55EB731BF69717A9CA63DC316636461CE2CC42201C359B88D044156DA30AAB932F902030BEEA6D58998FB2363C8223BE3DDC437AAB4D1BA27FCE058E701B10FD211E5862542C058F3DE33D5561B8BB3A83D6C55377862181150173D2135CA3C8084615668C38ABE8B72F193FDF96ACFA3470FAA53450017EFC36882C5AC722659D229225E01C5F976171E19172BCE5290073AA08276FFC85218F208BA3A1108B62545941C8991C4CE279C697D8CD06436134511D300C3A5FEB963D36CF29D6065E085C9663443342A8388763B16566D99C5C5DA4A451C2688E10936293948A57C4CE7B73BCBB698D9B71E2974638D5433E56A411E4089F966F603120D56A48DB653A5CD373D42A6AF3117D71AA4D26A1639D63A305B8BE1DE15C6F678519FA671A91483E46AEA26C0C59872CDAF57B3A6453CD660A0D9A0A562BA23678CDCDEAAD1CDA5820C65EC480347FF2872EA9574C4148C7D59980C584646409793190BC721CA6EA9BF029C695563B0598BCB357A1A221CEB3AB96F2269F45C24108E137D1BC34708B1B66352627340CCAE6CB22F41A75A0A55F58701DC4157A1316FF968CEE300FD55A37B5957F41220BF547933C67201D67B1AE278D9649BCAFC68F082B7D1C6016EF360D200CA0EBC76046DC5AAB171A0D544719E3411B587DCE380D467BC13368A25FA51A3E9B4EDC77561408B776F83A76B24B489310E3B608F1B40EB7395470F86C1D0622C1545065707462D89B364CAB2CEAC9501157F91BC52A2816E9598846B56C1F7B1A6D06195F92BD53931078E923C9D1552782325878832224B21A1C26562245B636943803ACBADC559D3BB6DEC54ED360239F74695ED3364DE562751892F2B2936F6895C166697A4A44D10A49C59C53DDE4B2631705440B957100AF4E1BBD47F2AADF22780AE0255D0AC18A87A28D282DD1C59C0C51D373C8F4A912400D5C87B499E0BE8CA991939F160B +M = 0D643FF311D83CEDCB3A95BA0F76216A49BCA389A225396F708EC9A51BF18517 +K = 941DA82106D0DB42FFCB4EEDBC4123DF57BF0DF2A4E9119969872904FDC0B9B5 +C = 74ce291f6cf3368c72a7518a5c096c14 + +EK = E868A60B3888165A293FDBAB8B75C008E2695AE85A1C839CB08290AE87200868623049839674CF8E87C8D20C5C369B17ADDB344E263045017370D6885DD25785A0C430250795FC4AA1AB215109692B44C530005054020B32D73DED4B06AC32CC1AC47571B7244F2A05AD063DB57BB285C03C465A5FECB4489F82908EC72908B942153C318509C1508556B15B3BC7A671F6A69EDE283C5B87C2383324C3183B645086261B7CC4B53CEC6C5694106142A12A108A29D749AD47B93583020B3CFC328CCCA1611338A8576BA98659D9181607C42D7EE9B0C3174309FA7B3EDBC6BE422515C203B208C9AA1B3C387909EF511FF2A47AB03A747E0A83326B894168136BD6361D170B8D4087C99552D992929D832D58F26BF3D707B6D302F741456DE30FA6509A1314773FFC079AC94AAA10376ADBB70D857E556272F2A32E68485F84E28AD9326F656A57CE234AD2826298BA4C1CD4960BE4523126A405BC3E772121B1F7AB256239E9761B0EDB5C8D746B4D3323134742D69182091170E08C6E0D3B1862E202F332C7A70A25A3E2482113A5A2C257BDC6AF93C981E5ACC95118CCBBDB5B6244C1D060C9288BB2BB1A6791F748C4182B4AE6A68E060E2028690DEACB1E887A9213C693D57971FB6EDF6A95BA3821D445479B142737887BAD938B944376EAF87B15B210CF273B0BE07707FC52475C01B4485893710D84F5132D025E82630F8415330D257E1642ABFD8CC878E8B199C44107672FBDB8330F3C8CE8154E4E8036E86CCDBCE4B693B0C513132B8B740FFDFC51341BCFFA0BC204D63D6696B2271BABA633A572143E74382346C701F92C099B4371D18269A32769889C61AD428FBC110D450ACC95892791656A7DB39868E03FE6F97420910AE8476D43851AEC9A03734AB4E8E4087DDB9626F36ABF7480705C0E81C3887A64794CCB29587593BBB435C2377477B7A0E6A3C9050A84A99936B94C09DE28B018E73CA7C48B083C5BC1E73A24E20D16771711A863D1423E884808E0C8B6E250986AD4BF1B8592F8EB1549DACB4117747F2994D1808B65DB2AA5B05EBD7A0E614888EF86494B93822876C351BA487DB0D0C6F33C353B368BDEA3BC149CB74DAFCBEE209C50B88354 +M = AA28DCC71FA83D9997DD733D8B0D0394D84D33A3D3E1B74CB74DC6049628F861 +K = 8A77C7C5D298C5A9724AC05B9FE0D8843A7D859CC40E07C786F1F96F921F76C3 +C = 9d1b639d68b26e82add2db2f062a7659 + +EK = 76608E0B9539C1B6470F9ACCCF5465C6B355CFA9424DA750CC085477B4A0E9F671DE185995FA38088506A8524D6384A8F505058800B3F14019DF2977E79436D81B8653B844920BB927D2CC7657666DE99C4D865FCAEA3F18302A36961ECA216740075244215625419758B8B8A82C46FBB79333E56D8076BC2F98610FB3474E75A471AA6D746708037020D3578381CC7C959459FDF21839E8413B44C218643CAC49A0179B2DCCB11235345641A10F3D369FD03C8FF733589607616A50926C176CEB45217A0A62A1F4AD3D06669EEC8C947372E8D082E34789A8D9867C0198E5B06934D904AC5318B58A2A5F3AB2522C611F7BA5A1351231F836881116847551D834A310EB82E0B2C6E1728196B7206D00094AA928AD8138F97879B56B55FCDC0D35C76C336526CF52C6192B0793745658E53155241F46663A8DC153ED12862942674B029492D701BAB56D2468C4B165B588D2A6A94C515E9BCB91A55BD372A613590CD76416C6A0AFC40A60669C90BC3A228F05A6DCEA473688CCB80A4CFA3C9BC5157CE4D37BCED562D5B52B70A48294912BD127BE37C39EC4F23F7C3C01A521C56D121D6829A76B7235C2BAAA2BC841634521D8F360D5B7B31B0648FA442C546878A7CB2FCBA5559F94A90308CBDB72C60551409E364CEC93CE24D16593609159735111F918FEBA4B35465BA14AB8AA1A705AA9ABDFC596864347C6E445F23B64B81AB330B454D14413ED47CCAFA49946B828AC3056CB4195C5351FD65A4BAA57262F9A85A4DB552D939BF539B8C4C547B801C1D99C7044393A08143C332AA440477258E04A83F6089C864B1A69418D0B4B739A4BA729B3FCC9C10F9834BB9409950449A8EC09ACAC79BA0681B31A2C7E687793C352F496010AF4A30CFBBB89CB3012216D8E2B489676B05E4B8F142825C4C4552FF7A48802C3E8040C4B2C744AC477EA84901A27BACA79635BA6C0ED28947BBA8B788ACBD17CBB01CA931E4BCF2BC15EC01476AF0A5F8672897AB5A2F9F850BB0ABE6B61A2A4C800F5671F13D712E8686C780677952A0AF65B463CD0289FE3B56F89A6F7D1643F0823093589FC76619ECC2590076DEAA2D895CF1A81924A0490D99446E364BBA45C3BAC1D40 +M = A4BAA4C603DA1368C1F2AC552A331F77BF1D598C6BCB540D43CA1E6D4B8BDE77 +K = 7251DB9D63102DAC680DD894609F12B795371A4012BBD22C05AF846E5D43E884 +C = f20ff43ab1cce55a2879a5661c0a8c26 + +EK = E331342D560ED6120D12B8044C013C5A8A1204164B00130354015213361BFB439417F5AB35A18A4D1600ADE0163F6A1760B08B3BD8A16C3A82D253428508216E3952923070BCBC922FDA6D0E1A734232194EF979790828A110B9F096CD37B5C07D758D3D68CDB9642FAF100D732031DEA07BA884ADA7D4436C490924920D3B3B7B67297E5D8A984DB9136F44557C6BAA5023219048600B8550DEE669A9F38858D79BAB8682FFAC37B0CB9362723B7A1087A21C477513BD386A30D92A5F52F008A32784019B61E0C8C22B096B356C65CEA631CAB14632A2B978A40A91BA7544559A116CC74C28332DC745EB19AC5EF50425E59FE2C777EB0AB7F4EB49A3393CEFCBC846B63D399A6B86CB6168958E71045208C81F07F62CE826729BA2162C2B835185759CF4AEA00025F4AB46EB56AEDD408B0E016C6ED538A1280F6A0CAB2CE7B573258937F0A265D663F0F33495BC4852D73C774061DC388C3E75ACC69A84DE303EDB605CDBB238DB265AA26A8267FCB4A0922A5413CB65783CF37CA2051071FF00CF57BB6000C6057BD93D4DF31EF35CA5A4327CA8AA2EF7D33A04E5261E732EE8FB819AA446E02CB4370B2934140EDF17BAF6040F71B34F251C6C65B766D317C4DD181AC04103409B65C6A7ADA248549BE72A2B43B2E4B85B58CB5FFC0B33C675C0E0D50B2020BED86005BDE97B9862436CF7A7ED687591F9719E4803254BCE195185CB3C9A48DB6F148A0876B00D1132AFDFBA1C91F57E980B96F1906439489093194F2CEA56C46942796749926B36D498B026353CCBAC0BFDC84C208502E0518512D427DB058219B35DC793B789F5C579D9A5E7285B3AE90F71FBB40FA39C5AACAE582211D9130B7D309AB3C34FC279AD6016C611F902AF959C984564BFA565891A5D1FE13C9D27181A512EE1CA31BCB55114C316BE427B01B6A519E441F66B926CE959A90A712DA1B81DCB0AE6D67749987B3E541A59D2680B11AF845234937B63065B32BFBBC1C9086C7DCA12E258C21E7AC52F812CE4A16E347C5CC115C2A16355F4745B810A4B5140CAE72248B554725D9C186523CF625013D5CA11B7951425CCC18E014EE5E94C2695BB469BD83646256DE038ADDF203E0B60B1F6 +M = C08584D2F5C950E371668A4FC8F527E20AF1532CC28EE6B5620729155B06389F +K = F8F9921AC3524E9AF70CAAFCE21A20ED5FC76DC988625CA9465A257D43A6FBBB +C = a550624c550fd60910c45d8cf92822c0 + +EK = 83B08010002CFAE6362BC02EA2C08809E5031C213F78795391E4390F4A4F7D8403B79458B792B3B2A0BA0EA82811912CEA1C2553B264C03992D28A29AFC0C50FCC0343DCA764457D7F1A73A975044752CFAE0101AA47A3B706594B403B5561A451013EDAD45B60E42905A97D2A0288510B66E9E75CCA8A6B2E5504A9380785DB36B21B5B1839111A543B18E3B41F30232E1BC816A1992A01C51C32CEEA8B4CDBD4C30CF792AAA5BFF2D54DA6B988FD8C14534B2D24334625A68CACF5897B495D55A873AAD557C29957DA2644714303CCC8744640C932B8307B8A08C2403A94E17387F4BDF786B38276756D95C0B9FC4E56C7AB925643A21A9BB7BC6AC58262DAAB33AD09348F7C569147359DCC794EA4673ED1ABDFB71EE199B31FE1CADD2579F94682FB013039B935A3167FF8460EB3006DC7EA297B643B150C5CE360BB197732B7F9198F4A7479EBB8CB97A22010618E22200E896C807C5056D78CE088A8478A751B95750A849D12677C6DCA08CDA502EF603FB5C67566338EB13114FD10622BF8B0212C70E92C68827999ED7177CEA44A7A055F12A00231F3C5FEC1BC07812EA902CAEE99B899B39E88FC7FF6973311483F2A9BAB7917A56D2CBB549AA887E545A7554910947CB9F09423C75EE63B626E8BAAA7A00890340DA33B7C2CB6052B5CC47CE65A0873CE9126816D8BCB6A1C8D39265BD1797F610244C565670DF05E58760690D52B6882A9A303582AA03ACB3B2D857CA0D7B8A2BF859860DB729D2740FD87AF798497D558042319638A33326E3C5CB0D3CD6E71A346365B308221A1DC2E49F51E818B22ACF66FA0C586958CA78204A1FAF135F17977ED2801C4591F2893A756A0C4988BCCB011B389D0656A717A069BBBF1F893A3BB64FF28B66BD2106FC23C2BAA2E4495580D08C896A92F2AF36CBB13CEF4AB94E4CC9D866459BF6CCCDCE7912B3119EEF0AD4CF5093CD85674679A298272EAD6B14F2950F18C602C52AB821234F655419B843C31491C47C596596967F1EB036550A941A03790874FD8498DAFDA127C8B0561116F9D414171778C7C36012DA9BC543158A00352A2E39D802CA5254FB4A43FF40242ACA967C85D45EE0F8E13DDD9951336DADD5E +M = 1D51A0CC52E85972001B77047D97DF5F47AE11FFC6C31B4AF42FB0791A3DB40F +K = 70D18ECFFEA01D8C2D4BA32516A042A925618FE4A3A69FF7B932361EAE5C6B47 +C = fe57bc17b3241922fe9be4dbb3bde88b + +EK = 28D9320FC6A5EC10059D3A531C364A99CA5A13CA98FCA773FE3B4EC6851E29EB8C0CC19440922CBF26859DAC0801FB0D0868B7C6C2917C51B7F644B4CE2C9C8AD9697D1102496B9B11B012105915C1A897065B05E6E7713740A391FC2B486249779864C74A1820F34C44063E47C87278C696DE5260270901190A5A618CAED0DB8B21D15C2D0552678833C1793070128DE0E43257413E99A1A58BC50323B0C722D69C36E82659410683CA4107C51D2D2126156C7357586EA553CD88CAC0E4530EA66B1FFBA700EF3A85259B5FABA131517CAAA0383028E125DC1670FF7C62D74775EC58A5B2B6074794225BAB8BEE7C14FE950AFDBC33B9A6CBE8492B3EC2BC16734EEADA20A45C07ADF81FE3401547F06603018BF5C4AD908AADCD9B5FA1D08244D922EE3AB1B3C693335AB64060369E328D31EBB3699BC3F390363610B2333A61BD67CB7DE4C6050C47D6D1402E7B997EC2C2E9B76AE5C77DF610A893183A1117747B3927BA7BB9B9ABB00E0B7E376C3310C3A63CBB03A2CC4BE1265CA35BC4D5C0CEB4187E9F686290472E9B0264B110C80F7A5D5C34678A746A5C4623CF8B54021A725F2C96E4923C2F531A7AC1405E275C44697A9C794625878F4CCB5D9DB9CF903C4F9DD180D0CB25D09AA389675A972223DBDA0435169C8652967C74C583223398F34E86D46DA0D026F5D661A4C4A85A85AD3DA358ACBA0B7E6C9C25D2CCB1A89B5D35A4F6516349CB1E983B793A04BC495311FF7433CFB8BE2722965308014D914014DA39322C0844F3C657804F9561274936B6556A639903808F8495F13C1138DBA65B573327490D8A772961B70B5C6CB4F8906B1B92639AE1AD25045CE5401AAE924491108B81044ED9E6B996A991AF83011B39021FB177FC8834A244B38C850C6FFCA4BD2323F896431FE64658B45299C280CF02894DFC03593135E172CF5B523734153E3CA24D160CCD64340AE6D021C21B8D5B98AEA0D9187F85AE1E5B0D9B06B1D1B12EC223B35FB2B07D81A42B11120A869C0B873831A41632CB0C1D819418647BBD92712920CFC2F24DC7871A194860105A6F0E10302C391E1DC2FA4BAA0C8576BC6E55F40A12DE2944202C00C192B497300E587946F1FACB +M = BC2D661E6283B835BAEE160D1448957AC2366DCD087176E252F81F1D11E28781 +K = 82D886E17A88F82C66E8B1E7E329CC61EB0EA64EE63FA02676B362F8DFF29D51 +C = 81843f80505b87b56e3ed1512bebd2d5 + +EK = 70A72E79BA178F8951F762242A240036093906A0AC1F2501402779AC6315AE8A0BBDD47A8F347A7E8840269157C93A00CCE5A27CBB16AD9179798376BE8638FD97C976D3513F96B2F0542B78893644793185425864C7950E23102BBA9A4BC9B14F2B4981B673F8C55480FCB4B834490C9BCBCAC7566747A38777CAA5FCADFE9710D8627236E52D9B5463456586E4F963A7308040EA243E62A8EF87B418D92F95D41A57AC468ED5CD51A2B643D11E8F03AAB4F43F2C8160A89B5ACA63C7C9B59E2602458AB103AC58085EF7A98465884BF16A662342BAC721C1E59EBEBCB2CCB9A4FB8A3A650C52B612243D133F870613BF5A9F30095456247C34C779C899B6CD17A181903E0BD1A13AC73BD2848724F25EC2EC037852CD6A960E2A3509E982513FBA840D28BB3B732D76C5909B6612A6650548C709961368F8116236B6709AEC97F7C625094B93BE5B11E9217C8E845ACEF8ABE3742724969C74622C5CFA7776135CC2616B5079AE4535C39C1A3154866AD548C950052B88888761D846C6240C9B3BC0EECAA284ECC4499660DD2BC1B3959AB943612F35610EF1688C41105693061BF16D6E290BFD4941C0460FC173694538604CEC6774C9614EF16B08666ADD3916CFBB39B4BB75EFC166C7E8BF70AB8B872630AC554028E8C147BBB56D3BA312029A68300CC743B81BB35878B26892696F538334BB0A22DC91391D71CFDE723D9E813B2EB844B6A534280880C37B9421572A6B85AFB8AAAF5AF0BACEF356B7F32636B50B3336B7636ACD6C685ACB178AF9986BCB93BBF1C4C69AF1AB569B60B133A480D39B4BA319A6535CA92293D5082ABE76204C7420CEE02C1D372D0413B9F8368098104120D432CD184550667A976C9DDFE0916D423EA2221E64FA95B3F254F59359BE711087732B7D8336B99CB95C7BAC714742D0595BE953273E551D1122AF9B49495DD1B935255726A643D2F8A4EC9A6F573A97C8507FBE6754179A9439C33B0CA5BE3DBC9F19A18C3253A6830C6B69821C86E38A71CAB632E0A578F57A5377015FF43DEE85BF9C67591A1CCAF2C6917387C4B5193404C87AEED269310ABA894FCF51793DDA786F80CA209AE909B8147FAF316B06E4AD8C516BC83B +M = 6745F4F0730AE3F14A428A95C9CDFE82717EAA94F65B00A01566A4DCC9ED1E5E +K = 21CFA40FDE8834A21A9E419B7AD8B9E1F59B7CB184A0CC18932523CF45A1CA75 +C = e5575a62884a1dba85185b73074dc775 + +EK = 5E101D0614A50B307E1AEABE717721690422A1A97C1D05713ED3B206D57919AAB32F6096A503C5C1C1BA332063489038FD1BC7F7B816F6F343274C19E01B1F9C088B311A0C8C09864BEA142BA2C829C5B74C988266BC9F12D37EEAD97FFD48AC5DF0C7C595A5626A23E20663E8F11A6BB66BEFF4A91D6C7CF551B34DD541D3DBA1F16BAB95312A60F9625DDC4FF1C6690E9B05FCC5CE05742D65D5915740AD9A7B60F9D098AA62A6DD3968DFAB5ED93A54E305596AC8B1E4967A5AAC15BB4B540C421571EA324FB422990C2B9B82A12915745C24BFF841731C6C07FE705CCC9B4C15EC42193472A4542ED5FC0B0CA98A91B7CDEF68A6E7ABBCD07B984795151D72365F31BFC76793FE485FDC663C6B7CC43F5A9D410BAAFFBA43CA968988337C9BF802CA221B3C366A22E66F703C695B178830473D7C372D338A4548E7C88A9C4837860419A2B60A3CA9AA19A21B570BD22CA228C019EC6420E77B340F32265BF86A666C9FFC75B64FAA22860B205DE33492B1720BE514BCD5A47496BDEC246D97ABC377430528940BA447579A90C9E18152F69BAD12CB7C51C48CAA8BAD1EEB2867F31691B32B75528056E56955BC4400A249550569C722410FA2573007BCD2B7331648AC9B424667582131473C2E8B11D1299DB6927384B257A81B6E7868AD00216C8548739EC83485CB330B03BE99DB38EDA338C6240828D7A5FF463B1C0C88092CBFEF3A2598993C72F922F2EBA31FEC317570B73DBC53C7F04810878FC9718552CA2C5B7220B6B7298886C94D9C8762A4BD05D8BDE7E9483850C0F75617686174D42CABA69B2968004992467D1CE078B03884F9E00B901473E7059195487C5E3BB0B938049A257C8046B92D129A906669BB1B92B1A83FAF951A9E8332A1833D665A720D0451801874036A7A5133318CA94015A63FEB52C40158644C3869F2E37BC18160C8ACA2381BB9B20B5A58961AF2E8593884ABB47A6D968A8C6BBB83CF089C6B75B6522C77B2B4064EFC50C2948A18C85B1436787C3A076547271F33B864D5CCC585B317193572428FEDD54B923973A11287B6527F68535DA629C904AFED0646115879DB4F48777D2CCDC3784E28834C7E503964FBD58C3652152D +M = C3ED79224CB07A8D37DC9C789BC7AC8E278968E429087E5B2C0E878934DAA53F +K = CEC6DF7A0A9B79894EE00697CA123B88C4CF94EDAE8514C8A024498E909C72D9 +C = 0ba9ff063aaaa4acaea8519a7a797dba + +EK = F3007CA415887CB8294B07BEDD802012CAB18EAC1E58268C821BA9A63739E64AC4ECA1A1CFCC7E61E73E72214981ACC725B3040205134A998E3B0168F46901788054FB20C88EA08F8A96B1AA86CCF2D778E3363F4202CD8C655A14C13D8F954709F46FB78175DA1C839C612CC94984D33A40A2B3CE56C28302E9C849CB51F8C60B614924E21B374A381F473344847CA1E4C610A538645EBB7CF3E1894CB2AA2EF2884F1CBF7734426AA315BD52569E533D374A91EE6A8BF8E05393EBC1506BA0718C40465A7F24483D933926EBF49E9A65C56A1B25F1A122D03A14F150C62EF186EE39335DB1A99D2498F8C552F32568CF714C678943D74651AE345513A4B4D1460040831603874CB281CFF1F49A3FD43EC80724560136C07C3392D4B4493726AB25CC00585B1966B8E73246ABF05D78C43293670F18B02EC5D107A8518F014ABC1108B60B3781AAD6BB5152B228A5BAD5D81FBF0ABADFC1B89047C3EFFC77FA5ACF0FE88CFBD40A5270408F20601A981FA666B1FF9B6324A47D67DA9621F60042C593725A604CA25483714AEE23A38B01AE7EEC4BD2422D7231157533B819F554BB76BF26D9A2EFC10C758B584B1B663CB91023C1869E5283FE13144CC3149F6A2037D53008F720337A58534360765038AC222F97B9C7551004740A5F526597712504FB2B102906A35375943C011C8BC4B44323CBC690A5814A385CAAC581A8530CB201FDC902546C924E1A51B1154EA2D56C3D898394A722FB3B962102262B9A410B12AFDCE8250947BC13A88B40399E05B025A9770D6381206D895E2D319D6C2A237A26B06C7302B61C1288EBABCC439A2B8284B81407BE18674102AA5569A10461C8B1E550ABF41F5773C7EBC8B2E2B968EDD56800B9AD3D95057CCCBEF4CB143489C219A6570B9A4CE23B6044580F7AD2CD2597B8EB5300AFC63C4DA2A98E1C7ACB57C2D7A06E836781F5CB86BDB82AE4CB1577A0AE5540B4D23B8EB100B02966C440B68CAFF36801B99F38649D3D8A49DA61C719D196888481C798B76CB0BEC1AA037AE4271E04BE54075AA51569D700A95254A8CFF1874522935259AF76CC7555A056505D0ED973B075E185A37AE9EC366F52023FE381ED83FB42486B +M = 41C74E66327238C6F7B2ED2683FC5E88CC35083512BC285CCB7165499F34A0B8 +K = 9015AB2A00F4E86BC82E6B3F5208D45BA0A725876A9E19D52C9A43332554D3CB +C = e7482a3bde9bef30b63f4b8c87155367 + +EK = A4F9A7CDCC7E700196FFF92085458D7D6855DCEBC5D98260E4C32C94DCAA47606619C6C02752333D30BCB0E82909D7657FF199668B8824C7B323A50D51203E97A944467930FEDC000C69496751C3C69A4FA4492CA6454665E56C9B677845D6CEF70A21DC7028C4D487629B9738C300D17995F839B59793A0A8813BF9012E0139BDD0EA31582BA31E070BC7F2B44FE57CF5F36CB9D92C6926B271C290CA44BC3068C2981C6CC7932A82E69C1AA9616D99C36CF37D8DE7642F2A0A615B6B85660224ECA4AA6B4779A20A2DC93BF31BB25582705B56B04FC1898CAB5FF97B6934158B4BD9994B4A1643F8A185483F93AB349536A29A3445250575CFE07122021AEB450DF71943E0818B664951137880AA5586C66260B835BAC540378374869084B8E3CC91B9C12248E2A75C060EFB6925C35A3DF34BB5A8E76B4FC4706DA00C2C0331502A3B4030A8CA25AC07EA139FB8B4733957784551208662250B542FFB6B6985A130C109FEF00E30D6C238FC0A10E567737B8776B94D3FEAC0FD9B055FEC78BBC4961015033CF78805872F1F9899F69492AF6A35180C8F8393071BF020F746506FA50E5AE7A675542610F883B24A103A32CC407933CC2160FBEB0375A514A2D405992BCC8FCB82F3799365D238E02C1886B9499CA2C90D8B33FF32AF51F5933F721FAD5CBF78EC78802C7DD06777DB8C0FA3C0CF09790F65630E772177D4D9A35718ADEA8758057601C249C92876799167604664BFAA93537572A6A1425BC0AC53C85AC64DD9A7BE436F110C3AA68BA0552994DC019F9AD80B2767B879C8B7D4664AFA6C937276AB40417AFDC2895FA756909864C4E1867A537B42E271C86953B16279843C88DB9385EFF67FCB8A6BA13025B259398F149B49E1A4A9271CD7C1B5F0C6BD7AEA36CC6739C2660E262A3189E9AD342215FB5A95DB2B179CA763A8AC500EF59A4A243F6E6C96C278426D472161C1069A31992ED9AF9B88275D21815F1584CE7381D487457CC15E04E13FB4B93F309588D238BA0B59867680585C043857516395BACC287491B0E65B1C175B41045F2B94202F888B103A6683BA958FFE411135C3552BD546F9E3AAECB8C783AB074E809056545A8F7B89E7BD8DF0 +M = 6DB6A3F134471A89ABEC3384BB48A3C405DD3B2A5EF53821A3C1EA74DD562799 +K = 6D339C7DE13DA2BC3F672AEC4DDE931C811FAA91A8E91182DE4F94F2009EF16B +C = 66aeccb030555dea5eafc29a77b6ca22 + +EK = 34166E98297165A69FE3818A3857B7D6E97180D938B8B56ADE8C361F010DA4E933F85A911214465BA7A0432AB99A519BDC81647CF72C4498A220C5B5CFD28566F4AE2CDB025E6270668153AE8B54C22BA5270A1DDB5660984A9812C32E6AF44385C494D55013814900FDC0CCECD7963D9945C4A7329FD5038F382181507D43A96402A973EF683499854D29BA964A530763A09DFCF4B97EF549E5A60C1EC921F8A2C9745B364316784AB27D96F8A9980727E5AB1FEC832DCD023D1774807BAB6D02E898EB0CCDC0EA26DCD16518089BAFE96AE395348481427788794D357B59E4421355656318B3984623C472A01C215CC13B74A3A154FBFC4DE4877ACE367B20397F6FD29E757354E6542A31E48E01B43EFED71BC6AA3540D3093E5794D889B74CF73C6096AD1CE46F4D5A912BB77C10C8CD2F92A6A952B7EE647D7E73C73185942CC331AABC3CAEAB4E0F86776DE4B5EC53B571B818B6F9BB31937EEBFA22C6E9B486E0CBC8658CF2537B6128C939A477E5376C59024440C56E853994FC588EE3D883B3A369D6CA24F228412140BEE37C11E8718831B24C91C46A54D09F75B99015A92AC7049697260652A4288E49A25F8C223709A035F36DAED2749DF387F6C53DB022535E729A10C8542D84B79AC5B44029BAAA360EAFC90CDCC754835A207378309045B7DAF6B8C5B6462A3B777150BA65C73B68F75089E79F1E820889A7705F4B6C7E404436F68DE4B50F0A082C0A8258E80B22646C29E7C732D9489AEFC11AC788593EA8C865970F83C3957829A818D1734DA277871493B45B93DBFBCDF0366C3635C0247358B1C7B8EF81B4B2EC8B4AFAC90E1983FB1C70121691E5913AC3B2689EB28773179E7225788FC319490393149A352EEC56732BB61B1C086CAC906D422D05917F3F1C6F3A57A7B61BAF9A852A8859B5B4F183B36715E578C63DFC347F86005FA11B407494AC4B19A7FABF59D10A34C58C6308768CF88BA463AE8BC243405277AC935D1C5238335B47066910917183444C79E959AAB64915C9609A5A12461F9125062C2536B73C5A5C1002269B0C023E7228AD1084918A247167D0CA5D87F83ED7B3EF523CA41BB22FA002ADD4DCDB3E7B68C892797481BC0B +M = 121DC782B740EAE666E709EA6E3CC6CEB8EAD204CD7D85D2256839E98CA57003 +K = 63AC7D8750E143131B3FE26C0FD5484F5D60DC8D22B542EBFF0D5D8B54F34EEF +C = 4f984aa2fde056d69ce9ef7bc0a2d434 + +EK = F3BACC6A8C9D390141981325C2DBA6EEF3805950199468661ED4BA300174FCE35411963B2B07599E14524446892603BC300AA3A25B45B41A857D50C06595B40B80159A477D8AD628F455038960BB23B0BC32D90D48E014BBF0AC12F93F17E36976A8BFD1E7B682212815A18B10B5301E0B88A7C17C850AAEC549B98195532C9323559591F9DA52703CA2EF921B1DA82D46A5B522F69109AC83351C46BBC375B61A8E7FEB0161423D5246362DBC8C866A899FE42F3C3C52EF82AF2CD05C11913B87E67B060A2200BB60D8B94E58C1B609DC9FE36A147B5C83CBFAB3C5F59F2032307E5745B7C68E324CA91EC987AF771D9D774B49E18E1F828E3D17641C51CFAAC9450D3A4404141187546AEA64939D94B884868876C86348E27DB0F66BD1A06ABD331B8999A446370982EB25979C35733791A49608D412500E9A144036970C086F15AC90F1699CA79928416858389908F1300356B9C382C94A2AD5491E86C51905BC398CA41FCBB05951A54A3681C806CC4868266E100EC2A334DDEAB98BCC5699E192AEE81DAB58C5C3D24C564C9821C7C0F981A500D91E66108C52013134B9440591AAC5A9BDC6208B22BA88F269B823DC08BD0C4067B7BDE01B5B12985CFA30C9172C9A2D95A33D4BC4EC181F17CA7A294989F0306FE2A7C7F16BCF301752BDE3CD3F2CB81460C0E3B0373EB8B79FD84B05A783E14454A2F2ABC693AF0AB78A0095A3695158A2B6783D32BFF25A4F6EBC4AB5010C0E394437D208ED001CB3B2C92A794607A6BC5EB580E7D52342B004B3A17E20FB70A4C5C2B8CB39C9E265E012C7D03540E7B47681409E30D169AE1277F1230D97B432E4276406D0C4FE52661E69ABD03472F2A56F52B51A5A317B57D229EE0898DE0CB2FEF71DFB71A85ADA97E93B9F2CE3113E838AB458A9FE826090369EA0F496DBB2A21D98981AC4410CF698CCBB6EC6724E498ACD1AF8C480A6AB1A67907D0492098015DB80A98FA8CFD79A74AFD439B4327C07A03C71AA7589D757CAD8BF86DCAC20B133A5511A47DC74B12317FB305098069DFE360250AB29A4239B1792352C3571978B708323BD2CCE72D18392A9C3CB7F504A14014231E9B4F65FEC62AD3125780D51E256CFE1 +M = 307C7DF0692D264A8186B8D844C7287B236D0FC7EC148BCFBF261A16B0FB7B61 +K = CEC93D98469424039335CB12FD0ABA4CAAFF3E3B99E55A53507F2CD3458536F4 +C = 7dd2fb9b6e3aeba4015a4ea17b0a8071 + +EK = E3F49934F999E0884E019B9299EA5DED8B5374851D9BC24079FA481C534793D328BC3B3563D0922098B98AE26406BB81A48AC0D24102E1D3624F974FCE49786890AAF9EA2E9CC058133C66847B67EFD61C7B469DC8E983ACB6ACB98C25D2A84A6EA82DB780531D0A4FA3A84400C70DDB48CC52406CB3155EC059894A4C01902129D1614C3BC25372C730CDD6CA8B204B9D18793ECA8B080881119549779A67FD456520B1011C6609CD4329C1832F7ABA7997D79B9510409C920E8EBA32A476B72061CE58A8A0A8B369315A814982A519E88E8FB25B3C74B527776C671C7B48C3C9EEB76F2A60BB39D5722A71459B180BCA9A9FBA14B3AB764E5F931DA0A55FB247A93ABB8509334050A029CB7145D4141990929A7D224FDC905419D62828625E316778E1517B151CAFB1B8B8E5E96958447944E266F808017C7CCAED571C64D9BA153709C303C92DC69B808941A8C3C760E52EC7388E800159CBF8626F953E356A827AB8692FE1982F07884FE3B094ACC0075128B3D54D85C39C08D065B6E40B5475CE1F269A2227AD4B368C683A7E797A7857C26EBC1C5207E6113C8B17F1A77186549FB63617611C33CCF38102062094F12EFD292A7B0B98A1423B92DC318E919B3DF441E58A36C04C7E60B270A453707DE23958974EC3A455294168D1265EC6E606AC40C79B690E5829A0F72910A0F5031ED1A5AEF841C58A036A10025B419E0E2BB4C6782EC317786BC1CD538C18B7223345699D44860D0BA04413E70B7D5126D2237545E550893427E34C6FFA40200AFB5D527B80C4A3A32B42B49FF5043B14AAF6A69144D58388A254F7F05F1DDA51F980A3D5DA436540A67569042E6B42337A712FB65A208392016710B8FAA763321DAC533BD06219AC6C48B6929D54D7B6A4A46280D2B242A8C1BA5B2BB42487AB031558BAC899EC3188A1459DB434C5463DEB43BEA974C1167B83C657C93A9604114128256156EDFBC604000C05C84FDEFB2218203131F40483F9C3B06C0FD524129FD65D0AB55714052A24588184164AD4B5929668A5A6F26F9CF44BA946874A21827E5B68A71B21F20785308A3F8DD6EFE22012FA9F25E348661EA987E6455F85D1A368EF1789708DC7AA8E849A +M = 60363F5CDB16BC516A1367DFCE1B72926FB2189B88AA1DEBFD22F440B9CAF0C2 +K = BD132E98714A75116BB032DFA0C7B0C34EAD0780C576DF9EC11200256B4BDA87 +C = c6e0f50042f6964ca483a4bbd72fce1d + +EK = 964B324032B0EA05C8042A49F702AE0FCB19257B1EB97079994A9C67043D99CB08708A2F64E694CCA51B71431DD20A77BAC80AE5A259EB99517020CC8CD53D525454A1B6052D4C598D9C504795835D9A45CB5CC7BC6313B857B1884067B0D97961108E57AB00DDD8AA5A69356093348948208947ABEFE117AD92C8562B5DB7DC037AE89C76D00C4315548372A272C32B30168620380CA0A697724913C173AE31AAB4B3B54F3760246A310F199027A72BACAB7046AA702710C145EB9A6F312B3B8FC291762BC301C900E7AB41D298A01D890AC3C85A40D0BE406000C6537BF9503E70986861D90B2EE3C8B0047E66B8B88CAB3AE9FAC382C23D06B835789BBB47A94823180859969535D058E7946C69438F89236AEEA110E404B51C1C22ED04CBB2EA32C957795797806F179A38642023E8AF6516A11393A0256A7EA3C27A8600A669FABB89E144E30A839D391E6C1A1F7F96A1E5FCCA889C8B09C3779B407075D97EE893AA4CAA1F5E5CCF3C5CC4DC361C8C80525BA81C05488012CB61D3EC87720A2CF0977BBA49B8F9D81D3EBB50FBFAA420E27AFABC387EDB87F114C1688830D4137BAAB10D1A6554179398B2D939C8F4387AF0007CEA2AFA9BC56E2766182B0C8D876123FB1A64C405CCD7A9869466B5825E23F41C4BD1747D5CC95C27912DA559535B195B96879F8C14F6030020278DBA6CA371C76F6FB7059F0B7E1EC67AD410B12F36878274C0B19A2F571A49A0358B945BBCAC5142F131C94E05C6A96C08DCA52819640431930D4089B2CA85A4FBA62F2B2614ADC7C4C80B06745320F837CFDBCB0A2885C321738C2B4233085A1B5F4AAAA658354078CCD008C496F0006AE08FE917BBE35433570B4C1838AB48593466D58F18A43A025355ADD4B333EB8146251E32FAAD8742BC847A7916212D5DC69329D0A3AE57147628928FD0B08752A21AC308515229EDC169FB6141FFAB3347F427ABC759C40C8D29448A273441A9C53654042967087F470024EC714B0708C033436995AC4FA678A9FCD724F703411454C04C21764C1B243146587C774897C6752BF79868846811106552C8AA574AD8DB7372836844DA6BABBFE62263107076C4CB48CB256D359D08F68375BC +M = 579474C123B3381801867203E0021E2B7F15E5F9426D75A3EDA6CBCAECECCF43 +K = CAA24999EFE659AEFCF18FC9C722FAC1D5DACE583B716AD3828B15C7DF5D94DF +C = e71b53d7be3621cc4ffd939681611f29 + +EK = 87EB24113349A40704B7243F2AE3653F24B87EF50E2220924BE06BC1E86E8AD9011768B255969F4F29C21BD38D6687756D795F07286B4EB04C30143C4F76810CD3233E630417F86EC751CAA87806CDD93EC0B5332758CDEC3A37B4F84878F89A4E687F0E457E45602517B676FC944E0BF9A9E9903EF895800D019304AC223E37623EE0C7DB798AA1A7452D298036A4197E89B0F279A385DC19D20BCED386352FE512A9EA90F973B6890964490538FD82A1748C98384C38C1434EECDB6EBF561366C228AD0086D142966BE1B8E1025097509E460850087935CF543A7309342424394267032A84358CD76E4F98C34B0005B39811233CC425A237AB49CDA9A884DEF6832B1A2031F5AF07DA4C23681B561C7D91A22C65129206187EFD2926016717F1F318EA95CC037208D2B313E0BBC59257710EE99F9B81187837861404CF4E930D0A4185CD3779CD4830CE2A02049AA0BBA0BF06003DF8A358CFA4CB2D3B7C7A508FEA1B930D1BA379E246B9BB793D1C2548F8BD908315BF521200261E42C843D963074CE4CBB3A5898976815CF3CB0DCC137F0CC414ECAA8883CDE897649E81BF707216FFF23B124B3FE6A39A45EA317BA5ACF8116E9825BE6AC518B4658D5D23CAFA600F94A9ACDDD38F303978BD64B4CDE34E73334C1B212060E29085925E6A3319EAF72097826F4233CEF2F4AB1BC9CD99B9338FF43BB9EAB9723140CCB86741C44E5D083CF6FC97D071CAB3135F6B358172468DAD6834FF3A1AD0750F06837EC25C6AA4F179D259A0FFBCB4E6756B627BC1F9F76DFCE2712F7340F6AB2109F023D6BAC5F0A6A63063BDA11625FD93B3E8C7315D387AABBCCF763237D785A89130A3DF63AB2F587D8AC4BC90B795C3639EF2352D0314AD638A532E625A78F296B5C5A38BE65995F8859F279795D0795433BDDACA847140650A72637DEB3529E8179CC056FF58C3FA094678526E12E791272BB623367D0103A68F6811B0636AE101090B2480EF8C6C59B51426E6A3E8C5303C3200EB783A9A133AD2E5261B5371FA338B6D016367650BE0D4A93BF3CD9C48629F8A448AD9AE86258F454BB2F60B1BCA578FE20B26DF0732C3222BD4B8A71A2F5038031BEF9EB0DFEFB2666C +M = E2F0D46B6C4A43E94CF967EF2BAC7B68C6E0424A37DB52F2BC0C1695D1A66B67 +K = F9F4E46B44C781A74DC60E149C81047C89C75469123ABC787DEAB36EE769102C +C = 043ee2ccbc0ed5aae0ee9510e7640b52 + +EK = FC93AF4B238968BC258C1CB5B94592501A51C3368DC9041A56DC5E5D230343380E287396E9B821270633DAD37C920182C82C9236FB28BA025DE94A8E552A605AF1393C988E08419BAB6C8709EBB41076192435699F1C48DC149D3F040A5A36ACC7C869FAA5AB3507B8B32A6847EC901DC8B9B19A04B70865955C4B3B01676DBA6B463C36397B2A42218BE0DA0B55E1A5ED8975C002A9520C114CB672DF5B3A7F838911F7869F148D51DA2584AA0C15F4C2A8C95653C95970D2BB4805928DC02D3DB050D6338A50B6C76332911E639DE912656B72619DC66790F491E0DB15C258C000650DE47268303BA52A49A9179A4DBECB45E7B47A74A35DAB781F52D27CCD2B6C75474474DA0374E25D21AC152E5AAB5225BC7EC5A16F5A1FEE930C300A8A15C090CEEA999D045D80CA73B5484C9E8823604AB464404F9A9609AE920ECDC688E17090CA6B7DF2108151E04BEB6A27F7EC8ABF95BF84D23CAA254A93F89DBBE133A6B1862A20B2B7241ED0695C31B17A7AF1A6A557BDB431A3D2DC06580A8DFB52C91592A80E3C1995E5B69D03AE3B8C13F37AC4852C888E077C290928420A4170A377F0A519DEE8789FB7BFE6A214C394038E281B56AC36B5474286A23142E14561D494AC2CCF95322919A34369B94D79BA787194A471F3A3271BAEFB4019FFC040C831447FDC9BC19B948A0710471A233F0B7104826A83B881CBF4764B1BB4441A843255A8445A034AD6972F4C66C906550C1C5E0D30B718C339618B3564456EFDD0AF36A14D7B705E62153F5C880F017740288545A6D51B13A671EE00970217BB3B33B69B56C823148A60499CFA960B06EACB3F9224275BC907D89E4722C1E35C425DB0ACE65B7929F66F82204AA2F0148BC0B7126B4EB13C4692EB3732E3B2559AB0B833AECF072C2060B1DAB6A9F8BACE386A098CB9B7B7447E6957B6219C6607B3CD83BB64A4B12C973C28DD7933A4B95AC3C7C59824A32E271007ABB369FB06FCC82B20D38BD436B54B155A5FC25381361D13B41D0C4B309E3A4C295C18B4F845573051C81B0E6E37A0D7869D23412F9CF55B3AF5121E491E45292535577EBB8EB2CFF39D783AE72D468F687BBFD838E6A61F5C5B95FF1F20379091 +M = 7B34969C65DB28996B6F9C440DE09074CC98DB4F08BD43E4CD948EE4ECFDE8CA +K = 52C8EBA213E652AC3F3CDDACCC5586E3C26332A4BF5E57B69421E6DD45C5B873 +C = 24835b5a55cb3499d2eed24e0a938370 + +EK = 894C58C872A67C630143FB29F5C2533614AC1ED6CA436463EFB38C7BF8A8DA348DAF4BBEF00A8E61E650CA9C6BCAD30CD330CC2D032ED7E42F41A9967C3AB568A0301A5A12EF70A2A6EA97B187691AEAC151029CBE350065B0C2239B67E303050D92A692237E21900BF2901A69231B14F04901ABA8D22A881365B943BA429AE31A72B8701CB07029E129B5D3BECF9090A70A5D3A86BE1BBABCBEF35592A7A74C2CC0560C0EC2ABA3095589C7DB2A5849CBCD483730F479ACD55B212C942F900407E46C0C584200C1CAD7D05C7DF467FD31C31E266A50C375689CAB1BE672774C77062018E74CA1BF6BC5F223802EF93CF7A1383F548196A9B4DE958C49014EDA8501BC8A56B2E1A2B0D46E18101D68816EFCE2297CAA5CC509399A0152232026B754A90FF104B9189426742C2FD8055191BC162B04A262C3D23B996C2AA867F3154521BB19E0A69647718FB76EA5B487C930A454943F0FECA6FE163F40557AAFB9785DA0B6450B0BB4095BA23AAFE83B731356B290DB64B4C39DEB5B30FEF38086E6841B660D41EA593E1C24028C60BC44A6D83696F88772425235A4F05A1847AFD5C84DEDC0B4C1D003F29AAC29710AEDA5053A4C0AF556C4F5508C45FB20141B1FB641AAA6EC6E88D0859553896C31A0206631750C954EE73B415CA163D30FBB75CFEB15714E3330AA346F7DE02014214C2EC5AE550906EC5632CF429BF3467FCB0327017703D08A7F3E9A7785D0C9D6377FAFE527259A0ED5894E2A8C766F688FE2574DF57108C81C60A8705DC7D102891437CB2B9988C879D7403967A83A70CA48D6F1B18A3408BAA13BAD9C26297CC10D920F0C53CAE4D85C6EE0C95DF22321F0A05894CB97C4A45F79CC002DA373AA857B65C726F54B03184934B11376852E9FF58099C72BBF531943EB5626C2C3EF6BCA145A2896B4C1BD29A353F49EC2FBB746134C1F50AE6D771160E64848396A5DA65EC32014F9669BB83AC52298B24DC2AB0BA2C82C0B4017B34F9D979D7D07659C4B76160999C47221DEE91521418948CB2EA72532E6A1C273B764D3160EA072A48782336B648C12B6AE93B5AFF289F81236AF0F9A338E8EC35154DB40386949D6E32A71D635053D5F55990C92 +M = 4F7798D88974637071717FCAD2C0ED5333945D51341FBA4BF1962A3915D986DA +K = F7AE95AAB26A52F3E8976BEEC50476D3B5FBD7ECF1A610054DC199A99497A1B9 +C = 2b161abe235364145cef102d39239a7f + +EK = 42803BF789094EEA7D875BC10D50C7D3947CB77CA48A301323B54FDBC94E480372E54AAB12C9680765A3E22988FF42184741A440E348C8D19EE8E7CF87B23CE6944663A4B28937160B0C25943A8742F811D0E417CABA034628A11FA2A06E3A5F51E47EC26A9AA5209582F73F1C705F9CAA74F1F300FE9049030061B9C61DB9999E1498BDC9250EBD324F61827463A6A5104796EFF25405AC687092B78248A2F9171E891729CFC11F86316AD6754E8AD249E7849958B2AB380783CC4123BBC087EDF1075BA8304E339F01242C15385A4007616D873587FCAA5AC786731447DB8C537F0CC64731A790E1BF23412AD9342F9654B87DB07E8EA506C534611F48A9453855CA669EC8AB548F648F8AA9A715D0BC09757A285320DC666637950A691AB8E2630A08B59258205BFCAB9DD37C94B9F4706A1114FCCB806E54751A12576063666252CE7F5041432C095CB469B5A1A634508CF1E2398716272E9570C1790FB53A3100D57B5EBCAECC6CCA50B4656F5219DF477C8AD4B7B727BC2BE25246C526D06B8DCC30423421667E554DB0ECC21837539F43A719CA8952A95B143745F79899F7D1C79BD546B6559B1109BF6D60275CBA5DBDCA608FE34CD96369D67B880CCB00F4B3CE6D3C6CD3A35DB44A6F8E440215B027E03109A6546662789B6A096784A0C64A1A4F07F981CFD201F3687691955184684E22C872400749A180CB5B6317599316790A7ECAB711861469EC794FC894AEDEDB90E45164413B82F18CB162769EB92A47630A98FDFCB09C94456E74C0FBE345ED88A43466860CF0472B6C9D4780AC4CC7189F77A19684C54789A9CB99CDD46534914B1990659E71F2662933148E13272E723C46B4809CB32A42D378DA7688F21CB53DA08AD3897ACBA940640089C73049B1E92C94C943D5EA32EAA19AE7EC072527912643ADCB591CC86B97696B98386615AABC1D32D23D4D22919E35786E77A4E7E30C2F6730DF129089943FFCC1678AA600AF4C3F40741867DAA06701A8DFE6421CD0A5DF34C32C933C9AC2B141C5134A7BBD469266D952AFF44995F8904A148B363E3C2A13978A049B968E24051FF6E312DF77FC5663502B0187A5588C1D84149B2DB835045F9BDC1F70 +M = E20AC1D70FA6A2C8A286EF0E3665C79668A5E6AE80197BBF13A0D0EF553ACF1F +K = 5418AE44ED01EC65F14D5CDB12AB6004B35744E935AC8A9C3D8D607F946BB706 +C = 320ce4d8cd4c2960f5980c8c1e2131e4 + +EK = 39B893D833BC95E37373D2C71FCA4336AC84DFB6460F156174B7B95DA92351468EC97439F2B88656F9B0B944850F499415981A66B76333402D43EC30F511AFDE7623BC00A1C58136484350A15824AB0A434561CDA2305C815318D204CA0315C5C9703954224522E76DAB0716719A06F723006D66A2916941139B1F29E53783E6BCC568628D6B0A0E72A44D3C19BAF35FD6FAAA9B2396CABA9B3BEA5C901B836758671391304E5330448A62CBAB155811C5018064FA002A73A71EE6146458DAB896B716560649BB823BA9F73ABFE44E80E1C4D0D58E8C9B397A5841FF9C93CB8488851C482C534BB710B27C6C9CF7A15356427EE8F1B40815A9416B233F4A05065495D4B88BD2A42A36DAA392A9CE49D67F4017484368017FB91ECDC34488F463B99A6CE60359A7F3C32D3A3DFAB70817726B73BC1C36FA4CAC3A0EEC9C6BD3A63DF9957502076150C4759F5362BA493F71D669A724C79788532DA797445942FDD214C3A9103738C00AB54CDE3639497A951C03A70A0B01182B2B9C8C889052857A2A541EBBBB77C78F90377EADA6CF21796E44EC4D5BF03BBDE6773E571785F1847252B1D7182BB4B08B41C54C889072CA0922A56C19CAA890D7F899EA21C9186A3A7106458BDA086FE017640B77FF554FEA32A2C2297D82144EFFE20D7836180CE46FDBDC18D357B6FA7ABDDB2858770598C03169BFCAB9B8794BCC48B779E87672D83F62E04D2B42B7E31451273BA0362B682C955C382442C010005E66A2644550BF9390FB427E4839616AD8C8342ABB0944B3ACE932FC134BC6EC7C16D35427E22DBC4A454D9B09FB49AA496BAC88909F54CA88E1747E1081AEDB23BF370394D3492F5B6AB02C721FE3E0A199AAAEA03A91EA1C44FCB70BD4140912AAAEC9F779DCB4A8C0CA9D903C0FA15BB7E5335ECB3724CE621D602772255775EEF07ED060734E7365ACBAA557E25AEC10A27EF405E1A431AD8052E0B752A08346D1961134C77CE4FA356D66094856141EC05FD7385D009000DC6C4F97A91B074CA154773498F61C646951BA5B6B5D50C4E35C6206A6C33043308B474A7CF587C0F07578DB4D6FF52DC654A5BCD997296C79A97F8C16E5667F527DAA3ABEC018CF1671 +M = AC25F29AF8D8A2DBD359600C8A500144D6C0236D729DA016C3F116CBBF621002 +K = 89D60F46DC4A11DD81C284E97631F08DE239C06B157529A15BF9B53C9EFBF9DE +C = ebddf54d8c0d2fb23389501aaa9fbe18 + +EK = 0AF62D21757B6AF2C9853421D2D74E0DD86A416A228A9035299C27B32528CC526B371C56ECE17C93B7CBBDBAC84D35441E6B3A17811F3C0A6556825174AC3C2BA51D53F176F027C20FEC424F7539ED3C6C7B964260489C3D8BBA94323630B87E856064E3BA81D3F018516971DFA54AC903C9AD9747AD8C5DB35780A033C385C23CBCB21D26153F93626C41237A02185C41C3935B306FDF568F453B255072348D9716AE9CB9B9ECA6FB0B78DF7927D093A3BCCC7F7BA711B27CCDC0051BE4A31BF3A0B224E0770BFAAF26F599AD190173A4A012A52C29DB006CD37076A12CBA65B679C10455E5442D92609DF209F6556CA36BC852D3A282F14AF3EB2A852AA268B1AA92346631953204F4ABD9726338B8B275A26ECFB80428881613C952545B082AC2BC75699F3285AC10905A00449AE6A42B43D1A4890155A9080A587090F7C91FD97833E13B601EEA06104CA41C408EE73C055EB1CD9FB0934E25660381518758CF3A8C95BB0397931427FCBA515D320D423A7440459C614B9ACDB25A9C143A6F704541A339D9811409D6BE200429B33674F61CA6626C7FB879001AC65F08C18310A4BCE685C37944079DA907316060A64069F87CC5D9FB3B56604AD8A52E72A1405AF5C549498F147CCA4A7749A37B5D96084B01AA3241288BD22592AEEC778FAC1C4A2BBF6085C2B5DB7D9C00B9864C480D8826C2E02B246AA945EB61F9425DE8E604B7D76486418FF0F5AB59BC6EEBB4932D6075F667A6AFA74BB66255F03C6F15A63818E759A4B05F480A4C0CD1072E26627513BCB85474E89676501AB2ED21A8F487780CA8CB8560B27A766213092DCA0B02ED3A24C8351EAE88947A764F142C0E24B192A2421367265C0B37093E0A69AE31756C5906845A8C7D01550E07C72FBB18DEF56E1E8B320F688110C4C4DC7680C9FA05D5B1AB63EB65450283ED6A52F9F535FDEC31C207A483413725022A2256663E2657977660AE63CA8671A8C343AFEFA8C43D9B8D0B93B458416CA4C5B87D121469EA5B520ABC0C079546BC1353757AE2BB1D301974BA03C86F624F34A4B481B29036F59F37DC2D5C1721EFBE0A0C22A966C895E5198A91F916DE62C0FB3A769806AE5827AE6F358D8CD6 +M = 7114A4B4195826CFF174FCB75336B25D4D1BF2224D585014CBADB0C4CFBF7729 +K = 66D121707FFB368BC5D4C73FD24DC2DFB742419B203DED2B3E157EE56044C128 +C = 394c61745f7b617c32522406e119e7a2 + +EK = F568158F1981259934435BC2BFD38A4A100BB9826E429312EA3CBF04A5397A723E740112859C74CA0C2783D5CC9798AB3C273D3AD6911FF76BF7235AEA38C4459761FD4262F483AC5D081900FC1EA3337439A3B4A2787E0D5763DDD2100E6A60DEC12B07B84FA8226017456B7F65679FFC31518C172F93895CFCB75FB74054116CA5662886BBCAD5F6B63534703E8B0DC807952EA32577389F94A7355DB079639AAF39B13D9F95CEF9AC9BC4B3AAB0F7070358644ED38C401A73BC2B2270D01D1C207D7FAA5233D74296302A90E4551D380C715265DD0B22F94681EE6093450186738B32BAA1B1FCC3C1F0A309312B662D25120F6B6D31B2B29809537C4A220D303DB4E5CE51B606DB64CA4B86947056015E8857220B8AE4822F28D31A37F63A89644C4E3A797FD7236A52640CDA3DA6D1782E933361A74B2CF665D04A07DC3843A40A0D8C526BE790721FBA16492557F51B6B6904998422B6848C93EA5043A782312C1250D81C5BD0407F5FFC99DF3993D91A71AD8499BDA29427E51BBC93AF43AB49E9062397F58CFD4B8048392AED850D95BB2F26DC55D3D8AA2A7249DFC35DD145569BA276ABA90B78BA143A876C3D97A66E02BDA3A34BD5DC4918F776E2E2C09E46047771B8C6FAB8C5215BE7514900A77567896899E94282E326D4848606FA8F2D350509B19251B4CA4B5B016C4181E8091D501327CCB9AFACD14C6FE4808E6802A8875FB786A52B70359845634BF1C185C887F1BC6FB8221347DB1DEB6C183C412C6D3684A3CC244D37C1C503B69DE67D4B02773DB8096DE18BC717CB3FD9CBA06A370EE84B9ED13597E6BC4CF88474E6956370C88078A56383799DF76621183C70D522DCB8BF07A9546D9CB9873997AFB51F94B49EDE924643900E201097D9853593F2A7E430AF5C57C754142AB462A12D327D04115540B505B8146BB64347A22BC71C02BD2E9C8CB360AAE5C9B173BC2E844CABA9659C2CC695D0019C135963987A5F019989B3064F8A0A8E4CAC8C7909AC4BC028C4AC4750E8C4FBC1433826AEFDDB2315002A27A2B43C539935649890B31710C56BCDDB64E7866BD07009CF11E676BD64E680645DFC88E803063DFE292C2047525EE37B4F3BF7AC +M = C78E7B1E5EE8F20EF0B67089306E1ABAFD15760B2DD2D7A59D2C00D496FA0FE0 +K = 5E95F007FFA0F4C822238DE22203E3ECCF50020594E1A8D993E8026FE9039159 +C = 0ab93357084843856a22e764ff6ab19f + +EK = F9238B1B1744FCE415242CB135300B13831D95854E3CEB49E72074B4C09B64859AF81A0C078418C79150D0083B8F9834B14116AF308BC7194C92575119371AA9C74C83350519C0108FC18620453E4820810B5A89D42B5B84FC134F0741E4C0466B2C4B58758A3D561EEA095CB3F469C3A34F19A29F3D20C1381669A6AB1857D3859561096BD8B7A917B40D4B754AE5CDDA47002CD870867203D9901AC5B852EB778705360DF4D35DA7B217951CBD2C026A4AE15221368DA5635D17EA307EFABED74342A6C387D29B59868C4955F6A5B0786AF5CB03F130AC7420663E343BF00998D83B9BFD6458DD63A3B5045C467957A729417CC133FB2048B8DB71BE36905B213A1D8C1BEB76BD27A7CBE281C305F44769746F90307B01613080D50F96CB451D717EF5F372D488B6FDCB762927B910936F161764131C80F09316526CBE62EBB07DB7300D7A81890557000046FD7C098999994FB87691A59F437A7F6D3690075921E973805693AC1CCBC6637471B2C561437A8E30220BDA078435455FBC368DFAD026F85417A5DA96D8FB6272D06F785929B38529D5990DAE3C7596AA72B9381121C6C94A7A593A5AA62BE830BFC0BF5B34C57221AE288302559045F3686D8941576EB41F32516763A90553A5727697AAD39B46C5D84A2382980FE3AC0F904DD10C97078B197B0BC4CB8764F22943F584BFA9F3609D417D65B3C367DA544FAB84AD16025CBA7CE7794CB3ACA32F3042CBB4C25605998A74BC16F80B91C5635DABA3B8AA0D90B1B59CC042BEE19709A747666348577088DC4C5C3168CEFCC5C12C3B4A06C08CFE4CBE21359F03FB99E1C6CF8C84ABDADB1DA905C4EB605FB9C8CE7979458080AC594759CDD82A6E164A9EB781F4BB24147039CFC98889C077698B2471417504E99BE7F283B0929A35E14E3670291DD728599181A6911EA2912B48515F88689A73E9688957473B0CAEDE73937C7BC385D6B2FCF6B76017A8F23A2A7CB54E8A98004E0C97EBC826D1A1142D8162EBC9A311C325AAD94900D9B115276E91DCABA8D015D8A549F7F56A4B182CB3304FCFFB3232F64C2FCB839420663E9391828968D6FEA820C57B8816E1F5D3B414481523D24B81E1E2C429FFF401 +M = D23A22F6DE6C0F3C28F5A7A8E54581BDB312A56BC90CF3B22A5BB39C9ABF420E +K = 759E8EB2831DCCEE0EADA89C237570E11A9419694AD1CF4474892DFC6877AB16 +C = 4413b7e446bb9d659a38de7ba7a8653f + +EK = 305988FF211E278150CE00B65C2669A14830AAA1A4EF2973101443E2A73A1BDC2CFD5AB88C54539573A7A5FA705C573693599C850370CA4A66E853CC283CCA0D2B52084C054C420ABC71ACC2C10D34C61C9CB0459331511107832B0A3BDEC7A0CD941D15A13F193162477211F29345414987ADD22C0FE95AA734745FB32F1114081957017B479108F626EF004D08AA327F0274B1DC2AC9963D8F557BBB58A9E16B7613DB8E379679006119B2DCC441DA80F9AA7F0BC2A8456CB78713A13985625AAA3AA9C6375BA06395F66EC3B63D4EAB2524322979A9B9E1178C4A966FB808C75416338237B3165AB20135ACB0437ABCD96251218F0C382731C45C9FA8141943743C1B1F5D77A064FC7968CA1F26B2B756F0B623323A01D8B0E8DCCB714441D7D5647F6C4338477926B248FAFC997B77C4A2BA625A3A5AAAC60C7A57682DE39D91D46778790CC5B45738D7866F7A909FEB27F70C9C4445A534C0AAF7A487CA8499BA372D3380A13C87978D82677A37C5C7A4490B716CCA2BC262C8853CB60CFA571D2DFAC83D428A010C760FC291E390102E3B6384C35067886940336AF5751E8BA399D11CC9788228E1E21A61F69E2AF7409CABB70DA8C775AA217EACABA3B2BFC7D608B374A47A2C96F56C57748B5137F8093121C0150C1A61803D5C6B42CA439E81A8C9926084F5B98931B7079DD44E2C9376DE77626EB543DF071C7A2C630A995502535FE8570EF7C987675C70DF8525D495C5F93B0B5EC7CF59154CE08A84ECCA36FADA9962160A1C2CCD3A728B148CCC9DE733719387D6C166BD9691E3EA6B22550A85A09989A49C90D68A51F195561A4F424CBE3152652272200FD642DE292A2061065EE1B962964BA33281B9B88222B122A3247AB9C247A9A6342F5082A685C8C355A1F96A0277BB8A97979937C17A47A2C36B3040C6B437BFC28B8DECB59DD9AF1B6818C146B74B0AAFFDCCB710E6BB3AD5A5F6AB7F8B2C2AD8980D6B569A5DD523E20379A6005695033260ECB823C7579E610F00A30EF745811DE05762A874A1986764A399B5CB1212403F6E7184028C5B2C47BCBA1A6537F180F096BAD9FA53AA495443314B91B46600EC339B950E9C4F1B1AD5E92385E3F7CA +M = C0A5ECA859643D0134F2231C8F3764044B7E6073C92C9CDF71BD64FBC59ADDB9 +K = 2239EC88DA575EBB9329448904221C63CDF517DBE3029713E3840CF4C54819E3 +C = b43a73b9135af37f855b196e9b85d54e + +[ML-KEM-768] +EK = 89D2CB65F94DCBFC890EFC7D0E5A7A38344D1641A3D0B024D50797A5F23C3A18B3101A1269069F43A842BACC098A8821271C673DB1BEB33034E4D7774D16635C7C2C3C2763453538BC1632E1851591A51642974E5928ABB8E55FE55612F9B141AFF015545394B2092E590970EC29A7B7E7AA1FB4493BF7CB731906C2A5CB49E6614859064E19B8FA26AF51C44B5E7535BFDAC072B646D3EA490D277F0D97CED47395FED91E8F2BCE0E3CA122C2025F74067AB928A822B35653A74F06757629AFB1A1CAF237100EA935E793C8F58A71B3D6AE2C8658B10150D4A38F572A0D49D28AE89451D338326FDB3B4350036C1081117740EDB86B12081C5C1223DBB5660D5B3CB3787D481849304C68BE875466F14EE5495C2BD795AE412D09002D65B8719B90CBA3603AC4958EA03CC138C86F7851593125334701B677F82F4952A4C93B5B4C134BB42A857FD15C650864A6AA94EB691C0B691BE4684C1F5B7490467FC01B1D1FDA4DDA35C4ECC231BC73A6FEF42C99D34EB82A4D014987B3E386910C62679A118F3C5BD9F467E4162042424357DB92EF484A4A1798C1257E870A30CB20AAA0335D83314FE0AA7E63A862648041A72A6321523220B1ACE9BB701B21AC1253CB812C15575A9085EABEADE73A4AE76E6A7B158A20586D78A5AC620A5C9ABCC9C043350A73656B0ABE822DA5E0BA76045FAD75401D7A3B703791B7E99261710F86B72421D240A347638377205A152C794130A4E047742B888303BDDC309116764DE7424CEBEA6DB65348AC537E01A9CC56EA667D5AA87AC9AAA4317D262C10143050B8D07A728CA633C13E468ABCEAD372C77B8ECF3B986B98C1E55860B2B4216766AD874C35ED7205068739230220B5A2317D102C598356F168ACBE80608DE4C9A710B8DD07078CD7C671058AF1B0B8304A314F7B29BE78A933C7B9294424954A1BF8BC745DE86198659E0E1225A910726074969C39A97C19240601A46E013DCDCB677A8CBD2C95A40629C256F24A328951DF57502AB30772CC7E5B850027C8551781CE4985BDACF6B865C104E8A4BC65C41694D456B7169E45AB3D7ACABEAFE23AD6A7B94D1979A2F4C1CAE7CD77D681D290B5D8E451BFDCCCF5310B9D12A88EC29B10255D5E17A192670AA9731C5CA67EC784C502781BE8527D6FC003C6701B3632284B40307A527C7620377FEB0B73F722C9E3CD4DEC64876B93AB5B7CFC4A657F852B659282864384F442B22E8A21109387B8B47585FC680D0BA45C7A8B1D7274BDA57845D100D0F42A3B74628773351FD7AC305B2497639BE90B3F4F71A6AA3561EECC6A691BB5CB3914D8634CA1E1AF543C049A8C6E868C51F0423BD2D5AE09B79E57C27F3FE3AE2B26A441BABFC6718CE8C05B4FE793B910B8FBCBBE7F1013242B40E0514D0BDC5C88BAC594C794CE5122FBF34896819147B928381587963B0B90034AA07A10BE176E01C80AD6A4B71B10AF4241400A2A4CBBC05961A15EC1474ED51A3CC6D35800679A462809CAA3AB4F7094CD6610B4A700CBA939E7EAC93E38C99755908727619ED76A34E53C4FA25BFC97008206697DD145E5B9188E5B014E941681E15FE3E132B8A3903474148BA28B987111C9BCB3989BBBC671C581B44A492845F288E62196E471FED3C39C1BBDDB0837D0D4706B0922C4 +M = 2CE74AD291133518FE60C7DF5D251B9D82ADD48462FF505C6E547E949E6B6BF7 +K = 2696D28E9C61C2A01CE9B1608DCB9D292785A0CD58EFB7FE13B1DE95F0DB55B3 +C = ab06d09069313e6d56ac166ef751dbee + +EK = F5841D6AEA683FDBA16308BDAB828DDDD7735B8B7A0DAC6A57EB5134B91D8D6CBD989580411144E1FB5A6A559A7056376210A8284742D22A5881C5214C90023FC910D5D02A869087557900273BB875420B5717CD0B23064AA820CDF372F3E4778D70AEB5D02B6182C4D37110D782B6E80303332697B4C610A384A0C632C0D9484A1D3B5EA921525BEC5755C839DF942F24A027DB50B2D760066D10A117BC9A1B65C448CB9ACF3B4F644316E8941C449803F6851A74D832A739B2C0EA9258C7258E98BD3E833D879A6845EC4ECC44B6FA699388135F5E4830F2625E9FA5CC982C578B2593D350B06288A854D3349C24586D3AA2E68726A873B1E5AAA3B22671D8C69AEB180718CB456B942E4B6678E620A00BCA310C722DDD499EAD9C6B66666A3DE39A45D7AF0BBB7AB6A0BEAF8BBCBBA17B1D097ABB09A70E410352D2084423AC53ECBB4C196021F01E662A60C68B3BF48A5F0864A25577912F52620CE6347BD27FF68A17D4B92CD7D01B89E3487A5BC2859781F3EBB8B5B4C2D682636C486A000A576A4B63AFFC05082B5ABE3CC0B37B1E586C2107D97157E325A067BB86453414A15594A510DCFB2FE1A0074483120FB83440DB1B8C3B41E36364F92056083CB9CF91B39F28CF00F6AD098AA10FDB4B4D9B64ED1338E0D5B7A5169C3D8C0184B19966E54272F765C0337BBD307F8C97369A7A87DA44A5BF468DB8A9AA5EA598F885AB50174B0F9025A4EB53D2323D202A05265331FD836DF8E02B4595458551ABED8A3875B83BF976942372CB37296C813ACD2C27B41A5514B66AB25759009DB38A9D0473D5B7A9A7D6795F1188A079B1792A01141347AF2194CA681055D36E954C02D6935BBA7C2EF7F4B5E47C8B0A0069F29575E863967CE4C53105230472172FB79E69089D5A7BCAA95784BFA279EFE67DA145308BAAA1A5A303757946C2866B4841660A99C1968B8F7DE799ABD71806EB9F091397C1CC4171152A6AFC36BD733FC6C53545361AB6258CB45C9F1331BAEA85BE4558935984C081F73E4B377E0251CA7C396BBBB81D271BB9F0589E1BE3218B0B5840372253AA80A5DB79E11199C0832B2433880B68BD84FC02AA3CBBEC205EBBC7B050967B4DFB11E2FA63BCF6B7656A8028AB607CB084C21747ED573A055166F82215D7201D5D439A19F584F470B4272962C137B38545309547CEC25B09C96459AB7B4DA69C8D7B9277BBC4B5568813DA904141A011D9B45AC1F181273149F3C46F45CA9735221B97CB528E8AB59C5711A57C603F7A91803254E8CC4A37D84D1F6535E5A791A50145E1E073430810B3AB79DF4053538C7DB4826A1B428A84553BB881A23507385271B32F854706BB2D3E884E7B391985B39B7BA373071455187B3DD7DA75F6988BBD6BC39EF2808C245AEC9C024CA16546A16F63831A7B6797951A40894A5E38422F30B87E70355CCBE960B216592D0073F1240C21BB109AE76C9DE5B7835BC08AC6601C314A82232FA6F6896BD7834F0254BF112602022844F0CBA9FC3D2E3A58EDD56DDC498ADC9A03FCB43CA138640F85397FD5731F537D6BDC3AC76563D6516F1CF24F84B7C957635DEFBBB70071621C8B2585380A63660EF2CB6CA5910BAD42A1B621CAB8C26780D4251DFD1C6370EF12193C3CEF0223187A4557BC08F4ADD382 +M = 76D04F481E68B2F901ECAB58B6369A2CC31A9DCCED82A1BBD426BE0AEE266AEE +K = 44263624052C18E3AA23310697414499F1C0EAE45A1060D84EEB65FCDBCB5733 +C = 85e371efb85c3186abf61ffac5340736 + +EK = 92D1A81751C40C606885C737EFD2B599413311EAAC707939B37500699131A44535F21C5AE596741F7668525108B4B7AFBA814FAC8AB0063B6A9060CED936CC6DA2CE4131695A89C35F2BA2F39A27D3925775FA9F43486E4C95C165A666FC3305AF30B419611D291775E0F08F34A65EFA146E46D207533B908F744BD246A94A4A35137731D02AC43E779E262A66F668784B30B231D83E4369400248AF3EE28432821F07B5020725C8D769B305B3AFA685A42E28C4F0E35BF407549361A67D7B6699CA0F293CCB776019585759502792F8D76A3698872F817A0C621084E53695701795ABBE16C466017BCC02B518EA387103C59D17127B844350AE428929810559A08BC91C2A29DAC3D6C14DA0979DCB4210142C6CD5B7CF18CB77E2E13029C3C23D2089C295411560024AC2AF25B94FBC14796652CFD8A524B6ACB8D9A262B7C26A279BBA7D4995A92A5500E081864200BFB51D46686AE14130E3C5A728FBB76944BA658718FC041DFD3A2480B9B6658A9D595BC4CBDC105BE019E128909978240EA29DA7C66664E17183E0B44969B284DB06D4311751DA4ECC6CC75C06395D5B9537078D24E2091AA45A92D18378415F1183C6B4E7546A1A1792CC07384106A5D5C8B1A369D3D6A8C83B927B72C1FDC7CE27449A5228C85BB6B0CFA85954C0CE5A5BB947F68C8107C1FF3B7D3D4900FEE59206B4CCAC5A1B4E65465609692F76227EEC0721A59B92262DB0F735E391343DC5836BBA779D6A558F8BC0001388E8363E3CB63CE49C4C7669C82B2B650B4611D094707571065B943F2108BCA33747367AB953D9423AFC5609591BF49B8A99650E4D8010617CC58645080DC0A141C34DE1D69E5932032E7B1BAB0CB2A8BAC3506B7D5E713DA79CA4E177A6CB27A545C9A80B3A489941A47AF84F59F292E314302ACB8EF0006F50A539E319951F6CCEE9F478773A8B0AE73C14B729EF4C0B89A99B87F4C9B8BAC735D31BB833342BD501EF458F955496138A6D07D1777A9489A24C74A5799A70C942FC839D20A8C228F7453BC29C02BBA3B0827801143F67691EC3481F9609BF79D9A8B7A1A7A610B05856B5FC8C3521968ED9695A00D71FE8C390C60A59D6734C608B7AC0B4643F7BA1DFD05B5BD853C9432269A9555E3912E9B263C7B939384A1794A50F8688296869AADB4B853091A291E42F485A6F93547E03BC1B57A603C81B7897198DC59252F9805A6266435EB2A26B6300D22667A878C3401800E6612C026C4F0FF99C889531D637036126227B674B95A38A2A93497FF83C8D3143A5398BE9C59909800B02C677B27A42621C190D865AFAC05513F72758B494585435F2357B97342D951A2AB23A1CF8A229BE909487BB2B8F521B09E0C4849632BFCC821CE30025B837A455B2D7D58EE4B0AAE1A25F8A5693F62B1AB77C229890899264BF63189ABBCC80AD1B8ADFDB21B0C2481342A137FCAE8A64B1E21C805B187AB7C1B637D57FCD8811E49C1D2A065848A769B7F02D99E40F4BE3783DE3AE4FE97E23CA716AFC0814C935293641D7C40EA1088EE89C2A43505237A593565A05065081F6181F35C55338C427CA628727DAAF8F5B5322E34488904949E45C61BB915525676ED2659EFC97C6A53376478B629FB32D49047412A49E98F186564A36EEF1CA4920C912B1211B +M = FD3C91294D8C974930B4B6135AB647D4A7885C83FCDCB30CBD38332E14094491 +K = 69B8F091A450890C0DCCE0120E9BAB05054C7785A797C93B6FA39FF5E0BC5A70 +C = 93bb28128497d58056b03bad37c55c42 + +EK = CB2468A0185567F8A60ADB33CA5239C11C4A3E0C031D385DCFA28C3AE2A9F71904BF379CB9E0BEDEAC82B2A537357A9C3AD33362602A1CF6458A745ABED9233A092B962BBA2B0A66DD4A85DAE11B0C28230AA44C40F2B68687B7D54833062CBB5B0233E25496D1C84204B2BAB06050C00C308EF53DD8345143BA810AAC477C8119B1C595D964B13F837849B58D8E1BCE56437F2ECA84B86C91173670E0995D9769642B0AB0BB0713D313AEB7C41C9B2CC411B3B62B110308D94F0DA1BB69D406DFE7286519692502BC83E15BD50494C1047980AC6043B18D7CB72EECB00EEDA515C97C0ED08B5D4BB001BBF08D9821B9A75C02666C357F00278279348462759A602359F5A953247C1928172A013E3C53B7E95B81A64A6DB3AA86CD7670CF7C38AF357A317B71671B950E2BB85EAA6138A5AD93A1640618BD98092D85D36015C0B0DFF6059F3B09AE5007F89AB551230D8B9A2BCA59238405372BAB7F4D8069FF7457EF3720A171C3A6312CC8D69191CA909A13946CF8577A96086893C0C59B026A21835543B8583A05F569977E072299BA580C179EA2976810AAAA93F57DE223B97CBB4CBE559E18139372EB1A2095B8B509AE2CEA5B4944335ED385B23B5EB7D0847A557AAAE89611937495C825B7236280ABB6D409CD513A03C91139A251B3278C929DB23BD815BF68007D50B8356C03BE88F86E410ABFF6CCB3B11BC5D41C7839D48F365AB4E9E29F0B0094A4C4ABBD6761527850286432530241968122D2BC877DF5781D17AE12095C177B69BE3B989E81CB539A2FF2E28D623303FED5750C58B9CE051A6B813899BB3C74D82B2F127E51030BCEB396EF547ED37ACAF1D46A77F7B2B24B48AD399B53FAA69C079FFEFCB9F8367F7C513D142C8392A8BE6089CC2301685460BCCB19BFD6AC821DD840A3DA30C3208668C7103EAB78C6520C1291239DF8217C25450B70302020A4BFF384F0619142A04C769C9B18D27E42FA30BCE60A1EC2AFB618752A3917EEDC37BD15C44D0ABA1FA3A40C23AA14C98E016A592B459BF4C13C07354A1DE0539445882E21B97B1767015810325086AE71CDC0B5C0D7287BBD99B381680BD6559B04FB84835C4419316FCD223B84D03816D86C738334FDC894BC81B1E26813A2159D426AB1FB70A88FFC1782E649BD860D148B33F7607083A5928F1C835F880DC9E3235EA51E78A403F7BA726D17951CB7AE7630AA7394A80D95A1EDB1059F140F3EBC8D1C9BA9F43B75ED90538CB219F8E4A2B202084E049473D57D987CAAD2B51DB009CF8A538F8205B0B4049F41ECB344F84C538CA49F5A8FF309D036C6C520932F08072F5678CA68568A41330D9BEB34BD308F963224F80B5DB9B10E54D146CFAB5AEF84A7F9C62B7BC24A26A578FCC51E36738BDCC8AD24410155AAB74D8691C1E699E3722481BA074EEC75DAFB723863C308F60E10D195617BCDB877153D9CAA775647A83B1DE113019CD6C3A7CA38554023A6BC7EEC594FA6C14DA8353737F0A549715E39C49FD9625F187C3BE1602B6BA178D1784B52690B1E1380847203C13624418C1C1DAA0B231AC0FB39293843CC3D6B48C32B15098748DB0B3672377407EB7441B82371B56EB3E90C983A895AF85D57E76C53088D944840CC309853814266D66DCE88915049579CC45CD602 +M = 7DB18CA35A53AB3A65E4C17FA096DDECB19FC7747E657B49D1C1710DBD1D197B +K = C21C8C4B59906D0C4ADB1F3CAF47F9EB326B8A62B3392407211D502F40C7E07A +C = c3d0e0732348ccc6f6b1d1e9048064fb + +EK = 0F613B04128F82A73867D9185891C29D6C3E1381843BD502D86099A740BAD5BAC68C590510CA3F6F2B5463B264BED34952F10C784A92AB7696268410F1F28C06DA7A18416A7B1B5FD23393C33592248C9A8B3956A999483E000F2A2C6F796052FBB22F7F182A191602FD93AC066355B71B7E6BE36E531B1D34F0382E34A4CF623B7B1127519A7BC4EA3FB0D1C91626A417B6129DECAFF2865273F759B4DA1A95F79FAD0CAB09FB61D34B9AD78B8046F5601FB53D28951AB73842B8921B2FF10417DB4F9964A41EE820FBA83D61D30D0EF2C2CBCB1F6CCB9E77523DCCBC37ADB8B9E31A0F0E1C4192911060E8677140690EC671A5445F42FB1A68DB4D1678BF9B60129D98A859837599ABA0DF465DAE76972946C73E8343A19A3C03657806574F59D2611163334FDB0EE8B0C13C679C6D175C22807C86F0C199C89CC43C0DBE6587F0A36199143EAE30116B3B0D49839AA18CA49E2992740B5DBF1C91ADA352D39AB7D0C23FCCFC41E783CA0A333FFE00074E72BC834669931630898B718CD5304E253071E730F1EB067F94861DD98FD9A262FAC919FE870E3D21BCFBF67180C57A5D2797F6C7B96F544CDF92C3FA8B49EB366C02885140D128B88225750733E6105868AC48A468002F35C34C38AD70A7BEC9C37713B98D9EA8A716CBC85D0C3EF5B4BF8F20BC6BBC61CE8150B4F842CEE0A40E0A7FBADB76BE9B5CF2B39749F51BEED8400822044E2CB01C021B0D9B7FE67A8AFF9B227C120F643B85152B40EC4A1734E2A141159A5A96C8B74115A0C92E6B913464994E980A8A304194A595BAB892801C15CBC5033FFAE70F368A62C65A598773C199E20EC07B73B1ACAAF48CC963A6986D9A3D2D236352F66065025751B9884D7CBE3A5538A9B90372D4C22797659B5CA8D357CF00B27C5714344374A5131B261D948DE22390D0521F50553E78223388903CCF241FD608CB4FC1AC7C44A2D3141F0B998B99E704ABEA1E634C1F44231D347254DC2CCDDC114AC4488A549BC4696400F0BABA18198F46E8CE43C93581FB661C745AB5A5520D4450982569BA1B192FEACF37EA8EC8B8B267271A042022DFA177A7C1CC1CF6765492AEC59729D6F61690F27B5D010F22C30E44D15864395BF01771158BCC5F8B48F656CE5D9049D6F1C11CDA96F8C724E0460BDAAA1DD9CCAF0C46162B943461B729AF3543BC9A8CE3B34971B39DD25A6051D41A248BBCD5555D7E2028A5B453FC4062DAB1337B134009C71BDDD705C2E44C64E15C18F26361D8A7A2F7A13D3C31CB3147ED777024B8A90B558812B47AC861BE5B894B989200BEDB242E559801C164003C6EFA61AC34649993F782CCA150DEE1443892BA3DB87B094C491C798B5FA1AA30491B7C7CC3769476D28AA17E754773390316647CF33076CC6CA84C804B26E75295D2A4754B505A3831DC793ABD874C6C1451911B97AD39825EA42D65DA63C42CCE1EFB1397167F1E8933399C2E288AA57E000406A4C66B5A357AC59036F37A52516701B52934C6A1109593809C0F72170A0EC9AD22EA6DA64B0028680B405924287280A8C49B2D516DC9D6B93D42A9B544C6833C0340865905EB00F4661B200686A0A47FE280937BB00F8022B8F0E64AC251BB62D09FBAB3E7C79CCD450EECA94120B05A0B071588E2150EDA6B14150F +M = 876B17263B409171B746C6936EC65FC94137F958DC974BF98110A1D07F6D95F9 +K = 7265696182169279EF65779A021AC0A0E0E7E4CFD37C8546D4DCB1BF08572AA3 +C = dae014097a1fa94f4bf78cba13974db4 + +EK = C9CB9FD04057EB96006455C062E3C0722346ADB366DA0AB980C782C417B360EB1C1F6762EBF967D713A0D93A28CF9206E95451E91373805047D8A14FFD2041B4468B26C79B697A14EA75A33876BB865096C0289C1AC4B91A4399821349DC66496DF02B15CA433FD97D96F46F72E0B23EB561E809601C053A35F4171A963EC3F542B423BAFC56134B7C0C5927C746E6C8055B3B70B31CAD6A168DD78F63C64FE3044280297C6630562C48A822B570E3FA8A76995BEFE67734274337F14FE00C723AF55D596BBD0B2C04E5AC6D52A0AEDB04B2BF09B1F9736E9456C40D5976B1EC2CA21C28AC761E39C583CDF256AA3262C3264250B1C19B00849FA83BCB6614DA0BB19752AE9BCB7BD16A71017066F73804AEB3C7F9213BE4634401A7AAE7BC56E603516FA2839A791EA89C58052030DB4AA2887737D9BC9AD21ABB94246546892785CBBBFBD45102C24D2F2370BE91923E732892E599D3154502E878CCB990CE8383D2F5ABF021BA424008D07685B8B54C6A6550D9CCBD93066A5A651A9B2710D25B382E72CC57096900E16B7B9868A06909F441104860BF03134316382F64D4CDDB596C57866E0776C04F8C0F67F2286B7242477059EBE022BDA200B6271AF875A829FC368E1574F4F3C56BB39D7FF61131F014FC59870FE45466D968C109339F0CCC67F6A7092372CB977C75998EBECB68A46059D7146A2EEAADDB258FCDD404D6E95E5400C8432535EFD635AEE5235D3B8ABA4153B46C7D234AA94DDB66B229456C41B2FBF93F39AA048C158E50C312FD623DC1E818A494980A34C41568942C30373E430DD5250D0CC27D4AAB2AAFB13CD719ABC7F466B702A983318B8D0C3040DC56B0960291F30EA75986917A17BFB76BC4B4AA8EA396F127A41F73219DD06F27126A5F06519E328B5CEA9D67AC122B092FC3613D99F403DB86CCDD760BF8398C1AD6BE4B5474C34864F2B10D97E265FEDB464E01CB3A426A3BD8B3457267317B7649D62D4847C3AADB7036391CE068758BF1847B96C5F3A69BD36A9468F9CAB27476456B4EB510BB063C46D529758C6680B4588CE4F5CD9D225BF700B27F53C13D49808D561F0413315C01989B1582755CC4CC765391AA68A0617F39B843526081658532C2C0025CF378B31411E867C978109454818916F8052336CFC9788F87E53236DAB54112B876042FE9054D9C07B80F7B43AA900BD2580F386058CFF5624A9A062474990C2C126E22BFB300C452306B859201B3C67B7356CC7DCC36CAD7A7BFC44DA0591D8CC45BC7765E405A2F2373996A72433F332CF77A5C9F3146DE121447264A84339A652960109044B1FC707680AF70E457B41259A1B84C37892C1079B8F08204F218CE85796701B05BEE5961F55584FDD3BBAFF25F53F78D0B48266EFC4991E090EEB28799C002CFE902D1222EDB8A026813295E604921269D0E0A1F4CC70F4E528A092B4E15300EB67808ED20995EF3A80CB999553456DEFA4769791FE24C934DDB490AF61FE1FC0027FB10AD260A7C33BCFBF212D3B50568844FB022B7DAC9509B308A0040C9B5482D89EB41A655B7C193C01BF96E5CF8A08B4C1C344336FF53CE9F79009FAA3A3921807D9B4C25739C38568584367F5D882E4AFD33697EB22AD03D369E37C0FE3B981047BED55E0BC0999976E4A36C +M = E0AAD46FDDE0B8E64361C3233263D8A751F5583DBE91AAA6E69E6318FC7A8EE0 +K = 9C6EF50DAE26887F7FE5B0173C055E88DC2FE09384890E11777F742B99AD7C6C +C = f51de41e41b5b87f50e240b7611ff1f6 + +EK = B7F522438A05310B12921A8ABE79B4887CB548317B23A21A4213A0F940BC3268464343C89540B83155C980698C657251CE30C75073C3D3C73AD9902ED10C32CB101B0537827F338A94D9615154370165B9D22707693C5E0657BF890A1C5E820899087683D176986162156ABA109CADB1729A0B0A057C8007E4A6AE7E272C860190ED4CBC126082C1992B9F541FF68A419226A666F6A9439CC82B3424C3515ED1821DA501449B84B1D6C169B9F336AFC9109F4B0AA6A069D5C46095B40EC7C886C1B2BA060CC8C0A1B2FBB53FC102701FF33BE42C92FC8287EB311CBE4BB5D523420850B9D962158D14188C4A794E4C0A8A065757EA0C9A65429F114A983B4D55743FBEE267ACA76C14B1492E2CA839AA5B4762868FF2123A30B76D858B0EE4CEB0B9ABD3A2711BA5167B73226C3B96C184A1681A562F07365D686E17F10EB75545F4E0C52CA6BF41627B8D6A19787A3676159EF334A3F4C538E50484F97CBAA334C5B800A34C642D097549D8AAA6E6E16261E038CDDB816CE46BA2B8B821445209E5AB1CF71B008965FBF3A2673B5074943D2102092DF603F2989F32085B96CCB2BA245A7AAAC06C763640D11730E828A0BA3129A43F6F0825A682886D8CCD9E84B93999474B63CC8D272911D72729E79E2A494AF5EA20C1CA8434323164709090382644B11F0F6C806A5044098BB936F5CECB28A81AB516A1857B651B93CBABB6E3D76B7F79AAF6B503762A10ED8499347771F221C2A96A90049C73E6E1132AF53A88D38EA817CEFA29848FCC0AAD125CA1C829F03896CBA635DAA33ACE7C7EBD18CD7AE03A0F9A3659090F5F9976D600B451BB6C1F3281D6C2884522618AE20CD583AB9B32344B6A2C294B0684E6BAB686A39431292F70748AD02AACB57CC3153CA6862D2B15108EE71FD51C2B7F81ABCA9367D4619964EC7C63EC653FD1374EE3A9BF22C4819264C2A750DEC193D5CC836430B18C535D3E573F4574104D471D972361A6955E2E10AF34D95B4A123218667685B1AC6D696053966F3C56297B844657C85402A357649A82E4579B667A36734B665583AB026699D2F6B8F4F1BB25186858543B61260BD3CCBBA264A30135088C0422ADB4508A60485AAB3C63ECC9AF981A1C5913950CB8949B5179E48C7240CD6C858E1144C7EE92A885008209A055C1C3795FA3C49A98082CA077CE4A75B0021108454D3B0C9F01C00CB29166281A24BCA77ABB471A036C9DB1B8946B930BBE8615CBE4AEF6608DEC389BC75C443753C56F5A62FB6C532BD13D89506C4C5985307A53B2403B42265B35B1CFFD6B2CB443A359D75587B2947C7076EB2A2B5BFCA8B1CBA865674C1A2C1A5EB4917BFB9707590434ACADADC92CC7739933323924B17FB516974714A42E38BFB7F20E752AC6464503170C860FD91ABFAA4C6B70CCBB8A2FE3EA91C94B26D5C64CDEE57F936C1AC10704D473AE10479D798BCD6026BACF4C599DC104D70439B0E2A32C91A5D58010ABA9984A34689E360C7B296486A4C681405EC3FB92B44210D5D3CF52534095859E42BC9BCA7B3864D43CB9F46E685C0BEE8853FBD31285DC2EDF129635C70437B612955B7E56A128DEA321298662F4F96A8E1ABE81B54DA4292AFD5FE45E31E16B17919D9EBF8E87B38D48053AA9F6F41C5B55AB86C4E0BEE558 +M = 90347D478D5D964D66A54BE930FD9F7FD3C2AE1492DAC35A6CBDD02616BCE14A +K = 05BD5B91C2F634E5B8BC59697D180CF1B36A244C6EDFEFE7458308B5854C77FB +C = f2ba76ca0446bbb2f7dfca6fae6e7d44 + +EK = AF98338A682D431CA0E17775EB170E3742ABEA300D6A46C567C364DE8939831695C59BB7686729C9001E25A85FE926CC6E584E2BC86D3B25BC9D6ABB97EB7F15AC23656B3185CBAFE0C39FA0789DF0678FBF5A43E6E0C53EC38076572D9D84B1ABE742E2F6C0C8CB08CDCACD23B71D57D06708F32D50870D9D636DF1DC01A8378A211A134BB255DDDC0B62C75812AB1677C50DF56B1FF62024FD722D3E732F56A2C6EA10CC31F280ABC8347788CB291AC5A1820525B9A33A7089DD689962A046B652AD182639278279EB884163E2B115A29A3899CB0EDB4514A0836BFB8A51D834C1939B8DC108B6138FB88B9199DCA5F7F64AFF36B9296613F891265778C7963C3E702B81C54834469AC8B59920BEE7878F01052B77B0F54B6DC61AA3DE695D20786F7D309C3B16A8D2C90A921CC317E91C015AC80DB106D4810EBBF2C5A1530506AB1E28B7A32BF67A6981185F98B44CABCF6706B134B5537DC697D16AC003808119B0BF94C84BF569422C8BCFF834237B902D83BC4C16F5CDFBBA5CDAF0A69FC87DDC885DD3AAA852342C1EB8179756087C678EAE2878A777655FC19719593FF600789ACC6322018791874D33D9284EA512AF1231D4CC87F1BA6F6293A653036E590A892F101CC518110C984AC55C2931C976828283F0266609A45A8C7CBF8C23CA0279B133A38F9DC797D5E58011096D45441F11DC59AB5B66846A87059314FDC64E8CF50040B57432A18F46078AF5A6132B006856604CE009128FC5445BCB6891E91A8677060F39A2CAAA183FB8A0F6751051AB85474A539A4183A4486471418FDBEBCF40055AC46075C3B2190248A8202431DB828B82E1320DBA47A23A94DE5CC378B48FF4B633E2D666B561827F8013429956D3F5947FBB848B3A511452870D00BE30610D0ACC418F8536686ABF66851707D89FCBF65959BA3062F6A16E268488D04BE4E370C4247947FA823B27133ADA76DB58CF3ED1109CE433CA0042CDB809AA1B5D5E9C4258C6067B0004A905786473A0CA4B3E9D90443891A148407A8D89121379A1F37C70770586365A74FFE5C6FF170791681E5CE10BB88BC0BCCA82CFC81424AA5BDA072D1BB5BC62F6687A05A949C2B04005284FBA8ED0646A394658A5868304C42C05605E9292801630129C76A1FC083DC3696DC4E904BB1916BA2287DC37232AE2C962108F245C3A0B702F53271F6BB00363D88690A7BF37B345ACEB5426F34BCD7670ACF15955401A20F938A4407E00D8008C147DA00C080A226F71F15DD8DA20D0C6AFEE431B6B2733513BC877F5545753305E8C03FAEA935C183BFC1C40561B59FE80956CE2C5BD3C28F2248249E2A0527891B3B64BF0EB89938A42008C32D668054E508871012FE8653473FB70CAFA0A8F1A509948A2A967CECFC7B5DAE34E166086433C5977208C45D97B24238E875A790C2779974B4721F573C03C4D20777F1C4589227765E8E7AFD0D59EDDDC722CC6230356B477C490234CAF858893F0E446727CC88E1411242344DAC6AE6C2CC1D2B1AF2B8C32BCFB253013411F18693ACAB9A7A86CA5590964D39A8A50768718BD948566A2822206226020165965F7B68871AAFD3474FA306A2DC31A98C60FD2E5AAA8A0B72BDD2F70D6D5DEDE7D679758D8A325B6CF11E7922902ACD92A3A8CB43863CE98 +M = 119BC36B5F856C0A2F136B3EE42041B817125A600E829FF6B4B402131A26ABF1 +K = 4EF33F2E08DB26B11979F95FF6C624B4168CE9055FD31390EDFAAD5E2DABA6A8 +C = 43e78285ec869c7ef90e6f8826a878f8 + +EK = 463B553102898CA297E0C205F3C9582273ACFBDB13BEC53341BBB6724C774C741ABB16B2F992C878114FAF67C248603D8AD5842E7230E59B7537119B204AA8B2E0830CA3511886AC5280242A9A817D9A8C7EC8B95DE23254174D1F507129BAA49CAC9C6800CD1039BA2F6625584B8F3AB27657E6B7BA2A58080591D572C7E0B5ABCBA3BABF0525736ACA427A1F13245426C08DCAC5752891169B1A8373B4BEA8A49DAC3B8163E78E74195E8AB54007534133C02AD1930DD3CB066E7114DBF4CC9545C3616B1895469A1E08A57273B235874AEEB32EA3433DBE8732B871B4D0E3192ADC30AC002E4B82798E0C9AF004973F5749456605B897C5AA9938C38343B3690160615B3406AFC6FA20D04AA0214B9C224AC7E64A6E85F38AAC01632A501A6CA1A4D3E0ABAE384AA2A50911E8BFE945792C9283F9A898A1CB2E2934550E3CC52E9BB4C2EC125F64C28B0B12E0805A031824F423B7CFD9A11086523F1305E4C130C17161AFF366472875645BC8A1B14DBB104494C746F84B4599C07FF4E74A3A1408CC983CC2C6CC34BA04333659C1F960E06B73257C5EAD5B3406D70C3DCA05B9EB1E0EAA89EFF046B58471FB7268BDB6402174BF03F92D4D22C7F204A35AC6551455603D8382CA3AC726C1BA3ECB5D4244BC62F10989B4B9851C4346DBCDB959516CC260CE2599EB1232CFD65FDF39AE7EB0763AE47A359367A7720D02B07A5A634DBDF74F4AD589EE2691BB4862D06B6836F70BA8C582F3A7996BD7BECB998CB1AB1564C812AD04920B9121139817E8F06172B217481C379E2C368C0A12194195A03177A822C76B0C7C79AB700FD5C24EFB24BF29139F4930E6515E7A1880D971644ACA12E4278AD22CB96370AE09614D96CC0328265F27E2B2D60465C8A370736632257B191B72185DA1A2E6FAA6759580C6E51E6290B76944C2A8743610424DCAB89CC9B79AFEC512DF9CC5B4807B0C93A889F872D1D8950CB4B371335718035709F36710647157141E6F596FF677B132352D3C35389903375999B2A0D460CF16A581C3CE5A057DF42051A7BA167D6647BD683290ABBEB3E67277C055C5E70674555B98D365442BB8D2859FE47C1309178537E78DA79B7016890C94864328CACF327746D0E32D65D9C7C0574FA5BA9E1FBBA72D990C62E1AD74759BAD3B7F9759B334B10EC8A1AC3D8453783A621C898C99945195928445D21B6F40215724919C3959D77731C2ECB171489AF6F545C7055D55778CADD250DF49913A7769D14774D87940D9C0C53969BB2AA151E063CF78CC541EF643AD7C916B961983983F886C7D7B6A016391C6B9C64E95A03FD1F65B6C924B2353678D3079676C25E236745955CE5A9500BDE96A1287B6A795B3382B438E64C588878CE447530D174B53641416E328E428BBC347AAD32342C0F17D1EA15FBE147E3D0009C1CA0C0E5A437F1708A602026F0252BBEA8B7C70445A456678E0777994C021F61A8C689DCDA40BB196512C8C53FC3B0EC26B3E2474419AD79EBFA58087AC8987BC15C802028ADBCFB37722B0999F6EF71629AC2966FAB95A5A2D3F74300FE668F9D912F8815561C53E1BD24455E58FF3F7BFBC2207D7966B1414CD0D695C5BABA93618A89F32CF29B33FE97EE961F5DF14FDCCD0E81878F6C76D5651730F6456DB0938BF +M = 697CC7445AE2C9ECCA2569B7871F0BBB364E63E4B782F734FAFED4FE33E4AF14 +K = A2F646AC5A87355FBFE9A37E58F405420221E523844C9D00AB089EFA0FABF280 +C = 928dc1f35a728a4b5d81506385e30b47 + +EK = 0387B2D669850AD9379CA70B3EF1BBFD487214F08616824787C4506C83740BE76CBE452CF99369CA80674D3B22D3E04FF95093BD00369BDC5C8126133C5A15B8A99A912132B19C275489B7914858E806CF4CB10D3FF33E018CA8776A88FA30C8782179D289132E0CA4A1BB19463571BE1977109C2BBE4C9433D6986AF12E7079C4B5783390C95C8468545F48A5D669CC0567CDBAC54420DAB1DA63456C692678105E08A822D0F99584D7A8BC76CD9038C2768663FA11A8D8E7B86BA52DD21B323EC22AC2E7B921216282233039546803D509FFB12BA2FB7D3FD38F4B06B848233BC90C2ED68AC41FF24C6425C6C9321A7B697BA5588B434B1B5A49CBB9FC479BE68257498A05865A7A0217B8319E7BB8B55C15967319CC510147BE9BA5511A967CAA2102C6A41298C0F7620E626693E976318E6A7635536B2CAC9DDDFA58E2382401AC778D145774494D2F476F43E0C3AEE004D360C4A65571BA02C7DA13002661B4838B22B9378F34579F46653A30A88BB501B325956B0B5A261174360F128850908B5A3CCDB5B611CAA26773368B13330C48C6667BB351A2AAACEC4B2A2C70601513CC3A18B5B1DC421C5A056D1645FE9312507AA1D52929AC289F6D75269BA42061D556243B34C638A72DEAB939B496435951C53B22095906C68B1299A288D5F5CCB8762E76477C5A0611EB468ADA9073C79B09E80621CA9C4D69A7146A812133B9637F074586A5BFF4AAB6CD0140B43A1B6E2ABEE7AC50489B9E5270A93541CE03B72C00A26E274A7CD3793334CC04E9285FDA673E0241BB9C9A34AB7935508739E52A29F22CBB9664251C6068FD3842C80B17A0C1772F285525B22C65AC1DCD520217DB5715381C9A663DB0E512B9F9711537BEF235313DC46B758839321341E95348A75972A7FB1DBFB183910A442E985628843B93505534C63C8D8A5358B61D7353C2D174AA1416677172ABC66725E7317ECC83BFF257819790C9F9C506DBFC647DB27BD9747673F666D1239845744BE742BB27067BEC53437D48A528F3221D60C3E1EB00D87045D050BEBCC2B433F2BB2962B0E2E70FF0CC52A5BA7412E39194AA226872184108C4FBC459090C59E4A27FA4823ED8B3CD3C59C2CC6A81D3017A08234206C3854EB3B75BA441AB8C321C55CC8574A04DF42E201180846982333A92D057C61140874A9A80A46037DC2A3CECD534E9EC39943BB300B1772510B7E8186C2D5B6555584F54E39A2AB6473806B9C9E71ACDC8C15E43A885A4C9B42763766C49DDDB890C8C7B22159DC91865D0E79AB10372A9F45963C59D8C1857CB654B2BDAC0AF0A24A663C71B744DAD1AB68A90462BD79F6BA55376125562A5B1326AABA7C19E593B7D0CC1C8711B8CFE3547A00ACCE1646E766BC03767CF5BFBAD8F08590E2165C7706544DB5A942925070A878D13418D31CED35092F19C197DC2A517967E41898796A51AF8911A1857244C085045677865B125573CA5E24231251243682C6DCEE524088572D2015D9A25691F2532E75907C107323731591BB061D525757540338BE19913323D08A4082239363CE4741C92AA29F8CAF146AF1D277A76BB22CD54663914647532AEFDA02406099A75A63F7F2CA5BEFC74A6724896CAB84D12376744CCB1C6ECB1DCABFD20AAEB88BDBD04AA5A7E2C867B +M = 52CEBDECF06579F4A9351F77CA95B5CEDD034D812F3FB7FB50320CA80E4118D5 +K = DEC4780793A61DC6222167547E251BEC419B282883B18F9BD06E053DB258C174 +C = 3713b942f8e6873a859c3d749c7c89be + +EK = 82DCBC98650A04861DDF15380C8644C6B93F197A5B10702CB944439BF7AAFF090C49E8CA58DC507E5643C17A4D2912BACFB76454D45FD6EACD191910B472463C49B76684777BFA71BC18973677256F649FA6041A6158046F75268E7CB72E8A974EB2CC7DF1B8AB45B0C651BF3D99211C071D55B9443E6A4A65B976962300E5F7325A228A61727D8733C0B3012CC51C2332FC5BEDB05962B771A232B55B4BCB41AC4D85FC6BE5380ECD3259CDE1B809D8B6E67978213798A828540ADB86124B6F137CBEDC4B64E7CCACF78031211A300A79C59508A60A73ABF93580AA64A7E661C282F5C00AD8784B002F5AC79EC4AC85E0290FA861B9D8B30D9E56CB934C6F4CD5C033C7AF7FB55F20C5A11574B3A460C7A3D73376E6CA77AB911CA118C963B97AB675ACAAC6BB73B0080BB5E0261F79E40C0FCA9129A9C118EA705B0BC7A2B45FF06CC15214A807D3521026BFF008024E951AA0752BFEC022CCF92A519B8D1CA910809B63CFA57C341490BC673243B7CC3E2A6AEA2BAD2B885E39738E3973011A67B266C438F2C2C1F63B251558947C00741939278055ACB8569F91110D895B97DC07BACF1389EED1271051CBF6A7B633A47848FB57BEF485993C5462E3B5548B96CD161D58510794CA60951A2A046C8743807619861D37A420DBE94633877134A92180C05B14E10615783C7B32B135428E59311BAAA32FE37A7C35C4390D1185F2931BAD539F08A02198D6450DC55BFEF625E3E209EEF2A7F38074DC681126CBBEE6AA3C974BA8D7ACCBA719292CFA33E4D5094F527BE94AA2231A762CC0970C7C81793471295B9B2A58810952A63B6589B29953C942CE49C87FB7B49B400210FF645C88179FD76BA408DA81C7464E76FCC3329589AA99855564329D8914E34A7B0D02685A92817C28B2B3F8A7A7615BBD569F2DAC20E161077EF46C6FB926ACF3C94DCC9A4B0A27641370B4027AB082896E188BC5CA32BDE911C5D865C87A22207AC35B72B0B8FB342E3A53BF735796F3C8930417CA84CEBDA48FC1E34AF9610F88C18523A4037E3540757162875CB5F82B1718B32EE70A39E5B216220AB3148CB1CCD118CE213F2D5680EBF865AB018631C88FDB6C763C082F59C6CD95156595E22FB0DAACB56341B7645027845813A59DF203104D9C8B1F647BD3537937F59030979463BB63F7C9B69E57CA17491F3618CDD162A9FE1C3F9B326F567C26D1AC6050685FC68A93CF59178BB87EC8D8B703519E60A22702BB5FBCF3BCD6D496B79B65415C175C554298572AAE35437BF899ADAA5C4F513E9F220553093BEBF1769743C6AB0B9FB64703C6305CC64B84CD76B7C8E61429781A822990B698852A3B583AF48C3B22092C513A223110589941D530C8B4CA25CB4361F2001B166C85CF910F006C5B0B71A109AC5986F8264BA26563E69D122644B6348818145CC026B783D917E74C4F46E0C9BF86250F521C21B64D50E910D1F1CAEF4B05F5A50491E9CAC2F3B5CE36407D9937D0E28E47B52AC460103F272642093CC9EB18BAD44AD36B8EEC367F155159ADBA0251F195E52032F1B0514BE83F8DEBCBBFDB5755267E76B028BD07CB8327CD431A7B73D289247210EC905A0529234B2C62C7A66338C1D381C88466B4832204B1B05CD1BF8E0A4693D941A178F62E9E09B74CAD5B +M = 161889F2E92B1BB28A257B45D179FB76847B664E6D7B5FD9698204A426EE96EC +K = 9DC0B2ED91CF4609FFB8F7240D6CD3F65D45105A35770A105B910BD9CC911CD1 +C = bb495d034d3a48ea1834726388f0947b + +EK = FC964FC0820E5DE7A73BC507469B013F2C81A225C8C067C4A9351467847DC4D38FF3237A9A38A8F7C273B08B260C5A9B20F8493A668459E0BCAC480E0BB50BC62941720283F758B7AB13B444E8A1F8366FB247C3CC339D413671ACDA6354220B9CA0515881A688063FA87487356C842324B35B064B5847A75509AFF086086CAB80DE6C7218D95877313B0663031E867610107F1491A9F069A2DAA4A88F26CD6CB97B43B51FB7156A47550434421024CC360500AA7595BBBA99116057A64A98C76D61082ABC47BBC2614D2B23EEF8A68D1065ABBCC057B2717DBA5D6B82BEC6683551F082C85C3C430580D7125D1EBB1EA410748D6835C5BA080D1140F9574A4460752C5278E5F24DA829235DEACBFC3663FF71421F3B4C3F073764D11C39C9AB6B6B2F1F24A7CC84AA73A976721AA7BBEC515D0A0613D06F80FA461A032A274911B82CCB9B9A4AC86C3555D37A267C54137B141A043E9C861C58D6A88F5A47B895ADDCA736D11CB227D190481B4FDF680943539437B04BA202B21B19C06BC8037B93681E2121E7A49DB8271422834CA4253F5B96AB7E723FDC599B8BF0567C176BC7C754B6402642921ADB8C30CB8329A1E3CCFFC8A501A077E34495D9333B897C41F9E2A11151902A9B19AEE16BD4038DCFA6118192CC3B09523BD89C0DD158B87276A6316DA118785551B9E1078C22949D6D5302EE5945F87C5A8EBB6220B673B8B7AE6499C993633E844BA8A14CCBDFA931D1145BBC260EC933CA2B8B861F505A9691CEB2B5716CDB1E07DC6ECA0693CE0B8BBEACB59F705814F2C46B336C65240BA7791B10226D3892AC60D11F67F29283ECBCB459CADF6867F41847A99A2E0469A417078AD80B1BB35549FEA2164B8B557B5610C64C810E211DB697ADC43034DE45BF407729B9F8CCBE3379D471367DE881E6EC741A4130C78A90FF24C7C3899129038851069BC68B9EB533354AAB155F829F6AEC9EC9D82B20B4927EECC243F014EC846D59D5C8F3517F96873511967408128A1705B834F81C4F1169EA500A66EB21682A09CE44CE4C9541FD506A6AF12CA3634733E4661681871717A560685794685DA121565671B50FE866B0A565B0A9728A97C6AEC4442C498C54D77184C44D919083921204334CB058FC5EA4765C0478104770B743A5093E842C013769F16B02A46083872C58D3D678DCE87A3799381DF117D0F357998C853606692ECC1F087C0883CA575D9159BE882045E60DDBA38ED3BC8660121FB8EB2D6049A5843A2D2A53BD529881799487B30438B4A585B2E77768E87D060C0D676283431A55BA9C129F036751835299D78CD2D85748C246F8915927B1C9A1194BAC1A103B5A1BB69370C685B15AA264C436683ABA9F4A03C49DACC5A1D3CD5C133599EB16006850BAC4108239144CE682B7301EB220A363032FB608137786898375366B002719580EC7F7733BB2C3DE27974FEB56C72AA61252A2D63CB63D380F1FE3142439AD1151B543591AB0915B514B3E97EBA17CCAA73FF0A3459393BAE20B1D8A8961C0615B180DECE602335A11F7617EBCE0A3A0B3AD1A78A3C8C682976388851285D83BA9E358AF22A14039CA015FE1B42F8A3EB454578504153817455045166F24D6DF0071E884AF76ECBBFA430FC31D1F77405F4B404B538725F561884EDA +M = 3349557DA70FF69886ED032A91D8FC23BE9E5245406670679A6E92AED870D369 +K = D8D24017609D9ABA1414D18AD4AC9E14A0954AC1A80AE9F29527351898F61483 +C = 4779729a2fc97ddac726eae0c0d1eafa + +EK = ECEC377523150E39B8E5A4B85F8237A685630EA7A3443A9249D4B90E1BA3438CB095AB5555706EACB3A61D5143029856C7E80B0D9156BDE63AB4632605F6009450B1CFB6B81A58A43687C4DB56BF087A75DF047237E9A9B79408A8369CA3AA1731A7190FF3C11A7699E3F83A1F655B3E2C252D732BEED0703A642BA3500859AC70C51C3DE886C26BAA47EB221074F97FB74957F9C61A02405D2E2B95FE198C2AA24AB3D649A3B6803C3636C03B3E199AC07D103960577738CC833CD42CFF97C55FB4BC577B70D1A8642ABB77A1530ED0F1405B2245347256C0D47005A634C9237420574130F607BE82CD00D81E15562AB8461F681159737ABDA7441F7871AE7B28401A6BAB14412A5BE5A4BDA22A46425B8B51964A673278B873C4F61DD8CC5A7DD3B89E11652C677E052643A32139AB971B5B0061D600440495B96AA3113725640F6A91DA0B4B651630EED446BE53C6C6365BDD2BA0F757CEFE05C1231B666404199937736E6A5FB3466BC4590767C2BFB2041DCF254886466288BB45F8E91BBA876B9C093BE2616BB3D2B516526495E74BD19B1E9C36543697ACDA981687111FD05A1B9F2255E8809152138B983790EFE836DD7A68A8A150513699969015BD65B05D364FBC851E11B506C607BE0CD116910C94A3E3258AD263683462F5826B85B4BB1DD2917B4034AD25210AC26F2355B05681015C9A2BF622BD28431CF2868ED213124F124C7C6797C34952870CCEA4970AF909BE10A57BC7AC37A536B7DE2A8B0C4459A6223B4EB781C2462ED3AA135015754BE56F2B501AFE68022C81C16D40726B8C77B0845209FC4B77B64FF08609C0567390F4C9A8187A15C719FC5C9C01433CA77809D3F9195D8BAA94B24CFD909D6374B8DCD2355D1723400AB552F264C938B4E1E8033BE2A0B6FBA03729B38FA39F285AC01A136C07D10DEF390BEA5688C41B155D81174662AE48766D1791C60F1606BDF9177D995D9167B755908A68E7A7CEE4AF53A42EDB486C8D119FED00BFA643ABEB12666E2CC2295B8336122E7D9601F4DA405B7666EA276A172026264C23863665E2C21FF72A6CE4186016D88F167A358889AC1F8B028CB4622CF07474181BBA6BC5D331088B88A1C185B28B90CBDDD54D88D4A911DB638EF236D6D06EE968B8E5FC11F2D9AEF14A3248EC921FF0ACA4BB1369F7B5B3991ED6B16C3A918FD9397BA4E454FD209567D97C8BFB47558B6AC7726D6C83768E0A64B034C0EB36C8BFB0BB86C52B51FB7DE503C390B97B00A4534206B267C42333B4C05BC90C7FD25609548B2E7087E792BA21E360038A6218872F94035E5F13149CB440B302A591817EB0E229AFF03CE9005535978F930622DD422722C059E0BB855143053F348B23D5ABBD49B7DE9478EBB63380E75F9054922AB65F4E897D02F9AF641CC6A34957B91A7969A1270E4264451053267137ECAB8C8C8B9B76354A63E1ADFDCA087E54A67F8A2DE4AC6A636348017C6203B4A27322167C2ACC85F63335E8AE4D1909DD1C3DD228C0E3B84470446EDDE572F7924DD409764FD98F43A20E5AC15AE9202BC1AB58BADB3D06B6B77E81ADF763836398BBC45433015B6523652751B8292AC51230440C112C6317A66F24C4BF927C7EB8C186C9DA10E1BC25A4DF1CCA9B6C3407955972448DEBDB284B +M = 6F1694589DFFCE022DC4DF1852FA49A41C6E8AB9F7887E70DDAEF4232B045DFE +K = 330D1A2D0E0B5DD7F759C29A22D91A09BEF17F8C5566A0D3F30E3817CFB7CBFF +C = bb94d0c68c781b2a9647febf1072bff0 + +EK = 48E11D1B0572F2892B8F81A8BE330B16C7353B5C319A34874F959409E6A41A71585BF36AEB651869AA87D400C6AF32B7F8270BB9D5C53BC3B600F493904AB000149FAFA1B090B544EA0101EE940EFE878DD64739CBD78D317A09A45775B2AB9E0383C75D049083BA64019658B4F44573C1B7C0B3A59495606D9162438B1A0A000C3AA5834AD5BBD11893598052E5B543E209215E41B8D49C4107F5658F7685CE53459F21452AC66F0D2398B6971A5A23A056444947220E95454A404C7213686E58A42E346CC0C44759504B2FA07198D742B1BE01A66C2BC64498CBCF6482DAC99DE7DA703EC1441D08C4A701BF84FC956B11411AD610146C59DA6454A8B3B742D91DE3C09A5317A9DADC23ED0A922AF339C090060B869B55FB3AA1C603C40868337687EBB27E37B804EA834D4D0084B21307DB0A64F69B7B49B5B0D237AC428ABDFACC01D1012A04008CFDD336A06B9728A036B6C60430A8CE887C4B006AA7E7C54834E2934F8400D030AA63E61FEE96C22FD49685A7C3DC2287EC2964CAC78B40340200C3AA6C8A67BDD30FB7605F0205CC0CA043A4574235B342FCE51195873F7FD99077CB31229B91D5923B67D391B457198125B7F198BC7CE58FD6B96BC35CC3D0281957B4110A011262B1C4CC0445722CB5E8C102408593CE6445C4584E373AC890187986A49414643CCB2861742466939C347CF021D1C19D36398A82C64D1FBA4C44B56CF384C04A1944449258700A66B1E2C9185A5E8B17772538B33B038B877353DC251952DBB899F04A6C677247D4CF4E4A5D2B22313A33A6D49237E7C04C61B2B0026531583C6CF6332C4C7853B7A8C6A4A5783D1B79FC5725F9C7157600747C0203E313CE91976CE44CC4E0D67DFA830448999357F076F2D41EE6FBA68C53C9AE5C025DF867E3060F3CF164218142D6C2B5B526BCE6789DBCBC5765846565575AB154C545FC3A81AB8FA1353B703B72B011A0405588FC0B8C20D13ACE9A93F6B28EA1C05CC686CB0AE722662A9ED902AE87D48B8A9667CBC0BD75742CEF313F1649C42C760796C979369736CFF05516A72BA36849D2E213AA497A6E7774EB9A896AF0A13387ADE8F594DEB482D9FB9E4C740360B5089CD101E5450C837C8214247243417C05ACB9D319809D33168E707BD1168709F7829B584053B554D95557DC032683D885AB406E205B6F495C23EB673E05651ED9DCB87C4967987B7B78EB349F4AABD35C7242079FB30607ED82A0503173A1B785CC36A2181892114003E2D33D17AA3B0A5CA47974B8F1C93B35107DA3900A87792433F154C643B34519941CC60710F07A71E4AE09A7539E72B9235A07D5DB53C048493B4AC8B9F0A3696892A0164DCE38B7F8E711506A9220A5C6C61AC2EF3942D3984907E59DC703ADBD93B6B509A156CC34B226188778BD191402DC94124CC7981151934F68733D131540056466437CE2B31C1320362AE5247C35CDA6E13E5D9BB89D0C8DCFB16BE8BC355A0C0C54E7ABAC12621ADB1EAF82B3D1E915315A3B7F3C98F6CC117BC3C850258059737171478E3AAA7FE5D7B5CD218CB428153C07AF80667C096C96656C85B8B0BD1F606A7CEA963717A18AE642E9E8A853D938C66651EE31034CAEC7DA6097A3C35BA420022324EC00CF53B53E9EBADC6FEB57C9B5BF5F53DA +M = D8EF97421196B1A91448B2BA7E2B4D4B035B91DD85AE4E57E8FE3F0B0D524AE7 +K = 44AB396F38942BB69C09B2602629B53B820FCA6D3D1043B24AFB3184AE9B5565 +C = d078eed36c4811e660e365153aee8e39 + +EK = AE742E0C4761E7731F98A96F57374EB4E321E1D33E3133C031355AFA974E82F50E7EB36084471D94490150188B34A113E300B2CB65BB44E6940124BFE3E21FBB4B01A7640817567949286922A22A8EF654D8465CA39722AE9A4D0054906F52C79428716971ABA0703C2A3C497DF73D0D0C8AF3BC36D12C80AC2701D8C4689E05645B2017B7EC830F8CC3C3419B1B14AA890B2A8B274C5316185B26473456A196D8C836352B437A4EB0E924E9D5776B528DE1BB433B7C703F302EDE284C9B22A6A502A7FD6B17AB5546B52C86DE883C80F74A9A7302E7270B73C521FCC51EB7E02BCC68CB257A1FD6EA63C195610AB8A8AEF2486E18AA081056B5F474FEBCBAA48560325C06DDBCB79EFA10589A62D9D54268062CC8E3693373066E57C876558FF3180C632269E77A96F305175F3A2F9833BDA9C43BAF62500C202D0DBA91B28CC6473703960785C8711604C9CC04A98BD19904189A6D62A159E6A83F25907EDCF457A080C70627C6F5B0612AE84D4317261BE728B786A111B74478044B7CF192DC6490475C9AE1E5C0FF97B812E0094A63AD818C5BE5304AE8981B52867912787114A14088261CF0747732548EE105927DB086088B89DA4773F3C4CCA0E44431D98A8EAB89C1D6C1D26109EA32CE99473E509B9D478614D26B06387B89D64C6785A50DB4C78FEB65786550647EA30C9029884DD34FC9227596B091E91766F8389A82B01623D7721F2069911128C309602F047F44825EF6A12BEDC72880AA3BB91504904276E3E9583228A7896570676B8DA28723EE17553A156AD5884AF0E1066E518D19951F98079F2244009369157E1915B4FC99254C4691D4A64A0AB0129BB235B00552C5B606220E45683341086F2DB3ACC16C8DB563259C6C8E6A360B9CBA54D048335E455FB406415D147122903325B341727C76ECD2C16D33188055534196C071F6B6806B9E057B5597158E036C3CA90174A83B965F8C3CA7562A3A24AE99298A10791D38FA3E5F30B5CE3A8438E6708A156FD51C055EFB5C65759D76B1BEBC231896095F213148AF839B4DEAA03C9628D0C943B0F14770A9A223FA3CF05C7EA983BB64501885A919678001E9219AEBFA71E5D3CB5BE585E7B939194C87C1EBA5BD56A953645D28C21F0E45686C9AC96F820A3AC26F69F705EC920392601E55FC1ED2B9BDC3C6BA00179F9DC687C2C01C29EC05D8BC5A3145C1F936CB8B20CB2015233E01184AE68BB0F96728C27521118466A5CE602CC4419881DEA62381D7870C14209B6A874FBB498472B3420A3A2A4203938863C7610DF73325B5C12EA5D2CEC78610F7237C4453536D7180EE7425C9DA6C43604DC6A074E2B203A0FC6B44679879AC2D94427746041809D84820379D14168BB0E816FD241598195CA1C447C2EA5D5B455A28E66527088E24163C6DE46D36DC1753CAB7451A6ACF09ABBAA1223E7A3B07E801F84071A7A3ADE760C7A2A12F4D12734530538D2179EA204ADD3A40222467649B4245942E80B50EFAF60B83E4591951101D025B05CC1EEFEA996BF1C015A6CDC9325EACBC349592B881CB3C3DA8C096127953F0B9697561DCDA6BA3D566FF3C14BF718ADFA47877A12E390A6CD0544D9524AFA37069C8ABA24F918FDD15986F9B1C6471A5C7A495588F79B71FCDBD7376406E5DC064 +M = 132E7CDAB9CD5199FF0937C266D50BC50BE764AD027DE45C858E3C2F79B7F07A +K = E5DCCE174C4B39536E548CC326893C4C4CF649699CEE746476A827CA567D12CF +C = 51c02cface02aa7fe93c24440b2f6167 + +EK = 11A62A8896CFDF943396BB8F58D9CE2C8A4DD07ABB736CA309614224E13CBC2A4EECE6A9E134B65625BF7332A0B978921F4B9B689736C7A90CD77120FB33124BC272EE9B656952980077BA0A2108AA34355C391118E2ADB2A1A6A61498DA2B3E7A6B3477890A6EB74CA66161979B1C44D10ECA94CC26C93B43E42FC68A93B85AAF0F9381DF309291E2160CA19615031576D1448AE4A36DB5A7EFA99542DA5F633C4A75470F9369AFF4D20FD2D96B62348745A46C81053A17FCA3FB927871E88E996C3555B696CDCB7639E13E1148397F4845364A7CCD245DB28577C678B061555A8F97C7DC4C861201C69106CA2F375E94B597BBB09067F4C730606D2AF3B6FDB98C14CA1A339B3D23174AB19C0849836C33720C9A04821F59B929D72421D7583E9919531327B296BD2325B5CB172FB7E620647091A99A053E20907588950E303237FA68F57B1A305233B6E931F22AB46769C4690420A94C3C234B564DEB3052C4ADB3B08A1F455E2B1B8132E6232E42CE33904146AB6FFB693158AC411DB0C49CA3990498BBBEC8BB06812A31E67761FC26AA861E328906D5B873CD2A8C92778260BC84B50703EAC6BB10432BC0115AF9FB60C8F02D90D6A2CFF80A69FC0E23A3068868A7A522CF96876FD1170BC8552E45EB65656740CF2AB106A553CC61112B659E6862346F64359FC6B58FAA70386B955DE918C5B641F9EAA2BE559A5BEBC40E113BB6B63058A80C1FE1664A81873BE506F8A795D9A8B4318342FEAA2A28C7ABAF1C624D5A8DCA352906D037B883AF54295328180EEB06C910A0B7945A14371C885EAC006E24B6A8F95936763B54C89BEB2379DE061AD5D0A65D8398310A5B8844A81F2C8C77E71F974BB0297ABB1C02442385621D607BD3138E063AC36D728ADE7AA6A90BBA32DC2FEC1498F3D68DA3290C17618E35DBC43262B009357CF6F79B04004316E82076961DE4B47F2E5229A9008D4CE902D9F26E5011A4B044AB0FDC668DBB6813479ECA3B0B18E028B1622A9F6B899420899FC7246CA86C00E7C4E1434365067544D02C44C840EF34CDEA6C3063BB64F18B05EE379A18F125514A6A94A95AAD315A55F0ACC567BBD0705B0AF70643F318A7C70EEE059F52C7A67353C89AB55BB091705F3059C93B7EFB305C7716A86F1363E977827C57713622236A365014B87E030BCCB3696F42E6365201CDDB5778951736BD92A4D78BBF3AC4939D3772C0D58F3F895DFD124AEF4B6C454140C002568AC4298062C1C755B99B5113F0AA2DC742077B3B6BAE714742C04789FA3BC12B83A9248092A0452451A7ACA25504EAB21073744EA7826260AB03C84D22066D2199A72FDBC6F818613FC16E45F00B1EDB2F07ACB5E653731F8B701BF0833A258F12B648CCE74A0DA79DD4CC08B2209042F478E897677871538B90BB0C954312574F90A0B189897AC05C5A2E345D91574C6051766DAC73B7B38A3414714C24B175C302CB095F79DCC430438069541D6E9835EAD22789900C2E56ADC602559D595906C8B5AE01A03572183283533C64064290BEEB0A73B9E2137A50C05C1BC635710C3A4525E9C87054CBBE986B49ECC2706C2AC3AC1A474CCA723208CCB6AA1BB7C5851B390DFA3B0E09B6AE60159D231D59DAD26BF5AD617218FD68D6157E4A276122133E14BA4208 +M = E15BD4603F0EB64E32B3F1D1FA8EF6CC25D673A1D0BB659CEFBA2C153724C1E1 +K = 66D5307AE26DCE8CFFFBBA9BC0B2C66E38B6E77537AE525B3E9A18BADBD72FE1 +C = 5c57f6a66dc62659015c7c01a3626e0d + +EK = E65223F4AB1C53267449A616AA32393E441F346887329AC4B9D006F61A25BCC3779C740EED0BBDEF0A371B95171C70C60F2387265469A8E7C612353FC51968AA43C04D1685EB27364E26065EDA53D2879D36552E51EA01BD818DD57319DFB127F2A578CD48BB6080C5AFE13ABA7808B5894893BB414A532C5223B91EB1CD2392333190054DFB4722F5B548E570FA19C7C485790AC4913892249E63BB324C620D835E5B8C922924791B08937F139CCBEB2D5C9A72F344888BA37B8CD7B06349A310BB71B06A3EACC1236AB03A5FF9B923FC5FADE54C5A1A2E803424CF9C42E5043305127F3EFC956D97946E6BB02EB913D6D21695A0A88708B6CC5611FEC61932774E462C18F4726FE992A301B74DE2F56E9F791E90992C3C109860474FBD6C5EB81CBFEC4A0C7F154E5C2375A2A379A83B4DA4C6796102B20C553F015AC5AC49785138B2460925BA3B156EA337D31214EB942EAA27062EC07328080927DCCA3CFAC51A243645D5055EE0C644428C4715032DB2757AF2AE25D727C78B08D7B59D8841B9D26139C3717FFED92E09FC5286BC1E1D290366E183FD2B5562859FC9C321B73132635A532DC3541096657225082CB37DDED92C8C480B5CA68F93AB53168B1FF2F08D8265AA8035753C96897DD06793A145EFDBBBC4518E0C87AA90A895E6955E5B62929999143CB16B09E26433A1C0D761051AC3776EB126A8C890940632B4C50DA7FC181439A11B483554E208D6FAA627B11DC6BB5073DA156D2A4A08832D2590873672066B9A35C65515B4CB5602753B26C9C865716A6BC3C059272F0DF54DB6395F59012ACF2A783BBB03CBBC3A95F65E04A0BA76149A8DC4A305901418324885D44780F65E17E4C6AAD08355A59C21558B0D206C73F59B5FE49F8C5B86A6747DD9E8CB9D560B22B51B5A6AA82277B676F04399570402818A97881EAE8A245E1B75FA1AC50BB0A952E319E523A292316DE3E5C4AA271265B79D37795AA3596CAAB1072F3775D06502880359D73C5EE0C782ECD04ABCB1255B8A5051CA51EC6C17EC955BB6E715659B4CCC4C74484313C4F5149A288178C49F99586AF54710BA549C09CAC0CDC76D15183C8748146A07C72049108E86C0447B371B844C3715A914E3853F4184337381320A02F94BA1D9EBBDB0033D377254E4EA51AF455A775CB8E85336A761864239426A449FFCB967B82461F6F5A21D7A36DB8B54A5AA3AEB2297C30463064C8AFA12908D4B2D1E5B0F1A23B1D55A5E96886B96C39E10C6A68008B0527703EA2799F42B5098C4178F47490983793DF4CE2B0A2D2B56719256206493C395C54292E516D4F8A5C906736C89810BE0846B8BA654C86A355B56736B9144853286D65E61413F7DD26D1D2ACF6728BF6B028F912602CD132E3D6603DCBAB4CF65B0E961A8B597A0810B9F78A14F0DFAA108811CF22C394F21BFC56155A67B85722C755351576B0AB614B7C9C2278DBAE211E33839B55383C5744E6270C92D65BA82590AC613BF1493768E7ACE60A14644C9A02FB30BB1A6B42A6B69A142BF670C48EE03077BA7A2964020D528C51CB17B0245AF11C4A8EB0785ACC738E4F0CF0FFB838748314CA51C81331DE2596345B44F44BC516EF123CD8997E1FBC93AD95C0A9CB71D46C5535A99B75122E5E710DA961BD873E66DDD +M = D176C0836015362D1DEFFC1901127B5C41C14AA518BFEE6C62F2EAEA1F226AB5 +K = BE4A7B739BBBFEA62A02A555571465EDCFDECEEC83846760A0D39944F99266E0 +C = f939e27297f52f54e637b6de512f2c36 + +EK = 6453B4019A8E77C7607ACC6DF337097A9A10EA4836DBFC7C796A4E73A236069C2005C2BA2D5843AE7A008A337876182C44B92E66EB5146826B246CC7C3F44D40B0C88A98C11B873A29D7A4C7336512E00413EB519AA39025AC463C7CC289270A680B88A7FB9CFF592FD65626E831A019EA9E4C9BB57BD34B8D28B8855616FCF15FD6138947CA36D863510E6B3D4B22B8F812249913143F7CADBF15AF991C7E36C1A610879D9240398A1A1224837F904C65F0C1527BCCCE8459B594739F4BC243D2360CAC320AFEB5B2F5A310C90B42D3EC369F64C0FD2118D0359DBC3141F602CA8D7507EF830F1E47682068ABF22593563A071653ACAFF19506B5630F2B6401B78953B152C7A78D33216695B7778F9467FA239E4ED089A1E6BCDB682C4EC1B7CF407B37B0882777B12436063AC0C47CB7A58BB7CF34C5CDEC291BF1EB851DDCBE42535E0639580B191CDBA9AB22F0243D1334048964968941E7140C44A1658FE20C8AA023D2CB133D5B06FFD99FFD4751EBEA170F9C30BAD8CA39C64C7FF357F0FA2585BB13645682DAE24518517545175E38D5276FC442FB2143FFD2A7B61903CD72583FC64DDFA654081A4533457D36A366BA538B6772C5FF11674F0A702340C542357B80B2C206BBAF2CF6406F339436A7A1050792AA674C2E9C9B7986404C94CEEFC343E0781155D8B737978BFAE3C8CA64723D0656E9B89D23568AC6658F0732C332096A217CC6FA3A09FEB16552F5C982CA6B540C3AC96C8D0AD576820CC46DD60EC82BA0CFC14073424902578AFEBB44C321A4A6B7AF9709B1D9F05EC9BB6B928C936B670543E1B05E649FA7C2B3B9FB441C976FDCEB889FF63019F26EB2326F36F82231A68F230C9BF384710E11CCA858970A33445FF05CC4399DC28B285857168DD388F0B95B7E3B1699830950022FBA81984AA1B1540959EC1469DC696D7BB9A3C42153540B24A350CFCCBC33E5D9136824500319ADEE626BEE22A53FF8CCE2FB195D38257DDB8C305949D720342EB58AF72236F2275F98D335DE35A0C0C66BA752BEAAC32D113AA43DA092C4888D1750A59BEC4EB14A94A84C9947660891457B52F1BC3EF33C951A1DE64ACAEEC99F7795B8C94A0320F40D0ED92EB7FA346E042453995F2394B714A372E6B678C0BB4E04670B347C156794672FCA87966B26F0EBBD2B8304C9B6560459019ED95539C7C0C20999971521F8F7537B13937AEAB1E23736186C672AF0B084D4C5C3E1887BDC0BB281B7DB924BFDD9034C6456C427B9643C89FEBA3440947DD6B0B4BDD54C38215371E1A74E543A6073CB46118DE3B2BD1154AC536652BD2666F5F710C03CB6ACE948FB61692FA3A3E2EC4E3AD971884412640342BBB4C09D1C11856825D79A8E5249243062033E379DD1EA6526676A2492520BC55A4533CEC47C54CDAC7483500C0751BA84F0CBB020CFAD07B6F4E893CAE78DA0C7082F7A9C78D2BAA064C33D20644431BEDCB9B493D05C13104B88870361433490927B015261B63B1ABF2B59777359F74BC2597238DE6729669383E8188C0DFA7235D935657B936101BA4DA9CB90F1AED0F06C03700574B99159FC3E59EB3258A9BD5F47439B45A30163309A6A29CDBBC017840C5655E3E8FAFDBCA14293B91C07EEAB7E6C066A6B8BA7EC5FAEC0350B9C887B18 +M = 4E302EB2BB5392782E7820868DEDB61F5A6AE558CA307A01ECDE4970E43EB448 +K = CC54EFA4BA6B3C0B651258EFA6C6850B1B31FB159C282D6F354DC18C8749ACD7 +C = 146043a3c76ed93a6dcb8008279186c1 + +EK = 409471E1024944D5203F82C62D1CA67E96567F3A525F6AA22683C4D537BA87DCA66864C88F292630484CE6C2592BE194A59B9642B0C0C1C4771DF87710F11FC8898573BB874965B774C3BCF30920312BC3C1945876AC6CC1221C9019677087951EF43031373BE34492CC5638D530A4D01C86F9B70296162950D92B5D97724BC1B7E9056C78D16290F3BEA459AC21395FD8A60EA8551B5D935510557CC36CC5C42605A4459CD7CC603408C3AB2380F7F00F44EB0DE7457E6F40B8DA2042F34C18554606E8A274FC8B6842F299C1E80068F11870907D8D44269BB7789AF0C8465B72CE64B5431A885A00B0C200102C811E8ADB7893502277FB87213AA89051852E896B3A170A33CA8F44A7367756944760B1D3C37318AB76EACBB47BA15DBD83CF8151BD2E3672934702C3A21886B27BC3506DFA8CCDB77C818734A18230868092186431221E3020157374ADD138C8F3C69D7709BF60C5A06BA3E410AF156B2175020EBD7603AE10C76DB7C2CE066A98A0AD4131781CC30311B38A78CB809BA48136009C36144B47AA2052E59F16E0216561BB42062817C67D81C96223C37DA9332B261152ED90350BB2BBEDBC438641CC082C8E4A4181628253734CB262061E40143BA11BB5AB75A89270636B330E922C5298068C85C1352FA5A133C3900A762F57B831A907AC37A6C9CBA9C915290E10A447A8B454A0F735DDB8852D79B0FCEB207C25568F44CE9568305A9362ED584D77123A3716A667CA2952CACFD7382303A69A817B17D895441D0A9AE1F71ECE1277C0432A7FA2A63C81A545910B4B212F1D983DC634313BC4B3B1B39190438D47B16747FAB48DE4777911B8D3FB65FAC68CA096919267783B0497868A9F95E89A1A3B2861A3BC89CB77F6976463CC7B1CA6CB8D447AA65463174A384217CFD41B4B80B7AA4072B10BCCBFA73C53E45684C542B031288C1192AFB1077B4E2B560E248169C6B741904304B06D23C86C9434AD64C67D92FB872D28BF9F745F2CF210D6D0C9C72176A3242447E06925718FE6530E2B5018833831819C23D3402BF9DC22FA7B1B754C6CD5A5C610275352D8B0A04159713C26422C688ED70B14209DA8EC23E8A2B285D61B8C5993739707386B4A084B22F70BA9EE3073644521E9B60D77755C30B36180B6B6A64A94ACEA2AFAA784C53C0C78E79203F36E98016CD1D109E17952A49021572B5F43857FA401BA617146E09450C8F392E423AF9FA294B7E2C2D772784B157FF591A4A13919C573713312291BC02F0F0C93721796477608E8E69FC64262D404C95DB98E548A767A184047A92C8FD8AED972945E676D946AA0DF5A88C7A13D03E501D228482FF97D62E27529372CCA9681F0758C2B500BB5D691D1734859B93E8E177605729337B39860E256D61C75BD462A6607692BF74A4CCC346240058B766502E740AF864531301226EBC3B8B5B1378846190AAD61C9BEF1362537606DEAA531EF97582DD1551E7A5F960B8DEA7A1815272145B25C7D175CDB568A68F05058F255B5B586866278F3AA56568179DF4B848FE535132B7C52D3AA3829686EA7CB6FA1BF07099F055416B8041AA9E2522CD23FE29981B06B6556432ABEF02E0780BEAE777D26FC062D94F1BC4C683AD2B92303D532101461FC0B8115556C3D2F2B855D1009704611 +M = 7B334E045896C00F90D811489D491E8D72C4E3A22ED831C019FD4BD967B7A802 +K = C26DA6A23332B20914F703E7CB237D84F807CC7248DDC47599DDB0D40FDC1FAF +C = dcf6a0a3e6dc7516ac27c7cfa97cbdd5 + +EK = D0F1B584A87CBA7409D8B98B49B1332ACA1545B29FA2D42BC537CF959C6182305C95E06F5040B447D00737B0BBBFD9AB0A6062FAE209B24959EB83C2F0C5A2D8AB36161B90E2A92C5939059F8B9586F071FB1B26121604D5252D136705D33911703B91DDD85ECF80A7A1741C29FCB06F321E8BDB8166EA8C899B8064B69D77927C0B503989101F1A6941F4DAB06BAC9973378C2E6B3B19D9506B2C9A6BC29A51582C8B47B46306C1B35A438A097B07405645FC66C2660F4C14457A41B91907CB2864338C09C0CBAA7A877A9543F775950487DCB8CD8A105822B93882271A17B6936912A55FB4109B45B09BB14EAC2134E0D7471DE891CA984FD7B194B1529EBDA3CE0C24C1A9A170D76145215C8CA7217A138C9FB7DA8385E8A0C56B5342DA66F9FAB03AACA4E3A1BC5495C7AB0AB0E451A22D480B00FB29CE641C46E7A5EF16867101A26911B0A49140F70B8684845850DB8E15CB7BF842CE712480B19343077674D8A7B7C47A5E1170A629E53ADDD10F4BB35A601A843B49391D7337D7B3B592182F3A1636E4A7CEA14676A0DC508423B94B115041EA5F925BA0F2FA8536AB11E6D451321450CDFA076EAA3577D605A7E0B354754B92F1B411487FD8122E8DAC14D8464EC4331DC746B5693451B52878923649144182C1F03DC4281A7991C60F4A4076117B50C21670809832F3A67DC82E448A49AA3A2002B1A8667CC947253015A6A88FFC133554746256A103D11C7BC98013264D5EFC15A0B2825B37C356A96F0A5B701B4CBABF57640F2A92796C5663570B30FAC65BB79ACB59CE5C4CC7757920496B85CF938992EB32048360559745368854EC7A85A8E862A973AD50D67938265D3541161BE9C4097323F5E77EB8F66887A89FB7DA1A2585A4DD52782AD221B515A1D37778B5911AC7C90FA7722FD5A9484486A6210157188ACB617413516955F5EB91D2691E1E38CC2D10638330029D033005A88606E6A941962F3FAC506FDA5211609138E503E3382BD71640364066A2C27780898AFC1CCA9509C23F022AA77546017B1943360FAE24A54A0B965BAA7966F45AA7F3BAA7C6271CD28D4E0263BCCBBFE4FBCDFFE05269B048E948BF2EEA1E3C1825FBB3AA8F182B2B7BA52877B2304434DCD561BF365BCDC6AE0960211BA14EE1F9C8CBEA3750472A02271BA7E79C4FE6C9019B25470962315C4F50332414F46233A354928980A7752D7A07215EC24133446521DA5E4C50B615AC4E78F07B6EEA141AE146FF5BC2C63167483CCAD311B847996339AA50B2C237B4486E3B538C75B14969676465F106B9069A6F627938690139F011F5FA7D1832B96A0309FC85920E142C9C57CF64852E4564334281BA63068C5666A71B194319E99FB024AD33F879D08C16743B34038AAD20D2C84CB7440EE04C1AF4B944227FE94B5D666C3E51523248D913B9A3693DD1147AD7064696CE5B613DFAE1B83A207742264E878C7804D603BDD71E56C5CA7F887158E805161C959F072CBFF82DAE020C80135A8D1890F1A9A839032B0D69B9A7A97785DA5C201685C683844DDC99F4A97E00A063E15122AF22C27430328EA1435ACB07ACDA0A3B6B784EB19E30E08353CA26118AC4D5C4A218A262C4BA135AAC24F1EE7C5EA0E13C86749E5E72541CA6CAA1E1C05174B08745437FEED0B9 +M = 947AFE33934E8150B06BDD1EAE40CF82EA99C0C0106B101283EA382EDAD94A8E +K = 104177A27A18B5F35D2CBE9BFABAA2EA987B4296946DEE575B45A3A9B44CA99D +C = 22b228c116ea069d93a6ba92fd03fb1e + +EK = 28C938C98060954AA557102D5BF39C17444A811156ADB2554562C5ADE5666704171AA3B19964449E1C12E721A30299307EC7ABC2CBBC82010E3ADC6DFEB2C497DABBDAC973021C6535773C127B3793792EBC717D392BBFD4906D4F21C62FD6C565935DA98550A2A310488956799AB9743B94446658FC97A9E1C3B263C23022132D33D2789295C994B6A441000F7FBA45C83A920739A17312AA97B1625FE5118ACB1552B647FA91C93C11182D9B9AFBFCB1A0D1412A7BCF92FC2E1A197EE4E728BB1812B88A87729C6E117A45E4E0ACAB2BC4E4A214DBF3BB4528316718C477329DFB1229AF9BCF0A00317FF526B8E4828CA797B354A0BD304FFFFC3E16C86A49355A54A0005CB1CE532CBA6A19267451ABC9C645A3F49FB075922BA931B1F139F8C627113B5358E02E81E71C231A41C1D647840B5AA96937B22926D6477E5B3A5D1C00485BD91FE5679CEEF18670223E670879EB3B02D03958A7751C007564EDC37DC0524790C8A0035AB30AC310F8419897597721D6B4EA87300453CFE981440FF0C18A323A0159B47A9C262545359F5031EF8B24A0080BDF0B55E1606355B88FC57803A3E25AB5ABA59582054E184FD97CC3E4635BC77AB797A748677B52BA76A16A9564BA218655A0070F20BD52B0A8C512A947534BBDC99D38621C655970B209C6DC8A0033105060133B600367E62366030810062387BDD120CEA00424C4C307E64EED5A3685F7B78E51138E02C4FAF51AE359499E2A97BF3799E216377EC3581AC81C12CC8B41AB95EA98C6D0500BBC3960AC05A2292789844602CA7528B2B91EAAB7A5F21399E13927C58BB030F492102B4361DBB4B3023961117099A7648EB11B2BF25703972CF778B5D8AC087BA59BC5122DBA63AD03EABC02031EF60CC765A0478F2C15DF31165903CE56680C2A62CF7FA8459D26C2D3C346617C51042351B321BEDBDC751D9080E0F64D2673C17055BF5DA53D74A0088357C1BDB8589AF5505C40CEEFD7140B95780BDC9B31482C75F5C6F395264A54C2A54B3EB6454C879510BCFB42DCD9548C3A53996030CE76A8A2435316CC227B591FEA7A0C12405D27936A0326A66A6CAF0B271BB64337D9DCB2E2471DDC632F3E0300F92C04B288191F0856C59376FD755729F195C264824657725E221BD017350982BB982078CA7A6783C64C5EF462F329BF6BDAC685D1BE483AA78B7BA7F2A0BD0C0C3A24341C9AF09C72D82674B0849BB70BD4861E5FEC25375223F5E4A4E20095F330C43A3AB23B633A0DA04553F69043A0B6AF862A94835AD284C31F82C23E80C2A488872E4B314636094C70A5F7614B1174AE46C11F45661256D566C6801985A2A91990889999631FB5BD4072C884B85BA79521BB2C7A729CA3CA8C18F5EB340EB84B00CB991D17933B3212293828BE1734F21B775BE289F77CA45846B3B6F029D6C610A0738F61B5C80BC808A8A506BD1022940AC755A7A4765A1C4A36B42DA453AA4B516F78B2C48CB94500401FDC654C1BA5C0D58FCE894E455667B25269A429671B668114181F06060842D16980F7A772480F3EE46D58C01682AA538DF1813CF95B67D9156D945E2FD84A7003CBCF265CDC12AA7148B7AA55C66F44A82E4BCF7D8C7B1ECF22E1BD7033C0588FEB6A1D553CF8BC477D94FF875323943762AB1B +M = DC8510F45528D6981E59C1AA6B743BB844377D7339E359036929F0EEC54FE63C +K = A2718B4EB96D591690F62FDFCC264BC457C3A1B755F4CF64B359BC945C254CE9 +C = 28d20a5d55aae33eac6f2aaec599a274 + +EK = 4A6C1F1A816FB66471E6C18CE6126CD02BA76C730E721572DC730566496B3AC28F92A15F4C534C48578C18B443F24681BA2B3C3B390669A288EF7676C9A6B0970340F567C90407617B28A9A03274D8288006288B0A5B686FFCBACB273536941CD06927BCE109BF2330CF65A3CD0A2706EB33150A88504484FE182BC3C78CC5A7711845C3A277C763DCBDF16B19F1001727D5677687ABCF4B32CD161350EBA4206B2E1A65848528B7E1A90E04165BEE054F43793C23B0660FE7AF3E5964DC7C275458040AFC05EEC71A57E67C2BB794CE2680E7C4170FDB67F0F36DBA809F724B805BE66EEC38181FF1B0E9F94F7903661ABB17FD9BC0B0B19BCE2560E2C2C764F4863BCC40B5FC10B6513483A827C1668CCA8AA0B68039C8ACBE81B639E55AAACF2C761D78A77C2651573471434A14949943D945BC0ED2187DB442E41B901DBA0B14580710870B81B78D21996AFDDC6ACD1473673414E5C7C35EE60EDE3579223A7A2A436667CC51DD366DEAF615CAA4CAA073B60718B1E5B62ABF50BEBF4844EADC2ADA98CEAA8CAEBF187C2F26882673307A13CF83904607A8865A65592866499505051F10A4DE52893E07BABEEBAA4272B14EA974B5114101385AF1A011A488BA25179A118B312D8AC86FB58592D328941A3A0DEA6102C86F1E237DDB321615297A2BB660D5E0705A6672FD08A5CF212AC9B5B7A1306C87952B1C11B7D4E7C5B5FCB7030725C2A14AED641D78453E9FE5C6E6280D2CA57832FBB091C4418303CB4AA32DCC3C211DFC8A9BB429E750B2251149727ACBB112607EAB9B7744173D795B06D10EF8B1AC1AE54DA30A05188B0164B6B6E9223E93D377259163D62530CE9A0584F82E59534AC3E061B1B48BAAAA9DE1F8BEC150A63EB579DC528EDF977E7E421743F6A4C5DB61DD31334D3C63ED7755529064D67A4BA3780BC7C87731B86509738C1F7215275ACFC6E3B651FA91539B2B10111452570639E966766B64477C3F1E255390840FB9635500F2B513281E9D8B5BCCEB360F05913591899C1CBF95D23CB8D714A007990BB344C3A62446A80945D0CA84D3727CC8C39E0553A13B7050C12A1FB8BE6567930E0B6ABF6C484FD340CE916596B36BDC4085595CB2CF088467B0BA7F915A4E9581E7269C9A234F1A004A8BD0A2D7654018E55D6861B4067A29F6425FF1F5A00A804E3B3461DAAB9265D15BD530AC10686FE11038E772BC1CC46DB5C401FA76C1EE70165FB7C67C5025C2515E4182B46B92194FF361E252CCC43B060F50A64C79750BD162A586C5A63071D6E93DABA8BD525548F444C621A77E3EC583218788E3A7113DE38EB2ECCEBB0CAD737BAD9C21B39DB255458B8D6EE70C250CACC74A3A19C342B052A0FA5B92399013EEEC1BEEBC8E02F80C137030BA0A5DC8C3028B550925367BC732CE0E09570AB1AF01B7CACBB78A89BCC8C674449B932B98487AF0257928E64AD06967B38B30A0620FF9D49D2D63C2E7847E5B26046B457A7BB37CF012A7F18AAE0CAA41AEF72937B35AFDAB0174688B0724B25D67563536950081931A3ABE89B59297F701F246A6462B6016EA4EFD42A15C984E7157B5B4A335064809BD7739BAA23519098233C7454E241B23C4644A2AA1EB16E456E23567C4C3C6662ABFE76F52FE97F07F1298BDB70F62A5650A +M = 62A2DA94F109C0DEF56DFB275B1A0EEABF82AF8C6CDFFA94085AA93015BC1821 +K = E87B61A6496FDA38F948EDC5F9CA5735579D47F6355B214727EF5BEB3C13CA32 +C = eb7f2ed7c9ebcc9977bc497c6ae701aa + +EK = 36C053F748B3A0655C3BA86303E099538971AB05BB4B2167D84B4F8BE79CCE515F28A90A5AD5CBC97B84CE10A39BB59AD2FB4AED7CAD205200A3C688AA32AE73F552A33B7DF1BA197F16CFA853C7FF24C1DD586ADE74CB0982449AB9815A63672C32420C1812326554C7219CA7698324115615C41D2E74A0138A42356232D7218549684CD9800F1A8413F3D952E78C915AD56FB0D1CC76D48F2ABCC0E6D79C67198D53B3B6FA57A4E9140D3C4286C97C7CBE48C3FCC81C6CD1540B12A077BC54F6F46711C844B46559194B5597A815827307E0E58AD7C4CFDDE826FC3594002A88C83760B56331A61C542C7B4487A851D7FC4D6A4072B7FA7C77647F8F252337252B1C9709517A7E217B26F26984D8D0AF75C9C1012977A3996D855A86C47266224C2167E585C9687C0FC5259E5BA10FA23DC4A2C163E74EFDA01956965A5DCA57BCCA2EBD4606B810882A337CB33347820C937E821E75A5BFBCC75BD1E37D81342F8248366945C0AA2B98F6E228A3AC6EF9CC28208470A3FA56C2F51AF83418E3D13212BC2C64304B4EC55001BC3620635C989CC4E4ECA06A453C8E5689BE8CA010C4026FE201EFAA271C2A772563CE7147932DFB7256F28975E2829D454BB2CC64AF8684B9ECAE285A93EC2212AF4CB65E484461D2B2121B15B37AC9446A8308437B887271564BC8143A8AF1F912BAC58E06AA8E03764FDD823180E30D47056A6D217ABA6533AF4399BCC798AB59AB0880913E14895526AD2F06A6D6536A0DE701D7DB9B2EAC7466FB85AC0020D961B39B88A8DFFC3FAC57524170B70490876F3A6FB16020EFBBA26E17C012AC4280C46E7F643CC334BCC302BF3BAC10A3891FF0F2BB81D29D8E421A71272C0F2439AAF29916461DC24B4899325FF005C0E30085AAAC7BF21B58B114BB0025305C8A1DADE9A1811329792713C5236B44B52AB8791856C535DC8B0E4DD0753689BFE0636DB99697B074BD2D3A8C4AE69929F00B8B256617FCAA96C980E8A629BDA58CF6A76DA49A004055CD4BE21E2C02B5533A7FBBC4525A95167175480A7B09BAC2BAA47A03D4872620C191287932029C9B53737A69148B7F483C607148DB23594DDB2F149ACA20F13AE693C2265A71E911A4D22ACB1ECCCC4C96B1A2C0CD45A5AC25533AF6829919D93770E42BEAD230BF8739B48C9990ECAD9E679C501137C49019C2F857C9D08FD533B01D50AC6BF2398655A1CBABC670299ABF46B95913A845151DE2796666BA6824237AF61789857CCAF0AB0F4B430FE966C85818B11E469CA2D7B705833813B8A775C77138F91700C64BCC6360231B1540F77113A33DA08189E454465474947EAA7F6731613BF9AD6BCC6D7DD1B62E1A3AA67C647A62712BC9CF67FBB690205E6E6997FDA7719EB9994D199505342D42FB3C6AB1936825534980768102619D79B9F197CB05C16A9922B4AD752C4926539AE184756114601A6ED90443D2869D0FDBAC6F447D91F37FD4E6649A90B70C73182B6162375610E9166AC76656A9B9242DA02CEAEB970A1803BD570F48B7B7557928CC4AC5D494BCC9386078183675D760322A91A1FAB770198A437C052EF366F6C905062010AC09AAD9594F581036A7E11B0D6C3B40BBBBC340CBF6D130BFB4E7CE4696BDB01ABE0436AC41B279FD576FE86BE94D213F70 +M = F374D3C7172C308D7AC5AB1F1CE5BB9785B98AFCBF4E9120B42EA83BD3BB1867 +K = 2418BB42B89BA875664583EDF241327F3798379BD14B64351044F6C96B3D2C27 +C = 50609ae9cb1de0db3ab28bf0194a620e + +EK = 75F91DC864B819E71CE8CA50A7BB41AE94818BAB31B7F888ACE44071D2795361CA2B2666704721B02558212AB41A300B6D80B332A50448E36786D101A68A94D42325F718CCC4EB3521424C35E02A0A1A7A3514696C547E1918982B1066A3CB633E2B1D23280CDB333AA7B3C4BE7C18AEC44678D649C8774A4C552E45948801681F883165EB2C5E9D43CF38628E8C934C5F30819D4287AE4A51A797BDB0769534169E293C3A76A76361D79DEDA8068FAC187EF6B647C148E919141F02564B0AC4996B27794915A2D1C669DA50DD9B6E9BB57612CBC83765AA962068B8477D703848DEA456592A89B3CC321C3B86C55AB980BACD2F2605395BCF9E965B95D59DD608A8B8B85F66C8822F5B2DEDD36D3F97BC1503686F74991093A5799A146B434C7C2A6C573B3AD8C44FC517C92D042D623A7414D56DC45454CD08919FDB8D79A7316A4C14AA9961DA76C9DDC4CC6CDB37B474835E9A86563212F2B3908875588E2484BE8C4A49E3BC5EC609FB4BCD52D62AFB1B713B556CDDCC8BBD3B322E1766C627A0410A3D5E0B6F3E499272FCAFEAC90CDD100AB5D686F22023F8413F64521D19E38EBAB1CA6E31CC10278184F50843DA5CB1BB5164DBAB23374065B1043B1A7B1A241DDBD4BC6EA9057CC1A995644AE73231348414414C7EBC58BCB9B538A091434DC9010904BAB0613FA640C0A903BBE57A100B08A44A70507436C366268E7531C84A977B9EA2263E770E98306537B505A01284F653C066BA2F9FBC6CB3740258892076C01FA5CBBC8BE97FF0830BC746BA27555305D17A931371D04873CE2B89F5694BEF68515E7552EE03BB8E0517622768E6022DFD1044CA86A715930530E504D8031574087572974915885CD0351AF3610A5154559F688492579BB723A22F791B089C2CE3A383C09CBEFDC151DC266DCD54C196F25F0EE34092109C6AA6CAA76373E9125E143B2D0EA0874E4A35F06961DD812E60700F598926FAA7C1F7CA579CE9AEF3557F74E2039059258A001FC7F3B4A4ECAC6303672F12B9CC366E448124A27CA6FC43C6157A378535817B8B0C981809ECD54D92F135D0126480804EFFE40134E6C2190B95BC7C5E6A72B6487A6A454239DFE10AA99614AFA6A8F0E12FA86007CE464AED4063025B213D8597D412C9617AB62D9592D4320D7F97A6AC4092DCB311C21636358172C43B5626642336A96C1466BC30426DFAD5C0DEA50F715B19827B1935C79CFA1C9CA1F799F3954EB1C0720D134CF9A3122263B995E9268C3A1BE18A7112ECA0C4914F2659734A31A5D5708F3A145E6801C18761A280465C2D4600B9D968B3CA61EF9C7687FB1597499597ABADA930AEA4666DF40029F645A601984646144DB4CB68B3466CD7DA154C027536886A390234CA792FF6AA5C7CA258831AC1B0FAAFC21890BFE522A7685837A550CB343B79B2955C4ABF4939792133AB0D4A77C909BE0F0233AA80AC6B6AAB0F8102F374982C6BA88563ACF7254760263D7EC8C302F656BC227B3B558BBB444365A2CD95B421DA5914417C50E84311C6A2218A49169866518C201622F10970D75D38815787355A0C6126EBF189AB30321C15898AB117F6183C47174DAAB7BB8F96C3F4F239B642516A48F015E838A3DBAA500DE409C13F28FCCE5F266A98ABCB2D92E1BE99E438BF +M = DD252F728FC9553CFEE90924565E984C8E1462CDE58AD8C4ED8DFCE98A7F39B9 +K = 2F323DFA37A737802227ED21012FA0BA624F532F8A3DD979AEFCC554C1C2BE92 +C = efebef702188f13290025aeaa1a9b4dd + +EK = 19E628A96B033E4358CFA8C3C4A642D7127C16A50BEEE5C57A25476D8BB86D019DAD84C613D96A389802EED2031B1A07D478612DB405BBE9BB42A4BF9E7AA91CF2950D00013C4CB7A9B0CF88A87B19E41995EA9EB09660746B1A81A2C74F0BBC28287851CCAE8CB8118ABAA627F44289A9C355DB863095B397D1C449C20AA60B5F1EF94F9002B212C733D81C5A92631CD3B661B11056C9026E84A34E19836411A76AA53089071194E2C9696B31BE8351CB735521A42CB83C52C421724F2FB76D245BB5571358314A2967604084F64AD30911600B33AC9B236DB66487058F35611D0894051F31C032972A03A1CA5822317F953F91A74885E21766824F0FB601C593BC64253E7C36639462721C232D32A076EE245B9A7BC96C0A70ACEA36F8F41E1242AB2D00593BDA4C550018B1345D0806A3D1E8C7A8CC29790127370754A24A73E3A4B08DEC3A88C04C2022235E55CDCAF80938B579B63123E306603C781FF3ACA1105076AA2BBA1D966BC28BB3F3A7340D210D7E7A1735B01E749C0AE990775E2306AEB80229B918542608B7E281B6BB696E1C82342BA196D15EBEF20D541CC57CA928A9DB41E972CC1CD333BC7A64952247FCBC578860191FA67971A29E40C06B81CB5A765C7B26522C19A63C40EC31EBECCF7DF44CDB8B4E7BC805D42A28ACAC3EB2684ABDF46DB7E4C5B01A770B4C0D79D7190B97461BB75CD4A78574677CE26BC30CC25215B1C20C290A1575790C86AEBDEC7993CC94CAE23D5FA2871A184E721886BC920CAC11607FE96878971F161B788E5653698A9F8981339E581969C1B61A6073C02CC3822A2A2D0A6F5BABCA0D57175B86942CFAC2B0FC9F1684324A4139CB1342D7A6B26643A923FA14988173E58A82B67532C6AB89C0D5AA1CB47E44703FD7AA6816501023229B1E76833D7948F0743BE373BCD361130899010727CDACD4347B3A6645541BC7173361860953E61F5824BA2ECB94101383DA6A95CB4591C1BAAAB1B221F43B91D7985A173A0FDA756FE9B38ED1EA4F2A428E34F352A37A45EA83998B66C4E60B40650A87FF5185DCB0055B9C011378442462C285D18A0DBA658DC5B17D1620CE566C86879F38754CC8C1BA014827B444CCF8E9029A7763318CBFE0220DBED60F6720C6F96B4E70C712B58091BE3A6C1C4639D1ABAB09674D2E653DEC768D728BA593AA3C61B17DE17A07B3E85558F38DBF848D65AB3A1AC183A62AAD4CB18344E71BE4C97FEB59001F4ACA46342AAC389B22C47C2A216D9AB50B1A02405DA01494C44184363C31F5C39AC90507D94093F882E6891E24571BF39932DC5482554C12AF6A5F0B3AB4CBD276D6D850894CB4F414196D511731D23C8E039282F6C11D089BEBFB91F0A766935B3ED66458842B4C757585FA6657947529294930C886A50689CA5DF1AA39B8346A14150F051E5462A99E56CA383BA5ABD455F00AA9BBBA660FCCA2C5A8A74299581C274B89E4756552570A33514CB46CD7A3AED34A2DA42C49DE1A8645D64AF3D644BE586068A1B5804965BB7A6134CC8DACD82FF2E954625C92B0D9763E22CCF7450A8FA70F5793400D2832A03A5A75D404D1E2822DA607F6F9C4FB510858978372C621AA72399A34B9E2618F97EAB82B56D93E51FD73A90A78E2AC85826B8E6335330DEB8C644A29A1 +M = 297ECD18E2880A596F572B66458410A0D827851EFA55F1C9CC513F7991F0DA0A +K = C44EE4E3EB80C46D6BF5CC3E08CB93019C8C80DB0CBE89708E8A6902DE87B699 +C = 8af7364129a3fc2119053a6c2db13ef0 + +[ML-KEM-1024] +EK = 307A4CEA4148219B958EA0B7886659235A4D1980B192610847D86EF32739F94C3B446C4D81D89B8B422A9D079C88B11ACAF321B014294E18B296E52F3F744CF9634A4FB01DB0D99EF20A633A552E76A0585C6109F018768B763AF3678B4780089C1342B96907A29A1C11521C744C2797D0BF2B9CCDCA614672B45076773F458A31EF869BE1EB2EFEB50D0E37495DC5CA55E07528934F6293C4168027D0E53D07FACC6630CB08197E53FB193A171135DC8AD9979402A71B6926BCDCDC47B93401910A5FCC1A813B682B09BA7A72D2486D6C799516465C14729B26949B0B7CBC7C640F267FED80B162C51FD8E09227C101D505A8FAE8A2D7054E28A78BA8750DECF9057C83979F7ABB084945648006C5B28804F34E73B238111A65A1F500B1CC606A848F2859070BEBA7573179F36149CF5801BF89A1C38CC278415528D03BDB943F96280C8CC52042D9B91FAA9D6EA7BCBB7AB1897A3266966F78393426C76D8A49578B98B159EBB46EE0A883A270D8057CD0231C86906A91DBBADE6B2469581E2BCA2FEA8389F7C74BCD70961EA5B934FBCF9A6590BF86B8DB548854D9A3FB30110433BD7A1B659CA8568085639237B3BDC37B7FA716D482A25B54106B3A8F54D3AA99B5123DA96066904592F3A54EE23A7981AB608A2F4413CC658946C6D7780EA765644B3CC06C70034AB4EB351912E7715B56755D09021571BF340AB92598A24E811893195B96A1629F8041F58658431561FC0AB15292B913EC473F04479BC145CD4C563A286235646CD305A9BE1014E2C7B130C33EB77CC4A0D9786BD6BC2A954BF3005778F8917CE13789BBB962807858B67731572B6D3C9B4B5206FAC9A7C8961698D88324A915186899B29923F08442A3D386BD416BCC9A100164C930EC35EAFB6AB35851B6C8CE6377366A175F3D75298C518D44898933F53DEE617145093379C4659F68583B2B28122666BEC57838991FF16C368DD22C36E780C91A3582E25E19794C6BF2AB42458A8DD7705DE2C2AA20C054E84B3EF35032798626C248263253A71A11943571340A978CD0A602E47DEE540A8814BA06F31414797CDF6049582361BBABA387A83D89913FE4C0C112B95621A4BDA8123A14D1A842FB57B83A4FBAF33A8E552238A596AAE7A150D75DA648BC44644977BA1F87A4C68A8C4BD245B7D00721F7D64E822B085B901312EC37A8169802160CCE1160F010BE8CBCACE8E7B005D7839234A707868309D03784B4273B1C8A160133ED298184704625F29CFA086D13263EE5899123C596BA788E5C54A8E9BA829B8A9D904BC4BC0BBEA76BC53FF811214598472C9C202B73EFF035DC09703AF7BF1BABAAC73193CB46117A7C9492A43FC95789A924C5912787B2E2090EBBCFD3796221F06DEBF9CF70E056B8B9161D6347F47335F3E1776DA4BB87C15CC826146FF0249A413B45AA93A805196EA453114B524E310AEDAA46E3B99642368782566D049A726D6CCA910993AED621D0149EA588A9ABD909DBB69AA22829D9B83ADA2209A6C2659F2169D668B9314842C6E22A74958B4C25BBDCD293D99CB609D866749A485DFB56024883CF5465DBA0363206587F45597F89002FB8607232138E03B2A894525F265370054B48863614472B95D0A2303442E378B0DD1C75ACBAB971A9A8D1281C79613ACEC6933C377B3C578C2A61A1EC181B101297A37CC5197B2942F6A0E4704C0EC63540481B9F159DC255B59BB55DF496AE54217B7689BD51DBA0383A3D72D852FFCA76DF05B66EECCBD47BC53040817628C71E361D6AF889084916B408A466C96E7086C4A60A10FCF7537BB94AFBCC7D437590919C28650C4F2368259226A9BFDA3A3A0BA1B5087D9D76442FD786C6F81C68C0360D7194D7072C4533AEA86C2D1F8C0A27696066F6CFD11003F797270B32389713CFFA093D991B63844C385E72277F166F5A3934D6BB89A4788DE28321DEFC7457AB484BD30986DC1DAB3008CD7B22F69702FABB9A1045407DA4791C3590FF599D81D688CFA7CC12A68C50F51A1009411B44850F9015DC84A93B17C7A207552C661EA9838E31B95EAD546248E56BE7A5130505268771199880A141771A9E47ACFED590CB3AA7CB7C5F74911D8912C29D6233F4D53BC64139E2F55BE75507DD77868E384AEC581F3F411DB1A742972D3EBFD3315C84A5AD63A0E75C8BCA3E3041E05D9067AFF3B1244F763E7983 +M = 59C5154C04AE43AAFF32700F081700389D54BEC4C37C088B1C53F66212B12C72 +K = 7264BDE5C6CEC14849693E2C3C86E48F80958A4F6186FC69333A4148E6E497F3 +C = 15dee77fa34725dc668733ae3ab112c7 + +EK = 16E08D929596ABD2BA47558090531AA277B00DC8337AF578F3A18B3DA8738CA434ED41B537ACCC58182310352331A43A0CA85C606823C824602085B2338142BE48A00E068289310559E9155C6A991CF457F098C61C6B79C584B24C883296B03F9D100489C546ACB28B2DB181BF7B4EC80140F1ABA4130512BA2A0F96C9453DFC479BA1CA9689629779AD731B159A61582CF67989266EFF84455D191032486242E6A9CCA6314B788A3783A0D003A4BE1AC50700611DA61476962E48E38AA5250CB4E60E44B52F00C5233D0A72E3D010D65ACF50CA1704CAB0EBA28D084387DA4BC8BAF7BF3212954652577CE52CD0E9768B3CC606000FEAEC499CB13AC1CBCA0F5B6A0BC7B8B9C140DB83174448050D72C51F18BF1A570FD6314ED91A4DACA6C231404250704A86561F5861785F4B47A15420975225300C621EC11FB6F04C8613982CD16AC85A8EAF62B07FB16A2BAB515D84941AB7AC45DC58D43ACA35697DC711BF8D7BBB41B95BF48716A1BC462F332DB93B67CF858D694B66D9899069EB795B4C1E407ACC74493CC5908B21441838702A3ED0683AE0599CB487A2AC154727A1CFB30104A9B0715698D5E51417832AC67139EF752BA77B7C27217472C62AB8099B4EE2A1D6D98A37EA56058A94D8B86FBFD17972E46A496B2530232F821B68D306AC78BA8D719C6DF278AC79E6036CE55D4E3995CC772E4538BC99E5A5AFF866AA733E6A15A4C7D61ABE8A315E908B588566DBF922C17B6ECB773B59D15416935EB8197FE751A4A5C49AD6FA5D087489F299B20E6721DCC297990751A57489C3A9CB59745FA51191A37873A166C84AF394D280982FA2171183345FF5BC17077B5432236108C6537CB68465C08EA6C98D4B1B606B73BD2A6036B16922B712B68553CAE23630B926276762E3D55DBC1A2FA1CB1372C9460B7727E2CA7382F0B696D005E07AA6C2C763225C30D846710D2286244BC2C751A5BB5CB71F24C75B40C3D1DC0369506D78D39BE3564358764A074567C51BB81B1090ACB301AB95864406B500CD04A2517C582601057328C8467847B4A3248A4BB63251317A9AF93475063CA34D382C4AEC93164011882A6AEE1771EFC99E84E1B68217281B123672999431BB1D4DAA180E9202372C8CD7150FBE3166718AC3746CB0E020AB0A349F88E21D319394676919CB08B29203A6EAC112B63178C7B8C29CC28C4C085A7D6660B12BC64B10A00C038F80076AF0769FB6D42240CA010843AA33B5C534A1C3391928ACF90132D0598E35BFAB062F771696C93696A351C5322C6648CB539660902526202AB34BED4ABC9DA427A1602ED5278897785A9375110A87529D74B951750649DC2B03C0642755132734B808897B1494C98F87376F223207C267A9D5961BC6472B3B8EBBE9ACB9A79A3E2A3FFF428282BB1B79525B7DD265A9986D362566E93886B106C7DBA07FD1C78CC24008852B152822120E73807D8B17486067FAA964330BA67027A84E2BA8A91801D46A059DDA37EDD31875600794E3588AD44331741CEB3990908A57A7C1CA8D7AA3D9864F8E501E9B5603C1FA8ED23327BEB22B08BA26E79C90928B756F96771FD7244B346CB18415CD3CC5BD845E394BCB5C6399F96338534182F015947EF7230A0AB825382957F8950B31CF94F31C0867255A597D9501A76DC2BB7AE455D8296953C51C7BA03A3A0A769207082F45A5100CB49C86317B1650B5898BEBAC512960830A37022CDCBBABCA0AA6DAB3E452A12C1040D54C1BBC372F1997C0DF75BE5D1C88C1618F1833B223D02E2B0980FC187D93A75B57E0487D2CC36AFC1838519378E5634502106AA7B3923830C9B9BA6717694E340B7B51CD63917FF9770635F42F212085458A45BFA09265F074036545FB39CCD08522135AA522670A640B3AA37782D9C7794DACAC86D651B030B33F14464B9CAAE3E883E9582F16558B03D77EFC01AF01E2327CAC368268A4A7141F375C833AD3B4369533FA727FE051C33A1ACAEE8832E32986067468EAD91D79A90058F608F97A1226CBC26339540778B3C1B0421E88458CF69C8DC73287A36D80B57F7FB5B787B66C22658863DB1F60985156BC28BDA25C56C5BD35812020880DCCE46546965817DCC3F1667496F12589065EC68853863C1C581B7F378C82ECEB88D1AB88CFD7DE4C88E0E556D945755EE2558034EC6FFEFAFC68E26128BD7625563BF279 +M = 2E2C821791D3EA49D0AF380B97AA24532F6109D85360A751BB8B4C048C48D26F +K = 4BE636AD0F1522EE10798CE9EF454ED219A13B6791FD2E042A417B2A220DAE79 +C = 3768195444e25e89e842020c5c2c41bb + +EK = 54570A4B2AB131F9139EC171AC5ABD140863A6A0C5C13C8AF54094E95620E4866BCB8483EBF0B21FF9987B44650951750EF0BB76334235651CFA85153451B1975380513552FDC693124617F395121DA27F86AC80AE363707CC3F264CBA1B703DA67348BE45BDB4293C69E31EA73B0DFC35083F2493185B108E09467B2BCD44AB17D7BBC41F73057FBA8C2732730EF110E740AE75178890746FE149C8898B467CE116F68743A7B35453720BC5D9261946CEF3D9931A4C5F2F271041F0C4BA277778D56EF9DCA3E8CC2A4937BD9A276D173258B70C0BD9A0C695732CED11079D816E9D00A1C44A095F746D4EF14C53C64399964884977D503961A48C14E02A4B7055A74A31C5C55AA503C9927F017A194917F3AA13B33BB8FC86126A8B33EAE53CC2631C15C39FFE2615877084FE0C94BD5013A9CB467FA66E780A46EC5BA392D3C7B6579F63F2656796622AE9428D128BC546B33B26C697392B57A240338117107ABB0C146B2F789FB1A4552A4747C520B161C6A356F1368F2ABF7340BFC8031535876A185C11BFF5176B474B3812BE1E7603085453BD5B289CA97F20B82D88E30064B39872ECBC35E447E8431D5A61B25220CABA58594E96CAE054A791736B51E42F3FCC1F2F7CB8C86C9B67FB5FD53C93ABF3123D11CF5AE491B25703AD386839F4B0370C3AFF50903724C592141B88EBC6F61732F1DB038B15528F1389FC574634071CFF89B39D5A3F50D5B8E6E932C434C9BEF450E42765EE1486C3FB1221A3B3FC42C5ACA709602BBAB9A9BDE4A9716CDA0370B767D1E29128A5560164ACF0D03EC60833AEE125040B5A5D45827C1A2E2B3CACA923BD51134E216921656579F2773C4F0002A285A9EA975670F02399626D65135119754F01F09E204C305C880E93816516B0CCF996076AC93540144231F54ECD27C7C3DBA3DE988E8BC1838F68550ED8BA14D35E14586516BCCF459A3E63C9C69366A5A2992302092790341E7FE08FCA4B77906C839FE929635B89971512EB73456462BA9DB473770B9689446E4D69848E21670CD76F04896456E7BCB4352B086979DBF4905F656C1D67169D71933FD8B827EA5D0B5B00E0C3476BE53F56D11FE47C1BCB5727C51198381916572257D9E5A811E6601191477F45B2244BAB96943B16B28074B7129337333BE218DC114DF16A83C4C1B76A28223489384CAA096097A26B0C17E1E6686D52214F756A12F3C5E08985843909DDC1C4FB99CBB552C9D2594B85C796856C48A3D99A2B93510425A90B4AAA035150DD1394174429B6A394EE495E060812C6044678CA6F5DE9AAD4C11CB4060225F07F004969FFE991B7442176E00D7AD4C6C266435764CAECC34DEE027ED1CC4B80BCA242495378F0097B797C9A0C3F49D7BC2961A41D751728915166730DAE7A588C550F64F06CEA7A868640157F05C69C781682967CD4720040060782500C97593FD5715CD84A05AA10958FB482C38C7DA01A910C5B0C055BC2252B6FDC659A94F36422285F2CD477E350575C4AB3048C0F2AF83116BCA3EF65B0FB73C77747C3D585AAA478945288CDB0853C14D04DAD16052B71C02AF9A3CE254095C26736E6235CD6B0C340812DEB282249AAC87C7E35639E31A5943F61CE43728332B9280495CC9268825AA923DD5155BCE616B3675EAA5891FFA7A6BBA07F14196001253427E8BC4C609318940EF31030C5C9965A26B7B5A2440EF56BCCB424DC75350AA0129E05C83C19856CD93BC9928A8D674381E6B79EBB0319DA1BC7F427DBC1830FF1CCC468B5E68B23AAD73526D16DFDFA30D8CB3559296E35449F36B280B191587A692DBCD610D75342DB7A919F8ABB1E12BA44B185B7560AF79200427150D34601EA5A929025855B34B3067A01BB0B9564C186B2820917D5BC444B30755BAB812C89D201AB6D376135F2220F37AC35876B6012975731077F464ACBEB7A1E7764AD8502A68C9616B09C33FC6688166E1E3170CF6534C0212731049A31D4353BF80A99390064953419E9CD1DECA6F3007D31298DD335B69B971E4F5261F4888318A6A0C0E2AD79C19A827436E87886E29768AB261863243EB5D101A11922B2558D8F53BBCFC1BDD652CA6B10C123C41575F609630C660DD9205E571B276A36C64C770CF3B2D362064F0C94E2BBA158F235F27464280CA9026DE7D64D513C6120035933D3067D03AAFB1021A78860771BC04B4652 +M = 5729B2AF60A4A5EE3BA6D7F255D7D2437812579942FF2C6F48611669135DD695 +K = FBF22CE8BD5102D34529C46FBA28B1BBC9787A570C0DDED9CBAA48D29D76725E +C = ce6ac8be701e54a4e06b3cb2a8d088c0 + +EK = 6914CE520C02BF6687BEB9330C704296E40E350303EB356AFFE66FE8C11A83102472EBC96B6634E76C19B89A5E3E4078AC751480B66288120A0D9B69D78387CFA44F32C08BB7768B292BCC03141D77871F5405ACD1403564A27EEA55298AA0544460CB1C8AB9E4C006EC2A1FB5B48F39745D66FA899C456DE0CA4A5CC4B2E4979820F635B5A286ADB3B8AEA97855504935E21C37E226DAEB41D2B1778EB84F764651B66ACF2E7B44FDD43E037400B50C97485047B06BB5B3D1A16FE95AAB462305933A3C730EB43CB6D5C10D9DC25FE0F8085A689C0C611700F894CAF593BA4833466BAC987211BD548C81A2BBDFABB5CCA192FEAB0E1AF3774F851A646281D1841681A40A1FC34EBC8BBD731BBAE927C403BA9E2993588B885008317965F9967D249EAEB85C650C18251AC22930A6A68366F72037B2250CD9B5A568766842A812C3C7BF7106CCFB122007808A84236C2E5A88BB111EAE388F3756B2410776C6D745F770208F5B8BDC087F16F86D52098B7EFC2416A786772124D41187546BB8681672951960C6148591713C19783186A189806CA9D6EC3BC0BCB49404362B82B311E8C970107C9B7A3D6D526BC59C48BE93C699C79167C63A45289AF1773BA21A9A2F99C6A982034914B55A301C27C73D27B50AF02B35B6307DE2F24B1453064F847308836604C56C1ADB3306114AEBA38331A56E6C126445EAA258E25FB692A761EB62FB1BCC88AC79E5EC8CB583CD8ED799D00516B1021958333394B30166718EA0A600CC37403115516768BA1F110F4F27042D589E719350931735023604BC6B0412B67423826EB91711ADB11AE8067C688B080CCC3939142CFE33C9D58710FDEC082A88903E9238D3276316018D38A841930C919A2493A06051CD9CCEF8E46D62F61AAE1A8600A291B55C35EFA8974F1CBE0DA10005A68659904E13631BBD92AE617ACB7618223931C989EB45C5C88FCD74715DD17AA86704C57A2A2561533B562FA7E5B45BF7212682900E70CB2C8227BEC67CB1D7536B405EB6424CF2F5A5593AB77D579156750B78148C33E79BD9E798BA162FA3332A6A7AC354CA3818C174CA0B354B4C13564111DAB79A0BB95FFBA8A71355558A303FF4E9333A708DCA860915B19EC026B7C4022635E404228776931683467337372B7FF7665E9DF38CD11921594C899AA3B55852B76FBCAD0159254B91B06C412DBB5C998A283314A673FDE81009A6C27F733554914B3582C31D3B2B7FA80B9BE6157122ADCC891B21E43AD0343CB014455BD00DFC2C5A671A86A884A5757336D267ABB2F61E18A68CEBD24E09311AA6621B09E4437CB8C6FFF7A0930771D48AC952E317DCE9A5C1261DD83287D7B950ABEBA6C5300105188DD4B4A992840FE996AE2C3B20D7BA00B11AB9396C73A5DC5477FC0141171F6BB05D4806CC9B244A7AF264D84956FFB8A67384CC522BB1335737D5A680ACD3AD478191638A92A0E7292672A75982AAA8A93E321CAB0DCC616A4B9C344735BF6521FC86B0AA3CB1568A9EF7B19AFFE9C352B5B84BD7B66B07C7378B23B601B88C43B794E25DA22083AAFC52682B2CA90302453AA595C6B43E24A84FF07BF298CE2FF1CB22C6BAC6511784AB4FD5AB1A3B376684867951AA4C78986E04A639E8770A77BBA187F08F7E910AAC433FB5461D374C7022693594FB0E25E52882D310495B1340820AA5FA13E187B6335460C37B0DC1848D7CD6C85711CD292994184481560837820A2B9E3A09B34ACCD1E296BE3816B26764DE9B0B16ECA200B21B9E338014FC5F99A8323C657061C59683DA62B22A370313BF5150476DE36B09912283544E2DB6398B1168BC6A33A257605DB863D3C4A6F190488C402D07C754245C804AF6CE9E2589904666AA335B09C35B78731E14739EE2829AFDC991EFEA87BCB3529EFB1677D5378E59B31167792C89449F2A7BDBE01C8B2883C9B880E626AB1837836BD9216118302690148308A944B1B20D92089E113DF5845AD2F489DEB51DD4D4906E93AB9D027D89261C0317561710A033F55B6D19756967159D70870446A48E6B1B26E05258210918C38DC5985D832556FF6872ECB2BDC1A009F8071DA7992F3249AF49C675DB4502F3D235A63C6321B56DE227AC0AE436E44723FF293FC2979DFEF64B9686A3E28597D5954DCF3594F10EB4D23B649636B79B831AD8AEE1E86B66A18D9A3E3F249BC38D79AE +M = FE8AD6E3F3EF1FD1890FB7FF75A8CD9B2A04CAFA7ACEAA99D06D116B81039DEE +K = FBC5B7112172B55A75DD415C4CB3D5C46A54D90A3DE27BEA4CDD116B19FB99A9 +C = 6fb3c3745bbe8f91aa36c730375cc0ed + +EK = DF970CC655479D5361B2C99F4E6A60F9D15D9941A36F126062564EEFC3C75871437C021BCE4314A243236FA06A1657B68526652AC65AB05712A1381084254D048670AA24A995096D139236D6A7AEC6A830A4CC259EBA039B6A6E451A0B29D0B4D5FB5FD365B2D81C0D54FBBCFEE19993FA70FB5C92B29C95F0065629D84760272076BC11C3B72B96BC15B3651093DC440F6876E8A27834560B61B8A041499172045ABB4223F0D1AFC71616E8B6958653A08CA776B8916849C81A45A8BCE158B055B69E2F7487D4962FE31061B4B60034567E85496503108CB70167AC4BCFE402A50763941A15A3AB8CBA7DCC220D707ADBE4983A16C3484536EFC860833A527A7388CCB89693FC21906B932BD21584B046677AB9C4E0A54325CD3DD5A78E17CBC3D8CECEDC096CE167E9048C35973F359B7E9B729F95535408919958790427B1CA951080C9A45AA451CADCFAC9FB5804F8CABA9F88C09412ADA0FC2553B5921BE60FA01505BBBA2C33A22B73A69EAFB530AA090ED1734D7561C25299AE954ABA49A0464480B731198A68F9583CF0663322A1A493B6E2A2A2B06CB18B84C701E4AC73E91765FA72641B86249C5817511565023B6719252268585F2B077A3588C0291B36D9CEC74A1DF4FB33A4B95DE0FC7EB1746FD4E17401133F583954B9C947AE6A9AB443CC99924913646F70B29387293459F6317919C177F87EC01CA9E3210455EA25429ACCD4020CF4E43F98999D3739979CE39DECC5361F152B330255444A05F13406F6742BB51156A07854BB0A91C0B45C0F1678FE034BB7B2558232C14F83C822A22C7AAB6934661682E23CADB26D9D9284B519A4595954BC56CBDD0062BF657898B24C80F3010B849E20B269BBC68A538749A6F06DA2D62BC7FA8A25074629D12D22C6517BD4A20D8531B26BB13D2C9B2AE1639243B803D30455A1C0E4CCB5E3C206F4A6BB5C65B3205C56BFA678AC4189CD108DA5C654F4DA7EA30B0D7B23985EE80EECC2297CDBCB6A2A6B3A3C474181BB42F9150CE57FBC6C8ECCE43990F8C31F5579C71C7DC9615D47506666D05BC59339052BB090078E58858780671A65A14CEA22018661B9945A0D0EA2679388C308460AA9367CCC97CE6EA3960AA04BDD28B1B98158E02BAD3EBC3A97F2BB3A1319FB6178B99B42016826F4814960355722B8CE3338BAE0E97084613DBE41064D0A6F3082CFE25A18978975AFC04D0E1C9CCB0C1DF5C9054B22912844077DBAC39E40CC18C87179D420AC782D40E3AB5294C5B5E786814918D048835BC5333F421B366B26568C20E832AEB0410605C3B78394CB1CF5108F5C7538630C8EE4A611412F75F1691133A93EF744D36ACDCE302516735B09B05776049DEEE674F894580A55B792CB4ECC5916D0E3042D3231C8E70DAE111AF3A386ABE5A251FB9F18B6AAB4D79CF16BC884BC0993266C35CB267A9AAD057CBAE4ACC071123CD8D35C86A7C23A6771FC5799CF29ACD8F08E6C0B719E3173162418CD6B008C52A29EC5A701C97ADC906BA4852F7590353B190E96BB8A6C67AB9245CF45BC7DA31B5888B5B6FD77912E81A9CB522946D77305303B6F28B6A89469E734B5FFC4009C341114768EF8C0489E66C7EA3106F224A9AB4B0E147911757521BF39587BF211D9DB8F9BDC9EC21B881AC727810B4D1303A38938A70AB3248BC547B3783F68A84C5C77053726B808825FE17BB8D5672D77E4A178AB3C8EFA8AAEE419A09BB31CD40692A4BA273A137530CEB7198C5F38CD960049BE317AA924ACBAE241FAC48AB540C6CF7A4E58CA5AD3076DD7FAC09DDB1B49DA3D5FC751AE812A416B098CD712ECB99CD0567AAC9BB48DE700120584FD09A201D49A77D16132527F5C0138868C18FEC89B3D593EFA912FF66C79A2832A1B0234F5F0B67091ADFBC507913A41A5C22FFED19109AA9EC0F99395685682F6934010056543AA88738F1D88ABB1BAA21D35585F5534EF6241D81476FF33B434B4C335323C77318156F75370E1403C390242E6C7A75A9D800C0CFD84AE2AD52B9A0A492D441131B68C27DCAAEA93C2E3E2C661E054D8228B03243539649B861927947C76500910A5EA0164D43865B62BB1B30D032334EAF296ABBA4780DA5F12EBABFD021C3FF3A164B0745C09328D5BA0F6127807824E2A7C8012201510C3368067847C71C50A9D8DE22AC182D1644E25A39ABFCE37DB3224F725F065 +M = 0AA3B1F8FFA63F89F949DA18B6D8570BC5811F85A4BFB293E9D411ACD43C3227 +K = 7F8443BFA35178C5DD7008B9D8DDEFF28BADAD893E16313FCED911730A9F0B3B +C = fd90f9a54bdbde7bdff41ff0c03e9f87 + +EK = 8FB403D0105FD0EBAFD6505968774504C7823474A1C26280A178BFD33368E14491C100CF58379A55575D753B75456196B5257D2B4BCBEB586EB0397BDC20B798DB6F12A8245FE80DAD6026DCC76EEC5B6DD6F9B5EEAC5211D408CE0553B11394F1440220F03FBBF4158A1C31F4735BB2296AF336C4869713BDD14D686940EC57CDAEFAB8FEBA2FEDD2C51AE61B4D67C5FA6B444FFA2E150788F1D4A12CC7875EF70711A38207C840C2A0337BC3CF42EC1F81464F731C5F460820CD473532983EA710846279B000586140A9B8F2B873C200B8F8D55D1A422F2668103FA8169DB77EA5957C4FA9A72259B60DC27EA16BCD31A051BB528246F05DE7B22398EA32C2230FB520A0D600CD8C049DF9BA6A5C665961344974385FA55525AE340342757BE2831807C552881C13BA133CB9BA2394453818D579787A6CFA356FA560BBDED6182A676126494D98A80161A4987B126DF67633E7433BCEF68690A12DE679512507AC1B9186367139213A3023418C69D0C67DF320C2CC88BB7045543C3380E4A953A03E63854FB986BDC898111F6A7A8FCC74A4F3971F21850E9770CC07CB0C5122CE8B2F873813AC558D9D4474C80084F0A924B3E2B7F4F4137EF5007F0C5605658DED4677A314A44D783C2E3222683B4DBEEC349FABA4430AAFD49160B6C91F2AF4092EF63EBEBA1937705F18A387A6307A733773206B8F2D4052D4C36D2F557FC0E226266116CE41B59233363ECB728C0343C0648AB1045CB03A1C225B89FA488114A060AAF48A68CB7B20A3C55A71ACDD7742DD05AA8495815646353DB21D4A7235450076CB94041D94A5D0245BBFA3598E870FF0E30FB81213B6F9916B78AEF3D43574CC07C9B5CF257A92876C49ECD73B5AC24DEC0BB25FBA54B29CC4A410AD40B5C6FAA398CFB82D2401878C79AF021CA0653A0FDA4B6474F942F93700ABA364AE3611B7666EDE2A8B2EBBA701AA61387500D674A9A9FB0351F06A5CB699EF73457A8ACE9E8B63184768363C50AC000220F2CB708AA27522149975BC951553EFD5B577D507279346E5D00F2EB31EF1DC1EECB59007027E65D28F0D10B7484654241984010B224F174EA69B1C36A302BC20B3244B030B231FA5532A4B206D3B3398E9EBB773B9CD9821BA688C06BABAB29DFB6AA2D427A258693BD1AB13276990B1775AC94B6BDA89F8866AA3A94003B3985086232A4A61CEEA8B1B711609B3285AD158BAE4C21581AA1541CEC7101AB7541098EC7093E442B21296ED172540972F52C04EAF6581EE942C6ADB287A2AC956D84B7F726158D8637962A40986B1F2AA1AD6762C08412F67D1A7F69B6F0F87AB022B1A48F4727CEC2277D1B157932B860A156DE79FEADB99DA7CA0D0B7A4A9D0B3686A100505369C47AD5DF8661CDBA888FC4C7EB1CBF9555548D87755C3232BC3467727AC4625B49145BBD95537585018A7FBA2A8834ED587CCA5F44884C87BF5B5AF8857A188B77A36A01B16F28934E38C9513B5A44926FF41212B13629E2986B8458AE3E9975BBC40C69214068BB78C127FFD4A664DB90BFC068B67106A43F1BC7B094E6048A529B974EF615517ABA2ACA75C97093487C2A265330EE5454985C6435FB989E100B5C9B80DB0A49421D6A75E1632F4B03F5AD96515039D8291C67A15902FE1C027133939183EA0434AD25B45CCBC0C69162CFC1CB527E392B1756E64561F4442BC5814098F33AC673614A8DA326F8818718603110836AB31778536A9C47BA820960CF181CA829A9911792D67DB209E9A66CAC38BC57A4CBD4AA3D07C3447F72D4231A69326AF512314D9AC918DA0BE19B624E5446180166D05F607B1EABC04B2A442DB33C71B66CAD3AA8E559662284807A69EB0469E8B321C73900A74C4A66D40B3CF382D53A12FFA26B9C8888516633E9F292052FA231404483FA41E42A9AC72312838BC7E17027C5EA055967497F3C9988D5A6C4076913DAA9D33C11D4335C850121A93C25A89E3AC0612087943A35E23204EEB12921675AEAB244BB53EA24C969DFC2A0F99BF925666C9A69F123A756104CFBCC88C5A2C8AD7A21956272E22F58035C140BDA371DDE7329D6728E2A05A150719C2D578FC511DD3361DF765C83BF2B04BA7546E0CB5C28C211489C96265335FB5BF6B3C3779E3CFF1C77379E336F3481CEF55F2F61A3CD1F98B88F29760A2BBCCFA7BC9270DCD07F290CEB1D75B0F5941 +M = 2429F93D29E48EB6A25ABBA3EE2F3423CDDDD0ECF4B2090C6CA5BF4883F4F3BA +K = 71E743C143334C36D7078D290BFF42D53E7D775C6DE3FEA876E054CB8042D3F9 +C = 1f58dfec21868d46ceae46d8cdb74510 + +EK = FDE545438A542588554452B13FB2092F3113D0DB9541437B6ABB3A02A713871AA479A1B6F5C20F208226A0028B5A680AE845335DBC9B9C3B91E833C8FEECC89F0CCCBE4216949684E094A96A469EA2B09F5EC49A352084CADA99EAC591661A1A2C468CCDCC4C374310E78BB0FA38803B1B1B078C9BF0D9280323067BE76B1BD3912901695FE1C4AF4A1BC38661AF797F9D7B9D8EF091EA3A0A53210C57A706ACE6A33F09083B728F767B51520BBA7BEB364817B820DAA55877CCBA3CBFEDF60E48FC8A0B5BC6D223CF56C3392021A6DE432F4B4A3E58ECBF462376BB62933D6815FD085653D5C3A267C150697BCDACC54E336D7024662BCA1782E531DC339851B33A0778A779544F4B081C05998787916A802436DA982B79164C5A5823D11AA271187E8F90790CE95C1E474E2861960F756F3191267E0158C1150608B5CA7AF09C23579608386822ACB02D559974FC6FED8558CFA6383ED0B5FCA318648699DBB7195F24A000E6A99FF8B4DCD0C3C7B84E59F7CA21979F646B4D8E7A61289605FB027DDD3A10CAB301B9918C365714E1391C42185874980328C04900AA9967627660C6ADA737260D74A1CEA5578A254FF0F203DFD6C832E86EFDB25A08AC5609DBBB469A7125A7C1C8644223AA51EBF9C98DFB64FE530FBF47210BB3C142360EA864AEB447459C6B361757AECFCA733CA2C5EA485B0AC065E2951F145CCA4FB6951579B4A19CB042A3B34419CF29B99A6E579945EC357C7C7BCD7578175BBD51444C1DC9A7AA54574A32623D2C90146B44F2547EE9930282F25447207B03C04EF6AC1294B9BAC6C36AE1666401E318B730020A832ED789199CA8445239B765D48610C6B25DC4C592DA7906C130A6E356C066534388651A0B4F495C39962C9F20DB1224B40AE0642091115BFCA34B5455568E97B0D45B74592905E02BBEB8FC1E2D1C49051242AD000D69009B12A206B988B8CB26A91DBC6305777234FC22142AC85B828D1E8B9E589800214173E858497B964E6DD98997576F5F4B9C68090563F1B004D38643E2872B196B1F607AAB3C22D73324DDD49CE4214F13065405767348A20BC82329EAE2283FB65ED1EB939CF25A7B1762E9686DD3576602073112141ED315300BE6B75F860884E0718C7596FC39172AD9BA4EB837393C49DCA98AD8CC15B849965C017CECDAC67161A7DE6863698C8A64E23A19402E977539E834887954867A29CD2F46B0FBD6240D89141FD8C9ED390099D905C5101B63B30D4D61AF14965FAC227470B38642064412747BDDD2063A942EB0F02843156C1D637D2D8C6C5161CC3A21A69C6220B39CA03BE975B81921C56C140422A8791A9CA2A9AFEC49353B65AC2440C31E2084FACC6F7F23A027A682CAAC402A69675305363BA85947BA5275B6868660B654D91264870FCBE39BD2E68B9048C29732A3A7306AEAEA8A08BB65E5E078105424A3B8803EF9C62CD65D8A65CE6D528A1A818E1BAAA4139CB451F5A20C135F8A231E843531CD700A2E69BFFF186DFF49108562361F353A8E5A23C900043034BA6B9C6CDF2A7C67847F78E0955F7C49EA94785AD3495CF4562EC86F72E22B562382B82B392DBACC1F536C18C20086A879B82C291F45CCB4C24221836383D03997C43EDFE165A1A046405A193E0ACDD08B122AF6925DB303491BCB87DAA36CAAB91197BA64A9A9E3C4A760174129B080FD18339E07ACAF00CAA118A84360AF0333755B869694D07BD108AF4A094C51A9165CCA9ABA36C2E3E43FE4DBBDDF257E08D03B333773D5E051F8101B8EC7B80FD1AF5E9C053FC71C0A1C785954C3AA4C33FFC95AF6CA3B248B5F050AC11B3998C51C8A294544CA4A60DC47529EE1A3849314AAA62A05D3557827AF57FCA1DF9435C4014669B9142DB620AF044C195B6BF046582C52BE435473C74A34CBE751599412B96480678B668B238DF373302076856BA63AB627CB21F3707BA18B999A3A27DBC727EAA8E0497FC3854A4A926905D0968E3886FFFC4F6A2B4273993282635B9BA013B4B8C91E7A47AA624F8262A14C42B4B8A36027573D4790BCF5D386B9181FA0F357230A2185747875970C668142E3673087AA02A5B7AA058C7527B1C0A1C9B05C912D49D1BC8FF629FA77CFEDD1A7F6EA52F9BB49A82B38C022C52C87C346482D42A797BD3A972E19DC352C66A0A315C04CEDAE314DC0D335EEADEA8ED3B75EA17EB388 +M = B65043CD3672CF9AE2CACC94F923CEF63B5127ABC63C2A5AE6C064B8C6FE7C57 +K = 91C5D5F6016A421C4C5017CD8E805008533F67FF7037E8C62FB52A2D6657EE5E +C = decff1e0a501a848d28fee773587d98d + +EK = E7104DFD284FC4B28110B06282BA8EB859CD60F8934CBA78B1F1653CD4A9613B4BCD5C32A3B30EF863A448D3A17FFC5908438800C5CE12475F3D5445761CCB25541FAE3653A8B8776256C7F5384481772ED0E3C4E512988E605E1C75A85606AA574442888B87F0A77C08824FDFF2B5FDEA4834112BF77C011F7855AA065ADEC66F505A72EE45300E2C9B18588E2F6B57B1C2B26F491166AA9D89D9BC2ED26DD311A81E4232FCC720CA8A788D5A00DB696763256F58B2B68BC32653C71F84088383473F19A76ADE5CB5B6BB466561AE7294770F9148E9E44B2FA1A23B1B99CEC1327F60A002728F21CB9D25AA79F526CCB4EC1531864AA550C72336509FB3061717BADFB2682EB59053333CEC75BD6E244F002D0BC2B1C8008737AB62CD42D2BDF9CA2FECE31DCF836264F84F76569A16046761885C163CCCE986122A11C8911C9257B88FA2CB792BE55FC14048BB995F11606E4C3C82B3113D99B451686ABB1F129E22D63EB14C6C3EC2479BD0243F57876175B138BB0D42313A28C67F1134733F76977BA87B5A11523953947B684282905F2AE90F5BE1CFB0088539313A9FE2A3AC9729C2FB5FBCF492C5ACC90A74C934B1A29AC19D2E20CE74436742A1415A9A0A4CE3756C199AF7593A7685C02F19768C6A1F4859B04B0186C63580916915053404054929F8B417F6A3919882C8D31B220F1817DCE08267DB0EAF61301C2844CA4556F813279D122C43A8820560A09A18AE2807163547B9A3E22F83E14AC4DC3FE69A25FD5C2CACB6A67905C9C754565EB5B17AF089C4653302AA830375B9CF0BB6D43904DD8277D50BBF4D43ADE05918ECFA74DD432CFBD829C4F9838DD76EB75813DCF397E3507FC9C6BD69C2B220644D3EB8839769CFCED608F98874EBAC4367A11274317297DBB424B95B9062ACB4C83CC5E879E6688447F26C0D2BA3763406318BCDA3228CEB0641C7250DAC193A8713744A6ABE5F6C106DC4049CDB49FB946DDB7A08D2D73556648F4CB82E2AE989ED61677B805F3A61344A14A2F3DC3964A90E4B83CC22AA8E7CD532BAB55880F212751C4CFB93AC14F564AFAA723FF6B31990A88DD32A557AA86EC2ABC114745C8038F4C1C924258B5BF02134605923E865539425F10424319131B0CB17D72C2981A944FCE3CD85A2509E93BE3AB5A65E53380772A56D74945D60C57A112FD87A2EB7989CC14A973CD05590495122811A6D8992C0064C77A78C7E390C43FB695726B7582C96C50A8EC5B4081CAAB6E9B64870166326A8ADA4731030290CD444B9E28149E06BACC7A79C5E7B24BAC292B7F92C7AD720F957013E1B118B3A40095C705DB33DE334ADD011CF3DCCBACCABA3B12A6FB5962E01C7C8D83912D9F98ACF8B1BA073B25AEA0C177074E7EB08CFF3CC7D7709E723340BCC00B014A0B313008DE52533B72393D70B3EC767A8B6CBAB61B8B7A9C86B263A1528A9FE366D60104C0D320CEFB76A688B407C0742F8BA4AB8007A3651C0F26B81E92746DB701837B575AB00A6B6D56FC5C12C956685ED0AC3F0C6A5870935298640E5070A8B74AD540CBCF273705C68115A828F72B09C83551714D67455EB46DC0BC14145CC38F5C1DF675A3677ADD28C69F0D462B1F1A0ACE8AA30B877382280F903B7DF9503E4C5048F4368B2A58565552EFB106E9AACC75562C31E3A3FE7790EC9269987C627EFF798A9A0484F215A3968525A0915C4B4AA7A8170EFB1466936A8B8440DAD499CB2F94373CC91F62673B59A90C728A818247513445D5AE25D85AAAB0036135DB5BD74D106AC557E0E8754D1E071B5B62FFF7575847B47905BBDCD5958A7A86852C34DD01286CBD50F0CA4628E31C5EBA531DBC02C9DE1BCD82C218C2CCA87A42A28D98ACFD1103F80AA9073C127381B4584C923492960537A28B868F214251E328FF44CC984972949003916B76D89D472B97013A52141FBAB0939B03D8D57364A387FFFB4A59D7B5D586680D7F54DC27AA7BAC39580103C74621E6D8970176AB2965ACBF453A7217A3C21769449E9AAE851090B52390642C467C9A233501110F059EF4A1A02BB06CBE1084A08C85AEA6237DCA55E2698D177716E662E2DC711D475C2EC9745BB061A90432C6463BA827BC32E0B0FA6B015324C9B574078AD823ECAB9010D0BC640C0A20E17317B2A30AE8AAC4C94695EAFDEB2BDD14D78D1CA07CEB411455C0EF10D23FB50CA +M = 6C8C075658F4257D42010EDFB1D7EA290D3344EE6E4C43DA799366985AD52243 +K = D82B00EC3ECC8818741F6CBFFBC99350E84EE4D4A104214774525D8B78C93CC5 +C = 86e678986b116b9ef39b5d621699805c + +EK = F1E27E473692D70B178B466FB72CABA716C2468B308C0689615A0077215741D70A633734F0140F4479BAC081370D3565D24A4D0D7AA189F1C28792BAFFE9928436B9C0215FC655253D645B3B84C237212A7868131AA623DCD8BC2ED65A2E082C4EE29A978B0C458C9E5BD656ADFC68BF64291C387886493D12825B8363932AD17B8752BB49B63D074A508AB3CDB7341ACDC5AB76B8C5F9C93FD4EB74CD9891BAA467DDB28E1733A4260A2A4D496A3F705E318A042AAC818E408DC7A9BA20520E3A4CA237C1C581598D839B67822CAEE8C04E7BA6219ABB23D9455917B84CC5C94BF8594A2D1127601BC3E76B54155B1AD8C5754D13B564906E3688C3DCB9B963B7295310341EB0A36917919D289C2A1B001CC4360285A40DE87978FC532A242422829BF8079D71F347EDC072B9884A5D26C84E07B72E529DA1FCC8E57C1C2BC30685D12635B3A136755A70224D79FA7AB1124A69701DFF4AB135508014FB4BCF044218D4918790455923039AF9591087A5ACAC37363097C41B4153D375C933C488C216C5CC1AC56134F9B3567519CA21496A4CA06AFB84C0DC2743673AA94B15867EEC0945398376DC6981C6A9BFBA78D9950E27E16D3852A63CB08BDCE1C99172B4181654BF5A90496C764B6B96A25331E84162F902009BB4B76D8BC41C08AB7FA8B1C4657AB51CAD6FCC324E4BC70979AEE6125F2BF916FE8C3F4F5A72A695A6F8E34084728B0FF59CE1FB5161D8AF07CAB498D23475869F746563DAFB49B64103EAE0CE8A17BFDF1853E743262593C327608B27614F32C1ADCCC9B638029F7F9377B302248017747AB5553833ADE94A3846D309D5BB9872C89AC4E7831D9A3A3FDA26A42747E96AA6EE375FD407585E964CC4D6821323C7874986A1192FC0C62099A764A4554B8D89B9D9585A339072E9D677ED3475181197EA28BF6D84A3DE367D7529AE481133D1618007D5832E0A13B7028BCF5CAA36F4861DD22DAA497167E171CAF912B9FC8056016520ACCE1F68397246097A5755F8462FAE3413408264BDD915BB253A6229C26B14426F439D9AB79C39B11A7F51B9376A300C7530744B754713A50D71BDC299B9C0C7B266CC41F31AB512D0BCF5AC9BEE85BEA109734E7861646A7160BC3A27AA5CA3F87128468F3266B2B156210AF79D03890386A9AC0CB71BA3B41937960E575494F60B0704960518399199CA227D48B99ABC8E85C1795DA67C0D331B40CA8E448A934A38CB24D0730E181A7B30366335958D5993385871DE69C97B22A1DDC6BE8C5242BFD93073893D2B498627B76B6D39ACD7405B64C16E60E190CF45B5EB12735572AEF8F99E37CC3C1492979D3718BD363EABD56E1E416ADF9CB106F3540ECB4ABB052D57C728A558AB52FC4FB9C078374919F29558481C3ACB782959E2C41AC05B8701217E7BBF945B970298A694FCB0E12490A6C5665E267A8AA1A5F060CC0A08093E816EF9644720024FD0ABC5C30C39EA095FC5426E732C2490B288FB38AA6A3517D16BAE8F38BFB091BD70260BE1D80B2694B3651316484C1E97B714A67A0416179F2C582E25F770EDE422453607ACA79C1EF217C2418840609FEDF914D083595C10CC4CA70D40A8BAC5470DFE4638DD86A03DD428CC305569963CF620931B40245FF3098DB6C6A1870D5D7B838C976D0D0B462F441B2D79BED3A488697A191C20C0A8281CA8A39D61E69A0767CE753A02EE8987414AA3BB99BAB032CF451BAC1075162CD1097B00AF6A4A82F8112F28861BF0A6AA22733DB462BD15F95A211161ABC0C5B5330FE4D63854F3C0F074C077D06AC2839F06913FBAF33F7F91A948A19D01D6110AE54025CA068D1B0D7CC66A6EE0BA83E377FD2313EF44C87A58354D841B0158C8010B6EEC2898A9A0778072149452C2B6A628256C257FC224C0B767DCB3710071A71B43015D994ADCACCBF7B3A234C11FB2B56E75E4154DBB473978BC25758EEDB5319AECCEEF44AD82C3584F8378437763C3055C4A84AB71815EE5E360AE0A363286936486C69976AF602885769C1CBE21229B9C350562AAD4A91BE145AB3B090B9031175EF96CD275CDC68444BF890CAC56241159C55A474647A4257A978470BC97D28549F21590EAEC25D9603ECB5909D375CAA56B076DE917B8C7251C92B34563BB56AA6C3749113A837B5F6B5496259F5EB94195E2AADEDA453309F91EC2AACB59E01FBAB4B8F8 +M = BD990171C3252230BE21FA7F186A121686187B77C234C37CA5122A7AC77E318B +K = 8AF0912F3635D93D537E9065529A3D69590AB2E66607540B4ED97BF6D985AD09 +C = 7fe690e8e91cf25aa717ea56583da832 + +EK = 1909B5ED6C0D8D3C301F144373956424139AFF46757A070167BAA70BE7BC375A6D43E18FB0EB4A69B49A2D951E9265BC159A282B724F3477A2DFC89378CB9FE6CA8CBF55BE9976CEC668402D7A3D2E4CA2AF6A1E479621DB16A3187461036513C84ABE5BB228484023760266DE5CA11F1A8C63EA77F6E45F35D4CAB24443B51B851DD2C58EAAB9D426C90064AF14F8BD8984CDBB84C7E2208C5AA2C7E3A222249943985CC1F199BBAC9B8719849E5D539986D8B063A363B76953D22A508CEB03C46A04F19769E327A774A063B1D412B7B43D5651051E547487F2293EE2B78849BD36D2A54E966F8B386BC735152DC34E1A12772F67506B6474A2C57AC0A8CF53122949D52828D69E8A7A326F18599BDCA23C8C8E3B28624F26609DA18044411A9866C3A7D7083F09707A70192CEA40B936BCE696112AC92582428F30A800876BA7BB40560561AC5996A4B11639BDF00DD67A52F85C6BAB54055C2352121591260B656C43B2C2E89A891C97F39B7921794CB5A552C05A2D8E8BAEC89250666734C2DB73EAE68484DA254969918B10914CF4274C2C27319412360433ED27C810712F4E3145B5265D1EDA7B6917CFFCA61CC087926CB116020C7C49D1A8A723C197CB44118B3861A0773D52C6CE25A9E2C66BCFB6C5BEB43185EAC855D1A99C0A2FD5A348BB0C579DC23C7E777AA57249008497C7332EAD85C491A89B76427835983E00F5856B1443A60C83C714B122369A97C356C0755FE1F249C8D56F0D9897680CAC247A7EFA8386744B607BD7C195B52C07001384C17EE70AA04393C081EB43C7F912F3D786C7E63DF043A277329AE2C90A0E721C5713A47417A9ED1370C2761C1C029630C26DD215028EBA6CEF5239C25383F6370863F622BC055517946EC0D2C4CD909182CB51C817A04C53B4309B14507069303245B4B55B47226970D269D87340DD5A864A85A62CE3115AB7A972C813FD18C9AA0B582E79C228468292A8A133CA5C53A4C842233FFFDA7DD0002444C51B2009654067C7AA34BA17B7368745C1719572A2C66D6D894B92049EBDF629C7C5A2D1EA82C7791B7840729DFC7975C2C18F3B319B45AFD1E0BB0C527D3FE8BB7E95A7DF958EF9268ACDCA208053ABEA894928DA891788177185B362EC3364F93D4B602167942603412CCB595DA8910B748A2EC022C3EDA8437781BEC4A913D2C56043A1BD6A5B2A858A8F7742A82986509891A9EDA7859D3A99FD78A11335910D830FBA1B13823154ADF8984DB9066B6735704196D49C8771B870C05504EA110E252B4DEC2743F1F39142B6BC5B635110CB37925A3CB0AA83858A54294B29054805B969A6352925CC53017235CD75DB70C86198EAE30AE8F933412C0504DAAFE7516BC9D7A780E04290891E5594819F08C2ECF083711A85E1A679235441976B03E37B0B0DAC6BC8456497220F2D4B927688021FF90F2E00A64DA33D3C878462529B98CB709B01BDA6D27FCAF7899BE90853BC6C8652137851C3C7FB40CB3647AD8B7B081B46C8A2587086426D48819AC1AE43C429954BB5F7F2227FD8058C18AD81203462C055ADD5045BF48CE22271C5A67E20ACC0EC93B182684E2B230C0E44C0688A2BA0A6BFB7D10C476B24719700C70A7EDEC0C6879345AA781B6B415FCFE4373F78BB33CC62A659B8286154073193894B6D8AE85284033082186478FC763231154518B1A8A59B1CBBB56A50A8F9C38223C5BFDA5C310A1C30F2569C4E179D4039331293CC18870E1D1B90E0008B29008FECF00152748FA9248B7D64491455044D86C6C3565AB4618233A2154BD277DD5067B2E6784DA94876D1BEC361869493542C470D7E58A7B6F9236E200D66CB16D70A6273E40C8C69C033CA8EBD7A2E5ACA69A5E0CAD2C352D0F36BC8A0B90A29B604EA0DD6A77FE9505E717A721849A0B435C08C66AA44E202015CAC90D364D1D83F21E5177A100A9E7855A5C5C0A4B46B388C58D256088E455D59016A4DF337C8A69827A399E2E9BCAAA7B11CE6440A7536D0BC544CDA12392340504088B8EC6CB737C3B1C0A11F9B83C049759D74BA44507C6881B1F98167720C0B35A095DB1A7659B52E38803935241766237E073B1D2C52BB5F4152AD80625E7C52352AA4EBD89820F4AD1DDC3944784A239A9F71B243AB50C1700BA6FE82A501B275DC3391EE30C022997F00F09D0F5FC8A9F5B02358F99511C32A582B24C0 +M = 135056EAAD8A28DEB1BE77EEA30CDEBC7B3DD89D1444DBAE145F39898256ADB3 +K = 3D14BBCD60FFC1EBB9E96EA5FB23A5A18BA6E370D092E2BA5E3232ACB5A5FF70 +C = 616b3a6e7767f785f9b7ad732021a327 + +EK = 11068DF3FB0ED1514D8B2B8F424C03B75995406482FC8AA24BA003886711E921832222367CB2C2EE87617A30A270B447D4A1BAA3377B83FAC80A7C8D779669C49C461B311DDA442FF10C9F2B9057225423BD119C68E34FA7A92DA2D36C58014A9076C391A451EBA75B5C92A2F14853845838D0DB502629B796703523C29575B4A5094C1BE329066BFB7AB6E17FD0163BE4E60E9D676FB970C68AE416897174D4577E0AA8BE0D234FBC80279FD724AD5925FAE2B478816CB07C165A335F1B27B030E7BA5CA40F610B0E07C82FA134812D9A4E083836B158231DEB7568B73A9B3C60780266BB550A36C7288A9387D1E4C904D79296088047F34F4E72A23A1720B7543FADC3821C6442F4B501E6894A6E25231437AAA7A04329A8CC6AC729B185781B8BC4D9142063E55A0F053FFF57CF93C5851C86714E872840A264E316C37CF90CE60960EC2B0F4D18418AC96E202C07EA61B2B1E6A430DC5DD1A18926E0BD88351B56434E26CB10268468D67B2D04FB2AE7C43C032675A2C88A3E704A7D110B4A544975616D694C9E6E243E3D546217471B14711505B945E87C0D39170E3AA71A0663062CF07FFD0C3952D526B662CAFCE429A35839D667C7F0090965CB1F87642D2A8C28A0A57B4FF539CBC3195A0B063F3966CDF41FB4D9451A84970B6B93E006342247BF5DF06B041A6A2B019C3FF93DFD39502E198F5587B358B39B640C7A71C43A31D711E9E5434B75AABC436531542F90730EC7FA6B72A3613BAA4C0579A245B06B979B22623C93D5CB6437D17A7E3302BA1CA5EA0533F02B1D481573C1C3AB05424900F1613B379707433D7089A316F52012B646B9A24A90F87584C36C1F58B891F5482B757F758A03E53B38F282C2700502984ABE9F1C2BA00376091021DB8A1ED27B01AB11B7F404B2C5FC9E0F8943BE434FA4135A4714507FA628F4027D0DBA912E0B3B096C057BE77506FB8BCF5A8EE6DA96CF335BE8C0555EE446DCB96DC2567348433E98D46C83319E3FE1624AF07AD838241C5CBC3C78C8493214447C8AD0D40DBF319057531FC456CFDEF999F9F280234A03C7437786B1469D705655D01EDE1A72BD0981978815086A0DE74B059BE879199A67C67BBCAAAA87201A1910F39B5D35670A9790DB3B5EFC798BD9EC46F2FA1E993110F180203BD1A7D3506B87325DDDD695211440F60CC1C5B7A947F42DB94ABF0C8C3B203A7038682DA9840BC8B50C4343A4D49AB89DE916CE72835AD4C7298B68BDB417EE999EFE7B20C6C99A0B36BACE2C35D7388DCECA369768463051B377CB57BC0B155B969EFAD615BF7B3AA1189702A7494CCBADB0266224FB5BA75189766771BD1B54FE1139E6C607C95A2DCC2462515C4C1981C931C6628202A1BAD941AB7667F89BBE94118568F0C5CC59914AB113AA4C9DC2787F92BA2E9DD7363D99CB7EF6AD2EB5C1B992670B5541B1BA9368E7986D4628AE96836018934FD100670260ED931BF9A47652B85C44F988B559A48B2007361A3E4FA88AB8CCCF94939D5F419861FCC617250C38DCBA082CA50035A196880540E50A0E1BB363E81B1FD158DCA79DFFFACEB2494712F28A52249A103C5FCF888D275A8BA3768BA0599F5FE1CF632B07F4120570EC5A3EF96CD3031A3425A0CF3A7E408337412288575C1A414A271149A2B115825D409A1C478980CCBB4B4B1C2AF675DB141A3CD12B0860318EC340B7D3C2C0521C57D5675864243AA55C517BAFDA7187A174C109CC1C65BA42AB5288EA23CBA8C286EF98479BBA0396106999C220CFD043C60C4B9610ACF0086AE9D883A0A89BDA5AB9993C1DDF82610B0A1C6D75093B207A72037E77E76CCB282F2A0C7A9149941F3A149EA18CA519C1800B392F48C3DB358EF1179498CC2DA8EB48180A99F1BA280012A324AC8DF3FC8B3D6859A0B4334980157994502C80C0AAD301F6E9311AE9C132889A3C26501678CFED55427F94B05B57404B4BACC7607E19E873D1902163B25C06BB3CEBBA5D403456C2CA26CBE27240ABC8B6A85E50762FFBCA34FF96C1525B2A35435A7CCA663B37C202931CC16039EBAB2D6E45BE1002023BE959F2568D4FDCADD8A1B6EDE529AB088D79DAB407D4791AB43FE5087E4A9CCEBFE02C0C44C3FA925B7294A92E928C29663D2854210D405ECA2C2E5032A3058C6FB2B381F5597FE98855CD09B73DDFB831B56551306BA4591ECF403545BA +M = 54E7B2E3305950EA570F823FE36A7999E419BB36181B5514860BED41F418EE77 +K = B45BA5490571D2DFAB9D9204398EE8F141A3FF5B415A2E2A8AA3391263992C82 +C = 236cef18fe35d3c6f6af06b8e3ba4413 + +EK = 4F4504922C38F9871EEABAB438D03555F272E9F9493F005F5F8CAF8A620F362A1D1B90A66289111D03929118CAF31B0AD9ECBB203017A02711BAD26B02310379C117F6F58257F6C6ED5A14BB32760D5A9EA062A9C106064D703BC9E378DF498B347075A7F6515787C500472BFACA0729A4590D39C291DCAB327C10BDCC6B1837883BC90B379B3C32F56C30F78C2A347EE0452FFE4878E2280608265931CC7E123768B0F93EB0081D642B4DC756210952541BB3BE08352CB983911F3B944671B759A16FB28C3883020892865E903045C84BA1E5E54159604AC058056C6153F738745140CB8B5ABE3318809651790EDC20CA5380CC76568DA5915C5AB8272748B42446EFAB58852C619332A08F537C28E93EC676345E0A2666708CB5D5281F981D3B8A19180565704808963B4015DC9B8C06905DA43680402E6B5888F2EC7448AA6578787EBF42329D060998E74B09C13D1C432A17F56D18BC624F02AC7ECB6235C42A24B42639FC490D07A635360932C71E25720EF59340F21836B74AB8F31C2CAC035AEFEA846210AD665A5D64616861F1CA3B963A2C10C662F7AC66298751AB3CE6A64C59770568B4B234129550702375D722AE4BBA5FD0899C84A834E7B7938627C9285912D346099423BA37B25364B67258A121650E895660C8E014A5B08D38B7AEC29175B424C234D2B87C791B60159AE753CB61D240DDD2814F1A7EB69A79AC37634850CBFBE2CCE6E918D1CCC70E13707732A6AB11329A3336D8E221531335BED560A468092CF690D1B8791F58993BEA001186AF5E48A2BE0B3D17656A3ED98BC3628C9F863A2C88C90AF25A11AB41FE7CADBB3C1013B59A115AB83F9003BE28759A3148706B891D9770961AC53D4C8B6CE5788ECA3F4A4A47D7F5165DC7B94B358591348BAD7B8CDA482B26F650DA1765A0911527260703E2CCC703A69F10331095BD3AB167DB52A3EC16B69F233862EA11AA9118FF539071A05066388A6DFA10BA4819D31A03B3980677CC6B888263D74007057C6C3C272464497A58681816C3C59E05064D147F62D5C848B8919C97C3BAC20A43CB58F8CA98EAB48B221851F634459B7AC514161A1C490B8B576A0FB2497A65006EA78F9ED50763A19F8D2C99D546642A68B6C2A49FFF919687E67EF0ECBCE23266114982FDF15F572A9519EC12CB90BDB3516E85E01106B9BA456738F4206F5F0C314156307F4CADC8983A91F730219C322A1602714849CD1B7DF5D02C24758DA6DA8FC8600CA2C1CF7294B1F6598D9E844625C29F589006C0875F3FB33EB357B7AAF0607BB31743153B98D64A8FC56DE56714D71303E9F6A3ED228961E607D6D6C0D4776828B7574A8CA28D837D24470E56F3A6CB6A4A90F5A9BA8A3F60576857E1C7AA52A16E1A84F7421EDF46C312BC83EE0776A9819DFA8B66FF2BB907A96F4D6228FF34ABC68248C1990C2484CBBC70745B045C602C1552B952FE8B4D24D027E1C65B3704945E507D09A9A6AA7000C1607A27591F606AC1D2C5CB55BBA149A15C4B261894EC9A9AB9C3DE446C1832744CF6BBBF949D54498319504BABACB8DFB15F90F66DA9E0B7F8B7A42A7B09C5E19DF58CAD8641C2DFAC77412B49D17A0C02341C6FB78DF00809903835518392D0288907184F126A69BA77863C84C1813835926311EA705433298D77AACA4DFC30CA218DAE405732841605840625E57D7CC3AEFCBA637CF8077ACBB9CBA0744E462D02F406ACB24E9A3C5CC5048337390E4EAA295F6831161CC7FED8938EC6287C8C08DCB0AAE66340C4A380B5B816B8110F3D190EB97C8457DCCB410739C48B8132A32C0CF59028962A8BD1B03F0229C908BE9D22C9AE65880E110977508595F6754776B4203AB1633870C4EACF7B3689A8D43F4C213FA839B7C0281D242452455A31F396BBBDC41D9C4C5F99960ECA0537DCDA3FC6405B139241EFFB20CFA05A739A43EBD39E2A516A6D136F78F43CC5E24C2335CBBBD7335DB820A235129F10C62D13C5013732214012B00C1383E670D5D37484850D2EA49E9E835A750C63BFCB2357E472A4406C6DD2990349987707CAAA1030D4206460848F3C988179E31A4334AEE89511AE4297A668A154270D963C7EB930CD3C35290C9585F428690F88721443757D793D9DF912680C21923138D119B777530A3FBB406E110F408199CFAE822AF8B67807B0181714C1EB366D2750DBA3CEE603 +M = F2C864FFBDC366EB96BC5F5FDE0D4B3348A07E861D9EBA90E70896F7FFCBD55E +K = 27CEEFAB9BC1F2050BE2874B3A81CF1148567A1E73A5DFE89C640C0C88F35580 +C = 53d62098d4514409a3dd5084da48bf20 + +EK = 44DB8BD3C4B5FE45CD408B054B878343261AB8F812BC75A953C8617582B10D789F7114A00E0166EBEBA0BA149370639BCF020197F82080BCBB9BDB49D15493114698079B7021C55CC275612D843FBFEB0F2B86CB659C6EED1CC5661B711621320A85B307C96F66C4C35C3081410045AF4B898C2C14B645AF9E0C9CFC03BE42DA4DB3A759E77B7D6894BF380991C3D4CB0D5B2CFFAAA08DF0085B8555228CA8E18672880C4F96E555F879C2CD6740960B94B6A60BE7557D2E230083D757DF76506311BEBF28C5496C00F338594AF41AA15566B24B004E60956AD09CCDB034B7C35BC5D550F52828007C1F85503AD86A9C811C440E6600B16CCD51EC098AE298042C128494A203D20BDB4789C4314C8D14543C9553954C9FC34C40912862500B2F3A5929471382D3531FC9767CAE6937D6E37D6AE18FE5B858BA968927201912782C6D436851C80E7AB0782FC5AC1D9C2F8CAC0D6C29148E220EB30909B2A43A4322B90E741C90C19AD52CBC1527CCC883209952A5A7C68E3E580BD987338BDC75FA84CDCAC3A0990246A7050E1022AF89C7165E45B32ED995A8C4B7FB28999E4CC2C79250DAB67119AC2C6B5B195526439E17A913F3BE3BE896E8023AE6A78AC00244B8EB2891CB5634955F908424C4B77BFDDA017D3B71909320CC53C4D4196E0C39701F8839711BCAE59BAB4B4908F5121B931777E17B331AFA5E955B5CD5840A734A41E35CC016C01407B02039B5064E97C24F4B9197091DE6AB22D0FC0459033EF7816D12596CCEDA120F534CE74571A4E668F5C1488C1503BC0354161BB651F673DA9019C9A83D9D97381E72CCBB1628F8F9A42039CFA07B1D67A1AC37407319360883539E7E060D32469CB9D87DE784439D2B453B77C158045F4BE5A96F090603963A18574FC027C0A0597D6A30B9235ACF5FD49619F47F7E8833D5D719B9F95825571B32C17B0B4AAE2DDB7EC0B14413E73EFA105EA308AAAAC76C2A257DD4A36407468802703787C4AF27D21EDD08108534AE994A1805AB5E6235B88AE7C6997374E50C1077F7702F809B092368F43A9CB2AB539FA104F5B23A4E69B9D46C4452208E3DCA58CC1045955784C82099EFB01ADB86CFEEFBA1EF3A43F16B7CDAE28A3E74C24B6648B8F20AB88088974B75BCC79E692C57501783F57434B7C2BCDE20B2E7129857EC9FC95452BACC9D96D89CB892C78CA07E790906A6FAB62CE170B63443CBC9BAD6F48B383050FB788270392F396C8CB8A73D4912115C41869D54AE1AE6173A34B6C3C91A5F6C39DA659268456E0B51389D7B05D4367C9F5C6CBD371E84EA9BEEB4C09DF9205296B9E947BD4E086A97760CCCDBA94A2108D02CC6544028E05A2FED297F32491042241EFC36A24F634DF3626A217ABA75882A050B7569318E8E00AE8A267EC0207CE9E8A524E1CE8F8CA117B0C77A680231F773B756152878363A9C38D93423C0378A60C8AAF8063BBD1484A3F37D055215A4403AB3C80DC9223D91165BC2D077C71A49093548D4A32922633258844193759D4DF26E1CE367C3229FECA492A9E7669ED4158CC08D9FF0C24027AE9759A517DACA6CD58090D5673C753101987B8914BD8B71C552D96DD093257A9313CBB757AE42860790AC70A593ED65A492078B6043B7B2AC4CC7D85A7145C6EE210C26D60906A5571AAC3EE71333155055381281A584A66C090252A3CA70D9AF09063F3DCC9BBF020715126122602AC9F9930D59669647CE64F356DA97A5C1740BB283781C2A10CB161BAB6B709CF9AC7C7911A23A9F4D6507537C497F3BA5CFE52AE9E34B1D9922669520DA2662BAA0282B33C5029145CC34B0FA9CCF201C6491E12646DB1D1548C0FBF6C7925C9670F4ABC84AB289958A26A9310ABA90CF8C41B39B7DC96673724CBF4BCC7754A71E3158B35214A8706652E11621635C5B6AEBAF64365497518D5D1B6635178E318569D23C50C3683CEEF593498037457C4494F03C7E92C055BABEB96C70EBBA20658787C1B27D6CBAB485741712F9169E3265E376A0241A36C0B2303F8865E6AA9D89213CA1F874E758A569E4055D70BB1B512C0845B933E470B1D9730B5024F520C8F2221B9D49836405525EC3864065BCA04A6AFDA11CC59A9BC28479D9D0B42B1B733E186D50B603CEDA34E8D283AB0939005B06815FD3531BAD6AA926F931C478F71A699A17741447FAAF6CF360D4C64098E9F1 +M = EF29D988D373C381541AC8723EB67C68CEDFB9DEC0FF2B40CDC763378B380C12 +K = 0CA16C93880B3BF4802D0EF7F03E5C192440CC4B399E9A55637F1E6AE6DB225E +C = 7805d8d89ac6eecff5b9999fc7fd4de1 + +EK = E2C18353FB0F024A0E05FC7F0F14B49A9A36CB49CE7EB963A2C20A5228B0B6ECA4AF63A1F7B1B8260B64D2F2C0718397F4F402A0946C9DE5B0F083B57903418C30BD7CC321574531B2163DDDF23A69B04B1D393C5916280DC11485FAC369D0AD1C85656D4A6A7BA480FA5ACC1788AC37C9706C26A357D7821D636078FC2204530C3D3358DA002F3136CF033443C519B6C505D00FE92B04A305A890267B238882EA9010554A1671862BE8097B67B8E8A37E8F0A5C96F94FBE296162AB1FA456785550AEE6B05A80554606B76714AA91C5E7B747A2005900077874CBD91970111C800C49CF05A4332570863929497AD6617D1B5614F2670390574F554C7D337417C792FF8953143638F60A7BF9517890D56D02039AD30392DEB045D8CC4994274E5CF83B702784637C6D53284F4F14C15335A86A642427E589AA454C6FB9707155BE23745FEAD04EC1CB07DA341F7FF1B6D17C315BC3282634A39C9104392B1D12222E8D091AAC69CD5A72276B01BE22FC3C634B41AB613DDC602EAAA00A72478D713C7A0F895880224CA8489E6860868A7B72CF876FDDB230C55C0523342C5F42B0A533A8FEB798D3104145E27D29CC96D54301D5B07274F700B9201555430D8EB961AA7C3307B0B56B479BCB6147D9035D786A58E7199F6BC9335918204A345826446A50801603EAC992E93FB104B834D7220B1494FAA2CB1A59650B00AAB00AA15F6909DFA969DED0B540648830360ED052661557280683084B93B746E27D916A05C96CB73964A4AE15CEBF4C84A1528506A69D2FC27A2A16CF270A09654A8B566651D097C61079A859171BDFD35262116479742DF74C0845D596FB83984F27811FF81CEEE0C37D618B93321A7DF0C0D22124CF521D92715EA7DBA1DD6112E9152CE2E15FED4769805A5857896EDAE13854648AC9DC26B770109372929FA511B573685D7951ACF21BDEBBC97D384D454B5625059A7EB8034FB4533F55B897B77930F3911F2808F54944CFB96BC0CC5AEDB8960A9C024984CDE756441C6381B3E38909DB3E85A36408C5414B471A68093B188134B3F54C751061093C4DEEF54891039AD71A74134806C7F102CDE67432D37DDDB4ABF33987A2AA47634C80260B5A246758102C864B2B40613C42425313855897FCC835C7C587B007C94760AF26A1531CEC874B9C492F4AA4C97567D6A61C21EB00FC52B1E0F24E9D680F8FE38B82243FD0B562C0DC86E2024593562B4AF4A682ACBE720813859B92A9C20DEEE4B4FFA1A1B17A24C394455077450B4C2CCE67A0E5C4016C746FF508A1DF89A5BE2A2A7B866ACA0A72A603843949909CD16DA542068604A380741C32E986366749CDD461A4362401CB8243613A2C442983B52C681A3CFC362FEDB337910668C5732906C41637778BFA619D502640545715F709C31B506534C0216790779EFC053B4A7789662B989A75C6580754A92588A30617E960C714171C8310A2802092261A85A5C882D407AE263A119B3E68E3BE158BB0325C30026BAB21D30B09637A54FA0A4B980DF807048F139223D33CCF206FC68672113A55E2084B6700B396F68873636DD8E5479BC0CA3E47B52329BD7F20681D5C2208AC0DE2123D50F6023A4472B0300CB3F8865BF7B49374AF01B002C4087BDAF4CAAE4336AA3A78E3856DC408B04E9AAAE77C464351C97938CAE829171BF724A8779C7FE20E5FC254D0BC283B773C2DFC83D28C3E854140A81267C2D2C67F361DFAF623D817B1655CA8A626A8A91BB088F539576C8795CC8A53044FF547B328377F4D17273AC323E6481CBFA058CCC456741057F1F668CAC51F34D666AEDCC176382037C674B4793104A4BF6B336E3D59A1C43958FD827493CB956C046025737B7FC0A3C2098BAB916E397191BEF5CC13F3BA0FD98F7A25BE0CCB113EE081B9AC808E2C728801C70CFBB2BD9A34469C064EA07952BA0D579380F7E782D0D5C6E1C26F3E17619CD47D4BA88C61600721BC2AB3C50F591988CCD77AFD3C43655272565401AD0778671939636C8BC24C794FB73EFFB99232503A0B50030A672CC8C2C0FDD5CD43B131DF0C9B9F867039E2A2B41B3CFB1A82C983AC54E002388692AD885C676AC2D7D0C5645B06A2684E9463AAAFEBC6C07709DC68078F7BCA36F5584579C3E3261D319A58392518ED507ED54ABFCA95CCDDB6C74949DCA48D01DBE3525A0BD91AC78428D5A930A5 +M = 3D6441A62F1998E2B5B9B1E73A9A5022FD005778204977F66F7A5FCEAF17E30E +K = 0CB1CD5F942305DFEEC6F10D2138621F61283C5A87EE1C5205D3BEC21D9E5489 +C = d911afa07637e355295aa8f58806e41c + +EK = 53EA0623859BC606082104996B5CC3FF292846658A17D60CEFF78B4EE37FD693876084A46A9A8337B61079705D2269BFE7486161E3370FC7492B92C666A889962B7450B15993C027051B8F0ABBAC66EB2024F6CBB63868D6389F39E580E05A357E5179367A48D5E00F03503C0E4C11EF5758B05C8B61AA51B3019C5CB017DEE224685035651703D0C5877414846C30A20DFC25B6E8AA76D98AC95534D1CA8A7E9177C57B2B46A0237B8B678BF889221C64C1882B7196AEFCB8056E0CAB1AFB0E50D467F09A9733960C4BDB5AEA3C9F0447B8A7198AF5D6A9DFA6785ADA30456B843F84CEDFC6761CE507B85A3715C3CC53409972D28E8F2A1E9EDC9DC3A368E2257A57373C967CCCF8002B5AC3C762E8C3B9B607C7451A9DD28F06472F3B4503C1A31A276727958210810716F53A8578FC76CFDAA35CB757BF069CC8429A9DB9C4F5B1602315882F11C83C260720A11FD6D01FB94171588539C5328E951B1E7F5605B4557F5A476430456A33572B60161A43A18A3780516D232F8B87B5E821081B109A39DAA7D74396B8213B37D314DE258B3FF0934FB27C276A913A337051E038EEE78542D78C8A04051A76A3BCA319BBDB99D3FA87FC9A03AADB8D0561B77C394D2F60A84B096D873BAAE7342378D8513E8B8B13DC6AC9E285966CB2E53521E4928465841ED7CA8F76B56BAC958E011C6CB751A4F7D788DC73CDE1F67A24EA9CAC41A0676C11B3D618386465C7557FB0BBB7A3441497764C9D898313A2ADF59983E0B2031BF7364EF0C25E347D2EF1111F29B8509085264C9D366970FE8CC19293AE8407602A21001391A51C609C7184C8FC0267E683C6FB83B0EE66B6EC1C930B1A5D60C108EDB646841415EDC5CCAE32CD8581BC48E58E8598285A4B31F805A56E395556B120B2DA591D3985B4D7C50ACB1D5DD12617343F9FBC9854250500C03725B010D45361C3DC745648CF337774AFE704EECAB4DEB9746104566C8CB0DC512A06E198CF04A8DF13AB6966AF12D552F3B6BA72A266625749D6AA30D1DC9DE8DC26870C317C9C26324A265787635E2CAC1922057916A425872C48E29C39AA4C06E24A462161C20ACFA6B458F56012B3A828300570F9EB92ABB3400691C8E76BBC1D3B36E6254E771130B555A68CA05A3A8112051CB10A2A3B0F547A11E53D803970E671B0E85C146BE1AB47F63AC46439F1C7AF41326DAAC72AB1274CC6D0AA3291C0C2843229B820E3C7B0B3B600EE72AF71671FA875CBA59782221781F3338F45B1466D60C31F6189F2D29C1F427D440B3560C11CEBBA7B0E298D2B270FB6D21DDEB30990271F15A3947B464802062851984AF1DCCC5A7083FE7C81A454A03AA9674D98CCDE10A76B3C696802347E519156F977CDA5923D73656A0081A26320C6CA7E1AD7A12362176D9A18AA75356E147FE3278C911070D2D61111B87FBBCCA67B991E5915196994034CC83246C024F27C1C62353E79290C26552DD52A57F19ACE5C006BF7774CD6C07BAED7696D61C51C8108C42237D8F4846BD4891AC44605D93F8EC03DE607456555365212C35D59B7FB267BE713CA43502BF3045CC2400C11A571C8468093F499C7E46D34C9A75602782BA606AE67A5D3C50D31CA5FD6E3B963FB7650DC5BB312BC35F67650E4B12B780D4B6680F640372A99C90433A7AA388AE8043DC5E9AB6105CC6FD91E61F35CBA99CA39E979256A1700AA9373AC14F282B71ECC419417984AC34677F0A83386B91028B4B7ACAC22C57908AA9F04F878E7B6420132A47AB5A1BF5A30116A6E59B6157E4228BFF499CEB59A09276B5D398B6A8677E725725D5C54809097833CA7E6136EC994AEFFE00C87F6845F20BF76C2A348E08C3895277AA082B84202229B7698924B4D5684E8C8AB81B34B87CA28D3E95FFF82B5DDA9BA9172076D937B6D02745DB7C1F77B3B3C795872CA728EC36029DA80353310D4A50CDDAB29E1381FC20AC97F48920A445F566C390206C6183666B2523B6A43BFC3E077CC0C422C1C91176C50B34C419AB4C97D640F1FB913B760685B64126725C7527A313A454D5F683B23828965067943E12BF633411B7B8C71F648E4FCCBD2A1262FD350A66CCAF2FB1D9CD66515C52E1BDB1478726426C84022F60A6DC61F7CA2B33A60957BC50B4E248DA86071FDF8080E7801F81199A9FB0C5888643D8192ABA9DA4D73869D884AA2A7E0727231D4FD +M = 637B7A1B57EB76C50417601EB71269E050008F415DF974C07BEF46CEFD08368E +K = 12266ADDBCC27B282DC0566CCE7473F4D705D1DB4B3D82130AE29C3999C6A999 +C = 432d4ca7c3e1cf2dbbd77722010f51d5 + +EK = 51F74568AA5F4A54B2F4C9CFBC7666B7075A9D65A016416A49F16EC0CA716B75A3D80609FAAB06DFE69661706013A0C5FB7AB0340CC1BA72C2D7E1635B33B0EC3B29FEB369CEF671BFB907B3A2219B1554151A62B43638C635219F86B792B18527D8CFF00BB24853A5A6B81C9BB77790B25BA8A71A7CF7231A9007EB8B50F586139279CACCACCA4C7C64EDEAA194768D6A33BDFC42218EB279FD111E1C9633307AA30830B161D93F13973BDBB3772FA57309E36880816F97DB8E7E6411CC569A578A5C6F62AA33C2354CDC15D2065451E1ACC212ADBDE104F094378ED8882BFA416B1C55BBBC20C1E5AC89892B0CBA2B54516937E781F7A4A9B1802876598FF95832F6478ABEA33362A40EE28AA957E74540129D6FF3BCC0114A4AC8A40AD30BBDDA2BFD2BC5A6CB4DE5978F9AAB64CC8659A5765AB11AC3A654A247165253C81065359E070921188A312805417FA149D335ABE8404293329C73DA1E2E43CBF9B22B0D84339F792C9FC97006345FE6DB931AD71F897878B4318073B9A64400B5B4D0C4D6FB57E8B511743859D8E873B9C5052578282F9A6362172014089F2993BA7FCC2444FB185EF055D9D6A0EB564D5E4667E537AC9B49AD1241950140B188F4C88CD6A241BC42122A3DD7720E6E6B214D2721BDFB9358E7026F1A024132CBD0BB0EDFD83552F271B151099CE55D783C88B29A578B2943E3809A68D268DF746557435B5EE1597CCB58446403B98C88DF38399CE58BCDA1CD00462B9D933A83546526BB9E5C887050F5109090600CE84072DBAFAED20D137A7D129ACCDF1712C94098267148C0B1A301DC618D684152C817F27B3E8AF83F91951347C633C7921804D853A2E66C948143DF1B3C15B201EEA56E764273CF50AA58B45E71950FFD32C69B079564C48B08A43857E09FC33B8222A3852A055E3E4CA7B72B190E6C8B557AAB84D7BD138CA148330B75AB5FEAB8419A55938771053A5B09261CB0D4A42575E72F8F505D77F0896780CCF589376D5A651E4008CF600972008540A0896F80C17BFC78E16B64956677CBF864683735A279B966A4A906B1972AE4875BFC81EEFB75248B72E3A3768EB56D2DC3C04921011F4A92FDCC8EC9347353FA0055CAB83B7465D221B877A70B59715A6075799C19C8818595E6D478D659C7F9155A841B28EC751866CA3C2A829D43467E12563F5A4154947581D4B4ACD827B3315B44B3E31BEE0C04E9C03D1A186AAA7438EA9AA15FCA83D26B79A2093CC4505051B31F3D563832F397C8671516648AE92108A8E149392209A04816EFA1207CF854FA655538C161F6561274E5154D89A223665FC285B6D3A45A2F38278DA7B5055BAF8B1A052196C2547C3BACE09CFBA1299071635510ADDE3898C4C20E4F8034B454BFCD0CA262812D43C4A8660A5B2CA42E2FFA7AAB513DFCBC437077609596A45FE8BF330741A88A5FFD20AE19B58C3B19774A047F563AC6CF0A205A2A4C1D6641F93AB4C0F39E6BB51032F0A12B8A45E900954BB3A4379129E44918998A50454050607101BDE2975E66C0AE2436664B15850294FBC985B638C8303767DB7A10A8A74D5AEA0EE2B6105112525890C6D5A8CD1712A2913B73C386C450F7286F4A8ED7284AD9F36A22494E51D43950526B19766E388AAD84A39391399628F9C251D4C784AC2AD0424FC57BBEC391A549D59E5638A8056929203BB8F9A44A27117B28BA2670508680D55B82B4CA8E523BEF1AC4CFE83511B920309A735C62CDD5151338C50D104950C9273263E8250488135240A949958090F06BD46B5AAA3035CF9B7308C09952B66AB5999EC6E6BE7A027964249D63D1817F430737C96F54B391EB44640959277B56B495C49F482B829F97B94FF8B4F0E347A9B6BB83E9AC6617000694AF0C7AA13A273BE2981286ABC62444AA16FC043CE4B1B4F50437C9503F815772A8BFBF6B229D48B75D94BC02219E0F71BA020C37169B42CDC1A88081B7846C3636F3598630B314D809AAD1B7F3D335B41468C019C2C061240BE39325D34DDE9C24FD29CB3ED62F815C248F4B6E8D3908FA3B9C8AB1534AE49176652DB909059402128F18C0C9E52DED217C7CA864E378CB59711B0C764B96F13EC5E3766297C9B303806C685F4A861878CA8415D60B057814E554B04F49C3DF9AAC26A5CDCEC91B59F32BED063E299ACD431F8B781FBC1AB90AE6AD004FFA864E0E16AB57 +M = B5C84B4535CC622A5D6B93229BCE68789D3014D500D3263B6E0F54359D20ECE8 +K = EBEFAF52036034E249B29A1825226DBF469C492494E9C4F13BD1010B963E0D4C +C = dc5696dd1dd7eff702952417255098d5 + +EK = 10971ED51709D256CAD9B57F0E48850C4B803642732C89A84439CD31C6B0F045915090168F8952B3382BF1186A56D2CBC102898F112FD91A2BE5AB0391A67C3C5255CEC88FACF3B6ABD427E3A410ED22C2C6C173F4894E9BF20CA3713CF0E8506846507BC762047715A7A37DA3A5730D8A1556560609E4CCB61298C4B2BEC374B534D0B266C427088816E843B118FA9CB27B9D1F549480F98F7F4B5AE71BA376B0B9180A157D8128D2286C4B5BC54F8590852B5CDDC5C11E6B4B36EC7CD6081D45A9C50272643CF0569A9A237581AD36D0705C004091F7C46D9073739226EFBCBAD5B551680C86E4290C3CA1AA756851A380ACFC033FBDAAC5B82C364DB075633A9A10B8137A05B29863AD1DA1CAEF5ACD2D75A9643B495EBBC184038B58B9A95998AA95B672A2D15CB78B0A00E386F433425C469A7677B8569CAC8F5A3A035C777B4570BAE1898FD379ABA62C960024E55645CA6625327457A37A92FBD68C76E79528D3B9E3E8917F93B5774B9A7DC44AE416006D8955895B6C611814C99432F683C67C09C354B97DA3CB0DB93841991B764C9A08EB26B9BFA96EBB39027D6399AD2688AC047360A7989BAC587FBA7DA76153360298A3D67FE73C983E4563F67207E1B835B7DC7CC9CC3372E12DB6EC759B86A684702D2B6CC805726DCB04AEFBDA224C02405635040EF60FD799A906116410A6C5EFD587BF1778CEDA4CB0152A272B89E43017B40C9B974600F03908EC397556E8AA7271828C049F895753E7BA96569A280CA15F5A82CC1F6121B6F7AEB214C726B1C64F7A958DB7459D4A30E4599A71FAB28D5196288A443D6C35C4AA27DF674EF6B4B72FC6485A31410457C182304538424A7501A7D62086910ABE0C54CC752B5E8E87039E64233EF5B837C3B50286172DE5C9CEB92C9A0BBDE4E7B14A0419DC6AA03F655592D25DF4A6191EDB8545351B2D89A7FA89826988657763A93EB71F8832B159E690B95C04DF37A2C9024451A18088A1C801B40A601AAAA6EB692E229817D8A390BB2474A95A7131C84D1745272A289C84BC2742CA1097A610D8A90F2C609651AAF5D0414C3C3FB3D37AD8CA382C9980A52539BFF73FCDE029FEAB0F184A7EDE4C7142478253C84EA5D7B6DB963ABC39A6B5BC29D43BAA24B4B26C7C53DE096E85E945310A484F591AAEAB48BEF98353C17EEB457E7D0719247A62EA85400B23491CB65932200F74EAAD3DF7184A54654C7B6DC931B574A2A55C7679F15C5944191A58D2A5B24674FD80452B22ABB7305501D9A156D0C48C656A35540FCBD43F14F531557BB9E8A3A710C000AF227FC6878AD28A708A34320191A236B38E64F3C4E705555DFC1FA3A144D8E6A122F7C5F557462579765A017AAF4A814E6B1201CC4E8D0757C378198A5798D3A59186A54FF158A451C42564B4659E0A35BE734600210A68F8A64E3951E849CB1062BCD6335970005B1B69C3A4845226A2C0834C1A467C6A799609CB870C7370C39265C0015BCE968419EC7C58464CB518550338B6807A97528FB34D1011A67F15B06C1BCD7B5909047136702C9AE604B927F28B8918CDC6F07A5D60B38BF7CFF2EAAE3C075D1579A30A76093B7A6DB44AB21A722F818861480129ED03B1FEFCC2607B5A1D5BA6ECB91B75B9810F991DC55823333A927AC13C3C297EBE02A27B949F47CC70A2266FDC76B5B55468A6B98D33955BAB3418F2D3C1D206C29EBB05E97811EC140307F9347255381AE152113C2ED2A7C1812A93FBC67ABFC1C1233B864AFC4B34B9CD30358990F51477911D6C68338A9857335B9152C5302F32BD5602A9ED97892F14951F111CA2B607DC46CFE6297D0A41BEE369CB3EB941FC2701104713A1784D6DE88948032AC78251328A8C58311848EA02008669B4BC811D6232A859756B306F24607DFD812DE89A0A6A00304FE795DD1C4A55366E615957855ABE11D97C7BE95A43A757948C5F4C046E9DF6A70674541B20010837307443444C27AD36C431F1F372EA659EB0693447FA5C40E8A38A7472D4A1BB0180433585B0CEF74650733CD90094199ABDFC1392E24C6D1C74408D00AE27F05D1729433A90AD9BD22F1B6C8155F68BAD1307811770A749A85F060E74625893462CCD946E2C1B79B6CB3CEF971899AB29F4328CE29313E4794C3463AEA46106D9CB82B5EC39D83D27C4CB3B69DAFA2E955D002E61C3E7BB247A76042FFEEE7E +M = FCB46FB66E388182DF6149F60DBD0FCA88D1BB1A9866A2C97B84848531230B48 +K = 77A12A7C2BCCD4700A35BF559EB1B8062628C5F7D540F2FB50A99516A11F639D +C = e95d323d562125f52ec787ede91ad0a7 + +EK = 54B452960A93BBC12032E0507F7B83F112BA14CAC4A733700AF288D6DC0918C2B3D1625F475083E7967ED8A708B2B147D50658E1881DA6501D6AC6B7EF5AA4EAA5A7AB85844E3994E44A5431145A873834EB88A177400E95ABA99FCBA079914074209E06E17CED04636AB4ABD7824B98DB2A35215D5FEC091D5428B2928B809AA94C57694B2B65DE050817D6AD7326687E9A68695151F60A9B1502789AB8017760A6F3E7029B5074CBA929765B5C1DA8217C1105535699FC59195ED3A0E8799C66E3264F692C8DA198082860793446FD0536EA0301F5104AA689CC0263633F7A436621864099AF9C108D882043467B4888922D2254CFE8F937DCE040AC5B8641102959A90539F5177E21AF7AEBAEA2D9731AC87150A52068A71C183B8F4BE312A033719EA12E2CB8A197C1BA28B093E50437FF9779F0377BF5698557B9A45BBB7C8ED1AED0D982D71993F80CC5E7F16330D142BD0AC602F42DF89391156CCF1621AEAEB95701933A3CA82487E057FD186199BB5F4E2341D91A1D5B753B53E3719F65CBF0B3AE33153461459708B6B6E1131C9573C7B0CBCDF3A1C8ADA919D09C020FE6648221CE7AD35AB37C16010A3CAB1251B5930EC69C1728CA45E6639E97626A09469A6E204386E6A458D35E58ABCBE5C279BF79BA85021DEA6B6DE6E9A802198B969560F2C8C99328C5427207623C03E68181851401BDD615E2263761DAA3D0D16324FCAC9FF98E85ECA88FE668526501AF4C135F259277202E96D56F91C07D86692C91FC14187B99F1847EF11AB06CC019EA89AA88E114C034608C03A77280BC1B96307F81531009278193BBD1F5ADD812B278796309102CC2CAA9CF8C127472C4C63B47015CB852798379C73D0C4517E985ADC6F60E49053CB2B5BEDE0230A9E9A138C44178489EC5D5C2F069B737A143D6802454647C1B8C0837B43A89C879A0656CF087C733B7A1A7D153E092AAF193B6334A729B2B9F64D311090B29BDBBC5F1CA5E054461EEF72CAB14580B505BED3543ED15B02E33AD2A63B6EF980C407998AA5C357705B047D1848B4CB551845D3FE9A2BD491AD8E60308D880D6C56607F4AD24616845F092FCAC559CDCAA6FB16F2BB19475B700BC16C8FA8526055333EF389F6983C105E879FB4738166A1705BB625412B847553C462145A13175C60820783998150C40A2F673A3117FE1778A0A4A75F37BAC7D8A6C9690870D6874D2650182FC51C003698FD164BF5314FE3A4FA291BDD9EC3920F5A656000BA05A8F6CB020EE4701E8D8AB8BFC8DBA31887E65C7E403BFB036BCCF3C281ECABDAEC3984FB87D1C97C1F1112F8252C31A986941A50107D40EC6CC67E6E20F446C598832061BA21212E37943359B6B005621BB275235AAD581985168C468E15BF6C56C9AB65C7574B44FD83A32ABA5CA9831A6769135FA9916E3729361CF0D1142610C9A98363ED6642B853461C062C7D0B9B5F70694C8D4C2F073AE788A9CCA13446CD6BE40C82478E338C5DC34CCFB538451B6F94877A4B56B5AE6B3136B9BAFA1CCCC4902585907331C1F4811602716A5EAC209953B75A3B30EFD1B4E42F716B37A2F79E2C8ED062B1F79976C010EDFE4838929589A90B0A0ABB3E41CC8AA974C4C1308C4E12FE2D24162738A3811070D796701929C12E9A94FA96A823B6903498C4862732D48122D0265B0E571F0B4C43C62015F422753B2A562A80D68F19E2637581AD77592B67AC785B923AACD631A0B53D375E911797C0B76C79C53161015DFA7A67D1485C21A5B039A609F7386F8AC339B962472907D48F753314155C78A3DCF2010B1880C48196C0CD3B38B79BA9243CCB4AB5DF9D4569EC11F2F88525082B1C2224573C94FE3D24927B7AFF7E44B27755A0DA4C8053A7B8876AF4F809C22205B710B43C4D8B046CBB562B2BEED1C27CE736BDEA5317B658139509E4737C52A77186666947F7796D4261FAA8B9767814B7D096856A272BF6572B4998D2F6128D3FC6AA0FB2B66486A578B984C8835D1223D9E446AE6752D355A0FA09379F108ADD50683AD57AE731942C4F9C938464EB95C4D08264456F565E5981625FC75260496D05610CEBA5A751560059C38A8E2809609BAC2C853B819A781F61A7AF0C6FD728D9DB2C5623521D762440568272DD8831A4AA1B2F4CC8016BC53964CD7D3262D93710C56033B0F515A7B9E0AD3D6CBF0049DF4E55FD931257F +M = 4CED177C0A454052BCBD682B39BEA31D0D219A73184BC00C100964C25BD106D3 +K = 80376EC749550B531BC5CB538F78FAB38342C7DCD74B83FD83CD058227B9B3BD +C = db06fdead50de496fed0e5b4ab0422ae + +EK = C701BA88063589288E73E4BE1AB28C6E3ABB70AAA03F656AE87B38A9EC947786A41D722EC63C0E9E8C1DDA078E28608D11E84219E35239D8030C212F34CC284EEC748D34C6CAB04A7F3C15A5DBA8C74C8666167CA4508EB47774A7C3BCD6589306FC6365D74018D2082DE1753A854EC6FA7813431D31C6A3FA711E03F042E6251E2E27787BEC65AA8CA47FEB5662599083E6944F442716342DF25AA551C36643EC3B9598184431405C8C8EB4AC8360E1789A06B2D13232E831C39A005881273B0086591760AE8A20913D942314F45BA5094AAAA05444469D12C20566B0C008CB2C5FB90257929DCB648E0D616001095309E00FE19235DD29B1EFC2A80E1402E851CD19D2BE9B4001ED214E418C156BB6BB85C0744C3B81AFEA59BBF055C8046386B576BDD009CB412D13B3918B19A658C690726BC93D4928F1B2A7C386320D41BE98C1AECFB75288B94511113B902489FFF157DEF97D762A5302B89AD18546F5C9262C06C98F62632681859D132F756A7008B76CD92C760BB12EB276BC5611B5A1F20A22982AB7616F8802136F54815D66BDF87859C7A79F29769AB4CA735181557AEB9D76468D8855302D4A5E9CC171DC6000C7363789C3A76E59905EF5686C31C765541131E62120399B16CAB27A4677C8E36150E728CE747D2C2B305CB780250CBB1282044B5443DB128695F4A6637102ED3469E3548592D3BE83FB30FDCAB034C1499F69ABDD174E82041FA4CB9B25773BAFCB071BAC2394B6B9E3D5446289A8E08339D91BC12E84ABEE2BA51A563E1DD154E075CC33409609835A8345C86EF96B31F28E3B42ACEAB464380413F475B00CA904E958CB260B186E3C5CFC6068914638AE831D8AA78BEE7B65B9233F8950783973C4971AB0C3BC9F7A7A5176083B4B9B1C045157738C460F77A6D9311A3591789DB0BDE85C3A863594DE182D789A7244E05FA05965A4294FDEB2AF843CAB9F273687E3487C4756B0D441303C9C8B6284733652F074B087288F6BB08AEFA990517C08E9E984A4029FA1C420FCB19FAA78B61C35B4DBA021889826108A1A95A6816DCAA08D535C77959C7EB20209307996592E94DA842A52C329E3625CECC6A8624EDDF7B77C2264933B7B263499AD0930F539C0F24A14A157A56AA469891403BEA0A3531CCFF5A217282652B027513C05D03FE142DD14BD85755507473AC91767C69CBDDDA71CAF8A12A611C0F7F50CEBE87BE9D88514611A9516A6433B8FCBA54527FA10532A808E57979E73C8EB444DB3404D4888370A419E1AB04760617AA0E66BB2E715FB17036D300D9F3480D691450BF0571F875EDFA668D68B16D426668A68BE91F1337AD15577375477045633984AEE80824A08C486F25443E61B47658D03A21A51B085C656664B8345C1149CF690A9B99543B9E98CD090CC4B57C5A1D7BDE6E256E2059B20752E44331486515083DA5A99697A47A342BCD9679C77C6A243896B05CDED231919D0448994ACEC094E082A7434C9A3F6B97F21056CD827AB2648613B3B95CA065E1B3CC3740BC7F4F156650A722FF26D70E5276F53267CCCA11513A719624A2F1BB99677B845A436C9AA3A2D1202F1094F9040813B26BA6DA05E904206DC33A665959228B62BD9391133AB21B79967AF31CA0C727B464A8737535973042831FB06A0B89CA65B6DF8F3983037957DC838CFE0C65D7791D3148A3FB59656472BFBBC8AFC7C6EBBCB6BD83B6760643425FA72FE343DEE61187A73C98B9000E2577990F9109A8B1DAF30BF384227D45BB8BD4CABFA4A9CB20B0B81152BB46281A68445F7F78AA56545B59C75E9852912870373B1CCBB14396EDC70C2C00896762A129B775B4B9168C97F9A259FC22219DDB0CAD614C4F06030140A1F335B033AA2A1753CA5E2A2ACBBA83A3CD65978686FDB8959B4F39CF41B98EFD2048241B69B27AFBD142FD5046AF69AA3EBF67ED1632C4683B88C6BB7B388B4A4D7178A8ABEDF1523A6816F10C40065056DC9393D21F76A48EB7C122331900406D960A4D46C9EF12429B8E4C45C4032F089458818C759584947F6415D1468A6436E764CC86E725A936000B242155CA0A9B884B69490CBD223C76FBA954319161748706CE5A31FB067C20663F443B885E4C5C1A421D589777AA4C13555432AF00B27571D8217B09AD4BC9732C8ED10BB8841315539DA5DD99F9A7FACC71557853FA10547CF7B89E98345 +M = F594FE1E810814496BC73A1523FA1E0FF207AD5F5F0FD4B232C25EB9F6EB5B1C +K = E941F064338BCC6AC1F7679881709DDEBD2A94AAF087EA9FB5021838DACC8E72 +C = 0e8771cf83f84381a2a48dde6288fc01 + +EK = 24155F435909068A815A6853C9F17BD928B0B7891B83F4447C2C5213760678D74FDA8C793C071002040EF4D81BCF676483B85D2AC796F964C9B4F8B7EF77656FA2976BFA65B9E6AFB7811903E114D3060A1A967A1465C512D2C1513863A548A787279E81674FFD45BCBD7C398D567F22D7291F50324D45C9A2FB26DE3A7A7CB875058979FCF4BF19A03A8A721F17E514773A83FA0A939393ADE55CC7176AC984CB43C7092DC2D0A55DEA11F3E41B879B5B52984BE72158B08BC0EDF25866563A56D4B98DF9528FFB28BF345C4D136EA84791DAE11ED324AB279C6C8983AF725818829CCE05770AC3837A2C92AE2B1812D143032C72A32C94C2A06882ECE2CB73C0C41EDA64B607BDBFD9258E03A013B9CB3BBC5C40FB10CE413B11897E81D32585240851E487877C4D5274C6CCD45CDE88978994CF463111A20BBA9905A6114899BDBAAB1053541BB3502D9779DCB48FC8E523FA260F8582B6B8F30232342848492DAB73197EC492407ACDB52844033C9ACBC79C366A4583D98585942B05281328659506D714FF856A9C2B5F370B5136F896BCB87A23331AD0A7610FB69515E84A0A302407FB9949ECCFD91550A8618049A48BA2F4096567A0D383BDEDC705645C4025E0B139C22E6A16023062901B8A2B6B515DC8E06A4D5514489229D926521942BE150B96F2486CB34B09D7E7237A440588C357CE061DFDE1362DF1C2E58C1E1D72235E922B61EB2163D906B5E051BC58497C7CAAF5363724985D0FB3BAE964A86AB36EC46AA3D7AA290B428744623A3DF900DE975E3AFCCCA539837BD897F12CC555D684E34BBB3CD7041FCB2004A687B5E6A3E801CFE9C8C2815C2AC4783042A23736137447337D9221116A62C0E1D8C191B53E22C92A71A15D9D22505FA5BE17221A7236392C0348562216BCB037D4880A6D1236D3626E1B354142B5C897C646BD62CE000C27C53991A1C69176D03A16A61FCA51067C596CF01B89933A258B43C22F489AC70C1D8658B2C0FB2D3A6924A704302F33C25BDB556E97780747CF652C80E87B23479AB2C8119DFCEC47265A4F7D524E50294C826AC4C7B39C3C0782763A1A6ABABB9E14903720A9380939FDC9A99C6766C9D8B2828881BAFA555A35022A23A6F57CCA446319E71780AFB3767E9311D5C990F1E4ABDFF51A0E7238AA98AC412C05356583B05C170BF793CE770F79F81E99F78FD46310EEE27F614226F42367319C81C98A1FE2B2C09F886ED827610C8621B079A5A51863BB69ABC01C4A75051B50D83D1AF85B89F6918313AE5AB0999035088813102BEA06CBCB14656928DCD53A30255B4931017BBC4682CBA54378CB7E118A275728B83A4BD2586D271A8F64C06562248CCAD9A1FFB8265512712D0B707424B015157788318C7086BD964490A11A35FA43BED6ECC533E07D2A6ACC806990072A7DC0322573D6B88E29A7B47CC42508C7CCE64AD436AAE0160309E6922B655FD3B96FEC22CFC7349A746A0012D60A88C17D7934246EA0290369B3F7783FB177534F300BBED06EDCA87786D5175B93239B115254D676C921C1E5C3BA42737AD51B4BA30B1E65A8B59EB6A45C34950E9AABB7E5CD2F556485036BEF93CEAFBA97E83408D61C6FEEB908873B7FCBE93D7E386F2563CB4A80A671A1155762A02968622CE9163284777A3B4AF4B8858392BDEB9446BF59CEDEB689C609859C9B47561A8B39A19F7B36896DE82AF89BC41CE6C54791A78D6258534AB7090C502CE0A6F70CB3DB442A9DCA58E766A2E72286B42BB431B4740B125C73D43F49C1994761A57E3291CE95A2F4B88B3DA31CA994685A75B71CC622B3C2BEF60C222696C031789EFA1A3DBDA576EC1B802C261D1F44A5E4B973AB73946E41159D622BD8A0833396517DD2C51904AB67F05BF5FCBF9B47BF05A18DA600C1AA411B60901096838A5CBB8EA236A0D4C7109BF65EF8E6B2507651F2FAA61ACA225744A1B56354CB945065D6ACFD3697B8D331C0929A59AAA06570B0FD3B02135006DD198A92D4037301BEC0B328725533FC385B2E03033ABC4E1CD4975E438B19D902C3E3435019A42F664C063A5A5E31932ABAC10420A10A89B54582138CE812A473945952460F541B9CE51C9A23C5CC6BA0896249F097218210A329956057E6BE66DB1BD139A791FCB95B3603F12BC19E2876617520522AE31D827CAE8422FAE85C30AF33DBAA77967001910F +M = ACDF91D5B4F2047AB9C7A8C2F4809FF69B9D480334C501E6BC66D535D309B100 +K = D3772614A38598397B21269656EFBA39B15E482299F3ADAF1F82225595A1B7DF +C = a48ac780b610d3ab1a42c4256fca5d56 + +EK = FE456F478002570478BED88055B4567135B19DB8CF52A56E41824984A8BEDB64467D7A0A45654153C8645C5054C0E35C2C75877633BA83AB25857CBE5EA998FC6C79D983B5B1A984FCBB14CBEB483587BC5D952A4BF422344A70C4BB8E9162CB31D2411637526514920CBBACA6A911FB80662096B85194B308B881189813D171CDF6463893CC58EC512DDBFA31920CB1F33AC72C15BE64A3BBD114B27185455DBCCE9BC67AFDF6C8A393CD8A427A73E052FAC64AC22B5DAA7481E7D017B8E14BD84690D9054BCF2557E942BC7248AFAE57911FC64732C450EC3C1CCA599B96DB685EB704764CA7EED07F9BAC7103F38356F86FB9639665C35A576B8627CA6DF0F138FD198405B6371AB1BBB7EC4175F739B408B281D28BCA369AC0F1971A374A97E9097FEC3A5ADA6C2C7714B5CA0958E4848C9CCCB5172F1A6B7F2BDBB37EA346D1C9AC0C31A5822218F9D3544DB6464E605029073DF5F030939C8B7CF84A714904DDF56E63F04B2240376820417FF320BED27D8C385841C54222097742E23B972A6B7491524B88538A07988FFB9861D0B693CC80BDF6BE9B645193C06EF8132813E715A2D72C55140A1A9C54163B2780414A5996489326CF52112640B08166FB9F9461BA19661F1F47B8270396A0A6C8218B636E8496CDAB3639338D50D0919BB7610AD1BF9FF76D7D0B1F0E241E61A6377CD83D430118DC222452426A9259709D91BB46444793741AEC8998F876553B7770E9CC1E3FC749DF81AA4461BF5E6CC1622980968878ABF113CA67B7646A0463604D90353C635C2F2E330F71949E2E21806091319B328731B298E99127777808153652C9C763AB386ED7F6CFEFF10034090D134A642A218D277B6B00511F35A25BB3DA1F299C22B4A3889D10B3754C52D3F1B1373840A973793EC4A5DBE76D2C29626F1BB469722BBB99B003ECAA85545CBC313AEFFA6006F0AB7A857AEA991F9BDBB92E3B75DC300D1C656B2324CCE8DA2FD95C9F510676A8D6AAE77535BE3A9ADF8B1C974293FCCA05DDB31AE1CC81768CA90D00A4A7F8191C127F6B8CA010B46F3C05A808D9911A626B80365E6AE6BCB428BF3EC8710557485DDAC34583B43BF55D257089EC997F857B94752B8BFE7942689A5397F71944343088D6A9A2BA4936B2AAB663857B87278C3293491A75C861987C187655F13FC2A28749E3891E8C236B1B675E250639E5461BFC94F6B7CAB6D8077E4CB8719420DFD4951F76CC6288229EF49C8B8821C3D497CD860C58A619C9294689B5029F5B2D0BC95C370A8C7FA3C521A695C829A9A1F8012D479E38DB4CFE650550664CC9E0B631E2682AABC81A601A62EA16548584A571CE417508AABC4F1970407ACC47B449890598621EA7623530409EC49AEEDA8AED0336DE4BC4D4F9163A3C82C12A2C5D86B24FE56235CCCD26F5AE517367523AC739C6B69E977E3FF2A854F8040DC4B97FB3A29967005D373E0D91166A679A517822F7AA59BD4B00185AA25E0929091ACEA1FA4ED7F7BF7E463005D59403010539465D5D918C1CE22C55A50C749C6B02A360345A0A0790970717986AE9A020564D82DC851AE815D5FC76FDEC1411D01C56166773D7067FB29CF842BA9E8136F755631ECA53D49B7B2B296D65E63D29F96931C02E2AC013C016BB05EA6817F19E1286C3C2B9A803276FB58A916C838E923932895C9961BB3A4BA6ABD52880B86B391035764C4B953684AD13C5918ADA13AFBC42D4B6B1D523B39C380AB8390E6984179A5863AD488897258CBEF615D53281AF99239D4A59AEE6ABD6EA9F72B88E34D544F25A18FB9A45B0BA7906367ADBFBBE3BC467EE7BA3520360DF56040E730C2ADB162F78BA49EA4E2D1969839BA16B2AC991CA439D337CED7153A6E80877B73F6A16A22FE196F5F833ED7C0133505EF9E323C00355D2405B8CA01FAB6B780385121DAB8544C2C609C708193B969701728BE36F5F972C0C402D2E230370175971A601C0560A22789262E539AFB55B4EDA9F8DAC1C63FB77B91B2E77F17D98C0297FB17919CB23E4D45BA538523047A17690C245E009B031469F6CCB30980649A14211997A823C092C98452517A2BFBCBAA0B43478AC399FA9B58FB96687CBBEF715AC3855C493665735192A718965D3825325F151D3A325318A667492B7F6324FB28DE4A16F77BBA3884809A3445D53289ABBBA26997E95B89029457749E9B70D +M = 696EF6079C573B67BA3531CC69730216A3A8136EB6F647481382A5CD93C6B7AF +K = 7E151A29276FA13C06F530A46EA14DC37B820963562AE9069C17A7FAD27C5F1F +C = 445bb8d05300e11dd8d1666a670386e6 + +EK = FD1B79ACFC0D6D79464A3A59A5E18DA6D54C7E272B77703A22610C75FAC3675B89E350047C80C6F5B6023A455C88A44B0327BBB6F40E1D502861F77E7F2732742C88DCFBB539464E3189A5B21ACA30474E3758AA8BD2259987B8390698FD52378DD505D964350AA30B26AA925D83B6C3CB069113A2A3133FC2C19714A042C3056C774805262595CD2504FDE7A82D19878AE208E8173D9A855D39173D027B05CBAC4DE7408A4C0A4427109D60571D98D1738FA09B1D80BE859B34F3268F31A6CC472846C6E5C50F2A3E22CC8E81C78DA627CB2F474CE1EA0B6C02C7F9135129056D05F62D9B36BA466B9806F4ACF09302B135906AF7BFB43020A68444D22168388C8944BA60E7E803458B10D3B061F0652E08607CC2214CFCD2BC0B1B2148BA14691635C40492A4464230F7B6C9AC0366D813249B37FF57AD8533C752C0CE2B765D0319B84F204B9960B8C553721E5C1B93178621D4A16B8C5D2BEC6A91018F80861BC92CB44B25AC1B8C937793892A989D8FF465623666B1E467340984F45A1A591453D894C0E27876F851C664E19C3DBB3F62D7C7B9AC5C4D201FD3C0B3F7597D56A34CABC65F5E62898B0358A803B8A8651E8526C010184EDC0A1008F047E082BC63F0236FB93A9E70750255A28065A32B582CBADB3178F4B146A47893C62AF7CC63DF404715182013F13A11249CE5513D242A2E8B33C4B1B730B59A1B121181BB39449CC021C97C7B6F187966522C4DABA78BF231B945806B590C5638B1767280C29A070C0619A74A6D3D65C704DA99018418266A2AB1D2861B80700F67C6C845744A51220C4743E2A6639F188C95871B44D586F05A1EDEEAB382D123FF731042C29D50096155EB59906A7BDD2881D94081BC330CC3A71D3C1391485109CBD8026744AB57632D0EB35087B11EBDDC24222B4ECB435586C7226B11644AB9A243291CAC62CF3EF90B7991014CB7906D9B455A023FC94C7DC935221C4B2A58398F803801BD2A1BD5B40C17B529FABBC5F3219419DCC911E70FA0397AB407BD73258002594EEBECB45218154196A07A53AEA0ECC56F25AC5184CC39DAB2399B555851B933B45971C85CD3299819A27F756848C33C4E67B6449796B99A914AC8083719D752F06580D328087510AF7A5122F95A02A30190CE72482BF04FA37306A28836AB7A6AB11A2A311C1D9591630FD827431A54C2C738C5AC9CFC67BAC2480763E2CAA1C81E52C9455E305438BAC378D8A4A05168D72C39FEA242DBC794BD11B504E4630487142AE867903C4872F0B9A8F1572403A51940CCEF99618958A71569A8E32992F881B6084354548046F1E4186E11707CA72103DC7292A7858EC77D24BA225819B9574470C467033E35C3FC8A8CF955CD82565576EA576F5C43E0682C50D0260A30043CD40010B2B70C60A86F242EF193C4D3B837F33771DCA999253278D2CA2B9B88473DFC7565F282EED3739967345F90AB34A902F393A2389A557C815591665D63652F43C321ABF0712A012DFA6C04EF86A67F95A16B784E3BA18CB13215EA09CC2B5238F9391BB6A5C6DDA2C6F670A1E58329A8544C1E2C3E5D2A478057A5E46A26982911CC599D83A5A18D918FAECC86217A165C052344A38ECD885AA0E4CBC7D4742C99B1700578D454ABD5C83F587CA48A3A219D72B55F1934BAF1249ED25110177B6B126E0E1379111BCAFFF719D65B5570681164A80AE5E71D677586625020F605103513A0CC94A6632220A5687D89EC887956CC3F6575DF735C738222FF7AC70D468860420D0E53C192FBB31C8B834FD10EBB4B38C1517BC6E60BCC7A5831741DE067274B637060D4CFB3A82624B4207D94355EA3BB562AA9C5B9C04E2182C45955A06C5C7DEC5AD78BC9FAC6A87637BCB14AAC3CA76D5695196937CA34A36F183C599645CD67F33E060C6BB784227C735773534B4D501D25584C0F412A1A697C041C59EB85472ECC1B780C509E3417C9890722E57003A1B5AEEB11A764A6248C724F8770400747F04675C2F54BB1A983C59573EB8C64B39A3F552B79F5D365FC461A0414CA2BCA1DAC961C2E3A0A72109D79E26A59C1B659C4A45E9C8C2882CF6E26B67764244E3BC739349EFA0B9DB47B2152634240CB7A44A0A2B9CC70D557B6849A9976118DD8E74CB7896915368BFD120E31C4A261683DE548D0D6BF829F1E94FCF9E53757DC7EC8255975E848CD84360CBEF3FD +M = B2180DB6D5A468155A4C45C90495F8875538F05B8B8587644B4A668CC8936447 +K = 42D06DEDA4AB863ECE98FCA1C9C3E5CCCF7CB03B8411B381B028034F12B282F7 +C = 5b747074d0789971c254d2c74f1d5dbc + +EK = 5AE08BEC33AF8C2967C72B389BF868211B80B3F3621279CB84739860479BE408929695B043BBC623B13B7313494111C07EACCBAEDA248DF4BFD4E480526958FB9811FF98CCC755231045C744D29A6A3103012A3C61613C3305C0A424C8F483362B5150A045888AB09E39F08FCC81B79005C1B3B0BA5FAC23BF438048C675122ACE4CA672D4D6540F9064AA9766937017B147CB05111C0706A5B549498899423B1000A27B648F0BAB03307F8E492D582723BB20B044E91CE259C611F71B7BB57E90D4A249D02A7892B4589A63EB591CC559A3477766776505689820601B9CBD75AFC344C43FD9C9FF55AA4C791DC0188B17177032796E07368CEA357874882F32948EE0B63D589C808F833AD2566E22FB02C77AA78767B194731EBF5728F1A858C6C85102B70C56B96D32428364EA7A904A7EC4F2517AFB2AAC817AED1A53D701CF16168AC2E45730D57F93C12B9CDB38D602025B1C53E4A1CEB4EBBDC9403DAAA368BBDC9BD9858BB0B53945948CC3DBBD7B2B41A97B847447402C5624D30CA0738912BA19780BC5C81A7B9E26C3C2E155CF5C1A58D26413988267738B848F20681B823E9828BE7A6A8799A1360C2298F448BFCB5C422ADB3D6CE32D8FFC1A2E52244DB9C994416F15C3B5433319C04559E3C3B895B1B322232A69029AFEF53500AC5C87A4606F5268BFAA26FD99B45C456D96E1B248BC8D2D79CBC9435D3A8B962E91A81FC76B1670ADFD12B3FF044078A72BC36C8A435B966DBA5C0CC97B71635206CCCCE2972B80C818DC43325830A02C6482CB5B2079B5AB6AC50C24E95D16C8259945AAE9D45CC66B1F125B70915C5F222670E54A5B8CCBA4F973BFCBD763BF2BCACFF5AD51A9255481925C893C630B38678A355EF40A39F56570D961846A2E6CD827CC1BA4B3813B6B956CF4AA26D7E9CCE1721E04B9A5B8D4910CDC484134730B639B57B39CB5F69663EC7490B339C61B4EE4AA83393ABEBC60868B945CFDE98933296793F74466320615F03DC4222F69461DBEA4458E2B6E1573CFF4F610F78C3AB609036641007EE369BBE382ECDC888EF97C1E1812B87964EC19B04DF5194B4049DFD2A87B63034F7A02C3BB731CB67F7282B8DCB131146570AFB993661B059797799CEB7D081CA13421BE41B32ADE2404B0519A00B88A0E088E29F846F5B738113B31C680BB96AA736CEC1138CC5F5D9C67CBAC9B29E1C1226812E1BAA39F151BDFF15037E30E1D3B9CF86423131A4FBAD95FA0585015485B5DB755E0F45D129841EB7614D6C7AFF6194061DB727B299A30238E8B716C72400828B377D46B3F2AE9119EF72AB410C97CD4B31EF77A610242D3ACB17CC2B335C5B2DCB3759A4255921096087CA0ED428AE6703CB15A9D9D8A5E0D64B85534AEB4F2076130848CB450EE55954AE61F40CC25932851A2D80FA3601C74906F1A5360A69120A5FCB4793326F0C8222969A40FC16D46F1CDB318BA511C72AB516A4F31CE67204938E68EB4F16202F42D9E095F1714BF2719C7E571498CE304DA997FEF45549B5BB9F3834209096ABB39C686E4B2C9C796BA69B368417A45970178E9801221944EAB90656B623B53903554AF1F0C7644D79B2BC186C0EA5C791795F99A0B9C29346CF9639EA892935878E6F2AAB73CCEC7201D38A26305A286BB1970BCE86033A14D3677AFEFC81757A69C07299164790473055F10A8279357BBEB31C173B87B62293BF963C453988B390B3697A3CDE4EBBA5CF1B08F78CAC7498DFBB6407D6220C376A4799AA3A8871D0270870B9495499C88C98A5762F7CCB6FB0CA10046F06C06864345CF4C5B40B11181A973E473ABB9786FF307C65CB7048FEA4885041E65E0013422BCCFB65BE8CC9CFBB4448A645FD3F81779AAB29ACA1648708F249C8B3F9CBF55C736F5746854D89A923C1CFFA781D26C241616CD01D7B372F568B50BCA58D88D01FCBB23931DE6DA2D688A6751158971A5B19C6B46C3B761D8385238F8B9831266B09B16B5559B5EB82F64B7133AD36C5497C9BBA4AC9DCC094C3673691207D3587C97197F5CF7C1DDAB6A9F1383211639F3C57BFFF3B01709974C79C9C51B2E29E91770911A52281F030531239CB049BBCD841B1D764C49E0E8492AD383A093925AA818FC0CCEA049271F307C51F3C97A7AB5A81B43B52A6BCE2CEDB2D0E706D280DDE4A0991FCAF55CD36AC05F3593F3C797A9DCFD0FD0E0 +M = ACA147DD83685FDC5BE522178384DDB0C8714D0F818A5A20CD1AAA71730D8E36 +K = 6FE2B3BA0E972312DB3DBD84F9B8E1D7E3AF411BAB1750D75E7374BAA6B25F45 +C = ae23e2b186346fa873cc81e264aebbc2 + +EK = 9EBAA37C34B6F0C92BC7E98A0C56689C989E33E9126DAA3D94C95C6D60639DDCC008E4220F8C6348E44738C1AC50521A926B9BCD42511A33C1A704871C11A962E062B9625169A842F8D15CF3F3A0A2411017860C88A22D01262666F6895390AF652204ED9CB0F7589A63C23ECA851C25B527D242AC8D310B3199AF5EF7C54472739E17A6986ACAEE76B0B262C5BFB051343580E60150250865397B4C498B465B6C62E1C3A4B89B756871313AC1C4034509803C59103AA4B9A50CFC7C7EE0A34EAA417009538570C197D04C60CFB41578E274AF9ABED10B4BB7B71A4B925DDCF5432940934B222A36BC80E96C1094E5C264364660012514444ADE22A6121C30C4F037FAD29C2819350700A10C9861FEA471BD05C3D31A2EEA2A9CEFABCCF0B4AB9C33C19FF126B017370073561857084A83ABFA5B3550C2A93B785A4223AC57F4B6FCA0B4D12422B509CA45B63775FBCA4E785972E775E2989D844A4308B786F230CE990010541868C2C21B3D311E6AB14C4D417B37D10DEEBBA6309686896017F08C224DC806AE87658A0B00ECABC2A9F66029873C6C3446914C5A967441BB4AC6900575FA52238636707C69097E19C30ED66A9F28762056585C5738A6F51ADE3603B963476213B78EF65AB6CA7F612134E82A6BECF48D4DB4AD7958787A377483F0A8BAA76B06243DA4F61CF803807C17837A6293D144637BD3A92039282DA86485B005767519C9C0A0B513CA5325866DB3AA67638A2C0117FC80C4845ABADCA92C529C539431363A9A58E6A25CE6A42AB8E5CAD3865AC1B69E77B2B48DD5CFEDABAC79257D15269D72B1CE90265556DA687D894D15F11B1268692E22AD8313877FA8629F3BA224F8C5A98AA31FA58FDD05101C3705496516970B200F984B67EB497DB9AACBD6922EC84C73DB42EC0BA4D1D11859DC356765C82947B4953ACFAECB5969D34A4A8A44BA53346023517C2474A301AE7177A0253904186A5527772CD7845A4129A90B292051765772C09EF585A5BBC976F1F9B24C7AA4478B04B47398491785D9B9B9376B89D6C90320831117949A72406BE6076B4268A356E615A2168C9EEA37B2165B143304B9C51B3CC97AE3A6B0DDB185825C8B7AB073B5086B7D215D4C953F7BC9863339A045DBA784F5489FA51096234DD08B7C457B1C326B8F73672881562310E90B43FA7A37B7550696422A1B32A2615D4E8C5B3C3C61C4479A15D94F210A165311BB4C95060FB8287BC526C212B1EE0470C5497480DA396B2C39B9BB413E267583C249911029DF9B7822327764C16FA67307EFA499F0A7CADCE8B1732C91D284B505D59A444B41ED738C09A40F335C7F7050B80DAC9E5609C000473E440840D1799A86705276761E8CAC3474C1836AA9C6B4D732118AC515EC2A4DFCACB7929776501EF02415A0638819582F6AA2853DD189CF7900F834671718221933C2962B3FE598BC2EB0245C229B2ECA5B1A1A2F94BC6E278875570BCB92C043493267F7DB06C887BD66E38CDEECBCD0A998FFC094376119E4A961020C8BA05B15FE06062FD4892DC0C023AC6B2806BF863ACD85A120A0701435305A65E91D5D908B0BDBBCCBD518BC9481A5920BB4900468A893589128845BC95294A0DC5918274C4FDE2A0B18467699D637AF4CB62DBA3735E33DFE25AE1493501A590DFD0342506B748EFA5590BB689D18A50B2151C9E9B559B346E8E530A14A1CBE5AA2843431CA32AEDEEC4E9081B50A3BA764B1B0EDCC99B17B3FCB3046E6C2C1B1966F2F481E4E1CBFA4E7546E0A9E6ADB649D59151209942B92B019E8394416C19004CEF1E9235BE0228E6B2CE3603A37966BBF51CA366A3F2D18B931E4B3A827887FB3147331A746E713F60040F3277CEBC2BDB7251E84EBA5012A10CCE965E4A9963151698AF1492CF51372C37AD0D78F817B466A26372F3213873802EE26558C9ACD0F511B3F9138EDCA56FCCB36392ACE11411EB2936CCE03A0F2F347E2332E14E85B8652984D09CCEFEB8963E2A5EF845888576EE1B36EF362274D292F10355163BCBD51A7AD7B284BC4A10C3370A1391003289016F22310FD3C4CFB31CF88A42685103F3813393C1A12915981C11A616FBB8DD6905712F387D279C24B17230D32B018E14902CA1BB0561CCB73A0E2F4C8DAD9969745A1D238250B76FAA9FE97E3E08E3BCBB6E860DC8EC5EF30B92C5648EDF353871C148883FC +M = B974689F6F36C7AB262C8B97D5469ACD3BCAA3A3454F611FF0B304FE1DF6C66E +K = 7BCDBA65823F7A36497091555C7E558D933E707016AA485708FADD30EFB8D8D5 +C = 0e60d9352ae0619e60ee6d11e1e593b1 + +EK = A6902B0559182B341E3A6ABE0B646DCC84B39881948CA396CA782A65D6221589333E98A88A9C320D83A10422948B64A0DA1C4ED165B0144B22190656F1DAAE36A5641A4863A3985AE9D08456629C153A596289C01BD2912FC3603EF7ADD1EBAE1A745675F316ED0A6D4CB5C5A431C2871B939B5648D1018911D752BF08B40CC571D863B33C9043E3B2C73C67CB9A4C8087F28D7D37B9B66B638CC66796C146135C2A743AB94FC693473089E6D32492842D8D114C9A92C6721818CD0530C91A09FD7C3A124B7E98DB056C77049008A112AB61D03A8C38738B96F64D4E530E5345958EA38F19517B7293B6D2DA11BAD668988820CE8479C3B5A832C708FE09481CAA7ABDAC2E8658544067810AA31D88A52F66459B3E0A5AA8EBCBA1B5C9B8776FAAF59CFCAC69A1CC8EF166615998AE88968FABC67D67C7675B94CEF447667FF53D2B3890943303BC88C5B3DB08BA75187B6CBC97503E9A563745824A533C59A71B66D5CC21972B843BE0C0768970571796AB992B39F43F2CD8017B5517A91235474A821C541B526B0404212C194238B18AA5B8A175E4A59417D119EF8A385B7458980335842BB318214E55794C635692736B6708863A066462EEF41ED66771EAC578E029642954111C0B20F9BA3B8646456DA39873B89F6449324CBAB5ED017CC1C72E1ED4322D55B2030A8E0B390E54384449096A2DE676BEA01F03A458160341B7C743719B89A158120B790AE8E1AB4468467C4507F7CB659EB8C16A77315E553AB287836C4472EA1075C7A1C84DB4CABDD5CEB2CB5638D75FE3567659443B38B2B21C422DF97A14A8A633C2279DDB056302AB0FA83905C846AB57D2120EA1CC92195320B5B873B406CB44B73FB02160200460431581979967FC16233333A8EB7D48A120F451B3FAE9BAF6318E384B6D42B36D5B38188D849652935494C4BBBDFA22A562A27BFAB60B3455E775912D27698AA30F76CC291107629E3627EB443D0F00AA3F220877010876B485F57495C9E80DC4F3AFD6118E1849ABA06919968163CC9CB358DA03B3550198A2C43F476954F1557058C05EF828D8EB982340C9BC6A5AC1A27977402B2242A40D89072C1270DD8772008A505D4604831C1924B97C980B01788107472800EFD807FAFA1ED3466548D698CAB76B820667D630C7D03447820BB8815BBCB8DCC11752788782CA3BFC51DB9BA0D16198132A0ACDA7BD7A6531A8AAB9C8AC2770030C512740CE62CB60F79F8087CC9177B56E6A4B8155B854993E2BCB78AA849E72398590B24E87A31097AA54ACA80A9CEB29BBC5B24CBB7DA084B76B5C522F73185A05A8024629F8A6AE304CC7FE88258C94A396912A16B491DD0843D8A82BBA86843F458E91261588D7AFE89A1D7EA9786DD13C4111CF89EAB9118A7EA39A72408C8F1EA2C77765C12881192A33C552D61A76424783E5C48C881E9A541B8F6157EC138AD5E93AA925194FA37644F397A98C60DBE786983C8B2CB6C76C73CCD0371CF0CA85998C65D1F76DD5E545991A00567A48EE69A537921379923D7676401A06A81D68BD9FC4C2A28B4B72C966576BC6DA870BE8C415F94174F8137B3EE4793786652EAC97D6C91DBA4749CE4B69DB82209B24C5FAA0C4A0CAA71A39BA51E7A6F19381219900E6F8AF06F0B224326EFC2C8560A95AF8296D2B87353360A5AD3B6DCDD95377B0B201EA7A6E475D5D563A373554E83982A35503E1C179324276F6147B698C32AD24AAEFE0B2B1FA911444808C6A25CBA21B4BB008F49C0CA8D209E2BA02E3B164DA41793C212F9C5B2E0EB00CE7146284C0B26FF940268318EB330C6F0100ADD43FBF0615D2EBC27B0819CDEB6A327C590DC83D678AA4BA910E509B4EBCDCBF3B74CA581A2B55F46154D17F9AEB3A09D5C30356A75AA2859BC11DFE866E3C463C96826613880470A1CE8276B033C1810BD645B5278C25F81B678228F4D20FA3726C5715311DA4BE1F1C0752DB6D16D889D27313C4046E05FC161E889DFDE2255F434C8008AB12167F3B6A15D74B4791B293C902CCC6F4C98A75344864C35E6B189C8C116735C7636A6F0AF653DB17CBE0E3CA7C677CF9604CFADA8031611321DBC90308BCF7F93AFE1B02B0C9826A4139C4B2097CD061BCCCC5B3C562BB13A30CDBB318CB9457C1B9A69236B820AC0717EB65554D8CBB46EC883E0392B79C92DB8D07FCD393633C020FE2C469A32D +M = 7B93EBA796CAD98FDBCEAF0B8F3BFF196C1F89125B2AA88F623A91DC6AEE3771 +K = 06B511E4AFDB9427A2296FD9BD7C6467DE6A25D78866F770C2F41462D299038E +C = 89e0e82942ef3ca11cc959fe579cd7f9 + diff --git a/src/tests/data/pubkey/ml_kem_acvp_keygen.vec b/src/tests/data/pubkey/ml_kem_acvp_keygen.vec new file mode 100644 index 00000000000..4de5c42bfb3 --- /dev/null +++ b/src/tests/data/pubkey/ml_kem_acvp_keygen.vec @@ -0,0 +1,381 @@ +# This file was auto-generated from the ACVP KATs +# See src/scripts/dev_tools/gen_mlkem_acvp_kat.py + +[ML-KEM-512] +Z = 84CC9121AE56FBF39E67ADBD83AD2D3E3BB80843645206BDD9F2F629E3CC49B7 +D = 2CB843A02EF02EE109305F39119FABF49AB90A57FFECB3A0E75E179450F52761 +EK = f0e6fa0a8d42ea426134fc8762535b8e +DK = 8fbd4f1cdb8fd74834a7f5701878e5cb + +Z = 5D473027666FECF7024ABAF175B9BC42E84768C00AE2C5CF27A668121B02CD3A +D = 9EFF3FF8252400827F3B4389E4EC07E67948257C744278048C889D0789C5BFFA +EK = 7f404fa2362fa23018ba9bcbb3fe754d +DK = 6ab0f4144c903ae41b15863d4450b53c + +Z = 7A7FC526215D5AE3262985D17B00726462D1479CB038DE8C8A8FEA896A037B2C +D = C6636E8C2F87DD52A7F165A2A3BAD562ADB28CF738AA56B996B6062E95F66148 +EK = f745110e2f755c010dd2b76c0d5492ba +DK = 58e199bab07ed45547a94a8dcbba3243 + +Z = 6E584B168BB5399D52B458A8BD122DE14EEF214515B70F38F972F41783005755 +D = EDE2E63FDEE6ADA2FC6EA906AA8D92DE87FA6199AC15446B0B6F075BF9F76148 +EK = 4b07bc62135cb202e520af982e4b7ee4 +DK = 31108fad0338a803c73b75ac43a0cb48 + +Z = 37B87F960BF862D8B81AB5F56E9E24ED8EB011A05867A04DEC9BAA519AF45E22 +D = CD568FB1EEC23C436C011A55BE2FD4362EF000C890BDE7611EB5C4618AB74F8B +EK = c115944ddcf7ba3e9016bc732dedd205 +DK = 26a95a697319a4448fe38e08a044f48d + +Z = 4B0A877F51434F70E2D8DB0A51BEB0A7572EF0DB7AC26ABC5D333C503B68BD5E +D = 35DEE1F800CA85E482BB12AFDB882FAE62CC77A338E65CA2265D77243ADAE3F3 +EK = b87f3e67cd93dfe9b7a6e6e6def6892e +DK = 9fcc37c185629b224198f458485e1741 + +Z = B1EF909D94C56C134107B913B0ED29BC0851CCE424D0FB69EDC04C685A540871 +D = D9502C86FB461300B8D142A906B766B0B42481EA9C83AAE2BB74390F882B0509 +EK = b0a9ecf9906d1a31edfb4925f818f1c7 +DK = 1dd784d7ce48bb87c31dba2a3b9eda40 + +Z = 671C8C054A52A67BEF8015DFDB5711C9197E84A5A553E794AE0811C8432FEF6A +D = 07A9BEBF21C83F6E5417A73D8CF5B527568C903B5883CEC8347B4ADE73AD92D6 +EK = 1f8ddbeecabae7a46a2ccb1f4f59b06b +DK = 061f97e009d4baf3ca51319d81c8d93a + +Z = C02D5CAD9E565727E19B2EFE4FA2E083F93EA0F5ADAF97522F33F416F786765F +D = F682949EBFCFA5DA31368E3F177DD146448D0E62178959FCBA4CD4F02CD8B17E +EK = 6a65b196aed41dcd147801c22f166908 +DK = b89e682628bb7d5b4b56eb16d4430d55 + +Z = 70567D6DFD6622814417BBF673812F2D02E5BFA897D464957AA4219841A93C19 +D = 170CA6BB76C065255DFDCA3EB93C772E57EBEF8C9A291C8F0BC4444BF008C868 +EK = d3003692d2e3619e1b35dd277fc61705 +DK = 8f38999013fee81340c30e1d5923335e + +Z = 71A6E59B13B36CAA406DBEC53F3FF2F0CC529098A4C8FBFD032C8BDB8B0E16FE +D = 176719D76EE1CEA83F7751BC4E3DDD00868B5C504C79AF8730B9F7595E7914A4 +EK = 81ca5754152193e82bbd643a9bdd0b04 +DK = 96ff38bc1ba99cd307e595d2668564c0 + +Z = B63478F2FC887334C707E9D836E3104892566B3568CD32B583F8C9A0DE1A1F0C +D = 3C90FC402DA953172300194876B3B3BC958268747751346DE7134566CB8FAA5A +EK = 1c233787f1e127b386d705208760b46b +DK = d2713602b5cd731997b0bf795ae90b06 + +Z = 4EA6EC5384C51903758B807395181F6D6B4CCA3FA1CA24110B08A8AB1742C411 +D = 24B783E39214CC39910799ADECE53B32408C19CD9ED10DEC039A9FA2CFC1CA30 +EK = 6767941be8203934a704aeffd872fd66 +DK = 7706f6b94ae67437467b9c32c43661a5 + +Z = 9FA6AA53F505506BE269CE201A1A6EF95692DD1350A7188F468D34C5DAE5EAD7 +D = E4F2972F746E028108A5BB98EC97A307DC9363909DEAFC491F040B964675B9FC +EK = 21159dc7a725ffa8edf531fb593cb72a +DK = 9d0521839f894216f9d94f620c46438f + +Z = A9EE7619E4F0250147ADC188649A45EB6D82DE5EACD5643CDC52E6DF8DF2F8EB +D = C5C26DF5BA8BAB4A293292BD070986A8063F736469F6ABBAB684F7127575172B +EK = c67ba6dbf388b3c2c58cff97df6b19cd +DK = b4c2b109ca8174c806312d5ca77e1c09 + +Z = 80CE5D65D1795C90B637C10360B04A4C21A70851F0A59D4D753F54CC00103FF4 +D = EF0F6EDB707059073378E3419C8D9031D0732CFA931190EBD07FE291B1A3EBD3 +EK = 8d9f72f5b0406bb00c172b4dc4f5a5d7 +DK = 884fd0ba21e0f074419636128b9819fa + +Z = B923CFEEC804B8C6A9E36B77B38A2886C45B1C731A33528ED2CB5A1F65E792F6 +D = BEE40356679E3EAE8B0C3FA07C1BFDC8835CEC26CA194D5EFC4301481C256C0E +EK = e5f36c12e25a72fe70031e4873f00a4b +DK = cdff415f9519eda4e0982434021a7c22 + +Z = 1F4863F16E38DFD2C42A9322FA1ACB941DF3BDFA000A202AC621936FCC5FE33A +D = C6D5B35B90FA9AB9A7B438B57942D653CAE67B314C7FD152013B4E90BEF8201B +EK = 9aa6899513f833e5f8691c828cf75768 +DK = 2a07aedf7181b8dc27ddb2671743233c + +Z = 53F5EE39A553E831BE32EB490A6E1DE62FD4FE486EF58A4B99F6347759BB8905 +D = 5C6051E18E28FC5719E3172B967D25BB1649D87743440F7715E860AA212A256C +EK = 0939cb00746a06fd62f811ec2f4d520b +DK = ab30938c3ba314245216066095458683 + +Z = 9C7C3E68F827936D8DC435942DC4925D180E6D5C911550089E1337D8BA77A06C +D = CA351B0F454DE9DB364E1DAB8AEF6E49C2E69439941935B24C00BB9952E65BB3 +EK = 31c967873bbefe7e5fb5de1483094b6d +DK = 19fdc401ac22690e0923e4721c127153 + +Z = 97A4C9A65A82BAEC15FF165E10490976EBB19FAFBA8F9E8E0DFFBDB4D5E1ACE5 +D = C467A43BF9E9CCADCE4581B53F8CA0B605583775AFCD0EBBB587907B3A813D94 +EK = 08c54f02fe175c44a94c291e191a6867 +DK = 195d0172714cdbdeb6e8c46bc12e3a9c + +Z = 973DBB6EAF76AF0C96F0F24EF9AE65ACD854301B5F7A7892A17FBB8601DE78D3 +D = D732CF45D7F44788E17C3B6DA9987495AB1AEFA233F74EEF8D3BE5B6C0C04E00 +EK = 368445b2a43a16f3ad4ce0cc6a58dc96 +DK = bf7936f8491b55210bd2aca0273e83fb + +Z = D525CCE60C3E300ED36298A1C0D0165C147CB84197C4028257DAF39239E6EA5D +D = B670CEB5612A1287C4653B158A3CC522AAA1AA45B34A4C770DCA1E5BF3988F3D +EK = 43ebec3443ee1902dc308a17df4c0272 +DK = 5a7992071ff03c0a410e737d555af0ac + +Z = 9F2FC49CD848BA72FC17854B18D88ED65B630BA94A1BC5F6D3A458E1087D3A13 +D = 3236CB10279681238E5B0E2F5138A7F743443379F5F1A845F3D76B75D2C2A9DF +EK = ff28a65d33e08e6e45c32c365ccf6b9c +DK = 796312132459b22f48981643c884c848 + +Z = 0FB831AFA34B124F7456D0D09E4ED8607DE407101E6E75F305F9D67EF7C2FAE7 +D = C155568B6BA74DA317388423F8FB28585977EB858EE306CAE4174120F02A8D72 +EK = e57fd68245ae523e3c26d4d721c6675c +DK = 46c5104ce54005fbffb1944b053b76c3 + +[ML-KEM-768] +Z = A85768F3486BD32A01BF9A8F21EA938E648EAE4E5448C34C3EB88820B159EEDD +D = E34A701C4C87582F42264EE422D3C684D97611F2523EFE0C998AF05056D693DC +EK = 4d7f7325503c06f0cbfac8cd8744894f +DK = 83803ebaf566d93aa118e8eeb33d4e68 + +Z = DF0F282411F4A071489A8F618E2AE5AEF40131CAC5233D6D731522720C2FEB1C +D = 444F032DD19AE7518C4B35B0732A41DC567845ABA8BD7B04A9C413A0CF2DE0B5 +EK = 2046a7caa354b453064251b1777f037a +DK = 0ffa5df578365e0a17a45401c44b110c + +Z = 5AA6DC620A6E9A60CF19A7B4F0FF805BDA8219522A548EE5857C3FF6060C7A2F +D = 092271D05CA63C60880AF404D60BC4BB9539E2EA12969581898D56E0AC9A5A68 +EK = 5986fd55afae16f81b979672ba173858 +DK = 290786c7717b148f0c7ef9644072d864 + +Z = 7CF50F7237A97072F03F31CFD59FA8E863BCA3AF7375E0CA698FF665661C24CF +D = BBF7574CF5F32BE49E1F39CE33870D9D6384056D60D223003B6B0C10D5C42180 +EK = e9cffe92856b0dee4e3b144ea5b17aa9 +DK = e423b5d9667fdf82833839b8e927848d + +Z = C593627807074684B7D363441F80F6A3D185D67878702D33A4E0BDA2000F857D +D = D12CD9B65B7C58B2195AE0BE0282527BAC06C2D25CB0472628D64715F7F6A378 +EK = 73d3441d89a1e7e8482295700e8f35ef +DK = e8cab9c450141f8ba532a407fefc46dd + +Z = E01702E1228F530AC96DB053A415BE97749A109A1FD4057BA128649B17EC07AD +D = 79C006D5470C229AFCE7588546E52204B09F5086974865B426AAAA198C6CBA7A +EK = 1be7d1b5605ca38df3cc6ce54e17a139 +DK = 1928df0684935a0eae3a53095eee7023 + +Z = AE51639EF7F26FD2215AD11CBE1EDEB3B943D668EEEFEE13ED5B0DA3E0A5F3ED +D = B04F631B330D83991B5C01E7F69452DFC394F9689632F8C7F60DBFAB92A9CEA5 +EK = f4acdcb4ee98ac0b0f7caf8772e7dd44 +DK = 7477f8339406376a9bf05f24c4b943a5 + +Z = 6F9FF5654FDA78774498E2643E935D21412CEB49BC393532C80C47A982418F66 +D = 3D63BD6C310AFCF684292E5F8E1B98CC75B5A27B21526268444144AB24AB2967 +EK = 1c134897abade750ed742eba5b684948 +DK = 32fae026bc0969e1e4995a1eeeb277f3 + +Z = D083E6922EF0A818308FD7FE7CF5AD3A96942442BE327B0A307685C2D4315901 +D = 249D48941ABC01C9290719FB34D91B05E774E70E6F0181E1783F2586E2499536 +EK = 13e3c2be3fa7e36f40d188078cb18cda +DK = e6d3b5127d20329be5c0da220487263f + +Z = A20ABA8A8DDC212DE825BE0D3BE57701A6B5B3A46A300D9B5945F579A59AFABE +D = E1CFB8195877B2D4FF3363BAC3B4E7BEBA6DC3CBB789B1B24215393F6C9BBFAE +EK = 1569746d88b3ecf5fadc0fa7e6a3dce7 +DK = 9e7a8b642ed4046db56321aa2550dd79 + +Z = 7FB950A8F51DCEC4BC7A573EDDA56ECC049E5688476BD5FD6CD076A8F99A019A +D = ADC4DA59D935DD87420ACEE52AEE19CB371FD0BB498D79BA680159EF7CE37C17 +EK = 6a01cbb16d0cdb07dcb0c17f0ff80580 +DK = ed416379b0328cf67e8d6dd9e1c99cb9 + +Z = 51D509CF26799741631099039F713B22551E2B0F0297BB809DF0CC8FC3E47EEE +D = 76CDCA53F781806D55CA8D3BAFB3F4D389D712F1221E85B5E29D6A46580F978C +EK = 5405613290302391e14fd990c861916b +DK = 3f1045c36d0135a0723c5165fd00c8f2 + +Z = 9C330AB4257D7B87C4742C6E95B66BDF805C6A145BF444836092C6B1D2C5FFFF +D = 78AB6C49354A018BD38A39926F822A1AC4ACC4FF32DFD7C047CE0887A3AC182C +EK = 5536aab868b6c14dbf7988b5b85fdd51 +DK = ce9c1629d980509d1a18d6a93a7bd63e + +Z = 18EA1C7532F706B06870D0A1047AAE33D9E1FF9E9BCBBD302D8817EB7B022A77 +D = 13B75620E4CB9AB9A6689F6E2BE44639BAE6C9CB7DD641AC1C9377242D99679A +EK = 7986c5fac34749a4f4fc6fac95f58a99 +DK = c4a7d5a48225a8bf08bcbbc9d0e208f5 + +Z = C71F7E44295978FC63BF8F6A68F8609E98D155FD7A74E1FB7982733FBF8A6C25 +D = 7C345819C7C327AD9571E5DF882449DB243870D686A9764D4129B21E17AC86A9 +EK = 7de1925a1e47d72f5f64f50dfa0402c6 +DK = 21adbf7754a7880cba2e235c848cd4c1 + +Z = EF668FB41F49E82EE0FE00919CC06507548321593A7ECD1D2112342608D95FFF +D = 8D6DF2EB3DDAF961FE5EB556842B758BEBC7ECB312B6D4628B323F483B77D6F9 +EK = 55e9eacd562e0fb84d26b8e9cbaf8686 +DK = 780f349e3d3810fc9091213ea9eb4f69 + +Z = 26345937ADC9104155275E7114E93D9F5847EEA73A9359358585B2D42301A294 +D = DB4ED8E9C3E1AC7A35EA4B67A4EFCFB46972A984D161F79F084125D6D4AEE7AF +EK = 904debc0c949ac4b50d5606fa7ec1204 +DK = a8f1092ce70856830fb31c260fd134cc + +Z = 63435E06C2AA3DFB3477120710D5E7FF0DC0DA68D4644A24F66A8012FB193697 +D = C6EFA7D5D500E5BF857D80EAE2A6EE6414159947FD4BE589350724FAE5E51805 +EK = 85a8ff5c0cd7e35952c9ea5ad13fbb36 +DK = 12254012be23e38b2d70390f71a7b8fb + +Z = 8C2942B7207C2C59BD56FF9EE0B120B1DAD81B05602623623CBC7E0C20C9B709 +D = 20859B01DFC60B6109E0234F3CAC7A247D8386099D83D2D447E9A21AF9DE48BD +EK = 46da9a30f3c5f22874e8377a2082deaa +DK = 97cb65d41b4f113d6ad191771af60aea + +Z = EAE318341D06E0801C0CA4B873520C714740AD017FE5A158D3BD40960D907AB7 +D = 409E9F3AB58D736E122EFCC4240BF8388FDFDA6759004D42457018014A335BE4 +EK = 97170f541be932795e27d145b807da7d +DK = efa3ff225801380bc1a748eb447f022b + +Z = EF38264520685080F52975BC957C5FB609FB0E1BD06D26F572CC5425CAE7DE5C +D = CE2CACEBD54AF1B4E71588DE9F22A6AF2C2E2AD7FD66B9FEC0DF19182E7F57EC +EK = a77fddd69435178c517ba0a76acfe420 +DK = ad5b6ead6567fd8c8f81213401de4e36 + +Z = 17E5AE70771674BE8903CC21B3A90248D993C261B6CEEF2C747873D113869B55 +D = 7E03015C5D55FD9888E730C1E60F90C5F6C2E3B1E8C7C08D869F0C1D15B540ED +EK = 0eb104624ed80f714a208ce360414cb2 +DK = d5803bd4d4e3eb2a5eabeb1ae50d933e + +Z = BF83E3048B021F22DB57076A885729F95119CE63FAF51A69954BCCC51E014686 +D = 8590BFC9A6FC25EE7E6DAB4870DBF4B51A1F141B7C9E96230C0403E799BC68E0 +EK = 733965dcc777f8f2a7e6582693c5e341 +DK = d84cff90b9318b85f5edbc550abb1dd3 + +Z = F42861EFF7691614C3E8975AFB4E353F8C8C39E6F41BB637EC79BAA976D1ADC1 +D = D5FD815092620DC42A223909E387369A74AF7DCA285138CF217BC29F29C42C41 +EK = 84d8f468515e955550f3776febb9a2e4 +DK = a47702e0767b346976571b59b84c0ffd + +Z = 4DD0E86091649A0A08EA44DAB85DF56797F8BF46222C2DBA7DEC6374B9B2268E +D = D21D5AFED9AFAA3B49FB45245B2BCA1505E4000CDC29094A3600F5CAA49A7B3A +EK = e0445c831a82fadc1149102e1a3dd9e2 +DK = 05e87518aabb9983efda833be37ee4cd + +[ML-KEM-1024] +Z = 99E3246884181F8E1DD44E0C7629093330221FD67D9B7D6E1510B2DBAD8762F7 +D = 49AC8B99BB1E6A8EA818261F8BE68BDEAA52897E7EC6C40B530BC760AB77DCE3 +EK = 55391a7d8b659c30914bc10e429a01d9 +DK = 845ebd8a0f891cfb33219884a5af4dcb + +Z = 007BF379B97DA0947F2E9BFDE3359E282C9CF1D2E68A80209B533104E90F432D +D = 2D229AB46354901491476CCE8FA96E4A5FBA65AB2F538FEDAA528E35687A782B +EK = d0afe23c95d8bd25fd6b29ec18da543e +DK = 1971bdbb6d0e34b38151903954bfdb4f + +Z = E94F4E83E6CAABCA9E319D40F6CE0E3691B77C92D9E3766BE9B6F4B6DF2E640E +D = 1D65D0290B15903371D616D7AC3F2FADA8CB24E6C84D52C039A10BC1288C1110 +EK = d6487a7f9661645782274c31502efdb0 +DK = d80325014ee709244b12cd0756c3a123 + +Z = EC54F6E1E7FB12B796D0E56BE6FE3BA6EDAAB49B08712318B27D229606D2AC70 +D = 22D19527844F3CDB8A342620A96E902AC7C36E54677ADA6FE8DB08DF4EF3B36B +EK = 8c70fbe655e1aa405599fd415133acfb +DK = c8edd0693c533ac62d693ea51e93f453 + +Z = 5B78F8D30AADB59FA617EF807D5C23113A9908342F08E898E02991CA1D7B934D +D = A00D1EE4147DD57B5E76C58A928DED0B720FB2FB6353780B380B5FBC76712E5C +EK = ab09cc737d896ce51978817c859e1d97 +DK = 42482b6e7c45ea4e51e60144991c80aa + +Z = 384509DB0E97D4689A3CED953CFBFFA9D3B3B87CCB0C6A360FC0DF3CBCA399F9 +D = 2C34B1476753095D0C8A48A00136F358A98D1416E5069CBA4540C6E26FA3634D +EK = 9d12c056ab3844b855aa0417e15d9203 +DK = 11ec125213806e2727ed3a27875bf6bd + +Z = 63DAD9B127F98E72A3C65ACF4B172FDBD9B9C39F24F728D1F40EB02C9949419D +D = F742E7B69E27A57A43E1034CEB5834CAD57C380ABE259F432F96FAAF27F981A9 +EK = bf1cf7592e4bc23d69cc38838b4284a4 +DK = eff311d70ff7e20eef2fa68c73debf02 + +Z = 0A755A829F05597B2F2A90974F22FB1AEAB42892101222967E3A0AD612CEEBCA +D = 3BFC9A057D979EC03A705A9CC406DD8A46C106941AF6777B1D7F79C1508D7B24 +EK = dba207b32bb74c8b58dadcf28826ac72 +DK = 5f298b86c698676c37ad4c136bc132c3 + +Z = 681F088AD6962FC397A1B9071852848CE9A7EDAE65A81485CEC87D0974707B7E +D = 7C43F2E7D9B1D8D9C41D9F315E052A254CE3A1F098671773B53717A95220AD55 +EK = bd2c85f424f6e97173e4acd109b417fb +DK = 3b231cb74163e9e614cad7bc39a9fb8f + +Z = 40BBB2C581B2D694E369C0DA567371E8E53C328A59BCE775A625C9F5CC185E0F +D = C2E1A3161F3734F44F3C2F1736E149803F71321122242A1E95E55E5652A91F55 +EK = ecd7421148c9c5fbab8773faac213ea3 +DK = 022f09f81788096c464fa3bb0036a47f + +Z = E15F322315265F9B847960B7185D962761ED79C62286A0DFDB13DBF550CE0107 +D = ACB7FDB596B44A88A60ED74A3FAD9EF745BF5BFA4902CADB891EC5CA45F685F5 +EK = d52e1e6fbe122337101af9e5538420e2 +DK = 59c090d7a9a57bcd6fd599d8084b90cb + +Z = ABD71039AE2E2700391011D9CC8265C2D5C9779002D54E1BDD9607402054CA95 +D = 0AA4E8D918201BB98464963B076E35337FF3265810723E01C435954DB18B14FF +EK = 17eae383d7392c09e9d0269646501d26 +DK = 088d57eb832213db5a7539e4c8277d3e + +Z = 177A8DA7AF8DB3F712E1653D05A47D61B59F4F4950549382E56F761D7126F8F9 +D = F43EC0E96A791317938761FFBE97332D5D85F52D22BDA6303FE7E7107DB608A6 +EK = 02c930595ff60e7c07b65168b30a1517 +DK = a8a3087e85dba73d0bd101ecfc59b7cd + +Z = 79E3B0D4F4AF344ED06FDE8BF4E104753E832294A3D2E4B66BE59149006A7B95 +D = 0596F1E214B29A0CB7A641EA0BB157FE01FAB73B4A9BCDC165FA44C8FD5FBF71 +EK = 07d85a8f1bc50d73711e3a9231b11b73 +DK = 9c03ba271c4a7f3fe6f1c7d738a01244 + +Z = EF0F95F630F41B3AF911A30E543822DFA6B7684FEE36956D2BCF8FF080C9FA26 +D = D7349F9AD546CFE9830E1197072B6ED9CA21E8E0423F145F1DB84A5AEBA230EC +EK = 81058853242f883a633af3b26a16fa65 +DK = ca0ccc3d8ffc5e248670b8cfe713f196 + +Z = DDD4871080BD4F761D972085851DE0A0408A2F5EEC3CD3786297A782402CA440 +D = F05117E932CA0E0C202732DFD4F674BF5848219A76C64A0650C27E2E55095513 +EK = 0a58b8a79b77d30dc6f595f1345ed469 +DK = 2444c2f0c9dede07176d70e749903481 + +Z = FA29BDC28D989B8C4BE84706A3CF21B36A1C6E355C88A361C7664818E4BC8E03 +D = A405D9B07C5771A5BBDA2BE9F8A40D9566CAD7DA1761ED8076A289063DB4A8E2 +EK = 46154c2a2765720b96f559601055de92 +DK = f96cea057e1da405f1f85c718e0f15ed + +Z = 08FED872D91297D8059743D3E7B6EE47548357E7F882B5BFE2F04314187ED424 +D = E66F17317C40783CE0594CFB5920FF86062591C5EA4254021495749642C0D968 +EK = 1c8152b794b1fd80af07b995fd069558 +DK = 060650fc72feefc496f89d731de8416b + +Z = EB8EA5E8C5EABACCFF162556DA53F0C02F72EE7A7DEA8E9EB70FC51C777645E6 +D = F8CF49DA62AA762EC020F3766237520E7FDA4CA3AC11FBE50E6C5F9CAB3CA7B8 +EK = 9e20fafe226fb4318304090ac053c227 +DK = 4ec3bf1482c71e2d482ee4d085413506 + +Z = DAC056B9A373687E44CCAB8751BD334F4942696B9076155F9D0E5BC0E89D85CF +D = 08E36AE8586A59B8249A80D7F43506F9711FA4B00A49D182CE06DAD0CF985809 +EK = 68c3e2825c8316141f0cc54a613849f4 +DK = be5a2e1a72e48c541af995457ee6b002 + +Z = 4D727ACABD44DC48980691E0268B5B3FC1E476B3FDF9571F5CBC8DDFD400AB99 +D = A491FF48028B67A407F1054D5B1CBA733B665DE667E22596EDCC31C227C2DE1B +EK = 47d090f8d3abd197d86b23c32de428ff +DK = f887a18c5bac78ab027cb2af77a118ac + +Z = 4E638D8AC3662450E09D8500DED751060B7990D54F137508B9897277F65EA952 +D = 7B2EC50C53A67E0BCCBA98C2E319F5AB46B6E593D2465F14B23FFA03D0E5BE0D +EK = fa0e0eb2aa5528f721ea52cd87f74149 +DK = fd7949490798894f20f45af1bf9cce43 + +Z = 7459AB99D24C1254EEECC035874BF19A64EFC8EDC9D369C11F5DF4DC83AB5FBC +D = 16858AA7C92EBD72FB8CCD0A99D0435EDB2A6EB1B936DBCB637CF43F25D221B1 +EK = ef233b4594632a950c2304c9d59b7d64 +DK = d58c81240c7e0c4bffad190cb84ec8c0 + +Z = 4CC1CA6B662A4CE499EBE66D933CEAE58EE244CBDCAAE3C1F45A0D6947802B76 +D = F788F3E21D62E74090582F310BD4FDC8065E56E8D946142B9B9CF8F338F330E8 +EK = ba974a31f8b35e700aaf332a6f4a9da8 +DK = a7b4afe8e406dac4126bf8aea1c7800b + +Z = D16CC70224474A4D71E1F950C2D5CA72D8F08AF80E0C7F6E292C265A50CC30E8 +D = A72608DF0F025B4FEE7D94BAE77BE94CB974F20DD55006A70FD39F3397A8EF90 +EK = 645f2207d486a5f52998d61ae0ff9aff +DK = 9dc444e48442e0be8baee6c9650cbdc5 + diff --git a/src/tests/test_kyber.cpp b/src/tests/test_kyber.cpp index f34000130a3..3ea8217cae6 100644 --- a/src/tests/test_kyber.cpp +++ b/src/tests/test_kyber.cpp @@ -115,13 +115,16 @@ class KYBER_Tests final : public Test { } }; -BOTAN_REGISTER_TEST("kyber", "kyber_pairwise", KYBER_Tests); +BOTAN_REGISTER_TEST("pubkey", "kyber_pairwise", KYBER_Tests); namespace { -class Kyber_KAT_Tests final : public PK_PQC_KEM_KAT_Test { - public: - Kyber_KAT_Tests() : PK_PQC_KEM_KAT_Test("Kyber", "pubkey/kyber_kat.vec") {} +class Kyber_KAT_Tests : public PK_PQC_KEM_KAT_Test { + protected: + Kyber_KAT_Tests(const std::string& algo_name, + const std::string& kat_file, + const std::string& further_optional_keys = "") : + PK_PQC_KEM_KAT_Test(algo_name, kat_file, further_optional_keys) {} private: Botan::KyberMode get_mode(const std::string& mode) const { return Botan::KyberMode(mode); } @@ -134,19 +137,28 @@ class Kyber_KAT_Tests final : public PK_PQC_KEM_KAT_Test { if(var_type == VarType::SharedSecret) { return {value.begin(), value.end()}; } - // We use different hash functions for Kyber 90s and Kyber "modern", as - // those are consistent with the requirements of the implementations. - std::string_view hash_name = get_mode(mode).is_modern() ? "SHAKE-256(128)" : "SHA-256"; + + // We use different hash functions for Kyber 90s, as those are + // consistent with the algorithm requirements of the implementations. + std::string_view hash_name = get_mode(mode).is_90s() ? "SHA-256" : "SHAKE-256(128)"; auto hash = Botan::HashFunction::create_or_throw(hash_name); const auto digest = hash->process(value); return {digest.begin(), digest.begin() + 16}; } - Fixed_Output_RNG rng_for_keygen(const std::string&, Botan::RandomNumberGenerator& rng) const final { - const auto seed = rng.random_vec(32); - const auto z = rng.random_vec(32); - return Fixed_Output_RNG(Botan::concat(seed, z)); + Fixed_Output_RNG rng_for_keygen(const std::string& mode, Botan::RandomNumberGenerator& rng) const final { + if(get_mode(mode).is_kyber_round3()) { + const auto seed = rng.random_vec(32); + const auto z = rng.random_vec(32); + return Fixed_Output_RNG(Botan::concat(seed, z)); + } else if(get_mode(mode).is_ml_kem()) { + const auto z = rng.random_vec(32); + const auto d = rng.random_vec(32); + return Fixed_Output_RNG(Botan::concat(d, z)); + } else { + return Fixed_Output_RNG(rng.random_vec(64)); + } } Fixed_Output_RNG rng_for_encapsulation(const std::string&, Botan::RandomNumberGenerator& rng) const final { @@ -154,61 +166,71 @@ class Kyber_KAT_Tests final : public PK_PQC_KEM_KAT_Test { } }; -} // namespace +class KyberR3_KAT_Tests : public Kyber_KAT_Tests { + public: + KyberR3_KAT_Tests() : Kyber_KAT_Tests("Kyber", "pubkey/kyber_kat.vec") {} +}; -BOTAN_REGISTER_TEST("kyber", "kyber_kat", Kyber_KAT_Tests); +class ML_KEM_KAT_Tests : public Kyber_KAT_Tests { + public: + ML_KEM_KAT_Tests() : Kyber_KAT_Tests("ML-KEM", "pubkey/ml_kem.vec", "CT_N,SS_N") {} +}; -class Kyber_Encoding_Test : public Text_Based_Test { +class ML_KEM_ACVP_KAT_KeyGen_Tests : public PK_PQC_KEM_ACVP_KAT_KeyGen_Test { public: - Kyber_Encoding_Test() : Text_Based_Test("pubkey/kyber_encodings.vec", "PrivateRaw,PublicRaw", "Error") {} + ML_KEM_ACVP_KAT_KeyGen_Tests() : + PK_PQC_KEM_ACVP_KAT_KeyGen_Test("ML-KEM", "pubkey/ml_kem_acvp_keygen.vec", "Z,D") {} private: - static Botan::KyberMode name_to_mode(const std::string& algo_name) { - if(algo_name == "Kyber-512-r3") { - return Botan::KyberMode::Kyber512_R3; - } - if(algo_name == "Kyber-512-90s-r3") { - return Botan::KyberMode::Kyber512_90s; - } - if(algo_name == "Kyber-768-r3") { - return Botan::KyberMode::Kyber768_R3; - } - if(algo_name == "Kyber-768-90s-r3") { - return Botan::KyberMode::Kyber768_90s; - } - if(algo_name == "Kyber-1024-r3") { - return Botan::KyberMode::Kyber1024_R3; - } - if(algo_name == "Kyber-1024-90s-r3") { - return Botan::KyberMode::Kyber1024_90s; - } + Botan::KyberMode get_mode(const std::string& mode) const { return Botan::KyberMode(mode); } - throw Botan::Invalid_Argument("don't know kyber mode: " + algo_name); + bool is_available(const std::string& mode) const final { return get_mode(mode).is_available(); } + + Fixed_Output_RNG rng_for_keygen(const VarMap& vars) const override { + const auto d = vars.get_req_bin("D"); + const auto z = vars.get_req_bin("Z"); + return Fixed_Output_RNG(Botan::concat(d, z)); } +}; +class ML_KEM_PQC_KEM_ACVP_KAT_Encap_Test : public PK_PQC_KEM_ACVP_KAT_Encap_Test { public: - bool skip_this_test(const std::string& algo_name, const VarMap& /*vars*/) override { - const auto mode = name_to_mode(algo_name); - #if defined(BOTAN_HAS_KYBER) - if(!mode.is_90s()) { - return false; - } - #endif - #if defined(BOTAN_HAS_KYBER_90S) - if(mode.is_90s()) { - return false; - } - #endif + ML_KEM_PQC_KEM_ACVP_KAT_Encap_Test() : PK_PQC_KEM_ACVP_KAT_Encap_Test("ML-KEM", "pubkey/ml_kem_acvp_encap.vec") {} + + private: + Botan::KyberMode get_mode(const std::string& mode) const { return Botan::KyberMode(mode); } + + bool is_available(const std::string& mode) const final { return get_mode(mode).is_available(); } - BOTAN_UNUSED(algo_name, mode); - return true; + std::unique_ptr load_public_key(const VarMap& vars, const std::string& mode) const final { + return std::make_unique(vars.get_req_bin("EK"), get_mode(mode)); + } +}; + +} // namespace + +BOTAN_REGISTER_TEST("pubkey", "kyber_kat", KyberR3_KAT_Tests); +BOTAN_REGISTER_TEST("pubkey", "ml_kem_kat", ML_KEM_KAT_Tests); +BOTAN_REGISTER_TEST("pubkey", "ml_kem_acvp_kat_keygen", ML_KEM_ACVP_KAT_KeyGen_Tests); +BOTAN_REGISTER_TEST("pubkey", "ml_kem_acvp_kat_encap", ML_KEM_PQC_KEM_ACVP_KAT_Encap_Test); + +// Currently we cannot use the ACVP decapsulation tests because they do not +// provide the private key's seed values. +//BOTAN_REGISTER_TEST("pubkey", "ml_kem_acvp_kat_decap", ML_KEM_PQC_KEM_ACVP_KAT_Decap_Test); + +class Kyber_Encoding_Test : public Text_Based_Test { + public: + Kyber_Encoding_Test() : Text_Based_Test("pubkey/kyber_encodings.vec", "PrivateRaw,PublicRaw", "Error") {} + + public: + bool skip_this_test(const std::string& algo_name, const VarMap& /*vars*/) override { + return !Botan::KyberMode(algo_name).is_available(); } Test::Result run_one_test(const std::string& algo_name, const VarMap& vars) override { Test::Result result("kyber_encodings"); - const auto mode = name_to_mode(algo_name); - + const auto mode = Botan::KyberMode(algo_name); const auto pk_raw = Botan::hex_decode(vars.get_req_str("PublicRaw")); const auto sk_raw = Botan::hex_decode_locked(vars.get_req_str("PrivateRaw")); const auto error = vars.get_opt_str("Error", ""); @@ -239,7 +261,7 @@ class Kyber_Encoding_Test : public Text_Based_Test { } }; -BOTAN_REGISTER_TEST("kyber", "kyber_encodings", Kyber_Encoding_Test); +BOTAN_REGISTER_TEST("pubkey", "kyber_encodings", Kyber_Encoding_Test); class Kyber_Keygen_Tests final : public PK_Key_Generation_Test { public: @@ -274,7 +296,7 @@ class Kyber_Keygen_Tests final : public PK_Key_Generation_Test { } }; -BOTAN_REGISTER_TEST("kyber", "kyber_keygen", Kyber_Keygen_Tests); +BOTAN_REGISTER_TEST("pubkey", "kyber_keygen", Kyber_Keygen_Tests); namespace { @@ -369,7 +391,7 @@ std::vector test_kyber_helpers() { } // namespace -BOTAN_REGISTER_TEST_FN("kyber", "kyber_helpers", test_kyber_helpers); +BOTAN_REGISTER_TEST_FN("pubkey", "kyber_helpers", test_kyber_helpers); #endif diff --git a/src/tests/test_pubkey_pqc.h b/src/tests/test_pubkey_pqc.h index e1c35417c4a..b06c825882a 100644 --- a/src/tests/test_pubkey_pqc.h +++ b/src/tests/test_pubkey_pqc.h @@ -35,8 +35,12 @@ class PK_PQC_KEM_KAT_Test : public PK_Test { /// Type of a KAT vector entry that can be recomputed using the seed enum class VarType { SharedSecret, PublicKey, PrivateKey, Ciphertext }; - PK_PQC_KEM_KAT_Test(const std::string& algo_name, const std::string& input_file) : - PK_Test(algo_name, input_file, "Seed,SS,PK,SK,CT") {} + PK_PQC_KEM_KAT_Test(const std::string& algo_name, + const std::string& input_file, + const std::string& further_optional_keys = "") : + PK_Test(algo_name, + input_file, + "Seed,SS,PK,SK,CT" + (further_optional_keys.empty() ? "" : "," + further_optional_keys)) {} // --- Callbacks --- @@ -48,7 +52,7 @@ class PK_PQC_KEM_KAT_Test : public PK_Test { /// Create an RNG that can be used to generate the keypair. @p rng is the DRBG that is used to expand the seed. virtual Fixed_Output_RNG rng_for_keygen(const std::string& params, Botan::RandomNumberGenerator& rng) const = 0; - /// Create an RNG that can be used to generate the keypair. @p rng is the DRBG that is used to expand the seed. + /// Create an RNG that can be used to generate the encapsulation. @p rng is the DRBG that is used to expand the seed. virtual Fixed_Output_RNG rng_for_encapsulation(const std::string& params, Botan::RandomNumberGenerator& rng) const = 0; @@ -93,7 +97,7 @@ class PK_PQC_KEM_KAT_Test : public PK_Test { Test::Result run_one_test(const std::string& params, const VarMap& vars) final { Test::Result result(Botan::fmt("PQC KAT for {} with parameters {}", algo_name(), params)); - // All PQC algorithms use this DRBG in their KAT tests to generate + // Most PQC algorithms use this DRBG in their KAT tests to generate // their private keys. The amount of data that needs to be pulled from // the RNG for keygen and encapsulation is dependent on the algorithm // and the implementation. @@ -151,6 +155,141 @@ class PK_PQC_KEM_KAT_Test : public PK_Test { const auto shared_key = dec.decrypt(encaped.encapsulated_shared_key(), 0 /* no KDF */); result.test_is_eq("Decaps. Shared Secret", shared_key, Botan::lock(vars.get_req_bin("SS"))); + if(vars.has_key("CT_N")) { + // Shared secret from invalid KEM ciphertext + const auto shared_key_invalid = dec.decrypt(vars.get_req_bin("CT_N"), 0 /* no KDF */); + result.test_is_eq( + "Decaps. Shared Secret Invalid", shared_key_invalid, Botan::lock(vars.get_req_bin("SS_N"))); + } + + return result; + } +}; + +/** + * These are abstractions over the Known Answer Tests from NIST's ACVP. These do not provide a seed and + * instead provide directly the input to certain tests. + */ +class PK_PQC_KEM_ACVP_KAT_KeyGen_Test : public PK_Test { + protected: + PK_PQC_KEM_ACVP_KAT_KeyGen_Test(const std::string& algo_name, + const std::string& input_file, + const std::string& further_optional_keys = "") : + PK_Test( + algo_name, input_file, further_optional_keys + (further_optional_keys.empty() ? "" : ",") + "EK,DK") {} + + /// Create an RNG that can be used to generate the keypair. Values should be read from the KAT vector's @p vars + virtual Fixed_Output_RNG rng_for_keygen(const VarMap& vars) const = 0; + + /// Return true if the algorithm with the specified params should be tested + virtual bool is_available(const std::string& params) const = 0; + + virtual std::vector compress_value(std::span value) const { + // Use SHAKE-256(128) as default + auto hash = Botan::HashFunction::create_or_throw("SHAKE-256(128)"); + const auto digest = hash->process(value); + return {digest.begin(), digest.begin() + 16}; + } + + private: + bool skip_this_test(const std::string& params, const VarMap&) final { return !is_available(params); } + + Test::Result run_one_test(const std::string& params, const VarMap& vars) final { + Test::Result result(Botan::fmt("PQC ACVP KAT for {} KeyGen with parameters {}", algo_name(), params)); + + auto rng_keygen = rng_for_keygen(vars); + + // Key Generation + auto sk = Botan::create_private_key(algo_name(), rng_keygen, params); + if(!result.test_not_null("Successfully generated private key", sk)) { + return result; + } + result.test_is_eq("Generated private key", compress_value(sk->raw_private_key_bits()), vars.get_req_bin("DK")); + + // Algorithm properties + result.test_eq("Algorithm name", sk->algo_name(), algo_name()); + result.confirm("Supported operation KeyEncapsulation", + sk->supports_operation(Botan::PublicKeyOperation::KeyEncapsulation)); + result.test_gte("Key has reasonable estimated strength (lower)", sk->estimated_strength(), 64); + result.test_lt("Key has reasonable estimated strength (upper)", sk->estimated_strength(), 512); + + // Extract Public Key + auto pk = sk->public_key(); + result.test_is_eq("Generated public key", compress_value(pk->public_key_bits()), vars.get_req_bin("EK")); + + result.confirm("All prepared random bits used for key generation", rng_keygen.empty()); + + return result; + } +}; + +class PK_PQC_KEM_ACVP_KAT_Encap_Test : public PK_Test { + protected: + PK_PQC_KEM_ACVP_KAT_Encap_Test(const std::string& algo_name, const std::string& input_file) : + PK_Test(algo_name, input_file, "EK,M,K,C") {} + + /// Create an RNG that can be used to generate the keypair. Values should be read from the KAT vector's @p vars + virtual Fixed_Output_RNG rng_for_encap(const VarMap& vars) const { + return Fixed_Output_RNG(vars.get_req_bin("M")); + } + + virtual std::unique_ptr load_public_key(const VarMap& vars, + const std::string& params) const = 0; + + /// Return true if the algorithm with the specified params should be tested + virtual bool is_available(const std::string& params) const = 0; + + private: + bool skip_this_test(const std::string& params, const VarMap&) final { return !is_available(params); } + + std::vector compress_value(std::span value) { + // We always use SHAKE-256(128) for ML-KEM + auto hash = Botan::HashFunction::create_or_throw("SHAKE-256(128)"); + const auto digest = hash->process(value); + return {digest.begin(), digest.begin() + 16}; + } + + Test::Result run_one_test(const std::string& params, const VarMap& vars) final { + Test::Result result(Botan::fmt("PQC ACVP KAT for {} Encap with parameters {}", algo_name(), params)); + + auto rng_encap = rng_for_encap(vars); + const auto pk = load_public_key(vars, params); + + auto enc = Botan::PK_KEM_Encryptor(*pk, "Raw"); + const auto encaped = enc.encrypt(rng_encap, 0 /* no KDF */); + result.test_is_eq("Shared Secret", encaped.shared_key(), Botan::lock(vars.get_req_bin("K"))); + result.test_is_eq("Ciphertext", compress_value(encaped.encapsulated_shared_key()), vars.get_req_bin("C")); + + result.confirm("All prepared random bits used for key generation", rng_encap.empty()); + + return result; + } +}; + +class PK_PQC_KEM_ACVP_KAT_Decap_Test : public PK_Test { + protected: + PK_PQC_KEM_ACVP_KAT_Decap_Test(const std::string& algo_name, const std::string& input_file) : + PK_Test(algo_name, input_file, "C,DK,K") {} + + virtual std::unique_ptr load_private_key(const VarMap& vars, + const std::string& params) const = 0; + + /// Return true if the algorithm with the specified params should be tested + virtual bool is_available(const std::string& params) const = 0; + + private: + bool skip_this_test(const std::string& params, const VarMap&) final { return !is_available(params); } + + Test::Result run_one_test(const std::string& params, const VarMap& vars) final { + Test::Result result(Botan::fmt("PQC ACVP KAT for {} Decap with parameters {}", algo_name(), params)); + + const auto sk = load_private_key(vars, params); + + Botan::Null_RNG null_rng; + auto dec = Botan::PK_KEM_Decryptor(*sk, null_rng, "Raw"); + const auto shared_key = dec.decrypt(vars.get_req_bin("C"), 0 /* no KDF */); + result.test_is_eq("Decaps. Shared Secret", shared_key, Botan::lock(vars.get_req_bin("K"))); + return result; } }; From 6d3f83598fceb945e8ef75995b004b730341afcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Meusel?= Date: Fri, 20 Sep 2024 15:48:02 +0200 Subject: [PATCH 6/9] Add FFI integration to (de)serialize ML-KEM keys The kyber-specific functions remain supported but work slightly different, so that dedicated functions for ML-KEM became necessary. --- src/lib/ffi/ffi.h | 10 ++++++ src/lib/ffi/ffi_pkey_algs.cpp | 65 +++++++++++++++++++++++++++++++++-- src/tests/test_ffi.cpp | 15 ++++++++ 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/src/lib/ffi/ffi.h b/src/lib/ffi/ffi.h index df469d5c36f..022f9efc22a 100644 --- a/src/lib/ffi/ffi.h +++ b/src/lib/ffi/ffi.h @@ -1544,6 +1544,16 @@ int botan_privkey_load_frodokem(botan_privkey_t* key, const uint8_t privkey[], s BOTAN_FFI_EXPORT(3, 6) int botan_pubkey_load_frodokem(botan_pubkey_t* key, const uint8_t pubkey[], size_t key_len, const char* frodo_mode); +/* +* Algorithm specific key operations: ML-KEM +*/ + +BOTAN_FFI_EXPORT(3, 6) +int botan_privkey_load_ml_kem(botan_privkey_t* key, const uint8_t privkey[], size_t key_len, const char* mlkem_mode); + +BOTAN_FFI_EXPORT(3, 6) +int botan_pubkey_load_ml_kem(botan_pubkey_t* key, const uint8_t pubkey[], size_t key_len, const char* mlkem_mode); + /* * Algorithm specific key operations: ECDSA and ECDH */ diff --git a/src/lib/ffi/ffi_pkey_algs.cpp b/src/lib/ffi/ffi_pkey_algs.cpp index 9e1b1bfb2e0..a072555f295 100644 --- a/src/lib/ffi/ffi_pkey_algs.cpp +++ b/src/lib/ffi/ffi_pkey_algs.cpp @@ -71,8 +71,9 @@ #include #endif -#if defined(BOTAN_HAS_KYBER) +#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_ML_KEM) #include + #include #endif #if defined(BOTAN_HAS_FRODOKEM) @@ -961,7 +962,7 @@ int botan_privkey_load_kyber(botan_privkey_t* key, const uint8_t privkey[], size return BOTAN_FFI_ERROR_BAD_PARAMETER; } #else - BOTAN_UNUSED(key, privkey); + BOTAN_UNUSED(key, key_len, privkey); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } @@ -1031,6 +1032,66 @@ int botan_pubkey_view_kyber_raw_key(botan_pubkey_t key, botan_view_ctx ctx, bota #endif } +/* +* Algorithm specific key operations: ML-KEM +*/ + +int botan_privkey_load_ml_kem(botan_privkey_t* key, const uint8_t privkey[], size_t key_len, const char* mlkem_mode) { +#if defined(BOTAN_HAS_ML_KEM) + if(key == nullptr || privkey == nullptr || mlkem_mode == nullptr) { + return BOTAN_FFI_ERROR_NULL_POINTER; + } + + *key = nullptr; + + return ffi_guard_thunk(__func__, [=]() -> int { + auto mode = Botan::KyberConstants(Botan::KyberMode(mlkem_mode)); + if(!mode.mode().is_ml_kem()) { + return BOTAN_FFI_ERROR_BAD_PARAMETER; + } + + if(key_len != mode.private_key_bytes()) { + return BOTAN_FFI_ERROR_INVALID_KEY_LENGTH; + } + + auto mlkem_key = std::make_unique(std::span{privkey, key_len}, mode.mode()); + *key = new botan_privkey_struct(std::move(mlkem_key)); + return BOTAN_FFI_SUCCESS; + }); +#else + BOTAN_UNUSED(key, key_len, privkey, mlkem_mode); + return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; +#endif +} + +int botan_pubkey_load_ml_kem(botan_pubkey_t* key, const uint8_t pubkey[], size_t key_len, const char* mlkem_mode) { +#if defined(BOTAN_HAS_ML_KEM) + if(key == nullptr || pubkey == nullptr || mlkem_mode == nullptr) { + return BOTAN_FFI_ERROR_NULL_POINTER; + } + + *key = nullptr; + + return ffi_guard_thunk(__func__, [=]() -> int { + auto mode = Botan::KyberConstants(Botan::KyberMode(mlkem_mode)); + if(!mode.mode().is_ml_kem()) { + return BOTAN_FFI_ERROR_BAD_PARAMETER; + } + + if(key_len != mode.public_key_bytes()) { + return BOTAN_FFI_ERROR_INVALID_KEY_LENGTH; + } + + auto mlkem_key = std::make_unique(std::span{pubkey, key_len}, mode.mode()); + *key = new botan_pubkey_struct(std::move(mlkem_key)); + return BOTAN_FFI_SUCCESS; + }); +#else + BOTAN_UNUSED(key, key_len, pubkey, mlkem_mode); + return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; +#endif +} + /* * Algorithm specific key operations: FrodoKEM */ diff --git a/src/tests/test_ffi.cpp b/src/tests/test_ffi.cpp index 80f290d9cfe..7b07357c5a0 100644 --- a/src/tests/test_ffi.cpp +++ b/src/tests/test_ffi.cpp @@ -3603,6 +3603,20 @@ class FFI_Kyber1024_Test final : public FFI_Test { } }; +class FFI_ML_KEM_Test final : public FFI_KEM_Roundtrip_Test { + public: + std::string name() const override { return "FFI ML-KEM"; } + + private: + const char* algo() const override { return "ML-KEM"; } + + privkey_loader_fn_t private_key_load_function() const override { return botan_privkey_load_ml_kem; } + + pubkey_loader_fn_t public_key_load_function() const override { return botan_pubkey_load_ml_kem; } + + std::vector modes() const override { return {"ML-KEM-512", "ML-KEM-768", "ML-KEM-1024"}; } +}; + class FFI_FrodoKEM_Test final : public FFI_KEM_Roundtrip_Test { public: std::string name() const override { return "FFI FrodoKEM"; } @@ -3874,6 +3888,7 @@ BOTAN_REGISTER_TEST("ffi", "ffi_x448", FFI_X448_Test); BOTAN_REGISTER_TEST("ffi", "ffi_kyber512", FFI_Kyber512_Test); BOTAN_REGISTER_TEST("ffi", "ffi_kyber768", FFI_Kyber768_Test); BOTAN_REGISTER_TEST("ffi", "ffi_kyber1024", FFI_Kyber1024_Test); +BOTAN_REGISTER_TEST("ffi", "ffi_ml_kem", FFI_ML_KEM_Test); BOTAN_REGISTER_TEST("ffi", "ffi_frodokem", FFI_FrodoKEM_Test); BOTAN_REGISTER_TEST("ffi", "ffi_elgamal", FFI_ElGamal_Test); BOTAN_REGISTER_TEST("ffi", "ffi_dh", FFI_DH_Test); From c26fddaba52320a7f47740d508b44fd0cee4d100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Meusel?= Date: Mon, 14 Oct 2024 15:23:52 +0200 Subject: [PATCH 7/9] Add Python bindings to load raw ML-KEM keys --- src/python/botan3.py | 14 ++++++++++++++ src/scripts/test_python.py | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/python/botan3.py b/src/python/botan3.py index d4d9a540ce7..aecb5f21a3e 100755 --- a/src/python/botan3.py +++ b/src/python/botan3.py @@ -363,6 +363,8 @@ def ffi_api(fn, args, allowed_errors=None): ffi_api(dll.botan_pubkey_load_kyber, [c_void_p, c_char_p, c_int]) ffi_api(dll.botan_privkey_view_kyber_raw_key, [c_void_p, c_void_p, VIEW_BIN_CALLBACK]) ffi_api(dll.botan_pubkey_view_kyber_raw_key, [c_void_p, c_void_p, VIEW_BIN_CALLBACK]) + ffi_api(dll.botan_privkey_load_ml_kem, [c_void_p, c_void_p, c_int, c_char_p]) + ffi_api(dll.botan_pubkey_load_ml_kem, [c_void_p, c_void_p, c_int, c_char_p]) ffi_api(dll.botan_privkey_load_frodokem, [c_void_p, c_void_p, c_int, c_char_p]) ffi_api(dll.botan_pubkey_load_frodokem, [c_void_p, c_void_p, c_int, c_char_p]) ffi_api(dll.botan_privkey_load_ecdsa, [c_void_p, c_void_p, c_char_p]) @@ -1234,6 +1236,12 @@ def load_kyber(cls, key): _DLL.botan_pubkey_load_kyber(byref(obj), key, len(key)) return PublicKey(obj) + @classmethod + def load_ml_kem(cls, mlkem_mode, key): + obj = c_void_p(0) + _DLL.botan_pubkey_load_ml_kem(byref(obj), key, len(key), _ctype_str(mlkem_mode)) + return PublicKey(obj) + @classmethod def load_frodokem(cls, frodo_mode, key): obj = c_void_p(0) @@ -1398,6 +1406,12 @@ def load_kyber(cls, key): _DLL.botan_privkey_load_kyber(byref(obj), key, len(key)) return PrivateKey(obj) + @classmethod + def load_ml_kem(cls, mlkem_mode, key): + obj = c_void_p(0) + _DLL.botan_privkey_load_ml_kem(byref(obj), key, len(key), _ctype_str(mlkem_mode)) + return PrivateKey(obj) + @classmethod def load_frodokem(cls, frodo_mode, key): obj = c_void_p(0) diff --git a/src/scripts/test_python.py b/src/scripts/test_python.py index 6b4762db354..1498895eb50 100644 --- a/src/scripts/test_python.py +++ b/src/scripts/test_python.py @@ -937,6 +937,20 @@ def test_kyber_raw_keys(self): pubkey_read = a_pub.view_kyber_raw_key() self.assertEqual(pubkey_read, a_pub_bits) + def test_ml_kem_raw_keys(self): + mlkem_mode = "ML-KEM-512" + sk = botan.PrivateKey.create("ML-KEM", mlkem_mode, botan.RandomNumberGenerator("user")) + pk = sk.get_public_key() + + sk_bits = sk.to_raw() + pk_bits = pk.to_raw() + + sk_read = botan.PrivateKey.load_ml_kem(mlkem_mode, sk_bits) + pk_read = botan.PublicKey.load_ml_kem(mlkem_mode, pk_bits) + + self.assertEqual(sk_read.to_raw(), sk_bits) + self.assertEqual(pk_read.to_raw(), pk_bits) + def test_frodokem_raw_keys(self): frodo_mode = "FrodoKEM-640-SHAKE" sk = botan.PrivateKey.create("FrodoKEM", frodo_mode, botan.RandomNumberGenerator("user")) From 05686c9c27fa4b19cd954659e37c5605b2b96860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Meusel?= Date: Fri, 20 Sep 2024 15:55:28 +0200 Subject: [PATCH 8/9] ML-KEM: update documentation --- doc/api_ref/pubkey.rst | 38 ++++++++++++++--------- doc/api_ref/python.rst | 9 ++++++ doc/index.rst | 2 +- readme.rst | 2 +- src/examples/hybrid_key_encapsulation.cpp | 4 +-- src/examples/{kyber.cpp => ml_kem.cpp} | 2 +- src/lib/utils/types.h | 2 +- 7 files changed, 39 insertions(+), 20 deletions(-) rename src/examples/{kyber.cpp => ml_kem.cpp} (91%) diff --git a/doc/api_ref/pubkey.rst b/doc/api_ref/pubkey.rst index d327accafef..059d5f265bc 100644 --- a/doc/api_ref/pubkey.rst +++ b/doc/api_ref/pubkey.rst @@ -115,19 +115,28 @@ Dilithium Post-quantum secure signature scheme based on lattice problems. -Kyber -~~~~~~~~~~~ +ML-KEM (FIPS 203) +~~~~~~~~~~~~~~~~~ -Post-quantum key encapsulation scheme based on (structured) lattices. +Post-quantum key encapsulation scheme based on (structured) lattices. This +algorithm is standardized in FIPS 203. Decapsulation keys are always stored and +expanded from the 64-byte private random seeds (``d || z``), loading the +expanded key format specified in FIPS 203 is explicitly not supported. -.. note:: +Support for ML-KEM is implemented in the module ``ml_kem``. + +Additionally, support for the pre-standardized version "Kyber" is retained for +the time being. The implemented specification is commonly referred to as version +3.01 of the CRYSTALS-Kyber submission to NIST's third round of the PQC +competition. This is not compatible to the "Initial Public Draft" version of +FIPS 203 for which Botan does not offer an implementation. - Currently two modes for Kyber are defined: the round3 specification - from the NIST PQC competition, and the "90s mode" (which uses - AES/SHA-2 instead of SHA-3 based primitives). The 90s mode Kyber is - deprecated and will be removed in a future release. +Currently two flavors of Kyber are implemented in separate Botan modules: - The final NIST specification version of Kyber is not yet implemented. + * ``kyber``, that uses Keccak (SHAKE and SHA-3), and that saw some public + usage by early adopters. + * ``kyber_90s``, that uses AES/SHA-2 instead of Keccak-based primitives. + This mode is deprecated and will be removed in a future release. Ed25519 and Ed448 ~~~~~~~~~~~~~~~~~ @@ -1160,18 +1169,19 @@ encapsulated key and returns the shared secret. Botan implements the following KEM schemes: 1. RSA -#. Kyber +#. ML-KEM (Kyber) #. FrodoKEM #. McEliece -.. _kyber_example: +.. _mlkem_example: -Code Example: Kyber +Code Example: ML-KEM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The code below demonstrates key encapsulation using the Kyber post-quantum scheme. +The code below demonstrates key encapsulation using ML-KEM (FIPS 203), formerly +known as Kyber. -.. literalinclude:: /../src/examples/kyber.cpp +.. literalinclude:: /../src/examples/ml_kem.cpp :language: cpp .. _mceliece: diff --git a/doc/api_ref/python.rst b/doc/api_ref/python.rst index 9575587f532..6ac2206c39f 100644 --- a/doc/api_ref/python.rst +++ b/doc/api_ref/python.rst @@ -299,6 +299,11 @@ Public Key "sm2p256v1") and the public point as a pair of integers giving the affine coordinates. + .. py:classmethod:: load_ml_kem(mode, raw_encoding) + + Load an ML-KEM public key giving the mode as a string (like + "ML-KEM-512") and the raw encoding of the public key. + .. py:method:: check_key(rng_obj, strong=True): Test the key for consistency. If ``strong`` is ``True`` then @@ -390,6 +395,10 @@ Private Key Return a private SM2 key + .. py:classmethod:: load_ml_kem(mode, raw_encoding) + + Return a private ML-KEM key + .. py:method:: get_public_key() Return a public_key object diff --git a/doc/index.rst b/doc/index.rst index 93420d68a5e..61c3ac891c5 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -28,7 +28,7 @@ are listed below: * :ref:`PBKDFs ` * :ref:`Key Agreement ` * :ref:`ECDSA ` -* :ref:`Kyber ` +* :ref:`ML-KEM ` * :ref:`RSA ` * :ref:`XMSS ` * :ref:`Stream Ciphers ` diff --git a/readme.rst b/readme.rst index 78a84229463..02cdcfdaeb5 100644 --- a/readme.rst +++ b/readme.rst @@ -103,7 +103,7 @@ Public Key Cryptography * DH and ECDH key agreement * Signature schemes ECDSA, DSA, Ed25519, Ed448, ECGDSA, ECKCDSA, SM2, GOST 34.10 * Post-quantum signature schemes Dilithium, HSS/LMS, SPHINCS+, XMSS -* Post-quantum key agreement schemes McEliece, Kyber, and FrodoKEM +* Post-quantum key agreement schemes McEliece, ML-KEM (Kyber), and FrodoKEM * ElGamal encryption * Padding schemes OAEP, PSS, PKCS #1 v1.5, X9.31 diff --git a/src/examples/hybrid_key_encapsulation.cpp b/src/examples/hybrid_key_encapsulation.cpp index 39d3a17672c..89437570565 100644 --- a/src/examples/hybrid_key_encapsulation.cpp +++ b/src/examples/hybrid_key_encapsulation.cpp @@ -372,12 +372,12 @@ int main() { // Alice generates two key pairs suitable for: // 1) key exchange (X25519), and - // 2) key encapsulation (Kyber). + // 2) key encapsulation (ML-KEM). // // She then combines them into a custom "hybrid" key pair that acts // like a key encapsulation mechanism (KEM). const auto private_key_of_alice = std::make_unique( - Botan::create_private_key("X25519", rng), Botan::create_private_key("Kyber", rng, "Kyber-768-r3")); + Botan::create_private_key("X25519", rng), Botan::create_private_key("ML-KEM", rng, "ML-KEM-768")); const auto public_key_of_alice = private_key_of_alice->public_key(); // Bob uses Alice's public key to encapsulate a shared secret, and diff --git a/src/examples/kyber.cpp b/src/examples/ml_kem.cpp similarity index 91% rename from src/examples/kyber.cpp rename to src/examples/ml_kem.cpp index 5770c37e80c..261e2886e81 100644 --- a/src/examples/kyber.cpp +++ b/src/examples/ml_kem.cpp @@ -13,7 +13,7 @@ int main() { std::array salt; rng.randomize(salt); - Botan::Kyber_PrivateKey priv_key(rng, Botan::KyberMode::Kyber512_R3); + Botan::Kyber_PrivateKey priv_key(rng, Botan::KyberMode::ML_KEM_768); auto pub_key = priv_key.public_key(); Botan::PK_KEM_Encryptor enc(*pub_key, kdf); diff --git a/src/lib/utils/types.h b/src/lib/utils/types.h index aa2f91a19c3..fc4c8c320da 100644 --- a/src/lib/utils/types.h +++ b/src/lib/utils/types.h @@ -57,7 +57,7 @@ namespace Botan { * @ref dlies.h "DLIES", @ref ecies.h "ECIES", @ref elgamal.h "ElGamal", * @ref rsa.h "RSA", @ref mceliece.h "McEliece", @ref sm2.h "SM2" *
Key Encapsulation Mechanisms
-* @ref frodokem.h "FrodoKEM", @ref kyber.h "Kyber", @ref rsa.h "RSA" +* @ref frodokem.h "FrodoKEM", @ref kyber.h "ML-KEM/Kyber", @ref rsa.h "RSA" *
Public Key Signature Schemes
* @ref dsa.h "DSA", @ref dilithium.h "Dilithium", @ref ecdsa.h "ECDSA", @ref ecgdsa.h "ECGDSA", * @ref eckcdsa.h "ECKCDSA", @ref gost_3410.h "GOST 34.10-2001", @ref hss_lms.h "HSS/LMS", @ref sm2.h "SM2", From 33000ab140f7b7defe7e75453c0a6eaa95687b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Meusel?= Date: Mon, 14 Oct 2024 15:36:11 +0200 Subject: [PATCH 9/9] Deprecate kyber-specific key encoding in FFI/Python --- src/lib/ffi/ffi.h | 2 ++ src/python/botan3.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/lib/ffi/ffi.h b/src/lib/ffi/ffi.h index 022f9efc22a..f2f7fbea402 100644 --- a/src/lib/ffi/ffi.h +++ b/src/lib/ffi/ffi.h @@ -1528,9 +1528,11 @@ BOTAN_FFI_EXPORT(3, 1) int botan_privkey_load_kyber(botan_privkey_t* key, const BOTAN_FFI_EXPORT(3, 1) int botan_pubkey_load_kyber(botan_pubkey_t* key, const uint8_t pubkey[], size_t key_len); +BOTAN_FFI_DEPRECATED("Use generic botan_privkey_view_raw") BOTAN_FFI_EXPORT(3, 1) int botan_privkey_view_kyber_raw_key(botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view); +BOTAN_FFI_DEPRECATED("Use generic botan_pubkey_view_raw") BOTAN_FFI_EXPORT(3, 1) int botan_pubkey_view_kyber_raw_key(botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view); diff --git a/src/python/botan3.py b/src/python/botan3.py index aecb5f21a3e..ce07c7b8905 100755 --- a/src/python/botan3.py +++ b/src/python/botan3.py @@ -1283,6 +1283,7 @@ def to_raw(self): return _call_fn_viewing_vec(lambda vc, vfn: _DLL.botan_pubkey_view_raw(self.__obj, vc, vfn)) def view_kyber_raw_key(self): + """Deprecated: use to_raw() instead""" return _call_fn_viewing_vec(lambda vc, vfn: _DLL.botan_pubkey_view_kyber_raw_key(self.__obj, vc, vfn)) def fingerprint(self, hash_algorithm='SHA-256'): @@ -1447,6 +1448,7 @@ def to_raw(self): return _call_fn_viewing_vec(lambda vc, vfn: _DLL.botan_privkey_view_raw(self.__obj, vc, vfn)) def view_kyber_raw_key(self): + """Deprecated: use to_raw() instead""" return _call_fn_viewing_vec(lambda vc, vfn: _DLL.botan_privkey_view_kyber_raw_key(self.__obj, vc, vfn)) def export(self, pem=False):